From c7be832c6300df4d87ef4945e4227c2f224f00be Mon Sep 17 00:00:00 2001
From: Vincent Lafeychine <vincent.lafeychine@gmail.com>
Date: Tue, 1 Feb 2022 19:56:59 +0100
Subject: [PATCH] Add example + Capacity + Pokemon + Type

---
 src/main/scala/Main.scala                    | 11 +++++++++++
 src/main/scala/Pokemon/Capacity.scala        |  1 +
 src/main/scala/Pokemon/CapacityFactory.scala |  6 ++++++
 src/main/scala/Pokemon/Pokemon.scala         | 10 ++++++++++
 src/main/scala/Pokemon/PokemonFactory.scala  | 10 ++++++++++
 src/main/scala/Pokemon/Type.scala            |  7 +++++++
 6 files changed, 45 insertions(+)
 create mode 100644 src/main/scala/Main.scala
 create mode 100644 src/main/scala/Pokemon/Capacity.scala
 create mode 100644 src/main/scala/Pokemon/CapacityFactory.scala
 create mode 100644 src/main/scala/Pokemon/Pokemon.scala
 create mode 100644 src/main/scala/Pokemon/PokemonFactory.scala
 create mode 100644 src/main/scala/Pokemon/Type.scala

diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala
new file mode 100644
index 0000000..1c393e2
--- /dev/null
+++ b/src/main/scala/Main.scala
@@ -0,0 +1,11 @@
+@main def main() =
+    val pkmn = PokemonFactory("Bulbasaur")
+    val pkmn2 = PokemonFactory("Charmander")
+
+    println(pkmn)
+    println(pkmn2)
+
+    pkmn.attack(CapacityFactory("Vine Whip"), pkmn2)
+
+    println(pkmn)
+    println(pkmn2)
diff --git a/src/main/scala/Pokemon/Capacity.scala b/src/main/scala/Pokemon/Capacity.scala
new file mode 100644
index 0000000..ae60435
--- /dev/null
+++ b/src/main/scala/Pokemon/Capacity.scala
@@ -0,0 +1 @@
+class Capacity(name: String, val ctype: Type)
diff --git a/src/main/scala/Pokemon/CapacityFactory.scala b/src/main/scala/Pokemon/CapacityFactory.scala
new file mode 100644
index 0000000..08d04df
--- /dev/null
+++ b/src/main/scala/Pokemon/CapacityFactory.scala
@@ -0,0 +1,6 @@
+object CapacityFactory:
+
+    private case class VineWhip() extends Capacity("Vine Whip", Grass)
+
+    def apply(name: String): Capacity = name match
+        case "Vine Whip" => VineWhip()
diff --git a/src/main/scala/Pokemon/Pokemon.scala b/src/main/scala/Pokemon/Pokemon.scala
new file mode 100644
index 0000000..b16a05f
--- /dev/null
+++ b/src/main/scala/Pokemon/Pokemon.scala
@@ -0,0 +1,10 @@
+trait Pokemon(var name: String, var life: Int, val ptype: Type):
+
+    def attack(capacity: Capacity, other: Pokemon) =
+        val multiplicator = capacity.ctype.computeMultiplier(other.ptype)
+
+        other.decreaseLife(Math.round(multiplicator.floatValue))
+
+    def decreaseLife(x: Int) = this.life = this.life - x
+
+    override def toString(): String = s"[${this.name}] Life: ${this.life}"
diff --git a/src/main/scala/Pokemon/PokemonFactory.scala b/src/main/scala/Pokemon/PokemonFactory.scala
new file mode 100644
index 0000000..e0f9220
--- /dev/null
+++ b/src/main/scala/Pokemon/PokemonFactory.scala
@@ -0,0 +1,10 @@
+object PokemonFactory:
+
+    private case class Bulbasaur() extends Pokemon("Bulbasaur", 25, Grass)
+    private case class Charmander() extends Pokemon("Charmander", 30, Fire)
+    private case class Squirtle() extends Pokemon("Squirtle", 25, Water)
+
+    def apply(name: String): Pokemon = name match
+        case "Bulbasaur"  => Bulbasaur()
+        case "Charmander" => Charmander()
+        case "Squirtle"   => Squirtle()
diff --git a/src/main/scala/Pokemon/Type.scala b/src/main/scala/Pokemon/Type.scala
new file mode 100644
index 0000000..b75a3cd
--- /dev/null
+++ b/src/main/scala/Pokemon/Type.scala
@@ -0,0 +1,7 @@
+sealed trait Type(val strength: List[Type], val weakness: List[Type]):
+    def computeMultiplier(ptype: Type) =
+        if strength.contains(ptype) then 2 else if weakness.contains(ptype) then 0.5 else 1
+
+case object Grass extends Type(List(Water), List(Fire))
+case object Water extends Type(List(Fire), List(Grass, Water))
+case object Fire extends Type(List(Grass), List(Water))
-- 
GitLab