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

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Fri Sep 7 22:09:01 CEST 2007


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

Log Message:
-----------
objects now work 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 16:22:31 UTC (rev 28873)
+++ scummvm/trunk/engines/agi/preagi_winnie.cpp	2007-09-07 20:09:00 UTC (rev 28874)
@@ -52,7 +52,7 @@
 
 	mist = -1;
 	wind = false;
-	event = false;
+	winnie_event = false;
 }
 
 void Winnie::readRoom(int iRoom, uint8 *buffer, int buflen) {
@@ -240,7 +240,7 @@
 			if (++game.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND)
 				wind = true;
 
-			if (event && (room <= IDI_WTP_MAX_ROOM_TELEPORT)) {
+			if (winnie_event && (room <= IDI_WTP_MAX_ROOM_TELEPORT)) {
 				if (!tigger_mist) {
 					tigger_mist = 1;
 					//Winnie_Tigger();
@@ -248,7 +248,7 @@
 					tigger_mist = 0;
 					//Winnie_Mist();
 				}
-				event = false;
+				winnie_event = false;
 				return IDI_WTP_PAR_GOTO;
 			}
 
@@ -286,11 +286,11 @@
 				}
 				break;
 			case IDI_WTP_SEL_TAKE:
-				//Winnie_TakeObj(room);
+				takeObj(room);
 				setTakeDrop();
 				break;
 			case IDI_WTP_SEL_DROP:
-				//Winnie_DropObj(room);
+				dropObj(room);
 				setTakeDrop();
 				break;
 			}
@@ -412,6 +412,125 @@
 	free(buffer);
 }
 
