diff options
Diffstat (limited to 'engines/fullpipe/scenes')
-rw-r--r-- | engines/fullpipe/scenes/scene18and19.cpp | 537 | ||||
-rw-r--r-- | engines/fullpipe/scenes/scene29.cpp | 1125 |
2 files changed, 1519 insertions, 143 deletions
diff --git a/engines/fullpipe/scenes/scene18and19.cpp b/engines/fullpipe/scenes/scene18and19.cpp index ea816bb5d1..4f6677876b 100644 --- a/engines/fullpipe/scenes/scene18and19.cpp +++ b/engines/fullpipe/scenes/scene18and19.cpp @@ -48,6 +48,9 @@ struct Swinger { int sfield_24; }; + +#define ANGLE(x) ((x) * M_PI / 180) + void scene18_preload() { g_fp->_scene3 = 0; @@ -82,29 +85,29 @@ void scene19_setSugarState(Scene *sc) { void scene19_setMovements(Scene *sc, int entranceId) { if (entranceId == TrubaRight) { - g_vars->scene18_var15 = 1; + g_vars->scene18_enteredTrubaRight = true; } else { - g_vars->scene18_var15 = 0; - g_vars->scene19_var05 = (entranceId == PIC_SC19_RTRUBA3); + g_vars->scene18_enteredTrubaRight = false; + g_vars->scene19_enteredTruba3 = (entranceId == PIC_SC19_RTRUBA3); } - for (uint i = 0; i < g_vars->scene18_var07.size(); i++) { - if (!g_vars->scene18_var15 && (g_vars->scene18_var07[i]->sflags & 0x20)) { + for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) { + if (!g_vars->scene18_enteredTrubaRight && (g_vars->scene18_swingers[i]->sflags & 0x20)) { Scene *oldsc = g_fp->_currentScene; - g_vars->scene18_var07[i]->sflags = 1; + g_vars->scene18_swingers[i]->sflags = 1; g_fp->_currentScene = sc; - g_vars->scene18_var07[i]->ani->changeStatics2(ST_KSL_NORM); - g_vars->scene18_var07[i]->ani->_priority = 30; + g_vars->scene18_swingers[i]->ani->changeStatics2(ST_KSL_NORM); + g_vars->scene18_swingers[i]->ani->_priority = 30; g_fp->_currentScene = oldsc; } - sc->deleteStaticANIObject(g_vars->scene18_var07[i]->ani); + sc->deleteStaticANIObject(g_vars->scene18_swingers[i]->ani); } if (g_vars->scene18_whirlgig->_movement) { - g_vars->scene18_var09 = g_vars->scene18_whirlgig->_movement->_currDynamicPhaseIndex + 1; + g_vars->scene18_whirlgigMovMum = g_vars->scene18_whirlgig->_movement->_currDynamicPhaseIndex + 1; int mx; @@ -113,10 +116,10 @@ void scene19_setMovements(Scene *sc, int entranceId) { else mx = g_vars->scene18_whirlgig->_movement->_dynamicPhases.size(); - if (g_vars->scene18_var09 > mx - 1) - g_vars->scene18_var09 = -1; + if (g_vars->scene18_whirlgigMovMum > mx - 1) + g_vars->scene18_whirlgigMovMum = -1; } else { - g_vars->scene18_var09 = 0; + g_vars->scene18_whirlgigMovMum = 0; } sc->deleteStaticANIObject(g_vars->scene18_boy); @@ -137,7 +140,7 @@ void scene19_preload() { void scene18_setupSwingers(StaticANIObject *ani, Scene *sc) { Swinger *swinger; - g_vars->scene18_var07.clear(); + g_vars->scene18_swingers.clear(); Scene *oldsc = g_fp->_currentScene; g_fp->_currentScene = sc; @@ -145,9 +148,9 @@ void scene18_setupSwingers(StaticANIObject *ani, Scene *sc) { for (int i = 0; i < 8; i++) { swinger = new Swinger; - swinger->angle = (double)i * M_PI / 4.0; - swinger->sx = g_vars->scene18_var20 - (int)(cos(swinger->angle) * -575.0); - swinger->sy = g_vars->scene18_var04 - (int)(sin(swinger->angle) * -575.0) + 87; + swinger->angle = (double)i * ANGLE(45); + swinger->sx = g_vars->scene18_wheelCenterX - (int)(cos(swinger->angle) * -575.0); + swinger->sy = g_vars->scene18_wheelCenterY - (int)(sin(swinger->angle) * -575.0) + 87; swinger->ix = swinger->sx; swinger->iy = swinger->sy; @@ -162,27 +165,25 @@ void scene18_setupSwingers(StaticANIObject *ani, Scene *sc) { sc->addStaticANIObject(newani, 1); } else { swinger->ani = ani; - swinger->sflags = g_vars->scene18_var03 != 0 ? 4 : 1; + swinger->sflags = g_vars->scene18_girlIsSwinging ? 4 : 1; } ani->_statics = ani->getStaticsById(ST_KSL_NORM); - ani->_movement = 0; + //ani->_movement = 0; ani->setOXY(swinger->sx, swinger->sy); ani->_priority = 30; ani->_flags |= 4; - if (swinger->sflags & 2) { + if (swinger->sflags & 2) ani->startAnim(MV_KSL_SWINGBOY, 0, -1); - } else { - if (swinger->sflags & 4) - ani->startAnim(MV_KSL_SWINGGIRL, 0, -1); - else - ani->startAnim(MV_KSL_SWING, 0, -1); - } + else if (swinger->sflags & 4) + ani->startAnim(MV_KSL_SWINGGIRL, 0, -1); + else + ani->startAnim(MV_KSL_SWING, 0, -1); ani->_movement->setDynamicPhaseIndex(g_fp->_rnd->getRandomNumber(17)); - g_vars->scene18_var07.push_back(swinger); + g_vars->scene18_swingers.push_back(swinger); } g_fp->_currentScene = oldsc; @@ -191,63 +192,63 @@ void scene18_setupSwingers(StaticANIObject *ani, Scene *sc) { void scene18_initScene1(Scene *sc) { PicAniInfo info; - int oldx = g_vars->scene18_var20; - int oldy = g_vars->scene18_var04; + int oldx = g_vars->scene18_wheelCenterX; + int oldy = g_vars->scene18_wheelCenterY; - g_vars->scene18_var03 = (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)); + g_vars->scene18_girlIsSwinging = (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)); if (sc->_sceneId == SC_18) { g_vars->scene18_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLIGIG_18, -1); - g_vars->scene18_var20 = 1032; - g_vars->scene18_var04 = -318; + g_vars->scene18_wheelCenterX = 1032; + g_vars->scene18_wheelCenterY = -318; } else { g_vars->scene18_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLGIG_19, -1); - g_vars->scene18_var20 = 1024; - g_vars->scene18_var04 = 242; + g_vars->scene18_wheelCenterX = 1024; + g_vars->scene18_wheelCenterY = 242; } - int newx = g_vars->scene18_var20 - oldx; - int newy = g_vars->scene18_var04 - oldy; + int newx = g_vars->scene18_wheelCenterX - oldx; + int newy = g_vars->scene18_wheelCenterY - oldy; - g_vars->scene18_var29 += newx; - g_vars->scene18_var30 += newy; - g_vars->scene18_var05 += newx; - g_vars->scene18_var06 += newy; + g_vars->scene18_boyJumpX += newx; + g_vars->scene18_boyJumpY += newy; + g_vars->scene18_girlJumpX += newx; + g_vars->scene18_girlJumpY += newy; - for (uint i = 0; i < g_vars->scene18_var07.size(); i++) { - g_vars->scene18_var07[i]->ani->getPicAniInfo(&info); - sc->addStaticANIObject(g_vars->scene18_var07[i]->ani, 1); - g_vars->scene18_var07[i]->ani->setPicAniInfo(&info); + for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) { + g_vars->scene18_swingers[i]->ani->getPicAniInfo(&info); + sc->addStaticANIObject(g_vars->scene18_swingers[i]->ani, 1); + g_vars->scene18_swingers[i]->ani->setPicAniInfo(&info); - g_vars->scene18_var07[i]->sx += newx; - g_vars->scene18_var07[i]->sy += newy; - g_vars->scene18_var07[i]->ix += newx; - g_vars->scene18_var07[i]->iy += newy; + g_vars->scene18_swingers[i]->sx += newx; + g_vars->scene18_swingers[i]->sy += newy; + g_vars->scene18_swingers[i]->ix += newx; + g_vars->scene18_swingers[i]->iy += newy; GameObject *go; - if (g_vars->scene18_var07[i]->ani->_movement) - go = g_vars->scene18_var07[i]->ani->_movement; + if (g_vars->scene18_swingers[i]->ani->_movement) + go = g_vars->scene18_swingers[i]->ani->_movement; else - go = g_vars->scene18_var07[i]->ani; + go = g_vars->scene18_swingers[i]->ani; go->setOXY(newx + go->_ox, newy + go->_oy); } - if (g_vars->scene18_var08 && g_vars->scene18_var09 != -1) { + if (g_vars->scene18_bridgeIsConvoluted && g_vars->scene18_whirlgigMovMum != -1) { g_vars->scene18_whirlgig->startAnim(sc->_sceneId != SC_18 ? MV_WHR19_SPIN : MV_WHR18_SPIN, 0, -1); - g_vars->scene18_whirlgig->_movement->setDynamicPhaseIndex(g_vars->scene18_var09); + g_vars->scene18_whirlgig->_movement->setDynamicPhaseIndex(g_vars->scene18_whirlgigMovMum); } int sndid; if (sc->_sceneId == SC_19) { - if (g_vars->scene18_var08) + if (g_vars->scene18_bridgeIsConvoluted) sndid = SND_19_015; else sndid = SND_19_016; } else { - if (g_vars->scene18_var08) + if (g_vars->scene18_bridgeIsConvoluted) sndid = SND_18_006; else sndid = SND_18_010; @@ -285,85 +286,77 @@ void scene18_initScene1(Scene *sc) { g_vars->scene18_girl->setOXY(newx + x, newy + y); - g_vars->scene18_var12 = 0; - g_vars->scene18_var13 = -1; - g_vars->scene18_var14 = -1; + g_vars->scene18_wheelFlipper = false; + g_vars->scene18_jumpDistance = -1; + g_vars->scene18_jumpAngle = -1; - if (g_vars->scene18_var15) { + if (g_vars->scene18_enteredTrubaRight) { if (sc->_sceneId == SC_19) g_fp->_aniMan2 = 0; else - g_fp->_aniMan2 = g_vars->scene18_var07[g_vars->scene18_var27]->ani; + g_fp->_aniMan2 = g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani; } else { g_fp->_aniMan2 = g_fp->_aniMan; } } void scene18_initScene2(Scene *sc) { - g_vars->scene18_var16 = 200; - g_vars->scene18_var17 = 200; - g_vars->scene18_var18 = 300; - g_vars->scene18_var19 = 300; g_vars->scene18_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLIGIG_18, -1); - g_vars->scene18_var20 = 1032; - g_vars->scene18_var04 = -318; + g_vars->scene18_wheelCenterX = 1032; + g_vars->scene18_wheelCenterY = -318; StaticANIObject *armchair = sc->getStaticANIObject1ById(ANI_KRESLO, -1); armchair->loadMovementsPixelData(); - g_vars->scene18_var03 = (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)); + g_vars->scene18_girlIsSwinging = (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)); if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Convoluted)) { - g_vars->scene18_var08 = 1; + g_vars->scene18_bridgeIsConvoluted = true; g_fp->playSound(SND_18_006, 1); } else { - g_vars->scene18_var08 = 0; + g_vars->scene18_bridgeIsConvoluted = false; g_fp->playSound(SND_18_010, 1); } scene18_setupSwingers(armchair, sc); - g_vars->scene18_var21 = 0; - g_vars->scene18_var12 = 0; - g_vars->scene18_var22 = 1; - g_vars->scene18_var23 = -1; - g_vars->scene18_var24 = 0; - g_vars->scene18_var25 = 0; - g_vars->scene18_var26 = 1; - g_vars->scene18_var27 = -1; - g_vars->scene18_var13 = -1; - g_vars->scene18_var14 = -1; - g_vars->scene18_var28 = 0; - g_vars->scene18_var15 = 0; + g_vars->scene18_rotationCounter = 0; + g_vars->scene18_wheelFlipper = false; + g_vars->scene18_wheelIsTurning = true; + g_vars->scene18_kidIsOnWheel = -1; + g_vars->scene18_boyIsOnWheel = 0; + g_vars->scene18_girlIsOnWheel = 0; + g_vars->scene18_boyJumpedOff = true; + g_vars->scene18_manWheelPosTo = -1; + g_vars->scene18_jumpDistance = -1; + g_vars->scene18_jumpAngle = -1; + g_vars->scene18_manIsReady = false; + g_vars->scene18_enteredTrubaRight = 0; g_vars->scene18_boy = sc->getStaticANIObject1ById(ANI_BOY18, -1); g_vars->scene18_girl = sc->getStaticANIObject1ById(ANI_GIRL18, -1); g_vars->scene18_domino = sc->getStaticANIObject1ById(ANI_DOMINO_18, -1); - g_vars->scene18_var29 = 290; - g_vars->scene18_var30 = -363; - g_vars->scene18_var05 = 283; - g_vars->scene18_var06 = -350; + g_vars->scene18_boyJumpX = 290; + g_vars->scene18_boyJumpY = -363; + g_vars->scene18_girlJumpX = 283; + g_vars->scene18_girlJumpY = -350; g_fp->initArcadeKeys("SC_18"); } void scene19_initScene2() { g_fp->_aniMan2 = 0; - g_vars->scene19_var01 = 200; - g_vars->scene19_var02 = 200; - g_vars->scene19_var03 = 300; - g_vars->scene19_var04 = 300; } int scene18_updateCursor() { - if (g_vars->scene18_var15) { + if (g_vars->scene18_enteredTrubaRight) { g_fp->_cursorId = PIC_CSR_DEFAULT; } else { g_fp->updateCursorCommon(); if (g_fp->_cursorId == PIC_CSR_ITN) { if (g_fp->_objectIdAtCursor == PIC_SC18_LADDER1) { - g_fp->_cursorId = (g_vars->scene18_var11 <= 250) ? PIC_CSR_GOD : PIC_CSR_GOU; + g_fp->_cursorId = (g_vars->scene18_manY <= 250) ? PIC_CSR_GOD : PIC_CSR_GOU; } else if (g_fp->_objectIdAtCursor == PIC_SC18_LADDER2 || g_fp->_objectIdAtCursor == PIC_SC18_LADDER3) { g_fp->_cursorId = PIC_CSR_GOU; } @@ -379,64 +372,316 @@ int scene19_updateCursor() { g_fp->updateCursorCommon(); if (g_fp->_objectIdAtCursor == PIC_SC19_RTRUBA31) - g_fp->_cursorId = g_vars->scene19_var05 != 0 ? PIC_CSR_GOR : PIC_CSR_DEFAULT; + g_fp->_cursorId = g_vars->scene19_enteredTruba3 ? PIC_CSR_GOR : PIC_CSR_DEFAULT; return g_fp->_cursorId; } void sceneHandler18_clickBoard() { - warning("STUB: sceneHandler18_clickBoard()"); + if (ABS(967 - g_fp->_aniMan->_ox) > 1 || ABS(379 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { + MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 967, 379, 1, ST_MAN_RIGHT); + ExCommand *ex = new ExCommand(0, 17, MSG_SC18_MANREADY, 0, 0, 0, 1, 0, 0, 0); + + ex->_excFlags = 2; + + mq->addExCommandToEnd(ex); + + postExCommand(g_fp->_aniMan->_id, 2, 967, 379, 0, -1); + } else { + g_vars->scene18_manIsReady = true; + } } -void sceneHandler18and19_showManJump() { +void sceneHandler18_showManJumpTo() { g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT); g_fp->_aniMan->_flags &= 0xFFFB; g_fp->_aniMan->_flags &= 0xFEFF; - g_vars->scene18_var07[g_vars->scene18_var27]->sflags = 0x20; + g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->sflags = 0x20; - g_vars->scene18_var07[g_vars->scene18_var27]->ani->changeStatics2(ST_KSL_JUMPMAN); - g_vars->scene18_var07[g_vars->scene18_var27]->ani->startAnim(MV_KSL_INMAN, 0, -1); - g_vars->scene18_var07[g_vars->scene18_var27]->ani->_priority = 20; + g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani->changeStatics2(ST_KSL_JUMPMAN); + g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani->startAnim(MV_KSL_INMAN, 0, -1); + g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani->_priority = 20; - g_vars->scene18_var28 = 0; - g_vars->scene18_var15 = 1; + g_vars->scene18_manIsReady = false; + g_vars->scene18_enteredTrubaRight = true; - g_fp->_aniMan2 = g_vars->scene18_var07[g_vars->scene18_var27]->ani; + g_fp->_aniMan2 = g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani; } -void sceneHandler18_showManJumpTo() { - warning("STUB: sceneHandler18_showManJumpTo()"); +void sceneHandler18and19_showManJump() { + int x, y; + + if (g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_movement) { + x = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_movement->_ox; + y = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_movement->_oy; + } else { + x = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_ox; + y = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_oy; + } + + g_fp->_aniMan->show1(x + 62, y + 5, MV_MAN18_JUMPTOTRUBA, 0); + g_fp->_aniMan->_priority = 35; + + int mqid = 0; + + if (g_vars->scene18_jumpDistance == 1) { + mqid = QU_SC19_MANJUMP1; + } else if (g_vars->scene18_jumpDistance == 2) { + mqid = QU_SC19_MANJUMP2; + } else if (g_vars->scene18_jumpDistance == 3) { + mqid = QU_SC19_MANJUMP3; + } + + if (mqid) { + MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(mqid), 0, 0); + + g_fp->_aniMan2 = g_fp->_aniMan; + g_vars->scene18_enteredTrubaRight = false; + + mq->setFlags(mq->getFlags() | 1); + mq->chain(0); + } + + g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->sflags = 1; + + g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->changeStatics2(ST_KSL_NORM); + g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_priority = 30; } void sceneHandler18and19_showGirlJumpTo() { - warning("STUB: sceneHandler18and19_showGirlJumpTo()"); + g_vars->scene18_girl->stopAnim_maybe(); + g_vars->scene18_girl->hide(); + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->sflags = 4; + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->changeStatics2(ST_KSL_JUMPGIRL); + g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->startAnim(MV_KSL_INGIRL, 0, -1); + + g_vars->scene18_kidIsOnWheel--; + g_vars->scene18_girlIsOnWheel--; } void sceneHandler18and19_showGirlJump() { - warning("STUB: sceneHandler18and19_showGirlJump()"); + StaticANIObject *ani = g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani; + int x, y; + + if (ani->_movement) { + x = ani->_movement->_ox; + y = ani->_movement->_oy; + } else { + x = ani->_ox; + y = ani->_oy; + } + + g_vars->scene18_girl->show1(x - 62, y - 10, MV_GRL18_JUMPFROM, 0); + g_vars->scene18_girl->_priority = 50; + g_vars->scene18_girl->startAnim(MV_GRL18_JUMPFROM, 0, -1); + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->sflags = 1; + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->changeStatics2(ST_KSL_REACT); + g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->startAnim(MV_KSL_CALMDOWN, 0, -1); + + g_vars->scene18_kidIsOnWheel = 1; + g_vars->scene18_girlIsOnWheel++; } void sceneHandler18and19_showBoyJumpTo() { - warning("STUB: sceneHandler18and19_showBoyJumpTo()"); + g_vars->scene18_boy->stopAnim_maybe(); + g_vars->scene18_boy->hide(); + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->sflags = 2; + g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->changeStatics2(ST_KSL_JUMPBOY); + g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->startAnim(MV_KSL_INBOY, 0, -1); + + g_vars->scene18_kidIsOnWheel--; + g_vars->scene18_boyIsOnWheel--; } void sceneHandler18and19_showBoyJump() { - warning("STUB: sceneHandler18and19_showBoyJump()"); + StaticANIObject *ani = g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani; + int x, y; + + if (ani->_movement) { + x = ani->_movement->_ox; + y = ani->_movement->_oy; + } else { + x = ani->_ox; + y = ani->_oy; + } + + g_vars->scene18_boy->show1(x - 48, y + 8, MV_BOY18_JUMPFROM, 0); + g_vars->scene18_boy->_priority = 50; + g_vars->scene18_boy->startAnim(MV_BOY18_JUMPFROM, 0, -1); + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->sflags = 1; + + g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->changeStatics2(ST_KSL_REACT); + g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->startAnim(MV_KSL_CALMDOWN, 0, -1); + + g_vars->scene18_boyJumpedOff = true; } void sceneHandler18and19_boyJumpTo() { g_vars->scene18_boy->stopAnim_maybe(); - g_vars->scene18_boy->show1(g_vars->scene18_var29, g_vars->scene18_var30, MV_BOY18_JUMPTO, 0); + g_vars->scene18_boy->show1(g_vars->scene18_boyJumpX, g_vars->scene18_boyJumpY, MV_BOY18_JUMPTO, 0); g_vars->scene18_boy->_priority = 50; g_vars->scene18_boy->startAnim(MV_BOY18_JUMPTO, 0, -1); } +void sceneHandler18and19_girlJumpTo() { + g_vars->scene18_girl->stopAnim_maybe(); + g_vars->scene18_girl->show1(g_vars->scene18_girlJumpX, g_vars->scene18_girlJumpY, MV_GRL18_JUMPTO, 0); + g_vars->scene18_girl->_priority = 50; + g_vars->scene18_girl->startAnim(MV_GRL18_JUMPTO, 0, -1); +} + +void sceneHandler18and19_manStandArmchair() { + g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT); + g_fp->_aniMan->_flags |= 1; + g_fp->_aniMan->_priority = 35; + g_fp->_aniMan->startAnim(MV_MAN18_STANDKRESLO, 0, -1); +} + void sceneHandler18and19_drawRiders() { - warning("STUB: sceneHandler18and19_drawRiders()"); + g_vars->scene18_rotationCounter++; + + if (g_vars->scene18_rotationCounter >= 359) + g_vars->scene18_rotationCounter = 0; + + for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) { + Swinger *swinger = g_vars->scene18_swingers[i]; + + double oldangle = swinger->angle; + + swinger->angle += ANGLE(1); + + if (swinger->angle > ANGLE(360)) { + swinger->angle -= ANGLE(360); + oldangle -= ANGLE(360); + } + + int ix = g_vars->scene18_wheelCenterX - (int)(cos(swinger->angle) * -575.0); + int iy = g_vars->scene18_wheelCenterY - (int)(sin(swinger->angle) * -575.0) + 87; + + if (!g_vars->scene18_rotationCounter) { + ix = swinger->sx; + iy = swinger->sy; + swinger->angle = (double)i * ANGLE(45); + } + + if (swinger->ani->_movement) + swinger->ani->setOXY(ix - swinger->ix + swinger->ani->_movement->_ox, iy - swinger->iy + swinger->ani->_movement->_oy); + else + swinger->ani->setOXY(ix - swinger->ix + swinger->ani->_ox, iy - swinger->iy + swinger->ani->_oy); + + swinger->ix = ix; + swinger->iy = iy; + + if (!swinger->ani->_movement) { + int mv = 0; + + if (swinger->sflags & 2) { + mv = MV_KSL_SWINGBOY; + } else if (swinger->sflags & 4) { + mv = MV_KSL_SWINGGIRL; + } else if (swinger->sflags & 0x20) { + mv = MV_KSL_SWINGMAN; + } else if (swinger->sflags & 1) { + mv = MV_KSL_SWING; + } + + if (mv) + swinger->ani->startAnim(mv, 0, -1); + + if (swinger->ani->_movement) + swinger->ani->_movement->_counter = 0; + } + + if (g_vars->scene18_wheelIsTurning) { + if ((swinger->sflags & 2) && swinger->angle >= ANGLE(160) && oldangle < ANGLE(160)) { + swinger->sflags = 8; + swinger->ani->changeStatics2(ST_KSL_BOY); + swinger->ani->startAnim(MV_KSL_JUMPBOY, 0, -1); + g_vars->scene18_kidWheelPos = i; + } else if ((swinger->sflags & 4) && swinger->angle >= ANGLE(162) && oldangle < ANGLE(162)) { + swinger->sflags = 16; + swinger->ani->changeStatics2(ST_KSL_GIRL); + swinger->ani->startAnim(MV_KSL_JUMPGIRL, 0, -1); + g_vars->scene18_kidWheelPos = i; + } else if (g_vars->scene18_kidIsOnWheel) { + if (g_vars->scene18_boyIsOnWheel > 0 && (swinger->sflags & 1) && swinger->angle >= ANGLE(185) && oldangle < ANGLE(185)) { + g_vars->scene18_kidWheelPosTo = i; + sceneHandler18and19_boyJumpTo(); + } + } else if (g_vars->scene18_girlIsOnWheel > 0 && (swinger->sflags & 1) && swinger->angle >= ANGLE(187) && oldangle < ANGLE(187)) { + g_vars->scene18_kidWheelPosTo = i; + sceneHandler18and19_girlJumpTo(); + } + + if (swinger->angle >= ANGLE(200) && oldangle < ANGLE(200)) { + if (g_vars->scene18_boyJumpedOff) + g_vars->scene18_boyIsOnWheel++; + + g_vars->scene18_boyJumpedOff = false; + } + } + + if (g_vars->scene18_manIsReady && (swinger->sflags & 1) && swinger->angle >= ANGLE(83) && oldangle < ANGLE(83)) { + g_vars->scene18_manWheelPosTo = i; + sceneHandler18and19_manStandArmchair(); + } + + if (!g_vars->scene18_enteredTrubaRight) + continue; + + if ((int)i == g_vars->scene18_manWheelPosTo) { + if (swinger->angle >= ANGLE(170) && oldangle < ANGLE(170)) { + g_fp->_gameLoader->preloadScene(SC_18, TrubaRight); + } else if (swinger->angle >= ANGLE(25) && oldangle < ANGLE(25)) { + g_fp->_gameLoader->preloadScene(SC_19, TrubaRight); + } else if (swinger->angle >= ANGLE(270) && oldangle < ANGLE(270)) { + g_fp->_sceneRect.translate(1200, 0); + } + } + + if (g_vars->scene18_jumpDistance > 0) { + if (swinger->sflags & 0x20) { + double newa = (double)g_vars->scene18_jumpAngle * ANGLE(1); + + if (newa <= swinger->angle && oldangle < newa) { + swinger->ani->changeStatics2(ST_KSL_MAN); + swinger->ani->startAnim(MV_KSL_JUMPMAN, 0, -1); + swinger->ani->_priority = 35; + + g_vars->scene18_manWheelPos = i; + } + } + } + } } void sceneHandler18and19_animateRiders() { - warning("STUB: sceneHandler18and19_animateRiders()"); + for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) { + Swinger *swinger = g_vars->scene18_swingers[i]; + + if (!swinger->ani->_movement) { + int mv = 0; + + if (swinger->sflags & 2) + mv = MV_KSL_SWINGBOY; + else if (swinger->sflags & 4) + mv = MV_KSL_SWINGGIRL; + else if (swinger->sflags & 0x20) + mv = MV_KSL_SWINGMAN; + + if (mv) + swinger->ani->startAnim(mv, 0, -1); + + if (swinger->ani->_movement) + swinger->ani->_movement->_counter = 0; + } + } } int sceneHandler18(ExCommand *cmd) { @@ -457,7 +702,7 @@ int sceneHandler18(ExCommand *cmd) { break; case MSG_SC18_MANREADY: - g_vars->scene18_var28 = 1; + g_vars->scene18_manIsReady = true; break; case MSG_SC18_SHOWMANJUMPTO: @@ -482,8 +727,9 @@ int sceneHandler18(ExCommand *cmd) { case 29: { - if (g_vars->scene18_var15) { + if (g_vars->scene18_enteredTrubaRight) { cmd->_messageKind = 0; + break; } @@ -498,6 +744,7 @@ int sceneHandler18(ExCommand *cmd) { if (!(g_fp->_aniMan->_flags & 0x100) && g_fp->_msgObjectId2 != g_vars->scene18_domino->_id) { handleObjectInteraction(g_fp->_aniMan, g_vars->scene18_domino, cmd->_keyCode); cmd->_messageKind = 0; + break; } } @@ -507,7 +754,7 @@ int sceneHandler18(ExCommand *cmd) { || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) { g_fp->processArcade(cmd); - g_vars->scene18_var28 = 0; + g_vars->scene18_manIsReady = false; break; } @@ -520,27 +767,28 @@ int sceneHandler18(ExCommand *cmd) { if (g_fp->_aniMan2) { int x = g_fp->_aniMan2->_ox; - g_vars->scene18_var11 = g_fp->_aniMan2->_oy; + g_vars->scene18_manY = g_fp->_aniMan2->_oy; - if (x < g_fp->_sceneRect.left + g_vars->scene18_var16) - g_fp->_currentScene->_x = x - g_vars->scene18_var18 - g_fp->_sceneRect.left; + if (x < g_fp->_sceneRect.left + 200) + g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left; - if (x > g_fp->_sceneRect.right - g_vars->scene18_var16) - g_fp->_currentScene->_x = x + g_vars->scene18_var18 - g_fp->_sceneRect.right; + if (x > g_fp->_sceneRect.right - 200) + g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right; } - if (g_vars->scene18_var28 && g_fp->_aniMan->_movement) - g_vars->scene18_var28 = 0; + if (g_vars->scene18_manIsReady && g_fp->_aniMan->_movement) + g_vars->scene18_manIsReady = false; - if (g_vars->scene18_var08) { - if (!g_vars->scene18_var12) + if (g_vars->scene18_bridgeIsConvoluted) { + if (!g_vars->scene18_wheelFlipper) sceneHandler18and19_drawRiders(); - g_vars->scene18_var12 = g_vars->scene18_var12 == 0; + g_vars->scene18_wheelFlipper = !g_vars->scene18_wheelFlipper; if (!g_vars->scene18_whirlgig->_movement) { g_vars->scene18_whirlgig->startAnim(MV_WHR18_SPIN, 0, -1); g_fp->_behaviorManager->updateBehaviors(); + break; } } else { @@ -548,6 +796,7 @@ int sceneHandler18(ExCommand *cmd) { } g_fp->_behaviorManager->updateBehaviors(); + break; } @@ -560,8 +809,8 @@ void sceneHandler19_updateNumRides() { if (numRides > 1) { g_fp->setObjectState(sO_Girl, g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)); - g_vars->scene18_var23 = 1; - g_vars->scene18_var25++; + g_vars->scene18_kidIsOnWheel = 1; + g_vars->scene18_girlIsOnWheel++; numRides = 0; } @@ -599,36 +848,36 @@ int sceneHandler19(ExCommand *cmd) { break; case 29: - if (g_vars->scene18_var15) { + if (g_vars->scene18_enteredTrubaRight) { switch (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY)) { case PIC_SC19_RTRUBA1: - g_vars->scene18_var13 = 1; - g_vars->scene18_var14 = 331; + g_vars->scene18_jumpDistance = 1; + g_vars->scene18_jumpAngle = 331; cmd->_messageKind = 0; break; case PIC_SC19_RTRUBA2: - g_vars->scene18_var13 = 2; - g_vars->scene18_var14 = 350; + g_vars->scene18_jumpDistance = 2; + g_vars->scene18_jumpAngle = 350; cmd->_messageKind = 0; break; case PIC_SC19_RTRUBA3: - g_vars->scene18_var13 = 3; - g_vars->scene18_var14 = 9; + g_vars->scene18_jumpDistance = 3; + g_vars->scene18_jumpAngle = 9; cmd->_messageKind = 0; break; default: - g_vars->scene18_var13 = -1; - g_vars->scene18_var14 = -1; + g_vars->scene18_jumpDistance = -1; + g_vars->scene18_jumpAngle = -1; cmd->_messageKind = 0; break; } break; } - if (g_vars->scene19_var05) { + if (g_vars->scene19_enteredTruba3) { if (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) == PIC_SC19_RTRUBA3) { if (g_fp->_aniMan->isIdle()) { if (!(g_fp->_aniMan->_flags & 0x100)) { @@ -646,25 +895,26 @@ int sceneHandler19(ExCommand *cmd) { if (g_fp->_aniMan2) { int x = g_fp->_aniMan2->_ox; - g_vars->scene18_var11 = g_fp->_aniMan2->_oy; + g_vars->scene18_manY = g_fp->_aniMan2->_oy; - if (x < g_fp->_sceneRect.left + g_vars->scene18_var16) - g_fp->_currentScene->_x = x - g_vars->scene18_var18 - g_fp->_sceneRect.left; + if (x < g_fp->_sceneRect.left + 200) + g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left; - if (x > g_fp->_sceneRect.right - g_vars->scene18_var16) - g_fp->_currentScene->_x = x + g_vars->scene18_var18 - g_fp->_sceneRect.right; + if (x > g_fp->_sceneRect.right - 200) + g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right; } - if (g_vars->scene18_var08) { - if (!g_vars->scene18_var12) + if (g_vars->scene18_bridgeIsConvoluted) { + if (!g_vars->scene18_wheelFlipper) sceneHandler18and19_drawRiders(); - g_vars->scene18_var12 = !g_vars->scene18_var12; + g_vars->scene18_wheelFlipper = !g_vars->scene18_wheelFlipper; if (!g_vars->scene18_whirlgig->_movement) { g_vars->scene18_whirlgig->startAnim(MV_WHR19_SPIN, 0, -1); g_fp->_behaviorManager->updateBehaviors(); + break; } } else { @@ -672,6 +922,7 @@ int sceneHandler19(ExCommand *cmd) { } g_fp->_behaviorManager->updateBehaviors(); + break; } diff --git a/engines/fullpipe/scenes/scene29.cpp b/engines/fullpipe/scenes/scene29.cpp new file mode 100644 index 0000000000..2d5127137d --- /dev/null +++ b/engines/fullpipe/scenes/scene29.cpp @@ -0,0 +1,1125 @@ +/* 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/objectnames.h" +#include "fullpipe/constants.h" + +#include "fullpipe/gameloader.h" +#include "fullpipe/motion.h" +#include "fullpipe/scenes.h" +#include "fullpipe/statics.h" + +#include "fullpipe/interaction.h" +#include "fullpipe/behavior.h" + + +namespace Fullpipe { + +struct WalkingBearder { + StaticANIObject *ani; + int wbflag; + int wbcounter; +}; + +void scene29_initScene(Scene *sc) { + g_vars->scene29_porter = sc->getStaticANIObject1ById(ANI_PORTER, -1); + g_vars->scene29_shooter1 = sc->getStaticANIObject1ById(ANI_SHOOTER1, -1); + g_vars->scene29_shooter2 = sc->getStaticANIObject1ById(ANI_SHOOTER2, -1); + g_vars->scene29_ass = sc->getStaticANIObject1ById(ANI_ASS, -1); + + g_vars->scene29_balls.numBalls = 0; + g_vars->scene29_balls.pTail = 0; + g_vars->scene29_balls.field_8 = 0; + g_vars->scene29_balls.pHead = 0; + + free(g_vars->scene29_balls.cPlex); + g_vars->scene29_balls.cPlex = 0; + + StaticANIObject *ani; + + g_vars->scene29_greenBalls.numBalls = 0; + g_vars->scene29_greenBalls.pTail = 0; + g_vars->scene29_greenBalls.field_8 = 0; + g_vars->scene29_greenBalls.pHead = 0; + + free(g_vars->scene29_greenBalls.cPlex); + g_vars->scene29_greenBalls.cPlex = 0; + + ani = sc->getStaticANIObject1ById(ANI_SHELL_GREEN, -1); + Ball *b = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0); + b->ani = ani; + + if (g_vars->scene29_balls.field_8) + g_vars->scene29_balls.field_8->p0 = b; + else + g_vars->scene29_balls.pHead = b; + + g_vars->scene29_balls.field_8 = b; + + for (int i = 0; i < 2; i++) { + StaticANIObject *newani = new StaticANIObject(ani); + + sc->addStaticANIObject(newani, 1); + + b = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0); + b->ani = ani; + + if (g_vars->scene29_balls.field_8) + g_vars->scene29_balls.field_8->p0 = b; + else + g_vars->scene29_balls.pHead = b; + + g_vars->scene29_balls.field_8 = b; + } + + g_vars->scene29_redBalls.numBalls = 0; + g_vars->scene29_redBalls.pTail = 0; + g_vars->scene29_redBalls.field_8 = 0; + g_vars->scene29_redBalls.pHead = 0; + + free(g_vars->scene29_redBalls.cPlex); + g_vars->scene29_redBalls.cPlex = 0; + + g_vars->scene29_flyingRedBalls.numBalls = 0; + g_vars->scene29_flyingRedBalls.pTail = 0; + g_vars->scene29_flyingRedBalls.field_8 = 0; + g_vars->scene29_flyingRedBalls.pHead = 0; + + free(g_vars->scene29_flyingRedBalls.cPlex); + g_vars->scene29_flyingRedBalls.cPlex = 0; + + ani = sc->getStaticANIObject1ById(ANI_SHELL_RED, -1); + + b = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0); + b->ani = ani; + + if (g_vars->scene29_redBalls.field_8) + g_vars->scene29_redBalls.field_8->p0 = b; + else + g_vars->scene29_redBalls.pHead = b; + + g_vars->scene29_redBalls.field_8 = b; + + for (int i = 0; i < 2; i++) { + StaticANIObject *newani = new StaticANIObject(ani); + + sc->addStaticANIObject(newani, 1); + + b = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0); + b->ani = ani; + + if (g_vars->scene29_redBalls.field_8) + g_vars->scene29_redBalls.field_8->p0 = b; + else + g_vars->scene29_redBalls.pHead = b; + + g_vars->scene29_redBalls.field_8 = b; + } + + g_vars->scene29_bearders.clear(); + + ani = new StaticANIObject(g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_BEARDED_CMN, -1)); + + ani->_statics = ani->getStaticsById(ST_BRDCMN_EMPTY); + + sc->addStaticANIObject(ani, 1); + + WalkingBearder *wb = new WalkingBearder; + + wb->ani = ani; + wb->wbflag = 0; + wb->wbcounter = 0; + + g_vars->scene29_bearders.push_back(wb); + + g_vars->scene29_manIsRiding = false; + g_vars->scene29_arcadeIsOn = false; + g_vars->scene29_reachedFarRight = false; + g_vars->scene29_rideBackEnabled = false; + g_vars->scene29_shootCountdown = 0; + g_vars->scene29_shootDistance = 75; + g_vars->scene29_manIsHit = false; + g_vars->scene29_scrollSpeed = 0; + g_vars->scene29_scrollingDisabled = false; + g_vars->scene29_hitBall = 0; + + g_fp->setArcadeOverlay(PIC_CSR_ARCADE8); +} + +void sceneHandler29_winArcade() { + if (g_vars->scene29_shooter2->_flags & 4) { + g_vars->scene29_shootCountdown = 0; + + g_vars->scene29_shooter1->changeStatics2(ST_STR1_STAND); + g_vars->scene29_shooter2->changeStatics2(ST_STR2_STAND); + + g_vars->scene29_shooter2->_flags &= 0xFFFB; + + StaticANIObject *ani; + Ball *newball, *ball, *oldp0; + + while (g_vars->scene29_greenBalls.numBalls) { + ball = g_vars->scene29_greenBalls.pHead; + ani = g_vars->scene29_greenBalls.pHead->ani; + oldp0 = g_vars->scene29_greenBalls.pHead->p0; + g_vars->scene29_greenBalls.pHead = g_vars->scene29_greenBalls.pHead->p0; + + if (g_vars->scene29_greenBalls.pHead) + oldp0->p1 = 0; + else + g_vars->scene29_greenBalls.field_8 = 0; + + ball->p0 = g_vars->scene29_greenBalls.pTail; + g_vars->scene29_greenBalls.pTail = ball; + g_vars->scene29_greenBalls.numBalls--; + + if (!g_vars->scene29_greenBalls.numBalls) + g_vars->scene29_greenBalls.reset(); + + ani->hide(); + + newball = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0); + newball->ani = ani; + + if (g_vars->scene29_balls.field_8) + g_vars->scene29_balls.field_8->p0 = newball; + else + g_vars->scene29_balls.pHead = newball; + + g_vars->scene29_balls.field_8 = newball; + } + + while (g_vars->scene29_flyingRedBalls.numBalls) { + ball = g_vars->scene29_flyingRedBalls.pHead; + ani = g_vars->scene29_flyingRedBalls.pHead->ani; + oldp0 = g_vars->scene29_flyingRedBalls.pHead->p0; + g_vars->scene29_flyingRedBalls.pHead = g_vars->scene29_flyingRedBalls.pHead->p0; + + if (g_vars->scene29_flyingRedBalls.pHead) + oldp0->p1 = 0; + else + g_vars->scene29_flyingRedBalls.field_8 = 0; + + ball->p0 = g_vars->scene29_flyingRedBalls.pTail; + g_vars->scene29_flyingRedBalls.pTail = ball; + g_vars->scene29_flyingRedBalls.numBalls--; + + if (!g_vars->scene29_flyingRedBalls.numBalls) { + g_vars->scene29_flyingRedBalls.numBalls = 0; + g_vars->scene29_flyingRedBalls.pTail = 0; + g_vars->scene29_flyingRedBalls.field_8 = 0; + g_vars->scene29_flyingRedBalls.pHead = 0; + + free(g_vars->scene29_flyingRedBalls.cPlex); + + g_vars->scene29_flyingRedBalls.cPlex = 0; + } + + ani->hide(); + + newball = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0); + newball->ani = ani; + + if (g_vars->scene29_redBalls.field_8) + g_vars->scene29_redBalls.field_8->p0 = newball; + else + g_vars->scene29_redBalls.pHead = newball; + + g_vars->scene29_redBalls.field_8 = newball; + } + + g_vars->scene29_ass->queueMessageQueue(0); + g_vars->scene29_ass->_flags &= 0xFFFB; + + chainQueue(QU_SC29_ESCAPE, 1); + } + + g_fp->setObjectState(sO_LeftPipe_29, g_fp->getObjectEnumState(sO_LeftPipe_29, sO_IsOpened)); +} + +void sceneHandler29_shootGreen() { + if (g_vars->scene29_balls.numBalls) { + int x = g_vars->scene29_shooter1->_ox - 113; + int y = g_vars->scene29_shooter1->_oy - 48; + StaticANIObject *ani = g_vars->scene29_balls.pHead->ani; + Ball *oldhead = g_vars->scene29_balls.pHead; + Ball *oldp0 = g_vars->scene29_balls.pHead->p0; + + g_vars->scene29_balls.pHead = g_vars->scene29_balls.pHead->p0; + + if (g_vars->scene29_balls.pHead) + oldp0->p1 = 0; + else + g_vars->scene29_balls.field_8 = 0; + + oldhead->p0 = g_vars->scene29_balls.pTail; + + g_vars->scene29_balls.pTail = oldhead; + g_vars->scene29_balls.numBalls--; + + if (!g_vars->scene29_balls.numBalls) { + g_vars->scene29_balls.numBalls = 0; + g_vars->scene29_balls.pTail = 0; + g_vars->scene29_balls.field_8 = 0; + g_vars->scene29_balls.pHead = 0; + + free(g_vars->scene29_balls.cPlex); + g_vars->scene29_balls.cPlex = 0; + } + + ani->show1(x, y, MV_SHG_NORM, 0); + ani->_priority = 5; + + Ball *runPtr = g_vars->scene29_greenBalls.pTail; + Ball *lastP = g_vars->scene29_greenBalls.field_8; + + if (!g_vars->scene29_greenBalls.pTail) { + g_vars->scene29_greenBalls.cPlex = (byte *)calloc(g_vars->scene29_greenBalls.cPlexLen, sizeof(Ball)); + + byte *p1 = g_vars->scene29_greenBalls.cPlex + (g_vars->scene29_greenBalls.cPlexLen - 1) * sizeof(Ball); + + if (g_vars->scene29_greenBalls.cPlexLen - 1 < 0) { + runPtr = g_vars->scene29_greenBalls.pTail; + } else { + runPtr = g_vars->scene29_greenBalls.pTail; + + for (int j = 0; j < g_vars->scene29_greenBalls.cPlexLen; j++) { + ((Ball *)p1)->p1 = runPtr; + runPtr = (Ball *)p1; + + p1 -= sizeof(Ball); + } + + g_vars->scene29_greenBalls.pTail = runPtr; + } + } + g_vars->scene29_greenBalls.pTail = runPtr->p0; + runPtr->p1 = lastP; + runPtr->p0 = 0; + runPtr->ani = ani; + + g_vars->scene29_greenBalls.numBalls++; + + if (g_vars->scene29_greenBalls.field_8) { + g_vars->scene29_greenBalls.field_8->p0 = runPtr; + g_vars->scene29_greenBalls.field_8 = runPtr; + } else { + g_vars->scene29_greenBalls.pHead = runPtr; + g_vars->scene29_greenBalls.field_8 = runPtr; + } + } +} + +void sceneHandler29_shootRed() { + if (g_vars->scene29_balls.numBalls) { + int x = g_vars->scene29_shooter1->_ox - 101; + int y = g_vars->scene29_shooter1->_oy - 14; + StaticANIObject *ani = g_vars->scene29_balls.pHead->ani; + Ball *oldhead = g_vars->scene29_balls.pHead; + Ball *oldp0 = g_vars->scene29_balls.pHead->p0; + + g_vars->scene29_balls.pHead = g_vars->scene29_balls.pHead->p0; + + if (g_vars->scene29_balls.pHead) + oldp0->p1 = 0; + else + g_vars->scene29_balls.field_8 = 0; + + oldhead->p0 = g_vars->scene29_balls.pTail; + + g_vars->scene29_balls.pTail = oldhead; + g_vars->scene29_balls.numBalls--; + + if (!g_vars->scene29_balls.numBalls) { + g_vars->scene29_balls.numBalls = 0; + g_vars->scene29_balls.pTail = 0; + g_vars->scene29_balls.field_8 = 0; + g_vars->scene29_balls.pHead = 0; + + free(g_vars->scene29_balls.cPlex); + g_vars->scene29_balls.cPlex = 0; + } + + ani->show1(x, y, MV_SHR_NORM, 0); + ani->_priority = 5; + + Ball *runPtr = g_vars->scene29_flyingRedBalls.pTail; + Ball *lastP = g_vars->scene29_flyingRedBalls.field_8; + + if (!g_vars->scene29_flyingRedBalls.pTail) { + g_vars->scene29_flyingRedBalls.cPlex = (byte *)calloc(g_vars->scene29_flyingRedBalls.cPlexLen, sizeof(Ball)); + + byte *p1 = g_vars->scene29_flyingRedBalls.cPlex + (g_vars->scene29_flyingRedBalls.cPlexLen - 1) * sizeof(Ball); + + if (g_vars->scene29_flyingRedBalls.cPlexLen - 1 < 0) { + runPtr = g_vars->scene29_flyingRedBalls.pTail; + } else { + runPtr = g_vars->scene29_flyingRedBalls.pTail; + + for (int j = 0; j < g_vars->scene29_flyingRedBalls.cPlexLen; j++) { + ((Ball *)p1)->p1 = runPtr; + runPtr = (Ball *)p1; + + p1 -= sizeof(Ball); + } + + g_vars->scene29_flyingRedBalls.pTail = runPtr; + } + } + g_vars->scene29_flyingRedBalls.pTail = runPtr->p0; + runPtr->p1 = lastP; + runPtr->p0 = 0; + runPtr->ani = ani; + + g_vars->scene29_flyingRedBalls.numBalls++; + + if (g_vars->scene29_flyingRedBalls.field_8) { + g_vars->scene29_flyingRedBalls.field_8->p0 = runPtr; + g_vars->scene29_flyingRedBalls.field_8 = runPtr; + } else { + g_vars->scene29_flyingRedBalls.pHead = runPtr; + g_vars->scene29_flyingRedBalls.field_8 = runPtr; + } + } +} + +void sceneHandler29_manJump() { + if (!g_fp->_aniMan->_movement || g_fp->_aniMan->_movement->_id == MV_MAN29_RUN || g_fp->_aniMan->_movement->_id == MV_MAN29_STANDUP) { + g_vars->scene29_rideBackEnabled = false; + g_vars->scene29_manIsHit = false; + g_vars->scene29_reachedFarRight = true; + + g_fp->_aniMan->changeStatics2(ST_MAN29_RUNR); + g_fp->_aniMan->startAnim(MV_MAN29_JUMP, 0, -1); + } + + g_vars->scene29_manX = g_fp->_aniMan->_ox; + g_vars->scene29_manY = g_fp->_aniMan->_oy; +} + +void sceneHandler29_manBend() { + if (!g_fp->_aniMan->_movement || g_fp->_aniMan->_movement->_id == MV_MAN29_RUN || g_fp->_aniMan->_movement->_id == MV_MAN29_STANDUP) { + g_vars->scene29_rideBackEnabled = false; + g_vars->scene29_manIsHit = false; + g_vars->scene29_reachedFarRight = true; + + g_fp->_aniMan->changeStatics2(ST_MAN29_RUNR); + g_fp->_aniMan->startAnim(MV_MAN29_BEND, 0, -1); + } + + g_vars->scene29_manX = g_fp->_aniMan->_ox; + g_vars->scene29_manY = g_fp->_aniMan->_oy; +} + +bool sceneHandler29_checkRedBallHit(StaticANIObject *ani, int maxx) { + if (!g_vars->scene29_arcadeIsOn || g_vars->scene29_manIsHit) + return false; + + if ((ani->_ox >= g_vars->scene29_manX + 42 || ani->_ox <= g_vars->scene29_manX + 8) + && (ani->_ox < g_vars->scene29_manX + 8 || maxx > g_vars->scene29_manX + 27)) + return false; + + if (!g_fp->_aniMan->_movement) + return true; + + int phase = g_fp->_aniMan->_movement->_currDynamicPhaseIndex; + + if (g_fp->_aniMan->_movement->_id != MV_MAN29_BEND && g_fp->_aniMan->_movement->_id != MV_MAN29_RUN + && (g_fp->_aniMan->_movement->_id != MV_MAN29_JUMP || (phase >= 3 && phase <= 6))) + return false; + else + return true; +} + +bool sceneHandler29_checkGreenBallHit(StaticANIObject *ani, int maxx) { + if (!g_vars->scene29_arcadeIsOn || g_vars->scene29_manIsHit) + return false; + + if (ani->_ox >= g_vars->scene29_manX + 40) { + if (maxx > g_vars->scene29_manX + 27) + return false; + } else { + if (ani->_ox <= g_vars->scene29_manX + 10) { + if (ani->_ox < g_vars->scene29_manX + 40) + return false; + + if (maxx > g_vars->scene29_manX + 27) + return false; + } + } + + if (!g_fp->_aniMan->_movement) + return true; + + if (g_fp->_aniMan->_movement->_id == MV_MAN29_JUMP) + return true; + + if (g_fp->_aniMan->_movement->_id == MV_MAN29_RUN) + return true; + + if (g_fp->_aniMan->_movement->_id == MV_MAN29_BEND) { + if (g_fp->_aniMan->_movement->_currDynamicPhaseIndex < 1 || g_fp->_aniMan->_movement->_currDynamicPhaseIndex > 5) + return true; + } + + return false; +} + +void sceneHandler29_manHit() { + MGMInfo mgminfo; + + g_vars->scene29_manIsHit = true; + + g_fp->_aniMan->changeStatics2(ST_MAN29_RUNR); + g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY); + + mgminfo.ani = g_fp->_aniMan; + mgminfo.staticsId2 = ST_MAN29_SITR; + mgminfo.y1 = 463; + mgminfo.x1 = g_vars->scene29_manX <= 638 ? 351 : 0; + mgminfo.field_1C = 10; + mgminfo.field_10 = 1; + mgminfo.flags = (g_vars->scene29_manX <= 638 ? 2 : 0) | 0x44; + mgminfo.movementId = MV_MAN29_HIT; + + MessageQueue *mq = g_vars->scene29_mgm.genMovement(&mgminfo); + ExCommand *ex; + + if (mq) { + if (g_vars->scene29_manX <= 638) { + ex = new ExCommand(ANI_MAN, 1, MV_MAN29_STANDUP_NORM, 0, 0, 0, 1, 0, 0, 0); + ex->_excFlags = 2; + ex->_keyCode = g_fp->_aniMan->_okeyCode; + mq->addExCommandToEnd(ex); + + ex = new ExCommand(0, 17, MSG_SC29_STOPRIDE, 0, 0, 0, 1, 0, 0, 0); + ex->_excFlags = 2; + mq->addExCommandToEnd(ex); + + g_vars->scene29_manIsRiding = false; + g_vars->scene29_arcadeIsOn = false; + g_vars->scene29_reachedFarRight = false; + g_vars->scene29_rideBackEnabled = false; + } else { + ex = new ExCommand(ANI_MAN, 1, MV_MAN29_STANDUP, 0, 0, 0, 1, 0, 0, 0); + ex->_excFlags = 2; + ex->_keyCode = g_fp->_aniMan->_okeyCode; + mq->addExCommandToEnd(ex); + } + + mq->setFlags(mq->getFlags() | 1); + + if (!mq->chain(g_fp->_aniMan)) + delete mq; + } +} + +void sceneHandler29_assHitRed() { + if (g_vars->scene29_ass->_statics->_staticsId == ST_ASS_NORM) { + g_vars->scene29_ass->changeStatics2(ST_ASS_NORM); + g_vars->scene29_ass->startAnim(MV_ASS_HITRED, 0, -1); + } +} + +void sceneHandler29_assHitGreen() { + if (g_vars->scene29_ass->_statics->_staticsId == ST_ASS_NORM) { + g_vars->scene29_ass->changeStatics2(ST_ASS_NORM); + g_vars->scene29_ass->startAnim(MV_ASS_HITGREEN, 0, -1); + } +} + +void sceneHandler29_ballHitCheck() { + Ball *ball = g_vars->scene29_greenBalls.pHead; + Ball *newball; + int x, y; + + while (ball) { + x = ball->ani->_ox - 30; + y = ball->ani->_oy; + + if (x >= 186) { + if (sceneHandler29_checkGreenBallHit(ball->ani, x)) { + newball = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0); + newball->ani = ball->ani; + + if (g_vars->scene29_balls.field_8) + g_vars->scene29_balls.field_8->p0 = newball; + else + g_vars->scene29_balls.pHead = newball; + + g_vars->scene29_balls.field_8 = newball; + + if (ball == g_vars->scene29_greenBalls.pHead) + g_vars->scene29_greenBalls.pHead = ball->p0; + else + ball->p1->p0 = ball->p0; + + if (ball == g_vars->scene29_greenBalls.field_8) + g_vars->scene29_greenBalls.field_8 = ball->p1; + else + ball->p0->p1 = ball->p1; + + g_vars->scene29_greenBalls.init(&ball); + + sceneHandler29_manHit(); + + g_fp->playSound(SND_29_014, 0); + + ball->ani->startAnim(MV_SHG_HITMAN, 0, -1); + + g_vars->scene29_hitBall = ball->ani->_id; + } else { + ball->ani->setOXY(x, y); + } + } else { + newball = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0); + newball->ani = ball->ani; + + if (g_vars->scene29_balls.field_8) + g_vars->scene29_balls.field_8->p0 = newball; + else + g_vars->scene29_balls.pHead = newball; + + g_vars->scene29_balls.field_8 = newball; + + ball->ani->hide(); + + if (ball == g_vars->scene29_greenBalls.pHead) + g_vars->scene29_greenBalls.pHead = ball->p0; + else + ball->p1->p0 = ball->p0; + + if (ball == g_vars->scene29_greenBalls.field_8) + g_vars->scene29_greenBalls.field_8 = ball->p1; + else + ball->p0->p1 = ball->p1; + + g_vars->scene29_greenBalls.init(&ball); + + sceneHandler29_assHitGreen(); + } + + ball = ball->p0; + } + + ball = g_vars->scene29_flyingRedBalls.pHead; + + while (ball) { + x = ball->ani->_ox - 30; + y = ball->ani->_oy; + + if (x >= 147) { + if (sceneHandler29_checkRedBallHit(ball->ani, x)) { + newball = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0); + newball->ani = ball->ani; + + if (g_vars->scene29_redBalls.field_8) + g_vars->scene29_redBalls.field_8->p0 = newball; + else + g_vars->scene29_redBalls.pHead = newball; + + g_vars->scene29_redBalls.field_8 = newball; + + g_vars->scene29_flyingRedBalls.removeBall(ball); + + sceneHandler29_manHit(); + + g_fp->playSound(SND_29_027, 0); + + ball->ani->startAnim(MV_SHR_HITMAN, 0, -1); + + g_vars->scene29_hitBall = ball->ani->_id; + } else { + ball->ani->setOXY(x, y); + } + } else { + newball = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0); + newball->ani = ball->ani; + + if (g_vars->scene29_redBalls.field_8) + g_vars->scene29_redBalls.field_8->p0 = newball; + else + g_vars->scene29_redBalls.pHead = newball; + + g_vars->scene29_redBalls.field_8 = newball; + + ball->ani->hide(); + + if (ball == g_vars->scene29_flyingRedBalls.pHead) + g_vars->scene29_flyingRedBalls.pHead = ball->p0; + else + ball->p1->p0 = ball->p0; + + if (ball == g_vars->scene29_flyingRedBalls.field_8) + g_vars->scene29_flyingRedBalls.field_8 = ball->p1; + else + ball->p0->p1 = ball->p1; + + g_vars->scene29_flyingRedBalls.init(&ball); + + sceneHandler29_assHitRed(); + } + + ball = ball->p0; + } +} + +void sceneHandler29_manFromL() { + if (g_vars->scene29_manX < 497 && !g_vars->scene29_scrollingDisabled) { + getCurrSceneSc2MotionController()->setEnabled(); + getGameLoaderInteractionController()->enableFlag24(); + + g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000); + chainQueue(QU_SC29_MANFROM_L, 1); + + g_vars->scene29_scrollingDisabled = true; + + g_fp->_scrollSpeed = g_vars->scene29_scrollSpeed; + } +} + +void sceneHandler29_manFromR() { + getCurrSceneSc2MotionController()->setEnabled(); + getGameLoaderInteractionController()->enableFlag24(); + + chainQueue(QU_SC29_MANFROM_R, 1); + + g_vars->scene29_arcadeIsOn = false; + g_vars->scene29_rideBackEnabled = false; +} + +int sceneHandler29_updateScreenCallback() { + int res; + + res = g_fp->drawArcadeOverlay(g_vars->scene29_arcadeIsOn); + + if (!res) + g_fp->_updateScreenCallback = 0; + + return res; +} + +void sceneHandler29_manToL() { + getCurrSceneSc2MotionController()->clearEnabled(); + getGameLoaderInteractionController()->disableFlag24(); + + chainQueue(QU_SC29_MANTO_L, 1); + + g_vars->scene29_arcadeIsOn = true; + + g_vars->scene29_mgm.addItem(g_fp->_aniMan->_id); + + g_fp->_updateScreenCallback = sceneHandler29_updateScreenCallback; + + g_fp->_msgY = -1; + g_fp->_msgX = -1; +} + +void sceneHandler29_manToR() { + getCurrSceneSc2MotionController()->clearEnabled(); + getGameLoaderInteractionController()->disableFlag24(); + + chainQueue(QU_SC29_MANTO_R, 1); + + g_vars->scene29_manIsRiding = true; + g_fp->_msgY = -1; + g_fp->_msgX = -1; + + g_vars->scene29_scrollingDisabled = false; + + g_vars->scene29_scrollSpeed = g_fp->_scrollSpeed; + g_fp->_scrollSpeed = 4; +} + +void sceneHandler29_clickPorter(ExCommand *cmd) { + if (!g_fp->_aniMan->isIdle() || g_fp->_aniMan->_flags & 0x100) { + cmd->_messageKind = 0; + + return; + } + + if (g_vars->scene29_manX <= g_vars->scene29_porter->_ox) { + if (ABS(351 - g_vars->scene29_manX) > 1 || ABS(443 - g_vars->scene29_manY) > 1 + || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { + if (g_fp->_msgX != 351 || g_fp->_msgY != 443) { + MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 351, 443, 1, ST_MAN_RIGHT); + + if (mq) { + mq->addExCommandToEnd(cmd->createClone()); + + postExCommand(g_fp->_aniMan->_id, 2, 351, 443, 0, -1); + } + } + } else { + sceneHandler29_manToL(); + } + } else { + g_vars->scene29_manX = g_fp->_aniMan->_ox; + g_vars->scene29_manY = g_fp->_aniMan->_oy; + + if (ABS(1582 - g_vars->scene29_manX) > 1 || ABS(445 - g_fp->_aniMan->_oy) > 1 + || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != (0x4000 | ST_MAN_RIGHT)) { + if (g_fp->_msgX != 1582 || g_fp->_msgY != 445) { + MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1582, 445, 1, (0x4000 | ST_MAN_RIGHT)); + + if (mq) { + mq->addExCommandToEnd(cmd->createClone()); + + postExCommand(g_fp->_aniMan->_id, 2, 1582, 445, 0, -1); + } + } + } else { + sceneHandler29_manToR(); + } + } +} + +void sceneHandler29_shootersProcess() { + if (g_fp->_aniMan->_statics->_staticsId == ST_MAN29_RUNR) { + if (g_vars->scene29_manX > 1436) { + sceneHandler29_manFromR(); + } else { + g_vars->scene29_shootDistance = (1310 - g_vars->scene29_manX) * 5213 / 100000 + 25; + + if (!g_vars->scene29_manIsHit) + g_fp->_aniMan->startAnim(MV_MAN29_RUN, 0, -1); + } + } + + g_vars->scene29_manX = g_fp->_aniMan->_ox; + g_vars->scene29_manY = g_fp->_aniMan->_oy; +} + +void sceneHandler29_shootersEscape() { + if (g_vars->scene29_arcadeIsOn) { + g_vars->scene29_manX += 2; + + g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY); + + if (g_vars->scene29_manX > 1310 && !g_vars->scene29_shooter1->_movement && !g_vars->scene29_shooter2->_movement + && g_vars->scene29_shooter1->_statics->_staticsId == ST_STR1_RIGHT) { + g_vars->scene29_shootCountdown = 0; + + g_vars->scene29_shooter1->changeStatics2(ST_STR1_STAND); + g_vars->scene29_shooter2->changeStatics2(ST_STR2_STAND); + + chainQueue(QU_SC29_ESCAPE, 1); + + g_vars->scene29_ass->queueMessageQueue(0); + g_vars->scene29_ass->hide(); + + g_fp->setObjectState(sO_LeftPipe_29, g_fp->getObjectEnumState(sO_LeftPipe_29, sO_IsOpened)); + } + } else if (g_vars->scene29_manIsRiding) { + g_vars->scene29_manX -= 4; + + g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY); + } +} + +void sceneHandler29_manRideBack() { + g_vars->scene29_manX -= 2; + + g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY); +} + +void sceneHandler29_shoot() { + if (g_vars->scene29_arcadeIsOn && g_vars->scene29_manX < 1310) { + if (g_fp->_rnd->getRandomNumber(1) || g_vars->scene29_shooter1->_movement || g_vars->scene29_shooter1->_statics->_staticsId != ST_STR1_RIGHT) { + if (!g_vars->scene29_shooter2->_movement && g_vars->scene29_shooter2->_statics->_staticsId == ST_STR2_RIGHT) { + if (g_vars->scene29_shooter2->_flags & 4) { + g_vars->scene29_shooter2->startAnim(MV_STR2_SHOOT, 0, -1); + + g_vars->scene29_shootCountdown = 0; + } + } + } else { + g_vars->scene29_shooter1->startAnim(MV_STR1_SHOOT, 0, -1); + + g_vars->scene29_shootCountdown = 0; + } + } +} + +void sceneHandler29_animBearded() { + MessageQueue *mq; + + for (uint i = 0; i < g_vars->scene29_bearders.size(); i++) { + StaticANIObject *ani = g_vars->scene29_bearders[i]->ani; + + if (g_vars->scene29_bearders[i]->wbflag) { + int x = ani->_ox; + int y = ani->_oy; + + if (!ani->_movement && ani->_statics->_staticsId == (ST_BRDCMN_RIGHT | 0x4000)) { + x -= 4; + + if (x - g_vars->scene29_manX < 100 || !g_vars->scene29_arcadeIsOn) { + mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRDOUT1), 0, 1); + + mq->replaceKeyCode(-1, ani->_okeyCode); + mq->chain(0); + + g_vars->scene29_bearders[i]->wbflag = 0; + g_vars->scene29_bearders[i]->wbcounter = 0; + } + } + + if (!ani->_movement && ani->_statics->_staticsId == ST_BRDCMN_GOR) + ani->startAnim(MV_BRDCMN_GOR, 0, -1); + + if (ani->_movement) { + if (ani->_movement->_id == MV_BRDCMN_GOR) { + x -= 4; + + if (g_vars->scene29_manX - x < 60 || x - g_vars->scene29_manX < -260 || !g_vars->scene29_arcadeIsOn) { + ani->changeStatics2(ST_BRDCMN_RIGHT); + + mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRDOUT2), 0, 1); + + mq->replaceKeyCode(-1, ani->_okeyCode); + mq->chain(0); + + g_vars->scene29_bearders[i]->wbflag = 0; + g_vars->scene29_bearders[i]->wbcounter = 0; + } + } + } + + ani->setOXY(x, y); + continue; + } + + if (g_vars->scene29_arcadeIsOn && g_vars->scene29_bearders[i]->wbcounter > 30) { + int newx; + + if (g_fp->_rnd->getRandomNumber(1)) + goto dostuff; + + if (g_vars->scene29_manX <= 700) { + g_vars->scene29_bearders[i]->wbcounter++; + continue; + } + + if (g_vars->scene29_manX >= 1100) { + dostuff: + if (g_vars->scene29_manX <= 700 || g_vars->scene29_manX >= 1350) { + g_vars->scene29_bearders[i]->wbcounter++; + continue; + } + + mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRD2), 0, 1); + + newx = g_vars->scene29_manX - 200; + } else { + mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRD1), 0, 1); + + newx = g_vars->scene29_manX + 350; + } + + mq->getExCommandByIndex(0)->_x = newx; + mq->replaceKeyCode(-1, ani->_okeyCode); + mq->chain(0); + + g_vars->scene29_bearders[i]->wbflag = 1; + g_vars->scene29_bearders[i]->wbcounter = 0; + } + + g_vars->scene29_bearders[i]->wbcounter++; + } +} + + + +int sceneHandler29(ExCommand *cmd) { + if (cmd->_messageKind != 17) + return 0; + + switch (cmd->_messageNum) { + case MSG_CMN_WINARCADE: + sceneHandler29_winArcade(); + break; + + case MSG_SC29_LAUGH: + if (g_vars->scene29_hitBall == ANI_SHELL_GREEN) { + g_fp->playSound(SND_29_028, 0); + break; + } + + g_fp->playSound(SND_29_029, 0); + + break; + + case MSG_SC29_SHOWLASTRED: + if (g_vars->scene29_balls.numBalls) { + g_vars->scene29_redBalls.field_8->ani->show1(-1, -1, -1, 0); + g_vars->scene29_redBalls.field_8->ani->startAnim(MV_SHR_HITASS, 0, -1); + } + + break; + + case MSG_SC29_SHOOTGREEN: + sceneHandler29_shootGreen(); + break; + + case MSG_SC29_SHOOTRED: + sceneHandler29_shootRed(); + break; + + case MSG_SC29_SHOWLASTGREEN: + if (g_vars->scene29_balls.numBalls) { + g_vars->scene29_balls.field_8->ani->show1(-1, -1, -1, 0); + g_vars->scene29_balls.field_8->ani->startAnim(MV_SHG_HITASS, 0, -1); + } + + break; + + case MSG_SC29_STOPRIDE: + g_vars->scene29_manIsRiding = false; + g_vars->scene29_arcadeIsOn = false; + g_vars->scene29_reachedFarRight = false; + g_vars->scene29_rideBackEnabled = false; + + getCurrSceneSc2MotionController()->setEnabled(); + getGameLoaderInteractionController()->enableFlag24(); + break; + + case MSG_SC29_DISABLERIDEBACK: + g_vars->scene29_rideBackEnabled = false; + break; + + case MSG_SC29_ENABLERIDEBACK: + g_vars->scene29_rideBackEnabled = true; + g_vars->scene29_reachedFarRight = false; + break; + + case MSG_SC29_DISABLEPORTER: + g_vars->scene29_reachedFarRight = false; + break; + + case MSG_SC29_ENABLEPORTER: + g_vars->scene29_reachedFarRight = true; + g_vars->scene29_rideBackEnabled = false; + g_vars->scene29_manIsHit = false; + break; + + case 29: + if (!g_vars->scene29_manIsRiding || g_vars->scene29_arcadeIsOn) { + if (!g_vars->scene29_arcadeIsOn) { + StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y); + + if (ani && ani == g_vars->scene29_porter) { + sceneHandler29_clickPorter(cmd); + + cmd->_messageKind = 0; + break; + } + break; + } + + sceneHandler29_manJump(); + + cmd->_messageKind = 0; + break; + } + break; + + case 107: + if (g_vars->scene29_arcadeIsOn) + sceneHandler29_manBend(); + + break; + + case 33: + if (g_vars->scene29_arcadeIsOn) { + if (g_vars->scene29_manX > g_fp->_sceneRect.right - 500) + g_fp->_currentScene->_x = g_fp->_sceneRect.right - g_vars->scene29_manX - 350; + + if (g_vars->scene29_manX < g_fp->_sceneRect.left + 100) + g_fp->_currentScene->_x = g_vars->scene29_manX - g_fp->_sceneRect.left - 100; + + } else if (g_fp->_aniMan2) { + int x = g_fp->_aniMan2->_ox; + + if (x < g_fp->_sceneRect.left + 300) + g_fp->_currentScene->_x = x - 400 - g_fp->_sceneRect.left; + + if (x > g_fp->_sceneRect.right - 300) + g_fp->_currentScene->_x = x + 400 - g_fp->_sceneRect.right; + } + + g_vars->scene29_manX = g_fp->_aniMan->_ox; + g_vars->scene29_manY = g_fp->_aniMan->_oy; + + sceneHandler29_ballHitCheck(); + + if (!g_vars->scene29_porter->_movement) + g_vars->scene29_porter->startAnim(MV_PTR_MOVEFAST, 0, -1); + + if (g_vars->scene29_manIsRiding) + sceneHandler29_manFromL(); + else if (g_vars->scene29_arcadeIsOn && !g_fp->_aniMan->_movement) + sceneHandler29_shootersProcess(); + + if (g_vars->scene29_reachedFarRight) + sceneHandler29_shootersEscape(); + else if (g_vars->scene29_rideBackEnabled) + sceneHandler29_manRideBack(); + + g_vars->scene29_shootCountdown++; + + if (g_vars->scene29_shootCountdown > g_vars->scene29_shootDistance) + sceneHandler29_shoot(); + + sceneHandler29_animBearded(); + + g_fp->_behaviorManager->updateBehaviors(); + g_fp->startSceneTrack(); + + break; + } + + return 0; +} + +int scene29_updateCursor() { + g_fp->updateCursorCommon(); + + if (g_vars->scene29_arcadeIsOn) { + if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV) + g_fp->_cursorId = -1; + } else if (g_vars->scene29_manIsRiding) { + if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV) + g_fp->_cursorId = PIC_CSR_DEFAULT; + } else if (g_fp->_objectIdAtCursor == ANI_PORTER) { + if (g_fp->_cursorId == PIC_CSR_DEFAULT) + g_fp->_cursorId = PIC_CSR_ITN; + } else { + if (g_fp->_objectIdAtCursor == PIC_SC29_LTRUBA && g_fp->_cursorId == PIC_CSR_ITN) + g_fp->_cursorId = PIC_CSR_GOL; + } + return g_fp->_cursorId; +} + +} // End of namespace Fullpipe |