class DropScheduler: def __init__(self, gameDuration, firstDropDelay, dropPeriod, maxDropDuration, fasterDropDelay, fasterDropPeriodMult, startTime = None): self.gameDuration = gameDuration self.firstDropDelay = firstDropDelay self._dropPeriod = dropPeriod self.maxDropDuration = maxDropDuration self.fasterDropDelay = fasterDropDelay self.fasterDropPeriodMult = fasterDropPeriodMult if startTime is None: startTime = 0 self._startTime = startTime self.curT = self._startTime + self.firstDropDelay return def getT(self): return self.curT def getDuration(self): return self.gameDuration def getDropPeriod(self): delay = self._dropPeriod if self.curT - self._startTime >= self.fasterDropDelay: delay *= self.fasterDropPeriodMult return delay def doneDropping(self, continuous = None): landTime = self.getT() - self._startTime + self.maxDropDuration if continuous is None: continuous = False else: continuous = True if continuous: maxTime = self.gameDuration + self.maxDropDuration else: maxTime = self.gameDuration + self.getDropPeriod() return landTime >= maxTime def skipPercent(self, percent): numSkips = 0 while True: prevT = self.curT self.stepT() if self.curT >= percent * self.gameDuration: self.curT = prevT break else: numSkips += 1 return numSkips def stepT(self): self.curT += self.getDropPeriod() class ThreePhaseDropScheduler(DropScheduler): def __init__(self, gameDuration, firstDropDelay, dropPeriod, maxDropDuration, slowerDropPeriodMult, normalDropDelay, fasterDropDelay, fasterDropPeriodMult, startTime = None): self._slowerDropPeriodMult = slowerDropPeriodMult self._normalDropDelay = normalDropDelay DropScheduler.__init__(self, gameDuration, firstDropDelay, dropPeriod, maxDropDuration, fasterDropDelay, fasterDropPeriodMult, startTime) def getDropPeriod(self): delay = self._dropPeriod if self.curT - self._startTime < self._normalDropDelay: delay *= self._slowerDropPeriodMult elif self.curT - self._startTime >= self.fasterDropDelay: delay *= self.fasterDropPeriodMult return delay