Index: ps/trunk/binaries/data/mods/public/maps/random/jebel_barkal.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/jebel_barkal.js +++ ps/trunk/binaries/data/mods/public/maps/random/jebel_barkal.js @@ -636,7 +636,7 @@ var cityGridAngle = []; for (let y = 0; y < gridPointsY; ++y) [cityGridPosition[y], cityGridAngle[y]] = distributePointsOnCircularSegment( - gridPointsX, gridMaxAngle * gridPointsX / (gridPointsX - 1), gridStartAngle, gridRadius(y), gridCenter); + gridPointsX, gridMaxAngle, gridStartAngle, gridRadius(y), gridCenter); g_Map.log("Marking city path crossings"); for (let y in cityGridPosition) @@ -786,17 +786,20 @@ new ElevationPainter(heightDesert + heightOffsetStatue)); g_Map.log("Placing healers at the ritual place"); -var [healerPosition, healerAngle] = distributePointsOnCircularSegment(scaleByMapSize(2, 10), Math.PI, ritualAngle, scaleByMapSize(2, 3), ritualPosition); +var [healerPosition, healerAngle] = distributePointsOnCircularSegment( + scaleByMapSize(2, 10), Math.PI, ritualAngle, scaleByMapSize(2, 3), ritualPosition); for (let i = 0; i < healerPosition.length; ++i) g_Map.placeEntityPassable(oKushHealer, 0, healerPosition[i], healerAngle[i] + Math.PI); g_Map.log("Placing statues at the ritual place"); -var [statuePosition, statueAngle] = distributePointsOnCircularSegment(scaleByMapSize(4, 8), Math.PI, ritualAngle, scaleByMapSize(3, 4), ritualPosition); +var [statuePosition, statueAngle] = distributePointsOnCircularSegment( + scaleByMapSize(4, 8), Math.PI, ritualAngle, scaleByMapSize(3, 4), ritualPosition); for (let i = 0; i < statuePosition.length; ++i) g_Map.placeEntityPassable(pickRandom(aStatues), 0, statuePosition[i], statueAngle[i] + Math.PI); g_Map.log("Placing palms at the ritual place"); -var [palmPosition, palmAngle] = distributePointsOnCircularSegment(scaleByMapSize(6, 16), Math.PI, ritualAngle, scaleByMapSize(4, 5), ritualPosition); +var [palmPosition, palmAngle] = distributePointsOnCircularSegment( + scaleByMapSize(6, 16), Math.PI, ritualAngle, scaleByMapSize(4, 5), ritualPosition); for (let i = 0; i < palmPosition.length; ++i) if (avoidClasses(clTemple, 1).allows(palmPosition[i])) g_Map.placeEntityPassable(oPalmPath, 0, palmPosition[i], randomAngle()); @@ -852,7 +855,7 @@ g_Map.log("Placing side and back walls"); let wallGridRadiusBack = hillRadius - scaleByMapSize(15, 25); - let wallGridMaxAngleBack = (gridMaxAngle + wallGridMaxAngleSummand) * gridPointsX / (gridPointsX - 1); + let wallGridMaxAngleBack = gridMaxAngle + wallGridMaxAngleSummand; let wallGridPositionFront = distributePointsOnCircularSegment(gridPointsX, wallGridMaxAngleBack, wallGridStartAngle, wallGridRadiusFront, gridCenter)[0]; let wallGridPositionBack = distributePointsOnCircularSegment(gridPointsX, wallGridMaxAngleBack, wallGridStartAngle, wallGridRadiusBack, gridCenter)[0]; let wallGridPosition = [wallGridPositionFront[0], ...wallGridPositionBack, wallGridPositionFront[wallGridPositionFront.length - 1]]; Index: ps/trunk/binaries/data/mods/public/maps/random/rmgen/math.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmgen/math.js +++ ps/trunk/binaries/data/mods/public/maps/random/rmgen/math.js @@ -36,17 +36,21 @@ */ function distributePointsOnCircle(pointCount, startAngle, radius, center) { - return distributePointsOnCircularSegment(pointCount, 2 * Math.PI, startAngle, radius, center); + return distributePointsOnCircularSegment(pointCount, 2 * Math.PI * (pointCount - 1) / pointCount, startAngle, radius, center); } +/** + * Get pointCount points equidistantly located on a circular segment, including both endpoints. + */ function distributePointsOnCircularSegment(pointCount, maxAngle, startAngle, radius, center) { let points = []; let angle = []; + pointCount = Math.round(pointCount); for (let i = 0; i < pointCount; ++i) { - angle[i] = startAngle + maxAngle * i / pointCount; + angle[i] = startAngle + maxAngle * i / Math.max(1, pointCount - 1); points[i] = Vector2D.add(center, new Vector2D(radius, 0).rotate(-angle[i])); }