/*---------------------------------------------------------------------*//** 動作開始 **//*---------------------------------------------------------------------*/ void Msg::play(ActMatter* owner) { EventData* evdat = owner->getEventSystemRefer()->getEventData(); ASSERT(evdat != 0L); // メッセージを表示する _evid = evdat->addChildMatter(owner->getEvId(), "TALK"); ASSERT(_evid != 0); TalkMatter* matter = (TalkMatter*)evdat->getMatterFromEvid(_evid); ASSERT(matter != 0L); matter->setting(&_setting, evdat->getMsgDataSet()); // 動作設定 // イベント開始 EvCause evcause(EventCause::CID_ACT); owner->getEventSystemRefer()->begin(_evid, owner->getBeginParam(), &evcause); Act::play(owner); }
/*---------------------------------------------------------------------*//** フレーム処理実装 **//*---------------------------------------------------------------------*/ void MapEmp_10242_1701_RestAtHome::execImplement(ExecRes* res, const ExecCtx* ec, f32 frameBegun) { enum Step { STEP_NULL, STEP_WAIT_BEGIN, STEP_CHECK_MOTEHR, STEP_TALK, STEP_WAIT_TALK, STEP_WAIT_YESNO, STEP_WAIT_FOUT, STEP_WAIT_FIN, }; GameGui* gui = Game::getGame()->getGui(); ASSERT(gui != 0L); SubtitlesWindow* wndSbt = gui->getSubtitlesWindow(); ASSERT(wndSbt != 0L); GameSysMsgWindow* wndSysMsg = (GameSysMsgWindow*)gui->getSysMsgWindow(); ASSERT(wndSysMsg != 0L); ScreenEffect* screff = Game::getGame()->getSceneScreenEffect(); ASSERT(screff != 0L); switch(getStep()) { case STEP_WAIT_BEGIN: // 継続監視 ///STRACE("!!! WAIT...\n"); if(!getOwner()->checkBegunOtherMatter(this, true)) { // 自身以外のイベントが起動していないならば次のステップへ advanceStep(); } break; case STEP_CHECK_MOTEHR: { UnitManager* unitmng = Game::getGame()->getUnitManager(); ASSERT(unitmng != 0L); // アサの母親在宅チェック Unit* unitYu = unitmng->findCharUnitFromCharId(CharIdDef::CHARID_NPC_MOTHER); _isShowMotherMsg = (unitYu != 0L); // 次のステップへ advanceStep(); } break; case STEP_TALK: { if(_isShowMotherMsg) { // メッセージを得る EventData* evdat = getOwner()->getEventData(); ASSERT(evdat != 0L); const MsgDataSet* msgdatset = evdat->getMsgDataSet(); ASSERT(msgdatset != 0L); const MsgData::Msg* msg = msgdatset->findMessageFromMsgid(MSGID_TALK_MSG); const VcString strMsg = (msg != 0L) ? msgdatset->getString(msg) : ""; // 会話メッセージウインドウを表示する wndSbt->setKind(SubtitlesWindow::KIND_TALK); wndSbt->showMessage(&strMsg, MSGWND_CTRL_HINT); // 次のステップへ advanceStep(); } else { if(frameBegun > (1.0f * FRAMERATE)) // ちょっと待って { // 次のステップへ advanceStep(); } } } break; case STEP_WAIT_TALK: if(wndSbt->isDone() || (!_isShowMotherMsg)) { // ウインドウを閉じる wndSbt->showWindow(false); // メッセージを得る EventData* evdat = getOwner()->getEventData(); ASSERT(evdat != 0L); const MsgDataSet* msgdatset = evdat->getMsgDataSet(); ASSERT(msgdatset != 0L); const MsgData::Msg* msg = msgdatset->findMessageFromMsgid(MSGID_INQURE); const VcString strMsg = (msg != 0L) ? msgdatset->getString(msg) : ""; // YES / NO メッセージウインドウを表示する wndSysMsg->setKind(MessageWindow::KIND_YESNO); wndSysMsg->showMessage(&strMsg, MSGWND_CTRL_HINT); // 次のステップへ advanceStep(); } break; case STEP_WAIT_YESNO: { const GameSysMsgWindow::Result* res = wndSysMsg->getResult(); if(res->isClickYesButton()) { // ウインドウを閉じる wndSysMsg->showWindow(false); // フェードアウト ColorU8 col1(0, 0, 0, 255); screff->setColor1(&col1); screff->setMaxFrame(120); screff->start(ScreenEffect::MODE_FADE_OUT); // 次のステップへ advanceStep(); } else if(res->isClickNoButton()) { // ウインドウを閉じる wndSysMsg->showWindow(false); // 終了 end(); } } break; case STEP_WAIT_FOUT: if(!screff->isWorking()) { // 家での休息処理 restAtHome(); StoryManager* strymng = Game::getGame()->getStoryManager(); ASSERT(strymng != 0L); strymng->notifyRestAtHome(); // PSNS にスコア送信 ScoreBase* score = Game::getGame()->getScore(); ASSERT(score != 0L); score->updatePsnsScore(); // 休息時イベント起動(たいていは何も起動しない) EventSys* evsys = Game::getGame()->getEventSys(); ASSERT(evsys != 0L); EvCause evcause(EventCause::CID_EVENT); ///evsys->beginCase(StDepEvDef::ECID_V01_MAP_REST_AT_HOME, 0, &evcause); evsys->begin(StDepEvDef::EVID_EP01_MAP_AFTER_REST_AT_HOME, 0, &evcause); // フェードインへ ColorU8 col1(0, 0, 0, 255); screff->setColor1(&col1); screff->setMaxFrame(60); screff->start(ScreenEffect::MODE_FADE_IN); // 次のステップへ advanceStep(); } break; case STEP_WAIT_FIN: if(!screff->isWorking()) { screff->end(0); end(); } break; } }
/*---------------------------------------------------------------------*//** フレーム処理実装 **//*---------------------------------------------------------------------*/ void QsEmp_ConfirmContract::execImplement(ExecRes* res, const ExecCtx* ec, f32 frameBegun) { GameGui* gui = Game::getGame()->getGui(); ASSERT(gui != 0L); GameSysMsgWindow* wndSysMsg = (GameSysMsgWindow*)gui->getSysMsgWindow(); ASSERT(wndSysMsg != 0L); ScreenEffect* screff = Game::getGame()->getSceneScreenEffect(); ASSERT(screff != 0L); switch(getStep()) { case STEP_WAIT_BEGIN: // 継続監視 ///STRACE("!!! WAIT...\n"); if(!getOwner()->checkBegunOtherMatter(this, true)) // 自身以外のイベントが起動していない { // メッセージを得る EventData* evdat = getOwner()->getEventData(); ASSERT(evdat != 0L); const MsgDataSet* msgdatset = evdat->getMsgDataSet(); ASSERT(msgdatset != 0L); // YES / NO メッセージウインドウを表示する wndSysMsg->setKind(MessageWindow::KIND_YESNO); wndSysMsg->showMessage(GameFixedStrTbl::getString(GameFixedStrTbl::SID_QUEST_CONFIRM_CONTRACT), MSGWND_CTRL_HINT); // 次のステップへ advanceStep(); } break; case STEP_WAIT_YESNO: { const GameSysMsgWindow::Result* res = wndSysMsg->getResult(); if(res->isClickYesButton()) { // ウインドウを閉じる wndSysMsg->showWindow(false); // スプライトを読み込む _sprite->create(FILEID_CONV_LANG(QUESTEVENT_SPRITE_QUESTACCEPT_EN_PNG), 0, true, 0x000000ff, true); // SE 再生 Game::getGame()->getSoundManager()->playUiSe(GameSoundDef::SE_QUEST_ADV, false); // 次のステップへ advanceStep(); } else if(res->isClickNoButton()) { // ウインドウを閉じる wndSysMsg->showWindow(false); // 終了 end(); // 親マターも終了してイベントを閉じる EventData* evdat = getOwner()->getEventData(); ASSERT(evdat != 0L); EvMatter* matter = evdat->getMatterFromEvid(getParentEvId()); if(matter != 0L) { matter->end(); } } } break; case STEP_WAIT_EFFECT: if(_sprite->isEnd()) { // フェードアウト ColorU8 colBlack(0, 0, 0, 255); screff->setColor1(&colBlack); screff->setMaxFrame(60); screff->start(ScreenEffect::MODE_FADE_OUT); // 次のステップへ advanceStep(); } _sprite->exec(ec); break; case STEP_WAIT_FOUT: if(!screff->isWorking()) { // クエスト受託 contractQuest(); // フェードインへ ColorU8 colBlack(0, 0, 0, 255); screff->setColor1(&colBlack); screff->setMaxFrame(30); screff->start(ScreenEffect::MODE_FADE_IN); // 次のステップへ advanceStep(); } break; case STEP_WAIT_FIN: if(!screff->isWorking()) { screff->end(0); end(); } break; } }