Hooks
static bool BeforeCvTeam_changeProjectCount(CvTeam* self, ProjectTypes eIndex, int iChange);static void AfterCvTeam_changeProjectCount(CvTeam* self, ProjectTypes eIndex, int iChange);static void ReplaceCvTeam_changeProjectCount(void (*original)(CvTeam*, ProjectTypes, int), CvTeam* self, ProjectTypes eIndex, int iChange);CivRegisterBefore<CivHooks::CvTeam_changeProjectCount>(host, &BeforeCvTeam_changeProjectCount);CivRegisterAfter<CivHooks::CvTeam_changeProjectCount>(host, &AfterCvTeam_changeProjectCount);CivRegisterReplace<CivHooks::CvTeam_changeProjectCount>(host, &ReplaceCvTeam_changeProjectCount);
Code
4652void CvTeam::changeProjectCount(ProjectTypes eIndex, int iChange)4653{4654 bool bChangeProduction;4655 int iOldProjectCount;4656 int iI, iJ;46574658 CvAssertMsg(eIndex >= 0, "eIndex is expected to be non-negative (invalid Index)");4659 CvAssertMsg(eIndex < GC.getNumProjectInfos(), "eIndex is expected to be within maximum bounds (invalid Index)");46604661 if(iChange != 0)4662 {4663#if defined(MOD_GLOBAL_NO_CONQUERED_SPACESHIPS)4664 if (MOD_GLOBAL_NO_CONQUERED_SPACESHIPS && iChange < 0) {4665 CUSTOMLOG("Disassembling project %d by %d", (int) eIndex, iChange);4666 }4667#endif4668 GC.getGame().incrementProjectCreatedCount(eIndex, iChange);46694670 iOldProjectCount = getProjectCount(eIndex);46714672 m_paiProjectCount[eIndex] = (m_paiProjectCount[eIndex] + iChange);4673 CvAssert(getProjectCount(eIndex) >= 0);46744675 //adjust default art types4676 if(iChange >= 0)4677 {4678 //multiplayer games default to first art type4679 int defaultType = -1;4680 if(GC.getGame().isNetworkMultiPlayer())4681 defaultType = getProjectDefaultArtType(eIndex);46824683 for(int i=0; i<iChange; i++)4684 m_pavProjectArtTypes[eIndex].push_back(defaultType);4685 }4686 else4687 {4688 for(int i=0; i<-iChange; i++)4689 m_pavProjectArtTypes[eIndex].pop_back();4690 }4691 CvAssertMsg(getProjectCount(eIndex) == (int)m_pavProjectArtTypes[eIndex].size(), "[Jason] Unbalanced project art types.");46924693 CvProjectEntry* pkProject = GC.getProjectInfo(eIndex);46944695 changeNukeInterception(pkProject->GetNukeInterception() * iChange);46964697 if((pkProject->GetTechShare() > 0) && (pkProject->GetTechShare() <= MAX_TEAMS))4698 {4699 changeTechShareCount((pkProject->GetTechShare() - 1), iChange);4700 }47014702 for(int iVictory = 0; iVictory < GC.getNumVictoryInfos(); ++iVictory)4703 {4704 if(pkProject->GetVictoryThreshold(iVictory) > 0)4705 {4706 m_abCanLaunch[iVictory] = GC.getGame().testVictory((VictoryTypes)iVictory, GetID());4707 GC.getGame().testVictory();4708 }4709 }47104711 if(iChange > 0)4712 {4713 if(pkProject->GetEveryoneSpecialUnit() != NO_SPECIALUNIT)4714 {4715 GC.getGame().makeSpecialUnitValid((SpecialUnitTypes)(pkProject->GetEveryoneSpecialUnit()));4716 }47174718 if(pkProject->IsAllowsNukes())4719 {4720 GC.getGame().makeNukesValid(true);4721 }47224723 for(iI = 0; iI < MAX_PLAYERS; iI++)4724 {4725 if(GET_PLAYER((PlayerTypes)iI).isAlive())4726 {4727 if(GET_PLAYER((PlayerTypes)iI).getTeam() == GetID())4728 {4729 if(!(GET_PLAYER((PlayerTypes)iI).isHuman()))4730 {4731 bChangeProduction = false;47324733 for(iJ = 0; iJ < GC.getNumProjectInfos(); iJ++)4734 {4735 if((getProjectCount(eIndex) >= GC.getProjectInfo((ProjectTypes)iJ)->GetProjectsNeeded(eIndex)) &&4736 (iOldProjectCount < GC.getProjectInfo((ProjectTypes)iJ)->GetProjectsNeeded(eIndex)))4737 {4738 bChangeProduction = true;4739 break;4740 }4741 }47424743 if(bChangeProduction)4744 {4745 //GET_PLAYER((PlayerTypes)iI).AI_makeProductionDirty();4746 }4747 }4748 }4749 }4750 }47514752 if(GC.getGame().isFinalInitialized())4753 {4754 CvString strSomeoneCompletesProject = GetLocalizedText("TXT_KEY_MISC_COMPLETES_PROJECT", getName().GetCString(), pkProject->GetTextKey());4755 CvString strSomeoneCompletedProject = GetLocalizedText("TXT_KEY_MISC_SOMEONE_HAS_COMPLETED", getName().GetCString(), pkProject->GetTextKey());4756 CvString strUnknownCompletesProject = GetLocalizedText("TXT_KEY_MISC_WONDER_COMPLETED_UNKNOWN", pkProject->GetTextKey());47574758 const PlayerTypes eTeamLeader = getLeaderID();4759 GC.getGame().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, eTeamLeader, strSomeoneCompletesProject);47604761 CvPlayerAI& playerWhoLeadsTeam = GET_PLAYER(eTeamLeader);4762 CvCity* pLeadersCapital = playerWhoLeadsTeam.getCapitalCity();476347644765 for(iI = 0; iI < MAX_MAJOR_CIVS; iI++)4766 {4767 const PlayerTypes ePlayer = static_cast<PlayerTypes>(iI);4768 CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);47694770 if(kPlayer.isAlive())4771 {4772 if(isHasMet(kPlayer.getTeam()))4773 {4774 if(ePlayer == GC.getGame().getActivePlayer())4775 {4776 DLLUI->AddCityMessage(0, pLeadersCapital->GetIDInfo(), ePlayer, false, GC.getEVENT_MESSAGE_TIME(), strSomeoneCompletedProject);4777 }4778 CvNotifications* pNotifications = kPlayer.GetNotifications();4779 pNotifications->Add(NOTIFICATION_PROJECT_COMPLETED, strSomeoneCompletedProject, strSomeoneCompletedProject, pLeadersCapital->getX(), pLeadersCapital->getY(), eIndex, playerWhoLeadsTeam.GetID());4780 }4781 else4782 {4783 if(ePlayer == GC.getGame().getActivePlayer())4784 {4785 DLLUI->AddCityMessage(0, pLeadersCapital->GetIDInfo(), ePlayer, false, GC.getEVENT_MESSAGE_TIME(), strUnknownCompletesProject);4786 }4787 CvNotifications* pNotifications = kPlayer.GetNotifications();4788 pNotifications->Add(NOTIFICATION_PROJECT_COMPLETED, strUnknownCompletesProject, strUnknownCompletesProject, -1, -1, eIndex, NO_PLAYER);4789 }4790 }4791 }4792 }4793 }4794 }47954796 // Update the amount of a Resource used up by this Project4797 for(int iResourceLoop = 0; iResourceLoop < GC.getNumResourceInfos(); iResourceLoop++)4798 {4799 if(GC.getProjectInfo(eIndex)->GetResourceQuantityRequirement(iResourceLoop) > 0)4800 {4801 for(int iPlayerLoop = 0; iPlayerLoop < MAX_CIV_PLAYERS; iPlayerLoop++)4802 {4803 CvPlayerAI& kPlayer = GET_PLAYER((PlayerTypes) iPlayerLoop);4804 if(kPlayer.isAlive() && kPlayer.getTeam() == GetID())4805 {4806 kPlayer.changeNumResourceUsed((ResourceTypes) iResourceLoop, iChange * GC.getProjectInfo(eIndex)->GetResourceQuantityRequirement(iResourceLoop));4807 }4808 }4809 }4810 }4811}