package npc import ( "mvvasilev/last_light/engine" "mvvasilev/last_light/game/item" "mvvasilev/last_light/game/rpg" "github.com/gdamore/tcell/v2" ) type RPGNPC interface { NPC rpg.RPGEntity EquippedEntity } type BasicRPGNPC struct { inventory *item.EquippedInventory *BasicNPC *rpg.BasicRPGEntity } func CreateRPGNPC(x, y int, name string, representation rune, style tcell.Style, stats map[rpg.Stat]int) *BasicRPGNPC { rpgnpc := &BasicRPGNPC{ inventory: item.CreateEquippedInventory(), BasicNPC: CreateNPC( engine.PositionAt(x, y), name, representation, style, ), BasicRPGEntity: rpg.CreateBasicRPGEntity( 0, stats, map[rpg.Stat][]rpg.StatModifier{}, ), } rpgnpc.Heal(rpg.BaseMaxHealth(rpgnpc)) return rpgnpc } func (rnpc *BasicRPGNPC) Inventory() *item.EquippedInventory { return rnpc.inventory } func (p *BasicRPGNPC) CalculateAttack(other rpg.RPGEntity) (hit bool, precisionRoll, evasionRoll int, damage int, damageType rpg.DamageType) { mainHand := p.inventory.AtSlot(item.EquippedSlotDominantHand) switch mh := mainHand.(type) { case rpg.RPGItem: return rpg.PhysicalWeaponAttack(p, mh, other) default: return rpg.UnarmedAttack(p, other) } }