/*---------------------------------------------------------------------*//** フレーム制御 **//*---------------------------------------------------------------------*/ void StMod10401::exec(ExecRes* res, const ExecCtx* ec) { if(Game::getGame()->getMoveMap()->getCurMapId() == MapIdDef::MAPID_EP01_FOREST4_EXIT_SQUARE) // シネンの森出口広場マップ { SaveData* svd = Game::getGame()->getSaveSys()->getSaveData(); ASSERT(svd != 0L); if( svd->getSaveF(SaveIdDef::SFID_ST10401_DONE_YASAN_THANK) && // ヤサンイベントが終わっている !svd->getSaveF(SaveIdDef::SFID_ST10204_MEET_KOTSUME) ) // コツメが合流していない { UnitManager* unitmng = Game::getGame()->getUnitManager(); ASSERT(unitmng != 0L); if(!unitmng->checkEnableEnemy()) // 有効な敵がいない場合のみ { // キャラクタの位置によってイベント起動 const PcUnit* unitLeader = Game::getGame()->getMyParty()->getLeaderPcUnit(); if(unitLeader != 0L) { const Vector3F* posLeader = unitLeader->getPosition(); if(posLeader->x() <= 2700.0f) // 大猿に近づいた { // 次のイベント起動確認 do { // 通常歩行時以外(ソウマ詠唱中や対決中など)は失敗 GameMode::ModeKind kindEnd = Game::getGame()->getGameMode()->getChildEndModeKind(); if(kindEnd != GameMode::MODE_GAME_INGAME_WALKING_NORMAL) { break; } Party* party = Game::getGame()->getMyParty(); // アサダウン中は失敗 if(party->getPcUnit(MyParty::PC_MY)->getCharStat()->getStat() != CharStat::STAT_ALIVE) { break; } // コルポダウン中は失敗 if(party->getPcUnit(MyParty::PC_PTN)->getCharStat()->getStat() != CharStat::STAT_ALIVE) { break; } // イベント起動 EventSys* evsys = Game::getGame()->getEventSys(); ASSERT(evsys != 0L); EvCause evcause(EventCause::CID_NULL); evsys->begin(EVID_KOTSUME_MEET_AGAIN, 0, &evcause); } while(false); } } } } } StMod10000::exec(res, ec); }
SRCR_BEGIN_NS //////////////////////////////////////////////////////////////////////////// // クラス //========================================================================== // Char1401_Ungetsuiwa_EnemySpirit メソッド // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // 外部サービス /*---------------------------------------------------------------------*//** 次の対決時行動の取得 **//*---------------------------------------------------------------------*/ s16 Char1401_Ungetsuiwa_EnemySpirit::decideNextConfrontAction() { // 倦怠時は攻撃のみ if(TFW_IS_FLAG(getCharStat()->getSpStatFlags(), CharStat::SPSTAT_HEAVY)) { return EnemyMode::ACT_ATTACK; } else { // 相手が一人のときは攻撃のみ Party* party = Game::getGame()->getMyParty(); if(party != 0L) { int cnt = 0; for(int i = 0; i < party->getPcNum(); i++) { if((party->getPcUnit(i) != 0L) && party->getPcUnit(i)->isEnable()) { cnt++; } } if(cnt <= 1) { return EnemyMode::ACT_ATTACK; } } // 通常判定 return SkilledEnemySpiritBase::decideNextConfrontAction(); } }
/*---------------------------------------------------------------------*//** 呼び出し通知 **//*---------------------------------------------------------------------*/ bool MenuFuncTable_Focus::onCall(smenu::Menu* menu, const ExecCtx* ec, smenu::MenuTreeNode* mtnodeCall, smenu::MenuTreeNode* mtnodeParent, void* objCreateParam, void* objShowParam) { const GameExecCtx* gec = (const GameExecCtx*)ec; const VcString* cmd = mtnodeCall->getName(); GameMode* gmode = Game::getGame()->getGameMode(); GameMenuShowParam* showprm = (GameMenuShowParam*)objShowParam; if( cmd->equals("Focus") ) { if(showprm->_unitRef != 0L) { // フォーカスをセットする GameGui* gui = Game::getGame()->getGui(); ASSERT(gui != 0L); FocusCursor* fccsr = gui->getFocusCursor(); fccsr->setFocus(0, showprm->_unitRef); } } else if( cmd->equals("FocusWeapon") ) { if(showprm->_unitRef != 0L) { ASSERT(TFW_IS_FLAG(showprm->_unitRef->getUnitFlags(), Unit::UNITFLAG_PC)); // 現状では PcUnit のはず if(TFW_IS_FLAG(showprm->_unitRef->getUnitFlags(), Unit::UNITFLAG_PC)) { PcUnit* unitPc = (PcUnit*)showprm->_unitRef; s32 ieqp = EquipPlace::EQP_RHAND; // 現状では右手装備のみ対応 const ItemEquip* itmeq = unitPc->getItemEquip(); if(itmeq != 0L) { const Item* item = itmeq->getEquipStat()->getEquipItem(ieqp); if(item != 0L) { // 装備品は存在する Unit* unitWep = itmeq->getEquipUnit(ieqp); // フォーカスをセットする GameGui* gui = Game::getGame()->getGui(); ASSERT(gui != 0L); FocusCursor* fccsr = gui->getFocusCursor(); fccsr->setFocus(0, unitWep); } } } } } else if( cmd->equals("Fight") ) { if(showprm->_unitRef != 0L) { Confront* cf = Game::getGame()->getConfront(); ASSERT(cf != 0L); bool isFound = false; const UnitArray* uaTrg = cf->getTargets(); for(int i = 0; i < uaTrg->getCount(); i++) { if(uaTrg->getUnit(i) == showprm->_unitRef) { isFound = true; } } // ゲーム本体に対決通知を送り、モードを変更する if(!isFound) { Party* party = Game::getGame()->getMyParty(); ASSERT(party != 0L); Game::getGame()->getConfront()->start(showprm->_unitRef, 0, party->getLeaderPcUnit()); } } } else if( cmd->equals("Talk") || cmd->equals("Check") ) { Unit* unitRef = showprm->_unitRef; if(unitRef != 0L) { if(TFW_IS_FLAG(unitRef->getUnitFlags(), Unit::UNITFLAG_NPC)) { NpcCharUnit* npc = (NpcCharUnit*)unitRef; // こちらに注目させる if(cmd->equals("Talk") && (npc->getSpirit() != 0)) { npc->spirit()->setFocusUnit(Game::getGame()->getMyParty()->leaderPcUnit(), false); } // 話す、もしくは拾う PlacementObj* pobj = npc->getPlacementObj(); const EventIdInfoArray::EventIdInfo* cii = pobj->getCallEvi()->getInfo(pobj->getActiveCallEviIndex()); if(cii != 0L) { EventSys* evsys = Game::getGame()->getEventSys(); EvCause evcause(EventCause::CID_FOCUSMENU); evcause.setParameter(npc); Game::getGame()->getMyParty()->animUnitOnEvent(npc, cii->getEvid()); // ユニットを注視 evsys->begin(cii->getEvid(), cii->getEventParam(), &evcause); pobj->nextCallEvi(false); // イベントを次へ } } } } else if( cmd->equals("Leader") ) { // リーダーを設定する Party* party = Game::getGame()->getMyParty(); ASSERT(party != 0L); s32 ipc = party->findPcUnit(showprm->_unitRef); if(ipc >= 0) { party->setLeader(ipc); } } else if( cmd->equals("Souma") ) { // ソウマ入力へモード変更 GameModeParam* gmparam = (GameModeParam*)gmode->getParameter(); gmparam->setFocusMenuUnit(showprm->_unitRef); if(Game::getGame()->isConfront()) { gec->getGameMode()->changeEndMode(GameMode::MODE_GAME_INGAME_CONFRONT_MAGICTYPING); } else { gec->getGameMode()->changeEndMode(GameMode::MODE_GAME_INGAME_WALKING_MAGICTYPING); } } else if( cmd->equals("Meditation") ) { Spirit* sprt = showprm->_unitRef->spirit(); sprt->startBehavior(Spirit::BEHV_MEDITATION, 0L); } else if( cmd->equals("GuardCharge") ) { Spirit* sprt = showprm->_unitRef->spirit(); sprt->startBehavior(Spirit::BEHV_GUARD_CHARGE, 0L); } else if( cmd->equals("Attract") ) { Spirit* sprt = showprm->_unitRef->spirit(); sprt->startBehavior(Spirit::BEHV_ATTRACT, 0L); } else if( cmd->equals("CureParty") ) { Spirit* sprt = showprm->_unitRef->spirit(); sprt->startBehavior(Spirit::BEHV_CURE, 0L); } else if( cmd->equals("Item") ) { // アイテム使用モードへ変更 GameModeParam* gmparam = (GameModeParam*)gmode->getParameter(); gmparam->setFocusMenuUnit(showprm->_unitRef); if(Game::getGame()->isConfront()) { gec->getGameMode()->changeEndMode(GameMode::MODE_GAME_INGAME_CONFRONT_ITEMUSING); } else { gec->getGameMode()->changeEndMode(GameMode::MODE_GAME_INGAME_WALKING_ITEMUSING); } } else if( cmd->equals("StopBehavior") ) { Spirit* sprt = showprm->_unitRef->spirit(); sprt->breakBehavior(Spirit::BEHV_NULL, true, false); // BEHV_NULL は全てを対象とした汎用中断 } else if( cmd->equals("Pick") ) { // アイテムを拾う Unit* unitRef = showprm->_unitRef; if(unitRef != 0L) { if(unitRef->getUnitType() == UNITTYPE_PUT_ITEM) { Party* party = Game::getGame()->getMyParty(); ASSERT(party != 0L); const Unit* unitActor = party->getPcUnit(0); ItemManager* itmmng = party->getItemManager(); ASSERT(itmmng != 0L); PutItemUnit* ditmu = (PutItemUnit*)unitRef; if(itmmng->pickupItem(Game::getGame()->getMap(), ditmu->getPlacementObj(), ditmu->getEleneStat())) { // 成功 ditmu->setPlacementObj(0L); ditmu->setEnable(false); // メッセージを表示する const ItemDef* itmdf = ditmu->getItemDef(); ASSERT(itmdf != 0L); VcString msg(VcString::format(GameFixedStrTbl::getString(GameFixedStrTbl::SID_GET_SOMETHING)->getRaw(), itmdf->getName(Env_getLangId())->getRaw(), "\n")); Game::getGame()->getConductor()->on(&msg, unitActor, 0); // 通知発行 Game::getGame()->getGameNotifier()->notifyPickupItem(unitActor, ditmu); // クエストの可変達成状態の更新 QuestManager* qsmng = Game::getGame()->getQuestManager(); qsmng->updateVariableAchievementState(); } else { // 失敗 GameSysMsgWindow* wndSysMsg = (GameSysMsgWindow*)Game::getGame()->getGui()->getSysMsgWindow(); ASSERT(wndSysMsg != 0L); VcString msg(VcString::format(GameFixedStrTbl::getString(GameFixedStrTbl::SID_ERROR_ITEM_FULL)->getRaw(), "")); wndSysMsg->showStdMsg(&msg); // メッセージ表示 } } } } return true; }