diff options
Diffstat (limited to 'engines/neverhood/klayman.cpp')
-rw-r--r-- | engines/neverhood/klayman.cpp | 419 |
1 files changed, 332 insertions, 87 deletions
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 7a775bcf12..eca8e02df4 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -21,7 +21,9 @@ */ #include "neverhood/klayman.h" +#include "neverhood/collisionman.h" #include "neverhood/resourceman.h" +#include "neverhood/staticdata.h" namespace Neverhood { @@ -52,7 +54,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), _counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false), _status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), - _flagFA(false), _statusE0(0) /*, _field114(0)*/, _resourceHandle(-1), _soundFlag(false) { + _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { // TODO createSurface(surfacePriority, 320, 200); @@ -74,13 +76,13 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param._point.x, false); + sub41C930(param.asPoint().x, false); break; case 0x4004: - // TODO AnimatedSprite_setCallback2(AnimationCallback(&sub41FC80)); + setCallback2(AnimationCallback(&Klayman::sub41FC80)); break; case 0x4818: - // TODO sub41C930(_rectResource.getRectangle1(param._integer).x, false); + // TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false); break; } return 0; @@ -124,19 +126,15 @@ void Klayman::sub41FD40() { SetMessageHandler(&Klayman::handleMessage41EB10); SetSpriteCallback(NULL); SetAnimationCallback3(&Klayman::sub41FCF0); - // TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FD90)); + setCallback1(AnimationCallback(&Klayman::sub41FD90)); } uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x04DBC02C) { -#if 0 - _soundResource1.set(0x44528AA1); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x04DBC02C) { + _soundResource1.play(0x44528AA1); } break; } @@ -165,12 +163,8 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x808A0008) { -#if 0 - _soundResource1.set(0xD948A340); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x808A0008) { + _soundResource1.play(0xD948A340); } break; } @@ -189,7 +183,7 @@ void Klayman::sub41FE00() { SetMessageHandler(&Klayman::handleMessage41E9E0); SetSpriteCallback(NULL); SetAnimationCallback3(&Klayman::sub41FCF0); - // TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FE50)); + setCallback1(AnimationCallback(&Klayman::sub41FE50)); } void Klayman::sub41FE50() { @@ -200,24 +194,12 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x5A0F0104) { -#if 0 - _soundResource1.set(0x7970A100); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x9A9A0109) { -#if 0 - _soundResource1.set(0xD170CF04); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x989A2169) { -#if 0 - _soundResource1.set(0xD073CF14); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x5A0F0104) { + _soundResource1.play(0x7970A100); + } else if (param.asInteger() == 0x9A9A0109) { + _soundResource1.play(0xD170CF04); + } else if (param.asInteger() == 0x989A2169) { + _soundResource1.play(0xD073CF14); } break; } @@ -242,12 +224,8 @@ uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x0D2A0288) { -#if 0 - _soundResource1.set(0xD192A368); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x0D2A0288) { + _soundResource1.play(0xD192A368); } break; } @@ -272,30 +250,14 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0xC006000C) { -#if 0 - _soundResource1.set(0x9D406340); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x2E4A2940) { -#if 0 - _soundResource1.set(0x53A4A1D4); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0xAA0A0860) { -#if 0 - _soundResource1.set(0x5BE0A3C6); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0xC0180260) { -#if 0 - _soundResource1.set(0x5D418366); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0xC006000C) { + _soundResource1.play(0x9D406340); + } else if (param.asInteger() == 0x2E4A2940) { + _soundResource1.play(0x53A4A1D4); + } else if (param.asInteger() == 0xAA0A0860) { + _soundResource1.play(0x5BE0A3C6); + } else if (param.asInteger() == 0xC0180260) { + _soundResource1.play(0x5D418366); } break; } @@ -405,6 +367,7 @@ void Klayman::update41D0F0() { } uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41D360(%04X)", messageNum); Sprite::handleMessage(messageNum, param, sender); uint32 messageResult = xHandleMessage(messageNum, param); switch (messageNum) { @@ -412,7 +375,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E messageResult = _flagE5; break; case 0x1014: - _attachedSprite = param._entity; + _attachedSprite = param.asEntity(); break; case 0x1019: sub41C7B0(); @@ -424,13 +387,13 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E sub41C790(); break; case 0x481C: - _status = param._integer; + _status = param.asInteger(); _flagFA = true; messageResult = 1; break; case 0x482C: - if (param._integer != 0) { - // TODO _rectResource.getRectangle2(param._integer, &_field118, &_field114,); + if (param.asInteger() != 0) { + // TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,); } else { // TODO _field114 = 0; } @@ -440,9 +403,9 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FF00() { - setFileHash(0x5900C41E, 0, -1); _status2 = 1; _flagE5 = true; + setFileHash(0x5900C41E, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -472,18 +435,10 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E 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 + if (param.asInteger() == 0x271AA210) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x2B22AA81) { + _soundResource1.play(0x0A2AA8E0); } break; } @@ -492,33 +447,323 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { + debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); if (xdiff == 0) { _x4 = x; if (_flagE1 || _flagE2 || _flagE3) { - // TODO AnimatedSprite_setCallback2(NULL); + setCallback2(NULL); sub41C7B0(); } } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { _x4 = x; - // TODO AnimatedSprite_setCallback2(NULL); + 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)); + setCallback2(AnimationCallback(&Klayman::sub41FB40)); } } else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { _x4 = x; } else if (flag) { _x4 = x; + debug("#### 1"); // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); } else { _x4 = x; - // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41F950)); + setCallback2(AnimationCallback(&Klayman::sub41F950)); + } +} + +void Klayman::sub4211F0() { + _status2 = 1; + _flagE5 = false; + setFileHash(0x527AC970, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub4211B0() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x5A38C110, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E920); + SetSpriteCallback(NULL); +} + +uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x03060012) { + _soundResource1.play(0xC0238244); + } + break; + } + return messageResult; +} + +bool Klayman::sub41CEB0(AnimationCb callback3) { + if (_status2 == 1) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x5C7080D4, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41F140); + SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetAnimationCallback3(callback3); + return true; + } else { + _x = _x4; + return false; + } +} + +void Klayman::spriteUpdate41F250() { + debug("Klayman::spriteUpdate41F250()"); +} + +void Klayman::spriteUpdate41F5F0() { + debug("Klayman::spriteUpdate41F5F0()"); +} + +void Klayman::sub41FB40() { + _status2 = 1; + _flagE2 = true; + _flagE5 = true; + setDoDeltaX(_x4 < _x); + setFileHash(0x5C48C506, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DD80); + SetSpriteCallback(&Klayman::spriteUpdate41F5F0); + setCallback1(AnimationCallback(&Klayman::sub41FBB0)); +} + +void Klayman::sub41FBB0() { + _flagE2 = false; +} + +uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0A2AA8E0); + } else if (param.asInteger() == 0x32188010) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x02A2909C) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + case 0x3002: + _x = _x4; + sub41C7B0(); + break; } + return messageResult; +} + +void Klayman::sub41CD70(int16 x) { + if (x > _x) { + if (ABS(x - _x) <= 105) { + debug("// TODO sub41CAC0(x);"); + // TODO sub41CAC0(x); + } else { + sub41C930(x, false); + } + } else if (x == _x) { + _x4 = x; + setCallback2(NULL); + sub41C7B0(); + } else { + sub41C930(x, false); + } +} + +void Klayman::sub41F950() { + if (!sub41CF10(AnimationCallback(&Klayman::sub41F950))) { + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setDoDeltaX(_x4 < _x); + setFileHash(0x242C0198, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EC70); + SetSpriteCallback(&Klayman::spriteUpdate41F320); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); + SetAnimationCallback3(&Klayman::sub41F9E0); + } +} + +void Klayman::sub41FB30() { + _flagE1 = false; +} + +uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x0A2A9098) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + } + return messageResult; +} + +void Klayman::sub41F9E0() { + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); + SetAnimationCallback3(&Klayman::sub41FA40); +} + +void Klayman::spriteUpdate41F300() { + SetSpriteCallback(&Klayman::spriteUpdate41F320); + _deltaX = 0; +} + +uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x0A2A9098) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + } + return messageResult; +} + +void Klayman::sub41FA40() { + if (_status == 2) { + sub41C7B0(); + } else if (_status == 3) { + debug("// TODO sub420F20();"); + // TODO sub420F20(); + } else { + _flagE2 = true; + if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + if (_status == 0) { + _status2 = 1; + setFileHash(0xF234EE31, 0, -1); + } else { + _status2 = 2; + setFileHash(0xF135CC21, 0, -1); + } + } else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + if (_status == 0) { + _status2 = 1; + setFileHash(0x8604A152, 0, -1); + } else { + _status2 = 2; + setFileHash(0xA246A132, 0, -1); + } + } + _flagE5 = true; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DD80); + SetSpriteCallback(&Klayman::spriteUpdate41F5F0); + setCallback1(AnimationCallback(&Klayman::sub41FBB0)); + } +} + +void Klayman::spriteUpdate41F320() { + int16 xdiff = ABS(_x4 - _x); + int16 xdelta = _x4 - _x; + + if (xdelta > _deltaX) + xdelta = _deltaX; + else if (xdelta < _deltaX) + xdelta = -_deltaX; + + _deltaX = 0; + + if (xdiff == 0) { + sendMessage(0x1019, 0, this); + } else if (_status != 2 && _status != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + sendMessage(0x1019, 0, this); + } else if (_status != 2 && _status != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + sendMessage(0x1019, 0, this); + } else if (_status == 3 && xdiff < 30) { + sendMessage(0x1019, 0, this); + } else if (_status == 3 && xdiff < 150 && _frameIndex >= 6) { + sendMessage(0x1019, 0, this); + } else { + HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + _x += xdelta; + if (_field114) { + debug("_field114"); + // TODO KlaymanSprite_sub_41CF70 + } else { + HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + if (xdelta > 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (hitRectPrev->type == 0x5003) { + if (xdelta < 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (_flagF6 && xdelta != 0) { + if (hitRectNext->type == 0x5000) { + _y++; + } else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) { + _y--; + } + } + } + processDelta(); + } + } } // End of namespace Neverhood |