bool KyraEngine_HoF::handleInputUnkSub(int x, int y) { if (y > 143 || _deathHandler > -1 || queryGameFlag(0x164)) return false; if (_mouseState <= -3 && findItem(_mainCharacter.sceneId, 13) >= 0) { updateCharFacing(); objectChat(getTableString(0xFC, _cCodeBuffer, 1), 0, 0x83, 0xFC); return true; } else { _emc->init(&_sceneScriptState, &_sceneScriptData); _sceneScriptState.regs[1] = x; _sceneScriptState.regs[2] = y; _sceneScriptState.regs[3] = 0; _sceneScriptState.regs[4] = _itemInHand; _emc->start(&_sceneScriptState, 1); while (_emc->isValid(&_sceneScriptState)) _emc->run(&_sceneScriptState); if (queryGameFlag(0x1ED)) { _sound->beginFadeOut(); _screen->fadeToBlack(); _showOutro = true; _runFlag = false; } return _sceneScriptState.regs[3] != 0; } }
int KyraEngine_HoF::cauldronClearButton(Button *button) { if (!queryGameFlag(2)) { updateCharFacing(); objectChat(getTableString(0xF0, _cCodeBuffer, 1), 0, 0x83, 0xF0); return 0; } if (queryGameFlag(0xE4)) { snd_playSoundEffect(0x0D); return 0; } _screen->hideMouse(); displayInvWsaLastFrame(); snd_playSoundEffect(0x25); loadInvWsa("PULL.WSA", 1, 6, 0, -1, -1, 1); loadInvWsa("CAULD00.WSA", 1, 7, 0, 0xD4, 0x0F, 1); showMessage(0, 0xCF); setCauldronState(0, 0); clearCauldronTable(); snd_playSoundEffect(0x57); loadInvWsa("CAULDFIL.WSA", 1, 7, 0, -1, -1, 1); _screen->showMouse(); return 0; }
void KyraEngine_HoF::updateCommandLineEx(int str1, int str2, int16 palIndex) { char buffer[0x51]; char *src = buffer; strcpy(src, getTableString(str1, _cCodeBuffer, 1)); if (_flags.lang != Common::JA_JPN) { while (*src != 0x20) ++src; ++src; *src = toupper(*src); } strcpy((char *)_unkBuf500Bytes, src); if (str2 > 0) { if (_flags.lang != Common::JA_JPN) strcat((char *)_unkBuf500Bytes, " "); strcat((char *)_unkBuf500Bytes, getTableString(str2, _cCodeBuffer, 1)); } showMessage((char *)_unkBuf500Bytes, palIndex); }
int KyraEngine_HoF::cauldronButton(Button *button) { if (!queryGameFlag(2)) { objectChat(getTableString(0xF0, _cCodeBuffer, 1), 0, 0x83, 0xF0); return 0; } if (!_screen->isMouseVisible() || _mouseState < -1) return 0; if (queryGameFlag(0xE4)) { snd_playSoundEffect(0x0D); return 0; } updateCharFacing(); for (int i = 0; _cauldronProtectedItems[i] != -1; ++i) { if (_itemInHand == _cauldronProtectedItems[i]) { objectChat(getTableString(0xF1, _cCodeBuffer, 1), 0, 0x83, 0xF1); return 0; } } if (_itemInHand == -1) { listItemsInCauldron(); return 0; } for (int i = 0; _cauldronBowlTable[i] != -1; i += 2) { if (_itemInHand == _cauldronBowlTable[i]) { addFrontCauldronTable(_itemInHand); setHandItem(_cauldronBowlTable[i+1]); if (!updateCauldron()) { _cauldronState = 0; cauldronRndPaletteFade(); } return 0; } } if (_itemInHand == 18) { const int16 *magicTable = (_mainCharacter.sceneId == 77) ? _cauldronMagicTableScene77 : _cauldronMagicTable; while (magicTable[0] != -1) { if (_cauldronState == magicTable[0]) { setHandItem(magicTable[1]); snd_playSoundEffect(0x6C); ++_cauldronUseCount; if (_cauldronStateTable[_cauldronState] <= _cauldronUseCount && _cauldronUseCount) { showMessage(0, 0xCF); setCauldronState(0, true); clearCauldronTable(); } return 0; } magicTable += 2; } } else if (_itemInHand >= 0) { int item = _itemInHand; cauldronItemAnim(item); addFrontCauldronTable(item); if (!updateCauldron()) { _cauldronState = 0; cauldronRndPaletteFade(); } } return 0; }
int KyraEngine_HoF::bookButton(Button *button) { if (!queryGameFlag(1)) { objectChat(getTableString(0xEB, _cCodeBuffer, 1), 0, 0x83, 0xEB); return 0; } if (!_screen->isMouseVisible()) return 0; if (queryGameFlag(0xE5)) { snd_playSoundEffect(0x0D); return 0; } if (_itemInHand == 72) { if (!queryGameFlag(0xE2)) { _bookMaxPage += 2; removeHandItem(); snd_playSoundEffect(0x6C); setGameFlag(0xE2); } if (!queryGameFlag(0x18A) && queryGameFlag(0x170)) { _bookMaxPage += 2; removeHandItem(); snd_playSoundEffect(0x6C); setGameFlag(0x18A); } return 0; } if (_mouseState != -1) { snd_playSoundEffect(0x0D); return 0; } _screen->hideMouse(); showMessage(0, 0xCF); displayInvWsaLastFrame(); _bookNewPage = _bookCurPage; if (_screenBuffer) { memcpy(_screenBuffer, _screen->getCPagePtr(0), 64000); } _screen->copyPalette(2, 0); _screen->fadeToBlack(7, &_updateFunctor); _screen->loadPalette("_BOOK.COL", _screen->getPalette(0)); loadBookBkgd(); showBookPage(); _screen->copyRegion(0, 0, 0, 0, 0x140, 0xC8, 2, 0, Screen::CR_NO_P_CHECK); _screen->updateScreen(); int oldItemInHand = _itemInHand; removeHandItem(); _screen->fadePalette(_screen->getPalette(0), 7); _screen->showMouse(); bookLoop(); _screen->fadeToBlack(7); _screen->hideMouse(); setHandItem(oldItemInHand); updateMouse(); restorePage3(); if (_screenBuffer) { _screen->copyBlockToPage(0, 0, 0, 320, 200, _screenBuffer); } setHandItem(_itemInHand); _screen->copyPalette(0, 2); _screen->fadePalette(_screen->getPalette(0), 7, &_updateFunctor); _screen->showMouse(); if (!queryGameFlag(4) && !queryGameFlag(0xB8)) { objectChat(getTableString(0xEC, _cCodeBuffer, 1), 0, 0x83, 0xEC); objectChat(getTableString(0xED, _cCodeBuffer, 1), 0, 0x83, 0xED); objectChat(getTableString(0xEE, _cCodeBuffer, 1), 0, 0x83, 0xEE); objectChat(getTableString(0xEF, _cCodeBuffer, 1), 0, 0x83, 0xEF); setGameFlag(4); } return 0; }
void KyraEngine_HoF::showMessageFromCCode(int id, int16 palIndex, int) { const char *string = getTableString(id, _cCodeBuffer, 1); showMessage(string, palIndex); }
const char *KyraEngine_HoF::getChapterString(int id) { if (_currentChapter != _newChapterFile) loadChapterBuffer(_newChapterFile); return getTableString(id, _chapterBuffer, 1); }
void KyraEngine_HoF::runLoop() { _screen->updateScreen(); _runFlag = true; while (!shouldQuit() && _runFlag) { if (_deathHandler >= 0) { removeHandItem(); delay(5); _drawNoShapeFlag = 0; _gui->optionsButton(0); _deathHandler = -1; if (!_runFlag || shouldQuit()) break; } if (_system->getMillis() > _nextIdleAnim) showIdleAnim(); if (queryGameFlag(0x159)) { dinoRide(); resetGameFlag(0x159); } if (queryGameFlag(0x124) && !queryGameFlag(0x125)) { _mainCharacter.animFrame = 32; enterNewScene(39, -1, 0, 0, 0); } if (queryGameFlag(0xD8)) { resetGameFlag(0xD8); if (_mainCharacter.sceneId == 34) { if (queryGameFlag(0xD1)) { initTalkObject(28); npcChatSequence(getTableString(0xFA, _cCodeBuffer, 1), 28, 0x83, 0xFA); deinitTalkObject(28); enterNewScene(35, 4, 0, 0, 0); } else if (queryGameFlag(0xD0)) { initTalkObject(29); npcChatSequence(getTableString(0xFB, _cCodeBuffer, 1), 29, 0x83, 0xFB); deinitTalkObject(29); enterNewScene(33, 6, 0, 0, 0); } } } int inputFlag = checkInput(_buttonList, true); removeInputTop(); update(); if (inputFlag == 198 || inputFlag == 199) { _savedMouseState = _mouseState; handleInput(_mouseX, _mouseY); } //if (queryGameFlag(0x1EE) && inputFlag) // sub_13B19(inputFlag); _system->delayMillis(10); } }