Hooks
static bool BeforeCvGame_InitMap(CvGame* self, CvGameInitialItemsOverrides& kGameInitialItemsOverrides, bool& result);static void AfterCvGame_InitMap(CvGame* self, CvGameInitialItemsOverrides& kGameInitialItemsOverrides, bool& result);static bool ReplaceCvGame_InitMap(bool (*original)(CvGame*, CvGameInitialItemsOverrides&), CvGame* self, CvGameInitialItemsOverrides& kGameInitialItemsOverrides);CivRegisterBefore<CivHooks::CvGame_InitMap>(host, &BeforeCvGame_InitMap);CivRegisterAfter<CivHooks::CvGame_InitMap>(host, &AfterCvGame_InitMap);CivRegisterReplace<CivHooks::CvGame_InitMap>(host, &ReplaceCvGame_InitMap);
Code
451bool CvGame::InitMap(CvGameInitialItemsOverrides& kGameInitialItemsOverrides)452{453 CvMap& kMap = GC.getMap();454 const bool bWBSave = CvPreGame::isWBMapScript();455 if(bWBSave)456 {457 const CvWorldBuilderMapLoaderMapInfo& kWBMapInfo =458 CvWorldBuilderMapLoader::GetCurrentMapInfo();459460 if(kWBMapInfo.uiWidth * kWBMapInfo.uiHeight != 0)461 {462 CvMapInitData kMapInitData;463 kMapInitData.m_bWrapX = kWBMapInfo.bWorldWrap;464 kMapInitData.m_bWrapY = false;465 kMapInitData.m_iGridW = kWBMapInfo.uiWidth;466 kMapInitData.m_iGridH = kWBMapInfo.uiHeight;467 kMap.init(&kMapInitData);468469 CvBarbarians::MapInit(kMap.numPlots());470471 CvWorldBuilderMapLoader::InitMap();472 CvWorldBuilderMapLoader::ValidateTerrain();473474 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();475 if(pkScriptSystem != NULL)476 {477 lua_State* L = pkScriptSystem->CreateLuaThread("WorldBuilderMapLoader");478 if(L != NULL)479 {480 lua_cpcall(L, &WorldBuilderMapLoaderAddRandomItems, 0);481 lua_cpcall(L, &WorldBuilderMapLoaderLoadModData, 0);482 lua_cpcall(L, &WorldBuilderMapLoaderRunPostProcessScript, 0);483484 pkScriptSystem->FreeLuaThread(L);485 }486 }487 }488 else489 {490 // Empty map...491 FAssertMsg(0, "Empty World Builder Map!");492493 // Make the map at least 1 x 1 to avoid crashes494 CvMapInitData kMapInitData;495 kMapInitData.m_bWrapX = false;496 kMapInitData.m_bWrapY = false;497 kMapInitData.m_iGridW = 1;498 kMapInitData.m_iGridH = 1;499 kMap.init(&kMapInitData);500501 CvBarbarians::MapInit(kMap.numPlots());502503 CvWorldBuilderMapLoader::ValidateTerrain();504 }505 }506 else507 {508 const CvString& strMapName = CvPreGame::mapScriptName();509510 CvMapGenerator* pGenerator = FNEW(CvMapGenerator(strMapName.c_str()), c_eMPoolTypeGame, 0);511512 CvMapInitData kData;513 if(pGenerator->GetMapInitData(kData, CvPreGame::worldSize()))514 kMap.init(&kData);515 else516 kMap.init();517518 CvBarbarians::MapInit(kMap.numPlots());519520 pGenerator->GenerateRandomMap();521 pGenerator->GetGameInitialItemsOverrides(kGameInitialItemsOverrides);522523 delete pGenerator;524 }525526 CvBarbarians::MapInit(GC.getMap().numPlots());527528 // Run this for all maps because a map should never crash the game on529 // load regardless of where that map came from. (The map scripts are mod-able after all!!!)530 CvWorldBuilderMapLoader::ValidateCoast();531532 // Update some cached values533 GC.getMap().updateAdjacency();534535 // Set all the observer teams to be able to see all the plots536 for(int iI = 0; iI < MAX_PLAYERS; iI++)537 {538 if (CvPreGame::slotStatus((PlayerTypes)iI) == SS_OBSERVER)539 {540 CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iI);541 TeamTypes eTeam = kPlayer.getTeam();542543 if (eTeam != NO_TEAM)544 {545 const int iNumInvisibleInfos = NUM_INVISIBLE_TYPES;546 for(int plotID = 0; plotID < GC.getMap().numPlots(); plotID++)547 {548 CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(plotID);549550 pLoopPlot->changeVisibilityCount(eTeam, 1, NO_INVISIBLE, true, false);551552 for(int iJ = 0; iJ < iNumInvisibleInfos; iJ++)553 {554 pLoopPlot->changeInvisibleVisibilityCount(eTeam, ((InvisibleTypes)iJ), 1);555 }556557 pLoopPlot->setRevealed(eTeam, true, false);558 }559 }560 }561 }562563 return true;564}