Index: ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json =================================================================== --- ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json +++ ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json @@ -36,6 +36,7 @@ { "nick": "ArnH", "name": "Arno Hemelhof" }, { "nick": "Aurium", "name": "Aurélio Heckert" }, { "nick": "badmadblacksad", "name": "Martin F" }, + { "nick": "badosu", "name": "Amadeus Folego" }, { "nick": "bb", "name": "Bouke Jansen" }, { "nick": "Ben", "name": "Ben Vinegar" }, { "nick": "Bird" }, Index: ps/trunk/binaries/data/mods/public/maps/random/rmgen/placer/centered/DiskPlacer.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmgen/placer/centered/DiskPlacer.js +++ ps/trunk/binaries/data/mods/public/maps/random/rmgen/placer/centered/DiskPlacer.js @@ -4,6 +4,7 @@ function DiskPlacer(radius, centerPosition = undefined) { this.radiusSquared = Math.square(radius); + this.radius = radius; this.centerPosition = undefined; if (centerPosition) @@ -19,12 +20,17 @@ { let points = []; - for (let x = 0; x < g_Map.getSize(); ++x) - for (let y = 0; y < g_Map.getSize(); ++y) + const xMin = Math.floor(Math.max(0, this.centerPosition.x - this.radius)); + const yMin = Math.floor(Math.max(0, this.centerPosition.y - this.radius)); + const xMax = Math.ceil(Math.min(g_Map.getSize() - 1, this.centerPosition.x + this.radius)); + const yMax = Math.ceil(Math.min(g_Map.getSize() - 1, this.centerPosition.y + this.radius)); + + let it = new Vector2D(); + for (it.x = xMin; it.x <= xMax; ++it.x) + for (it.y = yMin; it.y <= yMax; ++it.y) { - let point = new Vector2D(x, y); - if (this.centerPosition.distanceToSquared(point) <= this.radiusSquared && constraint.allows(point)) - points.push(point); + if (this.centerPosition.distanceToSquared(it) <= this.radiusSquared && constraint.allows(it)) + points.push(it.clone()); } return points; Index: ps/trunk/binaries/data/mods/public/maps/random/tests/test_DiskPlacer.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/tests/test_DiskPlacer.js +++ ps/trunk/binaries/data/mods/public/maps/random/tests/test_DiskPlacer.js @@ -0,0 +1,63 @@ +Engine.LoadLibrary("rmgen"); + +{ + var g_MapSettings = { "Size": 512 }; + var g_Map = new RandomMap(0, 0, "blackness"); + let center = new Vector2D(10, 10); + let area = createArea(new DiskPlacer(3, center)); + + // Contains center + TS_ASSERT(area.contains(center)); + + // Contains disk boundaries + TS_ASSERT(area.contains(new Vector2D(10, 13))); + TS_ASSERT(area.contains(new Vector2D(10, 7))); + TS_ASSERT(area.contains(new Vector2D(7, 10))); + TS_ASSERT(area.contains(new Vector2D(13, 10))); + + // Does not contain rectangle vertices + TS_ASSERT(!area.contains(new Vector2D(13, 13))); + TS_ASSERT(!area.contains(new Vector2D(7, 7))); + TS_ASSERT(!area.contains(new Vector2D(13, 7))); + TS_ASSERT(!area.contains(new Vector2D(7, 13))); + + // Does not contain points outside disk range + TS_ASSERT(!area.contains(new Vector2D(10, 14))); + TS_ASSERT(!area.contains(new Vector2D(10, 6))); + TS_ASSERT(!area.contains(new Vector2D(6, 10))); + TS_ASSERT(!area.contains(new Vector2D(14, 10))); + + area = createArea(new DiskPlacer(3, new Vector2D(0, 0))); + + // Does not allow points out of map boundaries + TS_ASSERT(!area.contains(new Vector2D(-1, -1))); + // Contains map edge + TS_ASSERT(area.contains(new Vector2D(0, 0))); +} + +{ + // Contains points outside map disk range on CircularMap + var g_MapSettings = { "Size": 512, "CircularMap": true }; + var g_Map = new RandomMap(0, 0, "blackness"); + var area = createArea(new DiskPlacer(10, new Vector2D(436, 436))); + + TS_ASSERT(area.contains(new Vector2D(438, 438))); + TS_ASSERT(area.contains(new Vector2D(437, 436))); + TS_ASSERT(area.contains(new Vector2D(436, 437))); + TS_ASSERT(area.contains(new Vector2D(435, 435))); + + area = createArea(new DiskPlacer(3, new Vector2D(0, 0))); + // Does not allow points out of map boundaries + TS_ASSERT(!area.contains(new Vector2D(-1, -1))); +} + +{ + var g_MapSettings = { "Size": 320, "CircularMap": true }; + var g_Map = new RandomMap(0, 0, "blackness"); + // Does not error with floating point radius + var area = createArea(new DiskPlacer(86.4, new Vector2D(160, 160))); + // Does not error with extreme out of bounds disk + area = createArea(new DiskPlacer(86.4, new Vector2D(800, 800))); + // Does not error when disk on edge + area = createArea(new DiskPlacer(10, new Vector2D(321, 321))); +}