Merge "croupier: Remove Card Jitter"
diff --git a/go/src/hearts/assets/StartBlue.png b/go/src/hearts/assets/StartBlue.png
new file mode 100644
index 0000000..036938f
--- /dev/null
+++ b/go/src/hearts/assets/StartBlue.png
Binary files differ
diff --git a/go/src/hearts/assets/StartGray.png b/go/src/hearts/assets/StartGray.png
new file mode 100644
index 0000000..555592c
--- /dev/null
+++ b/go/src/hearts/assets/StartGray.png
Binary files differ
diff --git a/go/src/hearts/img/reposition/reposition.go b/go/src/hearts/img/reposition/reposition.go
index 8bc1aef..a86da1f 100644
--- a/go/src/hearts/img/reposition/reposition.go
+++ b/go/src/hearts/img/reposition/reposition.go
@@ -168,6 +168,7 @@
 
 // Animation for the 'play' action, when app is in the table view
 func AnimateTableCardPlay(animCard *card.Card, playerInt int, quit chan bool, u *uistate.UIState) {
+	BringNodeToFront(animCard.GetNode(), u)
 	destination := u.DropTargets[playerInt]
 	destinationPos := destination.GetCurrent()
 	destinationDim := destination.GetDimensions()
diff --git a/go/src/hearts/img/texture/texture.go b/go/src/hearts/img/texture/texture.go
index 5a4c71c..12d65cd 100644
--- a/go/src/hearts/img/texture/texture.go
+++ b/go/src/hearts/img/texture/texture.go
@@ -272,7 +272,7 @@
 		"U-Lower-Gray.png", "V-Lower-Gray.png", "W-Lower-Gray.png", "X-Lower-Gray.png", "Y-Lower-Gray.png", "Z-Lower-Gray.png",
 		"Space-Gray.png", "RoundedRectangle-DBlue.png", "RoundedRectangle-LBlue.png", "RoundedRectangle-Gray.png", "Rectangle-LBlue.png",
 		"Rectangle-DBlue.png", "HorizontalPullTab.png", "VerticalPullTab.png", "NewGame.png", "NewRound.png", "JoinGame.png", "Period.png",
-		"SitSpot.png", "WatchSpot.png",
+		"SitSpot.png", "WatchSpot.png", "StartBlue.png", "StartGray.png",
 	}
 	for _, f := range boundedImgs {
 		a, err := asset.Open(f)
diff --git a/go/src/hearts/img/uistate/uistate.go b/go/src/hearts/img/uistate/uistate.go
index b6d90c0..10497df 100644
--- a/go/src/hearts/img/uistate/uistate.go
+++ b/go/src/hearts/img/uistate/uistate.go
@@ -72,65 +72,67 @@
 	NumPlayers  int
 	NumSuits    int
 	// the following variables are used for sizing and positioning specifications
-	CardSize       float32
-	CardScaler     float32
-	TopPadding     float32
-	BottomPadding  float32
-	WindowSize     *coords.Vec // windowSize is in Pt
-	CardDim        *coords.Vec
-	TableCardDim   *coords.Vec
-	PlayerIconDim  *coords.Vec
-	PixelsPerPt    float32
-	Overlap        *coords.Vec
-	Padding        float32
-	CurView        View                     // the screen currently being shown to the user
-	CurTable       *table.Table             // the table of the current game
-	Done           bool                     // true if the app has been quit
-	Texs           map[string]sprite.SubTex // map of all loaded images
-	CurPlayerIndex int                      // the player number of this player
-	Ctx            *context.T
-	Service        syncbase.Service
-	Debug          bool                           // true if debugging, adds extra functionality to switch between players
-	Shutdown       func()                         // used to shut down a v23.Init()
-	GameID         int                            // used to differentiate between concurrent games
-	IsOwner        bool                           // true if this player is the game creator
-	UserData       map[int]map[string]interface{} // user data indexed by user ID
-	PlayerData     map[int]int                    // key = player number, value = user id
-	AnimChans      []chan bool                    // keeps track of all 'quit' channels in animations so their goroutines can be stopped
-	SGChan         chan bool                      // pass in a bool to stop advertising the syncgroup
-	ScanChan       chan bool                      // pass in a bool to stop scanning for syncgroups
+	CardSize         float32
+	CardScaler       float32
+	TopPadding       float32
+	BottomPadding    float32
+	WindowSize       *coords.Vec // windowSize is in Pt
+	CardDim          *coords.Vec
+	TableCardDim     *coords.Vec
+	PlayerIconDim    *coords.Vec
+	PixelsPerPt      float32
+	Overlap          *coords.Vec
+	Padding          float32
+	CurView          View                     // the screen currently being shown to the user
+	CurTable         *table.Table             // the table of the current game
+	Done             bool                     // true if the app has been quit
+	Texs             map[string]sprite.SubTex // map of all loaded images
+	CurPlayerIndex   int                      // the player number of this player
+	Ctx              *context.T
+	Service          syncbase.Service
+	Debug            bool                           // true if debugging, adds extra functionality to switch between players
+	SequentialPhases bool                           // true if trying to match Croupier Flutter Pass -> Take -> Play phase system
+	Shutdown         func()                         // used to shut down a v23.Init()
+	GameID           int                            // used to differentiate between concurrent games
+	IsOwner          bool                           // true if this player is the game creator
+	UserData         map[int]map[string]interface{} // user data indexed by user ID
+	PlayerData       map[int]int                    // key = player number, value = user id
+	AnimChans        []chan bool                    // keeps track of all 'quit' channels in animations so their goroutines can be stopped
+	SGChan           chan bool                      // pass in a bool to stop advertising the syncgroup
+	ScanChan         chan bool                      // pass in a bool to stop scanning for syncgroups
 }
 
 func MakeUIState() *UIState {
 	return &UIState{
-		StartTime:      time.Now(),
-		Cards:          make([]*card.Card, 0),
-		TableCards:     make([]*card.Card, 0),
-		BackgroundImgs: make([]*staticimg.StaticImg, 0),
-		EmptySuitImgs:  make([]*staticimg.StaticImg, 0),
-		DropTargets:    make([]*staticimg.StaticImg, 0),
-		Buttons:        make([]*staticimg.StaticImg, 0),
-		Other:          make([]*staticimg.StaticImg, 0),
-		ModText:        make([]*staticimg.StaticImg, 0),
-		LastMouseXY:    coords.MakeVec(-1, -1),
-		NumPlayers:     numPlayers,
-		NumSuits:       numSuits,
-		CardSize:       cardSize,
-		CardScaler:     cardScaler,
-		TopPadding:     topPadding,
-		BottomPadding:  bottomPadding,
-		WindowSize:     coords.MakeVec(-1, -1),
-		CardDim:        coords.MakeVec(cardSize, cardSize),
-		TableCardDim:   coords.MakeVec(cardSize*cardScaler, cardSize*cardScaler),
-		PlayerIconDim:  coords.MakeVec(2*cardSize/3, 2*cardSize/3),
-		Overlap:        coords.MakeVec(3*cardSize*cardScaler/4, 3*cardSize*cardScaler/4),
-		Padding:        float32(5),
-		CurView:        None,
-		Done:           false,
-		Debug:          true,
-		UserData:       make(map[int]map[string]interface{}),
-		PlayerData:     make(map[int]int),
-		AnimChans:      make([]chan bool, 0),
+		StartTime:        time.Now(),
+		Cards:            make([]*card.Card, 0),
+		TableCards:       make([]*card.Card, 0),
+		BackgroundImgs:   make([]*staticimg.StaticImg, 0),
+		EmptySuitImgs:    make([]*staticimg.StaticImg, 0),
+		DropTargets:      make([]*staticimg.StaticImg, 0),
+		Buttons:          make([]*staticimg.StaticImg, 0),
+		Other:            make([]*staticimg.StaticImg, 0),
+		ModText:          make([]*staticimg.StaticImg, 0),
+		LastMouseXY:      coords.MakeVec(-1, -1),
+		NumPlayers:       numPlayers,
+		NumSuits:         numSuits,
+		CardSize:         cardSize,
+		CardScaler:       cardScaler,
+		TopPadding:       topPadding,
+		BottomPadding:    bottomPadding,
+		WindowSize:       coords.MakeVec(-1, -1),
+		CardDim:          coords.MakeVec(cardSize, cardSize),
+		TableCardDim:     coords.MakeVec(cardSize*cardScaler, cardSize*cardScaler),
+		PlayerIconDim:    coords.MakeVec(2*cardSize/3, 2*cardSize/3),
+		Overlap:          coords.MakeVec(3*cardSize*cardScaler/4, 3*cardSize*cardScaler/4),
+		Padding:          float32(5),
+		CurView:          None,
+		Done:             false,
+		Debug:            true,
+		SequentialPhases: true,
+		UserData:         make(map[int]map[string]interface{}),
+		PlayerData:       make(map[int]int),
+		AnimChans:        make([]chan bool, 0),
 	}
 }
 
