aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/titanic/star_control/base_star.h3
-rw-r--r--engines/titanic/star_control/star_ref.cpp53
2 files changed, 54 insertions, 2 deletions
diff --git a/engines/titanic/star_control/base_star.h b/engines/titanic/star_control/base_star.h
index ff096520e5..1b94b19d21 100644
--- a/engines/titanic/star_control/base_star.h
+++ b/engines/titanic/star_control/base_star.h
@@ -70,7 +70,6 @@ private:
void draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarControlSub5 *sub5);
void draw4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarControlSub5 *sub5);
protected:
- Common::Array<CBaseStarEntry> _data;
FRange _minMax;
double _minVal;
double _maxVal;
@@ -93,6 +92,8 @@ protected:
*/
void resetEntry(CBaseStarEntry &entry);
public:
+ Common::Array<CBaseStarEntry> _data;
+public:
CBaseStar();
virtual ~CBaseStar() {}
diff --git a/engines/titanic/star_control/star_ref.cpp b/engines/titanic/star_control/star_ref.cpp
index 7f36ae7473..6bb5dbe5df 100644
--- a/engines/titanic/star_control/star_ref.cpp
+++ b/engines/titanic/star_control/star_ref.cpp
@@ -25,7 +25,58 @@
namespace Titanic {
void CBaseStarRef::process(CSurfaceArea *surface, CStarControlSub12 *sub12) {
- // TODO
+ if (_star->_data.empty())
+ return;
+
+ const double MAX_VAL = 1.0e9 * 1.0e9;
+ CStarControlSub6 sub6 = sub12->proc23();
+ double threshold = sub12->proc25();
+ double vWidth2 = (double)surface->_width * 0.5;
+ double vHeight2 = (double)surface->_height * 0.5;
+ FVector vTemp, vector1, vector2;
+ double val1, val2, val3, val4;
+
+ for (int idx = 0; idx < _star->size(); ++idx) {
+ const CBaseStarEntry &se = _star->_data[idx];
+ vTemp = se._position;
+ vector1._x = vTemp._x * sub6._row1._x + vTemp._y * sub6._row2._x + vTemp._z * sub6._row3._x + sub6._vector._x;
+ vector1._y = vTemp._x * sub6._row1._y + vTemp._y * sub6._row2._y + vTemp._z * sub6._row3._y + sub6._vector._y;
+ vector1._z = vTemp._x * sub6._row1._z + vTemp._y * sub6._row2._z + vTemp._z * sub6._row3._z + sub6._vector._z;
+ double hyp = vector1._x * vector1._x + vector1._y * vector1._y + vector1._z * vector1._z;
+
+ if (vector1._z > threshold && hyp >= 1.0e12 && hyp < MAX_VAL) {
+ vector2.clear();
+ sub12->proc28(2, vector1, vector2);
+
+ const Common::Point pt((int)(vector2._x + vWidth2 - -0.5),
+ (int)(vector2._y + vHeight2 - -0.5));
+ if (pt.y >= 0 && pt.y < (surface->_height - 1) &&
+ pt.x >= 0 && pt.x < (surface->_width - 1)) {
+ val1 = sqrt(hyp);
+ if (val1 >= 100000.0)
+ val1 = 1.0 - (val1 - 100000.0) / 1000000000.0;
+ else
+ val1 = 1.0;
+
+ val2 = val1 * (double)se._field1;
+ val3 = val1 * (double)se._field2;
+ val4 = val1 * (double)se._field0;
+
+ int count = 0;
+ if (val4 < 0.0)
+ ++count;
+ if (val2 < 0.0)
+ ++count;
+ if (val3 < 0.0)
+ ++count;
+
+ if (count < 3) {
+ if (!check(pt, idx))
+ break;
+ }
+ }
+ }
+ }
}
/*------------------------------------------------------------------------*/