CvDiplomacyAI::DoMakeWarOnPlayer(PlayerTypes)
- Defined in
- CvDiplomacyAI.cpp, line 5530
- Class
- CvDiplomacyAI
- Hook name
CivHooks::CvDiplomacyAI_DoMakeWarOnPlayer
Hooks
static bool BeforeCvDiplomacyAI_DoMakeWarOnPlayer(CvDiplomacyAI* self, PlayerTypes eTargetPlayer);static void AfterCvDiplomacyAI_DoMakeWarOnPlayer(CvDiplomacyAI* self, PlayerTypes eTargetPlayer);static void ReplaceCvDiplomacyAI_DoMakeWarOnPlayer(void (*original)(CvDiplomacyAI*, PlayerTypes), CvDiplomacyAI* self, PlayerTypes eTargetPlayer);CivRegisterBefore<CivHooks::CvDiplomacyAI_DoMakeWarOnPlayer>(host, &BeforeCvDiplomacyAI_DoMakeWarOnPlayer);CivRegisterAfter<CivHooks::CvDiplomacyAI_DoMakeWarOnPlayer>(host, &AfterCvDiplomacyAI_DoMakeWarOnPlayer);CivRegisterReplace<CivHooks::CvDiplomacyAI_DoMakeWarOnPlayer>(host, &ReplaceCvDiplomacyAI_DoMakeWarOnPlayer);
Code
5529/// Handles declarations of War for this AI5530void CvDiplomacyAI::DoMakeWarOnPlayer(PlayerTypes eTargetPlayer)5531{5532 CvAIOperation* pOperation;5533 bool bWantToAttack = false;5534 bool bDeclareWar = false;55355536 if(!IsPlayerValid(eTargetPlayer))5537 return;55385539 if(GetWarGoal(eTargetPlayer) == WAR_GOAL_DEMAND)5540 return;55415542 if(IsAtWar(eTargetPlayer))5543 return;55445545 bool bAtWarWithAtLeastOneMajor = MilitaryAIHelpers::IsTestStrategy_AtWar(m_pPlayer);55465547 // Minor Civ5548 if(GET_PLAYER(eTargetPlayer).isMinorCiv())5549 {5550 bWantToAttack = !bAtWarWithAtLeastOneMajor && (GetMinorCivApproach(eTargetPlayer) == MINOR_CIV_APPROACH_CONQUEST);5551 pOperation = GetPlayer()->GetMilitaryAI()->GetCityStateAttackOperation(eTargetPlayer);5552 }5553 // Major Civ5554 else5555 {5556 MajorCivApproachTypes eApproach = GetMajorCivApproach(eTargetPlayer, /*bHideTrueFeelings*/ false);5557 bWantToAttack = (eApproach == MAJOR_CIV_APPROACH_WAR || (eApproach == MAJOR_CIV_APPROACH_DECEPTIVE && IsGoingForWorldConquest()));5558 bWantToAttack = bWantToAttack && !bAtWarWithAtLeastOneMajor; // let's not get into another war right now5559 pOperation = GetPlayer()->GetMilitaryAI()->GetSneakAttackOperation(eTargetPlayer);5560 }55615562 // Not yet readying an attack5563 if(pOperation == NULL && !IsMusteringForAttack(eTargetPlayer)) // If we're "mustering" it means we had a Sneak Attack Operation that finished5564 {5565 if(!GET_TEAM(GetTeam()).isAtWar(GET_PLAYER(eTargetPlayer).getTeam()))5566 {5567#if defined(MOD_EVENTS_WAR_AND_PEACE)5568 if(GET_TEAM(GetTeam()).canDeclareWar(GET_PLAYER(eTargetPlayer).getTeam(), GetPlayer()->GetID()))5569#else5570 if(GET_TEAM(GetTeam()).canDeclareWar(GET_PLAYER(eTargetPlayer).getTeam()))5571#endif5572 {5573 // Want to declare war on someone5574 if(bWantToAttack)5575 {5576 SetWarGoal(eTargetPlayer, WAR_GOAL_PREPARE);55775578 // Attack on minor5579 if(GET_PLAYER(eTargetPlayer).isMinorCiv())5580 GetPlayer()->GetMilitaryAI()->RequestCityStateAttack(eTargetPlayer);5581 // Attack on major5582 else5583 GetPlayer()->GetMilitaryAI()->RequestSneakAttack(eTargetPlayer);5584 }5585 }5586 }5587 }5588 // We already have an attack on the way5589 else5590 {5591 // Our Approach with this player calls for war5592 if(bWantToAttack)5593 {5594 if(!IsAtWar(eTargetPlayer))5595 {5596#if defined(MOD_EVENTS_WAR_AND_PEACE)5597 if(GET_TEAM(GetTeam()).canDeclareWar(GET_PLAYER(eTargetPlayer).getTeam(), GetPlayer()->GetID()))5598#else5599 if(GET_TEAM(GetTeam()).canDeclareWar(GET_PLAYER(eTargetPlayer).getTeam()))5600#endif5601 {5602 // If we're at least 85% of the way to our objective, let loose the dogs of war!5603 if(IsMusteringForAttack(eTargetPlayer) || (pOperation != NULL && pOperation->PercentFromMusterPointToTarget() >= 85)) // If we're "mustering" it means we have a Sneak Attack Operation that's in position to attack5604 {5605 bDeclareWar = true;5606 SetMusteringForAttack(eTargetPlayer, false);5607 }5608 }5609 }5610 }56115612 // We were planning an attack, but changed our minds so abort5613 else5614 {5615 if(pOperation != NULL)5616 {5617 pOperation->Kill(AI_ABORT_DIPLO_OPINION_CHANGE);5618 SetWarGoal(eTargetPlayer, NO_WAR_GOAL_TYPE);5619 SetMusteringForAttack(eTargetPlayer, false);5620 }5621 }56225623 // If our Sneak Attack is read then actually initiate the DoW5624 if(bDeclareWar)5625 {5626 DeclareWar(eTargetPlayer);5627 }5628 }5629}
Calls
- CvAIOperation::Kill(AIOperationAbortReason)
- CvAIOperation::PercentFromMusterPointToTarget()
- CvDiplomacyAI::DeclareWar(PlayerTypes)
- CvDiplomacyAI::GetMajorCivApproach(PlayerTypes, bool) const
- CvDiplomacyAI::GetMinorCivApproach(PlayerTypes) const
- CvDiplomacyAI::GetPlayer()
- CvDiplomacyAI::GetTeam()
- CvDiplomacyAI::GetWarGoal(PlayerTypes) const
- CvDiplomacyAI::IsAtWar(PlayerTypes)
- CvDiplomacyAI::IsGoingForWorldConquest()
- CvDiplomacyAI::IsMusteringForAttack(PlayerTypes) const
- CvDiplomacyAI::IsPlayerValid(PlayerTypes, bool)
- CvDiplomacyAI::SetMusteringForAttack(PlayerTypes, bool)
- CvDiplomacyAI::SetWarGoal(PlayerTypes, WarGoalTypes)
- CvMilitaryAI::GetCityStateAttackOperation(PlayerTypes)
- CvMilitaryAI::GetSneakAttackOperation(PlayerTypes)
- CvMilitaryAI::RequestCityStateAttack(PlayerTypes)
- CvMilitaryAI::RequestSneakAttack(PlayerTypes)
- CvPlayer::GetID() const
- CvPlayer::GetMilitaryAI() const
- CvPlayer::getTeam() const
- CvPlayer::isMinorCiv() const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvTeam::canDeclareWar(TeamTypes, PlayerTypes) const
- CvTeam::getTeam(TeamTypes)
- CvTeam::isAtWar(TeamTypes) const
- MilitaryAIHelpers::IsTestStrategy_AtWar(CvPlayer *)