Starting to create split play view

Change-Id: Ic2b9f68ac53b49cd34cb98db7e8de2e6cd22b44b
diff --git a/go/src/hearts/img/uistate/uistate.go b/go/src/hearts/img/uistate/uistate.go
index 5d084a1..a4b7617 100644
--- a/go/src/hearts/img/uistate/uistate.go
+++ b/go/src/hearts/img/uistate/uistate.go
@@ -32,6 +32,7 @@
 	Table   View = "Table"
 	Play    View = "Play"
 	Score   View = "Score"
+	Split   View = "Split"
 )
 
 const (
diff --git a/go/src/hearts/img/view/view.go b/go/src/hearts/img/view/view.go
index 1d97c8b..c56a5c3 100644
--- a/go/src/hearts/img/view/view.go
+++ b/go/src/hearts/img/view/view.go
@@ -119,7 +119,7 @@
 		u.Cards = append(u.Cards, dropCard)
 	}
 	// adding 4 player icons, text, and device icons
-	playerIconImage := u.CurTable.GetPlayers()[0].GetImage()
+	playerIconImage := u.CurTable.GetPlayers()[0].GetIconImage()
 	playerIconX := (u.WindowSize.X - u.PlayerIconDim.X) / 2
 	playerIconY := u.WindowSize.Y - u.TableCardDim.Y - u.BottomPadding - u.Padding - u.PlayerIconDim.Y
 	playerIconPos := coords.MakeVec(playerIconX, playerIconY)
@@ -137,13 +137,13 @@
 		u.BackgroundImgs = append(u.BackgroundImgs, img)
 	}
 	// player 0's device icon
