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}