126 lines
3.6 KiB
ActionScript 3
126 lines
3.6 KiB
ActionScript 3
#include "include/map.as"
|
|
|
|
enum MapSetting {
|
|
M_SystemCount,
|
|
M_SystemSpacing,
|
|
M_Flatten,
|
|
M_Mirror,
|
|
};
|
|
|
|
class DumbbellMap : Map {
|
|
DumbbellMap() {
|
|
super();
|
|
|
|
name = locale::DUMBBELL_MAP;
|
|
description = locale::DUMBBELL_MAP_DESC;
|
|
|
|
sortIndex = -100;
|
|
|
|
color = 0xd252ffff;
|
|
icon = "maps/Dumbbell/dumbbell.png";
|
|
}
|
|
|
|
#section client
|
|
void makeSettings() {
|
|
Number(locale::SYSTEM_COUNT, M_SystemCount, DEFAULT_SYSTEM_COUNT, decimals=0, step=10, min=10, 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);
|
|
Toggle(locale::PERFECT_MIRROR, M_Mirror, false, halfWidth=true, tooltip=locale::TT_PERFECT_MIRROR);
|
|
}
|
|
|
|
#section server
|
|
void placeSystems() {
|
|
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;
|
|
bool mirror = getSetting(M_Mirror, 0.0) != 0.0;
|
|
|
|
//Calculate values
|
|
double bellSystems = ceil(double(systemCount) * 0.43);
|
|
double bellRadius = sqrt(bellSystems) * spacing * 0.5;
|
|
|
|
//Make left bell
|
|
genBell(vec3d(0, 0, -bellRadius*3.0), bellRadius, bellSystems);
|
|
genCorridor(vec3d(0, 0, -bellRadius*2.0+spacing*0.75), vec3d(0, 0, -spacing), ceil(double(systemCount) * 0.07));
|
|
|
|
if(!mirror) {
|
|
//Make right bell
|
|
genBell(vec3d(0, 0, bellRadius*3.0), bellRadius, bellSystems);
|
|
genCorridor(vec3d(0, 0, 0), vec3d(0, 0, bellRadius*2.0-spacing*0.75), ceil(double(systemCount) * 0.07));
|
|
}
|
|
else {
|
|
//Create empty systems opposite every generated system
|
|
for(uint i = 0, cnt = systemData.length; i < cnt; ++i) {
|
|
auto@ other = systemData[i];
|
|
vec3d pos = other.position;
|
|
pos.z = -pos.z;
|
|
|
|
auto@ sys = addSystem(pos, mirrorSystem = other);
|
|
|
|
if(possibleHomeworlds.find(other) != -1)
|
|
addPossibleHomeworld(sys);
|
|
}
|
|
|
|
genCorridor(vec3d(0, 0, 0), vec3d(0, 0, 0), ceil(double(systemCount) * 0.07), quality=500);
|
|
}
|
|
}
|
|
|
|
void genBell(vec3d around, double radius, uint systemCount) {
|
|
double spacing = modSpacing(getSetting(M_SystemSpacing, DEFAULT_SPACING));
|
|
bool flatten = getSetting(M_Flatten, 0.0) != 0.0;
|
|
|
|
Poisson2D gen;
|
|
gen.circleRadius = radius;
|
|
gen.generate(radius*2.0, radius*2.0, spacing);
|
|
|
|
SystemData@ centerMost;
|
|
double centerDist = INFINITY;
|
|
for(uint i = 0, cnt = min(gen.length, systemCount); i < cnt; ++i) {
|
|
vec3d pos = around;
|
|
vec2d offset = gen[i] - vec2d(radius, radius);
|
|
pos.x += offset.x;
|
|
pos.z += offset.y;
|
|
if(!flatten)
|
|
pos.y += randomd(-spacing * 0.3, spacing * 0.3);
|
|
|
|
auto@ sys = addSystem(pos);
|
|
|
|
double d = offset.length;
|
|
if(d < centerDist) {
|
|
@centerMost = sys;
|
|
centerDist = d;
|
|
}
|
|
}
|
|
|
|
addPossibleHomeworld(centerMost);
|
|
}
|
|
|
|
void genCorridor(vec3d origin, vec3d dest, uint systemWidth, int quality = 0) {
|
|
double spacing = modSpacing(getSetting(M_SystemSpacing, DEFAULT_SPACING));
|
|
bool flatten = getSetting(M_Flatten, 0.0) != 0.0;
|
|
|
|
double wstep = 1.0 / ceil(sqrt(double(systemWidth)) / 0.75);
|
|
if(origin.distanceTo(dest) < spacing)
|
|
wstep = 1.1;
|
|
else
|
|
wstep = max(wstep, 1.0 / max(floor(dest.distanceTo(origin) / spacing), 1.0));
|
|
uint height = ceil(sqrt(double(systemWidth) * 0.75));
|
|
double w = 0.0;
|
|
while(w <= 1.0) {
|
|
vec3d pos = origin + (dest-origin)*w;
|
|
pos.x -= randomd(0.8, 1.5) * spacing * (double(height-1)/2);
|
|
|
|
for(uint n = 0; n < height; ++n) {
|
|
vec3d sysPos = pos;
|
|
if(!flatten)
|
|
sysPos.y += randomd(-spacing * 0.3, spacing * 0.3);
|
|
addSystem(sysPos, quality=quality);
|
|
pos.x += randomd(0.8, 1.5) * spacing;
|
|
}
|
|
|
|
w += wstep;
|
|
}
|
|
}
|
|
#section all
|
|
}
|