From 4c3aa016ba5f451b107b9c8485961da963c56666 Mon Sep 17 00:00:00 2001 From: rhetenor Date: Tue, 30 Aug 2022 17:06:25 +0200 Subject: [PATCH] Add player choosing --- GameState.py | 28 +++++++++++++++++++++++----- config.py | 2 ++ events/StartGameEvent.py | 33 +++++++++++++++++++++++++++++---- factories/GameFactory.py | 27 ++++++++------------------- factories/PlayerStateFactory.py | 9 ++++++--- lamps/LampGroup.py | 3 +++ 6 files changed, 71 insertions(+), 31 deletions(-) diff --git a/GameState.py b/GameState.py index dc83235..00130d6 100644 --- a/GameState.py +++ b/GameState.py @@ -1,24 +1,42 @@ import logging + +import config from lamps.LampGroup import PLAYER_LAMPS from lamps.Lamp import CREDIT from itertools import cycle class GameState: - def __init__(self, players, highscore, specialDisplay, dummyPlayer, currentPlayerID = 0): + players = None + credits = config.BALLS_PER_GAME + isPlaying = False + + def __init__(self, playerStateFactory, highscore, specialDisplay, currentPlayerID = 0): CREDIT.activate() - self.players = cycle(players) - self.dummyPlayer = dummyPlayer + self.playerStateFactory = playerStateFactory + #self.players = cycle(players) + self.dummyPlayer = playerStateFactory.createDummyPlayerState() self._currentPlayer = dummyPlayer self.gameStateID = currentPlayerID self.highscore = highscore - self.credits = 3 self.specialDisplay = specialDisplay self.specialDisplay.printCredits(self.credits) - self.isPlaying = False def nextPlayer(self): self.currentPlayer = next(self.players) + + def startGame(self, playerCount): self.isPlaying = True + self.createPlayers(playerCount) + self.nextPlayer() + + + def createPlayers(self, playerCount): + players = [] + for i in range(playerCount): + player = self.playerStateFactory.createPlayerState(i) + players.append(player) + + self.players = cycle(players) @property def currentPlayer(self): diff --git a/config.py b/config.py index 1f1fcec..1607a13 100644 --- a/config.py +++ b/config.py @@ -6,6 +6,7 @@ ORANGE_SPECIAL_BANK_OPTIONS = Enum("ORANGE_SPECIAL_BANK_OPTIONS", ["BOTH", "ONE" BONUS_TIME_ALGORITHM_OPTIONS = Enum("BONUS_TIME_ALGORITHM_OPTIONS", ["ALWAYS", "RANDOM"]) # Game Config +MAX_PLAYERS = 4 ## Network Config SOCKET_PATH = '/tmp' #os.environ["XDG_RUNTIME_DIR"] if os.environ["XDG_RUNTIME_DIR"] else '/tmp' INPUT_SOCKET_NAME = "/S.flippR_driver.in" @@ -30,3 +31,4 @@ MAX_NETWORK_RETRIES = 10 NETWORK_SLEEP_TIME_SECONDS = 0.1 BANK_SLEEP_TIME = 0.1 BONUS_SLEEP_TIME = 0.1 +PLAYER_CHOOSE_INTERVAL = 3 diff --git a/events/StartGameEvent.py b/events/StartGameEvent.py index fbf2ef3..0918b8e 100644 --- a/events/StartGameEvent.py +++ b/events/StartGameEvent.py @@ -1,10 +1,20 @@ from Event import Event +from events.StartBallEvent import StartBallEvent from solenoids.OutHoleSolenoid import OutHoleSolenoid from solenoids.MainFlipper import MainFlipper +from threading import Timer +import config + +from lamps.LampGroup import PLAYER_LAMPS class StartGameEvent(Event): - def __init__(self, gameState): + isPlayerChoosing = True + playerCount = 1 + timer = None + + def __init__(self, gameState, startBallEvent): + self.startBallEvent = startBallEvent self.gameState = gameState self.flipper = MainFlipper() self.outHoleSolenoid = OutHoleSolenoid() @@ -15,8 +25,23 @@ class StartGameEvent(Event): return super().trigger(target) - self.flipper.activate() - self.gameState.nextPlayer() + if not self.isPlayerChoosing: + self.timer = Timer(interval=config.PLAYER_CHOOSE_INTERVAL, function=self.player_choose_ended) + self.timer.start() + return - self.outHoleSolenoid.trigger() + if self.playerCount == config.MAX_PLAYERS: + PLAYER_LAMPS.deactivate() + PLAYER_LAMPS.activateNext() + self.playerCount = 1 + return + + PLAYER_LAMPS.activate_one(self.playerCount) + self.playerCount += 1 + + def player_choose_ended(self): + self.timer = None + PLAYER_LAMPS.deactivate() + self.gameState.startGame(self.playerCount) + StartBallEvent().trigger(None) diff --git a/factories/GameFactory.py b/factories/GameFactory.py index e34fc8b..ca6b70a 100644 --- a/factories/GameFactory.py +++ b/factories/GameFactory.py @@ -19,32 +19,21 @@ class GameFactory: self.playerCount = len(displayNames) - self.gameStateFactory = PlayerStateFactory(self.specialDisplay) + self.targets = TargetFactory.createAllTargets() + banks = [self.targets['Left Bank'], self.targets['Right Bank'], self.targets['Top Bank']] + + self.playerStateFactory = PlayerStateFactory(self.specialDisplay, banks, self.displayFactory) def createGame(self): - targets = TargetFactory.createAllTargets() - inputHandler = InputHandler(targets) + inputHandler = InputHandler(self.targets) - banks = [targets['Left Bank'], targets['Right Bank'], targets['Top Bank']] - players = self.createPlayers(banks) - dummyPlayer = self.gameStateFactory.createDummyPlayerState() + gameState = GameState(self.playerStateFactory, self.getHighScore(), self.specialDisplay, players[0].id) - gameState = GameState(players, self.getHighScore(), self.specialDisplay, dummyPlayer, players[0].id) - - eventFactory = EventFactory(targets, gameState) + eventFactory = EventFactory(self.targets, gameState) events = eventFactory.allEvents() return Game(inputHandler, gameState, events) - def createPlayers(self, banks): - players = [] - for id in range(1, self.playerCount): - display = self.displayFactory.createPlayerDisplay(id) - player = self.gameStateFactory.createPlayerState(display, id, banks) - players.append(player) - return players - def getHighScore(self): # todo - return 0 - + return 0 \ No newline at end of file diff --git a/factories/PlayerStateFactory.py b/factories/PlayerStateFactory.py index ac4ea1b..88695e7 100644 --- a/factories/PlayerStateFactory.py +++ b/factories/PlayerStateFactory.py @@ -3,11 +3,14 @@ from PlayerState import PlayerState from displays.DummyDisplay import DummyDisplay class PlayerStateFactory: - def __init__(self, specialDisplay): + def __init__(self, specialDisplay, banks, displayFactory): self.specialDisplay = specialDisplay + self.banks = banks + self.displayFactory = displayFactory - def createPlayerState(self, display, id, banks): - return PlayerState(display, self.specialDisplay, id, BALLS_PER_GAME, banks) + def createPlayerState(self, id): + display = self.displayFactory.createPlayerDisplay(id) + return PlayerState(display, self.specialDisplay, id, BALLS_PER_GAME, self.banks) def createDummyPlayerState(self): display = DummyDisplay() diff --git a/lamps/LampGroup.py b/lamps/LampGroup.py index f21c152..3a3e10c 100644 --- a/lamps/LampGroup.py +++ b/lamps/LampGroup.py @@ -19,6 +19,9 @@ class LampGroup: for lamp in self.lamps: lamp.deactivate() + def activate_one(self, id): + self.lamps[id].activate() + def activateNext(self): self.lamps[self.currentLampPtr].activate()