124 lines
5.2 KiB
Python
124 lines
5.2 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from . import HoodDataAI, ZoneUtil
|
|
from toontown.toonbase import ToontownGlobals
|
|
from toontown.racing import DistributedStartingBlockAI
|
|
from pandac.PandaModules import *
|
|
from libtoontown import *
|
|
from toontown.racing.RaceGlobals import *
|
|
from toontown.classicchars import DistributedGoofySpeedwayAI
|
|
if __debug__:
|
|
import pdb
|
|
|
|
class GSHoodDataAI(HoodDataAI.HoodDataAI):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('GSHoodDataAI')
|
|
|
|
def __init__(self, air, zoneId=None):
|
|
hoodId = ToontownGlobals.GoofySpeedway
|
|
if zoneId == None:
|
|
zoneId = hoodId
|
|
HoodDataAI.HoodDataAI.__init__(self, air, zoneId, hoodId)
|
|
return
|
|
|
|
def startup(self):
|
|
HoodDataAI.HoodDataAI.startup(self)
|
|
self.createStartingBlocks()
|
|
self.cycleDuration = 10
|
|
self.createLeaderBoards()
|
|
self.__cycleLeaderBoards()
|
|
self.classicChar = DistributedGoofySpeedwayAI.DistributedGoofySpeedwayAI(self.air)
|
|
self.classicChar.generateWithRequired(self.zoneId)
|
|
self.classicChar.start()
|
|
self.addDistObj(self.classicChar)
|
|
messenger.send('GSHoodSpawned', [self])
|
|
|
|
def shutdown(self):
|
|
self.notify.debug('shutting down GSHoodDataAI: %s' % self.zoneId)
|
|
messenger.send('GSHoodDestroyed', [self])
|
|
HoodDataAI.HoodDataAI.shutdown(self)
|
|
|
|
def cleanup(self):
|
|
self.notify.debug('cleaning up GSHoodDataAI: %s' % self.zoneId)
|
|
taskMgr.removeTasksMatching(str(self) + '_leaderBoardSwitch')
|
|
for board in self.leaderBoards:
|
|
board.delete()
|
|
|
|
del self.leaderBoards
|
|
|
|
def createLeaderBoards(self):
|
|
self.leaderBoards = []
|
|
dnaStore = DNAStorage()
|
|
dnaData = simbase.air.loadDNAFileAI(dnaStore, simbase.air.lookupDNAFileName('goofy_speedway_sz.dna'))
|
|
if isinstance(dnaData, DNAData):
|
|
self.leaderBoards = self.air.findLeaderBoards(dnaData, self.zoneId)
|
|
for distObj in self.leaderBoards:
|
|
if distObj:
|
|
if distObj.getName().count('city'):
|
|
type = 'city'
|
|
else:
|
|
if distObj.getName().count('stadium'):
|
|
type = 'stadium'
|
|
else:
|
|
if distObj.getName().count('country'):
|
|
type = 'country'
|
|
for subscription in LBSubscription[type]:
|
|
distObj.subscribeTo(subscription)
|
|
|
|
self.addDistObj(distObj)
|
|
|
|
def __cycleLeaderBoards(self, task=None):
|
|
messenger.send('GS_LeaderBoardSwap' + str(self.zoneId))
|
|
taskMgr.doMethodLater(self.cycleDuration, self.__cycleLeaderBoards, str(self) + '_leaderBoardSwitch')
|
|
|
|
def createStartingBlocks(self):
|
|
self.racingPads = []
|
|
self.viewingPads = []
|
|
self.viewingBlocks = []
|
|
self.startingBlocks = []
|
|
self.foundRacingPadGroups = []
|
|
self.foundViewingPadGroups = []
|
|
for zone in self.air.zoneTable[self.canonicalHoodId]:
|
|
zoneId = ZoneUtil.getTrueZoneId(zone[0], self.zoneId)
|
|
dnaData = self.air.dnaDataMap.get(zone[0], None)
|
|
if isinstance(dnaData, DNAData):
|
|
area = ZoneUtil.getCanonicalZoneId(zoneId)
|
|
foundRacingPads, foundRacingPadGroups = self.air.findRacingPads(dnaData, zoneId, area)
|
|
foundViewingPads, foundViewingPadGroups = self.air.findRacingPads(dnaData, zoneId, area, type='viewing_pad')
|
|
self.racingPads += foundRacingPads
|
|
self.foundRacingPadGroups += foundRacingPadGroups
|
|
self.viewingPads += foundViewingPads
|
|
self.foundViewingPadGroups += foundViewingPadGroups
|
|
|
|
self.startingBlocks = []
|
|
for dnaGroup, distRacePad in zip(self.foundRacingPadGroups, self.racingPads):
|
|
startingBlocks = self.air.findStartingBlocks(dnaGroup, distRacePad)
|
|
self.startingBlocks += startingBlocks
|
|
for startingBlock in startingBlocks:
|
|
distRacePad.addStartingBlock(startingBlock)
|
|
|
|
for distObj in self.startingBlocks:
|
|
self.addDistObj(distObj)
|
|
|
|
for dnaGroup, distViewPad in zip(self.foundViewingPadGroups, self.viewingPads):
|
|
viewingBlocks = self.air.findStartingBlocks(dnaGroup, distViewPad)
|
|
self.viewingBlocks += viewingBlocks
|
|
for viewingBlock in viewingBlocks:
|
|
distViewPad.addStartingBlock(viewingBlock)
|
|
|
|
for distObj in self.viewingBlocks:
|
|
self.addDistObj(distObj)
|
|
|
|
for viewPad in self.viewingPads:
|
|
self.addDistObj(viewPad)
|
|
|
|
for racePad in self.racingPads:
|
|
racePad.request('WaitEmpty')
|
|
self.addDistObj(racePad)
|
|
|
|
return
|
|
|
|
def logPossibleRaceCondition(self, startBlock):
|
|
for sb in self.startingBlocks:
|
|
if sb == startBlock:
|
|
if not sb.kartPad:
|
|
self.notify.warning('%s is in a broken state' % str(self))
|
|
self.notify.warning('StartingBlocks: %d, RacePads: %s, ViewPads: %s, RacePadGroups: %s, ViewPadGroups: %s' % (len(self.startingBlocks), str(self.racingPads), str(self.viewingPads), str(self.foundRacingPadGroups), str(self.foundViewingPadGroups)))
|