diff options
Diffstat (limited to 'pkg/ui/views/game_moves.go')
-rw-r--r-- | pkg/ui/views/game_moves.go | 67 |
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{} + } +} |