aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-08-17 15:16:01 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:57:39 +0200
commit9463ec4cb063f0bde03d0e1b2a650f5887ad29ff (patch)
tree035af855f260b7a9d4e63d0b5ad67000ad6e8ea1
parent5f97fb7a1606908e99be97d67e5871d55067dac7 (diff)
downloadmuhqs-game-9463ec4cb063f0bde03d0e1b2a650f5887ad29ff.tar.gz
muhqs-game-9463ec4cb063f0bde03d0e1b2a650f5887ad29ff.zip
use slog and add game log handler callback
-rw-r--r--go/Makefile2
-rw-r--r--go/game/ai.go4
-rw-r--r--go/game/card.go4
-rw-r--r--go/game/cardImplementations_test.go2
-rw-r--r--go/game/cardParsing.go11
-rw-r--r--go/game/cardParsing_test.go2
-rw-r--r--go/game/costs.go7
-rw-r--r--go/game/draft.go9
-rw-r--r--go/game/kraken.go7
-rw-r--r--go/game/map.go4
-rw-r--r--go/game/permanent.go4
-rw-r--r--go/game/set.go4
-rw-r--r--go/game/state.go5
-rw-r--r--go/log/log.go61
14 files changed, 94 insertions, 32 deletions
diff --git a/go/Makefile b/go/Makefile
index cac5071e..ced2e223 100644
--- a/go/Makefile
+++ b/go/Makefile
@@ -1,4 +1,4 @@
-PACKAGES := activities assets game server client dummy-ui
+PACKAGES := activities assets client dummy-ui game log server
SHELL := bash
diff --git a/go/game/ai.go b/go/game/ai.go
index f24a62a1..b1365baa 100644
--- a/go/game/ai.go
+++ b/go/game/ai.go
@@ -3,7 +3,6 @@ package game
import (
"errors"
"fmt"
- "log"
"math/rand"
"strconv"
"strings"
@@ -12,6 +11,7 @@ import (
"golang.org/x/exp/slices"
"github.com/RyanCarrier/dijkstra"
+ "muhq.space/muhqs-game/go/log"
)
type UnitAI struct {
@@ -439,7 +439,7 @@ func fullAction(ai *UnitAI) Action {
if a.Targets() != nil && a.Targets().RequireSelection() {
err := selectRandomTargets(ai.s.Rand, a.Targets())
if err != nil {
- log.Println("ai full action error:", err)
+ log.Warn("ai full action error", "error", err)
return nil
}
}
diff --git a/go/game/card.go b/go/game/card.go
index 438fb384..bae13f36 100644
--- a/go/game/card.go
+++ b/go/game/card.go
@@ -3,7 +3,6 @@ package game
import (
"errors"
"io"
- "log"
"net/http"
"path"
"strconv"
@@ -12,6 +11,7 @@ import (
"golang.org/x/exp/slices"
"gopkg.in/yaml.v3"
"muhq.space/muhqs-game/go/assets"
+ "muhq.space/muhqs-game/go/log"
)
type CardType int
@@ -198,7 +198,7 @@ var ErrUnknownCardPath = errors.New("unknown card path")
func retrieveCardDefinition(cardPath string) ([]byte, error) {
url := assets.PROTOCOL + path.Join(assets.BASE_URL, CARD_DATA_URL, cardPath+".yml")
- log.Printf("loading card from %s\n", url)
+ log.Debug("loading card from", "url", url)
resp, err := http.Get(url)
if err != nil {
return nil, err
diff --git a/go/game/cardImplementations_test.go b/go/game/cardImplementations_test.go
index 5cef65ca..6b63b049 100644
--- a/go/game/cardImplementations_test.go
+++ b/go/game/cardImplementations_test.go
@@ -1,7 +1,6 @@
package game
import (
- "log"
"strings"
"testing"
@@ -34,7 +33,6 @@ symbols:
a := p.FullActions[0]
opts := a.Target().Options()
if len(opts) != 11 {
- log.Printf("%q\n", opts)
t.Fatal("expexted 11 targets to neutralize")
}
diff --git a/go/game/cardParsing.go b/go/game/cardParsing.go
index c08a241f..99369f06 100644
--- a/go/game/cardParsing.go
+++ b/go/game/cardParsing.go
@@ -1,10 +1,11 @@
package game
import (
- "log"
"regexp"
"strconv"
"strings"
+
+ "muhq.space/muhqs-game/go/log"
)
type dynamicCardImplementation struct {
@@ -175,7 +176,7 @@ func parseUnitConstrain(constrain string) func(ctx any, u *Unit) bool {
return p.IsEnemy(e.Controller())
}
} else {
- log.Println("Only enemy unit constrains are implemented yet")
+ log.Error("Only enemy unit constrains are implemented yet")
}
return nil
@@ -238,7 +239,7 @@ func parseLocation(location string) func(any, *LocalState) []*Tile {
}
}
}
- log.Println("Only unit location constrains are implemented yet")
+ log.Error("Only unit location constrains are implemented yet")
return nil
}
@@ -249,10 +250,10 @@ func (impl *dynamicCardImplementation) parsePlayModification(effect string) {
if locationFunc := parseLocation(how); locationFunc != nil {
impl.spawnTilesFunc = func(p *LocalState, s *Player) []*Tile { return locationFunc(s, p) }
} else {
- log.Println("Play modification other than locations are not implemented ")
+ log.Error("Play modification other than locations are not implemented ")
}
} else {
- log.Println("Play modification for other cards are not implemented")
+ log.Error("Play modification for other cards are not implemented")
}
}
diff --git a/go/game/cardParsing_test.go b/go/game/cardParsing_test.go
index 2ef7429e..cbf5902e 100644
--- a/go/game/cardParsing_test.go
+++ b/go/game/cardParsing_test.go
@@ -2,7 +2,6 @@ package game
import (
"errors"
- "log"
"testing"
)
@@ -24,7 +23,6 @@ func TestCloak(t *testing.T) {
pa := NewPlayAction(p, die)
err := pa.Target().AddSelection(a)
- log.Println(pa.Target().desc, err)
if !errors.Is(err, ErrTargetHasShroud) {
t.Fatal("shrouded archer targeted")
}
diff --git a/go/game/costs.go b/go/game/costs.go
index bb6562ea..38064e8c 100644
--- a/go/game/costs.go
+++ b/go/game/costs.go
@@ -1,9 +1,10 @@
package game
import (
- "log"
"strconv"
"strings"
+
+ "muhq.space/muhqs-game/go/log"
)
type ResourceCosts struct {
@@ -43,10 +44,10 @@ func (c *ResourceCosts) Costs(s *LocalState, choosenVariadicCosts ...int) int {
if vc >= 0 {
costs = costs + c.variadicComponents*vc
} else {
- log.Println("Invalid variadic costs choosen")
+ log.Debug("Invalid variadic costs choosen")
}
} else {
- log.Println("Unambigous variadic costs choosen")
+ log.Debug("Unambigous variadic costs choosen")
}
return costs
}
diff --git a/go/game/draft.go b/go/game/draft.go
index 997e676f..878838a7 100644
--- a/go/game/draft.go
+++ b/go/game/draft.go
@@ -3,9 +3,10 @@ package game
import (
"errors"
"fmt"
- "log"
"strings"
"sync"
+
+ "muhq.space/muhqs-game/go/log"
)
// A Draft coordinating drafting among multiple players and bots.
@@ -48,7 +49,7 @@ func NewDraftFromDesc(players []*Player, desc string) (*Draft, error) {
func NewDraft(players []*Player, desc string, sets []SetIdentifier) (*Draft, error) {
d := &Draft{players: players, sets: sets}
err := d.parseDesc(desc)
- log.Printf("created new draft %v\n", d)
+ log.Debug("created new draft", "desc", d)
return d, err
}
@@ -130,7 +131,7 @@ func (d *Draft) DealRound(i, j int, packs []PileOfCards) {
go func() {
pack := packs[i*nPlayers+(k+j)%nPlayers]
pickPrompt := newDraftPickPrompt(pack)
- log.Printf("prompt %s for a pick from pack %d\n", player.Name, i*nPlayers+(k+j)%nPlayers)
+ log.Debug("prompt for pick ", "player", player.Name, "pack", i*nPlayers+(k+j)%nPlayers)
pick, err := prompt(player.Ctrl, pickPrompt)
// select a random card on error
if err != nil {
@@ -148,7 +149,7 @@ func (d *Draft) DealRound(i, j int, packs []PileOfCards) {
func (d *Draft) Run() {
packs := d.PreparePacks()
nPlayers := len(d.players)
- log.Printf("%d %d %d\n", d.packsPerPlayer, d.cardsPerPack, len(d.players))
+ log.Debug("run draft", "packs", d.packsPerPlayer, "cards", d.cardsPerPack, "players", len(d.players))
for i := range d.packsPerPlayer {
for j := range d.cardsPerPack * nPlayers {
d.DealRound(i, j, packs)
diff --git a/go/game/kraken.go b/go/game/kraken.go
index 5f8f2612..8e4ee6f7 100644
--- a/go/game/kraken.go
+++ b/go/game/kraken.go
@@ -1,9 +1,10 @@
package game
import (
- "log"
"strings"
"sync"
+
+ "muhq.space/muhqs-game/go/log"
)
const (
@@ -120,7 +121,7 @@ func (ctrl *KrakenControl) krakenTurn() {
costs := c.BuyCosts.Costs(s)
if costs > kraken.Resource {
- log.Println("Kraken discards", c.Name, "because resource to low", kraken.Resource)
+ log.Info("Kraken discards because insufficient resource", "card", c.Name, "resource", kraken.Resource)
kraken.DiscardPile.AddCard(c)
break
}
@@ -134,7 +135,7 @@ func (ctrl *KrakenControl) krakenTurn() {
a := NewPlayAction(kraken, c, costFunc)
err := selectRandomTargets(s.Rand, a.Targets())
if err != nil {
- log.Println("No target available for", c.Name)
+ log.Info("Diacard because no target for", "card", c.Name)
kraken.DiscardPile.AddCard(c)
continue
}
diff --git a/go/game/map.go b/go/game/map.go
index 48ec8be3..f2cf1c53 100644
--- a/go/game/map.go
+++ b/go/game/map.go
@@ -3,7 +3,6 @@ package game
import (
"fmt"
"io"
- "log"
"math/rand"
"net/http"
"os"
@@ -15,6 +14,7 @@ import (
"gopkg.in/yaml.v3"
"muhq.space/muhqs-game/go/assets"
+ "muhq.space/muhqs-game/go/log"
)
const (
@@ -195,7 +195,7 @@ func (m *Map) FindFortificationConnections(x int, y int) (connections int, left,
// GetMap creates a new map from the definition retrieved for the map's name.
func GetMap(name string) (*Map, error) {
url := path.Join(assets.BASE_URL, MAP_URL_PART, name+".yml")
- log.Printf("loading map from %s\n", url)
+ log.Info("loading map", "url", url)
resp, err := http.Get(assets.PROTOCOL + url)
if err != nil {
log.Fatal(err)
diff --git a/go/game/permanent.go b/go/game/permanent.go
index 5c105724..5e42973a 100644
--- a/go/game/permanent.go
+++ b/go/game/permanent.go
@@ -2,11 +2,11 @@ package game
import (
"fmt"
- "log"
"strings"
"golang.org/x/exp/slices"
+ "muhq.space/muhqs-game/go/log"
"muhq.space/muhqs-game/go/utils"
)
@@ -187,7 +187,7 @@ func (p *permanentBase) XEffect(effect string) (int, error) {
}
for _, e := range p.tmpEffects {
- log.Println(effect, e)
+ log.Debug("tmp xEffect", "effect", effect, "tmpEffect", e)
if !strings.Contains(e, effect) {
continue
}
diff --git a/go/game/set.go b/go/game/set.go
index e4a08f3b..a85bf577 100644
--- a/go/game/set.go
+++ b/go/game/set.go
@@ -2,13 +2,13 @@ package game
import (
"errors"
- "log"
"net/http"
"path"
"strings"
"golang.org/x/net/html"
"muhq.space/muhqs-game/go/assets"
+ "muhq.space/muhqs-game/go/log"
)
type SetIdentifier int
@@ -88,7 +88,7 @@ var SetNames = map[string]SetIdentifier{
func (set SetIdentifier) CardPaths() []string {
url := assets.PROTOCOL + path.Join(assets.BASE_URL, CARD_DATA_URL, set.String())
- log.Printf("loading set from %s\n", url)
+ log.Debug("loading set", "url", url)
resp, err := http.Get(url)
if err != nil {
log.Fatal(err)
diff --git a/go/game/state.go b/go/game/state.go
index ad3ea815..0d8066c0 100644
--- a/go/game/state.go
+++ b/go/game/state.go
@@ -3,13 +3,14 @@ package game
import (
"errors"
"fmt"
- "log"
"math/rand"
"strconv"
"strings"
"time"
"golang.org/x/exp/slices"
+
+ "muhq.space/muhqs-game/go/log"
)
type State interface {
@@ -539,7 +540,7 @@ func (s *LocalState) allPassing(skipFirst bool) (bool, []*Player) {
switch a := _a.(type) {
case *PassPriority:
- log.Printf("%s passed %d/%d\n", p.Name, i+1, nPlayers)
+ log.Info("priority passed\n", "player", p.Name, "passed", fmt.Sprintf("%d/%d", i+1, nPlayers))
case nil:
log.Fatal("received nil action from ", p.Name, " at ", s.activePhase)
default:
diff --git a/go/log/log.go b/go/log/log.go
new file mode 100644
index 00000000..ff090425
--- /dev/null
+++ b/go/log/log.go
@@ -0,0 +1,61 @@
+package log
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "log/slog"
+ "os"
+)
+
+const GameLogLevel = 99
+
+var handleGameRecord func(any)
+
+func init() {
+ // TODO: allow to specify the value and the file
+ l := slog.New(slog.NewTextHandler(
+ os.Stdout,
+ &slog.HandlerOptions{AddSource: true}))
+ slog.SetDefault(l)
+}
+
+func Game(obj any) {
+ if handleGameRecord != nil {
+ handleGameRecord(obj)
+ }
+ msg := fmt.Sprintf("%s", obj)
+ slog.Log(context.Background(), GameLogLevel, msg)
+}
+
+func Debug(msg string, args ...any) {
+ slog.Debug(msg, args...)
+}
+
+func Info(msg string, args ...any) {
+ slog.Info(msg, args...)
+}
+
+func Warn(msg string, args ...any) {
+ slog.Warn(msg, args...)
+}
+
+func Error(msg string, args ...any) {
+ slog.Error(msg, args...)
+}
+
+func Fatal(args ...any) {
+ log.Fatal(args...)
+}
+
+func Fatalf(msg string, args ...any) {
+ log.Fatalf(msg, args...)
+}
+
+func Panic(args ...any) {
+ log.Panic(args...)
+}
+
+func Panicf(msg string, args ...any) {
+ log.Panicf(msg, args...)
+}