From b25c611c33ddff1adcdaa3ad56ebc59e632be6f1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 27 Dec 2017 23:05:10 -0500 Subject: [PATCH] More character support, made menus collapsible --- TODO.md | 3 + .../sprites/ui/icons/icon-arrow-down.png | Bin 167 -> 170 bytes .../sprites/ui/icons/icon-arrow-up.png | Bin 199 -> 198 bytes core/assets/bundles/bundle_en_US.properties | 7 +- core/assets/mindustry-saves/1.mins | Bin 0 -> 12739 bytes core/assets/mindustry-saves/2.mins | Bin 0 -> 10619 bytes core/assets/sprites/sprites.png | Bin 82446 -> 82458 bytes core/assets/ui/prose.fnt | 97 -------- core/assets/ui/prose.png | Bin 2027 -> 0 bytes core/assets/ui/square.fnt | 235 ++++++++++++++++++ core/assets/ui/square.png | Bin 0 -> 3639 bytes core/assets/ui/uiskin.json | 2 +- core/src/io/anuke/mindustry/Mindustry.java | 17 +- core/src/io/anuke/mindustry/Vars.java | 2 +- core/src/io/anuke/mindustry/core/Control.java | 15 +- .../src/io/anuke/mindustry/core/Renderer.java | 2 +- core/src/io/anuke/mindustry/core/UI.java | 5 +- .../mindustry/graphics/BlockRenderer.java | 4 +- .../anuke/mindustry/input/AndroidInput.java | 10 +- .../anuke/mindustry/input/DesktopInput.java | 5 + .../anuke/mindustry/input/InputHandler.java | 5 +- .../io/{BundleUtil.java => BundleGen.java} | 7 +- .../mindustry/mapeditor/MapEditorDialog.java | 2 +- .../ui/fragments/BlocksFragment.java | 109 +++++--- .../mindustry/ui/fragments/HudFragment.java | 127 ++++------ .../ui/fragments/PlacementFragment.java | 160 +++++++----- .../ui/fragments/WeaponFragment.java | 2 +- core/src/io/anuke/mindustry/world/Block.java | 8 +- .../blocks/types/distribution/Conveyor.java | 5 + .../blocks/types/distribution/Junction.java | 2 +- .../blocks/types/distribution/Teleporter.java | 19 +- .../world/blocks/types/production/Drill.java | 13 +- .../production/LiquidPowerGenerator.java | 6 +- .../types/production/NuclearReactor.java | 30 ++- .../world/blocks/types/production/Pump.java | 13 +- 35 files changed, 569 insertions(+), 343 deletions(-) create mode 100644 core/assets/mindustry-saves/1.mins create mode 100644 core/assets/mindustry-saves/2.mins delete mode 100644 core/assets/ui/prose.fnt delete mode 100644 core/assets/ui/prose.png create mode 100644 core/assets/ui/square.fnt create mode 100644 core/assets/ui/square.png rename core/src/io/anuke/mindustry/io/{BundleUtil.java => BundleGen.java} (96%) diff --git a/TODO.md b/TODO.md index c7990e10cf..2bcf9d426e 100644 --- a/TODO.md +++ b/TODO.md @@ -38,6 +38,9 @@ _(not necessarily planned!)_ - Solar panels - Deflector shields - Autosave +- Underground blocks +- Configurable outputs/inputs +- Getting items out of the core ### Balance - Slow down progression slightly diff --git a/core/assets-raw/sprites/ui/icons/icon-arrow-down.png b/core/assets-raw/sprites/ui/icons/icon-arrow-down.png index 8c6a7fc3b95c0c37aa8357ea01f92940ae4f48a8..b6403714eca1f53cd0be74378aae8504e38e6422 100644 GIT binary patch delta 94 zcmZ3^xQcN?aJaM>FT+2@f72Nl7|cCg977~7Cnqd0OGrsbNci#pzkQu+PY;hyz_)rQ yHlv9trdNLbw^)Eu=pz{RL7qz@gO8y?ON2>+DbW>Z1cRrmpUXO@geCxFvLI&w delta 91 zcmV-h0Hpt_0jB|wQ&bufFC#=j27CYj05nNNK~xyiwaqaK03Z~@(8T-Sxh^^gA5qZE xj}~4hK$2{c+D;eS)%EUPb%7P0s4OGC*8!gF6aX{@3d;Zh002ovPDHLkV1m{kA*BES diff --git a/core/assets-raw/sprites/ui/icons/icon-arrow-up.png b/core/assets-raw/sprites/ui/icons/icon-arrow-up.png index da89b30c25f702c5ba7a7b81edc93375a0976ec5..ebf5bab7c67381da05b724537704b13c4de0cd5b 100644 GIT binary patch delta 122 zcmX@kc#LsEaIv%)FKeGSmjnX?L$IfdV~E7%%mwE=|5vVVo6s*2nZQ$2<2&b2J^NwF2{s(; Z3|Bg2W9pa%j{uEl@O1TaS?83{1ON@dEi3>4 delta 123 zcmV->0EGX>0mlK5Q*;^=~?08~jtK~xyil~6$nz%U4lvVZLvzH!g+V`i6G z+-SQtAV`QIQAna9+yDT2UN2t0!V$E?@tLWRgB_ZgdM?R@TXUQRWi9j9NEC}W@?!fv d;f7MM;Re(V9b5vA4Hp0a002ovPDHLkV1n@)F@^vD diff --git a/core/assets/bundles/bundle_en_US.properties b/core/assets/bundles/bundle_en_US.properties index 01bfcf2272..6f50ec52fe 100644 --- a/core/assets/bundles/bundle_en_US.properties +++ b/core/assets/bundles/bundle_en_US.properties @@ -33,9 +33,8 @@ text.loading=[accent]Loading... text.wave=[orange]Wave {0} text.wave.waiting=Wave in {0} text.waiting=Waiting... -text.countdown=Wave in {0} -text.enemies={0} Enemies left -text.enemies.single={0} Enemy left +text.enemies={0} Enemies +text.enemies.single={0} Enemy text.loadimage=Load Image text.saveimage=Save Image text.editor.badsize=[orange]Invalid image dimensions![]\nValid map dimensions: {0} @@ -375,7 +374,7 @@ block.stoneformer.name=stone former block.stoneformer.fulldescription=Soldifies liquid lava into stone. Useful for producing massive amounts of stone for coal purifiers. block.stoneformer.description=Converts lava to stone. block.lavasmelter.name=lava smelter -block.lavasmelter.fulldescription=Uses lava to convert iron to steel. An alternative to smelteries. Useful in situations where coal is scarace. +block.lavasmelter.fulldescription=Uses lava to convert iron to steel. An alternative to smelteries. Useful in situations where coal is scarce. block.lavasmelter.description=Converts iron + lava to steel. block.stonedrill.name=stone drill block.stonedrill.fulldescription=The essential drill. When placed on stone tiles, outputs stone at a slow pace indefinitely. diff --git a/core/assets/mindustry-saves/1.mins b/core/assets/mindustry-saves/1.mins new file mode 100644 index 0000000000000000000000000000000000000000..7b8e2ebb64d56c6cce24febcd9bea87bd9dcce99 GIT binary patch literal 12739 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 M%W7+$nRYkoe+Q?BXaE2J literal 0 HcmV?d00001 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index fd18eaa9e643a2153c97bb6f8b3db0405a9608d6..28737b07b55825a2627e96e05ff0c53eaaaf90c0 100644 GIT binary patch delta 16997 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 delta 17002 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 WN9P*1-h=thPb+VG0db{lrnzX?xe0K?%v*| zF{-E4c~;SPyNc&L*z&vTnf6?io6 z`QGh*o%0c6n>N;ihD)Z`9S6!pd;O!LfZz(hwl;lYq_9@0A~dG0+1EYxw}}+p_zaaQ zFF_pj>inRb!mgeYBqqO>olfQX3rB9t9Z3r1=tNY4F4A@9mph+>LEWs?hz-z2P0yH~ z0k^E%`8ZFY2ke#!LqNMxd=zpp0eDZ<1ychJ&KFos+Er4zl$OKtB|Ng?o1VePJw^Rv z&)=q*f`BanTW|tem#Zm&0In|2_#dA|zsTZ@)<;l3>kSw`+M7d?22*v=s$P9SeYiFR z5>p?V0k~WOjNxMiXk6PCfjB36#X3rz<)Tgx$6c4#r92Rqi<@#4uXULMpL}*>MIIjN zMQp$z8&bDF!hC_|G9p~kMu9U1t0;ymIKezJxv{foDnC_fPcSYML!K&}AOh|iWMgdF zXcZ13P-dj)K;yOu>X1I#XBl^@s+;P;3rfnvM6p#dJkhKAZ5}pw0QG}|->kw|kZ4Tz z${^?t#B4N!j1g2FK?U+S*6R|onoGypYv2W6sThS3en&coXV!l5*%D=g2ibW&_?0vIm@3TV5P`^s`BqX%nBYu(fA&V8?Wl)fNy>ojQ%zSP4x>5oKg1 zMg&pWl&1)Fpp&R2uW9C`dZ#`@!kgL~uj=0DBk36Ht^JLueonA{@CcHxO z9`E4VuL_iI)qJ{ARxBlFZ%pH+dGRTEv`8bq(pSY39$`hNXLk(UnCf?t@4AiqL&<12 zGW?`=CKL_n`n@N}OvBRJf#hdAtE+scFuNKlyF~emxNmW2@ZU{V$$ggR%CzoEv+Y8z z)L)amDz^5u0Fa^66hwVM#2K+d57frMV$_g(cDc_?hU-Cr+s2B?`}?{~@@l>+MfAoSd zf`hWavmYRa9@W+8|1dif8?N_A@GKI@EnEJwPsicqrq%EAH@GjE)AD8y+T667?J>7N znAjo-2@igih^R|&*fo0kP26gu5^H#kpVOy zf}60D!3(rHyQjCVF~OrjpkeU zdrM9>lcyB>Gw`8bw#R-S{=k++moO@*_~N9&?1oX}@;+ zDwk}OUC_aQW~9~66{T1gh_Ww~l)^)nRY_rIAW15>6p1f9-3FV%`vVJnfUJpvrXU_W z0XR_0_+y291u?t%`9Di?gp%U&1C+5J1_@5RLrSylt;L6lv`$XHIIMkTn7GZHz1Qf= zyo{!;ljj=5)>;lg`%hv3V~;j#b^U0tv!(t!t~e$X96Mb@r?%jSpNbn8)?;$>EFsH! zO&OU^Ov-=24Pw_MQC}p*v>4goX49q-JR2m9E1Y$p%-m(C)x~X89nW~Mg}8wG@;r-< z1eNhDbB$O_b|_?%&N1X~d#;DK48$eT)F+3=_*1a(hajlpHm zvEn+d+lt?w3F=qk8pFNWB$I1C=!G=>|3xRH>bgxR`nvA(If5U3GKuE3N$x?o%DTd~ z%fq)AgX2q$?Dabt&9I+is|Vep&K`@>in@@2{NZ(?i3T$bV1w{ZI^vRJP6&F;f1Bi1hG=6Mn(ly^){a;Nf~~I|NnOgIHT+yu^_0E9&=7!`eQ1wXbl-r5#$vM( z%JM-Yam=ye#f27ah?-RWvw{G1>H&HUXEWe(AySJuX6uPDKq!GB0fz%{Gq7<4SIv>+ vwAW1q8HoDA0T4os4*nW{Md1G@0;&mJnSAHQP1NyzOtha*fOpBJ=;Qwd1=JDF literal 0 HcmV?d00001 diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index 62b97d38e6..8b55f5cb2a 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -1,7 +1,7 @@ { com.badlogic.gdx.graphics.g2d.BitmapFont: { default-font: { - file: prose.fnt, + file: square.fnt, markupEnabled: true, scale: 0.5 } diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java index fe5553e141..a36a546a88 100644 --- a/core/src/io/anuke/mindustry/Mindustry.java +++ b/core/src/io/anuke/mindustry/Mindustry.java @@ -10,7 +10,6 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.I18NBundle; import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.io.BundleUtil; import io.anuke.mindustry.io.PlatformFunction; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.blocks.*; @@ -32,6 +31,7 @@ public class Mindustry extends ModuleCore { @Override public void openLink(String link){ } @Override public void addDialog(TextField field){} }; + public static boolean externalBundle = false; @Override public void init(){ @@ -46,10 +46,18 @@ public class Mindustry extends ModuleCore { public void loadBundle(){ I18NBundle.setExceptionOnMissingKey(false); - FileHandle handle = Gdx.files.internal("bundles/bundle"); + if(externalBundle){ + FileHandle handle = Gdx.files.local("bundle"); + + Locale locale = Locale.ENGLISH; + Core.bundle = I18NBundle.createBundle(handle, locale); + }else{ + FileHandle handle = Gdx.files.internal("bundles/bundle"); + + Locale locale = Locale.getDefault(); + Core.bundle = I18NBundle.createBundle(handle, locale); + } - Locale locale = Locale.getDefault(); - Core.bundle = I18NBundle.createBundle(handle, locale); //always initialize blocks in this order, otherwise there are ID errors Block[] blockClasses = { @@ -67,7 +75,6 @@ public class Mindustry extends ModuleCore { @Override public void postInit(){ Vars.control.reset(); - BundleUtil.buildBundle(Gdx.files.absolute("/home/anuke/bundle_en_US.properties")); } @Override diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 673eb697a5..0521042e48 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.ucore.scene.ui.layout.Unit; public class Vars{ - public static final boolean testAndroid = false; + public static final boolean testAndroid = true; //shorthand for whether or not this is running on android public static final boolean android = (Gdx.app.getType() == ApplicationType.Android) || testAndroid; //shorthand for whether or not this is running on GWT diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 3388ad12a3..3d199c9529 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -3,19 +3,12 @@ package io.anuke.mindustry.core; import static io.anuke.mindustry.Vars.*; import java.util.Arrays; -import java.util.Locale; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Buttons; import com.badlogic.gdx.Input.Keys; -import com.badlogic.gdx.audio.Music; -import com.badlogic.gdx.controllers.Controller; -import com.badlogic.gdx.controllers.ControllerAdapter; -import com.badlogic.gdx.controllers.Controllers; -import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.I18NBundle; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Mindustry; @@ -30,7 +23,6 @@ import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.input.AndroidInput; import io.anuke.mindustry.input.DesktopInput; import io.anuke.mindustry.input.InputHandler; -import io.anuke.mindustry.io.BundleUtil; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.Weapon; @@ -84,11 +76,6 @@ public class Control extends Module{ if(Mindustry.args.contains("-debug", false)) Vars.debug = true; - FileHandle handle = Gdx.files.internal("bundles/bundle"); - - Locale locale = Locale.getDefault(); - Core.bundle = I18NBundle.createBundle(handle, locale); - Inputs.useControllers(false); log("Total blocks loaded: " + Block.getAllBlocks().size); @@ -442,7 +429,7 @@ public class Control extends Module{ addItem(Item.stone, 40); if(debug){ - Arrays.fill(items, 2000000); + Arrays.fill(items, 999900); } } diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 087ab3c03b..b22f6a43c0 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -367,7 +367,7 @@ public class Renderer extends RendererModule{ //draw placement box if((player.recipe != null && Vars.control.hasItems(player.recipe.requirements) && (!ui.hasMouse() || android) - && control.input.drawPlace()) || (player.placeMode.delete && Inputs.keyDown("area_delete_mode"))){ + && control.input.drawPlace())){ player.placeMode.draw(control.input.getBlockX(), control.input.getBlockY(), control.input.getBlockEndX(), control.input.getBlockEndY()); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 514534177f..6a2e53b18c 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -58,8 +58,7 @@ public class UI extends SceneModule{ MapEditor editor; boolean wasPaused = false; - private Fragment blockfrag = new BlocksFragment(), - menufrag = new MenuFragment(), + private Fragment menufrag = new MenuFragment(), toolfrag = new ToolFragment(), hudfrag = new HudFragment(), placefrag = new PlacementFragment(), @@ -291,8 +290,6 @@ public class UI extends SceneModule{ build.begin(scene); weaponfrag.build(); - - blockfrag.build(); hudfrag.build(); diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index bfd5caeacd..1f97f09e3f 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -95,11 +95,11 @@ public class BlockRenderer{ } if(block.expanded || !expanded){ - if(block.layer != null){ + if(block.layer != null && block.isLayer(tile)){ addRequest(tile, block.layer); } - if(block.layer2 != null){ + if(block.layer2 != null && block.isLayer2(tile)){ addRequest(tile, block.layer2); } } diff --git a/core/src/io/anuke/mindustry/input/AndroidInput.java b/core/src/io/anuke/mindustry/input/AndroidInput.java index 48a1350d5a..97ee07b3a9 100644 --- a/core/src/io/anuke/mindustry/input/AndroidInput.java +++ b/core/src/io/anuke/mindustry/input/AndroidInput.java @@ -47,9 +47,9 @@ public class AndroidInput extends InputHandler{ return false; } - if(placing && pointer == 0 && !player.placeMode.pan && player.recipe != null){ + if(placing && pointer == 0 && !player.placeMode.pan && !breaking()){ player.placeMode.released(getBlockX(), getBlockY(), getBlockEndX(), getBlockEndY()); - }else if(pointer == 0 && !player.breakMode.pan && player.recipe == null && drawPlace()){ + }else if(pointer == 0 && !player.breakMode.pan && breaking() && drawPlace()){ player.breakMode.released(getBlockX(), getBlockY(), getBlockEndX(), getBlockEndY()); } placing = false; @@ -64,7 +64,7 @@ public class AndroidInput extends InputHandler{ lmousex = screenX; lmousey = screenY; - if((!player.placeMode.pan || player.recipe == null) && pointer == 0){ + if((!player.placeMode.pan || breaking()) && pointer == 0){ mousex = screenX; mousey = screenY; } @@ -184,4 +184,8 @@ public class AndroidInput extends InputHandler{ } return false; } + + public boolean breaking(){ + return player.recipe == null; + } } diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 1136ea2ccf..b94ca79bae 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -151,4 +151,9 @@ public class DesktopInput extends InputHandler{ } return 0; } + + @Override + public boolean keyDown(int keycode) { + return super.keyDown(keycode); + } } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 418766d066..cfe1f1e2b1 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -190,7 +190,8 @@ public abstract class InputHandler extends InputAdapter{ int worldy = dy + offsety + y; if(!(worldx == x && worldy == y)){ Tile toplace = world.tile(worldx, worldy); - toplace.setLinked((byte)(dx + offsetx), (byte)(dy + offsety)); + if(toplace != null) + toplace.setLinked((byte)(dx + offsetx), (byte)(dy + offsety)); } if(effects) Effects.effect(Fx.place, worldx * Vars.tilesize, worldy * Vars.tilesize); @@ -201,6 +202,8 @@ public abstract class InputHandler extends InputAdapter{ } if(effects && sound) Sounds.play("place"); + + result.placed(tile); } public void breakBlock(int x, int y, boolean sound){ diff --git a/core/src/io/anuke/mindustry/io/BundleUtil.java b/core/src/io/anuke/mindustry/io/BundleGen.java similarity index 96% rename from core/src/io/anuke/mindustry/io/BundleUtil.java rename to core/src/io/anuke/mindustry/io/BundleGen.java index fdb7fa98bf..157d6b1311 100644 --- a/core/src/io/anuke/mindustry/io/BundleUtil.java +++ b/core/src/io/anuke/mindustry/io/BundleGen.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.io; -import com.badlogic.gdx.Game; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; @@ -19,13 +18,11 @@ import io.anuke.ucore.scene.ui.SettingsDialog.SettingsTable.Setting; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; -import java.io.File; - -public class BundleUtil { +public class BundleGen { private static FileHandle file; public static void buildBundle(FileHandle file){ - BundleUtil.file = file; + BundleGen.file = file; file.writeString("", false); write("about.text=" + join(Vars.aboutText)); diff --git a/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java b/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java index fbb4a6eaec..ae6103336a 100644 --- a/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java @@ -233,7 +233,7 @@ public class MapEditorDialog extends Dialog{ ImageButton undo = tools.addIButton("icon-undo", 16*2f, () -> view.undo()).get(); ImageButton redo = tools.addIButton("icon-redo", 16*2f, () -> view.redo()).get(); - ImageButton grid = tools.addIButton("toggle", "icon-grid", 16*2f, () -> view.setGrid(!view.isGrid())).get(); + tools.addIButton("toggle", "icon-grid", 16*2f, () -> view.setGrid(!view.isGrid())).get(); undo.setDisabled(() -> !view.getStack().canUndo()); redo.setDisabled(() -> !view.getStack().canRedo()); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java index 9a262d59ae..066c9dc29e 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java @@ -10,8 +10,10 @@ import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.Recipe; import io.anuke.mindustry.resource.Section; @@ -28,11 +30,14 @@ import io.anuke.ucore.scene.event.Touchable; import io.anuke.ucore.scene.ui.*; import io.anuke.ucore.scene.ui.layout.Stack; import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.scene.ui.layout.Value; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Strings; public class BlocksFragment implements Fragment{ - private Table desctable; + private Table desctable, itemtable, blocks; + private Stack stack = new Stack(); private Array statlist = new Array<>(); private boolean shown = true; @@ -42,15 +47,25 @@ public class BlocksFragment implements Fragment{ abottom(); aright(); - visible(() -> !GameState.is(State.menu)); + visible(() -> !GameState.is(State.menu) && shown); - Table blocks = new table(){{ + blocks = new table(){{ - new table("button") {{ - visible(() -> player.recipe != null); - desctable = get(); - fillX(); - }}.end().uniformX(); + itemtable = new Table("button"); + itemtable.setVisible(() -> player.recipe == null); + + desctable = new Table("button"); + desctable.setVisible(() -> player.recipe != null); + desctable.update(() -> { + if(player.recipe == null && desctable.getChildren().size != 0){ + desctable.clear(); + } + }); + + stack.add(itemtable); + stack.add(desctable); + + add(stack).fillX().uniformX(); row(); @@ -83,7 +98,7 @@ public class BlocksFragment implements Fragment{ } }); button.setName("sectionbutton" + sec.name()); - add(button).growX().height(54).padTop(sec.ordinal() <= 2 ? -10 : -5); + add(button).growX().height(54).padRight(-1).padTop(sec.ordinal() <= 2 ? -10 : -5); button.getImageCell().size(40).padBottom(4).padTop(2); group.add(button); @@ -110,7 +125,7 @@ public class BlocksFragment implements Fragment{ } }); - table.add(image).size(size + 8).pad(2); + table.add(image).size(size + 8); image.getImageCell().size(size); image.update(() -> { @@ -146,35 +161,17 @@ public class BlocksFragment implements Fragment{ visible(() -> !GameState.is(State.menu) && shown); }}.end().get(); - - row(); - - ImageButton buttons[] = new ImageButton[2]; - float size = 46f; - - float t = 0.2f; - Interpolation ip = Interpolation.pow3Out; - - //TODO fix glitch when resizing - buttons[0] = new imagebutton("icon-arrow-down", 10*2, () -> { - if(blocks.getActions().size != 0) return; - blocks.actions(Actions.translateBy(0, -blocks.getHeight(), t, ip), Actions.call(() -> shown = false)); - buttons[0].actions(Actions.fadeOut(t)); - buttons[1].actions(Actions.fadeIn(t)); - }).padBottom(-5).visible(() -> shown).height(size).uniformX().fillX() - .update(i -> i.getStyle().imageUp = Core.skin.getDrawable(shown ? "icon-arrow-down" : "icon-arrow-up")).get(); - - buttons[1] = new imagebutton("icon-arrow-up", 10*2, () -> { - if(blocks.getActions().size != 0) return; - blocks.actions(Actions.translateBy(0, blocks.getHeight(), t, ip)); - shown = true; - buttons[0].actions(Actions.fadeIn(t)); - buttons[1].actions(Actions.fadeOut(t)); - }).touchable(() -> shown ? Touchable.disabled : Touchable.enabled).size(size).padBottom(-5).padLeft(-size).get(); - - buttons[1].getColor().a = 0f; }}.end(); } + + public void toggle(boolean show, float t, Interpolation ip){ + if(!show){ + blocks.actions(Actions.translateBy(0, -blocks.getHeight() - stack.getHeight(), t, ip), Actions.call(() -> shown = false)); + }else{ + shown = true; + blocks.actions(Actions.translateBy(0, -blocks.getTranslation().y, t, ip)); + } + } void updateRecipe(){ Recipe recipe = player.recipe; @@ -197,7 +194,7 @@ public class BlocksFragment implements Fragment{ header.addImage(region).size(8*5).padTop(4); Label nameLabel = new Label(recipe.result.formalName); nameLabel.setWrap(true); - header.add(nameLabel).padLeft(2).width(130f); + header.add(nameLabel).padLeft(2).width(120f); //extra info if(recipe.result.fullDescription != null){ @@ -288,4 +285,40 @@ public class BlocksFragment implements Fragment{ desctable.add(label).width(200).padTop(4).padBottom(2); } + + public void updateItems(){ + + itemtable.clear(); + itemtable.left(); + + if(control.getMode().infiniteResources){ + return; + } + + Item[] items = Item.values(); + + for(int i = 0; i < control.getItems().length; i ++){ + int amount = control.getItems()[i]; + if(amount == 0) continue; + String formatted = amount > 99999999 ? "inf" : format(amount); + Image image = new Image(Draw.region("icon-" + items[i].name())); + Label label = new Label(formatted); + label.setFontScale(fontscale*1.5f); + itemtable.add(image).size(8*3); + itemtable.add(label).expandX().left(); + if(i % 2 == 1 && i > 0) itemtable.row(); + } + } + + String format(int number){ + if(number > 1000000) { + return Strings.toFixed(number/1000000f, 1) + "[gray]mil"; + }else if(number > 10000){ + return number/1000 + "[gray]k"; + }else if(number > 1000){ + return Strings.toFixed(number/1000f, 1) + "[gray]k"; + }else{ + return number + ""; + } + } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 68b464b98f..d0564654e3 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -5,12 +5,14 @@ import static io.anuke.mindustry.Vars.*; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Interpolation; import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.GameMode; +import io.anuke.ucore.UCore; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Settings; @@ -20,16 +22,21 @@ import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.table; import io.anuke.ucore.scene.event.Touchable; import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Bundles; public class HudFragment implements Fragment{ - private Table itemtable, respawntable; - private Cell itemcell; + private ImageButton menu, flip, pause; + private Table respawntable; + private Table wavetable; + private boolean shown = true; + private BlocksFragment blockfrag = new BlocksFragment(); public void build(){ + //menu at top left new table(){{ atop(); @@ -37,41 +44,50 @@ public class HudFragment implements Fragment{ new table(){{ left(); - defaults().size(68).left(); + float dsize = 58; + defaults().size(dsize).left(); float isize = 40; - - new imagebutton("icon-menu", isize, ()->{ - ui.showMenu(); - }); - - new imagebutton("icon-settings", isize, ()->{ - ui.showPrefs(); - }); - new imagebutton("icon-pause", isize, ()->{ + menu = new imagebutton("icon-menu", isize, ()->{ + ui.showMenu(); + }).get(); + + flip = new imagebutton("icon-arrow-up", isize, ()->{ + if(wavetable.getActions().size != 0) return; + + float dur = 0.3f; + Interpolation in = Interpolation.pow3Out; + + flip.getStyle().imageUp = Core.skin.getDrawable(shown ? "icon-arrow-down" : "icon-arrow-up"); + + if(shown){ + blockfrag.toggle(false, dur, in); + wavetable.actions(Actions.translateBy(0, wavetable.getHeight() + dsize, dur, in), Actions.call(() -> shown = false)); + }else{ + shown = true; + blockfrag.toggle(true, dur, in); + wavetable.actions(Actions.translateBy(0, -wavetable.getTranslation().y, dur, in)); + } + + }).get(); + + pause = new imagebutton("icon-pause", isize, ()->{ GameState.set(GameState.is(State.paused) ? State.playing : State.paused); - }){{ - get().update(()->{ - get().getStyle().imageUp = Core.skin.getDrawable(GameState.is(State.paused) ? "icon-play" : "icon-pause"); - }); - }}; + }).update(i -> i.getStyle().imageUp = Core.skin.getDrawable(GameState.is(State.paused) ? "icon-play" : "icon-pause")).get(); + }}.end(); - + row(); new table(){{ - get().setTouchable(Touchable.enabled); + touchable(Touchable.enabled); + visible(() -> shown); addWaveTable(); }}.fillX().end(); row(); - - itemtable = new table("button").end().top().left().fillX().size(-1).get(); - itemtable.setTouchable(Touchable.enabled); - itemtable.setVisible(()-> !control.getMode().infiniteResources); - itemcell = get().getCell(itemtable); - get().setVisible(()->!GameState.is(State.menu)); + visible(()->!GameState.is(State.menu)); Label fps = new Label(()->(Settings.getBool("fps") ? (Gdx.graphics.getFramesPerSecond() + " FPS") : "")); row(); @@ -79,7 +95,7 @@ public class HudFragment implements Fragment{ }}.end(); - //ui table + //tutorial ui table new table(){{ control.getTutorial().buildUI(this); @@ -95,28 +111,11 @@ public class HudFragment implements Fragment{ new label("[orange]< "+ Bundles.get("text.paused") + " >").scale(0.75f).pad(6); }}.end(); }}.end(); - - //wave table... - new table(){{ - - if(!Vars.android){ - atop(); - aright(); - }else{ - abottom(); - aleft(); - } - - //addWaveTable(); - - visible(()->!GameState.is(State.menu)); - }}.end(); //respawn background table new table("white"){{ respawntable = get(); respawntable.setColor(Color.CLEAR); - }}.end(); //respawn table @@ -148,6 +147,8 @@ public class HudFragment implements Fragment{ new label("[red]DEBUG MODE").scale(0.5f).left(); }}.end(); } + + blockfrag.build(); } private String getEnemiesRemaining() { @@ -159,12 +160,12 @@ public class HudFragment implements Fragment{ private void addWaveTable(){ float uheight = 66f; - new table("button"){{ + wavetable = new table("button"){{ aleft(); new table(){{ aleft(); - new label(() -> Bundles.format("text.wave", control.getWave())).scale(fontscale*1.5f).left(); + new label(() -> Bundles.format("text.wave", control.getWave())).scale(fontscale*1.5f).left().padLeft(-6); row(); @@ -172,15 +173,15 @@ public class HudFragment implements Fragment{ getEnemiesRemaining() : (control.getTutorial().active() || Vars.control.getMode().toggleWaves) ? "$text.waiting" : Bundles.format("text.wave.waiting", (int) (control.getWaveCountdown() / 60f))) - .minWidth(140).left(); + .minWidth(140).padLeft(-6).padRight(-12).left(); - margin(12f); + margin(10f); get().marginLeft(6); }}.left().end(); playButton(uheight); - }}.height(uheight).fillX().expandX().end(); - + }}.height(uheight).fillX().expandX().end().get(); + wavetable.getParent().getParent().swapActor(wavetable.getParent(), menu.getParent()); } private void playButton(float uheight){ @@ -196,36 +197,12 @@ public class HudFragment implements Fragment{ l.setTouchable(!paused ? Touchable.enabled : Touchable.disabled); }); } - - public void updateItems(){ - - itemtable.clear(); - itemtable.left(); - - if(control.getMode().infiniteResources){ - return; - } - - Item[] items = Item.values(); - for(int i = 0; i < control.getItems().length; i ++){ - int amount = control.getItems()[i]; - if(amount == 0) continue; - String formatted = Mindustry.platforms.format(amount); - if(amount > 99999999){ - formatted = "inf"; - } - Image image = new Image(Draw.region("icon-" + items[i].name())); - Label label = new Label(formatted); - label.setFontScale(fontscale*1.5f); - itemtable.add(image).size(8*3); - itemtable.add(label).left(); - itemtable.row(); - } + public void updateItems(){ + blockfrag.updateItems(); } public void fadeRespawn(boolean in){ - respawntable.addAction(Actions.color(in ? new Color(0, 0, 0, 0.3f) : Color.CLEAR, 0.3f)); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index e410cf5780..6ee22be3d4 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -3,105 +3,141 @@ package io.anuke.mindustry.ui.fragments; import static io.anuke.mindustry.Vars.*; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.utils.Align; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.input.PlaceMode; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.builders.*; import io.anuke.ucore.scene.event.Touchable; import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ImageButton; +import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Mathf; public class PlacementFragment implements Fragment{ + boolean shown = false; + Table breaktable, next; public void build(){ if(android){ //placement table + + float s = 50f; + new table(){{ - visible(()->player.recipe != null && !GameState.is(State.menu)); + visible(() -> !GameState.is(State.menu)); + abottom(); aleft(); - + + ButtonGroup group = new ButtonGroup<>(); + new table(){{ + visible(() -> player.recipe != null); touchable(Touchable.enabled); - + aleft(); new label("$text.placemode"); row(); - + new table("pane"){{ margin(5f); aleft(); - ButtonGroup group = new ButtonGroup<>(); - - defaults().size(54, 58).pad(0); - - for(PlaceMode mode : PlaceMode.values()){ - if(!mode.shown || mode.delete) continue; - - defaults().padBottom(-5.5f); - - new imagebutton("icon-" + mode.name(), "toggle", 10*3, ()->{ - control.getInput().resetCursor(); - player.placeMode = mode; - }).group(group); - } - - row(); - - Color color = Color.GRAY;//Colors.get("accent"); //Color.valueOf("4d4d4d") - + + defaults().size(s, s + 4).padBottom(-5.5f); + + Color color = Color.GRAY; + new imagebutton("icon-cancel", 14*3, ()->{ player.recipe = null; }).imageColor(color) - .visible(()->player.recipe != null); - - new button("", ()->{}).get().setTouchable(Touchable.disabled);; - + .visible(()->player.recipe != null); + + for(PlaceMode mode : PlaceMode.values()){ + if(!mode.shown || mode.delete) continue; + + new imagebutton("icon-" + mode.name(), "toggle", 10*3, ()->{ + control.getInput().resetCursor(); + player.placeMode = mode; + }).group(group); + } + new imagebutton("icon-arrow", 14*3, ()->{ player.rotation = Mathf.mod(player.rotation + 1, 4); }).imageColor(color).visible(() -> player.recipe != null).update(image ->{ image.getImage().setRotation(player.rotation*90); image.getImage().setOrigin(Align.center); }); - - }}.left().end(); - }}.end(); - }}.end(); - - new table(){{ - visible(()->player.recipe == null && !GameState.is(State.menu)); - abottom(); - aleft(); - - new label("$text.breakmode"); + + }}.padBottom(-5).left().end(); + }}.left().end(); + row(); - - new table("pane"){{ - margin(5f); - touchable(Touchable.enabled); - aleft(); - ButtonGroup group = new ButtonGroup<>(); - - defaults().size(54, 58).pad(0); - - for(PlaceMode mode : PlaceMode.values()){ - if(!mode.shown || !mode.delete) continue; - - defaults().padBottom(-5.5f); - - new imagebutton("icon-" + mode.name(), "toggle", 10*3, ()->{ - control.getInput().resetCursor(); - player.breakMode = mode; - }){{ - group.add(get()); - }}; - } - - }}.end(); - }}.end(); + + new table(){{ + abottom(); + aleft(); + + height(s+5+4); + + next = new table("pane"){{ + margin(5f); + + defaults().padBottom(-5.5f); + + new imagebutton("icon-arrow-right", 10 * 3, () -> { + float dur = 0.3f; + Interpolation in = Interpolation.pow3Out; + if(breaktable.getActions().size != 0) return; + + breaktable.getParent().swapActor(breaktable, next); + + if(shown){ + breaktable.actions(Actions.translateBy(-breaktable.getWidth() - 5, 0, dur, in), Actions.call(() -> shown = false)); + }else{ + shown = true; + breaktable.actions(Actions.translateBy(-breaktable.getTranslation().x - 5, 0, dur, in)); + } + }).size(s, s+4); + + }}.end().get(); + + breaktable = new table("pane"){{ + visible(() -> shown); + margin(5f); + marginLeft(0f); + touchable(Touchable.enabled); + aleft(); + + defaults().size(s, s+4); + + for(PlaceMode mode : PlaceMode.values()){ + if(!mode.shown || !mode.delete) continue; + + defaults().padBottom(-5.5f); + + new imagebutton("icon-" + mode.name(), "toggle", 10*3, ()->{ + control.getInput().resetCursor(); + player.breakMode = mode; + player.placeMode = mode; + }).group(group); + } + + }}.end().get(); + + breaktable.getParent().swapActor(breaktable, next); + + breaktable.getTranslation().set(-breaktable.getPrefWidth(), 0); + + }}.end().get(); + + //one.getParent().swapActor(one, two); + + }}.end(); } } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java b/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java index 0ed2654e16..65b43635eb 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java @@ -52,7 +52,7 @@ public class WeaponFragment implements Fragment{ String description = weapon.description; tiptable.background("button"); - tiptable.add("weapon."+weapon.name()+".name", 0.5f).left().padBottom(3f); + tiptable.add("$weapon."+weapon.name()+".name", 0.5f).left().padBottom(3f); tiptable.row(); tiptable.row(); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 2479b544fa..154702b16f 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -48,7 +48,7 @@ public class Block{ /**whether you can break this with rightclick*/ public boolean breakable; /**whether this block can be drowned in*/ - public boolean liquid; + public boolean liquid; /**time it takes to break*/ public float breaktime = 18; /**tile entity health*/ @@ -91,12 +91,15 @@ public class Block{ this.id = lastid++; } - + + public boolean isLayer(Tile tile){return true;} + public boolean isLayer2(Tile tile){return true;} public void drawLayer(Tile tile){} public void drawLayer2(Tile tile){} public void drawSelect(Tile tile){} public void drawPlace(int x, int y, int rotation, boolean valid){} public void postInit(){} + public void placed(Tile tile){} public void getStats(Array list){ list.add("[gray]size: " + width + "x" + height); @@ -124,6 +127,7 @@ public class Block{ } public void handleItem(Item item, Tile tile, Tile source){ + if(tile.entity == null) return; tile.entity.addItem(item, 1); } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java index e1cae1bace..e1d9c82ff1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java @@ -56,6 +56,11 @@ public class Conveyor extends Block{ (Timers.time() % ((20 / 100f) / speed) < (10 / 100f) / speed && acceptItem(Item.stone, tile, null) ? "" : "move"), tile.worldx(), tile.worldy(), rotation * 90); } + + @Override + public boolean isLayer(Tile tile){ + return tile.entity().convey.size > 0; + } @Override public void drawLayer(Tile tile){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java index 8bbfb3bf6b..159a1008ab 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java @@ -25,7 +25,7 @@ public class Junction extends Block{ Tile to = tile.getNearby()[dir]; Timers.run(15, ()->{ - if(to == null || to.entity == null) return; + if(to == null) return; to.block().handleItem(item, to, tile); }); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java index e705a69204..0b681d6e1b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java @@ -21,11 +21,13 @@ import io.anuke.ucore.util.Mathf; public class Teleporter extends Block implements Configurable{ public static final Color[] colorArray = {Color.ROYAL, Color.ORANGE, Color.SCARLET, Color.FOREST, Color.PURPLE, Color.GOLD, Color.PINK}; public static final int colors = colorArray.length; - - private static Array removal = new Array<>(); - private static Array returns = new Array<>(); + private static ObjectSet[] teleporters = new ObjectSet[colors]; - + private static byte lastColor = 0; + + private Array removal = new Array<>(); + private Array returns = new Array<>(); + static{ for(int i = 0; i < colors; i ++){ teleporters[i] = new ObjectSet<>(); @@ -38,6 +40,11 @@ public class Teleporter extends Block implements Configurable{ solid = true; health = 80; } + + @Override + public void placed(Tile tile){ + tile.entity().color = lastColor; + } @Override public void draw(Tile tile){ @@ -70,12 +77,14 @@ public class Teleporter extends Block implements Configurable{ table.addIButton("icon-arrow-left", 10*3, ()->{ entity.color = (byte)Mathf.mod(entity.color - 1, colors); + lastColor = entity.color; }); table.add().size(40f); table.addIButton("icon-arrow-right", 10*3, ()->{ entity.color = (byte)Mathf.mod(entity.color + 1, colors); + lastColor = entity.color; }); } @@ -100,7 +109,7 @@ public class Teleporter extends Block implements Configurable{ return new TeleporterEntity(); } - static Array findLinks(Tile tile){ + private Array findLinks(Tile tile){ TeleporterEntity entity = tile.entity(); removal.clear(); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java index 9fa7a5fe72..e972907dd8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java @@ -52,14 +52,17 @@ public class Drill extends Block{ tryDump(tile); } } + + @Override + public boolean isLayer(Tile tile){ + return tile.floor() != resource && resource != null && !(resource.drops.equals(tile.floor().drops)); + } @Override public void drawLayer(Tile tile){ - if(tile.floor() != resource && resource != null && !(resource.drops.equals(tile.floor().drops))){ - Draw.colorl(0.85f + Mathf.absin(Timers.time(), 6f, 0.15f)); - Draw.rect("cross", tile.worldx(), tile.worldy()); - Draw.color(); - } + Draw.colorl(0.85f + Mathf.absin(Timers.time(), 6f, 0.15f)); + Draw.rect("cross", tile.worldx(), tile.worldy()); + Draw.color(); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java index d031b423be..cd87d351dd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java @@ -91,11 +91,7 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{ public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ LiquidPowerEntity entity = tile.entity(); - if(liquid != generateLiquid){ - return false; - } - - return entity.liquidAmount + amount < liquidCapacity && (entity.liquid == liquid || entity.liquidAmount <= 0.01f); + return liquid == generateLiquid && entity.liquidAmount + amount < liquidCapacity && (entity.liquid == liquid || entity.liquidAmount <= 0.01f); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java index 762841c289..17762f97ee 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java @@ -7,6 +7,7 @@ import java.io.IOException; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.effect.DamageArea; @@ -18,11 +19,16 @@ import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Tmp; -public class NuclearReactor extends LiquidItemPowerGenerator{ +//TODO possibly proken +public class NuclearReactor extends LiquidPowerGenerator{ protected final int timerFuel = timers++; - + + protected Item generateItem; + protected int itemInput = 5; + protected int itemCapacity = 30; protected Color coolColor = new Color(1, 1, 1, 0f); protected Color hotColor = Color.valueOf("ff9575a3"); protected int fuelUseTime = 140; //time to consume 1 fuel @@ -44,6 +50,12 @@ public class NuclearReactor extends LiquidItemPowerGenerator{ explosive = true; powerCapacity = 80f; } + + @Override + public void getStats(Array list){ + super.getStats(list); + list.add("[powerinfo]Input Item: " + generateItem); + } @Override public void update(Tile tile){ @@ -139,18 +151,26 @@ public class NuclearReactor extends LiquidItemPowerGenerator{ @Override public void drawSelect(Tile tile){ super.drawSelect(tile); - + NuclearReactorEntity entity = tile.entity(); + Vector2 offset = getPlaceOffset(); + + Vars.renderer.drawBar(Color.GREEN, tile.worldx() + offset.x, tile.worldy() + 6 + + offset.y + height*Vars.tilesize/2f, (float)entity.getItem(generateItem) / itemCapacity); + Draw.reset(); float fract = entity.heat; if(fract > 0) fract = Mathf.clamp(fract + 0.2f, 0.24f, 1f); - Vector2 offset = getPlaceOffset(); - Vars.renderer.drawBar(Color.ORANGE, tile.worldx() + offset.x, tile.worldy() + Vars.tilesize * height/2f + 10 + offset.y, fract); } + + @Override + public boolean acceptItem(Item item, Tile tile, Tile source){ + return item == generateItem && tile.entity.getItem(generateItem) < itemCapacity; + } @Override public void draw(Tile tile){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java index 67b15b9978..e09818bc10 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java @@ -49,14 +49,17 @@ public class Pump extends LiquidBlock{ Draw.rect("blank", tile.worldx(), tile.worldy(), 2, 2); Draw.color(); } + + @Override + public boolean isLayer(Tile tile) { + return tile.floor().liquidDrop == null; + } @Override public void drawLayer(Tile tile){ - if(tile.floor().liquidDrop == null){ - Draw.colorl(0.85f + Mathf.absin(Timers.time(), 6f, 0.15f)); - Draw.rect("cross", tile.worldx(), tile.worldy()); - Draw.color(); - } + Draw.colorl(0.85f + Mathf.absin(Timers.time(), 6f, 0.15f)); + Draw.rect("cross", tile.worldx(), tile.worldy()); + Draw.color(); } @Override