From d58e3ac2356fea5eca54bdc42e91a3ba1431b881 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 29 Jun 2020 11:58:43 -0400 Subject: [PATCH] Implemented more sector launch mechanics --- core/src/mindustry/core/Control.java | 9 ++++- core/src/mindustry/core/Logic.java | 37 +++++++++++++++---- core/src/mindustry/game/SectorInfo.java | 12 ++++-- core/src/mindustry/type/ItemStack.java | 9 +++++ core/src/mindustry/type/Sector.java | 11 ++++++ .../mindustry/ui/dialogs/PlanetDialog.java | 10 +++-- 6 files changed, 74 insertions(+), 14 deletions(-) diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 3a237d74d9..7c1cdbfd10 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -9,6 +9,7 @@ import arc.math.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; +import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.audio.*; import mindustry.content.*; @@ -255,6 +256,10 @@ public class Control implements ApplicationListener, Loadable{ } public void playSector(Sector sector){ + playSector(sector, sector); + } + + public void playSector(@Nullable Sector origin, Sector sector){ ui.loadAnd(() -> { ui.planet.hide(); SaveSlot slot = sector.save; @@ -294,7 +299,7 @@ public class Control implements ApplicationListener, Loadable{ sector.save = null; Time.runTask(10f, () -> ui.showErrorMessage("$save.corrupted")); slot.delete(); - playSector(sector); + playSector(origin, sector); } ui.planet.hide(); }else{ @@ -302,6 +307,8 @@ public class Control implements ApplicationListener, Loadable{ logic.reset(); world.loadSector(sector); state.rules.sector = sector; + //assign origin when launching + state.secinfo.origin = origin; logic.play(); control.saves.saveSector(sector); Events.fire(Trigger.newGame); diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index ae77329c93..3f7343f8ad 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -2,6 +2,7 @@ package mindustry.core; import arc.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -99,14 +100,25 @@ public class Logic implements ApplicationListener{ //add resources based on turns passed if(state.rules.sector.save != null && core != null){ + //add produced items + //TODO move to recieved items state.rules.sector.save.meta.secinfo.production.each((item, stat) -> { core.items.add(item, (int)(stat.mean * passed)); + }); + //add recieved items + state.rules.sector.getRecievedItems().each(stack -> core.items.add(stack.item, stack.amount)); + + //clear recieved items + state.rules.sector.setRecievedItems(new Seq<>()); + + //validation + for(Item item : content.items()){ //ensure positive items if(core.items.get(item) < 0) core.items.set(item, 0); //cap the items if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity); - }); + } } state.rules.sector.setTurnsPassed(0); @@ -255,14 +267,22 @@ public class Logic implements ApplicationListener{ //TODO containers must be launched too Time.runTask(30f, () -> { - for(Building entity : state.teams.playerCores()){ - for(Item item : content.items()){ - //TODO where do the items go? - //data.addItem(item, entity.items.get(item)); - //Events.fire(new LaunchItemEvent(new ItemStack(item, entity.items.get(item)))); + Sector origin = sector.save.meta.secinfo.origin; + if(origin != null){ + Seq stacks = origin.getRecievedItems(); + + //add up all items into list + for(Building entity : state.teams.playerCores()){ + entity.items.each((item, amount) -> ItemStack.insert(stacks, item, amount)); } - entity.tile().remove(); + + //save recieved items + origin.setRecievedItems(stacks); } + + //remove all the cores + state.teams.playerCores().each(b -> b.tile.remove()); + state.launched = true; state.gameOver = true; @@ -271,8 +291,11 @@ public class Logic implements ApplicationListener{ //run a turn, since launching takes up a turn universe.runTurn(); + + //TODO ??? sector.setTurnsPassed(sector.getTurnsPassed() + 3); + //TODO load the sector that was launched from Events.fire(new LaunchEvent()); //manually fire game over event now Events.fire(new GameOverEvent(state.rules.defaultTeam)); diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index f484515a83..8222cabd9a 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -3,6 +3,7 @@ package mindustry.game; import arc.math.*; import arc.struct.*; import arc.util.*; +import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.type.*; import mindustry.world.*; @@ -28,6 +29,8 @@ public class SectorInfo{ public int storageCapacity = 0; /** Whether a core is available here. */ public boolean hasCore = true; + /** Sector that was launched from. */ + public @Nullable Sector origin; /** Counter refresh state. */ private transient Interval time = new Interval(); @@ -124,11 +127,14 @@ public class SectorInfo{ } } - /** @return the items in this sector now, taking into account production. */ - public ObjectIntMap getCurrentItems(float turnsPassed){ + /** @return the items in this sector now, taking into account production and items recieved. */ + public ObjectIntMap getCurrentItems(Sector sector){ ObjectIntMap map = new ObjectIntMap<>(); map.putAll(coreItems); - production.each((item, stat) -> map.increment(item, (int)(stat.mean * turnsPassed))); + int turns = sector.getTurnsPassed(); + production.each((item, stat) -> map.increment(item, (int)(stat.mean * turns))); + //increment based on recieved items + sector.getRecievedItems().each(stack -> map.increment(stack.item, stack.amount)); return map; } diff --git a/core/src/mindustry/type/ItemStack.java b/core/src/mindustry/type/ItemStack.java index a8a765c4df..dad33a338b 100644 --- a/core/src/mindustry/type/ItemStack.java +++ b/core/src/mindustry/type/ItemStack.java @@ -59,6 +59,15 @@ public class ItemStack implements Comparable{ return stacks; } + public static void insert(Seq stacks, Item item, int amount){ + ItemStack stack = stacks.find(i -> i.item == item); + if(stack == null){ + stacks.add(new ItemStack(item, amount)); + }else{ + stack.amount += amount; + } + } + @Override public int compareTo(ItemStack itemStack){ return item.compareTo(itemStack.item); diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index db1389fe6a..c4cb9a84f2 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -2,6 +2,7 @@ package mindustry.type; import arc.*; import arc.math.geom.*; +import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; @@ -110,6 +111,16 @@ public class Sector{ return false; } + //TODO this should be stored in a more efficient structure, and be updated each turn + public Seq getRecievedItems(){ + return Core.settings.getJson(key("recieved-items"),Seq.class, ItemStack.class, Seq::new); + } + + public void setRecievedItems(Seq stacks){ + Core.settings.putJson(key("recieved-items"), ItemStack.class, stacks); + } + + //TODO these methods should maybe move somewhere else and/or be contained in a data object public void setSpawnPosition(int position){ put("spawn-position", position); } diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 82927f0232..b896730c00 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -109,7 +109,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } boolean canLaunch(Sector sector){ - return mode == launch && sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2); + return mode == launch && + (sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2) //within range + //TODO completely untested + || (sector.preset != null && sector.preset.unlocked() && sector.preset.requirements.contains(r -> r.zone() != null && r.zone() == sector.preset))); //is an unlocked preset } @Override @@ -308,7 +311,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ t.left(); t.table(res -> { - ObjectIntMap map = sector.save.meta.secinfo.getCurrentItems(sector.getTurnsPassed()); + ObjectIntMap map = sector.save.meta.secinfo.getCurrentItems(sector); int i = 0; for(Item item : content.items()){ @@ -355,6 +358,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } if(mode == launch && !sector.hasBase()){ + Sector current = state.rules.sector; shouldHide = false; loadouts.show((CoreBlock)launcher.block, launcher, () -> { control.handleLaunch(launcher); @@ -362,7 +366,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ zoom = 0.5f; ui.hudfrag.showLaunchDirect(); - Time.runTask(launchDuration, () -> control.playSector(sector)); + Time.runTask(launchDuration, () -> control.playSector(current, sector)); }); }else{ control.playSector(sector);