func beginClickSplit(t touch.Event, u *uistate.UIState) { u.CurCard = findClickedCard(t, u) if u.CurCard != nil { reposition.BringNodeToFront(u.CurCard.GetNode(), u) } buttonList := findClickedButton(t, u) for _, b := range buttonList { if b == u.Buttons["toggleSplit"] && !u.SwitchingViews { ch := make(chan bool) u.SwitchingViews = true reposition.AnimateOutSplit(ch, u) quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) go func() { onDone := func() { u.SwitchingViews = false if u.CurView == uistate.Split { view.LoadPlayView(false, u) } } reposition.SwitchOnChan(ch, quit, onDone, u) }() } else if b == u.Buttons["takeTrick"] { pressButton(b, u) } else { handleDebugButtonClick(b, u) } } }
func onTake(value string, u *uistate.UIState) { // logic playerInt, _ := parsePlayerAndCards(value, u) p := u.CurTable.GetPlayers()[playerInt] passed := p.GetPassedTo() for _, c := range passed { p.AddToHand(c) } u.CurTable.GetPlayers()[playerInt].SetDoneTaking(true) if u.SequentialPhases { if u.CurTable.AllDoneTaking() { for _, player := range u.CurTable.GetPlayers() { if player.HasTwoOfClubs() { u.CurTable.SetFirstPlayer(player.GetPlayerIndex()) } } // UI if u.CurView == uistate.Play { view.LoadPlayView(true, u) } } } else if p.HasTwoOfClubs() { u.CurTable.SetFirstPlayer(p.GetPlayerIndex()) // UI if u.CurView == uistate.Play && u.CurPlayerIndex != playerInt { view.LoadPlayView(true, u) } } // UI if u.CurView == uistate.Table { quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) reposition.AnimateTableCardTake(passed, u.CurTable.GetPlayers()[playerInt], quit, u) view.LoadTableView(u) } }
func onPass(value string, u *uistate.UIState) { // logic playerInt, curCards := parsePlayerAndCards(value, u) var receivingPlayer int switch u.CurTable.GetDir() { case direction.Right: receivingPlayer = (playerInt + 3) % u.NumPlayers case direction.Left: receivingPlayer = (playerInt + 1) % u.NumPlayers case direction.Across: receivingPlayer = (playerInt + 2) % u.NumPlayers } for _, c := range curCards { u.CurTable.GetPlayers()[playerInt].RemoveFromHand(c) } u.CurTable.GetPlayers()[playerInt].SetPassedFrom(curCards) u.CurTable.GetPlayers()[receivingPlayer].SetPassedTo(curCards) u.CurTable.GetPlayers()[playerInt].SetDonePassing(true) // UI if u.CurView == uistate.Table { quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) reposition.AnimateTableCardPass(curCards, receivingPlayer, quit, u) view.LoadTableView(u) } else if u.CurView == uistate.Take { if u.SequentialPhases { if u.CurTable.AllDonePassing() { view.LoadTakeView(u) } } else if u.CurPlayerIndex == receivingPlayer { view.LoadTakeView(u) } } else if u.CurView == uistate.Play && u.CurTable.AllDonePassing() { view.LoadPlayView(true, u) } }
func endClickTake(t touch.Event, u *uistate.UIState) { pressed := unpressButtons(u) for _, b := range pressed { if b == u.Buttons["take"] { cards := make([]*card.Card, 0) for _, d := range u.DropTargets { c := d.GetCardHere() if c != nil { cards = append(cards, c) } } for _, c := range cards { sync.RemoveCardFromTarget(c, u) // add card back to hand reposition.ResetCardPosition(c, u.Eng) reposition.RealignSuit(c.GetSuit(), c.GetInitial().Y, u) } ch := make(chan bool) success := takeCards(ch, u.CurPlayerIndex, u) quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) go func() { onDone := func() { if !success { fmt.Println("Invalid take") } else { if u.CurView == uistate.Take { view.LoadPlayView(false, u) } } } reposition.SwitchOnChan(ch, quit, onDone, u) }() } } }
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) }() } } }
func endClickPlay(t touch.Event, u *uistate.UIState) { if u.CurCard != nil { if u.CurTable.GetTrick()[u.CurPlayerIndex] == nil { if dropCardOnTarget(u.CurCard, t, u) { if u.CurTable.WhoseTurn() == u.CurPlayerIndex { ch := make(chan bool) if err := sync.PlayCard(ch, u.CurPlayerIndex, u); err != "" { view.ChangePlayMessage(err, u) sync.RemoveCardFromTarget(u.CurCard, u) u.CardToPlay = nil // add card back to hand reposition.ResetCardPosition(u.CurCard, u.Eng) reposition.RealignSuit(u.CurCard.GetSuit(), u.CurCard.GetInitial().Y, u) } 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) }() } else { u.CardToPlay = u.CurCard } } else { // add card back to hand if sync.RemoveCardFromTarget(u.CurCard, u) { u.CardToPlay = nil } reposition.ResetCardPosition(u.CurCard, u.Eng) reposition.RealignSuit(u.CurCard.GetSuit(), u.CurCard.GetInitial().Y, u) } } else { // add card back to hand reposition.ResetCardPosition(u.CurCard, u.Eng) reposition.RealignSuit(u.CurCard.GetSuit(), u.CurCard.GetInitial().Y, u) } } pressed := unpressButtons(u) for _, b := range pressed { if b == u.Buttons["takeTrick"] { var emptyTex sprite.SubTex u.Eng.SetSubTex(b.GetNode(), emptyTex) b.SetHidden(true) u.Buttons["takeTrick"] = nil for _, takenCard := range u.TableCards { sync.RemoveCardFromTarget(takenCard, u) reposition.BringNodeToFront(takenCard.GetNode(), u) } ch := make(chan bool) reposition.AnimateHandCardTakeTrick(ch, u.TableCards, u) quit := make(chan bool) u.AnimChans = append(u.AnimChans, quit) go func() { onDone := func() { sync.LogTakeTrick(u) } reposition.SwitchOnChan(ch, quit, onDone, u) }() } } }