diff options
| author | Eugene Sandulenko | 2013-08-10 23:41:38 +0300 | 
|---|---|---|
| committer | Eugene Sandulenko | 2013-09-06 14:51:12 +0300 | 
| commit | 1ca1a5dfa041179d980676c6aa8fa135f7b69a0e (patch) | |
| tree | 93e2f10d60f4d526eacf613e06ace883fdc1892e /engines/fullpipe | |
| parent | d866e2aabf5e69481b0feb797a075b469eaa1bb9 (diff) | |
| download | scummvm-rg350-1ca1a5dfa041179d980676c6aa8fa135f7b69a0e.tar.gz scummvm-rg350-1ca1a5dfa041179d980676c6aa8fa135f7b69a0e.tar.bz2 scummvm-rg350-1ca1a5dfa041179d980676c6aa8fa135f7b69a0e.zip  | |
FULLPIPE: Implement MessageQueue::chain()
Diffstat (limited to 'engines/fullpipe')
| -rw-r--r-- | engines/fullpipe/fullpipe.cpp | 5 | ||||
| -rw-r--r-- | engines/fullpipe/messages.cpp | 152 | ||||
| -rw-r--r-- | engines/fullpipe/messages.h | 22 | ||||
| -rw-r--r-- | engines/fullpipe/statics.cpp | 142 | ||||
| -rw-r--r-- | engines/fullpipe/statics.h | 1 | 
5 files changed, 248 insertions, 74 deletions
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp index e68d940335..e73a81aef0 100644 --- a/engines/fullpipe/fullpipe.cpp +++ b/engines/fullpipe/fullpipe.cpp @@ -253,6 +253,9 @@ void FullpipeEngine::updateEvents() {  				ex->_excFlags |= 3;  				ex->handle();  			} + +			_mouseX = event.mouse.x; +			_mouseY = event.mouse.y;  			break;  		case Common::EVENT_QUIT:  			_gameContinue = false; @@ -329,7 +332,7 @@ void FullpipeEngine::updateScreen() {  			}  		}  	} else if (_currentScene) { -		_currentScene->update(42);  // HACK. FIXME +		//_currentScene->update(42);  // HACK. FIXME  		_currentScene->draw();  		if (_inventoryScene) diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp index 3a3ee4bc68..43584f4aa7 100644 --- a/engines/fullpipe/messages.cpp +++ b/engines/fullpipe/messages.cpp @@ -25,6 +25,7 @@  #include "fullpipe/objects.h"  #include "fullpipe/messages.h"  #include "fullpipe/modal.h" +#include "fullpipe/statics.h"  namespace Fullpipe { @@ -193,8 +194,8 @@ MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {  	_counter = 0;  	_field_38 = (field_38 == 0); -	for (uint i = 0; i < src->_exCommands.size(); i++) { -		ExCommand *ex = new ExCommand((ExCommand *)src->_exCommands[i]); +	for (Common::List<ExCommand *>::iterator it = src->_exCommands.begin(); it != src->_exCommands.end(); ++it) { +		ExCommand *ex = new ExCommand(*it);  		ex->_excFlags |= 2;  		_exCommands.push_back(ex); @@ -215,6 +216,28 @@ MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {  	_isFinished = 0;  } +MessageQueue::~MessageQueue() { +	for (Common::List<ExCommand *>::iterator it = _exCommands.begin(); it != _exCommands.end(); ++it) { +		ExCommand *ex = (ExCommand *)*it; + +		if (ex && ex->_excFlags & 2) +			delete ex; +	} + +	_exCommands.clear(); + +	if (_field_14) +		delete _field_14; + +	if (_flags & 2) { +		g_fullpipe->_globalMessageQueueList->removeQueueById(_id); +	} + +	finish(); + +	free(_queueName); +} +  bool MessageQueue::load(MfcArchive &file) {  	debug(5, "MessageQueue::load()"); @@ -227,7 +250,7 @@ bool MessageQueue::load(MfcArchive &file) {  	_queueName = file.readPascalString();  	for (int i = 0; i < count; i++) { -		CObject *tmp = file.readClass(); +		ExCommand *tmp = (ExCommand *)file.readClass();  		_exCommands.push_back(tmp);  	} @@ -241,9 +264,23 @@ bool MessageQueue::load(MfcArchive &file) {  }  bool MessageQueue::chain(StaticANIObject *ani) { -	warning("STUB: MessageQueue::chain()"); +	if (ani) +		ani->isIdle(); -	return true; +	if (checkGlobalExCommandList1() && checkGlobalExCommandList2()) { +		if (!(getFlags() & 2)) { +			g_fullpipe->_globalMessageQueueList->addMessageQueue(this); +			_flags |= 2; +		} +		if (ani) { +			ani->queueMessageQueue(this); +			return true; +		} else { +			sendNextCommand(); +			return true; +		} +	} +	return false;  }  void MessageQueue::update() { @@ -262,15 +299,29 @@ void MessageQueue::messageQueueCallback1(int par) {  	warning("STUB: MessageQueue::messageQueueCallback1()");  } +ExCommand *MessageQueue::getExCommandByIndex(uint idx) { +	if (idx > _exCommands.size()) +		return 0; + +	Common::List<ExCommand *>::iterator it = _exCommands.begin(); + +	while (idx) { +		++it; +		idx--; +	} + +	return *it; +} +  void MessageQueue::sendNextCommand() {  	if (_exCommands.size()) {  		if (!(_flags & 4) && (_flags & 1)) {  			messageQueueCallback1(16);  		} -		ExCommand *ex = (ExCommand *)_exCommands.front(); -		_exCommands.remove_at(0); +		ExCommand *ex = _exCommands.front(); + +		_exCommands.pop_front(); -		ex->handleMessage();  		_counter++;  		ex->_parId = _id;  		ex->_excFlags |= (ex->_field_24 == 0 ? 1 : 0) | (ex->_field_3C != 0 ? 2 : 0); @@ -283,6 +334,76 @@ void MessageQueue::sendNextCommand() {  	}  } +bool MessageQueue::checkGlobalExCommandList1() { +	ExCommand *ex, *ex1; + +	for (uint i = 0; i < getCount(); i++) { +		ex = getExCommandByIndex(i); + +		if (ex->_messageKind != 1 && ex->_messageKind != 20 && ex->_messageKind != 5 && ex->_messageKind != 27) +			continue; + +		for (Common::List<ExCommand *>::iterator it = g_fullpipe->_exCommandList.begin(); it != g_fullpipe->_exCommandList.end(); it++) { +			ex1 = *it; + +			if (ex1->_messageKind != 1 && ex1->_messageKind != 20 && ex1->_messageKind != 5 && ex1->_messageKind != 27) +				continue; + +			if (ex1->_keyCode != ex->_keyCode && ex1->_keyCode != -1 && ex->_keyCode != -1) +				continue; + +			MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex1->_parId); + +			if (mq) { +				if (mq->getFlags() & 1) +					return false; +			} +		} +	} +	return true; +} + +bool MessageQueue::checkGlobalExCommandList2() { +	ExCommand *ex, *ex1; + +	for (uint i = 0; i < getCount(); i++) { +		ex = getExCommandByIndex(i); + +		if (ex->_messageKind != 1 && ex->_messageKind != 20 && ex->_messageKind != 5 && ex->_messageKind != 27) +			continue; + +		for (Common::List<ExCommand *>::iterator it = g_fullpipe->_exCommandList.begin(); it != g_fullpipe->_exCommandList.end();) { +			ex1 = *it; + +			if (ex1->_messageKind != 1 && ex1->_messageKind != 20 && ex1->_messageKind != 5 && ex1->_messageKind != 27) { +				it++; +				continue; +			} + +			if (ex1->_keyCode != ex->_keyCode && ex1->_keyCode != -1 && ex->_keyCode != -1) { +				it++; +				continue; +			} + +			MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex1->_parId); + +			if (mq) { +				if (mq->getFlags() & 1) +					return false; + +				delete mq; +			} + +			it = g_fullpipe->_exCommandList.erase(it); + +			if (ex1->_excFlags & 2) { +				delete ex1; +			} +		} +	} +	return true; +} +  void MessageQueue::finish() {  	warning("STUB: MessageQueue::finish()");  } @@ -299,7 +420,18 @@ MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {  void GlobalMessageQueueList::deleteQueueById(int id) {  	for (uint i = 0; i < size(); i++)  		if (((MessageQueue *)((*this).operator[](i)))->_id == id) { -			delete (MessageQueue *)remove_at(i); +			remove_at(i); + +			disableQueueById(id); +			return; +		} +} + +void GlobalMessageQueueList::removeQueueById(int id) { +	for (uint i = 0; i < size(); i++) +		if (((MessageQueue *)((*this).operator[](i)))->_id == id) { +			((MessageQueue *)((*this).operator[](i)))->_flags &= 0xFD; // It is quite pointless +			remove_at(i);  			disableQueueById(id);  			return; @@ -503,8 +635,8 @@ void processMessages() {  		while (g_fullpipe->_exCommandList.size()) {  			ExCommand *ex = g_fullpipe->_exCommandList.front(); -			ex->handleMessage();  			g_fullpipe->_exCommandList.pop_front(); +			ex->handleMessage();  		}  		g_fullpipe->_isProcessingMessages = false;  	} diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h index e2e27b5025..746765f462 100644 --- a/engines/fullpipe/messages.h +++ b/engines/fullpipe/messages.h @@ -50,6 +50,8 @@ class Message : public CObject {   public:  	Message();  	Message(Message *src); +	virtual ~Message() {} +  	Message(int16 parentId, int messageKind, int x, int y, int a6, int a7, int sceneClickX, int sceneClickY, int a10);  }; @@ -84,18 +86,14 @@ class CObjstateCommand : public CObject {  };  class MessageQueue : public CObject { -	friend class GlobalMessageQueueList; -	friend class CGameLoader; -	friend class Scene; - -  protected: +  public:  	int _id;  	int _flags;  	char *_queueName;  	int16 _dataId;  	int16 _field_12; -	int _field_14; -	CPtrList _exCommands; +	CObject *_field_14; +	Common::List<ExCommand *> _exCommands;  	int _counter;  	int _field_38;  	int _isFinished; @@ -105,23 +103,33 @@ class MessageQueue : public CObject {   public:  	MessageQueue();  	MessageQueue(MessageQueue *src, int parId, int field_38); +	virtual ~MessageQueue(); +  	virtual bool load(MfcArchive &file);  	int getFlags() { return _flags; }  	void setFlags(int flags) { _flags = flags; } +	uint getCount() { return _exCommands.size(); } + +	ExCommand *getExCommandByIndex(uint idx); +  	bool chain(StaticANIObject *ani);  	void update();  	void sendNextCommand();  	void finish();  	void messageQueueCallback1(int par); + +	bool checkGlobalExCommandList1(); +	bool checkGlobalExCommandList2();  };  class GlobalMessageQueueList : public CPtrList {    public:  	MessageQueue *getMessageQueueById(int id);  	void deleteQueueById(int id); +	void removeQueueById(int id);  	void disableQueueById(int id);  	void addMessageQueue(MessageQueue *msg); diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index edbb5f7990..4854bb1d0d 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -214,6 +214,26 @@ void StaticANIObject::deleteFromGlobalMessageQueue() {  	}  } +void StaticANIObject::queueMessageQueue(MessageQueue *mq) { +	if (isIdle() && !(_flags & 0x80)) { +		deleteFromGlobalMessageQueue(); +		_messageQueueId = 0; +		_messageNum = 0; +		if (_flags & 2) { +			_flags ^= 2; +		} +		if (mq) { +			_animExFlag = 0; +			if (_movement) +				_messageQueueId = mq->_id; +			else +				mq->sendNextCommand(); +		} else { +			_messageQueueId = 0; +		} +	} +} +  bool StaticANIObject::isIdle() {  	if (_messageQueueId) {  		MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId); @@ -427,7 +447,7 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {  void StaticANIObject::update(int counterdiff) {  	int mqid; -	debug(0, "StaticANIObject::update()"); +	debug(0, "StaticANIObject::update() (%x)", _flags);  	if (_flags & 2) {  		_messageNum--; @@ -443,76 +463,86 @@ void StaticANIObject::update(int counterdiff) {  	}  	Common::Point point; -	ExCommand *ex, *newex, *newex1, *newex2; +	ExCommand *ex, *newex;  	if (_movement) {  		_movement->_counter += counterdiff; -		if (_movement->_counter >= _movement->_counterMax) { -			_movement->_counter = 0; -			if (_flags & 1) { -				if (_counter) { -					_counter--; -				} else { -					DynamicPhase *dyn = _movement->_currDynamicPhase; -					if (dyn->_initialCountdown != dyn->_countdown) -						goto LABEL_40; -					ex = dyn->getExCommand(); -					if (!ex || ex->_messageKind == 35) -						goto LABEL_40; +		if (_movement->_counter < _movement->_counterMax) +			return; + +		_movement->_counter = 0; + +		if (_flags & 1) { +			if (_counter) { +				_counter--; + +				return; +			} + +			DynamicPhase *dyn = _movement->_currDynamicPhase; +			if (dyn->_initialCountdown == dyn->_countdown) { + +				ex = dyn->getExCommand(); +				if (ex && ex->_messageKind == 35) {  					newex = new ExCommand(ex);  					newex->_excFlags |= 2;  					if (newex->_messageKind == 17) {  						newex->_parentId = _id;  						newex->_keyCode = _field_4;  					} -					ex->sendMessage(); -					if (_movement) { -					LABEL_40: -						if (dyn->_initialCountdown != dyn->_countdown -							 || dyn->_field_68 == 0 -							 || (newex1 = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0)), -								 newex1->_excFlags = 2, -								 newex1->_keyCode = _field_4, -								 newex1->sendMessage(), -								 (_movement != 0)) { -							if (_movement->gotoNextFrame(_callback1, _callback2)) { -								setOXY(_movement->_ox, _movement->_oy); -								_counter = _initialCounter; -								if (dyn->_initialCountdown == dyn->_countdown) { -									ex = dyn->getExCommand(); -									if (ex) { -										if (ex->_messageKind == 35) { -											newex2 = new ExCommand(ex); -											ex->_excFlags |= 2; -											ex->sendMessage(); -										} -									} -								} -							} else { -								stopAnim_maybe(); -							} -							if (_movement) { -								_stepArray.getCurrPoint(&point); -								setOXY(point.x + _ox, point.y + _oy); -								_stepArray.gotoNextPoint(); -								if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex) -									adjustSomeXY(); +					newex->sendMessage(); + +					if (!_movement) +						return; +				} + +				if (dyn->_initialCountdown == dyn->_countdown && dyn->_field_68 == 0) { +					newex = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0); +					newex->_excFlags = 2; +					newex->_keyCode = _field_4; +					newex->sendMessage(); + +					if (!_movement) +						return; +				} + +				if (!_movement->gotoNextFrame(_callback1, _callback2)) { +						stopAnim_maybe(); +				} else { +					setOXY(_movement->_ox, _movement->_oy); +					_counter = _initialCounter; + +					if (dyn->_initialCountdown == dyn->_countdown) { +						ex = dyn->getExCommand(); +						if (ex) { +							if (ex->_messageKind == 35) { +								newex = new ExCommand(ex); +								newex->_excFlags |= 2; +								newex->sendMessage();  							}  						}  					} +					if (!_movement) +						return; + +					_stepArray.getCurrPoint(&point); +					setOXY(point.x + _ox, point.y + _oy); +					_stepArray.gotoNextPoint(); +					if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex) +						adjustSomeXY();  				} -			} else if (_flags & 0x20) { -				_flags ^= 0x20; -				_flags |= 1; -				_movement->gotoFirstFrame(); -				_movement->getCurrDynamicPhaseXY(point); - -				Common::Point pointS; -				_statics->getSomeXY(pointS); -				setOXY(_ox + point.x + _movement->_mx - pointS.x, -					   _oy + point.y + _movement->_my - pointS.y);  			} +		} else if (_flags & 0x20) { +			_flags ^= 0x20; +			_flags |= 1; +			_movement->gotoFirstFrame(); +			_movement->getCurrDynamicPhaseXY(point); + +			Common::Point pointS; +			_statics->getSomeXY(pointS); +			setOXY(_ox + point.x + _movement->_mx - pointS.x, +				   _oy + point.y + _movement->_my - pointS.y);  		}  	} else {  		if (_statics) { diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h index ecee6e3a5a..e81a83d364 100644 --- a/engines/fullpipe/statics.h +++ b/engines/fullpipe/statics.h @@ -200,6 +200,7 @@ class StaticANIObject : public GameObject {  	bool isIdle();  	void deleteFromGlobalMessageQueue(); +	void queueMessageQueue(MessageQueue *msg);  	void initMovements();  	void loadMovementsPixelData();  | 
