Hooks
static bool BeforeCvLeague_DoProjectReward(CvLeague* self, PlayerTypes ePlayer, LeagueProjectTypes eLeagueProject, CvLeague::ContributionTier eTier);static void AfterCvLeague_DoProjectReward(CvLeague* self, PlayerTypes ePlayer, LeagueProjectTypes eLeagueProject, CvLeague::ContributionTier eTier);static void ReplaceCvLeague_DoProjectReward(void (*original)(CvLeague*, PlayerTypes, LeagueProjectTypes, CvLeague::ContributionTier), CvLeague* self, PlayerTypes ePlayer, LeagueProjectTypes eLeagueProject, CvLeague::ContributionTier eTier);CivRegisterBefore<CivHooks::CvLeague_DoProjectReward>(host, &BeforeCvLeague_DoProjectReward);CivRegisterAfter<CivHooks::CvLeague_DoProjectReward>(host, &AfterCvLeague_DoProjectReward);CivRegisterReplace<CivHooks::CvLeague_DoProjectReward>(host, &ReplaceCvLeague_DoProjectReward);
Code
6210void CvLeague::DoProjectReward(PlayerTypes ePlayer, LeagueProjectTypes eLeagueProject, ContributionTier eTier)6211{6212 CvLeagueProjectEntry* pProjectInfo = GC.getLeagueProjectInfo(eLeagueProject);6213 CvAssert(pProjectInfo);6214 if (!pProjectInfo) return;6215 6216 // Which rewards do we get?6217 //antonjs: A switch statement in its natural habitat without break statements...a rare sight indeed6218 FStaticVector<LeagueProjectRewardTypes, NUM_CONTRIBUTION_TIERS, true, c_eCiv5GameplayDLL> veRewards;6219 switch (eTier)6220 {6221 case CONTRIBUTION_TIER_3:6222 {6223 veRewards.push_back(pProjectInfo->GetRewardTier3());6224 }6225 case CONTRIBUTION_TIER_2:6226 {6227 veRewards.push_back(pProjectInfo->GetRewardTier2());6228 }6229 case CONTRIBUTION_TIER_1:6230 {6231 veRewards.push_back(pProjectInfo->GetRewardTier1());6232 }6233 default:6234 {6235 break;6236 }6237 }62386239 for (uint i = 0; i < veRewards.size(); i++)6240 {6241 CvLeagueProjectRewardEntry* pRewardInfo = GC.getLeagueProjectRewardInfo(veRewards[i]);6242 CvAssert(pRewardInfo);6243 if (!pRewardInfo) continue;62446245 // Free Building in Capital6246 if (pRewardInfo->GetBuilding() != NO_BUILDING)6247 {6248 CvCity* pCapital = GET_PLAYER(ePlayer).getCapitalCity();6249 CvAssertMsg(pCapital, "Player does not have a capital city. Please send Anton your save file and version.");6250 if (pCapital)6251 {6252 CvBuildingEntry* pBuildingInfo = GC.getBuildingInfo(pRewardInfo->GetBuilding());6253 if (pBuildingInfo)6254 {6255 pCapital->CreateBuilding(pRewardInfo->GetBuilding());6256 pCapital->CleanUpQueue(); // cleans out items from the queue that may be invalidated by the recent construction6257 }6258 }6259 }62606261 // Happiness6262 if (pRewardInfo->GetHappiness() != 0)6263 {6264 GET_PLAYER(ePlayer).ChangeHappinessFromLeagues(pRewardInfo->GetHappiness());6265 GET_PLAYER(ePlayer).DoUpdateHappiness();6266 }62676268 // Free Social Policy6269 if (pRewardInfo->GetFreeSocialPolicies() > 0)6270 {6271 GET_PLAYER(ePlayer).ChangeNumFreePolicies(pRewardInfo->GetFreeSocialPolicies());6272 }62736274 // Temporary Culture Modifier6275 if (pRewardInfo->GetCultureBonusTurns() > 0)6276 {6277 GET_PLAYER(ePlayer).ChangeCultureBonusTurns(pRewardInfo->GetCultureBonusTurns());6278 }62796280 // Temporary Tourism Modifier6281 if (pRewardInfo->GetTourismBonusTurns() > 0)6282 {6283 GET_PLAYER(ePlayer).ChangeTourismBonusTurns(pRewardInfo->GetTourismBonusTurns());6284 }62856286 // Golden Age Points6287 if (pRewardInfo->GetGoldenAgePoints() > 0)6288 {6289 GET_PLAYER(ePlayer).ChangeGoldenAgeProgressMeter(pRewardInfo->GetGoldenAgePoints());6290 }62916292 // City-State Influence Boost6293 //antonjs: todo: ordering, to prevent ally / no longer ally notif spam6294 if (pRewardInfo->GetCityStateInfluenceBoost() > 0)6295 {6296 for (int iMinorCivLoop = MAX_MAJOR_CIVS; iMinorCivLoop < MAX_CIV_PLAYERS; iMinorCivLoop++)6297 {6298 PlayerTypes eMinorCivLoop = (PlayerTypes) iMinorCivLoop;6299 if (GET_PLAYER(eMinorCivLoop).isAlive() && GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasMet(GET_PLAYER(eMinorCivLoop).getTeam()))6300 {6301 GET_PLAYER(eMinorCivLoop).GetMinorCivAI()->ChangeFriendshipWithMajor(ePlayer, pRewardInfo->GetCityStateInfluenceBoost());6302 }6303 }6304 }63056306 // Beaker boost based on previous turns6307 if (pRewardInfo->GetBaseBeakersTurnsToCount() > 0)6308 {6309 int iPreviousTurnsToCount = pRewardInfo->GetBaseBeakersTurnsToCount();6310 int iBeakersBonus = GET_PLAYER(ePlayer).GetScienceYieldFromPreviousTurns(GC.getGame().getGameTurn(), iPreviousTurnsToCount);6311 TechTypes eCurrentTech = GET_PLAYER(ePlayer).GetPlayerTechs()->GetCurrentResearch();6312 if(eCurrentTech == NO_TECH)6313 {6314 GET_PLAYER(ePlayer).changeOverflowResearch(iBeakersBonus);6315 }6316 else6317 {6318 GET_TEAM(GET_PLAYER(ePlayer).getTeam()).GetTeamTechs()->ChangeResearchProgress(eCurrentTech, iBeakersBonus, ePlayer);6319 }6320 }63216322 // Free unit class6323 if (pRewardInfo->GetFreeUnitClass() != NO_UNITCLASS)6324 {6325 UnitTypes eUnit = (UnitTypes) GET_PLAYER(ePlayer).getCivilizationInfo().getCivilizationUnits(pRewardInfo->GetFreeUnitClass());6326 if (eUnit != NO_UNIT)6327 {6328 CvCity* pCapital = GET_PLAYER(ePlayer).getCapitalCity();6329 if (pCapital)6330 {6331 CvUnit* pUnit = GET_PLAYER(ePlayer).initUnit(eUnit, pCapital->getX(), pCapital->getY());6332 pUnit->jumpToNearestValidPlot();6333 }6334 }6335 }6336 }6337}