[Scummvm-cvs-logs] scummvm master -> 7a54ba86a083bdfd414a85e4edd5d0baeb91c779

dreammaster dreammaster at scummvm.org
Mon Feb 20 12:32:45 CET 2012


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

Summary:
0f3614b043 TSAGE: Implemented method for getting a resource section entry
7a54ba86a0 TSAGE: Starting to implement animation player needed for R2R Title Screen


Commit: 0f3614b043816238a9334f6cde9fa477ecbf00ff
    https://github.com/scummvm/scummvm/commit/0f3614b043816238a9334f6cde9fa477ecbf00ff
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2012-02-20T03:30:46-08:00

Commit Message:
TSAGE: Implemented method for getting a resource section entry

This will be needed for streaming data directly from the resource file without fully loading the resource.

Changed paths:
    engines/tsage/resources.cpp
    engines/tsage/resources.h



diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp
index 824f20e..f6f870b 100644
--- a/engines/tsage/resources.cpp
+++ b/engines/tsage/resources.cpp
@@ -135,7 +135,7 @@ uint16 BitReader::readToken() {
 /*-------------------------------------------------------------------------*/
 
 TLib::TLib(MemoryManager &memManager, const Common::String &filename) :
-		_memoryManager(memManager) {
+		_filename(filename), _memoryManager(memManager) {
 
 	// If the resource strings list isn't yet loaded, load them
 	if (_resStrings.size() == 0) {
@@ -158,25 +158,35 @@ TLib::~TLib() {
 	_resStrings.clear();
 }
 
+/**
+ * Load a section index from the given position in the file
+ */
 void TLib::loadSection(uint32 fileOffset) {
 	_resources.clear();
 	_file.seek(fileOffset);
 	_sections.fileOffset = fileOffset;
 
-	if (_file.readUint32BE() != 0x544D492D)
+	loadSection(_file, _resources);
+}
+
+/**
+ * Inner logic for decoding a section index into a passed resource list object
+ */
+void TLib::loadSection(Common::File &f, ResourceList &resources) {
+	if (f.readUint32BE() != 0x544D492D)
 		error("Data block is not valid Rlb data");
 
-	/*uint8 unknown1 = */_file.readByte();
-	uint16 numEntries = _file.readByte();
+	/*uint8 unknown1 = */f.readByte();
+	uint16 numEntries = f.readByte();
 
 	for (uint i = 0; i < numEntries; ++i) {
-		uint16 id = _file.readUint16LE();
-		uint16 size = _file.readUint16LE();
-		uint16 uncSize = _file.readUint16LE();
-		uint8 sizeHi = _file.readByte();
-		uint8 type = _file.readByte() >> 5;
+		uint16 id = f.readUint16LE();
+		uint16 size = f.readUint16LE();
+		uint16 uncSize = f.readUint16LE();
+		uint8 sizeHi = f.readByte();
+		uint8 type = f.readByte() >> 5;
 		assert(type <= 1);
-		uint32 offset = _file.readUint32LE();
+		uint32 offset = f.readUint32LE();
 
 		ResourceEntry re;
 		re.id = id;
@@ -185,7 +195,7 @@ void TLib::loadSection(uint32 fileOffset) {
 		re.size = ((sizeHi & 0xF) << 16) | size;
 		re.uncompressedSize = ((sizeHi & 0xF0) << 12) | uncSize;
 
-		_resources.push_back(re);
+		resources.push_back(re);
 	}
 }
 
@@ -443,6 +453,36 @@ bool TLib::getMessage(int resNum, int lineNum, Common::String &result, bool supp
 
 /*--------------------------------------------------------------------------*/
 
+/**
+ * Open up the main resource file and get an entry from the root section
+ */
+bool TLib::getSectionEntry(Common::File &f, ResourceType resType, int rlbNum, int resNum, 
+									  ResourceEntry &resEntry) {
+	// Try and open the resource file
+	if (!f.open(_filename))
+	  return false;
+
+	// Load the root section index
+	ResourceList resList;
+	loadSection(f, resList);
+
+	// Loop through the index for the desired entry
+	ResourceList::iterator iter;
+	for (iter = _resources.begin(); iter != _resources.end(); ++iter) {
+		ResourceEntry &re = *iter;
+		if (re.id == resNum) {
+			// Found it, so exit
+			resEntry = re;
+			return true;
+		}
+	}
+
+	// No matching entry found
+	return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
 ResourceManager::~ResourceManager() {
 	for (uint idx = 0; idx < _libList.size(); ++idx)
 		delete _libList[idx];
diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h
index 0410fa3..2b5561b 100644
--- a/engines/tsage/resources.h
+++ b/engines/tsage/resources.h
@@ -145,10 +145,12 @@ private:
 	MemoryManager &_memoryManager;
 private:
 	Common::File _file;
+	Common::String _filename;
 	ResourceList _resources;
 	SectionList _sections;
 
 	void loadSection(uint32 fileOffset);
+	void loadSection(Common::File &f, ResourceList &resources);
 	void loadIndex();
 public:
 	TLib(MemoryManager &memManager, const Common::String &filename);
@@ -159,6 +161,8 @@ public:
 	bool getPalette(int paletteNum, byte *palData, uint *startNum, uint *numEntries);
 	byte *getSubResource(int resNum, int rlbNum, int index, uint *size, bool suppressErrors = false);
 	bool getMessage(int resNum, int lineNum, Common::String &result, bool suppressErrors = false);
+
+	bool getSectionEntry(Common::File &f, ResourceType resType, int rlbNum, int resNum, ResourceEntry &resEntry);
 };
 
 class ResourceManager {
@@ -174,6 +178,7 @@ public:
 	void getPalette(int paletteNum, byte *palData, uint *startNum, uint *numEntries, bool suppressErrors = false);
 	byte *getSubResource(int resNum, int rlbNum, int index, uint *size, bool suppressErrors = false);
 	Common::String getMessage(int resNum, int lineNum, bool suppressErrors = false);
+	TLib &first() { return **_libList.begin(); }
 };
 
 


Commit: 7a54ba86a083bdfd414a85e4edd5d0baeb91c779
    https://github.com/scummvm/scummvm/commit/7a54ba86a083bdfd414a85e4edd5d0baeb91c779
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2012-02-20T03:31:58-08:00

Commit Message:
TSAGE: Starting to implement animation player needed for R2R Title Screen

Changed paths:
    engines/tsage/core.h
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/ringworld2/ringworld2_logic.h
    engines/tsage/ringworld2/ringworld2_scenes0.cpp
    engines/tsage/ringworld2/ringworld2_scenes0.h



diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index ef6d473..45bb350 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -373,6 +373,7 @@ public:
 
 	bool loadPalette(int paletteNum);
 	void loadPalette(const byte *pSrc, int start, int count);
+	void replace(const ScenePalette *src) { loadPalette(src->_palette, 0, 256); }
 	void refresh();
 	void setPalette(int index, int count);
 	void getEntry(int index, uint *r, uint *g, uint *b);
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index 33ccfa1..89cf831 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -1551,36 +1551,130 @@ void Scene1200::sub9DAD6(int indx) {
 
 /*--------------------------------------------------------------------------*/
 
-ActionObject::ActionObject(): EventHandler() {
+AnimationPlayer::AnimationPlayer(): EventHandler() {
+	_endAction = NULL;
+	
+	_fieldA = NULL;
+	_field16 = NULL;
+	
+	_screenBounds = R2_GLOBALS._gfxManagerInstance._bounds;
+	_rect1 = R2_GLOBALS._gfxManagerInstance._bounds;
+	_field3C = 0;
+	_field3A = 1;
+	_field5A = 0;
+	_field58 = 0;
 	_endAction = NULL;
 }
 
-void ActionObject::synchronize(Serializer &s) {
-	EventHandler::synchronize(s);
+AnimationPlayer::~AnimationPlayer() {
+	if (!method3())
+		method4();
+}
 
-	SYNC_POINTER(_endAction);
+void AnimationPlayer::synchronize(Serializer &s) {
+	EventHandler::synchronize(s);
+	warning("TODO AnimationPlayer::load");
 }
 
-void ActionObject::remove() {
+void AnimationPlayer::remove() {
 	if (_endAction)
 		_endAction->signal();
 
 	_endAction = NULL;
 }
 
-bool ActionObject::load(int rlbNum, Action *endAction) {
-	warning("TODO ActionOjbect::load");
-	return true;
+void AnimationPlayer::process(Event &event) {
+	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE) &&
+			(_field3A)) {
+		_field90C = _field576;
+	} 
 }
 
-/*--------------------------------------------------------------------------*/
+void AnimationPlayer::dispatch() {
+	uint32 gameFrame = R2_GLOBALS._events.getFrameNumber();
+	uint32 gameDiff = (gameFrame > _gameFrame) ? gameFrame - _gameFrame : _gameFrame - gameFrame;
+
+	if (gameDiff >= _field910) {
+		drawFrame(_field904 % _field57C);
+		++_field904;
+		_field90C = _field904 / _field57C;
 
-void ActionObjectExt::synchronize(Serializer &s) {
-	ActionObject::synchronize(s);
-	s.syncAsSint16LE(_v1);
+		if (_field90C == _field90E)
+			method2();
+
+		_field908 = _field904;
+		_gameFrame = gameFrame;
+	}
 }
 
+bool AnimationPlayer::load(int rlbNum, Action *endAction) {
+	ResourceEntry resEntry;
+	if (!g_resourceManager->first().getSectionEntry(_resourceFile, RES_IMAGE, rlbNum, 0, resEntry)) {
+		warning("Couldn't find resource index");
+		// TODO: Complete animation loading
+	}
+
+	_resourceFile.close();
+	return false;
+}
+
+void AnimationPlayer::drawFrame(int frameIndex) {
+	uint32 v = READ_LE_UINT32(_dataP);
+warning("v = %d", v);
+//TODO
 
+	// End check
+	if (_field56 == 42) {
+		_screenBounds.expandPanes();
+
+		R2_GLOBALS._sceneObjects->draw();
+	} else {
+		if (R2_GLOBALS._sceneManager._hasPalette) {
+			R2_GLOBALS._sceneManager._hasPalette = false;
+			R2_GLOBALS._scenePalette.refresh();
+		}
+	}
+}
+
+void AnimationPlayer::method2() {
+
+}
+
+bool AnimationPlayer::method3() {
+	return (_field90C >= _field576);
+}
+
+void AnimationPlayer::method4() {
+	if (_field38) {
+		switch (_field3C) {
+		case 0:
+			R2_GLOBALS._scenePalette.replace(&_palette);
+			changePane();
+			R2_GLOBALS._sceneManager._hasPalette = true;
+			break;
+		case 2:
+			proc14();
+			break;
+		default:
+			changePane();
+			break;
+		}
+	}
+
+// TODO
+}
+
+/*--------------------------------------------------------------------------*/
+
+AnimationPlayerExt::AnimationPlayerExt(): AnimationPlayer() {
+	_v = 0;
+	_field3A = 0;
+}
+
+void AnimationPlayerExt::synchronize(Serializer &s) {
+	AnimationPlayer::synchronize(s);
+	s.syncAsSint16LE(_v);
+}
 
 } // End of namespace Ringworld2
 
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
index 925a3d6..98fcaae 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.h
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -325,29 +325,55 @@ public:
 	virtual Common::String getClassName() { return "UnkObject1200"; }
 };
 
-class ActionObject: public EventHandler {
+class AnimationPlayer: public EventHandler {
 public:
-	EventHandler *_endAction;
+	Common::File _resourceFile;
+	void *_fieldA;
+	void *_field16;
+
+	byte *_dataP;
 	Rect _rect1, _screenBounds;
+	int _field38;
 	int _field3A, _field3C;
 	int _field56;
 	int _field58, _field5A;
 	ScenePalette _palette;
 	byte _palData[256 * 3];
+	Action *_endAction;
+	int _field576;
+	int _field57C;
+	int _palStart, _palSize;
+	int _field904;
+	int _field908;
+	int _field90C;
+	int _field90E;
+	uint _field910;
+	uint32 _gameFrame;
 public:
-	ActionObject();
+	AnimationPlayer();
+	~AnimationPlayer();
 
 	virtual void synchronize(Serializer &s);
 	virtual void remove();
+	virtual void process(Event &event);
+	virtual void dispatch();
+	virtual void flipPane() {}
+	virtual void changePane() {}
+	virtual void proc14() {}
 
 	bool load(int rlbNum, Action *endAction = NULL);
-	bool proc1() { return false; }
-	void proc2() {}
+	void drawFrame(int frameIndex);
+	void method2();
+	bool method3();
+	void method4();
+	void method5() {}
 };
 
-class ActionObjectExt: public ActionObject {
+class AnimationPlayerExt: public AnimationPlayer {
+public:
+	int _v;
 public:
-	int _v1;
+	AnimationPlayerExt();
 
 	virtual void synchronize(Serializer &s);
 };
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
index c2b00b6..dab9afb 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
@@ -1499,25 +1499,25 @@ Scene180::Scene180(): SceneExt(), _webbsterSpeaker(27) {
 
 	GfxFont font;
 	font.setFontNumber(7);
-	_fontHeight = font.getHeight();
+	_fontHeight = font.getHeight() + 1;
 
 	_sceneMode = (R2_GLOBALS._sceneManager._previousScene == 205) ? 10 : 0;
 	_gameTextSpeaker._displayMode = 9;
-	_stripManager.addSpeaker(&_gameTextSpeaker);
-	_stripManager.addSpeaker(&_webbsterSpeaker);
-	_stripManager.addSpeaker(&_tealSpeaker);
-	_stripManager.addSpeaker(&_dutyOfficerSpeaker);
-
-	signal();
 }
 
 void Scene180::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
 	loadScene(9999);
+	SceneExt::postInit();
 
-	R2_GLOBALS._player._uiEnabled = false;
+	R2_GLOBALS._uiElements._active = true;
 	R2_GLOBALS._player.disableControl();
 
+	_stripManager.addSpeaker(&_gameTextSpeaker);
+	_stripManager.addSpeaker(&_webbsterSpeaker);
+	_stripManager.addSpeaker(&_tealSpeaker);
+	_stripManager.addSpeaker(&_dutyOfficerSpeaker);
+
+	signal();
 }
 
 void Scene180::remove() {
@@ -1547,7 +1547,7 @@ void Scene180::synchronize(Serializer &s) {
 void Scene180::signal() {
 	R2_GLOBALS._playStream.stop();
 
-	switch (_sceneMode) {
+	switch (_sceneMode++) {
 	case 0:
 		setFrameInc(6);
 		break;
@@ -1555,13 +1555,13 @@ void Scene180::signal() {
 	case 1:
 		_field412 = 1;
 		R2_GLOBALS._sceneManager._hasPalette = true;
-		_actionObject._field3C = 2;
-		_actionObject._v1 = 1;
-		_actionObject._field56 = 1;
+		_animationPlayer._field3C = 2;
+		_animationPlayer._v = 1;
+		_animationPlayer._field56 = 1;
 		R2_GLOBALS._scene180Mode = 1;
 
-		_actionObject.load(1, NULL);
-		R2_GLOBALS._scenePalette.loadPalette(_actionObject._palData, 0, 256);
+		_animationPlayer.load(1, NULL);
+		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._palData, 0, 256);
 
 		R2_GLOBALS._sound1.play(1);
 		break;
@@ -1598,14 +1598,14 @@ void Scene180::signal() {
 		break;
 
 	case 5:
-		_actionObject._field3C = 2;
-		_actionObject._v1 = 1;
-		_actionObject._field56 = 1;
+		_animationPlayer._field3C = 2;
+		_animationPlayer._v = 1;
+		_animationPlayer._field56 = 1;
 		R2_GLOBALS._scene180Mode = 2;
-		_actionObject.load(2);
+		_animationPlayer.load(2);
 
 		_field412 = 1;
-		R2_GLOBALS._scenePalette.addFader(_actionObject._palData, 256, 6, NULL);
+		R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 6, NULL);
 		R2_GLOBALS._sound1.play(2);
 		break;
 
@@ -1701,11 +1701,11 @@ void Scene180::signal() {
 
 	case 29:
 		_field412 = 1;
-		_actionObject._field3C = 0;
-		_actionObject._v1 = 1;
-		_actionObject._field56 = 42;
+		_animationPlayer._field3C = 0;
+		_animationPlayer._v = 1;
+		_animationPlayer._field56 = 42;
 		R2_GLOBALS._scene180Mode = 3;
-		_actionObject.load(3);
+		_animationPlayer.load(3);
 		break;
 
 	case 31:
@@ -1801,12 +1801,12 @@ void Scene180::signal() {
 		break;
 
 	case 40:
-		_actionObject._field3C = 2;
-		_actionObject._field56 = 1;
+		_animationPlayer._field3C = 2;
+		_animationPlayer._field56 = 1;
 		R2_GLOBALS._scene180Mode = 4;
-		if (_actionObject.load(4)) {
-			_actionObject.dispatch();
-			R2_GLOBALS._scenePalette.addFader(_actionObject._palData, 256, 8, this);
+		if (_animationPlayer.load(4)) {
+			_animationPlayer.dispatch();
+			R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 8, this);
 		} else {
 			_sceneMode = 43;
 			setFrameInc(1);
@@ -1815,7 +1815,7 @@ void Scene180::signal() {
 
 	case 41:
 		_field412 = 1;
-		_actionObject._v1 = 1;
+		_animationPlayer._v = 1;
 		break;
 
 	case 42:
@@ -1834,19 +1834,19 @@ void Scene180::signal() {
 		break;
 
 	case 45:
-		R2_GLOBALS._scenePalette.addFader(_actionObject._palData, 256, 28, this);
+		R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 28, this);
 		break;
 
 	case 48:
 		_field412 = 1;
-		_actionObject._field3C = 2;
-		_actionObject._v1 = 1;
-		_actionObject._field56 = 1;
+		_animationPlayer._field3C = 2;
+		_animationPlayer._v = 1;
+		_animationPlayer._field56 = 1;
 		R2_GLOBALS._scene180Mode = 15;
-		_actionObject.load(15, NULL);
+		_animationPlayer.load(15, NULL);
 
 		R2_GLOBALS._sound1.play(9);
-		R2_GLOBALS._scenePalette.addFader(_actionObject._palData, 256, 6, NULL);
+		R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 6, NULL);
 		break;
 
 	case 49:
@@ -1884,11 +1884,11 @@ void Scene180::process(Event &event) {
 
 void Scene180::dispatch() {
 	if (_frameInc) {
-		uint32 frameNumber = R2_GLOBALS._events.getFrameNumber();
+		uint32 gameFrame = R2_GLOBALS._events.getFrameNumber();
 
-		if (frameNumber >= (uint32)_frameNumber) {
-			_frameInc = frameNumber - _frameNumber;
-			_frameNumber = frameNumber;
+		if (gameFrame >= (uint32)_frameNumber) {
+			_frameInc -= gameFrame - _frameNumber;
+			_frameNumber = gameFrame;
 
 			if (_frameInc <= 0) {
 				_frameInc = 0;
@@ -1897,15 +1897,15 @@ void Scene180::dispatch() {
 		}
 	}
 
-	if (_actionObject._v1) {
-		if (_actionObject.proc1()) {
-			_actionObject._v1 = 0;
-			_actionObject.proc2();
-			_actionObject.remove();
+	if (_animationPlayer._v) {
+		if (_animationPlayer.method3()) {
+			_animationPlayer._v = 0;
+			_animationPlayer.method4();
+			_animationPlayer.remove();
 
 			signal();
 		} else {
-			_actionObject.dispatch();
+			_animationPlayer.dispatch();
 		}
 	}
 
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h
index f3c8b0b..d757080 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.h
@@ -204,7 +204,7 @@ public:
 	SceneActor _object1, _object2, _object3, _object4, _object5;
 	ScenePalette _palette;
 	SceneText _textList[20];
-	ActionObjectExt _actionObject;
+	AnimationPlayerExt _animationPlayer;
 	SequenceManager _sequenceManager;
 	Action1 _action1;
 	ASoundExt _sound1;
@@ -287,7 +287,7 @@ private:
 					int xMultiply, int yMultiply, int xCenter, int yCenter);
 	void handleText();
 public:
-	ActionObject _actionObject;
+	AnimationPlayer _animationPlayer;
 	int _fontHeight;
 	SceneText _textList[15];
 	Object *_objList1[3];






More information about the Scummvm-git-logs mailing list