diff options
author | Paul Gilbert | 2007-04-15 10:49:59 +0000 |
---|---|---|
committer | Paul Gilbert | 2007-04-15 10:49:59 +0000 |
commit | 2d617677dfe97253eb1ac43fe70c7fecf057c361 (patch) | |
tree | 1da6eb1c5eb01ced135496c8967e175169d6961c /engines/lure | |
parent | 3586004c96976fd261f37f6423ad995d7b4e55b0 (diff) | |
download | scummvm-rg350-2d617677dfe97253eb1ac43fe70c7fecf057c361.tar.gz scummvm-rg350-2d617677dfe97253eb1ac43fe70c7fecf057c361.tar.bz2 scummvm-rg350-2d617677dfe97253eb1ac43fe70c7fecf057c361.zip |
Bugfix to have Ratpouch correctly follow player, and new object animation handlers added
svn-id: r26487
Diffstat (limited to 'engines/lure')
-rw-r--r-- | engines/lure/hotspots.cpp | 75 | ||||
-rw-r--r-- | engines/lure/hotspots.h | 10 | ||||
-rw-r--r-- | engines/lure/res_struct.cpp | 3 | ||||
-rw-r--r-- | engines/lure/res_struct.h | 2 |
4 files changed, 63 insertions, 27 deletions
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp index 2944091f4f..81d789a468 100644 --- a/engines/lure/hotspots.cpp +++ b/engines/lure/hotspots.cpp @@ -64,7 +64,6 @@ Hotspot::Hotspot(HotspotData *res): _pathFinder(this) { _layer = res->layer; _sequenceOffset = res->sequenceOffset; _tickCtr = res->tickTimeout; - _actions = res->actions; _colourOffset = res->colourOffset; _override = resources.getHotspotOverride(res->hotspotId); @@ -2006,7 +2005,6 @@ void Hotspot::saveToStream(Common::WriteStream *stream) { 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 @@ void Hotspot::loadFromStream(Common::ReadStream *stream) { _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 @@ void Hotspot::loadFromStream(Common::ReadStream *stream) { 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 @@ HandlerMethodPtr HotspotTickHandlers::getHandler(uint16 procOffset) { 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 @@ HandlerMethodPtr HotspotTickHandlers::getHandler(uint16 procOffset) { 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 @@ void HotspotTickHandlers::playerAnimHandler(Hotspot &h) { // 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 @@ void HotspotTickHandlers::followerAnimHandler(Hotspot &h) { 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 @@ void HotspotTickHandlers::skorlAnimHandler(Hotspot &h) { 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 @@ void HotspotTickHandlers::playerSewerExitAnimHandler(Hotspot &h) { 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 @@ void HotspotTickHandlers::fireAnimHandler(Hotspot &h) { 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 @@ void HotspotTickHandlers::skorlGaurdAnimHandler(Hotspot &h) { 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(); diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h index af0eaf9b92..99295be611 100644 --- a/engines/lure/hotspots.h +++ b/engines/lure/hotspots.h @@ -65,9 +65,11 @@ private: 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 @@ private: 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 @@ private: uint8 _layer; uint16 _sequenceOffset; uint16 _tickCtr; - uint32 _actions; uint8 _colourOffset; bool _persistant; HotspotOverrideData *_override; @@ -410,7 +413,10 @@ public: _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() { diff --git a/engines/lure/res_struct.cpp b/engines/lure/res_struct.cpp index 395b7ffc8f..f40c1cd397 100644 --- a/engines/lure/res_struct.cpp +++ b/engines/lure/res_struct.cpp @@ -1079,7 +1079,6 @@ ValueTableData::ValueTableData() { _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 @@ void ValueTableData::saveToStream(Common::WriteStream *stream) 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 @@ void ValueTableData::loadFromStream(Common::ReadStream *stream) _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) diff --git a/engines/lure/res_struct.h b/engines/lure/res_struct.h index 24ccea732e..13c8dc16d1 100644 --- a/engines/lure/res_struct.h +++ b/engines/lure/res_struct.h @@ -796,7 +796,6 @@ private: PlayerPendingPosition _playerPendingPos; uint8 _flags; uint8 _hdrFlagMask; - bool _wanderingCharsLoaded; uint16 _fieldList[NUM_VALUE_FIELDS]; bool isKnownField(uint16 fieldIndex); @@ -814,7 +813,6 @@ public: 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); |