From 4da7a3110d0556116abfac08011432ef5ab82d88 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Wed, 31 Aug 2022 14:50:11 +0200 Subject: [PATCH] Add replay ball --- GameState.py | 26 +++++++++++++++++++++++++- PlayerState.py | 29 ++++++++++++++++++++++++++--- config.py | 1 + events/EndBallEvent.py | 3 +-- events/EndGameEvent.py | 16 ---------------- factories/EventFactory.py | 1 - factories/GameFactory.py | 16 +++++++++++----- 7 files changed, 64 insertions(+), 28 deletions(-) delete mode 100644 events/EndGameEvent.py diff --git a/GameState.py b/GameState.py index 987fc55..9da0c65 100644 --- a/GameState.py +++ b/GameState.py @@ -14,8 +14,8 @@ class GameState: def __init__(self, playerStateFactory, highscore, specialDisplay, currentPlayerID = 0): CREDIT.activate() + self.highscore = highscore self.playerStateFactory = playerStateFactory - #self.players = cycle(players) self.dummyPlayer = playerStateFactory.createDummyPlayerState() self._currentPlayer = self.dummyPlayer self.gameStateID = currentPlayerID @@ -34,6 +34,23 @@ class GameState: logging.info("Game Started") + def endGame(self): + self.writeHighscore() + self.players = None + self.isPlaying = False + self.isStarted = False + logging.info("Game ended") + + def startIdleLoop(self): + pass + + def stopIdleLoop(self): + pass + + def idleLoop(self): + + pass + def createPlayers(self, playerCount): players = [] for i in range(playerCount): @@ -56,3 +73,10 @@ class GameState: self._currentPlayer = player + def writeHighscore(self): + for player in self.players: + if player.hasHighscore: + with open(config.HIGHSCORE_FILE, "w+") as file: + file.seek(0) + file.truncate() + file.write(player.score) \ No newline at end of file diff --git a/PlayerState.py b/PlayerState.py index 3f015d3..35a0c7d 100644 --- a/PlayerState.py +++ b/PlayerState.py @@ -21,6 +21,8 @@ from solenoids.BottomLeftBankSolenoid import BottomLeftBankSolenoid from solenoids.BottomRightBankSolenoid import BottomRightBankSolenoid from solenoids.TopCentralBankSolenoid import TopCentralBankSolenoid +from solenoids.MainFlipper import MainFlipper + TUNNEL_SCORES = [20000, 30000, 50000] BONUS_MULTIPLIER = [1, 10, 20, 50] UPPER_PLAYFIELD_TIME = [5, 10, 20, 30] @@ -46,9 +48,9 @@ class PlayerState: tunnelScore = 0 tunnelLit = 0 ballsLeft = 0 - replayBall = False hasBallScored = False isActive = False + hasHighscore = False redSpecial = 0 redSpecialLit = False @@ -66,6 +68,10 @@ class PlayerState: upperPlayfieldTimeIter = iter(UPPER_PLAYFIELD_TIME) upperPlayfieldTime = 0 + replayBall = False + bonusTime = config.BEGINNING_BONUS_TIME + replayBallTimer = None + def __init__(self, display, specialDisplay, id, ballsToPlay, banks): self.banks = banks self.display = display @@ -76,8 +82,6 @@ class PlayerState: self.enableTiming() - self.bonusTime = config.BEGINNING_BONUS_TIME - self.specialDisplay.printBallsToPlay(self.ballsLeft) self.specialDisplay.printGameTimeBonus(self.bonusTime) @@ -286,7 +290,26 @@ class PlayerState: def setReplayBall(self): if not self.isActive: return + self.replayBall = True + self.replayBallTimer = Timer(interval=1, function=self.updateReplayBall) + + def updateReplayBall(self): + self.bonusTime -= 1 + self.printSpecial() + + if self.bonusTime == 0: + self.stopReplayBall() + return + + self.replayBallTimer = Timer(interval = 1, function=self.updateReplayBall) + def stopReplayBall(self): + if not self.isActive: + return + + self.replayBall = False + self.replayBallTimer = None + MainFlipper().deactivate() def addPoints(self, points): if points == 0: diff --git a/config.py b/config.py index 1fb5d92..8231f97 100644 --- a/config.py +++ b/config.py @@ -34,3 +34,4 @@ NETWORK_SLEEP_TIME_SECONDS = 0.1 BANK_SLEEP_TIME = 0.1 BONUS_SLEEP_TIME = 0.1 PLAYER_CHOOSE_INTERVAL = 2 +HIGHSCORE_FILE = "./high.score" diff --git a/events/EndBallEvent.py b/events/EndBallEvent.py index 2240100..e40ed11 100644 --- a/events/EndBallEvent.py +++ b/events/EndBallEvent.py @@ -1,7 +1,6 @@ import config from Event import Event -from events.EndGameEvent import EndGameEvent from events.StartBallEvent import StartBallEvent from solenoids.MainFlipper import MainFlipper @@ -33,7 +32,7 @@ class EndBallEvent(Event): self.gameState.currentPlayer.deactivate() if self.gameState.currentPlayer.ballsLeft == 0 and self.gameState.currentPlayer.id == config.MAX_PLAYERS - 1: - EndGameEvent().trigger(None) + self.gameState.endGame() return self.gameState.nextPlayer() diff --git a/events/EndGameEvent.py b/events/EndGameEvent.py deleted file mode 100644 index f41f6f6..0000000 --- a/events/EndGameEvent.py +++ /dev/null @@ -1,16 +0,0 @@ -from Event import Event -from solenoids.MainFlipper import MainFlipper -from solenoids.TopFlipper import TopFlipper - -#todo temporary -import sys - -class EndGameEvent(Event): - def __init__(self): - super().__init__("End Game Event") - - def trigger(self, target): - super().trigger(target) - MainFlipper().deactivate() - TopFlipper().deactivate() - #sys.exit(0) \ No newline at end of file diff --git a/factories/EventFactory.py b/factories/EventFactory.py index 21d6881..b9fdceb 100644 --- a/factories/EventFactory.py +++ b/factories/EventFactory.py @@ -7,7 +7,6 @@ from events.LeftFlapEvent import LeftFlapEvent from events.RightKickerEvent import RightKickerEvent from events.EnterUpperPlayfieldEvent import EnterUpperPlayfieldEvent from events.StartGameEvent import StartGameEvent -from events.EndGameEvent import EndGameEvent from events.StartBallEvent import StartBallEvent from events.BottomRightBankEvent import BottomRightBankEvent from events.BottomLeftBankEvent import BottomLeftBankEvent diff --git a/factories/GameFactory.py b/factories/GameFactory.py index 2241473..b6e2e96 100644 --- a/factories/GameFactory.py +++ b/factories/GameFactory.py @@ -1,3 +1,4 @@ +import config from __main__ import networking from factories.PlayerStateFactory import PlayerStateFactory @@ -29,15 +30,20 @@ class GameFactory: PLAYER_LAMPS.activateNext() + def getHighScore(self): + with open(config.HIGHSCORE_FILE, "rw+") as file: + score_str = file.readline() + + if score_str == "": + score_str = "0" + + return int(score_str) + def createGame(self): inputHandler = InputHandler(self.targets) - gameState = GameState(self.playerStateFactory, self.getHighScore(), self.specialDisplay) eventFactory = EventFactory(self.targets, gameState) events = eventFactory.allEvents() - return Game(inputHandler, gameState, events) - - def getHighScore(self): # todo - return 0 \ No newline at end of file + return Game(inputHandler, gameState, events) \ No newline at end of file