aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2017-03-18 18:17:17 -0400
committerPaul Gilbert2017-03-18 18:17:17 -0400
commitab0c57ac0c82ee72a18264db4df7e194c140d3d5 (patch)
treea4c453797d10fff9e85ce932a4171a7fda850c9c
parent6428e415b024b3ffa8593612b3b589961f03a55a (diff)
downloadscummvm-rg350-ab0c57ac0c82ee72a18264db4df7e194c140d3d5.tar.gz
scummvm-rg350-ab0c57ac0c82ee72a18264db4df7e194c140d3d5.tar.bz2
scummvm-rg350-ab0c57ac0c82ee72a18264db4df7e194c140d3d5.zip
TITANIC: Implemented CStarControlSub8 selectStar
-rw-r--r--engines/titanic/star_control/base_star.h4
-rw-r--r--engines/titanic/star_control/star_control_sub8.cpp65
-rw-r--r--engines/titanic/star_control/star_control_sub8.h2
3 files changed, 66 insertions, 5 deletions
diff --git a/engines/titanic/star_control/base_star.h b/engines/titanic/star_control/base_star.h
index e75f7ccea4..8fc36ba6c7 100644
--- a/engines/titanic/star_control/base_star.h
+++ b/engines/titanic/star_control/base_star.h
@@ -57,6 +57,10 @@ struct CStarPosition : public Common::Point {
int _index1;
int _index2;
CStarPosition() : _index1(0), _index2(0) {}
+
+ bool operator==(const CStarPosition &sp) const {
+ return x == sp.x && y == sp.y && _index1 == sp._index1 && _index2 == sp._index2;
+ }
};
class CBaseStar {
diff --git a/engines/titanic/star_control/star_control_sub8.cpp b/engines/titanic/star_control/star_control_sub8.cpp
index d4addc8353..53f2394c20 100644
--- a/engines/titanic/star_control/star_control_sub8.cpp
+++ b/engines/titanic/star_control/star_control_sub8.cpp
@@ -38,7 +38,64 @@ int CStarControlSub8::findStar(const Common::Point &pt) {
void CStarControlSub8::selectStar(int index, CVideoSurface *surface,
CStarField *starField, CStarControlSub7 *sub7) {
- // TODO
+ if (_entryIndex >= 0) {
+ if (_entryIndex == _field8) {
+ if (_field8 != 2) {
+ if (_positions[index] != _positions[_entryIndex + 1]) {
+ surface->lock();
+
+ CSurfaceArea surfaceArea(surface);
+ fn4(index, &surfaceArea);
+ surface->unlock();
+
+ ++_entryIndex;
+ CStarPosition &newP = _positions[_entryIndex + 1];
+ newP = _positions[index];
+
+ const CBaseStarEntry *starP = starField->getDataPtr(_positions[index]._index1);
+ sub7->addStar(starP);
+ }
+ }
+ } else if (_entryIndex == _field8 + 1) {
+ if (_positions[index] == _positions[_entryIndex + 1]) {
+ surface->lock();
+ CSurfaceArea surfaceArea(surface);
+ fn6(&surfaceArea);
+ surface->unlock();
+
+ --_entryIndex;
+ const CBaseStarEntry *starP = starField->getDataPtr(_positions[index]._index1);
+ sub7->addStar(starP);
+ } else {
+ surface->lock();
+ CSurfaceArea surfaceArea(surface);
+ fn6(&surfaceArea);
+ fn4(index, &surfaceArea);
+ surface->unlock();
+
+ const CBaseStarEntry *starP;
+ starP = starField->getDataPtr(_positions[_entryIndex]._index1);
+ sub7->addStar(starP);
+ starP = starField->getDataPtr(_positions[index]._index1);
+ sub7->addStar(starP);
+
+ CStarPosition &newP = _positions[_entryIndex + 1];
+ newP = _positions[index];
+ }
+ }
+ } else {
+ surface->lock();
+ CSurfaceArea surfaceArea(surface);
+ fn4(index, &surfaceArea);
+ surface->unlock();
+
+ ++_entryIndex;
+ CStarPosition &newP = _positions[_entryIndex + 1];
+ newP = _positions[index];
+
+ const CBaseStarEntry *starP = starField->getDataPtr(_positions[index]._index1);
+ sub7->addStar(starP);
+ }
}
bool CStarControlSub8::fn1(CStarField *starField, CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
@@ -80,7 +137,7 @@ void CStarControlSub8::fn3() {
FPoint CStarControlSub8::getPosition() const {
return (_entryIndex >= 0 && _entryIndex <= 2) ?
- FPoint(_entries[_entryIndex].left, _entries[_entryIndex].top) : FPoint();
+ FPoint(_entries[_entryIndex]) : FPoint();
}
void CStarControlSub8::draw(CSurfaceArea *surfaceArea) {
@@ -91,8 +148,8 @@ void CStarControlSub8::draw(CSurfaceArea *surfaceArea) {
SurfaceAreaMode savedMode = surfaceArea->setMode(SA_NONE);
for (int idx = 0; idx < _entryIndex; ++idx) {
- const Common::Rect &src = _entries[idx];
- double xp = src.left, yp = src.top;
+ const CStarPosition &src = _entries[idx];
+ double xp = src.x, yp = src.y;
surfaceArea->fn1(FRect(xp - 8.0, yp, xp - 4.0, yp));
surfaceArea->fn1(FRect(xp + 4.0, yp, xp + 8.0, yp));
diff --git a/engines/titanic/star_control/star_control_sub8.h b/engines/titanic/star_control/star_control_sub8.h
index b9b544d78e..f61a6ff4ef 100644
--- a/engines/titanic/star_control/star_control_sub8.h
+++ b/engines/titanic/star_control/star_control_sub8.h
@@ -41,7 +41,7 @@ class CStarControlSub8 {
private:
Common::Array<CStarPosition> _positions;
int _entryIndex;
- Common::Rect _entries[3];
+ CStarPosition _entries[3];
private:
/**
* Allocates space in the _rects array