saving and loading games now works in Winnie

svn-id: r28875
This commit is contained in:
Matthew Hoops 2007-09-07 20:30:10 +00:00
parent 50c05eab6d
commit a3422785c1
2 changed files with 92 additions and 6 deletions

View file

@ -29,6 +29,7 @@
#include "graphics/cursorman.h"
#include "common/events.h"
#include "common/savefile.h"
namespace Agi {
@ -157,6 +158,14 @@ int Winnie::getObjInRoom(int iRoom) {
fCanSel[IDI_WTP_SEL_DROP] = false;\
}
void Winnie::setFlag(int iFlag) {
game.fGame[iFlag] = 1;
}
void Winnie::clearFlag(int iFlag) {
game.fGame[iFlag] = 0;
}
int Winnie::parser(int pc, int index, uint8 *buffer) {
WTP_ROOM_HDR hdr;
int startpc = pc;
@ -325,14 +334,14 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
break;
case IDO_WTP_FLAG_CLEAR:
opcode = *(buffer + pc++);
//Winnie_ClearFlag(opcode);
clearFlag(opcode);
break;
case IDO_WTP_FLAG_SET:
opcode = *(buffer + pc++);
//Winnie_SetFlag(opcode);
setFlag(opcode);
break;
case IDO_WTP_GAME_OVER:
//Winnie_GameOver();
gameOver();
break;
case IDO_WTP_WALK_MIST:
mist--;
@ -346,11 +355,11 @@ int Winnie::parser(int pc, int index, uint8 *buffer) {
//Winnie_PlaySound((ENUM_WTP_SOUND)opcode);
break;
case IDO_WTP_SAVE_GAME:
//Winnie_SaveGame();
saveGame();
room = IDI_WTP_ROOM_HOME;
return IDI_WTP_PAR_GOTO;
case IDO_WTP_LOAD_GAME:
//Winnie_LoadGame();
loadGame();
room = IDI_WTP_ROOM_HOME;
return IDI_WTP_PAR_GOTO;
case IDO_WTP_OWL_HELP:
@ -601,6 +610,28 @@ void Winnie::decMenuSel(int *iSel, int fCanSel[]) {
} while(!fCanSel[*iSel]);
}
void Winnie::getMenuMouseSel(int *iSel, int fCanSel[], int x, int y) {
switch(y) {
case IDI_WTP_ROW_OPTION_1:
if (fCanSel[IDI_WTP_SEL_OPT_1]) *iSel = IDI_WTP_SEL_OPT_1;
break;
case IDI_WTP_ROW_OPTION_2:
if (fCanSel[IDI_WTP_SEL_OPT_2]) *iSel = IDI_WTP_SEL_OPT_2;
break;
case IDI_WTP_ROW_OPTION_3:
if (fCanSel[IDI_WTP_SEL_OPT_3]) *iSel = IDI_WTP_SEL_OPT_3;
break;
case IDI_WTP_ROW_OPTION_4:
if (fCanSel[IDI_WTP_SEL_NORTH] && (x > IDI_WTP_COL_NORTH - 1) && (x < 6)) *iSel = IDI_WTP_SEL_NORTH;
if (fCanSel[IDI_WTP_SEL_SOUTH] && (x > IDI_WTP_COL_SOUTH - 1) && (x < 13)) *iSel = IDI_WTP_SEL_SOUTH;
if (fCanSel[IDI_WTP_SEL_EAST] && (x > IDI_WTP_COL_EAST - 1) && (x < 19)) *iSel = IDI_WTP_SEL_EAST;
if (fCanSel[IDI_WTP_SEL_WEST] && (x > IDI_WTP_COL_WEST - 1) && (x < 25)) *iSel = IDI_WTP_SEL_WEST;
if (fCanSel[IDI_WTP_SEL_TAKE] && (x > IDI_WTP_COL_TAKE - 1) && (x < 33)) *iSel = IDI_WTP_SEL_TAKE;
if (fCanSel[IDI_WTP_SEL_DROP] && (x > IDI_WTP_COL_DROP - 1) && (x < 39)) *iSel = IDI_WTP_SEL_DROP;
break;
}
}
#define makeSel() {\
if (fCanSel[*iSel]) {\
return;\
@ -633,7 +664,7 @@ void Winnie::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
case Common::EVENT_MOUSEMOVE:
x = event.mouse.x;
y = event.mouse.y;
//Winnie_GetMenuMouseSel(iSel, fCanSel, x, y);
getMenuMouseSel(iSel, fCanSel, x, y);
// Change cursor
if (fCanSel[IDI_WTP_SEL_NORTH] && (event.mouse.x >= 20 && event.mouse.x <= (IDI_WTP_PIC_WIDTH + 10) * 2) &&
@ -936,6 +967,53 @@ void Winnie::printRoomStr(int iRoom, int iStr) {
free(buffer);
}
void Winnie::gameOver() {
// sing the Pooh song forever
for (;;) {
_vm->printStr(IDS_WTP_SONG_0);
//Winnie_PlaySound(IDI_WTP_SND_POOH_0);
_vm->printStr(IDS_WTP_SONG_1);
//Winnie_PlaySound(IDI_WTP_SND_POOH_1);
_vm->printStr(IDS_WTP_SONG_2);
//Winnie_PlaySound(IDI_WTP_SND_POOH_2);
_vm->waitAnyKeyChoice();
}
}
void Winnie::saveGame() {
uint8 *buffer = new uint8[sizeof(WTP_SAVE_GAME)];
memcpy(buffer, &game, sizeof(WTP_SAVE_GAME));
writeSaveGame(buffer);
delete [] buffer;
}
void Winnie::loadGame() {
uint8 *buffer = new uint8[sizeof(WTP_SAVE_GAME)];
readSaveGame(buffer);
memcpy(&game, buffer, sizeof(WTP_SAVE_GAME));
delete [] buffer;
}
void Winnie::readSaveGame(uint8 *buffer) {
Common::InSaveFile* infile;
char szFile[256] = {0};
sprintf(szFile, IDS_WTP_FILE_SAVEGAME);
if (!(infile = _vm->getSaveFileMan()->openForLoading(szFile)))
return;
infile->read(buffer, sizeof(WTP_SAVE_GAME));
delete infile;
}
void Winnie::writeSaveGame(uint8 *buffer) {
Common::OutSaveFile* outfile;
char szFile[256] = {0};
sprintf(szFile, IDS_WTP_FILE_SAVEGAME);
if (!(outfile = _vm->getSaveFileMan()->openForSaving(szFile)))
return;
outfile->write(buffer, sizeof(WTP_SAVE_GAME));
delete outfile;
}
Winnie::Winnie(PreAgiEngine* vm) : _vm(vm) {
}

View file

@ -331,6 +331,14 @@ private:
void dropObj(int);
bool isRightObj(int, int, int*);
void drawObjPic(int, int, int);
void getMenuMouseSel(int*, int[], int, int);
void setFlag(int);
void clearFlag(int);
void gameOver();
void saveGame();
void loadGame();
void writeSaveGame(uint8*);
void readSaveGame(uint8*);
};
}