aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/lure/hotspots.cpp37
-rw-r--r--engines/lure/hotspots.h2
2 files changed, 35 insertions, 4 deletions
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index 7dc3172663..dafeab1440 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -1101,7 +1101,7 @@ void Hotspot::doAction(Action action, HotspotData *hotspot) {
&Hotspot::npcSetSupportOffset,
&Hotspot::npcSupportOffsetConditional,
&Hotspot::npcDispatchAction,
- &Hotspot::npcUnknown3,
+ &Hotspot::npcTalkNpcToNpc,
&Hotspot::npcPause,
&Hotspot::npcStartTalking,
&Hotspot::npcJumpAddress};
@@ -1903,8 +1903,38 @@ void Hotspot::npcDispatchAction(HotspotData *hotspot) {
}
}
-void Hotspot::npcUnknown3(HotspotData *hotspot) {
- warning("npcUnknown3: Not yet implemented");
+void Hotspot::npcTalkNpcToNpc(HotspotData *hotspot) {
+ Resources &res = Resources::getReference();
+ ValueTableData &fields = res.fieldList();
+ CharacterScheduleEntry &entry = _currentActions.top().supportData();
+ fields.setField(ACTIVE_HOTSPOT_ID, hotspot->hotspotId);
+ fields.setField(USE_HOTSPOT_ID, hotspot->hotspotId);
+
+ HotspotPrecheckResult result = actionPrecheck(hotspot);
+ if (result == PC_WAIT) return;
+ else if (result != PC_EXECUTE) {
+ endAction();
+ return;
+ }
+
+ // If dest is already talking, keep exiting until they're free
+ if (hotspot->talkCountdown != 0)
+ return;
+
+ // Handle the source's talk message
+ if (entry.param(1) != 0) {
+ converse(hotspot->hotspotId, entry.param(1));
+ resource()->talkCountdown = entry.param(2);
+ resource()->delayCtr = entry.param(2);
+ }
+
+ // Handle the destination's response message
+ if (entry.param(3) != 0) {
+ Hotspot *destHotspot = res.getActiveHotspot(hotspot->hotspotId);
+ assert(destHotspot);
+ destHotspot->converse(this->hotspotId(), entry.param(3));
+ }
+
endAction();
}
@@ -2075,6 +2105,7 @@ void Hotspot::loadFromStream(Common::ReadStream *stream) {
HandlerMethodPtr HotspotTickHandlers::getHandler(uint16 procOffset) {
switch (procOffset) {
+ case 0:
case 0x41BD:
return defaultHandler;
case STANDARD_CHARACTER_TICK_PROC:
diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h
index 352c254d0d..91fa317c04 100644
--- a/engines/lure/hotspots.h
+++ b/engines/lure/hotspots.h
@@ -316,7 +316,7 @@ private:
void npcSetSupportOffset(HotspotData *hotspot);
void npcSupportOffsetConditional(HotspotData *hotspot);
void npcDispatchAction(HotspotData *hotspot);
- void npcUnknown3(HotspotData *hotspot);
+ void npcTalkNpcToNpc(HotspotData *hotspot);
void npcPause(HotspotData *hotspot);
void npcStartTalking(HotspotData *hotspot);
void npcJumpAddress(HotspotData *hotspot);