diff --git a/go/src/hearts/img/view/view.go b/go/src/hearts/img/view/view.go
index 4781754..3977bcc 100644
--- a/go/src/hearts/img/view/view.go
+++ b/go/src/hearts/img/view/view.go
@@ -36,7 +36,7 @@
 	watchImg := u.Texs["WatchSpot.png"]
 	arrangeBlockLength := u.WindowSize.X - 4*u.Padding - u.CardDim.X
 	if u.WindowSize.Y < u.WindowSize.X {
-		arrangeBlockLength = u.WindowSize.Y - 4*u.Padding - u.CardDim.Y
+		arrangeBlockLength = u.WindowSize.Y - u.CardDim.Y
 	}
 	arrangeDim := coords.MakeVec(arrangeBlockLength/3-4*u.Padding, arrangeBlockLength/3-4*u.Padding)
 	// player 0 seat
@@ -96,7 +96,7 @@
 	resetAnims(u)
 	resetImgs(u)
 	resetScene(u)
-	scaler := float32(4)
+	scaler := float32(6)
 	maxWidth := 4 * u.TableCardDim.X
 	// adding four drop targets for trick
 	dropTargetImage := u.Texs["trickDrop.png"]
@@ -185,7 +185,7 @@
 			texture.MakeImgWithoutAlt(playerIconImage, playerIconPos, u.PlayerIconDim, u))
 	}
 	// player 0's name
