open-toontown/toontown/ai/HolidayInfoOncely.py

167 lines
6.8 KiB
Python

#################################################################
# File: HolidayInfoOncely.py
#################################################################
#################################################################
# Toontown Specific Modules
#################################################################
from toontown.ai.HolidayInfo import *
#################################################################
# Python Specific Modules
#################################################################
import time
import datetime
#################################################################
# Class: HolidayInfo_Oncely
# Purpose: Stores all relevant information regarding an event,
# such as the type of event.
#################################################################
class HolidayInfo_Oncely(HolidayInfo_Base):
#############################################################
# Method: __init__
# Purpose: Provides initial construction of the Oncely Holiday
# Info object. This type of holiday only happens once!
#
# Input: holidayClass - class type of the holiday, for
# instance - Fireworks.
# dateDict - a dictionary containing the Months,
# which each have a dictionary of days with
# their corresponding times.
# { Month.JULY: {31: [((9, 0, 0), (12, 0, 0))]} }
# Holiday starts at 9am PST and ends at
# 12pm PST on July 31st of Every Year.
# Output: None
############################################################
def __init__(self, holidayClass, dateList, displayOnCalendar, phaseDates = None, testHolidays = None):
"""Phase dates adds a way for a ramping up holiday to go to the next phase."""
# I briefly considered putting phase dates in the definition of the HolidayAI class
# but then that would put when it starts, and the different phase times in two
# separate files. This feels much safer.
# Implicit in this definition, if a holiday has 1 phase date, there are 2 phases
HolidayInfo_Base.__init__(self, holidayClass, displayOnCalendar)
dateElemIter = ModifiedIter(dateList)
for i in range(len(dateList)//2):
start = dateElemIter.current()
end = dateElemIter.next()
self.tupleList.append((start, end))
dateElemIter.next()
self.tupleList.sort(key=lambda dateElem: (dateElem[0], dateElem[1]))
self.phaseDates = None
self.curPhase = 0
if phaseDates:
self.processPhaseDates(phaseDates)
self.testHolidays = testHolidays
#############################################################
# Method: getTime
# Purpose: This method returns the time. Overrides the base
# definiton of HolidayInfo.
# Input: date - the current date represented as a tuple
# Output: returns the time in secs based on date and t
#############################################################
def getTime(self, date, t):
# t is of the form (year, month, day, hour, min, sec)
# date is of the form (year, month, day, weekday) - not used in this class
return time.mktime((t[0], # year
t[1], # month
t[2], # day
t[3], # hour
t[4], # second
t[5], # minute
0,
0,
-1))
#############################################################
# Method: getNextHolidayTime
# Purpose: This type of holiday only happens once, so just return None
#
# Input: currTime - current time
# Output: returns the next start time of the holiday
#############################################################
def getNextHolidayTime(self, currTime):
"""
Purpose: This method finds the next appropriate time to
start this holiday. It searches through the list
of time tuples, and performs the necessary
computations for finding the time.
Input: currTime - current time
Output: returns the next start time of the holiday, could be None
"""
result = None
for i in range(len(self.tupleList)):
if i == 0:
# we need to setup currElem properly if we start
# in the middle of a oncely holiday with multiple starts
self.currElemIter.setTo(self.tupleList[0])
startTuple = self.tupleList[i][0]
endTuple = self.tupleList[i][1]
startNextTime = self.getTime(None, startTuple)
endNextTime = self.getTime(None, endTuple)
if startNextTime <= currTime and \
currTime <= endNextTime:
# we are between a start time and end time tuple
# start it now
result = currTime
break;
if currTime < startNextTime and \
currTime < endNextTime:
# we are waiting for the next pair of start,end times to arrive
result = startNextTime
break;
self.currElemIter.next()
return result
#############################################################
# Method: adjustDate
# Purpose: This method adjusts the current day by a year. This
# is typically called when an end time is less than
# a start time.
# Input: date - the date that needs to be adjusted
# Output: None
#############################################################
def adjustDate(self, date):
return (date[0]+1, date[1], date[2], date[3])
def processPhaseDates(self, phaseDates):
"""Convert the phase dates into datetimes."""
self.phaseDates = []
for curDate in phaseDates:
newTime = datetime.datetime(curDate[0], curDate[1], curDate[2], curDate[3], curDate[4], curDate[5])
self.phaseDates.append(newTime)
def getPhaseDates(self):
"""Returns our phase dates, should be None if not used."""
return self.phaseDates
def hasPhaseDates(self):
"""Returns False if we don't use phase dates."""
if self.phaseDates:
return True
else:
return False
#############################################################
# Run holiday in test mode
# Used to invoke other holidays for debugging purposes
#############################################################
def isTestHoliday(self):
""" Returns true if running the holiday in test mode """
if self.testHolidays:
return True
else:
return False
def getTestHolidays(self):
return self.testHolidays