diff --git a/src/main/java/Model/Entitys/Monsters/MonsterFactory.java b/src/main/java/Model/Entitys/Monsters/MonsterFactory.java index 2d533d7..5fba648 100644 --- a/src/main/java/Model/Entitys/Monsters/MonsterFactory.java +++ b/src/main/java/Model/Entitys/Monsters/MonsterFactory.java @@ -43,7 +43,7 @@ public static AbstractMonster getNewMonster(Etage etage, MonsterType m){ return new BigMonster(etage,Procedure.getAccesibleRandomPosition(true,etage),"BigMonster",10,18,15,20,900,Tools.PATH_CROSS,getBaseLvl()+5); } case SNAKE -> { - return new Snake(etage,Procedure.getAccesibleRandomPosition(true,etage),"Snake",10,18,15,20,900,Tools.PATH_CROSS,getBaseLvl()+5,10); + return new Snake(etage,Procedure.getAccesibleRandomPosition(true,etage),"Snake",10,1,15,20,900,Tools.PATH_NOMOBS,getBaseLvl()+5,10); } case INVOQUEUR -> { return new Invoqueur(etage,Procedure.getAccesibleRandomPosition(true,etage),"INVOQUEUR",10,18,15,20,1000,Tools.PATH_CROSS,getBaseLvl()+5); diff --git a/src/main/java/Model/Entitys/Monsters/Snake.java b/src/main/java/Model/Entitys/Monsters/Snake.java index c4e9f55..a53a1be 100644 --- a/src/main/java/Model/Entitys/Monsters/Snake.java +++ b/src/main/java/Model/Entitys/Monsters/Snake.java @@ -1,37 +1,74 @@ package Model.Entitys.Monsters; import Model.Map.Etage; -import Model.Utils.Affichage; -import Model.Utils.Position; +import Model.Utils.*; import java.util.ArrayList; public class Snake extends AbstractMonster{ - private ArrayList snakeTail = new ArrayList<>(); + private static class Tail extends AbstractMonster{ + protected Tail(Etage m, Position pos, String nom, int pv, int path_type, int lvl) { + super(m, pos, nom, pv, 0,0,0,60000, path_type, lvl); + } + + @Override + public void updateMonster() {} + + @Override + public String toString() { + return Affichage.BRIGTH_BLUE+Affichage.BOLD+"O"; + } + + @Override + public void move(Position pos) { + if(getEtage().get(pos).getEntity()==null){ + super.move(pos); + } + } + } + + private final ArrayList snakeTail = new ArrayList<>(); + private final int size_of_tail; protected Snake(Etage m, Position pos, String nom, int pv, int force, double vision_radius, int agro, int update_rate_ms, int path_type, int lvl, int size_of_tail) { super(m, pos, nom, pv, force, vision_radius, agro, update_rate_ms, path_type, lvl); - int posX = pos.getX(); - int posY = pos.getY(); - for (int i = 0; i astar = Tools.Astar(m, pos, random_pos, path_type); + for (int i = 0; i < size_of_tail; i++) { + Tail tail = new Tail(m, astar.get(astar.size() - (2 + i)), "Tail", pv, path_type, lvl); + snakeTail.add(tail); + m.addMonster(tail); } } @Override public void move(Position pos) { - Position oldPos = this.getPosition().copyOf(); - super.move(pos); - moveTail(oldPos); - + Position old_pos = getPosition(); + super.move(pos); + for (Tail t : snakeTail){ + Position acc = t.getPosition(); + t.move(old_pos); + old_pos = acc; + } } - private void moveTail(Position p ){ - + @Override + public boolean updatePV(int pv) { + boolean Alive = super.updatePV(pv); + if(!Alive){ + for(Tail t : snakeTail){ + t.updatePV(-Integer.MAX_VALUE); + } + } + return Alive; } @Override diff --git a/src/main/java/Model/Entitys/Monsters/Tail.java b/src/main/java/Model/Entitys/Monsters/Tail.java deleted file mode 100644 index c80eab2..0000000 --- a/src/main/java/Model/Entitys/Monsters/Tail.java +++ /dev/null @@ -1,30 +0,0 @@ -package Model.Entitys.Monsters; - -import Model.Map.Etage; -import Model.Utils.Affichage; -import Model.Utils.Position; - -public class Tail extends AbstractMonster{ - protected Tail(Etage m, Position pos, String nom, int pv, int force, double vision_radius, int agro, int update_rate_ms, int path_type, int lvl) { - super(m, pos, nom, pv, force, vision_radius, agro, update_rate_ms, path_type, lvl); - } - - - - @Override - public boolean updatePV(int pv) { - return true; - } - - @Override - public void move(Position pos) { - super.move(pos); - } - - - - @Override - public String toString() { - return Affichage.BLUE+Affichage.BOLD+"o"; - } -} diff --git a/src/main/java/Model/Map/Map.java b/src/main/java/Model/Map/Map.java index d33bf5a..a480a0f 100644 --- a/src/main/java/Model/Map/Map.java +++ b/src/main/java/Model/Map/Map.java @@ -1,5 +1,6 @@ package Model.Map; +import Model.Entitys.Monsters.MonsterFactory; import Model.Map.Etage_Strategy.EtageStrategy; import Model.Map.Etage_Strategy.TrapEtageStrategy; import Model.Utils.Start; diff --git a/src/main/java/Model/Utils/Start.java b/src/main/java/Model/Utils/Start.java index bd2b44c..4e805d9 100644 --- a/src/main/java/Model/Utils/Start.java +++ b/src/main/java/Model/Utils/Start.java @@ -1 +1 @@ -package Model.Utils; import Model.Entitys.BasicPlayer; import Model.Map.Map; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; public class Start { private static Map map; private static BasicPlayer player; public static void startGame() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); TourManager tm = getInfo(reader); while (true) { tm.playTour(); } } private static TourManager getInfo(BufferedReader reader) throws IOException { Affichage.start(); switch (reader.readLine()) { case "1" -> { return init(reader); } case "2" -> //TODO sauvegarde System.exit(1); case "3" -> System.exit(0); } return getInfo(reader); } private static TourManager init(BufferedReader reader) throws IOException { System.out.print(Affichage.BLUE+"JOUEUR: "+Affichage.RESET); String nom = reader.readLine(); player=new BasicPlayer(20,nom.length()==0 ? "Tu" : nom,100,1); System.out.print(Affichage.BRIGTH_PURPLE+"Numero seed: "+Affichage.RESET); long seed_value; try{ seed_value = Long.parseLong(reader.readLine()); } catch (NumberFormatException e){ seed_value =new Random().nextLong(); } Procedure.setSeed(seed_value); map = new Map(); return new TourManager(reader, player, map, map.getCurrent()); } public static BasicPlayer getPlayer(){ return player; } public static Map getMap() { return map; } } \ No newline at end of file +package Model.Utils; import Model.Entitys.BasicPlayer; import Model.Entitys.Monsters.AbstractMonster; import Model.Entitys.Monsters.MonsterFactory; import Model.Map.Map; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; public class Start { private static Map map; private static BasicPlayer player; public static void startGame() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); TourManager tm = getInfo(reader); getPlayer().getEtage().addMonster(MonsterFactory.getNewMonster(getPlayer().getEtage(), MonsterFactory.MonsterType.SNAKE)); while (true) { tm.playTour(); } } private static TourManager getInfo(BufferedReader reader) throws IOException { Affichage.start(); switch (reader.readLine()) { case "1" -> { return init(reader); } case "2" -> //TODO sauvegarde System.exit(1); case "3" -> System.exit(0); } return getInfo(reader); } private static TourManager init(BufferedReader reader) throws IOException { System.out.print(Affichage.BLUE+"JOUEUR: "+Affichage.RESET); String nom = reader.readLine(); player=new BasicPlayer(20,nom.length()==0 ? "Tu" : nom,100,30); System.out.print(Affichage.BRIGTH_PURPLE+"Numero seed: "+Affichage.RESET); long seed_value; try{ seed_value = Long.parseLong(reader.readLine()); } catch (NumberFormatException e){ seed_value =new Random().nextLong(); } Procedure.setSeed(seed_value); map = new Map(); return new TourManager(reader, player, map, map.getCurrent()); } public static BasicPlayer getPlayer(){ return player; } public static Map getMap() { return map; } } \ No newline at end of file diff --git a/src/main/java/Model/Utils/Tools.java b/src/main/java/Model/Utils/Tools.java index 4c98a91..c34b199 100644 --- a/src/main/java/Model/Utils/Tools.java +++ b/src/main/java/Model/Utils/Tools.java @@ -1,5 +1,6 @@ package Model.Utils; +import Model.Entitys.Monsters.AbstractMonster; import Model.Map.Cell; import Model.Map.Etage; @@ -12,6 +13,7 @@ public class Tools { public static final int PATH_CROSS = 0; public static final int PATH_DIAG = 1; public static final int PATH_GHOST = 2; + public static final int PATH_NOMOBS = 3; /** * Algoritme A* qui permet de trouver le plus court chemin entre la Position de depart et celle d'arrivé. @@ -87,6 +89,16 @@ private ArrayList getNoClipStandardNeighboors(){ // Filtrage pour obtenir un voisin valide (dans la map, accessible...) return voisins.stream().filter(p -> ((p.getX() >= 0 && p.getY() >= 0 && p.getX() < etage.getWidth() && p.getY() < etage.getHeigth()))).collect(Collectors.toCollection(ArrayList::new)); } + + private ArrayList getStandardNoMobsNeighboors(){ + ArrayList voisins = new ArrayList<>(); + voisins.add(new Noeud(getX() - 1,getY())); + voisins.add(new Noeud(getX() + 1,getY())); + voisins.add(new Noeud(getX(),getY() - 1)); + voisins.add(new Noeud(getX(),getY() + 1)); + // Filtrage pour obtenir un voisin valide (dans la map, accessible...) + return voisins.stream().filter(p -> ((p.getX() >= 0 && p.getY() >= 0 && p.getX() < etage.getWidth() && p.getY() < etage.getHeigth()) && !(etage.get(p.getX(),p.getY()).getEntity() instanceof AbstractMonster) && etage.get(p.getX(),p.getY()).isAccesible())).collect(Collectors.toCollection(ArrayList::new)); + } } ArrayList closedList = new ArrayList<>(); @@ -113,7 +125,8 @@ private ArrayList getNoClipStandardNeighboors(){ ArrayList voisins = switch (pathType) { case 0 -> u.getStandardNeighboors(); case 1 -> u.getDiagonalNeighboors(); - default -> u.getNoClipStandardNeighboors(); + case 2 -> u.getNoClipStandardNeighboors(); + default -> u.getStandardNoMobsNeighboors(); }; //Parcous voisins diff --git a/src/main/java/Model/Utils/TourManager.java b/src/main/java/Model/Utils/TourManager.java index de16610..aec53c9 100644 --- a/src/main/java/Model/Utils/TourManager.java +++ b/src/main/java/Model/Utils/TourManager.java @@ -2,6 +2,7 @@ import Model.Entitys.Monsters.AbstractMonster; import Model.Entitys.BasicPlayer; +import Model.Entitys.Monsters.MonsterFactory; import Model.Map.Etage; import Model.Map.Map;