Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
#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
|
||||
}
|
||||
Reference in New Issue
Block a user