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

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Sun Apr 15 12:50:00 CEST 2007


Revision: 26487
          http://scummvm.svn.sourceforge.net/scummvm/?rev=26487&view=rev
Author:   dreammaster
Date:     2007-04-15 03:49:59 -0700 (Sun, 15 Apr 2007)

Log Message:
-----------
Bugfix to have Ratpouch correctly follow player, and new object animation handlers added

Modified Paths:
--------------
    scummvm/trunk/engines/lure/hotspots.cpp
    scummvm/trunk/engines/lure/hotspots.h
    scummvm/trunk/engines/lure/res_struct.cpp
    scummvm/trunk/engines/lure/res_struct.h

Modified: scummvm/trunk/engines/lure/hotspots.cpp
===================================================================
--- scummvm/trunk/engines/lure/hotspots.cpp	2007-04-15 10:44:37 UTC (rev 26486)
+++ scummvm/trunk/engines/lure/hotspots.cpp	2007-04-15 10:49:59 UTC (rev 26487)
@@ -64,7 +64,6 @@
 	_layer = res->layer;
 	_sequenceOffset = res->sequenceOffset;
 	_tickCtr = res->tickTimeout;
-	_actions = res->actions;
 	_colourOffset = res->colourOffset;
 
 	_override = resources.getHotspotOverride(res->hotspotId);
@@ -2006,7 +2005,6 @@
 	stream->writeByte(_layer);
 	stream->writeUint16LE(_sequenceOffset);
 	stream->writeUint16LE(_tickCtr);
-	stream->writeUint32LE(_actions);
 	stream->writeByte(_colourOffset);
 	stream->writeUint16LE(_animId);
 	stream->writeUint16LE(_frameNumber);
@@ -2042,7 +2040,6 @@
 	_layer = stream->readByte();
 	_sequenceOffset = stream->readUint16LE();
 	_tickCtr = stream->readUint16LE();
-	_actions = stream->readUint32LE();
 	_colourOffset = stream->readByte();
 	setAnimation(stream->readUint16LE());
 	setFrameNumber(stream->readUint16LE());
@@ -2062,6 +2059,8 @@
 
 HandlerMethodPtr HotspotTickHandlers::getHandler(uint16 procOffset) {
 	switch (procOffset) {
+	case 0x41BD:
+		return defaultHandler;
 	case STANDARD_CHARACTER_TICK_PROC:
 		return standardCharacterAnimHandler;
 	case VOICE_TICK_PROC_ID:
@@ -2080,12 +2079,16 @@
 		return standardAnimHandler2;
 	case 0x7F3A:
 		return standardAnimHandler;
+	case 0x7F54:
+		return sonicRatAnimHandler;
 	case 0x7F69:
 		return droppingTorchAnimHandler;
 	case 0x7FA1:
 		return playerSewerExitAnimHandler;
 	case 0x8009:
 		return fireAnimHandler;
+	case 0x813F:
+		return teaAnimHandler;
 	case 0x8180:
 		return goewinCaptiveAnimHandler;
 	case 0x81B3:
@@ -2100,12 +2103,18 @@
 		return barmanAnimHandler;
 	case 0x85ce:
 		return skorlGaurdAnimHandler;
+	case 0x862D:
+		return gargoyleAnimHandler;
+	case 0x86FA:
+	case 0x86FF:
+		return skullAnimHandler;
 	case 0x882A:
 		return rackSerfAnimHandler;
 	case TALK_TICK_PROC_ID:
 		return talkAnimHandler;
 	default:
-		return defaultHandler;
+		error("Unknown tick proc %xh for hotspot", procOffset);
+//		return defaultHandler;
 	}
 }
 
@@ -2681,11 +2690,10 @@
 		// The character is currently moving
 		h.setOccupied(false);
 
