package com.rebelkeithy.ftl.systems;
import com.rebelkeithy.ftl.Clock;
import com.rebelkeithy.ftl.ship.Ship;
import com.rebelkeithy.ftl.view.SystemRenderer;
import com.rebelkeithy.ftl.view.WeaponSystemRenderer;
import com.rebelkeithy.ftl.weapons.Weapon;
public class WeaponSystem extends AbstractShipSystem
{
Weapon[] weapons;
public WeaponSystem(Ship ship, String name, int maxPower)
{
super(ship, name, maxPower);
weapons = new Weapon[4];
}
@Override
public void damage(int amount)
{
super.damage(amount);
int count = weapons.length - 1;
Clock.log(getShip().getName() + " weapon reserver power " + unusedPower());
while(unusedPower() < 0 && count >= 0)
{
powerDownWeapon(count);
count--;
}
}
public String getDisplayName() { return "Weapon Control"; }
public String getDescription()
{
return "Powers all of the ship's weapons. Upgrading\nlets you power more weapons";
}
public String getUpgradeDescription(int level)
{
return "More System Power";
}
@Override
public void update(double dt)
{
super.update(dt);
for(Weapon weapon : weapons)
{
if(weapon != null)
{
weapon.update(dt);
}
}
}
public void powerOnWeapon(int slot)
{
if(weapons[slot] != null)
{
int neededPower = weapons[slot].requiredPower() - unusedPower();
if(neededPower <= getMaxPower() - getPower())
{
if(neededPower > 0)
{
ReactorSystem reactor = (ReactorSystem) getShip().getSystem("reactor");
if(reactor.getPower() >= neededPower)
{
this.addPower(neededPower);
Clock.log(getShip().getName() + " powering on weapon " + slot);
weapons[slot].setPowered(true);
}
else
{
Clock.log(getShip().getName() + " not enough power to power on weapon " + slot);
}
}
else
{
Clock.log(getShip().getName() + " powering on weapon " + slot);
weapons[slot].setPowered(true);
}
}
}
}
public void powerDownWeapon(int slot)
{
if(weapons[slot] != null && weapons[slot].isPowered())
{
Clock.log(getShip().getName() + " powering down weapon " + slot);
weapons[slot].setPowered(false);
this.addPower(-weapons[slot].requiredPower());
}
}
public int unusedPower()
{
int power = getPower();
for(int i = 0; i < weapons.length; i++)
{
if(weapons[i] != null && weapons[i].isPowered())
{
power -= weapons[i].requiredPower();
}
}
return power;
}
public void setWeapon(Weapon weapon, int slot)
{
this.weapons[slot] = weapon;
weapon.setShip(getShip());
}
public Weapon getWeapon(int slot)
{
return weapons[slot];
}
public Weapon removeWeapon(int slot)
{
Weapon weapon = weapons[slot];
weapons[slot] = null;
return weapon;
}
public void setTarget(int slot, String ship, String room)
{
if(weapons[slot] != null)
{
weapons[slot].setTarget(ship, room);
}
}
public void activate(int slot, String ship, String room)
{
if(weapons[slot] != null)
{
weapons[slot].activate();
}
}
public SystemRenderer getSystemRenderer()
{
return new WeaponSystemRenderer(this, 0);
}
}