void FullpipeEngine::restartGame() { _floaters->stopAll(); clearGlobalMessageQueueList(); clearMessages(); initObjectStates(); if (_scene2) { _scene2->getAniMan(); _scene2 = 0; } if (_currentScene) { _gameLoader->unloadScene(_currentScene->_sceneId); _currentScene = 0; } _gameLoader->restoreDefPicAniInfos(); getGameLoaderInventory()->clear(); getGameLoaderInventory()->addItem(ANI_INV_MAP, 1); getGameLoaderInventory()->rebuildItemRects(); initMap(); if (_flgPlayIntro) { _gameLoader->loadScene(SC_INTRO1); _gameLoader->gotoScene(SC_INTRO1, TrubaUp); } else { _gameLoader->loadScene(SC_1); _gameLoader->gotoScene(SC_1, TrubaLeft); } }
void scene26_initScene(Scene *sc) { g_vars->scene26_chhi = sc->getStaticANIObject1ById(ANI_CHHI, -1); g_vars->scene26_drop = sc->getStaticANIObject1ById(ANI_DROP_26, -1); g_vars->scene26_sockPic = sc->getPictureObjectById(PIC_SC26_SOCK, 0); g_vars->scene26_sock = sc->getStaticANIObject1ById(ANI_SOCK_26, -1); if (g_fp->getObjectState(sO_Hatch_26) == g_fp->getObjectEnumState(sO_Hatch_26, sO_WithSock)) { g_fp->setObjectState(sO_Hatch_26, g_fp->getObjectEnumState(sO_Hatch_26, sO_Closed)); g_fp->setObjectState(sO_Sock_26, g_fp->getObjectEnumState(sO_Sock_26, sO_HangsOnPipe)); } Interaction *inter = getGameLoaderInteractionController()->getInteractionByObjectIds(ANI_LUK26, ANI_MAN, ANI_INV_SOCK); if (getGameLoaderInventory()->getCountItemsWithId(ANI_INV_VENT) == 0) inter->_flags &= 0xFFFDFFFF; else inter->_flags |= 0x20000; if (g_fp->getObjectState(sO_Sock_26) == g_fp->getObjectEnumState(sO_Sock_26, sO_HangsOnPipe)) g_vars->scene26_sockPic->_flags |= 4; else g_vars->scene26_sockPic->_flags &= 0xFFFB; if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Opened)) g_fp->playSound(SND_26_018, 1); }
void scene25_initScene(Scene *sc, int entranceId) { g_vars->scene25_water = sc->getStaticANIObject1ById(ANI_WATER25, -1); g_vars->scene25_board = sc->getStaticANIObject1ById(ANI_BOARD25, -1); g_vars->scene25_drop = sc->getStaticANIObject1ById(ANI_DROP_25, -1); g_vars->scene25_water->setAlpha(0xa0); g_vars->scene25_drop->setAlpha(0xa0); g_vars->scene25_dudeIsOnBoard = false; if (g_fp->getObjectState(sO_Pool) < g_fp->getObjectEnumState(sO_Pool, sO_HalfFull)) { g_vars->scene25_waterIsPresent = false; g_vars->scene25_water->hide(); } else { g_vars->scene25_waterIsPresent = true; g_fp->playSound(SND_25_006, 1); } int boardState = g_fp->getObjectState(sO_Board_25); if (entranceId == TrubaRight) { if (boardState == g_fp->getObjectEnumState(sO_Board_25, sO_FarAway)) { scene25_showBoardOnRightFar(); g_fp->playSound(SND_25_029, 0); g_vars->scene25_boardIsSelectable = false; } else { if (boardState == g_fp->getObjectEnumState(sO_Board_25, sO_Nearby) || boardState == g_fp->getObjectEnumState(sO_Board_25, sO_WithDudeOnRight)) scene25_showBoardOnRightClose(); g_vars->scene25_boardIsSelectable = false; } } else { if (boardState == g_fp->getObjectEnumState(sO_Board_25, sO_WithDudeOnLeft)) { if (!getGameLoaderInventory()->getCountItemsWithId(ANI_INV_BOARD)) { getGameLoaderInventory()->addItem(ANI_INV_BOARD, 1); getGameLoaderInventory()->rebuildItemRects(); } } else { g_vars->scene25_boardIsSelectable = true; } } g_vars->scene25_beardersAreThere = false; g_vars->scene25_beardersCounter = 0; }
void FullpipeEngine::getAllInventory() { Inventory2 *inv = getGameLoaderInventory(); for (uint i = 0; i < inv->getItemsPoolCount(); ++i ) { int id = inv->getInventoryPoolItemIdAtIndex(i); if (inv->getCountItemsWithId(id) < 1) inv->addItem(id, 1); } inv->rebuildItemRects(); }
int scene25_updateCursor() { g_fp->updateCursorCommon(); if (g_vars->scene25_waterIsPresent) { int inv = getGameLoaderInventory()->getSelectedItemId(); if (g_fp->_objectIdAtCursor == ANI_WATER25) { if ((g_vars->scene25_boardIsSelectable && (!inv || inv == ANI_INV_BOARD)) || (g_vars->scene25_dudeIsOnBoard && (inv == ANI_INV_LOPAT || !inv))) g_fp->_cursorId = (g_fp->_cursorId != PIC_CSR_DEFAULT) ? PIC_CSR_ITN : PIC_CSR_ITN_INV; // FIXME check } else if (g_fp->_objectIdAtCursor == ANI_BOARD25 && (!inv || inv == ANI_INV_SWAB || inv == ANI_INV_BROOM || inv == ANI_INV_LOPAT)) { g_fp->_cursorId = (g_fp->_cursorId != PIC_CSR_DEFAULT) ? PIC_CSR_ITN : PIC_CSR_ITN_INV; } } return g_fp->_cursorId; }
bool canInteractAny(GameObject *obj1, GameObject *obj2, int invId) { int sceneId = 0; if (g_fullpipe->_currentScene) sceneId = g_fullpipe->_currentScene->_sceneId; InteractionController *intC = getGameLoaderInteractionController(); for (ObList::iterator i = intC->_interactions.begin(); i != intC->_interactions.end(); ++i) { Interaction *intr = (Interaction *)*i; if (intr->_sceneId > 0 && intr->_sceneId != sceneId) break; if (invId == -3) { invId = getGameLoaderInventory()->getSelectedItemId(); } if (intr->canInteract(obj1, obj2, invId)) return true; } return false; }
void sceneHandler03_giveCoin(ExCommand *ex) { MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(ex->_parId); if (mq && mq->getCount() > 0) { ExCommand *ex0 = mq->getExCommandByIndex(0); ExCommand *ex1 = mq->getExCommandByIndex(1); if (sceneHandler03_swallowedEgg1State()) { ex0->_messageKind = 1; ex1->_messageKind = 1; getGameLoaderInventory()->removeItem(ANI_INV_COIN, 1); } else { ex0->_messageKind = 0; ex0->_excFlags |= 1; ex1->_messageKind = 0; ex1->_excFlags |= 1; g_vars->scene03_eggeater->_flags &= 0xFF7Fu; } } }
void FullpipeEngine::updateEvents() { Common::Event event; Common::EventManager *eventMan = _system->getEventManager(); ExCommand *ex; while (eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; switch (event.kbd.keycode) { case Common::KEYCODE_SPACE: if (_gamePaused) { if (_modalObject) { if (_modalObject->init(42)) { _modalObject->update(); } else { _modalObject->saveload(); BaseModalObject *obj = _modalObject->_parentObj; if (obj) delete _modalObject; _modalObject = obj; } } else { _gameLoader->updateSystems(42); } return; } ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = 32; ex->_excFlags |= 3; ex->handle(); break; case Common::KEYCODE_s: if (_gamePaused) { _gamePaused = 0; _flgGameIsRunning = true; return; } ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = event.kbd.keycode; ex->_excFlags |= 3; ex->handle(); break; case Common::KEYCODE_q: return; break; default: if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) { // Start the debugger getDebugger()->attach(); getDebugger()->onFrame(); } ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = event.kbd.keycode; ex->_excFlags |= 3; ex->handle(); break; } break; case Common::EVENT_KEYUP: if (!_inputArFlag) { ex = new ExCommand(0, 17, 37, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; ex->handle(); } _keyState = Common::KEYCODE_INVALID; break; case Common::EVENT_MOUSEMOVE: if (_recordEvents) { ex = new ExCommand(0, 17, 31, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0); ex->_excFlags |= 3; ex->handle(); } _mouseScreenPos = event.mouse; break; case Common::EVENT_QUIT: _gameContinue = false; break; case Common::EVENT_RBUTTONDOWN: if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) { ex = new ExCommand(0, 17, 107, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0); ex->_excFlags |= 3; _lastInputTicks = _updateTicks; ex->handle(); } break; case Common::EVENT_LBUTTONDOWN: if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) { ex = new ExCommand(0, 17, 29, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0); ex->_sceneClickX = _sceneRect.left + ex->_x; ex->_sceneClickY = _sceneRect.top + ex->_y; ex->_keyCode = getGameLoaderInventory()->getSelectedItemId(); ex->_excFlags |= 3; _lastInputTicks = _updateTicks; ex->handle(); } break; case Common::EVENT_LBUTTONUP: if (!_inputArFlag && (_updateTicks - _lastButtonUpTicks) >= 2) { ex = new ExCommand(0, 17, 30, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; _lastButtonUpTicks = _updateTicks; ex->handle(); } break; default: break; } } // pollEvent() is implemented only for video player. So skip it. //if (event.kbd.keycode == MSG_SC11_SHOWSWING && _modalObject) { // _modalObject->pollEvent(); //} }
void FullpipeEngine::updateCursorCommon() { GameObject *ani = _currentScene->getStaticANIObjectAtPos(_mouseVirtX, _mouseVirtY); GameObject *pic = _currentScene->getPictureObjectAtPos(_mouseVirtX, _mouseVirtY); if (!ani || (pic && pic->_priority < ani->_priority)) ani = pic; int selId = getGameLoaderInventory()->getSelectedItemId(); _objectAtCursor = ani; if (ani) { _objectIdAtCursor = ani->_id; if (!selId && ani->_id >= _minCursorId && ani->_id <= _maxCursorId) { selId = _objectIdCursors[ani->_id - _minCursorId]; if (selId) { _cursorId = selId; return; } } if (canInteractAny(_aniMan, ani, selId)) { _cursorId = selId > 0 ? PIC_CSR_ITN_INV : PIC_CSR_ITN; return; } if (selId) { _cursorId = PIC_CSR_DEFAULT_INV; return; } if (_objectIdAtCursor == ANI_LIFTBUTTON && lift_getButtonIdP(((StaticANIObject *)ani)->_statics->_staticsId)) { _cursorId = PIC_CSR_LIFT; return; } if (_sceneRect.right - _mouseVirtX < 47 && _sceneRect.right < _sceneWidth - 1) { _cursorId = PIC_CSR_GOFAR_R; return; } if (_mouseVirtX - _sceneRect.left < 47 && _sceneRect.left > 0) { _cursorId = PIC_CSR_GOFAR_L; return; } _cursorId = PIC_CSR_DEFAULT; return; } else { _objectIdAtCursor = 0; if (selId) { _cursorId = PIC_CSR_DEFAULT_INV; return; } if (_sceneRect.right - _mouseVirtX < 47 && _sceneRect.right < _sceneWidth - 1) { _cursorId = PIC_CSR_GOFAR_R; return; } if (_mouseVirtX - _sceneRect.left < 47 && _sceneRect.left > 0) { _cursorId = PIC_CSR_GOFAR_L; return; } } _cursorId = PIC_CSR_DEFAULT; }
void FullpipeEngine::updateEvents() { Common::Event event; Common::EventManager *eventMan = _system->getEventManager(); ExCommand *ex; while (eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; switch (event.kbd.keycode) { case Common::KEYCODE_SPACE: if (_gamePaused) { if (_modalObject) { if (_modalObject->init(42)) { _modalObject->update(); } else { _modalObject->saveload(); BaseModalObject *obj = _modalObject->_parentObj; if (obj) delete _modalObject; _modalObject = obj; } } else { _gameLoader->updateSystems(42); } return; } ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = 32; ex->_excFlags |= 3; ex->handle(); break; case Common::KEYCODE_s: if (_gamePaused) { _gamePaused = 0; _flgGameIsRunning = true; return; } ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = event.kbd.keycode; ex->_excFlags |= 3; ex->handle(); break; case Common::KEYCODE_q: return; break; default: ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0); ex->_keyCode = event.kbd.keycode; ex->_excFlags |= 3; ex->handle(); break; } break; case Common::EVENT_KEYUP: if (!_inputArFlag) { ex = new ExCommand(0, 17, 37, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; ex->handle(); } _keyState = Common::KEYCODE_INVALID; break; case Common::EVENT_MOUSEMOVE: if (_recordEvents) { ex = new ExCommand(0, 17, 31, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0); ex->_excFlags |= 3; ex->handle(); } _mouseScreenPos = event.mouse; break; case Common::EVENT_QUIT: _gameContinue = false; break; case Common::EVENT_RBUTTONDOWN: if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) { ex = new ExCommand(0, 17, 107, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0); ex->_excFlags |= 3; _lastInputTicks = _updateTicks; ex->handle(); } break; case Common::EVENT_LBUTTONDOWN: if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) { ex = new ExCommand(0, 17, 29, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0); ex->_sceneClickX = _sceneRect.left + ex->_x; ex->_sceneClickY = _sceneRect.top + ex->_y; ex->_keyCode = getGameLoaderInventory()->getSelectedItemId(); ex->_excFlags |= 3; _lastInputTicks = _updateTicks; ex->handle(); } break; case Common::EVENT_LBUTTONUP: if (!_inputArFlag && (_updateTicks - _lastButtonUpTicks) >= 2) { ex = new ExCommand(0, 17, 30, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; _lastButtonUpTicks = _updateTicks; ex->handle(); } break; default: break; } } #if 0 warning("STUB: FullpipeEngine::updateEvents() <mainWindowProc>"); if (Msg == MSG_SC11_SHOWSWING && _modalObject) { _modalObject->method14(); } #endif }
bool FullpipeEngine::loadGam(const char *fname, int scene) { _gameLoader = new GameLoader(); if (!_gameLoader->loadFile(fname)) return false; _currSoundListCount = 0; initObjectStates(); // set_g_messageQueueCallback1(messageQueueCallback1); // substituted with direct call addMessageHandlerByIndex(global_messageHandler1, 0, 4); _inventory = getGameLoaderInventory(); _inventory->setItemFlags(ANI_INV_MAP, 0x10003); _inventory->addItem(ANI_INV_MAP, 1); _inventory->rebuildItemRects(); for (PtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) { ((MemoryObject *)((PictureObject *)*p)->_picture)->load(); } // _sceneSwitcher = sceneSwitcher; // substituted with direct call _gameLoader->_preloadCallback = preloadCallback; // _readSavegameCallback = gameLoaderReadSavegameCallback; // TODO _aniMan = accessScene(SC_COMMON)->getAniMan(); _scene2 = 0; _movTable = _aniMan->countMovements(); _aniMan->setSpeed(1); PictureObject *pic = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0); pic->setFlags(pic->_flags & 0xFFFB); // Not used in full game //_evalVersionPic = accessScene(SC_COMMON)->getPictureObjectById(PIC_CMN_EVAL, 0); initMap(); initCursors(); setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED")); if (scene) { _gameLoader->loadScene(726); _gameLoader->gotoScene(726, TrubaLeft); if (scene != 726) _gameLoader->preloadScene(726, getSceneEntrance(scene)); } else { if (_flgPlayIntro) { _gameLoader->loadScene(SC_INTRO1); _gameLoader->gotoScene(SC_INTRO1, TrubaUp); } else { _gameLoader->loadScene(SC_1); _gameLoader->gotoScene(SC_1, TrubaLeft); } } if (!_currentScene) return false; return true; }
int global_messageHandler3(ExCommand *cmd) { int result = 0; if (cmd->_messageKind == 17) { switch (cmd->_messageNum) { case 29: case 30: case 31: case 32: case 36: if (g_fp->_inputDisabled) cmd->_messageKind = 0; break; default: break; } } StaticANIObject *ani, *ani2; switch (cmd->_messageKind) { case 17: switch (cmd->_messageNum) { case 61: debugC(0, kDebugEvents, "preload: { %d, %d },", cmd->_parentId, cmd->_param); return g_fp->_gameLoader->preloadScene(cmd->_parentId, cmd->_param); case 62: return g_fp->_gameLoader->gotoScene(cmd->_parentId, cmd->_param); case 64: if (g_fp->_currentScene && g_fp->_msgObjectId2 && (!(cmd->_param & 4) || g_fp->_msgObjectId2 != cmd->_field_14 || g_fp->_msgId != cmd->_field_20)) { ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_msgObjectId2, g_fp->_msgId); if (ani) { ani->_flags &= 0xFF7F; ani->_flags &= 0xFEFF; ani->deleteFromGlobalMessageQueue(); } } g_fp->_msgX = 0; g_fp->_msgY = 0; g_fp->_msgObjectId2 = 0; g_fp->_msgId = 0; if ((cmd->_param & 1) || (cmd->_param & 2)) { g_fp->_msgX = cmd->_x; g_fp->_msgY = cmd->_y; } if (cmd->_param & 4) { g_fp->_msgObjectId2 = cmd->_field_14; g_fp->_msgId = cmd->_field_20; } return result; case 29: if (g_fp->_gameLoader->_interactionController->_flag24 && g_fp->_currentScene) { ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY); ani2 = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1); if (ani) { if (g_fp->_msgObjectId2 == ani->_id && g_fp->_msgId == ani->_odelay) { cmd->_messageKind = 0; return result; } if (canInteractAny(ani2, ani, cmd->_param)) { handleObjectInteraction(ani2, ani, cmd->_param); return 1; } } else { int id = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY); PictureObject *pic = g_fp->_currentScene->getPictureObjectById(id, 0); if (pic) { if (g_fp->_msgObjectId2 == pic->_id && g_fp->_msgId == pic->_odelay) { cmd->_messageKind = 0; return result; } if (!ani2 || canInteractAny(ani2, pic, cmd->_param)) { if (!ani2 || (ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))) handleObjectInteraction(ani2, pic, cmd->_param); return 1; } } } } if (getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->_isEnabled && cmd->_param <= 0) { if (g_fp->_msgX != cmd->_sceneClickX || g_fp->_msgY != cmd->_sceneClickY) { ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1); if (!ani || (ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100))) { debugC(0, kDebugPathfinding, "WWW 1"); result = startWalkTo(g_fp->_gameLoader->_field_FA, -1, cmd->_sceneClickX, cmd->_sceneClickY, 0); if (result) { ExCommand *ex = new ExCommand(g_fp->_gameLoader->_field_FA, 17, 64, 0, 0, 0, 1, 0, 0, 0); ex->_param = 1; ex->_excFlags |= 3; ex->_x = cmd->_sceneClickX; ex->_y = cmd->_sceneClickY; ex->postMessage(); } } } else { cmd->_messageKind = 0; } } return result; default: return result; } case 58: g_fp->setCursor(cmd->_param); return result; case 59: setInputDisabled(1); return result; case 60: setInputDisabled(0); return result; case 56: if (cmd->_field_2C) { ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param); if (ani) { getGameLoaderInventory()->addItem2(ani); result = 1; } } else { result = 1; getGameLoaderInventory()->addItem(cmd->_parentId, 1); } getGameLoaderInventory()->rebuildItemRects(); return result; case 57: if (cmd->_field_2C) { if (!cmd->_field_20) { getGameLoaderInventory()->removeItem2(g_fp->_currentScene, cmd->_parentId, cmd->_x, cmd->_y, cmd->_field_14); getGameLoaderInventory()->rebuildItemRects(); return 1; } ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1); if (ani) { getGameLoaderInventory()->removeItem2(g_fp->_currentScene, cmd->_parentId, ani->_ox + cmd->_x, ani->_oy + cmd->_y, ani->_priority + cmd->_field_14); getGameLoaderInventory()->rebuildItemRects(); return 1; } } else { getGameLoaderInventory()->removeItem(cmd->_parentId, 1); } getGameLoaderInventory()->rebuildItemRects(); return 1; case 55: if (g_fp->_currentScene) { GameObject *obj; if (cmd->_field_14) obj = g_fp->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y); else obj = g_fp->_currentScene->getPictureObjectById(cmd->_x, cmd->_y); handleObjectInteraction(g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_param), obj, cmd->_field_20); result = 1; } return result; case 51: return startWalkTo(cmd->_parentId, cmd->_param, cmd->_x, cmd->_y, cmd->_field_20); case 52: return doSomeAnimation(cmd->_parentId, cmd->_param, cmd->_field_20); case 53: return doSomeAnimation2(cmd->_parentId, cmd->_param); case 63: if (cmd->_objtype == kObjTypeObjstateCommand) { ObjstateCommand *c = (ObjstateCommand *)cmd; result = 1; g_fp->setObjectState(c->_objCommandName.c_str(), c->_value); } return result; default: return result; } }
int global_messageHandler1(ExCommand *cmd) { debugC(5, kDebugEvents, "global_messageHandler1: %d %d", cmd->_messageKind, cmd->_messageNum); if (cmd->_excFlags & 0x10000) { if (cmd->_messageNum == MV_MAN_TOLADDER) cmd->_messageNum = MV_MAN_TOLADDER2; if (cmd->_messageNum == MV_MAN_STARTLADDER) cmd->_messageNum = MV_MAN_STARTLADDER2; if (cmd->_messageNum == MV_MAN_GOLADDER) cmd->_messageNum = MV_MAN_GOLADDER2; if (cmd->_messageNum == MV_MAN_STOPLADDER) cmd->_messageNum = MV_MAN_STOPLADDER2; } if (g_fp->_inputDisabled) { if (cmd->_messageKind == 17) { switch (cmd->_messageNum) { case 29: case 30: case 36: case 106: cmd->_messageKind = 0; break; default: break; } } } else if (cmd->_messageKind == 17) { switch (cmd->_messageNum) { case MSG_MANSHADOWSON: g_fp->_aniMan->_shadowsOn = 1; break; case MSG_HMRKICK_STUCCO: global_messageHandler_KickStucco(); break; case MSG_MANSHADOWSOFF: g_fp->_aniMan->_shadowsOn = 0; break; case MSG_DISABLESAVES: g_fp->disableSaves(cmd); break; case MSG_ENABLESAVES: g_fp->enableSaves(); break; case MSG_HMRKICK_METAL: global_messageHandler_KickMetal(); break; case 29: // left mouse if (g_fp->_inventoryScene) { if (getGameLoaderInventory()->handleLeftClick(cmd)) cmd->_messageKind = 0; } break; case 107: // right mouse if (getGameLoaderInventory()->getSelectedItemId()) { getGameLoaderInventory()->unselectItem(0); cmd->_messageKind = 0; } break; case 36: // keydown g_fp->defHandleKeyDown(cmd->_param); switch (cmd->_param) { case '\x1B': // ESC if (g_fp->_currentScene) { getGameLoaderInventory()->unselectItem(0); g_fp->openMainMenu(); cmd->_messageKind = 0; } break; case 't': g_fp->stopAllSounds(); cmd->_messageKind = 0; break; case 'u': g_fp->toggleMute(); cmd->_messageKind = 0; break; case ' ': if (getGameLoaderInventory()->getIsLocked()) { if (getGameLoaderInventory()->getIsInventoryOut()) { getGameLoaderInventory()->setIsLocked(0); } } else { getGameLoaderInventory()->slideOut(); getGameLoaderInventory()->setIsLocked(1); } break; case '\t': // Demo has no map if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS) break; if (g_fp->_flgCanOpenMap) g_fp->openMap(); cmd->_messageKind = 0; break; case Common::KEYCODE_F1: if (g_fp->_flgCanOpenMap) g_fp->openHelp(); cmd->_messageKind = 0; break; case '8': { int num = 32; for (int i = 0; i < g_fp->_gameLoader->_sc2array[num]._picAniInfosCount; i++) { debug("pic %d, %d:", num, i); g_fp->_gameLoader->_sc2array[num]._picAniInfos[i]->print(); } } break; default: break; } break; case 33: if (!g_fp->_inventoryScene) break; int invItem; if (g_fp->_updateFlag && (invItem = g_fp->_inventory->getHoveredItem(&g_fp->_mouseScreenPos))) { g_fp->_cursorId = PIC_CSR_ITN; if (!g_fp->_currSelectedInventoryItemId && !g_fp->_aniMan->_movement && !(g_fp->_aniMan->_flags & 0x100) && g_fp->_aniMan->isIdle()) { int st = g_fp->_aniMan->_statics->_staticsId; ExCommand *newex = 0; if (st == ST_MAN_RIGHT) { newex = new ExCommand(g_fp->_aniMan->_id, 1, rMV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0); } else if (st == (0x4000 | ST_MAN_RIGHT)) { newex = new ExCommand(g_fp->_aniMan->_id, 1, MV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0); } if (newex) { newex->_param = g_fp->_aniMan->_odelay; newex->_excFlags |= 3; newex->postMessage(); } } if (g_fp->_currSelectedInventoryItemId != invItem) g_fp->playSound(SND_CMN_070, 0); g_fp->_currSelectedInventoryItemId = invItem; g_fp->setCursor(g_fp->_cursorId); break; } if (g_fp->_updateCursorCallback) g_fp->_updateCursorCallback(); g_fp->_currSelectedInventoryItemId = 0; g_fp->setCursor(g_fp->_cursorId); break; case 65: // open map if (cmd->_field_2C == 11 && cmd->_field_14 == ANI_INV_MAP && g_fp->_flgCanOpenMap) g_fp->openMap(); break; default: break; } } if (cmd->_messageKind == 56) { getGameLoaderInventory()->rebuildItemRects(); ExCommand *newex = new ExCommand(0, 35, SND_CMN_031, 0, 0, 0, 1, 0, 0, 0); newex->_field_14 = 1; newex->_excFlags |= 3; newex->postMessage(); return 1; } else if (cmd->_messageKind == 57) { getGameLoaderInventory()->rebuildItemRects(); return 1; } return 0; }
bool GameLoader::writeSavegame(Scene *sc, const char *fname) { GameVar *v = _gameVar->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME"); if (!v) { v = _gameVar->getSubVarByName("OBJSTATES")->addSubVarAsInt("SAVEGAME", 0); if (!v) { warning("No state to save"); return false; } } SaveHeader header; v->setSubVarAsInt("Scene", sc->_sceneId); saveScenePicAniInfos(sc->_sceneId); memset(&header, 0, sizeof(header)); header.version = 48; // '0' strcpy(header.magic, "FullPipe Savegame"); header.updateCounter = _updateCounter; header.unkField = 1; Common::MemoryWriteStreamDynamic stream; MfcArchive *archive = new MfcArchive(&stream); v = _gameVar->getSubVarByName("OBJSTATES"); GameVar *nxt = 0; GameVar *prv = 0; GameVar *par; if (v) { nxt = v->_nextVarObj; prv = v->_prevVarObj; par = v->_parentVarObj; v->_parentVarObj = 0; v->_nextVarObj = 0; v->_prevVarObj = 0; } archive->writeObject(v); if (v) { v->_parentVarObj = par; v->_nextVarObj = nxt; v->_prevVarObj = prv; } getGameLoaderInventory()->savePartial(*archive); archive->writeUint32LE(_sc2array.size()); debugC(3, kDebugLoading, "Saving %d infos", _sc2array.size()); for (uint i = 0; i < _sc2array.size(); i++) { archive->writeUint32LE(_sc2array[i]._picAniInfosCount); if (_sc2array[i]._picAniInfosCount) debugC(3, kDebugLoading, "Count %d: %d", i, _sc2array[i]._picAniInfosCount); for (uint j = 0; j < _sc2array[i]._picAniInfosCount; j++) { _sc2array[i]._picAniInfos[j]->save(*archive); } } header.encSize = stream.size(); // Now obfuscate the data for (uint i = 0; i < header.encSize; i++) stream.getData()[i] += i & 0x7f; if (_savegameCallback) _savegameCallback(archive, true); // Now dump it into save file Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(fname); if (!saveFile) { warning("Cannot open file for writing: %s", fname); return false; } saveFile->writeUint32LE(header.version); saveFile->write(header.magic, 32); saveFile->writeUint32LE(header.updateCounter); saveFile->writeUint32LE(header.unkField); saveFile->writeUint32LE(header.encSize); debugC(3, kDebugLoading, "version: %d magic: %s updateCounter: %d unkField: %d encSize: %d, pos: %d", header.version, header.magic, header.updateCounter, header.unkField, header.encSize, saveFile->pos()); saveFile->write(stream.getData(), stream.size()); uint headerPos = saveFile->pos(); FullpipeSavegameHeader header2; strcpy(header2.id, "SVMCR"); header2.version = FULLPIPE_SAVEGAME_VERSION; TimeDate curTime; g_system->getTimeAndDate(curTime); header2.date = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); header2.time = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF); header2.playtime = g_fp->getTotalPlayTime() / 1000; saveFile->write(header2.id, 6); saveFile->writeByte(header2.version); saveFile->writeUint32LE(header2.date); saveFile->writeUint16LE(header2.time); saveFile->writeUint32LE(header2.playtime); g_fp->_currentScene->draw(); Graphics::saveThumbnail(*saveFile); // FIXME. Render proper screen saveFile->writeUint32LE(headerPos); // Store where the header starts saveFile->finalize(); delete saveFile; delete archive; 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->initMctlGraph(); cmp->attachObject(_aniMan); cmp->activate(); getGameLoaderInteractionController()->enableFlag24(); setInputDisabled(0); scene->setPictureObjectsFlag4(); for (uint i = 0; i < scene->_staticANIObjectList1.size(); i++) scene->_staticANIObjectList1[i]->_flags &= 0xFE7F; PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0); p->setFlags(p->_flags & 0xFFFB); removeMessageHandler(2, -1); _updateScreenCallback = 0; switch (entrance->_sceneId) { case SC_INTRO1: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1"); scene->preloadMovements(sceneVar); sceneIntro_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_INTRO1"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandlerIntro, 2); _updateCursorCallback = sceneIntro_updateCursor; break; case SC_1: scene01_fixEntrance(); sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_1"); scene->preloadMovements(sceneVar); scene01_initScene(scene, entrance->_field_4); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_1"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler01, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_2: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_2"); scene->preloadMovements(sceneVar); scene02_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_2"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler02, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_3: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_3"); scene->preloadMovements(sceneVar); scene03_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_3"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler03, 2); scene03_setEaterState(); _updateCursorCallback = scene03_updateCursor; break; case SC_4: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_4"); scene->preloadMovements(sceneVar); scene04_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_4"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler04, 2, 2); _updateCursorCallback = scene04_updateCursor; break; case SC_5: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_5"); scene->preloadMovements(sceneVar); scene05_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_5"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler05, 2, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_6: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_6"); scene->preloadMovements(sceneVar); scene06_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_6"); setSceneMusicParameters(sceneVar); scene06_initMumsy(); insertMessageHandler(sceneHandler06, 2, 2); _updateCursorCallback = scene06_updateCursor; break; case SC_7: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_7"); scene->preloadMovements(sceneVar); scene07_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_7"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler07, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_8: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_8"); scene->preloadMovements(sceneVar); scene08_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_8"); setSceneMusicParameters(sceneVar); scene08_setupMusic(); addMessageHandler(sceneHandler08, 2); _updateCursorCallback = scene08_updateCursor; break; case SC_9: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_9"); scene->preloadMovements(sceneVar); scene09_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_9"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler09, 2, 2); _updateCursorCallback = scene09_updateCursor; break; case SC_10: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_10"); scene->preloadMovements(sceneVar); scene10_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_10"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler10, 2, 2); _updateCursorCallback = scene10_updateCursor; break; case SC_11: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_11"); scene->preloadMovements(sceneVar); scene11_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_11"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler11, 2, 2); scene11_setupMusic(); _updateCursorCallback = scene11_updateCursor; break; case SC_12: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_12"); scene->preloadMovements(sceneVar); scene12_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_12"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler12, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_13: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_13"); scene->preloadMovements(sceneVar); scene13_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_13"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler13, 2, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_14: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_14"); scene->preloadMovements(sceneVar); scene14_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_14"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler14, 2, 2); scene14_setupMusic(); _updateCursorCallback = scene14_updateCursor; break; case SC_15: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_15"); scene->preloadMovements(sceneVar); scene15_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_15"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler15, 2, 2); _updateCursorCallback = scene15_updateCursor; break; case SC_16: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_16"); scene->preloadMovements(sceneVar); scene16_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_16"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler16, 2); _updateCursorCallback = scene16_updateCursor; break; case SC_17: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_17"); scene->preloadMovements(sceneVar); scene17_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_17"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler17, 2); scene17_restoreState(); _updateCursorCallback = scene17_updateCursor; break; case SC_18: scene18_setupEntrance(); sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_18"); scene->preloadMovements(sceneVar); g_fp->stopAllSounds(); if (g_vars->scene18_inScene18p1) scene18_initScene1(scene); else scene18_initScene2(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_18"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler18, 2, 2); _updateCursorCallback = scene18_updateCursor; break; case SC_19: if (!g_fp->_scene3) { g_fp->_scene3 = accessScene(SC_18); g_fp->_gameLoader->loadScene(SC_18); scene18_initScene2(g_fp->_scene3); scene18_preload(); scene19_setMovements(g_fp->_scene3, entrance->_field_4); g_vars->scene18_inScene18p1 = true; } scene19_preload(); sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_19"); scene->preloadMovements(sceneVar); g_fp->stopAllSounds(); if (g_vars->scene18_inScene18p1) scene18_initScene1(scene); else scene19_initScene2(); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_19"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler19, 2); scene19_setSugarState(scene); _updateCursorCallback = scene19_updateCursor; break; case SC_20: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_20"); scene->preloadMovements(sceneVar); scene20_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_20"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler20, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_21: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_21"); scene->preloadMovements(sceneVar); scene21_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_21"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler21, 2, 2); _updateCursorCallback = scene21_updateCursor; break; case SC_22: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_22"); scene->preloadMovements(sceneVar); scene22_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_22"); setSceneMusicParameters(sceneVar); scene22_setBagState(); insertMessageHandler(sceneHandler22, 2, 2); _updateCursorCallback = scene22_updateCursor; break; case SC_23: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_23"); scene->preloadMovements(sceneVar); scene23_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_23"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler23, 2, 2); scene23_setGiraffeState(); _updateCursorCallback = scene23_updateCursor; break; case SC_24: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_24"); scene->preloadMovements(sceneVar); scene24_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_24"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler24, 2); scene24_setPoolState(); _updateCursorCallback = defaultUpdateCursor; break; case SC_25: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_25"); scene->preloadMovements(sceneVar); scene25_initScene(scene, entrance->_field_4); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_25"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler25, 2); scene25_setupWater(scene, entrance->_field_4); _updateCursorCallback = scene25_updateCursor; break; case SC_26: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_26"); scene->preloadMovements(sceneVar); scene26_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_26"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler26, 2, 2); scene26_setupDrop(scene); _updateCursorCallback = scene26_updateCursor; break; case SC_27: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_27"); scene->preloadMovements(sceneVar); scene27_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_27"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler27, 2); _updateCursorCallback = scene27_updateCursor; break; case SC_28: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_28"); scene->preloadMovements(sceneVar); scene28_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_28"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler28, 2, 2); _updateCursorCallback = scene28_updateCursor; break; case SC_29: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_29"); scene->preloadMovements(sceneVar); scene29_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_29"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler29, 2); _updateCursorCallback = scene29_updateCursor; break; case SC_30: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_30"); scene->preloadMovements(sceneVar); scene30_initScene(scene, entrance->_field_4); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_30"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler30, 2); _updateCursorCallback = scene30_updateCursor; break; case SC_31: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_31"); scene->preloadMovements(sceneVar); scene31_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_31"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler31, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_32: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_32"); scene->preloadMovements(sceneVar); scene32_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_32"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler32, 2, 2); scene32_setupMusic(); _updateCursorCallback = scene32_updateCursor; break; case SC_33: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_33"); scene->preloadMovements(sceneVar); scene33_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_33"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler33, 2, 2); scene33_setupMusic(); _updateCursorCallback = scene33_updateCursor; break; case SC_34: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_34"); scene->preloadMovements(sceneVar); scene34_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_34"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler34, 2, 2); scene34_initBeh(); _updateCursorCallback = scene34_updateCursor; break; case SC_35: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_35"); scene->preloadMovements(sceneVar); scene35_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_35"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler35, 2, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_36: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_36"); scene->preloadMovements(sceneVar); scene36_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_36"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler36, 2); _updateCursorCallback = scene36_updateCursor; break; case SC_37: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_37"); scene->preloadMovements(sceneVar); scene37_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_37"); setSceneMusicParameters(sceneVar); insertMessageHandler(sceneHandler37, 2, 2); _updateCursorCallback = scene37_updateCursor; break; case SC_38: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_38"); scene->preloadMovements(sceneVar); scene38_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_38"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandler38, 2); _updateCursorCallback = defaultUpdateCursor; break; case SC_FINAL1: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_FINAL1"); scene->preloadMovements(sceneVar); sceneFinal_initScene(); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_FINAL1"); setSceneMusicParameters(sceneVar); addMessageHandler(sceneHandlerFinal, 2); _updateCursorCallback = sceneFinal_updateCursor; break; case SC_DBGMENU: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_DBGMENU"); scene->preloadMovements(sceneVar); sceneDbgMenu_initScene(scene); _behaviorManager->initBehavior(scene, sceneVar); scene->initObjectCursors("SC_DBGMENU"); addMessageHandler(sceneHandlerDbgMenu, 2); break; default: error("Unknown scene %d", entrance->_sceneId); break; } return true; }
bool FullpipeEngine::loadGam(const char *fname, int scene) { _gameLoader.reset(new GameLoader()); if (!_gameLoader->loadFile(fname)) return false; _currSoundListCount = 0; initObjectStates(); // set_g_messageQueueCallback1(messageQueueCallback1); // substituted with direct call addMessageHandlerByIndex(global_messageHandler1, 0, 4); _inventory = getGameLoaderInventory(); if (isDemo() && getLanguage() == Common::RU_RUS) { _inventory->addItem(ANI_INV_HAMMER, 1); } else { _inventory->setItemFlags(ANI_INV_MAP, 0x10003); _inventory->addItem(ANI_INV_MAP, 1); } _inventory->rebuildItemRects(); for (uint i = 0; i < _inventory->getScene()->_picObjList.size(); i++) _inventory->getScene()->_picObjList[i]->_picture->MemoryObject::load(); // _sceneSwitcher = sceneSwitcher; // substituted with direct call _gameLoader->_preloadCallback = preloadCallback; _gameLoader->_savegameCallback = gameLoaderSavegameCallback; _aniMan = accessScene(SC_COMMON)->getAniMan(); _scene2 = 0; _movTable.reset(_aniMan->countMovements()); _aniMan->setSpeed(1); PictureObject *pic = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0); pic->setFlags(pic->_flags & 0xFFFB); // Not used in full game //_evalVersionPic = accessScene(SC_COMMON)->getPictureObjectById(PIC_CMN_EVAL, 0); initMap(); initCursors(); setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED")); if (scene == -1) return true; if (scene) { _gameLoader->loadScene(726); _gameLoader->gotoScene(726, TrubaLeft); if (scene != 726) _gameLoader->preloadScene(726, getSceneEntrance(scene)); } else { if (_flgPlayIntro) { _gameLoader->loadScene(SC_INTRO1); _gameLoader->gotoScene(SC_INTRO1, TrubaUp); } else { if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS) { _gameLoader->loadScene(SC_9); _gameLoader->gotoScene(SC_9, TrubaDown); } else { _gameLoader->loadScene(SC_1); _gameLoader->gotoScene(SC_1, TrubaLeft); } } } if (!_currentScene) return false; return true; }