Hooks
static bool BeforeCvTeam_processTech(CvTeam* self, TechTypes eTech, int iChange);static void AfterCvTeam_processTech(CvTeam* self, TechTypes eTech, int iChange);static void ReplaceCvTeam_processTech(void (*original)(CvTeam*, TechTypes, int), CvTeam* self, TechTypes eTech, int iChange);CivRegisterBefore<CivHooks::CvTeam_processTech>(host, &BeforeCvTeam_processTech);CivRegisterAfter<CivHooks::CvTeam_processTech>(host, &AfterCvTeam_processTech);CivRegisterReplace<CivHooks::CvTeam_processTech>(host, &ReplaceCvTeam_processTech);
Code
6483void CvTeam::processTech(TechTypes eTech, int iChange)6484{6485 CvCity* pCity;6486 CvPlot* pLoopPlot;6487 ResourceTypes eResource;6488 int iI, iJ;64896490 CvTechEntry* pTech = GC.getTechInfo(eTech);64916492 if (pTech->IsAllowsWorldCongress())6493 {6494 SetHasTechForWorldCongress(true);6495 }64966497 if(pTech->IsTriggersArchaeologicalSites())6498 {6499 GC.getGame().TriggerArchaeologySiteCreation(true /*bCheckInitialized*/);6500 }65016502 if(pTech->IsExtraWaterSeeFrom())6503 {6504 changeExtraWaterSeeFromCount(iChange);6505 }65066507 if(pTech->IsMapCentering())6508 {6509 if(iChange > 0)6510 {6511 setMapCentering(true);6512 }6513 }65146515 if(pTech->IsMapTrading())6516 {6517 changeMapTradingCount(iChange);6518 }65196520 if(pTech->IsTechTrading())6521 {6522 changeTechTradingCount(iChange);6523 }65246525 if(pTech->IsGoldTrading())6526 {6527 changeGoldTradingCount(iChange);6528 }65296530 if(pTech->IsAllowEmbassyTradingAllowed())6531 {6532 changeAllowEmbassyTradingAllowedCount(iChange);6533 }65346535 if(pTech->IsOpenBordersTradingAllowed())6536 {6537 changeOpenBordersTradingAllowedCount(iChange);6538 }65396540 if(pTech->IsDefensivePactTradingAllowed())6541 {6542 changeDefensivePactTradingAllowedCount(iChange);6543 }65446545 if(pTech->IsResearchAgreementTradingAllowed())6546 {6547 ChangeResearchAgreementTradingAllowedCount(iChange);6548 }65496550 if(pTech->IsTradeAgreementTradingAllowed())6551 {6552 ChangeTradeAgreementTradingAllowedCount(iChange);6553 }65546555 if(pTech->IsPermanentAllianceTrading())6556 {6557 changePermanentAllianceTradingCount(iChange);6558 }65596560#if defined(MOD_TECHS_CITY_WORKING)6561 if(pTech->GetCityWorkingChange() != 0)6562 {6563 changeCityWorkingChange(pTech->GetCityWorkingChange() * iChange);6564 }6565#endif65666567#if defined(MOD_TECHS_CITY_AUTOMATON_WORKERS)6568 if(pTech->GetCityAutomatonWorkersChange() != 0)6569 {6570 changeCityAutomatonWorkersChange(pTech->GetCityAutomatonWorkersChange() * iChange);6571 }6572#endif65736574 if(pTech->IsBridgeBuilding())6575 {6576 changeBridgeBuildingCount(iChange);6577 }65786579 if(pTech->IsWaterWork())6580 {6581 changeWaterWorkCount(iChange);6582 }65836584 if(pTech->IsAllowsEmbarking())6585 {6586 changeCanEmbarkCount(iChange);6587 }65886589 if(pTech->IsAllowsDefensiveEmbarking())6590 {6591 changeDefensiveEmbarkCount(iChange);6592 }65936594 if(pTech->IsEmbarkedAllWaterPassage())6595 {6596 changeEmbarkedAllWaterPassage(iChange);6597 }65986599 if(pTech->GetEmbarkedMoveChange() != 0)6600 {6601 changeEmbarkedExtraMoves(pTech->GetEmbarkedMoveChange() * iChange);6602 }66036604 for(iI = 0; iI < GC.getNumRouteInfos(); iI++)6605 {6606 changeRouteChange(((RouteTypes)iI), (GC.getRouteInfo((RouteTypes) iI)->getTechMovementChange(eTech) * iChange));6607 }66086609 for (int i = 0; i < GC.getNumBuildInfos(); i++)6610 {6611 CvBuildInfo* pkBuildInfo = GC.getBuildInfo((BuildTypes)i);6612 if (pkBuildInfo != NULL)6613 changeBuildTimeChange(((BuildTypes)i), (pkBuildInfo->getTechTimeChange(eTech) * iChange));6614 }66156616 for(iI = 0; iI < NUM_DOMAIN_TYPES; iI++)6617 {6618 changeExtraMoves(((DomainTypes)iI), (pTech->GetDomainExtraMoves(iI) * iChange));6619 }66206621 for(iI = 0; iI < GC.getNumBuildingInfos(); iI++)6622 {6623 CvBuildingEntry* pBuildingEntry = GC.getBuildingInfo((BuildingTypes) iI);6624 if(pBuildingEntry)6625 {6626 if(pBuildingEntry->GetObsoleteTech() == eTech)6627 {6628 changeObsoleteBuildingCount(((BuildingTypes)iI), iChange);6629 }6630 if(pBuildingEntry->GetEnhancedYieldTech() == eTech)6631 {6632 enhanceBuilding(((BuildingTypes)iI), iChange);6633 }6634 }6635 }6636 6637#if defined(MOD_API_UNIFIED_YIELDS)6638 for(iI = 0; iI < GC.getNumFeatureInfos(); iI++)6639 {6640 CvFeatureInfo* pFeatureEntry = GC.getFeatureInfo((FeatureTypes)iI);6641 if(pFeatureEntry)6642 {6643 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)6644 {6645 changeFeatureYieldChange(((FeatureTypes)iI), ((YieldTypes)iJ), (pFeatureEntry->GetTechYieldChanges(eTech, iJ) * iChange));6646 }6647 }6648 }66496650 for(iI = 0; iI < GC.getNumTerrainInfos(); iI++)6651 {6652 CvTerrainInfo* pTerrainEntry = GC.getTerrainInfo((TerrainTypes)iI);6653 if(pTerrainEntry)6654 {6655 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)6656 {6657 changeTerrainYieldChange(((TerrainTypes)iI), ((YieldTypes)iJ), (pTerrainEntry->GetTechYieldChanges(eTech, iJ) * iChange));6658 }6659 }6660 }6661#endif66626663 for(iI = 0; iI < GC.getNumImprovementInfos(); iI++)6664 {6665 CvImprovementEntry* pImprovementEntry = GC.getImprovementInfo((ImprovementTypes)iI);6666 if(pImprovementEntry)6667 {6668 for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)6669 {6670 changeImprovementYieldChange(((ImprovementTypes)iI), ((YieldTypes)iJ), (pImprovementEntry->GetTechYieldChanges(eTech, iJ) * iChange));6671 changeImprovementNoFreshWaterYieldChange(((ImprovementTypes)iI), ((YieldTypes)iJ), (pImprovementEntry->GetTechNoFreshWaterYieldChanges(eTech, iJ) * iChange));6672 changeImprovementFreshWaterYieldChange(((ImprovementTypes)iI), ((YieldTypes)iJ), (pImprovementEntry->GetTechFreshWaterYieldChanges(eTech, iJ) * iChange));6673 }6674 }6675 }66766677 CvPlot* pNewUnitPlot;6678 for(iI = 0; iI < MAX_PLAYERS; iI++)6679 {6680 CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iI);6681 if(kPlayer.getTeam() == GetID() && kPlayer.isEverAlive())6682 {6683 kPlayer.changeFeatureProductionModifier(pTech->GetFeatureProductionModifier() * iChange);6684 kPlayer.changeUnitFortificationModifier(pTech->GetUnitFortificationModifier() * iChange);6685 kPlayer.changeUnitBaseHealModifier(pTech->GetUnitBaseHealModifier() * iChange);6686 kPlayer.changeWorkerSpeedModifier(pTech->GetWorkerSpeedModifier() * iChange);6687 kPlayer.ChangeInfluenceSpreadModifier(pTech->GetInfluenceSpreadModifier() * iChange);6688 kPlayer.ChangeExtraVotesPerDiplomat(pTech->GetExtraVotesPerDiplomat() * iChange);66896690 // Free promotion from this tech?6691 for(int iPromotion = 0; iPromotion < GC.getNumPromotionInfos(); iPromotion++)6692 {6693 PromotionTypes ePromotion = (PromotionTypes) iPromotion;6694 if(pTech->IsFreePromotion(ePromotion))6695 kPlayer.ChangeFreePromotionCount(ePromotion, iChange);6696 }66976698 // Update our traits (some may have become obsolete)6699 kPlayer.GetPlayerTraits()->Reset();6700 kPlayer.GetPlayerTraits()->InitPlayerTraits();6701 kPlayer.recomputePolicyCostModifier();67026703 // Does our trait give us a new unit when we reach this tech?6704 UnitTypes eLoopUnit;6705 int iDefaultAI;6706 int iUnitClass = kPlayer.GetPlayerTraits()->GetFirstFreeUnit(eTech);6707 while(iUnitClass != NO_UNITCLASS)6708 {6709 CvCivilizationInfo& playerCivilization = kPlayer.getCivilizationInfo();6710 eLoopUnit = (UnitTypes)playerCivilization.getCivilizationUnits(iUnitClass);6711 iDefaultAI = GC.GetGameUnits()->GetEntry(eLoopUnit)->GetDefaultUnitAIType();6712 pNewUnitPlot = kPlayer.addFreeUnit(eLoopUnit,(UnitAITypes)iDefaultAI);67136714 // Notification below only tells user if their civ gets a Great Person from their trait. But trait code allows ANY unit to be received from reaching a tech.6715 // So in the future we should use a different notification ("you received a new unit from your trait since you reached this tech") instead.6716 SpecialUnitTypes eSpecialUnitGreatPerson = (SpecialUnitTypes) GC.getInfoTypeForString("SPECIALUNIT_PEOPLE");6717 if(pNewUnitPlot && kPlayer.GetNotifications() && GC.GetGameUnits()->GetEntry(eLoopUnit)->GetSpecialUnitType() == eSpecialUnitGreatPerson)6718 {6719 Localization::String strText = Localization::Lookup("TXT_KEY_NOTIFICATION_GREAT_PERSON_ACTIVE_PLAYER");6720 Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_SUMMARY_GREAT_PERSON");6721 kPlayer.GetNotifications()->Add(NOTIFICATION_GREAT_PERSON_ACTIVE_PLAYER, strText.toUTF8(), strSummary.toUTF8(), pNewUnitPlot->getX(), pNewUnitPlot->getY(), eLoopUnit);6722 }67236724 // Another?6725 iUnitClass = kPlayer.GetPlayerTraits()->GetNextFreeUnit();6726 }6727 }6728 }67296730 for(iI = 0; iI < GC.getMap().numPlots(); iI++)6731 {6732 pLoopPlot = GC.getMap().plotByIndexUnchecked(iI);67336734 eResource = pLoopPlot->getResourceType();67356736 if(eResource != NO_RESOURCE)6737 {6738 if(GC.getResourceInfo(eResource)->getTechReveal() == eTech)6739 {6740 pLoopPlot->updateYield();6741 if(pLoopPlot->isRevealed(m_eID))6742 {6743 pLoopPlot->setLayoutDirty(true);6744 }6745 }6746 }6747 }67486749 for(iI = 0; iI < GC.getNumBuildInfos(); iI++)6750 {6751 CvBuildInfo* pBuildInfo = GC.getBuildInfo((BuildTypes) iI);6752 if(pBuildInfo && pBuildInfo->getTechPrereq() == eTech)6753 {6754 if(pBuildInfo->getRoute() != NO_ROUTE)6755 {6756 for(iJ = 0; iJ < GC.getMap().numPlots(); iJ++)6757 {6758 pLoopPlot = GC.getMap().plotByIndexUnchecked(iJ);67596760 pCity = pLoopPlot->getPlotCity();67616762 if(pCity != NULL)6763 {6764 if(pCity->getTeam() == GetID())6765 {6766 pLoopPlot->updateCityRoute();6767 }6768 }6769 }6770 }6771 }6772 }67736774 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();6775 if(pkScriptSystem)6776 {6777 CvLuaArgsHandle args(3);6778 args->Push(GetID());6779 args->Push(eTech);6780 args->Push(iChange);67816782 bool bResult;6783 LuaSupport::CallHook(pkScriptSystem, "TeamTechResearched", args.get(), bResult);6784 }67856786 // End game!6787 if(pTech->IsEndsGame())6788 {6789 GC.getGame().SetEndGameTechResearched(true);6790 }6791}