[Scummvm-cvs-logs] SF.net SVN: scummvm: [28875] scummvm/trunk/engines/agi

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Fri Sep 7 22:30:11 CEST 2007


Revision: 28875
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28875&view=rev
Author:   mthreepwood
Date:     2007-09-07 13:30:10 -0700 (Fri, 07 Sep 2007)

Log Message:
-----------
saving and loading games now works in Winnie

Modified Paths:
--------------
    scummvm/trunk/engines/agi/preagi_winnie.cpp
    scummvm/trunk/engines/agi/preagi_winnie.h

Modified: scummvm/trunk/engines/agi/preagi_winnie.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.cpp	2007-09-07 20:09:00 UTC (rev 28874)
+++ scummvm/trunk/engines/agi/preagi_winnie.cpp	2007-09-07 20:30:10 UTC (rev 28875)
@@ -29,6 +29,7 @@
 #include "graphics/cursorman.h"
 
 #include "common/events.h"
+#include "common/savefile.h"
 
 namespace Agi {
 
@@ -157,6 +158,14 @@
 		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 @@
 				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 @@
 				//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 @@
 	} 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 @@
 			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 @@
 	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) {
 
 }

Modified: scummvm/trunk/engines/agi/preagi_winnie.h
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.h	2007-09-07 20:09:00 UTC (rev 28874)
+++ scummvm/trunk/engines/agi/preagi_winnie.h	2007-09-07 20:30:10 UTC (rev 28875)
@@ -331,6 +331,14 @@
 	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*);
 };
 
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list