[Scummvm-cvs-logs] SF.net SVN: scummvm:[48076] scummvm/trunk/engines/m4

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Wed Feb 17 12:37:17 CET 2010


Revision: 48076
          http://scummvm.svn.sourceforge.net/scummvm/?rev=48076&view=rev
Author:   dreammaster
Date:     2010-02-17 11:37:17 +0000 (Wed, 17 Feb 2010)

Log Message:
-----------
Implemented player sprite loading portion of scene enter code

Modified Paths:
--------------
    scummvm/trunk/engines/m4/assets.cpp
    scummvm/trunk/engines/m4/assets.h
    scummvm/trunk/engines/m4/mads_logic.cpp
    scummvm/trunk/engines/m4/scene.cpp
    scummvm/trunk/engines/m4/scene.h

Modified: scummvm/trunk/engines/m4/assets.cpp
===================================================================
--- scummvm/trunk/engines/m4/assets.cpp	2010-02-17 04:20:19 UTC (rev 48075)
+++ scummvm/trunk/engines/m4/assets.cpp	2010-02-17 11:37:17 UTC (rev 48076)
@@ -26,6 +26,7 @@
 #include "m4/assets.h"
 #include "m4/globals.h"
 #include "m4/compression.h"
+#include "m4/graphics.h"
 
 namespace M4 {
 
@@ -99,6 +100,8 @@
 
 SpriteAsset::SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, bool asStream) : BaseAsset(vm, stream, size, name) {
 	_stream = stream;
+	_palInterface = NULL;
+	_paletteData = NULL;
 
 	if (_vm->isM4()) {
 		loadM4SpriteAsset(vm, stream, asStream);
@@ -107,6 +110,19 @@
 	}
 }
 
+SpriteAsset::~SpriteAsset() {
+	if (_palInterface) {
+		// Internally stored palette translation data, so release it
+		_palInterface->deleteRange(_paletteData);
+		delete _paletteData;
+	}
+
+	// Delete the individual frames
+	for (Common::Array<SpriteAssetFrame>::iterator it = _frames.begin(); it != _frames.end(); ++it) {
+		delete (*it).frame;
+	}
+}
+
 void SpriteAsset::loadM4SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, bool asStream) {
 	bool isBigEndian = false;
 	uint32 frameOffset;
@@ -220,12 +236,6 @@
 	delete spriteDataStream;
 }
 
-SpriteAsset::~SpriteAsset() {
-	for (Common::Array<SpriteAssetFrame>::iterator it = _frames.begin(); it != _frames.end(); ++it) {
-		delete (*it).frame;
-	}
-}
-
 int32 SpriteAsset::parseSprite(bool isBigEndian) {
 
 	uint32 format, chunkType, chunkSize = 0;
@@ -325,6 +335,14 @@
 		_frames[frameIndex].frame->translate(list, isTransparent);
 }
 
