package com.rebelkeithy.ftl.systems;
import com.rebelkeithy.ftl.Clock;
import com.rebelkeithy.ftl.FTLGame;
import com.rebelkeithy.ftl.event.HitShieldsEvent;
import com.rebelkeithy.ftl.event.ShieldChargeEvent;
import com.rebelkeithy.ftl.projectile.Projectile;
import com.rebelkeithy.ftl.ship.Ship;
public class ShieldSystem extends AbstractShipSystem
{
private int currShield;
private double shieldCharge;
private double chargeTime = 2;
private double chargeDelay;
private double delayTime = 2;
public ShieldSystem(Ship ship, String name, int maxPower)
{
super(ship, name, maxPower);
shieldCharge = 0;
}
public String getDisplayName() { return "Shields"; }
public String getDescription()
{
return "Powers your shields. Each additional\nbarrier can block one shot";
}
public String getUpgradeDescription(int level)
{
switch(level)
{
case 1:
return "One Shield Barrier";
case 3:
return "Two Shield Barriers";
case 5:
return "Three Shield Barriers";
case 7:
return "Four Shield Barriers";
}
return "";
}
@Override
public void update(double dt)
{
chargeShields(dt);
}
public void chargeShields(double dt)
{
if(currShield > maxShields())
{
currShield = maxShields();
}
if(chargeDelay < delayTime)
{
chargeDelay += dt;
if(chargeDelay > delayTime)
chargeDelay = delayTime;
return;
}
if(currShield == maxShields())
{
return;
}
double chargeRate = dt;
if(isManned())
{
chargeRate *= 1.10;
}
ShieldChargeEvent event = new ShieldChargeEvent(getShip().getName(), chargeRate, shieldCharge, chargeTime);
getShip().EVENT_BUS.post(event);
if(event.cancel)
return;
shieldCharge += event.chargeRate;
if(shieldCharge >= chargeTime)
{
shieldCharge -= chargeTime;
currShield++;
Clock.log(getShip().getName() + " Shields at " + currShield + ", max is " + maxShields());
}
if(currShield == maxShields())
shieldCharge = 0;
}
public void damage(int amount)
{
super.damage(amount);
if(currShield > maxShields())
{
currShield = maxShields();
Clock.log(getShip().getName() + " Shields at " + currShield + ", max = " + maxShields());
}
}
public int maxShields()
{
return getPower()/2;
}
public int getShieldLvl()
{
return currShield;
}
public void hitShields(Projectile projectile)
{
HitShieldsEvent event = new HitShieldsEvent(projectile, getShip(), FTLGame.instance().getShip(projectile.getSource()), 1);
getShip().EVENT_BUS.post(event);
if(!event.cancel)
{
currShield -= event.shieldDamage;
chargeDelay = 0;
if(currShield < 0)
currShield = 0;
projectile.kill();
Clock.log(getShip().getName() + " Shields hit, now at " + currShield);
}
}
public double getChargePercent()
{
return shieldCharge/chargeTime;
}
}