-	center := coords.MakeVec(playerIconX+u.PlayerIconDim.X/2, playerIconY-30)
+	center := coords.MakeVec(playerIconX+u.PlayerIconDim.X/2, playerIconY-15)
 	name := uistate.GetName(0, u)
 	textImgs := texture.MakeStringImgCenterAlign(name, "", "", true, center, scaler, maxWidth, u)
 	for _, img := range textImgs {
@@ -213,7 +213,7 @@
 			texture.MakeImgWithoutAlt(playerIconImage, playerIconPos, u.PlayerIconDim, u))
 	}
 	// player 1's name
-	start := coords.MakeVec(playerIconX, playerIconY-30)
+	start := coords.MakeVec(playerIconX, playerIconY-15)
 	name = uistate.GetName(1, u)
 	textImgs = texture.MakeStringImgLeftAlign(name, "", "", true, start, scaler, maxWidth, u)
 	for _, img := range textImgs {
@@ -237,7 +237,7 @@
 			texture.MakeImgWithoutAlt(playerIconImage, playerIconPos, u.PlayerIconDim, u))
 	}
 	// player 2's name
-	center = coords.MakeVec(playerIconX+u.PlayerIconDim.X/2, playerIconY+u.PlayerIconDim.Y+5)
+	center = coords.MakeVec(playerIconX+u.PlayerIconDim.X/2, playerIconY+u.PlayerIconDim.Y)
 	name = uistate.GetName(2, u)
 	textImgs = texture.MakeStringImgCenterAlign(name, "", "", true, center, scaler, maxWidth, u)
 	for _, img := range textImgs {
@@ -264,7 +264,7 @@
 			texture.MakeImgWithoutAlt(playerIconImage, playerIconPos, u.PlayerIconDim, u))
 	}
 	// player 3's name
-	end := coords.MakeVec(playerIconX+u.PlayerIconDim.X, playerIconY-30)
+	end := coords.MakeVec(playerIconX+u.PlayerIconDim.X, playerIconY-15)
 	name = uistate.GetName(3, u)
 	textImgs = texture.MakeStringImgRightAlign(name, "", "", true, end, scaler, maxWidth, u)
 	for _, img := range textImgs {
@@ -387,8 +387,14 @@
 		addDebugBar(u)
 	}
 	// animate in play slot if relevant
