Bazaar developer reference

CvPlayer::getAdvancedStartTechCost(TechTypes, bool)

Defined in
CvPlayer.cpp, line 23398
Class
CvPlayer
Hook name
CivHooks::CvPlayer_getAdvancedStartTechCost

Hooks

static bool BeforeCvPlayer_getAdvancedStartTechCost(CvPlayer* self, TechTypes eTech, bool bAdd, int& result);static void AfterCvPlayer_getAdvancedStartTechCost(CvPlayer* self, TechTypes eTech, bool bAdd, int& result);static int ReplaceCvPlayer_getAdvancedStartTechCost(int (*original)(CvPlayer*, TechTypes, bool), CvPlayer* self, TechTypes eTech, bool bAdd);CivRegisterBefore<CivHooks::CvPlayer_getAdvancedStartTechCost>(host, &BeforeCvPlayer_getAdvancedStartTechCost);CivRegisterAfter<CivHooks::CvPlayer_getAdvancedStartTechCost>(host, &AfterCvPlayer_getAdvancedStartTechCost);CivRegisterReplace<CivHooks::CvPlayer_getAdvancedStartTechCost>(host, &ReplaceCvPlayer_getAdvancedStartTechCost);

Code

23398int CvPlayer::getAdvancedStartTechCost(TechTypes eTech, bool bAdd)23399{23400	if(eTech == NO_TECH)23401	{23402		return -1;23403	}2340423405	if(0 == getNumCities())23406	{23407		return -1;23408	}2340923410	int iCost = (GET_TEAM(getTeam()).GetTeamTechs()->GetResearchCost(eTech) * GC.getTechInfo(eTech)->GetAdvancedStartCost()) / 100;23411	if(iCost < 0)23412	{23413		return -1;23414	}2341523416	if(bAdd)23417	{23418		if(!GetPlayerTechs()->CanResearch(eTech, false))23419		{23420			return -1;23421		}23422	}23423	else if(!bAdd)23424	{23425		if(!GET_TEAM(getTeam()).GetTeamTechs()->HasTech(eTech))23426		{23427			return -1;23428		}2342923430		// Search through all techs to see if any of the currently owned ones requires this tech23431		for(int iTechLoop = 0; iTechLoop < GC.getNumTechInfos(); iTechLoop++)23432		{23433			TechTypes eTechLoop = (TechTypes) iTechLoop;2343423435			if(GET_TEAM(getTeam()).GetTeamTechs()->HasTech(eTechLoop))23436			{23437				int iPrereqLoop;2343823439				// Or Prereqs23440				for(iPrereqLoop = 0; iPrereqLoop < GC.getNUM_OR_TECH_PREREQS(); iPrereqLoop++)23441				{23442					if(GC.getTechInfo(eTechLoop)->GetPrereqOrTechs(iPrereqLoop) == eTech)23443					{23444						return -1;23445					}23446				}2344723448				// And Prereqs23449				for(iPrereqLoop = 0; iPrereqLoop < GC.getNUM_AND_TECH_PREREQS(); iPrereqLoop++)23450				{23451					if(GC.getTechInfo(eTechLoop)->GetPrereqAndTechs(iPrereqLoop) == eTech)23452					{23453						return -1;23454					}23455				}23456			}23457		}2345823459		// If player has placed anything on the map which uses this tech then you cannot remove it23460		int iLoop;2346123462		// Units23463		CvUnit* pLoopUnit;23464		for(pLoopUnit = firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = nextUnit(&iLoop))23465		{23466			if(pLoopUnit->getUnitInfo().GetPrereqAndTech() == eTech)23467			{23468				return -1;23469			}2347023471			for(int iI = 0; iI < GC.getNUM_UNIT_AND_TECH_PREREQS(); iI++)23472			{23473				if(pLoopUnit->getUnitInfo().GetPrereqAndTechs(iI) == eTech)23474				{23475					return -1;23476				}23477			}23478		}2347923480		// Cities23481		CvCity* pLoopCity;23482		for(pLoopCity = firstCity(&iLoop); pLoopCity != NULL; pLoopCity = nextCity(&iLoop))23483		{23484			// All Buildings23485			for(int iBuildingLoop = 0; iBuildingLoop < GC.getNumBuildingInfos(); iBuildingLoop++)23486			{23487				const BuildingTypes eBuilding = static_cast<BuildingTypes>(iBuildingLoop);23488				CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);23489				if(pkBuildingInfo)23490				{23491					if(pLoopCity->GetCityBuildings()->GetNumRealBuilding(eBuilding) > 0)23492					{23493						if(pkBuildingInfo->GetPrereqAndTech() == eTech)23494						{23495							return -1;23496						}2349723498						for(int iI = 0; iI < GC.getNUM_BUILDING_AND_TECH_PREREQS(); iI++)23499						{23500							if(pkBuildingInfo->GetPrereqAndTechs(iI) == eTech)23501							{23502								return -1;23503							}23504						}23505					}23506				}23507			}23508		}2350923510	}2351123512	return iCost;23513}

Calls

Called by