예제 #1
0
/*---------------------------------------------------------------------*//**
	フレーム制御
**//*---------------------------------------------------------------------*/
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;
}