Files
starruler-linux/maps/Rings/RingsMap.as
T
2018-07-17 14:15:37 +02:00

88 lines
2.3 KiB
ActionScript

#include "include/map.as"
#section server
import util.map_util;
#section all
enum MapSetting {
M_SystemCount,
M_SystemSpacing,
M_Flatten,
};
class RingsMap : Map {
RingsMap() {
super();
name = locale::RINGS_MAP;
description = locale::RINGS_MAP_DESC;
dlc = "Heralds";
sortIndex = -110;
color = 0xffd73cff;
icon = "maps/Rings/rings.png";
}
#section client
void makeSettings() {
Number(locale::SYSTEM_COUNT, M_SystemCount, DEFAULT_SYSTEM_COUNT, decimals=0, step=10, min=6, halfWidth=true);
Number(locale::SYSTEM_SPACING, M_SystemSpacing, DEFAULT_SPACING, decimals=0, step=1000, min=MIN_SPACING, halfWidth=true);
Toggle(locale::FLATTEN, M_Flatten, false, halfWidth=true);
}
#section server
void placeSystems() {
RegionMap regionGroup;
uint systemCount = uint(getSetting(M_SystemCount, DEFAULT_SYSTEM_COUNT));
double spacing = modSpacing(getSetting(M_SystemSpacing, DEFAULT_SPACING));
bool flatten = getSetting(M_Flatten, 0.0) != 0.0;
uint ringCount = max(floor(pow(double(systemCount), 0.33)), 1.0);
uint sysPerRing = ceil(double(systemCount) / double(ringCount));
double baseRadius = (sysPerRing * spacing * 1.2) / twopi;
vec3d ringPos;
double ringRadius;
vec3d ringAxis = vec3d_up();
for(uint i = 0; i < ringCount; ++i) {
if(i == 0) {
ringPos = vec3d(0.0, 0.0, 0.0);
ringRadius = randomd(0.9, 1.5) * baseRadius;
}
else {
//Start somewhere random on the previous ring
ringPos += quaterniond_fromAxisAngle(ringAxis, randomd(0, twopi)) * vec3d(ringRadius, 0.0, 0.0);
ringRadius = randomd(0.9, 1.5) * baseRadius;
if(!flatten)
ringAxis = quaterniond_fromAxisAngle(vec3d_right(), randomd(-0.2*pi, 0.2*pi)) * quaterniond_fromAxisAngle(vec3d_front(), randomd(-0.2*pi, 0.2*pi)) * vec3d_up();
}
double angleStep = twopi / double(sysPerRing);
double angle = randomd(0, angleStep);
for(uint n = 0; n < sysPerRing; ++n) {
vec3d sysPos = ringPos;
sysPos += quaterniond_fromAxisAngle(ringAxis, angle) * vec3d(ringRadius, 0.0, 0.0);
vec3d flatPos = sysPos;
flatPos.y = 0;
if(regionGroup.findRegion(flatPos) !is null) {
angle += angleStep;
continue;
}
auto@ sys = addSystem(sysPos);
regionGroup.addSystem(flatPos, spacing * 0.8);
angle += angleStep;
}
}
move(vec3d() - getAveragePosition());
}
#section all
};