[Scummvm-git-logs] scummvm master -> 27cc4d6fad47bd9445b0f9283737f660df463edf

dreammaster dreammaster at scummvm.org
Thu Mar 16 03:24:05 CET 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
27cc4d6fad TITANIC: Implementing CStarControlSub5 class code


Commit: 27cc4d6fad47bd9445b0f9283737f660df463edf
    https://github.com/scummvm/scummvm/commit/27cc4d6fad47bd9445b0f9283737f660df463edf
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-03-15T22:23:59-04:00

Commit Message:
TITANIC: Implementing CStarControlSub5 class code

Changed paths:
    engines/titanic/star_control/star_control_sub5.cpp
    engines/titanic/star_control/star_control_sub5.h


diff --git a/engines/titanic/star_control/star_control_sub5.cpp b/engines/titanic/star_control/star_control_sub5.cpp
index 775c24c..73906d8 100644
--- a/engines/titanic/star_control/star_control_sub5.cpp
+++ b/engines/titanic/star_control/star_control_sub5.cpp
@@ -26,6 +26,8 @@
 
 namespace Titanic {
 
+#define MKTAG_BE(a3,a2,a1,a0) ((uint32)((a3) | ((a2) << 8) | ((a1) << 16) | ((a0) << 24)))
+
 void CStarControlSub5::SubEntry::clear() {
 	_data1.clear();
 	_data2.clear();
@@ -76,9 +78,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 	for (int idx = 0; idx < 256; ++idx) {
 		if (idx == 0) {
 			e->_field0 = 0x4C8;
-			e->_field4 = 0x40;
-			e->_field5 = 0x40;
-			e->_field6 = 0x40;
+			e->_pixel1 = 0x40;
+			e->_pixel2 = 0x40;
+			e->_pixel3 = 0x40;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 7.0;
@@ -86,9 +88,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x574;
-			e->_field4 = 0x7f;
-			e->_field5 = 0;
-			e->_field6 = 0;
+			e->_pixel1 = 0x7f;
+			e->_pixel2 = 0;
+			e->_pixel3 = 0;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 3.0;
@@ -96,9 +98,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x603;
-			e->_field4 = 0;
-			e->_field5 = 0;
-			e->_field6 = 0xff;
+			e->_pixel1 = 0;
+			e->_pixel2 = 0;
+			e->_pixel3 = 0xff;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = 0;
@@ -106,9 +108,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x712;
-			e->_field4 = 0xff;
-			e->_field5 = 0;
-			e->_field6 = 0;
+			e->_pixel1 = 0xff;
+			e->_pixel2 = 0;
+			e->_pixel3 = 0;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 2.0;
@@ -116,9 +118,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0xe7f;
-			e->_field4 = 0xe6;
-			e->_field5 = 0xbe;
-			e->_field6 = 0;
+			e->_pixel1 = 0xe6;
+			e->_pixel2 = 0xbe;
+			e->_pixel3 = 0;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 1.0;
@@ -126,9 +128,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x173f;
-			e->_field4 = 0xf0;
-			e->_field5 = 0xf0;
-			e->_field6 = 0xe6;
+			e->_pixel1 = 0xf0;
+			e->_pixel2 = 0xf0;
+			e->_pixel3 = 0xe6;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 3.0;
@@ -136,9 +138,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x2ab8;
-			e->_field4 = 0x28;
-			e->_field5 = 0x32;
-			e->_field6 = 0x28;
+			e->_pixel1 = 0x28;
+			e->_pixel2 = 0x32;
+			e->_pixel3 = 0x28;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 1.0;
@@ -146,9 +148,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x40ac;
-			e->_field4 = 0x0;
-			e->_field5 = 0xbe;
-			e->_field6 = 0xf0;
+			e->_pixel1 = 0x0;
+			e->_pixel2 = 0xbe;
+			e->_pixel3 = 0xf0;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 2.0;
@@ -156,9 +158,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 
 			++e;
 			e->_field0 = 0x539c;
-			e->_field4 = 0x20;
-			e->_field5 = 0x20;
-			e->_field6 = 0x20;
+			e->_pixel1 = 0x20;
+			e->_pixel2 = 0x20;
+			e->_pixel3 = 0x20;
 			e->_field8 = g_vm->getRandomNumber(3) + 3;
 			e->_fieldC = g_vm->getRandomNumber(255);
 			e->_field10 = FACTOR * 17.0;
@@ -168,9 +170,9 @@ bool CStarControlSub5::setup2(int val1, int val2) {
 				e->_field0 = static_cast<int>(g_vm->getRandomFloat() * 1350.0
 					- 675.0) + VALUES1[idx];
 				int val = VALUES2[g_vm->getRandomNumber(15)];
-				e->_field4 = val & 0xff;
-				e->_field5 = (val >> 8) & 0xff;
-				e->_field6 = (val >> 16) & 0xff;
+				e->_pixel1 = val & 0xff;
+				e->_pixel2 = (val >> 8) & 0xff;
+				e->_pixel3 = (val >> 16) & 0xff;
 				e->_field8 = g_vm->getRandomNumber(3) + 3;
 				
 				e->_fieldC = g_vm->getRandomNumber(255);
@@ -194,13 +196,24 @@ void CStarControlSub5::proc2(CStarControlSub6 *sub6, FVector *vector, double v1,
 	const int VALUES[] = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4 };
 	double val1 = sub12->proc25();
 	int val2 = sub12->proc27();
+	if (!_flag)
+		return;
+
+	int f1, f3, f29, f31;
+	double f2, f4, f5, f6, f7, f8, f9;
+	double f10, f11, f12, f13, f14, f15, f16, f17, f18, f19;
+	double f20, f21, f22, f23, f24, f25, f26, f27, f28;
+	double f34, f35, f36, f37, f38, f39, f40;
+	//double f41, f42, f43, f44, f45, f46, f47, f48, f49;
+	//double f50, f51, f52, f53, f54, f55, f56, f57, f58, f59;
+	FVector tempV;
 
 	if (v3 >= 6.0e9) {
 		int count, start;
 		if (vector->_x != 0.0 && (vector->_y != 0.0 || vector->_z != 0.0)) {
-			// TODO: Non-sensical randSeed((int)vector->_x);
+			// WORKAROUND: Ignoring non-sensical randSeed((int)vector->_x);
 			count = VALUES[g_vm->getRandomNumber(15)];
-			start = g_vm->getRandomNumber(255);
+			start = 5 * g_vm->getRandomNumber(255);
 		} else {
 			count = 9;
 			start = 0;
@@ -208,41 +221,166 @@ void CStarControlSub5::proc2(CStarControlSub6 *sub6, FVector *vector, double v1,
 
 		Entry *entryP = &_entries[start];
 		for (; count > 0; --count, ++entryP) {
-			//eax=sineIndex1, ecx=sineIndex2,
-			int sineIndex1 = (entryP->_field8 * _multiplier) & 0x1ff;			
-			int sineIndex2 = (entryP->_fieldC * _multiplier + entryP->_fieldC) & 0x1ff;
-
-			double t1 = _sineTable[sineIndex2];
-			double t2 = sin(_sineTable[sineIndex1] * entryP->_field10);
-			double t3 = cos(_sineTable[sineIndex1] * entryP->_field10);
-			double t4 = _sineTable[sineIndex2 + 512];
-			double t5 = t3 * t4;
-			t3 = t3 * t1;
-			double t6 = entryP->_field14 * t5;
-			double t7 = t2 * entryP->_field14;
-			double t8 = entryP->_field14 * t3;
-			double t9 = -(t2 * t4 * entryP->_field14);
-			double t10 = t3 * entryP->_field14;
-			double t11 = -(t2 * t1 * entryP->_field14);
-			t4 = -(t1 * entryP->_field14);
-			t1 = t4 * entryP->_field14;
-
-			_sub1._row1._x = t6;
-			_sub1._row1._y = t2 * entryP->_field14;
-			_sub1._row1._z = entryP->_field14 * t3;
-			_sub1._row2._x = -(t2 * t4 * entryP->_field14);
-			_sub1._row2._y = t3 * entryP->_field14;
-			_sub1._row2._z = -(t2 * t1 * entryP->_field14);
-			_sub1._row3._x = -(t1 * entryP->_field14);
-			_sub1._row3._z = t4 * entryP->_field14;
-
-			double t12 = entryP->_field0;
-			_sub1._vector._x = t12 * t5 + vector->_x;
-			_sub1._vector._y = t12 * t2 + vector->_y;
-			_sub1._vector._z = t12 * t3 + vector->_z;
-
-			// TODO
-			warning("TODO: %f %f %f %f %f %f %d", t7, t8, t9, t10, t11, val1, val2);
+			f1 = _multiplier * entryP->_field8;
+			f2 = entryP->_field14;
+			f3 = (f1 + entryP->_fieldC) & 0x1FF;
+			f4 = _sineTable[f1 & 0x1FF] * entryP->_field10;
+			f5 = _sineTable[f3];
+			f6 = cos(f4);
+			f7 = sin(f4);
+			f8 = _sineTable[f3 + 128];
+			f9 = f7;
+			f10 = f6 * f8;
+			f11 = f6;
+			f12 = f6 * f5;
+			f13 = f2 * f10;
+			f14 = f8 * f2;
+			f15 = f9 * f2;
+			f16 = f2 * f12;
+			f17 = -(f7 * f8 * f2);
+			f18 = f11 * f2;
+			f19 = -(f9 * f5 * f2);
+			f20 = -(f5 * f2);
+			f21 = f14;
+			_sub1._row1._x = f13;
+			_sub1._row1._y = f15;
+			_sub1._row1._z = f16;
+			_sub1._row2._x = f17;
+			_sub1._row2._y = f18;
+			_sub1._row2._z = f19;
+			_sub1._row3._x = f20;
+			_sub1._row3._z = f14;
+
+			f22 = (double)entryP->_field0;
+			_sub1._vector._x = f22 * f10 + vector->_x;
+			_sub1._vector._y = f9 * f22 + vector->_y;
+			_sub1._vector._z = f22 * f12 + vector->_z;
+			_sub2._row1._x = sub6->_row1._x * f13 + f16 * sub6->_row3._x + f15 * sub6->_row2._x;
+			_sub2._row1._y = f15 * sub6->_row2._y + f16 * sub6->_row3._y + f13 * sub6->_row1._y;
+			_sub2._row1._z = f16 * sub6->_row3._z + f13 * sub6->_row1._z + f15 * sub6->_row2._z;
+			_sub2._row2._x = sub6->_row1._x * f17 + f19 * sub6->_row3._x + f18 * sub6->_row2._x;
+			_sub2._row2._y = f18 * sub6->_row2._y + f17 * sub6->_row1._y + f19 * sub6->_row3._y;
+			_sub2._row2._z = f18 * sub6->_row2._z + f19 * sub6->_row3._z + f17 * sub6->_row1._z;
+			_sub2._row3._x = sub6->_row1._x * f20 + f21 * sub6->_row3._x;
+			_sub2._row3._y = f20 * sub6->_row1._y + f21 * sub6->_row3._y;
+			_sub2._row3._z = f20 * sub6->_row1._z + f21 * sub6->_row3._z;
+
+			f23 = _sub1._vector._y;
+			f24 = _sub1._vector._z;
+			f25 = _sub1._vector._x;
+			f26 = _sub1._vector._z;
+			f27 = _sub1._vector._x;
+
+			f28 = _sub1._vector._y;
+			_sub2._vector._x = sub6->_row1._x * _sub1._vector._x
+				+ sub6->_row3._x * _sub1._vector._z
+				+ sub6->_row2._x * f28
+				+ sub6->_vector._x;
+			_sub2._vector._y = f23 * sub6->_row2._y
+				+ f24 * sub6->_row3._y
+				+ f25 * sub6->_row1._y
+				+ sub6->_vector._y;
+			_sub2._vector._z = f26 * sub6->_row3._z
+				+ f27 * sub6->_row1._z
+				+ f28 * sub6->_row2._z
+				+ sub6->_vector._z;
+
+			f29 = (int)_array[1]._data2.size();
+			f31 = (int)_array[1]._data1.size();
+
+			if (f29 > 0) {
+				for (uint ctr2 = 0; ctr2 < _array[1]._data2.size(); ++ctr2) {
+					FVector &currVector = _array[1]._data2[ctr2];
+					GridEntry &gridEntry = _grid[ctr2];
+
+					f34 = currVector._x;
+					f35 = currVector._y;
+					f36 = f35 * _sub2._row2._x;
+					f37 = currVector._z;
+					f38 = f37 * _sub2._row3._x + f36;
+					f39 = f38 + f34 * _sub2._row1._x;
+					f40 = f39 + _sub2._vector._x;
+
+					gridEntry._x = f40;
+					gridEntry._y = f37 * _sub2._row3._y
+						+ f35 * _sub2._row2._y
+						+ f34 * _sub2._row1._y
+						+ _sub2._vector._y;
+					gridEntry._z = f37 * _sub2._row3._z
+						+ f35 * _sub2._row2._z
+						+ f34 * _sub2._row1._z
+						+ _sub2._vector._z;
+				}
+			}
+
+			if (val2 <= 0) {
+				surfaceArea->setMode(SA_NONE);
+				surfaceArea->_pixel = MKTAG_BE(entryP->_pixel1, entryP->_pixel2,
+					entryP->_pixel3, 0);
+				surfaceArea->setColorFromPixel();
+
+				for (int ctr2 = 0; ctr2 < f29; ++ctr2) {
+					GridEntry &gridEntry = _grid[ctr2];
+					sub12->proc28(2, gridEntry, tempV);
+					gridEntry._position._x = tempV._x;
+					gridEntry._position._y = tempV._y + v2;
+				}
+
+				for (int ctr2 = 0; ctr2 < f31; ++ctr2) {
+					Data1 &d1 = _array[1]._data1[ctr2];
+					GridEntry &grid1 = _grid[d1._index1];
+					GridEntry &grid2 = _grid[d1._index2];
+
+					if (grid1._z > val1 && grid2._z > val1) {
+						surfaceArea->fn1(FRect(grid1._position._x, grid1._position._y,
+							grid2._position._x, grid2._position._y));
+					}
+				}
+			} else {
+				surfaceArea->setMode(SA_NONE);
+				surfaceArea->_pixel = entryP->_pixel1;
+				surfaceArea->setColorFromPixel();
+
+				for (int ctr2 = 0; ctr2 < f29; ++ctr2) {
+					GridEntry &gridEntry = _grid[ctr2];
+					sub12->proc28(0, gridEntry, tempV);
+					gridEntry._position._x = tempV._x + v1;
+					gridEntry._position._y = tempV._y + v2;
+				}
+
+				for (int ctr2 = 0; ctr2 < f31; ++ctr2) {
+					Data1 &d1 = _array[1]._data1[ctr2];
+					GridEntry &grid1 = _grid[d1._index1];
+					GridEntry &grid2 = _grid[d1._index2];
+
+					if (grid1._z > val1 && grid2._z > val1) {
+						surfaceArea->fn1(FRect(grid1._position._x, grid1._position._y,
+							grid2._position._x, grid2._position._y));
+					}
+				}
+
+				surfaceArea->_pixel = entryP->_pixel3;
+				surfaceArea->setColorFromPixel();
+				surfaceArea->setMode(SA_MODE2);
+
+				for (int ctr2 = 0; ctr2 < f29; ++ctr2) {
+					GridEntry &gridEntry = _grid[ctr2];
+					sub12->proc28(1, gridEntry, tempV);
+					gridEntry._position._x = tempV._x + v1;
+					gridEntry._position._y = tempV._y + v2;
+				}
+
+				for (int ctr2 = 0; ctr2 < f31; ++ctr2) {
+					Data1 &d1 = _array[1]._data1[ctr2];
+					GridEntry &grid1 = _grid[d1._index1];
+					GridEntry &grid2 = _grid[d1._index2];
+
+					if (grid1._z > val1 && grid2._z > val1) {
+						surfaceArea->fn1(FRect(grid1._position._x, grid1._position._y,
+							grid2._position._x, grid2._position._y));
+					}
+				}
+			}
 		}
 	}
 
diff --git a/engines/titanic/star_control/star_control_sub5.h b/engines/titanic/star_control/star_control_sub5.h
index 32094f5..b5e5bb1 100644
--- a/engines/titanic/star_control/star_control_sub5.h
+++ b/engines/titanic/star_control/star_control_sub5.h
@@ -33,8 +33,14 @@ namespace Titanic {
 class CStarControlSub12;
 
 class CStarControlSub5 {
+	struct Data1 {
+		int _index1;
+		int _index2;
+		Data1() : _index1(0), _index2(0) {}
+	};
+
 	struct SubEntry {
-		Common::Array<FPoint> _data1;
+		Common::Array<Data1> _data1;
 		Common::Array<FVector> _data2;
 		~SubEntry() { clear(); }
 
@@ -46,28 +52,23 @@ class CStarControlSub5 {
 
 	struct Entry {
 		int _field0;
-		byte _field4;
-		byte _field5;
-		byte _field6;
+		byte _pixel1;
+		byte _pixel2;
+		byte _pixel3;
 		int _field8;
 		int _fieldC;
 		double _field10;
 		double _field14;
 
-		Entry() : _field0(0), _field4(0), _field5(0), _field6(0), _field8(0),
+		Entry() : _field0(0), _pixel1(0), _pixel2(0), _pixel3(0), _field8(0),
 				_fieldC(0), _field10(0), _field14(0) {}
 	};
 
-	struct GridEntry {
-		int _field0;
-		int _field4;
-		int _field8;
-		int _fieldC;
-		int _field10;
+	struct GridEntry : public FVector {
+		FPoint _position;
 		int _field14;
 
-		GridEntry() : _field0(0), _field4(0), _field8(0), _fieldC(0),
-			_field10(0), _field14(0) {}
+		GridEntry() : FVector(), _field14(0) {}
 	};
 
 	/**





More information about the Scummvm-git-logs mailing list