diff options
| -rw-r--r-- | engines/parallaction/callables_ns.cpp | 21 | ||||
| -rw-r--r-- | engines/parallaction/exec.h | 7 | ||||
| -rw-r--r-- | engines/parallaction/exec_br.cpp | 2 | ||||
| -rw-r--r-- | engines/parallaction/exec_ns.cpp | 14 | 
4 files changed, 40 insertions, 4 deletions
| diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp index d40f028941..517d33a8e2 100644 --- a/engines/parallaction/callables_ns.cpp +++ b/engines/parallaction/callables_ns.cpp @@ -298,6 +298,19 @@ void Parallaction_ns::_c_setMask(void *parm) {  }  void Parallaction_ns::_c_endComment(void *param) { +	/* +		NOTE: this routine is only run when the full game +		is over. The following command in the scripts is +		QUIT, which causes the engine to exit and return +		to system. +		Since this routine is still *blocking*, QUIT is +		not executed until the user presses a mouse +		button. If the input is reconciled with the main +		loop then the command sequence must be suspended +		to avoid executing QUIT before this actual +		routine gets a chance to be run. See bug #2619824 +		for a similar situation. +	*/  	showLocationComment(_location._endComment, true); @@ -416,6 +429,14 @@ void Parallaction_ns::_c_startIntro(void *parm) {  }  void Parallaction_ns::_c_endIntro(void *parm) { +	// NOTE: suspend command execution queue, to +	// avoid running the QUIT command before +	// credits are displayed. This solves bug +	// #2619824. +	// Execution of the command list will resume +	// as soon as runGameFrame is run. +	_cmdExec->suspend(); +  	startCreditSequence();  	_intro = false;  } diff --git a/engines/parallaction/exec.h b/engines/parallaction/exec.h index 9e8a803d52..2fd141c414 100644 --- a/engines/parallaction/exec.h +++ b/engines/parallaction/exec.h @@ -49,7 +49,6 @@ protected:  	struct ParallactionStruct1 {  		CommandPtr cmd;  		ZonePtr	z; -		bool suspend;  	} _ctxt;  	OpcodeSet	_opcodes; @@ -66,13 +65,19 @@ protected:  	void createSuspendList(CommandList::iterator first, CommandList::iterator last);  	void cleanSuspendedList(); +	bool _running; +	bool _suspend; +  public:  	virtual void init() = 0;  	virtual void run(CommandList &list, ZonePtr z = nullZonePtr);  	void runSuspended(); +	void suspend();  	CommandExec(Parallaction *vm) : _vm(vm) {  		_suspendedCtxt.valid = false; +		_suspend = false; +		_running = false;  	}  	virtual ~CommandExec() {  		for (Common::Array<const Opcode*>::iterator i = _opcodes.begin(); i != _opcodes.end(); ++i) diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index 40c9de8cda..5ed47dc010 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -155,7 +155,7 @@ DECLARE_COMMAND_OPCODE(drop) {  DECLARE_COMMAND_OPCODE(move) {  	_vm->_char.scheduleWalk(_ctxt.cmd->u._move.x, _ctxt.cmd->u._move.y); -	_ctxt.suspend = true; +	suspend();  }  DECLARE_COMMAND_OPCODE(start) { diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp index 9bfbd81705..4f7db7749e 100644 --- a/engines/parallaction/exec_ns.cpp +++ b/engines/parallaction/exec_ns.cpp @@ -356,7 +356,8 @@ void CommandExec::runList(CommandList::iterator first, CommandList::iterator las  	uint32 useFlags = 0;  	bool useLocalFlags; -	_ctxt.suspend = false; +	_suspend = false; +	_running = true;  	for ( ; first != last; first++) {  		if (_vm->shouldQuit()) @@ -385,12 +386,14 @@ void CommandExec::runList(CommandList::iterator first, CommandList::iterator las  		(*_opcodes[cmd->_id])(); -		if (_ctxt.suspend) { +		if (_suspend) {  			createSuspendList(++first, last);  			return;  		}  	} +	_running = false; +  }  void CommandExec::run(CommandList& list, ZonePtr z) { @@ -427,6 +430,13 @@ void CommandExec::cleanSuspendedList() {  	_suspendedCtxt.zone = nullZonePtr;  } +void CommandExec::suspend() { +	if (!_running) +		return; + +	_suspend = true; +} +  void CommandExec::runSuspended() {  	if (_engineFlags & kEngineWalking) {  		return; | 
