package mon.stat import scala.util._ import mon.util.Fraction import Monster._ import Statistic._ class Monster(val base : StorageMon) { val level = 10 val stats = Statistic.buildMap(computeStat) var boosts = Statistic.buildMap(_ => 0) var hp = stats(Hp) var status : Option[Status] = None def isAlive = hp > 0 def apply(s : Stat) = { val mod = boosts.getOrElse(s, 0) val mult = if (mod > 0) Fraction(2 + mod, 2) else Fraction(2, 2 - mod) mult * stats(s) } def elements = base.form.elements def takeDamage(dmg : Int) { hp = Math.max(0, hp - dmg) } def recoverDamage(healing : Int) { hp = Math.min(stats(Hp), hp + healing) } def applyBoost(s : Stat, boost : Int) { val modified = boosts.getOrElse(s, 0) + boost boosts = boosts.updated(s, Math.min(MaxBoost, Math.max(-MaxBoost, modified))) } def effectiveness(element : Element) : Double = { elements.foldLeft(1.0)((m, e) => m * (element --> e)) } private def computeStat(s : Stat) : Int = { val num = 2 * base.form.baseStats(s) + base.gene.ivs(s) + base.evs(s) / 4 val frac = num * level / 100 val score = if(s == Hp) frac + 10 + level else frac + 5 score } override def toString = base.nickname } object Monster { final val MaxBoost = 6 def build(trainer : TrainerID, form : Form)(implicit rng : Random) = { } }