last_light/game/rpg/rpg_entity.go
2024-06-01 11:20:51 +03:00

104 lines
2.2 KiB
Go

package rpg
import "slices"
type RPGEntity interface {
BaseStat(stat Stat) int
SetBaseStat(stat Stat, value int)
CollectModifiersForStat(stat Stat) []StatModifier
AddStatModifier(modifier StatModifier)
RemoveStatModifier(id StatModifierId)
CurrentHealth() int
Heal(health int)
Damage(damage int)
CalculateAttack(other RPGEntity) (hit bool, precisionRoll, evasionRoll int, damage int, damageType DamageType)
}
type BasicRPGEntity struct {
stats map[Stat]int
statModifiers map[Stat][]StatModifier
currentHealth int
}
func CreateBasicRPGEntity(health int, baseStats map[Stat]int, statModifiers map[Stat][]StatModifier) *BasicRPGEntity {
return &BasicRPGEntity{
stats: baseStats,
statModifiers: statModifiers,
currentHealth: health,
}
}
func (brpg *BasicRPGEntity) BaseStat(stat Stat) int {
return brpg.stats[stat]
}
func (brpg *BasicRPGEntity) SetBaseStat(stat Stat, value int) {
brpg.stats[stat] = value
}
func (brpg *BasicRPGEntity) CollectModifiersForStat(stat Stat) []StatModifier {
modifiers := brpg.statModifiers[stat]
if modifiers == nil {
return []StatModifier{}
}
return modifiers
}
func (brpg *BasicRPGEntity) AddStatModifier(modifier StatModifier) {
existing := brpg.statModifiers[modifier.Stat]
if existing == nil {
existing = make([]StatModifier, 0)
}
existing = append(existing, modifier)
brpg.statModifiers[modifier.Stat] = existing
}
func (brpg *BasicRPGEntity) RemoveStatModifier(id StatModifierId) {
for k, v := range brpg.statModifiers {
for i, sm := range v {
if sm.Id == id {
brpg.statModifiers[k] = slices.Delete(v, i, i+1)
}
}
}
}
func (brpg *BasicRPGEntity) CurrentHealth() int {
return brpg.currentHealth
}
func (brpg *BasicRPGEntity) Heal(health int) {
maxHealth := BaseMaxHealth(brpg)
if brpg.currentHealth+health > maxHealth {
brpg.currentHealth = maxHealth
return
}
brpg.currentHealth += health
}
func (brpg *BasicRPGEntity) Damage(damage int) {
if brpg.currentHealth-damage < 0 {
brpg.currentHealth = 0
return
}
brpg.currentHealth -= damage
}
func (brpg *BasicRPGEntity) CalculateAttack(other RPGEntity) (hit bool, precisionRoll, evasionRoll int, damage int, damageType DamageType) {
return UnarmedAttack(brpg, other)
}