aboutsummaryrefslogtreecommitdiff
path: root/engines/neverhood/klayman.cpp
diff options
context:
space:
mode:
authorjohndoe1232012-09-13 17:51:44 +0000
committerWillem Jan Palenstijn2013-05-08 20:43:41 +0200
commit402f4bd275f064f0ad7752be7aebfa1634b81fa1 (patch)
tree178963e48a9ff441f879e694df6e9699ca3600b4 /engines/neverhood/klayman.cpp
parentd4e322bc78d30941f5f3ab31c2460412fe0d7fb5 (diff)
downloadscummvm-rg350-402f4bd275f064f0ad7752be7aebfa1634b81fa1.tar.gz
scummvm-rg350-402f4bd275f064f0ad7752be7aebfa1634b81fa1.tar.bz2
scummvm-rg350-402f4bd275f064f0ad7752be7aebfa1634b81fa1.zip
NEVERHOOD: Start with Module2400
- Implement Scene2401
Diffstat (limited to 'engines/neverhood/klayman.cpp')
-rw-r--r--engines/neverhood/klayman.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9d28b5f046..9a6e4fe1a1 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5215,6 +5215,150 @@ void KmScene2247::sub453520() {
FinalizeState(&Klayman::stStartWalkingDone);
}
+KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+ : Klayman(vm, parentScene, x, y, 1000, 1000), _readyToSpit(false) {
+ // Empty
+}
+
+uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
+ uint32 messageResult = 0;
+ switch (messageNum) {
+ case 0x4001:
+ case 0x4800:
+ startWalkToX(param.asPoint().x, false);
+ break;
+ case 0x4004:
+ GotoState(&Klayman::stTryStandIdle);
+ break;
+ case 0x4816:
+ if (param.asInteger() == 1) {
+ GotoState(&Klayman::stTurnPressButton);
+ } else if (param.asInteger() == 2) {
+ GotoState(&Klayman::stStampFloorButton);
+ } else {
+ GotoState(&Klayman::stPressButtonSide);
+ }
+ break;
+ case 0x4817:
+ setDoDeltaX(param.asInteger());
+ gotoNextStateExt();
+ break;
+ case 0x481B:
+ if (param.asPoint().y != 0) {
+ sub41CC40(param.asPoint().y, param.asPoint().x);
+ } else {
+ sub41CCE0(param.asPoint().x);
+ }
+ break;
+ case 0x481F:
+ if (param.asInteger() == 1) {
+ GotoState(&Klayman::stTurnAwayFromUse);
+ } else if (param.asInteger() == 0) {
+ GotoState(&Klayman::stTurnToUseHalf);
+ } else {
+ GotoState(&Klayman::stWonderAbout);
+ }
+ break;
+ case 0x482D:
+ setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+ gotoNextStateExt();
+ break;
+ case 0x482E:
+ if (param.asInteger() == 1) {
+ GotoState(&Klayman::stWalkToFrontNoStep);
+ } else {
+ GotoState(&Klayman::stWalkToFront);
+ }
+ break;
+ case 0x482F:
+ if (param.asInteger() == 1) {
+ GotoState(&Klayman::stTurnToFront);
+ } else {
+ GotoState(&Klayman::stTurnToBack);
+ }
+ break;
+ case 0x4832:
+ GotoState(&Klayman::sub421110);
+ break;
+ case 0x4833:
+ if (param.asInteger() == 1)
+ GotoState(&Klayman::stWonderAboutHalf);
+ else {
+ _spitPipeIndex = sendMessage(_parentScene, 0x2000, 0);
+ GotoState(&KmScene2401::stTrySpitIntoPipe);
+ }
+ break;
+ case 0x483F:
+ startSpecialWalkRight(param.asInteger());
+ break;
+ case 0x4840:
+ startSpecialWalkLeft(param.asInteger());
+ break;
+ }
+ return messageResult;
+}
+
+uint32 KmScene2401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x100D:
+ if (param.asInteger() == 0x16401CA6) {
+ _canSpit = true;
+ if (_contSpit)
+ spitIntoPipe();
+ } else if (param.asInteger() == 0xC11C0008) {
+ _canSpit = false;
+ _acceptInput = false;
+ _readyToSpit = false;
+ } else if (param.asInteger() == 0x018A0001) {
+ sendMessage(_parentScene, 0x2001, _spitDestPipeIndex);
+ }
+ break;
+ }
+ return messageResult;
+}
+
+void KmScene2401::stTrySpitIntoPipe() {
+ if (_readyToSpit) {
+ _contSpit = true;
+ _spitContDestPipeIndex = _spitPipeIndex;
+ if (_canSpit)
+ spitIntoPipe();
+ } else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) {
+ _status2 = 2;
+ _acceptInput = true;
+ _spitDestPipeIndex = _spitPipeIndex;
+ _readyToSpit = true;
+ _canSpit = false;
+ _contSpit = false;
+ startAnimation(0x1808B150, 0, -1);
+ SetUpdateHandler(&Klayman::update);
+ SetMessageHandler(&KmScene2401::handleMessage);
+ SetSpriteUpdate(NULL);
+ }
+}
+
+void KmScene2401::spitIntoPipe() {
+ _contSpit = false;
+ _spitDestPipeIndex = _spitContDestPipeIndex;
+ _canSpit = false;
+ _acceptInput = false;
+ startAnimation(0x1B08B553, 0, -1);
+ SetUpdateHandler(&Klayman::update);
+ SetMessageHandler(&KmScene2401::handleMessage);
+ SetSpriteUpdate(NULL);
+ NextState(&KmScene2401::stContSpitIntoPipe);
+}
+
+void KmScene2401::stContSpitIntoPipe() {
+ _canSpit = true;
+ _acceptInput = true;
+ startAnimationByHash(0x1808B150, 0x16401CA6, 0);
+ SetUpdateHandler(&Klayman::update);
+ SetMessageHandler(&KmScene2401::handleMessage);
+ SetSpriteUpdate(NULL);
+}
+
KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
// Empty