package com.rebelkeithy.ftl.weapons;
import java.util.HashMap;
import java.util.Map;
import com.rebelkeithy.ftl.Clock;
import com.rebelkeithy.ftl.projectile.Projectile;
import com.rebelkeithy.ftl.ship.Resource;
public class ProjectileWeapon extends Weapon
{
private int numShots = 1;
private int shieldPiercing = 0;
private Map<String, Integer> damages;
private String ammo = null;
private int currentShot;
private double sequentialShotDelay = 0.2;
private double shotWait = 0;
private String targetedShip;
private String targetedRoom;
Projectile[] projectileBuffer;
public ProjectileWeapon(String name, int requiredPower, double chargeTime)
{
super(name, requiredPower, chargeTime);
damages = new HashMap<String, Integer>();
projectileBuffer = new Projectile[0];
}
public ProjectileWeapon setNumShots(int numShots)
{
this.numShots = numShots;
projectileBuffer = new Projectile[numShots - 1];
return this;
}
public ProjectileWeapon setPiece(int pierce)
{
shieldPiercing = pierce;
return this;
}
public ProjectileWeapon setDamage(String name, int damage)
{
damages.put(name, damage);
return this;
}
public ProjectileWeapon setAmmo(String ammo)
{
this.ammo = ammo;
return this;
}
@Override
public void update(double dt)
{
super.update(dt);
if(currentShot > 0)
{
if(currentShot == numShots)
{
currentShot = 0;
}
else
{
shotWait += dt;
if(shotWait >= sequentialShotDelay)
{
shotWait -= sequentialShotDelay;
Clock.log(getShip().getName() + " " + getName() + " fire!");
getShip().getGame().addShot(projectileBuffer[currentShot-1]);
currentShot++;
}
}
}
}
@Override
public void setTarget(String ship, String room)
{
this.targetedShip = ship;
this.targetedRoom = room;
}
@Override
public void activate()
{
if(targetedShip == null || targetedRoom == null)
{
return;
}
if(isCharged())
{
if(ammo != null)
{
if(Resource.getResource(ammo).getResourceAmount(getShip()) > 0)
{
Resource.getResource(ammo).addResource(getShip(), -1);
}
else
{
return;
}
}
fire(targetedShip, targetedRoom);
targetedShip = null;
targetedRoom = null;
removeCharge();
}
}
public void fire(String ship, String room)
{
Clock.log(getShip().getName() + " " + getName() + " fire! " + damages);
Projectile projectile = getProjectile(ship, room);
getShip().getGame().addShot(projectile);
for(int i = 0; i < numShots-1; i++)
{
projectileBuffer[i] = getProjectile(ship, room);
}
currentShot = 1;
}
// Returns an instance of the type of projectile this weapon fires
private Projectile getProjectile(String ship, String room)
{
Projectile projectile = new Projectile(ship, room, getShip().getName(), 1000, 500);
projectile.setShieldPiercing(shieldPiercing);
for(String name : damages.keySet())
projectile.addDamage(name, damages.get(name));
return projectile;
}
}