diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2023-01-31 22:19:28 +0100 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-01-27 16:43:45 +0100 |
| commit | 3fd15c9b83fff074b588ff9688f9e49aab38cd32 (patch) | |
| tree | faf0710b755118dcd5ce7ae99fade3300e369292 /go/game | |
| parent | 01b8c63effcdf862f6de2ec86ab47b5adf2a49bf (diff) | |
| download | muhqs-game-3fd15c9b83fff074b588ff9688f9e49aab38cd32.tar.gz muhqs-game-3fd15c9b83fff074b588ff9688f9e49aab38cd32.zip | |
intermediate commit
Diffstat (limited to 'go/game')
| -rw-r--r-- | go/game/action.go | 2 | ||||
| -rw-r--r-- | go/game/cardParsing.go | 38 | ||||
| -rw-r--r-- | go/game/kraken.go | 19 | ||||
| -rw-r--r-- | go/game/player.go | 11 | ||||
| -rw-r--r-- | go/game/state.go | 6 |
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) { |
