Bazaar developer reference

CvStartPositioner::SubdivideRegion(CvStartRegion, int)

Defined in
CvStartPositioner.cpp, line 369
Class
CvStartPositioner
Hook name
CivHooks::CvStartPositioner_SubdivideRegion

Hooks

static bool BeforeCvStartPositioner_SubdivideRegion(CvStartPositioner* self, CvStartRegion region, int iNumDivisions);static void AfterCvStartPositioner_SubdivideRegion(CvStartPositioner* self, CvStartRegion region, int iNumDivisions);static void ReplaceCvStartPositioner_SubdivideRegion(void (*original)(CvStartPositioner*, CvStartRegion, int), CvStartPositioner* self, CvStartRegion region, int iNumDivisions);// CivHooks.h gives this hook point no types, so nothing checks these hooks' parameters.host->RegisterHook(host->pluginIndex, CivHooks::CvStartPositioner_SubdivideRegion::ID, CIV_HOOK_BEFORE, (void*)&BeforeCvStartPositioner_SubdivideRegion);host->RegisterHook(host->pluginIndex, CivHooks::CvStartPositioner_SubdivideRegion::ID, CIV_HOOK_AFTER, (void*)&AfterCvStartPositioner_SubdivideRegion);host->RegisterHook(host->pluginIndex, CivHooks::CvStartPositioner_SubdivideRegion::ID, CIV_HOOK_REPLACE, (void*)&ReplaceCvStartPositioner_SubdivideRegion);

Code

368/// Recursive algorithm that chops regions up as required369void CvStartPositioner::SubdivideRegion(CvStartRegion region, int iNumDivisions)370{371	int iNumDivides = 0;372	int iLaterSubdivisions = 0;373374	// Break recursion when number of divisions is down to 1375	if(iNumDivisions == 1)376	{377		// Store this as a final region378		m_StartRegionVector.push_back(region);379	}380381	// Need to subdivide382	else if(iNumDivisions > 1)383	{384		// See if region is taller or wider385		bool bTaller = true;386		if((region.m_Boundaries.m_iNorthEdge - region.m_Boundaries.m_iSouthEdge) <387		        (region.m_Boundaries.m_iEastEdge - region.m_Boundaries.m_iWestEdge))388		{389			bTaller = false;390		}391392#if defined(MOD_GLOBAL_MAX_MAJOR_CIVS)393		// CUSTOMLOG("CvStartPositioner::SubdivideRegion into %i divisions (by algorithm)", iNumDivisions);394		// Gives a slightly different pattern to the hard-coded switch below, but it really doesn't matter395		if (iNumDivisions > 32) {396			iNumDivides = 2;397			iLaterSubdivisions = (iNumDivisions+1) / 2;398		} else if (iNumDivisions % 3 == 0) {399			iNumDivides = 3;400			iLaterSubdivisions = iNumDivisions / 3;401		} else if (iNumDivisions % 2 == 0) {402			iNumDivides = 2;403			iLaterSubdivisions = iNumDivisions / 2;404		} else if ((iNumDivisions+1) % 3 == 0) {405			iNumDivides = 3;406			iLaterSubdivisions = (iNumDivisions+1) / 3;407		} else {408			iNumDivides = 2;409			iLaterSubdivisions = (iNumDivisions+1) / 2;410		}411412		// DUH!!!  I'm so stooopid that I can't work out a simple algorithm for this, jeez Firaxis, employ some apes with brains!413#else414		// CUSTOMLOG("CvStartPositioner::SubdivideRegion into %i divisions (by switch)", iNumDivisions);415		// If number of divisions is greater than 3...416		//417		// Number       First Divide     Each Subdivision418		// ------       ------------     ----------------419		//   4                2                 2420		//  5-6               3                 2421		//  7-8               2                 4422		//   9                3                 3423		// 10-12              3                 4424		// 13-16              2                 8425		// 17-18              3                 6426		// 19-20              2                10427		// 21-22              3                 8428		switch(iNumDivisions)429		{430		case 2:431			iNumDivides = 2;432			iLaterSubdivisions = 1;433			break;434		case 3:435			iNumDivides = 3;436			iLaterSubdivisions = 1;437			break;438		case 4:439			iNumDivides = 2;440			iLaterSubdivisions = 2;441			break;442		case 5:443		case 6:444			iNumDivides = 3;445			iLaterSubdivisions = 2;446			break;447		case 7:448		case 8:449			iNumDivides = 2;450			iLaterSubdivisions = 4;451			break;452		case 9:453			iNumDivides = 3;454			iLaterSubdivisions = 3;455			break;456		case 10:457		case 11:458		case 12:459			iNumDivides = 3;460			iLaterSubdivisions = 4;461			break;462		case 13:463		case 14:464		case 15:465		case 16:466			iNumDivides = 2;467			iLaterSubdivisions = 8;468			break;469		case 17:470		case 18:471			iNumDivides = 3;472			iLaterSubdivisions = 6;473			break;474		case 19:475		case 20:476			iNumDivides = 2;477			iLaterSubdivisions = 10;478			break;479		case 21:480		case 22:481			iNumDivides = 3;482			iLaterSubdivisions = 8;483			break;484		default:485			CvAssertMsg(false, "Trying to create regions for more than 18 major civs.");486		}487#endif488		// CUSTOMLOG(" divide now %i, divide later %i", iNumDivides, iLaterSubdivisions);489490		if(iNumDivides == 2)491		{492			CvStartRegion secondRegion;493			ChopIntoTwoRegions(bTaller, &region, &secondRegion, 50);494			SubdivideRegion(region, iLaterSubdivisions);495			SubdivideRegion(secondRegion, iLaterSubdivisions);496		}497		else if(iNumDivides == 3)498		{499			CvStartRegion secondRegion;500			CvStartRegion thirdRegion;501			ChopIntoThreeRegions(bTaller, &region, &secondRegion, &thirdRegion);502			SubdivideRegion(region, iLaterSubdivisions);503			SubdivideRegion(secondRegion, iLaterSubdivisions);504			SubdivideRegion(thirdRegion, iLaterSubdivisions);505		}506	}507}

Calls

Called by