Hooks
static bool BeforeCvGameDeals_FinalizeDealValidAndAccepted(CvGameDeals* self, PlayerTypes eFromPlayer, PlayerTypes arg1, CvDeal& kDeal, bool bAccepted, CvWeightedVector<TeamTypes, MAX_CIV_TEAMS, true>& veNowAtPeacePairs);static void AfterCvGameDeals_FinalizeDealValidAndAccepted(CvGameDeals* self, PlayerTypes eFromPlayer, PlayerTypes arg1, CvDeal& kDeal, bool bAccepted, CvWeightedVector<TeamTypes, MAX_CIV_TEAMS, true>& veNowAtPeacePairs);static void ReplaceCvGameDeals_FinalizeDealValidAndAccepted(void (*original)(CvGameDeals*, PlayerTypes, PlayerTypes, CvDeal&, bool, CvWeightedVector<TeamTypes, MAX_CIV_TEAMS, true>&), CvGameDeals* self, PlayerTypes eFromPlayer, PlayerTypes arg1, CvDeal& kDeal, bool bAccepted, CvWeightedVector<TeamTypes, MAX_CIV_TEAMS, true>& veNowAtPeacePairs);CivRegisterBefore<CivHooks::CvGameDeals_FinalizeDealValidAndAccepted>(host, &BeforeCvGameDeals_FinalizeDealValidAndAccepted);CivRegisterAfter<CivHooks::CvGameDeals_FinalizeDealValidAndAccepted>(host, &AfterCvGameDeals_FinalizeDealValidAndAccepted);CivRegisterReplace<CivHooks::CvGameDeals_FinalizeDealValidAndAccepted>(host, &ReplaceCvGameDeals_FinalizeDealValidAndAccepted);
Code
2194void CvGameDeals::FinalizeDealValidAndAccepted(PlayerTypes eFromPlayer, PlayerTypes /* eToPlayer */, CvDeal& kDeal, bool bAccepted, CvWeightedVector<TeamTypes, MAX_CIV_TEAMS, true>& veNowAtPeacePairs)2195{2196 // Determine total duration of the Deal2197 int iLatestItemLastTurn = 0;2198 int iLongestDuration = 0;2199 //int iTemp;22002201 TradedItemList::iterator it;2202 for(it = kDeal.m_TradedItems.begin(); it != kDeal.m_TradedItems.end(); ++it)2203 {2204 CvAssertMsg(it->m_eFromPlayer == kDeal.m_eFromPlayer || it->m_eFromPlayer == kDeal.m_eToPlayer, "DEAL: Adding deal that has an item for a player that's not actually in this deal! Please send Jon this with your last 5 autosaves and what changelist # you're playing.");22052206 // Calculate duration2207 if(it->m_iDuration > 0)2208 {2209 it->m_iFinalTurn = it->m_iDuration + GC.getGame().getGameTurn();2210 if(it->m_iDuration > iLongestDuration)2211 {2212 iLongestDuration = it->m_iDuration;2213 iLatestItemLastTurn = it->m_iFinalTurn;2214 }2215 }2216 }22172218 kDeal.m_iDuration = iLongestDuration;2219 kDeal.m_iFinalTurn = iLatestItemLastTurn;2220 kDeal.m_iStartTurn = GC.getGame().getGameTurn();22212222 // Add to current deals2223 CvAssertMsg(kDeal.m_TradedItems.size() > 0, "New deal has no tradeable items!");2224 m_CurrentDeals.push_back(kDeal);2225 kDeal.m_iStartTurn = GC.getGame().getGameTurn();22262227 bool bSentResearchAgreementNotification = false;22282229 int iCost;22302231 // What effects does this Deal have right now?2232 PlayerTypes eAcceptedFromPlayer;2233 PlayerTypes eAcceptedToPlayer;2234 TeamTypes eFromTeam;2235 TeamTypes eToTeam;22362237 for(it = kDeal.m_TradedItems.begin(); it != kDeal.m_TradedItems.end(); ++it)2238 {2239 // if the deal is renewed do not start it up2240 if(it->m_bToRenewed)2241 {2242 if (MOD_AI_MP_DIPLOMACY) {2243 LogDealFailed(&kDeal, true, !bAccepted, false);2244 }2245 continue;2246 }22472248 eAcceptedFromPlayer = it->m_eFromPlayer;2249 eAcceptedToPlayer = kDeal.GetOtherPlayer(eAcceptedFromPlayer);2250 eFromTeam = GET_PLAYER(eAcceptedFromPlayer).getTeam();2251 eToTeam = GET_PLAYER(eAcceptedToPlayer).getTeam();22522253 CvAssertMsg(eAcceptedFromPlayer == kDeal.m_eFromPlayer || eAcceptedFromPlayer == kDeal.m_eToPlayer, "DEAL: Adding deal that has an item for a player that's not actually in this deal! Please send Jon this with your last 5 autosaves and what changelist # you're playing.");22542255 // Deduct Gold cost (if applicable)2256 iCost = GetTradeItemGoldCost(it->m_eItemType, eAcceptedFromPlayer, eAcceptedToPlayer);2257 GET_PLAYER(eAcceptedFromPlayer).GetTreasury()->ChangeGold(-iCost);22582259 // Gold2260 if(it->m_eItemType == TRADE_ITEM_GOLD)2261 {2262 int iGoldAmount = it->m_iData1;2263 GET_PLAYER(eAcceptedFromPlayer).GetTreasury()->ChangeGold(-iGoldAmount);2264 GET_PLAYER(eAcceptedToPlayer).GetTreasury()->ChangeGold(iGoldAmount);2265 }2266 // Gold Per Turn2267 else if(it->m_eItemType == TRADE_ITEM_GOLD_PER_TURN)2268 {2269 int iGoldPerTurn = it->m_iData1;2270 GET_PLAYER(eAcceptedFromPlayer).GetTreasury()->ChangeGoldPerTurnFromDiplomacy(-iGoldPerTurn);2271 GET_PLAYER(eAcceptedToPlayer).GetTreasury()->ChangeGoldPerTurnFromDiplomacy(iGoldPerTurn);2272 }2273 // Resource2274 else if(it->m_eItemType == TRADE_ITEM_RESOURCES)2275 {2276 ResourceTypes eResource = (ResourceTypes) it->m_iData1;2277 int iResourceQuantity = it->m_iData2;2278 GET_PLAYER(eAcceptedFromPlayer).changeResourceExport(eResource, iResourceQuantity);2279 GET_PLAYER(eAcceptedToPlayer).changeResourceImport(eResource, iResourceQuantity);22802281#if !defined(NO_ACHIEVEMENTS)2282 //Resource Trading Achievements2283 if(!GC.getGame().isGameMultiPlayer())2284 {2285 if(GET_PLAYER(eAcceptedFromPlayer).isHuman())2286 {2287 gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_RESOURCESTRADED, 100, ACHIEVEMENT_100RESOURCES);22882289 if(GC.getResourceInfo(eResource)->getResourceUsage() == RESOURCEUSAGE_LUXURY)2290 {2291 //OutputDebugString("\nStep0");2292 if(((CvString)GET_PLAYER(eAcceptedFromPlayer).getLeaderTypeKey() == "LEADER_HARUN_AL_RASHID"))2293 {2294 //OutputDebugString("\nStep1");2295 int iJ;2296 for(iJ = 0; iJ < GC.getNumBuildingInfos(); iJ++)2297 {2298 CvBuildingEntry* pkBuildingEntry = GC.getBuildingInfo((BuildingTypes)iJ);2299 if(pkBuildingEntry)2300 {2301 if((CvString)pkBuildingEntry->GetType() == "BUILDING_BAZAAR")2302 {2303 //OutputDebugString("\nStep2");2304 if(GET_PLAYER(eAcceptedFromPlayer).getBuildingClassCount((BuildingClassTypes)pkBuildingEntry->GetBuildingClassType()) >= 1)2305 {2306 gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_TRADER);2307 }23082309 }2310 }2311 }2312 }2313 }2314 }2315 }2316#endif2317 }2318 // City2319 else if(it->m_eItemType == TRADE_ITEM_CITIES)2320 {2321 CvCity* pCity = GC.getMap().plot(it->m_iData1, it->m_iData2)->getPlotCity();2322 if(pCity != NULL)2323 GET_PLAYER(eAcceptedToPlayer).acquireCity(pCity, false, true);2324 }2325 else if(it->m_eItemType == TRADE_ITEM_ALLOW_EMBASSY)2326 {2327 GET_TEAM(eToTeam).SetHasEmbassyAtTeam(eFromTeam, true);2328 }2329 else if(it->m_eItemType == TRADE_ITEM_DECLARATION_OF_FRIENDSHIP)2330 {2331 // Declaration of friendship always goes both ways. We will most likely have two entries in the deal for this2332 // but just in case, set both anyway.2333 GET_PLAYER(eAcceptedFromPlayer).GetDiplomacyAI()->SetDoFAccepted(eAcceptedToPlayer, true);2334 GET_PLAYER(eAcceptedFromPlayer).GetDiplomacyAI()->SetDoFCounter(eAcceptedToPlayer, 0);2335 GET_PLAYER(eAcceptedToPlayer).GetDiplomacyAI()->SetDoFAccepted(eAcceptedFromPlayer, true);2336 GET_PLAYER(eAcceptedToPlayer).GetDiplomacyAI()->SetDoFCounter(eAcceptedFromPlayer, 0);2337 }2338 // Vote Commitment2339 else if(it->m_eItemType == TRADE_ITEM_VOTE_COMMITMENT)2340 {2341 GET_PLAYER(eAcceptedFromPlayer).GetLeagueAI()->AddVoteCommitment(eAcceptedToPlayer, it->m_iData1, it->m_iData2, it->m_iData3, it->m_bFlag1);2342 }2343 // Open Borders2344 else if(it->m_eItemType == TRADE_ITEM_OPEN_BORDERS)2345 {2346 GET_TEAM(eFromTeam).SetAllowsOpenBordersToTeam(eToTeam, true);2347 }2348 // Defensive Pact2349 else if(it->m_eItemType == TRADE_ITEM_DEFENSIVE_PACT)2350 {2351 GET_TEAM(eFromTeam).SetHasDefensivePact(eToTeam, true);2352 }2353 // Research Agreement2354 else if(it->m_eItemType == TRADE_ITEM_RESEARCH_AGREEMENT)2355 {2356 GET_TEAM(eFromTeam).SetHasResearchAgreement(eToTeam, true);2357 GET_PLAYER(eAcceptedFromPlayer).GetTreasury()->LogExpenditure(GET_PLAYER(eAcceptedToPlayer).getCivilizationShortDescription(), iCost, 9);23582359 if(!bSentResearchAgreementNotification)2360 {2361 bSentResearchAgreementNotification = true;2362 GC.getGame().DoResearchAgreementNotification(eFromTeam, eToTeam);2363 }2364 }2365 // Trade Agreement2366 else if(it->m_eItemType == TRADE_ITEM_TRADE_AGREEMENT)2367 {2368 GET_TEAM(eFromTeam).SetHasTradeAgreement(eToTeam, true);2369 }2370 // Third Party Peace2371 else if(it->m_eItemType == TRADE_ITEM_THIRD_PARTY_PEACE)2372 {2373 TeamTypes eTargetTeam = (TeamTypes) it->m_iData1;2374 bool bTargetTeamIsMinor = GET_TEAM(eTargetTeam).isMinorCiv();2375#if defined(MOD_EVENTS_WAR_AND_PEACE)2376 GET_TEAM(eFromTeam).makePeace(eTargetTeam, /*bBumpUnits*/ true, /*bSuppressNotification*/ bTargetTeamIsMinor, eFromPlayer);2377#else2378 GET_TEAM(eFromTeam).makePeace(eTargetTeam, /*bBumpUnits*/ true, /*bSuppressNotification*/ bTargetTeamIsMinor);2379#endif2380 GET_TEAM(eFromTeam).setForcePeace(eTargetTeam, true);2381 GET_TEAM(eTargetTeam).setForcePeace(eFromTeam, true);23822383 if(bTargetTeamIsMinor)2384 veNowAtPeacePairs.push_back(eTargetTeam, eFromTeam); //eFromTeam is second so we can take advantage of CvWeightedVector's sort by weights2385 }2386 // Third Party War2387 else if(it->m_eItemType == TRADE_ITEM_THIRD_PARTY_WAR)2388 {2389 TeamTypes eTargetTeam = (TeamTypes) it->m_iData1;2390#if defined(MOD_EVENTS_WAR_AND_PEACE)2391 GET_TEAM(eFromTeam).declareWar(eTargetTeam, false, eFromPlayer);2392#else2393 GET_TEAM(eFromTeam).declareWar(eTargetTeam);2394#endif23952396 int iLockedTurns = /*15*/ GC.getCOOP_WAR_LOCKED_LENGTH();2397 GET_TEAM(eFromTeam).ChangeNumTurnsLockedIntoWar(eTargetTeam, iLockedTurns);2398 }2399 // **** Peace Treaty **** this should always be the last item processed!!!2400 else if(it->m_eItemType == TRADE_ITEM_PEACE_TREATY)2401 {2402#if defined(MOD_EVENTS_WAR_AND_PEACE)2403 GET_TEAM(eFromTeam).makePeace(eToTeam, true, false, eFromPlayer);2404#else2405 GET_TEAM(eFromTeam).makePeace(eToTeam);2406#endif2407 GET_TEAM(eFromTeam).setForcePeace(eToTeam, true);2408 }2409 //////////////////////////////////////////////////////////////////////2410 // **** DO NOT PUT ANYTHING AFTER THIS LINE ****2411 //////////////////////////////////////////////////////////////////////2412 }24132414 LogDealComplete(&kDeal);2415}