-	if u.CurTable.WhoseTurn() == u.CurPlayerIndex && u.CurTable.AllDonePassing() {
-		reposition.AnimateInPlay(u)
+	if u.CurTable.WhoseTurn() == u.CurPlayerIndex {
+		if u.SequentialPhases {
+			if u.CurTable.AllDoneTaking() {
+				reposition.AnimateInPlay(u)
+			}
+		} else if u.CurTable.AllDonePassing() {
+			reposition.AnimateInPlay(u)
+		}
 	}
 }
 
@@ -452,11 +458,11 @@
 		name := uistate.GetName(player, u)
 		var center *coords.Vec
 		if player == 2 {
-			center = coords.MakeVec(sitPos.X+arrangeDim.X/2, sitPos.Y-u.Padding-20)
+			center = coords.MakeVec(sitPos.X+arrangeDim.X/2, sitPos.Y-u.Padding-10)
 		} else {
-			center = coords.MakeVec(sitPos.X+arrangeDim.X/2, sitPos.Y+arrangeDim.Y+u.Padding)
+			center = coords.MakeVec(sitPos.X+arrangeDim.X/2, sitPos.Y+arrangeDim.Y)
 		}
-		scaler := float32(4)
+		scaler := float32(6)
 		maxWidth := arrangeDim.X
 		textImgs := texture.MakeStringImgCenterAlign(name, "", "", true, center, scaler, maxWidth, u)
 		for _, text := range textImgs {
@@ -558,7 +564,7 @@
 func getTurnText(u *uistate.UIState) string {
 	var turnText string
 	playerTurnNum := u.CurTable.WhoseTurn()
-	if playerTurnNum == -1 || !u.CurTable.AllDonePassing() {
+	if playerTurnNum == -1 || !u.CurTable.AllDonePassing() || (u.SequentialPhases && !u.CurTable.AllDoneTaking()) {
 		turnText = "Waiting for other players"
 	} else if playerTurnNum == u.CurPlayerIndex {
 		turnText = "Your turn"
@@ -653,7 +659,12 @@
 
 func addGrayTakeBar(u *uistate.UIState) {
 	passedCards := u.CurTable.GetPlayers()[u.CurPlayerIndex].GetPassedTo()
-	display := len(passedCards) == 0
+	var display bool
+	if u.SequentialPhases {
+		display = !u.CurTable.AllDonePassing()
+	} else {
+		display = len(passedCards) == 0
+	}
 	// adding gray bar
 	grayBarImg := u.Texs["RoundedRectangle-Gray.png"]
 	grayBarAlt := u.Texs["RoundedRectangle-LBlue.png"]
@@ -698,7 +709,14 @@
 }
 
 func moveTakeCards(u *uistate.UIState) {
-	passedCards := u.CurTable.GetPlayers()[u.CurPlayerIndex].GetPassedTo()
+	passedCards := make([]*card.Card, 0)
+	if u.SequentialPhases {
+		if u.CurTable.AllDonePassing() {
+			passedCards = append(passedCards, u.CurTable.GetPlayers()[u.CurPlayerIndex].GetPassedTo()...)
+		}
+	} else {
+		passedCards = append(passedCards, u.CurTable.GetPlayers()[u.CurPlayerIndex].GetPassedTo()...)
+	}
 	if len(passedCards) > 0 {
 		topOfHand := u.WindowSize.Y - 5*(u.CardDim.Y+u.Padding) - (2 * u.Padding / 5) - u.BottomPadding
 		numCards := float32(3)
@@ -724,7 +742,7 @@
 	}
 	u.Other = make([]*staticimg.StaticImg, 0)
 	// set new num tricks
-	scaler := float32(4)
+	scaler := float32(7)
 	for i, d := range u.DropTargets {
 		dropTargetDimensions := d.GetDimensions()
 		dropTargetPos := d.GetCurrent()
@@ -738,16 +756,16 @@
 			var textImgs []*staticimg.StaticImg
 			switch i {
 			case 0:
-				tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y+dropTargetDimensions.Y+u.Padding)
+				tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y+dropTargetDimensions.Y)
 				textImgs = texture.MakeStringImgCenterAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tCenter, scaler, tMax, u)
 			case 1:
-				tRight := coords.MakeVec(dropTargetPos.X-u.Padding, dropTargetPos.Y+dropTargetDimensions.Y/2-10)
+				tRight := coords.MakeVec(dropTargetPos.X-2, dropTargetPos.Y+dropTargetDimensions.Y/2-5)
 				textImgs = texture.MakeStringImgRightAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tRight, scaler, tMax, u)
 			case 2:
-				tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y-u.Padding-20)
+				tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y-12)
 				textImgs = texture.MakeStringImgCenterAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tCenter, scaler, tMax, u)
 			case 3:
