package com.jpii.navalbattle.game.turn; import java.util.ArrayList; import com.jpii.navalbattle.NavalBattle; import com.jpii.navalbattle.game.NavalGame; import com.jpii.navalbattle.game.NavalManager; import com.jpii.navalbattle.pavo.Game; import com.jpii.navalbattle.pavo.grid.Entity; import com.jpii.navalbattle.pavo.grid.GridHelper; import com.jpii.navalbattle.pavo.grid.Location; import com.jpii.navalbattle.util.GrammarManager; import com.jpii.navalbattle.game.entity.MoveableEntity; import com.jpii.navalbattle.game.entity.PortEntity; import com.jpii.navalbattle.game.entity.Submarine; import com.jpii.navalbattle.game.turn.DamageCalculator; public class AI extends Player{ ArrayList<Entity> primaryEnemies; ArrayList<Entity> secondaryEnemies; int numBS, numPS, numAC, numSM; public AI() { super(getNewName()); primaryEnemies = new ArrayList<Entity>(); secondaryEnemies = new ArrayList<Entity>(); } private static String getNewName() { return GrammarManager.generateFullName(Game.Settings.rand.nextInt()); } public void addEnemyEntityP(Entity e){ primaryEnemies.add(e); } public void addEnemyEntityS(Entity e){ secondaryEnemies.add(e); } public static void delay(int n) { long startDelay = System.currentTimeMillis(); long endDelay = 0; while (endDelay - startDelay < n) endDelay = System.currentTimeMillis(); } public void takeTurn(){ for(int k = 0; k < getTotalEntities(); k++) { Entity ent = getEntity(k); // this.nextEntity(ent); //delay(10000); /*while (ent.getManager().getWorld().isBeingAnimated()) { try { Thread.sleep(0); } catch (Throwable t) { } }*/ if(ent.getHandle()%10 == 1){ MoveableEntity currentEntity; currentEntity = (MoveableEntity)ent; if(currentEntity.getHandle()==11){ //Sub moveAIShip(currentEntity); if(!diplomacy){ determineCurrentEnemiesP(currentEntity); if(currentEntity.getMissileCount()>0) determineCurrentEnemiesS(currentEntity); organizeMoveableEnemiesHP(primaryEnemies); organizeMoveableEnemiesHP(secondaryEnemies); shipShopping(currentEntity); attackEnemies(1, currentEntity); } } if(currentEntity.getHandle()==21){ //AC moveAIShip(currentEntity); if(!diplomacy){ determineCurrentEnemiesP(currentEntity); determineCurrentEnemiesS(currentEntity); organizeMoveableEnemiesHP(primaryEnemies); organizeMoveableEnemiesHP(secondaryEnemies); shipShopping(currentEntity); attackEnemies(2, currentEntity); } } if(currentEntity.getHandle()==31){ //BS moveAIShip(currentEntity); if(!diplomacy){ determineCurrentEnemiesP(currentEntity); if(currentEntity.getMissileCount()>0) determineCurrentEnemiesS(currentEntity); organizeMoveableEnemiesHP(primaryEnemies); organizeMoveableEnemiesHP(secondaryEnemies); shipShopping(currentEntity); attackEnemies(3, currentEntity); } } } else{ PortEntity currentEntityP; currentEntityP = (PortEntity)ent; portShopping(currentEntityP); } } diplomacyCounter--; if(diplomacyCounter == 0) diplomacy = false; turnOver=true; } private void shipShopping(MoveableEntity e){ //hull upgrade: 200 if(this.getScore()>250 && e.getPercentHealth()<50){ this.subtractscore(200); e.hardenHull(); } //Missile X5 : 250 if(this.getScore()>300 && primaryEnemies.size()>3){ this.subtractscore(250); e.increaseMissile(); } //increase range 700 if(this.getScore()>750 && e.getPercentHealth()>50 && primaryEnemies.size()<1){ this.subtractscore(700); e.increaseRange(); } //anti missile 350 if(this.getScore()>400 && primaryEnemies.size()>4){ this.subtractscore(350); e.deflectMissile(); } //repair ship 300 if(this.getScore()> 350 && e.getPercentHealth()<25){ this.subtractscore(300); e.repair(); } } private void getShipNumbers(){ numPS = numBS = numSM = numAC = 0; for(int k = 0; k < getTotalEntities(); k++){ Entity ent = getEntity(k); if(ent.getHandle()%10 == 1){ MoveableEntity currentEntity; currentEntity = (MoveableEntity)ent; if(currentEntity.getHandle()==11){ numSM++; } if(currentEntity.getHandle()==21){ numAC++; } if(currentEntity.getHandle()==11){ numBS++; } } else{ numPS++; } } } private void portShopping(PortEntity p){ getShipNumbers(); //repair port 500 if(this.getScore()>550 && p.getPercentHealth()<25){ this.subtractscore(500); p.repair(); } //purchase battleship 1000 if(this.getScore()>1050 && numBS<2){ this.subtractscore(1000); p.spawnBattleship(); } //purchase sub 1250 if(this.getScore()>1300 && numSM<2){ this.subtractscore(1250); p.spawnSubmarine(); } //purchase ac 1250 if(this.getScore()>1300 ){ this.subtractscore(1250); p.spawnAC(); } } public void attackEnemies(int n, MoveableEntity currentEntity) { if(pickEnemyP(n)!=-1) primaryAttack(n, currentEntity); if(pickEnemyS(n)!=-1) secondaryAttack(n, currentEntity); secondaryEnemies.clear(); primaryEnemies.clear(); } public void primaryAttack(int n, MoveableEntity currentEntity ) { Entity ene = primaryEnemies.get(pickEnemyP(n)); if(ene.getHandle()==2){ PortEntity enemyEntity; enemyEntity = (PortEntity)ene; DamageCalculator.doPrimaryDamage(currentEntity, enemyEntity); } else{ MoveableEntity enemyEntity; enemyEntity = (MoveableEntity)ene; DamageCalculator.doPrimaryDamage(currentEntity, enemyEntity); } } public void secondaryAttack(int n, MoveableEntity currentEntity) { Entity ene = secondaryEnemies.get(pickEnemyS(n)); if(ene.getHandle()==2){ PortEntity enemyEntity; enemyEntity = (PortEntity)ene; DamageCalculator.doSecondaryDamage(currentEntity, enemyEntity); } else{ MoveableEntity enemyEntity; enemyEntity = (MoveableEntity)ene; DamageCalculator.doSecondaryDamage(currentEntity, enemyEntity); } } private void organizeMoveableEnemiesHP(ArrayList<Entity> Enemy){ Entity temp; for (int p = 1; p < Enemy.size(); p++){ for (int q = 0; q < Enemy.size()-1; q++){ if(getHealth(Enemy.get(q))>getHealth(Enemy.get(q+1))){ temp = Enemy.get(q); Enemy.set(q,Enemy.get(q+1)); Enemy.set((q+1), temp); } } } } private int getHealth(Entity e){ if(e.getHandle()==2) return ((PortEntity)e).getPercentHealth(); if(e.getHandle()%10==1) return ((MoveableEntity)e).getPercentHealth(); else{ return -1; } } public int pickEnemyS(int currentShip) { if(!secondaryEnemies.isEmpty()){ for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==2) return k; } switch (currentShip) { case 1: for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==21) return k; } for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==31) return k; } for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==11) return k; } case 2: for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==31) return k; } for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==21) return k; } for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==11) return k; } case 3: for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==11) return k; } for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==31) return k; } for(int k = 0; k < secondaryEnemies.size(); k++){ if(secondaryEnemies.get(k).getHandle()==21) return k; } } } return -1; } public int pickEnemyP(int currentShip) { if(!primaryEnemies.isEmpty()){ for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==2) return k; } switch (currentShip) { case 1: for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==21) return k; } for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==31) return k; } for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==11) return k; } case 2: for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==31) return k; } for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==21) return k; } for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==11) return k; } case 3: for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==11) return k; } for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==31) return k; } for(int k = 0; k < primaryEnemies.size(); k++){ if(primaryEnemies.get(k).getHandle()==21) return k; } } } return -1; } public void moveAIShip(MoveableEntity e){ int topX = e.getLocation().getCol()-e.getMovementLeft()+1; int topY = e.getLocation().getRow()-e.getMovementLeft()+1; int currentX=topX; int currentY=topY; e.toggleMoveable(); //delay! do { currentX=topX; currentY=topY; currentX += (int) (Math.random()*((e.getMovementLeft() * 2) + 1)); currentY += (int) (Math.random()*((e.getMovementLeft() * 2) + 1)); } while(!GridHelper.canMoveTo(e.getManager(), e, e.getCurrentOrientation(), currentY, currentX,e.getWidth())); e.toggleMoveable(); // if (!e.getManager().isEntityAnimated()) // e.animatedMoveTo(new Location(currentY,currentX), 30); //else e.moveTo(new Location(currentY,currentX)); //delay } public void determineCurrentEnemiesS(MoveableEntity e){ int topX = (e.getLocation().getCol()-e.getSecondaryRange())+1; int topY = (e.getLocation().getRow()-e.getSecondaryRange())+1; for (int x = topX; x < (e.getLocation().getCol()+e.getSecondaryRange())+1; x++) { for (int y = topY; y < (e.getLocation().getRow()+e.getSecondaryRange())+1; y++) { Entity location = e.getManager().findEntity(y,x); if(location!=null){ Player temp = ((NavalManager)location.getManager()).getGame().getTurnManager().findPlayer(location); if (temp!=null){ if(!(temp.equals(this))&&!secondaryEnemies.contains(location)){ //entity at spot is not owned by this AI if(location.getHandle()==11) { if(!((Submarine)location).isSumberged()){ addEnemyEntityS(location); } } else { addEnemyEntityS(location); } } } } } } } public void determineCurrentEnemiesP(MoveableEntity e){ int topX = (e.getLocation().getCol()-e.getPrimaryRange())+1; int topY = (e.getLocation().getRow()-e.getPrimaryRange())+1; for (int x = topX; x < (e.getLocation().getCol()+e.getPrimaryRange())+1; x++) { for (int y = topY; y < (e.getLocation().getRow()+e.getPrimaryRange())+1; y++) { Entity location = e.getManager().findEntity(y,x); if(location!=null){ Player temp = ((NavalManager)location.getManager()).getGame().getTurnManager().findPlayer(location); if (temp!=null){ if(!(temp.equals(this))&&!primaryEnemies.contains(location)){ //entity at spot is not owned by this AI if(location.getHandle()==11) { if(!((Submarine)location).isSumberged()){ addEnemyEntityS(location); } } else{ addEnemyEntityS(location); } } } } } } } public void reset(){ if(entities.size()==0) return; NavalManager nm = (NavalManager)entities.get(0).getManager(); for(int index = 0; index<primaryEnemies.size(); index+=0){ primaryEnemies.get(index).dispose(); nm.getGame().getTurnManager().removeEntity(primaryEnemies.remove(index)); } for(int index = 0; index<secondaryEnemies.size(); index+=0){ secondaryEnemies.get(index).dispose(); nm.getGame().getTurnManager().removeEntity(secondaryEnemies.remove(index)); } for(int index = 0; index<entities.size(); index+=0){ entities.get(index).dispose(); nm.getGame().getTurnManager().removeEntity(entities.remove(index)); } } public void endTurn(){ super.endTurn(); } }