From 83994972de35193e10ad01acac3369f1b00c992b Mon Sep 17 00:00:00 2001 From: Eric Fry Date: Thu, 7 Jun 2018 22:03:43 +1000 Subject: ILLUSIONS: Add debug cheat code support Work on inventory add/remove debug menu. --- engines/illusions/duckman/illusions_duckman.cpp | 4 +- engines/illusions/duckman/menusystem_duckman.cpp | 73 ++++++++++++++++++++++++ engines/illusions/duckman/menusystem_duckman.h | 13 +++++ 3 files changed, 87 insertions(+), 3 deletions(-) (limited to 'engines/illusions/duckman') diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp index 0b2bcca52f..c427293b59 100644 --- a/engines/illusions/duckman/illusions_duckman.cpp +++ b/engines/illusions/duckman/illusions_duckman.cpp @@ -261,10 +261,8 @@ void IllusionsEngine_Duckman::initInput() { _input->setInputEvent(kEventDown, 0x80) .addMouseButton(MOUSE_RIGHT_BUTTON) .addKey(Common::KEYCODE_DOWN); -#if 1 //TODO hide behind "gosanta" code _input->setInputEvent(kEventF1, 0x100) .addKey(Common::KEYCODE_F1); -#endif } #define UPDATEFUNCTION(priority, sceneId, callback) \ @@ -288,7 +286,7 @@ int IllusionsEngine_Duckman::updateScript(uint flags) { if (_screen->isDisplayOn() && !_screenPalette->isFaderActive() && _pauseCtr == 0) { if (_input->pollEvent(kEventAbort)) { startScriptThread(0x00020342, 0); - } else if (_input->pollEvent(kEventF1)) { + } else if (_input->isCheatModeActive() && _input->pollEvent(kEventF1)) { startScriptThread(0x0002033F, 0); } } diff --git a/engines/illusions/duckman/menusystem_duckman.cpp b/engines/illusions/duckman/menusystem_duckman.cpp index 263cda83ce..79734f1c53 100644 --- a/engines/illusions/duckman/menusystem_duckman.cpp +++ b/engines/illusions/duckman/menusystem_duckman.cpp @@ -24,6 +24,7 @@ #include "illusions/actor.h" #include "illusions/duckman/illusions_duckman.h" #include "illusions/duckman/menusystem_duckman.h" +#include "illusions/resources/scriptresource.h" namespace Illusions { @@ -83,6 +84,10 @@ BaseMenu *DuckmanMenuSystem::createMenuById(int menuId) { return createSaveCompleteMenu(); case kDuckmanOptionsMenu: return createOptionsMenu(); + case kDuckmanDebugMenu: + return createDebugMenu(); + case kDuckmanAddRemoveInventoryMenu: + return createAddRemoveInventoryMenu(); default: error("DuckmanMenuSystem::createMenuById() Invalid menu id %d", menuId); } @@ -148,12 +153,64 @@ BaseMenu *DuckmanMenuSystem::createSaveCompleteMenu() { return menu; } +BaseMenu *DuckmanMenuSystem::createDebugMenu() { + BaseMenu *menu = new BaseMenu(this, 0x00120002, 0, 0, 0, 17, 1); + menu->addText("Debug Pause Menu"); + menu->addText("-----------------"); + menu->addMenuItem(new MenuItem("Return to Game", new MenuActionReturnChoice(this, 1))); + menu->addMenuItem(new MenuItem("Add/Remove Inventory", new MenuActionEnterMenu(this, kDuckmanAddRemoveInventoryMenu))); + return menu; +} +typedef struct InventoryMenuItem { + const char *name; + uint32 objectId; + uint32 sequenceId; + uint32 propertyId; +} InventoryMenuItem; + +static const InventoryMenuItem kDebugInventoryItems[21] = +{ + { "Pick-up Book", 262212, 393231, 917519 }, + { "Bucket and Squeegee", 262314, 393233, 917599 }, + { "Cardboard Cut Out", 262219, 393264, 917573 }, + { "Talking Doll", 262209, 393943, 917587 }, + { "Cookie Fortunes", 262263, 393266, 917520 }, + { "Garbage Can Lid", 262311, 393259, 917597 }, + { "Chewing Gum", 262210, 393267, 917522 }, + { "Ladder", 262155, 393258, 917598 }, + { "Disco Light", 262342, 393260, 917594 }, + { "Magazine Cover", 262185, 393261, 917517 }, + { "Matches", 262159, 393232, 917516 }, + { "Opera Lessons", 262293, 393731, 917600 }, + { "Pizza Card", 262239, 393262, 917526 }, + { "Toilet Plunger", 262282, 393257, 917555 }, + { "Black Velvet Poster", 262258, 393269, 917527 }, + { "Red Spray Paint", 262297, 393254, 917531 }, + { "Remote Control", 262161, 393255, 917595 }, + { "Sparkplug", 262294, 393256, 917532 }, + { "Tape Recorder", 262328, 393827, 917584 }, + { "Wacky Putty", 262228, 393559, 917537 }, + { "Wrench", 262175, 393422, 917530 } +}; + +BaseMenu *DuckmanMenuSystem::createAddRemoveInventoryMenu() { + BaseMenu *menu = new BaseMenu(this, 0x00120002, 0, 0, 0, 17, 1); + menu->addText("Add/Remove Inventory"); + menu->addText("-----------------"); + for(int i=0;i < 21;i++) { + menu->addMenuItem(new MenuItem(kDebugInventoryItems[i].name, new MenuActionInventoryAddRemove(this, _vm, i))); + } + return menu; +} + int DuckmanMenuSystem::convertRootMenuId(uint32 menuId) { switch (menuId) { case 0x180001: return kDuckmanMainMenu; case 0x180002: return kDuckmanPauseMenu; + case 0x180004: + return kDuckmanDebugMenu; case 0x180005: return kDuckmanSaveCompleteMenu; /* @@ -198,4 +255,20 @@ void DuckmanMenuSystem::setGameState(int gameState) { _vm->_cursor._gameState = gameState; } +MenuActionInventoryAddRemove::MenuActionInventoryAddRemove(BaseMenuSystem *menuSystem, IllusionsEngine_Duckman *vm, uint choiceIndex) + : BaseMenuAction(menuSystem), _choiceIndex(choiceIndex), _vm(vm) { +} + +void MenuActionInventoryAddRemove::execute() { + if (_vm->_scriptResource->_properties.get(kDebugInventoryItems[_choiceIndex].propertyId)) { + //TODO stop holding object in cursor. + _vm->_scriptResource->_properties.set(kDebugInventoryItems[_choiceIndex].propertyId, false); + } else { + _vm->startCursorHoldingObject(kDebugInventoryItems[_choiceIndex].objectId, + kDebugInventoryItems[_choiceIndex].sequenceId); + _vm->_scriptResource->_properties.set(kDebugInventoryItems[_choiceIndex].propertyId, true); + } + _menuSystem->leaveMenu(); +} + } // End of namespace Illusions diff --git a/engines/illusions/duckman/menusystem_duckman.h b/engines/illusions/duckman/menusystem_duckman.h index 10a8a6eb0b..7bcf780c26 100644 --- a/engines/illusions/duckman/menusystem_duckman.h +++ b/engines/illusions/duckman/menusystem_duckman.h @@ -32,6 +32,8 @@ enum { kDuckmanLoadGameMenu, kDuckmanOptionsMenu, kDuckmanPauseMenu, + kDuckmanDebugMenu, + kDuckmanAddRemoveInventoryMenu, kDuckmanQueryQuitMenu, kDuckmanQueryRestartMenu, kDuckmanSaveCompleteMenu, @@ -60,6 +62,8 @@ public://protected: BaseMenu *createQueryRestartMenu(); BaseMenu *createQueryQuitMenu(); BaseMenu *createSaveCompleteMenu(); + BaseMenu *createDebugMenu(); + BaseMenu *createAddRemoveInventoryMenu(); int convertRootMenuId(uint32 menuId); virtual bool initMenuCursor(); virtual int getGameState(); @@ -67,6 +71,15 @@ public://protected: virtual void setMenuCursorNum(int cursorNum); }; +class MenuActionInventoryAddRemove : public BaseMenuAction { +public: + MenuActionInventoryAddRemove(BaseMenuSystem *menuSystem, IllusionsEngine_Duckman *vm, uint choiceIndex); + virtual void execute(); +protected: + IllusionsEngine_Duckman *_vm; + int _choiceIndex; +}; + } // End of namespace Illusions #endif // ILLUSIONS_DUCKMAN_MENUSYSTEM_DUCKMAN_H -- cgit v1.2.3