diff options
Diffstat (limited to 'engines/fullpipe')
| -rw-r--r-- | engines/fullpipe/behavior.cpp | 13 | ||||
| -rw-r--r-- | engines/fullpipe/behavior.h | 2 | ||||
| -rw-r--r-- | engines/fullpipe/configure.engine | 3 | ||||
| -rw-r--r-- | engines/fullpipe/constants.h | 52 | ||||
| -rw-r--r-- | engines/fullpipe/fullpipe.h | 1 | ||||
| -rw-r--r-- | engines/fullpipe/gfx.cpp | 14 | ||||
| -rw-r--r-- | engines/fullpipe/init.cpp | 4 | ||||
| -rw-r--r-- | engines/fullpipe/motion.cpp | 4 | ||||
| -rw-r--r-- | engines/fullpipe/objectnames.h | 2 | ||||
| -rw-r--r-- | engines/fullpipe/scenes.cpp | 15 | ||||
| -rw-r--r-- | engines/fullpipe/scenes.h | 19 | ||||
| -rw-r--r-- | engines/fullpipe/scenes/scene04.cpp | 619 | ||||
| -rw-r--r-- | engines/fullpipe/sound.cpp | 3 | ||||
| -rw-r--r-- | engines/fullpipe/statics.cpp | 18 | ||||
| -rw-r--r-- | engines/fullpipe/utils.cpp | 15 |
15 files changed, 755 insertions, 29 deletions
diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp index c7b526d2c1..c27f1082f5 100644 --- a/engines/fullpipe/behavior.cpp +++ b/engines/fullpipe/behavior.cpp @@ -185,6 +185,19 @@ bool BehaviorManager::setBehaviorEnabled(StaticANIObject *obj, int aniId, int qu return true; } +void BehaviorManager::setFlagByStaticAniObject(StaticANIObject *ani, int flag) { + for (uint i = 0; i < _behaviors.size(); i++) { + BehaviorInfo *beh = _behaviors[i]; + + if (ani == beh->_ani) { + if (flag) + beh->_flags &= 0xfe; + else + beh->_flags |= 1; + } + } +} + void BehaviorInfo::clear() { _ani = 0; _staticsId = 0; diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h index 4fd1454351..1ac0b5bbfe 100644 --- a/engines/fullpipe/behavior.h +++ b/engines/fullpipe/behavior.h @@ -79,6 +79,8 @@ class BehaviorManager : public CObject { void updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *beh); bool setBehaviorEnabled(StaticANIObject *obj, int aniId, int quId, int flag); + + void setFlagByStaticAniObject(StaticANIObject *ani, int flag); }; } // End of namespace Fullpipe diff --git a/engines/fullpipe/configure.engine b/engines/fullpipe/configure.engine new file mode 100644 index 0000000000..fce5951e26 --- /dev/null +++ b/engines/fullpipe/configure.engine @@ -0,0 +1,3 @@ +# This file is included from the main "configure" script +# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps] +add_engine fullpipe "Full Pipe" no diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h index a2e8121f8f..77eb83d460 100644 --- a/engines/fullpipe/constants.h +++ b/engines/fullpipe/constants.h @@ -25,7 +25,9 @@ namespace Fullpipe { +#define ANI_BIGBALL 4923 #define ANI_BOOT_1 4231 +#define ANI_BUTTON 598 #define ANI_CLOCK 588 #define ANI_DOMINO_3 2732 #define ANI_DADAYASHIK 306 @@ -46,8 +48,12 @@ namespace Fullpipe { #define ANI_PLANK 501 #define ANI_SC2_BOX 1020 #define ANI_SC4_BOOT 1035 +#define ANI_SC4_COIN 690 #define ANI_SPEAKER_4 3275 #define ANI_SPRING 542 +#define MSG_CLICKBOTTLE 569 +#define MSG_CLICKBUTTON 609 +#define MSG_CLICKPLANK 549 #define MSG_CMN_WINARCADE 4778 #define MSG_DISABLESAVES 5201 #define MSG_ENABLESAVES 5202 @@ -57,13 +63,16 @@ namespace Fullpipe { #define MSG_INTR_GETUPMAN 5135 #define MSG_INTR_SWITCHTO1 5145 #define MSG_INTR_SWITCHTO2 5134 +#define MSG_KOZAWRESTART 546 #define MSG_LIFT_CLICKBUTTON 2780 #define MSG_LIFT_CLOSEDOOR 5194 #define MSG_LIFT_EXITLIFT 5187 #define MSG_LIFT_GO 1065 #define MSG_LIFT_STARTEXITQUEUE 5186 +#define MSG_LOWERPLANK 540 #define MSG_MANSHADOWSOFF 5196 #define MSG_MANSHADOWSON 5197 +#define MSG_RAISEPLANK 547 #define MSG_RESTARTGAME 4767 #define MSG_SC1_SHOWOSK 1019 #define MSG_SC1_SHOWOSK2 468 @@ -78,12 +87,38 @@ namespace Fullpipe { #define MSG_SC3_TAKEEGG 1583 #define MSG_SC3_TESTFAT 1582 #define MSG_SC3_UTRUBACLICK 1103 +#define MSG_SC4_COINOUT 2895 +#define MSG_SC4_COINPUT 1032 +#define MSG_SC4_CLICKLADDER 1439 +#define MSG_SC4_DROPBOTTLE 2896 +#define MSG_SC4_HANDOVER 2960 +#define MSG_SC4_HIDEBOOT 4563 +#define MSG_SC4_KOZAWFALL 2858 +#define MSG_SC4_MANFROMBOTTLE 2854 +#define MSG_SC4_MANTOBOTTLE 2852 +#define MSG_GOTOLADDER 618 +#define MSG_SHAKEBOTTLE 584 +#define MSG_SHOOTKOZAW 557 +#define MSG_SHOWCOIN 1033 +#define MSG_STARTHAND 612 +#define MSG_TAKEBOTTLE 614 +#define MSG_TAKEKOZAW 611 +#define MSG_TESTPLANK 538 +#define MSG_UPDATEBOTTLE 613 #define MV_EGTR_FATASK 5332 #define MV_IN1MAN_SLEEP 5111 #define MV_KZW_JUMP 558 #define MV_KZW_JUMPROTATE 561 +#define MV_KZW_TOHOLERV 537 +#define MV_KZW_WALKPLANK 500 +#define MV_BDG_OPEN 1379 +#define MV_BTN_CLICK 599 +#define MV_CLK_GO 589 +#define MV_HND_POINT 602 +#define MV_MAN_GOD 481 #define MV_MAN_GOLADDER 451 #define MV_MAN_GOLADDER2 2844 +#define MV_MAN_GOU 460 #define MV_MAN_LOOKUP 4773 #define MV_MAN_STARTLADDER 452 #define MV_MAN_STARTLADDER2 2842 @@ -92,6 +127,9 @@ namespace Fullpipe { #define MV_MAN_TOLADDER 448 #define MV_MAN_TOLADDER2 2841 #define MV_MAN_TURN_LU 486 +#define MV_PNK_WEIGHTLEFT 541 +#define MV_PNK_WEIGHTRIGHT 502 +#define MV_SC4_COIN_default 1029 #define MV_SPK4_PLAY 3276 #define PIC_CMN_EVAL 3468 #define PIC_CSR_DEFAULT 4891 @@ -142,19 +180,26 @@ namespace Fullpipe { #define PIC_SC4_BOTTLE 568 #define PIC_SC4_BOTTLE2 2936 #define PIC_SC4_DOWNTRUBA 619 +#define PIC_SC4_LADDER 1438 #define PIC_SC4_LRTRUBA 616 #define PIC_SC4_MASK 585 #define PIC_SC4_PLANK 5183 #define PIC_SCD_SEL 734 +#define QU_BALL_WALKL 4920 +#define QU_BALL_WALKR 4919 #define QU_EGTR_MD2_SHOW 4698 #define QU_EGTR_MD1_SHOW 4697 #define QU_EGTR_SLIMSHOW 4883 +#define QU_HND_TAKEBOTTLE 1443 #define QU_IN2_DO 5144 #define QU_INTR_FINISH 5138 #define QU_INTR_GETUPMAN 5136 #define QU_INTR_STARTINTRO 5133 +#define QU_KOZAW_WALK 505 +#define QU_PNK_CLICK 550 #define QU_SC3_ENTERLIFT 2779 #define QU_SC3_EXITLIFT 2808 +#define QU_SC4_MANFROMBOTTLE 2851 #define SC_1 301 #define SC_10 653 #define SC_11 654 @@ -207,13 +252,18 @@ namespace Fullpipe { #define SC_MAP 5222 #define SC_TEST 903 #define SC_TITLES 5166 +#define SND_4_010 3125 +#define SND_4_012 3127 +#define SND_4_033 4990 #define SND_CMN_031 3516 #define SND_CMN_070 5199 #define SND_INTR_019 5220 +#define ST_CLK_CLOSED 590 #define ST_DYAS_LIES 318 #define ST_EGTR_MID1 2863 #define ST_EGTR_MID2 2869 #define ST_EGTR_SLIM 336 +#define ST_HND_EMPTY 603 #define ST_IN1MAN_SLEEP 5112 #define ST_KZW_EMPTY 498 #define ST_LBN_0N 2832 @@ -238,6 +288,8 @@ namespace Fullpipe { #define ST_LBN_9P 2778 #define ST_MAN_EMPTY 476 #define ST_MAN_RIGHT 325 +#define ST_MAN_SIT 1164 +#define ST_PNK_WEIGHTLEFT 503 #define TrubaDown 697 #define TrubaLeft 474 #define TrubaRight 696 diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h index 63dde5042b..00d2863c94 100644 --- a/engines/fullpipe/fullpipe.h +++ b/engines/fullpipe/fullpipe.h @@ -142,6 +142,7 @@ public: void toggleMute(); void playSound(int id, int flag); void startSceneTrack(); + void stopSoundStream2(); int _sfxVolume; diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp index 2e89bd6003..fba7e402d2 100644 --- a/engines/fullpipe/gfx.cpp +++ b/engines/fullpipe/gfx.cpp @@ -464,6 +464,8 @@ Picture::~Picture() { } void Picture::freePicture() { + debug(5, "Picture::freePicture(): file: %s", _memfilename); + if (_bitmap) { if (testFlags() && !_field_54) { freeData(); @@ -519,7 +521,7 @@ bool Picture::load(MfcArchive &file) { getData(); - debug(5, "Picture::load: <%s>", _memfilename); + debug(5, "Picture::load: loaded <%s>", _memfilename); return true; } @@ -539,6 +541,10 @@ void Picture::setAOIDs() { } void Picture::init() { + debug(5, "Picture::init(), %s", _memfilename); + + MemoryObject::getData(); + _bitmap = new Bitmap(); getDibInfo(); @@ -567,6 +573,12 @@ void Picture::getDibInfo() { warning("Uneven data size: 0x%x", _dataSize); } + if (!_data) { + warning("Picture::getDibInfo: data is empty <%s>", _memfilename); + + MemoryObject::load(); + } + Common::MemoryReadStream *s = new Common::MemoryReadStream(_data + off - 32, 32); _bitmap->load(s); diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp index 49bf72ac91..eb109e11ec 100644 --- a/engines/fullpipe/init.cpp +++ b/engines/fullpipe/init.cpp @@ -65,7 +65,7 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight)); setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14)); setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent)); - setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe)); + setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_IsOpened)); setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree)); setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom)); setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree)); @@ -84,7 +84,7 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken)); setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool)); setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_IsClosed)); - setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe)); + setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_IsOpened)); setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed)); setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging)); setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_IsClosed)); diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp index c1977c0ac3..f67011a50f 100644 --- a/engines/fullpipe/motion.cpp +++ b/engines/fullpipe/motion.cpp @@ -765,7 +765,7 @@ MessageQueue *MovGraph2::buildMovInfo1MessageQueue(MovInfo1 *movInfo) { MessageQueue *mq2 = genMovement(&movinfo); - if (mq2) { + if (!mq2) { delete mq; return 0; } @@ -979,6 +979,8 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int if (minPath < 0.0 || ((linkInfoSource.node != linkInfoDest.node || !linkInfoSource.node) && !tempLinkList.size())) return 0; + memset(&movInfo1, 0, sizeof(movInfo1)); + movInfo1.subIndex = idxsub; movInfo1.pt1.x = obj->_ox; movInfo1.pt1.y = obj->_oy; diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h index 241e31b165..b8696ec672 100644 --- a/engines/fullpipe/objectnames.h +++ b/engines/fullpipe/objectnames.h @@ -148,7 +148,7 @@ namespace Fullpipe { #define sO_ClockAxis "\xce\xf1\xfc \xf7\xe0\xf1\xee\xe2" // "Ось часов" #define sO_Opened "\xce\xf2\xea\xf0\xfb\xf2" // "Открыт" #define sO_OpenedWithBoot "\xce\xf2\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec" // "Открыта с ботинком" -#define sO_OpenedShe "\xce\xf2\xea\xf0\xfb\xf2\xe0" // "Открыта" +#define sO_IsOpened "\xce\xf2\xea\xf0\xfb\xf2\xe0" // "Открыта" #define sO_WeirdWacko "\xce\xf2\xec\xee\xf0\xee\xe6\xe5\xed\xed\xfb\xe9" // "Отмороженный" #define sO_NotPresent "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2" // "Отсутствует" #define sO_Error "\xce\xf8\xe8\xe1\xea\xe0" // "Ошибка" diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp index 801734eff8..014459e847 100644 --- a/engines/fullpipe/scenes.cpp +++ b/engines/fullpipe/scenes.cpp @@ -73,10 +73,16 @@ Vars::Vars() { scene04_soundPlaying = false; scene04_dynamicPhaseIndex = 0; + scene04_sceneClickX = 0; + scene04_sceneClickY = 0; + + scene04_dudePosX = 0; + scene04_dudePosY = 0; + scene04_var01 = 0; scene04_var02 = 0; scene04_var04 = 0; - scene04_var05 = 0; + scene04_walkingKozyawka = 0; scene04_var06 = 0; scene04_var07 = 0; scene04_var08 = 0; @@ -87,10 +93,13 @@ Vars::Vars() { scene04_var13 = 0; scene04_var14 = 0; scene04_var15 = 0; - scene04_var16 = 0; - scene04_var17 = 0; + scene04_speakerVariant = 0; + scene04_speakerPhase = 0; scene04_var18 = 0; scene04_var19 = 0; + scene04_var20 = 0; + scene04_var24 = 0; + scene04_bottleY = 0; selector = 0; } diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h index 741835fd1e..670b94a839 100644 --- a/engines/fullpipe/scenes.h +++ b/engines/fullpipe/scenes.h @@ -89,19 +89,23 @@ public: Common::Point scene04_jumpingKozyawki[20]; Common::Point scene04_jumpRotateKozyawki[20]; - Common::Array<StaticANIObject *> scene04_kozyawkiObjList; - Common::Array<PictureObject *> scene04_bottleObjList; - Common::Array<StaticANIObject *> scene04_kozyawkiAni; + Common::List<StaticANIObject *> scene04_kozyawkiObjList; + Common::List<GameObject *> scene04_bottleObjList; + Common::List<StaticANIObject *> scene04_kozyawkiAni; int scene04_ladder; bool scene04_coinPut; bool scene04_soundPlaying; int scene04_dynamicPhaseIndex; + int scene04_sceneClickX; + int scene04_sceneClickY; + int scene04_dudePosX; + int scene04_dudePosY; int scene04_var01; int scene04_var02; int scene04_var04; - int scene04_var05; + StaticANIObject *scene04_walkingKozyawka; int scene04_var06; int scene04_var07; int scene04_var08; @@ -112,10 +116,13 @@ public: int scene04_var13; int scene04_var14; int scene04_var15; - int scene04_var16; - int scene04_var17; + int scene04_speakerVariant; + int scene04_speakerPhase; int scene04_var18; int scene04_var19; + int scene04_var20; + StaticANIObject *scene04_var24; + int scene04_bottleY; PictureObject *selector; }; diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp index 6a2b32ad6f..98ded32599 100644 --- a/engines/fullpipe/scenes/scene04.cpp +++ b/engines/fullpipe/scenes/scene04.cpp @@ -32,11 +32,32 @@ #include "fullpipe/scene.h" #include "fullpipe/interaction.h" #include "fullpipe/gameloader.h" +#include "fullpipe/behavior.h" +#include "fullpipe/motion.h" namespace Fullpipe { -void scene04_callback(int *param) { - warning("STUB: scene04_callback"); +static const int scene04_speakerPhases[] = { + 0, 1, 2, 3, -1, -1, + 0, 2, 3, -1, -1, -1, + 0, 2, -1, -1, -1, -1 +}; + +void scene04_speakerCallback(int *phase) { + if (g_vars->scene04_soundPlaying) { + if (g_vars->scene04_speakerPhase >= 0) { + *phase = scene04_speakerPhases[g_vars->scene04_speakerPhase + 6 * g_vars->scene04_speakerVariant]; + + g_vars->scene04_speakerPhase++; + + if (scene04_speakerPhases[g_vars->scene04_speakerPhase + 6 * g_vars->scene04_speakerVariant] < 0) { + g_vars->scene04_speakerPhase = 0; + g_vars->scene04_speakerVariant = g_fullpipe->_rnd->getRandomNumber(2); + } + } else { + ++g_vars->scene04_speakerPhase; + } + } } void scene04_initScene(Scene *sc) { @@ -140,9 +161,9 @@ void scene04_initScene(Scene *sc) { } g_vars->scene04_var02 = 0; - g_vars->scene04_soundPlaying = 0; + g_vars->scene04_soundPlaying = false; g_vars->scene04_var04 = 0; - g_vars->scene04_var05 = 0; + g_vars->scene04_walkingKozyawka = 0; g_vars->scene04_var06 = 2; g_vars->scene04_dynamicPhaseIndex = 0; @@ -165,11 +186,11 @@ void scene04_initScene(Scene *sc) { g_vars->scene04_mamasha->hide(); g_vars->scene04_speaker = sc->getStaticANIObject1ById(ANI_SPEAKER_4, -1); - g_vars->scene04_speaker->_callback2 = scene04_callback; + g_vars->scene04_speaker->_callback2 = scene04_speakerCallback; g_vars->scene04_speaker->startAnim(MV_SPK4_PLAY, 0, -1); - g_vars->scene04_var16 = 0; - g_vars->scene04_var17 = 0; + g_vars->scene04_speakerVariant = 0; + g_vars->scene04_speakerPhase = 0; g_fullpipe->initArcadeKeys("SC_4"); } @@ -211,8 +232,590 @@ int scene04_updateCursor() { return g_fullpipe->_cursorId; } +void sceneHandlers_sub01(ExCommand *ex) { + warning("sceneHandlers_sub01()"); +} + +void sceneHandler04_checkBigBallClick() { + StaticANIObject *ball = g_fullpipe->_currentScene->getStaticANIObject1ById(ANI_BIGBALL, -1); + + if (ball) + for (uint i = 0; i < ball->_movements.size(); i++) + ((Movement *)ball->_movements[i])->_counterMax = 73; + + g_vars->scene04_var13 = 1; +} + +void sceneHandler04_clickBottle() { + if (!g_vars->scene04_var02) + g_vars->scene04_var20 += 5; +} + +void sceneHandler04_clickButton() { + StaticANIObject *but = g_fullpipe->_currentScene->getStaticANIObject1ById(ANI_BUTTON, -1); + + if (but) { + if (!g_vars->scene04_clock->_movement || + (g_vars->scene04_clock->_movement->_id == MV_CLK_GO && g_vars->scene04_clock->_movement->_currDynamicPhaseIndex > 3 && + g_vars->scene04_clock->_movement->_currDynamicPhaseIndex < 105)) { + if (!g_vars->scene04_hand->_movement && !g_vars->scene04_var02) { + but->startAnim(MV_BTN_CLICK, 0, -1); + g_vars->scene04_hand->startAnim(MV_HND_POINT, 0, -1); + } + } + } +} + +void sceneHandler04_clickLadder() { + warning("sceneHandler04_clickLadder()"); +} + +void sceneHandler04_sub13() { + warning("sceneHandler04_sub13()"); +} + +void sceneHandler04_clickPlank() { + if (sceneHandler04_friesAreWalking()) + sceneHandler04_sub13(); + else if (g_vars->scene04_var01) + g_fullpipe->playSound(SND_4_033, 0); + else if (!g_vars->scene04_soundPlaying) + chainQueue(QU_PNK_CLICK, 0); +} + +void sceneHandler04_dropBottle() { + g_vars->scene04_var12 = 1; + g_vars->scene04_bottleY = 10; + g_vars->scene04_var06 = 0; + + while (g_vars->scene04_kozyawkiAni.size()) { + StaticANIObject *koz = g_vars->scene04_kozyawkiAni.front(); + g_vars->scene04_kozyawkiAni.pop_front(); + + for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it) + if (*it == koz) { + g_vars->scene04_bottleObjList.erase(it); + break; + } + + koz->queueMessageQueue(0); + koz->hide(); + + g_vars->scene04_kozyawkiObjList.push_back(koz); + } + + g_vars->scene04_hand->changeStatics2(ST_HND_EMPTY); + + g_vars->scene04_hand->setOXY(429, 21); + g_vars->scene04_hand->_priority = 15; +} + +void sceneHandler04_gotoLadder(int par) { + warning("sceneHandler04_gotoLadder()"); +} + +void sceneHandler04_lowerPlank() { + g_vars->scene04_plank->startAnim(MV_PNK_WEIGHTRIGHT, 0, -1); +} + +void sceneHandler04_manFromBottle() { + warning("sceneHandler04_manFromBottle()"); +} + +void sceneHandler04_manToBottle() { + g_vars->scene04_bottleObjList.push_back(g_fullpipe->_aniMan); + g_vars->scene04_var20 = 5; + g_vars->scene04_var06 += 9; + g_fullpipe->_aniMan2 = g_fullpipe->_aniMan; + g_vars->scene04_var10 = 1; +} + +void sceneHandler04_raisePlank() { + g_vars->scene04_plank->startAnim(MV_PNK_WEIGHTLEFT, 0, -1); +} + +void sceneHandler04_shootKozyawka() { + warning("sceneHandler04_shootKozyawka()"); +} + +void sceneHandler04_showCoin() { + StaticANIObject *ani = g_fullpipe->_currentScene->getStaticANIObject1ById(ANI_SC4_COIN, -1); + + if (ani) { + ani->show1(MV_BDG_OPEN, MV_MAN_GOU, MV_SC4_COIN_default, 0); + + ani->_priority = 40; + } +} + +void sceneHandler04_stopSound() { + warning("sceneHandler04_stopSound()"); +} + +void sceneHandler04_sub1(ExCommand *ex) { + g_fullpipe->_aniMan->changeStatics2(ST_MAN_SIT); + + MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(QU_SC4_MANFROMBOTTLE), 0, 0); + + if (ex) { + ExCommand *newex = new ExCommand(ex); + + mq->_exCommands.push_back(newex); + } + + mq->_flags |= 1; + mq->chain(0); + + g_vars->scene04_var10 = 0; + g_fullpipe->_behaviorManager->setFlagByStaticAniObject(g_fullpipe->_aniMan, 1); +} + +void sceneHandler04_walkKozyawka() { + if (g_vars->scene04_kozyawkiObjList.size()) { + g_vars->scene04_walkingKozyawka = g_vars->scene04_kozyawkiObjList.front(); + g_vars->scene04_kozyawkiObjList.pop_front(); + + MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(QU_KOZAW_WALK), 0, 1); + mq->replaceKeyCode(-1, g_vars->scene04_walkingKozyawka->_okeyCode); + mq->chain(0); + } +} + +void sceneHandler04_sub4() { + warning("sceneHandler04_sub4()"); +} + +void sceneHandler04_sub5() { + warning("sceneHandler04_sub5()"); +} + +void sceneHandler04_bottleUpdateObjects(int off) { + for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it) { + GameObject *obj = *it; + + obj->setOXY(obj->_field_8 + 20, off + obj->_field_8 + 24); + } +} + +void sceneHandler04_liftBottle() { + int newy = g_vars->scene04_bottleY + g_vars->scene04_spring->_oy; + + g_vars->scene04_bottleY += 5; + + sceneHandler04_bottleUpdateObjects(newy - g_vars->scene04_spring->_oy); + + g_vars->scene04_spring->setOXY(g_vars->scene04_spring->_ox, newy); + + if (g_vars->scene04_bottle->_oy >= 226) { + sceneHandler04_bottleUpdateObjects(226 - g_vars->scene04_bottle->_oy); + + g_vars->scene04_spring->setOXY(g_vars->scene04_spring->_ox, 437); + g_vars->scene04_var12 = 0; + g_vars->scene04_var09 = 0; + g_vars->scene04_var19 = 1; + g_vars->scene04_var06 = 2; + g_vars->scene04_var20 = 10; + g_vars->scene04_var02 = 0; + + g_fullpipe->setObjectState(sO_LowerPipe, g_fullpipe->getObjectEnumState(sO_LowerPipe, sO_IsClosed)); + } +} + +void sceneHandler04_sub7() { + warning("sceneHandler04_sub7()"); +} + +void sceneHandler04_sub8(ExCommand *ex) { + warning("sceneHandler04_sub8()"); +} + +void sceneHandler04_sub9(StaticANIObject *ani) { + warning("sceneHandler04_sub9()"); +} + +void sceneHandler04_sub12() { + StaticANIObject *ball = g_fullpipe->_currentScene->getStaticANIObject1ById(ANI_BIGBALL, -1); + + if (ball && ball->_flags & 4) + for (uint i = 0; i < ball->_movements.size(); i++) + ((Movement *)ball->_movements[i])->_counterMax = 0; + + g_vars->scene04_var13 = 0; +} + +void sceneHandler04_sub15() { + warning("sceneHandler04_sub15()"); +} + +void sceneHandler04_sub17() { +#if 0 + StaticANIObject *ball = g_fullpipe->_currentScene->getStaticANIObject1ById(ANI_BIGBALL, -1); + + if (g_vars->scene04_var01 + && (!ball || !(ball->_flags & 4)) + && g_vars->scene04_ladder->collisionDetection(g_fullpipe->_aniMan) > 3) { + + if (!g_fullpipe->_rnd->getRandomNumber(49)) { + if (g_vars->scene04_var15) + chainQueue(QU_BALL_WALKR, 0); + else + chainQueue(QU_BALL_WALKL, 0); + + g_vars->scene04_var15 = !g_vars->scene04_var15; + + sceneHandler04_checkBigBallClick(); + + g_vars->scene04_var14 = 0; + } + } +#endif + + warning("sceneHandler04_sub17()"); +} + +void sceneHandler04_takeBottle() { + g_vars->scene04_var02 = 1; + g_vars->scene04_hand->_priority = 5; + + g_fullpipe->setObjectState(sO_LowerPipe, g_fullpipe->getObjectEnumState(sO_LowerPipe, sO_IsOpened)); +} + +void sceneHandler04_takeKozyawka() { + warning("sceneHandler04_takeKozyawka()"); +} + +void sceneHandler04_testPlank(ExCommand *ex) { + MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex->_parId); + + if (!mq) + return; + + if (g_vars->scene04_plank->_movement || !g_vars->scene04_plank->_statics || g_vars->scene04_plank->_statics->_staticsId != ST_PNK_WEIGHTLEFT) { + mq->getExCommandByIndex(0)->_messageNum = MV_KZW_TOHOLERV; + } else { + mq->getExCommandByIndex(0)->_messageNum = MV_KZW_WALKPLANK; + } +} + +void sceneHandler04_updateBottle() { + Common::Point point; + + int yoff; + + if (g_vars->scene04_hand->_movement) + yoff = g_vars->scene04_hand->_movement->_oy; + else + yoff = g_vars->scene04_hand->_oy; + + int newy = g_vars->scene04_hand->getSomeXY(point)->y + yoff + 140; + + sceneHandler04_bottleUpdateObjects(newy - g_vars->scene04_spring->_oy); + + g_vars->scene04_spring->setOXY(g_vars->scene04_spring->_ox, newy); +} + +void sceneHandler04_winArcade() { + if (g_fullpipe->getObjectState(sO_LowerPipe) == g_fullpipe->getObjectEnumState(sO_LowerPipe, sO_IsClosed) + && g_vars->scene04_soundPlaying) { + g_vars->scene04_clock->changeStatics2(ST_CLK_CLOSED); + g_vars->scene04_hand->changeStatics2(ST_HND_EMPTY); + + chainQueue(QU_HND_TAKEBOTTLE, 1); + + if (g_vars->scene04_walkingKozyawka) { + g_vars->scene04_kozyawkiObjList.push_back(g_vars->scene04_walkingKozyawka); + + g_vars->scene04_walkingKozyawka->changeStatics2(ST_KZW_EMPTY); + g_vars->scene04_walkingKozyawka->hide(); + g_vars->scene04_walkingKozyawka = 0; + } + + g_vars->scene04_var19 = 0; + g_vars->scene04_soundPlaying = 0; + + getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->setEnabled(); + + getGameLoaderInteractionController()->enableFlag24(); + + g_fullpipe->stopSoundStream2(); + } +} + int sceneHandler04(ExCommand *ex) { - warning("STUB: sceneHandler04()"); + if (ex->_messageKind != 17) + return 0; + + switch (ex->_messageNum) { + case MSG_UPDATEBOTTLE: + sceneHandler04_updateBottle(); + break; + + case MSG_CLICKBOTTLE: + sceneHandler04_clickBottle(); + break; + + case MSG_SHOOTKOZAW: + sceneHandler04_shootKozyawka(); + break; + + case MSG_SHAKEBOTTLE: + if (!g_vars->scene04_var02) + ++g_vars->scene04_var20; + break; + + case MSG_STARTHAND: + g_vars->scene04_var09 = 1; + g_vars->scene04_coinPut = 0; + + if (g_vars->scene04_var10) + sceneHandler04_sub1(0); + + sceneHandler04_sub15(); + sceneHandler04_stopSound(); + break; + + case MSG_TAKEKOZAW: + sceneHandler04_takeKozyawka(); + break; + + case MSG_CLICKBUTTON: + sceneHandler04_clickButton(); + break; + + case MSG_CLICKPLANK: + sceneHandler04_clickPlank(); + break; + + case MSG_RAISEPLANK: + sceneHandler04_raisePlank(); + break; + + case MSG_KOZAWRESTART: + if (g_vars->scene04_walkingKozyawka) { + g_vars->scene04_kozyawkiObjList.push_back(g_vars->scene04_walkingKozyawka); + g_vars->scene04_walkingKozyawka->hide(); + g_vars->scene04_walkingKozyawka = 0; + } + + if (g_vars->scene04_soundPlaying) + sceneHandler04_walkKozyawka(); + + break; + + case MSG_LOWERPLANK: + sceneHandler04_lowerPlank(); + break; + + case MSG_TESTPLANK: + sceneHandler04_testPlank(ex); + break; + + case 33: + { + g_vars->scene04_dudePosX = g_fullpipe->_aniMan->_ox; + g_vars->scene04_dudePosY = g_fullpipe->_aniMan->_oy; + + int res = 0; + + if (g_fullpipe->_aniMan2) { + if (g_fullpipe->_aniMan->_ox < g_fullpipe->_sceneRect.left + 200) { + g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan->_ox - g_fullpipe->_sceneRect.left - 300; + g_fullpipe->_aniMan->_ox = g_vars->scene04_dudePosX; + } + if (g_fullpipe->_aniMan->_ox > g_fullpipe->_sceneRect.right - 200) { + g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan->_ox - g_fullpipe->_sceneRect.right + 300; + } + + res = 1; + + if (g_vars->scene04_soundPlaying) { + if (g_fullpipe->_aniMan->_movement) { + if (g_fullpipe->_aniMan->_movement->_id == MV_MAN_TOLADDER) { + g_fullpipe->_aniMan2 = 0; + + if (g_fullpipe->_sceneRect.left > 380) + g_fullpipe->_currentScene->_x = 380 - g_fullpipe->_sceneRect.left; + } + } + } + } else { + if (g_fullpipe->_aniMan->_movement && g_fullpipe->_aniMan->_movement->_id == MV_MAN_GOD) + g_fullpipe->_aniMan2 = g_fullpipe->_aniMan; + } + + sceneHandler04_sub4(); + + if (g_vars->scene04_var07 && !g_vars->scene04_var09) + sceneHandler04_sub5(); + + if (g_vars->scene04_var12) + sceneHandler04_liftBottle(); + + if (g_vars->scene04_var08) + sceneHandler04_clickLadder(); + + if (g_vars->scene04_var10 && g_vars->scene04_hand->_movement) + sceneHandler04_sub1(0); + + if (g_vars->scene04_coinPut && g_vars->scene04_var18 && !g_vars->scene04_var09 && !g_vars->scene04_soundPlaying) + sceneHandler04_sub7(); + + if (g_vars->scene04_var01) { + if (!g_vars->scene04_soundPlaying) { + g_fullpipe->startSceneTrack(); + + g_fullpipe->_behaviorManager->updateBehaviors(); + return res; + } + + g_vars->scene04_var14++; + + if (g_vars->scene04_var14 > 600) + sceneHandler04_sub17(); + } + + if (g_vars->scene04_soundPlaying) { + g_fullpipe->_behaviorManager->updateBehaviors(); + + return res; + } + + g_fullpipe->startSceneTrack(); + + g_fullpipe->_behaviorManager->updateBehaviors(); + + return res; + } + + case 29: + { + int picid = g_fullpipe->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY); + + if (g_vars->scene04_var10) { + sceneHandler04_sub1(ex); + + break; + } + + if (picid == PIC_SC4_LADDER) { + if (!g_vars->scene04_var04) { + g_vars->scene04_sceneClickX = ex->_sceneClickX; + g_vars->scene04_sceneClickY = ex->_sceneClickY; + + sceneHandler04_clickLadder(); + + ex->_messageKind = 0; + + break; + } + + sceneHandler04_gotoLadder(0); + + break; + } + + StaticANIObject *ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY); + + if ((ani && ani->_id == ANI_PLANK) || picid == PIC_SC4_PLANK) { + sceneHandler04_clickPlank(); + + ex->_messageKind = 0; + } else if (g_vars->scene04_var01) { + sceneHandler04_sub8(ex); + } else if (!ani || !canInteractAny(g_fullpipe->_aniMan, ani, ex->_keyCode)) { + PictureObject *pic = g_fullpipe->_currentScene->getPictureObjectById(picid, 0); + + if (!pic || !canInteractAny(g_fullpipe->_aniMan, pic,ex->_keyCode)) { + if ((g_fullpipe->_sceneRect.right - ex->_sceneClickX < 47 && g_fullpipe->_sceneRect.right < g_fullpipe->_sceneWidth - 1) + || (ex->_sceneClickX - g_fullpipe->_sceneRect.left < 47 && g_fullpipe->_sceneRect.left > 0)) + sceneHandlers_sub01(ex); + } + } + } + + break; + + case MSG_SC4_HIDEBOOT: + g_vars->scene04_boot->_flags &= 0xfffb; + break; + + case MSG_CMN_WINARCADE: + sceneHandler04_winArcade(); + break; + + case MSG_SC4_HANDOVER: + g_vars->scene04_var09 = 0; + g_vars->scene04_var19 = 1; + break; + + case MSG_SC4_DROPBOTTLE: + sceneHandler04_dropBottle(); + break; + + case MSG_SC4_COINOUT: + g_vars->scene04_clock->changeStatics2(ST_CLK_CLOSED); + g_vars->scene04_coinPut = 0; + sceneHandler04_stopSound(); + + if (g_vars->scene04_kozyawkiAni.size() && !g_vars->scene04_var02) { + g_vars->scene04_var09 = 1; + + if (g_vars->scene04_var10) + sceneHandler04_sub1(0); + + sceneHandler04_sub15(); + } + + break; + + case MSG_SC4_KOZAWFALL: + { + ExCommand *exnew; + + if (g_vars->scene04_var11) { + sceneHandler04_sub9(g_vars->scene04_var24); + + g_vars->scene04_var11 = 0; + + exnew = new ExCommand(0, 35, SND_4_010, 0, 0, 0, 1, 0, 0, 0); + } else { + exnew = new ExCommand(0, 35, SND_4_012, 0, 0, 0, 1, 0, 0, 0); + } + + exnew->_field_14 = 5; + exnew->_excFlags |= 2; + exnew->postMessage(); + break; + } + + case MSG_SC4_MANFROMBOTTLE: + sceneHandler04_manFromBottle(); + break; + + case MSG_SC4_CLICKLADDER: + sceneHandler04_clickLadder(); + break; + + case MSG_SC4_MANTOBOTTLE: + sceneHandler04_manToBottle(); + break; + + case MSG_SHOWCOIN: + sceneHandler04_showCoin(); + break; + + case MSG_TAKEBOTTLE: + sceneHandler04_takeBottle(); + break; + + case MSG_GOTOLADDER: + sceneHandler04_gotoLadder(0); + break; + + case MSG_SC4_COINPUT: + g_vars->scene04_coinPut = 1; + break; + } return 0; } diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp index 6da848a621..b4a864d164 100644 --- a/engines/fullpipe/sound.cpp +++ b/engines/fullpipe/sound.cpp @@ -135,6 +135,9 @@ void global_messageHandler_handleSound(ExCommand *cmd) { debug(0, "STUB: global_messageHandler_handleSound()"); } +void FullpipeEngine::stopSoundStream2() { + warning("STUB: FullpipeEngine::stopSoundStream2()"); +} } // End of namespace Fullpipe diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index c86d5abd08..b82875f638 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -152,15 +152,19 @@ StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) { _statics = 0; for (uint i = 0; i < src->_movements.size(); i++) { - Movement *mov; - if (((Movement *)src->_movements[i])->_currMovement) { - mov = new Movement(getMovementById(src->getMovementIdById(((Movement *)src->_movements[i])->_id)), this); - mov->_id = ((Movement *)src->_movements[i])->_id; + Movement *newmov; + Movement *mov = (Movement *)src->_movements[i]; + + if (mov->_currMovement) { + // WORKAROUND: Original uses weird construction here: + // new Movement(getMovementById(src->getMovementIdById(mov->_id)), this); + newmov = new Movement(src->getMovementById(src->getMovementIdById(mov->_id)), this); + newmov->_id = mov->_id; } else { - mov = new Movement(((Movement *)src->_movements[i]), 0, -1, this); + newmov = new Movement(mov, 0, -1, this); } - _movements.push_back(mov); + _movements.push_back(newmov); } } @@ -1231,7 +1235,7 @@ Movement::Movement(Movement *src, int *oldIdxs, int newSize, StaticANIObject *an _m2y = src->_m2y; if (newSize != -1) { - if (newSize >= src->_dynamicPhases.size() + 1) + if (newSize >= (int)src->_dynamicPhases.size() + 1) newSize = src->_dynamicPhases.size() + 1; } else { newSize = src->_dynamicPhases.size(); diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp index 3304a93667..3a65801951 100644 --- a/engines/fullpipe/utils.cpp +++ b/engines/fullpipe/utils.cpp @@ -148,7 +148,16 @@ bool MemoryObject::load(MfcArchive &file) { void MemoryObject::loadFile(char *filename) { debug(5, "MemoryObject::loadFile(<%s>)", filename); + + if (!*filename) + return; + if (!_data) { + NGIArchive *arr = g_fullpipe->_currArchive; + + if (g_fullpipe->_currArchive != _libHandle && _libHandle) + g_fullpipe->_currArchive = _libHandle; + Common::SeekableReadStream *s = g_fullpipe->_currArchive->createReadStreamForMember(filename); if (s) { @@ -161,7 +170,11 @@ void MemoryObject::loadFile(char *filename) { s->read(_data, _dataSize); delete s; + } else { + warning("MemoryObject::loadFile(): reading failure"); } + + g_fullpipe->_currArchive = arr; } } @@ -181,6 +194,8 @@ byte *MemoryObject::loadData() { } void MemoryObject::freeData() { + debug(8, "MemoryObject::freeData(): file: %s", _memfilename); + if (_data) free(_data); |
