Better feedback

This commit is contained in:
Miroslav Vasilev 2025-06-22 22:59:46 +03:00
parent b8d8127bc0
commit fff70cc8b3
6 changed files with 41 additions and 10 deletions

View file

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

View file

@ -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, " ")),
}
},
),

View file

@ -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() {

View file

@ -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 {

View file

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