from threading import Timer from utils.RepeatTimer import RepeatTimer import time import random import config from lamps.Lamp import Lamp from lamps.LampGroup import CHAMP_LAMPS from lamps.LampGroup import UPPER_PLAYFIELD_TIME_LAMPS from lamps.LampGroup import TUNNEL_LAMPS from lamps.LampGroup import BONUS_MULTIPLIER_LAMPS from lamps.LampGroup import BONUS_LAMPS from events.LeaveUpperPlayfieldEvent import LeaveUpperPlayfieldEvent class PlayerState: display = None specialDisplay = None id = 0 points = 0 bonus = 0 bonusMultiplier = 1 ballsLeft = 0 replayBall = False hasBallScored = False redSpecial = 0 redSpecialLit = False orangeSpecialLeft = False orangeSpecialRight = False orangeSpecialLit = False advanceTimeLeft = False advanceTimeRight = False timeAdvanceLeftTimer = None timeAdvanceRightTimer = None upperPlayfieldTimer = None upperPlayfieldTime = 0 def __init__(self, display, specialDisplay, id, ballsToPlay): self.display = display self.specialDisplay = specialDisplay self.id = id self.points = 0 self.ballsLeft = ballsToPlay self.enableTiming() self.bonusTime = config.BEGINNING_BONUS_TIME self.reset() def enableTiming(self): if config.BONUS_TIME_ALGORITHM == config.BONUS_TIME_ALGORITHM_OPTIONS.RANDOM: self.disableAdvanceTimeLeft() self.disableAdvanceTimeRight() self.timeAdvanceLeft() self.timeAdvanceRight() elif config.BONUS_TIME_ALGORITHM == config.BONUS_TIME_ALGORITHM_OPTIONS.ALWAYS: self.enableAdvanceTimeLeft() self.enableAdvanceTimeRight() def timeAdvanceLeft(self): choiceList = [True] * int(config.BONUS_TIME_ACTIVATION_PROBABILITY * 100) \ + [False] * int((1 - config.BONUS_TIME_ACTIVATION_PROBABILITY) * 100) if random.choice(choiceList): self.enableAdvanceTimeLeft() else: self.disableAdvanceTimeLeft() activationTime = random.randrange(config.BONUS_TIME_MIN_RANDOM_TIME, config.BONUS_TIME_MAX_RANDOM_TIME) self.timeAdvanceLeftTimer = Timer(activationTime, self.timeAdvanceLeft) def timeAdvanceRight(self): choiceList = [True] * int(config.BONUS_TIME_ACTIVATION_PROBABILITY * 100) \ + [False] * int((1 - config.BONUS_TIME_ACTIVATION_PROBABILITY) * 100) if random.choice(choiceList): self.enableAdvanceTimeRight() else: self.disableAdvanceTimeRight() activationTime = random.randrange(config.BONUS_TIME_MIN_RANDOM_TIME, config.BONUS_TIME_MAX_RANDOM_TIME) self.timeAdvanceLeftTimer = Timer(activationTime, self.timeAdvanceRight) def enableAdvanceTimeLeft(self): self.advanceTimeLeft = True Lamp("Left Advance Time").activate() def disableAdvanceTimeLeft(self): self.advanceTimeLeft = False Lamp("Left Advance Time").deactivate() def enableAdvanceTimeRight(self): self.advanceTimeRight = True Lamp("Right Advance Time").activate() def disableAdvanceTimeRight(self): self.advanceTimeRight = False Lamp("Right Advance Time").deactivate() def reset(self): self.upperPlayfieldTimer = None self.upperPlayfieldTime = config.BEGINNING_UPPER_PLAYFIELD_TIME self.replayBall = False self.hasBallScored = False self.resetBonus() self.resetTargets() def resetBonus(self): self.bonus = 0 self.bonusMultiplier = 1 BONUS_LAMPS.deactivate() BONUS_MULTIPLIER_LAMPS.deactivate() def resetTargets(self): self.resetRedSpecial() self.resetOrangeSpecial() self.resetTunnel() def resetRedSpecial(self): self.redSpecial = 0 self.redSpecialLit = False Lamp("Special Red").deactivate() CHAMP_LAMPS.deactivate() def resetOrangeSpecial(self): self.orangeSpecialLeft = False self.orangeSpecialRight = False self.orangeSpecialLit = False Lamp("Special Orange").deactivate() def resetTunnel(self): self.tunnelLit = 0 TUNNEL_LAMPS.deactivate() def advanceRightOrangeSpecial(self): self.orangeSpecialRight = True self.setOrangeSpecialLit() def advanceLeftOrangeSpecial(self): self.orangeSpecialLeft = True self.setOrangeSpecialLit() def setOrangeSpecialLit(self): if config.ORANGE_SPECIAL_BANK_OPTIONS == config.ORANGE_SPECIAL_BANK_OPTIONS.ONE: self.orangeSpecialLit = self.orangeSpecialRight or self.orangeSpecialLeft elif config.ORANGE_SPECIAL_BANK == config.ORANGE_SPECIAL_BANK_OPTIONS.BOTH: self.orangeSpecialLit = self.orangeSpecialRight and self.orangeSpecialLeft if self.orangeSpecialLit: Lamp("Special Orange").activate() def advanceRedSpecial(self): self.redSpecial += 1 CHAMP_LAMPS.activateNext() if(self.redSpecial == config.RED_SPECIAL_TIMES): self.redSpecialLit = True Lamp("Special Red").activate() def advanceTunnel(self): if self.tunnelLit >= 5: return self.tunnelLit += 1 TUNNEL_LAMPS.activateNext() def advanceBonus(self): if self.bonus >= 20: return self.bonus += 1 BONUS_LAMPS.activateNext() def advanceBonusMultiplier(self): if self.bonusMultiplier >= 50: return if self.bonusMultiplier == 1: self.bonusMultiplier = 10 elif self.bonusMultiplier == 10: self.bonusMultiplier = 20 elif self.bonusMultiplier == 20: self.bonusMultiplier == 50 #todo BONUS_MULTIPLIER_LAMPS.activateNext() def setReplayBall(self): self.replayBall = True def addPoints(self, points): if not self.hasBallScored: self.hasBallScored = True self.points += points self.display.printScore(self.points) def addBall(self): self.ballsLeft += 1 self.specialDisplay.printBallsToPlay(self.ballsLeft) def removeBall(self): if self.ballsLeft == 0: return self.ballsLeft -= 1 self.specialDisplay.printBallsToPlay(self.ballsLeft) def advanceUpperPlayfieldTime(self): if self.upperPlayfieldTime == 0: self.upperPlayfieldTime = 5 elif self.upperPlayfieldTime == 5: self.upperPlayfieldTime = 10 elif self.upperPlayfieldTime == 10: self.upperPlayfieldTime = 20 elif self.upperPlayfieldTime == 20: self.upperPlayfieldTime = 30 UPPER_PLAYFIELD_TIME_LAMPS.activateNext() def startUpperPlayfieldTimer(self): self.upperPlayfieldTimer = Timer(1, self.updatePlayfieldTime) def updatePlayfieldTime(self): if self.upperPlayfieldTime == 0: self.upperPlayfieldTimer = None LeaveUpperPlayfieldEvent(self) return if self.upperPlayfieldTime in [0, 5, 10, 20]: UPPER_PLAYFIELD_TIME_LAMPS.deactivateCurrent() self.upperPlayfieldTime -= 1 self.upperPlayfieldTimer = Timer(1, self.updatePlayfieldTime) def addBonusTimeSecond(self): self.bonusTime += 1