Files
flippr-game/PlayerState.py
2022-02-21 23:18:33 +01:00

246 lines
7.2 KiB
Python

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