-				tLeft := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X+u.Padding, dropTargetPos.Y+dropTargetDimensions.Y/2-10)
+				tLeft := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X+2, dropTargetPos.Y+dropTargetDimensions.Y/2-5)
 				textImgs = texture.MakeStringImgLeftAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tLeft, scaler, tMax, u)
 			}
 			for _, text := range textImgs {
@@ -785,6 +803,7 @@
 		}
 	}
 	if u.CurView == uistate.Split {
+		topOfHand := u.WindowSize.Y - 5*(u.CardDim.Y+u.Padding) - (2 * u.Padding / 5) - u.BottomPadding
 		for i, d := range u.DropTargets {
 			dropTargetDimensions := d.GetDimensions()
 			dropTargetPos := d.GetCurrent()
@@ -794,20 +813,30 @@
 				if numTricks == 1 {
 					trickText = " trick"
 				}
-				tMax := dropTargetDimensions.Y
+				tMax := dropTargetDimensions.Y - u.Padding
 				var textImgs []*staticimg.StaticImg
 				switch i {
 				case 0:
-					tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y+dropTargetDimensions.Y+u.Padding)
-					textImgs = texture.MakeStringImgCenterAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tCenter, scaler, tMax, u)
+					if topOfHand < u.TopPadding+4*u.CardDim.Y {
+						tLeft := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X+2, dropTargetPos.Y+dropTargetDimensions.Y-15)
+						textImgs = texture.MakeStringImgLeftAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tLeft, scaler, tMax, u)
+					} else {
+						tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y+dropTargetDimensions.Y+u.Padding)
+						textImgs = texture.MakeStringImgCenterAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tCenter, scaler, tMax, u)
+					}
 				case 1:
-					tRight := coords.MakeVec(dropTargetPos.X-u.Padding, dropTargetPos.Y+dropTargetDimensions.Y/2-10)
+					tRight := coords.MakeVec(dropTargetPos.X-2, dropTargetPos.Y+dropTargetDimensions.Y/2-5)
 					textImgs = texture.MakeStringImgRightAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tRight, scaler, tMax, u)
 				case 2:
-					tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y-u.Padding-20)
-					textImgs = texture.MakeStringImgCenterAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tCenter, scaler, tMax, u)
+					if topOfHand < u.TopPadding+4*u.CardDim.Y {
+						tLeft := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X+2, dropTargetPos.Y)
+						textImgs = texture.MakeStringImgLeftAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tLeft, scaler, tMax, u)
+					} else {
+						tCenter := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X/2, dropTargetPos.Y-u.Padding-10)
+						textImgs = texture.MakeStringImgCenterAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tCenter, scaler, tMax, u)
+					}
 				case 3:
-					tLeft := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X+u.Padding, dropTargetPos.Y+dropTargetDimensions.Y/2-10)
+					tLeft := coords.MakeVec(dropTargetPos.X+dropTargetDimensions.X+2, dropTargetPos.Y+dropTargetDimensions.Y/2-5)
 					textImgs = texture.MakeStringImgLeftAlign(strconv.Itoa(numTricks)+trickText, "", "", true, tLeft, scaler, tMax, u)
 				}
 				for _, text := range textImgs {
diff --git a/go/src/hearts/logic/table/table.go b/go/src/hearts/logic/table/table.go
index 017b9d4..7b156a1 100644
--- a/go/src/hearts/logic/table/table.go
+++ b/go/src/hearts/logic/table/table.go
@@ -37,7 +37,7 @@
 		heartsBroken: false,
 		firstTrick:   true,
 		winCondition: 100,
-		dir:          direction.None,
+		dir:          direction.Right,
 	}
 }
 
@@ -193,7 +193,7 @@
 	return true
 }
 
