/** * Set up new room. * This function is called when ego enters a new room. * @param n room number */ void AgiEngine::newRoom(int n) { VtEntry *v; int i; // Simulate slowww computer. // Many effects rely on it. pause(kPauseRoom); debugC(4, kDebugLevelMain, "*** room %d ***", n); _sound->stopSound(); i = 0; for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) { v->entry = i++; v->flags &= ~(ANIMATED | DRAWN); v->flags |= UPDATE; v->stepTime = 1; v->stepTimeCount = 1; v->cycleTime = 1; v->cycleTimeCount = 1; v->stepSize = 1; } agiUnloadResources(); _game.playerControl = true; _game.block.active = false; _game.horizon = 36; _game.vars[vPrevRoom] = _game.vars[vCurRoom]; _game.vars[vCurRoom] = n; _game.vars[vBorderTouchObj] = 0; _game.vars[vBorderCode] = 0; _game.vars[vEgoViewResource] = _game.viewTable[0].currentView; agiLoadResource(rLOGIC, n); // Reposition ego in the new room switch (_game.vars[vBorderTouchEgo]) { case 1: _game.viewTable[0].yPos = _HEIGHT - 1; break; case 2: _game.viewTable[0].xPos = 0; break; case 3: _game.viewTable[0].yPos = HORIZON + 1; break; case 4: _game.viewTable[0].xPos = _WIDTH - _game.viewTable[0].xSize; break; } _game.vars[vBorderTouchEgo] = 0; setflag(fNewRoomExec, true); _game.exitAllLogics = true; writeStatus(); writePrompt(); }
int AgiEngine::agiDeinit() { int ec; cleanInput(); // remove all words from memory agiUnloadResources(); // unload resources in memory _loader->unloadResource(rLOGIC, 0); ec = _loader->deinit(); unloadObjects(); unloadWords(); clearImageStack(); return ec; }
int AgiEngine::agiDeinit() { int ec; if (!_loader) return errOK; _words->clearEgoWords(); // remove all words from memory agiUnloadResources(); // unload resources in memory _loader->unloadResource(RESOURCETYPE_LOGIC, 0); ec = _loader->deinit(); unloadObjects(); _words->unloadDictionary(); clearImageStack(); return ec; }
/** * Set up new room. * This function is called when ego enters a new room. * @param n room number */ void AgiEngine::newRoom(int16 newRoomNr) { ScreenObjEntry *screenObj; ScreenObjEntry *screenObjEgo = &_game.screenObjTable[SCREENOBJECTS_EGO_ENTRY]; int i; // Loading trigger artificialDelayTrigger_NewRoom(newRoomNr); debugC(4, kDebugLevelMain, "*** room %d ***", newRoomNr); _sound->stopSound(); i = 0; for (screenObj = _game.screenObjTable; screenObj < &_game.screenObjTable[SCREENOBJECTS_MAX]; screenObj++) { screenObj->objectNr = i++; screenObj->flags &= ~(fAnimated | fDrawn); screenObj->flags |= fUpdate; screenObj->stepTime = 1; screenObj->stepTimeCount = 1; screenObj->cycleTime = 1; screenObj->cycleTimeCount = 1; screenObj->stepSize = 1; } agiUnloadResources(); _game.playerControl = true; _game.block.active = false; _game.horizon = 36; setVar(VM_VAR_PREVIOUS_ROOM, getVar(VM_VAR_CURRENT_ROOM)); setVar(VM_VAR_CURRENT_ROOM, newRoomNr); setVar(VM_VAR_BORDER_TOUCH_OBJECT, 0); setVar(VM_VAR_BORDER_CODE, 0); setVar(VM_VAR_EGO_VIEW_RESOURCE, screenObjEgo->currentViewNr); agiLoadResource(RESOURCETYPE_LOGIC, newRoomNr); // Reposition ego in the new room switch (getVar(VM_VAR_BORDER_TOUCH_EGO)) { case 1: screenObjEgo->yPos = SCRIPT_HEIGHT - 1; break; case 2: screenObjEgo->xPos = 0; break; case 3: screenObjEgo->yPos = _game.horizon + 1; break; case 4: screenObjEgo->xPos = SCRIPT_WIDTH - screenObjEgo->xSize; break; } uint16 agiVersion = getVersion(); if (agiVersion < 0x2000) { warning("STUB: NewRoom(%d)", newRoomNr); screenObjEgo->flags &= ~fDidntMove; // animateObject(0); agiLoadResource(RESOURCETYPE_VIEW, screenObjEgo->currentViewNr); setView(screenObjEgo, screenObjEgo->currentViewNr); } else { if (agiVersion >= 0x3000) { // this was only done in AGI3 if (screenObjEgo->motionType == kMotionEgo) { screenObjEgo->motionType = kMotionNormal; setVar(VM_VAR_EGO_DIRECTION, 0); } } setVar(VM_VAR_BORDER_TOUCH_EGO, 0); setFlag(VM_FLAG_NEW_ROOM_EXEC, true); _game.exitAllLogics = true; _game._vm->_text->statusDraw(); _game._vm->_text->promptRedraw(); } }