diff --git a/src/main/kotlin/dartzee/game/GameLauncher.kt b/src/main/kotlin/dartzee/game/GameLauncher.kt index 8c657466..951b865d 100644 --- a/src/main/kotlin/dartzee/game/GameLauncher.kt +++ b/src/main/kotlin/dartzee/game/GameLauncher.kt @@ -47,9 +47,9 @@ class GameLauncher { val participants = insertNewGameEntities(game.rowId, params) // Construct the screen and factory a tab - val scrn = DartsGameScreen(game, params.teamCount()) + val scrn = DartsGameScreen(game, participants) scrn.isVisible = true - scrn.gamePanel.startNewGame(participants) + scrn.startNewGame() logger.info( CODE_GAME_LAUNCHED, @@ -93,7 +93,7 @@ class GameLauncher { private fun loadAndDisplaySingleGame(gameEntity: GameEntity) { // We've found a game, so construct a screen and initialise it val participants = loadParticipants(gameEntity.rowId) - val scrn = DartsGameScreen(gameEntity, participants.size) + val scrn = DartsGameScreen(gameEntity, participants) scrn.isVisible = true // Now try to load the game diff --git a/src/main/kotlin/dartzee/screen/DartsApp.kt b/src/main/kotlin/dartzee/screen/DartsApp.kt index 7443658d..b304004a 100644 --- a/src/main/kotlin/dartzee/screen/DartsApp.kt +++ b/src/main/kotlin/dartzee/screen/DartsApp.kt @@ -11,7 +11,6 @@ import dartzee.logging.KEY_CURRENT_SCREEN import dartzee.logging.LoggingCode import dartzee.main.exitApplication import dartzee.`object`.DartsClient -import dartzee.screen.game.TutorialWindow import dartzee.utils.DartsDatabaseUtil import dartzee.utils.DevUtilities import dartzee.utils.InjectedThings @@ -174,9 +173,6 @@ class DartsApp(commandBar: CheatBar) : AbstractDevScreen(commandBar), WindowList } else if (cmd == CMD_TEST) { val window = TestWindow() window.isVisible = true - } else if (cmd == "tutorial") { - val window = TutorialWindow() - window.isVisible = true } return textToShow diff --git a/src/main/kotlin/dartzee/screen/game/AbstractDartsGameScreen.kt b/src/main/kotlin/dartzee/screen/game/AbstractDartsGameScreen.kt index 3142a9db..1efd4d2a 100644 --- a/src/main/kotlin/dartzee/screen/game/AbstractDartsGameScreen.kt +++ b/src/main/kotlin/dartzee/screen/game/AbstractDartsGameScreen.kt @@ -3,6 +3,7 @@ package dartzee.screen.game import dartzee.achievements.AbstractAchievement import dartzee.screen.FocusableWindow import dartzee.screen.ScreenCache +import dartzee.utils.InjectedThings import java.awt.Frame import java.awt.event.WindowEvent import java.awt.event.WindowListener @@ -10,7 +11,7 @@ import javax.swing.WindowConstants abstract class AbstractDartsGameScreen : FocusableWindow(), WindowListener { var haveLostFocus = false - protected var shouldPack = true + protected var shouldPack = !InjectedThings.partyMode init { defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE diff --git a/src/main/kotlin/dartzee/screen/game/DartsGameScreen.kt b/src/main/kotlin/dartzee/screen/game/DartsGameScreen.kt index 5aff1a0d..266ad508 100644 --- a/src/main/kotlin/dartzee/screen/game/DartsGameScreen.kt +++ b/src/main/kotlin/dartzee/screen/game/DartsGameScreen.kt @@ -2,11 +2,16 @@ package dartzee.screen.game import dartzee.achievements.AbstractAchievement import dartzee.db.GameEntity +import dartzee.game.state.IWrappedParticipant import dartzee.screen.ScreenCache +import dartzee.utils.InjectedThings +import java.awt.Frame /** DartsGameScreen Simple screen which wraps up a single game panel */ -class DartsGameScreen(game: GameEntity, totalPlayers: Int) : AbstractDartsGameScreen() { - var gamePanel: DartsGamePanel<*, *> = DartsGamePanel.factory(this, game, totalPlayers) +class DartsGameScreen(game: GameEntity, private val participants: List) : + AbstractDartsGameScreen() { + private val tutorialPanel = TutorialWindow(this) + var gamePanel: DartsGamePanel<*, *> = DartsGamePanel.factory(this, game, participants.size) override val windowName = gamePanel.gameTitle init { @@ -16,8 +21,26 @@ class DartsGameScreen(game: GameEntity, totalPlayers: Int) : AbstractDartsGameSc title = gamePanel.gameTitle - // Add the single game tab and set visible + if (InjectedThings.partyMode) { + contentPane.add(tutorialPanel) + extendedState = Frame.MAXIMIZED_BOTH + } else { + contentPane.add(gamePanel) + } + } + + fun startNewGame() { + if (!InjectedThings.partyMode) { + gamePanel.startNewGame(participants) + } + } + + fun tutorialFinished() { + contentPane.remove(tutorialPanel) contentPane.add(gamePanel) + repaint() + + gamePanel.startNewGame(participants) } override fun fireAppearancePreferencesChanged() { diff --git a/src/main/kotlin/dartzee/screen/game/TutorialWindow.kt b/src/main/kotlin/dartzee/screen/game/TutorialWindow.kt index daeb018a..68b2b720 100644 --- a/src/main/kotlin/dartzee/screen/game/TutorialWindow.kt +++ b/src/main/kotlin/dartzee/screen/game/TutorialWindow.kt @@ -9,12 +9,10 @@ import dartzee.utils.ResourceCache import dartzee.utils.sumScore import java.awt.BorderLayout import java.awt.Dimension -import java.awt.Frame import java.awt.event.ActionEvent import java.awt.event.ActionListener import javax.swing.ImageIcon import javax.swing.JButton -import javax.swing.JFrame import javax.swing.JLabel import javax.swing.JPanel import javax.swing.JSeparator @@ -25,7 +23,8 @@ import javax.swing.border.EmptyBorder import javax.swing.border.EtchedBorder import net.miginfocom.swing.MigLayout -class TutorialWindow : JFrame(), ActionListener, DartboardListener { +class TutorialWindow(private val parent: DartsGameScreen) : + JPanel(), ActionListener, DartboardListener { private val dartsThrown = mutableListOf() private var scoreRemaining = 301 @@ -40,15 +39,14 @@ class TutorialWindow : JFrame(), ActionListener, DartboardListener { private val lblScored = JLabel("0") init { - contentPane.layout = BorderLayout(0, 0) - extendedState = Frame.MAXIMIZED_BOTH + layout = BorderLayout(0, 0) // West Pane - the rules val panelWest = JPanel() panelWest.border = EtchedBorder(EtchedBorder.RAISED, null, null) panelWest.layout = MigLayout("al center top") panelWest.preferredSize = Dimension(500, 50) - contentPane.add(panelWest, BorderLayout.WEST) + add(panelWest, BorderLayout.WEST) val lblRules = makeTitleLabel("The Rules") panelWest.add(lblRules, "cell 0 0, growx") @@ -78,7 +76,7 @@ class TutorialWindow : JFrame(), ActionListener, DartboardListener { // Center Pane - Dartboard etc val panelCenter = JPanel() panelCenter.layout = BorderLayout(0, 0) - contentPane.add(panelCenter, BorderLayout.CENTER) + add(panelCenter, BorderLayout.CENTER) panelCenter.add(dartboard, BorderLayout.CENTER) // Center-North - Give it a Try! title @@ -107,7 +105,7 @@ class TutorialWindow : JFrame(), ActionListener, DartboardListener { // Center-East - Score indicators val panelEast = JPanel() panelEast.preferredSize = Dimension(160, 50) - contentPane.add(panelEast, BorderLayout.EAST) + add(panelEast, BorderLayout.EAST) panelEast.layout = MigLayout("al center center") val lblRemainingText = JLabel("Remaining:") lblRemainingText.horizontalAlignment = SwingConstants.CENTER @@ -125,6 +123,7 @@ class TutorialWindow : JFrame(), ActionListener, DartboardListener { lblScored.setFontSize(18) dartboard.addDartboardListener(this) + btnStartGame.addActionListener(this) btnConfirm.addActionListener(this) btnReset.addActionListener(this) } @@ -173,6 +172,7 @@ class TutorialWindow : JFrame(), ActionListener, DartboardListener { override fun actionPerformed(e: ActionEvent?) { when (e?.source) { + btnStartGame -> parent.tutorialFinished() btnReset -> clearDarts() btnConfirm -> confirmScore() } diff --git a/src/test/kotlin/dartzee/e2e/GameHelpers.kt b/src/test/kotlin/dartzee/e2e/GameHelpers.kt index f3174613..3b2f4412 100644 --- a/src/test/kotlin/dartzee/e2e/GameHelpers.kt +++ b/src/test/kotlin/dartzee/e2e/GameHelpers.kt @@ -82,26 +82,26 @@ fun closeOpenGames() { ScreenCache.getDartsGameScreens().forEach { it.dispose() } } -data class GamePanelTestSetup(val gamePanel: DartsGamePanel<*, *>, val listener: DartboardListener) +data class GamePanelTestSetup( + val gamePanel: DartsGamePanel<*, *>, + val listener: DartboardListener, + val participants: List +) -fun setUpGamePanelAndStartGame(game: GameEntity, players: List) = - setUpGamePanel(game).also { it.gamePanel.startGame(players) } +fun setUpGamePanelAndStartGame(game: GameEntity, players: List): GamePanelTestSetup { + val participants = prepareParticipants(game.rowId, players, false) + return setUpGamePanel(game, participants).also { it.gamePanel.startNewGame(participants) } +} -fun setUpGamePanel(game: GameEntity, totalPlayers: Int = 1): GamePanelTestSetup { - val parentWindow = DartsGameScreen(game, totalPlayers) +fun setUpGamePanel(game: GameEntity, participants: List): GamePanelTestSetup { + val parentWindow = DartsGameScreen(game, participants) parentWindow.isVisible = true val gamePanel = parentWindow.gamePanel val listener = mockk(relaxed = true) gamePanel.dartboard.addDartboardListener(listener) - return GamePanelTestSetup(gamePanel, listener) -} - -fun DartsGamePanel<*, *>.startGame(players: List): List { - val participants = prepareParticipants(gameEntity.rowId, players, false) - startNewGame(participants) - return participants + return GamePanelTestSetup(gamePanel, listener, participants) } fun GameSetupPlayerSelector.selectTopPlayer() { diff --git a/src/test/kotlin/dartzee/e2e/TestDartzeeE2E.kt b/src/test/kotlin/dartzee/e2e/TestDartzeeE2E.kt index ddef3697..c34955ed 100644 --- a/src/test/kotlin/dartzee/e2e/TestDartzeeE2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestDartzeeE2E.kt @@ -79,8 +79,6 @@ class TestDartzeeE2E : AbstractE2ETest() { val game = insertGame(gameType = GameType.DARTZEE) insertDartzeeRules(game.rowId, testRules) - val (gamePanel, listener) = setUpGamePanel(game) - val p1Rounds = listOf( listOf(makeDart(20, 1), makeDart(5, 1), makeDart(1, 1)), // Scoring round - 26 @@ -119,6 +117,7 @@ class TestDartzeeE2E : AbstractE2ETest() { val p2 = makePlayerWithModel(p2Model, name = "Lynn", image = "BaboTwo") val participants = prepareParticipants(game.rowId, listOf(p1, p2), true) + val (gamePanel, listener) = setUpGamePanel(game, participants) gamePanel.startNewGame(participants) awaitGameFinish(game) diff --git a/src/test/kotlin/dartzee/e2e/TestGolfE2E.kt b/src/test/kotlin/dartzee/e2e/TestGolfE2E.kt index d85e7375..985fafdd 100644 --- a/src/test/kotlin/dartzee/e2e/TestGolfE2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestGolfE2E.kt @@ -76,7 +76,6 @@ class TestGolfE2E : AbstractE2ETest() { @Test fun `E2E - Golf - Gambler, stop threshold`() { val game = insertGame(gameType = GameType.GOLF, gameParams = "9") - val (gamePanel, listener) = setUpGamePanel(game) val expectedRounds = listOf( @@ -99,7 +98,7 @@ class TestGolfE2E : AbstractE2ETest() { val aiModel = predictableDartsModel(aimDarts) val player = makePlayerWithModel(aiModel) - gamePanel.startGame(listOf(player)) + val (gamePanel, listener) = setUpGamePanelAndStartGame(game, listOf(player)) awaitGameFinish(game) verifyState(gamePanel, listener, expectedRounds, finalScore = 25, expectedScorerRows = 10) @@ -124,7 +123,6 @@ class TestGolfE2E : AbstractE2ETest() { @Test fun `E2E - 9 holes - Team of 2`() { val game = insertGame(gameType = GameType.GOLF, gameParams = "9") - val (gamePanel, listener) = setUpGamePanel(game) val p1Rounds = listOf( @@ -167,6 +165,7 @@ class TestGolfE2E : AbstractE2ETest() { val p2 = makePlayerWithModel(p2Model, name = "Lynn", image = "BaboTwo") val participants = prepareParticipants(game.rowId, listOf(p1, p2), true) + val (gamePanel, listener) = setUpGamePanel(game, participants) gamePanel.startNewGame(participants) awaitGameFinish(game) diff --git a/src/test/kotlin/dartzee/e2e/TestPartyModeE2E.kt b/src/test/kotlin/dartzee/e2e/TestPartyModeE2E.kt index 242c2346..d36e871b 100644 --- a/src/test/kotlin/dartzee/e2e/TestPartyModeE2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestPartyModeE2E.kt @@ -61,6 +61,8 @@ class TestPartyModeE2E : AbstractE2ETest() { } } + gameWindow.clickButton(text = "I'm ready - let's play!") + val gamePanel = gameWindow.getChild>() gamePanel.throwHumanRound(drtOuterTwenty(), drtTrebleTwenty(), drtOuterTwenty()) // 201 gamePanel.throwHumanRound(drtOuterNineteen(), drtOuterNineteen(), drtInnerSeven()) // 256 diff --git a/src/test/kotlin/dartzee/e2e/TestResignationE2E.kt b/src/test/kotlin/dartzee/e2e/TestResignationE2E.kt index 16e4ebae..e9517bdd 100644 --- a/src/test/kotlin/dartzee/e2e/TestResignationE2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestResignationE2E.kt @@ -25,12 +25,12 @@ class TestResignationE2E : AbstractE2ETest() { gameParams = X01Config(501, FinishType.Doubles).toJson() ) - val (gamePanel) = setUpGamePanel(game, 3) - val (winner, loser) = createPlayers() val resignee = insertPlayer(strategy = "") - val (ptWinner, ptResignee, ptLoser) = gamePanel.startGame(listOf(winner, resignee, loser)) + val (gamePanel, _, participants) = + setUpGamePanelAndStartGame(game, listOf(winner, resignee, loser)) + val (ptWinner, ptResignee, ptLoser) = participants gamePanel.awaitTurn(ptResignee) gamePanel.throwHumanDart(20, SegmentType.OUTER_SINGLE) @@ -52,12 +52,12 @@ class TestResignationE2E : AbstractE2ETest() { fun `Resigning mid-game - Golf`() { val game = insertGame(gameType = GameType.GOLF, gameParams = "9") - val (gamePanel) = setUpGamePanel(game, 3) - val (winner, loser) = createPlayers() val resignee = insertPlayer(strategy = "") - val (ptWinner, ptResignee, ptLoser) = gamePanel.startGame(listOf(winner, resignee, loser)) + val (gamePanel, _, participants) = + setUpGamePanelAndStartGame(game, listOf(winner, resignee, loser)) + val (ptWinner, ptResignee, ptLoser) = participants gamePanel.awaitTurn(ptResignee) gamePanel.throwHumanDart(1, SegmentType.OUTER_SINGLE) diff --git a/src/test/kotlin/dartzee/e2e/TestResizeE2E.kt b/src/test/kotlin/dartzee/e2e/TestResizeE2E.kt index 70662744..fc206444 100644 --- a/src/test/kotlin/dartzee/e2e/TestResizeE2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestResizeE2E.kt @@ -18,10 +18,9 @@ class TestResizeE2E : AbstractE2ETest() { val aiModel = beastDartsModel() val player = insertPlayer(model = aiModel) - val (gamePanel, listener) = setUpGamePanel(game) + val (gamePanel, listener) = setUpGamePanelAndStartGame(game, listOf(player)) gamePanel.setSize(300, 675) gamePanel.preferredSize = Dimension(300, 675) - gamePanel.startGame(listOf(player)) awaitGameFinish(game) diff --git a/src/test/kotlin/dartzee/e2e/TestRoundTheClockE2E.kt b/src/test/kotlin/dartzee/e2e/TestRoundTheClockE2E.kt index 493206d3..1fa657a5 100644 --- a/src/test/kotlin/dartzee/e2e/TestRoundTheClockE2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestRoundTheClockE2E.kt @@ -85,8 +85,6 @@ class TestRoundTheClockE2E : AbstractE2ETest() { gameParams = RoundTheClockConfig(ClockType.Standard, false).toJson() ) - val (gamePanel, listener) = setUpGamePanel(game) - val expectedRounds = listOf( listOf( @@ -124,7 +122,7 @@ class TestRoundTheClockE2E : AbstractE2ETest() { val aiModel = predictableDartsModel(aimDarts, mercyThreshold = 7) val player = makePlayerWithModel(aiModel) - gamePanel.startGame(listOf(player)) + val (gamePanel, listener) = setUpGamePanelAndStartGame(game, listOf(player)) awaitGameFinish(game) verifyState(gamePanel, listener, expectedRounds, scoreSuffix = " Darts", finalScore = 24) @@ -145,7 +143,6 @@ class TestRoundTheClockE2E : AbstractE2ETest() { gameType = GameType.ROUND_THE_CLOCK, gameParams = RoundTheClockConfig(ClockType.Standard, true).toJson() ) - val (gamePanel, listener) = setUpGamePanel(game) val p1Rounds = listOf( @@ -191,6 +188,7 @@ class TestRoundTheClockE2E : AbstractE2ETest() { val p2 = makePlayerWithModel(p2Model, name = "Lynn", image = "BaboTwo") val participants = prepareParticipants(game.rowId, listOf(p1, p2), true) + val (gamePanel, listener) = setUpGamePanel(game, participants) gamePanel.startNewGame(participants) awaitGameFinish(game) diff --git a/src/test/kotlin/dartzee/e2e/TestX01E2E.kt b/src/test/kotlin/dartzee/e2e/TestX01E2E.kt index dda36f3e..4661e90f 100644 --- a/src/test/kotlin/dartzee/e2e/TestX01E2E.kt +++ b/src/test/kotlin/dartzee/e2e/TestX01E2E.kt @@ -97,8 +97,6 @@ class TestX01E2E : AbstractE2ETest() { gameParams = X01Config(101, FinishType.Any).toJson() ) - val (gamePanel) = setUpGamePanel(game, 2) - val p1Rounds = listOf( listOf(makeDart(20, 3), makeDart(20, 1), makeDart(20, 1)), // 1 @@ -119,7 +117,8 @@ class TestX01E2E : AbstractE2ETest() { val p2Model = predictableDartsModel(p2Rounds.flatten().map { it.toAimDart() }) val p2 = makePlayerWithModel(p2Model, "Jeff") - val (pt1, pt2) = gamePanel.startGame(listOf(p1, p2)) + val (_, _, participants) = setUpGamePanelAndStartGame(game, listOf(p1, p2)) + val (pt1, pt2) = participants awaitGameFinish(game) waitForAssertion { pt2.participant.finalScore shouldBeGreaterThan -1 } @@ -169,8 +168,6 @@ class TestX01E2E : AbstractE2ETest() { gameParams = X01Config(301, FinishType.Doubles).toJson() ) - val (gamePanel, listener) = setUpGamePanel(game) - val expectedRounds = listOf( listOf(makeDart(20, 3), makeDart(20, 3), makeDart(20, 3)), // 121 @@ -186,7 +183,7 @@ class TestX01E2E : AbstractE2ETest() { val aiModel = predictableDartsModel(aimDarts, mercyThreshold = 7) val player = makePlayerWithModel(aiModel) - gamePanel.startGame(listOf(player)) + val (gamePanel, listener) = setUpGamePanelAndStartGame(game, listOf(player)) awaitGameFinish(game) verifyState(gamePanel, listener, expectedRounds, scoreSuffix = " Darts", finalScore = 19) @@ -206,7 +203,6 @@ class TestX01E2E : AbstractE2ETest() { @Test fun `E2E - 501 - Team of 2`() { val game = insertGame(gameType = GameType.X01, gameParams = DEFAULT_X01_CONFIG.toJson()) - val (gamePanel, listener) = setUpGamePanel(game) val p1Rounds = listOf( @@ -239,6 +235,7 @@ class TestX01E2E : AbstractE2ETest() { val p2 = makePlayerWithModel(p2Model, name = "Lynn", image = "BaboTwo") val participants = prepareParticipants(game.rowId, listOf(p1, p2), true) + val (gamePanel, listener) = setUpGamePanel(game, participants) gamePanel.startNewGame(participants) awaitGameFinish(game) diff --git a/src/test/kotlin/dartzee/screen/game/TestDartsGameScreen.kt b/src/test/kotlin/dartzee/screen/game/TestDartsGameScreen.kt index 9d82ff4b..cbf3d187 100644 --- a/src/test/kotlin/dartzee/screen/game/TestDartsGameScreen.kt +++ b/src/test/kotlin/dartzee/screen/game/TestDartsGameScreen.kt @@ -13,16 +13,20 @@ class TestDartsGameScreen : AbstractTest() { @Test fun `Should initialise correctly`() { val game = insertGame() - val scrn = DartsGameScreen(game, 4) + val scrn = + DartsGameScreen( + game, + listOf(makeSingleParticipant(), makeSingleParticipant(), makeSingleParticipant()) + ) ScreenCache.getDartsGameScreen(game.rowId) shouldBe scrn - scrn.title shouldBe "Game #${game.localId} (501 - 4 players)" + scrn.title shouldBe "Game #${game.localId} (501 - 3 players)" } @Test fun `Should pass through to its gamePanel`() { val game = insertGame() - val scrn = DartsGameScreen(game, 4) + val scrn = DartsGameScreen(game, listOf(makeSingleParticipant())) scrn.gamePanel = mockk(relaxed = true)