diff --git a/src/main/scala/Pokemon/Efficiency.scala b/src/main/scala/Pokemon/Efficiency.scala
new file mode 100644
index 0000000000000000000000000000000000000000..b4c008d47f72b9a292592e8848889f671ee5e07e
--- /dev/null
+++ b/src/main/scala/Pokemon/Efficiency.scala
@@ -0,0 +1,6 @@
+class Efficiency(val factor: Double)
+
+case object Efficient extends Efficiency(2.0)
+case object Basic extends Efficiency(1.0)
+case object NotEfficient extends Efficiency(0.5)
+case object Inefficient extends Efficiency(0.0)
diff --git a/src/main/scala/Pokemon/Pokemon.scala b/src/main/scala/Pokemon/Pokemon.scala
index b16a05f5cf079cda1ff6597ef802dcb55eaaf54c..388fad1729311eebd034e76542813a0e332fb8c5 100644
--- a/src/main/scala/Pokemon/Pokemon.scala
+++ b/src/main/scala/Pokemon/Pokemon.scala
@@ -1,9 +1,9 @@
-trait Pokemon(var name: String, var life: Int, val ptype: Type):
+trait Pokemon(var name: String, var life: Int, val ptype: List[Type]):
 
     def attack(capacity: Capacity, other: Pokemon) =
-        val multiplicator = capacity.ctype.computeMultiplier(other.ptype)
+        val multiplier = other.ptype.foldLeft(1.0)(_ * capacity.ctype.typeEfficiency(_).factor)
 
-        other.decreaseLife(Math.round(multiplicator.floatValue))
+        other.decreaseLife(Math.round(multiplier.toFloat))
 
     def decreaseLife(x: Int) = this.life = this.life - x
 
diff --git a/src/main/scala/Pokemon/PokemonFactory.scala b/src/main/scala/Pokemon/PokemonFactory.scala
index e0f92207b38d5ca4a6e1b0830195afbd9a1262dc..26fe2b338f205eb081cc1e5dd626313335053aac 100644
--- a/src/main/scala/Pokemon/PokemonFactory.scala
+++ b/src/main/scala/Pokemon/PokemonFactory.scala
@@ -1,8 +1,8 @@
 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)
+    private case class Bulbasaur() extends Pokemon("Bulbasaur", 25, List(Grass, Poison))
+    private case class Charmander() extends Pokemon("Charmander", 30, List(Fire))
+    private case class Squirtle() extends Pokemon("Squirtle", 25, List(Water))
 
     def apply(name: String): Pokemon = name match
         case "Bulbasaur"  => Bulbasaur()
diff --git a/src/main/scala/Pokemon/Type.scala b/src/main/scala/Pokemon/Type.scala
index b75a3cd35ffefff00d51676dfbc4c507986e2ad9..fda3cdd3a761d66f5ebfd73a697985bf59b686c5 100644
--- a/src/main/scala/Pokemon/Type.scala
+++ b/src/main/scala/Pokemon/Type.scala
@@ -1,7 +1,22 @@
-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
+sealed trait Type(val strong_on: List[Type], val weak_on: List[Type], val inefficient_on: List[Type]):
+    def typeEfficiency(ptype: Type): Efficiency =
+        if strong_on.contains(ptype) then Efficient
+        else if weak_on.contains(ptype) then NotEfficient
+        else if inefficient_on.contains(ptype) then Inefficient
+        else Basic
 
-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))
+case object Normal extends Type(List(), List(Rock), List(Ghost))
+case object Fight extends Type(List(Normal, Rock, Ice), List(Poison, Flying, Bug, Psychic), List(Ghost))
+case object Flying extends Type(List(Bug, Fight, Grass), List(Electric, Rock), List())
+case object Poison extends Type(List(Bug, Grass), List(Poison, Ground, Rock, Ghost), List())
+case object Ground extends Type(List(Electric, Fire, Poison, Rock), List(Bug, Grass), List(Flying))
+case object Rock extends Type(List(Bug, Fire, Flying, Ice), List(Fight, Ground), List())
+case object Bug extends Type(List(Grass, Poison, Psychic), List(Fight, Fire, Flying, Ghost), List())
+case object Ghost extends Type(List(Ghost), List(), List(Normal, Psychic))
+case object Fire extends Type(List(Bug, Grass, Ice), List(Dragon, Fire, Rock, Water), List())
+case object Water extends Type(List(Fire, Ground, Rock), List(Dragon, Grass, Water), List())
+case object Grass extends Type(List(Ground, Rock, Water), List(Bug, Dragon, Fire, Flying, Grass, Poison), List())
+case object Electric extends Type(List(Flying, Water), List(Dragon, Electric, Grass), List(Ground))
+case object Psychic extends Type(List(Fight, Poison), List(Psychic), List())
+case object Ice extends Type(List(Dragon, Flying, Grass, Ground), List(Ice, Water), List())
+case object Dragon extends Type(List(Dragon), List(), List())
diff --git a/src/test/scala/Test.scala b/src/test/scala/Test.scala
index b7b19570bedc69f02c894218a82e1c9dffe864ea..862e20d9f311ee914168ff46353100fe9a01211c 100644
--- a/src/test/scala/Test.scala
+++ b/src/test/scala/Test.scala
@@ -4,7 +4,7 @@ import org.scalatest.funsuite.AnyFunSuite
 class StackSpec extends AnyFunSuite:
 
     test("Strong type should have increased damage multiplicator") {
-        assert(Fire.computeMultiplier(Grass) == 2)
+        assert(Fire.typeEfficiency(Grass) == 2)
     }
 
     test("Weak type should have decreased damage multiplicator") {