You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.3 KiB
Go

package model
import (
"math"
"math/rand"
)
// IlvlFactor returns L(ilvl) = 1 + 0.03 * max(0, ilvl - 1) per spec section 6.4.
func IlvlFactor(ilvl int) float64 {
d := ilvl - 1
if d < 0 {
d = 0
}
return 1.0 + 0.03*float64(d)
}
// RarityMultiplier returns M(rarity) per spec section 6.4.2.
func RarityMultiplier(rarity Rarity) float64 {
switch rarity {
case RarityCommon:
return 1.00
case RarityUncommon:
return 1.12
case RarityRare:
return 1.30
case RarityEpic:
return 1.52
case RarityLegendary:
return 1.78
default:
return 1.00
}
}
// ScalePrimary computes primaryOut = round(basePrimary * L(ilvl) * M(rarity)).
func ScalePrimary(basePrimary int, ilvl int, rarity Rarity) int {
return int(math.Round(float64(basePrimary) * IlvlFactor(ilvl) * RarityMultiplier(rarity)))
}
// RollIlvl generates an item level from the monster level per spec section 6.4.5.
// Base enemies: delta in {-1, 0, +1} uniform.
// Elite enemies: delta in {0, +1, +2} with weights 0.4/0.4/0.2.
func RollIlvl(monsterLevel int, isElite bool) int {
var delta int
if isElite {
r := rand.Float64()
switch {
case r < 0.4:
delta = 0
case r < 0.8:
delta = 1
default:
delta = 2
}
} else {
delta = rand.Intn(3) - 1 // -1, 0, or +1
}
ilvl := monsterLevel + delta
if ilvl < 1 {
ilvl = 1
}
return ilvl
}