Hooks
static bool BeforeCvGameDeals_PrepareRenewDeal(CvDeal* pOldDeal, const CvDeal* pNewDeal);static void AfterCvGameDeals_PrepareRenewDeal(CvDeal* pOldDeal, const CvDeal* pNewDeal);static void ReplaceCvGameDeals_PrepareRenewDeal(void (*original)(CvDeal*, const CvDeal*), CvDeal* pOldDeal, const CvDeal* pNewDeal);CivRegisterBefore<CivHooks::CvGameDeals_PrepareRenewDeal>(host, &BeforeCvGameDeals_PrepareRenewDeal);CivRegisterAfter<CivHooks::CvGameDeals_PrepareRenewDeal>(host, &AfterCvGameDeals_PrepareRenewDeal);CivRegisterReplace<CivHooks::CvGameDeals_PrepareRenewDeal>(host, &ReplaceCvGameDeals_PrepareRenewDeal);
Code
3498/// Mark elements in the deal as renewed depending on if they are in both deals3499void CvGameDeals::PrepareRenewDeal(CvDeal* pOldDeal, const CvDeal* pNewDeal)3500{3501 // Cancel individual items3502 // HACK HACK HACK3503 // bad slewis! bad! bad!!3504 CvDeal* pNonConstNewDeal = (CvDeal*)pNewDeal;3505 // end HACK HACK HACK35063507 CvAssertMsg(pOldDeal->m_eFromPlayer == pNewDeal->m_eFromPlayer, "Deal is not to the same from players");3508 CvAssertMsg(pOldDeal->m_eToPlayer == pNewDeal->m_eToPlayer, "Deal is not to the same to players");35093510 CvPlayerAI& fromPlayer = GET_PLAYER(pOldDeal->m_eFromPlayer);3511 CvPlayerAI& toPlayer = GET_PLAYER(pOldDeal->m_eToPlayer);35123513 TradedItemList::iterator oldDealItemIter;3514 for(oldDealItemIter = pOldDeal->m_TradedItems.begin(); oldDealItemIter != pOldDeal->m_TradedItems.end(); ++oldDealItemIter)3515 {3516 // if this is not a renewable item, ignore3517 if(CvDeal::GetItemTradeableState(oldDealItemIter->m_eItemType) != CvDeal::DEAL_RENEWABLE)3518 {3519 continue;3520 }35213522 TradedItemList::iterator newDealItemIter;3523 for(newDealItemIter = pNonConstNewDeal->m_TradedItems.begin(); newDealItemIter != pNonConstNewDeal->m_TradedItems.end(); ++newDealItemIter)3524 {3525 // if this is not a renewable item, ignore3526 if(CvDeal::GetItemTradeableState(newDealItemIter->m_eItemType) != CvDeal::DEAL_RENEWABLE)3527 {3528 continue;3529 }35303531 // if the from player doesn't match, ignore3532 if(oldDealItemIter->m_eFromPlayer != newDealItemIter->m_eFromPlayer)3533 {3534 continue;3535 }35363537 // if the item types don't match, ignore3538 if(oldDealItemIter->m_eItemType != newDealItemIter->m_eItemType)3539 {3540 continue;3541 }35423543 TradeableItems eItemType = oldDealItemIter->m_eItemType;35443545 if(eItemType == TRADE_ITEM_RESOURCES)3546 {3547 // resource type3548 if(oldDealItemIter->m_iData1 != newDealItemIter->m_iData1)3549 {3550 continue;3551 }35523553 ResourceTypes eResource = (ResourceTypes)oldDealItemIter->m_iData1;35543555 // quantity3556 if(oldDealItemIter->m_iData2 != newDealItemIter->m_iData2)3557 {3558 int iResourceDelta = newDealItemIter->m_iData2 - oldDealItemIter->m_iData2;3559 if(oldDealItemIter->m_eFromPlayer == pOldDeal->m_eFromPlayer)3560 {3561 fromPlayer.changeResourceExport(eResource, iResourceDelta);3562 toPlayer.changeResourceImport(eResource, iResourceDelta);3563 }3564 else3565 {3566 toPlayer.changeResourceExport(eResource, iResourceDelta);3567 fromPlayer.changeResourceImport(eResource, iResourceDelta);3568 }3569 }3570 }35713572 if(oldDealItemIter->m_eItemType == TRADE_ITEM_GOLD_PER_TURN)3573 {3574 int iOldGPTAmount = oldDealItemIter->m_iData1;3575 int iNewGPTAmount = newDealItemIter->m_iData1;35763577 // has the amount of gold amount changed?3578 if(iOldGPTAmount != iNewGPTAmount)3579 {3580 int iGoldPerTurnDelta = iNewGPTAmount - iOldGPTAmount;3581 if(oldDealItemIter->m_eFromPlayer == pOldDeal->m_eFromPlayer)3582 {3583 fromPlayer.GetTreasury()->ChangeGoldPerTurnFromDiplomacy(-iGoldPerTurnDelta);3584 toPlayer.GetTreasury()->ChangeGoldPerTurnFromDiplomacy(iGoldPerTurnDelta);3585 }3586 else3587 {3588 toPlayer.GetTreasury()->ChangeGoldPerTurnFromDiplomacy(-iGoldPerTurnDelta);3589 fromPlayer.GetTreasury()->ChangeGoldPerTurnFromDiplomacy(iGoldPerTurnDelta);3590 }3591 }3592 }35933594 // mark the deals as appropriately renewed3595 newDealItemIter->m_bToRenewed = true;3596 oldDealItemIter->m_bFromRenewed = true;35973598 // break because we found the match and can continue on3599 break;3600 }3601 }3602}