void sceneHandler16_girlROTFL() { StaticANIObject *girl = g_fp->_currentScene->getStaticANIObject1ById(ANI_GIRL, -1); girl->changeStatics2(ST_GRL_LAUGH); girl->startAnim(MV_GRL_FALL, 0, -1); g_vars->scene16_girlIsLaughing = false; }
void scene32_initScene(Scene *sc) { g_vars->scene32_flagIsWaving = false; g_vars->scene32_flagNeedsStopping = false; g_vars->scene32_dudeIsSitting = false; g_vars->scene32_cactusCounter = -1; g_vars->scene32_dudeOnLadder = false; g_vars->scene32_cactusIsGrowing = false; g_vars->scene32_flag = sc->getStaticANIObject1ById(ANI_FLAG, -1); g_vars->scene32_cactus = sc->getStaticANIObject1ById(ANI_CACTUS, -1); g_vars->scene32_massOrange = sc->getStaticANIObject1ById(ANI_TESTO_ORANGE, -1); g_vars->scene32_massBlue = sc->getStaticANIObject1ById(ANI_TESTO_BLUE, -1); g_vars->scene32_massGreen = sc->getStaticANIObject1ById(ANI_TESTO_GREEN, -1); g_vars->scene32_button = sc->getStaticANIObject1ById(ANI_BUTTON_32, -1); g_vars->scene32_massOrange->startAnim(MV_TSTO_FLOW, 0, -1); g_vars->scene32_massOrange->_movement->setDynamicPhaseIndex(15); g_vars->scene32_massGreen->startAnim(MV_TSTG_FLOW, 0, -1); g_vars->scene32_massGreen->_movement->setDynamicPhaseIndex(26); Scene *oldsc = g_fp->_currentScene; StaticANIObject *ani; if (g_fp->getObjectState(sO_ClockHandle) == g_fp->getObjectEnumState(sO_ClockHandle, sO_In_32_Lies)) { ani = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1); if (ani) { g_fp->_currentScene = sc; ani->changeStatics2(ST_HDL_LAID); } } else { if (g_fp->getObjectState(sO_ClockHandle) == g_fp->getObjectEnumState(sO_ClockHandle, sO_In_32_Sticks)) { ani = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1); g_fp->_currentScene = sc; if (ani) ani->changeStatics2(ST_HDL_PLUGGED); g_vars->scene32_button->changeStatics2(ST_BTN32_ON); } } g_fp->_currentScene = oldsc; if (g_fp->getObjectState(sO_Cube) == g_fp->getObjectEnumState(sO_Cube, sO_In_32)) { MessageQueue *mq = new MessageQueue(sc->getMessageQueueById(QU_KBK32_START), 0, 0); mq->sendNextCommand(); } g_fp->lift_setButton(sO_Level9, ST_LBN_9N); g_fp->lift_init(sc, QU_SC32_ENTERLIFT, QU_SC32_EXITLIFT); g_fp->initArcadeKeys("SC_32"); }
void sceneHandler17_moonshineFill() { StaticANIObject *moonshiner = g_fp->_currentScene->getStaticANIObject1ById(ANI_SAMOGONSHCHIK, -1); if (!(moonshiner->_flags & 0x80)) { moonshiner->changeStatics2(ST_SMG_SIT); chainObjQueue(moonshiner, QU_SMG_FILLBOTTLE, 1); g_vars->scene17_sugarIsShown = false; } }
void sceneHandler32_buttonPush() { if (g_fp->getObjectState(sO_ClockHandle) == g_fp->getObjectEnumState(sO_ClockHandle, sO_In_32_Sticks)) { StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_HANDLE, -1); if (ani) ani->changeStatics2(ST_HDL_PLUGGED); chainQueue(QU_SC32_FALLHANDLE, 1); g_vars->scene32_button->changeStatics2(ST_BTN32_OFF); } }
void sceneHandler17_drop() { StaticANIObject *mug = g_fp->_currentScene->getStaticANIObject1ById(ANI_MUG_17, -1); StaticANIObject *jet = g_fp->_currentScene->getStaticANIObject1ById(ANI_JET_17, -1); if (mug && mug->_flags & 4) { mug->changeStatics2(ST_MUG17_EMPTY); chainQueue(QU_SC17_FILLMUG_DROP, 0); } else if (jet) { jet->queueMessageQueue(0); chainQueue(QU_JET17_DROP, 0); } }
void GameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount) { if (picAniInfoCount <= 0) return; debugC(0, kDebugAnimation, "GameLoader::applyPicAniInfos(sc, ptr, %d)", picAniInfoCount); PictureObject *pict; StaticANIObject *ani; for (int i = 0; i < picAniInfoCount; i++) { debugC(7, kDebugAnimation, "PicAniInfo: id: %d type: %d", picAniInfo[i]->objectId, picAniInfo[i]->type); if (picAniInfo[i]->type & 2) { pict = sc->getPictureObjectById(picAniInfo[i]->objectId, picAniInfo[i]->field_8); if (pict) { pict->setPicAniInfo(picAniInfo[i]); continue; } pict = sc->getPictureObjectById(picAniInfo[i]->objectId, 0); if (pict) { PictureObject *pictNew = new PictureObject(pict); sc->_picObjList.push_back(pictNew); pictNew->setPicAniInfo(picAniInfo[i]); continue; } } else { if (!(picAniInfo[i]->type & 1)) continue; Scene *scNew = g_fp->accessScene(picAniInfo[i]->sceneId); if (!scNew) continue; ani = sc->getStaticANIObject1ById(picAniInfo[i]->objectId, picAniInfo[i]->field_8); if (ani) { ani->setPicAniInfo(picAniInfo[i]); continue; } ani = scNew->getStaticANIObject1ById(picAniInfo[i]->objectId, 0); if (ani) { StaticANIObject *aniNew = new StaticANIObject(ani); sc->addStaticANIObject(aniNew, 1); aniNew->setPicAniInfo(picAniInfo[i]); continue; } } } }
void sceneHandler28_startWork1() { debugC(2, kDebugSceneLogic, "scene28: startWork"); g_fp->_aniMan->hide(); StaticANIObject *man = g_fp->_currentScene->getStaticANIObject1ById(ANI_MAN_28, -1); man->_statics = man->getStaticsById(ST_MAN28_RIGHT); man->setOXY(g_fp->_aniMan->_ox, g_fp->_aniMan->_oy); man->_priority = g_fp->_aniMan->_priority; man->show1(-1, -1, -1, 0); chainQueue(QU_SC28_LIFT1_WORK, 1); }
void sceneHandler16_startLaugh() { StaticANIObject *girl = g_fp->_currentScene->getStaticANIObject1ById(ANI_GIRL, -1); girl->changeStatics2(ST_GRL_STAND); MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_GIRLLAUGH), 0, 1); mq->replaceKeyCode(-1, girl->_okeyCode); mq->setFlags(mq->getFlags() | 1); mq->chain(0); g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->setSubVarAsInt(sO_DudeSwinged, 0); g_vars->scene16_girlIsLaughing = true; }
void scene06_initScene(Scene *sc) { g_vars->scene06_mumsy = sc->getStaticANIObject1ById(ANI_MAMASHA, -1); g_vars->scene06_someBall = 0; g_vars->scene06_invHandle = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1); g_vars->scene06_liftButton = sc->getStaticANIObject1ById(ANI_BUTTON_6, -1); g_vars->scene06_ballDrop = sc->getStaticANIObject1ById(ANI_BALLDROP, -1); g_vars->scene06_arcadeEnabled = false; g_vars->scene06_aimingBall = false; g_vars->scene06_currentBall = 0; g_vars->scene06_ballInHands = 0; g_vars->scene06_flyingBall = 0; g_vars->scene06_balls.clear(); g_vars->scene06_numBallsGiven = 0; g_vars->scene06_mumsyNumBalls = 0; g_vars->scene06_eggieTimeout = 0; g_vars->scene06_eggieDirection = true; StaticANIObject *ball = sc->getStaticANIObject1ById(ANI_NEWBALL, -1); ball->hide(); ball->_statics = ball->getStaticsById(ST_NBL_NORM); g_vars->scene06_balls.push_back(ball); for (int i = 0; i < 3; i++) { StaticANIObject *ball2 = new StaticANIObject(ball); ball2->hide(); ball2->_statics = ball2->getStaticsById(ST_NBL_NORM); sc->addStaticANIObject(ball2, 1); g_vars->scene06_balls.push_back(ball2); } if (g_fp->getObjectState(sO_BigMumsy) == g_fp->getObjectEnumState(sO_BigMumsy, sO_IsPlaying)) g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping)); if (g_fp->getObjectState(sO_BigMumsy) != g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping)) g_vars->scene06_mumsy->hide(); g_fp->lift_setButton(sO_Level3, ST_LBN_3N); g_fp->lift_init(sc, QU_SC6_ENTERLIFT, QU_SC6_EXITLIFT); g_fp->initArcadeKeys("SC_6"); sceneHandler06_setExits(sc); g_fp->setArcadeOverlay(PIC_CSR_ARCADE2); }
void sceneHandler25_startBearders() { g_vars->scene25_bearders.clear(); g_vars->scene25_beardersCounter = 0; StaticANIObject *bearded = g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_BEARDED_CMN, -1); for (int i = 0; i < 3; i++) { StaticANIObject *ani = new StaticANIObject(bearded); g_vars->scene25_bearders.push_back(ani); ani->_statics = ani->getStaticsById(ST_BRDCMN_EMPTY); g_fp->_currentScene->addStaticANIObject(ani, 1); } g_vars->scene25_beardersAreThere = true; }
void sceneHandler37_updateRing(int ringNum) { g_vars->scene37_rings[ringNum]->ani->changeStatics2(ST_GRD37_STAND); g_vars->scene37_rings[ringNum]->ani->startAnim(MV_GRD37_PULL, 0, -1); g_vars->scene37_rings[ringNum]->state = !g_vars->scene37_rings[ringNum]->state; StaticANIObject *ani; for (int i = 0; i < g_vars->scene37_rings[ringNum]->numSubRings; i++) { ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[ringNum]->subRings[i]); if ((ani->_movement && ani->_movement->_id != MV_RNG_CLOSE) || ani->_statics->_staticsId != ST_RNG_CLOSED2) { ani->changeStatics2(ST_RNG_OPEN); ani->startAnim(MV_RNG_CLOSE, 0, -1); } else { ani->changeStatics2(ST_RNG_CLOSED2); ani->startAnim(MV_RNG_OPEN, 0, -1); } } g_vars->scene37_cursorIsLocked = true; for (uint j = 0; j < g_vars->scene37_rings.size(); j++) { for (int i = 0; i < g_vars->scene37_rings[ringNum]->numSubRings; i++) { ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[j]->subRings[i]); if ((ani->_movement && ani->_movement->_id != MV_RNG_CLOSE) || ani->_statics->_staticsId != ST_RNG_CLOSED2) g_vars->scene37_cursorIsLocked = false; } } int state; if (g_vars->scene37_cursorIsLocked) state = g_fp->getObjectEnumState(sO_LeftPipe_37, sO_IsOpened); else state = g_fp->getObjectEnumState(sO_LeftPipe_37, sO_IsClosed); g_fp->setObjectState(sO_LeftPipe_37, state); }
void Inventory2::removeItem2(Scene *sceneObj, int itemId, int x, int y, int priority) { int idx = getInventoryItemIndexById(itemId); debugC(2, kDebugInventory, "removeItem2(*, %d, %d, %d, %d)", itemId, x, y, priority); if (idx >= 0) { if (_inventoryItems[idx]->count) { removeItem(itemId, 1); Scene *sc = g_fp->accessScene(_sceneId); if (sc) { StaticANIObject *ani = new StaticANIObject(sc->getStaticANIObject1ById(itemId, -1)); sceneObj->addStaticANIObject(ani, 1); ani->_statics = (Statics *)ani->_staticsList[0]; ani->setOXY(x, y); ani->_priority = priority; } } } }
bool GameObject::setPicAniInfo(PicAniInfo *picAniInfo) { if (!(picAniInfo->type & 3)) { warning("StaticANIObject::setPicAniInfo(): Wrong type: %d", picAniInfo->type); return false; } if (picAniInfo->type & 3) { setOXY(picAniInfo->ox, picAniInfo->oy); _priority = picAniInfo->priority; _okeyCode = picAniInfo->field_8; setFlags(picAniInfo->flags); _field_8 = picAniInfo->field_24; } if (picAniInfo->type & 1) { StaticANIObject *ani = (StaticANIObject *)this; ani->_messageQueueId = (picAniInfo->type >> 16) & 0xffff; if (picAniInfo->staticsId) { ani->_statics = ani->getStaticsById(picAniInfo->staticsId); } else { ani->_statics = 0; } if (picAniInfo->movementId) { ani->_movement = ani->getMovementById(picAniInfo->movementId); if (ani->_movement) ani->_movement->setDynamicPhaseIndex(picAniInfo->dynamicPhaseIndex); } else { ani->_movement = 0; } ani->setSomeDynamicPhaseIndex(picAniInfo->someDynamicPhaseIndex); }
void scene29_initScene(Scene *sc) { g_vars->scene29_var01 = 300; g_vars->scene29_var02 = 200; g_vars->scene29_var03 = 400; g_vars->scene29_var04 = 300; 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_var05.numBalls = 0; g_vars->scene29_var05.pTail = 0; g_vars->scene29_var05.field_8 = 0; g_vars->scene29_var05.pHead = 0; free(g_vars->scene29_var05.cPlex); g_vars->scene29_var05.cPlex = 0; StaticANIObject *ani; g_vars->scene29_var08.numBalls = 0; g_vars->scene29_var08.pTail = 0; g_vars->scene29_var08.field_8 = 0; g_vars->scene29_var08.pHead = 0; free(g_vars->scene29_var08.cPlex); g_vars->scene29_var08.cPlex = 0; ani = sc->getStaticANIObject1ById(ANI_SHELL_GREEN, -1); Ball *b = g_vars->scene29_var05.sub04(g_vars->scene29_var05.field_8, 0); b->ani = ani; if (g_vars->scene29_var05.field_8) g_vars->scene29_var05.field_8->p0 = b; else g_vars->scene29_var05.pHead = b; g_vars->scene29_var05.field_8 = b; for (int i = 0; i < 2; i++) { StaticANIObject *newani = new StaticANIObject(ani); sc->addStaticANIObject(newani, 1); b = g_vars->scene29_var05.sub04(g_vars->scene29_var05.field_8, 0); b->ani = ani; if (g_vars->scene29_var05.field_8) g_vars->scene29_var05.field_8->p0 = b; else g_vars->scene29_var05.pHead = b; g_vars->scene29_var05.field_8 = b; } g_vars->scene29_var06.numBalls = 0; g_vars->scene29_var06.pTail = 0; g_vars->scene29_var06.field_8 = 0; g_vars->scene29_var06.pHead = 0; free(g_vars->scene29_var06.cPlex); g_vars->scene29_var06.cPlex = 0; g_vars->scene29_var07.numBalls = 0; g_vars->scene29_var07.pTail = 0; g_vars->scene29_var07.field_8 = 0; g_vars->scene29_var07.pHead = 0; free(g_vars->scene29_var07.cPlex); g_vars->scene29_var07.cPlex = 0; ani = sc->getStaticANIObject1ById(ANI_SHELL_RED, -1); b = g_vars->scene29_var06.sub04(g_vars->scene29_var06.field_8, 0); b->ani = ani; if (g_vars->scene29_var06.field_8) g_vars->scene29_var06.field_8->p0 = b; else g_vars->scene29_var06.pHead = b; g_vars->scene29_var06.field_8 = b; for (int i = 0; i < 2; i++) { StaticANIObject *newani = new StaticANIObject(ani); sc->addStaticANIObject(newani, 1); b = g_vars->scene29_var06.sub04(g_vars->scene29_var06.field_8, 0); b->ani = ani; if (g_vars->scene29_var06.field_8) g_vars->scene29_var06.field_8->p0 = b; else g_vars->scene29_var06.pHead = b; g_vars->scene29_var06.field_8 = b; } g_vars->scene29_var19.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_var19.push_back(wb); g_vars->scene29_var09 = 0; g_vars->scene29_var10 = 0; g_vars->scene29_var11 = 0; g_vars->scene29_var12 = 0; g_vars->scene29_var13 = 0; g_vars->scene29_var14 = 75; g_vars->scene29_var15 = 0; g_vars->scene29_var16 = 0; g_vars->scene29_var17 = 0; g_vars->scene29_var18 = 0; g_fp->setArcadeOverlay(PIC_CSR_ARCADE8); }
void scene37_initScene(Scene *sc) { Ring *ring; StaticANIObject *ani; g_vars->scene37_lastDudeX = -1; ring = new Ring(); ani = sc->getStaticANIObject1ById(ANI_GUARD_37, 0); ring->ani = ani; ring->x = ani->_ox - 40; ring->y = ani->_ox + 40; ring->numSubRings = 3; ring->subRings[0] = 1; ring->subRings[1] = 4; ring->subRings[2] = 8; ring->state = false; g_vars->scene37_rings.push_back(ring); ring = new Ring(); ani = sc->getStaticANIObject1ById(ANI_GUARD_37, 1); ring->ani = ani; ring->x = ani->_ox - 40; ring->y = ani->_ox + 40; ring->numSubRings = 3; ring->subRings[0] = 2; ring->subRings[1] = 5; ring->subRings[2] = 9; ring->state = false; g_vars->scene37_rings.push_back(ring); ring = new Ring(); ani = sc->getStaticANIObject1ById(ANI_GUARD_37, 2); ring->ani = ani; ring->x = ani->_ox - 40; ring->y = ani->_ox + 40; ring->numSubRings = 3; ring->subRings[0] = 3; ring->subRings[1] = 7; ring->subRings[2] = 11; ring->state = false; g_vars->scene37_rings.push_back(ring); g_fp->setObjectState(sO_LeftPipe_37, g_fp->getObjectEnumState(sO_LeftPipe_37, sO_IsClosed)); Scene *oldsc = g_fp->_currentScene; g_fp->_currentScene = sc; g_vars->scene37_cursorIsLocked = false; g_vars->scene37_plusMinus1 = sc->getStaticANIObject1ById(ANI_PLUSMINUS, 1); for (int i = 0; i < g_vars->scene37_rings[0]->numSubRings; i++) { ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[0]->subRings[i]); if (g_fp->getObjectState(sO_Guard_1) == g_fp->getObjectEnumState(sO_Guard_1, sO_On)) { g_vars->scene37_plusMinus1->_statics = g_vars->scene37_plusMinus1->getStaticsById(ST_PMS_PLUS); ani->changeStatics2(ST_RNG_OPEN); } else { g_vars->scene37_plusMinus1->_statics = g_vars->scene37_plusMinus1->getStaticsById(ST_PMS_MINUS); ani->changeStatics2(ST_RNG_CLOSED2); } } g_vars->scene37_plusMinus2 = sc->getStaticANIObject1ById(ANI_PLUSMINUS, 2); for (int i = 0; i < g_vars->scene37_rings[1]->numSubRings; i++) { ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[1]->subRings[i]); if (g_fp->getObjectState(sO_Guard_2) == g_fp->getObjectEnumState(sO_Guard_2, sO_On)) { g_vars->scene37_plusMinus2->_statics = g_vars->scene37_plusMinus2->getStaticsById(ST_PMS_PLUS); ani->changeStatics2(ST_RNG_OPEN); } else { g_vars->scene37_plusMinus2->_statics = g_vars->scene37_plusMinus2->getStaticsById(ST_PMS_MINUS); ani->changeStatics2(ST_RNG_CLOSED2); } } g_vars->scene37_plusMinus3 = sc->getStaticANIObject1ById(ANI_PLUSMINUS, 3); for (int i = 0; i < g_vars->scene37_rings[2]->numSubRings; i++) { ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[2]->subRings[i]); if (g_fp->getObjectState(sO_Guard_3) == g_fp->getObjectEnumState(sO_Guard_3, sO_On)) { g_vars->scene37_plusMinus3->_statics = g_vars->scene37_plusMinus3->getStaticsById(ST_PMS_PLUS); ani->changeStatics2(ST_RNG_OPEN); } else { g_vars->scene37_plusMinus3->_statics = g_vars->scene37_plusMinus3->getStaticsById(ST_PMS_MINUS); ani->changeStatics2(ST_RNG_CLOSED2); } } g_fp->_currentScene = oldsc; g_fp->initArcadeKeys("SC_37"); }
bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject *obj, int invId) { if (subj) { if (!subj->isIdle() || (subj->_flags & 0x100)) return false; } if (!_interactions.size()) return false; Interaction *inter = 0; Interaction *previnter = 0; int dur = 0; int mindur = 0xFFFF; MessageQueue *mq; ExCommand *ex; for (InteractionList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { Interaction *cinter = *i; if (!cinter->canInteract(subj, obj, invId)) continue; if ((inter || cinter->_objectId2) && (!obj || cinter->_objectId3 != obj->_id)) { if (cinter->_messageQueue) cinter->_messageQueue->calcDuration(subj); debugC(5, kDebugInteractions, "Interaction: %s", transCyrillic(cinter->_actionName)); PicAniInfo aniInfo; obj->getPicAniInfo(aniInfo); if (cinter->_staticsId1 && obj->_objtype == kObjTypeStaticANIObject) { StaticANIObject *ani = static_cast<StaticANIObject *>(obj); ani->_messageQueueId = 0; ani->changeStatics2(cinter->_staticsId1); } int xpos = cinter->_xOffs + obj->_ox; int ypos = cinter->_yOffs + obj->_oy; obj->setPicAniInfo(aniInfo); if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1) { debugC(0, kDebugPathfinding, "Calling makeQueue() at [%d, %d]", xpos, ypos); mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->makeQueue(subj, xpos, ypos, 1, cinter->_staticsId2); if (mq) { dur = mq->calcDuration(subj); delete mq; } else { dur = 0x10000; } inter = previnter; } else { dur = 0; } if (dur < mindur) { inter = cinter; mindur = dur; previnter = cinter; } } else { inter = cinter; break; } } if (!inter) return false; if (!inter->_objectId2) { if (obj->_objtype == kObjTypeStaticANIObject) { StaticANIObject *ani = static_cast<StaticANIObject *>(obj); if (inter->_flags & 1) { if (!ani->isIdle()) return false; if (ani->_flags & 0x100) return false; } else if (inter->_staticsId1 != 0) { if (ani->_movement || ani->_statics == 0 || ani->_statics->_staticsId != inter->_staticsId1) { mq = ani->changeStatics1(inter->_staticsId1); if (!mq) return false; ex = new ExCommand((subj ? subj->_id : 0), 55, 0, 0, 0, 0, 1, 0, 0, 0); ex->_x = obj->_id; ex->_y = obj->_odelay; ex->_param = subj ? subj->_odelay : 0; ex->_excFlags = 3; ex->_z = (obj->_objtype != kObjTypePictureObject); ex->_field_20 = invId; mq->addExCommandToEnd(ex); if (mq->_isFinished) { mq->_isFinished = 0; ani->queueMessageQueue(mq); } return true; } else { if (ani->getMessageQueue()) ani->queueMessageQueue(0); } } } if (inter->_messageQueue) { mq = new MessageQueue(inter->_messageQueue, 0, 1); mq->changeParam28ForObjectId(obj->_id, -1, obj->_odelay); if (!mq->chain(0)) return false; } return true; } if (obj && !subj) return true; if (!obj || inter->_objectId3 == obj->_id) { if (subj) { if (inter->_messageQueue) { if (subj->isIdle()) { mq = new MessageQueue(inter->_messageQueue, 0, 1); if (!mq->chain(subj)) { delete mq; return false; } } } } return true; } if (inter->isOverlapping(subj, obj)) { if (obj->_objtype == kObjTypeStaticANIObject) { StaticANIObject *ani = static_cast<StaticANIObject *>(obj); ani->queueMessageQueue(0); if (inter->_staticsId1) ani->changeStatics2(inter->_staticsId1); if (!(inter->_flags & 0x10000)) obj->_flags |= 0x80; } if (!inter->_messageQueue) return false; subj->setOXY(inter->_xOffs + obj->_ox, inter->_yOffs + obj->_oy); mq = new MessageQueue(inter->_messageQueue, 0, 1); mq->changeParam28ForObjectId(obj->_id, -1, obj->_odelay); mq->_flags |= 1; if (!(inter->_flags & 0x10000)) { ex = new ExCommand(obj->_id, 34, 0x80, 0, 0, 0, 1, 0, 0, 0); ex->_param = obj->_odelay; ex->_z = 0x80; ex->_messageNum = 0; ex->_excFlags = 3; mq->addExCommandToEnd(ex); } ex = new ExCommand(obj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0); ex->_param = obj->_odelay; ex->_z = 0x100; ex->_messageNum = 0; ex->_excFlags = 3; mq->addExCommandToEnd(ex); ex = new ExCommand(subj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0); ex->_param = subj->_odelay; ex->_z = 0x100; ex->_messageNum = 0; ex->_excFlags = 3; mq->addExCommandToEnd(ex); ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; ex->_param = 0; mq->addExCommandToEnd(ex); if (!mq->chain(subj)) { delete mq; return false; } subj->_flags |= 0x100; obj->_flags |= 0x100; } else { bool someFlag = false; PicAniInfo aniInfo; obj->getPicAniInfo(aniInfo); if (obj->_objtype == kObjTypeStaticANIObject && inter->_staticsId1) { StaticANIObject *ani = static_cast<StaticANIObject *>(obj); ani->_messageQueueId = 0; ani->changeStatics2(inter->_staticsId1); } int xpos = inter->_xOffs + obj->_ox; int ypos = inter->_yOffs + obj->_oy; obj->setPicAniInfo(aniInfo); if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1 || (inter->_staticsId2 != 0 && (subj->_statics == 0 || subj->_statics->_staticsId != inter->_staticsId2))) { mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->startMove(subj, xpos, ypos, 1, inter->_staticsId2); if (!mq) return false; ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0); ex->_x = obj->_id; ex->_y = obj->_odelay; ex->_param = subj->_odelay; ex->_excFlags = 3; ex->_field_20 = invId; ex->_z = (obj->_objtype != kObjTypePictureObject); mq->addExCommandToEnd(ex); someFlag = true; ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0); ex->_x = xpos; ex->_y = ypos; ex->_excFlags |= 3; ex->_param = 6; ex->_z = obj->_id; ex->_field_20 = obj->_odelay; ex->postMessage(); } if (!inter->_staticsId1 || !(inter->_flags & 1)) return true; if (obj->_objtype != kObjTypeStaticANIObject) return false; StaticANIObject *ani = static_cast<StaticANIObject *>(obj); if (!ani->isIdle()) return false; if (ani->getMessageQueue()) ani->queueMessageQueue(0); if (!ani->_statics || ani->_statics->_staticsId != inter->_staticsId1 || ani->_movement) { mq = ani->changeStatics1(inter->_staticsId1); if (!mq) return false; if (someFlag) { if (!(inter->_flags & 0x10000)) { if (mq->_isFinished) { ani->_flags |= 0x80u; } else { ex = new ExCommand(ani->_id, 34, 0x80, 0, 0, 0, 1, 0, 0, 0); ex->_z = 0x80; ex->_param = ani->_odelay; ex->_excFlags = 3; mq->addExCommandToEnd(ex); } } ex = new ExCommand(ani->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0); ex->_param = ani->_odelay; ex->_z = 0x100; ex->_excFlags = 3; mq->addExCommandToEnd(ex); } else { ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0); ex->_x = ani->_id; ex->_y = ani->_odelay; ex->_param = subj->_odelay; ex->_excFlags = 2; ex->_z = (obj->_objtype != kObjTypePictureObject); ex->_field_20 = invId; mq->addExCommandToEnd(ex); if (!mq->_isFinished) return true; mq->_isFinished = 0; ani->queueMessageQueue(mq); } } else { obj->_flags |= 0x100; if (inter->_flags & 0x10000) return true; obj->_flags |= 0x80; } } return true; }
int global_messageHandler4(ExCommand *cmd) { StaticANIObject *ani = 0; switch (cmd->_messageKind) { case 18: { MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(cmd->_messageNum), cmd->_parId, 0); if (cmd->_excFlags & 1) mq->_flag1 = 1; else mq->_flag1 = 0; mq->sendNextCommand(); break; } case 2: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; ani->trySetMessageQueue(cmd->_messageNum, cmd->_parId); break; case 1: { if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; int flags = cmd->_field_14; if (flags <= 0) flags = -1; if (cmd->_excFlags & 1) ani->startAnim(cmd->_messageNum, 0, flags); else ani->startAnim(cmd->_messageNum, cmd->_parId, flags); break; } case 8: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; ani->startAnimEx(cmd->_messageNum, cmd->_parId, -1, -1); break; case 20: { if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; int flags = cmd->_field_14; if (flags <= 0) flags = -1; ExCommand2 *cmd2 = (ExCommand2 *)cmd; if (cmd->_excFlags & 1) { ani->startAnimSteps(cmd->_messageNum, 0, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags); } else { ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags); } break; } case 21: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; ani->queueMessageQueue(0); ani->playIdle(); break; case 9: // Nop in original break; case 3: g_fp->_currentScene->_y = cmd->_messageNum - cmd->_messageNum % g_fp->_scrollSpeed; break; case 4: g_fp->_currentScene->_x = cmd->_messageNum - cmd->_messageNum % g_fp->_scrollSpeed; break; case 19: { if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; MessageQueue *mq = ani->getMessageQueue(); MessageQueue *mq2 = ani->changeStatics1(cmd->_messageNum); if (!mq2 || !mq2->getExCommandByIndex(0) || !mq) break; mq2->_parId = mq->_id; mq2->_flag1 = (cmd->_field_24 == 0); break; } case 22: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; ani->_flags |= 4; ani->changeStatics2(cmd->_messageNum); break; case 6: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; ani->hide(); break; case 27: if (!g_fp->_currentScene || g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param) == 0) { ani = g_fp->accessScene(cmd->_field_20)->getStaticANIObject1ById(cmd->_parentId, -1); if (ani) { ani = new StaticANIObject(ani); g_fp->_currentScene->addStaticANIObject(ani, 1); } } // fall through case 5: if (g_fp->_currentScene) ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; if (cmd->_field_14 >= 0) ani->_priority = cmd->_field_14; ani->show1(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId); break; case 10: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; if (cmd->_field_14 >= 0) ani->_priority = cmd->_field_14; ani->show2(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId); break; case 7: { if (!g_fp->_currentScene->_picObjList.size()) break; int offX = g_fp->_scrollSpeed * (cmd->_x / g_fp->_scrollSpeed); int offY = g_fp->_scrollSpeed * (cmd->_y / g_fp->_scrollSpeed); if (cmd->_messageNum) { g_fp->_currentScene->_x = offX - g_fp->_sceneRect.left; g_fp->_currentScene->_y = offY - g_fp->_sceneRect.top; if (cmd->_field_24) { g_fp->_currentScene->_messageQueueId = cmd->_parId; } } else { g_fp->_sceneRect.translate(offX - g_fp->_sceneRect.left, offY - g_fp->_sceneRect.top); g_fp->_currentScene->_x = 0; g_fp->_currentScene->_y = 0; g_fp->_currentScene->updateScrolling2(); } break; } case 34: if (!g_fp->_currentScene) break; ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (!ani) break; ani->_flags = cmd->_messageNum | (ani->_flags & ~cmd->_field_14); break; case 35: global_messageHandler_handleSound(cmd); break; case 11: case 12: break; default: return 0; break; } return 1; }
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++; } }
bool preloadCallback(PreloadItem &pre, int flag) { if (flag) { if (flag == 50) g_fp->_aniMan->preloadMovements(g_fp->_movTable); StaticANIObject *pbar = g_fp->_loaderScene->getStaticANIObject1ById(ANI_PBAR, -1); if (pbar) { int sz; if (pbar->_movement->_currMovement) sz = pbar->_movement->_currMovement->_dynamicPhases.size(); else sz = pbar->_movement->_dynamicPhases.size(); pbar->_movement->setDynamicPhaseIndex(flag * (sz - 1) / 100); } g_fp->updateMap(&pre); g_fp->_currentScene = g_fp->_loaderScene; g_fp->_loaderScene->draw(); g_fp->_system->updateScreen(); } else { if (g_fp->_scene2) { g_fp->_aniMan = g_fp->_scene2->getAniMan(); g_fp->_scene2 = 0; setInputDisabled(1); } g_fp->_floaters->stopAll(); if (g_fp->_soundEnabled) { g_fp->_currSoundListCount = 1; g_fp->_currSoundList1[0] = g_fp->accessScene(SC_COMMON)->_soundList; } g_vars->scene18_inScene18p1 = false; if ((pre.preloadId1 != SC_18 || pre.sceneId != SC_19) && (pre.preloadId1 != SC_19 || (pre.sceneId != SC_18 && pre.sceneId != SC_19))) { if (g_fp->_scene3) { if (pre.preloadId1 != SC_18) g_fp->_gameLoader->unloadScene(SC_18); g_fp->_scene3 = 0; } } else { scene19_setMovements(g_fp->accessScene(pre.preloadId1), pre.param); g_vars->scene18_inScene18p1 = true; if (pre.preloadId1 == SC_18) { g_fp->_gameLoader->saveScenePicAniInfos(SC_18); scene18_preload(); } } if (((pre.sceneId == SC_19 && pre.param == TrubaRight) || (pre.sceneId == SC_18 && pre.param == TrubaRight)) && !pre.preloadId2) { pre.sceneId = SC_18; pre.param = TrubaLeft; } if (!g_fp->_loaderScene) { g_fp->_gameLoader->loadScene(SC_LDR); g_fp->_loaderScene = g_fp->accessScene(SC_LDR); } StaticANIObject *pbar = g_fp->_loaderScene->getStaticANIObject1ById(ANI_PBAR, -1); if (pbar) { pbar->show1(ST_EGTR_SLIMSORROW, ST_MAN_GOU, MV_PBAR_RUN, 0); pbar->startAnim(MV_PBAR_RUN, 0, -1); } g_fp->_inventoryScene = 0; g_fp->_updateCursorCallback = 0; g_fp->_sceneRect.translate(-g_fp->_sceneRect.left, -g_fp->_sceneRect.top); g_fp->_system->delayMillis(10); Scene *oldsc = g_fp->_currentScene; g_fp->_currentScene = g_fp->_loaderScene; g_fp->_loaderScene->draw(); g_fp->_system->updateScreen(); g_fp->_currentScene = oldsc; } return true; }
bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject *obj, int invId) { if (subj) { if (!subj->isIdle() || (subj->_flags & 0x100)) return false; } if (!_interactions.size()) return false; Interaction *inter = 0; Interaction *previnter = 0; int dur = 0; int mindur = 0xFFFF; MessageQueue *mq; ExCommand *ex; for (ObList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { Interaction *cinter = (Interaction *)*i; if (!cinter->canInteract(subj, obj, invId)) continue; if ((inter || cinter->_objectId2) && (!obj || cinter->_objectId3 != obj->_id)) { if (cinter->_messageQueue) cinter->_messageQueue->calcDuration(subj); PicAniInfo aniInfo; obj->getPicAniInfo(&aniInfo); if (cinter->_staticsId1) { StaticANIObject *ani = (StaticANIObject *)obj; ani->_messageQueueId = 0; ani->changeStatics2(cinter->_staticsId1); } int xpos = cinter->_xOffs + obj->_ox; int ypos = cinter->_yOffs + obj->_oy; obj->setPicAniInfo(&aniInfo); if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1) { mq = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->doWalkTo(subj, xpos, ypos, 1, cinter->_staticsId2); if (mq) { dur = mq->calcDuration(subj); delete mq; } else { dur = 0x10000; } inter = previnter; } else { dur = 0; } if (dur < mindur) { inter = cinter; mindur = dur; previnter = cinter; } } else { inter = cinter; break; } } if (!inter) return false; if (!inter->_objectId2) { StaticANIObject *ani = (StaticANIObject *)obj; if (!ani->isIdle()) return false; if (ani->_flags & 0x100) return false; if (!inter->_staticsId1 || !(inter->_flags & 1)) goto LABEL_38; if (ani->_movement || ani->_statics == 0 || ani->_statics->_staticsId != inter->_staticsId1) { mq = ani->changeStatics1(inter->_staticsId1); if (!mq) return false; ex = new ExCommand((subj ? subj->_id : 0), 55, 0, 0, 0, 0, 1, 0, 0, 0); ex->_x = obj->_id; ex->_y = obj->_okeyCode; ex->_keyCode = subj ? subj->_okeyCode : 0; ex->_excFlags = 3; ex->_field_14 = (obj->_objtype != kObjTypePictureObject); ex->_field_20 = invId; mq->_exCommands.push_back(ex); if (mq->_isFinished) { mq->_isFinished = 0; ani->queueMessageQueue(mq); } } else { if (ani->getMessageQueue()) ani->queueMessageQueue(0); LABEL_38: if (inter->_messageQueue) { mq = new MessageQueue(inter->_messageQueue, 0, 1); mq->changeParam28ForObjectId(ani->_id, -1, ani->_okeyCode); if (!mq->chain(0)) return false; } } return true; } if (obj && !subj) return true; if (!obj || inter->_objectId3 == obj->_id) { if (subj) { if (inter->_messageQueue) { if (subj->isIdle()) { mq = new MessageQueue(inter->_messageQueue, 0, 1); if (!mq->chain(subj)) { delete mq; return false; } } } } return true; } if (inter->isOverlapping(subj, obj)) { if (obj->_objtype == kObjTypeStaticANIObject) { StaticANIObject *ani = (StaticANIObject *)obj; ani->queueMessageQueue(0); if (inter->_staticsId1) ani->changeStatics2(inter->_staticsId1); if (!(inter->_flags & 0x10000)) obj->_flags |= 0x80; } if (!inter->_messageQueue) return false; subj->setOXY(inter->_xOffs + obj->_ox, inter->_yOffs + obj->_oy); mq = new MessageQueue(inter->_messageQueue, 0, 1); mq->changeParam28ForObjectId(obj->_id, -1, obj->_okeyCode); mq->_flags |= 1; if (!(inter->_flags & 0x10000)) { ex = new ExCommand(obj->_id, 34, 0x80, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = obj->_okeyCode; ex->_field_14 = 0x100; ex->_messageNum = 0; ex->_excFlags = 3; mq->_exCommands.push_back(ex); } ex = new ExCommand(obj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = obj->_okeyCode; ex->_field_14 = 0x100; ex->_messageNum = 0; ex->_excFlags = 3; mq->_exCommands.push_back(ex); ex = new ExCommand(subj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = subj->_okeyCode; ex->_field_14 = 0x100; ex->_messageNum = 0; ex->_excFlags = 3; mq->_exCommands.push_back(ex); ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; ex->_keyCode = 0; mq->_exCommands.push_back(ex); if (!mq->chain(subj)) { delete mq; return false; } subj->_flags |= 1; obj->_flags |= 1; } else { bool someFlag = false; PicAniInfo aniInfo; obj->getPicAniInfo(&aniInfo); if (obj->_objtype == kObjTypeStaticANIObject && inter->_staticsId1) { StaticANIObject *ani = (StaticANIObject *)obj; ani->_messageQueueId = 0; ani->changeStatics2(inter->_staticsId1); } int xpos = inter->_yOffs + obj->_ox; int ypos = inter->_yOffs + obj->_oy; obj->setPicAniInfo(&aniInfo); if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1 || (inter->_staticsId2 != 0 && (subj->_statics == 0 || subj->_statics->_staticsId != inter->_staticsId2))) { mq = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->method34(subj, xpos, ypos, 1, inter->_staticsId2); if (!mq) return false; ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0); ex->_x = obj->_id; ex->_y = obj->_okeyCode; ex->_keyCode = subj->_okeyCode; ex->_excFlags = 3; ex->_field_20 = invId; ex->_field_14 = (obj->_objtype != kObjTypePictureObject); mq->_exCommands.push_back(ex); someFlag = true; ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0); ex->_x = xpos; ex->_y = ypos; ex->_excFlags |= 3; ex->_keyCode = 6; ex->_field_14 = obj->_id; ex->_field_20 = obj->_okeyCode; ex->postMessage(); } if (!inter->_staticsId1 || !(inter->_flags & 1)) return true; StaticANIObject *ani = (StaticANIObject *)obj; if (!ani->isIdle()) return false; if (ani->getMessageQueue()) ani->queueMessageQueue(0); if (!ani->_statics || ani->_statics->_staticsId != inter->_staticsId1 || ani->_movement) { mq = ani->changeStatics1(inter->_staticsId1); if (!mq) return false; if (someFlag) { if (!(inter->_flags & 0x10000)) { if (mq->_isFinished) { ani->_flags |= 0x80u; } else { ex = new ExCommand(ani->_id, 34, 0x80, 0, 0, 0, 1, 0, 0, 0); ex->_field_14 = 0x80; ex->_keyCode = ani->_okeyCode; ex->_excFlags = 3; mq->_exCommands.push_back(ex); } } ex = new ExCommand(ani->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = ani->_okeyCode; ex->_field_14 = 0x100; ex->_excFlags = 3; mq->_exCommands.push_back(ex); } else { ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0); ex->_x = ani->_id; ex->_y = ani->_okeyCode; ex->_keyCode = subj->_okeyCode; ex->_excFlags = 2; ex->_field_14 = (obj->_objtype != kObjTypePictureObject); ex->_field_20 = invId; mq->_exCommands.push_back(ex); if (!mq->_isFinished) return true; mq->_isFinished = 0; ani->queueMessageQueue(mq); } } else { obj->_flags |= 1; if (inter->_flags & 0x10000) return true; obj->_flags |= 0x80; } } return true; }
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->addObject(_aniMan); cmp->setEnabled(); getGameLoaderInteractionController()->enableFlag24(); setInputDisabled(0); scene->setPictureObjectsFlag4(); for (PtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) { StaticANIObject *o = (StaticANIObject *)*s; o->setFlags(o->_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; #if 0 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; #endif 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; #if 0 case SC_18: sub_40E1B0(); sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_18"); scene->preloadMovements(sceneVar); sub_4062D0(); if (dword_476C38) 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_scene3) { g_scene3 = accessScene(SC_18); getGameLoader()->loadScene(SC_18); scene18_initScene2(g_scene3); sub_40C5F0(); scene19_sub_420B10(g_scene3, entrance->field_4); dword_476C38 = 1; } sub_40C650(); sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_19"); scene->preloadMovements(sceneVar); sub_4062D0(); if (dword_476C38) scene18_initScene1(scene); else scene19_initScene2(); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_19"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler19, 2); scene19_sub_4211D0(scene); _updateCursorCallback = scene19_updateCursor; break; #endif 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; #if 0 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; #endif 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; #if 0 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; #endif 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; }
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_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 sceneHandler17_hideSugar() { StaticANIObject *sugar = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_SUGAR, -1); if (sugar) sugar->hide(); }
void scene15_initScene(Scene *sc) { g_vars->scene15_chantingCountdown = 0; StaticANIObject *grandma = sc->getStaticANIObject1ById(ANI_GRANDMA_ASS, -1); Scene *oldsc = g_fp->_currentScene; g_fp->_currentScene = sc; int grandmaState = g_fp->getObjectState(sO_Grandma); if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15)) { grandma->changeStatics2(ST_GMS_BOOT); grandma->setOXY(97, 399); g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed)); } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15_1)) { grandma->changeStatics2(ST_GMS_BOOT); grandma->setOXY(86, 399); g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed)); } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15_2)) { grandma->changeStatics2(ST_GMS_BOOT); grandma->setOXY(71, 399); g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed)); } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15_3)) { grandma->changeStatics2(ST_GMS_BOOT); grandma->setOXY(49, 399); g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed)); } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_WithoutBoot)) { grandma->changeStatics2(ST_GMS_BOOT); grandma->setOXY(97, 399); grandma->changeStatics2(ST_GMS_BOOTLESS2); g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed)); } else { grandma->hide(); g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsOpened)); } g_vars->scene15_plusminus = sc->getStaticANIObject1ById(ANI_PLUSMINUS, -1); if (g_fp->getObjectState(sO_Guard_2) == g_fp->getObjectEnumState(sO_Guard_2, sO_Off)) g_vars->scene15_plusminus->_statics = g_vars->scene15_plusminus->getStaticsById(ST_PMS_MINUS); else g_vars->scene15_plusminus->_statics = g_vars->scene15_plusminus->getStaticsById(ST_PMS_PLUS); g_vars->scene15_ladder = sc->getPictureObjectById(PIC_SC15_LADDER, 0); g_vars->scene15_boot = sc->getStaticANIObject1ById(ANI_BOOT_15, -1); if (g_fp->getObjectState(sO_Boot_15) != g_fp->getObjectEnumState(sO_Boot_15, sO_IsPresent)) g_vars->scene15_boot->_flags &= 0xFFFB; g_fp->_currentScene = oldsc; g_fp->lift_setButton(sO_Level5, ST_LBN_5N); g_fp->lift_init(sc, QU_SC15_ENTERLIFT, QU_SC15_EXITLIFT); }
int global_messageHandler2(ExCommand *cmd) { if (cmd->_messageKind != 17) return 0; int res = 0; StaticANIObject *ani; switch (cmd->_messageNum) { case 0x44c8: error("0x44c8"); // Unk3_sub_4477A0(&unk3, _parentId, _field_14 != 0); break; case 28: ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (ani) ani->_priority = cmd->_field_14; break; case 25: ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (ani) { if (cmd->_field_14) { ani->setFlags40(true); ani->_callback2 = staticANIObjectCallback; } else { ani->setFlags40(false); ani->_callback2 = 0; // Really NULL } } break; case 26: ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (ani) { Movement *mov = ani->_movement; if (mov) mov->_currDynamicPhase->_field_68 = 0; } break; default: #if 0 // We never put anything into _defMsgArray while (::iterator it = g_fp->_defMsgArray.begin(); it != g_fp->_defMsgArray.end(); ++it) if (((ExCommand *)*it)->_field_24 == _messageNum) { ((ExCommand *)*it)->firef34(v13); res = 1; } #endif //debug_msg(_messageNum); if (!g_fp->_soundEnabled || cmd->_messageNum != 33 || g_fp->_currSoundListCount <= 0) return res; for (int snd = 0; snd < g_fp->_currSoundListCount; snd++) { SoundList *s = g_fp->_currSoundList1[snd]; int ms = s->getCount(); for (int i = 0; i < ms; i++) { s->getSoundByIndex(i)->setPanAndVolumeByStaticAni(); } } } return res; }
void scene16_initScene(Scene *sc) { g_vars->scene16_figures.clear(); g_vars->scene16_walkingBoy = 0; g_vars->scene16_walkingGirl = 0; g_vars->scene16_walkingCount = 200; g_vars->scene16_wire = sc->getStaticANIObject1ById(ANI_WIRE16, -1); g_vars->scene16_mug = sc->getStaticANIObject1ById(ANI_MUG, -1); g_vars->scene16_jettie = sc->getStaticANIObject1ById(ANI_JETTIE, -1); g_vars->scene16_boot = sc->getStaticANIObject1ById(ANI_BOOT_16, -1); g_vars->scene16_girlIsLaughing = false; g_vars->scene16_sound = SND_16_034; if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Convoluted)) { g_vars->scene16_placeIsOccupied = true; StaticANIObject *boy[2]; boy[0] = sc->getStaticANIObject1ById(ANI_BOY, -1); boy[0]->loadMovementsPixelData(); boy[1] = new StaticANIObject(boy[0]); sc->addStaticANIObject(boy[1], 1); int idx = 0; for (int i = 0; i < 3; i++) { g_vars->scene16_figures.push_back(boy[idx]); idx++; if (idx >= 2) idx = 0; } g_vars->scene16_figures.push_back(sc->getStaticANIObject1ById(ANI_GIRL, -1)); for (int i = 0; i < 4; i++) { g_vars->scene16_figures.push_back(boy[idx]); idx++; if (idx >= 2) idx = 0; } } else { g_fp->setObjectState(sO_Girl, g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)); g_vars->scene16_placeIsOccupied = false; StaticANIObject *ani = new StaticANIObject(g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_BEARDED_CMN, -1)); ani->_movement = 0; ani->_statics = (Statics *)ani->_staticsList[0]; sc->addStaticANIObject(ani, 1); } if (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsLaughing)) { StaticANIObject *girl = sc->getStaticANIObject1ById(ANI_GIRL, -1); girl->show1(554, 432, MV_GRL_LAUGH_POPA, 0); girl->_priority = 20; } if (g_fp->getObjectState(sO_Cup) == g_fp->getObjectEnumState(sO_Cup, sO_In_16)) { g_vars->scene16_mug->_statics = g_vars->scene16_mug->getStaticsById(ST_MUG_EMPTY); g_vars->scene16_mug->_movement = 0; g_vars->scene16_mug->setOXY(409, 459); g_vars->scene16_mug->_priority = 5; g_vars->scene16_mug->_flags |= 4; } }
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); }