diff options
Diffstat (limited to 'engines/fullpipe/scenes.cpp')
-rw-r--r-- | engines/fullpipe/scenes.cpp | 1511 |
1 files changed, 1511 insertions, 0 deletions
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp new file mode 100644 index 0000000000..32aa955a61 --- /dev/null +++ b/engines/fullpipe/scenes.cpp @@ -0,0 +1,1511 @@ +/* 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/utils.h" +#include "fullpipe/objects.h" +#include "fullpipe/statics.h" +#include "fullpipe/gameloader.h" +#include "fullpipe/motion.h" +#include "fullpipe/input.h" +#include "fullpipe/behavior.h" + +#include "fullpipe/constants.h" +#include "fullpipe/objectnames.h" +#include "fullpipe/scenes.h" +#include "fullpipe/interaction.h" + +namespace Fullpipe { + +Vars::Vars() { + sceneIntro_aniin1man = 0; + sceneIntro_needSleep = true; + sceneIntro_needGetup = false; + sceneIntro_skipIntro = true; + sceneIntro_playing = false; + sceneIntro_needBlackout = false; + + swallowedEgg1 = 0; + swallowedEgg2 = 0; + swallowedEgg3 = 0; + + scene01_picSc01Osk = 0; + scene01_picSc01Osk2 = 0; + + scene02_guvTheDrawer = 0; + scene02_boxDelay = 0; + scene02_boxOpen = false; + + scene03_eggeater = 0; + scene03_domino = 0; + + scene04_bottle = 0; + scene04_hand = 0; + scene04_plank = 0; + scene04_clock = 0; + scene04_hand = 0; + scene04_spring = 0; + scene04_mamasha = 0; + scene04_boot = 0; + scene04_speaker = 0; + + scene04_ladder = 0; + scene04_coinPut = false; + scene04_soundPlaying = false; + scene04_dynamicPhaseIndex = 0; + scene04_dudeOnLadder = false; + + scene04_sceneClickX = 0; + scene04_sceneClickY = 0; + + scene04_dudePosX = 0; + scene04_dudePosY = 0; + + scene04_bottleIsTaken = false; + scene04_kozyawkaOnLadder = false; + scene04_walkingKozyawka = 0; + scene04_bottleWeight = 0; + scene04_var07 = false; + scene04_ladderClickable = false; + scene04_handIsDown = false; + scene04_dudeInBottle = false; + scene04_kozHeadRaised = false; + scene04_bottleIsDropped = false; + scene04_bigBallIn = false; + scene04_bigBallCounter = 0; + scene04_bigBallFromLeft = false; + scene04_speakerVariant = 0; + scene04_speakerPhase = 0; + scene04_clockCanGo = false; + scene04_objectIsTaken = false; + scene04_springOffset = 0; + scene04_lastKozyawka = 0; + scene04_springDelay = 0; + scene04_bottleY = 0; + scene04_ladderOffset = 0; + + scene05_handle = 0; + scene05_wacko = 0; + scene05_bigHatch = 0; + scene05_wackoTicker = 0; + scene05_handleFlipper = 0; + scene05_floatersTicker = 0; + + scene06_manX = 0; + scene06_manY = 0; + scene06_ballX = 0; + scene06_ballY = 0; + scene06_mumsy = 0; + scene06_someBall = 0; + scene06_invHandle = 0; + scene06_liftButton = 0; + scene06_ballDrop = 0; + scene06_arcadeEnabled = false; + scene06_aimingBall = false; + scene06_currentBall = 0; + scene06_ballInHands = 0; + scene06_flyingBall = 0; + scene06_numBallsGiven = 0; + scene06_mumsyNumBalls = 0; + scene06_eggieTimeout = 0; + scene06_eggieDirection = true; + scene06_mumsyGotBall = 0; + scene06_ballDeltaX = 0; + scene06_ballDeltaY = 0; + scene06_sceneClickX = 0; + scene06_sceneClickY = 0; + scene06_mumsyPos = 0; + scene06_mumsyJumpBk = 0; + scene06_mumsyJumpFw = 0; + scene06_mumsyJumpBkPercent = 0; + scene06_mumsyJumpFwPercent = 0; + + scene07_lukeAnim = 0; + scene07_lukePercent = 0; + scene07_plusMinus = 0; + + scene08_batuta = 0; + scene08_vmyats = 0; + scene08_clock = 0; + scene08_inAir = false; + scene08_flyingUp = false; + scene08_onBelly = false; + scene08_stairsOffset = -37; + scene08_snoringCountdown = -1; + scene08_inArcade = false; + scene08_stairsVisible = true; + scene08_manOffsetY = 0; + + scene09_flyingBall = 0; + scene09_numSwallenBalls = 0; + scene09_gulper = 0; + scene09_spitter = 0; + scene09_grit = 0; + scene09_dudeY = 0; + scene09_gulperIsPresent = true; + scene09_dudeIsOnLadder = false; + scene09_interactingHanger = -1; + scene09_intHangerPhase = -1; + scene09_intHangerMaxPhase = -1000; + scene09_numMovingHangers = 0; + scene09_clickY = 0; + scene09_hangerOffsets[0].x = 0; + scene09_hangerOffsets[0].y = -15; + scene09_hangerOffsets[1].x = 15; + scene09_hangerOffsets[1].y = 0; + scene09_hangerOffsets[2].x = 0; + scene09_hangerOffsets[2].y = 0; + scene09_hangerOffsets[3].x = 0; + scene09_hangerOffsets[3].y = 0; + + scene10_gum = 0; + scene10_packet = 0; + scene10_packet2 = 0; + scene10_inflater = 0; + scene10_ladder = 0; + scene10_hasGum = 0; + + scene11_swingie = 0; + scene11_boots = 0; + scene11_dudeOnSwing = 0; + scene11_hint = 0; + scene11_arcadeIsOn = false; + scene11_scrollIsEnabled = false; + scene11_scrollIsMaximized = false; + scene11_hintCounter = 0; + scene11_swingieScreenEdge = 0; + scene11_crySound = 0; + scene11_swingAngle = 1.0; + scene11_swingOldAngle = 1.0; + scene11_swingSpeed = 1.0; + scene11_swingAngleDiff = 1.0; + scene11_swingInertia = 0.0; + scene11_swingCounter = 0; + scene11_swingCounterPrevTurn = 0; + scene11_swingDirection = 0; + scene11_swingDirectionPrevTurn = 0; + scene11_swingIsSwinging = false; + scene11_swingieStands = false; + scene11_dudeX = 0; + scene11_dudeY = 0; + scene11_swingMaxAngle = 45; + + scene12_fly = 0; + scene12_flyCountdown = 0; + + scene13_whirlgig = 0; + scene13_guard = 0; + scene13_handleR = 0; + scene13_handleL = 0; + scene13_bridge = 0; + scene13_guardDirection = false; + scene13_dudeX = 0; + + scene14_grandma = 0; + scene14_sceneDeltaX = 0; + scene14_sceneDeltaY = 0; + scene14_arcadeIsOn = false; + scene14_dudeIsKicking = false; + scene14_ballIsFlying = false; + scene14_dudeCanKick = false; + scene14_sceneDiffX = 0; + scene14_sceneDiffY = 0; + scene14_pink = 0; + scene14_flyingBall = 0; + scene14_balls.clear(); + scene14_grandmaIsHere = false; + scene14_dudeX = 0; + scene14_dudeY = 0; + scene14_grandmaX = 0; + scene14_grandmaY = 0; + scene14_dude2X = 0; + scene14_ballDeltaX = 0; + scene14_ballDeltaY = 0; + scene14_ballX = 0; + scene14_ballY = 0; + scene14_hitsLeft = 0; + + scene15_chantingCountdown = 0; + scene15_plusminus = 0; + scene15_ladder = 0; + scene15_boot = 0; + + scene16_figures.clear(); + scene16_walkingBoy = 0; + scene16_walkingGirl = 0; + scene16_walkingCount = 0; + scene16_wire = 0; + scene16_mug = 0; + scene16_jettie = 0; + scene16_boot = 0; + scene16_girlIsLaughing = false; + scene16_sound = 0; + scene16_placeIsOccupied = false; + + scene17_flyState = 0; + scene17_sugarIsShown = false; + scene17_sceneOldEdgeX = 0; + scene17_flyCountdown = 0; + scene17_hand = 0; + scene17_handPhase = false; + scene17_sceneEdgeX = 0; + + scene18_inScene18p1 = false; + scene18_whirlgig = 0; + scene18_wheelCenterX = 0; + scene18_wheelCenterY = 0; + scene18_bridgeIsConvoluted = false; + scene18_whirlgigMovMum = 0; + scene18_girlIsSwinging = false; + scene18_rotationCounter = 0; + scene18_manY = 0; + scene18_wheelFlipper = false; + scene18_wheelIsTurning = true; + scene18_kidIsOnWheel = -1; + scene18_boyIsOnWheel = 0; + scene18_girlIsOnWheel = 0; + scene18_boyJumpedOff = true; + scene18_jumpDistance = -1; + scene18_jumpAngle = -1; + scene18_manIsReady = false; + scene18_enteredTrubaRight = false; + scene18_manWheelPos = 0; + scene18_manWheelPosTo = -1; + scene18_kidWheelPos = 0; + scene18_kidWheelPosTo = 0; + scene18_boy = 0; + scene18_girl = 0; + scene18_domino = 0; + scene18_boyJumpX = 290; + scene18_boyJumpY = -363; + scene18_girlJumpX = 283; + scene18_girlJumpY = -350; + + scene19_enteredTruba3 = false; + + scene20_fliesCountdown = 0; + scene20_grandma = 0; + + scene21_giraffeBottom = 0; + scene21_giraffeBottomX = 0; + scene21_giraffeBottomY = 0; + scene21_pipeIsOpen = false; + scene21_wigglePos = 0.0; + scene21_wiggleTrigger = 0; + + scene22_bag = 0; + scene22_giraffeMiddle = 0; + scene22_dudeIsOnStool = false; + scene22_interactionIsDisabled = false; + scene22_craneIsOut = true; + scene22_numBagFalls = 1; + + scene23_calend0 = 0; + scene23_calend1 = 0; + scene23_calend2 = 0; + scene23_calend3 = 0; + scene23_topReached = false; + scene23_isOnStool = false; + scene23_someVar = 0; + scene23_giraffeTop = 0; + scene23_giraffee = 0; + + scene24_jetIsOn = false; + scene24_flowIsLow = false; + scene24_waterIsOn = false; + scene24_water = 0; + scene24_jet = 0; + scene24_drop = 0; + + scene25_water = 0; + scene25_board = 0; + scene25_drop = 0; + scene25_dudeIsOnBoard = false; + scene25_waterIsPresent = false; + scene25_boardIsSelectable = false; + scene25_beardersAreThere = false; + scene25_beardersCounter = 0; + scene25_bearders.clear(); + scene25_sneezeFlipper = false; + + scene26_chhi = 0; + scene26_drop = 0; + scene26_sockPic = 0; + scene26_sock = 0; + scene26_activeVent = 0; + + scene27_hitZone = 0; + scene27_driver = 0; + scene27_maid = 0; + scene27_batHandler = 0; + scene27_driverHasVent = true; + scene27_bat = 0; + scene27_dudeIsAiming = false; + scene27_maxPhaseReached = false; + scene27_wipeIsNeeded = false; + scene27_driverPushedButton = false; + scene27_numLostBats = 0; + scene27_knockCount = 0; + scene27_aimStartX = 0; + scene27_aimStartY = 0; + scene27_launchPhase = 0; + + scene28_fliesArePresent = true; + scene28_beardedDirection = true; + scene28_darkeningObject = 0; + scene28_lighteningObject = 0; + scene28_headDirection = false; + scene28_headBeardedFlipper = false; + scene28_lift6inside = false; + + scene29_porter = 0; + scene29_shooter1 = 0; + scene29_shooter2 = 0; + scene29_ass = 0; + scene29_manIsRiding = false; + scene29_arcadeIsOn = false; + scene29_reachedFarRight = false; + scene29_rideBackEnabled = false; + scene29_shootCountdown = 0; + scene29_shootDistance = 75; + scene29_manIsHit = 0; + scene29_scrollSpeed = 0; + scene29_scrollingDisabled = 0; + scene29_hitBall = 0; + scene29_manX = 0; + scene29_manY = 0; + + scene30_leg = 0; + scene30_liftFlag = 1; + + scene31_chantingCountdown = 0; + scene31_cactus = 0; + scene31_plusMinus = 0; + + scene32_flagIsWaving = false; + scene32_flagNeedsStopping = false; + scene32_dudeIsSitting = false; + scene32_cactusCounter = -1; + scene32_dudeOnLadder = false; + scene32_cactusIsGrowing = false; + scene32_flag = 0; + scene32_cactus = 0; + scene32_massOrange = 0; + scene32_massBlue = 0; + scene32_massGreen = 0; + scene32_button = 0; + + scene33_mug = 0; + scene33_jettie = 0; + scene33_cube = 0; + scene33_cubeX = -1; + scene33_handleIsDown = false; + + for (int i = 0; i < 9; i++) { + scene33_ventsX[i] = 0; + scene33_ventsState[i] = 0; + } + + scene34_cactus = 0; + scene34_vent = 0; + scene34_hatch = 0; + scene34_boot = 0; + scene34_dudeClimbed = false; + scene34_dudeOnBoard = false; + scene34_dudeOnCactus = false; + scene34_fliesCountdown = 0; + + scene35_hose = 0; + scene35_bellyInflater = 0; + scene35_flowCounter = 0; + scene35_fliesCounter = 0; + + scene36_rotohrust = 0; + scene36_scissors = 0; + + scene37_rings.clear(); + scene37_lastDudeX = -1; + scene37_cursorIsLocked = 0; + scene37_plusMinus1 = 0; + scene37_plusMinus2 = 0; + scene37_plusMinus3 = 0; + scene37_soundFlipper = 0; + scene37_dudeX = 0; + + scene38_boss = 0; + scene38_tally = 0; + scene38_shorty = 0; + scene38_domino0 = 0; + scene38_dominos = 0; + scene38_domino1 = 0; + scene38_bottle = 0; + scene38_bossCounter = 0; + scene38_lastBossAnim = 0; + scene38_bossAnimCounter = 0; + scene38_tallyCounter = 0; + scene38_lastTallyAnim = 0; + scene38_tallyAnimCounter = 0; + scene38_shortyCounter = 0; + scene38_lastShortyAnim = 0; + scene38_shortyAnimCounter = 0; + + sceneFinal_var01 = 0; + sceneFinal_var02 = 0; + sceneFinal_var03 = 0; + + selector = 0; +} + +static int scenes[] = { + SC_1, SC_2, SC_3, SC_4, SC_5, SC_6, SC_7, SC_8, SC_9, SC_10, + SC_11, SC_12, SC_13, SC_14, SC_15, SC_16, SC_17, SC_18, SC_19, SC_20, + SC_21, SC_22, SC_23, SC_24, SC_25, SC_26, SC_27, SC_28, SC_29, SC_30, + SC_31, SC_32, SC_33, SC_34, SC_35, SC_36, SC_37, SC_38, SC_FINAL1, SC_DBGMENU +}; + +static int scenesD[] = { + PIC_SCD_1, PIC_SCD_2, PIC_SCD_3, PIC_SCD_4, PIC_SCD_5, PIC_SCD_6, PIC_SCD_7, PIC_SCD_8, PIC_SCD_9, PIC_SCD_10, + PIC_SCD_11, PIC_SCD_12, PIC_SCD_13, PIC_SCD_14, PIC_SCD_15, PIC_SCD_16, PIC_SCD_17, PIC_SCD_18, PIC_SCD_19, PIC_SCD_20, + PIC_SCD_21, PIC_SCD_22, PIC_SCD_23, PIC_SCD_24, PIC_SCD_25, PIC_SCD_26, PIC_SCD_27, PIC_SCD_28, PIC_SCD_29, PIC_SCD_30, + PIC_SCD_31, PIC_SCD_32, PIC_SCD_33, PIC_SCD_34, PIC_SCD_35, PIC_SCD_36, PIC_SCD_37, PIC_SCD_38, PIC_SCD_FIN, 0 +}; + +int FullpipeEngine::convertScene(int scene) { + if (!scene || scene >= SC_1) + return scene; + + if (scene < 1 || scene > 40) + return SC_1; + + return scenes[scene - 1]; +} + +int FullpipeEngine::getSceneEntrance(int scene) { + for (int i = 0; i < 40; i++) + if (scenes[i] == scene) + return scenesD[i]; + + return 0; +} + +int FullpipeEngine::getSceneFromTag(int tag) { + for (int i = 0; i < ARRAYSIZE(scenes); i++) { + if (scenes[i] == tag) + return i + 1; + } + + return 1; +} + +bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { + GameVar *sceneVar; + Common::Point sceneDim; + + Scene *scene = accessScene(entrance->_sceneId); + + if (!scene) + return 0; + + ((PictureObject *)scene->_picObjList.front())->getDimensions(&sceneDim); + _sceneWidth = sceneDim.x; + _sceneHeight = sceneDim.y; + + _sceneRect.top = 0; + _sceneRect.left = 0; + _sceneRect.right = 799; + _sceneRect.bottom = 599; + + scene->_x = 0; + scene->_y = 0; + + _aniMan->setOXY(0, 0); + _aniMan->clearFlags(); + _aniMan->_callback1 = 0; + _aniMan->_callback2 = 0; + _aniMan->_shadowsOn = 1; + + _scrollSpeed = 8; + + _isSaveAllowed = true; + _updateFlag = true; + _flgCanOpenMap = true; + + if (entrance->_sceneId == SC_DBGMENU) { + _inventoryScene = 0; + } else { + _gameLoader->loadScene(SC_INV); + getGameLoaderInventory()->rebuildItemRects(); + _inventoryScene = getGameLoaderInventory()->getScene(); + } + if (_soundEnabled) { + if (scene->_soundList) { + _currSoundListCount = 2; + _currSoundList1[0] = accessScene(SC_COMMON)->_soundList; + _currSoundList1[1] = scene->_soundList; + + for (int i = 0; i < scene->_soundList->getCount(); i++) { + scene->_soundList->getSoundByIndex(i)->updateVolume(); + } + } else { + _currSoundListCount = 1; + _currSoundList1[0] = accessScene(SC_COMMON)->_soundList; + } + } + + getGameLoaderInteractionController()->sortInteractions(scene->_sceneId); + _currentScene = scene; + scene->addStaticANIObject(_aniMan, 1); + _scene2 = scene; + _aniMan->_movement = 0; + _aniMan->_statics = _aniMan->getStaticsById(ST_MAN_EMPTY); + _aniMan->setOXY(0, 0); + + _aniMan2 = _aniMan; + MctlCompound *cmp = getSc2MctlCompoundBySceneId(entrance->_sceneId); + cmp->initMovGraph2(); + cmp->attachObject(_aniMan); + cmp->activate(); + getGameLoaderInteractionController()->enableFlag24(); + setInputDisabled(0); + + scene->setPictureObjectsFlag4(); + + for (uint i = 0; i < scene->_staticANIObjectList1.size(); i++) + scene->_staticANIObjectList1[i]->_flags &= 0xFE7F; + + PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0); + p->setFlags(p->_flags & 0xFFFB); + + removeMessageHandler(2, -1); + _updateScreenCallback = 0; + + switch (entrance->_sceneId) { + case SC_INTRO1: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1"); + scene->preloadMovements(sceneVar); + sceneIntro_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_INTRO1"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandlerIntro, 2); + _updateCursorCallback = sceneIntro_updateCursor; + break; + + case SC_1: + scene01_fixEntrance(); + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_1"); + scene->preloadMovements(sceneVar); + scene01_initScene(scene, entrance->_field_4); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_1"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler01, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_2: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_2"); + scene->preloadMovements(sceneVar); + scene02_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_2"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler02, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_3: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_3"); + scene->preloadMovements(sceneVar); + scene03_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_3"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler03, 2); + scene03_setEaterState(); + _updateCursorCallback = scene03_updateCursor; + break; + + case SC_4: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_4"); + scene->preloadMovements(sceneVar); + scene04_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_4"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler04, 2, 2); + _updateCursorCallback = scene04_updateCursor; + break; + + case SC_5: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_5"); + scene->preloadMovements(sceneVar); + scene05_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_5"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler05, 2, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_6: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_6"); + scene->preloadMovements(sceneVar); + scene06_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_6"); + setSceneMusicParameters(sceneVar); + scene06_initMumsy(); + insertMessageHandler(sceneHandler06, 2, 2); + _updateCursorCallback = scene06_updateCursor; + break; + + case SC_7: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_7"); + scene->preloadMovements(sceneVar); + scene07_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_7"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler07, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_8: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_8"); + scene->preloadMovements(sceneVar); + scene08_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_8"); + setSceneMusicParameters(sceneVar); + scene08_setupMusic(); + addMessageHandler(sceneHandler08, 2); + _updateCursorCallback = scene08_updateCursor; + break; + + case SC_9: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_9"); + scene->preloadMovements(sceneVar); + scene09_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_9"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler09, 2, 2); + _updateCursorCallback = scene09_updateCursor; + break; + + case SC_10: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_10"); + scene->preloadMovements(sceneVar); + scene10_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_10"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler10, 2, 2); + _updateCursorCallback = scene10_updateCursor; + break; + + case SC_11: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_11"); + scene->preloadMovements(sceneVar); + scene11_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_11"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler11, 2, 2); + scene11_setupMusic(); + _updateCursorCallback = scene11_updateCursor; + break; + + case SC_12: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_12"); + scene->preloadMovements(sceneVar); + scene12_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_12"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler12, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_13: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_13"); + scene->preloadMovements(sceneVar); + scene13_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_13"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler13, 2, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_14: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_14"); + scene->preloadMovements(sceneVar); + scene14_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_14"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler14, 2, 2); + scene14_setupMusic(); + _updateCursorCallback = scene14_updateCursor; + break; + + case SC_15: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_15"); + scene->preloadMovements(sceneVar); + scene15_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_15"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler15, 2, 2); + _updateCursorCallback = scene15_updateCursor; + break; + + case SC_16: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_16"); + scene->preloadMovements(sceneVar); + scene16_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_16"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler16, 2); + _updateCursorCallback = scene16_updateCursor; + break; + + case SC_17: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_17"); + scene->preloadMovements(sceneVar); + scene17_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_17"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler17, 2); + scene17_restoreState(); + _updateCursorCallback = scene17_updateCursor; + break; + + case SC_18: + scene18_setupEntrance(); + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_18"); + scene->preloadMovements(sceneVar); + g_fp->stopAllSounds(); + + if (g_vars->scene18_inScene18p1) + scene18_initScene1(scene); + else + scene18_initScene2(scene); + + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_18"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler18, 2, 2); + _updateCursorCallback = scene18_updateCursor; + break; + + case SC_19: + if (!g_fp->_scene3) { + g_fp->_scene3 = accessScene(SC_18); + g_fp->_gameLoader->loadScene(SC_18); + + scene18_initScene2(g_fp->_scene3); + scene18_preload(); + scene19_setMovements(g_fp->_scene3, entrance->_field_4); + + g_vars->scene18_inScene18p1 = true; + } + + scene19_preload(); + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_19"); + scene->preloadMovements(sceneVar); + g_fp->stopAllSounds(); + + if (g_vars->scene18_inScene18p1) + scene18_initScene1(scene); + else + scene19_initScene2(); + + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_19"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler19, 2); + scene19_setSugarState(scene); + _updateCursorCallback = scene19_updateCursor; + break; + + case SC_20: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_20"); + scene->preloadMovements(sceneVar); + scene20_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_20"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler20, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_21: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_21"); + scene->preloadMovements(sceneVar); + scene21_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_21"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler21, 2, 2); + _updateCursorCallback = scene21_updateCursor; + break; + + case SC_22: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_22"); + scene->preloadMovements(sceneVar); + scene22_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_22"); + setSceneMusicParameters(sceneVar); + scene22_setBagState(); + insertMessageHandler(sceneHandler22, 2, 2); + _updateCursorCallback = scene22_updateCursor; + break; + + case SC_23: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_23"); + scene->preloadMovements(sceneVar); + scene23_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_23"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler23, 2, 2); + scene23_setGiraffeState(); + _updateCursorCallback = scene23_updateCursor; + break; + + case SC_24: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_24"); + scene->preloadMovements(sceneVar); + scene24_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_24"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler24, 2); + scene24_setPoolState(); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_25: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_25"); + scene->preloadMovements(sceneVar); + scene25_initScene(scene, entrance->_field_4); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_25"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler25, 2); + scene25_setupWater(scene, entrance->_field_4); + _updateCursorCallback = scene25_updateCursor; + break; + + case SC_26: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_26"); + scene->preloadMovements(sceneVar); + scene26_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_26"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler26, 2, 2); + scene26_setupDrop(scene); + _updateCursorCallback = scene26_updateCursor; + break; + + case SC_27: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_27"); + scene->preloadMovements(sceneVar); + scene27_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_27"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler27, 2); + _updateCursorCallback = scene27_updateCursor; + break; + + case SC_28: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_28"); + scene->preloadMovements(sceneVar); + scene28_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_28"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler28, 2, 2); + _updateCursorCallback = scene28_updateCursor; + break; + + case SC_29: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_29"); + scene->preloadMovements(sceneVar); + scene29_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_29"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler29, 2); + _updateCursorCallback = scene29_updateCursor; + break; + + case SC_30: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_30"); + scene->preloadMovements(sceneVar); + scene30_initScene(scene, entrance->_field_4); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_30"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler30, 2); + _updateCursorCallback = scene30_updateCursor; + break; + + case SC_31: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_31"); + scene->preloadMovements(sceneVar); + scene31_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_31"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler31, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_32: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_32"); + scene->preloadMovements(sceneVar); + scene32_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_32"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler32, 2, 2); + scene32_setupMusic(); + _updateCursorCallback = scene32_updateCursor; + break; + + case SC_33: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_33"); + scene->preloadMovements(sceneVar); + scene33_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_33"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler33, 2, 2); + scene33_setupMusic(); + _updateCursorCallback = scene33_updateCursor; + break; + + case SC_34: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_34"); + scene->preloadMovements(sceneVar); + scene34_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_34"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler34, 2, 2); + scene34_initBeh(); + _updateCursorCallback = scene34_updateCursor; + break; + + case SC_35: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_35"); + scene->preloadMovements(sceneVar); + scene35_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_35"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler35, 2, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_36: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_36"); + scene->preloadMovements(sceneVar); + scene36_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_36"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler36, 2); + _updateCursorCallback = scene36_updateCursor; + break; + + case SC_37: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_37"); + scene->preloadMovements(sceneVar); + scene37_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_37"); + setSceneMusicParameters(sceneVar); + insertMessageHandler(sceneHandler37, 2, 2); + _updateCursorCallback = scene37_updateCursor; + break; + + case SC_38: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_38"); + scene->preloadMovements(sceneVar); + scene38_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_38"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandler38, 2); + _updateCursorCallback = defaultUpdateCursor; + break; + + case SC_FINAL1: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_FINAL1"); + scene->preloadMovements(sceneVar); + sceneFinal_initScene(); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_FINAL1"); + setSceneMusicParameters(sceneVar); + addMessageHandler(sceneHandlerFinal, 2); + _updateCursorCallback = sceneFinal_updateCursor; + break; + + case SC_DBGMENU: + sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_DBGMENU"); + scene->preloadMovements(sceneVar); + sceneDbgMenu_initScene(scene); + _behaviorManager->initBehavior(scene, sceneVar); + scene->initObjectCursors("SC_DBGMENU"); + addMessageHandler(sceneHandlerDbgMenu, 2); + break; + + default: + error("Unknown scene %d", entrance->_sceneId); + break; + } + + return true; +} + +int defaultUpdateCursor() { + g_fp->updateCursorCommon(); + + return g_fp->_cursorId; +} + +void FullpipeEngine::updateMapPiece(int mapId, int update) { + for (int i = 0; i < 200; i++) { + int hiWord = (_mapTable[i] >> 16) & 0xffff; + + if (hiWord == mapId) { + _mapTable[i] |= update; + return; + } + if (!hiWord) { + _mapTable[i] = (mapId << 16) | update; + return; + } + } +} + +void FullpipeEngine::updateMap(PreloadItem *pre) { + switch (pre->sceneId) { + case SC_1: + updateMapPiece(PIC_MAP_S01, 1); + + if (pre->keyCode == TrubaUp) + updateMapPiece(PIC_MAP_P01, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_A13, 1); + break; + + case SC_2: + updateMapPiece(PIC_MAP_S02, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_P01, 1); + + break; + + case SC_3: + updateMapPiece(PIC_MAP_S03, 1); + break; + + case SC_4: + updateMapPiece(PIC_MAP_S04, 1); + + if (pre->keyCode == TrubaRight) + updateMapPiece(PIC_MAP_P04, 1); + + break; + + case SC_5: + updateMapPiece(PIC_MAP_S05, 1); + + if (pre->keyCode == TrubaLeft) { + updateMapPiece(PIC_MAP_P04, 1); + } + + if (pre->keyCode == TrubaUp) { + updateMapPiece(PIC_MAP_P05, 1); + updateMapPiece(PIC_MAP_A11, 1); + } + + break; + + case SC_6: + updateMapPiece(PIC_MAP_S06, 1); + + if (pre->keyCode == TrubaUp) + updateMapPiece(PIC_MAP_A12, 1); + + break; + + case SC_7: + updateMapPiece(PIC_MAP_S07, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_P18, 1); + + break; + + case SC_8: + updateMapPiece(PIC_MAP_S08, 1); + + if (pre->keyCode == TrubaUp) + updateMapPiece(PIC_MAP_P11, 1); + + if (pre->keyCode == TrubaRight) + updateMapPiece(PIC_MAP_P18, 1); + + return; + + case SC_9: + updateMapPiece(PIC_MAP_S09, 1); + + if (pre->keyCode == TrubaDown) + updateMapPiece(PIC_MAP_P11, 1); + + return; + + case SC_10: + updateMapPiece(PIC_MAP_S10, 1); + + if (pre->keyCode == TrubaRight) + updateMapPiece(PIC_MAP_P02, 1); + + break; + + case SC_11: + updateMapPiece(PIC_MAP_S11, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_P02, 1); + + break; + + case SC_12: + updateMapPiece(PIC_MAP_S12, 1); + break; + + case SC_13: + updateMapPiece(PIC_MAP_S13, 1); + + if (pre->keyCode == TrubaUp) { + updateMapPiece(PIC_MAP_P06, 1); + updateMapPiece(PIC_MAP_A10, 1); + } + break; + + case SC_14: + updateMapPiece(PIC_MAP_S14, 1); + break; + + case SC_15: + updateMapPiece(PIC_MAP_S15, 1); + + if (pre->keyCode == TrubaUp) { + updateMapPiece(PIC_MAP_P08, 1); + updateMapPiece(PIC_MAP_A14, 1); + } + + break; + + case SC_16: + updateMapPiece(PIC_MAP_S16, 1); + break; + + case SC_17: + updateMapPiece(PIC_MAP_S17, 1); + break; + + case SC_18: + updateMapPiece(PIC_MAP_S1819, 1); + + if (pre->keyCode == PIC_SC18_RTRUBA) + updateMapPiece(PIC_MAP_P14, 1); + + break; + + case SC_19: + updateMapPiece(PIC_MAP_S1819, 1); + + if (pre->keyCode == PIC_SC19_RTRUBA3) { + updateMapPiece(PIC_MAP_P15, 1); + updateMapPiece(PIC_MAP_A09, 1); + } + + break; + + case SC_20: + updateMapPiece(PIC_MAP_S20, 1); + break; + + case SC_21: + updateMapPiece(PIC_MAP_S21, 1); + + if (pre->keyCode == TrubaLeft) { + updateMapPiece(PIC_MAP_P15, 1); + updateMapPiece(PIC_MAP_A09, 1); + } + + if (pre->keyCode == TrubaDown) + updateMapPiece(PIC_MAP_A08, 1); + + break; + + case SC_22: + updateMapPiece(PIC_MAP_S22, 1); + break; + + case SC_23: + if (getObjectState(sO_UpperHatch_23) == getObjectEnumState(sO_UpperHatch_23, sO_Opened)) { + updateMapPiece(PIC_MAP_S23_1, 0); + updateMapPiece(PIC_MAP_S23_2, 1); + updateMapPiece(PIC_MAP_P07, 1); + } else { + updateMapPiece(PIC_MAP_S23_1, 1); + updateMapPiece(PIC_MAP_S23_2, 0); + } + break; + + case SC_24: + updateMapPiece(PIC_MAP_S24, 1); + + if (pre->keyCode == TrubaUp) + updateMapPiece(PIC_MAP_A08, 1); + + if (pre->keyCode == TrubaDown) { + updateMapPiece(PIC_MAP_P13, 1); + updateMapPiece(PIC_MAP_A07, 1); + } + break; + + case SC_25: + updateMapPiece(PIC_MAP_S25, 1); + break; + + case SC_26: + updateMapPiece(PIC_MAP_S26, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_A06, 1); + + if (pre->keyCode == TrubaUp) { + updateMapPiece(PIC_MAP_P13, 1); + updateMapPiece(PIC_MAP_A07, 1); + } + + break; + + case SC_27: + updateMapPiece(PIC_MAP_S27, 1); + break; + + case SC_28: + updateMapPiece(PIC_MAP_S28, 1); + + if (pre->keyCode == TrubaRight) + updateMapPiece(PIC_MAP_A06, 1); + + break; + + case SC_29: + updateMapPiece(PIC_MAP_S29, 1); + + if (pre->keyCode == TrubaUp) + updateMapPiece(PIC_MAP_A05, 1); + + break; + + case SC_30: + updateMapPiece(PIC_MAP_S30, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_P09, 1); + + if (pre->keyCode == TrubaRight) + updateMapPiece(PIC_MAP_A04, 1); + + break; + + case SC_31: + updateMapPiece(PIC_MAP_S31_2, 1); + + if (getObjectState(sO_Cactus) == getObjectEnumState(sO_Cactus, sO_HasGrown)) + updateMapPiece(PIC_MAP_S31_1, 1); + + if (pre->keyCode == TrubaRight) + updateMapPiece(PIC_MAP_P09, 1); + + break; + + case SC_32: + updateMapPiece(PIC_MAP_S32_2, 1); + + if (getObjectState(sO_Cactus) == getObjectEnumState(sO_Cactus, sO_HasGrown)) + updateMapPiece(PIC_MAP_S32_1, 1); + + break; + + case SC_33: + updateMapPiece(PIC_MAP_S33, 1); + break; + + case SC_34: + updateMapPiece(PIC_MAP_S34, 1); + + if (pre->keyCode == TrubaUp) + updateMapPiece(PIC_MAP_A03, 1); + + break; + + case SC_35: + updateMapPiece(PIC_MAP_S35, 1); + + if (pre->keyCode == TrubaLeft) + updateMapPiece(PIC_MAP_A02, 1); + + if (pre->keyCode == TrubaDown) + updateMapPiece(PIC_MAP_A03, 1); + + break; + + case SC_36: + updateMapPiece(PIC_MAP_S36, 1); + break; + + case SC_37: + updateMapPiece(PIC_MAP_S37, 1); + updateMapPiece(PIC_MAP_A01, 1); + break; + + case SC_38: + updateMapPiece(PIC_MAP_S38, 1); + + switch (pre->preloadId1) { + case SC_15: + updateMapPiece(PIC_MAP_P16, 1); + break; + + case SC_1: + updateMapPiece(PIC_MAP_P10, 1); + break; + + case SC_10: + updateMapPiece(PIC_MAP_P17, 1); + break; + + case SC_19: + updateMapPiece(PIC_MAP_P12, 1); + break; + } + break; + } +} + +void BallChain::init(Ball **ball) { + *ball = pTail; + pTail = (Ball *)ball; + numBalls--; + + if (!numBalls) { + for (Ball *i = pHead; i; i = i->p0 ) + ; + numBalls = 0; + pTail = 0; + field_8 = 0; + pHead = 0; + free(cPlex); + cPlex = 0; + } +} + +Ball *BallChain::sub04(Ball *ballP, Ball *ballN) { + if (!pTail) { + if (!cPlexLen) + error("BallChain::sub04: cPlexLen is 0"); + + cPlex = (byte *)calloc(cPlexLen, sizeof(Ball)); + + Ball *runPtr = (Ball *)&cPlex[(cPlexLen - 1) * sizeof(Ball)]; + + for (int i = 0; i < cPlexLen; i++) { + runPtr->p0 = pTail; + pTail = runPtr; + + runPtr--; + } + } + + Ball *res = pTail; + + pTail = res->p0; + res->p1 = ballP; + res->p0 = ballN; + numBalls++; + res->ani = 0; + + return res; +} + +void BallChain::removeBall(Ball *ball) { + if (ball == pHead) + pHead = ball->p0; + else + ball->p1->p0 = ball->p0; + + if (ball == field_8) + field_8 = ball->p1; + else + ball->p0->p1 = ball->p1; + + ball->p0 = pTail; + pTail = ball; + + numBalls--; + + if (!numBalls) { + numBalls = 0; + pTail = 0; + field_8 = 0; + pHead = 0; + free(cPlex); + cPlex = 0; + } +} + + +} // End of namespace Fullpipe |