From fdcc373813ff6218c01f876fe27aec9768a69776 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 22 Jan 2022 15:06:46 -0500 Subject: [PATCH] Editor experimental sector generator --- core/assets/bundles/bundle.properties | 4 + core/src/mindustry/core/World.java | 6 +- core/src/mindustry/editor/MapEditor.java | 4 + .../src/mindustry/editor/MapEditorDialog.java | 13 ++- .../editor/SectorGenerateDialog.java | 98 +++++++++++++++++++ .../maps/generators/BasicGenerator.java | 2 +- .../maps/generators/BlankPlanetGenerator.java | 4 +- .../maps/generators/PlanetGenerator.java | 8 +- .../maps/planet/ErekirPlanetGenerator.java | 12 ++- .../maps/planet/SerpuloPlanetGenerator.java | 3 +- .../maps/planet/TantrosPlanetGenerator.java | 6 +- 11 files changed, 145 insertions(+), 15 deletions(-) create mode 100644 core/src/mindustry/editor/SectorGenerateDialog.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index deadde3775..42255737bb 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -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 diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 3ed20d4681..937de8ec0c 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -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."); } diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index 497f70aa41..768e1dd013 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -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(); diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 4b0fc6b8fa..17f2bf15d7 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -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(); diff --git a/core/src/mindustry/editor/SectorGenerateDialog.java b/core/src/mindustry/editor/SectorGenerateDialog.java new file mode 100644 index 0000000000..f0f80f1797 --- /dev/null +++ b/core/src/mindustry/editor/SectorGenerateDialog.java @@ -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", "{}"); + }); + }); + } +} diff --git a/core/src/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java index 4fcbbacb5b..73fb451d14 100644 --- a/core/src/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -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); } } diff --git a/core/src/mindustry/maps/generators/BlankPlanetGenerator.java b/core/src/mindustry/maps/generators/BlankPlanetGenerator.java index 6e46fa95d0..1b8a4dc9ca 100644 --- a/core/src/mindustry/maps/generators/BlankPlanetGenerator.java +++ b/core/src/mindustry/maps/generators/BlankPlanetGenerator.java @@ -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(); diff --git a/core/src/mindustry/maps/generators/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 806c04d70c..55f2159ea1 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -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) -> { diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index 7d0aeaa6d3..6d8f2c522e 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -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){ diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index c61756580d..e56828db12 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -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; } } diff --git a/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java b/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java index d6ca0cb931..e2b5d3309b 100644 --- a/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java @@ -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