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 zcmaKycRZWl`~Qt7sU2FXHfinAqNv>xL~FFQiBfw7wJRYgYR}lCsJ8arVv9YB+FPxn zVl_s6^Zxw)|K*WC?%X-&PVRHAb6wBZ>)fSp;@`x{A@4$P?eoY*>lh&tUIse4()Zle zLNb3owG#uqqVg$6US8qo|56|{0#~@hhaUg{c5Iwnw#A83+??$oVs7qciyPvf4c^=6 z@4Mf3ce5`v)Xxr%Pfp$&T-Vt)6>SBtNDs*Qy#J7LiATd&5xHhew#z>4GT)OnnB0J} z={^-QNQavL9UJ@P$_OZJ{&$+iCr)O~;(vz|K7leN3vK>~nZHHM+a}*E4Q`2!T;J5+ zT+CTbzg@pkGiWyoE4{Lj|5(j&RsO9@<)v0@J_hT>$c%~wu(8X9XS(qI??NCSA{jF~ ztmqo(eZ$d;o05*LJ7o1SmIi>N1r_x>;UXIVS$EkvUnU#}6cqK3A}g_r zY&)|n;i_TK9VlyZ)mw2K^O|n#(p6F>zz;Xyc!Tsi71T*fJw)p6?r6tK({m8ZaslQ_ zMAZ=TlLMclXbdt|y|(`f{fXJ34@$Y3cm(C?K##(5ZKHm8oP!@-_CNxkT0g)m4;(aV zZ}W6suaPWp=>bLg6?d!}0Ot{ua9f|x=%cz>4g@V6Vgbr@hdB>UjVj2V-)Jw7wRz(< zJPqW<(0#P*NVXije8=?)PkUCo{NTK$U?scX0M5v==p!YZ9RAWrDWsEMQ7bK}DFqHZ zAjJT@(k-5Ib75+JPj6NzD*m?kL!aCAvEWJ~cJ((oQ|`KSa}U{eOTO*2fyZH+(eBPn zA7L1Rxx?x8(h9Rj_j({-}(k9P1~sqyI?uZAeeM?}12rPh-IOQd;*@ z86geT&)K3mm_O97y#p!Xy6keY3Q(qFcg?YcEAGrwt$By}m=WW@D%)iIV4+jIxyY(n z%ZG3LYmsQt&_AEd5u$|`_{W`&Yb2&o({`a&iNWkbF^L?cY{(Z{=oOg7d?&bpMx>oA z_dx+PZt0dtha{Z%Xws8x^np zFU05i$dGo-5rDOn6$-p=OsOy?96BZ?qLi=xfX3i+Y!Zhz8}Gv)Qch|*iWAffn>iHK5soB58F(K~x2I#*6aN!gDi^)b*OA!k~=v<3s! zxr><{zQ)qN zifR6ph;t~AyyLDPQg)B@;urHwN#OYPG&Mdk2f&Bq+Tq=u;ZYoUR97;=A<}^`4P+|; z1?q1;)YX4?3#eiUz6Dt&;jPkKF+%6OOA}G<;|S$xzXvZW8eO`a?dZ5uw$>xv1b_VW zl_1ym_`Z$jRpr;oSrQ)r;m?f`wK*nMg6!1v(b5mdSpxQXl;!?0kt%BkI-{Q}ktoK{ z_=!v*jiKWDjZ_8PvkH|?S}+gRpAZ!M3dF1qMTpOE1yNoXBmFL%J`JwkjpblZZ1di~ z;PQBJvU=dCo{8TSW5ob&5hX95VLXQ1eFw?jAX=BR;`N;@)`mpG-u|Vi=-6*QA93*S zd8>a}&ZlUvQ9A&8o0N*WcUr%OJ6rU(ZL3FGuyGLUt8+XL`y|2?M~Gx*ZpEFxZK0^K zf;}-y|B@d+Y-iV14k^DZpAIwbHV{!Nkv^o>L@zU+2`GQ1GecRM2HvZS<&w1cQ={xCaHhidVFHf%Y+f>I6t~y05m1G zRWUk7lQz?geZNBd+t8jkNBmv4nmFfU-~l;@8Ih+3dpKKs5{<`GauENc<;RCA`7cCR z(Z7$lxAF7XY$u+xZYcYo_9{!zh58>+(?Df?1icoh;p$>A)d*EP+63^OZ6%W2U<%?* z{C?{_GJZLwk2dy&ywt<-n_9?v?(hAh#zj*S=zyq*R&7P?>+)QKBv`@uf?6r5mVFNk zgzfxf11q8yn9hSCEZ8(tvF557F{SxD36*tbYu%0##gll>s6y=uu)^hgs9D z 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 delta 10532 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 BOSu35 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.*;