FULLPIPE: Finish global_messageHandler3()
This commit is contained in:
parent
d8bc218ce8
commit
028772d153
12 changed files with 71 additions and 30 deletions
|
@ -321,6 +321,11 @@ void GameObject::renumPictures(CPtrList *lst) {
|
|||
free(buf);
|
||||
}
|
||||
|
||||
bool GameObject::canInteractAny(GameObject *obj2, int a3) {
|
||||
warning("STUB: GameObject::canInteractAny()");
|
||||
return false;
|
||||
}
|
||||
|
||||
Picture::Picture() {
|
||||
_x = 0;
|
||||
_y = 0;
|
||||
|
|
|
@ -139,6 +139,8 @@ class GameObject : public CObject {
|
|||
void setFlags(int16 flags) { _flags = flags; }
|
||||
void clearFlags() { _flags = 0; }
|
||||
const char *getName() { return _objectName; }
|
||||
|
||||
bool canInteractAny(GameObject *obj2, int a3);
|
||||
};
|
||||
|
||||
class PictureObject : public GameObject {
|
||||
|
|
|
@ -177,6 +177,8 @@ CObjstateCommand::CObjstateCommand() {
|
|||
bool CObjstateCommand::load(MfcArchive &file) {
|
||||
debug(5, "CObjStateCommand::load()");
|
||||
|
||||
_objtype = kObjTypeObjstateCommand;
|
||||
|
||||
_cmd.load(file);
|
||||
|
||||
_value = file.readUint32LE();
|
||||
|
|
|
@ -83,6 +83,7 @@ class ExCommand2 : public ExCommand {
|
|||
};
|
||||
|
||||
class CObjstateCommand : public CObject {
|
||||
public:
|
||||
ExCommand _cmd;
|
||||
char *_objCommandName;
|
||||
int _value;
|
||||
|
|
|
@ -248,4 +248,20 @@ void CReactPolygonal::createRegion() {
|
|||
}
|
||||
}
|
||||
|
||||
int startWalkTo(int objId, int objKey, int x, int y, int a5) {
|
||||
warning("STUB: startWalkTo(%d, %d, %d, %d, %d)", objId, objKey, x, y, a5);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int doSomeAnimation(int objId, int objKey, int a3) {
|
||||
warning("STUB: doSomeAnimation(%d, %d, %d)", objId, objKey, a3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int doSomeAnimation2(int objId, int objKey) {
|
||||
return doSomeAnimation(objId, objKey, 0);
|
||||
}
|
||||
|
||||
} // End of namespace Fullpipe
|
||||
|
|
|
@ -25,7 +25,12 @@
|
|||
|
||||
namespace Fullpipe {
|
||||
|
||||
int startWalkTo(int objId, int objKey, int x, int y, int a5);
|
||||
int doSomeAnimation(int objId, int objKey, int a3);
|
||||
int doSomeAnimation2(int objId, int objKey);
|
||||
|
||||
class CMotionController : public CObject {
|
||||
public:
|
||||
int _field_4;
|
||||
bool _isEnabled;
|
||||
|
||||
|
|
|
@ -488,6 +488,12 @@ PictureObject *Scene::getPictureObjectAtPos(int x, int y) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int Scene::getPictureObjectIdAtPos(int x, int y) {
|
||||
warning("STUB: Scene::getPictureObjectIdAtPos(%d, %d)", x, y);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Scene::update(int counterdiff) {
|
||||
debug(0, "Scene::update(%d)", counterdiff);
|
||||
|
||||
|
|
|
@ -73,6 +73,7 @@ class Scene : public Background {
|
|||
|
||||
StaticANIObject *getStaticANIObjectAtPos(int x, int y);
|
||||
PictureObject *getPictureObjectAtPos(int x, int y);
|
||||
int getPictureObjectIdAtPos(int x, int y);
|
||||
|
||||
void initObjectCursors(const char *name);
|
||||
|
||||
|
|
|
@ -926,9 +926,9 @@ int global_messageHandler3(ExCommand *cmd) {
|
|||
case 17:
|
||||
switch (cmd->_messageNum) {
|
||||
case 61:
|
||||
return gameLoaderPreloadScene(cmd->_parentId, cmd->_keyCode);
|
||||
return g_fullpipe->_gameLoader->preloadScene(cmd->_parentId, cmd->_keyCode);
|
||||
case 62:
|
||||
return gameLoaderGotoScene(cmd->_parentId, cmd->_keyCode);
|
||||
return g_fullpipe->_gameLoader->gotoScene(cmd->_parentId, cmd->_keyCode);
|
||||
case 64:
|
||||
if (g_fullpipe->_currentScene && g_fullpipe->_msgObjectId2
|
||||
&& (!(cmd->_keyCode & 4) || g_fullpipe->_msgObjectId2 != cmd->_field_14 || g_fullpipe->_msgId != cmd->_field_20)) {
|
||||
|
@ -955,39 +955,39 @@ int global_messageHandler3(ExCommand *cmd) {
|
|||
case 29:
|
||||
if (g_fullpipe->_gameLoader->_interactionController->_flag24 && g_fullpipe->_currentScene) {
|
||||
ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
|
||||
ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
|
||||
ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
|
||||
if (ani) {
|
||||
if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
|
||||
cmd->_messageKind = 0;
|
||||
return result;
|
||||
}
|
||||
if (ani2->canInteractAny(ani, cmd->_keyCode)) {
|
||||
ani2->handleObjectInteraction(ani, cmd->_keyCode);
|
||||
handleObjectInteraction(ani2, ani, cmd->_keyCode);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
int id = g_fullpipe->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
|
||||
ani = g_fullpipe->_currentScene->getPictureObjectById(id, 0);
|
||||
if (ani) {
|
||||
if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
|
||||
PictureObject *pic = g_fullpipe->_currentScene->getPictureObjectById(id, 0);
|
||||
if (pic) {
|
||||
if (g_fullpipe->_msgObjectId2 == pic->_id && g_fullpipe->_msgId == pic->_okeyCode) {
|
||||
cmd->_messageKind = 0;
|
||||
return result;
|
||||
}
|
||||
if (ani2->canInteractAny(ani, cmd->_keyCode)) {
|
||||
if (!ani2 || ani->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))
|
||||
ani2->handleObjectInteraction(ani, cmd->_keyCode);
|
||||
if (ani2->canInteractAny(pic, cmd->_keyCode)) {
|
||||
if (!ani2 || ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))
|
||||
handleObjectInteraction(ani2, pic, cmd->_keyCode);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (getCurrSceneSc2MotionController()->_isEnabled && cmd->_keyCode <= 0) {
|
||||
if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_isEnabled && cmd->_keyCode <= 0) {
|
||||
if (g_fullpipe->_msgX != cmd->_sceneClickX || g_fullpipe->_msgY != cmd->_sceneClickY) {
|
||||
ani = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
|
||||
ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
|
||||
if (!ani || ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100)) {
|
||||
result = startWalkTo(getGameLoaderFieldFA(), -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
|
||||
result = startWalkTo(g_fullpipe->_gameLoader->_field_FA, -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
|
||||
if (result) {
|
||||
ExCommand *ex = new ExCommand(getGameLoaderFieldFA(), 17, 64, 0, 0, 0, 1, 0, 0, 0);
|
||||
ExCommand *ex = new ExCommand(g_fullpipe->_gameLoader->_field_FA, 17, 64, 0, 0, 0, 1, 0, 0, 0);
|
||||
|
||||
ex->_keyCode = 1;
|
||||
ex->_excFlags |= 3;
|
||||
|
@ -1033,7 +1033,7 @@ int global_messageHandler3(ExCommand *cmd) {
|
|||
getGameLoaderInventory()->rebuildItemRects();
|
||||
return 1;
|
||||
}
|
||||
ani = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
|
||||
ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
|
||||
if (ani) {
|
||||
getGameLoaderInventory()->removeItem2(g_fullpipe->_currentScene, cmd->_parentId, ani->_ox + cmd->_x, ani->_oy + cmd->_y, ani->_priority + cmd->_field_14);
|
||||
getGameLoaderInventory()->rebuildItemRects();
|
||||
|
@ -1046,24 +1046,26 @@ int global_messageHandler3(ExCommand *cmd) {
|
|||
return 1;
|
||||
case 55:
|
||||
if (g_fullpipe->_currentScene) {
|
||||
GameObject *obj;
|
||||
if (cmd->_field_14)
|
||||
ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
|
||||
obj = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
|
||||
else
|
||||
ani = g_fullpipe->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
|
||||
g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode)->handleObjectInteraction(ani, cmd->_field_20);
|
||||
obj = g_fullpipe->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
|
||||
handleObjectInteraction(g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode), obj, cmd->_field_20);
|
||||
result = 1;
|
||||
}
|
||||
return result;
|
||||
case 51:
|
||||
return startWalkTo(cmd->_parentId, cmd->_keyCode, cmd->_x, cmd->_y, cmd->_field_20);
|
||||
case 52:
|
||||
return sub_457F60(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
|
||||
return doSomeAnimation(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
|
||||
case 53:
|
||||
return sub_457FA0(cmd->_parentId, cmd->_keyCode);
|
||||
return doSomeAnimation2(cmd->_parentId, cmd->_keyCode);
|
||||
case 63:
|
||||
if (CObject::IsKindOf(cmd, &RTCObjstateCommand)) {
|
||||
if (cmd->_objtype == kObjTypeObjstateCommand) {
|
||||
CObjstateCommand *c = (CObjstateCommand *)cmd;
|
||||
result = 1;
|
||||
g_fullpipe->setObjectState(cmd->_objCommandName, cmd->_value);
|
||||
g_fullpipe->setObjectState(c->_objCommandName, c->_value);
|
||||
}
|
||||
return result;
|
||||
default:
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "fullpipe/ngiarchive.h"
|
||||
#include "fullpipe/statics.h"
|
||||
#include "fullpipe/messages.h"
|
||||
#include "fullpipe/interaction.h"
|
||||
|
||||
#include "fullpipe/constants.h"
|
||||
#include "fullpipe/objectnames.h"
|
||||
|
@ -312,12 +313,6 @@ int StaticANIObject::getMovementIdById(int itemId) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool StaticANIObject::canInteractAny(GameObject *obj2, int a3) {
|
||||
warning("STUB: StaticANIObject::canInteractAny()");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Movement *StaticANIObject::getMovementByName(char *name) {
|
||||
for (uint i = 0; i < _movements.size(); i++)
|
||||
if (!strcmp(((Movement *)_movements[i])->_objectName, name))
|
||||
|
|
|
@ -230,8 +230,6 @@ class StaticANIObject : public GameObject {
|
|||
|
||||
MessageQueue *changeStatics1(int msgNum);
|
||||
void changeStatics2(int objId);
|
||||
|
||||
bool canInteractAny(GameObject *obj2, int a3);
|
||||
};
|
||||
|
||||
struct MovTable {
|
||||
|
|
|
@ -64,8 +64,16 @@ class MfcArchive : public Common::SeekableReadStream {
|
|||
virtual bool seek(int32 offset, int whence = SEEK_SET) { return _stream->seek(offset, whence); }
|
||||
};
|
||||
|
||||
enum ObjType {
|
||||
kObjTypeDefault,
|
||||
kObjTypeObjstateCommand
|
||||
};
|
||||
|
||||
class CObject {
|
||||
public:
|
||||
ObjType _objtype;
|
||||
|
||||
CObject() : _objtype(kObjTypeDefault) {}
|
||||
virtual bool load(MfcArchive &in) { return true; }
|
||||
virtual ~CObject() {}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue