diff options
author | Paul Gilbert | 2007-02-26 02:50:23 +0000 |
---|---|---|
committer | Paul Gilbert | 2007-02-26 02:50:23 +0000 |
commit | 4f8c66b4cc30a07b8a82b70e8280a931858e8175 (patch) | |
tree | 4c9e23001ea39dfe848a55d6a26e445efcb02df8 | |
parent | 04159e06227f2ef67535e72e574663ab486d14a8 (diff) | |
download | scummvm-rg350-4f8c66b4cc30a07b8a82b70e8280a931858e8175.tar.gz scummvm-rg350-4f8c66b4cc30a07b8a82b70e8280a931858e8175.tar.bz2 scummvm-rg350-4f8c66b4cc30a07b8a82b70e8280a931858e8175.zip |
Added saving of the random actions set state, and implemented NPC opcode 29, which allows for an NPC to be given a custom talk record
svn-id: r25875
-rw-r--r-- | engines/lure/hotspots.cpp | 51 | ||||
-rw-r--r-- | engines/lure/hotspots.h | 4 | ||||
-rw-r--r-- | engines/lure/luredefs.h | 5 | ||||
-rw-r--r-- | engines/lure/res.cpp | 3 | ||||
-rw-r--r-- | engines/lure/res_struct.cpp | 24 | ||||
-rw-r--r-- | engines/lure/res_struct.h | 9 |
6 files changed, 76 insertions, 20 deletions
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp index da8b9bc5cd..2a06385a96 100644 --- a/engines/lure/hotspots.cpp +++ b/engines/lure/hotspots.cpp @@ -980,7 +980,7 @@ void Hotspot::doAction(Action action, HotspotData *hotspot) { &Hotspot::doExamine, NULL, NULL, &Hotspot::npcSetRoomAndBlockedOffset, - &Hotspot::npcUnknown1, + &Hotspot::npcHeySir, &Hotspot::npcExecScript, &Hotspot::npcResetPausedList, &Hotspot::npcSetRandomDest, @@ -1673,9 +1673,32 @@ void Hotspot::npcSetRoomAndBlockedOffset(HotspotData *hotspot) { endAction(); } -void Hotspot::npcUnknown1(HotspotData *hotspot) { - warning("Not yet implemented"); - endAction(); +void Hotspot::npcHeySir(HotspotData *hotspot) { + Resources &res = Resources::getReference(); + + // If player is performing an action, wait until it's done + Hotspot *playerHotspot = res.getActiveHotspot(PLAYER_ID); + if (!playerHotspot->currentActions().isEmpty()) { + setDelayCtr(12); + setCharacterMode(CHARMODE_PAUSED); + setActionCtr(0); + return; + } + + // TODO: Check storage of hotspot Id in data_1090/data_1091=0 + + // Get the npc to say "Hey Sir" to player + showMessage(0x22, PLAYER_ID); + + // Get the character to remain in place for a while + setDelayCtr(130); + setCharacterMode(CHARMODE_4); + + // Set the talk override to the specified Id + CharacterScheduleEntry &entry = _currentActions.top().supportData(); + _data->talkOverride = entry.param(0); + + doNothing(hotspot); } void Hotspot::npcExecScript(HotspotData *hotspot) { @@ -1822,9 +1845,19 @@ void Hotspot::npcJumpAddress(HotspotData *hotspot) { uint16 Hotspot::getTalkId(HotspotData *charHotspot) { Resources &res = Resources::getReference(); uint16 talkIndex; + TalkHeaderData *headerEntry; + + // If the hotspot has a talk data override, return it + if (charHotspot->talkOverride != 0) + { + // Has an override, so return it and reset back to zero + uint16 result = charHotspot->talkOverride; + charHotspot->talkOverride = 0; + return result; + } // Get offset of talk set to use - TalkHeaderData *headerEntry = res.getTalkHeader(charHotspot->hotspotId); + headerEntry = res.getTalkHeader(charHotspot->hotspotId); // Calculate talk index to use if (charHotspot->nameId == STRANGER_ID) @@ -2586,7 +2619,7 @@ void HotspotTickHandlers::followerAnimHandler(Hotspot &h) { ValueTableData &fields = res.fieldList(); Hotspot *player = res.getActiveHotspot(PLAYER_ID); - if ((fields.getField(37) == 0) && (h.currentActions().size() <= 1)) { + if ((fields.getField(37) == 0) && h.currentActions().isEmpty()) { if (h.roomNumber() != player->roomNumber()) { // Character in different room than player if (h.hotspotId() == GOEWIN_ID) @@ -2629,7 +2662,11 @@ void HotspotTickHandlers::followerAnimHandler(Hotspot &h) { // Handle selecting a random action for the character to do RandomActionSet *set = res.randomActions().getRoom(h.roomNumber()); - if (!set) return; + if (!set) { + standardCharacterAnimHandler(h); + return; + } + Common::RandomSource rnd; RandomActionType actionType; uint16 scheduleId; diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h index 91d2190796..94ff4aa277 100644 --- a/engines/lure/hotspots.h +++ b/engines/lure/hotspots.h @@ -260,7 +260,7 @@ private: uint8 _exitCtr; bool _walkFlag; uint16 _startRoomNumber; - + // Support methods uint16 getTalkId(HotspotData *charHotspot); void startTalk(HotspotData *charHotspot, uint16 id); @@ -294,7 +294,7 @@ private: void doBribe(HotspotData *hotspot); void doExamine(HotspotData *hotspot); void npcSetRoomAndBlockedOffset(HotspotData *hotspot); - void npcUnknown1(HotspotData *hotspot); + void npcHeySir(HotspotData *hotspot); void npcExecScript(HotspotData *hotspot); void npcResetPausedList(HotspotData *hotspot); void npcSetRandomDest(HotspotData *hotspot); diff --git a/engines/lure/luredefs.h b/engines/lure/luredefs.h index 918e679dcb..7d03e198f8 100644 --- a/engines/lure/luredefs.h +++ b/engines/lure/luredefs.h @@ -31,7 +31,7 @@ namespace Lure { #define SUPPORT_FILENAME "lure.dat" #define LURE_DAT_MAJOR 1 -#define LURE_DAT_MINOR 14 +#define LURE_DAT_MINOR 15 #define LURE_DEBUG 1 @@ -213,8 +213,7 @@ enum Action { #define ROOM_PATHS_RESOURCE_ID 0x3f13 #define EXIT_COORDINATES_RESOURCE_ID 0x3f14 #define EXIT_HOTSPOT_ID_LIST 0x3f15 - -#define STRING_LIST_RESOURCE_ID 0x3f17 +#define STRING_LIST_RESOURCE_ID 0x3f16 // Script constants #define STARTUP_SCRIPT 0x23FC diff --git a/engines/lure/res.cpp b/engines/lure/res.cpp index 0ad28bbb86..8f28da86bb 100644 --- a/engines/lure/res.cpp +++ b/engines/lure/res.cpp @@ -640,6 +640,7 @@ void Resources::saveToStream(Common::WriteStream *stream) _hotspotData.saveToStream(stream); _activeHotspots.saveToStream(stream); _fieldList.saveToStream(stream); + _randomActions.saveToStream(stream); } void Resources::loadFromStream(Common::ReadStream *stream) { @@ -649,6 +650,8 @@ void Resources::loadFromStream(Common::ReadStream *stream) { _activeHotspots.loadFromStream(stream); debugC(ERROR_DETAILED, kLureDebugScripts, "Loading fields"); _fieldList.loadFromStream(stream); + debugC(ERROR_DETAILED, kLureDebugScripts, "Loading random actions"); + _randomActions.loadFromStream(stream); debugC(ERROR_DETAILED, kLureDebugScripts, "Finished loading"); } diff --git a/engines/lure/res_struct.cpp b/engines/lure/res_struct.cpp index 6a3985e097..fe182d3fec 100644 --- a/engines/lure/res_struct.cpp +++ b/engines/lure/res_struct.cpp @@ -312,6 +312,7 @@ HotspotData::HotspotData(HotspotResource *rec) { useHotspotId = 0; v2b = 0; actionHotspotId = 0; + talkOverride = 0; } void HotspotData::saveToStream(WriteStream *stream) { @@ -351,6 +352,7 @@ void HotspotData::saveToStream(WriteStream *stream) { stream->writeUint16LE(use2HotspotId); stream->writeUint16LE(v2b); stream->writeUint16LE(actionHotspotId); + stream->writeUint16LE(talkOverride); } void HotspotData::loadFromStream(ReadStream *stream) { @@ -390,6 +392,7 @@ void HotspotData::loadFromStream(ReadStream *stream) { use2HotspotId = stream->readUint16LE(); v2b = stream->readUint16LE(); actionHotspotId = stream->readUint16LE(); + talkOverride = stream->readUint16LE(); } // Hotspot data list @@ -806,16 +809,29 @@ RandomActionSet *RandomActionList::getRoom(uint16 roomNumber) { return NULL; } -void RandomActionList::saveToStream(Common::WriteStream *stream) { - +void RandomActionSet::saveToStream(Common::WriteStream *stream) { + stream->writeByte(numActions()); + for (int actionIndex = 0; actionIndex < _numActions; ++actionIndex) + stream->writeByte((byte)_types[actionIndex]); } -void RandomActionList::loadFromStream(Common::ReadStream *stream) { - +void RandomActionSet::loadFromStream(Common::ReadStream *stream) { + int amount = stream->readByte(); + assert(amount == _numActions); + for (int actionIndex = 0; actionIndex < _numActions; ++actionIndex) + _types[actionIndex] = (RandomActionType)stream->readByte(); } +void RandomActionList::saveToStream(Common::WriteStream *stream) { + for (iterator i = begin(); i != end(); ++i) + (*i)->saveToStream(stream); +} +void RandomActionList::loadFromStream(Common::ReadStream *stream) { + for (iterator i = begin(); i != end(); ++i) + (*i)->loadFromStream(stream); +} // This class handles an indexed hotspot entry - which is used by the NPC code to // determine whether exiting a room to another given room has an exit hotspot or not diff --git a/engines/lure/res_struct.h b/engines/lure/res_struct.h index eb82a24a54..2f9f8f6860 100644 --- a/engines/lure/res_struct.h +++ b/engines/lure/res_struct.h @@ -438,6 +438,7 @@ public: uint16 use2HotspotId; uint16 v2b; uint16 actionHotspotId; + uint16 talkOverride; void enable() { flags |= 0x80; } void disable() { flags &= 0x7F; } @@ -649,18 +650,18 @@ public: uint16 roomNumber() { return _roomNumber; } int numActions() { return _numActions; } - void getEntry(int index, RandomActionType &actionType, uint16 &id) - { + void getEntry(int index, RandomActionType &actionType, uint16 &id) { assert((index >= 0) && (index < _numActions)); actionType = _types[index]; id = _ids[index]; } - void setDone(int index) - { + void setDone(int index) { assert((index >= 0) && (index < _numActions)); assert(_types[index] == REPEAT_ONCE); _types[index] = REPEAT_ONCE_DONE; } + void saveToStream(Common::WriteStream *stream); + void loadFromStream(Common::ReadStream *stream); }; class RandomActionList: public ManagedList<RandomActionSet *> { |