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) }