-
Notifications
You must be signed in to change notification settings - Fork 3
/
BaseBarbarian.scala
100 lines (83 loc) · 2.96 KB
/
BaseBarbarian.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package io.github.tjheslin1.dmspredictor.classes.barbarian
import io.github.tjheslin1.dmspredictor.classes.Player
import io.github.tjheslin1.dmspredictor.classes.barbarian.BaseBarbarian.resetStatus
import io.github.tjheslin1.dmspredictor.equipment.Equipment
import io.github.tjheslin1.dmspredictor.equipment.armour.{Armour, NoArmour, Shield}
import io.github.tjheslin1.dmspredictor.model.BaseStats.Stat
import io.github.tjheslin1.dmspredictor.model.Modifier.mod
import io.github.tjheslin1.dmspredictor.model._
import monocle.Lens
trait BaseBarbarian extends Player with Product with Serializable {
val inRage: Boolean
val rageUsages: Int
val rageTurnsLeft: Int
def resetStartOfTurn(): Creature = resetStatus(this)
def scoresCritical(roll: Int): Boolean = roll == 20
}
object BaseBarbarian {
val HitDice = D12
val rageUsagesPerLevel: Map[Level, Int] = Map(
LevelOne -> 2,
LevelTwo -> 2,
LevelThree -> 3,
LevelFour -> 3,
LevelFive -> 3
)
def calculateHealth(level: Level, constitutionScore: Stat): Int = Player.calculateHealth(
HitDice,
level,
constitutionScore)
def weaponWithRageDamage[_: RS](weapon: Weapon, inRage: Boolean): Weapon = {
lazy val inRageDamage =
if (inRage)
weapon.damage + 2
else
weapon.damage
Weapon(
weapon.name,
weapon.weaponType,
weapon.damageType,
weapon.twoHanded,
weapon.finesse,
inRageDamage,
weapon.hitBonus
)
}
def calculateArmourClass(stats: BaseStats, armour: Armour, offHand: Option[Equipment]): Int = {
val baseArmourClass = armour.armourClass(stats.dexterity)
val shieldBonus =
offHand match {
case Some(Shield) => Shield.armourClass(stats.dexterity)
case _ => 0
}
armour match {
case NoArmour => baseArmourClass + mod(stats.constitution) + shieldBonus // Unarmoured Defense
case _ => baseArmourClass + shieldBonus
}
}
def resetStatus(baseBarbarian: BaseBarbarian): BaseBarbarian = {
val resetAttackStatus = Creature.creatureAttackStatusLens.set(Regular)(baseBarbarian)
Creature.creatureDefenseStatusLens.set(Regular)(resetAttackStatus).asInstanceOf[BaseBarbarian]
}
val inRageLens: Lens[BaseBarbarian, Boolean] =
Lens[BaseBarbarian, Boolean](_.inRage) { rage =>
{
case b: Barbarian => Barbarian._inRage.set(rage)(b)
case b: Berserker => Berserker._inRage.set(rage)(b)
}
}
val rageUsagesLens: Lens[BaseBarbarian, Int] =
Lens[BaseBarbarian, Int](_.rageUsages) { rageNum =>
{
case b: Barbarian => Barbarian._rageUsages.set(rageNum)(b)
case b: Berserker => Berserker._rageUsages.set(rageNum)(b)
}
}
val rageTurnsLeftLens: Lens[BaseBarbarian, Int] =
Lens[BaseBarbarian, Int](_.rageTurnsLeft) { turnsLeft =>
{
case b: Barbarian => Barbarian._rageTurnsLeft.set(turnsLeft)(b)
case b: Berserker => Berserker._rageTurnsLeft.set(turnsLeft)(b)
}
}
}