aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2013-08-10 23:41:38 +0300
committerEugene Sandulenko2013-09-06 14:51:12 +0300
commit1ca1a5dfa041179d980676c6aa8fa135f7b69a0e (patch)
tree93e2f10d60f4d526eacf613e06ace883fdc1892e
parentd866e2aabf5e69481b0feb797a075b469eaa1bb9 (diff)
downloadscummvm-rg350-1ca1a5dfa041179d980676c6aa8fa135f7b69a0e.tar.gz
scummvm-rg350-1ca1a5dfa041179d980676c6aa8fa135f7b69a0e.tar.bz2
scummvm-rg350-1ca1a5dfa041179d980676c6aa8fa135f7b69a0e.zip
FULLPIPE: Implement MessageQueue::chain()
-rw-r--r--engines/fullpipe/fullpipe.cpp5
-rw-r--r--engines/fullpipe/messages.cpp152
-rw-r--r--engines/fullpipe/messages.h22
-rw-r--r--engines/fullpipe/statics.cpp142
-rw-r--r--engines/fullpipe/statics.h1
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();