void AGOSEngine::handleVerbClicked(uint verb) { Subroutine *sub; int result; if (shouldQuit()) return; _objectItem = _hitAreaObjectItem; if (_objectItem == _dummyItem2) { _objectItem = me(); } if (_objectItem == _dummyItem3) { _objectItem = derefItem(me()->parent); } _subjectItem = _hitAreaSubjectItem; if (_subjectItem == _dummyItem2) { _subjectItem = me(); } if (_subjectItem == _dummyItem3) { _subjectItem = derefItem(me()->parent); } if (_subjectItem) { _scriptNoun1 = _subjectItem->noun; _scriptAdj1 = _subjectItem->adjective; } else { _scriptNoun1 = -1; _scriptAdj1 = -1; } if (_objectItem) { _scriptNoun2 = _objectItem->noun; _scriptAdj2 = _objectItem->adjective; } else { _scriptNoun2 = -1; _scriptAdj2 = -1; } _scriptVerb = _verbHitArea; sub = getSubroutineByID(0); if (sub == NULL) return; result = startSubroutine(sub); if (result == -1) showMessageFormat("I don't understand"); _runScriptReturn1 = false; sub = getSubroutineByID(100); if (sub) startSubroutine(sub); if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP) _runScriptReturn1 = false; permitInput(); }
void AGOSEngine::o_process() { // 71: start subroutine uint16 id = getVarOrWord(); if (!_copyProtection && getGameType() == GType_WW && id == 71) { // Copy protection was disabled in Good Old Games release return; } Subroutine *sub = getSubroutineByID(id); if (sub != NULL) { #ifdef __DS__ // HACK: Skip scene of Simon reading letter from Calypso // due to speech segment been too large to fit into memory if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE) && getPlatform() == Common::kPlatformWindows && sub->id == 2922) { // set parent special _noParentNotify = true; setItemParent(derefItem(16), me()); _noParentNotify = false; // set parent special _noParentNotify = true; setItemParent(derefItem(14), me()); _noParentNotify = false; // set item parent setItemParent(derefItem(12), me()); return; } #endif startSubroutine(sub); } }
bool SimonEngine::printTextOf(uint a, uint x, uint y) { const byte *stringPtr; uint16 pixels, w; if (getGameType() == GType_SIMON2) { if (getBitFlag(79)) { Subroutine *sub; _variableArray[84] = a; sub = getSubroutineByID(5003); if (sub != NULL) startSubroutineEx(sub); return true; } } if (a >= _numTextBoxes) return false; stringPtr = getStringPtrByID(_stringIdArray2[a]); if (getGameType() == GType_FF) { getPixelLength((const char *)stringPtr, 400, pixels); w = pixels + 1; x -= w / 2; printScreenText(6, 0, (const char *)stringPtr, x, y, w); } else { showActionString(stringPtr); } return true; }
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::dumpAllSubroutines() { for (int i = 0; i < 65536; i++) { Subroutine *sub = getSubroutineByID(i); if (sub != NULL) { dumpSubroutine(sub); } } }
void AGOSEngine::invokeTimeEvent(TimeEvent *te) { Subroutine *sub; _scriptVerb = 0; if (_runScriptReturn1) return; sub = getSubroutineByID(te->subroutine_id); if (sub != NULL) startSubroutineEx(sub); _runScriptReturn1 = false; }
void AGOSEngine_Elvira2::oe2_doTable() { // 143: start item sub Item *i = getNextItemPtr(); SubRoom *r = (SubRoom *)findChildOfType(i, kRoomType); if (r != NULL) { Subroutine *sub = getSubroutineByID(r->subroutine_id); if (sub) { startSubroutine(sub); return; } } if (getGameType() == GType_ELVIRA2) { SubSuperRoom *sr = (SubSuperRoom *)findChildOfType(i, kSuperRoomType); if (sr != NULL) { Subroutine *sub = getSubroutineByID(sr->subroutine_id); if (sub) { startSubroutine(sub); return; } } } }