LastMUD/internal/game/event.go

76 lines
1.2 KiB
Go
Raw Normal View History

2025-06-22 17:54:07 +03:00
package game
2025-06-22 22:27:56 +03:00
import (
2025-06-22 22:59:46 +03:00
"fmt"
2025-06-22 22:27:56 +03:00
"time"
"code.haedhutner.dev/mvv/LastMUD/internal/logging"
)
2025-06-22 17:54:07 +03:00
type EventType int
const (
PlayerJoin EventType = iota
PlayerCommand
PlayerLeave
2025-06-22 22:27:56 +03:00
PlayerSpeak
2025-06-22 17:54:07 +03:00
)
2025-06-22 22:59:46 +03:00
func (et EventType) String() string {
switch et {
case PlayerCommand:
return "PlayerCommand"
case PlayerJoin:
return "PlayerJoin"
case PlayerLeave:
return "PlayerLeave"
case PlayerSpeak:
return "PlayerSpeak"
default:
return "Unknown"
}
}
2025-06-22 17:54:07 +03:00
type GameEvent interface {
Type() EventType
Handle(game *LastMUDGame, delta time.Duration)
}
2025-06-22 22:59:46 +03:00
func stringifyEvent(ev GameEvent) string {
return ev.Type().String() + fmt.Sprintf(`%+v`, ev)
}
2025-06-22 17:54:07 +03:00
type EventBus struct {
events chan GameEvent
}
2025-06-24 16:37:26 +03:00
func CreateEventBus(capacity int) *EventBus {
2025-06-22 17:54:07 +03:00
return &EventBus{
2025-06-24 16:37:26 +03:00
events: make(chan GameEvent, capacity),
2025-06-22 17:54:07 +03:00
}
}
func (eb *EventBus) HasNext() bool {
return len(eb.events) > 0
}
func (eb *EventBus) Pop() (event GameEvent) {
select {
case event := <-eb.events:
2025-06-22 22:59:46 +03:00
logging.Debug("Popped event ", stringifyEvent(event))
2025-06-22 17:54:07 +03:00
return event
default:
return nil
}
}
func (eb *EventBus) Push(event GameEvent) {
eb.events <- event
2025-06-22 22:59:46 +03:00
logging.Debug("Enqueued event ", stringifyEvent(event))
2025-06-22 17:54:07 +03:00
}
func (eb *EventBus) close() {
close(eb.events)
}