diff options
| -rw-r--r-- | engines/lure/hotspots.cpp | 37 | ||||
| -rw-r--r-- | engines/lure/hotspots.h | 2 | 
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); | 
