summaryrefslogtreecommitdiff
path: root/pkg/ui/views/game_moves.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/ui/views/game_moves.go')
-rw-r--r--pkg/ui/views/game_moves.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/pkg/ui/views/game_moves.go b/pkg/ui/views/game_moves.go
index 70b2dc7..fefdf85 100644
--- a/pkg/ui/views/game_moves.go
+++ b/pkg/ui/views/game_moves.go
@@ -2,7 +2,9 @@ package views
import (
"fmt"
+ "math/rand"
+ "github.com/boozec/rahanna/internal/api/database"
"github.com/boozec/rahanna/pkg/p2p"
"github.com/boozec/rahanna/pkg/ui/multiplayer"
"github.com/charmbracelet/bubbles/list"
@@ -16,6 +18,9 @@ type UpdateMovesListMsg struct{}
// ChessMoveMsg is a message containing a received chess move.
type ChessMoveMsg string
+type SendNewTurnMsg struct{}
+type SaveTurnMsg string
+
type item struct {
title string
}
@@ -40,6 +45,8 @@ func (m *GameModel) getMoves() tea.Cmd {
switch multiplayer.MoveType(string(move.Type)) {
case multiplayer.AbandonGameMessage:
return EndGameMsg{abandoned: true}
+ case multiplayer.DefineTurnMessage:
+ return SaveTurnMsg(string(move.Payload))
case multiplayer.RestoreGameMessage:
return SendRestoreMsg(move.Source)
case multiplayer.RestoreAckGameMessage:
@@ -79,6 +86,60 @@ func (m GameModel) handleUpdateMovesListMsg() GameModel {
return m
}
+func (m GameModel) handleDefineTurnMsg() (GameModel, tea.Cmd) {
+ cmds := []tea.Cmd{m.getMoves(), m.updateMovesListCmd()}
+
+ switch m.game.Type {
+ case database.SingleGameType:
+ if m.network.Me() == m.playerPeer(1) {
+ m.turn = m.playerPeer(2)
+ } else {
+ m.turn = m.playerPeer(1)
+ }
+ case database.PairGameType:
+ switch m.game.MoveChoose {
+ case database.SequentialChooseType:
+ switch m.network.Me() {
+ case m.playerPeer(1):
+ m.turn = m.playerPeer(2)
+ case m.playerPeer(2):
+ m.turn = m.playerPeer(3)
+ case m.playerPeer(3):
+ m.turn = m.playerPeer(4)
+ case m.playerPeer(4):
+ m.turn = m.playerPeer(1)
+ }
+ case database.RandomChooseType:
+ var players []int
+ switch m.network.Me() {
+ case m.playerPeer(1):
+ players = []int{2, 4}
+ case m.playerPeer(3):
+ players = []int{2, 4}
+ case m.playerPeer(2):
+ players = []int{1, 3}
+ case m.playerPeer(4):
+ players = []int{1, 3}
+ }
+ m.turn = m.playerPeer(players[rand.Intn(len(players))])
+ default:
+ panic("should not be here")
+ }
+ }
+
+ m.network.SendAll([]byte("define-turn"), []byte(string(m.turn)))
+
+ return m, tea.Batch(cmds...)
+}
+
+func (m GameModel) handleSaveTurnMsg(msg SaveTurnMsg) (GameModel, tea.Cmd) {
+ cmds := []tea.Cmd{m.getMoves(), m.updateMovesListCmd()}
+
+ m.turn = p2p.NetworkID(msg)
+
+ return m, tea.Batch(cmds...)
+}
+
func (m GameModel) handleChessMoveMsg(msg ChessMoveMsg) (GameModel, tea.Cmd) {
m.err = m.chessGame.MoveStr(string(msg))
cmds := []tea.Cmd{m.getMoves(), m.updateMovesListCmd()}
@@ -89,3 +150,9 @@ func (m GameModel) handleChessMoveMsg(msg ChessMoveMsg) (GameModel, tea.Cmd) {
return m, tea.Batch(cmds...)
}
+
+func (m GameModel) sendNewTurnCmd() tea.Cmd {
+ return func() tea.Msg {
+ return SendNewTurnMsg{}
+ }
+}