From cf993d4be989836d4647c8a60b3d5977fc4398cd Mon Sep 17 00:00:00 2001 From: Hennik Hunsaker Date: Sun, 12 May 2024 21:01:49 -0600 Subject: [PATCH] More tests and a slight refactor to improve the algorithm --- src/gremlin.lua | 23 ++++++++++++++--------- src/waves.lua | 2 +- test/gremlin.lua | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/gremlin.lua b/src/gremlin.lua index f6c89df..06a5729 100644 --- a/src/gremlin.lua +++ b/src/gremlin.lua @@ -522,19 +522,24 @@ Gremlin = { return tbl1 end, - spawnPoints = function(_angle, _scatterRadius, _counter) + --- 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 _counter == nil or _counter < 1 then - _counter = 0 - end - if type(_scatterRadius) == 'table' then - _xOffset = math.cos(_angle) * math.random(_scatterRadius.min, _scatterRadius.max) * _counter - _yOffset = math.sin(_angle) * math.random(_scatterRadius.min, _scatterRadius.max) * _counter + 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 - _xOffset = math.cos(_angle) * math.random(_scatterRadius) * _counter - _yOffset = math.sin(_angle) * math.random(_scatterRadius) * _counter + local _realRadius = _scatterRadius * math.sqrt(math.random()) + _xOffset = math.cos(_angle) * _realRadius + _yOffset = math.sin(_angle) * _realRadius end return _xOffset, _yOffset diff --git a/src/waves.lua b/src/waves.lua index 936f1fb..4a9a16a 100644 --- a/src/waves.lua +++ b/src/waves.lua @@ -71,7 +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, _yOffset = Gremlin.utils.spawnPoints(_angle, _groupData.scatter, #_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, }