void CritterDialog::_selectAnswer(size_t i) { if (i >= _answers.size()) throw Exception("No answer with number " + std::to_string(i)); auto game = Game::getInstance(); auto dialog = dynamic_cast<CritterInteract*>(game->states()->at(game->states()->size() - 2)); // @todo optimize int newOffset = dialog->script()->script()->procedures()->at(_functions.at(i))->bodyOffset(); int oldOffset = dialog->script()->programCounter() - 2; deleteAnswers(); dialog->script()->dataStack()->push(0); // arguments counter; dialog->script()->returnStack()->push(oldOffset); // return adrress dialog->script()->setProgramCounter(newOffset); dialog->script()->run(); }
void Opcode811E::_run() { Logger::debug("SCRIPT") << "[811E] [=] void gSay_Reply(int msg_file_num, int msg_num)" << std::endl; auto dialog = dynamic_cast<State::CritterDialog *>(Game::getInstance()->topState()); dialog->deleteAnswers(); if (_script->dataStack()->top().type() == StackValue::Type::STRING) { auto question = _script->dataStack()->popString(); dialog->setQuestion(question); } else { auto msg_num = _script->dataStack()->popInteger(); auto msg_file_num = _script->dataStack()->popInteger(); dialog->setQuestion(_script->msgMessage(msg_file_num, msg_num)); auto speech = _script->msgSpeech(msg_file_num, msg_num); if (speech != "") { if (auto interact = dynamic_cast<State::CritterInteract *>(Game::getInstance()->topState(1))) { interact->playSpeech(speech); } } } }