void AGOSEngine_Feeble::oracleTextDown() { Subroutine *sub; int i = 0; changeWindow(3); _noOracleScroll = 0; if (_textWindow->scrollY > _oracleMaxScrollY) // For scroll up _oracleMaxScrollY = _textWindow->scrollY; while (1) { if (_textWindow->scrollY == 0) break; for (i = 0; i < 5; i++) { _newLines = 0; _textWindow->textColumn = 0; _textWindow->textRow = (i + 1) * 3; if (i == 4) { _textWindow->scrollY -= 1; _textWindow->textRow = 0; linksDown(); } scrollOracleDown(); setBitFlag(93, true); sub = getSubroutineByID(_variableArray[104]); if (sub) startSubroutineEx(sub); setBitFlag(93, false); } if (_currentBoxNum != 600 || !getBitFlag(89)) break; delay(100); } }
void AGOSEngine_FeebleDemo::startInteractiveVideo(const char *filename) { setBitFlag(40, true); _interactiveVideo = MoviePlayer::TYPE_LOOPING; _moviePlayer = makeMoviePlayer(this, filename); assert(_moviePlayer); _moviePlayer->load(); _moviePlayer->play(); setBitFlag(40, false); }
void AGOSEngine_Simon2::playSpeech(uint16 speech_id, uint16 vgaSpriteId) { if (speech_id == 0xFFFF) { if (_subtitles) return; if (!getBitFlag(14) && !getBitFlag(28)) { setBitFlag(14, true); _variableArray[100] = 5; animate(4, 1, 30, 0, 0, 0); waitForSync(130); } _skipVgaWait = true; } else { if (getGameType() == GType_SIMON2 && _subtitles && _language != Common::HE_ISR) { loadVoice(speech_id); return; } if (_subtitles && _scriptVar2) { animate(4, 2, 5, 0, 0, 0); waitForSync(205); stopAnimateSimon2(2,5); } stopAnimateSimon2(2, vgaSpriteId + 2); loadVoice(speech_id); animate(4, 2, vgaSpriteId + 2, 0, 0, 0); } }
void AGOSEngine_Simon1::playSpeech(uint16 speech_id, uint16 vgaSpriteId) { if (speech_id == 9999) { if (_subtitles) return; if (!getBitFlag(14) && !getBitFlag(28)) { setBitFlag(14, true); _variableArray[100] = 15; animate(4, 1, 130, 0, 0, 0); waitForSync(130); } _skipVgaWait = true; } else { if (_subtitles && _scriptVar2) { animate(4, 2, 204, 0, 0, 0); waitForSync(204); stopAnimate(204); } if (vgaSpriteId < 100) stopAnimate(201 + vgaSpriteId); loadVoice(speech_id); if (vgaSpriteId < 100) animate(4, 2, 201 + vgaSpriteId, 0, 0, 0); } }
void AGOSEngine_Feeble::playVideo(const char *filename, bool lastSceneUsed) { if (shouldQuit()) return; if (lastSceneUsed) setBitFlag(41, true); _moviePlayer = makeMoviePlayer(this, filename); assert(_moviePlayer); _moviePlayer->load(); _moviePlayer->play(); delete _moviePlayer; _moviePlayer = NULL; if (lastSceneUsed) setBitFlag(41, false); }
void AGOSEngine::waitForSync(uint a) { const uint maxCount = (getGameType() == GType_SIMON1) ? 1000 : 2500; if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE)) { if (a != 200) { uint16 tmp = _lastVgaWaitFor; _lastVgaWaitFor = 0; if (tmp == a) return; } } _vgaWaitFor = a; _syncCount = 0; _exitCutscene = false; _rightButtonDown = false; while (_vgaWaitFor != 0 && !shouldQuit()) { if (_rightButtonDown) { if (_vgaWaitFor == 200 && (getGameType() == GType_FF || !getBitFlag(14))) { skipSpeech(); break; } } if (_exitCutscene) { if (getGameType() == GType_ELVIRA1) { if (_variableArray[105] == 0) { _variableArray[105] = 255; break; } } else if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) { if (_vgaWaitFor == 51) { setBitFlag(244, 1); break; } } else { if (getBitFlag(9)) { endCutscene(); break; } } } processSpecialKeys(); if (_syncCount >= maxCount) { warning("waitForSync: wait timed out"); break; } delay(1); } }
void AGOSEngine::o_freezeZones() { // 138: freeze zones freezeBottom(); if (!_copyProtection && !(getFeatures() & GF_TALKIE) && _currentTable) { if ((getGameType() == GType_SIMON1 && _currentTable->id == 2924) || (getGameType() == GType_SIMON2 && _currentTable->id == 1322)) { _variableArray[134] = 3; _variableArray[135] = 3; setBitFlag(135, 1); setScriptCondition(0); } } }
void AGOSEngine_Feeble::off_playVideo() { // 183: play video if (getBitFlag(40)) { // Omni TV controls if (_moviePlayer) { setBitFlag(42, false); _interactiveVideo = MoviePlayer::TYPE_OMNITV; _moviePlayer->play(); } else { _variableArray[254] = 6747; } } else { assert(_moviePlayer); _moviePlayer->play(); delete _moviePlayer; _moviePlayer = NULL; } }
void AGOSEngine::skipSpeech() { _sound->stopVoice(); if (!getBitFlag(28)) { setBitFlag(14, true); if (getGameType() == GType_FF) { _variableArray[103] = 5; animate(4, 2, 13, 0, 0, 0); waitForSync(213); stopAnimateSimon2(2, 1); } else if (getGameType() == GType_SIMON2) { _variableArray[100] = 5; animate(4, 1, 30, 0, 0, 0); waitForSync(130); stopAnimateSimon2(2, 1); } else { _variableArray[100] = 15; animate(4, 1, 130, 0, 0, 0); waitForSync(130); stopAnimate(1); } } }
void AGOSEngine::vc78_computeXY() { VgaSprite *vsp = findCurSprite(); uint16 a = (uint16)_variableArrayPtr[12]; uint16 b = (uint16)_variableArrayPtr[13]; const uint16 *p = _pathFindArray[a - 1]; p += b * 2; uint16 posx = readUint16Wrapper(p); _variableArrayPtr[15] = posx; vsp->x = posx; uint16 posy = readUint16Wrapper(p + 1); _variableArrayPtr[16] = posy; vsp->y = posy; if (getGameType() == GType_FF) { setBitFlag(85, false); if (getBitFlag(74)) { centerScroll(); } } }
void AGOSEngine_Elvira2::oe2_bClear() { // 154: clear bit setBitFlag(getVarWrapper(), false); }
void AGOSEngine_Elvira2::oe2_bSet() { // 153: set bit setBitFlag(getVarWrapper(), true); }
void AGOSEngine_Simon1::handleMouseMoved() { uint x; if (_mouseHideCount) { CursorMan.showMouse(false); return; } CursorMan.showMouse(true); _mouse = _eventMan->getMousePos(); if (_defaultVerb) { uint id = 101; if (_mouse.y >= 136) id = 102; if (_defaultVerb != id) resetVerbs(); } if (getGameType() == GType_FF) { if (getBitFlag(99)) { // Oracle if (_mouse.x >= 10 && _mouse.x <= 635 && _mouse.y >= 5 && _mouse.y <= 475) { setBitFlag(98, true); } else { if (getBitFlag(98)) { _variableArray[254] = 63; } } } else if (getBitFlag(88)) { // Close Up if (_mouse.x >= 10 && _mouse.x <= 635 && _mouse.y >= 5 && _mouse.y <= 475) { setBitFlag(87, true); } else { if (getBitFlag(87)) { _variableArray[254] = 75; } } } if (_rightButtonDown) { _rightButtonDown = false; setVerb(NULL); } } else if (getGameType() == GType_SIMON2) { if (getBitFlag(79)) { if (!_vgaVar9) { if (_mouse.x >= 315 || _mouse.x < 9) goto get_out2; _vgaVar9 = 1; } if (_scrollCount == 0) { if (_mouse.x >= 315) { if (_scrollX != _scrollXMax) _scrollFlag = 1; } else if (_mouse.x < 8) { if (_scrollX != 0) _scrollFlag = -1; } } } else { get_out2:; _vgaVar9 = 0; } } if (_mouse != _mouseOld) _needHitAreaRecalc++; if (_leftButtonOld == 0 && _leftButtonCount != 0) { boxController(_mouse.x, _mouse.y, 3); } _leftButtonOld = _leftButton; x = 0; if (_lastHitArea3 == 0 && _leftButtonDown) { _leftButtonDown = false; x = 1; } else { if (!_litBoxFlag && _needHitAreaRecalc == 0) goto get_out; } boxController(_mouse.x, _mouse.y, x); _lastHitArea3 = _lastHitArea; if (x == 1 && _lastHitArea == NULL) _lastHitArea3 = (HitArea *) -1; get_out: _mouseOld = _mouse; drawMousePointer(); _needHitAreaRecalc = 0; _litBoxFlag = false; }
void AGOSEngine::delay(uint amount) { Common::Event event; uint32 start = _system->getMillis(); uint32 cur = start; uint this_delay, vgaPeriod; _system->getAudioCDManager()->updateCD(); _debugger->onFrame(); vgaPeriod = (_fastMode) ? 10 : _vgaPeriod; if (getGameType() == GType_PP && getGameId() != GID_DIMP) { if (vgaPeriod == 15 && _variableArray[999] == 0) vgaPeriod = 30; } _rnd.getRandomNumber(2); do { while (!_inCallBack && cur >= _lastVgaTick + vgaPeriod && !_pause) { _lastVgaTick += vgaPeriod; // don't get too many frames behind if (cur >= _lastVgaTick + vgaPeriod * 2) _lastVgaTick = cur; _inCallBack = true; timerProc(); _inCallBack = false; } while (_eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_KEYDOWN: if (event.kbd.keycode >= Common::KEYCODE_0 && event.kbd.keycode <= Common::KEYCODE_9 && (event.kbd.hasFlags(Common::KBD_ALT) || event.kbd.hasFlags(Common::KBD_CTRL))) { _saveLoadSlot = event.kbd.keycode - Common::KEYCODE_0; // There is no save slot 0 if (_saveLoadSlot == 0) _saveLoadSlot = 10; memset(_saveLoadName, 0, sizeof(_saveLoadName)); sprintf(_saveLoadName, "Quick %d", _saveLoadSlot); _saveLoadType = (event.kbd.hasFlags(Common::KBD_ALT)) ? 1 : 2; // We should only allow a load or save when it was possible in original // This stops load/save during copy protection, conversations and cut scenes if (!_mouseHideCount && !_showPreposition) quickLoadOrSave(); } else if (event.kbd.hasFlags(Common::KBD_CTRL)) { if (event.kbd.keycode == Common::KEYCODE_a) { GUI::Dialog *_aboutDialog; _aboutDialog = new GUI::AboutDialog(); _aboutDialog->runModal(); } else if (event.kbd.keycode == Common::KEYCODE_f) { _fastMode = !_fastMode; } else if (event.kbd.keycode == Common::KEYCODE_d) { _debugger->attach(); } else if (event.kbd.keycode == Common::KEYCODE_s) { dumpAllSubroutines(); } else if (event.kbd.keycode == Common::KEYCODE_i) { dumpAllVgaImageFiles(); } } if (getGameType() == GType_PP) { if (event.kbd.hasFlags(Common::KBD_SHIFT)) _variableArray[41] = 0; else _variableArray[41] = 1; } _keyPressed = event.kbd; break; case Common::EVENT_MOUSEMOVE: break; case Common::EVENT_LBUTTONDOWN: if (getGameType() == GType_FF) setBitFlag(89, true); _leftButtonDown = true; _leftButton = 1; break; case Common::EVENT_LBUTTONUP: if (getGameType() == GType_FF) setBitFlag(89, false); _leftButton = 0; _leftButtonCount = 0; _leftClick = true; break; case Common::EVENT_RBUTTONDOWN: if (getGameType() == GType_FF) setBitFlag(92, false); _rightButtonDown = true; break; case Common::EVENT_RBUTTONUP: _rightClick = true; break; case Common::EVENT_RTL: case Common::EVENT_QUIT: return; default: break; } } if (_leftButton == 1) _leftButtonCount++; _system->getAudioCDManager()->updateCD(); _system->updateScreen(); if (amount == 0) break; this_delay = _fastMode ? 1 : 20; if (this_delay > amount) this_delay = amount; _system->delayMillis(this_delay); cur = _system->getMillis(); } while (cur < start + amount && !shouldQuit()); }