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

View File

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

View File

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

View File

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

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.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

View File

@@ -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
return Game(inputHandler, gameState, events)