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") {