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