[Scummvm-cvs-logs] scummvm master -> eba87458d399382e639d81e91d6acb3ce13f2252

dreammaster dreammaster at scummvm.org
Fri Feb 24 09:39:41 CET 2012


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:
eba87458d3 TSAGE: More properly implemented resource streaming for R2R animation player


Commit: eba87458d399382e639d81e91d6acb3ce13f2252
    https://github.com/scummvm/scummvm/commit/eba87458d399382e639d81e91d6acb3ce13f2252
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2012-02-24T00:38:46-08:00

Commit Message:
TSAGE: More properly implemented resource streaming for R2R animation player

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



diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp
index f6f870b..0afae00 100644
--- a/engines/tsage/resources.cpp
+++ b/engines/tsage/resources.cpp
@@ -166,37 +166,7 @@ void TLib::loadSection(uint32 fileOffset) {
 	_file.seek(fileOffset);
 	_sections.fileOffset = fileOffset;
 
-	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 = */f.readByte();
-	uint16 numEntries = f.readByte();
-
-	for (uint i = 0; i < numEntries; ++i) {
-		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 = f.readUint32LE();
-
-		ResourceEntry re;
-		re.id = id;
-		re.fileOffset = offset;
-		re.isCompressed = type != 0;
-		re.size = ((sizeHi & 0xF) << 16) | size;
-		re.uncompressedSize = ((sizeHi & 0xF0) << 12) | uncSize;
-
-		resources.push_back(re);
-	}
+	ResourceManager::loadSection(_file, _resources);
 }
 
 struct DecodeReference {
@@ -342,6 +312,40 @@ byte *TLib::getResource(ResourceType resType, uint16 resNum, uint16 rlbNum, bool
 	return getResource(rlbNum, suppressErrors);
 }
 
+/**
+ * Gets the offset of the start of a resource in the resource file
+ */
+uint32 TLib::getResourceStart(ResourceType resType, uint16 resNum, uint16 rlbNum, ResourceEntry &entry) {
+	// Find the correct section
+	SectionList::iterator i = _sections.begin();
+	while ((i != _sections.end()) && ((*i).resType != resType || (*i).resNum != resNum))
+		++i;
+	if (i == _sections.end()) {
+		error("Unknown resource type %d num %d", resType, resNum);
+	}
+
+	// Load in the section index
+	loadSection((*i).fileOffset);
+	
+	// Scan for an entry for the given Id
+	ResourceEntry *re = NULL;
+	ResourceList::iterator iter;
+	for (iter = _resources.begin(); iter != _resources.end(); ++iter) {
+		if ((*iter).id == rlbNum) {
+			re = &(*iter);
+			break;
+		}
+	}
+
+	// Throw an error if no resource was found, or the resource is compressed
+	if (!re || re->isCompressed)
+		error("Invalid resource Id #%d", rlbNum);
+
+	// Return the resource entry as well as the file offset 
+	entry = *re;
+	return _sections.fileOffset + entry.fileOffset;
+}
+
 void TLib::loadIndex() {
 	uint16 resNum, configId, fileOffset;
 
@@ -453,36 +457,6 @@ 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];
@@ -557,4 +531,62 @@ Common::String ResourceManager::getMessage(int resNum, int lineNum, bool suppres
 	return Common::String();
 }
 
+/*--------------------------------------------------------------------------*/
+
+/**
+ * Open up the given resource file using a passed file object. If the desired entry is found
+ * in the index, return the index entry for it, and move the file to the start of the resource
+ */
+bool ResourceManager::scanIndex(Common::File &f, ResourceType resType, int rlbNum, int resNum, 
+									  ResourceEntry &resEntry) {
+	// Load the root section index
+	ResourceList resList;
+	loadSection(f, resList);
+
+	// Loop through the index for the desired entry
+	ResourceList::iterator iter;
+	for (iter = resList.begin(); iter != resList.end(); ++iter) {
+		ResourceEntry &re = *iter;
+		if (re.id == resNum) {
+			// Found it, so exit
+			resEntry = re;
+			f.seek(re.fileOffset);
+			return true;
+		}
+	}
+
+	// No matching entry found
+	return false;
+}
+
+/**
+ * Inner logic for decoding a section index into a passed resource list object
+ */
+void ResourceManager::loadSection(Common::File &f, ResourceList &resources) {
+	if (f.readUint32BE() != 0x544D492D)
+		error("Data block is not valid Rlb data");
+
+	/*uint8 unknown1 = */f.readByte();
+	uint16 numEntries = f.readByte();
+
+	for (uint i = 0; i < numEntries; ++i) {
+		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 = f.readUint32LE();
+
+		ResourceEntry re;
+		re.id = id;
+		re.fileOffset = offset;
+		re.isCompressed = type != 0;
+		re.size = ((sizeHi & 0xF) << 16) | size;
+		re.uncompressedSize = ((sizeHi & 0xF0) << 12) | uncSize;
+
+		resources.push_back(re);
+	}
+}
+
 } // end of namespace TsAGE
diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h
index 2b5561b..45cecf8 100644
--- a/engines/tsage/resources.h
+++ b/engines/tsage/resources.h
@@ -150,19 +150,19 @@ private:
 	SectionList _sections;
 
 	void loadSection(uint32 fileOffset);
-	void loadSection(Common::File &f, ResourceList &resources);
 	void loadIndex();
 public:
 	TLib(MemoryManager &memManager, const Common::String &filename);
 	~TLib();
 
+	const Common::String &getFilename() { return _filename; }
+	const SectionList &getSections() { return _sections; }
 	byte *getResource(uint16 id, bool suppressErrors = false);
 	byte *getResource(ResourceType resType, uint16 resNum, uint16 rlbNum, bool suppressErrors = false);
+	uint32 getResourceStart(ResourceType resType, uint16 resNum, uint16 rlbNum, ResourceEntry &entry);
 	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 {
@@ -179,6 +179,9 @@ public:
 	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(); }
+
+	static bool scanIndex(Common::File &f, ResourceType resType, int rlbNum, int resNum, ResourceEntry &resEntry);
+	static void loadSection(Common::File &f, ResourceList &resources);
 };
 
 
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index 89cf831..d5cbde8 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -1551,6 +1551,27 @@ void Scene1200::sub9DAD6(int indx) {
 
 /*--------------------------------------------------------------------------*/
 
+void AnimationPlayerSubData::load(Common::File &f) {
+	f.skip(6);
+	_field6 = f.readUint16LE();
+	f.skip(2);
+	_fieldA = f.readUint16LE();
+	_fieldC = f.readUint16LE();
+	f.skip(4);
+	_field12 = f.readUint16LE();
+	_field14 = f.readUint16LE();
+	_field16 = f.readUint16LE();
+	f.skip(4);
+	_palStart = f.readUint16LE();
+	_palSize = f.readUint16LE();
+	f.read(_palData, 768);
+	_field320 = f.readSint32LE();
+	f.skip(12);
+	f.read(_field330, 96);
+}
+
+/*--------------------------------------------------------------------------*/
+
 AnimationPlayer::AnimationPlayer(): EventHandler() {
 	_endAction = NULL;
 	
@@ -1586,7 +1607,7 @@ void AnimationPlayer::remove() {
 void AnimationPlayer::process(Event &event) {
 	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE) &&
 			(_field3A)) {
-		_field90C = _field576;
+		_field90C = _subData._field6;
 	} 
 }
 
@@ -1595,9 +1616,9 @@ void AnimationPlayer::dispatch() {
 	uint32 gameDiff = (gameFrame > _gameFrame) ? gameFrame - _gameFrame : _gameFrame - gameFrame;
 
 	if (gameDiff >= _field910) {
-		drawFrame(_field904 % _field57C);
+		drawFrame(_field904 % _subData._fieldC);
 		++_field904;
-		_field90C = _field904 / _field57C;
+		_field90C = _field904 / _subData._fieldC;
 
 		if (_field90C == _field90E)
 			method2();
@@ -1607,18 +1628,63 @@ void AnimationPlayer::dispatch() {
 	}
 }
 
-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
+bool AnimationPlayer::load(int animId, Action *endAction) {
+	// Open up the main resource file for access
+	TLib &libFile = g_resourceManager->first();
+	if (!_resourceFile.open(libFile.getFilename()))
+		error("Could not open resource");
+
+	// Get the offset of the given resource and seek to it in the player's file reference
+	ResourceEntry entry;
+	uint32 fileOffset = libFile.getResourceStart(RES_IMAGE, animId, 0, entry);
+	_resourceFile.seek(fileOffset);
+
+	// At this point, the file is pointing to the start of the resource data
+
+	// Set the end action
+	_endAction = endAction;
+	
+	// Load the sub data block
+	_subData.load(_resourceFile);
+
+	// Set other properties
+	_field908 = -1;
+	_field904 = 0;
+	_field910 = 60 / _subData._fieldA;
+	_gameFrame = R2_GLOBALS._events.getFrameNumber() - _field910;
+
+	if (_subData._field320) {
+		_field900 = _subData._field320;
+	} else {
+		int v = (_subData._field12 + 2) * _subData._field14 * _subData._fieldC;
+		_field900 = (_subData._field16 / _subData._fieldC) + v + 96;
 	}
+	
+	_animData = _fieldA = new byte[_field900];
+
+	if (_subData._fieldC <= 1) {
+		_subData._field16 = NULL;
+		_animPtr = _animData;
+	} else {
+		_field16 = new byte[_field900];
+		_animPtr = _field16;
+	}
+
+	_field90C = 0;
+	_field90E = 1;
+
+	// TODO: Stuff
+
+	if (_field3C) {
+
+	}
+
 
-	_resourceFile.close();
 	return false;
 }
 
 void AnimationPlayer::drawFrame(int frameIndex) {
+/*
 	uint32 v = READ_LE_UINT32(_dataP);
 warning("v = %d", v);
 //TODO
@@ -1634,6 +1700,7 @@ warning("v = %d", v);
 			R2_GLOBALS._scenePalette.refresh();
 		}
 	}
+*/
 }
 
 void AnimationPlayer::method2() {
@@ -1641,7 +1708,7 @@ void AnimationPlayer::method2() {
 }
 
 bool AnimationPlayer::method3() {
-	return (_field90C >= _field576);
+	return (_field90C >= _subData._field6);
 }
 
 void AnimationPlayer::method4() {
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
index 98fcaae..651cfec 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.h
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -325,24 +325,38 @@ public:
 	virtual Common::String getClassName() { return "UnkObject1200"; }
 };
 
+class AnimationPlayerSubData {
+public:
+	int _field6;
+	int _fieldA;
+	int _fieldC;
+	int _field12;
+	int _field14;
+	int _field16;
+	int _palStart;
+	int _palSize;
+	byte _palData[256 * 3];
+	int32 _field320;
+	byte _field330[96];
+public:
+	void load(Common::File &f);
+};
+
 class AnimationPlayer: public EventHandler {
 public:
+	byte *_fieldA;
+	byte *_field16;
+	byte *_animData, *_animPtr;
 	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];
+	AnimationPlayerSubData _subData;
 	Action *_endAction;
-	int _field576;
-	int _field57C;
-	int _palStart, _palSize;
+	int _field900;
 	int _field904;
 	int _field908;
 	int _field90C;
@@ -361,7 +375,7 @@ public:
 	virtual void changePane() {}
 	virtual void proc14() {}
 
-	bool load(int rlbNum, Action *endAction = NULL);
+	bool load(int animId, Action *endAction = NULL);
 	void drawFrame(int frameIndex);
 	void method2();
 	bool method3();
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
index dab9afb..9af4c7b 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
@@ -1561,7 +1561,7 @@ void Scene180::signal() {
 		R2_GLOBALS._scene180Mode = 1;
 
 		_animationPlayer.load(1, NULL);
-		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._palData, 0, 256);
+		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
 
 		R2_GLOBALS._sound1.play(1);
 		break;
@@ -1605,7 +1605,7 @@ void Scene180::signal() {
 		_animationPlayer.load(2);
 
 		_field412 = 1;
-		R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 6, NULL);
+		R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
 		R2_GLOBALS._sound1.play(2);
 		break;
 
@@ -1806,7 +1806,7 @@ void Scene180::signal() {
 		R2_GLOBALS._scene180Mode = 4;
 		if (_animationPlayer.load(4)) {
 			_animationPlayer.dispatch();
-			R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 8, this);
+			R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 8, this);
 		} else {
 			_sceneMode = 43;
 			setFrameInc(1);
@@ -1834,7 +1834,7 @@ void Scene180::signal() {
 		break;
 
 	case 45:
-		R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 28, this);
+		R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 28, this);
 		break;
 
 	case 48:
@@ -1846,7 +1846,7 @@ void Scene180::signal() {
 		_animationPlayer.load(15, NULL);
 
 		R2_GLOBALS._sound1.play(9);
-		R2_GLOBALS._scenePalette.addFader(_animationPlayer._palData, 256, 6, NULL);
+		R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
 		break;
 
 	case 49:






More information about the Scummvm-git-logs mailing list