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}