+bool Winnie::isRightObj(int iRoom, int iObj, int *iCode) {
+	WTP_ROOM_HDR roomhdr;
+	WTP_OBJ_HDR	objhdr;
+	uint8 *roomdata = new uint8[4096];
+	uint8 *objdata = new uint8[2048];
+
+	readRoom(iRoom, roomdata, 4096);
+	memcpy(&roomhdr, roomdata, sizeof(WTP_ROOM_HDR));
+	readObj(iObj, objdata, 2048);
+	memcpy(&objhdr, objdata, sizeof(WTP_OBJ_HDR));
+
+	delete [] roomdata;
+	delete [] objdata;
+
+	*iCode = objhdr.objId;
+
+	if (objhdr.objId == 11) objhdr.objId = 34;
+
+	if (roomhdr.objId == objhdr.objId)
+		return true;
+	else
+		return false;
+}
+
+void Winnie::takeObj(int iRoom) {
+	if (game.iObjHave) {
+		// player is already carrying an object, can't take
+		_vm->printStr(IDS_WTP_CANT_TAKE);
+		_vm->waitAnyKeyChoice();
+	} else {
+		// take object
+		int iObj = getObjInRoom(iRoom);
+		game.iObjHave = iObj;
+		game.iObjRoom[iObj] = 0;
+
+		_vm->printStr(IDS_WTP_OK);
+		//Winnie_PlaySound(IDI_WTP_SND_TAKE);
+
+		drawRoomPic();
+
+		// print object "take" string
+		printObjStr(game.iObjHave, IDI_WTP_OBJ_TAKE);
+		_vm->waitAnyKeyChoice();
+
+		// HACK WARNING
+		if (iObj == 18) {
+			game.fGame[0x0d] = 1;
+		}
+	}
+}
+
+void Winnie::dropObj(int iRoom) {
+	int iCode;
+
+	if (getObjInRoom(iRoom)) {
+		// there already is an object in the room, can't drop
+		_vm->printStr(IDS_WTP_CANT_DROP);
+		_vm->waitAnyKeyChoice();
+	} else {
+		// HACK WARNING
+		if (game.iObjHave == 18) {
+			game.fGame[0x0d] = 0;
+		}
+
+		if (isRightObj(iRoom, game.iObjHave, &iCode)) {
+			// object has been dropped in the right place
+			_vm->printStr(IDS_WTP_OK);
+			_vm->waitAnyKeyChoice();
+			//Winnie_PlaySound(IDI_WTP_SND_DROP_OK);
+			printObjStr(game.iObjHave, IDI_WTP_OBJ_DROP);
+			_vm->waitAnyKeyChoice();
+
+			// increase amount of objects returned, decrease amount of objects missing
+			game.nObjMiss--;
+			game.nObjRet++;
+			
+			// xor the dropped object with 0x80 to signify it has been dropped in the right place
+			for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
+				if (game.iUsedObj[i] == game.iObjHave) {
+					game.iUsedObj[i] ^= 0x80;
+					break;
+				}
+			}
+
+			// set flag according to dropped object's id
+			game.fGame[iCode] = 1;
+			
+			// player is carrying nothing
+			game.iObjHave = 0;
+			
+			if (!game.nObjMiss) {
+				// all objects returned, tell player to find party
+				//Winnie_PlaySound(IDI_WTP_SND_FANFARE);
+				_vm->printStr(IDS_WTP_GAME_OVER_0);
+				_vm->waitAnyKeyChoice();
+				_vm->printStr(IDS_WTP_GAME_OVER_1);
+				_vm->waitAnyKeyChoice();
+			}
+		} else {
+			// drop object in the given room
+			game.iObjRoom[game.iObjHave] = iRoom;
+
+			// object has been dropped in the wrong place
+			_vm->printStr(IDS_WTP_WRONG_PLACE);
+			_vm->waitAnyKeyChoice();
+			//Winnie_PlaySound(IDI_WTP_SND_DROP);
+			drawRoomPic();
+			_vm->printStr(IDS_WTP_WRONG_PLACE);
+			_vm->waitAnyKeyChoice();
+
+			// print object description
+			printObjStr(game.iObjHave, IDI_WTP_OBJ_DESC);
+			_vm->waitAnyKeyChoice();
+
+			game.iObjHave = 0;
+		}
+	}
+}
+
 void Winnie::drawMenu(char *szMenu, int iSel, int fCanSel[]) {
 	int iRow = 0, iCol = 0;
 
@@ -683,8 +802,8 @@
 	drawRoomPic();
 phase1:
 	if (getObjInRoom(room)) {
-	//	Winnie_PrintObjStr(Winnie_GetObjInRoom(room), IDI_WTP_OBJ_DESC);
-	//	_vm->waitAnyKeyChoice();
+		printObjStr(getObjInRoom(room), IDI_WTP_OBJ_DESC);
+		_vm->waitAnyKeyChoice();
 	}
 phase2:
 	for (iBlock = 0; iBlock < IDI_WTP_MAX_BLOCK; iBlock++) {
@@ -725,10 +844,31 @@
 	delete [] buffer;
 }
 
+void Winnie::drawObjPic(int iObj, int x0, int y0) {
+	WTP_OBJ_HDR	objhdr;
+	uint8 *buffer = new uint8[2048];
+
+	if (!iObj)
+		return;
+
+	readObj(iObj, buffer, 2048);
+	memcpy(&objhdr, buffer, sizeof(WTP_OBJ_HDR));
+
+	_vm->preAgiLoadResource(rPICTURE, buffer + objhdr.ofsPic - IDI_WTP_OFS_OBJ);
+	_vm->_picture->setOffset(x0, y0);
+	_vm->_picture->decodePicture(0, false, false, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+	_vm->_picture->setOffset(0, 0);
+	_vm->_picture->showPic(10, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
+	_vm->_gfx->doUpdate();
+	_vm->_system->updateScreen();
+
+	delete [] buffer;
+}
+
 void Winnie::drawRoomPic() {
 	WTP_ROOM_HDR roomhdr;
 	uint8 *buffer = new uint8[4096];
-	//int iObj = Winnie_GetObjInRoom(room);
+	int iObj = getObjInRoom(room);
 
 	// clear gfx screen
 	_vm->_gfx->clearScreen(0);
@@ -747,7 +887,7 @@
 	_vm->_system->updateScreen();	// TODO: this should go in the game's main loop
 
 	// draw object picture
-	//Winnie_DrawObjPic(iObj, IDI_WTP_PIC_X0 + roomhdr.objX, IDI_WTP_PIC_Y0 + roomhdr.objY);
+	drawObjPic(iObj, IDI_WTP_PIC_X0 + roomhdr.objX, IDI_WTP_PIC_Y0 + roomhdr.objY);
 
 	delete [] buffer;
 }

Modified: scummvm/trunk/engines/agi/preagi_winnie.h
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.h	2007-09-07 16:22:31 UTC (rev 28873)
+++ scummvm/trunk/engines/agi/preagi_winnie.h	2007-09-07 20:09:00 UTC (rev 28874)
@@ -300,7 +300,7 @@
 	int room;
 	int	mist;
 	bool wind;
-	bool event;
+	bool winnie_event;
 	int	tigger_mist;
 
 	void initEngine();
@@ -327,6 +327,10 @@
 	void inventory();
 	void printObjStr(int, int);
 	void readObj(int, uint8*, int);
+	void takeObj(int);
+	void dropObj(int);
+	bool isRightObj(int, int, int*);
+	void drawObjPic(int, int, int);
 };
 
 }


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