package com.rebelkeithy.ftl.view; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.rebelkeithy.ftl.systems.AbstractShipSystem; import com.rebelkeithy.ftl.systems.WeaponSystem; import com.rebelkeithy.ftl.view.upgrade.Sounds; import com.rebelkeithy.ftl.weapons.Weapon; public class WeaponSystemRenderer extends SystemRenderer { private Texture weapons1; private Texture weapons2; private Texture weapons3; private Texture weaponBoxEmpty; private Button autofire; private boolean dragging = false; private boolean readyToDrag = false; private int dragX; private int dragY; private int draggingSlot; public WeaponSystemRenderer(AbstractShipSystem system, int systemX) { super(system, systemX); weapons1 = TextureRegistry.registerSprite("weapons_box_1", "box_weapons_bottom"); weapons2 = TextureRegistry.registerSprite("weapons_box_1", "box_weapons_bottom2"); weapons3 = TextureRegistry.registerSprite("weapons_box_1", "box_weapons_bottom3"); Pixmap weaponBoxEmptyMap = new Pixmap(95, 39, Format.RGBA8888); weaponBoxEmptyMap.setColor(60/256f, 60/256f, 60/256f, 0.5f); weaponBoxEmptyMap.fill(); weaponBoxEmptyMap.setColor(190/256f, 190/256f, 190/256f, 1); weaponBoxEmptyMap.drawRectangle(8, 0, 87, 39); weaponBoxEmptyMap.drawRectangle(9, 1, 85, 37); weaponBoxEmpty = new Texture(weaponBoxEmptyMap); weaponBoxEmptyMap.dispose(); Texture autofire_up = TextureRegistry.registerSprite("autofire_up", "box_weapons_autofire_off"); Texture autofire_down = TextureRegistry.registerSprite("autofire_down", "box_weapons_autofire_select"); Texture autofire_hover = TextureRegistry.registerSprite("autofire_hover", "box_weapons_autofire_on"); autofire = new ButtonAutofire(511, 10, 522, 23, 120, 29, autofire_up); autofire.setDownImage(autofire_down); autofire.setHoverImage(autofire_hover); FTLView.inputHandler.registerButton(autofire); } public void render(SpriteBatch batch) { super.render(batch); int screenX = Gdx.input.getX(); int screenY = Gdx.graphics.getHeight() - Gdx.input.getY(); batch.draw(weapons1, systemX + 13, systemY - 1); autofire.render(batch); float maxChargeTime = 0; for(int i = 0; i < 4; i++) { Weapon weapon = ((WeaponSystem)system).getWeapon(i); if(weapon != null) { if(weapon.getMaxCharge() > maxChargeTime) { maxChargeTime = (float) weapon.getMaxCharge(); } } } for(int i = 0; i < 4; i++) { if(((WeaponSystem)system).getWeapon(i) != null) { WeaponBox boxRenderer = new WeaponBox(((WeaponSystem)system).getWeapon(i)); if(dragging && draggingSlot == i) { boxRenderer.render(batch, systemX + 29 + i*97 + (screenX - dragX), systemY + 34 + (screenY - dragY), i+1, maxChargeTime); } else { boxRenderer.render(batch, systemX + 29 + i*97, systemY + 34, i+1, maxChargeTime); } } else { batch.draw(weaponBoxEmpty, systemX + 29 + i*97, systemY + 34); } } if(Gdx.input.isButtonPressed(0)) { if(readyToDrag == false) { draggingSlot = -1; for(int i = 0; i < 4; i++) { if(screenX > systemX + 29 + i*97 && screenX < systemX + 29 + i*97 + 95 && screenY > systemY + 34 && screenY < systemY + 34 + 39) { draggingSlot = i; dragX = screenX; dragY = screenY; break; } } readyToDrag = true; } else { if(draggingSlot != -1 && (screenX - dragX) * (screenX - dragX) + (screenY - dragY) * (screenY - dragY) > 55) { dragging = true; } } } else { dragging = false; readyToDrag = false; draggingSlot = -1; } if(dragging) { for(int i = 0; i < 4; i++) { if(screenX > systemX + 29 + i*97 && screenX < systemX + 29 + i*97 + 95 && screenY > systemY + 34 && screenY < systemY + 34 + 39) { if(((WeaponSystem)system).getWeapon(i) != null && draggingSlot != i) { Weapon swap = ((WeaponSystem)system).getWeapon(i); Weapon temp = ((WeaponSystem)system).getWeapon(draggingSlot); ((WeaponSystem)system).setWeapon(swap, draggingSlot); ((WeaponSystem)system).setWeapon(temp, i); dragX -= (draggingSlot - i) * 97; draggingSlot = i; } } } } } public boolean click(int screenX, int screenY, int mouseButton) { if(super.click(screenX, screenY, mouseButton)) return true; if(autofire != null && autofire.containsPoint(screenX, screenY)) { if(mouseButton == 0) autofire.leftClick(); if(mouseButton == 1) autofire.rightClick(); return true; } for(int i = 0; i < 4; i++) { if(((WeaponSystem)system).getWeapon(i) != null) { if(screenX > systemX + 29 + i*97 && screenX < systemX + 29 + i*97 + 95 && screenY > systemY + 34 && screenY < systemY + 34 + 39) { if(mouseButton == 0) { if(!((WeaponSystem)system).getWeapon(i).isPowered()) { ((WeaponSystem)system).powerOnWeapon(i); if(((WeaponSystem)system).getWeapon(i).isPowered()) { Sounds.playSound("buttonOn"); } } } if(mouseButton == 1) { if(((WeaponSystem)system).getWeapon(i).isPowered()) { ((WeaponSystem)system).powerDownWeapon(i); if(!((WeaponSystem)system).getWeapon(i).isPowered()) { Sounds.playSound("buttonOff"); } } } } } } return false; } }