package org.group20.sunstruck.gameobject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import org.group20.sunstruck.Game;
import org.group20.sunstruck.Main;
import org.group20.sunstruck.Menu;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
@SuppressWarnings("serial")
public class Player extends GameObject implements Serializable {
public static ArrayList<TextureRegion> bombExplosionTextures = new ArrayList<TextureRegion>();
private long startGun = System.currentTimeMillis();
private long reloadTimeGun = 200;
private long startBomb = System.currentTimeMillis();
private long reloadTimeBomb = 60 * 1000;
private int weaponLevel = 1;
private int hullLevel = 0;
private int shieldLevel = 0;
private int speedLevel = 0;
private boolean isBombExplosionSize = false;
private float bombExplosionSizeFactor = 10;
private int bombExplosionAnimationCount = 0;
private boolean isBombExploding = false;
private long startBombExplosionTime = System.currentTimeMillis();
private long bombExplosionTime = 67;
private float widthTemp;
private float heightTemp;
public static TextureRegion shipTexture = Game.textureAtlas
.findRegion("shipPlayer");
public Player() {
super(shipTexture, 2f);
isEnemy = false;
type = TYPES.PLAYER;
weaponType = new LaserTiny1();
hull = 70;
currentHull = hull;
shield = 50;
currentShield = shield;
speed = 7;
score = 0;
if (bombExplosionTextures.isEmpty()) {
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue1"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue2"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue3"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue4"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue5"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue6"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue7"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue8"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue9"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue10"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue11"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue12"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue13"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue14"));
bombExplosionTextures.add(Game.textureAtlas
.findRegion("explosionBlue15"));
}
}
@Override
public void update() {
if (isDisposed && !isExploding)
Menu.isActive = true;
// System.out
// .println("Shield: " + currentShield + " Hull: " + currentHull);
long time = 0;
if (isExploding) {
time = System.currentTimeMillis() - startExplosionTime;
if (time > explosionTime) {
explode();
startExplosionTime = System.currentTimeMillis();
}
} else if (isBombExploding) {
time = System.currentTimeMillis() - startBombExplosionTime;
if (time > bombExplosionTime) {
generateBombExplosion();
startBombExplosionTime = System.currentTimeMillis();
}
} else {
super.shieldRegeneration();
boolean setXSpeedToZero = false;
boolean setYSpeedToZero = false;
body.setLinearVelocity(Game.getInstance().getInput()
.getNewVelocity());
if (body.getWorldCenter().x < -Main.CAMERA_WIDTH / 2
&& body.getLinearVelocity().x < 0)
setXSpeedToZero = true;
if (body.getWorldCenter().x > Main.CAMERA_WIDTH / 2
&& body.getLinearVelocity().x > 0)
setXSpeedToZero = true;
if (body.getWorldCenter().y < -Main.CAMERA_WIDTH
* Gdx.graphics.getHeight() / (2 * Gdx.graphics.getWidth())
&& body.getLinearVelocity().y < 0)
setYSpeedToZero = true;
if (body.getWorldCenter().y > Main.CAMERA_WIDTH
* Gdx.graphics.getHeight() / (2 * Gdx.graphics.getWidth())
&& body.getLinearVelocity().y > 0)
setYSpeedToZero = true;
if (setXSpeedToZero)
body.setLinearVelocity(new Vector2(0,
body.getLinearVelocity().y));
if (setYSpeedToZero)
body.setLinearVelocity(new Vector2(body.getLinearVelocity().x,
0));
time = System.currentTimeMillis() - startGun;
if (time > reloadTimeGun)
if (Game.getInstance().getInput().getHasFired()) {
shoot(weaponLevel);
startGun = System.currentTimeMillis();
}
time = System.currentTimeMillis() - startBomb;
if (time > reloadTimeBomb)
if (Game.getInstance().getInput().getHasFiredBomb()) {
fireBomb();
startBomb = System.currentTimeMillis();
}
}
}
private void fireBomb() {
generateBombExplosion();
Iterator<Body> it = Game.getInstance().getWorld().getBodies();
Body body = null;
while (it.hasNext()) {
body = it.next();
if (body.getUserData() instanceof Boss
|| body.getUserData() instanceof Player)
continue;
if (body.getUserData() != null)
((GameObject) body.getUserData()).dispose();
}
}
private void generateBombExplosion() {
if (!isBombExplosionSize) {
widthTemp = width;
heightTemp = height;
width *= bombExplosionSizeFactor;
height = width;
isBombExplosionSize = true;
isBombExploding = true;
}
textureRegion = bombExplosionTextures.get(bombExplosionAnimationCount);
bombExplosionAnimationCount++;
if (bombExplosionTextures.size() == bombExplosionAnimationCount) {
isBombExploding = false;
isBombExplosionSize = false;
bombExplosionAnimationCount = 0;
textureRegion = shipTexture;
width = widthTemp;
height = heightTemp;
}
}
@Override
public void dispose() {
if (!isDisposed) {
isExploding = true;
isDisposed = true;
}
}
@Override
public String toString() {
return "Player";
}
private void shoot(int weaponLevel) {
Vector2 centerPosition = GameObjectFactory.getProjectilePosition(
weaponType, this);
centerPosition.sub(0, weaponType.height / 4);
if (weaponLevel == 1) {
Game.getInstance()
.getGoFactory()
.generateWeaponShot(weaponType, centerPosition,
body.getAngle()).isEnemy = false;
return;
}
float distance = (height - weaponType.height) / (weaponLevel);
float angleChange = (float) Math.PI / 4;
if (weaponLevel % 2 == 0)
angleChange = 2 * angleChange / (weaponLevel - 2);
else
angleChange = 2 * angleChange / (weaponLevel - 1);
if (weaponLevel % 2 == 0) {
Game.getInstance()
.getGoFactory()
.generateWeaponShot(weaponType,
centerPosition.tmp().add(0, distance),
body.getAngle()).isEnemy = false;
Game.getInstance()
.getGoFactory()
.generateWeaponShot(weaponType,
centerPosition.tmp().sub(0, distance),
body.getAngle()).isEnemy = false;
for (int j = 1; j < weaponLevel / 2; j++)
Game.getInstance()
.getGoFactory()
.generateWeaponShot(
weaponType,
centerPosition.tmp().add(0, distance * (j + 1)),
body.getAngle() + angleChange * j).isEnemy = false;
for (int j = 1; j < weaponLevel / 2; j++)
Game.getInstance()
.getGoFactory()
.generateWeaponShot(
weaponType,
centerPosition.tmp().sub(0, distance * (j + 1)),
body.getAngle() - angleChange * j).isEnemy = false;
} else {
Game.getInstance()
.getGoFactory()
.generateWeaponShot(weaponType, centerPosition.tmp(),
body.getAngle()).isEnemy = false;
for (int j = 1; j <= weaponLevel / 2; j++)
Game.getInstance()
.getGoFactory()
.generateWeaponShot(weaponType,
centerPosition.tmp().add(0, distance * j),
body.getAngle() + angleChange * j).isEnemy = false;
for (int j = 1; j <= weaponLevel / 2; j++)
Game.getInstance()
.getGoFactory()
.generateWeaponShot(weaponType,
centerPosition.tmp().sub(0, distance * j),
body.getAngle() - angleChange * j).isEnemy = false;
}
}
public void addWeaponLevel(int weaponUpgrade) {
weaponLevel += weaponUpgrade;
// Do whatever you like.
}
public void addHullLevel(int hullUpgrade) {
hullLevel += hullUpgrade;
hull = 100 + hullLevel * 50;
}
public void addShieldLevel(int shieldUpgrade) {
shieldLevel += shieldUpgrade;
shield = 100 + shieldLevel * 50;
}
public void addSpeedLevel(int speedUpgrade) {
speedLevel += speedUpgrade;
speed = 15 + speedLevel * 5;
}
public int getWeaponLevel() {
return weaponLevel;
}
public int getHullLevel() {
return hullLevel;
}
public int getShieldLevel() {
return shieldLevel;
}
public int getSpeedLevel() {
return speedLevel;
}
public float getCurrentHull() {
return currentHull;
}
public float getCurrentShield() {
return currentShield;
}
public boolean isDisposed() {
return isDisposed;
}
}