Bazaar developer reference

CvStartPositioner::ChopIntoTwoRegions(bool, CvStartRegion *, CvStartRegion *, int)

Defined in
CvStartPositioner.cpp, line 510
Class
CvStartPositioner
Hook name
CivHooks::CvStartPositioner_ChopIntoTwoRegions

Hooks

static bool BeforeCvStartPositioner_ChopIntoTwoRegions(CvStartPositioner* self, bool bTaller, CvStartRegion* region, CvStartRegion* secondRegion, int iChopPercent);static void AfterCvStartPositioner_ChopIntoTwoRegions(CvStartPositioner* self, bool bTaller, CvStartRegion* region, CvStartRegion* secondRegion, int iChopPercent);static void ReplaceCvStartPositioner_ChopIntoTwoRegions(void (*original)(CvStartPositioner*, bool, CvStartRegion*, CvStartRegion*, int), CvStartPositioner* self, bool bTaller, CvStartRegion* region, CvStartRegion* secondRegion, int iChopPercent);// CivHooks.h gives this hook point no types, so nothing checks these hooks' parameters.host->RegisterHook(host->pluginIndex, CivHooks::CvStartPositioner_ChopIntoTwoRegions::ID, CIV_HOOK_BEFORE, (void*)&BeforeCvStartPositioner_ChopIntoTwoRegions);host->RegisterHook(host->pluginIndex, CivHooks::CvStartPositioner_ChopIntoTwoRegions::ID, CIV_HOOK_AFTER, (void*)&AfterCvStartPositioner_ChopIntoTwoRegions);host->RegisterHook(host->pluginIndex, CivHooks::CvStartPositioner_ChopIntoTwoRegions::ID, CIV_HOOK_REPLACE, (void*)&ReplaceCvStartPositioner_ChopIntoTwoRegions);

Code

509/// Performs the mechanics of dividing a region into two equal fertility subregions510void CvStartPositioner::ChopIntoTwoRegions(bool bTaller, CvStartRegion* region, CvStartRegion* secondRegion, int iChopPercent)511{512	CvAssert(region);513	if(!region) return;514	CvAssert(secondRegion);515	if(!secondRegion) return;516517	int uiTargetFertility;518	int uiFertilitySoFar = 0;519520	// Do some initialization on second region521	secondRegion->m_iAreaID = region->m_iAreaID;522523	// How much fertility do we want in the first region?524	uiTargetFertility = region->m_uiFertility * iChopPercent / 100;525526	// Taller than wide527	if(bTaller)528	{529		// We know that the second region will have the same width and same north edge530		secondRegion->m_Boundaries.m_iEastEdge = region->m_Boundaries.m_iEastEdge;531		secondRegion->m_Boundaries.m_iWestEdge = region->m_Boundaries.m_iWestEdge;532		secondRegion->m_Boundaries.m_iNorthEdge = region->m_Boundaries.m_iNorthEdge;533534		// Move up one row at a time until we have exceeded the target fertility535		int iNorthEdge = region->m_Boundaries.m_iSouthEdge;536		while(uiFertilitySoFar < uiTargetFertility)537		{538			uiFertilitySoFar += ComputeRowFertility(region->m_iAreaID,539			                                        region->m_Boundaries.m_iWestEdge, region->m_Boundaries.m_iEastEdge, iNorthEdge, iNorthEdge);540			iNorthEdge++;541		}542543		// Set edges544		region->m_Boundaries.m_iNorthEdge = iNorthEdge - 1;545		secondRegion->m_Boundaries.m_iSouthEdge = iNorthEdge;546	}547548	// Wider than tall549	else550	{551		// We know that the second region will have the same height and same east edge552		secondRegion->m_Boundaries.m_iNorthEdge = region->m_Boundaries.m_iNorthEdge;553		secondRegion->m_Boundaries.m_iSouthEdge = region->m_Boundaries.m_iSouthEdge;554		secondRegion->m_Boundaries.m_iEastEdge = region->m_Boundaries.m_iEastEdge;555556		// Move right one column at a time until we have exceeded the target fertility557		int iEastEdge = region->m_Boundaries.m_iWestEdge;558		while(uiFertilitySoFar < uiTargetFertility)559		{560			uiFertilitySoFar += ComputeRowFertility(region->m_iAreaID,561			                                        iEastEdge, iEastEdge, region->m_Boundaries.m_iSouthEdge, region->m_Boundaries.m_iNorthEdge);562			iEastEdge++;563		}564565		// Set edges566		region->m_Boundaries.m_iEastEdge = iEastEdge - 1;567		secondRegion->m_Boundaries.m_iWestEdge = iEastEdge;568	}569570	// Finish initializing regions571	secondRegion->m_uiFertility = region->m_uiFertility - uiFertilitySoFar;572	region->m_uiFertility = uiFertilitySoFar;573}

Calls

Called by