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.
66 lines
2.4 KiB
Go
66 lines
2.4 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
// GameState represents the hero's current activity state.
|
|
type GameState string
|
|
|
|
const (
|
|
StateWalking GameState = "walking"
|
|
StateFighting GameState = "fighting"
|
|
StateDead GameState = "dead"
|
|
StateResting GameState = "resting" // in town, resting
|
|
StateInTown GameState = "in_town" // in town, interacting with NPCs
|
|
)
|
|
|
|
// CombatState holds the state of an active combat encounter.
|
|
type CombatState struct {
|
|
HeroID int64 `json:"heroId"`
|
|
Hero *Hero `json:"-"` // hero reference, not serialised to avoid circular refs
|
|
Enemy Enemy `json:"enemy"`
|
|
HeroNextAttack time.Time `json:"heroNextAttack"`
|
|
EnemyNextAttack time.Time `json:"enemyNextAttack"`
|
|
StartedAt time.Time `json:"startedAt"`
|
|
LastTickAt time.Time `json:"-"` // tracks previous tick for periodic effects
|
|
}
|
|
|
|
// AttackEvent is a min-heap entry for scheduling attacks by next_attack_at.
|
|
type AttackEvent struct {
|
|
NextAttackAt time.Time `json:"nextAttackAt"`
|
|
IsHero bool `json:"isHero"` // true = hero attacks, false = enemy attacks
|
|
CombatID int64 `json:"combatId"` // reference to the combat session
|
|
}
|
|
|
|
// AttackQueue implements container/heap.Interface for scheduling attacks.
|
|
type AttackQueue []*AttackEvent
|
|
|
|
func (q AttackQueue) Len() int { return len(q) }
|
|
func (q AttackQueue) Less(i, j int) bool { return q[i].NextAttackAt.Before(q[j].NextAttackAt) }
|
|
func (q AttackQueue) Swap(i, j int) { q[i], q[j] = q[j], q[i] }
|
|
|
|
func (q *AttackQueue) Push(x any) {
|
|
*q = append(*q, x.(*AttackEvent))
|
|
}
|
|
|
|
func (q *AttackQueue) Pop() any {
|
|
old := *q
|
|
n := len(old)
|
|
item := old[n-1]
|
|
old[n-1] = nil // avoid memory leak
|
|
*q = old[:n-1]
|
|
return item
|
|
}
|
|
|
|
// CombatEvent is broadcast over WebSocket to clients observing combat.
|
|
type CombatEvent struct {
|
|
Type string `json:"type"` // "attack", "death", "buff_applied", "debuff_applied", "combat_start", "combat_end"
|
|
HeroID int64 `json:"heroId"`
|
|
Damage int `json:"damage,omitempty"`
|
|
Source string `json:"source"` // "hero" or "enemy"
|
|
IsCrit bool `json:"isCrit,omitempty"`
|
|
DebuffApplied string `json:"debuffApplied,omitempty"` // debuff type applied this event, if any
|
|
HeroHP int `json:"heroHp"`
|
|
EnemyHP int `json:"enemyHp"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
}
|