diff options
author | uruk | 2014-06-17 15:37:55 +0200 |
---|---|---|
committer | uruk | 2014-06-17 15:37:55 +0200 |
commit | 186d90e5b58c09e04f570b51f97a7bd3315dcbde (patch) | |
tree | 89ad609f7854fa078c0a76b6b0be13c0838d739e | |
parent | 40262bad980ffb0a86492e67c5430b24e6454438 (diff) | |
download | scummvm-rg350-186d90e5b58c09e04f570b51f97a7bd3315dcbde.tar.gz scummvm-rg350-186d90e5b58c09e04f570b51f97a7bd3315dcbde.tar.bz2 scummvm-rg350-186d90e5b58c09e04f570b51f97a7bd3315dcbde.zip |
CGE2: Implement switching between scenes.
Minor modification in Spare again to do so.
-rw-r--r-- | engines/cge2/cge2.cpp | 1 | ||||
-rw-r--r-- | engines/cge2/cge2.h | 14 | ||||
-rw-r--r-- | engines/cge2/cge2_main.cpp | 70 | ||||
-rw-r--r-- | engines/cge2/snail.cpp | 41 | ||||
-rw-r--r-- | engines/cge2/spare.cpp | 2 |
5 files changed, 115 insertions, 13 deletions
diff --git a/engines/cge2/cge2.cpp b/engines/cge2/cge2.cpp index 135f786de0..96beff7195 100644 --- a/engines/cge2/cge2.cpp +++ b/engines/cge2/cge2.cpp @@ -96,6 +96,7 @@ CGE2Engine::CGE2Engine(OSystem *syst, const ADGameDescription *gameDescription) _flag[i] = false; _sayCap = true; _sayVox = true; + _req = 1; } void CGE2Engine::init() { diff --git a/engines/cge2/cge2.h b/engines/cge2/cge2.h index e19ca576d3..bc4a16c33f 100644 --- a/engines/cge2/cge2.h +++ b/engines/cge2/cge2.h @@ -78,8 +78,11 @@ class Map; #define kPocketsWidth 59 #define kLineMax 512 +#define kExitOkText 40 +#define kCrackedText 44 + enum CallbackType { - kNullCB = 0, kQGame, kMiniStep, kXScene, kSoundSetVolume + kNullCB = 0, kQGame, kXScene, kSoundSetVolume }; enum Action { kNear, kMTake, kFTake, kActions }; @@ -108,7 +111,9 @@ public: void loadSprite(const char *fname, int ref, int scene, V3D &pos); void badLab(const char *fn); void sceneUp(int cav); - void switchScene(int cav); + void sceneDown(); + void closePocket(); + void switchScene(int scene); void showBak(int ref); void loadTab(); int newRandom(int range); @@ -126,7 +131,6 @@ public: bool isHero(Sprite *spr); void loadUser(); void checkSaySwitch(); - void qGame(); void loadPos(); void releasePocket(Sprite *spr); void switchHero(int sex); @@ -194,6 +198,9 @@ public: void hide1(Sprite *spr); Sprite *expandSprite(Sprite *spr); + void qGame(); + void xScene(); + void sndSetVolume(); const ADGameDescription *_gameDescription; @@ -219,6 +226,7 @@ public: bool _flag[4]; bool _sayCap; bool _sayVox; + int _req; ResourceManager *_resman; Vga *_vga; diff --git a/engines/cge2/cge2_main.cpp b/engines/cge2/cge2_main.cpp index c0b41e4756..0fc2d5af71 100644 --- a/engines/cge2/cge2_main.cpp +++ b/engines/cge2/cge2_main.cpp @@ -459,8 +459,69 @@ void CGE2Engine::sceneUp(int cav) { //setDrawColors(); - It's only for debugging purposes. Can be left out for now. } -void CGE2Engine::switchScene(int cav) { - warning("STUB: CGE2Engine::switchScene()"); +void CGE2Engine::sceneDown() { + busy(true); + _commandStat._wait = nullptr; // unlock snail + Sprite *spr = _vga->_showQ->locate((_now << 8) | 254); + if (spr) + feedSnail(spr, kNear, _heroTab[_sex]->_ptr); + while (!(_commandHandler->idle() && _commandHandlerTurbo->idle())) { + _commandHandlerTurbo->runCommand(); + _commandHandler->runCommand(); + } + closePocket(); + for (int i = 0; i < 2; i++) + _spare->update(_vga->_showQ->remove(_heroTab[i]->_ptr)); + _spare->dispose(); +} + +void CGE2Engine::closePocket() { + for (int i = 0; i < 2; i++) { + for (int j = 0; j < kPocketMax + 1; j++) { + Sprite *spr = _heroTab[i]->_pocket[j]; + _heroTab[i]->_pocket[j] = (Sprite*)((spr) ? spr->_ref : -1); + } + } +} + +void CGE2Engine::switchScene(int scene) { + if (scene == _now) + return; + + if (scene >= 0) { + if (!_flag[2]) // PROT + _flag[2] = true; + else { + int t = _text->getText(kCrackedText) ? kCrackedText : kExitOkText; + _commandHandler->addCommand(kCmdInf, -1, t, nullptr); + return; + } + } + + _req = scene; + for (int i = 0; i < 2; i++) { + Hero *h = _heroTab[i]->_ptr; + if (h->_scene == _now) { + delete _heroTab[i]->_posTab[_now]; + V2D *temp = new V2D(this, h->_pos3D._x.trunc(), h->_pos3D._z.trunc()); + _heroTab[i]->_posTab[_now] = temp; + } + } + *(_eyeTab[_now]) = *_eye; + if (scene < 0) + _commandHandler->addCallback(kCmdExec, -1, 0, kQGame); // quit game + else { + if (_heroTab[_sex]->_ptr->_scene == _now) { + _heroTab[_sex]->_ptr->setScene(scene); + if (_heroTab[!_sex]->_ptr->_scene == _now) + _heroTab[!_sex]->_ptr->setScene(scene); + } + _mouse->off(); + if (_heroTab[_sex]->_ptr) + _heroTab[_sex]->_ptr->park(); + killText(); + _commandHandler->addCallback(kCmdExec, -1, 0, kXScene); // switch scene + } } void CGE2Engine::showBak(int ref) { @@ -701,11 +762,6 @@ void CGE2Engine::checkSaySwitch() { warning("STUB: CGE2Engine::checkSaySwitch()"); } -void CGE2Engine::qGame() { - warning("STUB: CGE2Engine::qGame()"); - _endGame = true; -} - void CGE2Engine::loadTab() { setEye(_text->getText(240)); for (int i = 0; i < kSceneMax; i++) diff --git a/engines/cge2/snail.cpp b/engines/cge2/snail.cpp index 068ccf86d5..d799f28cc1 100644 --- a/engines/cge2/snail.cpp +++ b/engines/cge2/snail.cpp @@ -301,7 +301,20 @@ void CommandHandler::runCommand() { _vm->snDim(spr, tailCmd._val); break; case kCmdExec: - warning("Unhandled command - kCmdExec"); + switch (tailCmd._cbType) { + case kQGame: + _vm->qGame(); + break; + case kXScene: + _vm->xScene(); + break; + case kSoundSetVolume: + _vm->sndSetVolume(); + break; + default: + error("Unknown Callback Type in SNEXEC"); + break; + } break; case kCmdStep: spr->step(); @@ -638,6 +651,20 @@ Sprite *CGE2Engine::expandSprite(Sprite *spr) { return spr; } +void CGE2Engine::qGame() { + warning("STUB: CGE2Engine::qGame()"); + _endGame = true; +} + +void CGE2Engine::xScene() { + sceneDown(); + sceneUp(_req); +} + +void CGE2Engine::sndSetVolume() { + warning("STUB: CGE2Engine::sndSetVolume()"); +} + void CommandHandler::addCommand(CommandType com, int ref, int val, void *ptr) { if (ref == 2) ref = 142 - _vm->_sex; @@ -653,7 +680,17 @@ void CommandHandler::addCommand(CommandType com, int ref, int val, void *ptr) { } void CommandHandler::addCallback(CommandType com, int ref, int val, CallbackType cbType) { - warning("STUB: CommandHandler::addCallback()"); + Command *headCmd = &_commandList[_head++]; + headCmd->_commandType = com; + headCmd->_ref = ref; + headCmd->_val = val; + headCmd->_spritePtr = NULL; + headCmd->_cbType = cbType; + if (headCmd->_commandType == kCmdClear) { + _tail = _head; + _vm->killText(); + _timerExpiry = 0; + } } void CommandHandler::insertCommand(CommandType com, int ref, int val, void *ptr) { diff --git a/engines/cge2/spare.cpp b/engines/cge2/spare.cpp index 2977a586f3..8382310e1b 100644 --- a/engines/cge2/spare.cpp +++ b/engines/cge2/spare.cpp @@ -65,7 +65,7 @@ void Spare::takeScene(int cav) { Sprite *spr = tempCont[i]; int c = spr->_scene; if ((c == _vm->_now || c == 0) && spr->_ref != bakRef) { - spr = take(spr->_ref); + spr = locate(spr->_ref); _vm->_vga->_showQ->insert(spr); } } |