[Scummvm-git-logs] scummvm master -> cf37d0148d6efa2396e4816963d20ebc56238a2d

dreammaster dreammaster at scummvm.org
Mon Mar 6 02:11:49 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:
cf37d0148d TITANIC: Implementing CStarControlSub5 class


Commit: cf37d0148d6efa2396e4816963d20ebc56238a2d
    https://github.com/scummvm/scummvm/commit/cf37d0148d6efa2396e4816963d20ebc56238a2d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-03-05T20:11:49-05:00

Commit Message:
TITANIC: Implementing CStarControlSub5 class

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


diff --git a/engines/titanic/star_control/star_control_sub5.cpp b/engines/titanic/star_control/star_control_sub5.cpp
index 731d81f..4b2ff79 100644
--- a/engines/titanic/star_control/star_control_sub5.cpp
+++ b/engines/titanic/star_control/star_control_sub5.cpp
@@ -22,28 +22,200 @@
 
 #include "titanic/star_control/star_control_sub5.h"
 #include "titanic/star_control/star_control_sub12.h"
+#include "titanic/titanic.h"
 
 namespace Titanic {
 
-CStarControlSub5::CStarControlSub5() : _flag(true) {
+void CStarControlSub5::SubEntry::clear() {
+	if (_data2P) {
+		delete[] _data2P;
+		_data2P = nullptr;
+		_field4 = 0;
+	}
+
+	if (_data1P) {
+		delete[] _data1P;
+		_data1P = nullptr;
+		_field0 = 0;
+	}
 }
 
-bool CStarControlSub5::setup() {
+/*------------------------------------------------------------------------*/
+
+bool CStarControlSub5::MemoryBlock::allocate() {
 	// TODO
 	return true;
 }
 
+/*------------------------------------------------------------------------*/
+
+CStarControlSub5::CStarControlSub5() : _flag(true), _dataP(nullptr),
+		_field78B0(0) {
+}
+
+CStarControlSub5::~CStarControlSub5() {
+	delete[] _dataP;
+	_dataP = nullptr;
+}
+
+bool CStarControlSub5::setup() {
+	bool success = setupEntry(5, 5, 4, 1024.0)
+		&& setupEntry(7, 7, 3, 1024.0)
+		&& setupEntry(8, 8, 2, 1024.0)
+		&& setupEntry(16, 16, 1, 1024.0)
+		&& setupEntry(24, 24, 0, 1024.0);
+	if (success)
+		success = setup2(24, 24);
+
+	return success;
+}
+
+bool CStarControlSub5::setup2(int val1, int val2) {
+	// TODO: Original set an explicit random seed here. Could be
+	// problematic if following random values need to be deterministic
+	double FACTOR = 3.1415927 * 0.0055555557;
+	const int VALUES1[] = { 0x800, 0xC00, 0x1000, 0x1400, 0x1800 };
+	const int VALUES2[] = {
+		0xF95BCD, 0xA505A0, 0xFFAD43, 0x98F4EB, 0xF3EFA5, 0,
+		0xFFFFFF, 0x81EEF5, 0x5FFD3, 0x4EE4FA, 0x11C3FF, 0x28F3F4, 
+		0x36FCF2, 0x29F1FD, 0x29BCFD, 0x98E3F4, 0xBBF3D9, 0x8198F5, 
+		0x5BE4F9, 0x0D6E2, 0x74EEF6, 0x68DEF8 
+	};
+
+	Entry *e = &_entries[0];
+	for (int idx = 0; idx < 256; ++idx) {
+		if (idx == 0) {
+			e->_field0 = 0x4C8;
+			e->_field4 = 0x40;
+			e->_field5 = 0x40;
+			e->_field6 = 0x40;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 7.0;
+			e->_field14 = 0.0084687499;
+
+			++e;
+			e->_field0 = 0x574;
+			e->_field4 = 0x7f;
+			e->_field5 = 0;
+			e->_field6 = 0;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 3.0;
+			e->_field14 = 0.021011719;
+
+			++e;
+			e->_field0 = 0x603;
+			e->_field4 = 0;
+			e->_field5 = 0;
+			e->_field6 = 0xff;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = 0;
+			e->_field14 = 0.022144532;
+
+			++e;
+			e->_field0 = 0x712;
+			e->_field4 = 0xff;
+			e->_field5 = 0;
+			e->_field6 = 0;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 2.0;
+			e->_field14 = 0.01178125;
+
+			++e;
+			e->_field0 = 0xe7f;
+			e->_field4 = 0xe6;
+			e->_field5 = 0xbe;
+			e->_field6 = 0;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 1.0;
+			e->_field14 = 0.24791406;
+
+			++e;
+			e->_field0 = 0x173f;
+			e->_field4 = 0xf0;
+			e->_field5 = 0xf0;
+			e->_field6 = 0xe6;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 3.0;
+			e->_field14 = 0.20832032;
+
+			++e;
+			e->_field0 = 0x2ab8;
+			e->_field4 = 0x28;
+			e->_field5 = 0x32;
+			e->_field6 = 0x28;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 1.0;
+			e->_field14 = 0.088164061;
+
+			++e;
+			e->_field0 = 0x40ac;
+			e->_field4 = 0x0;
+			e->_field5 = 0xbe;
+			e->_field6 = 0xf0;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 2.0;
+			e->_field14 = 0.084375001;
+
+			++e;
+			e->_field0 = 0x539c;
+			e->_field4 = 0x20;
+			e->_field5 = 0x20;
+			e->_field6 = 0x20;
+			e->_field8 = g_vm->getRandomNumber(3) + 3;
+			e->_fieldC = g_vm->getRandomNumber(255);
+			e->_field10 = FACTOR * 17.0;
+			e->_field14 = 0.00390625;
+		} else {
+			for (int ctr = 0; ctr < 5; ++ctr) {
+				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->_field8 = g_vm->getRandomNumber(3) + 3;
+				
+				e->_fieldC = g_vm->getRandomNumber(255);
+				e->_field10 = FACTOR * (double)g_vm->getRandomNumber(15);
+				e->_field14 = ((double)g_vm->getRandomNumber(0xffffffff)
+					* 50.0 * 0.000015259022) * 0.00390625;
+			}
+		}
+	}
+
+	if (_memoryBlock.allocate()) {
+		_dataP = new byte[((val2 - 2) * val1 + 2) * 24];
+		return true;
+	}
+
+	return false;
+}
+
 void CStarControlSub5::proc2(CStarControlSub6 *sub6, FVector *vector, double v1, double v2, double v3,
 		CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
 	// TODO
 }
 
 void CStarControlSub5::proc3(CErrorCode *errorCode) {
-	// TODO
+	++_field78B0;
+	errorCode->set();
 }
 
 void CStarControlSub5::fn1() {
 	_flag = !_flag;
 }
 
+bool CStarControlSub5::setupEntry(int val1, int val2, int index, double val3) {
+	// TODO
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/star_control/star_control_sub5.h b/engines/titanic/star_control/star_control_sub5.h
index 4927a14..17f3399 100644
--- a/engines/titanic/star_control/star_control_sub5.h
+++ b/engines/titanic/star_control/star_control_sub5.h
@@ -35,21 +35,67 @@ class CStarControlSub5 {
 	struct SubEntry {
 		int _field0;
 		int _field4;
+		byte *_data1P;
+		byte *_data2P;
+		SubEntry() : _field0(0), _field4(0), _data1P(nullptr), _data2P(nullptr) {}
+		~SubEntry() { clear(); }
+
+		/**
+		 * Clears the entry
+		 */
+		void clear();
+	};
+
+	struct Entry {
+		int _field0;
+		byte _field4;
+		byte _field5;
+		byte _field6;
 		int _field8;
 		int _fieldC;
+		double _field10;
+		byte _field14;
+		byte _field15;
+
+		Entry() : _field0(0), _field4(0), _field5(0), _field6(0), _field8(0),
+				_fieldC(0), _field10(0), _field14(0), _field15(0) {}
+	};
+
+	struct MemoryBlock {
+	public:
+		byte *_ptr;
+	public:
+		MemoryBlock() : _ptr(nullptr) {}
+		~MemoryBlock() { delete[] _ptr; }
+
+		/**
+		 * Allocates the memory block
+		 */
+		bool allocate();
 	};
 private:
 	bool _flag;
 	CStarControlSub6 _sub1, _sub2;
-#if 0
 	SubEntry _array[5];
-	int _field7914;
-	int _field78AC;
+	Entry _entries[1284];
 	int _field78B0;
-#endif
+	MemoryBlock _memoryBlock;
+	byte *_dataP;
+private:
+	/**
+	 * Sets up the data for an array entry
+	 * @return	True if success
+	 */
+	bool setupEntry(int val1, int val2, int index, double val3);
+
+	/**
+	 * Secondary setup method
+	 * @return	True if success
+	 */
+	bool setup2(int val1, int val2);
 public:
 	CStarControlSub5();
-	virtual ~CStarControlSub5() {}
+	virtual ~CStarControlSub5();
 
 	virtual bool setup();
 	virtual void proc2(CStarControlSub6 *sub6, FVector *vector, double v1, double v2, double v3,
diff --git a/engines/titanic/star_control/star_control_sub8.cpp b/engines/titanic/star_control/star_control_sub8.cpp
index 3bcbdd0..5840c96 100644
--- a/engines/titanic/star_control/star_control_sub8.cpp
+++ b/engines/titanic/star_control/star_control_sub8.cpp
@@ -69,4 +69,8 @@ void CStarControlSub8::draw(CSurfaceArea *surfaceArea) {
 	// TODO
 }
 
+void CStarControlSub8::clear() {
+	// TODO
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/star_control/star_control_sub8.h b/engines/titanic/star_control/star_control_sub8.h
index 0b0a7f6..97409fd 100644
--- a/engines/titanic/star_control/star_control_sub8.h
+++ b/engines/titanic/star_control/star_control_sub8.h
@@ -51,6 +51,7 @@ public:
 	int _fieldC;
 public:
 	CStarControlSub8();
+	~CStarControlSub8() { clear(); }
 
 	/**
 	 * Load the data for the class from file
@@ -73,6 +74,8 @@ public:
 	void fn2(CVideoSurface *surface, CStarField *starField, CStarControlSub7 *sub7);
 	void fn3();
 	FPoint getPosition() const;
+
+	void clear();
 };
 
 } // End of namespace Titanic





More information about the Scummvm-git-logs mailing list