package com.jpii.navalbattle.game.turn;
import com.jpii.navalbattle.NavalBattle;
import com.jpii.navalbattle.data.Constants;
import com.jpii.navalbattle.data.RoketGamerData;
import com.jpii.navalbattle.game.NavalManager;
import com.jpii.navalbattle.game.entity.MoveableEntity;
import com.jpii.navalbattle.game.entity.PortEntity;
import com.jpii.navalbattle.util.RoketUtils;
import com.jpii.navalbattle.util.SoundUtils;
public class DamageCalculator {
public static void doPrimaryDamage(MoveableEntity deal, MoveableEntity take){
NavalManager nm = ((NavalManager)deal.getManager());
Player player = nm.getGame().getTurnManager().getTurn().getPlayer();
deal.usePrimary();
if(calculateDeflect(take)){
nm.getGame().getTurnManager().findPlayer(take).addScore(Constants.DEFLECT_SHOT_SCORE);
if(take.getPercentHealth() <= 25)
RoketUtils.submitAchievement(RoketGamerData.ACHIEVEMENT_LUCKY_SHOT);
} else if(take.takeDamage(calculatePrimaryDamage(deal, take))){
player.addScore(Constants.HIT_SHIP_SCORE);
if(take == null || take.isDisposed()) {
if(player.name.equals("Player 1"))
NavalBattle.getGameState().shipDestroyed();
player.addScore(Constants.SINK_SHIP_SCORE);
}
// SoundUtils.playSound(RoketUtils.class.getResourceAsStream("/com/jpii/navalbattle/res/sfx/shot.wav"));
}
nm.getGame().getTurnManager().checkDone();
}
public static void doPrimaryDamage(MoveableEntity deal, PortEntity take){
NavalManager nm = ((NavalManager)deal.getManager());
Player player = nm.getGame().getTurnManager().getTurn().getPlayer();
deal.usePrimary();
if(!calculateDeflect(take)) {
if(take.takeDamage(calculatePrimaryDamage(deal,take))) {
player.addScore(Constants.DESTROY_PORT_SCORE);
nm.getGame().getTurnManager().removeEntity(take);
player.addEntity(take);
RoketUtils.submitAchievement(RoketGamerData.ACHIEVEMENT_WHEN_FIRE_NATION_ATTACKED);
}
// SoundUtils.playSound(RoketUtils.class.getResourceAsStream("/com/jpii/navalbattle/res/sfx/shot.wav"));
}
nm.getGame().getTurnManager().checkDone();
}
public static void doSecondaryDamage(MoveableEntity deal, MoveableEntity take){
NavalManager nm = ((NavalManager)deal.getManager());
Player player = nm.getGame().getTurnManager().getTurn().getPlayer();
deal.useSecondary();
if(calculateDeflect(take)){
nm.getGame().getTurnManager().findPlayer(take).addScore(Constants.DEFLECT_SHOT_SCORE);
if(take.getPercentHealth() <= 25)
RoketUtils.submitAchievement(RoketGamerData.ACHIEVEMENT_LUCKY_SHOT);
} else if(take.takeDamage(calculateSecondaryDamage(deal, take))) {
player.addScore(Constants.HIT_SHIP_SCORE);
if(take == null || take.isDisposed()) {
if(deal.getHandle() == 21)
RoketUtils.submitAchievement(RoketGamerData.ACHIEVEMENT_AIR_SUPERIORITY);
if(player.name.equals("Player 1"))
NavalBattle.getGameState().shipDestroyed();
player.addScore(Constants.SINK_SHIP_SCORE);
}
// SoundUtils.playSound(RoketUtils.class.getResourceAsStream("/com/jpii/navalbattle/res/sfx/shot.wav"));
}
nm.getGame().getTurnManager().checkDone();
}
public static void doSecondaryDamage(MoveableEntity deal, PortEntity take){
NavalManager nm = ((NavalManager)deal.getManager());
Player player = nm.getGame().getTurnManager().getTurn().getPlayer();
deal.useSecondary();
if(!calculateDeflect(take)) {
if(take.takeDamage(calculateSecondaryDamage(deal,take))){
if(deal.getHandle() == 21)
RoketUtils.submitAchievement(RoketGamerData.ACHIEVEMENT_AIR_SUPERIORITY);
player.addScore(Constants.DESTROY_PORT_SCORE);
nm.getGame().getTurnManager().removeEntity(take);
player.addEntity(take);
RoketUtils.submitAchievement(RoketGamerData.ACHIEVEMENT_WHEN_FIRE_NATION_ATTACKED);
}
// SoundUtils.playSound(RoketUtils.class.getResourceAsStream("/com/jpii/navalbattle/res/sfx/shot.wav"));
}
nm.getGame().getTurnManager().checkDone();
}
private static int calculatePrimaryDamage(MoveableEntity deal, MoveableEntity take) {
byte attackerClass = deal.getHandle();
byte attackedClass = take.getHandle();
if(attackerClass == 31) { // Battleship
if(attackedClass == 31) { // Battleship
return getRandomNumber(150,250);
} else if(attackedClass == 21) { // Aircraft carrier
return getRandomNumber(150,200);
} else if(attackedClass == 11) { // Submarine
return getRandomNumber(200,300);
}
} else if(attackerClass == 21) { // Aircraft carrier
if(attackedClass == 31) { // Battleship
return getRandomNumber(300,400);
} else if(attackedClass == 21) { // Aircraft carrier
return getRandomNumber(200,300);
} else if(attackedClass == 11) { // Submarine
return getRandomNumber(100,150);
}
} else if(attackerClass == 11) { // Submarine
if(attackedClass == 31) { // Battleship
return getRandomNumber(100,400);
} else if(attackedClass == 21) { // Aircraft carrier
return getRandomNumber(200,500);
} else if(attackedClass == 11) { // Submarine
return getRandomNumber(100,300);
}
}
return 100;
}
private static int calculatePrimaryDamage(MoveableEntity deal, PortEntity take) {
byte attackerClass = deal.getHandle();
if(attackerClass == 31) { // Battleship
return getRandomNumber(300,500);
} else if(attackerClass == 21) { // Aircraft carrier
return getRandomNumber(300,500);
} else if(attackerClass == 11) { // Submarine
return getRandomNumber(300,500);
}
return 100;
}
private static int calculateSecondaryDamage(MoveableEntity deal, MoveableEntity take) {
return calculatePrimaryDamage(deal, take) * 2;
}
private static int calculateSecondaryDamage(MoveableEntity deal, PortEntity take) {
byte attackerClass = deal.getHandle();
if(attackerClass == 31) { // Battleship
return getRandomNumber(300,500) * 2;
} else if(attackerClass == 21) { // Aircraft carrier
return getRandomNumber(300,500) * 2;
} else if(attackerClass == 11) { // Submarine
return getRandomNumber(300,500) * 2;
}
return 200;
}
private static boolean calculateDeflect(MoveableEntity e) {
byte attackedClass = e.getHandle();
if(attackedClass == 11) { // Submarine
return (Constants.SUBMARINE_DEFLECT_CHANCE >= getRandomNumber(1,100));
} else if(attackedClass == 21) { // Aircraft carrier
return (Constants.CARRIER_DEFLECT_CHANCE >= getRandomNumber(1,100));
} else if(attackedClass == 31) { // Battleship
return (Constants.BATTLESHIP_DEFLECT_CHANCE >= getRandomNumber(1,100));
}
return false;
}
private static boolean calculateDeflect(PortEntity e) {
return (Constants.PORT_DEFLECT_CHANCE >= getRandomNumber(1,100));
}
private static int getRandomNumber(int min, int max) {
return min + (int)(Math.random()*max);
}
}