From 07bc8a04f6db797ff0631e174f9591e60b06711d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 6 Jan 2018 11:43:41 -0500 Subject: [PATCH] Implemented dual wielding --- core/assets/bundles/bundle.properties | 2 +- core/src/io/anuke/mindustry/core/Control.java | 4 +- .../io/anuke/mindustry/core/NetClient.java | 2 +- .../io/anuke/mindustry/core/NetServer.java | 3 +- core/src/io/anuke/mindustry/core/UI.java | 2 - .../io/anuke/mindustry/entities/Player.java | 6 +- .../anuke/mindustry/input/DesktopInput.java | 2 +- core/src/io/anuke/mindustry/io/NetworkIO.java | 3 +- .../anuke/mindustry/io/versions/Save12.java | 2 +- .../anuke/mindustry/io/versions/Save13.java | 2 +- .../anuke/mindustry/io/versions/Save14.java | 2 +- .../mindustry/resource/UpgradeRecipes.java | 6 +- .../io/anuke/mindustry/resource/Weapon.java | 12 +- .../mindustry/ui/dialogs/UpgradeDialog.java | 132 ------------------ .../ui/fragments/BlocksFragment.java | 7 +- .../ui/fragments/WeaponFragment.java | 14 +- .../mindustry/world/blocks/DefenseBlocks.java | 4 +- .../types/production/WeaponFactory.java | 32 +++-- 18 files changed, 60 insertions(+), 177 deletions(-) delete mode 100644 core/src/io/anuke/mindustry/ui/dialogs/UpgradeDialog.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6b5af486b2..5c4822eb88 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -122,7 +122,7 @@ text.settings.game=Game text.settings.sound=Sound text.settings.graphics=Graphics text.upgrades=Upgrades -text.purchased=[LIME]Purchased! +text.purchased=[LIME]Created! text.weapons=Weapons text.paused=Paused text.respawn=Respawning in diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index abd9e0402f..cae303d372 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -141,6 +141,7 @@ public class Control extends Module{ "select", Input.MOUSE_LEFT, "break", Input.MOUSE_RIGHT, "shoot", Input.MOUSE_LEFT, + "weapon_alt_select", Input.Q, "zoom_hold", Input.CONTROL_LEFT, "zoom", new Axis(Input.SCROLL), "menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE, @@ -223,7 +224,7 @@ public class Control extends Module{ weapons.clear(); weapons.add(Weapon.blaster); - player.weapon = weapons.first(); + player.weaponLeft = player.weaponRight = weapons.first(); lastUpdated = -1; wave = 1; @@ -672,5 +673,4 @@ public class Control extends Module{ } } } - } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 650de8cbdd..825dc8b620 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -284,7 +284,7 @@ public class NetClient extends Module { public void handleShoot(Weapon weapon, float x, float y, float angle){ ShootPacket packet = new ShootPacket(); - packet.weaponid = (byte)weapon.id; + packet.weaponid = weapon.id; packet.x = x; packet.y = y; packet.rotation = angle; diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 647bbcbb18..bc318c2bd4 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -156,8 +156,7 @@ public class NetServer extends Module{ Net.handleServer(UpgradePacket.class, packet -> { Weapon weapon = (Weapon)Upgrade.getByID(packet.id); - //TODO - //Vars.control.removeItems(weapon.requirements); + Vars.control.removeItems(UpgradeRecipes.get(weapon)); }); } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index e6aab81d61..7ec1a50c32 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -38,7 +38,6 @@ public class UI extends SceneModule{ public SettingsMenuDialog settings; public ControlsDialog controls; public MapEditorDialog editor; - public UpgradeDialog upgrades; public final MenuFragment menufrag = new MenuFragment(); public final ToolFragment toolfrag = new ToolFragment(); @@ -135,7 +134,6 @@ public class UI extends SceneModule{ join = new JoinDialog(); discord = new DiscordDialog(); load = new LoadDialog(); - upgrades = new UpgradeDialog(); levels = new LevelDialog(); settings = new SettingsMenuDialog(); paused = new PausedDialog(); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 8f31600b8f..64bf481216 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -22,7 +22,8 @@ public class Player extends DestructibleEntity implements Syncable{ public String name = "name"; public boolean isAndroid; - public Weapon weapon = Weapon.blaster; + public Weapon weaponLeft = Weapon.blaster; + public Weapon weaponRight = Weapon.blaster; public Mech mech = Mech.standard; public float angle; @@ -129,7 +130,8 @@ public class Player extends DestructibleEntity implements Syncable{ && !ui.hasMouse() && !control.getInput().onConfigurable(); if(shooting){ - weapon.update(player); + weaponLeft.update(player, true); + weaponRight.update(player, false); } if(Inputs.keyDown("dash") && Timers.get(this, "dashfx", 3) && vector.len() > 0){ diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 01f53a3651..bfeacb5768 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -80,7 +80,7 @@ public class DesktopInput extends InputHandler{ for(int i = 1; i <= 6 && i <= control.getWeapons().size; i ++){ if(Inputs.keyTap("weapon_" + i)){ - player.weapon = control.getWeapons().get(i - 1); + player.weaponLeft = player.weaponRight = control.getWeapons().get(i - 1); ui.weaponfrag.update(); } } diff --git a/core/src/io/anuke/mindustry/io/NetworkIO.java b/core/src/io/anuke/mindustry/io/NetworkIO.java index 28008ca20c..e7b0c91512 100644 --- a/core/src/io/anuke/mindustry/io/NetworkIO.java +++ b/core/src/io/anuke/mindustry/io/NetworkIO.java @@ -154,7 +154,7 @@ public class NetworkIO { load(file.read()); } - //TODO GWT support + public static void load(InputStream is){ try(DataInputStream stream = new DataInputStream(is)){ @@ -187,6 +187,7 @@ public class NetworkIO { Vars.control.getWeapons().clear(); Vars.control.getWeapons().add(Weapon.blaster); + Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster; Vars.ui.weaponfrag.update(); //enemies diff --git a/core/src/io/anuke/mindustry/io/versions/Save12.java b/core/src/io/anuke/mindustry/io/versions/Save12.java index 02877137c2..6140076e89 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save12.java +++ b/core/src/io/anuke/mindustry/io/versions/Save12.java @@ -61,7 +61,7 @@ public class Save12 extends SaveFileVersion { Vars.control.getWeapons().clear(); Vars.control.getWeapons().add(Weapon.blaster); - Vars.player.weapon = Weapon.blaster; + Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster; int weapons = stream.readByte(); diff --git a/core/src/io/anuke/mindustry/io/versions/Save13.java b/core/src/io/anuke/mindustry/io/versions/Save13.java index bd000fa9ef..1ae5bd124f 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save13.java +++ b/core/src/io/anuke/mindustry/io/versions/Save13.java @@ -61,7 +61,7 @@ public class Save13 extends SaveFileVersion { Vars.control.getWeapons().clear(); Vars.control.getWeapons().add(Weapon.blaster); - Vars.player.weapon = Weapon.blaster; + Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster; int weapons = stream.readByte(); diff --git a/core/src/io/anuke/mindustry/io/versions/Save14.java b/core/src/io/anuke/mindustry/io/versions/Save14.java index 18c045f74a..dd72468a62 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save14.java +++ b/core/src/io/anuke/mindustry/io/versions/Save14.java @@ -79,7 +79,7 @@ public class Save14 extends SaveFileVersion{ Vars.control.getWeapons().clear(); Vars.control.getWeapons().add(Weapon.blaster); - Vars.player.weapon = Weapon.blaster; + Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster; int weapons = stream.readByte(); diff --git a/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java b/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java index a7e487c8a5..050f1d638c 100644 --- a/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java +++ b/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java @@ -13,8 +13,10 @@ public class UpgradeRecipes { Weapon.mortar, list(stack(Item.titanium, 40), stack(Item.steel, 60)) ); - public ItemStack[] get(Upgrade upgrade){ - return recipes.get(upgrade); + private static final ItemStack[] empty = {}; + + public static ItemStack[] get(Upgrade upgrade){ + return recipes.get(upgrade, empty); } public static Entries getAllRecipes(){ diff --git a/core/src/io/anuke/mindustry/resource/Weapon.java b/core/src/io/anuke/mindustry/resource/Weapon.java index e269639bec..b9fa162867 100644 --- a/core/src/io/anuke/mindustry/resource/Weapon.java +++ b/core/src/io/anuke/mindustry/resource/Weapon.java @@ -30,7 +30,7 @@ public class Weapon extends Upgrade{ multigun = new Weapon("multigun", 6, BulletType.multishot){ { effect = Fx.shoot2; - inaccuracy = 8f; + inaccuracy = 6f; } }, flamer = new Weapon("flamer", 5, BulletType.flame){ @@ -39,7 +39,7 @@ public class Weapon extends Upgrade{ inaccuracy = 12f; } }, - railgun = new Weapon("railgun", 40, BulletType.sniper){ + railgun = new Weapon("railgun", 30, BulletType.sniper){ { shootsound = "railgun"; effect = Fx.railshoot; @@ -67,9 +67,11 @@ public class Weapon extends Upgrade{ this.type = type; } - public void update(Player p){ - if(Timers.get(p, "reload", reload)){ - shoot(p, p.x, p.y, Angles.mouseAngle(p.x, p.y)); + public void update(Player p, boolean left){ + if(Timers.get(p, "reload"+left, reload)){ + float ang = Angles.mouseAngle(p.x, p.y); + Angles.translation(ang + Mathf.sign(left) * -70f, 2f); + shoot(p, p.x + Angles.x(), p.y + Angles.y(), Angles.mouseAngle(p.x + Angles.x(), p.y + Angles.y())); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/UpgradeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/UpgradeDialog.java deleted file mode 100644 index f6182bbca3..0000000000 --- a/core/src/io/anuke/mindustry/ui/dialogs/UpgradeDialog.java +++ /dev/null @@ -1,132 +0,0 @@ -package io.anuke.mindustry.ui.dialogs; - - -public class UpgradeDialog extends FloatingDialog{ - boolean wasPaused = false; - - public UpgradeDialog() { - super("$text.upgrades"); - setup(); - } - - void setup(){ - /* - addCloseButton(); - - hidden(()->{ - if(!wasPaused) - GameState.set(State.playing); - }); - shown(()->{ - wasPaused = GameState.is(State.paused); - GameState.set(State.paused); - }); - - Table weptab = new Table(); - weptab.margin(20); - - int i = 0; - for(Upgrade upgrade : Upgrade.getAllUpgrades()){ - if(!(upgrade instanceof Weapon)) continue; - - Weapon weapon = (Weapon)upgrade; - - TextButton button = new TextButton(weapon.localized()); - - Image img = new Image(Draw.region(weapon.name)); - button.add(img).size(8*5); - button.getCells().reverse(); - button.row(); - button.margin(14); - button.getLabelCell().left(); - button.pack(); - - button.update(()->{ - if(control.hasWeapon(weapon)){ - button.setDisabled(true); - button.setColor(Color.GRAY); - }else if(!control.hasItems(weapon.requirements)){ - button.setDisabled(true); - }else{ - button.setDisabled(false); - button.setColor(Color.WHITE); - } - }); - - if(i > 0 && (i)%2==0) - weptab.row(); - - i++; - - weptab.add(button).width(220); - - Table tiptable = new Table(); - - Listenable run = ()->{ - tiptable.clearChildren(); - - String description = weapon.description; - - tiptable.background("pane"); - tiptable.add("[orange]" + weapon.localized(), 0.5f).left().padBottom(4f); - - Table reqtable = new Table(); - - tiptable.row(); - tiptable.add(reqtable).left(); - - if(!control.hasWeapon(weapon)){ - ItemStack[] req = weapon.requirements; - for(ItemStack s : req){ - - int amount = Math.min(control.getAmount(s.item), s.amount); - reqtable.addImage(Draw.region("icon-" + s.item.name)).padRight(3).size(8*2); - reqtable.add( - (amount >= s.amount ? "" : "[RED]") - + amount + " / " +s.amount, 0.5f).left(); - reqtable.row(); - } - } - - tiptable.row(); - tiptable.add().size(10); - tiptable.row(); - tiptable.add("[gray]" + description).left(); - tiptable.row(); - if(control.hasWeapon(weapon)){ - tiptable.add("$text.purchased").padTop(6).left(); - } - tiptable.margin(14f); - }; - - run.listen(); - - Tooltip tip = new Tooltip<>(tiptable, run); - - tip.setInstant(true); - - button.addListener(tip); - - button.clicked(()->{ - if(button.isDisabled()) return; - - control.removeItems(weapon.requirements); - control.addWeapon(weapon); - ui.weaponfrag.update(); - run.listen(); - Effects.sound("purchase"); - - if(Net.active() && Net.client()){ - Vars.netClient.handleUpgrade(weapon); - } - }); - } - - content().add("$text.weapons"); - content().row(); - content().add(weptab); - content().row(); - */ - } - -} diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java index a27486933c..8dc61da30d 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java @@ -241,7 +241,6 @@ public class BlocksFragment implements Fragment{ }).expandX().padLeft(3).top().right().size(40f, 44f).padTop(-2); } - desctable.add().pad(2); Table requirements = new Table(); @@ -252,12 +251,11 @@ public class BlocksFragment implements Fragment{ desctable.left(); for(ItemStack stack : recipe.requirements){ - ItemStack fs = stack; requirements.addImage(Draw.region("icon-"+stack.item.name)).size(8*3); Label reqlabel = new Label(""); reqlabel.update(()->{ - int current = control.getAmount(fs.item); + int current = control.getAmount(stack.item); String text = Mathf.clamp(current, 0, stack.amount) + "/" + stack.amount; reqlabel.setColor(current < stack.amount ? Colors.get("missingitems") : Color.WHITE); @@ -271,8 +269,7 @@ public class BlocksFragment implements Fragment{ desctable.row(); - Label label = new Label("[health]"+ Bundles.get("text.health")+": " + recipe.result.health + (recipe.result.description == null ? - "" : ("\n[]" + recipe.result.description))); + Label label = new Label("[health]"+ Bundles.get("text.health")+": " + recipe.result.health); label.setWrap(true); desctable.add(label).width(200).padTop(4).padBottom(2); diff --git a/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java b/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java index 81a3822331..ae98372492 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/WeaponFragment.java @@ -5,6 +5,7 @@ import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.resource.Weapon; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Draw; +import io.anuke.ucore.core.Inputs; import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.Tooltip; @@ -29,6 +30,7 @@ public class WeaponFragment implements Fragment{ weapontable.clearChildren(); ButtonGroup group = new ButtonGroup<>(); + group.setMaxCheckCount(2); weapontable.defaults().size(58, 62); @@ -39,12 +41,16 @@ public class WeaponFragment implements Fragment{ group.add(button); button.clicked(()->{ - if(weapon == player.weapon) return; - player.weapon = weapon; + //if(weapon == player.weapon) return; + if(Inputs.keyDown("weapon_alt_select")){ + player.weaponRight = weapon; + }else { + player.weaponLeft = weapon; + } button.setChecked(true); }); - button.setChecked(weapon == player.weapon); + button.update(() -> button.setChecked(weapon == player.weaponLeft || weapon == player.weaponRight)); //TODO weapontable.add(button); @@ -52,7 +58,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.localized(), 0.5f).left().padBottom(3f); tiptable.row(); tiptable.row(); diff --git a/core/src/io/anuke/mindustry/world/blocks/DefenseBlocks.java b/core/src/io/anuke/mindustry/world/blocks/DefenseBlocks.java index 0a53b84e92..4d27db33be 100644 --- a/core/src/io/anuke/mindustry/world/blocks/DefenseBlocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/DefenseBlocks.java @@ -50,7 +50,7 @@ public class DefenseBlocks{ repairturret = new RepairTurret("repairturret"){ { range = 30; - reload = 60f; + reload = 40f; health = 60; } }, @@ -58,7 +58,7 @@ public class DefenseBlocks{ megarepairturret = new RepairTurret("megarepairturret"){ { range = 44; - reload = 30f; + reload = 20f; powerUsed = 0.15f; health = 90; } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java b/core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java index f36fbff522..74f9811191 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java @@ -1,13 +1,16 @@ package io.anuke.mindustry.world.blocks.types.production; -import com.badlogic.gdx.utils.ObjectMap; +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.Upgrade; +import io.anuke.mindustry.resource.UpgradeRecipes; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.types.Configurable; import io.anuke.ucore.core.Draw; +import io.anuke.ucore.core.Effects; import io.anuke.ucore.function.Listenable; import io.anuke.ucore.scene.style.TextureRegionDrawable; import io.anuke.ucore.scene.ui.ImageButton; @@ -17,12 +20,11 @@ import io.anuke.ucore.scene.ui.layout.Table; import static io.anuke.mindustry.Vars.control; public class WeaponFactory extends Block implements Configurable{ - protected ObjectMap costs = new ObjectMap<>(); public WeaponFactory(String name){ super(name); solid = true; - breakable = true; + destructible = true; } @Override @@ -31,13 +33,11 @@ public class WeaponFactory extends Block implements Configurable{ Table content = new Table(); - content.add("$text.upgrades").colspan(3).row(); - for(Upgrade upgrade : Upgrade.getAllUpgrades()){ if(!(upgrade instanceof Weapon)) continue; Weapon weapon = (Weapon)upgrade; - ItemStack[] requirements = costs.get(weapon); + ItemStack[] requirements = UpgradeRecipes.get(weapon); Table tiptable = new Table(); @@ -47,7 +47,7 @@ public class WeaponFactory extends Block implements Configurable{ String description = weapon.description; tiptable.background("pane"); - tiptable.add("[orange]" + weapon.localized(), 0.5f).left().padBottom(4f); + tiptable.add("[orange]" + weapon.localized(), 0.5f).left().padBottom(2f); Table reqtable = new Table(); @@ -67,14 +67,14 @@ public class WeaponFactory extends Block implements Configurable{ } tiptable.row(); - tiptable.add().size(10); + tiptable.add().size(4); tiptable.row(); tiptable.add("[gray]" + description).left(); tiptable.row(); if(control.hasWeapon(weapon)){ - tiptable.add("$text.purchased").padTop(6).left(); + tiptable.add("$text.purchased").padTop(4).left(); } - tiptable.margin(14f); + tiptable.margin(8f); }; run.listen(); @@ -84,10 +84,18 @@ public class WeaponFactory extends Block implements Configurable{ tip.setInstant(true); ImageButton button = content.addImageButton("white", 8*4, () -> { + control.removeItems(requirements); + control.addWeapon(weapon); + Vars.ui.weaponfrag.update(); + run.listen(); + Effects.sound("purchase"); - }).size(49f, 54f).padBottom(-5) - .get(); + if(Net.active() && Net.client()){ + Vars.netClient.handleUpgrade(weapon); + } + }).size(49f, 54f).padBottom(-5).get(); + button.setDisabled(() -> control.hasWeapon(weapon)); button.getStyle().imageUp = new TextureRegionDrawable(Draw.region(weapon.name)); button.addListener(tip);