From ca6469840801235f5bb901828cd89f8a549f343f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 10 Mar 2010 11:43:48 +0000 Subject: 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 --- engines/m4/m4_scene.cpp | 4 +-- engines/m4/m4_scene.h | 10 +++++++ engines/m4/mads_scene.cpp | 29 +++++++++++++++---- engines/m4/mads_scene.h | 10 ++++--- engines/m4/scene.cpp | 71 ++++++++++++++++++++++++----------------------- engines/m4/scene.h | 9 +++--- engines/m4/staticres.cpp | 1 + engines/m4/staticres.h | 1 + 8 files changed, 85 insertions(+), 50 deletions(-) (limited to 'engines/m4') 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 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; -- cgit v1.2.3