Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- local iLocalPlayer = Game:GetLocalPlayer();
- local bGatheringStormEnabled = GameClimate ~= nil;
- local iWildAnimalsPlayer = 63;
- local pAnimalUnits;
- local tWildAnimals = {};
- local iGameStartTurn = Game.GetCurrentGameTurn();
- local pWildAnimalsPlayer;
- local iBarbCamp = GameInfo.Improvements['IMPROVEMENT_BARBARIAN_CAMP'].Index;
- local iGoodyHut = GameInfo.Improvements['IMPROVEMENT_GOODY_HUT'].Index;
- tWildAnimals['UNIT_ANIMAL_KRAKEN'] = {};
- tWildAnimals['UNIT_ANIMAL_KRAKEN']['tValidTerrainNames'] = {'TERRAIN_OCEAN'};
- -- tWildAnimals['UNIT_ANIMAL_KRAKEN']['tInvalidFeatures'] = {};
- tWildAnimals['UNIT_ANIMAL_KRAKEN']['iMinPercentValidPlotsToOccupy'] = 3;
- tWildAnimals['UNIT_ANIMAL_KRAKEN']['iMaxPercentValidPlotsToOccupy'] = 6;
- -- tWildAnimals['UNIT_ANIMAL_KRAKEN']['tValidPlots'] = {};
- tWildAnimals['UNIT_ANIMAL_KRAKEN']['bSpawnInPlayerSight'] = true;
- tWildAnimals['UNIT_ANIMAL_POLARBEAR'] = {};
- tWildAnimals['UNIT_ANIMAL_POLARBEAR']['tValidTerrainNames'] = {'TERRAIN_SNOW', 'TERRAIN_SNOW_HILLS'};
- tWildAnimals['UNIT_ANIMAL_POLARBEAR']['iMinPercentValidPlotsToOccupy'] = 15;
- tWildAnimals['UNIT_ANIMAL_POLARBEAR']['iMaxPercentValidPlotsToOccupy'] = 25;
- tWildAnimals['UNIT_ANIMAL_POLARBEAR']['bSpawnInPlayerSight'] = false;
- tWildAnimals['UNIT_ANIMAL_JACKAL'] = {};
- tWildAnimals['UNIT_ANIMAL_JACKAL']['tValidTerrainNames'] = {'TERRAIN_GRASS', 'TERRAIN_GRASS_HILLS', 'TERRAIN_PLAINS', 'TERRAIN_PLAINS_HILLS'};
- tWildAnimals['UNIT_ANIMAL_JACKAL']['tInvalidFeatureNames'] = {'FEATURE_JUNGLE', 'FEATURE_FOREST'};
- tWildAnimals['UNIT_ANIMAL_JACKAL']['iMinPercentValidPlotsToOccupy'] = 15;
- tWildAnimals['UNIT_ANIMAL_JACKAL']['iMaxPercentValidPlotsToOccupy'] = 25;
- tWildAnimals['UNIT_ANIMAL_JACKAL']['bSpawnInPlayerSight'] = false;
- local function NormalizeToRange(iValue, iOldMin, iOldMax, iNewMin, iNewMax)
- local iOldRange = iOldMax - iOldMin;
- local iNewValue;
- if iOldRange == 0 then
- iNewValue = iNewMin;
- else
- local iNewRange = iNewMax - iNewMin;
- iNewValue = ((iValue - iOldMin) * iNewRange) / iOldRange + iNewMin;
- end
- return math.floor(iNewValue);
- end
- local function Tablelength(T)
- local count = 0;
- for _ in pairs(T) do
- count = count + 1;
- end
- return count;
- end
- local function GetRandomNumber(iMin, iMax)
- return TerrainBuilder.GetRandomNumber(iMax - iMin + 1, "") + iMin;
- end
- local function ShuffleTable(T)
- for i = #T, 2, -1 do
- -- local j = math.random(i);
- local j = GetRandomNumber(1, i);
- T[i], T[j] = T[j], T[i];
- end
- return T;
- end
- local function IsPlotOKtoSpawn(pPlot, tAnimalData)
- -- water level rose
- if bGatheringStormEnabled and TerrainManager.IsSubmerged(pPlot) then
- tAnimalData['tValidPlots'][pPlot] = nil;
- return false;
- end
- if tAnimalData['tInvalidFeatures'][pPlot:GetFeatureType()] then
- return false;
- end
- if tAnimalData['bSpawnInPlayerSight'] == false then
- local iX, iY = pPlot:GetX(),pPlot:GetY();
- for iPlayerID, pPlayer in ipairs(Players) do
- if pPlayer:IsAlive() then
- local pPlayerVis = PlayersVisibility[iPlayerID];
- if pPlayerVis:IsVisible(iX, iY) then
- return false;
- end
- end
- end
- end
- local iImpType = pPlot:GetImprovementType();
- if pPlot:IsOwned() or pPlot:IsUnit() or iImpType == iBarbCamp or iImpType == iGoodyHut then
- return false;
- end
- return true;
- end
- local function GetAnimalCount(sAnimalType)
- local iType = GameInfo.Units[sAnimalType].Index;
- local iCount = 0;
- for i, pUnit in pAnimalUnits:Members() do
- if pUnit:GetType() == iType then
- iCount = iCount + 1;
- end
- end
- return iCount;
- end
- local function SpawnAnimals()
- for sAnimalType, tAnimalData in pairs(tWildAnimals) do
- local tPlotsToSpawn = {};
- local iNumAlive = GetAnimalCount(sAnimalType);
- local iMinToSpawn = NormalizeToRange(tAnimalData['iMinPercentValidPlotsToOccupy'], 0, 100, 0, Tablelength(tAnimalData['tValidPlots']));
- local iMaxToSpawn = NormalizeToRange(tAnimalData['iMaxPercentValidPlotsToOccupy'], 0, 100, 0, Tablelength(tAnimalData['tValidPlots']));
- local iAnimalsToSpawn = GetRandomNumber(iMinToSpawn, iMaxToSpawn);
- print(sAnimalType, 'ALIVE', iNumAlive, 'MIN TO SPAWN', iMinToSpawn, 'MAX TO SPAWN', iMaxToSpawn);
- for pPlot, _ in pairs(tAnimalData['tValidPlots']) do
- if IsPlotOKtoSpawn(pPlot, tAnimalData) then
- table.insert(tPlotsToSpawn, pPlot);
- end
- end
- ShuffleTable(tPlotsToSpawn); -- avoid spawning every animal in the same area
- local iAnimalsSpawned = 0;
- for _, pPlot in pairs(tPlotsToSpawn) do
- if iNumAlive < iAnimalsToSpawn then
- pAnimalUnits:Create(tAnimalData['iType'], pPlot:GetX(), pPlot:GetY());
- -- UnitManager.InitUnit(iWildAnimalsPlayer, sAnimalType, pPlot:GetX(), pPlot:GetY());
- iAnimalsSpawned = iAnimalsSpawned + 1;
- iNumAlive = iNumAlive + 1;
- else
- break;
- end
- end
- print(sAnimalType, 'Spawned this turn', iAnimalsSpawned);
- end
- end
- local function OnPlayerTurnStartComplete ( iPlayerID, someBoolean)
- -- sometimes fires when game loaded !
- if iPlayerID == iWildAnimalsPlayer and iGameStartTurn ~= Game.GetCurrentGameTurn()then
- -- print("____________________________________________");
- -- print("OnPlayerTurnActivated");
- -- print("____________________________________________");
- SpawnAnimals();
- end
- end
- local function Initialize()
- -- print( 'GetStartTurn', GameConfiguration.GetStartTurn());
- GameEvents.PlayerTurnStartComplete.Add( OnPlayerTurnStartComplete);
- for iPlayerID, pPlayer in ipairs(Players) do
- if pPlayer:WasEverAlive() then
- local sCivName = PlayerConfigurations[iPlayerID]:GetCivilizationTypeName();
- print( sCivName, iPlayerID);
- -- free cities units dont move
- -- if sCivName == 'CIVILIZATION_FREE_CITIES' then
- -- iWildAnimalsPlayer = iPlayerID;
- -- break;
- if sCivName == 'CIVILIZATION_BARBARIAN' then
- iWildAnimalsPlayer = iPlayerID;
- end
- end
- end
- -- iWildAnimalsPlayer = 0;
- -- pWildAnimalsPlayer:AttachModifierByID("TRAIT_BARBARIANS_OCEAN");
- pWildAnimalsPlayer = Players[iWildAnimalsPlayer];
- print( 'iWildAnimalsPlayer', iWildAnimalsPlayer);
- -- print( 'bGatheringStormEnabled', bGatheringStormEnabled);
- pAnimalUnits = pWildAnimalsPlayer:GetUnits();
- local tImpassableFeatures = {};
- for row in GameInfo.Features() do
- -- print( 'tImpassableFeatures row.Impassable', row.FeatureType, row.Impassable);
- if row.Impassable == true then
- tImpassableFeatures[row.Index] = true;
- -- print( 'tImpassableFeatures', row.FeatureType, row.Index);
- end
- end
- for sAnimalType, tAnimalData in pairs(tWildAnimals) do
- tAnimalData ['tInvalidFeatures'] = {};
- for iImpassableFeature, _ in pairs(tImpassableFeatures) do
- tAnimalData ['tInvalidFeatures'][iImpassableFeature] = true;
- -- print( sAnimalType, 'Impassable Feature', GameInfo.Features[iImpassableFeature].FeatureType);
- end
- if tAnimalData['tInvalidFeatureNames'] then
- for _, sInvalidFeature in pairs(tAnimalData['tInvalidFeatureNames']) do
- local iFeature = GameInfo.Features[sInvalidFeature].Index;
- tAnimalData ['tInvalidFeatures'][iFeature] = true;
- -- print( sAnimalType, 'Invalid Feature', sInvalidFeature);
- end
- end
- end
- for sAnimalType, tAnimalData in pairs(tWildAnimals) do
- tAnimalData['iType'] = GameInfo.Units[sAnimalType].Index;
- tAnimalData['tValidPlots'] = {};
- for iPlotIndex = 0, Map.GetPlotCount() - 1 do
- local pPlot = Map.GetPlotByIndex(iPlotIndex);
- for _, sValidTerrain in pairs(tAnimalData['tValidTerrainNames']) do
- local iTerrainType = pPlot:GetTerrainType();
- if sValidTerrain == GameInfo.Terrains[iTerrainType].TerrainType then
- -- dont spawn sea animals trapped in ice
- if pPlot:IsWater() and pPlot:GetArea():GetPlotCount() < 22 then
- elseif not pPlot:IsLake() then
- tAnimalData['tValidPlots'][pPlot] = true;
- end
- break; -- found valid terrain
- end
- end
- end
- end
- end
- Events.LoadScreenClose.Add(Initialize);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement