예제 #1
0
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);
             }
         }
     }
 }