void AgiEngine::interpretCycle() { ScreenObjEntry *screenObjEgo = &_game.screenObjTable[SCREENOBJECTS_EGO_ENTRY]; bool oldSound; byte oldScore; if (!_game.playerControl) setVar(VM_VAR_EGO_DIRECTION, screenObjEgo->direction); else screenObjEgo->direction = getVar(VM_VAR_EGO_DIRECTION); checkAllMotions(); oldScore = getVar(VM_VAR_SCORE); oldSound = getFlag(VM_FLAG_SOUND_ON); // Reset script heuristic here resetGetVarSecondsHeuristic(); _game.exitAllLogics = false; while (runLogic(0) == 0 && !(shouldQuit() || _restartGame)) { setVar(VM_VAR_WORD_NOT_FOUND, 0); setVar(VM_VAR_BORDER_TOUCH_OBJECT, 0); setVar(VM_VAR_BORDER_CODE, 0); oldScore = getVar(VM_VAR_SCORE); setFlag(VM_FLAG_ENTERED_CLI, false); _game.exitAllLogics = false; artificialDelay_CycleDone(); resetControllers(); } artificialDelay_CycleDone(); resetControllers(); screenObjEgo->direction = getVar(VM_VAR_EGO_DIRECTION); if (getVar(VM_VAR_SCORE) != oldScore || getFlag(VM_FLAG_SOUND_ON) != oldSound) _game._vm->_text->statusDraw(); setVar(VM_VAR_BORDER_TOUCH_OBJECT, 0); setVar(VM_VAR_BORDER_CODE, 0); setFlag(VM_FLAG_NEW_ROOM_EXEC, false); setFlag(VM_FLAG_RESTART_GAME, false); setFlag(VM_FLAG_RESTORE_JUST_RAN, false); if (_game.gfxMode) { updateScreenObjTable(); } _gfx->updateScreen(); //_gfx->doUpdate(); }
AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBase(syst, gameDesc) { // Setup mixer syncSoundSettings(); DebugMan.addDebugChannel(kDebugLevelMain, "Main", "Generic debug level"); DebugMan.addDebugChannel(kDebugLevelResources, "Resources", "Resources debugging"); DebugMan.addDebugChannel(kDebugLevelSprites, "Sprites", "Sprites debugging"); DebugMan.addDebugChannel(kDebugLevelInventory, "Inventory", "Inventory debugging"); DebugMan.addDebugChannel(kDebugLevelInput, "Input", "Input events debugging"); DebugMan.addDebugChannel(kDebugLevelMenu, "Menu", "Menu debugging"); DebugMan.addDebugChannel(kDebugLevelScripts, "Scripts", "Scripts debugging"); DebugMan.addDebugChannel(kDebugLevelSound, "Sound", "Sound debugging"); DebugMan.addDebugChannel(kDebugLevelText, "Text", "Text output debugging"); DebugMan.addDebugChannel(kDebugLevelSavegame, "Savegame", "Saving & restoring game debugging"); memset(&_game, 0, sizeof(struct AgiGame)); memset(&_debug, 0, sizeof(struct AgiDebug)); memset(&_mouse, 0, sizeof(struct Mouse)); _game.mouseEnabled = true; _game.mouseHidden = false; // don't check for Amiga, Amiga doesn't allow disabling mouse support. It's mandatory. if (!ConfMan.getBool("mousesupport")) { // we effectively disable the mouse for games, that explicitly do not want mouse support to be enabled _game.mouseEnabled = false; _game.mouseHidden = true; } _game._vm = this; _game.gfxMode = true; _keyQueueStart = 0; _keyQueueEnd = 0; _allowSynthetic = false; _intobj = NULL; memset(&_stringdata, 0, sizeof(struct StringData)); _objects = NULL; _restartGame = false; _firstSlot = 0; resetControllers(); setupOpcodes(); _game._curLogic = NULL; _veryFirstInitialCycle = true; _instructionCounter = 0; resetGetVarSecondsHeuristic(); _setVolumeBrokenFangame = false; // for further study see AgiEngine::setVolumeViaScripts() _lastSaveTime = 0; memset(_keyQueue, 0, sizeof(_keyQueue)); _console = nullptr; _font = nullptr; _gfx = nullptr; _sound = nullptr; _picture = nullptr; _sprites = nullptr; _text = nullptr; _loader = nullptr; _menu = nullptr; _systemUI = nullptr; _inventory = nullptr; _keyHoldMode = false; }