package com.rebelkeithy.ftl.weapons;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
public class ProjectileWeaponBuilder implements WeaponBuilder
{
static class WeaponDef
{
String name = "";
int power = 1;
int cooldown = 10;
int shots = 1;
int pierce = 0;
Map<String, Double> damages = new HashMap<String, Double>();
String ammo = null;
public String toString()
{
return "" + power + ", " + cooldown + ", " + shots + ", " + pierce + ", " + damages.toString();
}
}
private static ProjectileWeaponBuilder instance = new ProjectileWeaponBuilder();
private static Map<String, WeaponDef> weapons = new HashMap<String, WeaponDef>();
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void registerWeapons(File file)
{
Map root;
try {
root = (new Gson()).fromJson(new FileReader(file), Map.class);
Map<String, Map> projectileDefs = (Map<String, Map>) root.get("projectile");
for(String name : projectileDefs.keySet())
{
Map projectileDef = projectileDefs.get(name);
WeaponDef weapon = new WeaponDef();
if(projectileDef.containsKey("power"))
weapon.power = ((Double)projectileDef.get("power")).intValue();
if(projectileDef.containsKey("cooldown"))
weapon.cooldown = ((Double)projectileDef.get("cooldown")).intValue();
if(projectileDef.containsKey("shots"))
weapon.shots = ((Double)projectileDef.get("shots")).intValue();
if(projectileDef.containsKey("pierce"))
weapon.pierce = ((Double)projectileDef.get("pierce")).intValue();
if(projectileDef.containsKey("ammo"))
weapon.ammo = (String)projectileDef.get("ammo");
if(projectileDef.containsKey("damage"))
{
Map<String, Double> damages = (Map<String, Double>) projectileDef.get("damage");
weapon.damages = damages;
}
else
{
weapon.damages.put("hull", 1.0);
weapon.damages.put("system", 1.0);
}
if(projectileDef.containsKey("name"))
weapon.name = (String)projectileDef.get("name");
else
weapon.name = name;
WeaponRegistry.registerWeaponBuilder(name, instance);
weapons.put(name, weapon);
}
BombBuilder bombBuilder = new BombBuilder();
Map<String, Map> bombDefs = (Map<String, Map>) root.get("bomb");
for(String name : bombDefs.keySet())
{
Map bombDef = bombDefs.get(name);
BombBuilder.BombDef def = new BombBuilder.BombDef();
double power = (Double) bombDef.get("power");
double cooldown = (Double) bombDef.get("cooldown");
if(bombDef.containsKey("damage"))
{
Map<String, Double> damages = (Map<String, Double>) bombDef.get("damage");
for(String damage : damages.keySet())
{
double amount = damages.get(damage);
def.addDamage(damage, (int) amount);
}
}
else
{
def.addDamage("hull", 1);
def.addDamage("system", 1);
}
def.ammo = (String) bombDef.get("ammo");
def.power = (int) power;
def.cooldown = (int) cooldown;
bombBuilder.addWeapon(name, def);
WeaponRegistry.registerWeaponBuilder(name, bombBuilder);
}
} catch (JsonSyntaxException e) {
e.printStackTrace();
} catch (JsonIOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public Weapon build(String name)
{
if(weapons.containsKey(name))
{
WeaponDef def = weapons.get(name);
ProjectileWeapon weapon = new ProjectileWeapon(def.name, def.power, def.cooldown).setNumShots(def.shots).setPiece(def.pierce).setAmmo(def.ammo);
for(String damage : def.damages.keySet())
weapon.setDamage(damage, ((Double)def.damages.get(damage)).intValue());
return weapon;
}
return null;
}
}