-// Returns true if all players have taken the cards passed to them
+// Returns true if all players have passed cards
 func (t *Table) AllDonePassing() bool {
 	for _, p := range t.players {
 		if !p.GetDonePassing() {
@@ -203,6 +203,16 @@
 	return true
 }
 
+// Returns true if all players have taken the cards passed to them
+func (t *Table) AllDoneTaking() bool {
+	for _, p := range t.players {
+		if !p.GetDoneTaking() {
+			return false
+		}
+	}
+	return true
+}
+
 // Returns true if all players have finished looking at their scores
 func (t *Table) AllReadyForNewRound() bool {
 	for _, p := range t.players {
diff --git a/go/src/hearts/syncbase/gamelog/logWriter.go b/go/src/hearts/syncbase/gamelog/logWriter.go
index e1fae35..92e51ab 100644
--- a/go/src/hearts/syncbase/gamelog/logWriter.go
+++ b/go/src/hearts/syncbase/gamelog/logWriter.go
@@ -8,6 +8,7 @@
 package gamelog
 
 import (
+	"fmt"
 	"strconv"
 	"time"
 
@@ -101,8 +102,8 @@
 
 // Note: The syntax replicates the way Croupier in Dart/Flutter writes keys.
 func getKey(playerId int, u *uistate.UIState) string {
-	t := int(time.Now().UnixNano() / 1000000)
-	key := strconv.Itoa(u.GameID) + "/log/" + strconv.Itoa(t) + Dash + strconv.Itoa(playerId)
+	t := time.Now().UnixNano() / 1000000
+	key := fmt.Sprintf("%d/log/%d%s%d", u.GameID, t, Dash, playerId)
 	return key
 }
 
diff --git a/go/src/hearts/syncbase/util/util.go b/go/src/hearts/syncbase/util/util.go
index a146d80..bb4413e 100644
--- a/go/src/hearts/syncbase/util/util.go
+++ b/go/src/hearts/syncbase/util/util.go
@@ -10,14 +10,14 @@
 	// switch back to my mountpoint with the following code:
 	MountPoint = "users/emshack@google.com"
 	//MountPoint        = "/192.168.86.254:8101"
-	UserID            = 12355
+	UserID            = 23876
 	UserColor         = 16777215
 	UserAvatar        = "player0.jpeg"
-	UserName          = "Em"
+	UserName          = "Ewen"
 	SBName            = "syncbase"
 	AppName           = "app"
 	DbName            = "db"
 	LogName           = "games"
 	SettingsName      = "table_settings"
-	CroupierInterface = "CroupierSettingsAndGameEmily"
+	CroupierInterface = "CroupierSettingsAndGame"
 )
diff --git a/go/src/hearts/syncbase/watch/watch.go b/go/src/hearts/syncbase/watch/watch.go
index 91b4bb6..aacb706 100644
--- a/go/src/hearts/syncbase/watch/watch.go
+++ b/go/src/hearts/syncbase/watch/watch.go
@@ -154,8 +154,14 @@
 		u.AnimChans = append(u.AnimChans, quit)
 		reposition.AnimateTableCardPass(curCards, receivingPlayer, quit, u)
 		reposition.SetTableDropColors(u)
-	} else if u.CurView == uistate.Take && u.CurPlayerIndex == receivingPlayer {
-		view.LoadTakeView(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(u)
 	}
@@ -170,7 +176,19 @@
 		p.AddToHand(c)
 	}
 	u.CurTable.GetPlayers()[playerInt].SetDoneTaking(true)
-	if p.HasTwoOfClubs() {
+	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(u)
+			}
+		}
+	} else if p.HasTwoOfClubs() {
 		u.CurTable.SetFirstPlayer(p.GetPlayerIndex())
 		// UI
 		if u.CurView == uistate.Play && u.CurPlayerIndex != playerInt {
diff --git a/go/src/hearts/touchhandler/touchhandler.go b/go/src/hearts/touchhandler/touchhandler.go
index 2dc4f60..7f48b97 100644
--- a/go/src/hearts/touchhandler/touchhandler.go
+++ b/go/src/hearts/touchhandler/touchhandler.go
@@ -150,7 +150,8 @@
 	}
 }
 
-//&& u.PlayerData[u.CurPlayerIndex] == 0
+// If players cannot sit in more than one spot, replace the line 5 ahead of this one with the following line:
+// if len(buttonList) > 0 && u.PlayerData[u.CurPlayerIndex] == 0 {
 
 func beginClickArrange(t touch.Event, u *uistate.UIState) {
 	buttonList := findClickedButton(t, u)