-	deviceIconImage := u.Texs["phoneIcon.png"]
+	deviceIconImage := u.CurTable.GetPlayers()[0].GetDeviceImage()
 	deviceIconDim := u.PlayerIconDim.DividedBy(2)
 	deviceIconPos := coords.MakeVec(playerIconPos.X+u.PlayerIconDim.X, playerIconPos.Y)
 	u.BackgroundImgs = append(u.BackgroundImgs,
 		texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
 	// player 1's icon
-	playerIconImage = u.CurTable.GetPlayers()[1].GetImage()
+	playerIconImage = u.CurTable.GetPlayers()[1].GetIconImage()
 	playerIconX = u.BottomPadding
 	playerIconY = (u.WindowSize.Y+2*u.BottomPadding+u.PlayerIconDim.Y-
 		(float32(len(u.CurTable.GetPlayers()[1].GetHand()))*
@@ -164,12 +164,12 @@
 		u.BackgroundImgs = append(u.BackgroundImgs, img)
 	}
 	// player 1's device icon
-	deviceIconImage = u.Texs["tabletIcon.png"]
+	deviceIconImage = u.CurTable.GetPlayers()[1].GetDeviceImage()
 	deviceIconPos = coords.MakeVec(playerIconPos.X+u.PlayerIconDim.X, playerIconPos.Y+u.PlayerIconDim.Y-deviceIconDim.Y)
 	u.BackgroundImgs = append(u.BackgroundImgs,
 		texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
 	// player 2's icon
-	playerIconImage = u.CurTable.GetPlayers()[2].GetImage()
+	playerIconImage = u.CurTable.GetPlayers()[2].GetIconImage()
 	playerIconX = (u.WindowSize.X - u.PlayerIconDim.X) / 2
 	playerIconY = u.TopPadding + u.TableCardDim.Y + u.Padding
 	playerIconPos = coords.MakeVec(playerIconX, playerIconY)
@@ -187,12 +187,12 @@
 		u.BackgroundImgs = append(u.BackgroundImgs, img)
 	}
 	// player 2's device icon
-	deviceIconImage = u.Texs["watchIcon.png"]
+	deviceIconImage = u.CurTable.GetPlayers()[2].GetDeviceImage()
 	deviceIconPos = coords.MakeVec(playerIconPos.X+u.PlayerIconDim.X, playerIconPos.Y+u.PlayerIconDim.Y-deviceIconDim.Y)
 	u.BackgroundImgs = append(u.BackgroundImgs,
 		texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
 	// player 3's icon
-	playerIconImage = u.CurTable.GetPlayers()[3].GetImage()
+	playerIconImage = u.CurTable.GetPlayers()[3].GetIconImage()
 	playerIconX = u.WindowSize.X - u.BottomPadding - u.PlayerIconDim.X
 	playerIconY = (u.WindowSize.Y+2*u.BottomPadding+u.PlayerIconDim.Y-
 		(float32(len(u.CurTable.GetPlayers()[3].GetHand()))*
@@ -213,7 +213,7 @@
 		u.BackgroundImgs = append(u.BackgroundImgs, img)
 	}
 	// player 3's device icon
-	deviceIconImage = u.Texs["laptopIcon.png"]
+	deviceIconImage = u.CurTable.GetPlayers()[3].GetDeviceImage()
 	deviceIconPos = coords.MakeVec(playerIconPos.X-deviceIconDim.X, playerIconPos.Y+u.PlayerIconDim.Y-deviceIconDim.Y)
 	u.BackgroundImgs = append(u.BackgroundImgs,
 		texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
@@ -254,12 +254,7 @@
 	addHeader(u)
 	addScoreViewHeaderText(u)
 	addPlayerScores(roundScores, u)
-	if len(winners) > 0 {
-		addScoreButton(true, u)
-	} else {
-		addScoreButton(false, u)
-	}
-
+	addScoreButton(len(winners) > 0, u)
 }
 
 // Pass View: Shows player's hand and allows them to pass cards
@@ -299,17 +294,7 @@
 	resetScene(u)
 	addPlaySlot(u)
 	addHand(u)
-	var turnText string
-	playerTurnNum := u.CurTable.WhoseTurn()
-	if playerTurnNum == -1 || !u.CurTable.AllDonePassing() {
-		turnText = "Waiting for other players"
-	} else if playerTurnNum == u.CurPlayerIndex {
-		turnText = "Your turn"
-	} else {
-		name := u.CurTable.GetPlayers()[playerTurnNum].GetName()
-		turnText = name + "'s turn"
-	}
-	addPlayHeader(turnText, u)
+	addPlayHeader(getTurnText(u), u)
 	if u.Debug {
 		addDebugBar(u)
 	}
@@ -319,6 +304,18 @@
 	}
 }
 
+func LoadSplitView(u *uistate.UIState) {
+	u.CurView = uistate.Split
+	resetImgs(u)
+	resetScene(u)
+	addHand(u)
+	addPlayHeader(getTurnText(u), u)
+	addSplitViewPlayerIcons(u)
+	if u.Debug {
+		addDebugBar(u)
+	}
+}
+
 func ChangePlayMessage(message string, u *uistate.UIState) {
 	// remove text and replace with message
 	var emptyTex sprite.SubTex
@@ -331,6 +328,98 @@
 	addPlayHeader(message, u)
 }
 
+func addSplitViewPlayerIcons(u *uistate.UIState) {
+	topOfBanner := u.WindowSize.Y - 4*u.CardDim.Y - 5*u.Padding - u.BottomPadding - 40
+	splitWindowSize := coords.MakeVec(u.WindowSize.X, topOfBanner+u.TopPadding)
+	dropTargetImage := u.Texs["trickDrop.png"]
+	dropTargetAlt := u.Texs["trickDropBlue.png"]
+	dropTargetDimensions := u.CardDim
+	playerIconDimensions := u.CardDim.Minus(2)
+	// first drop target
+	dropTargetX := (splitWindowSize.X - u.CardDim.X) / 2
+	dropTargetY := splitWindowSize.Y/2 + u.Padding
+	dropTargetPos := coords.MakeVec(dropTargetX, dropTargetY)
+	u.DropTargets = append(u.DropTargets,
+		texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+	// first player icon
+	playerIconImage := u.CurTable.GetPlayers()[u.CurPlayerIndex].GetIconImage()
+	u.BackgroundImgs = append(u.BackgroundImgs,
+		texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+	// card on top of first drop target
+	dropCard := u.CurTable.GetTrick()[u.CurPlayerIndex]
+	if dropCard != nil {
+		texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+		dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+		u.TableCards = append(u.TableCards, dropCard)
+	}
+	// second drop target
+	dropTargetY = (splitWindowSize.Y - u.CardDim.Y) / 2
+	dropTargetX = splitWindowSize.X/2 - 3*u.CardDim.X/2 - u.Padding
+	dropTargetPos = coords.MakeVec(dropTargetX, dropTargetY)
+	u.DropTargets = append(u.DropTargets,
+		texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+	// second player icon
+	playerIconImage = u.CurTable.GetPlayers()[(u.CurPlayerIndex+1)%len(u.CurTable.GetPlayers())].GetIconImage()
+	u.BackgroundImgs = append(u.BackgroundImgs,
+		texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+	// card on top of second drop target
+	dropCard = u.CurTable.GetTrick()[(u.CurPlayerIndex+1)%len(u.CurTable.GetPlayers())]
+	if dropCard != nil {
+		texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+		dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+		u.TableCards = append(u.TableCards, dropCard)
+	}
+	// third drop target
+	dropTargetX = (splitWindowSize.X - u.CardDim.X) / 2
+	dropTargetY = splitWindowSize.Y/2 - u.Padding - u.CardDim.Y
+	dropTargetPos = coords.MakeVec(dropTargetX, dropTargetY)
+	u.DropTargets = append(u.DropTargets,
+		texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+	// third player icon
+	playerIconImage = u.CurTable.GetPlayers()[(u.CurPlayerIndex+2)%len(u.CurTable.GetPlayers())].GetIconImage()
+	u.BackgroundImgs = append(u.BackgroundImgs,
+		texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+	// card on top of third drop target
+	dropCard = u.CurTable.GetTrick()[(u.CurPlayerIndex+2)%len(u.CurTable.GetPlayers())]
+	if dropCard != nil {
+		texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+		dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+		u.TableCards = append(u.TableCards, dropCard)
+	}
+	// fourth drop target
+	dropTargetY = (splitWindowSize.Y - u.CardDim.Y) / 2
+	dropTargetX = splitWindowSize.X/2 + u.CardDim.X/2 + u.Padding
+	dropTargetPos = coords.MakeVec(dropTargetX, dropTargetY)
+	u.DropTargets = append(u.DropTargets,
+		texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+	// fourth player icon
+	playerIconImage = u.CurTable.GetPlayers()[(u.CurPlayerIndex+3)%len(u.CurTable.GetPlayers())].GetIconImage()
+	u.BackgroundImgs = append(u.BackgroundImgs,
+		texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+	// card on top of fourth drop target
+	dropCard = u.CurTable.GetTrick()[(u.CurPlayerIndex+3)%len(u.CurTable.GetPlayers())]
+	if dropCard != nil {
+		texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+		dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+		u.TableCards = append(u.TableCards, dropCard)
+	}
+}
+
+// returns a string which says whose turn it is
+func getTurnText(u *uistate.UIState) string {
+	var turnText string
+	playerTurnNum := u.CurTable.WhoseTurn()
+	if playerTurnNum == -1 || !u.CurTable.AllDonePassing() {
+		turnText = "Waiting for other players"
+	} else if playerTurnNum == u.CurPlayerIndex {
+		turnText = "Your turn"
+	} else {
+		name := u.CurTable.GetPlayers()[playerTurnNum].GetName()
+		turnText = name + "'s turn"
+	}
+	return turnText
+}
+
 func addHeader(u *uistate.UIState) {
 	// adding blue banner
 	headerImage := u.Texs["RoundedRectangle-DBlue.png"]
@@ -343,20 +432,33 @@
 func addPlayHeader(message string, u *uistate.UIState) {
 	// adding blue banner
 	headerImage := u.Texs["Rectangle-DBlue.png"]
-	headerPos := coords.MakeVec(0, 0)
-	headerDimensions := coords.MakeVec(u.WindowSize.X, float32(50))
+	var headerDimensions *coords.Vec
+	var headerPos *coords.Vec
+	if u.CurView == uistate.Play {
+		headerDimensions = coords.MakeVec(u.WindowSize.X, float32(50))
+		headerPos = coords.MakeVec(0, 0)
+	} else {
+		headerDimensions = coords.MakeVec(u.WindowSize.X, float32(40))
+		topOfHand := u.WindowSize.Y - 4*(u.CardDim.Y+u.Padding) - u.BottomPadding
+		headerPos = coords.MakeVec(0, topOfHand-headerDimensions.Y-u.Padding)
+	}
 	u.BackgroundImgs = append(u.BackgroundImgs,
 		texture.MakeImgWithoutAlt(headerImage, headerPos, headerDimensions, u.Eng, u.Scene))
 	// adding pull tab
 	pullTabImage := u.Texs["HorizontalPullTab.png"]
 	pullTabDim := u.CardDim.DividedBy(2)
-	pullTabPos := headerDimensions.MinusVec(pullTabDim).Minus(u.Padding)
+	pullTabPos := headerPos.PlusVec(headerDimensions).MinusVec(pullTabDim).Minus(u.Padding)
 	u.Buttons = append(u.Buttons,
 		texture.MakeImgWithoutAlt(pullTabImage, pullTabPos, pullTabDim, u.Eng, u.Scene))
 	// adding text
 	color := "DBlue"
 	scaler := float32(4)
-	center := coords.MakeVec(u.WindowSize.X/2, 20)
+	var center *coords.Vec
+	if u.CurView == uistate.Play {
+		center = coords.MakeVec(u.WindowSize.X/2, headerPos.Y+20)
+	} else {
+		center = coords.MakeVec(u.WindowSize.X/2, headerPos.Y+10)
+	}
 	maxWidth := u.WindowSize.X - pullTabDim.X*2 - u.Padding*4
 	u.BackgroundImgs = append(u.BackgroundImgs,
 		texture.MakeStringImgCenterAlign(message, color, color, true, center, scaler, maxWidth, u)...)
@@ -625,7 +727,7 @@
 		u.BackgroundImgs = append(u.BackgroundImgs,
 			texture.MakeImgWithoutAlt(dividerImage, dividerPos, dividerDim, u.Eng, u.Scene))
 		// player icon
-		playerIconImage := p.GetImage()
+		playerIconImage := p.GetIconImage()
 		playerIconDim := coords.MakeVec(rowHeight/2, rowHeight/2)
 		playerIconPos := coords.MakeVec(u.WindowSize.X/4-playerIconDim.X/2, top+(float32(i)+.5)*rowHeight+rowHeight/7)
 		u.BackgroundImgs = append(u.BackgroundImgs,
diff --git a/go/src/hearts/logic/player/player.go b/go/src/hearts/logic/player/player.go
index abaa220..4f61379 100644
--- a/go/src/hearts/logic/player/player.go
+++ b/go/src/hearts/logic/player/player.go
@@ -12,33 +12,35 @@
 )
 
 // Returns a player instance with playerIndex equal to index
-func NewPlayer(index int, name string, tex sprite.SubTex) *Player {
+func NewPlayer(index int, name string, iconTex, deviceTex sprite.SubTex) *Player {
 	return &Player{
-		hand:        nil,
-		tricks:      make([]*card.Card, 0),
-		score:       0,
-		playerIndex: index,
-		playerName:  name,
-		playerImage: tex,
-		donePassing: false,
-		doneTaking:  false,
-		doneScoring: false,
+		hand:              nil,
+		tricks:            make([]*card.Card, 0),
+		score:             0,
+		playerIndex:       index,
+		playerName:        name,
+		playerIconImage:   iconTex,
+		playerDeviceImage: deviceTex,
+		donePassing:       false,
+		doneTaking:        false,
+		doneScoring:       false,
 	}
 }
 
 type Player struct {
-	hand        []*card.Card
-	passedFrom  []*card.Card
-	passedTo    []*card.Card
-	tricks      []*card.Card
-	score       int
-	playerIndex int
-	playerName  string
-	playerImage sprite.SubTex
-	donePassing bool
-	doneTaking  bool
-	donePlaying bool
-	doneScoring bool
+	hand              []*card.Card
+	passedFrom        []*card.Card
+	passedTo          []*card.Card
+	tricks            []*card.Card
+	score             int
+	playerIndex       int
+	playerName        string
+	playerIconImage   sprite.SubTex
+	playerDeviceImage sprite.SubTex
+	donePassing       bool
+	doneTaking        bool
+	donePlaying       bool
+	doneScoring       bool
 }
 
 // Returns the hand of p
@@ -70,8 +72,12 @@
 	return p.playerName
 }
 
-func (p *Player) GetImage() sprite.SubTex {
-	return p.playerImage
+func (p *Player) GetIconImage() sprite.SubTex {
+	return p.playerIconImage
+}
+
+func (p *Player) GetDeviceImage() sprite.SubTex {
+	return p.playerDeviceImage
 }
 
 // Returns true if p has finished the pass phase of the current round
diff --git a/go/src/hearts/logic/table/table.go b/go/src/hearts/logic/table/table.go
index 073d2b4..74ed5ba 100644
--- a/go/src/hearts/logic/table/table.go
+++ b/go/src/hearts/logic/table/table.go
@@ -19,9 +19,10 @@
 func InitializeGame(numPlayers int, texs map[string]sprite.SubTex) *Table {
 	players := make([]*player.Player, 0)
 	names := []string{"YoungSeok", "Dan", "Emily", "Ross"}
-	images := []sprite.SubTex{texs["player0.jpeg"], texs["player1.jpeg"], texs["player2.jpeg"], texs["player3.jpeg"]}
+	iconImages := []sprite.SubTex{texs["player0.jpeg"], texs["player1.jpeg"], texs["player2.jpeg"], texs["player3.jpeg"]}
+	deviceImages := []sprite.SubTex{texs["laptopIcon.png"], texs["watchIcon.png"], texs["tabletIcon.png"], texs["phoneIcon.png"]}
 	for i := 0; i < numPlayers; i++ {
-		players = append(players, player.NewPlayer(i, names[i], images[i]))
+		players = append(players, player.NewPlayer(i, names[i], iconImages[i], deviceImages[i]))
 	}
 	t := makeTable(players)
 	t.GenerateClassicCards()
diff --git a/go/src/hearts/touchhandler/touchhandler.go b/go/src/hearts/touchhandler/touchhandler.go
index 645e3a0..89d63af 100644
--- a/go/src/hearts/touchhandler/touchhandler.go
+++ b/go/src/hearts/touchhandler/touchhandler.go
@@ -58,6 +58,15 @@
 		case "end":
 			endClickPlay(t, u)
 		}
+	case uistate.Split:
+		switch t.Type.String() {
+		case "begin":
+			beginClickSplit(t, u)
+		case "move":
+			moveClickSplit(t, u)
+		case "end":
+			endClickSplit(t, u)
+		}
 	case uistate.Score:
 		switch t.Type.String() {
 		case "begin":
@@ -261,6 +270,7 @@
 		if u.Debug {
 			if u.Buttons[0] == buttonList[0] {
 				u.CurImg = u.Buttons[0]
+				view.LoadSplitView(u)
 			} else if u.Buttons[1] == buttonList[0] {
 				view.LoadTableView(u)
 			} else if u.Buttons[2] == buttonList[0] {
@@ -298,6 +308,19 @@
 	u.CurCard = nil
 }
 
+func beginClickSplit(t touch.Event, u *uistate.UIState) {
+	buttonList := findClickedButton(t, u)
+	if len(buttonList) > 0 {
+		view.LoadPlayView(u)
+	}
+}
+
+func moveClickSplit(t touch.Event, u *uistate.UIState) {
+}
+
+func endClickSplit(t touch.Event, u *uistate.UIState) {
+}
+
 func beginClickScore(t touch.Event, u *uistate.UIState) {
 	buttonList := findClickedButton(t, u)
 	if len(buttonList) > 0 {