aboutsummaryrefslogtreecommitdiff
path: root/engines/m4
diff options
context:
space:
mode:
authorPaul Gilbert2010-03-10 11:43:48 +0000
committerPaul Gilbert2010-03-10 11:43:48 +0000
commitca6469840801235f5bb901828cd89f8a549f343f (patch)
tree85105bb37ab05f0b7222d96a28c2d3f9740262e2 /engines/m4
parent77592b5690d227c48520427a3c0600a58471685c (diff)
downloadscummvm-rg350-ca6469840801235f5bb901828cd89f8a549f343f.tar.gz
scummvm-rg350-ca6469840801235f5bb901828cd89f8a549f343f.tar.bz2
scummvm-rg350-ca6469840801235f5bb901828cd89f8a549f343f.zip
Split up the SceneResources class into a generic common set, with specific versions each for M4 and Mads, and merged the MadsSceneInfo data into it
svn-id: r48223
Diffstat (limited to 'engines/m4')
-rw-r--r--engines/m4/m4_scene.cpp4
-rw-r--r--engines/m4/m4_scene.h10
-rw-r--r--engines/m4/mads_scene.cpp29
-rw-r--r--engines/m4/mads_scene.h10
-rw-r--r--engines/m4/scene.cpp71
-rw-r--r--engines/m4/scene.h9
-rw-r--r--engines/m4/staticres.cpp1
-rw-r--r--engines/m4/staticres.h1
8 files changed, 85 insertions, 50 deletions
diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp
index 1d5cc171a3..8677a344b5 100644
--- a/engines/m4/m4_scene.cpp
+++ b/engines/m4/m4_scene.cpp
@@ -25,9 +25,9 @@
#include "common/system.h"
+#include "m4/m4_scene.h"
#include "m4/dialogs.h"
#include "m4/globals.h"
-#include "m4/scene.h"
#include "m4/events.h"
#include "m4/graphics.h"
#include "m4/rails.h"
@@ -38,7 +38,7 @@
namespace M4 {
-M4Scene::M4Scene(M4Engine *vm): Scene(vm) {
+M4Scene::M4Scene(M4Engine *vm): _sceneResources(), Scene(vm, &_sceneResources) {
_vm = vm;
_sceneSprites = NULL;
_interfaceSurface = new M4InterfaceView(vm);
diff --git a/engines/m4/m4_scene.h b/engines/m4/m4_scene.h
index be04a52dce..8d55c3434c 100644
--- a/engines/m4/m4_scene.h
+++ b/engines/m4/m4_scene.h
@@ -36,9 +36,18 @@ namespace M4 {
#define MAINMENU_SCENE_BURGER 903
#define FIRST_SCENE 101
+class M4SceneResources : public SceneResources {
+public:
+ int32 frontY, backY;
+ int32 frontScale, backScale;
+ int16 depthTable[16];
+ int32 railNodeCount; // # of rails
+};
+
class M4Scene : public Scene {
private:
M4Engine *_vm;
+ M4SceneResources _sceneResources;
SpriteAsset *_sceneSprites;
SpriteAsset *_walkerSprite;
@@ -61,6 +70,7 @@ public:
virtual void update();
M4InterfaceView *getInterface() { return (M4InterfaceView *)_interfaceSurface; };
+ M4SceneResources &getSceneResources() { return _sceneResources; };
};
} // End of namespace M4
diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp
index 51f4cb72ba..284808af83 100644
--- a/engines/m4/mads_scene.cpp
+++ b/engines/m4/mads_scene.cpp
@@ -40,7 +40,7 @@
namespace M4 {
-MadsScene::MadsScene(MadsEngine *vm): Scene(vm) {
+MadsScene::MadsScene(MadsEngine *vm): _sceneResources(), Scene(vm, &_sceneResources) {
_vm = vm;
strcpy(_statusText, "");
@@ -55,7 +55,7 @@ MadsScene::MadsScene(MadsEngine *vm): Scene(vm) {
*/
void MadsScene::loadScene2(const char *aaName) {
// Load up the properties for the scene
- _sceneInfo.load(_currentScene);
+ _sceneResources.load(_currentScene);
// Load scene walk paths
loadSceneCodes(_currentScene);
@@ -169,7 +169,7 @@ void MadsScene::loadSceneCodes(int sceneNumber, int index) {
} else if (_vm->getGameType() == GType_RexNebular) {
// For Rex Nebular, the walk areas are part of the scene info
byte *destP = _walkSurface->getBasePtr(0, 0);
- const byte *srcP = _sceneInfo.walkData;
+ const byte *srcP = _sceneResources.walkData;
byte runLength;
while ((runLength = *srcP++) != 0) {
Common::set_to(destP, destP + runLength, *srcP++);
@@ -448,7 +448,26 @@ void MadsAction::set() {
if (_currentHotspot >= 0) {
if (_selectedRow < 0) {
-
+ int verbId;
+ int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount;
+
+ if (_currentHotspot < hotspotCount) {
+ // Get the verb Id from the hotspot
+ verbId = 0;//selected hotspot
+ } else {
+ // Get the verb Id from the scene object
+ verbId = 0;//Scene_object[_currentHotspot - _hotspotCount].verbId;
+ }
+
+ if (verbId > 0) {
+ // Set the specified action
+ _currentAction = verbId;
+ appendVocab(_currentAction, true);
+ } else {
+ // Default to a standard 'walk to'
+ _currentAction = kVerbWalkTo;
+ strcat(_statusText, walkToStr);
+ }
}
//loc_21CE2
@@ -461,7 +480,7 @@ void MadsAction::set() {
/*--------------------------------------------------------------------------*/
-void MadsSceneInfo::load(int sId) {
+void MadsSceneResources::load(int sId) {
const char *sceneInfoStr = MADSResourceManager::getResourceName(RESPREFIX_RM, sId, ".DAT");
Common::SeekableReadStream *rawStream = _vm->_resourceManager->get(sceneInfoStr);
MadsPack sceneInfo(rawStream);
diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h
index 321c13103e..767bfd1d95 100644
--- a/engines/m4/mads_scene.h
+++ b/engines/m4/mads_scene.h
@@ -45,7 +45,8 @@ struct DirtyArea {
Common::Rect bounds;
};
-class MadsSceneInfo {
+
+class MadsSceneResources: public SceneResources {
public:
int sceneId;
int artFileNum;
@@ -59,8 +60,8 @@ public:
int walkSize;
byte *walkData;
- MadsSceneInfo() { walkSize = 0; walkData = NULL; }
- ~MadsSceneInfo() { delete walkData; }
+ MadsSceneResources() { walkSize = 0; walkData = NULL; }
+ ~MadsSceneResources() { delete walkData; }
void load(int sceneId);
};
@@ -153,10 +154,10 @@ typedef Common::Array<SpriteAsset *> SpriteAssetArray;
class MadsScene : public Scene {
private:
MadsEngine *_vm;
+ MadsSceneResources _sceneResources;
char _statusText[100];
MadsSceneLogic _sceneLogic;
- MadsSceneInfo _sceneInfo;
SpriteAsset *_playerSprites;
SpriteAssetArray _sceneSprites;
SpriteSlot _spriteSlots[50];
@@ -192,6 +193,7 @@ public:
void loadPlayerSprites(const char *prefix);
MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; };
+ MadsSceneResources &getSceneResources() { return _sceneResources; };
};
} // End of namespace M4
diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp
index a9905f5b2f..af3a78f7c9 100644
--- a/engines/m4/scene.cpp
+++ b/engines/m4/scene.cpp
@@ -39,12 +39,13 @@
namespace M4 {
-Scene::Scene(MadsM4Engine *vm): View(vm, Common::Rect(0, 0, vm->_screen->width(), vm->_screen->height())) {
+Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0, vm->_screen->width(),
+ vm->_screen->height())), _sceneResources(res) {
_screenType = VIEWID_SCENE;
- _sceneResources.hotspots = new HotSpotList();
- _sceneResources.parallax = new HotSpotList();
- _sceneResources.props = new HotSpotList();
+ _sceneResources->hotspots = new HotSpotList();
+ _sceneResources->parallax = new HotSpotList();
+ _sceneResources->props = new HotSpotList();
_backgroundSurface = new M4Surface();
_walkSurface = new M4Surface();
_palData = NULL;
@@ -100,23 +101,23 @@ void Scene::loadSceneResources(int sceneNumber) {
Common::SeekableReadStream *sceneS = _vm->res()->get(filename);
if (sceneS != NULL) {
- sceneS->read(_sceneResources.artBase, MAX_CHK_FILENAME_SIZE);
- sceneS->read(_sceneResources.pictureBase, MAX_CHK_FILENAME_SIZE);
- _sceneResources.hotspotCount = sceneS->readUint32LE();
- _sceneResources.parallaxCount = sceneS->readUint32LE();
- _sceneResources.propsCount = sceneS->readUint32LE();
- _sceneResources.frontY = sceneS->readUint32LE();
- _sceneResources.backY = sceneS->readUint32LE();
- _sceneResources.frontScale = sceneS->readUint32LE();
- _sceneResources.backScale = sceneS->readUint32LE();
+ sceneS->read(_sceneResources->artBase, MAX_CHK_FILENAME_SIZE);
+ sceneS->read(_sceneResources->pictureBase, MAX_CHK_FILENAME_SIZE);
+ _sceneResources->hotspotCount = sceneS->readUint32LE();
+ _sceneResources->parallaxCount = sceneS->readUint32LE();
+ _sceneResources->propsCount = sceneS->readUint32LE();
+ _sceneResources->frontY = sceneS->readUint32LE();
+ _sceneResources->backY = sceneS->readUint32LE();
+ _sceneResources->frontScale = sceneS->readUint32LE();
+ _sceneResources->backScale = sceneS->readUint32LE();
for (i = 0; i < 16; i++)
- _sceneResources.depthTable[i] = sceneS->readUint16LE();
- _sceneResources.railNodeCount = sceneS->readUint32LE();
+ _sceneResources->depthTable[i] = sceneS->readUint16LE();
+ _sceneResources->railNodeCount = sceneS->readUint32LE();
// Clear rails from previous scene
_vm->_rails->clearRails();
- for (i = 0; i < _sceneResources.railNodeCount; i++) {
+ for (i = 0; i < _sceneResources->railNodeCount; i++) {
x = sceneS->readUint32LE();
y = sceneS->readUint32LE();
if (_vm->_rails->addRailNode(x, y, true) < 0) {
@@ -125,13 +126,13 @@ void Scene::loadSceneResources(int sceneNumber) {
}
// Clear current hotspot lists
- _sceneResources.hotspots->clear();
- _sceneResources.parallax->clear();
- _sceneResources.props->clear();
+ _sceneResources->hotspots->clear();
+ _sceneResources->parallax->clear();
+ _sceneResources->props->clear();
- _sceneResources.hotspots->loadHotSpots(sceneS, _sceneResources.hotspotCount);
- _sceneResources.parallax->loadHotSpots(sceneS, _sceneResources.parallaxCount);
- _sceneResources.props->loadHotSpots(sceneS, _sceneResources.propsCount);
+ _sceneResources->hotspots->loadHotSpots(sceneS, _sceneResources->hotspotCount);
+ _sceneResources->parallax->loadHotSpots(sceneS, _sceneResources->parallaxCount);
+ _sceneResources->props->loadHotSpots(sceneS, _sceneResources->propsCount);
// Note that toss() deletes the MemoryReadStream
_vm->res()->toss(filename);
@@ -147,14 +148,14 @@ void Scene::loadSceneHotSpotsMads(int sceneNumber) {
int hotspotCount = hotspotStream->readUint16LE();
delete hotspotStream;
- _sceneResources.hotspotCount = hotspotCount;
+ _sceneResources->hotspotCount = hotspotCount;
hotspotStream = hotSpotData.getItemStream(1);
// Clear current hotspot lists
- _sceneResources.hotspots->clear();
+ _sceneResources->hotspots->clear();
- _sceneResources.hotspots->loadHotSpots(hotspotStream, _sceneResources.hotspotCount);
+ _sceneResources->hotspots->loadHotSpots(hotspotStream, _sceneResources->hotspotCount);
delete hotspotStream;
}
@@ -204,19 +205,19 @@ void Scene::showSprites() {
// taken from set_walker_scaling() in adv_walk.cpp. A proper implementation will need
// to store these in global variables
- int minScaling = FixedDiv(_sceneResources.backScale << 16, 100 << 16);
- int maxScaling = FixedDiv(_sceneResources.frontScale << 16, 100 << 16);
+ int minScaling = FixedDiv(_sceneResources->backScale << 16, 100 << 16);
+ int maxScaling = FixedDiv(_sceneResources->frontScale << 16, 100 << 16);
int scaler;
_vm->_actor->setWalkerDirection(kFacingSouthEast);
//_vm->_actor->setWalkerPalette();
// taken from set_walker_scaling() in adv_walk.cpp
- if (_sceneResources.frontY == _sceneResources.backY)
+ if (_sceneResources->frontY == _sceneResources->backY)
scaler = 0;
else
scaler = FixedDiv(maxScaling - minScaling,
- (_sceneResources.frontY << 16) - (_sceneResources.backY << 16));
+ (_sceneResources->frontY << 16) - (_sceneResources->backY << 16));
// FIXME: For now, we (incorrectly) scale the walker to 50% of the scene's max scaling
_vm->_actor->setWalkerScaling(scaler / 2);
@@ -232,19 +233,19 @@ void Scene::showHotSpots() {
int i = 0;
HotSpot *currentHotSpot;
// hotspots (green)
- for (i = 0; i < _sceneResources.hotspotCount; i++) {
- currentHotSpot = _sceneResources.hotspots->get(i);
+ for (i = 0; i < _sceneResources->hotspotCount; i++) {
+ currentHotSpot = _sceneResources->hotspots->get(i);
_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->GREEN);
}
if (_vm->isM4()) {
// parallax (yellow)
- for (i = 0; i < _sceneResources.parallaxCount; i++) {
- currentHotSpot = _sceneResources.parallax->get(i);
+ for (i = 0; i < _sceneResources->parallaxCount; i++) {
+ currentHotSpot = _sceneResources->parallax->get(i);
_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->YELLOW);
}
// props (red)
- for (i = 0; i < _sceneResources.propsCount; i++) {
- currentHotSpot = _sceneResources.props->get(i);
+ for (i = 0; i < _sceneResources->propsCount; i++) {
+ currentHotSpot = _sceneResources->props->get(i);
_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->RED);
}
}
diff --git a/engines/m4/scene.h b/engines/m4/scene.h
index 0f4fc6c48d..59b822be12 100644
--- a/engines/m4/scene.h
+++ b/engines/m4/scene.h
@@ -58,7 +58,8 @@ enum MADSVerbs {
kVerbWalkTo = 13
};
-struct SceneResources {
+class SceneResources {
+public:
char artBase[MAX_CHK_FILENAME_SIZE];
char pictureBase[MAX_CHK_FILENAME_SIZE];
int32 hotspotCount;
@@ -89,9 +90,9 @@ protected:
M4Surface *_walkSurface;
RGBList *_palData;
RGBList *_interfacePal;
- SceneResources _sceneResources;
+ SceneResources *_sceneResources;
public:
- Scene(MadsM4Engine *vm);
+ Scene(MadsM4Engine *vm, SceneResources *res);
virtual ~Scene();
// Methods that differ between engines
@@ -122,7 +123,7 @@ public:
void hideInterface();
void showMADSV2TextBox(char *text, int x, int y, char *faceName);
GameInterfaceView *getInterface() { return _interfaceSurface; };
- SceneResources getSceneResources() { return _sceneResources; };
+ SceneResources &getSceneResources() { return *_sceneResources; };
void onRefresh(RectList *rects, M4Surface *destSurface);
bool onEvent(M4EventType eventType, int32 param1, int x, int y, bool &captureEvents);
diff --git a/engines/m4/staticres.cpp b/engines/m4/staticres.cpp
index 21cb719a2c..f8f25b7455 100644
--- a/engines/m4/staticres.cpp
+++ b/engines/m4/staticres.cpp
@@ -41,6 +41,7 @@ const char *atStr = "at";
const char *lookAroundStr = "Look around";
const char *toStr = "to ";
const char *useStr = "Use ";
+const char *walkToStr = "Walk to ";
VerbInit verbList[10] = {
{kVerbLook, 2, 0},
diff --git a/engines/m4/staticres.h b/engines/m4/staticres.h
index 7d33aff189..059fa80e68 100644
--- a/engines/m4/staticres.h
+++ b/engines/m4/staticres.h
@@ -39,6 +39,7 @@ extern const char *atStr;
extern const char *lookAroundStr;
extern const char *toStr;
extern const char *useStr;
+extern const char *walkToStr;
struct VerbInit {
int verb;