NEVERHOOD: More work on Klayman

- Rename Scene::_playerSprite to _klayman
- Send mouse clicks to the scene object (has not effect yet)
This commit is contained in:
johndoe123 2011-07-07 20:26:12 +00:00 committed by Willem Jan Palenstijn
parent 3131cc6f18
commit c694ce8505
9 changed files with 126 additions and 31 deletions

View File

@ -70,7 +70,7 @@ public:
uint32 sendMessage(int messageNum, uint32 param, Entity *sender) {
return sendMessage(messageNum, MessageParam(param), sender);
}
uint32 sendPointMessage(int messageNum, NPoint param, Entity *sender) {
uint32 sendPointMessage(int messageNum, const NPoint &param, Entity *sender) {
return sendMessage(messageNum, MessageParam(param), sender);
}
uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) {

View File

@ -22,6 +22,7 @@
#include "neverhood/gamemodule.h"
#include "neverhood/graphics.h"
#include "neverhood/module1000.h"
#include "neverhood/module1500.h"
@ -57,6 +58,16 @@ GameModule::~GameModule() {
}
void GameModule::handleMouseDown(int16 x, int16 y) {
if (_childObject) {
NPoint mousePos;
mousePos.x = x;
mousePos.y = y;
debug("GameModule::handleMouseDown(%d, %d)", x, y);
_childObject->sendPointMessage(1, mousePos, this);
}
}
uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Module::handleMessage(messageNum, param, sender);
switch (messageNum) {

View File

@ -34,6 +34,7 @@ class GameModule : public Module {
public:
GameModule(NeverhoodEngine *vm);
virtual ~GameModule();
void handleMouseDown(int16 x, int16 y);
protected:
Entity *_prevChildObject;
bool _someFlag1;

View File

@ -67,9 +67,22 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
}
void Klayman::xUpdate() {
// Empty
}
uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
switch (messageNum) {
case 0x4001:
case 0x4800:
sub41C930(param._point.x, false);
break;
case 0x4004:
// TODO AnimatedSprite_setCallback2(AnimationCallback(&sub41FC80));
break;
case 0x4818:
// TODO sub41C930(_rectResource.getRectangle1(param._integer).x, false);
break;
}
return 0;
}
@ -455,5 +468,57 @@ void Klayman::sub41FCF0() {
SetSpriteCallback(NULL);
}
uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
if (param._integer == 0x271AA210) {
#if 0
_soundResource1.set(0x4924AAC4);
_soundResource1.load();
_soundResource1.play(false);
#endif
} else if (param._integer == 0x2B22AA81) {
#if 0
_soundResource1.set(0x0A2AA8E0);
_soundResource1.load();
_soundResource1.play(false);
#endif
}
break;
}
return messageResult;
}
void Klayman::sub41C930(int16 x, bool flag) {
int16 xdiff = ABS(x - _x);
if (xdiff == 0) {
_x4 = x;
if (_flagE1 || _flagE2 || _flagE3) {
// TODO AnimatedSprite_setCallback2(NULL);
sub41C7B0();
}
} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
_x4 = x;
// TODO AnimatedSprite_setCallback2(NULL);
sub41C7B0();
} else if (xdiff <= 42 && _status != 3) {
if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
_x4 = x;
} else {
_x4 = x;
// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41FB40));
}
} else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
_x4 = x;
} else if (flag) {
_x4 = x;
// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
} else {
_x4 = x;
// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41F950));
}
}
} // End of namespace Neverhood

View File

@ -124,6 +124,8 @@ protected:
void sub41FCF0();
uint32 handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender);
void sub41C930(int16 x, bool flag);
};

View File

