From 0842c3f0a083a82e9cdd399c39d153985c02c097 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 May 2020 21:04:41 -0400 Subject: [PATCH] Progress on sector state --- .../annotations/entity/EntityProcess.java | 4 +- .../src/main/resources/classids.properties | 2 +- core/assets-raw/sprites/units/reaper.png | Bin 10925 -> 10897 bytes core/assets/scripts/global.js | 130 +++++++++--------- core/src/mindustry/content/Blocks.java | 3 +- core/src/mindustry/core/GameState.java | 2 + core/src/mindustry/core/Logic.java | 11 +- .../src/mindustry/entities/comp/TileComp.java | 6 + core/src/mindustry/game/Saves.java | 4 - core/src/mindustry/game/SectorInfo.java | 124 +++++++++++++++++ core/src/mindustry/game/Stats.java | 101 -------------- core/src/mindustry/io/SaveMeta.java | 10 +- core/src/mindustry/io/SaveVersion.java | 9 +- core/src/mindustry/mod/Scripts.java | 1 + .../mindustry/ui/dialogs/PlanetDialog.java | 33 ++++- .../ui/fragments/BlockConfigFragment.java | 42 +++--- .../mindustry/ui/fragments/HudFragment.java | 6 +- .../world/blocks/campaign/CoreLauncher.java | 33 +++++ .../{storage => campaign}/LaunchPad.java | 2 +- .../ResearchBlock.java | 2 +- 20 files changed, 314 insertions(+), 211 deletions(-) create mode 100644 core/src/mindustry/game/SectorInfo.java create mode 100644 core/src/mindustry/world/blocks/campaign/CoreLauncher.java rename core/src/mindustry/world/blocks/{storage => campaign}/LaunchPad.java (99%) rename core/src/mindustry/world/blocks/{production => campaign}/ResearchBlock.java (96%) diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 66eb7e4636..f3fb569aff 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -222,6 +222,8 @@ public class EntityProcess extends BaseProcessor{ Array syncedFields = new Array<>(); Array allFields = new Array<>(); + boolean isSync = components.contains(s -> s.name().contains("Sync")); + //add all components for(Stype comp : components){ @@ -257,7 +259,7 @@ public class EntityProcess extends BaseProcessor{ allFields.add(f); //add extra sync fields - if(f.has(SyncField.class)){ + if(f.has(SyncField.class) && isSync){ if(!f.tname().toString().equals("float")) err("All SyncFields must be of type float", f); syncedFields.add(f); diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 92e667b660..7ce51d941c 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -12,7 +12,7 @@ mindustry.entities.comp.PlayerComp=8 mindustry.entities.comp.PuddleComp=9 mindustry.entities.comp.TileComp=10 mindustry.type.Weather.WeatherComp=11 -mindustry.world.blocks.storage.LaunchPad.LaunchPayloadComp=12 +mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=12 oculon=13 phantom=14 tau=19 diff --git a/core/assets-raw/sprites/units/reaper.png b/core/assets-raw/sprites/units/reaper.png index ab6175801be6c5cbc8c57c56715b8759e91849ca..a85075830f71364b5b9deabbcb164372a3dfb1b1 100644 GIT binary patch delta 10536 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 z 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 G5}E+SFiW`r diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 813f18a16c..b8acc336b9 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -24,70 +24,72 @@ const extend = function(classType, params){ const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) Call = Packages.mindustry.gen.Call -importPackage(Packages.mindustry.game) -importPackage(Packages.arc.func) -importPackage(Packages.mindustry.entities) +importPackage(Packages.mindustry.graphics.g3d) +importPackage(Packages.mindustry.ctype) importPackage(Packages.mindustry.gen) -importPackage(Packages.mindustry.core) -importPackage(Packages.mindustry.world.blocks.storage) -importPackage(Packages.mindustry.ui.dialogs) -importPackage(Packages.arc.scene.ui) -importPackage(Packages.mindustry.world.blocks.defense.turrets) -importPackage(Packages.mindustry.world.blocks.distribution) -importPackage(Packages.mindustry.ui) -importPackage(Packages.mindustry.content) -importPackage(Packages.mindustry.world.blocks.liquid) -importPackage(Packages.arc.struct) -importPackage(Packages.arc.scene.ui.layout) -importPackage(Packages.mindustry.world.modules) -importPackage(Packages.arc.util) -importPackage(Packages.arc.graphics) -importPackage(Packages.mindustry.entities.def) -importPackage(Packages.mindustry.maps.generators) importPackage(Packages.arc.scene.actions) -importPackage(Packages.mindustry.graphics) -importPackage(Packages.mindustry.entities.bullet) -importPackage(Packages.mindustry.world.blocks.legacy) -importPackage(Packages.mindustry.world.blocks.experimental) importPackage(Packages.mindustry.editor) +importPackage(Packages.mindustry.type) +importPackage(Packages.arc.scene.ui) +importPackage(Packages.arc.math.geom) +importPackage(Packages.mindustry.game) +importPackage(Packages.mindustry.maps.filters) +importPackage(Packages.arc.struct) +importPackage(Packages.arc.scene.style) +importPackage(Packages.mindustry.ui.dialogs) +importPackage(Packages.mindustry.entities.comp) +importPackage(Packages.mindustry.world.blocks.defense.turrets) +importPackage(Packages.mindustry.async) +importPackage(Packages.mindustry.world.blocks.distribution) +importPackage(Packages.mindustry.world.blocks.environment) +importPackage(Packages.mindustry.world.blocks.campaign) +importPackage(Packages.mindustry.world.blocks.liquid) +importPackage(Packages.mindustry.ui) +importPackage(Packages.mindustry.world.blocks.production) +importPackage(Packages.mindustry.ai) +importPackage(Packages.mindustry.world.blocks.defense) +importPackage(Packages.mindustry.world.meta) +importPackage(Packages.mindustry.world.blocks.legacy) +importPackage(Packages.mindustry.world.blocks.units) +importPackage(Packages.arc.graphics) +importPackage(Packages.arc.func) +importPackage(Packages.mindustry.content) importPackage(Packages.mindustry.world.blocks.power) -importPackage(Packages.mindustry.ui.layout) +importPackage(Packages.mindustry.world.blocks) +importPackage(Packages.arc.scene.event) +importPackage(Packages.mindustry.logic) +importPackage(Packages.arc.math) +importPackage(Packages.mindustry.world) +importPackage(Packages.mindustry.maps) +importPackage(Packages.mindustry.maps.generators) +importPackage(Packages.mindustry.world.meta.values) +importPackage(Packages.mindustry.entities) +importPackage(Packages.arc.util) +importPackage(Packages.mindustry.graphics) +importPackage(Packages.mindustry.world.modules) importPackage(Packages.mindustry.world.blocks.sandbox) importPackage(Packages.mindustry.input) -importPackage(Packages.mindustry.world.consumers) -importPackage(Packages.mindustry.ui.fragments) -importPackage(Packages.mindustry.ai.formations) -importPackage(Packages.mindustry.type) -importPackage(Packages.mindustry.world.blocks.production) -importPackage(Packages.arc.scene.event) -importPackage(Packages.arc.math) -importPackage(Packages.arc.scene.utils) -importPackage(Packages.mindustry.world.blocks.defense) -importPackage(Packages.mindustry.graphics.g3d) -importPackage(Packages.mindustry.world.meta) -importPackage(Packages.mindustry.world.blocks.payloads) -importPackage(Packages.mindustry.world) -importPackage(Packages.mindustry.async) -importPackage(Packages.arc.scene.style) -importPackage(Packages.mindustry.world.blocks) -importPackage(Packages.arc.math.geom) -importPackage(Packages.mindustry.ai) -importPackage(Packages.mindustry.maps.filters) -importPackage(Packages.arc.graphics.g2d) -importPackage(Packages.mindustry.ai.formations.patterns) -importPackage(Packages.mindustry.world.blocks.environment) -importPackage(Packages.mindustry) importPackage(Packages.mindustry.entities.units) -importPackage(Packages.mindustry.ctype) +importPackage(Packages.arc.scene.ui.layout) importPackage(Packages.mindustry.ai.types) -importPackage(Packages.mindustry.maps) -importPackage(Packages.mindustry.world.meta.values) -importPackage(Packages.mindustry.world.producers) -importPackage(Packages.mindustry.world.blocks.units) +importPackage(Packages.mindustry.ai.formations.patterns) +importPackage(Packages.arc.scene.utils) +importPackage(Packages.mindustry.ai.formations) +importPackage(Packages.mindustry.ui.fragments) +importPackage(Packages.mindustry.world.blocks.experimental) +importPackage(Packages.mindustry.world.blocks.storage) +importPackage(Packages.mindustry.audio) +importPackage(Packages.mindustry.ui.layout) +importPackage(Packages.mindustry.entities.bullet) +importPackage(Packages.mindustry.world.consumers) +importPackage(Packages.mindustry.core) importPackage(Packages.arc.scene) -importPackage(Packages.mindustry.maps.planet) +importPackage(Packages.mindustry) importPackage(Packages.arc) -importPackage(Packages.mindustry.world.blocks.logic) +importPackage(Packages.mindustry.world.blocks.payloads) +importPackage(Packages.mindustry.world.producers) +importPackage(Packages.arc.graphics.g2d) +importPackage(Packages.mindustry.maps.planet) const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent const PlayerUnbanEvent = Packages.mindustry.game.EventType.PlayerUnbanEvent @@ -95,8 +97,7 @@ const PlayerBanEvent = Packages.mindustry.game.EventType.PlayerBanEvent const PlayerLeave = Packages.mindustry.game.EventType.PlayerLeave const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin -const MechChangeEvent = Packages.mindustry.game.EventType.MechChangeEvent -const ResizeEvent = Packages.mindustry.game.EventType.ResizeEvent +const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent const BlockDestroyEvent = Packages.mindustry.game.EventType.BlockDestroyEvent @@ -107,12 +108,19 @@ const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent -const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent const TapConfigEvent = Packages.mindustry.game.EventType.TapConfigEvent const TapEvent = Packages.mindustry.game.EventType.TapEvent const DepositEvent = Packages.mindustry.game.EventType.DepositEvent const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent +const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent +const ZoneConfigureCompleteEvent = Packages.mindustry.game.EventType.ZoneConfigureCompleteEvent +const ZoneRequireCompleteEvent = Packages.mindustry.game.EventType.ZoneRequireCompleteEvent +const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent +const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent +const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent +const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent +const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent const CoreItemDeliverEvent = Packages.mindustry.game.EventType.CoreItemDeliverEvent const TurretAmmoDeliverEvent = Packages.mindustry.game.EventType.TurretAmmoDeliverEvent @@ -123,17 +131,13 @@ const PlayEvent = Packages.mindustry.game.EventType.PlayEvent const DisposeEvent = Packages.mindustry.game.EventType.DisposeEvent const ContentReloadEvent = Packages.mindustry.game.EventType.ContentReloadEvent const ServerLoadEvent = Packages.mindustry.game.EventType.ServerLoadEvent -const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent const ClientCreateEvent = Packages.mindustry.game.EventType.ClientCreateEvent const SaveLoadEvent = Packages.mindustry.game.EventType.SaveLoadEvent -const ZoneConfigureCompleteEvent = Packages.mindustry.game.EventType.ZoneConfigureCompleteEvent -const ZoneRequireCompleteEvent = Packages.mindustry.game.EventType.ZoneRequireCompleteEvent -const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent -const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent const MapPublishEvent = Packages.mindustry.game.EventType.MapPublishEvent const MapMakeEvent = Packages.mindustry.game.EventType.MapMakeEvent -const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent +const ResizeEvent = Packages.mindustry.game.EventType.ResizeEvent const LaunchEvent = Packages.mindustry.game.EventType.LaunchEvent const LoseEvent = Packages.mindustry.game.EventType.LoseEvent const WinEvent = Packages.mindustry.game.EventType.WinEvent +const TurnEvent = Packages.mindustry.game.EventType.TurnEvent const Trigger = Packages.mindustry.game.EventType.Trigger diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 820e3b6c77..7142c4f48d 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -14,6 +14,7 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.blocks.campaign.LaunchPad; import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.turrets.*; import mindustry.world.blocks.distribution.*; @@ -1315,7 +1316,7 @@ public class Blocks implements ContentList{ speed = 7f; }}; - launchPad = new LaunchPad("launch-pad"){{ + launchPad = new mindustry.world.blocks.campaign.LaunchPad("launch-pad"){{ requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); size = 3; itemCapacity = 100; diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index db2e4686e2..51ab59a460 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -23,6 +23,8 @@ public class GameState{ public Rules rules = new Rules(); /** Statistics for this save/game. Displayed after game over. */ public Stats stats = new Stats(); + /** Sector information. Only valid in the campaign. */ + public SectorInfo secinfo = new SectorInfo(); /** Team data. Gets reset every new game. */ public Teams teams = new Teams(); /** Number of enemies in the game; only used clientside in servers. */ diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 502d3f2571..0f01ee8948 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -90,7 +90,7 @@ public class Logic implements ApplicationListener{ } }); - Events.on(LaunchItemEvent.class, e -> state.stats.handleItemExport(e.stack)); + Events.on(LaunchItemEvent.class, e -> state.secinfo.handleItemExport(e.stack)); //when loading a 'damaged' sector, propagate the damage Events.on(WorldLoadEvent.class, e -> { @@ -100,13 +100,14 @@ public class Logic implements ApplicationListener{ } }); - //TODO this should be in the same place as launch handling code + //TODO dying takes up a turn (?) + /* Events.on(GameOverEvent.class, e -> { //simulate a turn on a normal non-launch gameover if(state.isCampaign() && !state.launched){ universe.runTurn(); } - }); + });*/ //disable new waves after the boss spawns Events.on(WaveEvent.class, e -> { @@ -269,11 +270,9 @@ public class Logic implements ApplicationListener{ //save over the data w/o the cores sector.save.save(); - //TODO mark sector as not containing any cores //run a turn, since launching takes up a turn universe.runTurn(); - //TODO needs extra damage to prevent player from landing immediately afterwards sector.setTurnsPassed(sector.getTurnsPassed() + 3); Events.fire(new LaunchEvent()); @@ -300,7 +299,7 @@ public class Logic implements ApplicationListener{ } if(!state.isPaused()){ - state.stats.update(); + state.secinfo.update(); if(state.isCampaign()){ universe.update(); diff --git a/core/src/mindustry/entities/comp/TileComp.java b/core/src/mindustry/entities/comp/TileComp.java index 4de8c7519c..cc02265511 100644 --- a/core/src/mindustry/entities/comp/TileComp.java +++ b/core/src/mindustry/entities/comp/TileComp.java @@ -188,6 +188,12 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree } } + /** Called clientside when the client taps a block to config. + * @return whether the configuration UI should be shown. */ + public boolean configTapped(){ + return true; + } + public void applyBoost(float intensity, float duration){ timeScale = Math.max(timeScale, intensity); timeScaleDuration = Math.max(timeScaleDuration, duration); diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 30fb17af67..8c521c534f 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -242,10 +242,6 @@ public class Saves{ return isSector(); } - public ObjectFloatMap getProductionRates(){ - return meta.exportRates; - } - public String getPlayTime(){ return Strings.formatMillis(current == this ? totalPlaytime : meta.timePlayed); } diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java new file mode 100644 index 0000000000..7361acdad7 --- /dev/null +++ b/core/src/mindustry/game/SectorInfo.java @@ -0,0 +1,124 @@ +package mindustry.game; + +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.modules.*; + +import static mindustry.Vars.*; + +public class SectorInfo{ + /** export window size in seconds */ + private static final int exportWindow = 60; + /** refresh period of export in ticks */ + private static final float refreshPeriod = 60; + /** Export statistics. */ + public ObjectMap export = new ObjectMap<>(); + /** Items stored in all cores. */ + public ObjectIntMap coreItems = new ObjectIntMap<>(); + /** The best available core type. */ + public Block bestCoreType = Blocks.air; + /** Max storage capacity. */ + public int storageCapacity = 0; + /** Whether a core is available here. */ + public boolean hasCore = true; + + /** Counter refresh state. */ + private transient Interval time = new Interval(); + /** Core item storage to prevent spoofing. */ + private transient int[] lastCoreItems; + + /** Updates export statistics. */ + public void handleItemExport(ItemStack stack){ + handleItemExport(stack.item, stack.amount); + } + + /** Updates export statistics. */ + public void handleItemExport(Item item, int amount){ + export.get(item, ExportStat::new).counter += amount; + } + + /** Subtracts from export statistics. */ + public void handleItemImport(Item item, int amount){ + export.get(item, ExportStat::new).counter -= amount; + } + + public float getExport(Item item){ + return export.get(item, ExportStat::new).mean; + } + + /** Prepare data for writing to a save. */ + public void prepare(){ + //update core items + coreItems.clear(); + + CoreEntity entity = state.rules.defaultTeam.core(); + + if(entity != null){ + ItemModule items = entity.items; + for(int i = 0; i < items.length(); i++){ + coreItems.put(content.item(i), items.get(i)); + } + } + + hasCore = entity != null; + bestCoreType = !hasCore ? Blocks.air : state.rules.defaultTeam.cores().max(e -> e.block.size).block; + storageCapacity = entity != null ? entity.storageCapacity : 0; + } + + /** Update averages of various stats. */ + public void update(){ + //create last stored core items + if(lastCoreItems == null){ + lastCoreItems = new int[content.items().size]; + updateCoreDeltas(); + } + + //refresh throughput + if(time.get(refreshPeriod)){ + CoreEntity ent = state.rules.defaultTeam.core(); + + export.each((item, stat) -> { + //initialize stat after loading + if(!stat.loaded){ + stat.means.fill(stat.mean); + stat.loaded = true; + } + + //how the resources changed - only interested in negative deltas, since that's what happens during spoofing + int coreDelta = Math.min(ent == null ? 0 : ent.items.get(item) - lastCoreItems[item.id], 0); + + //add counter, subtract how many items were taken from the core during this time + stat.means.add(Math.max(stat.counter + coreDelta, 0)); + stat.counter = 0; + stat.mean = stat.means.rawMean(); + }); + + updateCoreDeltas(); + } + } + + private void updateCoreDeltas(){ + CoreEntity ent = state.rules.defaultTeam.core(); + for(int i = 0; i < lastCoreItems.length; i++){ + lastCoreItems[i] = ent == null ? 0 : ent.items.get(i); + } + } + + public ObjectFloatMap exportRates(){ + ObjectFloatMap map = new ObjectFloatMap<>(); + export.each((item, value) -> map.put(item, value.mean)); + return map; + } + + public static class ExportStat{ + public transient float counter; + public transient WindowedMean means = new WindowedMean(exportWindow); + public transient boolean loaded; + public float mean; + } +} diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java index bc2147c7e8..01744a7537 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -2,21 +2,11 @@ package mindustry.game; import arc.math.*; import arc.struct.*; -import arc.util.*; import mindustry.type.*; -import mindustry.world.blocks.storage.CoreBlock.*; -import mindustry.world.modules.*; - -import static mindustry.Vars.*; //TODO more stats: //- units constructed public class Stats{ - /** export window size in seconds */ - private static final int exportWindow = 60; - /** refresh period of export in ticks */ - private static final float refreshPeriod = 60; - /** Total items delivered to global resoure counter. Campaign only. */ public ObjectIntMap itemsDelivered = new ObjectIntMap<>(); /** Enemy (red team) units destroyed. */ @@ -31,89 +21,6 @@ public class Stats{ public int buildingsDeconstructed; /** Friendly buildings destroyed. */ public int buildingsDestroyed; - /** Export statistics. */ - public ObjectMap export = new ObjectMap<>(); - /** Items stored in all cores. Used for the campaign. */ - public ObjectIntMap coreItems = new ObjectIntMap<>(); - - /** Counter refresh state. */ - private transient Interval time = new Interval(); - /** Core item storage to prevent spoofing. */ - private transient int[] lastCoreItems; - - /** Updates export statistics. */ - public void handleItemExport(ItemStack stack){ - handleItemExport(stack.item, stack.amount); - } - - /** Updates export statistics. */ - public void handleItemExport(Item item, int amount){ - export.get(item, ExportStat::new).counter += amount; - } - - /** Subtracts from export statistics. */ - public void handleItemImport(Item item, int amount){ - export.get(item, ExportStat::new).counter -= amount; - } - - public float getExport(Item item){ - return export.get(item, ExportStat::new).mean; - } - - public void update(){ - //update core items - CoreEntity entity = state.rules.defaultTeam.core(); - if(entity != null){ - ItemModule items = entity.items; - for(int i = 0; i < items.length(); i++){ - coreItems.put(content.item(i), items.get(i)); - } - }else{ - coreItems.clear(); - } - - //create last stored core items - if(lastCoreItems == null){ - lastCoreItems = new int[content.items().size]; - updateCoreDeltas(); - } - - //refresh throughput - if(time.get(refreshPeriod)){ - CoreEntity ent = state.rules.defaultTeam.core(); - - export.each((item, stat) -> { - //initialize stat after loading - if(!stat.loaded){ - stat.means.fill(stat.mean); - stat.loaded = true; - } - - //how the resources changed - only interested in negative deltas, since that's what happens during spoofing - int coreDelta = Math.min(ent == null ? 0 : ent.items.get(item) - lastCoreItems[item.id], 0); - - //add counter, subtract how many items were taken from the core during this time - stat.means.add(Math.max(stat.counter + coreDelta, 0)); - stat.counter = 0; - stat.mean = stat.means.rawMean(); - }); - - updateCoreDeltas(); - } - } - - private void updateCoreDeltas(){ - CoreEntity ent = state.rules.defaultTeam.core(); - for(int i = 0; i < lastCoreItems.length; i++){ - lastCoreItems[i] = ent == null ? 0 : ent.items.get(i); - } - } - - public ObjectFloatMap exportRates(){ - ObjectFloatMap map = new ObjectFloatMap<>(); - export.each((item, value) -> map.put(item, value.mean)); - return map; - } public RankResult calculateRank(Sector zone, boolean launched){ float score = 0; @@ -161,15 +68,7 @@ public class Stats{ } } - public enum Rank{ F, D, C, B, A, S, SS } - - public static class ExportStat{ - public transient float counter; - public transient WindowedMean means = new WindowedMean(exportWindow); - public transient boolean loaded; - public float mean; - } } diff --git a/core/src/mindustry/io/SaveMeta.java b/core/src/mindustry/io/SaveMeta.java index a28b1ac6ce..0a3730d8e1 100644 --- a/core/src/mindustry/io/SaveMeta.java +++ b/core/src/mindustry/io/SaveMeta.java @@ -3,7 +3,6 @@ package mindustry.io; import arc.struct.*; import mindustry.game.*; import mindustry.maps.*; -import mindustry.type.*; import static mindustry.Vars.maps; @@ -15,13 +14,12 @@ public class SaveMeta{ public Map map; public int wave; public Rules rules; + public SectorInfo secinfo; public StringMap tags; public String[] mods; - /** These are in items/second. */ - public ObjectFloatMap exportRates; public boolean hasProduction; - public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules, ObjectFloatMap exportRates, StringMap tags){ + public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules, SectorInfo secinfo, StringMap tags){ this.version = version; this.build = build; this.timestamp = timestamp; @@ -31,8 +29,8 @@ public class SaveMeta{ this.rules = rules; this.tags = tags; this.mods = JsonIO.read(String[].class, tags.get("mods", "[]")); - this.exportRates = exportRates; + this.secinfo = secinfo; - exportRates.each(e -> hasProduction |= e.value > 0.001f); + secinfo.exportRates().each(e -> hasProduction |= e.value > 0.001f); } } diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index 0635b12ab6..05c5425df1 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -39,7 +39,7 @@ public abstract class SaveVersion extends SaveFileReader{ map.get("mapname"), map.getInt("wave"), JsonIO.read(Rules.class, map.get("rules", "{}")), - JsonIO.read(Stats.class, map.get("stats", "{}")).exportRates(), + JsonIO.read(SectorInfo.class, map.get("secinfo", "{}")), map ); } @@ -70,6 +70,11 @@ public abstract class SaveVersion extends SaveFileReader{ } public void writeMeta(DataOutput stream, StringMap tags) throws IOException{ + //prepare campaign data for writing + if(state.isCampaign()){ + state.secinfo.prepare(); + } + writeStringMap(stream, StringMap.of( "saved", Time.millis(), "playtime", headless ? 0 : control.saves.getTotalPlaytime(), @@ -78,6 +83,7 @@ public abstract class SaveVersion extends SaveFileReader{ "wave", state.wave, "wavetime", state.wavetime, "stats", JsonIO.write(state.stats), + "secinfo", state.isCampaign() ? JsonIO.write(state.secinfo) : "{}", "rules", JsonIO.write(state.rules), "mods", JsonIO.write(mods.getModStrings().toArray(String.class)), "width", world.width(), @@ -94,6 +100,7 @@ public abstract class SaveVersion extends SaveFileReader{ state.wave = map.getInt("wave"); state.wavetime = map.getFloat("wavetime", state.rules.waveSpacing); state.stats = JsonIO.read(Stats.class, map.get("stats", "{}")); + state.secinfo = JsonIO.read(SectorInfo.class, map.get("secinfo", "{}")); state.rules = JsonIO.read(Rules.class, map.get("rules", "{}")); if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get(); lastReadBuild = map.getInt("build", -1); diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 224ce9af35..c25a34fb66 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -17,6 +17,7 @@ import java.net.*; import java.util.regex.*; public class Scripts implements Disposable{ + private final static Object[] emptyObjects = {}; private final Array blacklist = Array.with("net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", ".awt", "socket", "classloader", "oracle", "invoke", "arc.events", "java.util.function", "java.util.stream"); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 7eda1a76d1..dec25c616a 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -9,6 +9,7 @@ import arc.input.*; import arc.math.*; import arc.math.geom.*; import arc.scene.event.*; +import arc.scene.ui.*; import arc.scene.ui.TextButton.*; import arc.scene.ui.layout.*; import arc.struct.*; @@ -152,6 +153,17 @@ public class PlanetDialog extends BaseDialog{ shown(this::setup); } + /** show with no limitations, just as a map. */ + @Override + public Dialog show(){ + //TODO + return super.show(); + } + + public void show(Sector selected, int range){ + //TODO + } + void makeBloom(){ if(bloom != null){ bloom.dispose(); @@ -413,7 +425,7 @@ public class PlanetDialog extends BaseDialog{ stable.table(t -> { t.left(); - selected.save.meta.exportRates.each(entry -> { + selected.save.meta.secinfo.exportRates().each(entry -> { int total = (int)(entry.value * turnDuration / 60f); if(total > 1){ t.image(entry.key.icon(Cicon.small)).padRight(3); @@ -421,7 +433,24 @@ public class PlanetDialog extends BaseDialog{ t.row(); } }); - }); + }).row(); + } + + //stored resources + if(selected.hasBase() && selected.save.meta.secinfo.coreItems.size > 0){ + stable.add("Stored Resources:").row(); + stable.table(t -> { + t.left(); + + for(Item item : content.items()){ + int amount = selected.save.meta.secinfo.coreItems.get(item); + if(amount > 0){ + t.image(item.icon(Cicon.small)).padRight(3); + t.add(ui.formatAmount(amount)).color(Color.lightGray); + t.row(); + } + } + }).row(); } //display how many turns this sector has been attacked diff --git a/core/src/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/mindustry/ui/fragments/BlockConfigFragment.java index 4ffa087897..2d1270e036 100644 --- a/core/src/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/mindustry/ui/fragments/BlockConfigFragment.java @@ -43,29 +43,31 @@ public class BlockConfigFragment extends Fragment{ } public void showConfig(Tilec tile){ - configTile = tile; + if(tile.configTapped()){ + configTile = tile; - table.visible(true); - table.clear(); - tile.buildConfiguration(table); - table.pack(); - table.setTransform(true); - table.actions(Actions.scaleTo(0f, 1f), Actions.visible(true), - Actions.scaleTo(1f, 1f, 0.07f, Interp.pow3Out)); + table.visible(true); + table.clear(); + tile.buildConfiguration(table); + table.pack(); + table.setTransform(true); + table.actions(Actions.scaleTo(0f, 1f), Actions.visible(true), + Actions.scaleTo(1f, 1f, 0.07f, Interp.pow3Out)); - table.update(() -> { - if(configTile != null && configTile.shouldHideConfigure(player)){ - hideConfig(); - return; - } + table.update(() -> { + if(configTile != null && configTile.shouldHideConfigure(player)){ + hideConfig(); + return; + } - table.setOrigin(Align.center); - if(configTile == null || configTile.block() == Blocks.air || !configTile.isValid()){ - hideConfig(); - }else{ - configTile.updateTableAlign(table); - } - }); + table.setOrigin(Align.center); + if(configTile == null || configTile.block() == Blocks.air || !configTile.isValid()){ + hideConfig(); + }else{ + configTile.updateTableAlign(table); + } + }); + } } public boolean hasConfigMouse(){ diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index fcfbf2a8f5..44eb0d4489 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -326,9 +326,9 @@ public class HudFragment extends Fragment{ c.clearChildren(); for(Item item : content.items()){ - if(state.stats.getExport(item) >= 1){ + if(state.secinfo.getExport(item) >= 1){ c.image(item.icon(Cicon.small)); - c.label(() -> (int)state.stats.getExport(item) + " /s").color(Color.lightGray); + c.label(() -> (int)state.secinfo.getExport(item) + " /s").color(Color.lightGray); c.row(); } } @@ -337,7 +337,7 @@ public class HudFragment extends Fragment{ c.update(() -> { boolean wrong = false; for(Item item : content.items()){ - boolean has = state.stats.getExport(item) >= 1; + boolean has = state.secinfo.getExport(item) >= 1; if(used.get(item.id) != has){ used.set(item.id, has); wrong = true; diff --git a/core/src/mindustry/world/blocks/campaign/CoreLauncher.java b/core/src/mindustry/world/blocks/campaign/CoreLauncher.java new file mode 100644 index 0000000000..c3d2f2520c --- /dev/null +++ b/core/src/mindustry/world/blocks/campaign/CoreLauncher.java @@ -0,0 +1,33 @@ +package mindustry.world.blocks.campaign; + +import mindustry.*; +import mindustry.gen.*; +import mindustry.world.*; + +public class CoreLauncher extends Block{ + + public CoreLauncher(String name){ + super(name); + + hasItems = true; + configurable = true; + } + + public class CoreLauncherEntity extends TileEntity{ + + @Override + public void updateTile(){ + super.updateTile(); + } + + @Override + public boolean configTapped(){ + //TODO show w/ sector + Vars.ui.planet.show(); + + return false; + } + + + } +} diff --git a/core/src/mindustry/world/blocks/storage/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java similarity index 99% rename from core/src/mindustry/world/blocks/storage/LaunchPad.java rename to core/src/mindustry/world/blocks/campaign/LaunchPad.java index 592e9b2b47..7dbded1b5c 100644 --- a/core/src/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks.storage; +package mindustry.world.blocks.campaign; import arc.*; import arc.graphics.*; diff --git a/core/src/mindustry/world/blocks/production/ResearchBlock.java b/core/src/mindustry/world/blocks/campaign/ResearchBlock.java similarity index 96% rename from core/src/mindustry/world/blocks/production/ResearchBlock.java rename to core/src/mindustry/world/blocks/campaign/ResearchBlock.java index ec3de2fef1..9e10526f72 100644 --- a/core/src/mindustry/world/blocks/production/ResearchBlock.java +++ b/core/src/mindustry/world/blocks/campaign/ResearchBlock.java @@ -1,4 +1,4 @@ -package mindustry.world.blocks.production; +package mindustry.world.blocks.campaign; import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*;