Editor experimental sector generator

This commit is contained in:
Anuken 2022-01-22 15:06:46 -05:00
parent 97da66cd44
commit fdcc373813
11 changed files with 145 additions and 15 deletions

View File

@ -367,6 +367,9 @@ publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure
publish.error = Error publishing item: {0}
steam.error = Failed to initialize Steam services.\nError: {0}
editor.planet = Planet:
editor.sector = Sector:
editor.seed = Seed:
editor.cliffs = Walls To Cliffs
editor.brush = Brush
editor.openin = Open In Editor
@ -440,6 +443,7 @@ editor.update = Update
editor.randomize = Randomize
editor.apply = Apply
editor.generate = Generate
editor.sectorgenerate = Sector Generate
editor.resize = Resize
editor.loadmap = Load Map
editor.savemap = Save Map

View File

@ -248,6 +248,10 @@ public class World{
}
public void loadSector(Sector sector){
loadSector(sector, 0);
}
public void loadSector(Sector sector, int seedOffset){
setSectorRules(sector);
int size = sector.getSize();
@ -256,7 +260,7 @@ public class World{
sector.preset.generator.generate(tiles);
sector.preset.rules.get(state.rules); //apply extra rules
}else if(sector.planet.generator != null){
sector.planet.generator.generate(tiles, sector);
sector.planet.generator.generate(tiles, sector, seedOffset);
}else{
throw new RuntimeException("Sector " + sector.id + " on planet " + sector.planet.name + " has no generator or preset defined. Provide a planet generator or preset map.");
}

View File

@ -67,6 +67,10 @@ public class MapEditor{
renderer.resize(width(), height());
}
public void updateRenderer(){
renderer.resize(width(), height());
}
public void load(Runnable r){
loading = true;
r.run();

View File

@ -38,6 +38,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
private MapLoadDialog loadDialog;
private MapResizeDialog resizeDialog;
private MapGenerateDialog generateDialog;
private SectorGenerateDialog sectorGenDialog;
private ScrollPane pane;
private BaseDialog menu;
private Table blockSelection;
@ -54,6 +55,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
view = new MapView();
infoDialog = new MapInfoDialog();
generateDialog = new MapGenerateDialog(true);
sectorGenDialog = new SectorGenerateDialog();
menu = new BaseDialog("@menu");
menu.addCloseButton();
@ -161,7 +163,16 @@ public class MapEditorDialog extends Dialog implements Disposable{
menu.cont.row();
}
menu.cont.button("@editor.ingame", Icon.right, this::playtest).padTop(!steam ? -3 : 1).size(swidth * 2f + 10, 60f);
//wip feature
if(experimental){
menu.cont.button("@editor.sectorgenerate", Icon.terrain, () -> {
menu.hide();
sectorGenDialog.show();
}).padTop(!steam ? -3 : 1).size(swidth * 2f + 10, 60f);
menu.cont.row();
}
menu.cont.button("@editor.ingame", Icon.right, this::playtest).padTop(!steam && !experimental ? -3 : 1).size(swidth * 2f + 10, 60f);
menu.cont.row();

View File

@ -0,0 +1,98 @@
package mindustry.editor;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.ui.dialogs.*;
import static mindustry.Vars.*;
public class SectorGenerateDialog extends BaseDialog{
Planet planet = Planets.erekir;
int sector = 0, seed = 0;
public SectorGenerateDialog(){
super("@editor.sectorgenerate");
setup();
}
void setup(){
cont.clear();
buttons.clear();
addCloseButton();
cont.defaults().left();
cont.add("@editor.planet").padRight(10f);
cont.button(planet.localizedName, () -> {
BaseDialog dialog = new BaseDialog("");
dialog.cont.pane(p -> {
p.background(Tex.button).margin(10f);
int i = 0;
for(var plan : content.planets()){
if(plan.generator == null || plan.sectors.size == 0) continue;
p.button(plan.localizedName, Styles.clearTogglet, () -> {
planet = plan;
sector = Math.min(sector, planet.sectors.size - 1);
seed = 0;
dialog.hide();
}).size(110f, 45f).checked(planet == plan);
if(++i % 4 == 0){
p.row();
}
}
});
dialog.setFillParent(false);
dialog.addCloseButton();
dialog.show();
}).size(200f, 40f).get().getLabel().setText(() -> planet.localizedName);
cont.row();
cont.add("@editor.sector").padRight(10f);
cont.field(sector + "", text -> {
sector = Strings.parseInt(text);
}).width(200f).valid(text -> planet.sectors.size > Strings.parseInt(text, 99999));
cont.row();
cont.add("@editor.seed").padRight(10f);
cont.field(seed + "", text -> {
seed = Strings.parseInt(text);
}).width(200f).valid(Strings::canParseInt);
cont.row();
cont.label(() -> "[ " + planet.sectors.get(sector).getSize() + "x" + planet.sectors.get(sector).getSize() + " ]").color(Pal.accent).center().labelAlign(Align.center).padTop(5).colspan(2);
buttons.button("@editor.apply", Icon.ok, () -> {
ui.loadAnd(() -> {
apply();
hide();
});
});
}
void apply(){
ui.loadAnd(() -> {
editor.clearOp();
editor.load(() -> {
world.loadSector(planet.sectors.get(sector), seed);
editor.updateRenderer();
state.rules.sector = null;
//clear extra filters
editor.tags.put("genfilters", "{}");
});
});
}
}

View File

@ -408,7 +408,7 @@ public abstract class BasicGenerator implements WorldGenerator{
if(cx*cx + cy*cy <= r2){
Tile other = tiles.get(tile.x + cx, tile.y + cy);
if(other != null){
if(other != null && other.floor() != floor){
other.setFloor(dest);
}
}

View File

@ -30,10 +30,10 @@ public class BlankPlanetGenerator extends PlanetGenerator{
}
@Override
public void generate(Tiles tiles, Sector sec){
public void generate(Tiles tiles, Sector sec, int seed){
this.tiles = tiles;
this.sector = sec;
this.rand.setSeed(sec.id);
this.rand.setSeed(sec.id + seed + baseSeed);
tiles.fill();

View File

@ -16,6 +16,9 @@ import mindustry.world.*;
import static mindustry.Vars.*;
public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{
public int baseSeed = 0;
public int seed = 0;
protected IntSeq ints = new IntSeq();
protected Sector sector;
@ -128,10 +131,11 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
return res % 2 == 0 ? res : res + 1;
}
public void generate(Tiles tiles, Sector sec){
public void generate(Tiles tiles, Sector sec, int seed){
this.tiles = tiles;
this.seed = seed + baseSeed;
this.sector = sec;
this.rand.setSeed(sec.id);
this.rand.setSeed(sec.id + seed + baseSeed);
TileGen gen = new TileGen();
tiles.each((x, y) -> {

View File

@ -18,8 +18,6 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class ErekirPlanetGenerator extends PlanetGenerator{
static final int seed = 2;
public float scl = 2f;
public float heightScl = 0.9f, octaves = 8, persistence = 0.7f, heightPow = 3f, heightMult = 1.6f;
@ -30,6 +28,10 @@ public class ErekirPlanetGenerator extends PlanetGenerator{
//{Blocks.regolith, Blocks.regolith, Blocks.yellowStone, Blocks.crystallineStone, Blocks.carbonStone}
};
{
baseSeed = 2;
}
@Override
public void generateSector(Sector sector){
//no bases right now
@ -96,11 +98,11 @@ public class ErekirPlanetGenerator extends PlanetGenerator{
tile.block = tile.floor.asFloor().wall;
if(Ridged.noise3d(1, position.x, position.y, position.z, 2, 14) > 0.14){
if(Ridged.noise3d(seed + 1, position.x, position.y, position.z, 2, 14) > 0.14){
tile.block = Blocks.air;
}
if(Ridged.noise3d(2, position.x, position.y + 4f, position.z, 3, 6f) > 0.6){
if(Ridged.noise3d(seed + 2, position.x, position.y + 4f, position.z, 3, 6f) > 0.6){
tile.floor = Blocks.carbonStone;
}
}
@ -257,6 +259,8 @@ public class ErekirPlanetGenerator extends PlanetGenerator{
//}
});
trimDark();
//vents
outer:
for(Tile tile : tiles){

View File

@ -21,7 +21,6 @@ import static mindustry.Vars.*;
public class SerpuloPlanetGenerator extends PlanetGenerator{
//alternate, less direct generation (wip)
public static boolean alt = false;
static final int seed = 0;
BaseGenerator basegen = new BaseGenerator();
float scl = 5f;
@ -120,7 +119,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
tile.floor = getBlock(position);
tile.block = tile.floor.asFloor().wall;
if(Ridged.noise3d(1, position.x, position.y, position.z, 2, 22) > 0.31){
if(Ridged.noise3d(seed + 1, position.x, position.y, position.z, 2, 22) > 0.31){
tile.block = Blocks.air;
}
}

View File

@ -16,14 +16,16 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class TantrosPlanetGenerator extends PlanetGenerator{
static final int seed = 1;
Color c1 = Color.valueOf("5057a6"), c2 = Color.valueOf("272766"), out = new Color();
Block[][] arr = {
{Blocks.redmat, Blocks.redmat, Blocks.darksand, Blocks.bluemat, Blocks.bluemat}
};
{
baseSeed = 1;
}
@Override
public void generateSector(Sector sector){
//no bases