diff --git a/src/evac.lua b/src/evac.lua index dac99a9..984d1ec 100644 --- a/src/evac.lua +++ b/src/evac.lua @@ -1645,8 +1645,7 @@ Evac._internal.utils = { local _angle = math.atan2(_point.z, _point.x) for _i, _unit in pairs(_units) do - local _xOffset = math.cos(_angle) * math.random(_scatterRadius) - local _yOffset = math.sin(_angle) * math.random(_scatterRadius) + local _xOffset, _yOffset = Gremlin.utils.spawnPoints(_angle, _scatterRadius) _unitsOut[_i] = { type = typeTranslation[_side][_unit.type], diff --git a/src/gremlin.lua b/src/gremlin.lua index 27a9afa..06a5729 100644 --- a/src/gremlin.lua +++ b/src/gremlin.lua @@ -521,7 +521,29 @@ Gremlin = { end return tbl1 - end + end, + --- Calculate the positions of units to spawn. + -- + -- @function Gremlin.utlis.spawnPoints + -- @tparam number _angle + -- @tparam number|table _scatterRadius + -- @tparam number _counter + -- @treturn number, number + spawnPoints = function(_angle, _scatterRadius) + local _xOffset, _yOffset + + if type(_scatterRadius) == 'table' then + local _realRadius = math.min(math.max(_scatterRadius.max * math.sqrt(math.random()), _scatterRadius.min), _scatterRadius.max) + _xOffset = math.cos(_angle) * _realRadius + _yOffset = math.sin(_angle) * _realRadius + else + local _realRadius = _scatterRadius * math.sqrt(math.random()) + _xOffset = math.cos(_angle) * _realRadius + _yOffset = math.sin(_angle) * _realRadius + end + + return _xOffset, _yOffset + end, }, -- Internal State diff --git a/src/waves.lua b/src/waves.lua index 3f1e3be..4a9a16a 100644 --- a/src/waves.lua +++ b/src/waves.lua @@ -71,8 +71,7 @@ Waves._internal.spawnWave = function(_name, _wave) local _units = {} for _unitType, _unitCount in pairs(_groupData.units) do for i = 1, _unitCount do - local _xOffset = math.cos(_angle) * math.random(_groupData.scatter.min, _groupData.scatter.max) * #_units - local _yOffset = math.sin(_angle) * math.random(_groupData.scatter.min, _groupData.scatter.max) * #_units + local _xOffset, _yOffset = Gremlin.utils.spawnPoints(_angle, _groupData.scatter) table.insert(_units, { type = _unitType, diff --git a/test/gremlin.lua b/test/gremlin.lua index df785bd..ed672d8 100644 --- a/test/gremlin.lua +++ b/test/gremlin.lua @@ -653,5 +653,25 @@ TestGremlinUtils = { -- SIDE EFFECTS -- N/A? end, + testSpawnPointsNumber = function() + -- INIT + -- N/A? + + -- TEST + lu.assertAlmostEquals({ Gremlin.utils.spawnPoints(0.25 * math.pi, 50) }, { 0, 0 }, 50) + + -- SIDE EFFECTS + -- N/A? + end, + testSpawnPointsTable = function() + -- INIT + -- N/A? + + -- TEST + lu.assertAlmostEquals({ Gremlin.utils.spawnPoints(0.25 * math.pi, { min = 25, max = 50 }) }, { 0, 0 }, 50) + + -- SIDE EFFECTS + -- N/A? + end, tearDown = tearDown, }