1
0
mirror of https://github.com/veden/Rampant.git synced 2025-01-28 03:29:34 +02:00
Rampant/libs/UnitGroupUtils.lua

169 lines
5.2 KiB
Lua
Raw Normal View History

2022-01-14 14:08:58 -08:00
-- Copyright (C) 2022 veden
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <https://www.gnu.org/licenses/>.
2019-02-15 20:17:30 -08:00
if unitGroupUtilsG then
return unitGroupUtilsG
end
local unitGroupUtils = {}
-- imports
2018-01-13 21:48:21 -08:00
local mapUtils = require("MapUtils")
2016-08-06 20:38:47 -07:00
local constants = require("Constants")
local chunkPropertyUtils = require("ChunkPropertyUtils")
local mathUtils = require("MathUtils")
-- constants
local MINIMUM_EXPANSION_DISTANCE = constants.MINIMUM_EXPANSION_DISTANCE
local SQUAD_RETREATING = constants.SQUAD_RETREATING
local SQUAD_GUARDING = constants.SQUAD_GUARDING
2018-01-13 21:48:21 -08:00
-- imported functions
local gaussianRandomRangeRG = mathUtils.gaussianRandomRangeRG
local getSquadsOnChunk = chunkPropertyUtils.getSquadsOnChunk
2018-01-13 21:48:21 -08:00
local getNeighborChunks = mapUtils.getNeighborChunks
-- module code
2017-01-19 21:58:36 -08:00
2019-03-09 15:16:35 -08:00
function unitGroupUtils.findNearbyRetreatingSquad(map, chunk)
2019-03-08 16:42:20 -08:00
2020-05-23 20:47:14 -07:00
for _,squad in pairs(getSquadsOnChunk(map, chunk)) do
local unitGroup = squad.group
2020-05-23 20:47:14 -07:00
if (squad.status == SQUAD_RETREATING) and unitGroup and unitGroup.valid then
2019-03-08 16:42:20 -08:00
return squad
end
2018-01-13 21:48:21 -08:00
end
local neighbors = getNeighborChunks(map, chunk.x, chunk.y)
for i=1,#neighbors do
2019-03-08 16:42:20 -08:00
local neighbor = neighbors[i]
2020-05-15 13:51:38 -07:00
if neighbor ~= -1 then
2020-05-23 20:47:14 -07:00
for _,squad in pairs(getSquadsOnChunk(map, neighbor)) do
2019-03-08 16:42:20 -08:00
local unitGroup = squad.group
2020-05-23 20:47:14 -07:00
if (squad.status == SQUAD_RETREATING) and unitGroup and unitGroup.valid then
2019-03-08 16:42:20 -08:00
return squad
end
end
end
end
return nil
end
2019-03-08 16:42:20 -08:00
function unitGroupUtils.findNearbySquad(map, chunk)
2020-05-23 20:47:14 -07:00
for _,squad in pairs(getSquadsOnChunk(map, chunk)) do
2019-03-08 16:42:20 -08:00
local unitGroup = squad.group
2019-10-20 13:45:43 -07:00
if unitGroup and unitGroup.valid then
return squad
2019-03-08 16:42:20 -08:00
end
end
2019-10-20 13:45:43 -07:00
local neighbors = getNeighborChunks(map, chunk.x, chunk.y)
2018-01-13 21:48:21 -08:00
for i=1,#neighbors do
2019-03-08 16:42:20 -08:00
local neighbor = neighbors[i]
2020-05-15 13:51:38 -07:00
if neighbor ~= -1 then
2020-05-23 20:47:14 -07:00
for _,squad in pairs(getSquadsOnChunk(map, neighbor)) do
2019-03-08 16:42:20 -08:00
local unitGroup = squad.group
if unitGroup and unitGroup.valid then
return squad
end
end
end
end
2019-02-10 22:14:17 -08:00
return nil
end
2018-01-13 21:48:21 -08:00
function unitGroupUtils.calculateSettlerMaxDistance(universe)
local targetDistance
local distanceRoll = universe.random()
if distanceRoll < 0.05 then
return 0
elseif distanceRoll < 0.30 then
targetDistance = universe.expansionLowTargetDistance
elseif distanceRoll < 0.70 then
targetDistance = universe.expansionMediumTargetDistance
elseif distanceRoll < 0.95 then
targetDistance = universe.expansionHighTargetDistance
else
return universe.expansionMaxDistance
end
return gaussianRandomRangeRG(targetDistance,
universe.expansionDistanceDeviation,
MINIMUM_EXPANSION_DISTANCE,
universe.expansionMaxDistance,
universe.random)
end
function unitGroupUtils.createSquad(position, map, group, settlers, base)
2021-12-05 19:40:39 -08:00
local unitGroup = group or map.surface.create_unit_group({position=position})
2019-02-10 22:14:17 -08:00
2018-01-13 21:48:21 -08:00
local squad = {
2019-03-08 16:42:20 -08:00
group = unitGroup,
status = SQUAD_GUARDING,
rabid = false,
2020-05-23 21:17:18 -07:00
penalties = {},
base = base,
type = base.stateAI,
2019-03-08 16:42:20 -08:00
frenzy = false,
2021-12-05 19:40:39 -08:00
map = map,
wanders = 0,
2019-02-16 10:45:42 -08:00
settlers = settlers or false,
2019-03-08 16:42:20 -08:00
kamikaze = false,
frenzyPosition = {x = 0,
y = 0},
maxDistance = 0,
2020-05-16 22:06:55 -07:00
groupNumber = unitGroup.group_number,
2019-03-08 22:23:00 -08:00
originPosition = {x = 0,
y = 0},
commandTick = nil,
2020-05-15 13:51:38 -07:00
chunk = -1
2018-01-13 21:48:21 -08:00
}
2019-03-06 22:12:39 -08:00
if settlers then
squad.maxDistance = unitGroupUtils.calculateSettlerMaxDistance(map.universe)
end
2019-03-08 22:23:00 -08:00
if position then
squad.originPosition.x = position.x
squad.originPosition.y = position.y
elseif group then
squad.originPosition.x = group.position.x
squad.originPosition.y = group.position.y
end
2016-08-06 20:38:47 -07:00
return squad
end
function unitGroupUtils.calculateKamikazeSquadThreshold(memberCount, universe)
local threshold = (memberCount / universe.attackWaveMaxSize) * 0.2 + (universe.evolutionLevel * 0.2)
2020-05-23 20:47:14 -07:00
return threshold
end
function unitGroupUtils.calculateKamikazeSettlerThreshold(memberCount, universe)
local threshold = (memberCount / universe.expansionMaxSize) * 0.2 + (universe.evolutionLevel * 0.2)
return threshold
end
2019-02-15 20:17:30 -08:00
unitGroupUtilsG = unitGroupUtils
return unitGroupUtils