Bazaar developer reference

CvMinorCivAI::IsValidQuestForPlayer(PlayerTypes, MinorCivQuestTypes)

Defined in
CvMinorCivAI.cpp, line 4187
Class
CvMinorCivAI
Hook name
CivHooks::CvMinorCivAI_IsValidQuestForPlayer
Lua events
GameEvents.QuestIsAvailable

Hooks

static bool BeforeCvMinorCivAI_IsValidQuestForPlayer(CvMinorCivAI* self, PlayerTypes ePlayer, MinorCivQuestTypes eQuest, bool& result);static void AfterCvMinorCivAI_IsValidQuestForPlayer(CvMinorCivAI* self, PlayerTypes ePlayer, MinorCivQuestTypes eQuest, bool& result);static bool ReplaceCvMinorCivAI_IsValidQuestForPlayer(bool (*original)(CvMinorCivAI*, PlayerTypes, MinorCivQuestTypes), CvMinorCivAI* self, PlayerTypes ePlayer, MinorCivQuestTypes eQuest);CivRegisterBefore<CivHooks::CvMinorCivAI_IsValidQuestForPlayer>(host, &BeforeCvMinorCivAI_IsValidQuestForPlayer);CivRegisterAfter<CivHooks::CvMinorCivAI_IsValidQuestForPlayer>(host, &AfterCvMinorCivAI_IsValidQuestForPlayer);CivRegisterReplace<CivHooks::CvMinorCivAI_IsValidQuestForPlayer>(host, &ReplaceCvMinorCivAI_IsValidQuestForPlayer);

Code

4186/// Is eQuest valid for this minor to give to ePlayer?4187bool CvMinorCivAI::IsValidQuestForPlayer(PlayerTypes ePlayer, MinorCivQuestTypes eQuest)4188{4189	// The quest type must be enabled4190	if(!IsEnabledQuest(eQuest))4191		return false;41924193	// Somebody's dead, that's no good4194	if(!GET_PLAYER(ePlayer).isAlive() || !GetPlayer()->isAlive())4195		return false;41964197	// No quests are valid if we are at war4198	if(IsAtWarWithPlayersTeam(ePlayer))4199		return false;42004201	// No quests are valid if we don't know you yet4202	if(!IsHasMetPlayer(ePlayer))4203		return false;42044205	// This player cannot already have an active quest of the same type4206	if(IsActiveQuestForPlayer(ePlayer, eQuest))4207		return false;42084209	// Both players must have a capital4210	CvCity* pMinorsCapital = GetPlayer()->getCapitalCity();4211	CvCity* pMajorsCapital = GET_PLAYER(ePlayer).getCapitalCity();4212	if(pMinorsCapital == NULL || pMajorsCapital == NULL)4213		return false;42144215#if defined(MOD_EVENTS_QUESTS)4216	CvQuestInfo* pQuestInfo = GC.getQuestInfo(eQuest);4217	4218	if (MOD_EVENTS_QUESTS && pQuestInfo && !pQuestInfo->isInternal()) {4219		if (GAMEEVENTINVOKE_TESTANY(GAMEEVENT_QuestIsAvailable, ePlayer, m_pPlayer->GetID(), eQuest, true, -1, -1) == GAMEEVENTRETURN_TRUE) {4220			return true;4221		}4222		4223		return false;4224	} else {4225#endif4226	// BUILD A ROUTE4227	if(eQuest == MINOR_CIV_QUEST_ROUTE)4228	{4229		// This player must not have bullied us recently4230		if(IsRecentlyBulliedByMajor(ePlayer))4231			return false;42324233		// Must have been friends at some point4234		if(!IsEverFriends(ePlayer))4235			return false;42364237		// Cannot already have a route4238		if (GET_PLAYER(ePlayer).IsCapitalConnectedToPlayer(GetPlayer()->GetID()))4239			return false;42404241		// Can't have completed this Quest already4242		if(IsRouteConnectionEstablished(ePlayer))4243			return false;42444245		// Must have a city close to the minor in the same Area4246		const int iMaxRouteDistance = 8; //antonjs: todo: xml4247		CvPlot* pMinorsPlot = pMinorsCapital->plot();4248		if(pMinorsPlot == NULL)4249			return false;42504251		int iLoop;4252		CvCity* pLoopCity;4253		bool bInRange = false;4254		for(pLoopCity = GET_PLAYER(ePlayer).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(ePlayer).nextCity(&iLoop))4255		{4256			if(pMinorsPlot->getArea() != pLoopCity->getArea())4257				continue;4258			int iDistance = plotDistance(pMinorsPlot->getX(), pMinorsPlot->getY(), pLoopCity->getX(), pLoopCity->getY());4259			if(iDistance < iMaxRouteDistance)4260				bInRange = true;4261		}42624263		if(!bInRange)4264			return false;4265	}4266	// KILL A CAMP4267	else if(eQuest == MINOR_CIV_QUEST_KILL_CAMP)4268	{4269		// Any nearby camps?4270		if(GetBestNearbyCampToKill() == NULL)4271			return false;4272	}4273	// CONNECT A RESOURCE4274	else if(eQuest == MINOR_CIV_QUEST_CONNECT_RESOURCE)4275	{4276		// This player must not have bullied us recently4277		if(IsRecentlyBulliedByMajor(ePlayer))4278			return false;42794280		ResourceTypes eResource = GetNearbyResourceForQuest(ePlayer);42814282		if(eResource == NO_RESOURCE)4283			return false;4284	}4285	// CONSTRUCT A WONDER4286	else if(eQuest == MINOR_CIV_QUEST_CONSTRUCT_WONDER)4287	{4288		// This player must not have bullied us recently4289		if(IsRecentlyBulliedByMajor(ePlayer))4290			return false;42914292		BuildingTypes eWonder = GetBestWonderForQuest(ePlayer);42934294		if(eWonder == NO_BUILDING)4295			return false;4296	}4297	// GREAT PERSON4298	else if(eQuest == MINOR_CIV_QUEST_GREAT_PERSON)4299	{4300		// This player must not have bullied us recently4301		if(IsRecentlyBulliedByMajor(ePlayer))4302			return false;43034304		UnitTypes eUnit = GetBestGreatPersonForQuest(ePlayer);43054306		if(eUnit == NO_UNIT)4307			return false;4308	}4309	// KILL ANOTHER CITY STATE4310	else if(eQuest == MINOR_CIV_QUEST_KILL_CITY_STATE)4311	{4312		// Friendly City States don't give out this quest4313		if(GetPersonality() == MINOR_CIV_PERSONALITY_FRIENDLY)4314			return false;43154316		PlayerTypes eTargetCityState = GetBestCityStateTarget(ePlayer);43174318		if(eTargetCityState == NO_PLAYER)4319			return false;4320	}4321	// FIND ANOTHER PLAYER4322	else if(eQuest == MINOR_CIV_QUEST_FIND_PLAYER)4323	{4324		// This player must not have bullied us recently4325		if(IsRecentlyBulliedByMajor(ePlayer))4326			return false;43274328		PlayerTypes eTarget = GetBestPlayerToFind(ePlayer);43294330		if(eTarget == NO_PLAYER)4331			return false;4332	}4333	// FIND NATURAL WONDER4334	else if(eQuest == MINOR_CIV_QUEST_FIND_NATURAL_WONDER)4335	{4336		// This player must not have bullied us recently4337		if(IsRecentlyBulliedByMajor(ePlayer))4338			return false;43394340		if(!IsGoodTimeForNaturalWonderQuest(ePlayer))4341			return false;4342	}4343	// GOLD GIFT4344	else if(eQuest == MINOR_CIV_QUEST_GIVE_GOLD)4345	{4346		// We don't need help if we've never been bullied4347		if(!IsEverBulliedByAnyMajor())4348			return false;43494350		// This player must not have bullied us recently4351		if(IsRecentlyBulliedByMajor(ePlayer))4352			return false;43534354		// This player must not be the most recent bully4355		if(GetMostRecentBullyForQuest() == ePlayer)4356			return false;43574358		if(!IsGoodTimeForGiveGoldQuest())4359			return false;4360	}4361	// PLEDGE TO PROTECT4362	else if(eQuest == MINOR_CIV_QUEST_PLEDGE_TO_PROTECT)4363	{4364		// We don't need help if we've never been bullied4365		if(!IsEverBulliedByAnyMajor())4366			return false;43674368		// This player must not have bullied us recently4369		if(IsRecentlyBulliedByMajor(ePlayer))4370			return false;43714372		// This player must not be the most recent bully4373		if(GetMostRecentBullyForQuest() == ePlayer)4374			return false;43754376		// Only if we aren't already protected by this major, and the major is allowed to start4377		if(!CanMajorStartProtection(ePlayer))4378			return false;43794380		if(!IsGoodTimeForPledgeToProtectQuest())4381			return false;4382	}4383	// CONTEST CULTURE4384	else if(eQuest == MINOR_CIV_QUEST_CONTEST_CULTURE)4385	{4386	}4387	// CONTEST FAITH4388	else if(eQuest == MINOR_CIV_QUEST_CONTEST_FAITH)4389	{4390	}4391	// CONTEST TECHS4392	else if(eQuest == MINOR_CIV_QUEST_CONTEST_TECHS)4393	{4394	}4395	// Invest4396	else if(eQuest == MINOR_CIV_QUEST_INVEST)4397	{4398		// This player must not have bullied us recently4399		if(IsRecentlyBulliedByMajor(ePlayer))4400			return false;4401	}4402	// Bully target City-State4403	else if(eQuest == MINOR_CIV_QUEST_BULLY_CITY_STATE)4404	{4405		// This player must not have bullied us recently4406		if(IsRecentlyBulliedByMajor(ePlayer))4407			return false;44084409		PlayerTypes eTargetCityState = GetBestCityStateTarget(ePlayer);44104411		if(eTargetCityState == NO_PLAYER)4412			return false;4413	}4414	// Denounce target Major4415	else if(eQuest == MINOR_CIV_QUEST_DENOUNCE_MAJOR)4416	{4417		// We don't need help if we've never been bullied4418		if(!IsEverBulliedByAnyMajor())4419			return false;44204421		// This player must not have bullied us recently4422		if(IsRecentlyBulliedByMajor(ePlayer))4423			return false;44244425		// Is there a recent bully?4426		if(!IsGoodTimeForDenounceMajorQuest())4427			return false;44284429		// Don't ask in always war games4430		if(GC.getGame().isOption(GAMEOPTION_ALWAYS_WAR))4431			return false;4432		4433		PlayerTypes eMostRecentBully = GetMostRecentBullyForQuest();44344435		if(eMostRecentBully == NO_PLAYER)4436			return false;44374438		// This player must not be the most recent bully4439		if(eMostRecentBully == ePlayer)4440			return false;44414442		// This player must not be teammates with the most recent bully (cannot denounce)4443		if(GET_PLAYER(ePlayer).getTeam() == GET_PLAYER(eMostRecentBully).getTeam())4444			return false;44454446		// This player must have met the most recent bully4447		if(!GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasMet(GET_PLAYER(eMostRecentBully).getTeam()))4448			return false;44494450		// This player must not be at war with the most recent bully (cannot denounce)4451		if(GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isAtWar(GET_PLAYER(eMostRecentBully).getTeam()))4452			return false;44534454		// Humans are unable to denounce each other4455		if(GET_PLAYER(ePlayer).isHuman() && GET_PLAYER(eMostRecentBully).isHuman())4456			return false;44574458		// This player must not have already denounced the most recent bully4459		if(GET_PLAYER(ePlayer).GetDiplomacyAI()->IsDenouncedPlayer(GetMostRecentBullyForQuest()))4460			return false;4461	}4462	// Spread your religion to us4463	else if(eQuest == MINOR_CIV_QUEST_SPREAD_RELIGION)4464	{4465		// This player must not have bullied us recently4466		if(IsRecentlyBulliedByMajor(ePlayer))4467			return false;44684469		// Player must have founded a religion4470#if defined(MOD_RELIGION_LOCAL_RELIGIONS)4471		// but not a local one4472		if(!GC.getGame().GetGameReligions()->HasCreatedReligion(ePlayer, true))4473#else4474		if(!GC.getGame().GetGameReligions()->HasCreatedReligion(ePlayer))4475#endif4476			return false;44774478		// Minor must not already share player's religion4479		if(IsSameReligionAsMajor(ePlayer))4480			return false;4481	}4482	// Trade route4483	else if(eQuest == MINOR_CIV_QUEST_TRADE_ROUTE)4484	{4485		// This player must not have bullied us recently4486		if(IsRecentlyBulliedByMajor(ePlayer))4487			return false;44884489		// This player must not already be connected4490		if(GC.getGame().GetGameTrade()->IsPlayerConnectedToPlayer(ePlayer, GetPlayer()->GetID()))4491			return false;44924493		// This player must be able to build a trade route either by land or sea4494		if(!GC.getGame().GetGameTrade()->CanCreateTradeRoute(ePlayer,GetPlayer()->GetID(), DOMAIN_LAND) &&4495			!GC.getGame().GetGameTrade()->CanCreateTradeRoute(ePlayer,GetPlayer()->GetID(), DOMAIN_SEA))4496			return false;4497	}4498#if defined(MOD_EVENTS_QUESTS)4499	}4500#endif45014502	return true;4503}

Calls

Called by