func PlayCard(ch chan bool, playerId int, u *uistate.UIState) string { c := u.DropTargets[0].GetCardHere() if c == nil { return "No card has been played" } // checks to make sure that: // -player has not already played a card this round // -all players have passed cards // -the play is in the right order // -the play is valid given game logic if u.CurTable.GetPlayers()[playerId].GetDonePlaying() { return "You have already played a card in this trick" } if !u.CurTable.AllDonePassing() { return "Not all players have passed their cards" } if !u.CurTable.ValidPlayOrder(playerId) { return "It is not your turn" } if err := u.CurTable.ValidPlayLogic(c, playerId); err != "" { return err } sound.PlaySound(1, u) success := LogPlay(u, c) for !success { success = LogPlay(u, c) } // no animation when in split view if u.CurView == uistate.Play { reposition.AnimateHandCardPlay(ch, c, u) } return "" }
func takeCards(ch chan bool, playerId int, u *uistate.UIState) bool { player := u.CurTable.GetPlayers()[playerId] passedCards := player.GetPassedTo() if len(passedCards) != 3 { return false } sound.PlaySound(0, u) success := sync.LogTake(u) for !success { success = sync.LogTake(u) } imgs := append(u.Other, u.Buttons["take"]) reposition.AnimateHandCardTake(ch, imgs, u) return true }
// returns true if pass was successful func passCards(ch chan bool, playerId int, u *uistate.UIState) bool { cardsPassed := make([]*card.Card, 0) for _, d := range u.DropTargets { passCard := d.GetCardHere() if passCard != nil { cardsPassed = append(cardsPassed, passCard) } } // if the pass is not valid, don't pass any cards if !u.CurTable.ValidPass(cardsPassed) || u.CurTable.GetPlayers()[playerId].GetDonePassing() { return false } sound.PlaySound(1, u) success := sync.LogPass(u, cardsPassed) for !success { success = sync.LogPass(u, cardsPassed) } imgs := append(u.Other, u.DropTargets...) imgs = append(imgs, u.Buttons["pass"]) reposition.AnimateHandCardPass(ch, imgs, u) return true }
func onTakeTrick(value string, u *uistate.UIState) { trickCards := u.CurTable.GetTrick() recipient := u.CurTable.GetTrickRecipient() roundOver := u.CurTable.SendTrick(recipient) if roundOver { u.RoundScores, u.Winners = u.CurTable.EndRound() } // UI if u.CurView == uistate.Table { sound.PlaySound(1, u) var emptyTex sprite.SubTex u.Eng.SetSubTex(u.Buttons["takeTrick"].GetNode(), emptyTex) u.Buttons["takeTrick"].SetHidden(true) var trickDir direction.Direction switch recipient { case 0: trickDir = direction.Down case 1: trickDir = direction.Left case 2: trickDir = direction.Across case 3: trickDir = direction.Right } quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) reposition.AnimateTableCardTakeTrick(trickCards, trickDir, quit, u) reposition.SetTableDropColors(u) view.SetNumTricksTable(u) } else if u.CurView == uistate.Split { var emptyTex sprite.SubTex u.Eng.SetSubTex(u.Buttons["takeTrick"].GetNode(), emptyTex) u.Buttons["takeTrick"].SetHidden(true) if roundOver { view.LoadScoreView(u) } else { var trickDir direction.Direction switch recipient { case u.CurPlayerIndex: sound.PlaySound(0, u) trickDir = direction.Down case (u.CurPlayerIndex + 1) % u.NumPlayers: trickDir = direction.Left case (u.CurPlayerIndex + 2) % u.NumPlayers: trickDir = direction.Across case (u.CurPlayerIndex + 3) % u.NumPlayers: trickDir = direction.Right } quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) reposition.AnimateTableCardTakeTrick(trickCards, trickDir, quit, u) view.LoadSplitView(true, u) } } else if u.CurView == uistate.Play { if roundOver { view.LoadScoreView(u) } else { if recipient == u.CurPlayerIndex { sound.PlaySound(0, u) } view.LoadPlayView(true, u) } } // logic if len(u.Winners) > 0 { u.CurTable.NewGame() } }
func onPlay(value string, u *uistate.UIState) { // logic playerInt, curCards := parsePlayerAndCards(value, u) playedCard := curCards[0] u.CurTable.GetPlayers()[playerInt].RemoveFromHand(playedCard) u.CurTable.SetPlayedCard(playedCard, playerInt) u.CurTable.GetPlayers()[playerInt].SetDonePlaying(true) trickOver := u.CurTable.TrickOver() var recipient int if trickOver { recipient = u.CurTable.GetTrickRecipient() } // UI if u.CurView == uistate.Table { sound.PlaySound(0, u) quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) reposition.AnimateTableCardPlay(playedCard, playerInt, quit, u) reposition.SetTableDropColors(u) if trickOver { // display take trick button b := u.Buttons["takeTrick"] u.Eng.SetSubTex(b.GetNode(), b.GetImage()) b.SetHidden(false) } } else if u.CurView == uistate.Split { if playerInt != u.CurPlayerIndex { quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) reposition.AnimateSplitCardPlay(playedCard, playerInt, quit, u) } reposition.SetSplitDropColors(u) view.LoadSplitView(true, u) if trickOver { if recipient == u.CurPlayerIndex { // display take trick button b := u.Buttons["takeTrick"] u.Eng.SetSubTex(b.GetNode(), b.GetImage()) b.SetHidden(false) } } else if u.CardToPlay != nil && u.CurTable.WhoseTurn() == u.CurPlayerIndex { ch := make(chan bool) if err := PlayCard(ch, u.CurPlayerIndex, u); err != "" { view.ChangePlayMessage(err, u) RemoveCardFromTarget(u.CardToPlay, u) // add card back to hand reposition.ResetCardPosition(u.CardToPlay, u.Eng) } u.CardToPlay = nil u.BackgroundImgs[0].GetNode().Arranger = nil var emptyTex sprite.SubTex u.Eng.SetSubTex(u.BackgroundImgs[0].GetNode(), emptyTex) u.BackgroundImgs[0].SetHidden(true) } } else if u.CurView == uistate.Play && u.CurPlayerIndex != playerInt { view.LoadPlayView(true, u) if u.CardToPlay != nil && u.CurTable.WhoseTurn() == u.CurPlayerIndex { ch := make(chan bool) if err := PlayCard(ch, u.CurPlayerIndex, u); err != "" { view.ChangePlayMessage(err, u) RemoveCardFromTarget(u.CardToPlay, u) // add card back to hand reposition.ResetCardPosition(u.CardToPlay, u.Eng) reposition.RealignSuit(u.CardToPlay.GetSuit(), u.CardToPlay.GetInitial().Y, u) } u.CardToPlay = nil quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) go func() { onDone := func() { if u.CurView == uistate.Play { view.LoadPlayView(true, u) } } reposition.SwitchOnChan(ch, quit, onDone, u) }() } } }