diff options
-rw-r--r-- | engines/parallaction/exec_ns.cpp | 2 | ||||
-rw-r--r-- | engines/parallaction/gui_br.cpp | 24 | ||||
-rw-r--r-- | engines/parallaction/gui_ns.cpp | 49 | ||||
-rw-r--r-- | engines/parallaction/parallaction.cpp | 8 | ||||
-rw-r--r-- | engines/parallaction/parallaction.h | 17 | ||||
-rw-r--r-- | engines/parallaction/parallaction_br.cpp | 45 | ||||
-rw-r--r-- | engines/parallaction/parallaction_ns.cpp | 11 | ||||
-rw-r--r-- | engines/parallaction/parser.h | 1 | ||||
-rw-r--r-- | engines/parallaction/saveload.cpp | 19 |
9 files changed, 98 insertions, 78 deletions
diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp index 013dda226d..fbe4c5303e 100644 --- a/engines/parallaction/exec_ns.cpp +++ b/engines/parallaction/exec_ns.cpp @@ -318,7 +318,7 @@ DECLARE_COMMAND_OPCODE(stop) { } -void Parallaction_ns::drawAnimations() { +void Parallaction::drawAnimations() { debugC(9, kDebugExec, "Parallaction_ns::drawAnimations()\n"); uint16 layer = 0, scale = 100; diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp index 5d0d07fc25..163e3a5b45 100644 --- a/engines/parallaction/gui_br.cpp +++ b/engines/parallaction/gui_br.cpp @@ -40,11 +40,11 @@ protected: Palette blackPal; Palette pal; - Parallaction_br *_vm; + Parallaction *_vm; int _fadeSteps; public: - SplashInputState_BR(Parallaction_br *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) { + SplashInputState_BR(Parallaction *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) { } virtual MenuInputState* run() { @@ -150,6 +150,8 @@ class MainMenuInputState_BR : public MenuInputState { static const char *_menuStrings[NUM_MENULINES]; static const MenuOptions _options[NUM_MENULINES]; + static const char *_firstLocation[]; + int _availItems; int _selection; @@ -173,7 +175,7 @@ class MainMenuInputState_BR : public MenuInputState { break; default: - _vm->startPart(selectedItem); + _vm->scheduleLocationSwitch(_firstLocation[selectedItem]); } } @@ -218,9 +220,11 @@ public: } _vm->showSlide("tbra", x, y); - // TODO: load progress from savefile - int progress = 3; - _availItems = 4 + progress; + _availItems = 4; + + bool complete[3]; + _vm->getGamePartProgress(complete, 3); + for (int i = 0; i < 3 && complete[i]; i++, _availItems++) ; // TODO: keep track of and destroy menu item frames/surfaces int i; @@ -236,6 +240,14 @@ public: }; +const char *MainMenuInputState_BR::_firstLocation[] = { + "intro.0", + "museo.1", + "start.2", + "bolscoi.3", + "treno.4" +}; + const char *MainMenuInputState_BR::_menuStrings[NUM_MENULINES] = { "SEE INTRO", "NEW GAME", diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp index 1fee4e538c..2807f6790f 100644 --- a/engines/parallaction/gui_ns.cpp +++ b/engines/parallaction/gui_ns.cpp @@ -41,10 +41,10 @@ protected: Common::String _nextState; uint32 _startTime; - Parallaction_ns *_vm; + Parallaction *_vm; public: - SplashInputState_NS(Parallaction_ns *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) { + SplashInputState_NS(Parallaction *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) { } virtual MenuInputState* run() { @@ -66,7 +66,7 @@ public: class SplashInputState0_NS : public SplashInputState_NS { public: - SplashInputState0_NS(Parallaction_ns *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro0", helper) { + SplashInputState0_NS(Parallaction *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro0", helper) { _slideName = "intro"; _timeOut = 2000; _nextState = "intro1"; @@ -76,7 +76,7 @@ public: class SplashInputState1_NS : public SplashInputState_NS { public: - SplashInputState1_NS(Parallaction_ns *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro1", helper) { + SplashInputState1_NS(Parallaction *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro1", helper) { _slideName = "minintro"; _timeOut = 2000; _nextState = "chooselanguage"; @@ -111,10 +111,10 @@ class ChooseLanguageInputState_NS : public MenuInputState { static const Common::Rect _amigaLanguageSelectBlocks[4]; const Common::Rect *_blocks; - Parallaction_ns *_vm; + Parallaction *_vm; public: - ChooseLanguageInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("chooselanguage", helper), _vm(vm) { + ChooseLanguageInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("chooselanguage", helper), _vm(vm) { _allowChoice = false; _nextState = "selectgame"; @@ -203,13 +203,13 @@ class SelectGameInputState_NS : public MenuInputState { uint _labels[2]; - Parallaction_ns *_vm; + Parallaction *_vm; static const char *newGameMsg[4]; static const char *loadGameMsg[4]; public: - SelectGameInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("selectgame", helper), _vm(vm) { + SelectGameInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("selectgame", helper), _vm(vm) { _choice = 0; _oldChoice = -1; @@ -271,10 +271,10 @@ const char *SelectGameInputState_NS::loadGameMsg[4] = { class LoadGameInputState_NS : public MenuInputState { bool _result; - Parallaction_ns *_vm; + Parallaction *_vm; public: - LoadGameInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("loadgame", helper), _vm(vm) { } + LoadGameInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("loadgame", helper), _vm(vm) { } virtual MenuInputState* run() { if (!_result) { @@ -291,12 +291,12 @@ public: class NewGameInputState_NS : public MenuInputState { - Parallaction_ns *_vm; + Parallaction *_vm; static const char *introMsg3[4]; public: - NewGameInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("newgame", helper), _vm(vm) { + NewGameInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("newgame", helper), _vm(vm) { } virtual MenuInputState* run() { @@ -344,10 +344,10 @@ const char *NewGameInputState_NS::introMsg3[4] = { class StartDemoInputState_NS : public MenuInputState { - Parallaction_ns *_vm; + Parallaction *_vm; public: - StartDemoInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("startdemo", helper), _vm(vm) { + StartDemoInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("startdemo", helper), _vm(vm) { } virtual MenuInputState* run() { @@ -372,7 +372,7 @@ class SelectCharacterInputState_NS : public MenuInputState { static const Common::Rect codeSelectBlocks[9]; static const Common::Rect codeTrueBlocks[9]; - Parallaction_ns *_vm; + Parallaction *_vm; int guiGetSelectedBlock(const Common::Point &p) { @@ -425,7 +425,7 @@ class SelectCharacterInputState_NS : public MenuInputState { public: - SelectCharacterInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("selectcharacter", helper), _vm(vm) { + SelectCharacterInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("selectcharacter", helper), _vm(vm) { _keys = (_vm->getPlatform() == Common::kPlatformAmiga && (_vm->getFeatures() & GF_LANG_MULT)) ? _amigaKeys : _pcKeys; _block.create(BLOCK_WIDTH, BLOCK_HEIGHT, 1); } @@ -509,7 +509,6 @@ public: error("If you read this, either your CPU or transivity is broken (we believe the former)."); } - _vm->_inTestResult = false; _vm->cleanupGame(); _vm->scheduleLocationSwitch(_charStartLocation[character]); } @@ -621,7 +620,7 @@ const Common::Rect SelectCharacterInputState_NS::codeTrueBlocks[9] = { class ShowCreditsInputState_NS : public MenuInputState { - Parallaction_ns *_vm; + Parallaction *_vm; int _current; uint32 _startTime; @@ -633,7 +632,7 @@ class ShowCreditsInputState_NS : public MenuInputState { static const Credit _credits[6]; public: - ShowCreditsInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("showcredits", helper), _vm(vm) { + ShowCreditsInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("showcredits", helper), _vm(vm) { } void drawCurrentLabel() { @@ -686,11 +685,11 @@ const ShowCreditsInputState_NS::Credit ShowCreditsInputState_NS::_credits[6] = { }; class EndIntroInputState_NS : public MenuInputState { - Parallaction_ns *_vm; + Parallaction *_vm; bool _isDemo; public: - EndIntroInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("endintro", helper), _vm(vm) { + EndIntroInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("endintro", helper), _vm(vm) { _isDemo = (_vm->getFeatures() & GF_DEMO) != 0; } @@ -723,7 +722,7 @@ public: class EndPartInputState_NS : public MenuInputState { - Parallaction_ns *_vm; + Parallaction *_vm; bool _allPartsComplete; // part completion messages @@ -739,7 +738,7 @@ class EndPartInputState_NS : public MenuInputState { public: - EndPartInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("endpart", helper), _vm(vm) { + EndPartInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("endpart", helper), _vm(vm) { } virtual MenuInputState* run() { @@ -759,7 +758,9 @@ public: } virtual void enter() { - _allPartsComplete = _vm->allPartsComplete(); + bool completed[3]; + _vm->getGamePartProgress(completed, 3); + _allPartsComplete = (completed[0] && completed[1] && completed[2]); _vm->_input->setMouseState(MOUSE_DISABLED); uint id[4]; diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index aa363bc80e..d0700232d1 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -269,7 +269,15 @@ void Parallaction::freeLocation() { return; } +void Parallaction::showSlide(const char *name, int x, int y) { + BackgroundInfo *info = new BackgroundInfo; + _disk->loadSlide(*info, name); + + info->x = (x == CENTER_LABEL_HORIZONTAL) ? ((_vm->_screenWidth - info->width) >> 1) : x; + info->y = (y == CENTER_LABEL_VERTICAL) ? ((_vm->_screenHeight - info->height) >> 1) : y; + _gfx->setBackground(kBackgroundSlide, info); +} void Parallaction::freeBackground() { diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index d85c7e9f87..63cdc9cfc5 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -333,12 +333,16 @@ public: void updateDoor(ZonePtr z, bool close); - virtual void drawAnimations() = 0; + void drawAnimations(); void beep(); + void showSlide(const char *name, int x = 0, int y = 0); ZonePtr _zoneTrap; + virtual void cleanupGame() = 0; + virtual void getGamePartProgress(bool *complete, int size) = 0; + public: void highlightInventoryItem(ItemPosition pos); int16 getHoverInventoryItem(int16 x, int16 y); @@ -443,14 +447,13 @@ public: bool saveGame(); void switchBackground(const char* background, const char* mask); - void showSlide(const char *name, int x = 0, int y = 0); - // TODO: this should be private!!!!!!! - bool _inTestResult; void cleanupGame(); - bool allPartsComplete(); + void getGamePartProgress(bool *complete, int size); private: + bool _inTestResult; + LocationParser_ns *_locationParser; ProgramParser_ns *_programParser; @@ -528,7 +531,6 @@ private: const Callable *_callables; protected: - void drawAnimations(); void parseLocation(const char *filename); void loadProgram(AnimationPtr a, const char *filename); @@ -558,6 +560,7 @@ public: void setupSubtitles(char *s, char *s2, int y); void clearSubtitles(); + void getGamePartProgress(bool *complete, int size); public: Table *_countersNames; @@ -565,7 +568,6 @@ public: const char **_audioCommandsNamesRes; int _part; - int _progress; #if 0 // disabled since I couldn't find any references to lip sync in the scripts int16 _lipSyncVal; @@ -579,7 +581,6 @@ public: int32 _counters[32]; uint32 _zoneFlags[NUM_LOCATIONS][NUM_ZONES]; - void startPart(uint part); private: LocationParser_br *_locationParser; ProgramParser_br *_programParser; diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 25f541bdb2..61e01b79be 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -41,14 +41,6 @@ const char *Parallaction_br::_partNames[] = { "PART4" }; -const char *partFirstLocation[] = { - "intro", - "museo", - "start", - "bolscoi", - "treno" -}; - int Parallaction_br::init() { _screenWidth = 640; @@ -112,7 +104,7 @@ int Parallaction_br::go() { while ((_engineFlags & kEngineQuit) == 0) { if (getFeatures() & GF_DEMO) { - startPart(1); + scheduleLocationSwitch("camalb.1"); _input->_inputMode = Input::kInputModeGame; } else { startGui(splash); @@ -174,23 +166,6 @@ void Parallaction_br::freePart() { _countersNames = 0; } -void Parallaction_br::startPart(uint part) { - _part = part; - _disk->selectArchive(_partNames[_part]); - - initPart(); - - if (getFeatures() & GF_DEMO) { - strcpy(_location._name, "camalb"); - } else { - strcpy(_location._name, partFirstLocation[_part]); - } - - parseLocation("common"); - changeLocation(_location._name); - -} - void Parallaction_br::runPendingZones() { ZonePtr z; @@ -245,6 +220,24 @@ void Parallaction_br::freeLocation() { void Parallaction_br::changeLocation(char *location) { + char *partStr = strrchr(location, '.'); + if (partStr) { + int n = partStr - location; + strncpy(_location._name, location, n); + _location._name[n] = '\0'; + + _part = atoi(++partStr); + if (getFeatures() & GF_DEMO) { + assert(_part == 1); + } else { + assert(_part >= 0 && _part <= 4); + } + + _disk->selectArchive(_partNames[_part]); + initPart(); + parseLocation("common"); + } + freeLocation(); // load new location parseLocation(location); diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 77a6d0a577..e363e665eb 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -220,16 +220,6 @@ void Parallaction_ns::switchBackground(const char* background, const char* mask) } -void Parallaction_ns::showSlide(const char *name, int x, int y) { - BackgroundInfo *info = new BackgroundInfo; - _disk->loadSlide(*info, name); - - info->x = (x == CENTER_LABEL_HORIZONTAL) ? ((_vm->_screenWidth - info->width) >> 1) : x; - info->y = (y == CENTER_LABEL_VERTICAL) ? ((_vm->_screenHeight - info->height) >> 1) : y; - - _gfx->setBackground(kBackgroundSlide, info); -} - void Parallaction_ns::runPendingZones() { if (_activeZone) { ZonePtr z = _activeZone; // speak Zone or sound @@ -395,6 +385,7 @@ void Parallaction_ns::changeCharacter(const char *name) { } void Parallaction_ns::cleanupGame() { + _inTestResult = false; _engineFlags &= ~kEngineTransformedDonna; diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h index e622bfd81f..7bf41b2bea 100644 --- a/engines/parallaction/parser.h +++ b/engines/parallaction/parser.h @@ -27,6 +27,7 @@ #define PARALLACTION_PARSER_H #include "common/stream.h" +#include "common/stack.h" #include "parallaction/objects.h" #include "parallaction/walk.h" diff --git a/engines/parallaction/saveload.cpp b/engines/parallaction/saveload.cpp index d616230baa..7fccd38df3 100644 --- a/engines/parallaction/saveload.cpp +++ b/engines/parallaction/saveload.cpp @@ -445,14 +445,27 @@ void Parallaction_ns::setPartComplete(const Character& character) { return; } -bool Parallaction_ns::allPartsComplete() { - char buf[30]; +void Parallaction_ns::getGamePartProgress(bool *complete, int size) { + assert(complete && size >= 3); + char buf[30]; Common::InSaveFile *inFile = getInSaveFile(SPECIAL_SAVESLOT); inFile->readLine(buf, 29); delete inFile; - return strstr(buf, "dino") && strstr(buf, "donna") && strstr(buf, "dough"); + complete[0] = strstr(buf, "dino"); + complete[1] = strstr(buf, "donna"); + complete[2] = strstr(buf, "dough"); +} + +void Parallaction_br::getGamePartProgress(bool *complete, int size) { + assert(complete && size >= 3); + + // TODO: implement progress loading + + complete[0] = true; + complete[1] = true; + complete[2] = true; } void Parallaction_ns::renameOldSavefiles() { |