Add replay ball

This commit is contained in:
Jonas Zeunert
2022-08-31 14:50:11 +02:00
parent 401b3a332b
commit 4da7a3110d
7 changed files with 64 additions and 28 deletions

View File

@@ -14,8 +14,8 @@ class GameState:
def __init__(self, playerStateFactory, highscore, specialDisplay, currentPlayerID = 0): def __init__(self, playerStateFactory, highscore, specialDisplay, currentPlayerID = 0):
CREDIT.activate() CREDIT.activate()
self.highscore = highscore
self.playerStateFactory = playerStateFactory self.playerStateFactory = playerStateFactory
#self.players = cycle(players)
self.dummyPlayer = playerStateFactory.createDummyPlayerState() self.dummyPlayer = playerStateFactory.createDummyPlayerState()
self._currentPlayer = self.dummyPlayer self._currentPlayer = self.dummyPlayer
self.gameStateID = currentPlayerID self.gameStateID = currentPlayerID
@@ -34,6 +34,23 @@ class GameState:
logging.info("Game Started") 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): def createPlayers(self, playerCount):
players = [] players = []
for i in range(playerCount): for i in range(playerCount):
@@ -56,3 +73,10 @@ class GameState:
self._currentPlayer = player 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)

View File

@@ -21,6 +21,8 @@ from solenoids.BottomLeftBankSolenoid import BottomLeftBankSolenoid
from solenoids.BottomRightBankSolenoid import BottomRightBankSolenoid from solenoids.BottomRightBankSolenoid import BottomRightBankSolenoid
from solenoids.TopCentralBankSolenoid import TopCentralBankSolenoid from solenoids.TopCentralBankSolenoid import TopCentralBankSolenoid
from solenoids.MainFlipper import MainFlipper
TUNNEL_SCORES = [20000, 30000, 50000] TUNNEL_SCORES = [20000, 30000, 50000]
BONUS_MULTIPLIER = [1, 10, 20, 50] BONUS_MULTIPLIER = [1, 10, 20, 50]
UPPER_PLAYFIELD_TIME = [5, 10, 20, 30] UPPER_PLAYFIELD_TIME = [5, 10, 20, 30]
@@ -46,9 +48,9 @@ class PlayerState:
tunnelScore = 0 tunnelScore = 0
tunnelLit = 0 tunnelLit = 0
ballsLeft = 0 ballsLeft = 0
replayBall = False
hasBallScored = False hasBallScored = False
isActive = False isActive = False
hasHighscore = False
redSpecial = 0 redSpecial = 0
redSpecialLit = False redSpecialLit = False
@@ -66,6 +68,10 @@ class PlayerState:
upperPlayfieldTimeIter = iter(UPPER_PLAYFIELD_TIME) upperPlayfieldTimeIter = iter(UPPER_PLAYFIELD_TIME)
upperPlayfieldTime = 0 upperPlayfieldTime = 0
replayBall = False
bonusTime = config.BEGINNING_BONUS_TIME
replayBallTimer = None
def __init__(self, display, specialDisplay, id, ballsToPlay, banks): def __init__(self, display, specialDisplay, id, ballsToPlay, banks):
self.banks = banks self.banks = banks
self.display = display self.display = display
@@ -76,8 +82,6 @@ class PlayerState:
self.enableTiming() self.enableTiming()
self.bonusTime = config.BEGINNING_BONUS_TIME
self.specialDisplay.printBallsToPlay(self.ballsLeft) self.specialDisplay.printBallsToPlay(self.ballsLeft)
self.specialDisplay.printGameTimeBonus(self.bonusTime) self.specialDisplay.printGameTimeBonus(self.bonusTime)
@@ -286,7 +290,26 @@ class PlayerState:
def setReplayBall(self): def setReplayBall(self):
if not self.isActive: if not self.isActive:
return return
self.replayBall = True 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): def addPoints(self, points):
if points == 0: if points == 0:

View File

@@ -34,3 +34,4 @@ NETWORK_SLEEP_TIME_SECONDS = 0.1
BANK_SLEEP_TIME = 0.1 BANK_SLEEP_TIME = 0.1
BONUS_SLEEP_TIME = 0.1 BONUS_SLEEP_TIME = 0.1
PLAYER_CHOOSE_INTERVAL = 2 PLAYER_CHOOSE_INTERVAL = 2
HIGHSCORE_FILE = "./high.score"

View File

@@ -1,7 +1,6 @@
import config import config
from Event import Event from Event import Event
from events.EndGameEvent import EndGameEvent
from events.StartBallEvent import StartBallEvent from events.StartBallEvent import StartBallEvent
from solenoids.MainFlipper import MainFlipper from solenoids.MainFlipper import MainFlipper
@@ -33,7 +32,7 @@ class EndBallEvent(Event):
self.gameState.currentPlayer.deactivate() self.gameState.currentPlayer.deactivate()
if self.gameState.currentPlayer.ballsLeft == 0 and self.gameState.currentPlayer.id == config.MAX_PLAYERS - 1: if self.gameState.currentPlayer.ballsLeft == 0 and self.gameState.currentPlayer.id == config.MAX_PLAYERS - 1:
EndGameEvent().trigger(None) self.gameState.endGame()
return return
self.gameState.nextPlayer() self.gameState.nextPlayer()

View File

@@ -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)

View File

@@ -7,7 +7,6 @@ from events.LeftFlapEvent import LeftFlapEvent
from events.RightKickerEvent import RightKickerEvent from events.RightKickerEvent import RightKickerEvent
from events.EnterUpperPlayfieldEvent import EnterUpperPlayfieldEvent from events.EnterUpperPlayfieldEvent import EnterUpperPlayfieldEvent
from events.StartGameEvent import StartGameEvent from events.StartGameEvent import StartGameEvent
from events.EndGameEvent import EndGameEvent
from events.StartBallEvent import StartBallEvent from events.StartBallEvent import StartBallEvent
from events.BottomRightBankEvent import BottomRightBankEvent from events.BottomRightBankEvent import BottomRightBankEvent
from events.BottomLeftBankEvent import BottomLeftBankEvent from events.BottomLeftBankEvent import BottomLeftBankEvent

View File

@@ -1,3 +1,4 @@
import config
from __main__ import networking from __main__ import networking
from factories.PlayerStateFactory import PlayerStateFactory from factories.PlayerStateFactory import PlayerStateFactory
@@ -29,15 +30,20 @@ class GameFactory:
PLAYER_LAMPS.activateNext() 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): def createGame(self):
inputHandler = InputHandler(self.targets) inputHandler = InputHandler(self.targets)
gameState = GameState(self.playerStateFactory, self.getHighScore(), self.specialDisplay) gameState = GameState(self.playerStateFactory, self.getHighScore(), self.specialDisplay)
eventFactory = EventFactory(self.targets, gameState) eventFactory = EventFactory(self.targets, gameState)
events = eventFactory.allEvents() events = eventFactory.allEvents()
return Game(inputHandler, gameState, events) return Game(inputHandler, gameState, events)
def getHighScore(self): # todo
return 0