From acdbd5cb07e9f8691e188af707facae51f362348 Mon Sep 17 00:00:00 2001
From: PhenixCeleste <vivien.d06@gmail.com>
Date: Mon, 14 Feb 2022 00:15:55 +0100
Subject: [PATCH] attack mechanism implemented ; calculs of pokemons stats
 added

---
 src/main/scala/backend/Main.scala             |  6 +++-
 src/main/scala/backend/Pokemon/Capacity.scala |  2 +-
 .../backend/Pokemon/CapacityFactory.scala     |  2 +-
 src/main/scala/backend/Pokemon/Pokemon.scala  | 34 +++++++++++++------
 .../backend/Pokemon/PokemonFactory.scala      |  6 ++--
 5 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/src/main/scala/backend/Main.scala b/src/main/scala/backend/Main.scala
index 1c393e2..7561898 100644
--- a/src/main/scala/backend/Main.scala
+++ b/src/main/scala/backend/Main.scala
@@ -1,11 +1,15 @@
 @main def main() =
     val pkmn = PokemonFactory("Bulbasaur")
     val pkmn2 = PokemonFactory("Charmander")
+    val pkmn3 = PokemonFactory("Squirtle")
 
     println(pkmn)
     println(pkmn2)
+    println(pkmn3)
 
-    pkmn.attack(CapacityFactory("Vine Whip"), pkmn2)
+    pkmn.useCapacity(CapacityFactory("Vine Whip"), pkmn2)
+    pkmn.useCapacity(CapacityFactory("Vine Whip"), pkmn3)
 
     println(pkmn)
     println(pkmn2)
+    println(pkmn3)
diff --git a/src/main/scala/backend/Pokemon/Capacity.scala b/src/main/scala/backend/Pokemon/Capacity.scala
index 0a0bdf4..730eeef 100644
--- a/src/main/scala/backend/Pokemon/Capacity.scala
+++ b/src/main/scala/backend/Pokemon/Capacity.scala
@@ -1 +1 @@
-class Capacity(val name: String, val ctype: Type, val maxUses: Int)
+class Capacity(val name: String, val ctype: Type, val maxUses: Int, val power: Int)
diff --git a/src/main/scala/backend/Pokemon/CapacityFactory.scala b/src/main/scala/backend/Pokemon/CapacityFactory.scala
index ef2f496..1c47d63 100644
--- a/src/main/scala/backend/Pokemon/CapacityFactory.scala
+++ b/src/main/scala/backend/Pokemon/CapacityFactory.scala
@@ -1,6 +1,6 @@
 object CapacityFactory:
 
-    private case class VineWhip() extends Capacity("Vine Whip", Grass, 15)
+    private case class VineWhip() extends Capacity("Vine Whip", Grass, 10, 35)
 
     def apply(name: String): Capacity = name match
         case "Vine Whip" => VineWhip()
diff --git a/src/main/scala/backend/Pokemon/Pokemon.scala b/src/main/scala/backend/Pokemon/Pokemon.scala
index 7ef4fd7..8f2c235 100644
--- a/src/main/scala/backend/Pokemon/Pokemon.scala
+++ b/src/main/scala/backend/Pokemon/Pokemon.scala
@@ -2,25 +2,39 @@ trait Pokemon( // TODO: must add later max_life...
     private var _name: String,
     private var _life: Int,
     val ptype: List[Type],
-    _pcapacity: List[Capacity],
-    _attack: Int,
-    _defense: Int,
-    _speed: Int
+    pcapacity: List[Capacity],
+    baseAttack: Int,
+    baseDefense: Int,
+    baseSpeed: Int,
+    baseLife: Int,
+    level: Int
 ):
 
+    // getter
     def name: String = this._name
+    def life: Int = this._life
 
+    // setter
     def name_=(name: String) = this._name = name
+    def life_=(life: Int) = this._life = life
 
-    def attack(capacity: Capacity, other: Pokemon) =
-        val multiplier = other.ptype.foldLeft(1.0)(_ * capacity.ctype.typeEfficiency(_).factor)
+    def attack: Int = 5 + scala.math.floor(2.0 * this.baseAttack * this.level / 100.0).toInt
+    def defense: Int = 5 + scala.math.floor(2.0 * this.baseDefense * this.level / 100.0).toInt
+    def speed: Int = 5 + scala.math.floor(2.0 * this.baseSpeed * this.level / 100.0).toInt
+    def maxLife: Int = scala.math.floor(2.0 * this.baseSpeed * this.level / 100.0).toInt + 10 + this.level
 
-        other.decreaseLife(Math.round(multiplier.toFloat))
+    def useCapacity(capacity: Capacity, other: Pokemon) =
+        val multiplier = other.ptype.foldLeft(1.0)(_ * capacity.ctype.typeEfficiency(_).factor)
 
-    def life: Int = this._life
+        val damage =
+            (((2.0 * (this.level) / 5.0) * (capacity.power) * (this.attack)
+                / (other.defense)) / 50.0 + 2.0)
+                * (scala.util.Random.between(0.85, 1.0)) * multiplier
+                * (if this.ptype.foldLeft(false)(_ || _ == capacity.ctype) then 1.5 else 1.0)
 
-    def life_=(life: Int) = this._life = life
+        other.decreaseLife(Math.round(damage.toFloat))
 
     def decreaseLife(x: Int) = this._life = this._life - x
 
-    override def toString(): String = s"[${this.name}] Life: ${this.life}"
+    override def toString(): String =
+        s"[${this.name}] Life: ${this.life}\nMaxLife: ${this.maxLife}\nAttack: ${this.attack}\nDefense: ${this.defense}\nSpeed: ${this.speed}\n"
diff --git a/src/main/scala/backend/Pokemon/PokemonFactory.scala b/src/main/scala/backend/Pokemon/PokemonFactory.scala
index 8bcb85d..23f8126 100644
--- a/src/main/scala/backend/Pokemon/PokemonFactory.scala
+++ b/src/main/scala/backend/Pokemon/PokemonFactory.scala
@@ -1,8 +1,8 @@
 object PokemonFactory:
 
-    private case class Bulbasaur() extends Pokemon("Bulbasaur", 45, List(Grass, Poison), List(), 49, 49, 45)
-    private case class Charmander() extends Pokemon("Charmander", 39, List(Fire), List(), 52, 43, 65)
-    private case class Squirtle() extends Pokemon("Squirtle", 44, List(Water), List(), 48, 65, 43)
+    private case class Bulbasaur() extends Pokemon("Bulbasaur", 11, List(Grass, Poison), List(), 49, 49, 45, 45, 1)
+    private case class Charmander() extends Pokemon("Charmander", 12, List(Fire), List(), 52, 43, 65, 39, 1)
+    private case class Squirtle() extends Pokemon("Squirtle", 11, List(Water), List(), 48, 65, 43, 44, 1)
 
     def apply(name: String): Pokemon = name match
         case "Bulbasaur"  => Bulbasaur()
-- 
GitLab