[Scummvm-cvs-logs] SF.net SVN: scummvm: [21782] scummvm/trunk/engines/lure

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Tue Apr 11 03:49:06 CEST 2006


Revision: 21782
Author:   dreammaster
Date:     2006-04-11 03:48:28 -0700 (Tue, 11 Apr 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21782&view=rev

Log Message:
-----------
Implemented better handling of changing rooms via room exits

Modified Paths:
--------------
    scummvm/trunk/engines/lure/game.cpp
    scummvm/trunk/engines/lure/game.h
Modified: scummvm/trunk/engines/lure/game.cpp
===================================================================
--- scummvm/trunk/engines/lure/game.cpp	2006-04-11 10:46:36 UTC (rev 21781)
+++ scummvm/trunk/engines/lure/game.cpp	2006-04-11 10:48:28 UTC (rev 21782)
@@ -158,13 +158,19 @@
 				handleClick();
 		}
 
-		uint16 destRoom = fields.getField(NEW_ROOM_NUMBER);
+		uint16 destRoom;
+		destRoom = fields.getField(NEW_ROOM_NUMBER);
 		if (destRoom != 0) {
 			// Need to change the current room
 			bool remoteFlag = fields.getField(OLD_ROOM_NUMBER) != 0;
 			r.setRoomNumber(destRoom, remoteFlag);
 			fields.setField(NEW_ROOM_NUMBER, 0);
 		}
+
+		destRoom = fields.playerNewPos().roomNumber;
+		if (destRoom != 0) {
+			playerChangeRoom();
+		}
 	}
 
 	r.leaveRoom();
@@ -238,6 +244,22 @@
 	}
 }
 
+void Game::playerChangeRoom() {
+	Resources &res = Resources::getReference();
+	Room &room = Room::getReference();
+	ValueTableData &fields = res.fieldList();
+	uint16 roomNum = fields.playerNewPos().roomNumber;
+	fields.playerNewPos().roomNumber = 0;
+	Point &newPos = fields.playerNewPos().position;
+
+	Hotspot *player = res.getActiveHotspot(PLAYER_ID);
+	player->currentActions().clear();
+	player->setRoomNumber(roomNum);
+	//player->setPosition((newPos.x & 0xfff8) || 5, newPos.y & 0xfff8);
+	player->setPosition(newPos.x, newPos.y);
+	room.setRoomNumber(roomNum, false);
+}
+
 void Game::handleClick() {
 	Resources &res = Resources::getReference();
 	Room &room = Room::getReference();
@@ -250,12 +272,12 @@
 		room.setTalkDialog(0, 0);
 	} else if (oldRoomNumber != 0) {
 		// Viewing a room remotely - handle returning to prior room
-		// TODO: check data_1138 check when room number is 35
-
-		// Reset player tick proc and signal to change back to the old room
-		res.getActiveHotspot(PLAYER_ID)->setTickProc(PLAYER_TICK_PROC_ID); 
-		fields.setField(NEW_ROOM_NUMBER, oldRoomNumber);
-		fields.setField(OLD_ROOM_NUMBER, 0);
+		if ((room.roomNumber() != 35) || (fields.getField(87) == 0)) {
+			// Reset player tick proc and signal to change back to the old room
+			res.getActiveHotspot(PLAYER_ID)->setTickProc(PLAYER_TICK_PROC_ID); 
+			fields.setField(NEW_ROOM_NUMBER, oldRoomNumber);
+			fields.setField(OLD_ROOM_NUMBER, 0);
+		}
 	} else if (res.getTalkState() != TALK_NONE) {
 		// Currently talking, so let it's tick proc handle it
 	} else if (mouse.y() < MENUBAR_Y_SIZE) {
@@ -353,11 +375,11 @@
 	Mouse &mouse = Mouse::getReference();
 	Resources &res = Resources::getReference();
 	ValueTableData &fields = res.fieldList();
+	Hotspot *player = res.getActiveHotspot(PLAYER_ID);
 
-	if (room.hotspotId() && !room.isExit()) {
+	if ((room.destRoomNumber() == 0) && (room.hotspotId() != 0)) {	
 		// Handle look at hotspot
 		HotspotData *hs = res.getHotspot(room.hotspotId());
-		Hotspot *player = res.getActiveHotspot(PLAYER_ID);
 
 		fields.setField(CHARACTER_HOTSPOT_ID, PLAYER_ID);
 		fields.setField(ACTIVE_HOTSPOT_ID, hs->hotspotId);
@@ -368,11 +390,16 @@
 		Screen::getReference().update();
 		player->doAction(LOOK_AT, hs);
 		res.setCurrentAction(NONE);
+	} else if (room.destRoomNumber() != 0) {
+		// Walk to another room
+		RoomExitCoordinateData &exitData = 
+			res.coordinateList().getEntry(room.roomNumber()).getData(room.destRoomNumber());
+
+		player->walkTo((exitData.x & 0xfff8) | 5, (exitData.y & 0xfff8), 
+			room.hotspotId() == 0 ? 0xffff : room.hotspotId());
 	} else {
-		// Walk to mouse click. TODO: still need to recognise other actions,
-		// such as to room exits or closing an on-screen floating dialog
-		Hotspot *hs =  res.getActiveHotspot(PLAYER_ID);
-		hs->walkTo(mouse.x(), mouse.y(), 0);
+		// Walking within room
+		player->walkTo(mouse.x(), mouse.y(), 0);
 	}
 }
 

Modified: scummvm/trunk/engines/lure/game.h
===================================================================
--- scummvm/trunk/engines/lure/game.h	2006-04-11 10:46:36 UTC (rev 21781)
+++ scummvm/trunk/engines/lure/game.h	2006-04-11 10:48:28 UTC (rev 21782)
@@ -43,6 +43,8 @@
 	void handleClick();
 	void handleRightClickMenu();
 	void handleLeftClick();
+
+	void playerChangeRoom();
 public:
 	Game();
 	static Game &getReference();


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