wind and owl's help works in Winnie

svn-id: r28876
This commit is contained in:
Matthew Hoops
2007-09-07 20:47:31 +00:00
parent a3422785c1
commit 89bbbe53ac
2 changed files with 87 additions and 7 deletions
+81 -6
View File
@@ -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;
+6 -1
View File
@@ -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();
};
}