From 2d898c1f9868264b828025525407c606f7dc7c6b Mon Sep 17 00:00:00 2001 From: Acemany Date: Wed, 6 Nov 2024 03:47:59 +0300 Subject: [PATCH] Deleted redundant classes. Commented out ApplicationTests for now --- core/src/mindustryV4/content/Blocks.java | 2 +- core/src/mindustryV4/core/ContentLoader.java | 5 - core/src/mindustryV4/core/Control.java | 4 +- core/src/mindustryV4/core/Logic.java | 8 +- core/src/mindustryV4/core/UI.java | 2 - core/src/mindustryV4/core/World.java | 26 --- core/src/mindustryV4/game/EventType.java | 19 -- core/src/mindustryV4/game/Saves.java | 56 ++--- core/src/mindustryV4/game/Stats.java | 5 +- core/src/mindustryV4/io/versions/Save16.java | 5 - core/src/mindustryV4/type/ContentType.java | 1 - core/src/mindustryV4/type/Zone.java | 172 -------------- .../ui/dialogs/DatabaseDialog.java | 2 +- .../mindustryV4/ui/dialogs/DeployDialog.java | 184 --------------- .../ui/dialogs/GameOverDialog.java | 12 +- .../mindustryV4/ui/dialogs/PausedDialog.java | 26 +-- .../mindustryV4/ui/dialogs/SectorsDialog.java | 16 +- .../ui/dialogs/TechTreeDialog.java | 2 +- .../ui/dialogs/ZoneInfoDialog.java | 221 ------------------ .../mindustryV4/ui/fragments/HudFragment.java | 7 +- .../ui/fragments/MenuFragment.java | 4 +- .../ui/fragments/PlacementFragment.java | 2 +- .../world/blocks/SelectionTrait.java | 2 +- .../world/blocks/storage/LaunchPad.java | 2 +- net/build/libs/net-release.jar | Bin 21465 -> 0 bytes tests/src/test/java/ApplicationTests.java | 14 +- 26 files changed, 62 insertions(+), 737 deletions(-) delete mode 100644 core/src/mindustryV4/type/Zone.java delete mode 100644 core/src/mindustryV4/ui/dialogs/DeployDialog.java delete mode 100644 core/src/mindustryV4/ui/dialogs/ZoneInfoDialog.java delete mode 100644 net/build/libs/net-release.jar diff --git a/core/src/mindustryV4/content/Blocks.java b/core/src/mindustryV4/content/Blocks.java index 0a01419252d..6473378b126 100644 --- a/core/src/mindustryV4/content/Blocks.java +++ b/core/src/mindustryV4/content/Blocks.java @@ -994,7 +994,7 @@ public void drawShadow(Tile tile){} }}; launchPad = new LaunchPad("launch-pad"){{ - requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.copper, 500, Items.titanium, 200, Items.silicon, 200, Items.lead, 200)); + requirements(Category.effect, () -> !world.getMap().custom, ItemStack.with(Items.copper, 500, Items.titanium, 200, Items.silicon, 200, Items.lead, 200)); size = 3; itemCapacity = 100; launchTime = 60f * 8; diff --git a/core/src/mindustryV4/core/ContentLoader.java b/core/src/mindustryV4/core/ContentLoader.java index 5b3214438bb..fedf5579a99 100644 --- a/core/src/mindustryV4/core/ContentLoader.java +++ b/core/src/mindustryV4/core/ContentLoader.java @@ -45,7 +45,6 @@ public class ContentLoader{ new UnitTypes(), new Blocks(), new TechTree(), - //new Zones(), //these are not really content classes, but this makes initialization easier new ColorMapper(), @@ -208,10 +207,6 @@ public BulletType bullet(int id){ return (BulletType) getByID(ContentType.bullet, id); } - public Array zones(){ - return getBy(ContentType.zone); - } - /** * Registers sync IDs for all types of sync entities. * Do not register units here! diff --git a/core/src/mindustryV4/core/Control.java b/core/src/mindustryV4/core/Control.java index 5d573c4dd6b..a392071f56b 100644 --- a/core/src/mindustryV4/core/Control.java +++ b/core/src/mindustryV4/core/Control.java @@ -124,12 +124,12 @@ public Control(){ Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y); //the restart dialog can show info for any number of scenarios Call.onGameOver(event.winner); - if(state.rules.zone != -1){ + /*if(state.rules.zone != -1){ //remove zone save on game over if(saves.getZoneSlot() != null){ saves.getZoneSlot().delete(); } - } + }*/ }); //autohost for pvp sectors diff --git a/core/src/mindustryV4/core/Logic.java b/core/src/mindustryV4/core/Logic.java index e023df3ffa4..137ee8826ea 100644 --- a/core/src/mindustryV4/core/Logic.java +++ b/core/src/mindustryV4/core/Logic.java @@ -25,13 +25,7 @@ */ public class Logic implements ApplicationListener{ - public Logic(){ - Events.on(WaveEvent.class, event -> { - if(world.isZone()){ - world.getZone().updateWave(state.wave); - } - }); - } + public Logic(){} @Override public void init(){ diff --git a/core/src/mindustryV4/core/UI.java b/core/src/mindustryV4/core/UI.java index 54aabd5a272..098cc9067c7 100644 --- a/core/src/mindustryV4/core/UI.java +++ b/core/src/mindustryV4/core/UI.java @@ -67,7 +67,6 @@ public class UI implements ApplicationListener{ public DatabaseDialog database; public ContentInfoDialog content; public SectorsDialog sectors; - public DeployDialog deploy; public TechTreeDialog tech; public Cursor drillCursor, unloadCursor; @@ -179,7 +178,6 @@ public void init(){ localplayers = new LocalPlayerDialog(); content = new ContentInfoDialog(); sectors = new SectorsDialog(); - deploy = new DeployDialog(); tech = new TechTreeDialog(); Group group = Core.scene.root; diff --git a/core/src/mindustryV4/core/World.java b/core/src/mindustryV4/core/World.java index 86a69a081cf..e21fb1f6d39 100644 --- a/core/src/mindustryV4/core/World.java +++ b/core/src/mindustryV4/core/World.java @@ -27,7 +27,6 @@ import mindustryV4.type.ContentType; import mindustryV4.type.Item; import mindustryV4.type.ItemStack; -import mindustryV4.type.Zone; import mindustryV4.world.*; import static mindustryV4.Vars.*; @@ -208,31 +207,6 @@ public boolean isGenerating(){ return generating; } - public boolean isZone(){ - return getZone() != null; - } - - public Zone getZone(){ - return content.getByID(ContentType.zone, state.rules.zone); - } - - public void playZone(Zone zone){ - ui.loadAnd(() -> { - logic.reset(); - state.rules = zone.rules.get(); - state.rules.zone = zone.id; - loadGenerator(zone.generator); - for(Tile core : state.teams.get(defaultTeam).cores){ - for(ItemStack stack : zone.getStartingItems()){ - core.entity.items.add(stack.item, stack.amount); - } - } - state.set(State.playing); - control.saves.zoneSave(); - logic.play(); - }); - } - public void loadGenerator(Generator generator){ beginMapLoad(); diff --git a/core/src/mindustryV4/game/EventType.java b/core/src/mindustryV4/game/EventType.java index 4e63c0a6fa8..230f01071af 100644 --- a/core/src/mindustryV4/game/EventType.java +++ b/core/src/mindustryV4/game/EventType.java @@ -4,29 +4,10 @@ import mindustryV4.core.GameState.State; import mindustryV4.entities.type.*; import mindustryV4.entities.traits.BuilderTrait; -import mindustryV4.type.Zone; import mindustryV4.world.Tile; public class EventType{ - /**Called when a zone's requirements are met.*/ - public static class ZoneCompleteEvent implements Event{ - public final Zone zone; - - public ZoneCompleteEvent(Zone zone){ - this.zone = zone; - } - } - - /**Called when a zone's requirements are met.*/ - public static class ZoneConfigureCompleteEvent implements Event{ - public final Zone zone; - - public ZoneConfigureCompleteEvent(Zone zone){ - this.zone = zone; - } - } - /**Called when the game is first loaded.*/ public static class GameLoadEvent implements Event{ diff --git a/core/src/mindustryV4/game/Saves.java b/core/src/mindustryV4/game/Saves.java index b13d35cbe9a..d7c5b55dadc 100644 --- a/core/src/mindustryV4/game/Saves.java +++ b/core/src/mindustryV4/game/Saves.java @@ -15,7 +15,6 @@ import mindustryV4.io.SaveMeta; import mindustryV4.maps.Map; import mindustryV4.type.ContentType; -import mindustryV4.type.Zone; import java.io.IOException; import java.text.SimpleDateFormat; @@ -33,6 +32,7 @@ public class Saves{ private float time; private long totalPlaytime; private long lastTimestamp; + public Saves(){ Events.on(StateChangeEvent.class, event -> { if(event.to == State.menu){ @@ -67,14 +67,11 @@ public void update(){ SaveSlot current = this.current; if(current != null && !state.is(State.menu) - && !(state.isPaused() && scene.hasDialog())){ - if(current != null && !state.is(State.menu) - && !(state.isPaused() && scene.hasDialog())){ - if(lastTimestamp != 0){ - totalPlaytime += Time.timeSinceMillis(lastTimestamp); - } - lastTimestamp = Time.millis(); + && !(state.isPaused() && scene.hasDialog())){ + if(lastTimestamp != 0){ + totalPlaytime += Time.timeSinceMillis(lastTimestamp); } + lastTimestamp = Time.millis(); } if(!state.is(State.menu) && !state.gameOver && current != null && current.isAutosave()){ @@ -110,16 +107,6 @@ public boolean isSaving(){ return saving; } - public void zoneSave(){ - SaveSlot slot = new SaveSlot(-1); - slot.setName("zone"); - saves.remove(s -> s.index == -1); - saves.add(slot); - saveMap.put(slot.index, slot); - slot.save(); - saveSlots(); - } - public SaveSlot addSave(String name){ SaveSlot slot = new SaveSlot(nextSlot); nextSlot++; @@ -144,13 +131,8 @@ public SaveSlot importSave(FileHandle file) throws IOException{ return slot; } - public SaveSlot getZoneSlot(){ - SaveSlot slot = getByID(-1); - return slot == null || slot.getZone() == null ? null : slot; - } - - public SaveSlot getByID(int id){ - return saveMap.get(id); + public SaveSlot getByID(int id){ + return saveMap.get(id); } public Array getSaveSlots(){ @@ -186,20 +168,22 @@ public void load() throws SaveException{ public void save(){ long time = totalPlaytime; - long prev = totalPlaytime; - totalPlaytime = time; + long prev = totalPlaytime; + totalPlaytime = time; - SaveIO.saveToSlot(index); - meta = SaveIO.getData(index); - if(!state.is(State.menu)){ - current = this; - } + renderer.fog.writeFog(); + + SaveIO.saveToSlot(index); + meta = SaveIO.getData(index); + if(!state.is(State.menu)){ + current = this; + } - totalPlaytime = prev; + totalPlaytime = prev; } public boolean isHidden(){ - return getZone() != null; + return getMap() != null; } public String getPlayTime(){ @@ -226,10 +210,6 @@ public String getName(){ Core.settings.save(); } - public Zone getZone(){ - return content.getByID(ContentType.zone, meta.rules.zone); - } - public int getBuild(){ return meta.build; } diff --git a/core/src/mindustryV4/game/Stats.java b/core/src/mindustryV4/game/Stats.java index 6af34c60fa3..19904c2aba4 100644 --- a/core/src/mindustryV4/game/Stats.java +++ b/core/src/mindustryV4/game/Stats.java @@ -6,7 +6,6 @@ import io.anuke.arc.math.Mathf; import mindustryV4.type.Item; import mindustryV4.type.ItemType; -import mindustryV4.type.Zone; @Serialize public class Stats{ @@ -25,7 +24,7 @@ public class Stats{ /**Friendly buildings destroyed.*/ public int buildingsDestroyed; - public RankResult calculateRank(Zone zone, boolean launched){ + /*public RankResult calculateRank(Zone zone, boolean launched){ float score = 0; //each new launch period adds onto the rank 1.5 'points' @@ -53,7 +52,7 @@ public RankResult calculateRank(Zone zone, boolean launched){ String sign = Math.abs((rankIndex + 0.5f) - score) < 0.2f || rank.name().contains("S") ? "" : (rankIndex + 0.5f) < score ? "-" : "+"; return new RankResult(rank, sign); - } + }*/ public static class RankResult{ public final Rank rank; diff --git a/core/src/mindustryV4/io/versions/Save16.java b/core/src/mindustryV4/io/versions/Save16.java index 8f6224dbd62..459dd15dbae 100644 --- a/core/src/mindustryV4/io/versions/Save16.java +++ b/core/src/mindustryV4/io/versions/Save16.java @@ -7,7 +7,6 @@ import mindustryV4.io.SaveFileVersion; import mindustryV4.maps.Map; import mindustryV4.type.ContentType; -import mindustryV4.type.Zone; import java.io.*; @@ -27,10 +26,6 @@ public void read(DataInputStream stream) throws IOException{ //general state state.rules = Serialization.readRules(stream); - //load zone spawn patterns if applicable - if(content.getByID(ContentType.zone, state.rules.zone) != null){ - state.rules.spawns = content.getByID(ContentType.zone, state.rules.zone).rules.get().spawns; - } String mapname = stream.readUTF(); Map map = world.maps.getByName(mapname); if(map == null) map = new Map(Strings.capitalize(mapname), 1, 1); diff --git a/core/src/mindustryV4/type/ContentType.java b/core/src/mindustryV4/type/ContentType.java index c7613310e03..eafe980fb21 100644 --- a/core/src/mindustryV4/type/ContentType.java +++ b/core/src/mindustryV4/type/ContentType.java @@ -11,6 +11,5 @@ public enum ContentType { unit, weather, effect, - zone, loadout } diff --git a/core/src/mindustryV4/type/Zone.java b/core/src/mindustryV4/type/Zone.java deleted file mode 100644 index a27f0a3b3de..00000000000 --- a/core/src/mindustryV4/type/Zone.java +++ /dev/null @@ -1,172 +0,0 @@ -package mindustryV4.type; - -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.collection.Array; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Supplier; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.scene.ui.layout.Table; -import mindustryV4.content.Loadouts; -import mindustryV4.content.StatusEffects; -import mindustryV4.game.EventType.ZoneCompleteEvent; -import mindustryV4.game.EventType.ZoneConfigureCompleteEvent; -import mindustryV4.game.Rules; -import mindustryV4.game.SpawnGroup; -import mindustryV4.game.UnlockableContent; -import mindustryV4.maps.generators.Generator; -import mindustryV4.maps.generators.MapGenerator; -import mindustryV4.world.Block; - -import java.util.Arrays; - -import static mindustryV4.Vars.*; - -@SuppressWarnings("unchecked") -public class Zone extends UnlockableContent{ - public final Generator generator; - public Block[] blockRequirements = {}; - public ItemStack[] itemRequirements = {}; - public Zone[] zoneRequirements = {}; - public Item[] resources = {}; - public Supplier rules = Rules::new; - public boolean alwaysUnlocked; - public int conditionWave = Integer.MAX_VALUE; - public int configureWave = 40; - public int launchPeriod = 10; - public Loadout loadout = Loadouts.basicShard; - - protected ItemStack[] baseLaunchCost = {}; - protected Array startingItems = new Array<>(); - protected ItemStack[] launchCost = null; - - public Zone(String name, MapGenerator generator){ - super(name); - this.generator = generator; - } - - protected SpawnGroup bossGroup(UnitType type){ - return new SpawnGroup(type){{ - begin = configureWave-1; - effect = StatusEffects.boss; - unitScaling = 1; - spacing = configureWave; - }}; - } - - public boolean isBossWave(int wave){ - return wave % configureWave == 0 && wave > 0; - } - - public boolean isLaunchWave(int wave){ - return metCondition() && wave % launchPeriod == 0; - } - - public ItemStack[] getLaunchCost(){ - if(launchCost == null){ - updateLaunchCost(); - } - return launchCost; - } - - public Array getStartingItems(){ - return startingItems; - } - - public void updateWave(int wave){ - int value = Core.settings.getInt(name + "-wave", 0); - if(value < wave){ - Core.settings.put(name + "-wave", wave); - data.modified(); - - if(wave == conditionWave + 1){ - Events.fire(new ZoneCompleteEvent(this)); - } - - if(wave == configureWave + 1){ - Events.fire(new ZoneConfigureCompleteEvent(this)); - } - } - } - - public int bestWave(){ - return Core.settings.getInt(name + "-wave", 0); - } - - public boolean isCompleted(){ - return bestWave() >= conditionWave; - } - - public void updateLaunchCost(){ - Array stacks = new Array<>(); - - Consumer adder = stack -> { - for(ItemStack other : stacks){ - if(other.item == stack.item){ - other.amount += stack.amount; - return; - } - } - stacks.add(new ItemStack(stack.item, stack.amount)); - }; - - for(ItemStack stack : baseLaunchCost) adder.accept(stack); - for(ItemStack stack : startingItems) adder.accept(stack); - - for(ItemStack stack : stacks){ - if(stack.amount < 0) stack.amount = 0; - } - - stacks.sort(); - launchCost = stacks.toArray(ItemStack.class); - Core.settings.putObject(name + "-starting-items", startingItems); - data.modified(); - } - - /**Whether this zone has met its condition; if true, the player can leave.*/ - public boolean metCondition(){ - return state.wave >= conditionWave; - } - - public boolean canConfigure(){ - return bestWave() >= configureWave; - } - - @Override - public void init(){ - generator.init(loadout); - Arrays.sort(resources); - - Array arr = Core.settings.getObject(name + "-starting-items", Array.class, () -> null); - if(arr != null){ - startingItems = arr; - } - } - - @Override - public boolean alwaysUnlocked(){ - return alwaysUnlocked; - } - - @Override - public boolean isHidden(){ - return true; - } - - //neither of these are implemented, as zones are not displayed in a normal fashion... yet - @Override - public void displayInfo(Table table){} - - @Override - public TextureRegion getContentIcon(){ return null; } - - @Override - public String localizedName(){ - return Core.bundle.get("zone." + name + ".name"); - } - - @Override - public ContentType getContentType(){ - return ContentType.zone; - } -} diff --git a/core/src/mindustryV4/ui/dialogs/DatabaseDialog.java b/core/src/mindustryV4/ui/dialogs/DatabaseDialog.java index 6f8eb4458e2..f8dd74eb711 100644 --- a/core/src/mindustryV4/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustryV4/ui/dialogs/DatabaseDialog.java @@ -78,6 +78,6 @@ void rebuild(){ } boolean unlocked(UnlockableContent content){ - return (!Vars.world.isZone() && !Vars.state.is(State.menu)) || content.unlocked(); + return (Vars.world.getMap().custom && !Vars.state.is(State.menu)) || content.unlocked(); } } \ No newline at end of file diff --git a/core/src/mindustryV4/ui/dialogs/DeployDialog.java b/core/src/mindustryV4/ui/dialogs/DeployDialog.java deleted file mode 100644 index 454d1a064fc..00000000000 --- a/core/src/mindustryV4/ui/dialogs/DeployDialog.java +++ /dev/null @@ -1,184 +0,0 @@ -package mindustryV4.ui.dialogs; - -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectSet; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Lines; -import io.anuke.arc.scene.Group; -import io.anuke.arc.scene.ui.TextButton; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.scene.ui.layout.Unit; -import io.anuke.arc.util.Align; -import io.anuke.arc.util.Structs; -import mindustryV4.core.GameState.State; -import mindustryV4.game.Saves.SaveSlot; -import mindustryV4.graphics.Pal; -import mindustryV4.io.SaveIO.SaveException; -import mindustryV4.type.Zone; -import mindustryV4.ui.ItemsDisplay; -import mindustryV4.ui.TreeLayout; -import mindustryV4.ui.TreeLayout.TreeNode; - -import static mindustryV4.Vars.*; - -public class DeployDialog extends FloatingDialog{ - private final float nodeSize = Unit.dp.scl(210f); - private ObjectSet nodes = new ObjectSet<>(); - private ZoneInfoDialog info = new ZoneInfoDialog(); - - public DeployDialog(){ - super(""); - - TreeLayout layout = new TreeLayout(); - layout.gapBetweenLevels = layout.gapBetweenNodes = Unit.dp.scl(50f); - - addCloseButton(); - buttons.addImageTextButton("$techtree", "icon-tree", 16 * 2, () -> ui.tech.show()).size(230f, 64f); - - shown(this::setup); - } - - public void setup(){ - cont.clear(); - titleTable.remove(); - margin(0f).marginBottom(8); - - if(!Core.settings.getBool("zone-info", false)){ - Core.app.post(() -> ui.showInfoText("TEMPORARY GUIDE ON HOW TO PLAY ZONES", "- deploy to zones by selecting them here\n- most zones require items to deploy\n- once you survive a set amount of waves, you can launch all the resources in your core\n- use these items to research in the tech tree or uncover new zones")); - - Core.settings.put("zone-info", true); - Core.settings.save(); - } - - cont.stack(control.saves.getZoneSlot() == null ? new View() : new Table(){{ - SaveSlot slot = control.saves.getZoneSlot(); - - TextButton[] b = {null}; - - TextButton button = addButton(Core.bundle.format("resume", slot.getZone().localizedName()), () -> { - if(b[0].childrenPressed()) return; - - hide(); - ui.loadAnd(() -> { - try{ - control.saves.getZoneSlot().load(); - state.set(State.playing); - }catch(SaveException e){ //make sure to handle any save load errors! - e.printStackTrace(); - if(control.saves.getZoneSlot() != null) control.saves.getZoneSlot().delete(); - Core.app.post(() -> ui.showInfo("$save.corrupted")); - show(); - } - }); - }).size(200f).get(); - b[0] = button; - - String color = "[lightgray]"; - - button.defaults().colspan(2); - button.row(); - button.add(Core.bundle.format("save.wave", color + slot.getWave())); - button.row(); - button.label(() -> Core.bundle.format("save.playtime", color + slot.getPlayTime())); - button.row(); - button.add().grow(); - button.row(); - - button.addButton("$abandon", () -> { - ui.showConfirm("$warning", "$abandon.text", () -> { - slot.delete(); - setup(); - }); - }).growX().height(50f).pad(-12).padTop(10); - - }}, new ItemsDisplay()).grow(); - } - - boolean hidden(Zone zone){ - for(Zone other : zone.zoneRequirements){ - if(!data.isUnlocked(other)){ - return true; - } - } - return false; - } - - @Override - protected void drawBackground(float x, float y){ - drawDefaultBackground(x, y); - } - - void buildButton(Zone zone, TextButton button){ - button.setDisabled(() -> hidden(zone)); - button.clicked(() -> info.show(zone)); - - if(zone.unlocked()){ - button.addImage("icon-zone").padRight(3); - button.labelWrap(zone.localizedName()).width(140).growX(); - }else{ - button.addImage("icon-zone-locked"); - button.row(); - button.add("$locked"); - } - } - - //should be static variables of View, but that's impossible - static float panX = 0, panY = -200; - - class View extends Group{ - - { - /*for(ZoneNode node : nodes){ - TextButton button = new TextButton("", "node"); - button.setSize(node.width, node.height); - button.update(() -> { - button.setPosition(node.x + panX + width/2f, node.y + panY + height/2f, Align.center); - }); - button.clearChildren(); - buildButton(node.zone, button); - addChild(button); - }*/ - - dragged((x, y) -> { - panX += x; - panY += y; - }); - } - - @Override - public void draw(){ - float offsetX = panX + width/2f + x, offsetY = panY + height/2f + y; - - /*for(ZoneNode node : nodes){ - for(ZoneNode child : node.children){ - Lines.stroke(Unit.dp.scl(3f), node.zone.locked() || child.zone.locked() ? Pal.locked : Pal.accent); - Lines.line(node.x + offsetX, node.y + offsetY, child.x + offsetX, child.y + offsetY); - } - }*/ - - Draw.reset(); - super.draw(); - } - } - - class ZoneNode extends TreeNode{ - final Array arr = new Array<>(); - final Zone zone; - - ZoneNode(Zone zone, ZoneNode parent){ - this.zone = zone; - this.parent = parent; - this.width = this.height = nodeSize; - this.height /= 2f; - //nodes.add(this); - - arr.selectFrom(content.zones(), other -> Structs.contains(other.zoneRequirements, zone)); - - children = new ZoneNode[arr.size]; - for(int i = 0; i < children.length; i++){ - children[i] = new ZoneNode(arr.get(i), this); - } - } - } -} diff --git a/core/src/mindustryV4/ui/dialogs/GameOverDialog.java b/core/src/mindustryV4/ui/dialogs/GameOverDialog.java index 2d0d96c2dd0..2f89e20c784 100644 --- a/core/src/mindustryV4/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustryV4/ui/dialogs/GameOverDialog.java @@ -55,7 +55,7 @@ void rebuild(){ cont.row(); cont.add(Core.bundle.format("stat.deconstructed", state.stats.buildingsDeconstructed)); cont.row(); - if(world.isZone() && !state.stats.itemsDelivered.isEmpty()){ + /*if(world.isZone() && !state.stats.itemsDelivered.isEmpty()){ cont.add("$stat.delivered"); cont.row(); for(Item item : content.items()){ @@ -73,23 +73,23 @@ void rebuild(){ RankResult result = state.stats.calculateRank(world.getZone(), state.launched); cont.add(Core.bundle.format("stat.rank", result.rank + result.modifier)); cont.row(); - } + }*/ }).pad(12); - if(world.isZone()){ + /*if(world.isZone()){ buttons.addButton("$continue", () -> { hide(); state.set(State.menu); logic.reset(); - ui.deploy.show(); + ui.sectors.show(); }).size(130f, 60f); - }else{ + }else{*/ buttons.addButton("$menu", () -> { hide(); state.set(State.menu); logic.reset(); }).size(130f, 60f); - } + //} } } } diff --git a/core/src/mindustryV4/ui/dialogs/PausedDialog.java b/core/src/mindustryV4/ui/dialogs/PausedDialog.java index b2f6e853c5a..649fd18ea88 100644 --- a/core/src/mindustryV4/ui/dialogs/PausedDialog.java +++ b/core/src/mindustryV4/ui/dialogs/PausedDialog.java @@ -39,18 +39,14 @@ void rebuild(){ cont.addButton("$back", this::hide).colspan(2).width(dw*2 + 20f); cont.row(); - if(world.isZone()){ - cont.addButton("$techtree", ui.tech::show); - }else{ - cont.addButton("$database", ui.database::show); - } + cont.addButton("$techtree", ui.tech::show); + //cont.addButton("$database", ui.database::show); cont.addButton("$settings", ui.settings::show); - if(!world.isZone()){ - cont.row(); - cont.addButton("$savegame", save::show); - cont.addButton("$loadgame", load::show).disabled(b -> Net.active()); - } + cont.row(); + cont.addButton("$savegame", save::show); + cont.addButton("$loadgame", load::show).disabled(b -> Net.active()); + cont.row(); cont.addButton("$hostserver", ui.host::show).disabled(b -> Net.active()).colspan(2).width(dw*2 + 20f); @@ -72,15 +68,11 @@ void rebuild(){ cont.addRowImageTextButton("$back", "icon-play-2", isize, this::hide); cont.addRowImageTextButton("$settings", "icon-tools", isize, ui.settings::show); - if(!world.isZone()){ - cont.addRowImageTextButton("$save", "icon-save", isize, save::show); + cont.addRowImageTextButton("$save", "icon-save", isize, save::show); - cont.row(); + cont.row(); - cont.addRowImageTextButton("$load", "icon-load", isize, load::show).disabled(b -> Net.active()); - }else{ - cont.row(); - } + cont.addRowImageTextButton("$load", "icon-load", isize, load::show).disabled(b -> Net.active()); cont.addRowImageTextButton("$hostserver.mobile", "icon-host", isize, ui.host::show).disabled(b -> Net.active()); cont.addRowImageTextButton("$quit", "icon-quit", isize, () -> { diff --git a/core/src/mindustryV4/ui/dialogs/SectorsDialog.java b/core/src/mindustryV4/ui/dialogs/SectorsDialog.java index 0ac3ac5ff55..43cc5fb7588 100644 --- a/core/src/mindustryV4/ui/dialogs/SectorsDialog.java +++ b/core/src/mindustryV4/ui/dialogs/SectorsDialog.java @@ -6,9 +6,13 @@ import io.anuke.arc.input.*; import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Vector2; +import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.Align; import mindustryV4.Vars; +import mindustryV4.core.GameState.*; +import mindustryV4.game.Saves.*; import mindustryV4.graphics.Pal; +import mindustryV4.io.SaveIO.*; import mindustryV4.maps.Sector; import io.anuke.arc.scene.Element; import io.anuke.arc.scene.Group; @@ -20,8 +24,9 @@ import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Rectangle; +import mindustryV4.ui.*; -import static mindustryV4.Vars.world; +import static mindustryV4.Vars.*; public class SectorsDialog extends FloatingDialog{ private static final float sectorSize = Unit.dp.scl(32*5); @@ -63,15 +68,12 @@ public float getPrefWidth(){ shown(this::setup); } - void setup(){ + public void setup(){ selected = null; - table.clear(); - cont.clear(); - buttons.clear(); - buttons.bottom().margin(15); + titleTable.remove(); + margin(0f).marginBottom(8); - addCloseButton(); cont.add(view = new SectorView()).grow(); } diff --git a/core/src/mindustryV4/ui/dialogs/TechTreeDialog.java b/core/src/mindustryV4/ui/dialogs/TechTreeDialog.java index bcfa0923cc1..7ee148513c0 100644 --- a/core/src/mindustryV4/ui/dialogs/TechTreeDialog.java +++ b/core/src/mindustryV4/ui/dialogs/TechTreeDialog.java @@ -45,7 +45,7 @@ public TechTreeDialog(){ cont.stack(new View(), items = new ItemsDisplay()).grow(); shown(() -> checkNodes(root)); - hidden(ui.deploy::setup); + hidden(ui.sectors::setup); addCloseButton(); buttons.addImageTextButton("$database", "icon-database", 14*2, () -> { diff --git a/core/src/mindustryV4/ui/dialogs/ZoneInfoDialog.java b/core/src/mindustryV4/ui/dialogs/ZoneInfoDialog.java deleted file mode 100644 index 0badd27b318..00000000000 --- a/core/src/mindustryV4/ui/dialogs/ZoneInfoDialog.java +++ /dev/null @@ -1,221 +0,0 @@ -package mindustryV4.ui.dialogs; - -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.ui.Button; -import io.anuke.arc.scene.ui.TextButton; -import io.anuke.arc.scene.ui.layout.Table; -import mindustryV4.graphics.Pal; -import mindustryV4.type.Item; -import mindustryV4.type.ItemStack; -import mindustryV4.type.ItemType; -import mindustryV4.type.Zone; -import mindustryV4.world.Block; -import mindustryV4.world.Block.Icon; - -import static mindustryV4.Vars.*; - -public class ZoneInfoDialog extends FloatingDialog{ - - public ZoneInfoDialog(){ - super(""); - - titleTable.remove(); - addCloseButton(); - } - - @Override - protected void drawBackground(float x, float y){ - drawDefaultBackground(x, y); - } - - public void show(Zone zone){ - setup(zone); - show(); - } - - private void setup(Zone zone){ - cont.clear(); - - Table iteminfo = new Table(); - Runnable rebuildItems = () -> { - int i = 0; - iteminfo.clear(); - ItemStack[] stacks = zone.unlocked() ? zone.getLaunchCost() : zone.itemRequirements; - for(ItemStack stack : stacks){ - if(stack.amount == 0) continue; - - if(i++ % 2 == 0){ - iteminfo.row(); - } - iteminfo.addImage(stack.item.icon(Item.Icon.medium)).size(8*3).padRight(1); - iteminfo.add(stack.amount + "").color(Color.LIGHT_GRAY).padRight(5); - } - }; - - rebuildItems.run(); - - cont.table(cont -> { - if(zone.locked()){ - cont.addImage("icon-zone-locked"); - cont.row(); - cont.add("$locked").padBottom(6); - cont.row(); - - cont.table(req -> { - req.defaults().left(); - - if(zone.zoneRequirements.length > 0){ - req.table(r -> { - r.add("$complete").colspan(2).left(); - r.row(); - for(Zone other : zone.zoneRequirements){ - r.addImage("icon-zone").padRight(4); - r.add(other.localizedName()).color(Color.LIGHT_GRAY); - r.addImage(other.isCompleted() ? "icon-check-2" : "icon-cancel-2") - .color(other.isCompleted() ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); - r.row(); - } - }); - } - - req.row(); - - if(zone.blockRequirements.length > 0){ - req.table(r -> { - r.add("$research.list").colspan(2).left(); - r.row(); - for(Block block : zone.blockRequirements){ - r.addImage(block.icon(Icon.small)).size(8 * 3).padRight(4); - r.add(block.localizedName).color(Color.LIGHT_GRAY); - r.addImage(data.isUnlocked(block) ? "icon-check-2" : "icon-cancel-2") - .color(data.isUnlocked(block) ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); - r.row(); - } - - }).padTop(10); - } - }).growX(); - - }else{ - cont.add(zone.localizedName()).color(Pal.accent).growX().center(); - cont.row(); - cont.addImage("white").color(Pal.accent).height(3).pad(6).growX(); - cont.row(); - cont.table(res -> { - res.add("$zone.resources").padRight(6); - if(zone.resources.length > 0){ - for(Item item : zone.resources){ - res.addImage(item.icon(Item.Icon.medium)).size(8 * 3); - } - }else{ - res.add("$none"); - } - }); - - if(zone.bestWave() > 0){ - cont.row(); - cont.add(Core.bundle.format("bestwave", zone.bestWave())); - } - - Table load = new Table(); - //thanks java, absolutely brilliant syntax here - Runnable[] rebuildLoadout = {null}; - rebuildLoadout[0] = () -> { - load.clear(); - float bsize = 40f; - int step = 100; - - load.left(); - for(ItemStack stack : zone.getStartingItems()){ - load.addButton("-", () -> { - stack.amount = Math.max(stack.amount - step, 0); - zone.updateLaunchCost(); - rebuildItems.run(); - }).size(bsize).pad(2); - load.addButton("+", () -> { - stack.amount = Math.min(stack.amount + step, zone.loadout.core().itemCapacity); - zone.updateLaunchCost(); - rebuildItems.run(); - }).size(bsize).pad(2); - - load.addImage(stack.item.icon(Item.Icon.medium)).size(8 * 3).padRight(4); - load.label(() -> stack.amount + "").left(); - - load.row(); - } - - load.addButton("$add", () -> { - FloatingDialog dialog = new FloatingDialog(""); - dialog.setFillParent(false); - for(Item item : content.items().select(item -> data.getItem(item) > 0 && item.type == ItemType.material && zone.getStartingItems().find(stack -> stack.item == item) == null)){ - TextButton button = dialog.cont.addButton("", () -> { - zone.getStartingItems().add(new ItemStack(item, 0)); - zone.updateLaunchCost(); - rebuildLoadout[0].run(); - dialog.hide(); - }).size(300f, 35f).pad(1).get(); - button.clearChildren(); - button.left(); - button.addImage(item.icon(Item.Icon.medium)).size(8*3).pad(4); - button.add(item.localizedName); - dialog.cont.row(); - } - dialog.show(); - }).colspan(4).size(100f, bsize).left().disabled(b -> !content.items().contains(item -> data.getItem(item) > 0 && item.type == ItemType.material && !zone.getStartingItems().contains(stack -> stack.item == item))); - }; - - rebuildLoadout[0].run(); - - cont.row(); - cont.table(zone.canConfigure() ? "button" : "button-disabled", t -> { - t.left(); - t.add(!zone.canConfigure() ? Core.bundle.format("configure.locked", zone.configureWave) : "$configure").growX().wrap(); - if(zone.canConfigure()){ - t.row(); - t.pane(load).pad(2).growX().left(); - } - }).width(300f).pad(4).left(); - } - }); - - cont.row(); - - Button button = cont.addButton(zone.locked() ? "$uncover" : "$launch", () -> { - if(!data.isUnlocked(zone)){ - data.removeItems(zone.itemRequirements); - data.unlockContent(zone); - ui.deploy.setup(); - setup(zone); - }else{ - ui.deploy.hide(); - data.removeItems(zone.getLaunchCost()); - hide(); - world.playZone(zone); - } - }).minWidth(150f).margin(13f).padTop(5).disabled(b -> zone.locked() ? !canUnlock(zone) : !data.hasItems(zone.getLaunchCost())).get(); - - button.row(); - button.add(iteminfo); - } - - private boolean canUnlock(Zone zone){ - if(data.isUnlocked(zone)){ - return true; - } - - for(Zone other : zone.zoneRequirements){ - if(!other.isCompleted()){ - return false; - } - } - - for(Block other : zone.blockRequirements){ - if(!data.isUnlocked(other)){ - return false; - } - } - - return data.hasItems(zone.itemRequirements); - } -} diff --git a/core/src/mindustryV4/ui/fragments/HudFragment.java b/core/src/mindustryV4/ui/fragments/HudFragment.java index 55a19e403f8..d88a3314f02 100644 --- a/core/src/mindustryV4/ui/fragments/HudFragment.java +++ b/core/src/mindustryV4/ui/fragments/HudFragment.java @@ -84,10 +84,9 @@ public void build(Group parent){ }else{ ui.chatfrag.toggle(); } - }else if(world.isZone()){ - ui.tech.show(); }else{ - ui.database.show(); + ui.tech.show(); + //ui.database.show(); } }).update(i -> { if(Net.active() && mobile){ @@ -125,7 +124,7 @@ public void build(Group parent){ stuff.add(stack).width(dsize * 4 + 3f); stuff.row(); stuff.table("button", t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.WHITE)) - .grow()).fillX().visible(() -> world.isZone() && state.boss() != null).height(60f).get(); + .grow()).fillX().visible(() -> state.boss() != null).height(60f).get(); stuff.row(); }).visible(() -> shown); }); diff --git a/core/src/mindustryV4/ui/fragments/MenuFragment.java b/core/src/mindustryV4/ui/fragments/MenuFragment.java index 1d696e222f2..9a4450f87ce 100644 --- a/core/src/mindustryV4/ui/fragments/MenuFragment.java +++ b/core/src/mindustryV4/ui/fragments/MenuFragment.java @@ -57,7 +57,7 @@ private void buildMobile(){ container.defaults().size(size).pad(5).padTop(4f); MobileButton - play = new MobileButton("icon-play-2", isize, "$play", ui.deploy::show), + play = new MobileButton("icon-play-2", isize, "$play", ui.sectors::show), maps = new MobileButton("icon-map", isize, "$maps", ui.maps::show), custom = new MobileButton("icon-play-custom", isize, "$customgame", this::showCustomSelect), join = new MobileButton("icon-add", isize, "$joingame", ui.join::show), @@ -107,7 +107,7 @@ private void buildDesktop(){ out.margin(16); out.defaults().size(w, 66f).padTop(5).padRight(5); - out.add(new MenuButton("icon-play-2", "$play", ui.deploy::show)).width(bw).colspan(2); + out.add(new MenuButton("icon-play-2", "$play", ui.sectors::show)).width(bw).colspan(2); out.row(); diff --git a/core/src/mindustryV4/ui/fragments/PlacementFragment.java b/core/src/mindustryV4/ui/fragments/PlacementFragment.java index c19c5adc848..65eae9641d1 100644 --- a/core/src/mindustryV4/ui/fragments/PlacementFragment.java +++ b/core/src/mindustryV4/ui/fragments/PlacementFragment.java @@ -304,7 +304,7 @@ Array getByCategory(Category cat){ } boolean unlocked(Block block){ - return !world.isZone() || data.isUnlocked(block); + return world.getMap().custom || data.isUnlocked(block); } /** Returns the currently displayed block in the top box. */ diff --git a/core/src/mindustryV4/world/blocks/SelectionTrait.java b/core/src/mindustryV4/world/blocks/SelectionTrait.java index e112438ce58..974040e223f 100644 --- a/core/src/mindustryV4/world/blocks/SelectionTrait.java +++ b/core/src/mindustryV4/world/blocks/SelectionTrait.java @@ -26,7 +26,7 @@ default void buildItemTable(Table table, Supplier holder, Consumer c int i = 0; for(Item item : items){ - if(!data.isUnlocked(item) && world.isZone()) continue; + if(!data.isUnlocked(item) && !world.getMap().custom) continue; ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> control.input(0).frag.config.hideConfig()).group(group).get(); button.changed(() -> consumer.accept(button.isChecked() ? item : null)); diff --git a/core/src/mindustryV4/world/blocks/storage/LaunchPad.java b/core/src/mindustryV4/world/blocks/storage/LaunchPad.java index 40fe2a37a10..9de8f4e0565 100644 --- a/core/src/mindustryV4/world/blocks/storage/LaunchPad.java +++ b/core/src/mindustryV4/world/blocks/storage/LaunchPad.java @@ -32,7 +32,7 @@ public boolean acceptItem(Item item, Tile tile, Tile source){ public void update(Tile tile){ TileEntity entity = tile.entity; - if(entity.cons.valid() && world.isZone()){ + if(entity.cons.valid() && !world.getMap().custom){ for(Item item : Vars.content.items()){ if(entity.items.get(item) >= itemCapacity && entity.timer.get(timerLaunch, launchTime)){ //TODO play animation of some sort diff --git a/net/build/libs/net-release.jar b/net/build/libs/net-release.jar deleted file mode 100644 index d18268886253f72b35af15169fad7de781955884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21465 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
`zb6 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 0); - Map first = world.maps.all().first(); - Log.info(first); - - world.loadMap(first); + world.loadMap(world.maps.all().first()); } @Test @@ -240,4 +234,4 @@ void depositTest(Block block, Item item){ tile.block().handleStack(item, 1, tile, unit); assertEquals(capacity, tile.entity.items.get(item)); } -} +}*/