Advertisement
Guest User

Animal spawn script

a guest
Jul 18th, 2019
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.88 KB | None | 0 0
  1.  
  2. -- local iLocalPlayer = Game:GetLocalPlayer();
  3. local bGatheringStormEnabled = GameClimate ~= nil;
  4. local iWildAnimalsPlayer = 63;
  5. local pAnimalUnits;
  6. local tWildAnimals = {};
  7. local iGameStartTurn = Game.GetCurrentGameTurn();
  8. local pWildAnimalsPlayer;
  9. local iBarbCamp = GameInfo.Improvements['IMPROVEMENT_BARBARIAN_CAMP'].Index;
  10. local iGoodyHut = GameInfo.Improvements['IMPROVEMENT_GOODY_HUT'].Index;
  11.  
  12. tWildAnimals['UNIT_ANIMAL_KRAKEN'] = {};
  13. tWildAnimals['UNIT_ANIMAL_KRAKEN']['tValidTerrainNames'] = {'TERRAIN_OCEAN'};
  14. -- tWildAnimals['UNIT_ANIMAL_KRAKEN']['tInvalidFeatures'] = {};
  15. tWildAnimals['UNIT_ANIMAL_KRAKEN']['iMinPercentValidPlotsToOccupy'] = 3;
  16. tWildAnimals['UNIT_ANIMAL_KRAKEN']['iMaxPercentValidPlotsToOccupy'] = 6;
  17. -- tWildAnimals['UNIT_ANIMAL_KRAKEN']['tValidPlots'] = {};
  18. tWildAnimals['UNIT_ANIMAL_KRAKEN']['bSpawnInPlayerSight'] = true;
  19.  
  20. tWildAnimals['UNIT_ANIMAL_POLARBEAR'] = {};
  21. tWildAnimals['UNIT_ANIMAL_POLARBEAR']['tValidTerrainNames'] = {'TERRAIN_SNOW', 'TERRAIN_SNOW_HILLS'};
  22. tWildAnimals['UNIT_ANIMAL_POLARBEAR']['iMinPercentValidPlotsToOccupy'] = 15;
  23. tWildAnimals['UNIT_ANIMAL_POLARBEAR']['iMaxPercentValidPlotsToOccupy'] = 25;
  24. tWildAnimals['UNIT_ANIMAL_POLARBEAR']['bSpawnInPlayerSight'] = false;
  25.  
  26. tWildAnimals['UNIT_ANIMAL_JACKAL'] = {};
  27. tWildAnimals['UNIT_ANIMAL_JACKAL']['tValidTerrainNames'] = {'TERRAIN_GRASS', 'TERRAIN_GRASS_HILLS', 'TERRAIN_PLAINS', 'TERRAIN_PLAINS_HILLS'};
  28. tWildAnimals['UNIT_ANIMAL_JACKAL']['tInvalidFeatureNames'] = {'FEATURE_JUNGLE', 'FEATURE_FOREST'};
  29. tWildAnimals['UNIT_ANIMAL_JACKAL']['iMinPercentValidPlotsToOccupy'] = 15;
  30. tWildAnimals['UNIT_ANIMAL_JACKAL']['iMaxPercentValidPlotsToOccupy'] = 25;
  31. tWildAnimals['UNIT_ANIMAL_JACKAL']['bSpawnInPlayerSight'] = false;
  32.  
  33.  
  34.  
  35.  
  36. local function NormalizeToRange(iValue, iOldMin, iOldMax, iNewMin, iNewMax)
  37.    
  38.     local iOldRange = iOldMax - iOldMin;
  39.     local iNewValue;
  40.  
  41.     if iOldRange == 0 then
  42.         iNewValue = iNewMin;
  43.     else
  44.         local iNewRange = iNewMax - iNewMin;
  45.         iNewValue = ((iValue - iOldMin) * iNewRange) / iOldRange + iNewMin;
  46.     end
  47.  
  48.     return math.floor(iNewValue);
  49. end
  50.  
  51.  
  52. local function Tablelength(T)
  53.     local count = 0;
  54.     for _ in pairs(T) do
  55.         count = count + 1;
  56.     end
  57.     return count;
  58. end
  59.  
  60.  
  61. local function GetRandomNumber(iMin, iMax)
  62.     return TerrainBuilder.GetRandomNumber(iMax - iMin + 1, "") + iMin;
  63. end
  64.  
  65.  
  66. local function ShuffleTable(T)
  67.     for i = #T, 2, -1 do
  68.     -- local j = math.random(i);
  69.     local j = GetRandomNumber(1, i);
  70.         T[i], T[j] = T[j], T[i];
  71.     end
  72.     return T;
  73. end
  74.  
  75.  
  76. local function IsPlotOKtoSpawn(pPlot, tAnimalData)
  77.  
  78.     -- water level rose
  79.     if bGatheringStormEnabled and TerrainManager.IsSubmerged(pPlot) then
  80.         tAnimalData['tValidPlots'][pPlot] = nil;
  81.         return false;
  82.     end
  83.        
  84.     if tAnimalData['tInvalidFeatures'][pPlot:GetFeatureType()] then
  85.         return false;
  86.     end
  87.  
  88.     if tAnimalData['bSpawnInPlayerSight'] == false then
  89.         local iX, iY = pPlot:GetX(),pPlot:GetY();
  90.  
  91.         for iPlayerID, pPlayer in ipairs(Players) do
  92.             if pPlayer:IsAlive() then
  93.                 local pPlayerVis = PlayersVisibility[iPlayerID];
  94.  
  95.                 if pPlayerVis:IsVisible(iX, iY) then
  96.                     return false;
  97.                 end
  98.             end
  99.         end
  100.     end
  101.  
  102.     local iImpType = pPlot:GetImprovementType();
  103.  
  104.     if pPlot:IsOwned() or pPlot:IsUnit() or iImpType == iBarbCamp or iImpType == iGoodyHut then
  105.         return false;
  106.     end
  107.  
  108.     return true;
  109. end
  110.  
  111.  
  112. local function GetAnimalCount(sAnimalType)
  113.  
  114.     local iType = GameInfo.Units[sAnimalType].Index;
  115.     local iCount = 0;
  116.  
  117.     for i, pUnit in pAnimalUnits:Members() do
  118.         if pUnit:GetType() == iType then
  119.             iCount = iCount + 1;
  120.         end
  121.     end
  122.     return iCount;
  123. end
  124.  
  125.  
  126. local function SpawnAnimals()
  127.  
  128.     for sAnimalType, tAnimalData in pairs(tWildAnimals) do
  129.         local tPlotsToSpawn = {};
  130.         local iNumAlive = GetAnimalCount(sAnimalType);
  131.         local iMinToSpawn = NormalizeToRange(tAnimalData['iMinPercentValidPlotsToOccupy'], 0, 100, 0, Tablelength(tAnimalData['tValidPlots']));
  132.         local iMaxToSpawn = NormalizeToRange(tAnimalData['iMaxPercentValidPlotsToOccupy'], 0, 100, 0, Tablelength(tAnimalData['tValidPlots']));
  133.         local iAnimalsToSpawn = GetRandomNumber(iMinToSpawn, iMaxToSpawn);
  134.         print(sAnimalType, 'ALIVE', iNumAlive, 'MIN TO SPAWN', iMinToSpawn, 'MAX TO SPAWN', iMaxToSpawn);
  135.  
  136.         for pPlot, _ in pairs(tAnimalData['tValidPlots']) do
  137.             if IsPlotOKtoSpawn(pPlot, tAnimalData) then
  138.                 table.insert(tPlotsToSpawn, pPlot);
  139.             end
  140.         end
  141.  
  142.         ShuffleTable(tPlotsToSpawn); -- avoid spawning every animal in the same area
  143.         local iAnimalsSpawned = 0;
  144.  
  145.         for _, pPlot in pairs(tPlotsToSpawn) do
  146.             if iNumAlive < iAnimalsToSpawn then
  147.                 pAnimalUnits:Create(tAnimalData['iType'], pPlot:GetX(), pPlot:GetY());
  148.                 -- UnitManager.InitUnit(iWildAnimalsPlayer, sAnimalType, pPlot:GetX(), pPlot:GetY());
  149.                 iAnimalsSpawned = iAnimalsSpawned + 1;
  150.                 iNumAlive = iNumAlive + 1;
  151.             else
  152.                 break;
  153.             end
  154.         end
  155.         print(sAnimalType, 'Spawned this turn', iAnimalsSpawned);
  156.     end
  157. end
  158.  
  159.  
  160. local function OnPlayerTurnStartComplete ( iPlayerID, someBoolean)
  161.     -- sometimes fires when game loaded !
  162.     if iPlayerID == iWildAnimalsPlayer and iGameStartTurn ~= Game.GetCurrentGameTurn()then
  163.         -- print("____________________________________________");
  164.         -- print("OnPlayerTurnActivated");
  165.         -- print("____________________________________________");
  166.         SpawnAnimals();
  167.     end
  168. end
  169.  
  170.  
  171. local function Initialize()
  172.  
  173.     -- print( 'GetStartTurn', GameConfiguration.GetStartTurn());
  174.     GameEvents.PlayerTurnStartComplete.Add( OnPlayerTurnStartComplete);
  175.  
  176.     for iPlayerID, pPlayer in ipairs(Players) do
  177.         if pPlayer:WasEverAlive() then
  178.             local sCivName = PlayerConfigurations[iPlayerID]:GetCivilizationTypeName();
  179.             print( sCivName, iPlayerID);
  180.  
  181.             -- free cities units dont move
  182.             -- if sCivName == 'CIVILIZATION_FREE_CITIES' then
  183.                 -- iWildAnimalsPlayer = iPlayerID;
  184.                 -- break;
  185.             if sCivName == 'CIVILIZATION_BARBARIAN' then
  186.                 iWildAnimalsPlayer = iPlayerID;
  187.             end
  188.         end
  189.     end
  190.  
  191.     -- iWildAnimalsPlayer = 0;
  192.     -- pWildAnimalsPlayer:AttachModifierByID("TRAIT_BARBARIANS_OCEAN");
  193.  
  194.     pWildAnimalsPlayer = Players[iWildAnimalsPlayer];
  195.  
  196.     print( 'iWildAnimalsPlayer', iWildAnimalsPlayer);
  197.     -- print( 'bGatheringStormEnabled', bGatheringStormEnabled);
  198.     pAnimalUnits = pWildAnimalsPlayer:GetUnits();
  199.  
  200.     local tImpassableFeatures = {};
  201.  
  202.     for row in GameInfo.Features() do
  203.         -- print( 'tImpassableFeatures row.Impassable', row.FeatureType, row.Impassable);
  204.         if row.Impassable == true then
  205.             tImpassableFeatures[row.Index] = true;
  206.             -- print( 'tImpassableFeatures', row.FeatureType, row.Index);
  207.         end
  208.     end
  209.  
  210.     for sAnimalType, tAnimalData in pairs(tWildAnimals) do
  211.         tAnimalData ['tInvalidFeatures'] = {};
  212.  
  213.         for iImpassableFeature, _ in pairs(tImpassableFeatures) do
  214.             tAnimalData ['tInvalidFeatures'][iImpassableFeature] = true;
  215.             -- print( sAnimalType, 'Impassable Feature', GameInfo.Features[iImpassableFeature].FeatureType);
  216.         end
  217.  
  218.         if tAnimalData['tInvalidFeatureNames'] then
  219.             for _, sInvalidFeature in pairs(tAnimalData['tInvalidFeatureNames']) do
  220.                 local iFeature = GameInfo.Features[sInvalidFeature].Index;
  221.                 tAnimalData ['tInvalidFeatures'][iFeature] = true;
  222.                 -- print( sAnimalType, 'Invalid Feature', sInvalidFeature);
  223.             end
  224.         end
  225.     end
  226.  
  227.     for sAnimalType, tAnimalData in pairs(tWildAnimals) do
  228.         tAnimalData['iType'] = GameInfo.Units[sAnimalType].Index;
  229.         tAnimalData['tValidPlots'] = {};
  230.  
  231.         for iPlotIndex = 0, Map.GetPlotCount() - 1 do
  232.  
  233.             local pPlot = Map.GetPlotByIndex(iPlotIndex);
  234.  
  235.             for _, sValidTerrain in pairs(tAnimalData['tValidTerrainNames']) do
  236.                 local iTerrainType = pPlot:GetTerrainType();
  237.  
  238.                 if sValidTerrain == GameInfo.Terrains[iTerrainType].TerrainType then
  239.                     -- dont spawn sea animals trapped in ice
  240.                     if pPlot:IsWater() and pPlot:GetArea():GetPlotCount() < 22 then
  241.  
  242.                     elseif not pPlot:IsLake() then
  243.                         tAnimalData['tValidPlots'][pPlot] = true;
  244.                     end
  245.                     break; -- found valid terrain
  246.                 end
  247.             end
  248.         end
  249.     end
  250. end
  251. Events.LoadScreenClose.Add(Initialize);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement