aboutsummaryrefslogtreecommitdiff
path: root/go/game
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-01-31 22:19:28 +0100
committerFlorian Fischer <florian.fischer@muhq.space>2025-01-27 16:43:45 +0100
commit3fd15c9b83fff074b588ff9688f9e49aab38cd32 (patch)
treefaf0710b755118dcd5ce7ae99fade3300e369292 /go/game
parent01b8c63effcdf862f6de2ec86ab47b5adf2a49bf (diff)
downloadmuhqs-game-3fd15c9b83fff074b588ff9688f9e49aab38cd32.tar.gz
muhqs-game-3fd15c9b83fff074b588ff9688f9e49aab38cd32.zip
intermediate commit
Diffstat (limited to 'go/game')
-rw-r--r--go/game/action.go2
-rw-r--r--go/game/cardParsing.go38
-rw-r--r--go/game/kraken.go19
-rw-r--r--go/game/player.go11
-rw-r--r--go/game/state.go6
5 files changed, 60 insertions, 16 deletions
diff --git a/go/game/action.go b/go/game/action.go
index a2ca038e..0f7a1294 100644
--- a/go/game/action.go
+++ b/go/game/action.go
@@ -2,7 +2,6 @@ package game
import (
"fmt"
- "log"
)
type ActionPrototype interface {
@@ -217,7 +216,6 @@ type BuyAction struct {
}
func (a *BuyAction) Resolve(s *State) {
- log.Println("Move", a.card.Name, "into", a.player.Name, "discard pile")
a.player.Store.MoveCard(a.card, a.player.DiscardPile)
}
diff --git a/go/game/cardParsing.go b/go/game/cardParsing.go
index af8e1560..3a316c4f 100644
--- a/go/game/cardParsing.go
+++ b/go/game/cardParsing.go
@@ -2,6 +2,7 @@ package game
import (
"log"
+ "regexp"
"strconv"
"strings"
)
@@ -39,6 +40,11 @@ func newParsedCardImplementation(c *Card) *parsedCardImplementation {
for _, effect := range c.getEffects() {
impl.parseEffect(effect)
}
+
+ for _, fullAction := range c.getCanonicalValues("full_action") {
+ impl.parseFullAction(fullAction)
+ }
+
return impl
}
@@ -48,6 +54,38 @@ func (impl *parsedCardImplementation) parseEffect(effect string) {
}
}
+func (impl *parsedCardImplementation) parseFullAction(fullAction string) {
+ var resolveProtos []func(*State, *Unit) func(*State)
+ gainRessourceRegex := regexp.MustCompile(`gain [1-9][0-9]* resource`)
+
+ if find := gainRessourceRegex.Find([]byte(fullAction)); find != nil {
+ tokens := strings.SplitN(string(find), " ", 3)
+ gain, err := strconv.Atoi(tokens[1])
+ if err != nil {
+ log.Fatalf("Failed to parse resource gain full action: %s", err)
+ }
+
+ resolveProto := func(_ *State, u *Unit) func(*State) {
+ return func(*State) {
+ u.controller.gainResource(gain)
+ }
+ }
+ resolveProtos = append(resolveProtos, resolveProto)
+ }
+
+ if resolveProtos != nil {
+ impl.genFullActionPrototypes = func(u *Unit) []*FullActionPrototype {
+ fullActionPrototypes := make([]*FullActionPrototype, 0, len(resolveProtos))
+
+ for _, proto := range resolveProtos {
+ fullActionPrototypes = append(fullActionPrototypes, NewFullActionPrototype(u, proto))
+ }
+
+ return fullActionPrototypes
+ }
+ }
+}
+
func parseUnitConstrain(constrain string) func(ctx interface{}, u *Unit) bool {
enemy := strings.Contains(constrain, "enemy")
if enemy {
diff --git a/go/game/kraken.go b/go/game/kraken.go
index 177423ff..6ea22876 100644
--- a/go/game/kraken.go
+++ b/go/game/kraken.go
@@ -1,7 +1,6 @@
package game
import (
- "image/color"
"log"
"strings"
"sync"
@@ -27,10 +26,10 @@ const (
// 2 kraken/tides_change!
// 2 kraken/unholy_cannonball`
-var KrakenDecklist = `2 kraken/frost_pylon`
+var KrakenDecklist = `2 kraken/clownfish`
-func NewKraken(id int, s *State, c color.Color) *Player {
- kraken := NewPlayer(id, KRAKEN_NAME, NewDeck(), s, c)
+func NewKraken(id int, s *State) *Player {
+ kraken := NewPlayer(id, KRAKEN_NAME, NewDeck(), s)
d := NewDeckFromDeckList(KrakenDecklist)
d.Shuffle(s.Rand)
kraken.Deck = d
@@ -49,14 +48,20 @@ func NewKraken(id int, s *State, c color.Color) *Player {
return kraken
}
+func (s *State) AddKraken() {
+ kraken := NewKraken(len(s.Players)+1, s)
+ s.Players = append(s.Players, kraken)
+}
+
type KrakenControl struct {
kraken *Player
actions chan Action
syncGameState *sync.WaitGroup
+ turn int
}
func addKrakenControl(kraken *Player) {
- ctrl := &KrakenControl{kraken, make(chan Action), new(sync.WaitGroup)}
+ ctrl := &KrakenControl{kraken, make(chan Action), new(sync.WaitGroup), 0}
kraken.Ctrl = ctrl
ctrl.syncGameState.Add(1)
@@ -78,6 +83,10 @@ func (ctrl *KrakenControl) krakenTurn() {
kraken := ctrl.kraken
ctrl.awaitGameStateSync()
+ ctrl.turn++
+ if ctrl.turn != kraken.Turn {
+ log.Fatalf("Ai turn out of sync %d != %d", ctrl.turn, kraken.Turn)
+ }
for {
drawn := kraken.Deck.Draw(1)
diff --git a/go/game/player.go b/go/game/player.go
index b6521d50..0eb474e9 100644
--- a/go/game/player.go
+++ b/go/game/player.go
@@ -24,9 +24,7 @@ type Player struct {
Ctrl PlayerControl
}
-func NewPlayer(id int, name string, deck *Deck,
- gameState *State, color color.Color,
-) *Player {
+func NewPlayer(id int, name string, deck *Deck, gameState *State) *Player {
store := NewStore()
deck.MoveInto(store)
@@ -41,7 +39,6 @@ func NewPlayer(id int, name string, deck *Deck,
Deck: NewDeckFromDeckList(gameState.Map.StartDeckList),
Store: store,
gameState: gameState,
- Color: color,
Ctrl: nil,
}
return &p
@@ -55,8 +52,12 @@ func (p *Player) resourceGain() int {
}
}
+func (p *Player) gainResource(gain int) {
+ p.Resource += gain
+}
+
func (p *Player) Upkeep() {
- p.Resource += p.resourceGain()
+ p.gainResource(p.resourceGain())
// TODO: handle upkeep triggers
diff --git a/go/game/state.go b/go/game/state.go
index d0a516c9..816fc0d0 100644
--- a/go/game/state.go
+++ b/go/game/state.go
@@ -2,7 +2,6 @@ package game
import (
"fmt"
- "image/color"
"log"
"math/rand"
"strconv"
@@ -37,8 +36,8 @@ func NewState() *State {
return s
}
-func (s *State) AddNewPlayer(name string, deck *Deck, color color.Color) {
- p := NewPlayer(len(s.Players)+1, name, deck, s, color)
+func (s *State) AddNewPlayer(name string, deck *Deck) {
+ p := NewPlayer(len(s.Players)+1, name, deck, s)
s.Players = append(s.Players, p)
}
@@ -409,7 +408,6 @@ func (s *State) WaterSpawnTiles(p *Player) []*Tile {
return t.Raw == "docks" || strings.HasSuffix(t.Raw, strconv.Itoa(p.Id))
})
- log.Println(docks)
spawns := []*Tile{}
for _, dock := range docks {
for _, candidate := range TilesInRangeFromOrigin(s.Map, dock.Position, 1) {