62 lines
1.4 KiB
Scala
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) = {
|
|
|
|
}
|
|
} |