Files
2018-07-17 14:15:37 +02:00

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
}