FULLPIPE: Finish global_messageHandler3()

This commit is contained in:
Eugene Sandulenko 2013-08-26 22:17:20 +03:00
parent d8bc218ce8
commit 028772d153
12 changed files with 71 additions and 30 deletions

View file

@ -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;

View file

@ -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 {

View file

@ -177,6 +177,8 @@ CObjstateCommand::CObjstateCommand() {
bool CObjstateCommand::load(MfcArchive &file) {
debug(5, "CObjStateCommand::load()");
_objtype = kObjTypeObjstateCommand;
_cmd.load(file);
_value = file.readUint32LE();

View file

@ -83,6 +83,7 @@ class ExCommand2 : public ExCommand {
};
class CObjstateCommand : public CObject {
public:
ExCommand _cmd;
char *_objCommandName;
int _value;

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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:

View file

@ -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))

View file

@ -230,8 +230,6 @@ class StaticANIObject : public GameObject {
MessageQueue *changeStatics1(int msgNum);
void changeStatics2(int objId);
bool canInteractAny(GameObject *obj2, int a3);
};
struct MovTable {

View file

@ -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() {}