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, ®ion, &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, ®ion, &secondRegion, &thirdRegion);502 SubdivideRegion(region, iLaterSubdivisions);503 SubdivideRegion(secondRegion, iLaterSubdivisions);504 SubdivideRegion(thirdRegion, iLaterSubdivisions);505 }506 }507}