From 7fc59188cf2ca2b31d2fb0b83d4abbb75a2897fc Mon Sep 17 00:00:00 2001
From: Guyslain <guyslain.naves@lis-lab.fr>
Date: Thu, 3 Oct 2024 11:33:50 +0200
Subject: [PATCH] ajout td5

---
 src/main/java/fr/univamu/progav/td5/Blow.java |  4 +
 .../java/fr/univamu/progav/td5/Character.java | 29 +++++++
 src/main/java/fr/univamu/progav/td5/TD5.md    | 58 ++++++++++++++
 .../java/fr/univamu/progav/td5/Warrior.java   | 35 +++++++++
 .../java/fr/univamu/progav/td5/Wizard.java    | 36 +++++++++
 .../fr/univamu/progav/td5/WarriorTest.java    | 76 +++++++++++++++++++
 .../fr/univamu/progav/td5/WizardTest.java     | 65 ++++++++++++++++
 7 files changed, 303 insertions(+)
 create mode 100644 src/main/java/fr/univamu/progav/td5/Blow.java
 create mode 100644 src/main/java/fr/univamu/progav/td5/Character.java
 create mode 100644 src/main/java/fr/univamu/progav/td5/TD5.md
 create mode 100644 src/main/java/fr/univamu/progav/td5/Warrior.java
 create mode 100644 src/main/java/fr/univamu/progav/td5/Wizard.java
 create mode 100644 src/test/java/fr/univamu/progav/td5/WarriorTest.java
 create mode 100644 src/test/java/fr/univamu/progav/td5/WizardTest.java

