From fff70cc8b31021f0062d8b7618c8c1c73bdb3916 Mon Sep 17 00:00:00 2001 From: mvvasilev Date: Sun, 22 Jun 2025 22:59:46 +0300 Subject: [PATCH] Better feedback --- internal/game/command/registry.go | 2 +- internal/game/command/tokenizer.go | 7 ++++++- internal/game/commands.go | 12 ++++++++---- internal/game/event.go | 24 ++++++++++++++++++++++-- internal/game/events.go | 2 +- internal/server/connection.go | 4 +++- 6 files changed, 41 insertions(+), 10 deletions(-) diff --git a/internal/game/command/registry.go b/internal/game/command/registry.go index a6e559b..48b66c9 100644 --- a/internal/game/command/registry.go +++ b/internal/game/command/registry.go @@ -53,7 +53,7 @@ func CreateCommandRegistry(commandDefinitions ...CommandDefinition) *CommandRegi func (comReg *CommandRegistry) Match(tokens []Token) (comDef *CommandDefinition) { for _, v := range comReg.commandDefinitions { if v.Match(tokens) { - logging.Debug("Found match", v.Name()) + logging.Debug("Found match ", v.Name()) return &v } } diff --git a/internal/game/command/tokenizer.go b/internal/game/command/tokenizer.go index 1549440..9174d83 100644 --- a/internal/game/command/tokenizer.go +++ b/internal/game/command/tokenizer.go @@ -106,7 +106,7 @@ func CreateTokenizer() *Tokenizer { {tokenType: TokenSelf, pattern: `\bself\b`}, {tokenType: TokenIdentifier, pattern: `\b[a-zA-Z'-][a-zA-Z0-9'-]*\b`}, {tokenType: TokenWhitespace, pattern: `\s+`}, - {tokenType: TokenUnknown, pattern: `.`}, + {tokenType: TokenUnknown, pattern: `[^ \t\n\r\f\v]+`}, }, } } @@ -141,6 +141,11 @@ func (t *Tokenizer) Tokenize(commandString string) (tokens []Token, err error) { pos += loc[1] matched = true + // Skip whitespace + if pattern.tokenType == TokenWhitespace { + break + } + tokens = append(tokens, CreateToken(pattern.tokenType, lexeme, pos)) break } diff --git a/internal/game/commands.go b/internal/game/commands.go index de8b67e..6865682 100644 --- a/internal/game/commands.go +++ b/internal/game/commands.go @@ -1,6 +1,10 @@ package game -import "code.haedhutner.dev/mvv/LastMUD/internal/game/command" +import ( + "strings" + + "code.haedhutner.dev/mvv/LastMUD/internal/game/command" +) type CommandType = string @@ -16,14 +20,14 @@ func (game *LastMUDGame) CreateGameCommandRegistry() *command.CommandRegistry { return len(tokens) > 1 && tokens[0].Lexeme() == "say" }, func(tokens []command.Token) []command.Parameter { - saying := "" + lexemes := []string{} for _, t := range tokens[1:] { - saying += t.Lexeme() + lexemes = append(lexemes, t.Lexeme()) } return []command.Parameter{ - command.CreateParameter(saying), + command.CreateParameter(strings.Join(lexemes, " ")), } }, ), diff --git a/internal/game/event.go b/internal/game/event.go index 911c808..a2f8f19 100644 --- a/internal/game/event.go +++ b/internal/game/event.go @@ -1,6 +1,7 @@ package game import ( + "fmt" "time" "code.haedhutner.dev/mvv/LastMUD/internal/logging" @@ -16,11 +17,30 @@ const ( PlayerSpeak ) +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" + } +} + type GameEvent interface { Type() EventType Handle(game *LastMUDGame, delta time.Duration) } +func stringifyEvent(ev GameEvent) string { + return ev.Type().String() + fmt.Sprintf(`%+v`, ev) +} + type EventBus struct { events chan GameEvent } @@ -38,7 +58,7 @@ func (eb *EventBus) HasNext() bool { func (eb *EventBus) Pop() (event GameEvent) { select { case event := <-eb.events: - logging.Info("Popped event of type ", event.Type(), ":", event) + logging.Debug("Popped event ", stringifyEvent(event)) return event default: return nil @@ -47,7 +67,7 @@ func (eb *EventBus) Pop() (event GameEvent) { func (eb *EventBus) Push(event GameEvent) { eb.events <- event - logging.Info("Enqueued event of type ", event.Type(), ":", event) + logging.Debug("Enqueued event ", stringifyEvent(event)) } func (eb *EventBus) close() { diff --git a/internal/game/events.go b/internal/game/events.go index 1aa2693..b5ab461 100644 --- a/internal/game/events.go +++ b/internal/game/events.go @@ -24,7 +24,7 @@ func (pje *PlayerJoinEvent) Type() EventType { func (pje *PlayerJoinEvent) Handle(game *LastMUDGame, delta time.Duration) { game.world.AddPlayerToDefaultRoom(CreatePlayer(pje.connectionId, nil)) - game.enqeueOutput(game.CreateOutput(pje.connectionId, []byte("Welcome to LastMUD\n"))) + game.enqeueOutput(game.CreateOutput(pje.connectionId, []byte("Welcome to LastMUD!"))) } type PlayerLeaveEvent struct { diff --git a/internal/server/connection.go b/internal/server/connection.go index 492a0c3..98db36d 100644 --- a/internal/server/connection.go +++ b/internal/server/connection.go @@ -71,7 +71,7 @@ func (c *Connection) listen() { event, err := c.server.game().CreatePlayerCommandEvent(c.Id(), message) if err != nil { - c.conn.Write([]byte(err.Error() + "\n")) + c.Write([]byte(err.Error())) } else { c.server.game().EnqueueEvent(event) } @@ -121,6 +121,8 @@ func (c *Connection) closeConnection() { } func (c *Connection) Write(output []byte) (err error) { + output = append([]byte("< "), output...) + output = append(output, []byte("\n> ")...) _, err = c.conn.Write(output) return }