-		if ((h.destHotspotId() != 0) && (h.destHotspotId() != 0xffff)) {
-			// Player is walking to a room exit hotspot
+		if (h.destHotspotId() != 0) {
 			RoomExitJoinData *joinRec = res.getExitJoin(h.destHotspotId());
-			if (joinRec->blocked) {
-				// Exit now blocked, so stop walking
+			if ((joinRec != NULL) && (joinRec->blocked)) {
+				// Player is walking to a blocked room exit, so stop walking
 				actions.pop();
 				h.setOccupied(true);
 				break;
@@ -2757,18 +2765,6 @@
 		return;
 	}
 
-	if (fields.wanderingCharsLoaded()) {
-		// Start Ratpouch to sewer exit to meet player
-		fields.wanderingCharsLoaded() = false;
-		h.setBlockedFlag(false);
-		CharacterScheduleEntry *newEntry = res.charSchedules().getEntry(RETURN_SUPPORT_ID);
-		h.currentActions().addFront(DISPATCH_ACTION, newEntry, 7);
-		h.setActionCtr(0);
-
-		standardCharacterAnimHandler(h);
-		return;
-	}
-
 	// Handle any pause countdown
 	if (countdownCtr > 0) {
 		--countdownCtr;
@@ -2841,6 +2837,16 @@
 	standardCharacterAnimHandler(h);
 }
 
+void HotspotTickHandlers::sonicRatAnimHandler(Hotspot &h) {
+	if (h.actionCtr() == 0) {
+		HotspotData *player = Resources::getReference().getHotspot(PLAYER_ID);
+		if (Support::charactersIntersecting(h.resource(), player))
+			h.setActionCtr(1);
+	} else {
+		standardAnimHandler(h);
+	}
+}
+
 void HotspotTickHandlers::droppingTorchAnimHandler(Hotspot &h) {
 	if (h.frameCtr() > 0) 
 		h.setFrameCtr(h.frameCtr() - 1);
@@ -2886,6 +2892,10 @@
 		ratpouchHotspot->setCharacterMode(CHARMODE_NONE);
 		ratpouchHotspot->setDelayCtr(0);
 		ratpouchHotspot->setActions(0x821C00);
+
+		// Ratpouch has previously been moved to room 8. Start him moving to room 7
+		ratpouchHotspot->currentActions().clear();
+		ratpouchHotspot->currentActions().addFront(DISPATCH_ACTION, 7);
 	}
 }
 
@@ -2894,6 +2904,19 @@
 	h.setOccupied(true);
 }
 
+void HotspotTickHandlers::teaAnimHandler(Hotspot &h) {
+	if (h.frameCtr() > 0) {
+		h.decrFrameCtr();
+		return;
+	}
+
+	if (h.executeScript()) {
+		// Signal that the tea is done
+		h.setScript(0xB82);
+		Resources::getReference().fieldList().setField(27, 1);
+	}
+}
+
 void HotspotTickHandlers::goewinCaptiveAnimHandler(Hotspot &h) {
 	if (h.actionCtr() > 0) {
 		if (h.executeScript()) {
@@ -3400,6 +3423,18 @@
 	h.setFrameNumber(h.actionCtr());
 }
 
+void HotspotTickHandlers::gargoyleAnimHandler(Hotspot &h) {
+	h.handleTalkDialog();
+}
+
+void HotspotTickHandlers::skullAnimHandler(Hotspot &h) {
+	Resources &res = Resources::getReference();
+	RoomExitJoinData *joinRec = res.getExitJoin(
+		(h.hotspotId() == 0x42f) ? 0x272A : 0x272C);
+
+	h.setFrameNumber(joinRec->blocked ? 0 : 1);
+}
+
 void HotspotTickHandlers::rackSerfAnimHandler(Hotspot &h) {
 	Resources &res = Resources::getReference();
 

Modified: scummvm/trunk/engines/lure/hotspots.h
===================================================================
--- scummvm/trunk/engines/lure/hotspots.h	2007-04-15 10:44:37 UTC (rev 26486)
+++ scummvm/trunk/engines/lure/hotspots.h	2007-04-15 10:49:59 UTC (rev 26487)
@@ -65,9 +65,11 @@
 	static void playerAnimHandler(Hotspot &h);
 	static void followerAnimHandler(Hotspot &h);
 	static void skorlAnimHandler(Hotspot &h);
+	static void sonicRatAnimHandler(Hotspot &h);
 	static void droppingTorchAnimHandler(Hotspot &h);
 	static void playerSewerExitAnimHandler(Hotspot &h);
 	static void fireAnimHandler(Hotspot &h);
+	static void teaAnimHandler(Hotspot &h);
 	static void goewinCaptiveAnimHandler(Hotspot &h);
 	static void prisonerAnimHandler(Hotspot &h);
 	static void catrionaAnimHandler(Hotspot &h);
@@ -76,6 +78,8 @@
 	static void headAnimHandler(Hotspot &h);
 	static void barmanAnimHandler(Hotspot &h);
 	static void skorlGaurdAnimHandler(Hotspot &h);
+	static void gargoyleAnimHandler(Hotspot &h);
+	static void skullAnimHandler(Hotspot &h);
 	static void rackSerfAnimHandler(Hotspot &h);
 
 public:
@@ -246,7 +250,6 @@
 	uint8 _layer;
 	uint16 _sequenceOffset;
 	uint16 _tickCtr;
-	uint32 _actions;
 	uint8 _colourOffset;
 	bool _persistant;
 	HotspotOverrideData *_override;
@@ -410,7 +413,10 @@
 		_layer = newLayer;
 		_data->layer = newLayer;
 	}
-	void setActions(uint32 newActions) { _actions = newActions; }
+	void setActions(uint32 newActions) { 
+		assert(_data);
+		_data->actions = newActions;
+	}
 	void setCharRectY(uint16 value) { _charRectY = value; }
 	void setSkipFlag(bool value) { _skipFlag = value; }
 	CharacterMode characterMode() {

Modified: scummvm/trunk/engines/lure/res_struct.cpp
===================================================================
--- scummvm/trunk/engines/lure/res_struct.cpp	2007-04-15 10:44:37 UTC (rev 26486)
+++ scummvm/trunk/engines/lure/res_struct.cpp	2007-04-15 10:49:59 UTC (rev 26487)
@@ -1079,7 +1079,6 @@
 	_playerPendingPos.isSet = false;
 	_flags = GAMEFLAG_4 | GAMEFLAG_1;
 	_hdrFlagMask = 1;
-	_wanderingCharsLoaded = false;
 
 	for (uint16 index = 0; index < NUM_VALUE_FIELDS; ++index)
 		_fieldList[index] = 0;
@@ -1126,7 +1125,6 @@
 	stream->writeSint16LE(_playerPendingPos.pos.y);
 	stream->writeByte(_flags);
 	stream->writeByte(_hdrFlagMask);
-	stream->writeByte(_wanderingCharsLoaded);
 	
 	// Write out the special fields
 	for (int index = 0; index < NUM_VALUE_FIELDS; ++index)
@@ -1145,7 +1143,6 @@
 	_playerPendingPos.pos.y = stream->readSint16LE();
 	_flags = stream->readByte();
 	_hdrFlagMask = stream->readByte();
-	_wanderingCharsLoaded = stream->readByte() != 0;
 	
 	// Read in the field list
 	for (int index = 0; index < NUM_VALUE_FIELDS; ++index)

Modified: scummvm/trunk/engines/lure/res_struct.h
===================================================================
--- scummvm/trunk/engines/lure/res_struct.h	2007-04-15 10:44:37 UTC (rev 26486)
+++ scummvm/trunk/engines/lure/res_struct.h	2007-04-15 10:49:59 UTC (rev 26487)
@@ -796,7 +796,6 @@
 	PlayerPendingPosition _playerPendingPos;
 	uint8 _flags;
 	uint8 _hdrFlagMask;
-	bool _wanderingCharsLoaded;
 
 	uint16 _fieldList[NUM_VALUE_FIELDS];
 	bool isKnownField(uint16 fieldIndex);
@@ -814,7 +813,6 @@
 	uint8 &hdrFlagMask() { return _hdrFlagMask; }
 	PlayerNewPosition &playerNewPos() { return _playerNewPos; }
 	PlayerPendingPosition &playerPendingPos() { return _playerPendingPos; }
-	bool &wanderingCharsLoaded() { return _wanderingCharsLoaded; }
 
 	void saveToStream(Common::WriteStream *stream);
 	void loadFromStream(Common::ReadStream *stream);


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