122 lines
4.3 KiB
Python
122 lines
4.3 KiB
Python
import random
|
|
from sets import Set
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed import DistributedObjectAI
|
|
from direct.showbase import PythonUtil
|
|
from direct.task import Timer
|
|
from direct.task.Task import Task
|
|
from toontown.toonbase import ToontownGlobals
|
|
from toontown.cogdominium import CogdoBarrelRoomConsts
|
|
from toontown.cogdominium import DistributedCogdoBarrelAI
|
|
|
|
class CogdoBarrelRoomAI:
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedCogdoBarrelRoomAI')
|
|
|
|
def __init__(self, cogdoInteriorAI):
|
|
self.cogdoInteriorAI = cogdoInteriorAI
|
|
self.allBarrelsCollectedTask = self.cogdoInteriorAI.taskName('allBarrelsCollectedTask')
|
|
self.collectionDoneEvent = self.cogdoInteriorAI.taskName('barrelCollectionDone')
|
|
self.collectTimer = None
|
|
self.results = [
|
|
[],
|
|
[]]
|
|
for i in range(CogdoBarrelRoomConsts.MaxToons):
|
|
if i < len(self.cogdoInteriorAI.toons):
|
|
self.results[0].append(self.cogdoInteriorAI.toons[i])
|
|
else:
|
|
self.results[0].append(0)
|
|
self.results[1].append(0)
|
|
|
|
self.spawnedBarrels = []
|
|
self.__spawnBarrels()
|
|
|
|
def destroy(self):
|
|
taskMgr.remove(self.allBarrelsCollectedTask)
|
|
if self.collectTimer:
|
|
self.collectTimer.stop()
|
|
self.collectTimer = None
|
|
|
|
for barrel in self.spawnedBarrels:
|
|
barrel.requestDelete()
|
|
|
|
self.spawnedBarrels = []
|
|
|
|
def __spawnBarrels(self):
|
|
self.spawnedBarrels = []
|
|
|
|
def spawnBarrel(index):
|
|
barrel = DistributedCogdoBarrelAI.DistributedCogdoBarrelAI(self.cogdoInteriorAI.air, index, self.barrelCollected)
|
|
barrel.generateWithRequired(self.cogdoInteriorAI.zoneId)
|
|
self.spawnedBarrels.append(barrel)
|
|
|
|
for i in range(CogdoBarrelRoomConsts.numBarrels()):
|
|
spawnBarrel(i)
|
|
|
|
def reset(self):
|
|
for barrel in self.spawnedBarrels:
|
|
barrel.d_setState(CogdoBarrelRoomConsts.StateHidden)
|
|
|
|
for i in range(CogdoBarrelRoomConsts.MaxToons):
|
|
self.results[1][i] = 0
|
|
|
|
def activate(self):
|
|
self.collectTimer = Timer.Timer()
|
|
self.collectTimer.startCallback(CogdoBarrelRoomConsts.CollectionTime, self.__endCollectionPhase)
|
|
for barrel in self.spawnedBarrels:
|
|
barrel.interactive = True
|
|
|
|
taskMgr.remove(self.allBarrelsCollectedTask)
|
|
taskMgr.doMethodLater(CogdoBarrelRoomConsts.AllBarrelsCollectedTime, self.__checkAllBarrelsCollected, self.allBarrelsCollectedTask)
|
|
|
|
def __endCollectionPhase(self):
|
|
messenger.send(self.collectionDoneEvent)
|
|
|
|
def deactivate(self):
|
|
if self.collectTimer:
|
|
self.collectTimer.stop()
|
|
self.collectTimer = None
|
|
|
|
for barrel in self.spawnedBarrels:
|
|
barrel.interactive = False
|
|
|
|
def setScore(self, score):
|
|
numGood = int(score * (CogdoBarrelRoomConsts.numBarrels() + 0.5))
|
|
random.shuffle(self.spawnedBarrels)
|
|
for i in range(len(self.spawnedBarrels)):
|
|
if i < numGood:
|
|
state = CogdoBarrelRoomConsts.StateAvailable
|
|
else:
|
|
state = CogdoBarrelRoomConsts.StateCrushed
|
|
self.spawnedBarrels[i].d_setState(state)
|
|
|
|
def barrelCollected(self, barrel, avId):
|
|
try:
|
|
playerIndex = self.results[0].index(avId)
|
|
self.results[1][playerIndex] += barrel.laff
|
|
except ValueError:
|
|
self.notify.warning('barrelCollected: Unrecognized avId %s' % avId)
|
|
|
|
def __checkAllBarrelsCollected(self, task):
|
|
if not CogdoBarrelRoomConsts.EndWithAllBarrelsCollected:
|
|
return
|
|
|
|
if self.__allBarrelsCollected():
|
|
self.__endCollectionPhase()
|
|
else:
|
|
return Task.again
|
|
|
|
def __toonIdNeedsLaff(self, toonId):
|
|
toon = self.cogdoInteriorAI.air.doId2do.get(toonId)
|
|
if toon != None:
|
|
return not toon.isToonedUp()
|
|
|
|
def __allBarrelsCollected(self):
|
|
toonsNeedingLaff = Set(filter(lambda toon: self.__toonIdNeedsLaff(toon), self.cogdoInteriorAI.toons))
|
|
for barrel in self.spawnedBarrels:
|
|
if not toonsNeedingLaff.issubset(Set(barrel.grabbedBy)):
|
|
return False
|
|
|
|
return True
|
|
|
|
def __str__(self):
|
|
return str(self.cogdoInteriorAI) + '.CogdoBarrelRoomAI'
|