oldschool-toontown/toontown/ai/HolidayInfo.py
2024-07-14 15:28:28 -05:00

264 lines
9.7 KiB
Python

#################################################################
# File: HolidayInfo.py
# Purpose: Coming Soon...
#################################################################
#################################################################
# Python Specific Modules
#################################################################
import random
import time
#################################################################
# Global Methods
#################################################################
#############################################################
# Method: cmpTime
# Purpose: This method is used when sorting a list based
# on two time tuples. For the HolidayInfo tuples,
# we would like the list of tuples to be ordered
# in a chronological sequence for easy of transition
# from one holiday date to the next.
# Input: None
# Output: returns the comparison value
#############################################################
def cmpDates(tuple1, tuple2):
numValues = len(tuple1)
for i in range(numValues):
if tuple1[i] > tuple2[i]:
return 1
elif tuple1[i] < tuple2[i]:
return -1
return 0
#################################################################
# Class: ModfiedIter
# Purpose: The python iterator only allows one to go forward
# and ends
# NOTE: Implementation for this will likely change so that it
# will handle removals from the sequence gracefully. This
# currently does not do so.
#################################################################
class ModifiedIter:
def __init__(self, seq):
self._seq = seq
self._idx = 0
self._storedIndex = 0
#############################################################
# Method: current
# Purpose: This method returns the current element that the
# iterator references.
# Input: None
# Output: returns the current element
#############################################################
def current(self):
try:
return self._seq[self._idx]
except IndexError:
raise StopIteration
#############################################################
# Method: next
# Purpose: This method emulates the python next method in that
# it updates the reference to the next element in
# the sequence. Unlike the python next method, it
# wraps around the sequence.
# Input: None
# Output: returns the new current element
#############################################################
def __next__(self):
try:
lastIdx = len(self._seq) - 1
self._idx = ((lastIdx == self._idx) and [0] or [self._idx+1])[0]
return self._seq[self._idx]
except IndexError:
raise StopIteration
#############################################################
# Method: prev
# Purpose: This method is similar to the python next method
# except that it updates the reference to the previous
# element in the sequence. This method wraps around
# around the sequence.
# Input: None
# Output: returns the new current element
#############################################################
def prev(self):
try:
lastIdx = len(self._seq) - 1
self._idx = ((self._idx == 0) and [lastIdx] or [self._idx-1])[0]
return self._seq[self._idx]
except IndexError:
raise StopIteration
#############################################################
# Method: peekNext
# Purpose: This method provides a look at functionality to
# see the next element in the list.
# Input: None
# Output: returns the next element
#############################################################
def peekNext(self):
try:
idx = self._idx
lastIdx = len(self._seq) - 1
idx = ((lastIdx == idx) and [0] or [idx+1])[0]
return self._seq[idx]
except:
raise StopIteration
#############################################################
# Method: peekPrev
# Purpose: This method provides a look at functionality to
# see the previous element in the list.
# Input: None
# Output: returns the next element
#############################################################
def peekPrev(self):
try:
idx = self._idx
lastIdx = len(self._seq) - 1
idx = ((idx == 0) and [lastIdx] or [idx-1])[0]
return self._seq[idx]
except IndexError:
raise StopIteration
#############################################################
# Method: setTo
# Purpose: This method sets the iterator to a known element
# Input: an element
# Output: true if element was found, false otherwise
#############################################################
def setTo(self, element):
try:
index = self._seq.index(element)
self._idx = index
return True
except ValueError:
return False
#############################################################
# Method: store
# Purpose: This method stores the iterator state
# Input: None
# Output: None
#############################################################
def store(self):
self._storedIndex = self._idx
#############################################################
# Method: store
# Purpose: This method restores the iterator state
# Input: None
# Output: None
#############################################################
def restore(self):
self._idx = self._storedIndex
#################################################################
# Class: HolidayInfo_Base
# Purpose: A Base Class for all derived.
#################################################################
class HolidayInfo_Base:
#############################################################
# Method: __init__
# Purpose: Provides initial construction of the HolidayInfo
# instance.
# Input: holidayClass - class type of the holiday, for
# instance - Fireworks.
# Output: None
#############################################################
def __init__(self, holidayClass, displayOnCalendar):
self.__holidayClass = holidayClass
self.tupleList = []
self.currElemIter = ModifiedIter(self.tupleList)
self.displayOnCalendar = displayOnCalendar
#############################################################
# Method: getClass
# Purpose: This method returns the class type of the
# Holiday.
# Input: None
# Output: returns Holiday Class Type
#############################################################
def getClass(self):
return self.__holidayClass
#############################################################
# Method: getStartTime
# Purpose: This method returns the current start time of
# the holiday.
# Input: date - the current date represented as a tuple
# Output: returns current start time
#############################################################
def getStartTime(self, date):
startTuple = self.currElemIter.current()[0]
return self.getTime(date, startTuple)
#############################################################
# Method: getEndTime
# Purpose: This method returns the current end time of
# the holiday.
# Input: date - the current date represented as a tuple
# Output: returns current end time
#############################################################
def getEndTime(self, date):
endTuple = self.currElemIter.current()[1]
return self.getTime(date, endTuple)
#############################################################
# Method: getDate
# Purpose: This method returns the current date in a known format
# Input: None
# Output: date represented as a tuple
#############################################################
def getDate(self):
localtime = time.localtime()
date = (localtime[0], # Year
localtime[1], # Month
localtime[2], # Day
localtime[6]) # WDay
return date
#############################################################
# Method: getTime
# Purpose: This method returns the time based on the supplied
# date and t.
# Input: date - the current date represented as a tuple
# t - the current time tuple
# Output: returns the time in secs based on date and t
#############################################################
def getTime(self, date, t):
return time.mktime((date[0],
date[1],
date[2],
t[0],
t[1],
t[2],
0,
0,
-1))
#############################################################
# Method: getNumHolidays
# Purpose: This method returns the number of dates on which
# the holiday will be played.
# Input: None
# Output: returns the number of dates
#############################################################
def getNumHolidays(self):
return len(self.tupleList)
def hasPhaseDates(self):
"""Returns true if the holiday ramps us over time to several different phases."""
return False
def getPhaseDates(self):
"""Used when the holiday ramps us over time to several different phases.
Returns None when the holiday does not use phases"""
return None