//------------------------------------------------------------------------------ void CvDllNetMessageHandler::ResponseSellBuilding(PlayerTypes ePlayer, int iCityID, BuildingTypes eBuilding) { CvCity* pCity = GET_PLAYER(ePlayer).getCity(iCityID); if(pCity) { pCity->GetCityBuildings()->DoSellBuilding(eBuilding); #if defined(MOD_EVENTS_CITY) if (MOD_EVENTS_CITY) { GAMEEVENTINVOKE_HOOK(GAMEEVENT_CitySoldBuilding, ePlayer, iCityID, eBuilding); } else { #endif ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem(); if (pkScriptSystem) { CvLuaArgsHandle args; args->Push(ePlayer); args->Push(iCityID); args->Push(eBuilding); bool bResult; LuaSupport::CallHook(pkScriptSystem, "CitySoldBuilding", args.get(), bResult); } #if defined(MOD_EVENTS_CITY) } #endif } }
void HornOfValere::FindHorn(CvUnit* pUnit) { // TODO UI popup if (pUnit) { m_bFound = true; CvPlot* pkPlot = GetPlot(); if (pkPlot) { pkPlot->SetHasHornOfValere(false); } m_iOwnerPlayerID = pUnit->getOwner(); m_iOwnerUnitID = pUnit->GetID(); ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem(); if (pkScriptSystem) { CUSTOMLOG("Calling UnitDiscoveredHornOfValere with %i owner and %i unit ID.", pUnit->getOwner(), pUnit->GetID()); CvLuaArgsHandle args; args->Push(pUnit->getOwner()); args->Push(pUnit->GetID()); bool bResult; LuaSupport::CallHook(pkScriptSystem, "UnitDiscoveredHornOfValere", args.get(), bResult); } } }
//------------------------------------------------------------------------------ void CvDllNetMessageHandler::ResponseSellBuilding(PlayerTypes ePlayer, int iCityID, BuildingTypes eBuilding) { CvCity* pCity = GET_PLAYER(ePlayer).getCity(iCityID); if(pCity) { pCity->GetCityBuildings()->DoSellBuilding(eBuilding); ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem(); if (pkScriptSystem) { CvLuaArgsHandle args; args->Push(ePlayer); args->Push(iCityID); args->Push(eBuilding); bool bResult; LuaSupport::CallHook(pkScriptSystem, "CitySoldBuilding", args.get(), bResult); } } }
void CvPolicyAI::DoChooseIdeology(CvPlayer *pPlayer) { int iFreedomPriority = 0; int iAutocracyPriority = 0; int iOrderPriority = 0; int iFreedomMultiplier = 1; int iAutocracyMultiplier = 1; int iOrderMultiplier = 1; PolicyBranchTypes eFreedomBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_FREEDOM(); PolicyBranchTypes eAutocracyBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_AUTOCRACY(); PolicyBranchTypes eOrderBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_ORDER(); if (eFreedomBranch == NO_POLICY_BRANCH_TYPE || eAutocracyBranch == NO_POLICY_BRANCH_TYPE || eOrderBranch == NO_POLICY_BRANCH_TYPE) { return; } #if defined(MOD_DIPLOMACY_CIV4_FEATURES) if(MOD_DIPLOMACY_CIV4_FEATURES) { if(GET_TEAM(pPlayer->getTeam()).IsVassalOfSomeone()) { TeamTypes eMasterTeam = GET_TEAM(pPlayer->getTeam()).GetMaster(); if(eMasterTeam != NO_TEAM) { // Loop through all players to see if they're on our team for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++) { PlayerTypes eMaster = (PlayerTypes) iPlayerLoop; // Assumes one player per team for master if(GET_PLAYER(eMaster).getTeam() == GET_TEAM(eMasterTeam).GetID()) { if(GET_PLAYER(eMaster).GetPlayerPolicies()->GetLateGamePolicyTree() != NO_POLICY_BRANCH_TYPE) { pPlayer->GetPlayerPolicies()->SetPolicyBranchUnlocked(GET_PLAYER(eMaster).GetPlayerPolicies()->GetLateGamePolicyTree(), true, false); LogBranchChoice(GET_PLAYER(eMaster).GetPlayerPolicies()->GetLateGamePolicyTree()); return; } } } } } } #endif // First consideration is our victory type int iConquestPriority = max(0, pPlayer->GetGrandStrategyAI()->GetConquestPriority()); int iDiploPriority = max(0, pPlayer->GetGrandStrategyAI()->GetUnitedNationsPriority()); int iTechPriority = max(0, pPlayer->GetGrandStrategyAI()->GetSpaceshipPriority()); int iCulturePriority = max(0, pPlayer->GetGrandStrategyAI()->GetCulturePriority()); #if defined(MOD_EVENTS_IDEOLOGIES) if (MOD_EVENTS_IDEOLOGIES) { CvPlayerPolicies* pPolicies = pPlayer->GetPlayerPolicies(); // Just jump on the band-wagon and hard code for three ideologies!!! if (!pPolicies->CanAdoptIdeology(eFreedomBranch)) { iFreedomMultiplier = 0; } if (!pPolicies->CanAdoptIdeology(eAutocracyBranch)) { iAutocracyMultiplier = 0; } if (!pPolicies->CanAdoptIdeology(eOrderBranch)) { iOrderMultiplier = 0; } } #endif #if defined(MOD_EVENTS_IDEOLOGIES) if (iFreedomMultiplier != 0 && iAutocracyMultiplier != 0 && iOrderMultiplier != 0) { #endif // Rule out one ideology if we are clearly (at least 25% more priority) going for the victory this ideology doesn't support int iClearPrefPercent = GC.getIDEOLOGY_PERCENT_CLEAR_VICTORY_PREF(); if (iConquestPriority > (iDiploPriority * (100 + iClearPrefPercent) / 100) && iConquestPriority > (iTechPriority * (100 + iClearPrefPercent) / 100) && iConquestPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100)) { iFreedomMultiplier = 0; } else if (iDiploPriority > (iConquestPriority * (100 + iClearPrefPercent) / 100) && iDiploPriority > (iTechPriority * (100 + iClearPrefPercent) / 100) && iDiploPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100)) { iOrderMultiplier = 0; } else if (iTechPriority > (iConquestPriority * (100 + iClearPrefPercent) / 100) && iTechPriority > (iDiploPriority * (100 + iClearPrefPercent) / 100) && iTechPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100)) { iAutocracyMultiplier = 0; } #if defined(MOD_EVENTS_IDEOLOGIES) } #endif int iFreedomTotal = iDiploPriority + iTechPriority + iCulturePriority; int iAutocracyTotal = iDiploPriority + iConquestPriority + iCulturePriority; int iOrderTotal = iTechPriority + iConquestPriority + iCulturePriority; int iGrandTotal = iFreedomTotal + iAutocracyTotal + iOrderTotal; if (iGrandTotal > 0) { int iPriorityToDivide = GC.getIDEOLOGY_SCORE_GRAND_STRATS(); iFreedomPriority = (iFreedomTotal * iPriorityToDivide) / iGrandTotal; iAutocracyPriority = (iAutocracyTotal * iPriorityToDivide) / iGrandTotal; iOrderPriority = (iOrderTotal * iPriorityToDivide) / iGrandTotal; } CvString stage = "After Grand Strategies"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); // Next look at free policies we can get iFreedomPriority += PolicyHelpers::GetNumFreePolicies(eFreedomBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET(); iAutocracyPriority += PolicyHelpers::GetNumFreePolicies(eAutocracyBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET(); iOrderPriority += PolicyHelpers::GetNumFreePolicies(eOrderBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();; stage = "After Free Policies"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); // Finally see what our friends (and enemies) have already chosen PlayerTypes eLoopPlayer; for (int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++) { eLoopPlayer = (PlayerTypes) iPlayerLoop; if (eLoopPlayer != pPlayer->GetID() && pPlayer->GetDiplomacyAI()->IsPlayerValid(eLoopPlayer)) { CvPlayer &kOtherPlayer = GET_PLAYER(eLoopPlayer); PolicyBranchTypes eOtherPlayerIdeology; eOtherPlayerIdeology = kOtherPlayer.GetPlayerPolicies()->GetLateGamePolicyTree(); switch(pPlayer->GetDiplomacyAI()->GetMajorCivApproach(eLoopPlayer, /*bHideTrueFeelings*/ true)) { case MAJOR_CIV_APPROACH_HOSTILE: if (eOtherPlayerIdeology == eFreedomBranch) { iAutocracyPriority += GC.getIDEOLOGY_SCORE_HOSTILE(); iOrderPriority += GC.getIDEOLOGY_SCORE_HOSTILE(); } else if (eOtherPlayerIdeology == eAutocracyBranch) { iFreedomPriority += GC.getIDEOLOGY_SCORE_HOSTILE(); iOrderPriority += GC.getIDEOLOGY_SCORE_HOSTILE(); } else if (eOtherPlayerIdeology == eOrderBranch) { iAutocracyPriority += GC.getIDEOLOGY_SCORE_HOSTILE();; iFreedomPriority += GC.getIDEOLOGY_SCORE_HOSTILE(); } break; case MAJOR_CIV_APPROACH_GUARDED: if (eOtherPlayerIdeology == eFreedomBranch) { iAutocracyPriority += GC.getIDEOLOGY_SCORE_GUARDED(); iOrderPriority += GC.getIDEOLOGY_SCORE_GUARDED(); } else if (eOtherPlayerIdeology == eAutocracyBranch) { iFreedomPriority += GC.getIDEOLOGY_SCORE_GUARDED(); iOrderPriority += GC.getIDEOLOGY_SCORE_GUARDED(); } else if (eOtherPlayerIdeology == eOrderBranch) { iAutocracyPriority += GC.getIDEOLOGY_SCORE_GUARDED(); iFreedomPriority += GC.getIDEOLOGY_SCORE_GUARDED(); } break; case MAJOR_CIV_APPROACH_AFRAID: if (eOtherPlayerIdeology == eFreedomBranch) { iFreedomPriority += GC.getIDEOLOGY_SCORE_AFRAID(); } else if (eOtherPlayerIdeology == eAutocracyBranch) { iAutocracyPriority += GC.getIDEOLOGY_SCORE_AFRAID(); } else if (eOtherPlayerIdeology == eOrderBranch) { iOrderPriority += GC.getIDEOLOGY_SCORE_AFRAID(); } break; case MAJOR_CIV_APPROACH_FRIENDLY: if (eOtherPlayerIdeology == eFreedomBranch) { iFreedomPriority += GC.getIDEOLOGY_SCORE_FRIENDLY(); } else if (eOtherPlayerIdeology == eAutocracyBranch) { iAutocracyPriority += GC.getIDEOLOGY_SCORE_FRIENDLY(); } else if (eOtherPlayerIdeology == eOrderBranch) { iOrderPriority += GC.getIDEOLOGY_SCORE_FRIENDLY(); } break; case MAJOR_CIV_APPROACH_NEUTRAL: // No changes break; } } } stage = "After Relations"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); // Look at Happiness impacts int iHappinessModifier = GC.getIDEOLOGY_SCORE_HAPPINESS(); // -- Happiness we could add through tenets int iHappinessDelta; #if defined(MOD_BALANCE_CORE) //This was a dumb reason to weigh an ideology branch. #else int iHappinessPoliciesInBranch; iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eFreedomBranch); iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eFreedomBranch); if (iHappinessPoliciesInBranch > 0) { iFreedomPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch; } iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eAutocracyBranch); iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eAutocracyBranch); if (iHappinessPoliciesInBranch > 0) { iAutocracyPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch; } iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eOrderBranch); iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eOrderBranch); if (iHappinessPoliciesInBranch > 0) { iOrderPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch; } stage = "After Tenet Happiness Boosts"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); #endif #if defined(MOD_BALANCE_CORE) bool bFirstIdeology = true; for (int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++) { eLoopPlayer = (PlayerTypes) iPlayerLoop; if (eLoopPlayer != pPlayer->GetID() && pPlayer->GetDiplomacyAI()->IsPlayerValid(eLoopPlayer)) { CvPlayer &kOtherPlayer = GET_PLAYER(eLoopPlayer); PolicyBranchTypes eOtherPlayerIdeology; eOtherPlayerIdeology = kOtherPlayer.GetPlayerPolicies()->GetLateGamePolicyTree(); if(eOtherPlayerIdeology != NO_POLICY_BRANCH_TYPE) { bFirstIdeology = false; break; } } } if(!bFirstIdeology) { #endif // -- Happiness we'd lose through Public Opinion iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eFreedomBranch)); iFreedomPriority += iHappinessDelta * iHappinessModifier; iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eAutocracyBranch)); iAutocracyPriority += iHappinessDelta * iHappinessModifier; iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eOrderBranch)); iOrderPriority += iHappinessDelta * iHappinessModifier; stage = "After Public Opinion Happiness"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); #if defined(MOD_BALANCE_CORE) } #endif #if defined(MOD_BALANCE_CORE) #ifdef AUI_BINOM_RNG // bigger random add-on iFreedomPriority += GC.getGame().getJonRandNumBinom(60, "Freedom random priority bump"); iAutocracyPriority += GC.getGame().getJonRandNumBinom(60, "Autocracy random priority bump"); iOrderPriority += GC.getGame().getJonRandNumBinom(60, "Order random priority bump"); #else // bigger random add-on iFreedomPriority += GC.getGame().getJonRandNum(75, "Freedom random priority bump"); iAutocracyPriority += GC.getGame().getJonRandNum(75, "Autocracy random priority bump"); iOrderPriority += GC.getGame().getJonRandNum(75, "Order random priority bump"); #endif #else // Small random add-on iFreedomPriority += GC.getGame().getJonRandNum(10, "Freedom random priority bump"); iAutocracyPriority += GC.getGame().getJonRandNum(10, "Autocracy random priority bump"); iOrderPriority += GC.getGame().getJonRandNum(10, "Order random priority bump"); #endif stage = "After Random (1 to 10)"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); // Rule out any branches that are totally out of consideration iFreedomPriority = iFreedomPriority * iFreedomMultiplier; iAutocracyPriority = iAutocracyPriority * iAutocracyMultiplier; iOrderPriority = iOrderPriority * iOrderMultiplier; stage = "Final (after Clear Victory Preference)"; LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority); // Pick the ideology PolicyBranchTypes eChosenBranch; if (iFreedomPriority >= iAutocracyPriority && iFreedomPriority >= iOrderPriority) { eChosenBranch = eFreedomBranch; } else if (iAutocracyPriority >= iFreedomPriority && iAutocracyPriority >= iOrderPriority) { eChosenBranch = eAutocracyBranch; } else { eChosenBranch = eOrderBranch; } pPlayer->GetPlayerPolicies()->SetPolicyBranchUnlocked(eChosenBranch, true, false); LogBranchChoice(eChosenBranch); #if defined(MOD_BUGFIX_MISSING_POLICY_EVENTS) if (MOD_BUGFIX_MISSING_POLICY_EVENTS) { ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem(); if(pkScriptSystem) { CvLuaArgsHandle args; args->Push(pPlayer->GetID()); args->Push(eChosenBranch); bool bResult = false; LuaSupport::CallHook(pkScriptSystem, "PlayerAdoptPolicyBranch", args.get(), bResult); } } #endif }
// --------------------------------------------------------------------------- void CvPlayerAI::AI_unitUpdate() { GC.getPathFinder().ForceReset(); GC.getIgnoreUnitsPathFinder().ForceReset(); GC.getRouteFinder().ForceReset(); GC.GetWaterRouteFinder().ForceReset(); // Set individual pathers as MP cache safe. A global for all pathers might be simpler, // but this will allow selective control in case one type of pather is causing out-of-syncs. bool bCommonPathFinderMPCaching = GC.getPathFinder().SetMPCacheSafe(true); bool bIgnoreUnitsPathFinderMPCaching = GC.getIgnoreUnitsPathFinder().SetMPCacheSafe(true); bool bTacticalPathFinderMPCaching = GC.GetTacticalAnalysisMapFinder().SetMPCacheSafe(true); bool bInfluencePathFinderMPCaching = GC.getInfluenceFinder().SetMPCacheSafe(true); bool bRoutePathFinderMPCaching = GC.getRouteFinder().SetMPCacheSafe(true); bool bWaterRoutePathFinderMPCaching = GC.GetWaterRouteFinder().SetMPCacheSafe(true); ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem(); if(pkScriptSystem) { CvLuaArgsHandle args; args->Push(GetID()); bool bResult; LuaSupport::CallHook(pkScriptSystem, "PlayerPreAIUnitUpdate", args.get(), bResult); } //GC.getGame().GetTacticalAnalysisMap()->RefreshDataForNextPlayer(this); // this was a !hasBusyUnit around the entire rest of the function, so I tried to make it a bit flatter. if(hasBusyUnitOrCity()) { return; } if(isHuman()) { CvUnit::dispatchingNetMessage(true); // The homeland AI goes first. GetHomelandAI()->FindAutomatedUnits(); GetHomelandAI()->Update(); CvUnit::dispatchingNetMessage(false); } else { // Update tactical AI GetTacticalAI()->CommandeerUnits(); // Now let the tactical AI run. Putting it after the operations update allows units who have // just been handed off to the tactical AI to get a move in the same turn they switch between // AI subsystems GetTacticalAI()->Update(); // Skip homeland AI processing if a barbarian if(m_eID != BARBARIAN_PLAYER) { // Now its the homeland AI's turn. GetHomelandAI()->RecruitUnits(); GetHomelandAI()->Update(); } } GC.getPathFinder().SetMPCacheSafe(bCommonPathFinderMPCaching); GC.getIgnoreUnitsPathFinder().SetMPCacheSafe(bIgnoreUnitsPathFinderMPCaching); GC.GetTacticalAnalysisMapFinder().SetMPCacheSafe(bTacticalPathFinderMPCaching); GC.getInfluenceFinder().SetMPCacheSafe(bInfluencePathFinderMPCaching); GC.getRouteFinder().SetMPCacheSafe(bRoutePathFinderMPCaching); GC.GetWaterRouteFinder().SetMPCacheSafe(bWaterRoutePathFinderMPCaching); }