@ -400,41 +400,45 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
// TODO Mouse
//DEBUG so he's here at least
_klayman = new Klayman(_vm, this, 200, 433, 1000, 1000);
addSprite(_klayman);
#if 0
// TODO: Player sprites...
if (which < 0) {
setRectList(0x004B49F0);
_playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000);
_klayman = new Class572(_vm, this, 200, 433, 1000, 1000);
setMessageList(0x004B4888);
} else if (which == 1) {
setRectList(0x004B49F0);
_playerSprite = new Class572(_vm, this, 640, 433, 1000, 1000);
_klayman = new Class572(_vm, this, 640, 433, 1000, 1000);
setMessageList(0x004B4898);
} else if (which == 2) {
setRectList(0x004B49F0);
if (_vm->getGlobalVar(0xC0418A02)) {
_playerSprite = new Class572(_vm, this, 390, 433, 1000, 1000);
_playerSprite->setDoDeltaX(1);
_klayman = new Class572(_vm, this, 390, 433, 1000, 1000);
_klayman->setDoDeltaX(1);
} else {
_playerSprite = new Class572(_vm, this, 300, 433, 1000, 1000);
_klayman = new Class572(_vm, this, 300, 433, 1000, 1000);
}
setMessageList(0x004B4970);
} else {
setRectList(0x004B4A00);
_playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000);
_klayman = new Class572(_vm, this, 200, 433, 1000, 1000);
setMessageList(0x004B4890);
}
addSprite(_playerSprite);
addSprite(_klayman);
#endif
staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
#if 0
// TODO: This sucks somehow, find a better way
_playerSprite->getSurface()->getClipRect().x1 = 0;
_playerSprite->getSurface()->getClipRect().y1 = 0;
_playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
_playerSprite->getSurface()->getClipRect().y2 = 480;
_klayman->getSurface()->getClipRect().x1 = 0;
_klayman->getSurface()->getClipRect().y1 = 0;
_klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
_klayman->getSurface()->getClipRect().y2 = 480;
#endif
if (_vm->getGlobalVar(0xD217189D) == 0) {
@ -470,7 +474,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
}
Scene1001::~Scene1001() {
// TODO _vm->setGlobalVar(0xC0418A02, _playerSprite->_doDeltaX);
// TODO _vm->setGlobalVar(0xC0418A02, _klayman->_doDeltaX);
}
uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@ -490,7 +494,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
break;
case 0x100D:
if (param._integer == 0x00342624) {
// TODO _playerSprite->sendMessage(0x1014, _asLever, this);
// TODO _klayman->sendMessage(0x1014, _asLever, this);
// TODO setMessageList2(0x004B4910, true, false);
messageResult = 1;
} else if (param._integer == 0x21E64A00) {
@ -502,7 +506,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
messageResult = 1;
}
} else if (param._integer == 0x040424D0) {
// TODO _playerSprite->sendMessage(0x1014, _ssButton, this);
// TODO _klayman->sendMessage(0x1014, _ssButton, this);
} else if (param._integer == 0x80006358) {
if (_vm->getGlobalVar(0x03C698DA)) {
// TODO setMessageList(0x004B4938, true, false);

View File

@ -152,14 +152,18 @@ Common::Error NeverhoodEngine::run() {
_mouseX = event.mouse.x;
_mouseY = event.mouse.y;
break;
/*
case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_RBUTTONDOWN:
_gameModule->handleMouseDown(event.mouse.x, event.mouse.y);
break;
/*
_buttonState |= kLeftButton;
break;
case Common::EVENT_LBUTTONUP:
_buttonState &= ~kLeftButton;
break;
case Common::EVENT_RBUTTONDOWN:
_buttonState |= kRightButton;
break;
case Common::EVENT_RBUTTONUP:

View File

@ -37,7 +37,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
_mouseClicked = false;
// TODO _rectList = NULL;
// TODO _someRects = NULL;
// TODO _playerSprite = NULL;
_klayman = NULL;
// TODO _mouseSprite = NULL;
_palette = NULL;
_background = NULL;
@ -193,15 +193,15 @@ void Scene::update() {
if (_mouseClicked) {
//** ALL TODO
#if 0
if (_playerSprite) {
if (_klayman) {
// TODO: Merge later
if (_playerSprite->hasMessageHandler() &&
_playerSprite->sendMessage(0x1008, 0, this) != 0 &&
if (_klayman->hasMessageHandler() &&
_klayman->sendMessage(0x1008, 0, this) != 0 &&
_messageListFlag &&
queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) {
_mouseClicked = false;
} else if (_playerSprite->hasMessageHandler() &&
_playerSprite->sendMessage(0x1008, 0, this) != 0 &&
} else if (_klayman->hasMessageHandler() &&
_klayman->sendMessage(0x1008, 0, this) != 0 &&
_messageListFlag) {
_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
}
@ -223,12 +223,13 @@ void Scene::update() {
uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
// TODO
#if 0
switch (messageNum) {
case 0: // mouse moved
#if 0
if (_mouseSprite && _mouseSprite->hasMessageHandler())
_mouseSprite->sendMessage(0x4002, param, this);
queryPositionSomeRects(param._point.x, param._point.y);
#endif
break;
case 1: // mouse clicked
_mouseClicked = true;
@ -245,7 +246,9 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
break;
*/
case 5:
#if 0
broadcastObjectMessage5();
#endif
break;
case 6:
_parentModule->sendMessage(0x1009, param, this);
@ -254,35 +257,39 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
if (_messageListFlag1) {
_messageListFlag1 = false;
if (_messageListIndex == _messageListCount)
_playerSprite->sendMessage(0x4004, 0, this);
else
runMessageList();
_klayman->sendMessage(0x4004, 0, this);
else {
// TODO runMessageList();
}
}
break;
case 0x1007:
if (_messageListFlag1) {
_messageListFlag1 = false;
_messageList = NULL;
_playerSprite->sendMessage(0x4004, 0, this);
_klayman->sendMessage(0x4004, 0, this);
}
break;
case 0x101D:
#if 0
if (_mouseSprite) {
_prevVisible = _mouseSprite->_drawSurface->_visible;
_mouseSprite->_drawSurface->_visible = false;
}
#endif
break;
case 0x101E:
#if 0
if (_prevVisible && _mouseSprite) {
_mouseSprite->_drawSurface->_visible = true;
_mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this);
}
#endif
break;
case 0x1022:
setSurfacePriority(((Sprite*)sender)->_surface, param._integer);
setSurfacePriority(((Sprite*)sender)->getSurface(), param._integer);
break;
}
#endif
return 0;
}

View File

@ -28,6 +28,7 @@
#include "neverhood/background.h"
#include "neverhood/entity.h"
#include "neverhood/graphics.h"
#include "neverhood/klayman.h"
#include "neverhood/module.h"
#include "neverhood/palette.h"
#include "neverhood/smackerplayer.h"
@ -67,8 +68,8 @@ protected:
// TODO 00000088 someRects dd ?
// TODO 0000008C someRectsCount dw ?
// TODO 0000008E field_8E dw ?
// TODO 00000090 playerSprite dd ?
// TODO 00000094 mouseSprite dd ?
Klayman *_klayman;
Palette *_palette;
Background *_background;
bool _surfaceFlag;