From 024f2d62e2b15aa68ae4d8ca9572f75cebfc5922 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 14 Feb 2020 20:08:07 -0500 Subject: [PATCH] Planet sector metadata --- .../annotations/impl/AssetsProcess.java | 4 +- build.gradle | 2 +- core/assets/planets/TODO.dat | Bin 0 -> 13821 bytes core/src/mindustry/game/Stats.java | 2 +- .../maps/generators/MapGenerator.java | 2 +- .../maps/planet/TestPlanetGenerator.java | 1 - core/src/mindustry/mod/ContentParser.java | 2 +- core/src/mindustry/mod/ModLoadingSound.java | 2 +- core/src/mindustry/type/Planet.java | 22 ++++- core/src/mindustry/type/Sector.java | 51 ++++++++-- tools/build.gradle | 7 ++ .../mindustry/tools/SectorDataGenerator.java | 93 ++++++++++++++++++ 12 files changed, 173 insertions(+), 15 deletions(-) create mode 100644 core/assets/planets/TODO.dat create mode 100644 tools/src/mindustry/tools/SectorDataGenerator.java diff --git a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java index 2ace8d96b9..fc83ce3e3b 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java @@ -114,11 +114,11 @@ public class AssetsProcess extends BaseProcessor{ dispose.addStatement("arc.Core.assets.unload(" + filename + ")"); dispose.addStatement(name + " = null"); - type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); + type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); }); if(classname.equals("Sounds")){ - type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); + type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); } type.addMethod(loadBegin.build()); diff --git a/build.gradle b/build.gradle index 8aa9762606..2b00a2ab94 100644 --- a/build.gradle +++ b/build.gradle @@ -298,7 +298,7 @@ project(":tools"){ compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" compile "org.reflections:reflections:0.9.12" - compile arcModule("backends:backend-sdl") + compile arcModule("backends:backend-headless") } } diff --git a/core/assets/planets/TODO.dat b/core/assets/planets/TODO.dat new file mode 100644 index 0000000000000000000000000000000000000000..143e63ffb97c223f9a9f970122311c710bd0811c GIT binary patch literal 13821 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 obtainable = Array.with(zone.resources).select(i -> i instanceof Item && ((Item)i).type == ItemType.material).as(Item.class); + Array obtainable = Array.with(zone.data.resources).select(i -> i instanceof Item && ((Item)i).type == ItemType.material).as(Item.class); for(Item item : obtainable){ frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; } diff --git a/core/src/mindustry/maps/generators/MapGenerator.java b/core/src/mindustry/maps/generators/MapGenerator.java index d85501faf6..54e5469bc1 100644 --- a/core/src/mindustry/maps/generators/MapGenerator.java +++ b/core/src/mindustry/maps/generators/MapGenerator.java @@ -49,7 +49,7 @@ public class MapGenerator extends Generator{ for(Tile tile : tiles){ if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && world.getSector() != null){ - for(Content content : world.getSector().resources){ + for(Content content : world.getSector().data.resources){ if(content instanceof Item && Mathf.chance(0.3)){ tile.entity.items().add((Item)content, Math.min(Mathf.random(500), tile.block().itemCapacity)); } diff --git a/core/src/mindustry/maps/planet/TestPlanetGenerator.java b/core/src/mindustry/maps/planet/TestPlanetGenerator.java index 3bd9d3293d..0e307c107b 100644 --- a/core/src/mindustry/maps/planet/TestPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/TestPlanetGenerator.java @@ -65,7 +65,6 @@ public class TestPlanetGenerator implements PlanetGenerator{ height *= 1.2f; height = Mathf.clamp(height); - return arr[Mathf.clamp((int)(temp * arr.length), 0, arr.length - 1)][Mathf.clamp((int)(height * arr[0].length), 0, arr[0].length - 1)]; } } diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index fc11b1ba59..1b7a179a48 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -3,10 +3,10 @@ package mindustry.mod; import arc.*; import arc.assets.*; import arc.audio.*; -import arc.audio.mock.*; import arc.files.*; import arc.func.*; import arc.graphics.*; +import arc.mock.MockSound; import arc.struct.Array; import arc.struct.*; import arc.util.ArcAnnotate.*; diff --git a/core/src/mindustry/mod/ModLoadingSound.java b/core/src/mindustry/mod/ModLoadingSound.java index 558b29ce28..0b1197eb02 100644 --- a/core/src/mindustry/mod/ModLoadingSound.java +++ b/core/src/mindustry/mod/ModLoadingSound.java @@ -1,8 +1,8 @@ package mindustry.mod; import arc.audio.*; -import arc.audio.mock.*; import arc.math.geom.*; +import arc.mock.MockSound; import arc.util.ArcAnnotate.*; public class ModLoadingSound implements Sound{ diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index f81af07d6a..0fb7698674 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -1,14 +1,18 @@ package mindustry.type; +import arc.files.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; +import arc.util.io.*; +import mindustry.*; import mindustry.ctype.*; import mindustry.graphics.*; import mindustry.graphics.PlanetGrid.*; import mindustry.maps.planet.*; +import mindustry.type.Sector.*; public class Planet extends UnlockableContent{ /** Mesh used for rendering. Created on load() - will be null on the server! */ @@ -32,9 +36,25 @@ public class Planet extends UnlockableContent{ this.size = 3; grid = PlanetGrid.newGrid(size); + sectors = new Array<>(grid.tiles.length); for(int i = 0; i < grid.tiles.length; i++){ - sectors.add(new Sector(this, grid.tiles[i])); + //TODO load sector data + sectors.add(new Sector(this, grid.tiles[i], new SectorData())); + } + + //read data + Fi data = Vars.tree.get("planets/" + name + ".dat"); + if(data.exists()){ + try(Reads read = data.reads()){ + short dsize = read.s(); + for(int i = 0; i < dsize; i++){ + sectors.get(i).data.read(read); + } + } + }else{ + //TODO crash instead - this is a critical error! + Log.err("Planet {0} is missing its data file."); } } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 91401c859e..2bb9169a3d 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -2,10 +2,11 @@ package mindustry.type; import arc.math.geom.*; import arc.util.*; +import arc.util.io.*; +import mindustry.*; import mindustry.ctype.*; import mindustry.graphics.PlanetGrid.*; - -import static mindustry.Vars.state; +import mindustry.world.*; /** A small section of a planet. */ public class Sector{ @@ -14,16 +15,16 @@ public class Sector{ public final Ptile tile; public final int id; - //TODO generate a class file with 2D arrays of resources for each sector for each planet - public final Content[] resources = {}; + public final SectorData data; //TODO implement a dynamic (?) launch period public int launchPeriod = 10; - public Sector(Planet planet, Ptile tile){ + public Sector(Planet planet, Ptile tile, SectorData data){ this.planet = planet; this.tile = tile; this.rect = makeRect(); this.id = tile.id; + this.data = data; } //TODO implement @@ -31,7 +32,6 @@ public class Sector{ return metCondition() && wave % launchPeriod == 0; } - public boolean metCondition(){ //TODO implement return false; @@ -83,4 +83,43 @@ public class Sector{ return result.set(center).add(right, nx).add(top, ny); } } + + /** Cached data about a sector. */ + public static class SectorData{ + public Content[] resources = {}; + public int spawnX, spawnY; + + public Block[] floors = {}; + public int[] floorCounts = {}; + + public void write(Writes write){ + write.s(resources.length); + for(Content resource : resources){ + write.b(resource.getContentType().ordinal()); + write.s(resource.id); + } + write.s(spawnX); + write.s(spawnY); + write.s(floors.length); + for(int i = 0; i < floors.length; i++){ + write.s(floors[i].id); + write.i(floorCounts[i]); + } + } + + public void read(Reads read){ + resources = new Content[read.s()]; + for(int i = 0; i < resources.length; i++){ + resources[i] = Vars.content.getByID(ContentType.all[read.b()], read.s()); + } + spawnX = read.s(); + spawnY = read.s(); + floors = new Block[read.s()]; + floorCounts = new int[floors.length]; + for(int i = 0; i < floors.length; i++){ + floors[i] = Vars.content.block(read.s()); + floorCounts[i] = read.i(); + } + } + } } diff --git a/tools/build.gradle b/tools/build.gradle index e527ef1e10..726a7acfb2 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -344,6 +344,13 @@ task genSprites(dependsOn: classes, type: JavaExec){ workingDir = genFolder } +task genSectorData(dependsOn: classes, type: JavaExec){ + main = "mindustry.tools.SectorDataGenerator" + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + workingDir = "../core/assets/" +} + task updateBundles(dependsOn: classes, type: JavaExec){ file(genFolder).mkdirs() diff --git a/tools/src/mindustry/tools/SectorDataGenerator.java b/tools/src/mindustry/tools/SectorDataGenerator.java new file mode 100644 index 0000000000..9d21679415 --- /dev/null +++ b/tools/src/mindustry/tools/SectorDataGenerator.java @@ -0,0 +1,93 @@ +package mindustry.tools; + +import arc.*; +import arc.files.*; +import arc.mock.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.net.Net; +import mindustry.type.*; +import mindustry.type.Sector.*; +import mindustry.world.*; + +import static mindustry.Vars.*; + +public class SectorDataGenerator{ + + public static void main(String[] args){ + ArcNativesLoader.load(); + + Core.files = new MockFiles(); + Core.app = new MockApplication(); + Core.settings = new MockSettings(); + + headless = true; + net = new Net(null); + tree = new FileTree(); + Vars.init(); + content.createBaseContent(); + + logic = new Logic(); + netServer = new NetServer(); + world = new World(); + + content.init(); + + for(Planet planet : content.getBy(ContentType.planet)){ + int[] count = {0}; + + Fi fi = Fi.get("planets").child(planet.name + ".dat"); + + Array list = planet.sectors.map(sector -> { + SectorData data = new SectorData(); + + ObjectIntMap floors = new ObjectIntMap<>(); + ObjectSet content = new ObjectSet<>(); + + world.loadSector(sector); + + for(Tile tile : world.tiles){ + Item item = tile.floor().itemDrop; + Liquid liquid = tile.floor().liquidDrop; + if(item != null) content.add(item); + if(liquid != null) content.add(liquid); + + if(!tile.block().isStatic()){ + floors.increment(tile.floor()); + } + } + + //sort counts in descending order + Array> entries = floors.entries().toArray(); + entries.sort(e -> -e.value); + //remove all blocks occuring < 30 times - unimportant + entries.removeAll(e -> e.value < 30); + + data.floors = new Block[entries.size]; + data.floorCounts = new int[entries.size]; + for(int i = 0; i < entries.size; i++){ + data.floorCounts[i] = entries.get(i).value; + data.floors[i] = entries.get(i).key; + } + + data.resources = content.asArray().sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))).toArray(Content.class); + + if(count[0]++ % 5 == 0){ + Log.info("&lyDone with sector &lm{0}/{1}", count[0], planet.sectors.size); + } + + return data; + }); + + //write data + try(Writes write = fi.writes()){ + write.s(list.size); + list.each(s -> s.write(write)); + } + } + } +}