Made it so crits ignore defense boosts and elements use enumerations for type effectiveness

This commit is contained in:
dalyjame 2019-06-24 16:51:31 -04:00
parent 4d456d7e5d
commit 7c9942066f
8 changed files with 373 additions and 347 deletions

View File

@ -21,8 +21,9 @@ import org.yaml.snakeyaml.nodes.Tag
import org.yaml.snakeyaml.constructor._
import org.yaml.snakeyaml.representer._
import fmon.stat.Element
import fmon.stat.{Effectiveness, Element}
import fmon.util.YamlHelper
import Effectiveness._
import TableColumn._
@ -37,10 +38,10 @@ class ObsElement(name_ : String, bgColor_ : Color = Color.Gray, fontColor_ : Col
val weak = new ObservableBuffer[ObsElement]()
def asElement = {
def toMap(buffer: ObservableBuffer[ObsElement], mult: Double) = {
def toMap(buffer: ObservableBuffer[ObsElement], mult: Effectiveness) = {
buffer.map(e => (e.name(), mult)).toMap
}
val effect = toMap(immune, 0.0) ++ toMap(resist, 0.5) ++ toMap(normal, 1.0) ++ toMap(weak, 2.0)
val effect = toMap(immune, Immune) ++ toMap(resist, Resist) ++ toMap(normal, Regular) ++ toMap(weak, Weak)
new Element(name(), bgColor(), fontColor(), effect)
}
@ -184,15 +185,12 @@ class ElementBuilder extends Savable {
es.foreach(eo => es.foreach(fo => {
val e = elementMap(eo.name())
val f = elementMap(fo.name())
val mult = e <-- f
if (mult < 0.1) {
eo.immune += fo
} else if (mult < 0.75) {
eo.resist += fo
} else if (mult < 1.25) {
eo.normal += fo
} else {
eo.weak += fo
e.effect.getOrElse(f.name, Regular) match {
case Immune => eo.immune += fo
case Resist => eo.resist += fo
case Regular => eo.normal += fo
case Weak => eo.weak += fo
case _ => throw new IllegalArgumentException
}
}))
elementList.clear()

View File

@ -6,6 +6,9 @@ case class Config(
val title: String,
val crit: Double,
val stab: Double,
val resistMult: Double,
val weakMult: Double,
val immuneMult: Double,
val maxBoost: Int
) {
@ -17,5 +20,8 @@ object Config {
def title = config.title
def crit = config.crit
def stab = config.stab
def resistMult = config.resistMult
def weakMult = config.weakMult
def immuneMult = config.immuneMult
def maxBoost = config.maxBoost
}

View File

@ -1,5 +1,8 @@
title: FakeMon Engine Demo
crit: 1.5
stab: 1.5
weakMult: 2.0
resistMult: 0.5
immuneMult: 0.0
maxBoost: 6
newday: 02:00

View File

@ -1,16 +1,29 @@
package fmon.stat
import com.fasterxml.jackson.module.scala.JsonScalaEnumeration
import scala.io.Source
import scalafx.scene.paint.Color
import fmon.util.YamlHelper
import fmon._
import fmon.util._
case class Element(val name : String, val bgColor: Color, val fontColor: Color, val effect : Map[String, Double]) {
object Effectiveness extends Enumeration {
case class Val protected(val mult: Double) extends super.Val
val Immune = Val(Config.immuneMult)
val Resist = Val(Config.resistMult)
val Regular = Val(1.0)
val Weak = Val(Config.weakMult)
}
class EffectivenessType extends TypeReference[Effectiveness.type]
case class Element(val name : String, val bgColor: Color, val fontColor: Color, @JsonScalaEnumeration(classOf[EffectivenessType]) val effect : Map[String, Effectiveness]) {
def -->(other : Element) = other <-- this
def <--(other : Element) = effect.getOrElse(other.name, 1.0)
def <--(other : Element) = effect.getOrElse(other.name, Effectiveness.Regular).mult
override def toString = name
}

View File

@ -148,12 +148,17 @@ abstract class Move extends MoveTurn {
if (damageCallback != null) {
damageCallback(user, this, target, reader, rng)
} else {
val crit = critMultiplier(user, target)
println(crit)
val atkStat = if (category == MoveType.Physical) PAtk else MAtk
val defStat = if (category == MoveType.Physical) PDef else MDef
val atk = if (crit > 1.0) Math.max(user(atkStat), user.stats(atkStat)) else user(atkStat)
val defense = if (crit > 1.0) Math.min(target(defStat), target.stats(defStat)) else user(defStat)
println(target(defStat), target.stats(defStat), defense)
val actualPow = if (powCallback != null) powCallback(user, this, target, reader, rng) else pow
val baseDmg = (2 * user.level / 5 + 2) * actualPow * user(atkStat) / (target(defStat) * 50) + 2
val baseDmg = (2 * user.level / 5 + 2) * actualPow * atk / (defense * 50) + 2
val effectiveness = target.effectiveness(element)
val multiplier = effectiveness * critMultiplier(user, target) * stabMultiplier(user)
val multiplier = effectiveness * crit * stabMultiplier(user)
if (effectiveness > 1.0) {
reader ! Message("It's super effective!")
} else if (effectiveness < 1.0) {

View File

@ -11,12 +11,12 @@ object Statistic extends Enumeration {
val Evasion = Value("Evasion")
def apply(s : String) = s match {
case "hp" => Hp
case "patk" => PAtk
case "pdef" => PDef
case "matk" => MAtk
case "mdef" => MDef
case "spd" => Speed
case "hp" | "Hp" => Hp
case "patk" | "PAtk" => PAtk
case "pdef" | "PDef" => PDef
case "matk" | "MAtk" => MAtk
case "mdef" | "MDef" => MDef
case "spd" | "Spd" => Speed
case "acc" => Accuracy
case "evd" => Evasion
}

View File

@ -10,24 +10,24 @@ Normal:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 1.0
Flying: 1.0
Ghost: 0.0
Ice: 1.0
Water: 1.0
Fighting: 2.0
Ground: 1.0
Steel: 1.0
Bug: 1.0
Fire: 1.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 1.0
Dark: 1.0
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Regular
Flying: Regular
Ghost: Immune
Ice: Regular
Water: Regular
Fighting: Weak
Ground: Regular
Steel: Regular
Bug: Regular
Fire: Regular
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Regular
Dark: Regular
Electric:
name: "Electric"
bgColor:
@ -39,24 +39,24 @@ Electric:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 0.5
Poison: 1.0
Rock: 1.0
Flying: 0.5
Ghost: 1.0
Ice: 1.0
Water: 1.0
Fighting: 1.0
Ground: 2.0
Steel: 0.5
Bug: 1.0
Fire: 1.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 1.0
Dark: 1.0
Normal: Regular
Electric: Resist
Poison: Regular
Rock: Regular
Flying: Resist
Ghost: Regular
Ice: Regular
Water: Regular
Fighting: Regular
Ground: Weak
Steel: Resist
Bug: Regular
Fire: Regular
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Regular
Dark: Regular
Poison:
name: "Poison"
bgColor:
@ -68,24 +68,24 @@ Poison:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 0.5
Rock: 1.0
Flying: 1.0
Ghost: 1.0
Ice: 1.0
Water: 1.0
Fighting: 0.5
Ground: 2.0
Steel: 1.0
Bug: 0.5
Fire: 1.0
Fairy: 0.5
Dragon: 1.0
Psychic: 2.0
Grass: 0.5
Dark: 1.0
Normal: Regular
Electric: Regular
Poison: Resist
Rock: Regular
Flying: Regular
Ghost: Regular
Ice: Regular
Water: Regular
Fighting: Resist
Ground: Weak
Steel: Regular
Bug: Resist
Fire: Regular
Fairy: Resist
Dragon: Regular
Psychic: Weak
Grass: Resist
Dark: Regular
Rock:
name: "Rock"
bgColor:
@ -97,24 +97,24 @@ Rock:
green: 0.0
blue: 0.0
effect:
Normal: 0.5
Electric: 1.0
Poison: 0.5
Rock: 1.0
Flying: 0.5
Ghost: 1.0
Ice: 1.0
Water: 2.0
Fighting: 2.0
Ground: 2.0
Steel: 2.0
Bug: 1.0
Fire: 0.5
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 2.0
Dark: 1.0
Normal: Resist
Electric: Regular
Poison: Resist
Rock: Regular
Flying: Resist
Ghost: Regular
Ice: Regular
Water: Weak
Fighting: Weak
Ground: Weak
Steel: Weak
Bug: Regular
Fire: Resist
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Weak
Dark: Regular
Flying:
name: "Flying"
bgColor:
@ -126,24 +126,24 @@ Flying:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 2.0
Poison: 1.0
Rock: 2.0
Flying: 1.0
Ghost: 1.0
Ice: 2.0
Water: 1.0
Fighting: 0.5
Ground: 0.0
Steel: 1.0
Bug: 0.5
Fire: 1.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 0.5
Dark: 1.0
Normal: Regular
Electric: Weak
Poison: Regular
Rock: Weak
Flying: Regular
Ghost: Regular
Ice: Weak
Water: Regular
Fighting: Resist
Ground: Immune
Steel: Regular
Bug: Resist
Fire: Regular
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Resist
Dark: Regular
Ghost:
name: "Ghost"
bgColor:
@ -155,24 +155,24 @@ Ghost:
green: 0.0
blue: 0.0
effect:
Normal: 0.0
Electric: 1.0
Poison: 0.5
Rock: 1.0
Flying: 1.0
Ghost: 2.0
Ice: 1.0
Water: 1.0
Fighting: 0.0
Ground: 1.0
Steel: 1.0
Bug: 0.5
Fire: 1.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 1.0
Dark: 2.0
Normal: Immune
Electric: Regular
Poison: Resist
Rock: Regular
Flying: Regular
Ghost: Weak
Ice: Regular
Water: Regular
Fighting: Immune
Ground: Regular
Steel: Regular
Bug: Resist
Fire: Regular
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Regular
Dark: Weak
Ice:
name: "Ice"
bgColor:
@ -184,24 +184,24 @@ Ice:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 2.0
Flying: 1.0
Ghost: 1.0
Ice: 0.5
Water: 1.0
Fighting: 2.0
Ground: 1.0
Steel: 2.0
Bug: 1.0
Fire: 2.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 1.0
Dark: 1.0
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Weak
Flying: Regular
Ghost: Regular
Ice: Resist
Water: Regular
Fighting: Weak
Ground: Regular
Steel: Weak
Bug: Regular
Fire: Weak
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Regular
Dark: Regular
Water:
name: "Water"
bgColor:
@ -213,24 +213,24 @@ Water:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 2.0
Poison: 1.0
Rock: 1.0
Flying: 1.0
Ghost: 1.0
Ice: 0.5
Water: 0.5
Fighting: 1.0
Ground: 1.0
Steel: 0.5
Bug: 1.0
Fire: 0.5
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 2.0
Dark: 1.0
Normal: Regular
Electric: Weak
Poison: Regular
Rock: Regular
Flying: Regular
Ghost: Regular
Ice: Resist
Water: Resist
Fighting: Regular
Ground: Regular
Steel: Resist
Bug: Regular
Fire: Resist
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Weak
Dark: Regular
Fighting:
name: "Fighting"
bgColor:
@ -242,24 +242,24 @@ Fighting:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 0.5
Flying: 2.0
Ghost: 1.0
Ice: 1.0
Water: 1.0
Fighting: 1.0
Ground: 1.0
Steel: 1.0
Bug: 0.5
Fire: 1.0
Fairy: 2.0
Dragon: 1.0
Psychic: 2.0
Grass: 1.0
Dark: 0.5
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Resist
Flying: Weak
Ghost: Regular
Ice: Regular
Water: Regular
Fighting: Regular
Ground: Regular
Steel: Regular
Bug: Resist
Fire: Regular
Fairy: Weak
Dragon: Regular
Psychic: Weak
Grass: Regular
Dark: Resist
Ground:
name: "Ground"
bgColor:
@ -271,24 +271,24 @@ Ground:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 0.0
Poison: 0.5
Rock: 0.5
Flying: 1.0
Ghost: 1.0
Ice: 2.0
Water: 2.0
Fighting: 1.0
Ground: 1.0
Steel: 1.0
Bug: 1.0
Fire: 1.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 2.0
Dark: 1.0
Normal: Regular
Electric: Immune
Poison: Resist
Rock: Resist
Flying: Regular
Ghost: Regular
Ice: Weak
Water: Weak
Fighting: Regular
Ground: Regular
Steel: Regular
Bug: Regular
Fire: Regular
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Weak
Dark: Regular
Steel:
name: "Steel"
bgColor:
@ -300,24 +300,24 @@ Steel:
green: 0.0
blue: 0.0
effect:
Normal: 0.5
Electric: 1.0
Poison: 0.0
Rock: 0.5
Flying: 0.5
Ghost: 1.0
Ice: 0.5
Water: 1.0
Fighting: 2.0
Ground: 2.0
Steel: 0.5
Bug: 0.5
Fire: 2.0
Fairy: 0.5
Dragon: 0.5
Psychic: 0.5
Grass: 0.5
Dark: 1.0
Normal: Resist
Electric: Regular
Poison: Immune
Rock: Resist
Flying: Resist
Ghost: Regular
Ice: Resist
Water: Regular
Fighting: Weak
Ground: Weak
Steel: Resist
Bug: Resist
Fire: Weak
Fairy: Resist
Dragon: Resist
Psychic: Resist
Grass: Resist
Dark: Regular
Bug:
name: "Bug"
bgColor:
@ -329,24 +329,24 @@ Bug:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 2.0
Flying: 2.0
Ghost: 1.0
Ice: 1.0
Water: 1.0
Fighting: 0.5
Ground: 0.5
Steel: 1.0
Bug: 1.0
Fire: 2.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 0.5
Dark: 1.0
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Weak
Flying: Weak
Ghost: Regular
Ice: Regular
Water: Regular
Fighting: Resist
Ground: Resist
Steel: Regular
Bug: Regular
Fire: Weak
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Resist
Dark: Regular
Fire:
name: "Fire"
bgColor:
@ -358,24 +358,24 @@ Fire:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 2.0
Flying: 1.0
Ghost: 1.0
Ice: 0.5
Water: 2.0
Fighting: 1.0
Ground: 2.0
Steel: 0.5
Bug: 0.5
Fire: 0.5
Fairy: 0.5
Dragon: 1.0
Psychic: 1.0
Grass: 0.5
Dark: 1.0
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Weak
Flying: Regular
Ghost: Regular
Ice: Resist
Water: Weak
Fighting: Regular
Ground: Weak
Steel: Resist
Bug: Resist
Fire: Resist
Fairy: Resist
Dragon: Regular
Psychic: Regular
Grass: Resist
Dark: Regular
Fairy:
name: "Fairy"
bgColor:
@ -387,24 +387,24 @@ Fairy:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 2.0
Rock: 1.0
Flying: 1.0
Ghost: 1.0
Ice: 1.0
Water: 1.0
Fighting: 0.5
Ground: 1.0
Steel: 2.0
Bug: 0.5
Fire: 1.0
Fairy: 1.0
Dragon: 0.0
Psychic: 1.0
Grass: 1.0
Dark: 0.5
Normal: Regular
Electric: Regular
Poison: Weak
Rock: Regular
Flying: Regular
Ghost: Regular
Ice: Regular
Water: Regular
Fighting: Resist
Ground: Regular
Steel: Weak
Bug: Resist
Fire: Regular
Fairy: Regular
Dragon: Immune
Psychic: Regular
Grass: Regular
Dark: Resist
Dragon:
name: "Dragon"
bgColor:
@ -416,24 +416,24 @@ Dragon:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 0.5
Poison: 1.0
Rock: 1.0
Flying: 1.0
Ghost: 1.0
Ice: 2.0
Water: 0.5
Fighting: 1.0
Ground: 1.0
Steel: 1.0
Bug: 1.0
Fire: 0.5
Fairy: 2.0
Dragon: 2.0
Psychic: 1.0
Grass: 0.5
Dark: 1.0
Normal: Regular
Electric: Resist
Poison: Regular
Rock: Regular
Flying: Regular
Ghost: Regular
Ice: Weak
Water: Resist
Fighting: Regular
Ground: Regular
Steel: Regular
Bug: Regular
Fire: Resist
Fairy: Weak
Dragon: Weak
Psychic: Regular
Grass: Resist
Dark: Regular
Psychic:
name: "Psychic"
bgColor:
@ -445,24 +445,24 @@ Psychic:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 1.0
Flying: 1.0
Ghost: 2.0
Ice: 1.0
Water: 1.0
Fighting: 0.5
Ground: 1.0
Steel: 1.0
Bug: 2.0
Fire: 1.0
Fairy: 1.0
Dragon: 1.0
Psychic: 0.5
Grass: 1.0
Dark: 2.0
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Regular
Flying: Regular
Ghost: Weak
Ice: Regular
Water: Regular
Fighting: Resist
Ground: Regular
Steel: Regular
Bug: Weak
Fire: Regular
Fairy: Regular
Dragon: Regular
Psychic: Resist
Grass: Regular
Dark: Weak
Grass:
name: "Grass"
bgColor:
@ -474,24 +474,24 @@ Grass:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 0.5
Poison: 2.0
Rock: 1.0
Flying: 2.0
Ghost: 1.0
Ice: 2.0
Water: 0.5
Fighting: 1.0
Ground: 0.5
Steel: 1.0
Bug: 2.0
Fire: 2.0
Fairy: 1.0
Dragon: 1.0
Psychic: 1.0
Grass: 0.5
Dark: 1.0
Normal: Regular
Electric: Resist
Poison: Weak
Rock: Regular
Flying: Weak
Ghost: Regular
Ice: Weak
Water: Resist
Fighting: Regular
Ground: Resist
Steel: Regular
Bug: Weak
Fire: Weak
Fairy: Regular
Dragon: Regular
Psychic: Regular
Grass: Resist
Dark: Regular
Dark:
name: "Dark"
bgColor:
@ -503,21 +503,21 @@ Dark:
green: 0.0
blue: 0.0
effect:
Normal: 1.0
Electric: 1.0
Poison: 1.0
Rock: 1.0
Flying: 1.0
Ghost: 0.5
Ice: 1.0
Water: 1.0
Fighting: 2.0
Ground: 1.0
Steel: 1.0
Bug: 2.0
Fire: 1.0
Fairy: 2.0
Dragon: 1.0
Psychic: 0.0
Grass: 1.0
Dark: 0.5
Normal: Regular
Electric: Regular
Poison: Regular
Rock: Regular
Flying: Regular
Ghost: Resist
Ice: Regular
Water: Regular
Fighting: Weak
Ground: Regular
Steel: Regular
Bug: Weak
Fire: Regular
Fairy: Weak
Dragon: Regular
Psychic: Immune
Grass: Regular
Dark: Resist

View File

@ -8,6 +8,7 @@ import fmon.util.Dice
package object stat {
type Stat = Statistic.Value
type Effectiveness = Effectiveness.Val
type EffectType = EffectType.Value
type MoveType = MoveType.Value
type Gender = Gender.Value