package de.fau.cs.mad.fly.profile;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.sql.DatabaseCursor;
import com.badlogic.gdx.utils.JsonReader;
import com.badlogic.gdx.utils.JsonValue;
import de.fau.cs.mad.fly.db.FlyDBManager;
import de.fau.cs.mad.fly.player.IPlane;
import de.fau.cs.mad.fly.player.IPlane.Head;
import de.fau.cs.mad.fly.res.PlaneUpgrade;
import de.fau.cs.mad.fly.settings.SettingManager;
/**
* Manages the different Spaceships
*
* @author Sebastian
*
*/
public class PlaneManager {
private JsonReader reader = new JsonReader();
// private List<IPlane.Head> planes;
private Map<Integer, IPlane.Head> planes;
private IPlane.Head chosenPlane;
private static PlaneManager Instance = new PlaneManager();
public static PlaneManager getInstance() {
return Instance;
}
private PlaneManager(){
PlayerProfileManager.getInstance().addPlayerChangedListener(new ChangeListener<PlayerProfile>() {
@Override
public void changed(PlayerProfile newPlayerProfile) {
initPlayerUpdateAndEquiped(newPlayerProfile.getId());
chosenPlane = null;
getChosenPlane();
}
});
}
public Map<Integer, IPlane.Head> getSpaceshipList() {
if (planes == null) {
// planes = new ArrayList<IPlane.Head>();
planes = new HashMap<Integer, IPlane.Head>();
FileHandle dirHandle = Gdx.files.internal("spaceships/json/");
for (FileHandle file : dirHandle.list()) {
JsonValue json = reader.parse(file);
IPlane.Head planeHead = new IPlane.Head();
int id = json.getInt("id");
planeHead.id = id;
planeHead.name = json.getString("name");
planeHead.modelRef = json.getString("modelRef");
planeHead.levelGroupDependency = json.getInt("levelGroupDependency");
planeHead.speed = json.getFloat("speed");
planeHead.basicSpeed = planeHead.speed;
planeHead.setRollingSpeed(json.getFloat("rollingSpeed"));
planeHead.azimuthSpeed = json.getFloat("azimuthSpeed");
planeHead.basicAzimuthSpeed = planeHead.azimuthSpeed;
planeHead.lives = json.getInt("lives");
planeHead.basicLives = planeHead.lives;
JsonValue rotation = json.get("rotation");
if (rotation != null) {
Vector3 rotationVector = new Vector3(rotation.getFloat(0), rotation.getFloat(1), rotation.getFloat(2));
planeHead.rotationSpeed = rotationVector.len();
planeHead.rotation = rotationVector.nor();
}
JsonValue particleOffset = json.get("particleOffset");
if (particleOffset != null) {
planeHead.particleOffset = new Vector3(particleOffset.getFloat(0), particleOffset.getFloat(1), particleOffset.getFloat(2));
}
planeHead.file = file;
planes.put(id, planeHead);
}
initPlayerUpdateAndEquiped(PlayerProfileManager.getInstance().getCurrentPlayerProfile().getId());
}
return planes;
}
public void initPlayerUpdateAndEquiped( int playerID) {
if (planes == null) {
getSpaceshipList();
}
for (IPlane.Head planeHead : planes.values()) {
planeHead.azimuthSpeed = planeHead.basicAzimuthSpeed;
planeHead.speed = planeHead.basicSpeed;
planeHead.lives = planeHead.basicLives;
Collection<PlaneUpgrade> upgrades = PlaneUpgradeManager.getInstance().getUpgradeList().values();
planeHead.getUpgradesBought().clear();
planeHead.getUpgradesEquiped().clear();
Map<String, Integer> upgradeDB = getUpgradesFromDB(planeHead.id);
Map<String, Integer> equipedDB = getEquipedsFromDB(planeHead.id);
for (PlaneUpgrade upgrade : upgrades) {
Integer upgradeAmount = upgradeDB.get(upgrade.name);
if (upgradeAmount != null)
planeHead.getUpgradesBought().put(upgrade.name, upgradeAmount);
else
planeHead.getUpgradesBought().put(upgrade.name, 0);
planeHead.getUpgradesEquiped().put(upgrade.name, 0);
Integer equippedAmount = equipedDB.get(upgrade.name);
if (equippedAmount != null)
upgradePlane(planeHead, upgrade.name, equippedAmount);
}
}
}
public Map<String, Integer> getEquipedsFromDB(int planeID) {
Map<String, Integer> result = new HashMap<String, Integer>();
String sql = "select equiped_name, _count from fly_plane_Equiped where player_id=" + PlayerProfileManager.getInstance().getCurrentPlayerProfile().getId() + " and plane_id=" + planeID;
DatabaseCursor cursor = FlyDBManager.getInstance().selectData(sql);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.next()) {
result.put(cursor.getString(0), cursor.getInt(1));
}
cursor.close();
}
return result;
}
public Map<String, Integer> getUpgradesFromDB(int planeID) {
Map<String, Integer> result = new HashMap<String, Integer>();
String sql = "select update_name, _count from fly_plane_upgrade where player_id=" + PlayerProfileManager.getInstance().getCurrentPlayerProfile().getId() + " and plane_id=" + planeID;
DatabaseCursor cursor = FlyDBManager.getInstance().selectData(sql);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.next()) {
result.put(cursor.getString(0), cursor.getInt(1));
}
cursor.close();
}
return result;
}
public void updateEquiped(int planeID, String name, int newValue) {
int playerId = PlayerProfileManager.getInstance().getCurrentPlayerProfile().getId();
String sql = "delete from fly_plane_Equiped where player_id=" + playerId + " and equiped_name='" + name + "' and plane_id=" + planeID;
String insert = "insert into fly_plane_Equiped(player_id, plane_id, equiped_name, _count ) values (" + playerId + ", " + planeID + ",'" + name + "'," + newValue + ")";
FlyDBManager.getInstance().execSQL(sql);
FlyDBManager.getInstance().execSQL(insert);
}
public void updateUpdate(int planeID, String name, int newValue) {
int playerId = PlayerProfileManager.getInstance().getCurrentPlayerProfile().getId();
String sql = "delete from fly_plane_upgrade where player_id=" + playerId + " and update_name='" + name + "' and plane_id=" + planeID;
String insert = "insert into fly_plane_upgrade(player_id, plane_id, update_name, _count ) values (" + playerId + ", " + planeID + ",'" + name + "'," + newValue + ")";
FlyDBManager.getInstance().execSQL(sql);
FlyDBManager.getInstance().execSQL(insert);
}
public int getUpgradeType(String name) {
Collection<PlaneUpgrade> upgrades = PlaneUpgradeManager.getInstance().getUpgradeList().values();
for (PlaneUpgrade upgrade : upgrades) {
if (upgrade.name.equals(name)) {
return upgrade.type;
}
}
return 0;
}
public IPlane.Head getChosenPlane() {
if (chosenPlane == null) {
SettingManager settings = PlayerProfileManager.getInstance().getCurrentPlayerProfile().getSettingManager();
int planeID = settings.getInteger(SettingManager.CHOSEN_PLANE_ID, 0);
for (IPlane.Head plane : getSpaceshipList().values()) {
if (plane.id == planeID) {
chosenPlane = plane;
}
}
if (chosenPlane == null) {
chosenPlane = getSpaceshipList().get(1);
}
}
return chosenPlane;
}
public IPlane.Head getNextPlane(int left) {
if (chosenPlane == null) {
chosenPlane = getSpaceshipList().get(1);
}
int chosenPlaneId = chosenPlane.id;
chosenPlaneId -= left;
if (chosenPlaneId < 0) {
chosenPlaneId += planes.size();
} else if (chosenPlaneId >= planes.size()) {
chosenPlaneId -= planes.size();
}
chosenPlane = getSpaceshipList().get(chosenPlaneId);
// ((Fly)
// Gdx.app.getApplicationListener()).getGameController().getPlayer().setPlane(new
// Spaceship(chosenPlane));
PlayerProfileManager.getInstance().getCurrentPlayerProfile().setPlane(chosenPlane);
return chosenPlane;
}
public void setChosenPlane(IPlane.Head plane) {
chosenPlane = plane;
PlayerProfileManager.getInstance().getCurrentPlayerProfile().getSettingManager().set(SettingManager.CHOSEN_PLANE_ID, plane.id);
}
public IPlane.Head upgradePlane(String upgradeName, int signum) {
return upgradePlane(chosenPlane, upgradeName, signum);
}
public IPlane.Head upgradePlane(IPlane.Head plane, String upgradeName, int signum) {
PlaneUpgrade upgrade = PlaneUpgradeManager.getInstance().getUpgrade(upgradeName);
/*
* int size = upgrade.upgradeValues.length; for(int i = 0; i < size;
* i++) { plane. }
*/
int[] values = upgrade.upgradeValues;
plane.speed += values[0] * signum;
plane.setRollingSpeed(plane.getRollingSpeed() + values[1] * signum);
plane.azimuthSpeed += values[2] * signum;
plane.lives += values[3] * signum;
int oldValue = plane.getUpgradesEquiped().get(upgradeName);
plane.getUpgradesEquiped().put(upgradeName, oldValue + signum);
this.updateEquiped(plane.id, upgradeName, oldValue + signum);
planes.put(plane.id, plane);
return plane;
}
public void buyUpgradeForPlane(String upgradeName) {
int currentUpgradeBought = chosenPlane.getUpgradesBought().get(upgradeName);
PlaneUpgrade upgrade = PlaneUpgradeManager.getInstance().getUpgrade(upgradeName);
int maxUpgrade = upgrade.timesAvailable;
if (currentUpgradeBought < maxUpgrade) {
if (PlayerProfileManager.getInstance().getCurrentPlayerProfile().addMoney(-upgrade.price)) {
chosenPlane.getUpgradesBought().put(upgradeName, currentUpgradeBought + 1);
this.updateUpdate(chosenPlane.id, upgradeName, currentUpgradeBought + 1);
}
}
}
public boolean upgradeCanBeBought(PlaneUpgrade upgrade) {
int money = PlayerProfileManager.getInstance().getCurrentPlayerProfile().getMoney();
int currentlyBought = chosenPlane.getUpgradesBought().get(upgrade.name);
if (currentlyBought < upgrade.timesAvailable && upgrade.price <= money) {
return true;
}
return false;
}
}