diff options
-rw-r--r-- | engines/agi/preagi_winnie.cpp | 87 | ||||
-rw-r--r-- | engines/agi/preagi_winnie.h | 7 |
2 files changed, 87 insertions, 7 deletions
diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp index 1a0f9cf26e..6b51104deb 100644 --- a/engines/agi/preagi_winnie.cpp +++ b/engines/agi/preagi_winnie.cpp @@ -52,7 +52,7 @@ void Winnie::initVars() { room = IDI_WTP_ROOM_HOME; mist = -1; - wind = false; + doWind = false; winnie_event = false; } @@ -240,14 +240,14 @@ int Winnie::parser(int pc, int index, uint8 *buffer) { done = false; while (!done) { // run wind if it's time - //if (wind) - // Winnie_Wind(); + if (doWind) + wind(); // get menu selection getMenuSel(szMenu, &iSel, fCanSel); if (++game.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND) - wind = true; + doWind = true; if (winnie_event && (room <= IDI_WTP_MAX_ROOM_TELEPORT)) { if (!tigger_mist) { @@ -330,7 +330,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) { case IDO_WTP_DROP_OBJ: opcode = *(buffer + pc++); opcode = -1; - //Winnie_DropObjRnd(); + dropObjRnd(); break; case IDO_WTP_FLAG_CLEAR: opcode = *(buffer + pc++); @@ -364,7 +364,7 @@ int Winnie::parser(int pc, int index, uint8 *buffer) { return IDI_WTP_PAR_GOTO; case IDO_WTP_OWL_HELP: opcode = *(buffer + pc++); - //Winnie_ShowOwlHelp(); + showOwlHelp(); break; case IDO_WTP_GOTO_RND: room = _vm->rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1; @@ -540,6 +540,81 @@ void Winnie::dropObj(int iRoom) { } } +void Winnie::dropObjRnd() { + if (!game.iObjHave) + return; + + int iRoom; + bool done = false; + + while (!done) { + iRoom = _vm->rnd(IDI_WTP_MAX_ROOM_NORMAL); + done = true; + if (iRoom == room) + done = false; + for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) { + if (game.iObjRoom[j] == iRoom) { + done = false; + } + } + } + + game.iObjRoom[game.iObjHave] = iRoom; + game.iObjHave = 0; +} + +void Winnie::wind() { + int iRoom; + bool done; + + doWind = 0; + game.nMoves = 0; + if (!game.nObjMiss) + return; + + _vm->printStr(IDS_WTP_WIND_0); + //Winnie_PlaySound(IDI_WTP_SND_WIND_0); + _vm->waitAnyKeyChoice(); + _vm->printStr(IDS_WTP_WIND_1); + //Winnie_PlaySound(IDI_WTP_SND_WIND_0); + _vm->waitAnyKeyChoice(); + + dropObjRnd(); + + // randomize positions of objects at large + for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) { + if (!(game.iUsedObj[i] & IDI_XOR_KEY)) { + done = false; + while (!done) { + iRoom = _vm->rnd(IDI_WTP_MAX_ROOM_NORMAL); + done = true; + for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) { + if (game.iObjRoom[j] == iRoom) { + done = false; + } + } + } + game.iObjRoom[game.iUsedObj[i]] = iRoom; + } + } +} + +void Winnie::showOwlHelp() { + if (game.iObjHave) { + _vm->printStr(IDS_WTP_OWL_0); + _vm->waitAnyKeyChoice(); + printObjStr(game.iObjHave, IDI_WTP_OBJ_HELP); + _vm->waitAnyKeyChoice(); + } + if (getObjInRoom(room)) { + _vm->printStr(IDS_WTP_OWL_0); + _vm->waitAnyKeyChoice(); + printObjStr(getObjInRoom(room), IDI_WTP_OBJ_HELP); + _vm->waitAnyKeyChoice(); + } +} + + void Winnie::drawMenu(char *szMenu, int iSel, int fCanSel[]) { int iRow = 0, iCol = 0; diff --git a/engines/agi/preagi_winnie.h b/engines/agi/preagi_winnie.h index 7b17e1882e..b804ad3c3f 100644 --- a/engines/agi/preagi_winnie.h +++ b/engines/agi/preagi_winnie.h @@ -285,6 +285,8 @@ struct WTP_SAVE_GAME { uint16 o1138; // 1138 can be ignored }; +#define IDI_XOR_KEY 0x80 + class Winnie { friend class PreAgiEngine; public: @@ -299,7 +301,7 @@ private: WTP_SAVE_GAME game; int room; int mist; - bool wind; + bool doWind; bool winnie_event; int tigger_mist; @@ -339,6 +341,9 @@ private: void loadGame(); void writeSaveGame(uint8*); void readSaveGame(uint8*); + void dropObjRnd(); + void wind(); + void showOwlHelp(); }; } |