aboutsummaryrefslogtreecommitdiff
path: root/engines/lure
diff options
context:
space:
mode:
authorPaul Gilbert2007-02-26 02:50:23 +0000
committerPaul Gilbert2007-02-26 02:50:23 +0000
commit4f8c66b4cc30a07b8a82b70e8280a931858e8175 (patch)
tree4c9e23001ea39dfe848a55d6a26e445efcb02df8 /engines/lure
parent04159e06227f2ef67535e72e574663ab486d14a8 (diff)
downloadscummvm-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
Diffstat (limited to 'engines/lure')
-rw-r--r--engines/lure/hotspots.cpp51
-rw-r--r--engines/lure/hotspots.h4
-rw-r--r--engines/lure/luredefs.h5
-rw-r--r--engines/lure/res.cpp3
-rw-r--r--engines/lure/res_struct.cpp24
-rw-r--r--engines/lure/res_struct.h9
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 *> {