LastMUD/internal/game/logic/event/event.go

59 lines
1.3 KiB
Go
Raw Normal View History

package event
import (
"fmt"
"time"
"code.haedhutner.dev/mvv/LastMUD/internal/ecs"
"code.haedhutner.dev/mvv/LastMUD/internal/game/data"
"code.haedhutner.dev/mvv/LastMUD/internal/logging"
)
type Handler func(world *ecs.World, event ecs.Entity) (err error)
type eventError struct {
err string
}
func createEventHandlerError(eventType data.EventType, v ...any) *eventError {
return &eventError{
err: fmt.Sprint("Error handling ", string(eventType), ": ", v),
}
}
func (e *eventError) Error() string {
return e.err
}
func eventTypeQuery(eventType data.EventType) func(comp data.EventComponent) bool {
return func(comp data.EventComponent) bool {
return comp.EventType == eventType
}
}
func CreateHandler(eventType data.EventType, handler Handler) ecs.SystemExecutor {
return func(world *ecs.World, delta time.Duration) (err error) {
events := ecs.QueryEntitiesWithComponent(world, eventTypeQuery(eventType))
var processedEvents []ecs.Entity
for event := range events {
logging.Debug("Handling event of type ", eventType)
err = handler(world, event)
if err != nil {
logging.Error(err)
}
processedEvents = append(processedEvents, event)
}
ecs.DeleteEntities(world, processedEvents...)
return
}
}
// func handlePlayerSayEvent(world *ecs.World, event ecs.Entity) (err error) {
// }