+void SpriteAsset::translate(Palette *palette) {
+	_palInterface = palette;
+	_paletteData = this->getRgbList();
+	palette->addRange(_paletteData);
+	this->translate(_paletteData, true);
+}
+
+
 int32 SpriteAsset::getFrameSize(int index) {
 	/*
 	if (index + 1 == _frameCount) {

Modified: scummvm/trunk/engines/m4/assets.h
===================================================================
--- scummvm/trunk/engines/m4/assets.h	2010-02-17 04:20:19 UTC (rev 48075)
+++ scummvm/trunk/engines/m4/assets.h	2010-02-17 11:37:17 UTC (rev 48076)
@@ -45,6 +45,7 @@
 #define CELS___SS MKID_BE('  SS')	//'  SS'
 
 class MadsM4Engine;
+class Palette;
 
 class BaseAsset {
 public:
@@ -118,6 +119,7 @@
 	int getColorCount() { return _colorCount; }
 	RGBList *getRgbList();
 	void translate(RGBList *list, bool isTransparent = false);
+	void translate(Palette *palette);
 	int32 getFrameSize(int index);
 	M4Sprite *operator[](int index) { return getFrame(index); }
 protected:
@@ -133,6 +135,9 @@
 	Common::SeekableReadStream *_stream;
 	int32 parseSprite(bool isBigEndian = false);
 	void loadFrameHeader(SpriteAssetFrame &frameHeader, bool isBigEndian = false);
+private:
+	RGBList *_paletteData;
+	Palette *_palInterface;
 };
 
 enum AssetType {

Modified: scummvm/trunk/engines/m4/mads_logic.cpp
===================================================================
--- scummvm/trunk/engines/m4/mads_logic.cpp	2010-02-17 04:20:19 UTC (rev 48075)
+++ scummvm/trunk/engines/m4/mads_logic.cpp	2010-02-17 11:37:17 UTC (rev 48076)
@@ -36,9 +36,7 @@
 }
 
 void MadsSceneLogic::getSceneSpriteSet() {
-	char *setName = _madsVm->scene()->_playerSpriteName;
-	char oldName[100];
-	strcpy(oldName, setName);
+	char prefix[100];
 
 	// Room change sound
 	_madsVm->_sound->playSound(5);
@@ -46,20 +44,20 @@
 	// Set up sprite set prefix to use
 	if ((_sceneNumber <= 103) || (_sceneNumber == 111)) {
 		if (_madsVm->globals()->_globals[0] == SEX_FEMALE)
-			strcpy(setName, "ROX");
+			strcpy(prefix, "ROX");
 		else
-			strcpy(setName, "RXM");
+			strcpy(prefix, "RXM");
 	} else if (_sceneNumber <= 110) {
-		strcpy(setName, "RXSW");
+		strcpy(prefix, "RXSW");
 		_madsVm->globals()->_globals[0] = SEX_UNKNOWN;
 	} else if (_sceneNumber == 112)
-		strcpy(setName, "");
+		strcpy(prefix, "");
 
-	if (strcmp(setName, oldName) != 0)
-		_madsVm->globals()->playerSpriteChanged = true;
+	_madsVm->globals()->playerSpriteChanged = true;
+	_madsVm->scene()->loadPlayerSprites(prefix);
 
-	if ((_sceneNumber == 105)/* || ((_sceneNumber == 109) && (word_84800 != 0))*/)
-		_madsVm->globals()->playerSpriteChanged = true;
+//	if ((_sceneNumber == 105) ((_sceneNumber == 109) && (word_84800 != 0)))
+//		_madsVm->globals()->playerSpriteChanged = true;
 
 	_vm->_palette->setEntry(16, 0x38, 0xFF, 0xFF);
 	_vm->_palette->setEntry(17, 0x38, 0xb4, 0xb4);

Modified: scummvm/trunk/engines/m4/scene.cpp
===================================================================
--- scummvm/trunk/engines/m4/scene.cpp	2010-02-17 04:20:19 UTC (rev 48075)
+++ scummvm/trunk/engines/m4/scene.cpp	2010-02-17 11:37:17 UTC (rev 48076)
@@ -55,22 +55,7 @@
 }
 
 Scene::~Scene() {
-	_sceneResources.hotspots->clear();
-	_sceneResources.parallax->clear();
-	_sceneResources.props->clear();
-
-	delete _sceneResources.hotspots;
-	delete _sceneResources.parallax;
-	delete _sceneResources.props;
-
-	delete _backgroundSurface;
-	delete _codeSurface;
-
-//	_vm->_palette->deleteAllRanges();
-
-	delete _palData;
-	delete _interfacePal;
-	delete[] _inverseColorTable;
+	leaveScene();
 }
 
 void Scene::loadScene(int sceneNumber) {
@@ -88,6 +73,12 @@
 	}
 }
 
+void Scene::leaveScene() {
+	delete _palData;
+	delete _interfacePal;
+	delete[] _inverseColorTable;
+}
+
 void Scene::show() {
 	_vm->_viewManager->addView(this);
 }
@@ -603,7 +594,6 @@
 	_vm = vm;
 
 	strcpy(_statusText, "");
-	strcpy(_playerSpriteName, "");
 	_interfaceSurface = new MadsInterfaceView(vm);
 	_currentAction = kVerbNone;
 }
@@ -664,6 +654,25 @@
 	_vm->res()->purge();
 }
 
