scummvm/engines/fullpipe/scenes/scene06.cpp
D G Turner 9190f6e1c8 FULLPIPE: Fix Missing Default Switch Cases
These are flagged by GCC if -Wswitch-default is enabled.

Also, do minor fixes for readability to switch statements.
2019-11-14 02:44:19 +00:00

773 lines
22 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "fullpipe/fullpipe.h"
#include "fullpipe/objects.h"
#include "fullpipe/objectnames.h"
#include "fullpipe/constants.h"
#include "fullpipe/gfx.h"
#include "fullpipe/motion.h"
#include "fullpipe/scenes.h"
#include "fullpipe/statics.h"
#include "fullpipe/scene.h"
#include "fullpipe/messages.h"
#include "fullpipe/gameloader.h"
#include "fullpipe/behavior.h"
#include "fullpipe/interaction.h"
namespace Fullpipe {
void scene06_initMumsy() {
g_vars->scene06_mumsyJumpFw = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPFW);
g_vars->scene06_mumsyJumpBk = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPBK);
g_vars->scene06_mumsyJumpFwPercent = g_vars->scene06_mumsyJumpFw->_percent;
g_vars->scene06_mumsyJumpBkPercent = g_vars->scene06_mumsyJumpBk->_percent;
}
int scene06_updateCursor() {
g_fp->updateCursorCommon();
if (g_vars->scene06_arcadeEnabled) {
if (g_vars->scene06_aimingBall) {
g_fp->_cursorId = PIC_CSR_ARCADE2_D;
return PIC_CSR_ARCADE2_D;
}
if (g_fp->_aniMan == g_fp->_objectAtCursor) {
if (g_fp->_aniMan->_statics->_staticsId == ST_MAN6_BALL && g_fp->_cursorId == PIC_CSR_DEFAULT) {
g_fp->_cursorId = PIC_CSR_ITN;
return PIC_CSR_ITN;
}
} else if (g_fp->_objectAtCursor && g_fp->_objectAtCursor == g_vars->scene06_currentBall
&& g_fp->_cursorId == PIC_CSR_DEFAULT) {
g_fp->_cursorId = PIC_CSR_ITN;
}
}
return g_fp->_cursorId;
}
void sceneHandler06_setExits(Scene *sc) {
MotionController *mc = getSc2MctlCompoundBySceneId(sc->_sceneId);
mc->enableLinks(sO_CloseThing, (g_fp->getObjectState(sO_BigMumsy) != g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone)));
mc->enableLinks(sO_CloseThing2, g_vars->scene06_arcadeEnabled);
}
void sceneHandler06_winArcade() {
g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone));
if (g_fp->getObjectState(sO_ClockAxis) == g_fp->getObjectEnumState(sO_ClockAxis, sO_IsNotAvailable))
g_fp->setObjectState(sO_ClockAxis, g_fp->getObjectEnumState(sO_ClockAxis, sO_WithoutHandle));
if (g_vars->scene06_arcadeEnabled) {
g_fp->_aniMan->_callback2 = 0; // Really NULL
g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000);
if (g_vars->scene06_someBall) {
g_vars->scene06_someBall->_flags &= 0xFFFB;
g_vars->scene06_balls.push_back(g_vars->scene06_someBall);
g_vars->scene06_someBall = 0;
}
if (g_vars->scene06_flyingBall) {
g_vars->scene06_flyingBall->_flags &= 0xFFFB;
g_vars->scene06_balls.push_back(g_vars->scene06_flyingBall);
g_vars->scene06_flyingBall = 0;
}
if (g_vars->scene06_ballInHands) {
g_vars->scene06_ballInHands->_flags &= 0xFFFB;
g_vars->scene06_balls.push_back(g_vars->scene06_ballInHands);
g_vars->scene06_ballInHands = 0;
}
g_vars->scene06_arcadeEnabled = false;
g_vars->scene06_aimingBall = false;
}
g_vars->scene06_mumsy->_flags &= 0xFFFB;
sceneHandler06_setExits(g_fp->_currentScene);
getCurrSceneSc2MotionController()->activate();
getGameLoaderInteractionController()->enableFlag24();
}
void sceneHandler06_enableDrops() {
chainQueue(QU_SC6_DROPS, 0);
g_vars->scene06_mumsy->changeStatics2(ST_MOM_SITS);
g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsPlaying));
chainQueue(QU_MOM_STANDUP, 1);
g_vars->scene06_arcadeEnabled = true;
g_vars->scene06_numBallsGiven = 0;
g_vars->scene06_mumsyPos = 0;
g_vars->scene06_mumsyNumBalls = 0;
g_vars->scene06_mumsyGotBall = false;
sceneHandler06_setExits(g_fp->_currentScene);
}
void sceneHandler06_mumsyBallTake() {
int momAni = 0;
switch (g_vars->scene06_mumsyNumBalls) {
case 1:
momAni = MV_MOM_TAKE1;
break;
case 2:
momAni = MV_MOM_TAKE2;
break;
case 3:
momAni = MV_MOM_TAKE3;
break;
case 4:
momAni = MV_MOM_TAKE4;
break;
case 5:
momAni = MV_MOM_TAKE5;
break;
default:
break;
}
MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
ExCommand *ex = new ExCommand(ANI_MAMASHA, 2, 50, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags = 2u;
mq->addExCommandToEnd(ex);
if (g_vars->scene06_mumsyNumBalls >= 5) {
g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone));
if (g_fp->getObjectState(sO_ClockAxis) == g_fp->getObjectEnumState(sO_ClockAxis, sO_IsNotAvailable))
g_fp->setObjectState(sO_ClockAxis, g_fp->getObjectEnumState(sO_ClockAxis, sO_WithoutHandle));
ex = new ExCommand(ANI_MAMASHA, 1, momAni, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2;
mq->addExCommandToEnd(ex);
if (g_vars->scene06_mumsyPos + 3 >= 0) {
ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_STARTBK, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2u;
mq->addExCommandToEnd(ex);
for (int i = 0; i < g_vars->scene06_mumsyPos + 3; i++) {
ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_CYCLEBK, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2;
mq->addExCommandToEnd(ex);
}
ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_STOPBK, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2;
mq->addExCommandToEnd(ex);
}
ex = new ExCommand(0, 18, QU_MOM_TOLIFT, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 3;
mq->addExCommandToEnd(ex);
} else {
if (momAni) {
ex = new ExCommand(ANI_MAMASHA, 1, momAni, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2;
mq->addExCommandToEnd(ex);
}
if (g_vars->scene06_mumsyPos < 0) {
for (int i = 0; i > g_vars->scene06_mumsyPos; i--) {
ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_JUMPFW, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2;
mq->addExCommandToEnd(ex);
}
} else if (g_vars->scene06_mumsyPos > 0) {
for (int i = 0; i < g_vars->scene06_mumsyPos; i++) {
ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_JUMPBK, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 2;
mq->addExCommandToEnd(ex);
}
}
ex = new ExCommand(0, 18, QU_MOM_SITDOWN, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 3u;
mq->addExCommandToEnd(ex);
}
mq->setFlags(mq->getFlags() | 1);
mq->chain(0);
g_vars->scene06_mumsyNumBalls = 0;
g_vars->scene06_arcadeEnabled = false;
g_fp->_aniMan2 = 0;
}
void sceneHandler06_spinHandle() {
int tummy = g_fp->getObjectState(sO_TummyTrampie);
if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsEating))
g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping));
else if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping))
g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsDrinking));
else if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsDrinking))
g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsScratchingBelly));
else if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsScratchingBelly))
g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsEating));
}
void sceneHandler06_uPipeClick() {
if (getGameLoaderInteractionController()->_flag24)
handleObjectInteraction(g_fp->_aniMan2, g_fp->_currentScene->getPictureObjectById(PIC_SC6_LADDER, 0), 0);
}
void sceneHandler06_buttonPush() {
g_vars->scene06_invHandle = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
if (g_vars->scene06_invHandle)
if (g_vars->scene06_invHandle->_flags & 4)
if (g_vars->scene06_invHandle->_statics)
if (g_vars->scene06_invHandle->_statics->_staticsId == ST_HDL_PLUGGED)
chainQueue(QU_SC6_FALLHANDLE, 1);
}
void sceneHandler06_showNextBall() {
if (g_vars->scene06_balls.size()) {
g_vars->scene06_currentBall = g_vars->scene06_balls.remove_at(0);
MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC6_SHOWNEXTBALL), 0, 1);
mq->setParamInt(-1, g_vars->scene06_currentBall->_odelay);
mq->chain(0);
++g_vars->scene06_numBallsGiven;
}
}
void sceneHandler06_installHandle() {
chainQueue(QU_SC6_SHOWHANDLE, 0);
}
int sceneHandler06_updateScreenCallback() {
int res;
res = g_fp->drawArcadeOverlay(g_vars->scene06_arcadeEnabled);
if (!res)
g_fp->_updateScreenCallback = 0;
return res;
}
void sceneHandler06_startAiming() {
if (g_vars->scene06_currentBall) {
g_vars->scene06_currentBall->hide();
g_fp->_aniMan->startAnim(MV_MAN6_TAKEBALL, 0, -1);
g_vars->scene06_ballInHands = g_vars->scene06_currentBall;
g_vars->scene06_currentBall = 0;
if (getCurrSceneSc2MotionController()->_isEnabled)
g_fp->_updateScreenCallback = sceneHandler06_updateScreenCallback;
getCurrSceneSc2MotionController()->deactivate();
getGameLoaderInteractionController()->disableFlag24();
g_vars->scene06_ballDrop->queueMessageQueue(0);
}
}
void sceneHandler06_takeBall() {
if (g_vars->scene06_currentBall && !g_vars->scene06_currentBall->_movement && g_vars->scene06_currentBall->_statics->_staticsId == ST_NBL_NORM) {
if (abs(1158 - g_fp->_aniMan->_ox) > 1
|| abs(452 - g_fp->_aniMan->_oy) > 1
|| g_fp->_aniMan->_movement
|| g_fp->_aniMan->_statics->_staticsId != (0x4000 | ST_MAN_RIGHT)) {
MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 1158, 452, 1, (0x4000 | ST_MAN_RIGHT));
if (mq) {
ExCommand *ex = new ExCommand(0, 17, MSG_SC6_TAKEBALL, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 3;
mq->addExCommandToEnd(ex);
postExCommand(g_fp->_aniMan->_id, 2, 1158, 452, 0, -1);
}
} else {
sceneHandler06_startAiming();
}
}
}
void sceneHandler06_aiming() {
if (g_vars->scene06_ballInHands) {
g_vars->scene06_ballDeltaX = 4 * g_fp->_aniMan->_movement->_currDynamicPhaseIndex + 16;
g_vars->scene06_ballDeltaY = 5 * (g_fp->_aniMan->_movement->_currDynamicPhaseIndex + 4);
if (g_fp->_aniMan->_movement->_currDynamicPhaseIndex < 4) {
g_fp->_aniMan->_movement->setDynamicPhaseIndex(11);
g_vars->scene06_aimingBall = false;
return;
}
g_fp->_aniMan->_movement->setDynamicPhaseIndex(9);
}
g_vars->scene06_aimingBall = false;
}
void sceneHandler06_ballStartFly() {
if (g_vars->scene06_ballInHands) {
g_vars->scene06_flyingBall = g_vars->scene06_ballInHands;
g_vars->scene06_ballInHands = 0;
g_vars->scene06_flyingBall->show1(g_fp->_aniMan->_ox - 60, g_fp->_aniMan->_oy - 60, -1, 0);
g_vars->scene06_flyingBall->_priority = 27;
}
}
void sceneHandler06_throwCallback(int *arg) {
if (g_vars->scene06_aimingBall) {
int dist = (g_fp->_mouseVirtY - g_vars->scene06_sceneClickY)
* (g_fp->_mouseVirtY - g_vars->scene06_sceneClickY)
+ (g_fp->_mouseVirtX - g_vars->scene06_sceneClickX)
* (g_fp->_mouseVirtX - g_vars->scene06_sceneClickX);
*arg = (int)(sqrt((double)dist) * 0.1);
if (*arg > 8)
*arg = 8;
} else {
*arg = *arg + 1;
if (*arg == 12)
sceneHandler06_ballStartFly();
}
}
void sceneHandler06_throwBall() {
g_fp->_aniMan->_callback2 = sceneHandler06_throwCallback;
g_fp->_aniMan->startAnim(MV_MAN6_THROWBALL, 0, -1);
g_vars->scene06_aimingBall = true;
}
void sceneHandler06_eggieWalk() {
if (15 - g_vars->scene06_numBallsGiven >= 4 && !g_fp->_rnd.getRandomNumber(9)) {
StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_EGGIE, -1);
if (!ani || !(ani->_flags & 4)) {
if (g_vars->scene06_eggieDirection)
chainQueue(QU_EGG6_GOR, 0);
else
chainQueue(QU_EGG6_GOL, 0);
g_vars->scene06_eggieTimeout = 0;
g_vars->scene06_eggieDirection = !g_vars->scene06_eggieDirection;
}
}
}
void sceneHandler06_dropBall() {
if (g_vars->scene06_numBallsGiven >= 15 || g_vars->scene06_mumsyNumBalls >= 5)
g_vars->scene06_ballDrop->hide();
else
chainQueue(QU_SC6_DROPS3, 0);
}
void sceneHandler06_fallBall() {
g_vars->scene06_ballY = 475;
g_vars->scene06_flyingBall->setOXY(g_vars->scene06_ballX, g_vars->scene06_ballY);
MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC6_FALLBALL), 0, 1);
mq->setParamInt(-1, g_vars->scene06_flyingBall->_odelay);
mq->chain(0);
g_vars->scene06_balls.push_back(g_vars->scene06_flyingBall);
g_vars->scene06_flyingBall = 0;
sceneHandler06_dropBall();
sceneHandler06_eggieWalk();
}
void sceneHandler06_catchBall() {
if (g_vars->scene06_flyingBall) {
g_vars->scene06_flyingBall->hide();
g_vars->scene06_balls.push_back(g_vars->scene06_flyingBall);
g_vars->scene06_flyingBall = 0;
g_vars->scene06_mumsyNumBalls++;
if (g_vars->scene06_mumsy->_movement) {
Common::Point point;
if (g_vars->scene06_mumsy->_movement->_id == MV_MOM_JUMPFW) {
if (g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex <= 5) {
point = g_vars->scene06_mumsy->_movement->calcSomeXY(0, g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex);
point.x = -point.x;
point.y = -point.y;
} else {
point = g_vars->scene06_mumsy->_movement->calcSomeXY(1, -1);
g_vars->scene06_mumsyPos++;
}
} else if (g_vars->scene06_mumsy->_movement->_id == MV_MOM_JUMPBK) {
if (g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex <= 4) {
point = g_vars->scene06_mumsy->_movement->calcSomeXY(0, g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex);
point.x = -point.x;
point.y = -point.y;
} else {
point = g_vars->scene06_mumsy->_movement->calcSomeXY(1, -1);
g_vars->scene06_mumsyPos--;
}
}
g_vars->scene06_mumsy->changeStatics2(ST_MOM_STANDS);
g_vars->scene06_mumsy->setOXY(point.x + g_vars->scene06_mumsy->_ox,
point.y + g_vars->scene06_mumsy->_oy);
} else {
g_vars->scene06_mumsy->changeStatics2(ST_MOM_STANDS);
}
chainQueue(QU_MOM_PUTBALL, 1);
g_vars->scene06_mumsyGotBall = true;
sceneHandler06_dropBall();
}
}
void sceneHandler06_checkBallTarget(int par) {
if (g_vars->scene06_ballY <= 475) {
if (g_vars->scene06_mumsy->isPixelHitAtPos(g_vars->scene06_ballX, g_vars->scene06_ballY)) {
chainObjQueue(g_vars->scene06_mumsy, QU_MOM_JUMPBK, 0);
sceneHandler06_catchBall();
}
} else {
sceneHandler06_fallBall();
}
}
void scene06_initScene(Scene *sc) {
g_vars->scene06_mumsy = sc->getStaticANIObject1ById(ANI_MAMASHA, -1);
g_vars->scene06_someBall = 0;
g_vars->scene06_invHandle = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
g_vars->scene06_liftButton = sc->getStaticANIObject1ById(ANI_BUTTON_6, -1);
g_vars->scene06_ballDrop = sc->getStaticANIObject1ById(ANI_BALLDROP, -1);
g_vars->scene06_arcadeEnabled = false;
g_vars->scene06_aimingBall = false;
g_vars->scene06_currentBall = 0;
g_vars->scene06_ballInHands = 0;
g_vars->scene06_flyingBall = 0;
g_vars->scene06_balls.clear();
g_vars->scene06_numBallsGiven = 0;
g_vars->scene06_mumsyNumBalls = 0;
g_vars->scene06_eggieTimeout = 0;
g_vars->scene06_eggieDirection = true;
StaticANIObject *ball = sc->getStaticANIObject1ById(ANI_NEWBALL, -1);
ball->hide();
ball->_statics = ball->getStaticsById(ST_NBL_NORM);
g_vars->scene06_balls.push_back(ball);
for (int i = 0; i < 3; i++) {
StaticANIObject *ball2 = new StaticANIObject(ball);
ball2->hide();
ball2->_statics = ball2->getStaticsById(ST_NBL_NORM);
sc->addStaticANIObject(ball2, 1);
g_vars->scene06_balls.push_back(ball2);
}
if (g_fp->getObjectState(sO_BigMumsy) == g_fp->getObjectEnumState(sO_BigMumsy, sO_IsPlaying))
g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping));
if (g_fp->getObjectState(sO_BigMumsy) != g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping))
g_vars->scene06_mumsy->hide();
g_fp->lift_setButton(sO_Level3, ST_LBN_3N);
g_fp->lift_init(sc, QU_SC6_ENTERLIFT, QU_SC6_EXITLIFT);
g_fp->initArcadeKeys("SC_6");
sceneHandler06_setExits(sc);
g_fp->setArcadeOverlay(PIC_CSR_ARCADE2);
}
int sceneHandler06(ExCommand *ex) {
if (ex->_messageKind != 17)
return 0;
switch(ex->_messageNum) {
case MSG_LIFT_CLOSEDOOR:
g_fp->lift_closedoorSeq();
break;
case MSG_LIFT_EXITLIFT:
g_fp->lift_exitSeq(ex);
break;
case MSG_CMN_WINARCADE:
sceneHandler06_winArcade();
break;
case MSG_LIFT_STARTEXITQUEUE:
g_fp->lift_startExitQueue();
break;
case MSG_SC6_RESTORESCROLL:
g_fp->_aniMan2 = g_fp->_aniMan;
getCurrSceneSc2MotionController()->activate();
getGameLoaderInteractionController()->enableFlag24();
sceneHandler06_setExits(g_fp->_currentScene);
break;
case MSG_SC6_STARTDROPS:
if (g_fp->getObjectState(sO_BigMumsy) == g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping))
sceneHandler06_enableDrops();
break;
case MSG_SC6_TESTNUMBALLS:
g_vars->scene06_mumsyGotBall = false;
if (g_vars->scene06_mumsyNumBalls < 5 || !g_vars->scene06_arcadeEnabled)
return 0;
sceneHandler06_mumsyBallTake();
break;
case MSG_SC6_JUMPFW:
++g_vars->scene06_mumsyPos;
break;
case MSG_SC6_JUMPBK:
--g_vars->scene06_mumsyPos;
break;
case MSG_LIFT_CLICKBUTTON:
g_fp->lift_clickButton();
break;
case MSG_SPINHANDLE:
sceneHandler06_spinHandle();
break;
case MSG_LIFT_GO:
g_fp->lift_goAnimation();
break;
case MSG_SC6_UTRUBACLICK:
sceneHandler06_uPipeClick();
break;
case MSG_SC6_BTNPUSH:
sceneHandler06_buttonPush();
break;
case MSG_SC6_SHOWNEXTBALL:
sceneHandler06_showNextBall();
break;
case MSG_SC6_INSTHANDLE:
sceneHandler06_installHandle();
break;
case MSG_SC6_ENABLEDROPS:
sceneHandler06_enableDrops();
break;
case 64:
g_fp->lift_hoverButton(ex);
break;
case MSG_SC6_TAKEBALL:
sceneHandler06_takeBall();
break;
case 30:
if (g_vars->scene06_aimingBall) {
sceneHandler06_aiming();
break;
}
if (!g_vars->scene06_arcadeEnabled) {
// Do nothing
break;
}
break;
case 29:
{
StaticANIObject *st = g_fp->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY);
if (st) {
if (!g_vars->scene06_arcadeEnabled && st->_id == ANI_LIFTBUTTON) {
g_fp->lift_animateButton(st);
ex->_messageKind = 0;
return 0;
}
if (g_vars->scene06_currentBall == st) {
if (g_vars->scene06_numBallsGiven == 1)
sceneHandler06_takeBall();
ex->_messageKind = 0;
} else if (g_vars->scene06_ballInHands && g_fp->_aniMan == st && !g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN6_BALL) {
g_vars->scene06_sceneClickX = ex->_sceneClickX;
g_vars->scene06_sceneClickY = ex->_sceneClickY;
sceneHandler06_throwBall();
}
}
if (!st || !canInteractAny(g_fp->_aniMan, st, ex->_param)) {
int picId = g_fp->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY);
PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
if (!pic || !canInteractAny(g_fp->_aniMan, pic, ex->_param)) {
if ((g_fp->_sceneRect.right - ex->_sceneClickX < 47
&& g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
|| (ex->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
g_fp->processArcade(ex);
return 0;
}
}
}
}
break;
case 33:
{
int res = 0;
if (g_fp->_aniMan2) {
int ox = g_fp->_aniMan2->_ox;
int oy = g_fp->_aniMan2->_oy;
g_vars->scene06_manX = ox;
g_vars->scene06_manY = oy;
if (g_vars->scene06_arcadeEnabled && oy <= 470 && ox >= 1088) {
if (ox < g_fp->_sceneRect.left + 600) {
g_fp->_currentScene->_x = ox - g_fp->_sceneRect.left - 700;
ox = g_vars->scene06_manX;
}
if (ox > g_fp->_sceneRect.right - 50)
g_fp->_currentScene->_x = ox - g_fp->_sceneRect.right + 70;
} else {
if (ox < g_fp->_sceneRect.left + 200) {
g_fp->_currentScene->_x = ox - g_fp->_sceneRect.left - 300;
ox = g_vars->scene06_manX;
}
if (ox > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = ox - g_fp->_sceneRect.right + 300;
}
res = 1;
g_fp->sceneAutoScrolling();
}
if (g_vars->scene06_arcadeEnabled) {
if (g_vars->scene06_mumsyPos > -3)
g_vars->scene06_mumsyJumpBk->_percent = g_vars->scene06_mumsyJumpBkPercent;
else
g_vars->scene06_mumsyJumpBk->_percent = 0;
if (g_vars->scene06_mumsyPos < 4)
g_vars->scene06_mumsyJumpFw->_percent = g_vars->scene06_mumsyJumpFwPercent;
else
g_vars->scene06_mumsyJumpFw->_percent = 0;
if (g_vars->scene06_aimingBall) {
g_vars->scene06_eggieTimeout++;
if (g_vars->scene06_eggieTimeout >= 600)
sceneHandler06_eggieWalk();
}
} else {
g_vars->scene06_mumsyJumpFw->_percent = 0;
g_vars->scene06_mumsyJumpBk->_percent = 0;
}
if (g_vars->scene06_flyingBall) {
g_vars->scene06_ballX = g_vars->scene06_flyingBall->_ox - g_vars->scene06_ballDeltaX;
g_vars->scene06_ballY = g_vars->scene06_flyingBall->_oy - g_vars->scene06_ballDeltaY;
g_vars->scene06_flyingBall->setOXY(g_vars->scene06_ballX, g_vars->scene06_ballY);
if (g_vars->scene06_ballDeltaX >= 2)
g_vars->scene06_ballDeltaX -= 2;
g_vars->scene06_ballDeltaY -= 5;
sceneHandler06_checkBallTarget(g_vars->scene06_ballDeltaX);
}
if (g_vars->scene06_arcadeEnabled
&& !g_vars->scene06_currentBall
&& !g_vars->scene06_ballInHands
&& !g_vars->scene06_flyingBall
&& g_vars->scene06_numBallsGiven >= 15
&& !g_vars->scene06_ballDrop->_movement
&& !g_vars->scene06_mumsy->_movement
&& !g_vars->scene06_mumsyGotBall)
sceneHandler06_mumsyBallTake();
g_fp->_behaviorManager->updateBehaviors();
g_fp->startSceneTrack();
return res;
}
break;
default:
break;
}
return 0;
}
} // End of namespace Fullpipe