Bazaar developer reference

CvTeam::changeProjectCount(ProjectTypes, int)

Defined in
CvTeam.cpp, line 4652
Class
CvTeam
Hook name
CivHooks::CvTeam_changeProjectCount

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}

Calls

Called by