diff --git a/src/main/java/fr/univamu/progav/td5/Blow.java b/src/main/java/fr/univamu/progav/td5/Blow.java
new file mode 100644
index 0000000..6c806a9
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td5/Blow.java
@@ -0,0 +1,4 @@
+package fr.univamu.progav.td5;
+
+public record Blow(int physicalDamage, int magicalDamage) {
+}
diff --git a/src/main/java/fr/univamu/progav/td5/Character.java b/src/main/java/fr/univamu/progav/td5/Character.java
new file mode 100644
index 0000000..4a7c081
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td5/Character.java
@@ -0,0 +1,29 @@
+package fr.univamu.progav.td5;
+
+public abstract class Character {
+
+  // TODO add health points
+
+  public boolean isAlive() {
+    // TODO
+    return false;
+  }
+
+  protected int getHealth() {
+    // TODO
+    return 0;
+  }
+  protected void reduceHealth(int amount) {
+    // TODO
+  }
+  protected void setHealth(int health) {
+    // TODO
+  }
+
+  public abstract Blow attack();
+
+  public abstract void defend(Blow blow);
+
+  public abstract void specialAction();
+
+}
diff --git a/src/main/java/fr/univamu/progav/td5/TD5.md b/src/main/java/fr/univamu/progav/td5/TD5.md
new file mode 100644
index 0000000..c5049d0
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td5/TD5.md
@@ -0,0 +1,58 @@
+Dans cet exercice, nous implémentons le comportement de trois personnages, le 
+guerrier, le mage et le prêtre, dans un jeu de rôle. Chacun peut donner et 
+recevoir des coups, a des points de vie et meurt lorsque ses points de vie 
+deviennent négatifs. Par contre, ils réagissent différemment aux coups, ont des 
+attaques différentes et ont chacun une action spéciale spécifique.
+
+Les coups sont décrits par la classe `Blow`, chaque coup ayant une 
+composante *dommage physique* et une composante *dommage magique*.
+Chaque point de dommage, physique ou magique, fait baisser d'un point la vie 
+du personnage recevant le coup.
+
+Le guerrier
+-----------
+
+- Ses attaques sont physiques : 3 points physiques et 0 point magique.
+- Il est costaud : il ne subit que la moitié des dommages physiques des 
+  coups qu'il reçoit.
+- Il peut entrer en rage avec son action spéciale. Sa rage lui permet de 
+  frapper deux fois plus fort pendant 3 attaques (6 dommages physiques).
+- Après 3 attaques, il perd sa rage.
+- S'il reçoit un coup provoquant une perte d'au moins 5 points de vie 
+  pendant sa rage, sa rage dure une attaque supplémentaire.
+
+Le mage
+-------
+
+- Ses attaques sont magiques : 4 points magiques et 0 points physique.
+- Il absorbe la magie : s'il reçoit un coup, il ne perd pas de vie à cause 
+  des dommages magiques, au contraire, la moitié des dommages magiques du 
+  coup s'annule avec les dommages physiques (par exemple, pour 5 dommages 
+  physiques et 3 magiques, il ne perd que 5 - (3/2) = 4 points de vie).
+- L'absorption de magie ne lui permet pas de gagner des points de vie 
+  (seulement de réduire les dommages physiques).
+- Son action spéciale consiste à invoquer un bouclier magique, qui absorbe 
+  les dommages physiques, jusqu'à 8 points. Le bouclier disparait une fois 
+  qu'il a absorbé 8 points au total (par exemple après deux attaques faisant 
+  5 dommages physiques chacune, il laissera passer 2 dommages physiques lors 
+  de la deuxième attaque).
+- Le bouclier est appliqué avant la règle de l'absorption des dommages magiques.
+
+
+Le prêtre
+---------
+
+- Ses attaques combinent force (2 dommages physiques) et esprit (1 dommage 
+  magique).
+- Son action spéciale est de prier.
+- Toutes les 3 prières, il est exaucé : il récupère 10 points de vie, et sa 
+  prochaine attaque provoque 5 dommages magiques supplémentaires. 
+
+
+Travail à faire
+---------------
+
+1. Compléter l'implémentation du guerrier et de la classe abstraite `Character`.
+2. Vérifier votre travail avec les tests du guerrier.
+3. Compléter l'implémentation du mage, jusqu'à passage réussi des tests.
+4. Créer la classe du prêtre tel que décrit.
\ No newline at end of file
diff --git a/src/main/java/fr/univamu/progav/td5/Warrior.java b/src/main/java/fr/univamu/progav/td5/Warrior.java
new file mode 100644
index 0000000..1090f39
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td5/Warrior.java
@@ -0,0 +1,35 @@
+package fr.univamu.progav.td5;
+
+public class Warrior extends Character {
+
+  private static final int BASE_DAMAGE = 3;
+  private static final int BASE_HEALTH = 30;
+  public static final int RAGE_DAMAGE_THRESHOLD = 5;
+
+  // TODO add rage
+
+  public Warrior() {
+    // TODO
+  }
+
+  @Override
+  public Blow attack() {
+    // TODO
+    return null;
+  }
+
+  @Override
+  public void defend(Blow blow) {
+    // TODO
+  }
+
+  @Override
+  public void specialAction() {
+    // TODO
+  }
+
+  public int getRage() {
+    // TODO
+    return 0;
+  }
+}
diff --git a/src/main/java/fr/univamu/progav/td5/Wizard.java b/src/main/java/fr/univamu/progav/td5/Wizard.java
new file mode 100644
index 0000000..0f75a21
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td5/Wizard.java
@@ -0,0 +1,36 @@
+package fr.univamu.progav.td5;
+
+public class Wizard extends Character {
+
+  private static final int BASE_HEALTH = 20;
+  private static final int BASE_DAMAGE = 4;
+  private static final int BASE_SHIELD_VALUE = 8;
+
+  // TODO add shield
+
+
+  public Wizard() {
+    // TODO
+  }
+
+  @Override
+  public Blow attack() {
+    //TODO
+    return null;
+  }
+
+  @Override
+  public void defend(Blow blow) {
+    // TODO
+  }
+
+  @Override
+  public void specialAction() {
+    // TODO
+  }
+
+  public int getShield() {
+    // TODO
+    return 0;
+  }
+}
diff --git a/src/test/java/fr/univamu/progav/td5/WarriorTest.java b/src/test/java/fr/univamu/progav/td5/WarriorTest.java
new file mode 100644
index 0000000..56ac2bf
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td5/WarriorTest.java
@@ -0,0 +1,76 @@
+package fr.univamu.progav.td5;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+class WarriorTest {
+
+  @Test
+  void newWarrior() {
+    Warrior warrior = new Warrior();
+    assertEquals(30,warrior.getHealth());
+    warrior.reduceHealth(8);
+    assertEquals(22,warrior.getHealth());
+    warrior.setHealth(25);
+    assertEquals(25,warrior.getHealth());
+  }
+
+  @Test
+  void attack() {
+    Warrior warrior = new Warrior();
+    Blow b = warrior.attack();
+    assertEquals(3,b.physicalDamage());
+    assertEquals(0,b.magicalDamage());
+  }
+
+  @Test
+  void defend() {
+    Warrior warrior = new Warrior();
+    warrior.defend(new Blow(10,2));
+    assertEquals(23,warrior.getHealth());
+    warrior.defend(new Blow(1,5));
+    assertEquals(18,warrior.getHealth());
+  }
+
+  @Test
+  void specialAction() {
+    Warrior warrior = new Warrior();
+    warrior.specialAction();
+    Blow b  = warrior.attack();
+    assertEquals(6,b.physicalDamage());
+    assertEquals(0,b.magicalDamage());
+    b  = warrior.attack();
+    b  = warrior.attack();
+    assertEquals(6,b.physicalDamage());
+    assertEquals(0,b.magicalDamage());
+    b  = warrior.attack();
+    assertEquals(3,b.physicalDamage());
+    assertEquals(0,b.magicalDamage());
+  }
+
+  @Test
+  void getRage() {
+    Warrior warrior = new Warrior();
+    assertEquals(0,warrior.getRage());
+    warrior.specialAction();
+    assertEquals(3,warrior.getRage());
+    warrior.attack();
+    assertEquals(2,warrior.getRage());
+    warrior.specialAction();
+    assertEquals(3,warrior.getRage());
+  }
+
+  @Test
+  void defendIncreaseRage() {
+    Warrior warrior = new Warrior();
+    warrior.defend(new Blow(4,4));
+    assertEquals(0,warrior.getRage(), "Warrior does not enter rage by receiving a blow");
+    warrior.specialAction();
+    warrior.defend(new Blow(0,5));
+    assertEquals(4,warrior.getRage(), "Increase rage when 5 health lost");
+    warrior.defend(new Blow(0,4));
+    assertEquals(4,warrior.getRage(), "Do not increase rage when <5 health lost");
+    warrior.defend(new Blow(6,0));
+    assertEquals(4,warrior.getRage(),"Do not increase rage when <5 health lost");
+  }
+}
\ No newline at end of file
diff --git a/src/test/java/fr/univamu/progav/td5/WizardTest.java b/src/test/java/fr/univamu/progav/td5/WizardTest.java
new file mode 100644
index 0000000..4e48aa4
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td5/WizardTest.java
@@ -0,0 +1,65 @@
+package fr.univamu.progav.td5;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+class WizardTest {
+
+
+  @Test
+  void newWizard() {
+    Wizard wizard = new Wizard();
+    assertEquals(20,wizard.getHealth());
+    assertEquals(0,wizard.getShield());
+    assertTrue(wizard.isAlive());
+  }
+
+  @Test
+  void attack() {
+    Wizard wizard = new Wizard();
+    Blow b = wizard.attack();
+    assertEquals(4, b.magicalDamage());
+    assertEquals(0, b.physicalDamage());
+    wizard.specialAction();
+    b = wizard.attack();
+    assertEquals(4, b.magicalDamage());
+    assertEquals(0,b.physicalDamage());
+  }
+
+  @Test
+  void defend() {
+    Wizard wizard = new Wizard();
+    assertEquals(20,wizard.getHealth());
+    wizard.defend(new Blow(6,2));
+    assertEquals(15,wizard.getHealth(), "Wizard loses life on physical attack, but physical damage is reduced by half of magical damage");
+    wizard.defend(new Blow(0,10));
+    assertEquals(15,wizard.getHealth(), "Wizard does not gain life on magical attack.");
+  }
+
+  @Test
+  void specialAction() {
+    Wizard wizard = new Wizard();
+    wizard.specialAction();
+    assertEquals(20, wizard.getHealth());
+    wizard.defend(new Blow(6, 2));
+    assertEquals(20, wizard.getHealth(), "Wizard's shield absorbs physical damage");
+    assertEquals(2, wizard.getShield());
+    wizard.defend(new Blow(6, 2));
+    assertEquals(
+      17,
+      wizard.getHealth(),
+      "Wizard's shield absorbs physical damage until depleted, then normal rules apply"
+    );
+    assertEquals(0, wizard.getShield());
+  }
+
+  @Test
+  void maxShieldValue() {
+    Wizard wizard = new Wizard();
+    wizard.specialAction();
+    wizard.defend(new Blow(5,0));
+    wizard.specialAction();
+    wizard.defend(new Blow(5,0));
+    assertEquals(3, wizard.getShield(),"Wizard's special action sets shield to 8 (not an addition)");
+  }
+}
\ No newline at end of file
-- 
GitLab