From 91713e695e22dafe1baeed0348b10e84c389e95d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Thu, 21 Nov 2013 07:44:52 -0800 Subject: [PATCH] FULLPIPE: More work on scene04 --- engines/fullpipe/constants.h | 15 ++++++ engines/fullpipe/fullpipe.h | 1 + engines/fullpipe/init.cpp | 12 ++--- engines/fullpipe/interaction.cpp | 11 ++++ engines/fullpipe/interaction.h | 2 + engines/fullpipe/objectnames.h | 2 +- engines/fullpipe/scenes.cpp | 38 ++++++++++++++ engines/fullpipe/scenes.h | 40 +++++++++++++++ engines/fullpipe/scenes/scene04.cpp | 78 ++++++++++++++++------------- 9 files changed, 158 insertions(+), 41 deletions(-) diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h index 714188b23449..e4576a17b4b4 100644 --- a/engines/fullpipe/constants.h +++ b/engines/fullpipe/constants.h @@ -26,9 +26,11 @@ namespace Fullpipe { #define ANI_BOOT_1 4231 +#define ANI_CLOCK 588 #define ANI_DOMINO_3 2732 #define ANI_DADAYASHIK 306 #define ANI_EGGEATER 334 +#define ANI_HAND 601 #define ANI_IN1MAN 5110 #define ANI_INV_COIN 875 #define ANI_INV_EGGAPL 1564 @@ -37,9 +39,15 @@ namespace Fullpipe { #define ANI_INV_EGGDOM 1561 #define ANI_INV_EGGGLS 1573 #define ANI_INV_MAP 5321 +#define ANI_KOZAWKA 495 #define ANI_LIFTBUTTON 2751 +#define ANI_MAMASHA_4 660 #define ANI_MAN 322 +#define ANI_PLANK 501 #define ANI_SC2_BOX 1020 +#define ANI_SC4_BOOT 1035 +#define ANI_SPEAKER_4 3275 +#define ANI_SPRING 542 #define MSG_CMN_WINARCADE 4778 #define MSG_DISABLESAVES 5201 #define MSG_ENABLESAVES 5202 @@ -72,6 +80,8 @@ namespace Fullpipe { #define MSG_SC3_UTRUBACLICK 1103 #define MV_EGTR_FATASK 5332 #define MV_IN1MAN_SLEEP 5111 +#define MV_KZW_JUMP 558 +#define MV_KZW_JUMPROTATE 561 #define MV_MAN_GOLADDER 451 #define MV_MAN_GOLADDER2 2844 #define MV_MAN_LOOKUP 4773 @@ -82,6 +92,7 @@ namespace Fullpipe { #define MV_MAN_TOLADDER 448 #define MV_MAN_TOLADDER2 2841 #define MV_MAN_TURN_LU 486 +#define MV_SPK4_PLAY 3276 #define PIC_CMN_EVAL 3468 #define PIC_CSR_DEFAULT 4891 #define PIC_CSR_DEFAULT_INV 4892 @@ -128,6 +139,9 @@ namespace Fullpipe { #define PIC_SC2_LADDER 412 #define PIC_SC3_DOMIN 5182 #define PIC_SC3_LADDER 1102 +#define PIC_SC4_BOTTLE 568 +#define PIC_SC4_BOTTLE2 2936 +#define PIC_SC4_MASK 585 #define PIC_SCD_SEL 734 #define QU_EGTR_MD2_SHOW 4698 #define QU_EGTR_MD1_SHOW 4697 @@ -198,6 +212,7 @@ namespace Fullpipe { #define ST_EGTR_MID2 2869 #define ST_EGTR_SLIM 336 #define ST_IN1MAN_SLEEP 5112 +#define ST_KZW_EMPTY 498 #define ST_LBN_0N 2832 #define ST_LBN_0P 2833 #define ST_LBN_1N 2753 diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h index e54259945818..63dde5042b6a 100644 --- a/engines/fullpipe/fullpipe.h +++ b/engines/fullpipe/fullpipe.h @@ -230,6 +230,7 @@ class FullpipeEngine : public ::Engine { void openHelp(); void openMainMenu(); + void initArcadeKeys(const char *varname); void winArcade(); void getAllInventory(); diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp index fb60a4cc57d2..49bf72ac91ea 100644 --- a/engines/fullpipe/init.cpp +++ b/engines/fullpipe/init.cpp @@ -56,7 +56,7 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty)); setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple)); setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked)); - setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe)); + setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_IsClosed)); setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug)); setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum)); setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging)); @@ -70,7 +70,7 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom)); setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree)); setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin)); - setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe)); + setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_IsClosed)); setObjectState(sO_Fly_17, 1); setObjectState(sO_DudeSwinged, 0); setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging)); @@ -83,11 +83,11 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed)); 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_ClosedShe)); + setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_IsClosed)); setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe)); 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_ClosedShe)); + setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_IsClosed)); setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened)); setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed)); setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed)); @@ -97,8 +97,8 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs)); setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering)); setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop)); - setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe)); - setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe)); + setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_IsClosed)); + setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_IsClosed)); setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel)); setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe)); setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown)); diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp index 80cbce946b85..b513d2b8eea4 100644 --- a/engines/fullpipe/interaction.cpp +++ b/engines/fullpipe/interaction.cpp @@ -394,6 +394,17 @@ bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject return true; } +Interaction *InteractionController::getInteractionByObjectIds(int obId, int obId2, int obId3) { + for (ObList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { + Interaction *intr = (Interaction *)*i; + + if (intr->_objectId1 == obId && intr->_objectId2 == obId2 && intr->_objectId3 == obId3) + return intr; + } + + return 0; +} + Interaction::Interaction() { _objectId1 = 0; _objectId2 = 0; diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h index f968cca8ee26..456b35458bf9 100644 --- a/engines/fullpipe/interaction.h +++ b/engines/fullpipe/interaction.h @@ -79,6 +79,8 @@ class InteractionController : public CObject { void sortInteractions(int sceneId); bool handleInteraction(StaticANIObject *subj, GameObject *obj, int invId); + + Interaction *getInteractionByObjectIds(int obId, int obId2, int obId3); }; struct EntranceInfo { diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h index 015df727e9fc..241e31b1652a 100644 --- a/engines/fullpipe/objectnames.h +++ b/engines/fullpipe/objectnames.h @@ -90,7 +90,7 @@ namespace Fullpipe { #define sO_CloseThing "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5" // "Закрываемое" #define sO_Closed "\xc7\xe0\xea\xf0\xfb\xf2" // "Закрыт" #define sO_ClosedWithBoot "\xc7\xe0\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec" // "Закрыта с ботинком" -#define sO_ClosedShe "\xc7\xe0\xea\xf0\xfb\xf2\xe0" // "Закрыта" +#define sO_IsClosed "\xc7\xe0\xea\xf0\xfb\xf2\xe0" // "Закрыта" #define sO_HalfFull "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xed\xe0\xef\xee\xeb\xee\xe2\xe8\xed\xf3" // "Заполнен наполовину" #define sO_Full "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xf6\xe5\xeb\xe8\xea\xee\xec" // "Заполнен целиком" #define sO_MirroredTo "\xc7\xe5\xf0\xea\xe0\xeb\xfc\xed\xe0\xff \xea" // "Зеркальная к" diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp index 9f27101d7dea..7252b44b933b 100644 --- a/engines/fullpipe/scenes.cpp +++ b/engines/fullpipe/scenes.cpp @@ -58,6 +58,40 @@ Vars::Vars() { 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_var01 = 0; + scene04_var02 = 0; + scene04_var04 = 0; + scene04_var05 = 0; + scene04_var06 = 0; + scene04_var07 = 0; + scene04_var08 = 0; + scene04_var09 = 0; + scene04_var10 = 0; + scene04_var11 = 0; + scene04_var12 = 0; + scene04_var13 = 0; + scene04_var14 = 0; + scene04_var15 = 0; + scene04_var16 = 0; + scene04_var17 = 0; + scene04_var18 = 0; + scene04_var19 = 0; + selector = 0; } @@ -662,4 +696,8 @@ int defaultUpdateCursor() { return g_fullpipe->_cursorId; } +void FullpipeEngine::initArcadeKeys(const char *varname) { + warning("STUB: FullpipeEngine::initArcadeKeys(\"%s\")", varname); +} + } // End of namespace Fullpipe diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h index 180d8231a330..81a9be5cc568 100644 --- a/engines/fullpipe/scenes.h +++ b/engines/fullpipe/scenes.h @@ -73,6 +73,46 @@ class Vars { StaticANIObject *scene03_eggeater; StaticANIObject *scene03_domino; + PictureObject *scene04_bottle; + StaticANIObject *scene04_hand; + StaticANIObject *scene04_plank; + StaticANIObject *scene04_clock; + StaticANIObject *scene04_spring; + StaticANIObject *scene04_mamasha; + StaticANIObject *scene04_boot; + StaticANIObject *scene04_speaker; + + Common::Point scene04_jumpingKozyawki[20]; + Common::Point scene04_jumpRotateKozyawki[20]; + + Common::Array scene04_kozyawkiObjList; + Common::Array scene04_bottleObjList; + Common::Array scene04_kozyawkiAni; + + int scene04_ladder; + bool scene04_coinPut; + bool scene04_soundPlaying; + int scene04_dynamicPhaseIndex; + + int scene04_var01; + int scene04_var02; + int scene04_var04; + int scene04_var05; + int scene04_var06; + int scene04_var07; + int scene04_var08; + int scene04_var09; + int scene04_var10; + int scene04_var11; + int scene04_var12; + int scene04_var13; + int scene04_var14; + int scene04_var15; + int scene04_var16; + int scene04_var17; + int scene04_var18; + int scene04_var19; + PictureObject *selector; }; diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp index 291111a66876..c43bfe393592 100644 --- a/engines/fullpipe/scenes/scene04.cpp +++ b/engines/fullpipe/scenes/scene04.cpp @@ -22,20 +22,29 @@ #include "fullpipe/fullpipe.h" -#include "fullpipe/objects.h" #include "fullpipe/objectnames.h" #include "fullpipe/constants.h" +#include "fullpipe/utils.h" +#include "fullpipe/gfx.h" +#include "fullpipe/scenes.h" +#include "fullpipe/messages.h" +#include "fullpipe/statics.h" +#include "fullpipe/scene.h" +#include "fullpipe/interaction.h" +#include "fullpipe/gameloader.h" namespace Fullpipe { +void scene04_callback(int *param) { + warning("STUB: scene04_callback"); +} + void scene04_initScene(Scene *sc) { -#if 0 g_vars->scene04_var01 = 0; g_vars->scene04_bottle = sc->getPictureObjectById(PIC_SC4_BOTTLE, 0); g_vars->scene04_hand = sc->getStaticANIObject1ById(ANI_HAND, -1); g_vars->scene04_plank = sc->getStaticANIObject1ById(ANI_PLANK, -1); g_vars->scene04_clock = sc->getStaticANIObject1ById(ANI_CLOCK, -1); - g_vars->scene04_hand = sc->getStaticANIObject1ById(ANI_HAND, -1); g_vars->scene04_spring = sc->getStaticANIObject1ById(ANI_SPRING, -1); g_vars->scene04_mamasha = sc->getStaticANIObject1ById(ANI_MAMASHA_4, -1); g_vars->scene04_boot = sc->getStaticANIObject1ById(ANI_SC4_BOOT, -1); @@ -48,15 +57,15 @@ void scene04_initScene(Scene *sc) { if (kozmov) { uint kozsize = kozmov->_currMovement ? kozmov->_currMovement->_dynamicPhases.size() : kozmov->_dynamicPhases.size(); - for (i = 0; i < kozsize; i++) { + for (uint i = 0; i < kozsize; i++) { kozmov->setDynamicPhaseIndex(i); if (kozmov->_framePosOffsets) { - g_vars->scene04_jumpingKozyawki[i] = kozmov->_framePosOffsets[kozmov->_currDynamicPhaseIndex]; + g_vars->scene04_jumpingKozyawki[i] = *kozmov->_framePosOffsets[kozmov->_currDynamicPhaseIndex]; } else { kozmov->_somePoint.x = 0; kozmov->_somePoint.y = 0; - g_vars->scene04_jumpingKozyawki[i] = kozMov->_somePoint; + g_vars->scene04_jumpingKozyawki[i] = kozmov->_somePoint; } } } @@ -65,15 +74,15 @@ void scene04_initScene(Scene *sc) { if (kozmov) { uint kozsize = kozmov->_currMovement ? kozmov->_currMovement->_dynamicPhases.size() : kozmov->_dynamicPhases.size(); - for (i = 0; i < kozsize; i++) { + for (uint i = 0; i < kozsize; i++) { kozmov->setDynamicPhaseIndex(i); if (kozmov->_framePosOffsets) { - g_vars->scene04_jumpRotateKozyawki[i] = kozmov->_framePosOffsets[kozmov->_currDynamicPhaseIndex]; + g_vars->scene04_jumpRotateKozyawki[i] = *kozmov->_framePosOffsets[kozmov->_currDynamicPhaseIndex]; } else { kozmov->_somePoint.x = 0; kozmov->_somePoint.y = 0; - g_vars->scene04_jumpRotateKozyawki[i] = kozMov->_somePoint; + g_vars->scene04_jumpRotateKozyawki[i] = kozmov->_somePoint; } } } @@ -83,20 +92,21 @@ void scene04_initScene(Scene *sc) { if (plank) plank->_flags |= 8; - if (getObjectState(sO_Jar_4) == getObjectEnumState(sO_Jar_4, sO_UpsideDown)) { + if (g_fullpipe->getObjectState(sO_Jar_4) == g_fullpipe->getObjectEnumState(sO_Jar_4, sO_UpsideDown)) { g_vars->scene04_bottleObjList.clear(); g_vars->scene04_kozyawkiObjList.clear(); sc->getPictureObjectById(PIC_SC4_BOTTLE, 0)->_flags &= 0xfffb; sc->getPictureObjectById(PIC_SC4_MASK, 0)->_flags &= 0xfffb; - sc->getStaticANIObjectById(ANI_SPRING, 0)->_flags &= 0xfffb; + sc->getStaticANIObject1ById(ANI_SPRING, 0)->_flags &= 0xfffb; g_vars->scene04_var18 = 0; g_vars->scene04_var19 = 0; } else { StaticANIObject *spring = sc->getStaticANIObject1ById(ANI_SPRING, -1); - if (sprint) - spring->callback2 = 0; + + if (spring) + spring->_callback2 = 0; g_vars->scene04_bottleObjList.clear(); g_vars->scene04_bottleObjList.push_back(sc->getPictureObjectById(PIC_SC4_BOTTLE, 0)); @@ -107,7 +117,7 @@ void scene04_initScene(Scene *sc) { if (koz) { koz->loadMovementsPixelData(); - koz->statics = koz->getStaticsById(ST_KZW_EMPTY); + koz->_statics = koz->getStaticsById(ST_KZW_EMPTY); koz->setOXY(0, 0); koz->hide(); @@ -117,29 +127,28 @@ void scene04_initScene(Scene *sc) { StaticANIObject *koz1 = new StaticANIObject(koz); sc->addStaticANIObject(koz1, 1); - v26 = koz->getStaticsById(ST_KZW_EMPTY); - v27 = v3->GameObject.CObject.vmt; - v3->statics = v26; - (*(void (__thiscall **)(StaticANIObject *, _DWORD, _DWORD))(v27 + offsetof(GameObjectVmt, setOXY)))(v3, 0, 0); - StaticANIObject_hide(v3); - CObList::AddTail(&g_vars->scene04_kozyawkiObjList, v3); - --v24; - } while (v24); + koz1->_statics = koz->getStaticsById(ST_KZW_EMPTY); + koz1->setOXY(0, 0); + koz1->hide(); + g_vars->scene04_kozyawkiObjList.push_back(koz1); + } } - v28 = Scene_getPictureObjectById(sc, PIC_SC4_BOTTLE2, 0); - GameObject_setFlags(&v28->GameObject, v28->GameObject.flags & 0xFFFB); + sc->getPictureObjectById(PIC_SC4_BOTTLE2, 0)->_flags &= 0xfffb; + g_vars->scene04_var18 = 1; g_vars->scene04_var19 = 1; } + g_vars->scene04_var02 = 0; g_vars->scene04_soundPlaying = 0; g_vars->scene04_var04 = 0; g_vars->scene04_var05 = 0; g_vars->scene04_var06 = 2; - g_sc04_dynamicPhaseIndex = 0; - CObList::RemoveAll(&g_vars->scene04_kozyawkiAni); + g_vars->scene04_dynamicPhaseIndex = 0; + + g_vars->scene04_kozyawkiAni.clear(); - setObjectState(sO_LowerPipe, getObjectEnumState(sO_LowerPipe, sO_IsClosed)); + g_fullpipe->setObjectState(sO_LowerPipe, g_fullpipe->getObjectEnumState(sO_LowerPipe, sO_IsClosed)); g_vars->scene04_var07 = 0; g_vars->scene04_var08 = 0; @@ -152,16 +161,17 @@ void scene04_initScene(Scene *sc) { g_vars->scene04_var14 = 0; g_vars->scene04_var15 = 1; - if (getObjectState(sO_BigMumsy) != getObjectEnumState(sO_BigMumsy, sO_Gone)) - StaticANIObject_hide(g_vars->scene04_mamasha); + if (g_fullpipe->getObjectState(sO_BigMumsy) != g_fullpipe->getObjectEnumState(sO_BigMumsy, sO_Gone)) + 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->startAnim(MV_SPK4_PLAY, 0, -1); - g_vars->scene04_speaker = Scene_getStaticANIObject1ById(sc, ANI_SPEAKER_4, -1); - g_vars->scene04_speaker->callback2 = (void (__thiscall *)(int *))scene04_callback; - StaticANIObject_startAnim(g_vars->scene04_speaker, MV_SPK4_PLAY, 0, -1); g_vars->scene04_var16 = 0; g_vars->scene04_var17 = 0; - initArcade("SC_4"); -#endif + + g_fullpipe->initArcadeKeys("SC_4"); } } // End of namespace Fullpipe