fakemon/FakeMon/src/mon/stat/Monster.scala
2019-05-23 22:58:31 -04:00

62 lines
1.4 KiB
Scala

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) = {
}
}