package combat import "sync" type State struct { PlayerName string MobID string Active bool LockedTicks int } var ( mu sync.Mutex combatants = make(map[string]*State) // player name -> state mobTargets = make(map[string]string) // mob ID -> player name ) func EnterCombat(playerName, mobID string) { mu.Lock() defer mu.Unlock() combatants[playerName] = &State{ PlayerName: playerName, MobID: mobID, Active: true, LockedTicks: 15, } mobTargets[mobID] = playerName } func LeaveCombat(playerName string) { mu.Lock() defer mu.Unlock() state, ok := combatants[playerName] if !ok { return } delete(mobTargets, state.MobID) delete(combatants, playerName) } func GetCombat(playerName string) *State { mu.Lock() defer mu.Unlock() return combatants[playerName] } func IsMobInCombat(mobID string) bool { mu.Lock() defer mu.Unlock() _, ok := mobTargets[mobID] return ok } func GetMobTarget(mobID string) string { mu.Lock() defer mu.Unlock() return mobTargets[mobID] } func TickCombat() { mu.Lock() defer mu.Unlock() for _, state := range combatants { if state.LockedTicks > 0 { state.LockedTicks-- } } }