// © 2025 Alessio Severi — vedi licenza nel file Main.java package personaggi; public class Animate extends Combat { private final String COLORE1 = "\033[34m"; // blu per eroe private final String COLORE2 = "\033[31m"; // rosso per vampiro/ private final String COLORE3 = "\033[32m"; // verde licantropo private final int TIME = 80; private final int LENGTH_TERMINAL = 100; private final int LENGTH = 20; private final String[][] animate_avatars = new String[2][]; public Animate(Personaggio[] avatars) { super(avatars); } public void setAnimateAvatar() { for (int i = 0; i < 2; i++) { animate_avatars[i] = switch (fifhters[i].toLowerCase()) { case "eroe" -> new String[] { COLORE1 + " __(ò_ó) ", COLORE1 + "|* |-§≠|===>", COLORE1 + " \\/ / \\ " }; case "vampiro" -> new String[] { COLORE2 + " (㇏(•̀.•́)ノ) ", COLORE2 + " ) ཀ ( ", COLORE2 + " ) / \\ ( " }; case "licantropo" -> new String[] { COLORE3 + " ᕦ(•̀.•́)ᕤ ", COLORE3 + " Ǝ= ཀ =E ", COLORE3 + " / \\ " }; default -> new String[] { "", "", "" }; // obbligatorio in uno switch expression }; if ("allenamento".equals(modalita_combat)) break; } } public void stampaSingleAvatars() { String testa = animate_avatars[0][0]; String torso = animate_avatars[0][1]; String gambe = animate_avatars[0][2]; String spazio; System.out.println(); for (int posizione = 0; posizione < LENGTH; posizione++) { spazio = " ".repeat(posizione); // Stampa le tre righe con spazi iniziali per animazione System.out.print("\r"); System.out.println(); System.out.print(spazio + testa + "\n"); System.out.print(spazio + torso + "\n"); System.out.print(spazio + gambe + "\n"); System.out.println(); try { Thread.sleep(TIME); // tempo per effetto animato } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // Torna indietro di 3 righe per riscrivere sopra System.out.print("\033[F\033[F\033[F\033[F\033[F"); } System.out.println("\n\n\n\n\n\n\n"); } public void stampaDoubleAvatars() { // Corpo eroe da sinistra String testa1 = animate_avatars[0][0]; String torso1 = animate_avatars[0][1]; String gambe1 = animate_avatars[0][2]; // Corpo eroe da destra String testa2 = animate_avatars[1][0]; String torso2 = animate_avatars[1][1]; String gambe2 = animate_avatars[1][2]; if (fifhters[0].toLowerCase().equals("licantropo")) testa2 = " " + testa2; // Limita la distanza massima in base alla larghezza del terminale int width = LENGTH_TERMINAL; int tot = testa1.length() + testa2.length(); int maxFree = Math.max(0, width - tot); // Assicura che il ciclo non faccia “andare a capo” le righe int passoFinale = Math.min(LENGTH, maxFree); int spazio1; int spazio2; System.out.println("\n\n\n\n\n"); for (int passo = 0; passo <= passoFinale; passo++) { spazio1 = Math.min(passo, maxFree); spazio2 = maxFree - spazio1; // Torna su 4 righe e cancella System.out.print("\033[F\033[F\033[F\033[F\033[F"); for (int i = 0; i < 4; i++) System.out.println(" ".repeat(LENGTH_TERMINAL)); // Riga vuota // Risale System.out.print("\033[F\033[F\033[F\033[F"); // Stampa eroi System.out.println(); System.out.println(" ".repeat(spazio1) + testa1 + " ".repeat(spazio2 - spazio1 - testa1.length()) + testa2); System.out.println(" ".repeat(spazio1) + torso1 + " ".repeat(spazio2 - spazio1 - torso1.length()) + torso2); System.out.println(" ".repeat(spazio1) + gambe1 + " ".repeat(spazio2 - spazio1 - gambe1.length()) + gambe2); System.out.println(); try { Thread.sleep(TIME); // tempo per effetto animato } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } System.out.println("\n\n"); } public void stampaAnimate() { setAnimateAvatar(); switch (modalita_combat) { case "allenamento" -> stampaSingleAvatars(); case "combattimento" -> stampaDoubleAvatars(); default -> stampaSingleAvatars(); } // senza assegnamento non devo metter il ; } }