aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2013-07-22 22:46:08 +0300
committerEugene Sandulenko2013-09-06 14:51:04 +0300
commit9d83eb1aeacf7bed6105875289a5960a06571035 (patch)
tree86758df13de3bdf052efb3b147821ac7450eba8f
parent7aa2377bf7986b77e145adb1350f99013ab35380 (diff)
downloadscummvm-rg350-9d83eb1aeacf7bed6105875289a5960a06571035.tar.gz
scummvm-rg350-9d83eb1aeacf7bed6105875289a5960a06571035.tar.bz2
scummvm-rg350-9d83eb1aeacf7bed6105875289a5960a06571035.zip
FULLPIPE: More work on sceneSwitcher. MessageHandler
-rw-r--r--engines/fullpipe/fullpipe.cpp3
-rw-r--r--engines/fullpipe/fullpipe.h4
-rw-r--r--engines/fullpipe/gfx.h1
-rw-r--r--engines/fullpipe/messagequeue.cpp32
-rw-r--r--engines/fullpipe/messagequeue.h11
-rw-r--r--engines/fullpipe/scene.cpp15
-rw-r--r--engines/fullpipe/scene.h2
-rw-r--r--engines/fullpipe/scenes.cpp5
8 files changed, 71 insertions, 2 deletions
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 2123d0887b..bbd43b63c2 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -69,6 +69,9 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
_scene2 = 0;
_globalMessageQueueList = 0;
+ _messageHandlers = 0;
+
+ _updateScreenCallback = 0;
g_fullpipe = this;
}
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 468d6ca1ec..4253499bdd 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -50,6 +50,7 @@ class CInventory2;
class EntranceInfo;
class GameProject;
class GlobalMessageQueueList;
+class MessageHandler;
class NGIArchive;
class Scene;
class SoundList;
@@ -110,6 +111,7 @@ public:
bool _flgSoundList;
GlobalMessageQueueList *_globalMessageQueueList;
+ MessageHandler *_messageHandlers;
bool _needQuit;
@@ -124,6 +126,8 @@ public:
Scene *_inventoryScene;
CInventory2 *_inventory;
+ int (*_updateScreenCallback)(void *);
+
void setObjectState(const char *name, int state);
int getObjectEnumState(const char *name, const char *state);
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 7eea54241c..44919fdc69 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -110,6 +110,7 @@ class GameObject : public CObject {
virtual bool load(MfcArchive &file);
void setOXY(int x, int y);
void renumPictures(CPtrList *lst);
+ void setFlags(int16 flags) { _flags = flags; }
};
class PictureObject : public GameObject {
diff --git a/engines/fullpipe/messagequeue.cpp b/engines/fullpipe/messagequeue.cpp
index 3c9e0889fc..7688a6a129 100644
--- a/engines/fullpipe/messagequeue.cpp
+++ b/engines/fullpipe/messagequeue.cpp
@@ -87,4 +87,36 @@ void GlobalMessageQueueList::disableQueueById(int id) {
}
}
+bool removeMessageHandler(int16 id, int pos) {
+ if (g_fullpipe->_messageHandlers) {
+ MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ MessageHandler *prevItem = 0;
+ int curPos = 0;
+
+ while (id != curItem->id) {
+ prevItem = curItem;
+ curItem = curItem->nextItem;
+ curPos++;
+
+ if (!curItem)
+ return false;
+ }
+
+ if (pos == -1 || curPos == pos) {
+ prevItem->nextItem = curItem->nextItem;
+ delete curItem;
+ updateMessageHandlerIndex(prevItem->nextItem, -1);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void updateMessageHandlerIndex(MessageHandler *msg, int offset) {
+ for (; msg; msg = msg->nextItem)
+ msg->index += offset;
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messagequeue.h b/engines/fullpipe/messagequeue.h
index 1f4cf02bfc..bb8d4108e3 100644
--- a/engines/fullpipe/messagequeue.h
+++ b/engines/fullpipe/messagequeue.h
@@ -62,6 +62,17 @@ class GlobalMessageQueueList : public CPtrList {
void disableQueueById(int id);
};
+struct MessageHandler {
+ int (*callback)(ExCommand *cmd);
+ int16 id;
+ int16 field_6;
+ int index;
+ MessageHandler *nextItem;
+};
+
+bool removeMessageHandler(int16 id, int pos);
+void updateMessageHandlerIndex(MessageHandler *msg, int offset);
+
} // End of namespace Fullpipe
#endif /* FULLPIPE_MESSAGEQUEUE_H */
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index ab4f817373..3bc7c9d412 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -283,6 +283,21 @@ void Scene::addStaticANIObject(StaticANIObject *obj, bool addList2) {
}
}
+void Scene::setPictureObjectsFlag4() {
+ for (uint i = 0; i < _picObjList.size(); i++) {
+ ((PictureObject *)_picObjList[i])->_flags |= 4;
+ }
+}
+
+PictureObject *Scene::getPictureObjectById(int objId, int flags) {
+ for (uint i = 1; i < _picObjList.size(); i++) {
+ if(((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_field_4 == flags)
+ return (PictureObject *)_picObjList[i];
+ }
+
+ return 0;
+}
+
void Scene::draw(int par) {
updateScrolling(par);
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index ac47d7e0ef..4085b058a7 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -54,6 +54,8 @@ class Scene : public Background {
StaticANIObject *getStaticANIObject1ById(int obj, int a3);
void deleteStaticANIObject(StaticANIObject *obj);
void addStaticANIObject(StaticANIObject *obj, bool addList2);
+ void setPictureObjectsFlag4();
+ PictureObject *getPictureObjectById(int objId, int flags);
};
class SceneTag : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 03017f65cd..46ef73ad5e 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -31,6 +31,7 @@
#include "fullpipe/sound.h"
#include "fullpipe/motion.h"
#include "fullpipe/input.h"
+#include "fullpipe/messagequeue.h"
#include "fullpipe/gameobj.h"
@@ -111,12 +112,11 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
_aniMan2 = 0;
}
-#if 0
scene->setPictureObjectsFlag4();
for (CPtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {
StaticANIObject *o = (StaticANIObject *)s;
- o->setFlags(o->field_6 & 0xFE7F);
+ o->setFlags(o->_field_6 & 0xFE7F);
}
PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
@@ -125,6 +125,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
removeMessageHandler(2, -1);
_updateScreenCallback = 0;
+#if 0
switch (entrance->_sceneId) {
case SC_INTRO1:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1");