+void MadsScene::leaveScene() {
+	_sceneResources.hotspots->clear();
+	_sceneResources.parallax->clear();
+	_sceneResources.props->clear();
+
+	delete _sceneResources.hotspots;
+	delete _sceneResources.parallax;
+	delete _sceneResources.props;
+
+	// Delete the sprites
+	for (uint i = 0; i <_sceneSprites.size(); ++i) delete _sceneSprites[i];
+	_sceneSprites.clear();
+
+	delete _backgroundSurface;
+	delete _codeSurface;
+
+	Scene::leaveScene();
+}
+
 void MadsScene::show() {
 	Scene::show();
 	_vm->_viewManager->addView(_interfaceSurface);
@@ -773,6 +782,35 @@
 	}
 
 	_interfaceSurface->copyTo(this, 0, this->height() - _interfaceSurface->height());
+
+	//***DEBUG***
+	_sceneSprites[0]->getFrame(1)->copyTo(this, 120, 90, 0);
 }
 
+void MadsScene::loadPlayerSprites(const char *prefix) {
+	const char suffixList[8] = { '8', '9', '6', '3', '2', '7', '4', '1' };
+	char setName[80];
+
+	strcpy(setName, "*");
+	strcat(setName, prefix);
+	strcat(setName, "_0.SS");
+	char *digitP = strchr(setName, '_') + 1;
+
+	for (int idx = 0; idx < 8; ++idx) {
+		*digitP = suffixList[idx];
+
+		if (_vm->res()->resourceExists(setName)) {
+			Common::SeekableReadStream *data = _vm->res()->get(setName);
+			SpriteAsset *playerSprites = new SpriteAsset(_vm, data, data->size(), setName);
+			playerSprites->translate(_vm->_palette);
+			_vm->res()->toss(setName);
+
+			_sceneSprites.push_back(playerSprites);
+			return;
+		}
+	}
+
+	error("Couldn't find player sprites");
+}
+
 } // End of namespace M4

Modified: scummvm/trunk/engines/m4/scene.h
===================================================================
--- scummvm/trunk/engines/m4/scene.h	2010-02-17 04:20:19 UTC (rev 48075)
+++ scummvm/trunk/engines/m4/scene.h	2010-02-17 11:37:17 UTC (rev 48076)
@@ -36,6 +36,7 @@
 #include "m4/m4_views.h"
 #include "m4/mads_logic.h"
 #include "m4/mads_views.h"
+#include "common/array.h"
 
 namespace M4 {
 
@@ -101,6 +102,7 @@
 
 	// Methods that differ between engines
 	virtual void loadScene(int sceneNumber);
+	virtual void leaveScene();
 	virtual void loadSceneCodes(int sceneNumber, int index = 0) = 0;
 	virtual void show();
 	virtual void checkHotspotAtMousePos(int x, int y) = 0;
@@ -146,6 +148,7 @@
 
 	// Methods that differ between engines
 	virtual void loadScene(int sceneNumber);
+	virtual void leaveScene() {};
 	virtual void loadSceneCodes(int sceneNumber, int index = 0);
 	virtual void show();
 	virtual void checkHotspotAtMousePos(int x, int y);
@@ -158,6 +161,8 @@
 	M4InterfaceView *getInterface() { return (M4InterfaceView *)_interfaceSurface; };
 };
 
+typedef Common::Array<SpriteAsset *> SpriteAssetArray;
+
 class MadsScene : public Scene {
 private:
 	MadsEngine *_vm;
@@ -166,15 +171,15 @@
 	char _statusText[100];
 	MadsSceneLogic _sceneLogic;
 	SpriteAsset *_playerSprites;
+	SpriteAssetArray _sceneSprites;
 public:
-	char _playerSpriteName[100];
 	char _aaName[100];
 public:
 	MadsScene(MadsEngine *vm);
-	virtual ~MadsScene() {};
 
 	// Methods that differ between engines
 	virtual void loadScene(int sceneNumber);
+	virtual void leaveScene();
 	virtual void loadSceneCodes(int sceneNumber, int index = 0);
 	virtual void show();
 	virtual void checkHotspotAtMousePos(int x, int y);
@@ -184,6 +189,8 @@
 	virtual void setStatusText(const char *text);
 	virtual void update();
 
+	void loadPlayerSprites(const char *prefix);
+
 	MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; };
 };
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list