From 5d2399b8a287e0200c3491564f3b4828947b640f Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 6 Mar 2015 15:36:42 +0200 Subject: [PATCH 01/20] Add new emotes to loading screen --- toontown/toontowngui/ToontownLoadingScreen.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/toontown/toontowngui/ToontownLoadingScreen.py b/toontown/toontowngui/ToontownLoadingScreen.py index 4c5e1dae..aec0de8e 100644 --- a/toontown/toontowngui/ToontownLoadingScreen.py +++ b/toontown/toontowngui/ToontownLoadingScreen.py @@ -44,6 +44,21 @@ class ToontownLoadingScreen: ToontownGlobals.LawbotHQ : 'phase_3.5/maps/loading/lbhq.jpg', ToontownGlobals.BossbotHQ : 'phase_3.5/maps/loading/bbhq.jpg' } + emotes = [ + {'emote': 'bored', 'frame': 135}, + {'emote': 'run', 'frame': 7}, + {'emote': 'victory', 'frame': 10}, + {'emote': 'applause', 'frame': 23}, + {'emote': 'sprinkle-dust', 'frame': 40}, + {'emote': 'hypnotize', 'frame': 25}, + {'emote': 'cringe', 'frame': 25}, + {'emote': 'wave', 'frame': 25}, + {'emote': 'shrug', 'frame': 30}, + {'emote': 'duck', 'frame': 40}, + {'emote': 'up', 'frame': 60}, + {'emote': 'down', 'frame': 23}, + {'emote': 'bow', 'frame': 45} + ] def __init__(self): self.__expectedCount = 0 @@ -82,9 +97,10 @@ class ToontownLoadingScreen: if gui: if base.localAvatarStyle: from toontown.toon import Toon + emote = random.choice(self.emotes) self.toon = Toon.Toon() self.toon.setDNA(base.localAvatarStyle) - self.toon.loop('bored', fromFrame=135, toFrame=135) + self.toon.loop(emote['emote'], fromFrame=emote['frame'], toFrame=emote['frame']) self.toon.getGeomNode().setDepthWrite(1) self.toon.getGeomNode().setDepthTest(1) self.toon.setHpr(205, 0, 0) From 5d445f8a15b8a49b834c39433f3d24bb797291f2 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 6 Mar 2015 16:24:29 -0500 Subject: [PATCH 02/20] Added Garden Drop game. --- save.dat | 1 + toontown/estate/DistributedEstate.py | 4 +- .../estate/DistributedFurnitureManager.py | 4 +- toontown/estate/GameSprite.py | 26 +- toontown/estate/GardenDropGame.py | 1086 ++++++++++------- toontown/estate/GardenGameGlobals.py | 36 + toontown/toonbase/TTLocalizerEnglish.py | 10 + 7 files changed, 700 insertions(+), 467 deletions(-) create mode 100644 save.dat create mode 100644 toontown/estate/GardenGameGlobals.py diff --git a/save.dat b/save.dat new file mode 100644 index 00000000..6b2aaa76 --- /dev/null +++ b/save.dat @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toontown/estate/DistributedEstate.py b/toontown/estate/DistributedEstate.py index db00c499..3f0ad9f7 100644 --- a/toontown/estate/DistributedEstate.py +++ b/toontown/estate/DistributedEstate.py @@ -74,6 +74,7 @@ class DistributedEstate(DistributedObject.DistributedObject): self.loadFlowerSellBox() self.oldClear = base.win.getClearColor() base.win.setClearColor(Vec4(0.09, 0.55, 0.21, 1.0)) + self.startGame() def unload(self): self.ignoreAll() @@ -100,6 +101,7 @@ class DistributedEstate(DistributedObject.DistributedObject): self.flowerSellBox.removeNode() del self.flowerSellBox self.flowerSellBox = None + GardenDropGame.GardenDropGame().endGame() return def announceGenerate(self): @@ -107,7 +109,7 @@ class DistributedEstate(DistributedObject.DistributedObject): self.accept('gardenGame', self.startGame) def startGame(self): - self.game = GardenDropGame.GardenDropGame() + self.game = GardenDropGame.GardenDropGame().playGardenDrop() def loadAirplane(self): self.airplane = loader.loadModel('phase_4/models/props/airplane.bam') diff --git a/toontown/estate/DistributedFurnitureManager.py b/toontown/estate/DistributedFurnitureManager.py index 007b3849..1540bd49 100644 --- a/toontown/estate/DistributedFurnitureManager.py +++ b/toontown/estate/DistributedFurnitureManager.py @@ -34,8 +34,8 @@ class DistributedFurnitureManager(DistributedObject.DistributedObject): if self.ownerId == base.localAvatar.doId: self.cr.furnitureManager = self if self.cr.objectManager == None: - import HouseDesign - self.cr.objectManager = HouseDesign.ObjectManager() + import houseDesign + self.cr.objectManager = houseDesign.ObjectManager() return def setOwnerName(self, name): diff --git a/toontown/estate/GameSprite.py b/toontown/estate/GameSprite.py index 17c720da..c7a06425 100644 --- a/toontown/estate/GameSprite.py +++ b/toontown/estate/GameSprite.py @@ -1,14 +1,30 @@ +########################## TOONTOWN ADVENTURE ########################## +# Filename: GameSprite.py +# Created by: sillypeppymacspeed +# Date: March 28th, 2014 +#### +# Description: +# +# This codes the sprites for the Garden Drop estate game. +#### +### DEFINITELY NOT COPIED FROM TOONTOWN HOUSE + import math class GameSprite: + colorRed = (1, 0, 0, 1) colorBlue = (0, 0, 1, 1) colorGreen = (0, 1, 0, 1) + colorYellow = (1, 1, 0, 1) + colorPurple = (1, 0, 1, 1) colorGhostRed = (1, 0, 0, 0.5) colorGhostBlue = (0, 0, 1, 0.5) colorGhostGreen = (0, 1, 0, 0.5) + colorGhostYellow = (1, 1, 0, 0.5) + colorGhostPurple = (1, 0, 1, 0.5) colorWhite = (1, 1, 1, 1) - colorBlack = (0, 0, 0, 1.0) + colorBlack = (0.5, 0.5, 0.5, 1.0) colorShadow = (0, 0, 0, 0.5) def __init__(self, nodeObj, colorType = 0, foundation = 0): @@ -29,12 +45,20 @@ class GameSprite: self.setColor(GameSprite.colorGhostBlue) elif colorType == 2: self.setColor(GameSprite.colorGhostGreen) + elif colorType == 3: + self.setColor(GameSprite.colorGhostYellow) + elif colorType == 4: + self.setColor(GameSprite.colorGhostPurple) elif colorType == 0: self.setColor(GameSprite.colorRed) elif colorType == 1: self.setColor(GameSprite.colorBlue) elif colorType == 2: self.setColor(GameSprite.colorGreen) + elif colorType == 3: + self.setColor(GameSprite.colorYellow) + elif colorType == 4: + self.setColor(GameSprite.colorPurple) self.markedForDeath = 0 def delete(self): diff --git a/toontown/estate/GardenDropGame.py b/toontown/estate/GardenDropGame.py index c71e2bf3..c73a0e47 100644 --- a/toontown/estate/GardenDropGame.py +++ b/toontown/estate/GardenDropGame.py @@ -1,467 +1,436 @@ -from pandac.PandaModules import * -from toontown.toonbase.ToonBaseGlobal import * -from direct.gui.DirectGui import * -from pandac.PandaModules import * -from direct.gui.DirectScrolledList import * -from direct.distributed.ClockDelta import * -from toontown.toontowngui import TTDialog -import math -from direct.task.Task import Task -from toontown.toonbase import ToontownGlobals -from direct.distributed import DistributedObject -from direct.directnotify import DirectNotifyGlobal -from direct.fsm import ClassicFSM -from direct.fsm import State -from toontown.toon import Toon -from direct.showbase import RandomNumGen -from toontown.toonbase import TTLocalizer -import random -import random -import cPickle -from direct.showbase import PythonUtil -import GameSprite +import math, random, GameSprite, GardenGameGlobals from math import pi -import GardenProgressMeter - -class GardenDropGame(DirectObject.DirectObject): - +from direct.gui.DirectGui import * +from direct.distributed.ClockDelta import * +from toontown.toonbase import TTLocalizer + +LevelNumber = 1 + +class GardenDropGame: + def __init__(self): - self.acceptErrorDialog = None - self.doneEvent = 'game Done' + self.inHelp = False self.sprites = [] - self.load() - thing = self.model.find('**/item_board') - self.block = self.model1.find('**/minnieCircle') - self.colorRed = (1, 0, 0, 1) - self.colorBlue = (0, 0, 1, 1) - self.colorGreen = (0, 1, 0, 1) - self.colorGhostRed = (1, 0, 0, 0.5) - self.colorGhostBlue = (0, 0, 1, 0.5) - self.colorGhostGreen = (0, 1, 0, 0.5) - self.colorWhite = (1, 1, 1, 1) - self.colorBlack = (0, 0, 0, 1.0) - self.colorShadow = (0, 0, 0, 0.5) - self.lastTime = None - self.running = 0 + self.lastTime = [] + self.grid = [] + print ('Grid Dimensions X%s Z%s' % (GardenGameGlobals.gX, + GardenGameGlobals.gZ)) + base.gardenGame = self + self.matchList = [] self.massCount = 0 self.foundCount = 0 - self.maxX = 0.47 - self.minX = -0.47 - self.maxZ = 0.65 - self.minZ = -0.1 - self.newBallX = 0.0 - self.newBallZ = 0.6 - self.rangeX = self.maxX - self.minX - self.rangeZ = self.maxZ - self.minZ - size = 0.085 - sizeZ = size * 0.8 - gX = int(self.rangeX / size) - gZ = int(self.rangeZ / sizeZ) - self.maxX = self.minX + gX * size - self.maxZ = self.minZ + gZ * sizeZ - self.controlOffsetX = 0.0 - self.controlOffsetZ = 0.0 - self.queExtent = 3 - print 'Grid Dimensions X%s Z%s' % (gX, gZ) + + return None + + def reinitialize(self): + self.inHelp = False + self.sprites = [] + self.lastTime = [] self.grid = [] - self.gridDimX = gX - self.gridDimZ = gZ - self.gridBrick = False - base.gardenGame = self - for countX in xrange(self.gridDimX): - newRow = [] - for countZ in xrange(self.gridDimZ): - offset = 0 - if countZ % 2 == 0: - offset = size / 2 - newRow.append([None, countX * size + self.minX + offset, countZ * sizeZ + self.minZ]) - - self.grid.append(newRow) - - self.controlSprite = None - self.cogSprite = self.addUnSprite(self.block, posX=0.25, posZ=0.5) - self.cogSprite.setColor(self.colorShadow) - for ball in xrange(0, 3): - place = random.random() * self.rangeX - newSprite = self.addSprite(self.block, size=0.5, posX=self.minX + place, posZ=0.0, found=1) - self.stickInGrid(newSprite, 1) - - self.queBall = self.addSprite(self.block, posX=0.25, posZ=0.5, found=0) - self.queBall.setColor(self.colorWhite) - self.queBall.isQue = 1 self.matchList = [] - self.newBallTime = 1.0 - self.newBallCountUp = 0.0 - self.cogX = 0 - self.cogZ = 0 - self.__run() - return - + self.massCount = 0 + self.foundCount = 0 + + return None + + def load(self): + model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel.bam') + model1 = loader.loadModel('phase_3.5/models/gui/matching_game_gui.bam') + + self.model = model + self.model1 = model1 + + background = model.find('**/bg') + itemBoard = model.find('**/item_board') + + self.frame = DirectFrame(scale=1.1000000000000001, relief=DGG.FLAT, frameSize=(-0.5, + 0.5, + -0.45000000000000001, + -0.050000000000000003), frameColor=(0.73699999999999999, 0.57299999999999995, 0.34499999999999997, 1.0)) + + self.background = DirectFrame(self.frame, image=background, image_scale=0.050000000000000003, relief=None, pos=(0, 1, 0)) + self.itemBoard = DirectFrame(parent=self.frame, image=itemBoard, image_scale=0.050000000000000003, image_color=(0.92200000000000004, 0.92200000000000004, 0.753, 1), relief=None, pos=(0, 1, 0)) + gui2 = loader.loadModel('phase_3/models/gui/quit_button.bam') + + self.font = loader.loadFont("phase_3/models/fonts/MickeyFont.bam") + self.gardenDropText = OnscreenText(parent=self.frame, text=TTLocalizer.GardenDropTitle,scale=(0.17,0.17,0.17), font=self.font, pos=(0,0.685,0), fg=(1,1,1,1)) + + self.quitButton = DirectButton(parent=self.frame, relief=None, image=(gui2.find('**/QuitBtn_UP'), + gui2.find('**/QuitBtn_DN'), + gui2.find('**/QuitBtn_RLVR')), pos=(0.5, + 1.0, + -0.41999999999999998), scale=0.90000000000000002, text=TTLocalizer.GardenDropExitGame, text_font=self.font, text0_fg=(1, 1, 1, 1), text1_fg=(1, 1, 1, 1), text2_fg=(1, 1, 1, 1), text_scale=0.044999999999999998, text_pos=(0, + -0.01), command=self._GardenDropGame__handleExit) + + if LevelNumber == 1: + self.helpButton = DirectButton(parent=self.frame, relief=None, image=(gui2.find('**/QuitBtn_UP'), + gui2.find('**/QuitBtn_DN'), + gui2.find('**/QuitBtn_RLVR')), pos=(-0.5, + 1.0, + -0.41999999999999998), scale=0.90000000000000002, text=TTLocalizer.PicnicTableTutorial, text_font=self.font, text0_fg=(1, 1, 1, 1), text1_fg=(1, 1, 1, 1), text2_fg=(1, 1, 1, 1), text_scale=0.044999999999999998, text_pos=(0, + -0.01), command=self._GardenDropGame__openHelp) + + def help(self): + self.inHelp = True + + frameGui = loader.loadModel('phase_3/models/gui/dialog_box_gui.bam') + self.helpFrame = DirectFrame(scale=1.1, relief=None, image=frameGui, image_scale=(1.75, 1, 0.75), image_color=(1,1,1,1), frameSize=(-0.5, + 0.5, + -0.45, + -0.05)) + + self.font = loader.loadFont("phase_3/models/fonts/MickeyFont.bam") + self.helpText = DirectLabel(scale=1.1, relief=None, text_pos=(0, 0.2), text_wordwrap=16, text=TTLocalizer.GardenDropHelpTitle, text_font=self.font, pos=(0.0, 0.0, 0.0), text_scale=0.1, text0_fg=(1, 1, 1, 1), parent=self.helpFrame) + + self.font2 = loader.loadFont("phase_3/models/fonts/Comedy.bam") + self.helpText2 = DirectLabel(scale=1.1, relief=None, text_pos=(-0.6, 0.1), text_wordwrap=15, text=TTLocalizer.GardenDropInstructions, text_font=self.font2, pos=(0.0, 0.0, 0.0), text_scale=0.085, text0_fg=(0, 0, 0, 1), parent=self.helpFrame, text_align=TextNode.ALeft) + + gui2 = loader.loadModel('phase_3/models/gui/quit_button.bam') + self.backButton = DirectButton(parent=self.helpFrame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0.5, 1.0, -0.32), scale=0.9, text=TTLocalizer.GardenDropBackToGame, text_font=self.font, text0_fg=(1, 1, 1, 1), text1_fg=(1, 1, 1, 1), text2_fg=(1, 1, 1, 1), text_scale=0.045, text_pos=(0, -0.01), command=self.unloadHelp) + + return True + + def addSprite(self, image, size = 0.5, posX = 0, posZ = 0, found = 0): + nodeObj = DirectLabel(parent=self.frame, relief=None, image=image, pos=(posX, 0.0, posZ), scale=size, image_color=(1.0, 1.0, 1.0, 1)) + if LevelNumber == 1 or LevelNumber == 2: + colorChoice = random.choice(range(0, 3)) + if LevelNumber == 3 or LevelNumber == 4: + colorChoice = random.choice(range(0, 4)) + if LevelNumber == 5: + colorChoice = random.choice(range(0, 5)) + + newSprite = GameSprite.GameSprite(nodeObj, colorChoice, found) + self.sprites.append(newSprite) + + if found: + self.foundCount += 1 + + return newSprite + + def addUnSprite(self, image, size = 0.5, posX = 0, posZ = 0): + nodeObj = DirectLabel(parent=self.frame, relief=None, image=image, pos=(posX, 0.0, posZ), scale=size, image_color=(1.0, 1.0, 1.0, 1)) + + newSprite = GameSprite.GameSprite(nodeObj) + newSprite = GameSprite.GameSprite(nodeObj) + + return newSprite + + def testPointDistanceSquare(self, x1, z1, x2, z2): + distX = x1 - x2 + distZ = z1 - z2 + distC = distX * distX + distZ * distZ + + if distC == 0: + distC = 1e-10 + + return distC + + def testDistance(self, nodeA, nodeB): + distX = nodeA.getX() - nodeB.getX() + distZ = nodeA.getZ() - nodeB.getZ() + distC = distX * distX + distZ * distZ + dist = math.sqrt(distC) + + return dist + + def testGridfull(self, cell): + if not cell: + return 0 + + elif cell[0] != None: + return 1 + + else: + return 0 + + returnTrue + + def getValidGrid(self, x, z): + if x < 0 or x >= GardenGameGlobals.gridDimX: + return None + + elif z < 0 or z >= GardenGameGlobals.gridDimZ: + return None + + else: + return self.grid[x][z] + + return None + + def getColorType(self, x, z): + if x < 0 or x >= GardenGameGlobals.gridDimX: + return -1 + + elif z < 0 or z >= GardenGameGlobals.gridDimZ: + return -1 + + elif self.grid[x][z][0] == None: + return -1 + + else: + return self.grid[x][z][0].colorType + + return True + + def getSprite(self, spriteIndex): + if spriteIndex >= len(self.sprites) or self.sprites[spriteIndex].markedForDeath: + return None + + else: + return self.sprites[spriteIndex] + + return None + def findGrid(self, x, z, force = 0): currentClosest = None currentDist = 10000000 - for countX in xrange(self.gridDimX): - for countZ in xrange(self.gridDimZ): + + for countX in range(GardenGameGlobals.gridDimX): + for countZ in range(GardenGameGlobals.gridDimZ): testDist = self.testPointDistanceSquare(x, z, self.grid[countX][countZ][1], self.grid[countX][countZ][2]) if self.grid[countX][countZ][0] == None and testDist < currentDist and (force or self.hasNeighbor(countX, countZ)): currentClosest = self.grid[countX][countZ] self.closestX = countX self.closestZ = countZ currentDist = testDist - + return currentClosest - - def hasNeighbor(self, cellX, cellZ): - gotNeighbor = 0 - if cellZ % 2 == 0: - if self.testGridfull(self.getValidGrid(cellX - 1, cellZ)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX, cellZ + 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ + 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX, cellZ - 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ - 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX - 1, cellZ)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX, cellZ + 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX - 1, cellZ + 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX, cellZ - 1)): - gotNeighbor = 1 - elif self.testGridfull(self.getValidGrid(cellX - 1, cellZ - 1)): - gotNeighbor = 1 - return gotNeighbor - - def clearMatchList(self): - for entry in self.matchList: - gridEntry = self.grid[entry[0]][entry[1]] - sprite = gridEntry[0] - gridEntry[0] = None - sprite.markedForDeath = 1 - - return - - def createMatchList(self, x, z): - self.matchList = [] - self.fillMatchList(x, z) - - def fillMatchList(self, cellX, cellZ): - if (cellX, cellZ) in self.matchList: - return - self.matchList.append((cellX, cellZ)) - colorType = self.grid[cellX][cellZ][0].colorType - if cellZ % 2 == 0: - if self.getColorType(cellX - 1, cellZ) == colorType: - self.fillMatchList(cellX - 1, cellZ) - if self.getColorType(cellX + 1, cellZ) == colorType: - self.fillMatchList(cellX + 1, cellZ) - if self.getColorType(cellX, cellZ + 1) == colorType: - self.fillMatchList(cellX, cellZ + 1) - if self.getColorType(cellX + 1, cellZ + 1) == colorType: - self.fillMatchList(cellX + 1, cellZ + 1) - if self.getColorType(cellX, cellZ - 1) == colorType: - self.fillMatchList(cellX, cellZ - 1) - if self.getColorType(cellX + 1, cellZ - 1) == colorType: - self.fillMatchList(cellX + 1, cellZ - 1) - else: - if self.getColorType(cellX - 1, cellZ) == colorType: - self.fillMatchList(cellX - 1, cellZ) - if self.getColorType(cellX + 1, cellZ) == colorType: - self.fillMatchList(cellX + 1, cellZ) - if self.getColorType(cellX, cellZ + 1) == colorType: - self.fillMatchList(cellX, cellZ + 1) - if self.getColorType(cellX - 1, cellZ + 1) == colorType: - self.fillMatchList(cellX - 1, cellZ + 1) - if self.getColorType(cellX, cellZ - 1) == colorType: - self.fillMatchList(cellX, cellZ - 1) - if self.getColorType(cellX - 1, cellZ - 1) == colorType: - self.fillMatchList(cellX - 1, cellZ - 1) - - def testGridfull(self, cell): - if not cell: - return 0 - elif cell[0] != None: - return 1 - else: - return 0 - return - - def getValidGrid(self, x, z): - if x < 0 or x >= self.gridDimX: - return None - elif z < 0 or z >= self.gridDimZ: - return None - else: - return self.grid[x][z] - return None - - def getColorType(self, x, z): - if x < 0 or x >= self.gridDimX: - return -1 - elif z < 0 or z >= self.gridDimZ: - return -1 - elif self.grid[x][z][0] == None: - return -1 - else: - return self.grid[x][z][0].colorType - return - + def findGridCog(self): - self.cogX = 0 - self.cogZ = 0 + GardenGameGlobals.cogX = 0 + GardenGameGlobals.cogZ = 0 self.massCount = 0 + for row in self.grid: for cell in row: if cell[0] != None: - self.cogX += cell[1] - self.cogZ += cell[2] + GardenGameGlobals.cogX += cell[1] + GardenGameGlobals.cogZ += cell[2] self.massCount += 1 - + if self.massCount > 0: - self.cogX = self.cogX / self.massCount - self.cogZ = self.cogZ / self.massCount + self.cogX = (GardenGameGlobals.cogX / self.massCount) + self.cogZ = (GardenGameGlobals.cogZ / self.massCount) self.cogSprite.setX(self.cogX) self.cogSprite.setZ(self.cogZ) else: self.doOnClearGrid() - return - - def doOnClearGrid(self): - secondSprite = self.addSprite(self.block, posX=self.newBallX, posZ=0.0, found=1) - secondSprite.addForce(0, 1.55 * pi) - self.stickInGrid(secondSprite, 1) - - def findGrid2(self, x, z): - rangeX = self.maxX - self.minX - rangeZ = self.maxZ - self.minZ - framedX = x - self.minX - framedZ = z - self.minZ - tileDimX = rangeX / self.gridDimX - tileDimZ = rangeZ / self.gridDimZ - tileX = int(framedX / tileDimX) - tileZ = int(framedZ / tileDimZ) - print 'find Grid tileX%s tileZ%s' % (tileX, tileZ) - return (tileX, tileZ) - - def findPos(self, x, z): - rangeX = self.maxX - self.minX - rangeZ = self.maxZ - self.minZ - tileDimX = rangeX / self.gridDimX - tileDimZ = rangeZ / self.gridDimZ - posX = tileDimX * x + self.minX - posZ = tileDimZ * z + self.minZ - print 'find Pos X%s Z%s' % (posX, posZ) - return (posX, posZ) - - def placeIntoGrid(self, sprite, x, z): - if self.grid[x][z][0] == None: - self.grid[x][z][0] = sprite - sprite.setActive(0) - newX, newZ = self.findPos(x, z) - sprite.setX(newX) - sprite.setZ(newZ) - print 'Setting Final Pos X%s Z%s' % (newX, newZ) - else: - self.placeIntoGrid(sprite, x + 1, z - 1) - return - + + return True + def stickInGrid(self, sprite, force = 0): if sprite.isActive and not sprite.isQue: gridCell = self.findGrid(sprite.getX(), sprite.getZ(), force) + if gridCell: gridCell[0] = sprite sprite.setActive(0) sprite.setX(gridCell[1]) sprite.setZ(gridCell[2]) self.createMatchList(self.closestX, self.closestZ) + if len(self.matchList) >= 3: self.clearMatchList() self.findGridCog() - - def stickInGrid2(self, sprite): - if sprite.isActive and not sprite.isQue: - tileX, tileZ = self.findGrid(sprite.getX(), sprite.getZ()) - self.placeIntoGrid(sprite, tileX, tileZ) - sprite.isActive = 0 - - def load(self): - model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel') - model1 = loader.loadModel('phase_3.5/models/gui/matching_game_gui') - self.model = model - self.model1 = model1 - background = model.find('**/bg') - itemBoard = model.find('**/item_board') - self.frame = DirectFrame(scale=1.1, relief=DGG.FLAT, frameSize=(-0.5, - 0.5, - -0.45, - -0.05), frameColor=(0.737, 0.573, 0.345, 1.0)) - self.background = DirectFrame(self.frame, image=background, image_scale=0.05, relief=None, pos=(0, 1, 0)) - self.itemBoard = DirectFrame(parent=self.frame, image=itemBoard, image_scale=0.05, image_color=(0.922, 0.922, 0.753, 1), relief=None, pos=(0, 1, 0)) - gui2 = loader.loadModel('phase_3/models/gui/quit_button') - self.quitButton = DirectButton(parent=self.frame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0.5, 1.0, -0.42), scale=0.9, text='Exit Mini Game', text_font=ToontownGlobals.getSignFont(), text0_fg=(1, 1, 1, 1), text1_fg=(1, 1, 1, 1), text2_fg=(1, 1, 1, 1), text_scale=0.045, text_pos=(0, -0.01), command=self.__handleExit) - return - - def unload(self): - self.frame.destroy() - del self.frame - if self.acceptErrorDialog: - self.acceptErrorDialog.cleanup() - self.acceptErrorDialog = None - taskMgr.remove('gameTask') - self.ignoreAll() - return - - def show(self): - self.frame.show() - - def hide(self): - self.frame.hide() - - def __handleExit(self): - self.__acceptExit() - - def __acceptExit(self, buttonValue = None): - if hasattr(self, 'frame'): - self.hide() - self.unload() - messenger.send(self.doneEvent) - - def addSprite(self, image, size = 0.5, posX = 0, posZ = 0, found = 0): - nodeObj = DirectLabel(parent=self.frame, relief=None, image=image, pos=(posX, 0.0, posZ), scale=size, image_color=(1.0, 1.0, 1.0, 1)) - colorChoice = random.choice(range(0, 3)) - newSprite = GameSprite.GameSprite(nodeObj, colorChoice, found) - self.sprites.append(newSprite) - if found: - self.foundCount += 1 - return newSprite - - def addUnSprite(self, image, size = 0.5, posX = 0, posZ = 0): - nodeObj = DirectLabel(parent=self.frame, relief=None, image=image, pos=(posX, 0.0, posZ), scale=size, image_color=(1.0, 1.0, 1.0, 1)) - newSprite = GameSprite.GameSprite(nodeObj) - newSprite = GameSprite.GameSprite(nodeObj) - return newSprite - - def __run(self, cont = 1): - if self.lastTime == None: - self.lastTime = globalClock.getRealTime() - timeDelta = globalClock.getRealTime() - self.lastTime - self.lastTime = globalClock.getRealTime() - self.newBallCountUp += timeDelta - if base.mouseWatcherNode.hasMouse(): - x = base.mouseWatcherNode.getMouseX() - y = base.mouseWatcherNode.getMouseY() - self.queBall.setX(x) - self.queBall.setZ(y) - for sprite in self.sprites: - sprite.run(timeDelta) - if sprite.getX() > self.maxX: - sprite.setX(self.maxX) - sprite.velX = -sprite.velX - if sprite.getX() < self.minX: - sprite.setX(self.minX) - sprite.velX = -sprite.velX - if sprite.getZ() > self.maxZ: - sprite.setZ(self.maxZ) - sprite.velZ = -sprite.velZ - if sprite.getZ() < self.minZ: - self.stickInGrid(sprite, 1) - if sprite.isActive: - sprite.addForce(timeDelta * 0.9, pi * 1.5) - - self.queBall.velX = (self.queBall.getX() - self.queBall.prevX) / timeDelta - self.queBall.velZ = (self.queBall.getZ() - self.queBall.prevZ) / timeDelta - self.__colTest() - for sprite in self.sprites: - if sprite.markedForDeath: - if sprite.foundation: - self.foundCount -= 1 - self.sprites.remove(sprite) - sprite.delete() - - if self.controlSprite == None: - self.addControlSprite(self.newBallX, self.newBallZ) - self.newBallCountUp = 0.0 - if self.newBallCountUp >= self.newBallTime: - self.addControlSprite(self.newBallX, self.newBallZ) - self.newBallCountUp = 0.0 - if not self.controlSprite.isActive: - self.controlSprite = None - if self.foundCount <= 0: - self.__handleWin() - if cont and not self.running: - taskMgr.add(self.__run, 'gameTask') - self.running = 1 - return Task.cont - - def __handleWin(self): - GardenProgressMeter.GardenProgressMeter() - self.__handleExit() - - def addControlSprite(self, x = 0.0, z = 0.0): - newSprite = self.addSprite(self.block, posX=x, posZ=z) - self.controlSprite = newSprite - + + def fillMatchList(self, cellX, cellZ): + if (cellX, cellZ) in self.matchList: + return True + + self.matchList.append((cellX, cellZ)) + colorType = self.grid[cellX][cellZ][0].colorType + + if cellZ % 2 == 0: + if self.getColorType(cellX - 1, cellZ) == colorType: + self.fillMatchList(cellX - 1, cellZ) + + if self.getColorType(cellX + 1, cellZ) == colorType: + self.fillMatchList(cellX + 1, cellZ) + + if self.getColorType(cellX, cellZ + 1) == colorType: + self.fillMatchList(cellX, cellZ + 1) + + if self.getColorType(cellX + 1, cellZ + 1) == colorType: + self.fillMatchList(cellX + 1, cellZ + 1) + + if self.getColorType(cellX, cellZ - 1) == colorType: + self.fillMatchList(cellX, cellZ - 1) + + if self.getColorType(cellX + 1, cellZ - 1) == colorType: + self.fillMatchList(cellX + 1, cellZ - 1) + + else: + if self.getColorType(cellX - 1, cellZ) == colorType: + self.fillMatchList(cellX - 1, cellZ) + + if self.getColorType(cellX + 1, cellZ) == colorType: + self.fillMatchList(cellX + 1, cellZ) + + if self.getColorType(cellX, cellZ + 1) == colorType: + self.fillMatchList(cellX, cellZ + 1) + + if self.getColorType(cellX - 1, cellZ + 1) == colorType: + self.fillMatchList(cellX - 1, cellZ + 1) + + if self.getColorType(cellX, cellZ - 1) == colorType: + self.fillMatchList(cellX, cellZ - 1) + + if self.getColorType(cellX - 1, cellZ - 1) == colorType: + self.fillMatchList(cellX - 1, cellZ - 1) + + def createMatchList(self, x, z): + self.matchList = [] + self.fillMatchList(x, z) + + def clearMatchList(self): + for entry in self.matchList: + gridEntry = self.grid[entry[0]][entry[1]] + sprite = gridEntry[0] + gridEntry[0] = None + sprite.markedForDeath = 1 + + return True + + def hasNeighbor(self, cellX, cellZ): + gotNeighbor = 0 + + if cellZ % 2 == 0: + if self.testGridfull(self.getValidGrid(cellX - 1, cellZ)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX, cellZ + 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ + 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX, cellZ - 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ - 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX - 1, cellZ)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX + 1, cellZ)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX, cellZ + 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX - 1, cellZ + 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX, cellZ - 1)): + gotNeighbor = 1 + + elif self.testGridfull(self.getValidGrid(cellX - 1, cellZ - 1)): + gotNeighbor = 1 + + return gotNeighbor + def __colTest(self): if not hasattr(self, 'tick'): self.tick = 0 + self.tick += 1 + if self.tick > 5: self.tick = 0 sizeSprites = len(self.sprites) - for movingSpriteIndex in xrange(len(self.sprites)): - for testSpriteIndex in xrange(movingSpriteIndex, len(self.sprites)): + + for movingSpriteIndex in range(len(self.sprites)): + for testSpriteIndex in range(movingSpriteIndex, len(self.sprites)): movingSprite = self.getSprite(movingSpriteIndex) testSprite = self.getSprite(testSpriteIndex) + if testSprite and movingSprite: if movingSpriteIndex != testSpriteIndex and (movingSprite.isActive or testSprite.isActive): if movingSprite.isQue or testSprite.isQue: - if self.testDistance(movingSprite.nodeObj, testSprite.nodeObj) < self.queExtent * (movingSprite.size + testSprite.size): + if self.testDistance(movingSprite.nodeObj, testSprite.nodeObj) < GardenGameGlobals.queExtent * (movingSprite.size + testSprite.size): self.push(movingSprite, testSprite) + elif self.testDistance(movingSprite.nodeObj, testSprite.nodeObj) < movingSprite.size + testSprite.size: - if not (movingSprite.isActive and testSprite.isActive): - self.__collide(movingSprite, testSprite) + if movingSprite.isActive: + testSprite.isActive or self.__collide(movingSprite, testSprite) + + if self.testDistance(self.cogSprite.nodeObj, testSprite.nodeObj) < (self.cogSprite.size + testSprite.size): + if movingSprite.isActive: + self.stickInGrid(testSprite, 1) + if self.tick == 5: pass - - def getSprite(self, spriteIndex): - if spriteIndex >= len(self.sprites) or self.sprites[spriteIndex].markedForDeath: - return None + + def __collide(self, move, test): + queHit = 0 + + if move.isQue: + que = move + hit = test + queHit = 1 + + elif test.isQue: + que = test + hit = move + queHit = 1 + else: - return self.sprites[spriteIndex] - return None - - def testDistance(self, nodeA, nodeB): - distX = nodeA.getX() - nodeB.getX() - distZ = nodeA.getZ() - nodeB.getZ() - distC = distX * distX + distZ * distZ - dist = math.sqrt(distC) - return dist - - def testPointDistance(self, x1, z1, x2, z2): - distX = x1 - x2 - distZ = z1 - z2 - distC = distX * distX + distZ * distZ - dist = math.sqrt(distC) - if dist == 0: - dist = 1e-10 - return dist - - def testPointDistanceSquare(self, x1, z1, x2, z2): - distX = x1 - x2 - distZ = z1 - z2 - distC = distX * distX + distZ * distZ - if distC == 0: - distC = 1e-10 - return distC - + test.velX = 0 + test.velZ = 0 + move.velX = 0 + move.velZ = 0 + test.collide() + move.collide() + self.stickInGrid(move,1) + self.stickInGrid(test,1) + + if queHit: + forceM = 0.1 + distX = que.getX() - hit.getX() + distZ = que.getZ() - hit.getZ() + self.stickInGrid(move,1) + self.stickInGrid(test,1) + + def push(self, move, test): + queHit = 0 + + if move.isQue: + que = move + hit = test + queHit = 1 + + elif test.isQue: + que = test + hit = move + queHit = 1 + + if queHit: + forceM = 0.1 + dist = self.testDistance(move.nodeObj, test.nodeObj) + + if abs(dist) < GardenGameGlobals.queExtent * que.size and abs(dist) > 0: + scaleSize = GardenGameGlobals.queExtent * que.size * 0.5 + distFromPara = abs(abs(dist) - scaleSize) + force = (scaleSize - distFromPara) / scaleSize * (dist / abs(dist)) + angle = self.angleTwoSprites(que, hit) + + if angle < 0: + angle = angle + 2 * pi + + if angle > pi * 2.0: + angle = angle - 2 * pi + + newAngle = pi * 1.0 + + if angle > pi * 1.5 or angle < pi * 0.5: + newAngle = pi * 0.0 + + hit.addForce(forceM * force, newAngle) + def angleTwoSprites(self, sprite1, sprite2): x1 = sprite1.getX() z1 = sprite1.getZ() @@ -470,61 +439,252 @@ class GardenDropGame(DirectObject.DirectObject): x = x2 - x1 z = z2 - z1 angle = math.atan2(-x, z) + return angle + pi * 0.5 - - def angleTwoPoints(self, x1, z1, x2, z2): - x = x2 - x1 - z = z2 - z1 - angle = math.atan2(-x, z) - return angle + pi * 0.5 - - def __collide(self, move, test): - queHit = 0 - if move.isQue: - que = move - hit = test - queHit = 1 - elif test.isQue: - que = test - hit = move - queHit = 1 + + def doOnClearGrid(self): + secondSprite = self.addSprite(self.block, posX=GardenGameGlobals.newBallX, posZ=0.0, found=1) + secondSprite.addForce(0, 1.55 * pi) + self.stickInGrid(secondSprite, 1) + + def __run(self, Task): + if self.lastTime == None: + self.lastTime = globalClock.getRealTime() + + timeDelta = 0.0265 + self.lastTime = globalClock.getRealTime() + GardenGameGlobals.newBallCountUp += timeDelta + + if base.mouseWatcherNode.hasMouse(): + x = base.mouseWatcherNode.getMouseX() + y = base.mouseWatcherNode.getMouseY() + self.queBall.setX(x) + self.queBall.setZ(y) + + for sprite in self.sprites: + sprite.run(timeDelta) + if sprite.getX() > GardenGameGlobals.maxX: + sprite.setX(GardenGameGlobals.maxX) + sprite.velX = -sprite.velX + + if sprite.getX() < GardenGameGlobals.minX: + sprite.setX(GardenGameGlobals.minX) + sprite.velX = -sprite.velX + + if sprite.getZ() > GardenGameGlobals.maxZ: + sprite.setZ(GardenGameGlobals.maxZ) + sprite.velZ = -sprite.velZ + + if sprite.getZ() < GardenGameGlobals.minZ: + self.stickInGrid(sprite, 1) + + if sprite.isActive: + sprite.addForce(timeDelta * 0.9, pi * 1.5) + + self.queBall.velX = (self.queBall.getX() - self.queBall.prevX) / timeDelta + self.queBall.velZ = (self.queBall.getZ() - self.queBall.prevZ) / timeDelta + self.__colTest() + + for sprite in self.sprites: + if sprite.markedForDeath: + if sprite.foundation: + self.foundCount -= 1 + + self.sprites.remove(sprite) + sprite.delete() + + if GardenGameGlobals.controlSprite == None: + self.addControlSprite(GardenGameGlobals.newBallX, GardenGameGlobals.newBallZ) + GardenGameGlobals.newBallCountUp = 0.0 + + if GardenGameGlobals.newBallCountUp >= GardenGameGlobals.newBallTime: + self.addControlSprite(GardenGameGlobals.newBallX, GardenGameGlobals.newBallZ) + GardenGameGlobals.newBallCountUp = 0.0 + + if not GardenGameGlobals.controlSprite.isActive: + GardenGameGlobals.controlSprite = None + + if self.foundCount <= 0: + self.__handleWin() + + return Task.cont + + def loadStartingSprites(self, levelNum): + self.queBall = self.addSprite(self.block, posX=0.25, posZ=0.5, found=0) + self.queBall.setColor(GardenGameGlobals.colorWhite) + self.queBall.isQue = 1 + + GardenGameGlobals.controlSprite = None + self.cogSprite = self.addUnSprite(self.block, posX=0.25, posZ=0.5) + self.cogSprite.setColor(GardenGameGlobals.colorBlack) + + for ball in range(0, levelNum): + place = random.random() * GardenGameGlobals.rangeX + self.newSprite = self.addSprite(self.block, size=0.5, posX=GardenGameGlobals.minX + place, posZ=0.0, found=1) + self.stickInGrid(self.newSprite, 1) + + def __handlePlay(self): + if hasattr(base, 'localAvatar'): + base.cr.playGame.getPlace().fsm.forceTransition('stopped') + + self.reinitialize() + self.load() + + self.itemboard = self.model.find('**/item_board') + self.block = self.model1.find('**/minnieCircle') + + size = 0.085 + sizeZ = size * 0.8 + + for countX in range(GardenGameGlobals.gridDimX): + newRow = [] + for countZ in range(GardenGameGlobals.gridDimZ): + offset = 0 + if countZ % 2 == 0: + offset = size / 2 + newRow.append([None, countX * size + GardenGameGlobals.minX + offset, countZ * sizeZ + GardenGameGlobals.minZ]) + + self.grid.append(newRow) + + if LevelNumber == 1: + self.loadStartingSprites(3) + elif LevelNumber == 2: + self.loadStartingSprites(5) + elif LevelNumber == 3: + self.loadStartingSprites(7) + elif LevelNumber == 4: + self.loadStartingSprites(10) + elif LevelNumber == 5: + self.loadStartingSprites(15) + base.taskMgr.add(self._GardenDropGame__run,"MouseCheck") + + if hasattr(self, 'victoryFrame'): + self.victoryFrame.removeNode() + del self.victoryFrame + + def addControlSprite(self, x = 0.0, z = 0.0): + newSprite = self.addSprite(self.block, posX=x, posZ=z) + GardenGameGlobals.controlSprite = newSprite + + def playGardenDrop(self): + self.GDButtonImage = loader.loadModel("phase_3/models/gui/quit_button.bam") + self.font = loader.loadFont("phase_3/models/fonts/MickeyFont.bam") + self.yellowButton = (self.GDButtonImage.find('**/QuitBtn_UP'), self.GDButtonImage.find('**/QuitBtn_DN'), self.GDButtonImage.find('**/QuitBtn_RLVR')) + + self.GardenGameButton = DirectButton(frameSize=(0), text=TTLocalizer.GardenDropButtonTitle, image=self.yellowButton, text_pos=(0,0.01), relief=None, text_fg=(1, 1, 1, 1), \ + geom=None, pad=(0.01, 0.01), suppressKeys=0, command=self.deleteGDButton, pos=(-.62,0,-.89), text_font=self.font, text_scale=(0.083,0.040,0.049), borderWidth=(0.13, 0.01), scale=(0.8,1,1.8)) + + base.localAvatar.gardenGameButton = self.GardenGameButton + + def __openHelp(self): + self.unload() + self.help() + base.taskMgr.remove('MouseCheck') + + def unload(self): + self.frame.destroy() + del self.frame + + if (GardenGameGlobals.acceptErrorDialog and GardenGameGlobals.acceptErrorDialog.cleanup()): + GardenGameGlobals.acceptErrorDialog = 1 + + def unloadHelp(self): + self.helpFrame.removeNode() + self._GardenDropGame__handlePlay() + + def deleteGDButton(self): + self.GardenGameButton.removeNode() + self.__handlePlay() + + def __handleExit(self): + self._GardenDropGame__acceptExit() + + def __acceptExit(self, buttonValue = None): + global LevelNumber + if hasattr(base, 'localAvatar'): + base.cr.playGame.getPlace().fsm.forceTransition('walk') + + self.playGardenDrop() + if (hasattr(self, 'frame') and self.frame.hide()): + self.unload() + messenger.send(GardenGameGlobals.doneEvent) + + LevelNumber = 1 + base.taskMgr.remove('MouseCheck') + + def __handleWin(self): + global LevelNumber + self.unload() + self.loadWin() + LevelNumber += 1 + base.taskMgr.remove('MouseCheck') + + def loadWin(self): + model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel.bam') + model1 = loader.loadModel('phase_3.5/models/gui/matching_game_gui.bam') + + self.model = model + self.model1 = model1 + + background = model.find('**/bg') + itemBoard = model.find('**/item_board') + + frameGui = loader.loadModel('phase_3/models/gui/dialog_box_gui.bam') + self.victoryFrame = DirectFrame(scale=1.1, relief=None, image=frameGui, image_scale=(1.75, 1, 0.75), image_color=(1,1,1,1), frameSize=(-0.5, + 0.5, + -0.45, + -0.05)) + + frameGui2 = loader.loadModel('phase_3.5/models/gui/jar_gui.bam') + self.jar = DirectFrame(parent=self.victoryFrame, scale=(0.65,1.4,1.3), relief=None, image=frameGui2, image_scale=(1.75, 1, 0.75), image_color=(1,1,1,1), pos=(-0.5,-0.15,-0.075), frameSize=(-0.5, + 0.45, + -0.45, + -0.05)) + + gui2 = loader.loadModel('phase_3/models/gui/quit_button.bam') + self.font = loader.loadFont("phase_3/models/fonts/MickeyFont.bam") + + if LevelNumber == 5: + congratsMessage = TTLocalizer.GardenDropWinGame else: - test.velX = 0 - test.velZ = 0 - move.velX = 0 - move.velZ = 0 - test.collide() - move.collide() - self.stickInGrid(move) - self.stickInGrid(test) - if queHit: - forceM = 0.1 - distX = que.getX() - hit.getX() - distZ = que.getZ() - hit.getZ() - - def push(self, move, test): - queHit = 0 - if move.isQue: - que = move - hit = test - queHit = 1 - elif test.isQue: - que = test - hit = move - queHit = 1 - if queHit: - forceM = 0.1 - dist = self.testDistance(move.nodeObj, test.nodeObj) - if abs(dist) < self.queExtent * que.size and abs(dist) > 0: - scaleSize = self.queExtent * que.size * 0.5 - distFromPara = abs(abs(dist) - scaleSize) - force = (scaleSize - distFromPara) / scaleSize * (dist / abs(dist)) - angle = self.angleTwoSprites(que, hit) - if angle < 0: - angle = angle + 2 * pi - if angle > pi * 2.0: - angle = angle - 2 * pi - newAngle = pi * 1.0 - if angle > pi * 1.5 or angle < pi * 0.5: - newAngle = pi * 0.0 - hit.addForce(forceM * force, newAngle) + congratsMessage = TTLocalizer.GardenDropProgressLevels + self.nextButton = DirectButton(parent=self.victoryFrame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0, 1.0, -0.32), scale=0.9, text=TTLocalizer.lNext, text_font=self.font, text0_fg=(1, 1, 1, 1), text1_fg=(1, 1, 1, 1), text2_fg=(1, 1, 1, 1), text_scale=0.045, text_pos=(0, -0.01), command=self._GardenDropGame__handlePlay) + + self.congratsText = DirectLabel(scale=1.1, relief=None, text_pos=(0, 0.2), text_wordwrap=16, text=TTLocalizer.GardenDropCongradulations, text_font=self.font, pos=(0.0, 0.0, 0.0), text_scale=0.1, text0_fg=(1, 1, 1, 1), parent=self.victoryFrame) + + self.font2 = loader.loadFont("phase_3/models/fonts/Comedy.bam") + self.congratsText2 = DirectLabel(scale=1.1, relief=None, text_pos=(0.2, 0.025), text_wordwrap=10, text=congratsMessage, text_font=self.font2, pos=(0.0, 0.0, 0.0), text_scale=0.085, text0_fg=(0, 0, 0, 1), parent=self.victoryFrame) + + self.quitButton = DirectButton(parent=self.victoryFrame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0.5, 1.0, -0.32), scale=0.9, text=TTLocalizer.GardenDropExit, text_font=self.font, text0_fg=(1, 1, 1, 1), text1_fg=(1, 1, 1, 1), text2_fg=(1, 1, 1, 1), text_scale=0.045, text_pos=(0, -0.01), command=self.__handleExitWin) + + return True + + def unloadWin(self): + self.victoryFrame.removeNode() + del self.victoryFrame + + if GardenGameGlobals.acceptErrorDialog: + GardenGameGlobals.acceptErrorDialog.cleanup() + GardenGameGlobals.acceptErrorDialog = None + + self.playGardenDrop() + base.taskMgr.remove('gameTask') + + return True + + def __handleExitWin(self): + global LevelNumber + self._GardenDropGame__acceptExitWin() + LevelNumber = 1 + + def __acceptExitWin(self, buttonValue = None): + if hasattr(base, 'localAvatar'): + base.cr.playGame.getPlace().fsm.forceTransition('walk') + + if hasattr(self, 'victoryFrame'): + self.unloadWin() + messenger.send(GardenGameGlobals.doneEvent) + + def endGame(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.gardenGameButton.removeNode() \ No newline at end of file diff --git a/toontown/estate/GardenGameGlobals.py b/toontown/estate/GardenGameGlobals.py new file mode 100644 index 00000000..e746bc98 --- /dev/null +++ b/toontown/estate/GardenGameGlobals.py @@ -0,0 +1,36 @@ +acceptErrorDialog = 0 +doneEvent = 'game Done' +colorRed = (1, 0, 0, 1) +colorBlue = (0, 0, 1, 1) +colorGreen = (0, 1, 0, 1) +colorGhostRed = (1, 0, 0, 0.5) +colorGhostGreen = (0, 1, 0, 0.5) +colorWhite = (1, 1, 1, 1) +colorBlack = (0.5, 0.5, 0.5, 1.0) +colorShadow = (0, 0, 0, 0.5) +running = 0 +maxX = 0.46999999999999997 +minX = -0.46999999999999997 +maxZ = 0.75000000000000002 +minZ = -0.00000000000000001 +newBallX = 0.0 +newBallZ = 0.69999999999999998 +rangeX = (maxX - minX) +rangeZ = (maxZ - minZ) +size = 0.085000000000000006 +sizeZ = (size * 0.80000000000000004) +gX = int((rangeX / size)) +gZ = int((rangeZ / sizeZ)) +maxX = (minX + (gX * size)) +maxZ = (minZ + (gZ * sizeZ)) +controlOffsetX = 0.0 +controlOffsetZ = 0.0 +queExtent = 3 +gridDimX = gX +gridDimZ = gZ +gridBrick = False +newBallTime = 1.0 +newBallCountUp = 0.0 +cogX = 0 +cogZ = 0 +controlSprite = None \ No newline at end of file diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index d1ec2373..3288964d 100644 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -9609,6 +9609,16 @@ CheckersObserver = 'You are Observing' RegularCheckers = 'Checkers.' RegularCheckersGameOf = ' has just won a game of ' RegularCheckersYouWon = 'You just won a game of Checkers!' +GardenDropTitle = 'Garden Drop' +GardenDropExitGame = 'Exit Mini Game' +GardenDropHelpTitle = 'Instructions:' +GardenDropInstructions = "Match the ghost balls with the normal balls! But beware of the cog ball, it will try to block you off!" +GardenDropBackToGame = "Back to Game" +GardenDropButtonTitle = 'Garden\nDrop' +GardenDropCongradulations = 'Super Congratulations!!' +GardenDropProgressLevels = "Click 'Next' to go to the next level!" +GardenDropWinGame = 'You have won the Garden Drop Game!' +GardenDropExit = 'Exit' MailNotifyNewItems = "You've got mail!" MailNewMailButton = 'Mail' MailSimpleMail = 'Note' From a0e61b23b6ce2c53b35a4f4bfaf44f0a96c913fe Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 17:28:35 +0300 Subject: [PATCH 03/20] Add weed shirt --- toontown/catalog/CatalogClothingItem.py | 3 ++- toontown/toon/ToonDNA.py | 9 ++++++--- toontown/toonbase/TTLocalizerEnglish.py | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/toontown/catalog/CatalogClothingItem.py b/toontown/catalog/CatalogClothingItem.py index 2086c3c7..af3d2b9a 100644 --- a/toontown/catalog/CatalogClothingItem.py +++ b/toontown/catalog/CatalogClothingItem.py @@ -290,7 +290,8 @@ ClothingTypes = {101: (ABoysShirt, 'bss1', 40), 1817: (AGirlsSkirt, 'sa_gs19', 5000), 1818: (AGirlsSkirt, 'sa_gs20', 5000), 1819: (AGirlsSkirt, 'sa_gs21', 5000), - 1820: (AShirt, 'sa_ss55', 5000)} + 1820: (AShirt, 'sa_ss55', 5000), + 1821: (AShirt, 'weed', 5000)} LoyaltyClothingItems = (1600, 1601, 1602, diff --git a/toontown/toon/ToonDNA.py b/toontown/toon/ToonDNA.py index 29306315..b0d38a27 100644 --- a/toontown/toon/ToonDNA.py +++ b/toontown/toon/ToonDNA.py @@ -322,7 +322,8 @@ Shirts = ['phase_3/maps/desat_shirt_1.jpg', 'phase_4/maps/tt_t_chr_avt_shirt_trolley05.jpg', 'phase_4/maps/tt_t_chr_avt_shirt_saveBuilding4.jpg', 'phase_4/maps/tt_t_chr_avt_shirt_saveBuilding05.jpg', - 'phase_4/maps/tt_t_chr_avt_shirt_anniversary.jpg'] + 'phase_4/maps/tt_t_chr_avt_shirt_anniversary.jpg', + 'phase_4/maps/WeedShirt.jpg'] BoyShirts = [(0, 0), (1, 1), (2, 2), @@ -657,7 +658,8 @@ ClothesColors = [VBase4(0.933594, 0.265625, 0.28125, 1.0), VBase4(0.0, 0.2, 0.956862, 1.0), VBase4(0.972549, 0.094117, 0.094117, 1.0), VBase4(0.447058, 0.0, 0.90196, 1.0), - VBase4(0.3, 0.3, 0.35, 1.0)] + VBase4(0.3, 0.3, 0.35, 1.0), + VBase4(0.196078, 0.803921, 0.196078, 1.0)] ShirtStyles = {'bss1': [0, 0, [(0, 0), (1, 1), (2, 2), @@ -1225,7 +1227,8 @@ ShirtStyles = {'bss1': [0, 0, [(0, 0), 'jb_1': [112, 99, [(27, 27)]], 'jb_2': [113, 100, [(27, 27)]], 'ugcms': [117, 104, [(27, 27)]], - 'lb_1': [119, 106, [(27, 27)]]} + 'lb_1': [119, 106, [(27, 27)]], + 'weed': [148, 0, [(27, 32)]]} BottomStyles = {'bbs1': [0, [0, 1, 2, diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index d1ec2373..d968f73e 100644 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -6135,7 +6135,8 @@ ShirtStylesDescriptions = {'bss1': 'solid', 'lb_1': 'Lawbot Icon Shirt', 'jb_1': 'Jellybean Shirt', 'jb_2': 'Doodle Shirt', - 'ugcms': 'Get Connected Mover & Shaker'} + 'ugcms': 'Get Connected Mover & Shaker', + 'weed': '420 BlazeIt Shirt'} BottomStylesDescriptions = {'bbs1': 'plain w/ pockets', 'bbs2': 'belt', 'bbs3': 'cargo', @@ -6675,7 +6676,8 @@ ClothingTypeNames = {1001: 'Ghost Shirt', 1783: 'Racing Shorts 1', 1784: 'Racing Skirt 1', 1801: 'Batty Moon Shirt', - 1802: 'Mittens Shirt'} + 1802: 'Mittens Shirt', + 1821: '420 BlazeIt Shirt'} AccessoryArticleNames = ('Hat', 'Glasses', 'Backpack', From f5e41df8f8b55dda12398c7b12d1216080a6d2aa Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 17:29:11 +0300 Subject: [PATCH 04/20] Implement code redemption! Woo! --- astron/dclass/toon.dc | 5 +- otp/distributed/DCClassImports.py | 2 +- toontown/ai/ToontownAIRepository.py | 3 + .../coderedemption/TTCodeRedemptionMgr.py | 8 +-- .../coderedemption/TTCodeRedemptionMgrAI.py | 57 +++++++++++++++---- .../coderedemption/TTCodeRedemptionMgrUD.py | 21 ------- .../distributed/ToontownClientRepository.py | 2 - toontown/shtiker/OptionsPage.py | 4 +- 8 files changed, 58 insertions(+), 44 deletions(-) delete mode 100644 toontown/coderedemption/TTCodeRedemptionMgrUD.py diff --git a/astron/dclass/toon.dc b/astron/dclass/toon.dc index 909a87eb..e716f7ac 100644 --- a/astron/dclass/toon.dc +++ b/astron/dclass/toon.dc @@ -287,7 +287,7 @@ from toontown.uberdog.DistributedPartyManager/AI/UD import DistributedPartyManag from toontown.rpc.AwardManager/UD import AwardManager/UD from toontown.uberdog.DistributedCpuInfoMgr/AI/UD import DistributedCpuInfoMgr/AI/UD from toontown.uberdog.DistributedInGameNewsMgr/AI/UD import DistributedInGameNewsMgr/AI/UD -from toontown.coderedemption.TTCodeRedemptionMgr/AI/UD import TTCodeRedemptionMgr/AI/UD +from toontown.coderedemption.TTCodeRedemptionMgr/AI import TTCodeRedemptionMgr/AI from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI from toontown.distributed.NonRepeatableRandomSourceUD import NonRepeatableRandomSourceUD from toontown.ai.DistributedPhaseEventMgr/AI import DistributedPhaseEventMgr/AI @@ -3310,10 +3310,7 @@ dclass NonRepeatableRandomSourceClient { }; dclass TTCodeRedemptionMgr : DistributedObject, NonRepeatableRandomSourceClient { - giveAwardToToonResult(uint32, uint32); redeemCode(uint32, char [0-256]) airecv clsend; - redeemCodeAiToUd(uint32, DoId, uint32, string, uint32); - redeemCodeResultUdToAi(uint32, uint32, uint32, uint32, uint32) airecv; redeemCodeResult(uint32, uint32, uint32); }; diff --git a/otp/distributed/DCClassImports.py b/otp/distributed/DCClassImports.py index 3f9638d0..f722360e 100644 --- a/otp/distributed/DCClassImports.py +++ b/otp/distributed/DCClassImports.py @@ -2,7 +2,7 @@ from pandac.PandaModules import * -hashVal = 3181838135L +hashVal = 1907389465 from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index f1dcad48..b895f1c4 100644 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -27,6 +27,7 @@ from toontown.coghq import MintManagerAI from toontown.distributed.ToontownDistrictAI import ToontownDistrictAI from toontown.distributed.ToontownDistrictStatsAI import ToontownDistrictStatsAI from toontown.distributed.ToontownInternalRepository import ToontownInternalRepository +from toontown.coderedemption.TTCodeRedemptionMgrAI import TTCodeRedemptionMgrAI from toontown.dna.DNAParser import loadDNAFileAI from toontown.estate.EstateManagerAI import EstateManagerAI from toontown.hood import BRHoodAI @@ -115,6 +116,8 @@ class ToontownAIRepository(ToontownInternalRepository): self.cogPageManager = CogPageManagerAI.CogPageManagerAI() self.bankManager = BankManagerAI.BankManagerAI(self) self.holidayManager = HolidayManagerAI(self) + self.codeRedemptionMgr = TTCodeRedemptionMgrAI(self) + self.codeRedemptionMgr.generateWithRequired(2) self.buildingQueryMgr = DistributedBuildingQueryMgrAI(self) self.buildingQueryMgr.generateWithRequired(2) if self.wantFishing: diff --git a/toontown/coderedemption/TTCodeRedemptionMgr.py b/toontown/coderedemption/TTCodeRedemptionMgr.py index 8f4d8a93..7ba47e94 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgr.py +++ b/toontown/coderedemption/TTCodeRedemptionMgr.py @@ -10,14 +10,14 @@ class TTCodeRedemptionMgr(DistributedObject): def announceGenerate(self): DistributedObject.announceGenerate(self) - base.codeRedemptionMgr = self + base.cr.codeRedemptionMgr = self self._contextGen = SerialMaskedGen(4294967295L) self._context2callback = {} def delete(self): - if hasattr(base, 'codeRedemptionMgr'): - if base.codeRedemptionMgr is self: - del base.codeRedemptionMgr + if hasattr(base.cr, 'codeRedemptionMgr'): + if base.cr.codeRedemptionMgr is self: + del base.cr.codeRedemptionMgr self._context2callback = None self._contextGen = None DistributedObject.delete(self) diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index c53f10e9..bd060d98 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -1,21 +1,58 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI +from toontown.catalog import CatalogClothingItem +from toontown.toonbase import ToontownGlobals +from datetime import datetime +import time class TTCodeRedemptionMgrAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrAI") + codes = { + 'weed': { + 'item': CatalogClothingItem.CatalogClothingItem(1821, 0), + 'month': 4, + 'day': 20 + } + } - def giveAwardToToonResult(self, todo0, todo1): - pass + def announceGenerate(self): + DistributedObjectAI.announceGenerate(self) - def redeemCode(self, todo0, todo1): - pass + def redeemCode(self, context, code): + avId = self.air.getAvatarIdFromSender() - def redeemCodeAiToUd(self, todo0, todo1, todo2, todo3, todo4): - pass + if code in self.codes: + codeInfo = self.codes[code] + date = datetime.now() - def redeemCodeResultUdToAi(self, todo0, todo1, todo2, todo3, todo4): - pass + if ('month' in codeInfo and date.month is not codeInfo['month']) or ('day' in codeInfo and date.day is not codeInfo['day']): + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 2, 0]) + return - def redeemCodeResult(self, todo0, todo1, todo2): - pass + self.requestCodeRedeem(context, codeInfo['item']) + else: + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 1, 0]) + + def requestCodeRedeem(self, context, item): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if not av: + return + + if len(av.onOrder) > 5: + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 4, 4]) + return + + if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents: + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 4, 3]) + return + + if item in av.onOrder or item.reachedPurchaseLimit(av): + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 4, 13]) + return + + item.deliveryDate = int(time.time() / 60) + 0.01 + av.onOrder.append(item) + av.b_setDeliverySchedule(av.onOrder) + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 0, 0]) \ No newline at end of file diff --git a/toontown/coderedemption/TTCodeRedemptionMgrUD.py b/toontown/coderedemption/TTCodeRedemptionMgrUD.py deleted file mode 100644 index 59b34e61..00000000 --- a/toontown/coderedemption/TTCodeRedemptionMgrUD.py +++ /dev/null @@ -1,21 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectUD import DistributedObjectUD - -class TTCodeRedemptionMgrUD(DistributedObjectUD): - notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrUD") - - def giveAwardToToonResult(self, todo0, todo1): - pass - - def redeemCode(self, todo0, todo1): - pass - - def redeemCodeAiToUd(self, todo0, todo1, todo2, todo3, todo4): - pass - - def redeemCodeResultUdToAi(self, todo0, todo1, todo2, todo3, todo4): - pass - - def redeemCodeResult(self, todo0, todo1, todo2): - pass - diff --git a/toontown/distributed/ToontownClientRepository.py b/toontown/distributed/ToontownClientRepository.py index bd6d400f..02b2799d 100644 --- a/toontown/distributed/ToontownClientRepository.py +++ b/toontown/distributed/ToontownClientRepository.py @@ -95,8 +95,6 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): self.playerFriendsManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PLAYER_FRIENDS_MANAGER, 'TTPlayerFriendsManager') self.ttuFriendsManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_TTU_FRIENDS_MANAGER, 'TTUFriendsManager') self.deliveryManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_TOONTOWN_DELIVERY_MANAGER, 'DistributedDeliveryManager') - if config.GetBool('want-code-redemption', 1): - self.codeRedemptionManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_TOONTOWN_CODE_REDEMPTION_MANAGER, 'TTCodeRedemptionMgr') self.streetSign = None self.furnitureManager = None diff --git a/toontown/shtiker/OptionsPage.py b/toontown/shtiker/OptionsPage.py index 331d44ce..bb558da8 100644 --- a/toontown/shtiker/OptionsPage.py +++ b/toontown/shtiker/OptionsPage.py @@ -633,8 +633,8 @@ class CodesTabPage(DirectFrame): if input == '': return messenger.send('wakeup') - if hasattr(base, 'codeRedemptionMgr'): - base.codeRedemptionMgr.redeemCode(input, self.__getCodeResult) + if hasattr(base.cr, 'codeRedemptionMgr'): + base.cr.codeRedemptionMgr.redeemCode(input, self.__getCodeResult) self.codeInput.enterText('') self.__disableCodeEntry() return From 6db0c8c70ffcee3676cb40b033b0bdf5ddd341d2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 17:31:10 +0300 Subject: [PATCH 05/20] Removed unused code redemption file --- toontown/coderedemption/TTCodeRedemptionConsts.py | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 toontown/coderedemption/TTCodeRedemptionConsts.py diff --git a/toontown/coderedemption/TTCodeRedemptionConsts.py b/toontown/coderedemption/TTCodeRedemptionConsts.py deleted file mode 100644 index 912b5a6e..00000000 --- a/toontown/coderedemption/TTCodeRedemptionConsts.py +++ /dev/null @@ -1,10 +0,0 @@ -DefaultDbName = 'tt_code_redemption' -RedeemErrors = Enum('Success, CodeDoesntExist, CodeIsInactive, CodeAlreadyRedeemed, AwardCouldntBeGiven, TooManyAttempts, SystemUnavailable, ') -RedeemErrorStrings = {RedeemErrors.Success: 'Success', - RedeemErrors.CodeDoesntExist: 'Invalid code', - RedeemErrors.CodeIsInactive: 'Code is inactive', - RedeemErrors.CodeAlreadyRedeemed: 'Code has already been redeemed', - RedeemErrors.AwardCouldntBeGiven: 'Award could not be given', - RedeemErrors.TooManyAttempts: 'Too many attempts, code ignored', - RedeemErrors.SystemUnavailable: 'Code redemption is currently unavailable'} -MaxCustomCodeLen = config.GetInt('tt-max-custom-code-len', 16) From 85207c4f8bc2bcb52789f48e27028478401d97b4 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 17:39:17 +0300 Subject: [PATCH 06/20] Removed CpuInfoMgr and DataStoreManager unused stubs --- astron/dclass/toon.dc | 14 ------------- otp/distributed/DCClassImports.py | 4 +--- toontown/uberdog/DistributedCpuInfoMgr.py | 4 ---- toontown/uberdog/DistributedCpuInfoMgrAI.py | 9 -------- toontown/uberdog/DistributedCpuInfoMgrUD.py | 9 -------- .../uberdog/DistributedDataStoreManager.py | 7 ------- .../uberdog/DistributedDataStoreManagerAI.py | 21 ------------------- .../uberdog/DistributedDataStoreManagerUD.py | 21 ------------------- 8 files changed, 1 insertion(+), 88 deletions(-) delete mode 100644 toontown/uberdog/DistributedCpuInfoMgr.py delete mode 100644 toontown/uberdog/DistributedCpuInfoMgrAI.py delete mode 100644 toontown/uberdog/DistributedCpuInfoMgrUD.py delete mode 100644 toontown/uberdog/DistributedDataStoreManager.py delete mode 100644 toontown/uberdog/DistributedDataStoreManagerAI.py delete mode 100644 toontown/uberdog/DistributedDataStoreManagerUD.py diff --git a/astron/dclass/toon.dc b/astron/dclass/toon.dc index e716f7ac..90de408a 100644 --- a/astron/dclass/toon.dc +++ b/astron/dclass/toon.dc @@ -209,7 +209,6 @@ from toontown.racing import DistributedProjectile/AI from toontown.racing.DistributedStartingBlock/AI import DistributedViewingBlock/AI from toontown.uberdog.ClientServicesManager/UD import ClientServicesManager/UD from toontown.uberdog.DistributedDeliveryManager/AI/UD import DistributedDeliveryManager/AI/UD -from toontown.uberdog.DistributedDataStoreManager/AI/UD import DistributedDataStoreManager/AI/UD from toontown.suit import DistributedLawbotBoss/AI from toontown.coghq import DistributedLawbotBossGavel/AI from toontown.suit import DistributedLawbotBossSuit/AI @@ -285,7 +284,6 @@ from toontown.safezone import DistributedFindFour/AI from toontown.uberdog.DistributedMailManager/AI/UD import DistributedMailManager/AI/UD from toontown.uberdog.DistributedPartyManager/AI/UD import DistributedPartyManager/AI/UD from toontown.rpc.AwardManager/UD import AwardManager/UD -from toontown.uberdog.DistributedCpuInfoMgr/AI/UD import DistributedCpuInfoMgr/AI/UD from toontown.uberdog.DistributedInGameNewsMgr/AI/UD import DistributedInGameNewsMgr/AI/UD from toontown.coderedemption.TTCodeRedemptionMgr/AI import TTCodeRedemptionMgr/AI from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI @@ -2516,14 +2514,6 @@ dclass DistributedWinterCarolingTarget : DistributedObject { requestScavengerHunt() airecv clsend; }; -dclass DistributedDataStoreManager : DistributedObject { - startStore(uint8); - stopStore(uint8); - queryStore(uint8, string); - receiveResults(uint8, string); - deleteBackupStores(); -}; - dclass DistributedVehicle : DistributedSmoothNode { setOwner(uint32) required broadcast ram; setState(char, uint32) broadcast ram; @@ -3301,10 +3291,6 @@ dclass AwardManager : DistributedObjectGlobal { giveAwardToToon(uint32, DoId, string, DoId, uint32, uint32); }; -dclass DistributedCpuInfoMgr : DistributedObjectGlobal { - setCpuInfoToUd(uint32, uint32, string, string); -}; - dclass NonRepeatableRandomSourceClient { getRandomSamplesReply(uint32, uint32 []) airecv; }; diff --git a/otp/distributed/DCClassImports.py b/otp/distributed/DCClassImports.py index f722360e..dbe7b7a2 100644 --- a/otp/distributed/DCClassImports.py +++ b/otp/distributed/DCClassImports.py @@ -2,7 +2,7 @@ from pandac.PandaModules import * -hashVal = 1907389465 +hashVal = 1275950154 from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot @@ -19,7 +19,6 @@ from toontown.ai.DistributedTrashcanZeroMgr import DistributedTrashcanZeroMgr from toontown.uberdog.DistributedMailManager import DistributedMailManager from otp.chat import ChatAgent from toontown.classicchars import DistributedCCharBase, DistributedMickey, DistributedVampireMickey, DistributedMinnie, DistributedWitchMinnie, DistributedGoofy, DistributedSuperGoofy, DistributedDaisy, DistributedSockHopDaisy, DistributedChip, DistributedPoliceChip, DistributedDale, DistributedJailbirdDale, DistributedGoofySpeedway, DistributedDonald, DistributedFrankenDonald, DistributedDonaldDock, DistributedPluto, DistributedWesternPluto -from toontown.uberdog.DistributedCpuInfoMgr import DistributedCpuInfoMgr from toontown.parties.GlobalPartyManager import GlobalPartyManager from toontown.racing.DistributedStartingBlock import DistributedViewingBlock from toontown.ai.DistributedPhaseEventMgr import DistributedPhaseEventMgr @@ -27,7 +26,6 @@ from toontown.pets.PetDCImports import * from toontown.suit import DistributedSuitPlanner, DistributedSuitBase, DistributedSuit, DistributedTutorialSuit, DistributedFactorySuit, DistributedMintSuit, DistributedStageSuit, DistributedSellbotBoss, DistributedCashbotBoss, DistributedCashbotBossGoon, DistributedGoon, DistributedGridGoon, DistributedLawbotBoss, DistributedLawbotBossSuit, DistributedBossbotBoss from toontown.distributed import ToontownDistrict, ToontownDistrictStats, DistributedTimer from toontown.effects import DistributedFireworkShow -from toontown.uberdog.DistributedDataStoreManager import DistributedDataStoreManager from toontown.safezone import DistributedTrolley, DistributedPartyGate, DistributedBoat, DistributedButterfly, DistributedMMPiano, DistributedDGFlower, DistributedFishingSpot, SafeZoneManager, DistributedTreasure, DistributedGolfKart, DistributedPicnicBasket, DistributedGameTable, DistributedChineseCheckers, DistributedCheckers, DistributedFindFour from toontown.fishing import DistributedFishingPond, DistributedFishingTarget, DistributedPondBingoManager from toontown.minigame import DistributedMinigame, DistributedMinigameTemplate, DistributedRaceGame, DistributedCannonGame, DistributedPhotoGame, DistributedPatternGame, DistributedRingGame, DistributedTagGame, DistributedMazeGame, DistributedTugOfWarGame, DistributedCatchGame, DistributedDivingGame, DistributedTargetGame, DistributedTravelGame, DistributedPairingGame, DistributedVineGame, DistributedIceGame, DistributedCogThiefGame, DistributedTwoDGame diff --git a/toontown/uberdog/DistributedCpuInfoMgr.py b/toontown/uberdog/DistributedCpuInfoMgr.py deleted file mode 100644 index 2043edf1..00000000 --- a/toontown/uberdog/DistributedCpuInfoMgr.py +++ /dev/null @@ -1,4 +0,0 @@ -from direct.distributed.DistributedObjectGlobal import DistributedObjectGlobal - -class DistributedCpuInfoMgr(DistributedObjectGlobal): - pass diff --git a/toontown/uberdog/DistributedCpuInfoMgrAI.py b/toontown/uberdog/DistributedCpuInfoMgrAI.py deleted file mode 100644 index cc3ff688..00000000 --- a/toontown/uberdog/DistributedCpuInfoMgrAI.py +++ /dev/null @@ -1,9 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectGlobalAI import DistributedObjectGlobalAI - -class DistributedCpuInfoMgrAI(DistributedObjectGlobalAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCpuInfoMgrAI") - - def setCpuInfoToUd(self, todo0, todo1, todo2, todo3): - pass - diff --git a/toontown/uberdog/DistributedCpuInfoMgrUD.py b/toontown/uberdog/DistributedCpuInfoMgrUD.py deleted file mode 100644 index 88f8add1..00000000 --- a/toontown/uberdog/DistributedCpuInfoMgrUD.py +++ /dev/null @@ -1,9 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectGlobalUD import DistributedObjectGlobalUD - -class DistributedCpuInfoMgrUD(DistributedObjectGlobalUD): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCpuInfoMgrUD") - - def setCpuInfoToUd(self, todo0, todo1, todo2, todo3): - pass - diff --git a/toontown/uberdog/DistributedDataStoreManager.py b/toontown/uberdog/DistributedDataStoreManager.py deleted file mode 100644 index b21a6f0a..00000000 --- a/toontown/uberdog/DistributedDataStoreManager.py +++ /dev/null @@ -1,7 +0,0 @@ -from direct.distributed.DistributedObjectGlobal import DistributedObjectGlobal -from toontown.uberdog import DataStoreGlobals - -class DistributedDataStoreManager(DistributedObjectGlobal): - - def __init__(self): - pass diff --git a/toontown/uberdog/DistributedDataStoreManagerAI.py b/toontown/uberdog/DistributedDataStoreManagerAI.py deleted file mode 100644 index 55e6017c..00000000 --- a/toontown/uberdog/DistributedDataStoreManagerAI.py +++ /dev/null @@ -1,21 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectAI import DistributedObjectAI - -class DistributedDataStoreManagerAI(DistributedObjectAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedDataStoreManagerAI") - - def startStore(self, todo0): - pass - - def stopStore(self, todo0): - pass - - def queryStore(self, todo0, todo1): - pass - - def receiveResults(self, todo0, todo1): - pass - - def deleteBackupStores(self): - pass - diff --git a/toontown/uberdog/DistributedDataStoreManagerUD.py b/toontown/uberdog/DistributedDataStoreManagerUD.py deleted file mode 100644 index 7faa37cd..00000000 --- a/toontown/uberdog/DistributedDataStoreManagerUD.py +++ /dev/null @@ -1,21 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectUD import DistributedObjectUD - -class DistributedDataStoreManagerUD(DistributedObjectUD): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedDataStoreManagerUD") - - def startStore(self, todo0): - pass - - def stopStore(self, todo0): - pass - - def queryStore(self, todo0, todo1): - pass - - def receiveResults(self, todo0, todo1): - pass - - def deleteBackupStores(self): - pass - From 8e0724a55383231ed005c2f0c8c3b38f1d883668 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 17:56:38 +0300 Subject: [PATCH 07/20] Revert "Removed CpuInfoMgr and DataStoreManager unused stubs" This reverts commit 85207c4f8bc2bcb52789f48e27028478401d97b4. --- astron/dclass/toon.dc | 14 +++++++++++++ otp/distributed/DCClassImports.py | 4 +++- toontown/uberdog/DistributedCpuInfoMgr.py | 4 ++++ toontown/uberdog/DistributedCpuInfoMgrAI.py | 9 ++++++++ toontown/uberdog/DistributedCpuInfoMgrUD.py | 9 ++++++++ .../uberdog/DistributedDataStoreManager.py | 7 +++++++ .../uberdog/DistributedDataStoreManagerAI.py | 21 +++++++++++++++++++ .../uberdog/DistributedDataStoreManagerUD.py | 21 +++++++++++++++++++ 8 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 toontown/uberdog/DistributedCpuInfoMgr.py create mode 100644 toontown/uberdog/DistributedCpuInfoMgrAI.py create mode 100644 toontown/uberdog/DistributedCpuInfoMgrUD.py create mode 100644 toontown/uberdog/DistributedDataStoreManager.py create mode 100644 toontown/uberdog/DistributedDataStoreManagerAI.py create mode 100644 toontown/uberdog/DistributedDataStoreManagerUD.py diff --git a/astron/dclass/toon.dc b/astron/dclass/toon.dc index 90de408a..e716f7ac 100644 --- a/astron/dclass/toon.dc +++ b/astron/dclass/toon.dc @@ -209,6 +209,7 @@ from toontown.racing import DistributedProjectile/AI from toontown.racing.DistributedStartingBlock/AI import DistributedViewingBlock/AI from toontown.uberdog.ClientServicesManager/UD import ClientServicesManager/UD from toontown.uberdog.DistributedDeliveryManager/AI/UD import DistributedDeliveryManager/AI/UD +from toontown.uberdog.DistributedDataStoreManager/AI/UD import DistributedDataStoreManager/AI/UD from toontown.suit import DistributedLawbotBoss/AI from toontown.coghq import DistributedLawbotBossGavel/AI from toontown.suit import DistributedLawbotBossSuit/AI @@ -284,6 +285,7 @@ from toontown.safezone import DistributedFindFour/AI from toontown.uberdog.DistributedMailManager/AI/UD import DistributedMailManager/AI/UD from toontown.uberdog.DistributedPartyManager/AI/UD import DistributedPartyManager/AI/UD from toontown.rpc.AwardManager/UD import AwardManager/UD +from toontown.uberdog.DistributedCpuInfoMgr/AI/UD import DistributedCpuInfoMgr/AI/UD from toontown.uberdog.DistributedInGameNewsMgr/AI/UD import DistributedInGameNewsMgr/AI/UD from toontown.coderedemption.TTCodeRedemptionMgr/AI import TTCodeRedemptionMgr/AI from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI @@ -2514,6 +2516,14 @@ dclass DistributedWinterCarolingTarget : DistributedObject { requestScavengerHunt() airecv clsend; }; +dclass DistributedDataStoreManager : DistributedObject { + startStore(uint8); + stopStore(uint8); + queryStore(uint8, string); + receiveResults(uint8, string); + deleteBackupStores(); +}; + dclass DistributedVehicle : DistributedSmoothNode { setOwner(uint32) required broadcast ram; setState(char, uint32) broadcast ram; @@ -3291,6 +3301,10 @@ dclass AwardManager : DistributedObjectGlobal { giveAwardToToon(uint32, DoId, string, DoId, uint32, uint32); }; +dclass DistributedCpuInfoMgr : DistributedObjectGlobal { + setCpuInfoToUd(uint32, uint32, string, string); +}; + dclass NonRepeatableRandomSourceClient { getRandomSamplesReply(uint32, uint32 []) airecv; }; diff --git a/otp/distributed/DCClassImports.py b/otp/distributed/DCClassImports.py index dbe7b7a2..f722360e 100644 --- a/otp/distributed/DCClassImports.py +++ b/otp/distributed/DCClassImports.py @@ -2,7 +2,7 @@ from pandac.PandaModules import * -hashVal = 1275950154 +hashVal = 1907389465 from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot @@ -19,6 +19,7 @@ from toontown.ai.DistributedTrashcanZeroMgr import DistributedTrashcanZeroMgr from toontown.uberdog.DistributedMailManager import DistributedMailManager from otp.chat import ChatAgent from toontown.classicchars import DistributedCCharBase, DistributedMickey, DistributedVampireMickey, DistributedMinnie, DistributedWitchMinnie, DistributedGoofy, DistributedSuperGoofy, DistributedDaisy, DistributedSockHopDaisy, DistributedChip, DistributedPoliceChip, DistributedDale, DistributedJailbirdDale, DistributedGoofySpeedway, DistributedDonald, DistributedFrankenDonald, DistributedDonaldDock, DistributedPluto, DistributedWesternPluto +from toontown.uberdog.DistributedCpuInfoMgr import DistributedCpuInfoMgr from toontown.parties.GlobalPartyManager import GlobalPartyManager from toontown.racing.DistributedStartingBlock import DistributedViewingBlock from toontown.ai.DistributedPhaseEventMgr import DistributedPhaseEventMgr @@ -26,6 +27,7 @@ from toontown.pets.PetDCImports import * from toontown.suit import DistributedSuitPlanner, DistributedSuitBase, DistributedSuit, DistributedTutorialSuit, DistributedFactorySuit, DistributedMintSuit, DistributedStageSuit, DistributedSellbotBoss, DistributedCashbotBoss, DistributedCashbotBossGoon, DistributedGoon, DistributedGridGoon, DistributedLawbotBoss, DistributedLawbotBossSuit, DistributedBossbotBoss from toontown.distributed import ToontownDistrict, ToontownDistrictStats, DistributedTimer from toontown.effects import DistributedFireworkShow +from toontown.uberdog.DistributedDataStoreManager import DistributedDataStoreManager from toontown.safezone import DistributedTrolley, DistributedPartyGate, DistributedBoat, DistributedButterfly, DistributedMMPiano, DistributedDGFlower, DistributedFishingSpot, SafeZoneManager, DistributedTreasure, DistributedGolfKart, DistributedPicnicBasket, DistributedGameTable, DistributedChineseCheckers, DistributedCheckers, DistributedFindFour from toontown.fishing import DistributedFishingPond, DistributedFishingTarget, DistributedPondBingoManager from toontown.minigame import DistributedMinigame, DistributedMinigameTemplate, DistributedRaceGame, DistributedCannonGame, DistributedPhotoGame, DistributedPatternGame, DistributedRingGame, DistributedTagGame, DistributedMazeGame, DistributedTugOfWarGame, DistributedCatchGame, DistributedDivingGame, DistributedTargetGame, DistributedTravelGame, DistributedPairingGame, DistributedVineGame, DistributedIceGame, DistributedCogThiefGame, DistributedTwoDGame diff --git a/toontown/uberdog/DistributedCpuInfoMgr.py b/toontown/uberdog/DistributedCpuInfoMgr.py new file mode 100644 index 00000000..2043edf1 --- /dev/null +++ b/toontown/uberdog/DistributedCpuInfoMgr.py @@ -0,0 +1,4 @@ +from direct.distributed.DistributedObjectGlobal import DistributedObjectGlobal + +class DistributedCpuInfoMgr(DistributedObjectGlobal): + pass diff --git a/toontown/uberdog/DistributedCpuInfoMgrAI.py b/toontown/uberdog/DistributedCpuInfoMgrAI.py new file mode 100644 index 00000000..cc3ff688 --- /dev/null +++ b/toontown/uberdog/DistributedCpuInfoMgrAI.py @@ -0,0 +1,9 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.DistributedObjectGlobalAI import DistributedObjectGlobalAI + +class DistributedCpuInfoMgrAI(DistributedObjectGlobalAI): + notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCpuInfoMgrAI") + + def setCpuInfoToUd(self, todo0, todo1, todo2, todo3): + pass + diff --git a/toontown/uberdog/DistributedCpuInfoMgrUD.py b/toontown/uberdog/DistributedCpuInfoMgrUD.py new file mode 100644 index 00000000..88f8add1 --- /dev/null +++ b/toontown/uberdog/DistributedCpuInfoMgrUD.py @@ -0,0 +1,9 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.DistributedObjectGlobalUD import DistributedObjectGlobalUD + +class DistributedCpuInfoMgrUD(DistributedObjectGlobalUD): + notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCpuInfoMgrUD") + + def setCpuInfoToUd(self, todo0, todo1, todo2, todo3): + pass + diff --git a/toontown/uberdog/DistributedDataStoreManager.py b/toontown/uberdog/DistributedDataStoreManager.py new file mode 100644 index 00000000..b21a6f0a --- /dev/null +++ b/toontown/uberdog/DistributedDataStoreManager.py @@ -0,0 +1,7 @@ +from direct.distributed.DistributedObjectGlobal import DistributedObjectGlobal +from toontown.uberdog import DataStoreGlobals + +class DistributedDataStoreManager(DistributedObjectGlobal): + + def __init__(self): + pass diff --git a/toontown/uberdog/DistributedDataStoreManagerAI.py b/toontown/uberdog/DistributedDataStoreManagerAI.py new file mode 100644 index 00000000..55e6017c --- /dev/null +++ b/toontown/uberdog/DistributedDataStoreManagerAI.py @@ -0,0 +1,21 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.DistributedObjectAI import DistributedObjectAI + +class DistributedDataStoreManagerAI(DistributedObjectAI): + notify = DirectNotifyGlobal.directNotify.newCategory("DistributedDataStoreManagerAI") + + def startStore(self, todo0): + pass + + def stopStore(self, todo0): + pass + + def queryStore(self, todo0, todo1): + pass + + def receiveResults(self, todo0, todo1): + pass + + def deleteBackupStores(self): + pass + diff --git a/toontown/uberdog/DistributedDataStoreManagerUD.py b/toontown/uberdog/DistributedDataStoreManagerUD.py new file mode 100644 index 00000000..7faa37cd --- /dev/null +++ b/toontown/uberdog/DistributedDataStoreManagerUD.py @@ -0,0 +1,21 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.DistributedObjectUD import DistributedObjectUD + +class DistributedDataStoreManagerUD(DistributedObjectUD): + notify = DirectNotifyGlobal.directNotify.newCategory("DistributedDataStoreManagerUD") + + def startStore(self, todo0): + pass + + def stopStore(self, todo0): + pass + + def queryStore(self, todo0, todo1): + pass + + def receiveResults(self, todo0, todo1): + pass + + def deleteBackupStores(self): + pass + From c42511f670ce46bc9e69ff5124a0bb9b46f2572f Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 18:15:19 +0300 Subject: [PATCH 08/20] Enable parties, fix party cost and fix party planner crash --- config/events/grand-opening.prc | 2 +- config/release/dev.prc | 2 +- config/release/test.prc | 2 +- toontown/parties/PartyGlobals.py | 2 +- toontown/parties/PartyPlanner.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config/events/grand-opening.prc b/config/events/grand-opening.prc index bf6dc060..6b26c0d8 100644 --- a/config/events/grand-opening.prc +++ b/config/events/grand-opening.prc @@ -32,7 +32,7 @@ punchline-place-building-chance 100.0 want-fishing #f want-housing #f want-pets #f -want-parties #f +want-parties #t # Optional: want-talkative-tyler #f diff --git a/config/release/dev.prc b/config/release/dev.prc index ea637aa7..07fb4ae7 100644 --- a/config/release/dev.prc +++ b/config/release/dev.prc @@ -21,7 +21,7 @@ dc-file astron/dclass/otp.dc # Core features: want-pets #f -want-parties #f +want-parties #t want-cogdominiums #f want-achievements #f diff --git a/config/release/test.prc b/config/release/test.prc index 6b16e214..a7f318d7 100644 --- a/config/release/test.prc +++ b/config/release/test.prc @@ -10,7 +10,7 @@ shard-mid-pop 150 # Core features: want-housing #t want-pets #f -want-parties #f +want-parties #t want-cogdominiums #f want-achievements #f boarding-group-merges #t diff --git a/toontown/parties/PartyGlobals.py b/toontown/parties/PartyGlobals.py index c8d6a2c8..5119c5b2 100644 --- a/toontown/parties/PartyGlobals.py +++ b/toontown/parties/PartyGlobals.py @@ -231,7 +231,7 @@ PlayGroundToPartyClockColors = {'the_burrrgh': (53.0 / 255.0, PartyGridUnitLength = [14.4, 14.6] PartyGridHeadingConverter = 15.0 PartyGridToPandaOffset = (-PartyGridUnitLength[0] * PartyEditorGridSize[0] / 2.0, -PartyGridUnitLength[1] * PartyEditorGridSize[1] / 2.0) -PartyCostMultiplier = 0 # ALPHA ONLY - remove after parties are legit +PartyCostMultiplier = 1 MinimumPartyCost = 100 * PartyCostMultiplier ActivityInformationDict = {ActivityIds.PartyJukebox: {'cost': int(50 * PartyCostMultiplier), 'gridsize': (1, 1), diff --git a/toontown/parties/PartyPlanner.py b/toontown/parties/PartyPlanner.py index 255bbd83..25a7cef2 100644 --- a/toontown/parties/PartyPlanner.py +++ b/toontown/parties/PartyPlanner.py @@ -15,7 +15,7 @@ from otp.otpbase import OTPLocalizer from toontown.friends.FriendsListPanel import determineFriendName from toontown.nametag.Nametag import Nametag from toontown.nametag.NametagFloat2d import * -from toontown.nametag.NametagGlobals import * +from toontown.nametag import NametagGlobals from toontown.nametag.NametagGroup import NametagGroup from toontown.parties import PartyGlobals from toontown.parties import PartyUtils From f20e72047918a34e4b2c2d3b6d1ba4f35c9bacd2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 18:50:02 +0300 Subject: [PATCH 09/20] Fix jellybean reward and fireworks --- astron/dclass/toon.dc | 2 +- otp/distributed/DCClassImports.py | 2 +- toontown/effects/FireworkShowMixin.py | 25 ++++++++++++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/astron/dclass/toon.dc b/astron/dclass/toon.dc index e716f7ac..fdae39f7 100644 --- a/astron/dclass/toon.dc +++ b/astron/dclass/toon.dc @@ -1264,7 +1264,7 @@ dclass DistributedPartyActivity : DistributedObject { exitRequestDenied(uint8); setToonsPlaying(uint32 []) broadcast ram; setState(string, int16) broadcast ram; - showJellybeanReward(uint32, uint8, string); + showJellybeanReward(uint32, uint32, string); }; dclass DistributedPartyTeamActivity : DistributedPartyActivity { diff --git a/otp/distributed/DCClassImports.py b/otp/distributed/DCClassImports.py index f722360e..b2b16c96 100644 --- a/otp/distributed/DCClassImports.py +++ b/otp/distributed/DCClassImports.py @@ -2,7 +2,7 @@ from pandac.PandaModules import * -hashVal = 1907389465 +hashVal = 1907452799 from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot diff --git a/toontown/effects/FireworkShowMixin.py b/toontown/effects/FireworkShowMixin.py index 366f4ade..d5cfb81a 100644 --- a/toontown/effects/FireworkShowMixin.py +++ b/toontown/effects/FireworkShowMixin.py @@ -104,7 +104,7 @@ class FireworkShowMixin: else: FireworkShowMixin.notify.warning('Invalid fireworks event ID: %d' % eventId) return None - + self.showMusic = loader.loadMusic(musicFile) self.showMusic.setVolume(1) @@ -132,6 +132,19 @@ class FireworkShowMixin: if self.fireworkShow and not self.fireworkShow.isEmpty(): self.fireworkShow.setColorScaleOff(0) return + # Election Only + self.electionFloor = base.render.find('**/ShowFloor') + self.slappyBalloon = base.render.find('**/airballoon.egg') + if self.__checkHoodValidity() and hasattr(base.cr.playGame, 'hood') and base.cr.playGame.hood and hasattr(base.cr.playGame.hood, 'sky') and base.cr.playGame.hood.sky: + # Election Only + hood = self.getHood() + if hood.id == ToontownCentral: + preShow = Sequence(Func(base.localAvatar.setSystemMessage, 0, startMessage), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(0.0, 0.0, 0.0, 1.0)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(0.25, 0.25, 0.35, 1)), LerpColorScaleInterval(self.electionFloor, 2.5, Vec4(0.25, 0.25, 0.35, 1)), LerpColorScaleInterval(self.slappyBalloon, 2.5, Vec4(0.55, 0.55, 0.65, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(0.85, 0.85, 0.85, 1)), Func(__lightDecorationOn__)), Func(base.setBackgroundColor, Vec4(0, 0, 0, 1)), Func(self.__checkDDFog), Func(base.camLens.setFar, 1000.0), Func(base.cr.playGame.hood.sky.hide), Func(base.localAvatar.setSystemMessage, 0, instructionMessage), Func(self.getLoader().music.stop), Wait(2.0), Func(base.playMusic, self.showMusic, 0, 1, 0.8, max(0, startT))) + else: + preShow = Sequence(Func(base.localAvatar.setSystemMessage, 0, startMessage), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(0.0, 0.0, 0.0, 1.0)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(0.25, 0.25, 0.35, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(0.85, 0.85, 0.85, 1)), Func(__lightDecorationOn__)), Func(base.setBackgroundColor, Vec4(0, 0, 0, 1)), Func(self.__checkDDFog), Func(base.camLens.setFar, 1000.0), Func(base.cr.playGame.hood.sky.hide), Func(base.localAvatar.setSystemMessage, 0, instructionMessage), Func(self.getLoader().music.stop), Wait(2.0), Func(base.playMusic, self.showMusic, 0, 1, 0.8, max(0, startT))) + #preShow = Sequence(Func(base.localAvatar.setSystemMessage, 0, startMessage), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(0.0, 0.0, 0.0, 1.0)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(0.25, 0.25, 0.35, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(0.85, 0.85, 0.85, 1)), Func(__lightDecorationOn__)), Func(base.setBackgroundColor, Vec4(0, 0, 0, 1)), Func(self.__checkDDFog), Func(base.camLens.setFar, 1000.0), Func(base.cr.playGame.hood.sky.hide), Func(base.localAvatar.setSystemMessage, 0, instructionMessage), Func(self.getLoader().music.stop), Wait(2.0), Func(base.playMusic, self.showMusic, 0, 1, 0.8, max(0, startT))) + return preShow + return None def restoreCameraLens(self): hood = self.getHood() @@ -153,9 +166,15 @@ class FireworkShowMixin: else: FireworkShowMixin.notify.warning('Invalid fireworks event ID: %d' % eventId) return None - + if self.__checkHoodValidity() and hasattr(base.cr.playGame.hood, 'sky') and base.cr.playGame.hood.sky: - postShow = Sequence(Func(base.cr.playGame.hood.sky.show), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(1, 1, 1, 1))), Func(self.__restoreDDFog), Func(self.restoreCameraLens), Func(base.setBackgroundColor, DefaultBackgroundColor), Func(self.showMusic.stop), Func(base.localAvatar.setSystemMessage, 0, endMessage)) + # Election Only + hood = self.getHood() + if hood.id == ToontownCentral: + postShow = Sequence(Func(base.cr.playGame.hood.sky.show), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(self.electionFloor, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(self.slappyBalloon, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(1, 1, 1, 1))), Func(self.__restoreDDFog), Func(self.restoreCameraLens), Func(base.setBackgroundColor, DefaultBackgroundColor), Func(self.showMusic.stop), Func(base.localAvatar.setSystemMessage, 0, endMessage)) + else: + postShow = Sequence(Func(base.cr.playGame.hood.sky.show), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(1, 1, 1, 1))), Func(self.__restoreDDFog), Func(self.restoreCameraLens), Func(base.setBackgroundColor, DefaultBackgroundColor), Func(self.showMusic.stop), Func(base.localAvatar.setSystemMessage, 0, endMessage)) + #postShow = Sequence(Func(base.cr.playGame.hood.sky.show), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(1, 1, 1, 1))), Func(self.__restoreDDFog), Func(self.restoreCameraLens), Func(base.setBackgroundColor, DefaultBackgroundColor), Func(self.showMusic.stop), Func(base.localAvatar.setSystemMessage, 0, endMessage)) if self.restorePlaygroundMusic: postShow.append(Wait(2.0)) postShow.append(Func(base.playMusic, self.getLoader().music, 1, 1, 0.8)) From e598558eb15f663eb27bdaea9b74ac0c79ecdcdb Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 7 Mar 2015 00:19:39 +0200 Subject: [PATCH 10/20] Safeguard code redemption --- .../coderedemption/TTCodeRedemptionMgrAI.py | 50 +++++++++++++------ toontown/shtiker/OptionsPage.py | 30 +++-------- toontown/toon/DistributedToonAI.py | 13 +++++ toontown/toonbase/TTLocalizerEnglish.py | 9 +--- 4 files changed, 57 insertions(+), 45 deletions(-) diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index bd060d98..691c3248 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -9,7 +9,9 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrAI") codes = { 'weed': { - 'item': CatalogClothingItem.CatalogClothingItem(1821, 0), + 'items': [ + CatalogClothingItem.CatalogClothingItem(1821, 0) + ], 'month': 4, 'day': 20 } @@ -18,10 +20,27 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): def announceGenerate(self): DistributedObjectAI.announceGenerate(self) + def getMailboxCount(items): + count = 0 + + for item in items: + if item.getDeliveryTime() < 1: + count += 1 + + return count + def redeemCode(self, context, code): avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + + if not av: + return if code in self.codes: + if av.isCodeRedeemed(code): + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 4]) + return + codeInfo = self.codes[code] date = datetime.now() @@ -29,30 +48,29 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 2, 0]) return - self.requestCodeRedeem(context, codeInfo['item']) + av.redeemCode(code) + self.requestCodeRedeem(context, avId, av, codeInfo['items']) else: self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 1, 0]) - def requestCodeRedeem(self, context, item): - avId = self.air.getAvatarIdFromSender() - av = self.air.doId2do.get(avId) - - if not av: + def requestCodeRedeem(self, context, avId, av, items): + if item in av.onOrder: + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 2]) return - if len(av.onOrder) > 5: - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 4, 4]) + if item.reachedPurchaseLimit(av): + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 3]) return - if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents: - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 4, 3]) + count = getMailboxCount(items) + + if len(av.onOrder) + count > 5 or len(av.mailboxContents) + len(av.onOrder) + count >= ToontownGlobals.MaxMailboxContents: + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 1]) return - if item in av.onOrder or item.reachedPurchaseLimit(av): - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 4, 13]) - return + for item in items: + item.deliveryDate = int(time.time() / 60) + 0.01 + av.onOrder.append(item) - item.deliveryDate = int(time.time() / 60) + 0.01 - av.onOrder.append(item) av.b_setDeliverySchedule(av.onOrder) self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 0, 0]) \ No newline at end of file diff --git a/toontown/shtiker/OptionsPage.py b/toontown/shtiker/OptionsPage.py index bb558da8..22eafc85 100644 --- a/toontown/shtiker/OptionsPage.py +++ b/toontown/shtiker/OptionsPage.py @@ -646,36 +646,22 @@ class CodesTabPage(DirectFrame): if result == 0: self.resultPanel['image'] = self.resultPanelSuccessGui self.resultPanel['text'] = TTLocalizer.CdrResultSuccess - elif result == 1 or result == 3: + elif result == 1: self.resultPanel['image'] = self.resultPanelFailureGui self.resultPanel['text'] = TTLocalizer.CdrResultInvalidCode elif result == 2: self.resultPanel['image'] = self.resultPanelFailureGui self.resultPanel['text'] = TTLocalizer.CdrResultExpiredCode - elif result == 4: + elif result == 3: self.resultPanel['image'] = self.resultPanelErrorGui - if awardMgrResult == 0: - self.resultPanel['text'] = TTLocalizer.CdrResultSuccess - elif awardMgrResult == 1 or awardMgrResult == 2 or awardMgrResult == 15 or awardMgrResult == 16: - self.resultPanel['text'] = TTLocalizer.CdrResultUnknownError - elif awardMgrResult == 3 or awardMgrResult == 4: + if awardMgrResult == 1: self.resultPanel['text'] = TTLocalizer.CdrResultMailboxFull - elif awardMgrResult == 5 or awardMgrResult == 10: + elif awardMgrResult == 2: self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyInMailbox - elif awardMgrResult == 6 or awardMgrResult == 7 or awardMgrResult == 11: - self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyInQueue - elif awardMgrResult == 8: - self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyInCloset - elif awardMgrResult == 9: - self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyBeingWorn - elif awardMgrResult == 12 or awardMgrResult == 13 or awardMgrResult == 14: - self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyReceived - elif result == 5: - self.resultPanel['text'] = TTLocalizer.CdrResultTooManyFails - self.__disableCodeEntry() - elif result == 6: - self.resultPanel['text'] = TTLocalizer.CdrResultServiceUnavailable - self.__disableCodeEntry() + elif awardMgrResult == 3: + self.resultPanel['text'] = TTLocalizer.CdrResultReachedLimit + elif awardMgrResult == 4: + self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyRedeemed if result == 0: self.successSfx.play() else: diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 1ae96d27..1908ad50 100644 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -565,6 +565,19 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo def getMaxNPCFriends(self): return self.maxNPCFriends + def b_setRedeemedCodes(self, redeemedCodes): + self.redeemedCodes = redeemedCodes + + def getRedeemedCodes(self, redeemedCodes): + return self.redeemedCodes + + def isCodeRedeemed(self, code): + return code in self.redeemedCodes + + def redeemCode(self, code): + if not isCodeReedemed(code): + self.redeemedCodes.append(code) + def getBattleId(self): if self.battleId >= 0: return self.battleId diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index d968f73e..e05d252b 100644 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -4698,15 +4698,10 @@ CdrInstructions = 'Enter your code to receive a special item in your mailbox.' CdrResultSuccess = 'Congratulations! Check your mailbox to claim your item!' CdrResultInvalidCode = "You've entered an invalid code. Please check the code and try again." CdrResultExpiredCode = "We're sorry. This code has expired." -CdrResultUnknownError = "We're sorry. This code cannot be applied to your Toon." CdrResultMailboxFull = 'Your mailbox is full. Please remove an item, then enter your code again.' CdrResultAlreadyInMailbox = "You've already received this item. Check your mailbox to confirm." -CdrResultAlreadyInQueue = 'Your item is on its way. Check your mailbox in a few minutes to receive it.' -CdrResultAlreadyInCloset = "You've already received this item. Check your closet to confirm." -CdrResultAlreadyBeingWorn = "You've already received this item, and you are wearing it!" -CdrResultAlreadyReceived = "You've already received this item." -CdrResultTooManyFails = "We're sorry. You've tried to enter an incorrect code too many times. Please try again after some time." -CdrResultServiceUnavailable = "We're sorry. This feature is temporarily unavailable. Please try again during your next login." +CdrResultReachedLimit = "You reached your limit for today. Please try again later." +CdrResultAlreadyRedeemed = "You've already redeemed this item!" TrackPageTitle = 'Gag Track Training' TrackPageShortTitle = 'Gag Training' TrackPageSubtitle = 'Complete ToonTasks to learn how to use new gags!' From 1951b91907a957df1edf97be5c9b2cb7e2d598a0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 7 Mar 2015 00:44:34 +0200 Subject: [PATCH 11/20] Fix code redemption --- toontown/toon/DistributedToonAI.py | 1 + 1 file changed, 1 insertion(+) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 1908ad50..a8fcdb8f 100644 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -193,6 +193,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self._gmDisabled = False self.promotionStatus = [0, 0, 0, 0] self.buffs = [] + self.redeemedCodes = [] def generate(self): DistributedPlayerAI.DistributedPlayerAI.generate(self) From 4f92aa9642496860cf9661f7517676f886974cae Mon Sep 17 00:00:00 2001 From: Wilee999 Date: Fri, 6 Mar 2015 18:00:04 -0800 Subject: [PATCH 12/20] astron: added binary, removed dumbass gitignore --- astron/.gitignore | 4 ---- astron/astrond.exe | Bin 0 -> 742912 bytes 2 files changed, 4 deletions(-) delete mode 100644 astron/.gitignore create mode 100644 astron/astrond.exe diff --git a/astron/.gitignore b/astron/.gitignore deleted file mode 100644 index 9d23ccc2..00000000 --- a/astron/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -astrond -astrond_debug -astrond.exe -astrond_debug.exe diff --git a/astron/astrond.exe b/astron/astrond.exe new file mode 100644 index 0000000000000000000000000000000000000000..b4ff05521fa66c6606d06bc5d4b208e3857445f0 GIT binary patch literal 742912 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Ĕ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%0A9u%~m-)|U{+adMV1>*-D!n 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%0DO5Jeayi+D%?Ps3M{-%Ap( zwqX_a&G>yQkm;dX3fjD%N|QUP(RV9eR-u@G!!o4GkM=Cf!!Cdw-nuN9jq8z_OTaOa z`CcX_@^Y$*PF@RY%df>>|0{Q)n149~#UK5{*P>~E!W#S?!tWiod`{d=f>eHNv1e6O z6DnuM*m{Hg9M%1EU@X37tK2jQfsWkU;lt39qxu?R5(f@d3^1xn@~o$t`cj|500UNW z4Y02^Ng#Y%7Y)wb+UQ#eKnX!QXbFTNM|BCU8H#EIyEonL5wm*tobho4}z; zn!C%&08Xe^H>u|m6rSCv$#W}J_dyt<;0G_H<$|G=WvN_&w{<{ppf7FIXv?MyymyRm zD)0}j4`{vkKV?jsNdcRhU+Uj@P!2Y(??~cXF zq*jABTK0TJ(wi6@CN%XGYP-BgG3M#nu(U9iTHde29{`3NOHRw;Jxp)4!AkNGxnMCO zF5k~dV<^jX{I&eA;149?-8{ds3(+XivS&9ESTLCN53nc3ZQyDE?bx_v$6#aBv311v zIWiLk+SK~yemZS*(`lo*%O)ZSbvaK69uePr4&T#2c(4mi38hHmDJY4j8sn{KJpB~$ zIit)eQ37{5MwBLN^CjL^Yelhqkay6z>T%LRuDmSbi35)nF)`qrmaBMM&Fb8%j){vT*L0Dz8i&`k7M#sJj2jI@f^4ls5?wMja&m5oW;C<#9&~|y2?+< z8cx%3-f^?M!+0uMD|%z^8_z#EU43L&x+(+#la7lYvH#eeg$~cS7-?I$>kW1iIPB0Z87KDU@*{S znDMOT*l7`65%(>7fQu3T{0(_T35sHEB+!VjvbIp^Y39<8 zg-W*$L}{xmeT-h(kFTYv!gVeaoE#01W(=5A0?sm{TPjZ2jm<$ZnRRLcdFtiy_&sn- zMPR%v8ypx}HWp=jYibfkfQs+_0$im973{<2J8eP|&8gs=6yc%wTxF4X8P^I24h=;& zH^Zde0aUp*pAkP$LXVkx`?flu**mqy@7IUdvG+`YfyYA7$Ygj#VOu}?Yr5H5bW z{}Tx4v39)cQh=9hkyjB({h+I2ZBnD^6>;Uan28#F632gu>>3pneK<*#6PUt=$G|MK zs^z38fk{X-`sSlJO=(;@9!gc|DR^~|LQ(7#(FBrWwyaRTwTeC$K`rge71|ZPQ-d;T zpF_u!1yD9l4Cg|LMxoDfKz?BN5Q4(4J(q#rDuGw==&9>MJST+!Kcm@<3alsj^10V{ zd~Bei8=+!;U+Q~8-w0Gp|AtUOpF|&wHKLOVD|Sv&<&2607_PuYXjL6sMpvsU1kaq3 zBC!M19Gp{T4CUDvN^IfsWl&aqcoWuOsBtPp#d)4KNH{cbA{vU>%(TaCj7J!zEGd`WWDdMIN2#|MK%r|}|_ z>rBRlK-8skQ6G3TigTAvrRr<+>iZXQm7v`Tny)2^(3DG+SIf%9aa<@t5iQsmL6!Fu zAB-h{Q8|4SyD*5j>H;OX@~wCbq@!}pSCdG!wVpxida|}nvNnez9@cAfiW;Lf`Y4ui zZB&wLTR^pab{>&H2`D86@5K@Ve=EK7@+C0(>oUA9EfH6q9XTs|p=T-D*i8k&=j=fm z4zUDL(p0(MHyG6g7NI8INnyOW7B3oob)Z5i%U(u`2*1JiB&F1x8q8L|ZwnqYeuc_< zyEe-J1iA_51K8~}f8|#L>^i(vWhsp+lFf53mw$#H?H^-cS#^mswi&%|9 z1hErx5(E*uuTJ8+k0*6B(ZWA=0l{`k0_76HiHgYHC5Nl8I1MHN4;OtDr=u-RqbkJl zoTQo=3I`q=eNB3A16PFL!Sqwa*$)85LcH_r0xm>MMkJd10nH~6;|!il+!9zwnJdw} zdOe;4N28>~vV87_=is^YNlq4V`${=~TF!<4DE!`Ahcl$!SQVN_{n1ZN+kFDSKMR2u zu!xWZ_(#G2HQF?fILGi$0rP{XFg%Z@a@|xbF6%tho;$xEj+K5$uT?z=h5no94p{P zlLJK`MHM$f#krB|sgd^wA_rI76t4Cjs#c$1`Cw+qj{7*W^=gk3ry14KM{zn=OU1d` zW2oAjP^}8_<*1%bsRTklRtGC_JM_i;f`*i-()FM|5;uS*2NN!C_=ah6g{<&+&t(#y zAB1UgrtInoidgq|iO&>qXP(|w`Y4tYv(~5zv6PckGlRDPk0zRYKhr#x3lrba{GJh2Nx(} z4=qq_v170Kjd)G7nGPB|&*L0J+@O}Y!HHiJH=rb{Ne92;rgf>xInJV*Z%56ZEH2hc z#lHKBicu29z-oSjbr2H9oTK$a6uXd$&F5mfNQOVh#VCnlXDVW|xftiDr(!2lKXPhd z+x74>XAShi8!zs=sL1xL;_5b~pt{SrI!dCt0f_%GSI0SKqdF52zKH-ybxw+FPHK4~ zFj9mq0bc~2J0}$f;pWun4X&b`vHHWEc&+1VCh!gZy^5xXY-9j6qU%NZvXM+h?Ajq487N+58w`!mM^T4~ zuW3{q-NX5IcntJGBNFx%pg6tS4^Kq3I{!|R)t;+}#d@`a#1%%h^if>N)lzY;_Cl)m zAg{bi|a9ZnLu4JvxVE~EwKgqptFUIZ*{;HHXRdU3xf#2__53u%4C1e zQ^f9fh%In6%oZ?DHJ?B!MLdG(8e$6)%R?0LGzt(~7%G-$(~WHQaBeqRt_Q4&R6ia3><(+P`nq*86S zP;Ed(J|B&k!VIO1Yne~vx#M%Hg_5Xc82Xzhp#Fp}-rIVlzgCLGUdvFqDVoF2j zRr`_dih%z~@STum8@N54AEa-3yl~^8z-BWIzS0@56@2E zPZ6V!1LpS9l@EF9Tb>>Cu0Z^c;G@jjdOIz9w3vRaS6dxA`+uu8cQ&J*G4drVa){JBnHed3~Qbw zr^>RsPK@l&I4b*8blIP#N0j~UG;VigRN3)Vc6M~xjge)al4WN`m7PFk2St~?F|zDz zl=aY++Tz5h;uA3wlXUN%Zn!pyl?#D-$*}s+l<>WWL6D3l4K=B`W!i+YNgZ=-y+n87bFCmgn97nTn+tC=XHkx#rFH4GAMG+NEQgRlEi{L_ITb@3OY1kcsS!l?} z33$|7f8tc+&x1_0GQz*jFh;q*E1 z(VdehIrBmk>L$qEHBs**>Xs#iQ75FK1;6-E9o}M*!tj#Uin!KE3>g&< zOhMHc+%Dcan`G0}yh0lFG+4W2OFaa^C!s2}04~vmgb!mkh19s2j9n+SUm~%)LiV^s z5id4COX>kD1_-!-kUJP96ye2sh#u_jQ=~3;p&~S7Ci!rYm;(nIBbPpk3P=l>+mtNj zB-JlwaFQSh+(7`wN|1KJiJg5fuH6xhQ81pK; z!Pn`ykK_#r)(r6}Tw@FteH5R+NnlY)@jfT14bj9&f&!(j;srcL46!2>u(CM`$LPf* zGc?~ag1HG7(kWtVKfrveL}Q(-WTqnK=pbAyE?^KajPy}l#EnsLZfqPLP26kE$pDv} zX*=tsGfg0}uu$`5gqyq2)Z9#2%_WMk>CIg#zJs5NCmekgd$&@LsW>K*Wolw3KD2WvUeDT(kT%Q%* zYSkYui*O;4fc`Ml`fR-HBy_$tLGMmoWOpp>x^qRiJ6|6g*&Ppe$A<1)Fe%)f@?PAX zD?~XIKkiO*iQXMLm{!xOjP6j|;{5liJCxLX^hI{(%5Zn4kq;nLNSqHOJw(~{?kqnM z%>7A_78XB=Xup4tq#-4Nl~P3U*O!T;31w@=L z$Ms`;G>_}mp>b6TP+1ekb*q-M2>@KB;94v3T`}IWMA1joqoY7%5wsI%0I$Jx#oKVd zFDLhb7Rs3msC72`aEd;HI;>;c!Fp{N)&WtlUKbj)HA*C`*D|cV10qCel3*quh6u0SofU}8lEIFz$Q{9K1!m`*DGQM9B-lF;T+RY*fcyFsDfn} z6mi+nkvhk0lKn$}0beKm>4S+8y2e5jGZffO@W*1lVH5c|o==%lN}!>MEjtJlN&=KQ zir5L~S_l-*@!lIz3Vm8+ts`ZvpX#*=s`Xl~m6E8nToDV+wQ`P|qHBHc_y}0{Vln~N zTl8A(z_du>S}BQID-@Atu9b6~8eQv6s1^GUVrlOY3kC#W*;2&-P$-GN;lF_;|H9a4 zp@G@>4q=0mXkjk=edNYb;EYt8j?j;m2`VEb{Vx`yg?y?~c`UCXGh-dqcP#2x?JeiI}JoH)5{zK<Hg(#k*SMyYC>kzYTF6*|nsMKf1C5kWQuA4)oVp49 zdsRyCN^uM~0`W;7MKT(|!mzQBk$}gDVY?KqmQEIZ`$coOh2R>7m*Oq5^B;cOZ0D1g zWKpD@Pr1lTG30v5;U!OwwDWC_>K~5<5_TWdG|I2r`g32$NbSN0!;D05Ia^>e$pSN5 zY4if~-y#a{gjVzjiU9iJzR}Px2K0uPVm(2>=Pfhzw19qdB=nTa@KVeJ_B--Y*vU(= zU(+bB4*AQ_I}C$cw+lIxp&aeOnAR{6Nx8`3vuh>-Gde45K87K`KQWRltBEYiS7U*!hD}8YwR6W<1MH$_b&@oY>j|^-f#Kz+R>=b|DAG;kRb?|76y6(-%m-eLQTSZh|%T&ES9*AP6#1b{+ zl$i07;goP=Dg%!++u(6UF_BXTN@jlxDVX9HU@4+kOVOY~O=be}n8Cc7!K7D;h#@d1 zcLZix7|etam^EQAH@#?p`2eO@2uvy_R=ySi=J;qZzfQs`x0VVuNff-wJK=H2!XjTQ zK*C0Nx`tJ0V=x@CO7vT%?TQzh^ zd;_Z=l}hJev)@B9{zoX=9k`Gh#hZP&;ZGX}5MYRo!-v3JFdc9mZ7<#hpCe;Q45atd zk@7A`vSMnz%v>&mxSW40aXCt2c>IdE7p}9Au;3i`pl2p2{=-qou-R_x?sRN47B4=) z2Q?EnIqj?H=E?!Dcn14pJiE9l3pI5-H$_P_wNw!U%uR8Q{%A^{Vl`A-p-t@}R^xaL zia2Jc#r2`r$3ce(y}pouqP~sP`?iAw__`+Q8zs@8s)$#}zh($R&hZiu<0!5R)zh2m ziRhehLqRCZ5B^F;bPI;Kw*kPc0s9GIrjd9}`(auJ4J8nB7+`QABH5CB@iJLq)jKhe-q!f?tG%r~ z%ddcdR{#zCrC1-rLlquChJW#t04F##xSSEUrlW0%?@N%immq7VEI?Zn`z`jNI@Azto;EY zd|`?@@EQ#weG*T-NR3ckfYT}-#ACpkh?vdiv+YB2lFHBVqyltsaGF~MZ_wPLBr@Ns zh>PJ*lb`e%CT37|wb_-Op-qbPiVP)k*ad`?o; zfxjODZ(f1%3}b`c(!Xv7HY}js5H?OGwpV8J?Q>LL*BePXBuPnzjGxI#J|Bdy4|^5P zGK;z(Eqy_1eK5v#2$u~}{zhEx)&Ti12ghpXXYlbD*tZEX0VeR*ua)C3b1g+Y?>|JB z2F-mlU_((HPXiXp9>?t?7!elP+vT2L7!mgMVMJuePj@TglIJ8M?h*NL88Ra1qZqS^ z5J6Rl5uBu|ncOn)7`UUC#Uh#K+2BbSe{#lBKf4AK=nND&>Mx*=2Ft9M#-Zh-dukWukrhB%Xa9ttXWM)Oq>q7>_bg zZD>611Ygj{;|nK}JRWq8W5jqQs=M^@$WLD|N*|A>DZf4*Q^CWrzNwE#3Xcc<^=ql& z@i?u<7>{xkfHaeol zWH-E|im*QuF(y|+YeWDUIZ%%$2&$q>)pDu#Y9mTzaw+;G1SV!+3`&XfK~dq6oJk{j zA8s`gk79&FBe@m4ghw(`NZ$cnC167>9Z;OQU7mr{6_YQ0SwL0RSCQlDm+i$W6NNjTStrW74c`Y7Ifj^Ly!#A}?SstG5e z7LPdbJ4Vws(b9;uD=N@M*WWi0P4erdT&PKUZ>(Yg9s{4ngV^51xI_`#fLB3mLqLQf zVw(yEqqB{*C?weiXsG;bJ*noW>dZi4Wd@PT`Y zeM!Dd#9xh-N1a0~qA$#)({bP(bB%k|R=EjHTq27_>%!^K#sc@Fa^mx#T}dqY5Mr9I zO(&M4R4_@6bQ)KFs^exKQA{`2{1nG6H!{Io1}lgN=7*(3FsZ?^6ewF9{&xRmOfa=F zT5+wXjR~fBU6^26<)_CL@ywGFF;9ql;Pzs|rjO!YuqP;Cl>7@PscPPZruh=}mMhS* z0b!zJi63Ci282$BSCaG=outPzgp#CNuqucBJeM+rDH4po=_I}3$uNY9{Pd(E96E&S z#INviF@*F{?8iif21m)goTRFG=sv@vcVU{PVy2q23hD>mcc3NaVS6yvu2JGC(h}%VyKfpVN#nq`86H`?l_~9dx*od@8r6Abn*n`>eQI% zbR=(vZo=fnC|gSDw_XvS{GfL#r8!m`&AWzlTF?jQuV8>3^lWpVP|uPgd)AG5 zc2!rSXWcvQ+56CQ0&e8`y`JettnXG3F`G=@G;q=K0lKM|MHbVn=gDHCBxd{u=nLd# z+hT*-NMGlJS?Qg*9~r}F;F?fkBi3WSmuPU@@*uJHmy*y1-DgDPT&x#f1{07l(HvNS zJg}o3zSjVh%GF>|7gM(b=C$+?VBJgJBh&lv7X3}l7Qef#Jj^XWb)&$2M|@Q_x|_|=AkuuUx$qFE5lP?E1?tuR8$B}S)-+x+5Xb92Y*LV!Lp_+l@s$e=OqE`k#G)Z;h4c&_|c1@W6 zvH&SC3^&0et0nz43Ke!P(;s~l8aF~!h?_Y{Rf~D@Es2_y&zU=Cj6f6aC-}}7fd~F& zjDXG$4g4aBJ^!Qci z5xmwCct7+Ap<)Sa2|Yrmumm=Q9=p@yqxhp~YY1=UFJOoe`GkIA1h$HukI`t-C!TZ_ zC*tCm8)YEBwg6YIRbLeh7Q@=W=-Lq;;Yq_@Wcbs6MpEBswp)(#|FHKi;89lB!v9QW z5(XHU0RjfaN-ef%tb#!e3}`OQB!GblNaE!H+A5~>hA>0$0tSZ&!*(idZL2-K=%==N zj;E#7Dz+X;fM&v_5R@v^OZAktZyJt`_drwT`>nm-xg-R&=Y0S3e9!;+^01lr-S57x zz4qE`uf5jVyU~At&p8Z%a-5Zrk5&t$2WtBrj2i{tQ(MAi1K21JV4eJeZJqoADAwPb z0&&>euLmN=I{AY`b}Q8PHxikc5{mc}+B6$2vIz_Z>7iVF!n|6p6rThP?G`;f#`n}# zX_RlIb7}Qj%n-f!lhFSYs3*lbO_EDYQ*_Mm&dnl`kD#TFtBdJ!H)K* zq5Tgmjb9dM^WF7`oL*_~7}^a-=hKLWY@2wEQF+L^OE@(nnf5+lTdGIIVtlY}sy7YN zY#*)zzjPmrxq0M#=7(=v!2&!qip_Vp;a!zOdwsb<_x?djnQ-e@=f{JEfGJHfFn=(vnSzmx05^c2+tAHadX;&4hc&M z>9`ZgpyT0PLC0ry2OU!gYYFLZL-%H%({btF=YA7(%-Y9&dxT5&^Gn!A_&cGbBj|XP z@ET#kfuQ4V!T~}$@8IW6ee!-I&kqt_C5(LmpIU_H4h9`tUkp0F@lw#S@^Cg^I{(O* zshjXa!h3`{uLK?cMmRf{z^Fe_d&-igwd}D9XAoaP1sAA z@dot~ju1}&5Bfz|M7WV~3*qYoDd#PIFaJZ(QAd#XFWbL|_`UH6em)6z{E_nioUQ*; zR?u;Ar+Ht)?-PVy|0VlrTM6HP8~XrV4T)QixRGMLXQBIGhhA-p!OcTcU$dZEXX{z}71?o)kg;7^u zYu1?;)QrqJ^Aan~La+9F5j%bX?t8S;i`0~FiARhauRSjrk3GOSy}G=hAL^LY7rqiZfuobB zSo6nI-Ld}Yl|3HK)wdN0Xlb=mzm9(tKVX?WtxU6Y^H!dh@H*l{aKfFBPu5ih$vhx}6XvZn&4HW4UM};x_HDD?sOZ6x zmp2VkmuxJ+tn^Y-e$!>=M9*rv!?`j#HgI^&=v3tUR-JW|)U(s$>aL6>^SbgvRphF9 zU9v^@FIimDVi%m3F1V&wFUoxS&9&Cix9sXtzsw6cS_$oh{e%|@uM)D@YVdWTTuv4B zG)+6ZK3d6?IlgI$vx>`2V=b@6dZsm=#(I5&J0u>JujEHQa{Xy^EGkW|jpHVlcXjaO zZgWrOMlRLLlxTiGT3FIjnin}srGTFw`01&l+KOM?pkmKu{i^$w+b#HM&6@JpWaVya3+wdfyU7*I4?0Uk< zWjQLP+#`HHZNUTiXOwq@N|rqDd+Oy6-cnBWKgxq$qV(`bX6r}X^3Cf3WyyDi_>%HMxe1U1F-9Ct& zjulu1XK*T3~ za^;o9lNTTwOkLi3B2VooZX;@F!*$pg8Xxb)BU~ToTZs->#fJjFyLRQslIH_2F7Z{o zxH!Jhv#9eNvbs8QV@46v|8fsgzjimzMOGnqpl9V|H9WAtvAFn{oK0p%q>jvHM9z~D z*^1vp0B?%Rrka#Vg^T6fBz@ss3$127N?$3cDhkyKe{tK?a{sE&sPe+%a(|$0#hD_A zko%yz9-!(PG{Q#WLI(iqi?QTmt=esUMRu3+@jaZ%q(A1=rr`@db74|4*rUhO_P)>A zrGpGIXy#%CI~U`Dzv&0E{{Lb}S7%m(?!L~ZYqYcJMgDknGcI=Myi~w>#wX%){k3V= z(8JX}eK==*16f2TS4TVATuv=x8|mACr)(h$8;67(azDd&+JfJ4$VFUjbf+`GM-HFF zckO1~bUyr>e2@bcaciFY;a>SLSU%9%jVLft%u?T|;703K`GOC_ld@bdA6}FX*(~TZ zk)=w$JS(e%oWU&Prc=>flbc+s%TQnowu|;!c&Tq~I~r_q?a7~TkkhHM8SIqgArWrl z(^-5^x5k4_{GX_~kNo82GFN>r8GKZ_*oH59>lq}SOI5Jx8Trr_+=4Gb|5C1gO$4|2 zD!Bo+W@j?kLQlCgl@vWdHLe;-^t+fzX_aBmN{X6xR=GHr1*L$#mc$l%8}ioAwzzyvwX^V?80qg@kIt^@M@m zZzKL*!cPdlAK-W0;E>}3Lhgivm?R4(aJ5uyt-jTS+bQqq)I^YLwDd@uOSRfUUT#0q z^K*bK|75brjg%*6iwv%_0wzKK+l|uYK@&I)wS1heaSfAW74*iF2zkTSXNfTvdG(p^ zujkJ9(o@a%Gau&0Q8nXH{!em`Fn`wfMWL@dc4A00zp^CN<*bS!6Vwcy&7Y~@v$3A@ zqC;aRF7&Pc6}(z;#4E*&sk}xG$SvoJkP2KE-(uDfQk=SKjb|P9+1-a37bGr!JP3H$0rp z`#SPivZ(gd=w3PF|T{n7#ffm-Ogo@S$OAw#lD0C7c=_-gKp-Or`$_JUR>rv+&r~ zKjJ4Q0{MCR;d?xMI6QudCai|X&FMU=IXlrYOH52EUuJ}X2mQ5*L=~_jc6>#FbZi>eJbvLUM`W~WRVPe>ha^W_=kRU2v*T)!Aid*i z6X(DFML7R$jZEztoL)UrzHOVfT*GR5tl{=So5uZOJjp4Z9CqH^jM3*2W!FfFN_W%u z)Q*s=-85UiY`#_sy2;mk6)iU&-_^II7k%pU2Bqcd13V3n{vJ&&-fl{GXf-dJPUC)C zb*97{7#qOHj-Bn>a4SbC2o7#I1HpkFM)mt*lk&7VYP5{Ca(_Lx`g}+9Y*pr0Q@*ap z?m-z~ZWVNY-84E`cD^8#yqCFM`7*qL?p3!~FR*IGEQfFXQ+%zCUSJxb-g#&zDKu(U z$GjzigJc)@ zF6gb=JO2&NHDuu3`5@1F(MVJ}!#PWa(rtmiec)MI#x1&L4Y3!Gje`&qw8nL-&5(`B zuBvSXj?RlI_CXm-r(SG3i~GJ?e|aBH*-d2XVwtYofPS&0UXU6+Q?Et-&Oi6|DPijn z2CVa`evv~Z^1*(QUWvTBU!=&RIve{%%9&f|=lVqsm&lrak$#CR?H4&hB0tqHa->8K z?-w~rB9F1@&wYo0oxe%JbXo~vinVc)}lbGlN2->nEW zy4m`a`JU6cW7eem*|=z0==vb8bB}tVEUpXdUs3eOTl1s~w;YE>Ei{%v12V%4f7F*5 z&evyMu&75hi+ad9?^UzO(EXuEm?&wz{Fy4oP({uVe*~2N_y~Kt88(;@BBmj=$+v!2 zu8Rh-t5+g}F@oJMYP!S2OLtJKuxaaKmKhAB7HO=Q?wE zFKsY1j>NB?DfOqX(y-3NW>1T!O8YC`zar!V- z@Q}pVcc+K^4@qvW*n3FIJ8A11Tl26+i_O+3Q}0$0b$5>H*M5Dm)iV4gJ`HF7kzHv2 z-T!PC?$%D$S2K`!3D#9_9VES|0rhjnl$+eRpNtP$M)_f5FzA1{16(J^HK&hS_Z&8@ zm$UWGdstm^TA!YVBQ&w%d^?SP8G3c?{{sEwK&11^zFB?GxjM^~F2V zqja(PFQbrc6owpk+2Py#wi8|@yiFK1I^-Bfm`n%}t|crdG!wo{_$gs0;V|J%f@@63 zQAGGGp@L9PSaVv)v7#vCXdyI>rJU144mX_7<%EBwjz5hIIp*_h}1i<=@6^TTA z&6e1)%Y5rM3XX6q0`iF)cuZW~5&PTVRpS!nKaBO{H|8g5MHprTqxO!L9 znr#l>y)7Gq+c4zY`+jOO=A>-$y<<$h*U&EtG)dBZ(q4=E+hMz5b3A@1bU zncR~c*5n}r^v|u?I=E4hQi1}1`ww__CsBrv+JG)huwlpObhZlMHWL% z^v)E5l-87EmHd`XUS>JF)^1epm5Cf0C@p81&Fw~MIg7!s)?ECWek%Op-g?A6{Bc|f z?j*|!H6<>C^@I!q+&%&>jbdZ~6&&$J2d$sO-WySu2T>O>;1<#d-*YYT;IncW!U7;pIkue0SIfH$a&wv@bV+CEn!pGS4$8pxdAQd_L2ppje3J7R67&53cZ zS?7?jO1jt`OSx|U9i=V+4*UNGSF-3J{qEdI!F_xBHeLn>>}jTNzV+7%`qi{2%8w`9 z>k{6O^yqhx%z=C4y1ljYT%BVt+7nhSwOfy8QfILs5PjCy?1I%`@T0+H6B>5vc`}et zGx5DNAIGS%gPQT5_H0b^ai4p^%tkQuBczQp587Mw)WPu~$2(_*99QuBS$^vX*ANyH zK1X*{`ws37?t^!*ZoF&i^I*RyrZAp#ItirB+))p!cnb!p#rL zzPwIdR2E;@Td(x~T-CWzBk1vMc!&mQBbJfH$L4+T`!iA>{610T0o-7VoHz zUQI>C$GHI55jjuI^(Ned@zgj-wYFL=SF1fv^HZZcfFtFJOe*B=;?hr;NGU@Y{`ImY zR+C*lMzUZEj{NwSj`0q;-KlCjuHh&Uy zuw1QFsGI8r3X>+ruTHJk6X8 za(KTh$L+J+_MkHq4Tppy`=UrO{DQ65%hPmus^`f@K`psqfMu%{(8KJD{Qx*Fs5AN< zdc)=QJ+*7oxP(a3y7HcICJG&C`C4RXA932Iv^Z^_$h)*Stvzx9qB1Q*>&ca&iPR0@ znq+Y0q}DRDpu|=oK6AArmeX=GyKQ%V33|Br+9eqYH2AxK#iCu1A&TBak@YVK7>t}r zxC&-=K{7N^rVNv8h&>$Z^n~e-4Ci!9J|#mF_@5t?`w^n);ugn?&;^nCi3(C3y`Dm^ zpVLys$Oxrpl+Hd2>{e z%-_hn?q|N>m;CL3yhv;!l$xp|S4^o-tVKQI-{ot#)*vP*nJ(*-$SdMABn!vM?k!9B zf94kd;vEh52}b2312Io5Qfb_h7OK%gdbFghZetz_K%eU;17rpoA!EnN{I)ztSA}}J zqF9TT<2tK#4Mih(jC`^>GNL*<%1l6O3aw;(;e{9PFm-f!%)Z+7qVK6ZN~$pV7jGJ} zahMQ1gEBInS~yzQR{}m|UGxI$r&>rTz&l9-K4qQNibx=hSe|$R`Q3`EAxl~y`1o67 zPG!F8?28kH>(r2w>2cmb55aDYr=ddtenTv) za3PV0BywKA$k!!uTE9q3BG2g;*)5U&evv&A`L{d!R^+&z$UpUq^ho4^evy8Oe70X? zkwpHuU*vd+{6@b>?HgoGzsQM_vY}t3xYDy0^oyJ#DKG06sV&aW?H4&+QWo}$)LsTs z>-zRxyMp*jzsPFI{@dJ0uBF?zEWhDy$E=e@Bi7JwQf8Z8D-TW#IXVd^2&2voIVKWj z5attZB5Wi6c7DH3_z~e(gbuaWu$%iWkEz|Ag&y^vX6J}z0VbpUeqSgA+KAe8-2)czwQ~k3|S)z&B<_@Oc)JlRDpx=E5b9-5E{O^OuYj{qb&xh|i0O56uZ;3ZL@w#8|BLwO{w z@$gv-#4l`Jpbq0Avlk$kdOkV`feZK2KfmIJ#z8Y=EnRi(Md-1j+vv%B zev{9^Mr($H?_IwqQ@&(66g%!*aY5q&*5ipeSsKq+@f@F57UsqcTJbNEpBs{FQKA{lHKn!pgDllG@w zW{A8wLo}kMd!TWu?ch@17xy~_Q>w-@n!#?=yWAKwu=zy)hmeXjuL1(4b zzHPS#YR9*ze_$LdvTQ!rctS?cg2AM0VfuIDt5Yi$Uw z27;%C8^Eg{58&AJCglNd%#ewJhaD7Y&#^y&jLI~f*+OIMm5B?jo*IRmr=Vq%7B z^Nb5ajvm4!P)`1w@|TyFrf=#1H$&8Tmc}bQ$qK!6#Vf`oE6j>j;T7&F?`|kSeD(xt zqu+N_2$E~xe-&k-Iw?qA5r%2@Jh&WYFJ3VrcIzZZG?=U?llqbsGtEyJLYPWcTxotL zN~D@SVQK6Zk0VkVyLF;t)kU;GqyS4*Idtl$6%)J8RTZUyit6ZoRZ$kG2uG8uVrHP? z%IG%U<9vUP93t?O<+j436;VCW(IqXhTirecvayz-@d`H@BhZytk2~ti`7$i?B|W>% zdXc90O^0AX=T4{>Wyc9Zl-2%7QEFA0wc&I0U{x4$zJ@15&Qq%Q|A;l4nFV~E$DW&s|9RJexre3 z!Zw*UbV`tF5$UQ4buB9-lv8y~(8>)mRO2Z4lZw{iwt(EuqbJ@MQ9?ymW2p?|)b?M4RRgqN>C0^?52 zaa(~FmI_f{b}xxfTHIFV##jP6<8@#RLIqu?i!=vT$sI^WhD+fyN4OC-#N}s?^=AQ6C6d)?XU*XELN8*SF?yMe`dK#IYIxj(ul?E4w=;ZOdcb77>d~oI$J8J-38l+A zD}Df%VjbA8rnH(o#}Q6+*N<=msL@?7Q~ObYkJq{Bj+}V_BjpIkT0Cg(&LG#4+<~Qh z^p(bL%IGWA*4g51L@4jx@Q@ysx8l+6k`^Q|!bdKRhme`+*%%Lv+ZggPX7nXluvO+{ zXac)&$&?J08QhvKZ*8ITi80eIRBgUrAwP-WP>v4rsBCCrF8(yV=b;9o<6IIK=C%my zs_@@aRE|oBoReo2BW-$;22~oq|K0v9!>RcB19wVhjW=0t| znMEHX(CmXf8UFlR%#$>KexWIOVE&x(zzr`vZ5?*sK5iuiDUr@y zGM|kZ_6a@cTO;&S0fap9%EI`{qN$fh&QN!_Rf*c8E~!g|a0MBBH*8fQvk80@kk%6I86JWM|NMm|;_)NkYE@$>^KLotB4f!ynXKM6apv zc%EOH8mf-WPgHTa=;G1^)&=)#O-sZ?&&dhWf<(18qT^IRx8n(MVWO zVmMQbH0c4n<0d(O-0O%msd*FXtm`H+o}np;dCT>QR6Ds_;?ccf3*R+NGfsQv&9rXY zOYu+7^DKoO7_O?Si>qd0S0qdCScSo1S=je<86W9|t5t+OOR*!`f{N$6H^jx0f#d4T zv0%xsz-P^D=HLwDukD-a7pP;_?>nfs>U^~a`*@Cms0}BORbm1Ww*GJp5sfot7W&oj z1p=V-1nj1Y^w!VJ?-#St6HDr~5Kb-?N_* zL7#2W;R`3e_5iWg<_VN_R|}8wr`nQt?KF=R(4KkPn|bQUJRP*3a=@mEv&TN4FHX^FgQNARedw~DR2EDq}&Q|3i3PR;IKYsav)%wPpkgH3r5u{QY(uQEsz!Oi~4g4_p zt9@y#J{N4w0bF0Qr0I)C@9z>pPkmUuWu5E8L&I>E+(2vepIA+>98^;=iIF3ZhCeZl zQjP9<>xI3&87?8@E*^kO*vGkwutqRFerB&>5j0gf4Sf$4>{$|P@%CS12WZbTg6bdH zp3m2F$4r!zmeQ@>A8f+%7Gu4w6kj96SGR|f4?q}ka?#}mVjBSD$EK~=IUlbciN8qKE z(Ri>h;nimc3HP^1b);?2q20NVd$FhYRl4EAmJ}YQIG^)fy2VWgnI}F zHzSY*#V2DkO9l=++Yy_xi*_*up~DI9MrKyrBZS`1-pA16hAjPx9i4P4{g1xu<8K6u zvg>1vyR0LY@GG)HRQp*ER{-1EaB8Jr?ZFUp{(l@taXxze)D1!bqyL^=P=BsA2>mYJ zAoPUJlj?_Z)6pbZQdkJ%PfHG~_LIEY%VCEse-@6Wx!h@9I6ldm2@4dT)OiVwlFgs2 zyh$wP$(IZs;eRZZ4mzw0ZabceN00iR%KtNTByrCJe1NXV0xW5G#BCD0V@GU_g@{PA zRifo{&>HfDM(Ue)%d7In~&L?!nt2U($;>xl~P4OE3ALvSAn zId!4Pd0T zxSxBDM+MPH^SDF zP$4RcmnNzJ)+GYEIWyy>Y-5X^kI6VjhbMv<@LeGno~-e9m8;5XH962038;Bf;x(SG z0=xcd1Wul*w@e|?iovm#UN*#CU852;-dgPd1demgOzYdGeBaXxV6C2y4%5}xY}Xi7 zl`{g{4bR1WA5Z8Jcp^Ol^$V;mppovA#6^!9?iIO74*MnZvli}KfL+5f8BWBd7-+e5 z=XUx?*AuFR7;7c3A~&B?T|8$d1l+KKLKoXrdupSINIFGC((39~^-$Un6}z?2udeY! zbw)z@1BX<%ui_mJl9t5Ybgw8%Tg2oA21Wg`?e198P5jEg#!mD`rfkZaHYoa;*onVK z&fQeuoL1$Go{mytWZb5TylGW=(P1biMSPnoT+^ytkwIs)a4D}0D|8Ae2Q{tmu>zpM za*ZDe7|fMl4Hl9ceOCp$J1+zI)PeZI9$6)z6TMRxy{r2})4S7MdW0d2-7?OfxY?uD z`s3hUp1MSLsKOr)9tE(c1K8gM(3h*|Vez~+_E-0cLS*X76)2!TJKP`=ar7r8{c%kz zpg$?;Po;BONcxkK{#52o3rT-)$mrWt>6#Ym*Pk<0@F;#;0y|cWDruQ&_Xp*b!JU=T z4LY^3CvbozCMXV1;(nx0LLNLK4qAf7LHsJWE$_FH7<^%b5D+7Xf|0>HfHN8j9Ees3 zeLn&(QNZSJeqyfK`z`Zlc77!bh?A zpXMp|kn)nYFLaA+FR&l{MM%A%Q0@NIzP?hvM4=J!&GEQ)Prbz*J!9(Bs1KiWPLZCu z;xmW1yZrcfU>)!B@M#b>XHJloD0OLklJ*F}H)M0tCfV|PtZzSV`0T22dL64OqI-_| zHu!bxHa-CgSaOly<$#?2W%p|rLhS7QTBL^I+aQ#dE!&0`exV2KuO<3vc?~?R$?$0` z%X?DGCt9QUqL&AWj&`bhWDPbOmIZ9>%#tl-*^74AdgBVp`lubChClKITxQ@fBfjQc zdl`%1hcCRexEiteJddn{HJ;jp@R*>Hisi87uRxU-3soMuSq%+fb}IA>lANW-L#GW%)8jeL zX|pr*cuwB5*%^8~$2D!X(63#wT|$p{ft~qk(b2BcRE@=N;PA@)*sfHU2S+lCEZ?_U zaRq&E>w5dY<_d;HT9^Reg3?IG0vs#*;Zz@eNjTNWGVWN$Qx~>Ft zv^RS&{Ce{_IY&e-RH{^@>V5XTwwxT7@SGh!=5&;?B{5=bHmD`)5_q2;Wc^6^wXA=t zNcSg;tiRqJpC@i=MAnbkTV(x*Y+3(MQXuP(AnQLHF%=ndWcO_Y$nI~uLiU=T_#~0s z57fMY@Nq{jK6(b0pdUT81U*?W@pH(|xeY2bAs(6-51pR~zGF*g-a!OD$$D=jqM4A~ z4sx;xypMu_mPD?ckaS6jft3?|>zl|^uP$RzTpqh4tV!o|>)IdNq%&+t=M^M!v>`H$ z-EqE7Qe>5;lbmmoOf*S~NK)uuF$B@am~;vw53lk|ih2xKt==E$;$=FooEW`x2}k|$ z%89D7)JRrdHJ_7}rII6AsU@|^$})LN%$a0e`YPmSYl|3>O-Dt<>JHn+5Mt0sF_ohzS~9FTgTS=9g&-5e};v}K>M?= zeL1~9J1YCLd6OtEXLHsbwqAkrK529I72IOg+1U_okB;{O`x^991Ox}Z@w(?SEtaWpG^a;QAC^y({gs5epeKj(2B-S$`I?_lqikL+H)co_A zT)$b62p$2bbzy<0wS@~k)S*P4BuHM7drWsfa-iFg*H^JJ8AsuOeX zEe_4p5{5*jyFMHZSmz?i(R}ILnbxaZb>e$^t_ObC9MFWSNp4e{Pv^*L3OSt_X}v~P z4v$)44yAlKtqFOW)*f+iw3C~2eA8_>k{W`~uep|W3$$P6e4_Fy)>6y5f9Y{_B(^wp z5$X1W!*DW;L_>AF=FotrdX*mdru(I z(N4RSGHl-hh4ipp)Iz&+29Ww|h0|A6-o!j_I5kO_W$Q+<$CuZpDKcG)hyk(j`?a_VO(YH@^(x=ns(5Eq6yEfl*lB48I59yz5o<-iG z4#PnqQS(}Z-sJ2vY|u z6{bn?%V@jSCGy0>nFfZ%CZ*g>vpBw?jbYI>5(OeI`kd|EROa0%s#3ihtG%kd=@zfk z*DUTC5QnVho=_K$W_@kCLq5rBW6|2fG3s@!*Erz zM$$T)R(qW+MFLc>Gtyu`L`N%UZCjbwNp2>MwHVfsjGIDURE;SL$9x_sloZz6_*Lk- zRaZ7Lx3cpj&v2=W(oFf$PuLZX(dD}ElCa7x9ciAyyz08x{wm3HYu`)_YIsiNxcr>20g>I%}gOXKlAcpL`raMh^ZxRr4^5$XN0?tIc_3R#SCg|B+Bs0OxZi)#Z9{^rG_Z z9bjJcB`|RN#{56s%E|w%7XTnK4q;J}?GVjQmWh8bN78Xn*1T%3 z$ocRtldG1K*}0=(W_@WeyxUH<-qYm)=p53gAOA0b=V<>w1kdaKEAV{d{ttua!ygZx zcgx|64bPu{_y1aW{u(zh{{VhA{a4`m_4_^yp3i8oKt>TA*AE%o_r+i4|hR3fKkFZ6At2|w2HLdYFB3@p7 z2$M&|$94@PnwN49OWf5QfpA(Nbl2B>D=iiQ%FS*yCa~Mr{I5co>O4)i@^SscyhxsD z2#Hx;hQ#r|H$>BAmz=gDYe8?4Qf0ZUmDQ-)O?~e82v(z7PdrZ+t7^9eY_}|mM0q4iZoZ69mZzWcB<+lz zDK)fJu(tH6rQF?lk95Epolg7xYPQJ5XX`bL3I}MvPufp+>5Qj~eLXAghxA~D2c^x~ z{AUBCZx8b60RW-xBeclLCCwibhvlz!Ysjy^3#L>Jf>$eZ%W5bq1?Gs`3;QFW;1BHK zx;xw&b%y33K`L5kEkaO|0v8T(oF8XgPYdh@R@d0r&^69Rg|Vo~dO(FDPyqxO6sQ(d z04cJlAZGq`oWJ}(Y|z;JKaUNIL5GvE!K{xDWa*=58xFv4$O_J;)lx%$?z9(hb!_9p zqcDYaJCK+${Wt~5I6sP5RZC^ zuLw+ymVj*>5TkKY&p9uw-KXRP!5lXYEGhM~gYa6t&B*+z7j2VJA!R@=Rt~8}qxone z=!*8$|gel`t-2&^p#DuQ7|!@uIFDMO|Wd|GnhBbP^<#E;qVIU?{8 zweh!XAR&qeMD$-nX$m6cO^dh{6EEr?2Sg%AKcd=DSO-jHfyvRy22AyG8wP#5jFa_` z0i>6>VpL85stW`2+$+cEGW_**0IBO4-R1Ugz@pZ8|zgqT`9_zZV=jh_!S`{ z)(H-vC8Z?fJA=y>4Jinxvyq!)EhG$E592EeopgC-XD+I&Bjv~`sF5!kQq_i1kArrb zr%ARv(0-4+-}MPiOxY%k60$v9;riMGehWd4{HK1S!stD=B4QRk$V*P-;){0xbdj^8 z?qwe9vvftfkw7cP#u&Ofb=g(cDAUP!(2_kbEWv2iZvBA6*s$6syI$*T9ENp`z?5ZQ zcw?~F8YQn>K2e8ivaOFCM$L{9;#G`-l6~|Htwswk~7pxj@dD5w-uz}-5dXju@3ymj&_lT9K)aI;y2{44S^0OCSD~tm8JxQZ3=RRrK z!63Ci6?P}8M0TKeOgh4It+97-JJP>4CYYaPh1M+7DlP0k=XUH|5$(t2C>NWMM78+t z;9+T!Rob}&M=eDhCyXHr9$^8{^O+NZf&?r~9;vY!C*y3%s2|mKal~!^(LW#TCqhxCxut6RJv+q62waHRVO=w**G1D5q=AuugDS^me~K{>brQy%U|ITij_$Z}ePQN24Cm8J)b$S!Z2z zDeLY4`*yzrZDLmJMgG90(a8vmLfooc#?X*o-@_uA-@D{gnXxmNg1QnaBLSB$Cc*+! z?*cBHsI&h4l=(P2p6d^^ubQ8Lla2bV9cyGw^sAwqim$wc^+2i@+OBGj`qqmhS~>%= z)LCCRb(yWYOkZprh-H`Cbr{)T(2w2LAkNk)yMb*;PT7&OWj&K}N1VD`sTnBz_2N@O zfdZ`$;u-<;0zL?25IEGp_8eKT%n?pcgJ)$FY^|NXHU}IZpnz)TpJ!NR{vj$L#7LAIRG2v z|2)SUC#^eXLu=a8Ff-Gh*wKl0dzkihOyrEwSjjHi$zJI&@87B&Tk%6K$B$AMj!xQw zhqz%+K8Q2B-%>G7+w7)L%HCuU!wq-@Ih??(g5#FpLHV(U+${$_M-f)-q?dB)bI7`T zqXso53kACISx7E6Cy|YegVC>V);5vPE9k*m^+TpEB? zrlF;C>>u4Gl%tV0W`j|M(Kx!lRT zUg2Gm2o)OjC^uZ#P}EI zeWN{1Q^f-{7JqH+AA;u)s z4+qoA$Txcxj9ZZeFrh@W2s8>x9$T9@2qV^yFr9Bo^y3ArktUR++vIndPdnJXu- zdX%c#nacfbQB-W=5)pqzoOcqnktWcw;*In|VmHa)pZ}iB{8@KYW<+)hv3bdvM2DFM zd`2sx+Qu^LR=Ja>(r|l~n%k>1+}@mUWYlIc#ar8K+PyEZ5_V5jPA_@CxKi3I_6FAg z;2eMCiG+ASO*Z@a|90k6vY8{c)Owy$qr2gSVl{i6iDnF~I6w<05|T{#-PGuNyYa}R zv(YdaH1@8^_4$%uHMz|vV3{btFTQ@5m*_-7is8xyicRVwOLc|U5h;C4Hs4@BaTBVv zf{O5Y!EH__9y_FI zvDWd~qwd*P82TZl8|pE4y@6L{DPUIaEm9)R3dGAH8WrD_JzUK}q(=+e6TUU)X}zFA4}-|A9?P+Dy0dO05IsyR!n6O;jW9IT)XFrOl-I z4XkL-N5k-a4I^h3d~hz!Q-BpL!-kmdhENh{i4E*S09!SelEB26NvWEviAg_Sm3fXm zB13Q@*_<8|F3}K%I5COn)ad&dbAvFc(MP1<%IP74S@@^C^JlVwt1N|gh*wTeR%)7; ztaQut2Sua+&BA@GL(G0h=~}hn3Hk>ON8KhzlPo*a&6Am5)!F$qAbo!ey##wcHMguT z$0x_y3t~O4=%pZ<94GE&r;TT^a@hdkH!w%CyU&_NSCH-PvktiE7}s>sKl=RN>!Rrw zUHFIT=VYOuvo!tePd(#vy%11qsx+`a^_>2(sHfRq)N+vMg@E3u>8B`fYw9WT3i~-a zTW>qc(%beinQi-d>8F7=>>`lLZrG_L`U6|eVXIY{@m!r9&)CsZ-XHXq@X<(bGGoh- zHeP_^pC=>uHVOJOBU?D|$hLsM2wV4A8}yJC{`ZE|b|(AxCWEyi4r{RzxS?t|vI7rs z;w$$pz5&y*G*7}m+rPOuP5)^&t07xrv=^$ap$JYy0nHDbgb2x^Gg#;n57EkcwU*VR z2a42_mR~k#eC2@aWd5P>GAf(YjkWyK0vpd<``Sxh; z_~h6R_gTxzvr{f2o^zswl*t^z@nvbee0s86Qw%C}q5K7`zK+DC;mGva23Ehm16VOT zTQOhx@n&EU_5b(A$1sMADOM(5S_K|{0Y1$d{WvR$@D1^i3KOGQSgo5y7K5e2IyEV5 zjYVLN06?_~bMU5N4giT+bh40Q{GchPScGJlk)5=@%C>YpgUbWES9Ct% z>^i$-7jv)A_j1~i`JQ*t%ThNEx-Pig40TQKrXAO6rLu{3<1~F_KR$DF4nMaUls*+d zw+QtISy`HwGdk8hF^BKT^EFq)r99XU$NebE7*CTQ3z~=IyPenxDXWVx@6}J8eDP?xZRTp1kGCWsA z&SY}~ou+dRywdyDKR~>y6orey!aT=X#&_j!9mjQA5HM)tLwrULP_+w^s#<^iTf&+M zw#L@F{pzw6`6|@S7AMqgF1-jGSKECRNjzKr;!6VCm5%}2ofMCzR6?=_j-l?}p6VKe zA<{8zhlJ~OyWMgX+s5WbsbB>6I#|;=7~Q1bO(&X#M=y2x*6-%`RE>roeUr~LI<}f7 zR||bY`@tcq^O$+AD#D6~b(LzPOJ0Idy@uHTlp-SUdo48>ch?DvP-ILvLqUKR+&sv7^-BwwV9_7Xz`C?~w zcC{L2&-!sDjlR+$Y?YEML$9=OUwk6gi*P}#0s8oPw=V`2UCsSv%+0UAb3^BudT@99BnviCj**P3!mWO-d6Ss+FZv9+Ksz8jjZWo8SBtnjgwWu2ViP zXVqr?V225#RPw$$j9?SHw^XCA-kRCSz#D(r8HqL~M;L2oui$lwMu(W1V-G5fao8%9 zTs2~5m2h7cFVTkN!?AO#bf?ACvR?JQe;2#?c?;B7#ihH|{cPxq-zk2<^#PMq9Y65b z;^eh~?fviFoxv1!y_9?JZZR=A0#fSJhX-(isMPIN1;y>$w|maYiJ1BCb0x#p7fFw) z2p?K`<(gY7e>I&bpl>)&3)z?Mrok=zI2uz7uLu(6d6DUVS}X73F#%j(<;Mo<2)m-L zoAjG%OTX8vIu;%e=ZT3$y~Vx?SG_;58}SOa2dn+Q${p<2YNaLhe%EPgabfIl8GT@x z1FbplG6J~67SngySh8#CTt9B6m-tnEk*r@vlNdj>N|w0Fiue+LyuN7qkm%4WY|^RTZ1u&N!x<#yZ-zXT@uF z)6)JzUdWxFr?98#Zdea?TPmU#AdEnnpMvjtL20*ERxs_favD0b>8bmi?B#Q1-Y3nl zIyD&{MUDfwU<4uXMW*%6u zroGMdZxG{xKXrY?R%AV5k|#sPL?JX$if`i>O=H23)FoCdox+$VWE{KYw!c;sN-(Ir zdbM?;3R;3a8`Igh{w@krzNTAlcSJwmbjun?bP8EevK7dW z4&x3swI89nH3z}!lB{S^=3i`$hda>^*KL0kcGi)lo)T+K2J=k`cEse3?G8S$d?#Hr=w8b8t{U zGc!wIEG_V=)`;E+4!}>Gq#yesm2e)l-xV0o(NqQVf{{_<9 z?NO;8lQpmWdc+I{!ecdru@P7M=7+6D zR_C;o-3BqS*XP9A*}OViLDSmYNk(mT)RrzlrJATG9roDIPxC7<0Upq&Nng+GNBa2l z>T^DWYP3@r^cEmwJpHkGg8=d=21=v;)n2PYKE+zs7Q1-)wGmC17M94Pf=cEv5$vUJ6Q zi|LBF{Q`3ikwIIVa9)wUI{6!@oX9r(q!XX!ud=FV*uFHn$o>{=K=xm>EYJEX(}@En z>uH!MHJpf_%x0kah&Xc6JFUy@^czfir?vK^^#29;|3ctDp;E)YGz0(7pY!4Hk6mow zzv32w{g=|P|Ez&MObXX>=fYktX9M;FN z&uH`oI`F8~D}8p@OU+q)=GAS#`gvs*`55Tml6Z-28Dd_iBB#yK;)0us$2MrnzO0I!+&~YKFcr-m=? z^sri{XPu0P;ZLle!NH-}I!G^B*J;XlP19=Dxhqd%LN1{s&4lEx{Xp~+#B2To{1|yT zY^64pY`$K zf-I|GNV>#+EhpBH9Qvb4i1khKYyROvn}68ODg^a=S>iK{z~5n}4I@y(R54G_^hwc` ziGL&glp$`0{-@!0GdT1y;rISK1HiB^>LcOzO|s{} z?*>pI&1z-gH#a9X1HW{C9%KS#`ZHJKL$$_-ij(l+)2Haq@N|E`!Zdqw{Oym?`rl6P z)A}DVhfZ$&=A78{nB?H|8z5k&{U46cOKH zM+XtapWLJ8a$+;%0X=#&mmcNVTj$avxoxonr46u@^GHpHw1uIjIVa1ttmiL0Zp<`M z1L-3`;tWf~oNWk@zIK76Nz5%0;R`!bo7M@@(~^&{D6xEjL|Q>4G|5Tb=8SjQQk$xc zhpHXb${R)%Mf6Z4iPx$!N&4*%_0ePLO=-Hucyj7eHYsNLBRAGnM=q+4o`-aRT^$$O z`DMe|Fy#}oU{gj_(2AX V(v_c!sdKibQIsh-gNl8pyndD`U&Fqt$+h1BJ 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

@GX$4R)A?H3j3oU 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 z%0A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 literal 0 HcmV?d00001 From e9ffbadbd60399b21e24b50e7fadb43057ee5907 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 20 Apr 2015 02:58:09 +0300 Subject: [PATCH 13/20] Upgrade the code redemption system - you can't use the same code twice anymore and expiration dates are added. --- astron/dclass/toon.dc | 1 + otp/distributed/DCClassImports.py | 2 +- .../coderedemption/TTCodeRedemptionMgrAI.py | 35 ++++++++++++------- toontown/shtiker/OptionsPage.py | 4 --- toontown/toon/DistributedToon.py | 4 +++ toontown/toon/DistributedToonAI.py | 34 +++++++++++------- toontown/toon/DistributedToonUD.py | 3 ++ toontown/toonbase/TTLocalizerEnglish.py | 2 -- 8 files changed, 52 insertions(+), 33 deletions(-) diff --git a/astron/dclass/toon.dc b/astron/dclass/toon.dc index fdae39f7..cc06c1ee 100644 --- a/astron/dclass/toon.dc +++ b/astron/dclass/toon.dc @@ -626,6 +626,7 @@ dclass DistributedToon : DistributedPlayer { flagAv(uint32, uint16, string []) airecv ownsend; setAnimalSound(uint8 index) ram broadcast ownrecv; setBuffs(uint32[] = []) required ownrecv db; + setRedeemedCodes(string [] = []) required ownrecv db; }; dclass DistributedCCharBase : DistributedObject { diff --git a/otp/distributed/DCClassImports.py b/otp/distributed/DCClassImports.py index b2b16c96..7b063f86 100644 --- a/otp/distributed/DCClassImports.py +++ b/otp/distributed/DCClassImports.py @@ -2,7 +2,7 @@ from pandac.PandaModules import * -hashVal = 1907452799 +hashVal = 1165841663 from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index 691c3248..b4303199 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -2,9 +2,23 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI from toontown.catalog import CatalogClothingItem from toontown.toonbase import ToontownGlobals -from datetime import datetime +from datetime import datetime, timedelta import time +""" +Code example: + +'codeName': { + 'items': [ + CatalogTypeItem.CatalogTypeItem(arguments) + ] + 'expirationDate': datetime(2020, 1, 30), + 'month': 1, + 'day': 30 +} + +Expiration date, month and day are optional fields. +""" class TTCodeRedemptionMgrAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrAI") codes = { @@ -20,7 +34,7 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): def announceGenerate(self): DistributedObjectAI.announceGenerate(self) - def getMailboxCount(items): + def getMailboxCount(self, items): count = 0 for item in items: @@ -38,13 +52,13 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): if code in self.codes: if av.isCodeRedeemed(code): - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 4]) + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 2]) return codeInfo = self.codes[code] date = datetime.now() - if ('month' in codeInfo and date.month is not codeInfo['month']) or ('day' in codeInfo and date.day is not codeInfo['day']): + if ('month' in codeInfo and date.month is not codeInfo['month']) or ('day' in codeInfo and date.day is not codeInfo['day']) or ('expirationDate' in codeInfo and codeInfo['expirationDate'] - date < timedelta(hours = 1)): self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 2, 0]) return @@ -54,21 +68,16 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 1, 0]) def requestCodeRedeem(self, context, avId, av, items): - if item in av.onOrder: - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 2]) - return - - if item.reachedPurchaseLimit(av): - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 3]) - return - - count = getMailboxCount(items) + count = self.getMailboxCount(items) if len(av.onOrder) + count > 5 or len(av.mailboxContents) + len(av.onOrder) + count >= ToontownGlobals.MaxMailboxContents: self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 3, 1]) return for item in items: + if item in av.onOrder or item.reachedPurchaseLimit: + continue + item.deliveryDate = int(time.time() / 60) + 0.01 av.onOrder.append(item) diff --git a/toontown/shtiker/OptionsPage.py b/toontown/shtiker/OptionsPage.py index 22eafc85..79bff0eb 100644 --- a/toontown/shtiker/OptionsPage.py +++ b/toontown/shtiker/OptionsPage.py @@ -657,10 +657,6 @@ class CodesTabPage(DirectFrame): if awardMgrResult == 1: self.resultPanel['text'] = TTLocalizer.CdrResultMailboxFull elif awardMgrResult == 2: - self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyInMailbox - elif awardMgrResult == 3: - self.resultPanel['text'] = TTLocalizer.CdrResultReachedLimit - elif awardMgrResult == 4: self.resultPanel['text'] = TTLocalizer.CdrResultAlreadyRedeemed if result == 0: self.successSfx.play() diff --git a/toontown/toon/DistributedToon.py b/toontown/toon/DistributedToon.py index ce313e32..baa9ebe7 100644 --- a/toontown/toon/DistributedToon.py +++ b/toontown/toon/DistributedToon.py @@ -185,6 +185,7 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute self.canEarnAchievements = False self.promotionStatus = [0, 0, 0, 0] self.buffs = [] + self.redeemedCodes = [] def disable(self): for soundSequence in self.soundSequenceList: @@ -2635,6 +2636,9 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute self.buffs = buffs self.applyBuffs() + def setRedeemedCodes(self, redeemedCodes): + self.redeemedCodes = redeemedCodes + def applyBuffs(self): for id, timestamp in enumerate(self.buffs): if id == ToontownGlobals.BMovementSpeed: diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index a8fcdb8f..50a68957 100644 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -566,19 +566,6 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo def getMaxNPCFriends(self): return self.maxNPCFriends - def b_setRedeemedCodes(self, redeemedCodes): - self.redeemedCodes = redeemedCodes - - def getRedeemedCodes(self, redeemedCodes): - return self.redeemedCodes - - def isCodeRedeemed(self, code): - return code in self.redeemedCodes - - def redeemCode(self, code): - if not isCodeReedemed(code): - self.redeemedCodes.append(code) - def getBattleId(self): if self.battleId >= 0: return self.battleId @@ -4292,6 +4279,27 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.setBuffs(buffs) self.d_setBuffs(buffs) + def setRedeemedCodes(self, redeemedCodes): + self.redeemedCodes = redeemedCodes + + def d_setRedeemedCodes(self, redeemedCodes): + self.sendUpdate('setRedeemedCodes', [redeemedCodes]) + + def b_setRedeemedCodes(self, redeemedCodes): + self.setRedeemedCodes(redeemedCodes) + self.d_setRedeemedCodes(redeemedCodes) + + def getRedeemedCodes(self, redeemedCodes): + return self.redeemedCodes + + def isCodeRedeemed(self, code): + return code in self.redeemedCodes + + def redeemCode(self, code): + if not self.isCodeRedeemed(code): + self.redeemedCodes.append(code) + self.b_setRedeemedCodes(self.redeemedCodes) + @magicWord(category=CATEGORY_PROGRAMMER, types=[str, int, int]) def cheesyEffect(value, hood=0, expire=0): diff --git a/toontown/toon/DistributedToonUD.py b/toontown/toon/DistributedToonUD.py index 49a5ab82..007e1600 100644 --- a/toontown/toon/DistributedToonUD.py +++ b/toontown/toon/DistributedToonUD.py @@ -543,3 +543,6 @@ class DistributedToonUD(DistributedObjectUD): def setAchievements(self, achievements): pass + + def setRedeemedCodes(self, redeemedCodes): + pass diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 86ddcd6e..6c172911 100644 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -4699,8 +4699,6 @@ CdrResultSuccess = 'Congratulations! Check your mailbox to claim your item!' CdrResultInvalidCode = "You've entered an invalid code. Please check the code and try again." CdrResultExpiredCode = "We're sorry. This code has expired." CdrResultMailboxFull = 'Your mailbox is full. Please remove an item, then enter your code again.' -CdrResultAlreadyInMailbox = "You've already received this item. Check your mailbox to confirm." -CdrResultReachedLimit = "You reached your limit for today. Please try again later." CdrResultAlreadyRedeemed = "You've already redeemed this item!" TrackPageTitle = 'Gag Track Training' TrackPageShortTitle = 'Gag Training' From 639a8d953c47bc3f3a4d6a4c9668a5144a2657b5 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 6 Mar 2015 21:13:52 -0500 Subject: [PATCH 14/20] CodeRedemption: Added notice, and added all catalog item imports. --- .../coderedemption/TTCodeRedemptionMgrAI.py | 18 +++++++++++++----- toontown/shtiker/OptionsPage.py | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index b4303199..c4d7c064 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -1,6 +1,15 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI from toontown.catalog import CatalogClothingItem +from toontown.catalog import CatalogNametagItem +from toontown.catalog import CatalogChatItem +from toontown.catalog import CatalogEmoteItem +from toontown.catalog import CatalogGardenItem +from toontown.catalog import CatalogGardenStarterItem +from toontown.catalog import CatalogMouldingItem +from toontown.catalog import CatalogRentalItem +from toontown.catalog import CatalogFurnitureItem +from toontown.catalog import CatalogFlooringItem from toontown.toonbase import ToontownGlobals from datetime import datetime, timedelta import time @@ -22,12 +31,11 @@ Expiration date, month and day are optional fields. class TTCodeRedemptionMgrAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrAI") codes = { - 'weed': { + 'test': { 'items': [ CatalogClothingItem.CatalogClothingItem(1821, 0) - ], - 'month': 4, - 'day': 20 + ] + 'expirationDate': datetime(2015, 3, 30) } } @@ -82,4 +90,4 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): av.onOrder.append(item) av.b_setDeliverySchedule(av.onOrder) - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 0, 0]) \ No newline at end of file + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 0, 0]) diff --git a/toontown/shtiker/OptionsPage.py b/toontown/shtiker/OptionsPage.py index 79bff0eb..4ea1b8af 100644 --- a/toontown/shtiker/OptionsPage.py +++ b/toontown/shtiker/OptionsPage.py @@ -568,6 +568,7 @@ class CodesTabPage(DirectFrame): return def load(self): + self.notice = DirectLabel(parent=self, relief=None, text='NOTICE: All codes can only be entered once!', text_scale=0.06, pos=(0.0, 0, 0.53), text_fg=Vec4(1.0, 0, 0, 1)) cdrGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_sbk_codeRedemptionGui') instructionGui = cdrGui.find('**/tt_t_gui_sbk_cdrPresent') flippyGui = cdrGui.find('**/tt_t_gui_sbk_cdrFlippy') From 98a79288fca387cfa4d7125f098b86ed3fd1a579 Mon Sep 17 00:00:00 2001 From: Wilee999 Date: Fri, 6 Mar 2015 18:46:05 -0800 Subject: [PATCH 15/20] cogdo: stuff --- astron/dclass/toon.dc | 6754 ++++++++--------- config/general.prc | 263 +- otp/distributed/DCClassImports.py | 116 +- toontown/cogdominium/CogdoBarrelRoom.py | 29 +- toontown/cogdominium/CogdoBarrelRoomConsts.py | 12 +- toontown/cogdominium/CogdoBarrelRoomMovies.py | 118 + .../cogdominium/CogdoBarrelRoomRewardPanel.py | 25 +- toontown/cogdominium/CogdoCraneGame.py | 74 + toontown/cogdominium/CogdoCraneGameConsts.py | 8 + toontown/cogdominium/CogdoElevatorMovie.py | 7 +- .../cogdominium/CogdoExecutiveSuiteMovies.py | 4 +- .../cogdominium/CogdoFlyingCameraManager.py | 16 +- toontown/cogdominium/CogdoFlyingGame.py | 24 +- .../cogdominium/CogdoFlyingGameGlobals.py | 29 +- toontown/cogdominium/CogdoFlyingGameGuis.py | 9 +- toontown/cogdominium/CogdoFlyingGuiManager.py | 2 +- toontown/cogdominium/CogdoFlyingLegalEagle.py | 2 + toontown/cogdominium/CogdoFlyingLevel.py | 23 +- .../cogdominium/CogdoFlyingLevelQuadrant.py | 7 +- .../cogdominium/CogdoFlyingLocalPlayer.py | 38 +- toontown/cogdominium/CogdoFlyingObjects.py | 9 +- toontown/cogdominium/CogdoFlyingObstacles.py | 9 +- toontown/cogdominium/CogdoFlyingPlayer.py | 4 +- toontown/cogdominium/CogdoGameGatherable.py | 5 +- toontown/cogdominium/CogdoInterior.py | 4 +- toontown/cogdominium/CogdoMaze.py | 30 +- toontown/cogdominium/CogdoMazeGame.py | 12 +- toontown/cogdominium/CogdoMazeGameGuis.py | 2 +- toontown/cogdominium/CogdoMazeGameMovies.py | 2 +- toontown/cogdominium/CogdoMazeGuiManager.py | 1 + toontown/cogdominium/CogdoMazeSuits.py | 6 +- toontown/cogdominium/CogdoMemoGui.py | 8 +- toontown/cogdominium/CogdoUtil.py | 10 +- toontown/cogdominium/DistCogdoCrane.py | 39 +- toontown/cogdominium/DistCogdoCraneGame.py | 2 +- toontown/cogdominium/DistCogdoCraneGameAI.py | 70 +- toontown/cogdominium/DistCogdoCraneObject.py | 2 + toontown/cogdominium/DistCogdoFlyingGame.py | 2 - toontown/cogdominium/DistCogdoFlyingGameAI.py | 153 +- toontown/cogdominium/DistCogdoGame.py | 10 +- toontown/cogdominium/DistCogdoGameAI.py | 124 +- toontown/cogdominium/DistCogdoMazeGame.py | 13 +- toontown/cogdominium/DistCogdoMazeGameAI.py | 284 +- .../cogdominium/DistributedCogdoBarrel.py | 10 +- .../cogdominium/DistributedCogdoBarrelAI.py | 49 +- .../DistributedCogdoElevatorExt.py | 17 +- .../DistributedCogdoElevatorExtAI.py | 8 +- .../cogdominium/DistributedCogdoInterior.py | 181 +- .../cogdominium/DistributedCogdoInteriorAI.py | 584 +- .../cogdominium/SuitPlannerCogdoInteriorAI.py | 210 +- 50 files changed, 5410 insertions(+), 4010 deletions(-) create mode 100644 toontown/cogdominium/CogdoBarrelRoomMovies.py create mode 100644 toontown/cogdominium/CogdoCraneGame.py diff --git a/astron/dclass/toon.dc b/astron/dclass/toon.dc index cc06c1ee..e4c10eea 100644 --- a/astron/dclass/toon.dc +++ b/astron/dclass/toon.dc @@ -1,3410 +1,3344 @@ -from direct.distributed import DistributedObjectGlobal -from toontown.ai import WelcomeValleyManager/AI -from toontown.building import DistributedAnimatedProp/AI -from toontown.toon import DistributedToon/AI/UD -from toontown.classicchars import DistributedCCharBase/AI -from toontown.classicchars import DistributedMickey/AI -from toontown.classicchars import DistributedVampireMickey/AI -from toontown.classicchars import DistributedMinnie/AI -from toontown.classicchars import DistributedWitchMinnie/AI -from toontown.classicchars import DistributedGoofy/AI -from toontown.classicchars import DistributedSuperGoofy/AI -from toontown.classicchars import DistributedDaisy/AI -from toontown.classicchars import DistributedSockHopDaisy/AI -from toontown.classicchars import DistributedChip/AI -from toontown.classicchars import DistributedPoliceChip/AI -from toontown.classicchars import DistributedDale/AI -from toontown.classicchars import DistributedJailbirdDale/AI -from toontown.classicchars import DistributedGoofySpeedway/AI -from toontown.classicchars import DistributedDonald/AI -from toontown.classicchars import DistributedFrankenDonald/AI -from toontown.classicchars import DistributedDonaldDock/AI -from toontown.classicchars import DistributedPluto/AI -from toontown.classicchars import DistributedWesternPluto/AI -from toontown.safezone import DistributedTrolley/AI -from toontown.safezone import DistributedPartyGate/AI -from toontown.suit import DistributedSuitPlanner/AI -from toontown.suit import DistributedSuitBase/AI -from toontown.suit import DistributedSuit/AI -from toontown.suit import DistributedTutorialSuit/AI -from toontown.suit import DistributedFactorySuit/AI -from toontown.suit import DistributedMintSuit/AI -from toontown.suit import DistributedStageSuit/AI -from toontown.suit import DistributedSellbotBoss/AI -from toontown.suit import DistributedCashbotBoss/AI -from toontown.coghq import DistributedCashbotBossSafe/AI -from toontown.coghq import DistributedCashbotBossCrane/AI -from toontown.suit import DistributedCashbotBossGoon/AI -from toontown.battle import DistributedBattleBase/AI -from toontown.battle import DistributedBattle/AI -from toontown.battle import DistributedBattleBldg/AI -from toontown.tutorial import DistributedBattleTutorial/AI -from toontown.coghq import DistributedBattleFactory/AI -from toontown.battle import DistributedBattleFinal/AI -from toontown.safezone import DistributedBoat/AI -from toontown.safezone import DistributedButterfly/AI -from toontown.safezone import DistributedMMPiano/AI -from toontown.safezone import DistributedDGFlower/AI -from toontown.fishing import DistributedFishingPond/AI -from toontown.fishing import DistributedFishingTarget/AI -from toontown.fishing import DistributedPondBingoManager/AI -from toontown.safezone import DistributedFishingSpot/AI -from toontown.estate import DistributedCannon/AI -from toontown.estate import DistributedTarget/AI -from toontown.minigame import DistributedMinigame/AI -from toontown.minigame import DistributedMinigameTemplate/AI -from toontown.minigame import DistributedRaceGame/AI -from toontown.minigame import DistributedCannonGame/AI -from toontown.minigame import DistributedPhotoGame/AI -from toontown.minigame import DistributedPatternGame/AI -from toontown.minigame import DistributedRingGame/AI -from toontown.minigame import DistributedTagGame/AI -from toontown.minigame import DistributedMazeGame/AI -from toontown.minigame import DistributedTugOfWarGame/AI -from toontown.minigame import DistributedCatchGame/AI -from toontown.minigame import DistributedDivingGame/AI -from toontown.minigame import DistributedTargetGame/AI -from toontown.estate import EstateManager/AI -from toontown.estate import DistributedEstate/AI -from toontown.estate import DistributedHouse/AI -from toontown.estate import DistributedHouseInterior/AI -from toontown.estate import DistributedGarden/AI -from toontown.shtiker import DeleteManager/AI -from toontown.ai import NewsManager/AI -from toontown.shtiker import PurchaseManager/AI -from toontown.shtiker import NewbiePurchaseManager/AI -from toontown.safezone import SafeZoneManager/AI -from toontown.tutorial import TutorialManager/AI -from toontown.catalog import CatalogManager/AI -from toontown.safezone import DistributedTreasure/AI -from toontown.coghq import DistributedCashbotBossTreasure/AI -from toontown.building import DistributedTrophyMgr/AI -from toontown.building import DistributedBuilding/AI -from toontown.building import DistributedAnimBuilding/AI -from toontown.building import DistributedBuildingQueryMgr/AI -from toontown.building import DistributedToonInterior/AI -from toontown.building import DistributedToonHallInterior/AI -from toontown.building import DistributedSuitInterior/AI -from toontown.building import DistributedHQInterior/AI -from toontown.building import DistributedGagshopInterior/AI -from toontown.building import DistributedPetshopInterior/AI -from toontown.building import DistributedKartShopInterior/AI -from toontown.building import DistributedBankInterior/AI -from toontown.building import DistributedBankCollectable/AI -from toontown.building import DistributedLibraryInterior/AI -from toontown.building import DistributedDoor/AI -from toontown.building import DistributedAnimDoor/AI -from toontown.estate import DistributedHouseDoor/AI -from toontown.coghq import DistributedCogHQDoor/AI -from toontown.coghq import DistributedSellbotHQDoor/AI -from toontown.toon import DistributedNPCToonBase/AI -from toontown.toon import DistributedNPCToon/AI -from toontown.toon import DistributedSmartNPC/AI -from toontown.toon import DistributedSmartNPC/AI -from toontown.toon import DistributedNPCSpecialQuestGiver/AI -from toontown.toon import DistributedNPCFlippyInToonHall/AI -from toontown.toon import DistributedNPCScientist/AI -from toontown.toon import DistributedNPCClerk/AI -from toontown.toon import DistributedNPCTailor/AI -from toontown.toon import DistributedNPCBlocker/AI -from toontown.toon import DistributedNPCFisherman/AI -from toontown.toon import DistributedNPCPartyPerson/AI -from toontown.toon import DistributedNPCPetclerk/AI -from toontown.toon import DistributedNPCKartClerk/AI -from toontown.toon import DistributedNPCYin/AI -from toontown.toon import DistributedNPCYang/AI -from toontown.building import DistributedKnockKnockDoor/AI -from toontown.building import DistributedElevator/AI -from toontown.building import DistributedElevatorFSM/AI -from toontown.building import DistributedElevatorExt/AI -from toontown.building import DistributedElevatorInt/AI -from toontown.coghq import DistributedFactoryElevatorExt/AI -from toontown.coghq import DistributedMintElevatorExt/AI -from toontown.coghq import DistributedLawOfficeElevatorExt/AI -from toontown.coghq import DistributedLawOfficeElevatorInt/AI -from toontown.building import DistributedElevatorFloor/AI -from toontown.building import DistributedBossElevator/AI -from toontown.building import DistributedVPElevator/AI -from toontown.building import DistributedCFOElevator/AI -from toontown.building import DistributedCJElevator/AI -from toontown.building import DistributedBBElevator/AI -from toontown.building import DistributedBoardingParty/AI -from toontown.building import DistributedTutorialInterior/AI -from toontown.estate import DistributedBankMgr/AI -from toontown.estate import DistributedMailbox/AI -from toontown.estate import DistributedFurnitureManager/AI -from toontown.estate import DistributedFurnitureItem/AI -from toontown.estate import DistributedBank/AI -from toontown.toon import DistributedNPCBanker/AI -from toontown.estate import DistributedCloset/AI -from toontown.estate import DistributedTrunk/AI -from toontown.estate import DistributedPhone/AI -from toontown.effects import DistributedFireworkShow/AI -from toontown.estate import DistributedFireworksCannon/AI -from toontown.coghq import LobbyManager/AI -from otp.level import DistributedLevel/AI -from otp.level import DistributedEntity/AI -from otp.level import DistributedInteractiveEntity/AI -from toontown.coghq import DistributedMegaCorp/AI -from toontown.coghq import DistributedFactory/AI -from toontown.coghq import DistributedLawOffice/AI -from toontown.coghq import DistributedLawOfficeFloor/AI -from toontown.coghq import DistributedLift/AI -from toontown.coghq import DistributedDoorEntity/AI -from toontown.coghq import DistributedSwitch/AI -from toontown.coghq import DistributedButton/AI -from toontown.coghq import DistributedTrigger/AI -from toontown.coghq import DistributedCrushableEntity/AI -from toontown.coghq import DistributedCrusherEntity/AI -from toontown.coghq import DistributedStomper/AI -from toontown.coghq import DistributedStomperPair/AI -from toontown.coghq import DistributedLaserField/AI -from toontown.coghq import DistributedGolfGreenGame/AI -from toontown.coghq import DistributedSecurityCamera/AI -from toontown.coghq import DistributedMover/AI -from toontown.coghq import DistributedElevatorMarker/AI -from toontown.coghq import DistributedBarrelBase/AI -from toontown.coghq import DistributedGagBarrel/AI -from toontown.coghq import DistributedBeanBarrel/AI -from toontown.coghq import DistributedHealBarrel/AI -from toontown.coghq import DistributedGrid/AI -from toontown.coghq import ActiveCell/AI -from toontown.coghq import DirectionalCell/AI -from toontown.coghq import CrusherCell/AI -from toontown.coghq import DistributedCrate/AI -from toontown.coghq import DistributedSinkingPlatform/AI -from toontown.suit import DistributedGoon/AI -from toontown.suit import DistributedGridGoon/AI -from toontown.coghq import BattleBlocker/AI -from toontown.ai import DistributedAprilToonsMgr/AI -from toontown.ai import DistributedBlackCatMgr/AI -from toontown.ai import DistributedPolarBearMgr/AI -from toontown.ai import DistributedPolarPlaceEffectMgr/AI -from toontown.ai import DistributedGreenToonEffectMgr/AI -from toontown.ai import DistributedResistanceEmoteMgr/AI -from toontown.ai import DistributedScavengerHuntTarget/AI -from toontown.ai import DistributedTrickOrTreatTarget/AI -from toontown.ai import DistributedWinterCarolingTarget/AI -from toontown.coghq import DistributedMint/AI -from toontown.coghq import DistributedMintRoom/AI -from toontown.coghq import DistributedMintBattle/AI -from toontown.coghq import DistributedStage/AI -from toontown.coghq import DistributedStageRoom/AI -from toontown.coghq import DistributedStageBattle/AI -from toontown.pets.PetDCImports/AI import * -from toontown.pets import DistributedPetProxy/AI -from toontown.coghq.InGameEditorDCImports/AI import * -from toontown.distributed import ToontownDistrict/AI -from toontown.distributed import ToontownDistrictStats/AI -from toontown.racing import DistributedVehicle/AI -from toontown.racing import DistributedStartingBlock/AI -from toontown.racing import DistributedRace/AI -from toontown.racing import DistributedKartPad/AI -from toontown.racing import DistributedRacePad/AI -from toontown.racing import DistributedViewPad/AI -from toontown.racing import DistributedStartingBlock/AI -from toontown.racing import DistributedLeaderBoard/AI -from toontown.racing import DistributedGag/AI -from toontown.racing import DistributedProjectile/AI -from toontown.racing.DistributedStartingBlock/AI import DistributedViewingBlock/AI -from toontown.uberdog.ClientServicesManager/UD import ClientServicesManager/UD -from toontown.uberdog.DistributedDeliveryManager/AI/UD import DistributedDeliveryManager/AI/UD -from toontown.uberdog.DistributedDataStoreManager/AI/UD import DistributedDataStoreManager/AI/UD -from toontown.suit import DistributedLawbotBoss/AI -from toontown.coghq import DistributedLawbotBossGavel/AI -from toontown.suit import DistributedLawbotBossSuit/AI -from toontown.coghq import DistributedLawbotCannon/AI -from toontown.coghq import DistributedLawbotChair/AI -from toontown.estate import DistributedLawnDecor/AI -from toontown.estate import DistributedGardenPlot/AI -from toontown.estate import DistributedGardenBox/AI -from toontown.estate import DistributedFlower/AI -from toontown.estate import DistributedGagTree/AI -from toontown.estate import DistributedStatuary/AI -from toontown.estate import DistributedToonStatuary/AI -from toontown.estate import DistributedChangingStatuary/AI -from toontown.estate import DistributedAnimatedStatuary/AI -from toontown.estate import DistributedPlantBase/AI -from toontown.estate import DistributedLawnDecor/AI -from toontown.minigame import DistributedTravelGame/AI -from toontown.minigame import DistributedPairingGame/AI -from toontown.minigame import DistributedVineGame/AI -from toontown.golf import DistributedPhysicsWorld/AI -from toontown.golf import DistributedGolfHole/AI -from toontown.golf import DistributedGolfCourse/AI -from toontown.parties import DistributedParty/AI -from toontown.parties import DistributedPartyActivity/AI -from toontown.parties import DistributedPartyTeamActivity/AI -from toontown.parties import DistributedPartyCannon/AI -from toontown.parties import DistributedPartyCannonActivity/AI -from toontown.parties import DistributedPartyCatchActivity/AI -from toontown.parties import DistributedPartyWinterCatchActivity/AI -from toontown.parties import DistributedPartyCogActivity/AI -from toontown.parties import DistributedPartyWinterCogActivity/AI -from toontown.parties import DistributedPartyFireworksActivity/AI -from toontown.parties import DistributedPartyDanceActivityBase/AI -from toontown.parties import DistributedPartyDanceActivity/AI -from toontown.parties import DistributedPartyDance20Activity/AI -from toontown.parties import DistributedPartyValentineDanceActivity/AI -from toontown.parties import DistributedPartyValentineDance20Activity/AI -from toontown.parties import DistributedPartyTrampolineActivity/AI -from toontown.parties import DistributedPartyValentineTrampolineActivity/AI -from toontown.parties import DistributedPartyVictoryTrampolineActivity/AI -from toontown.parties import DistributedPartyWinterTrampolineActivity/AI -from toontown.parties import DistributedPartyTugOfWarActivity/AI -from toontown.parties import DistributedPartyJukeboxActivityBase/AI -from toontown.parties import DistributedPartyJukeboxActivity/AI -from toontown.parties import DistributedPartyJukebox40Activity/AI -from toontown.parties import DistributedPartyValentineJukeboxActivity/AI -from toontown.parties import DistributedPartyValentineJukebox40Activity/AI -from toontown.friends import TTPlayerFriendsManager/UD -from toontown.friends import TTUFriendsManager/UD -from toontown.safezone import DistributedGolfKart/AI -from toontown.safezone import DistributedPicnicBasket/AI -from toontown.safezone import DistributedGameTable/AI -from toontown.distributed import DistributedTimer/AI -from toontown.suit import DistributedBossbotBoss/AI -from toontown.coghq import DistributedCogKart/AI -from toontown.coghq import DistributedCountryClub/AI -from toontown.coghq import DistributedCountryClubRoom/AI -from toontown.coghq import DistributedMoleField/AI -from toontown.coghq import DistributedCountryClubBattle/AI -from toontown.building import DistributedClubElevator/AI -from toontown.coghq import DistributedMaze/AI -from toontown.battle import DistributedBattleWaiters/AI -from toontown.coghq import DistributedFoodBelt/AI -from toontown.coghq import DistributedBanquetTable/AI -from toontown.battle import DistributedBattleDiners/AI -from toontown.coghq import DistributedGolfSpot/AI -from toontown.minigame import DistributedIceGame/AI -from toontown.minigame import DistributedCogThiefGame/AI -from toontown.minigame import DistributedTwoDGame/AI -from toontown.safezone import DistributedChineseCheckers/AI -from toontown.safezone import DistributedCheckers/AI -from toontown.safezone import DistributedFindFour/AI -from toontown.uberdog.DistributedMailManager/AI/UD import DistributedMailManager/AI/UD -from toontown.uberdog.DistributedPartyManager/AI/UD import DistributedPartyManager/AI/UD -from toontown.rpc.AwardManager/UD import AwardManager/UD -from toontown.uberdog.DistributedCpuInfoMgr/AI/UD import DistributedCpuInfoMgr/AI/UD -from toontown.uberdog.DistributedInGameNewsMgr/AI/UD import DistributedInGameNewsMgr/AI/UD -from toontown.coderedemption.TTCodeRedemptionMgr/AI import TTCodeRedemptionMgr/AI -from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI -from toontown.distributed.NonRepeatableRandomSourceUD import NonRepeatableRandomSourceUD -from toontown.ai.DistributedPhaseEventMgr/AI import DistributedPhaseEventMgr/AI -from toontown.ai.DistributedHydrantZeroMgr/AI import DistributedHydrantZeroMgr/AI -from toontown.ai.DistributedMailboxZeroMgr/AI import DistributedMailboxZeroMgr/AI -from toontown.ai.DistributedTrashcanZeroMgr/AI import DistributedTrashcanZeroMgr/AI -from toontown.ai import DistributedSillyMeterMgr/AI -from toontown.cogdominium import DistributedCogdoInterior/AI -from toontown.cogdominium import DistributedCogdoBattleBldg/AI -from toontown.cogdominium import DistributedCogdoElevatorExt/AI -from toontown.cogdominium import DistributedCogdoElevatorInt/AI -from toontown.cogdominium import DistributedCogdoBarrel/AI -from toontown.cogdominium import DistCogdoGame/AI -from toontown.cogdominium import DistCogdoLevelGame/AI -from toontown.cogdominium import DistCogdoBoardroomGame/AI -from toontown.cogdominium import DistCogdoCraneGame/AI -from toontown.cogdominium import DistCogdoMazeGame/AI -from toontown.cogdominium import DistCogdoFlyingGame/AI -from toontown.cogdominium import DistCogdoCrane/AI -from toontown.cogdominium import DistCogdoCraneMoneyBag/AI -from toontown.cogdominium import DistCogdoCraneCog/AI -from toontown.parties.GlobalPartyManager/AI/UD import GlobalPartyManager/AI/UD - -struct GiftItem { - blob Item; - string giftTag; -}; - -struct gardenSpecial { - uint8 index; - uint8 count; -}; - -struct simpleMail { - uint64 msgId; - uint32 senderId; - uint16 year; - uint8 month; - uint8 day; - string body; -}; - -struct invite { - uint64 inviteKey; - uint64 partyId; - uint8 status; -}; - -struct decoration { - uint8 decorId; - uint8 x; - uint8 y; - uint8 h; -}; - -struct activity { - uint8 activityId; - uint8 x; - uint8 y; - uint8 h; -}; - -struct party { - uint64 partyId; - uint32 hostId; - uint16 startYear; - uint8 startMonth; - uint8 startDay; - uint8 startHour; - uint8 startMinute; - uint16 endYear; - uint8 endMonth; - uint8 endDay; - uint8 endHour; - uint8 endMinute; - uint8 isPrivate; - uint8 inviteTheme; - activity activities[]; - decoration decors[]; - uint8 status; -}; - -struct partyReply { - uint32 inviteeId; - uint8 status; -}; - -struct repliesForOneParty { - uint64 partyId; - partyReply partyReplies[]; -}; - -struct publicPartyInfo { - uint32 shardId; - uint32 zoneId; - uint8 numberOfGuests; - string hostName; - uint8[] activityIds; - uint16 minLeft; -}; - -struct jukeboxSongInfo { - uint8/10 phase; - string fileName; -}; - -struct partyCloudColor { - uint16 cloudNumber; - uint8/100 r; - uint8/100 g; - uint8/100 b; -}; - -struct datetime { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minutes; - uint8 seconds; -}; - -dclass ToontownDistrict : DistributedDistrict { - setParentingRules(string, string) broadcast ram; - allowAHNNLog(bool) broadcast required ram; -}; - -dclass ToontownDistrictStats : DistributedObject { - settoontownDistrictId(uint32) broadcast required ram; - setAvatarCount(uint32) broadcast required ram; - setNewAvatarCount(uint32) broadcast required ram; - setInvasionStatus(uint8) broadcast required ram; - setStats : setAvatarCount, setNewAvatarCount; -}; - -dclass WelcomeValleyManager : DistributedObject { - clientSetZone(uint32) airecv clsend; - requestZoneIdMessage(uint32, uint16) airecv clsend; - requestZoneIdResponse(uint32, uint16); -}; - -dclass DistributedAnimatedProp : DistributedObject { - setPropId(uint16) required broadcast ram; - setAvatarInteract(uint32) required broadcast ram; - requestInteract() airecv clsend; - rejectInteract(); - requestExit() airecv clsend; - avatarExit(uint32) broadcast; - setState(string, int16) required broadcast ram; -}; - -typedef int16 pair16[2]; - -dclass DistributedToon : DistributedPlayer { - setDNAString(blob) required broadcast ownrecv db; - setGM(uint16 = 0) required broadcast ownrecv db; - setMoney(int16 = 0) required ownrecv db; - setBankMoney(int32 = 0) required ownrecv; - setMaxHp(int16 = 15) required broadcast ownrecv db; - setHp(int16 = 15) required broadcast ownrecv db; - toonUp(uint16) broadcast ownrecv; - takeDamage(uint16) broadcast ownrecv; - setBattleId(uint32 = 0) required broadcast ram; - setExperience(blob = [0*14]) required broadcast db; - setMaxCarry(uint8 = 20) required ownrecv db; - setTrackAccess(uint16[] = [0,0,0,0,1,1,0]) required broadcast ownrecv db; - setTrackProgress(int8 = -1, uint32 = 0) required ownrecv db; - setTrackBonusLevel(int8[] = [-1,-1,-1,-1,-1,-1,-1]) required broadcast ownrecv db; - setInventory(blob = [0*7, 0*7, 0*7, 0*7, 1, 0*6, 1, 0*6, 0*7]) required ownrecv db; - setMaxNPCFriends(uint16 = 16) required ownrecv db; - setNPCFriendsDict(FriendEntry[] = []) required ownrecv db; - setDefaultShard(uint32 = 0) required ownrecv broadcast db; - setDefaultZone(uint32 = 0) required ownrecv broadcast db; - setShtickerBook(blob = []) required ownrecv db; - setZonesVisited(uint32[] = [ 2000 ]) required ownrecv db; - setHoodsVisited(uint32[] = [ 2000 ]) required ownrecv db; - setInterface(blob = []) required ownrecv db; - setLastHood(uint32 = 0) required ownrecv broadcast db; - setTutorialAck(uint8) required ownrecv db; - setMaxClothes(uint32 = 10) required ownrecv db; - setClothesTopsList(uint8[] = []) required ownrecv db; - setClothesBottomsList(uint8[] = []) required ownrecv db; - setMaxAccessories(uint32 = 0) required ownrecv db; - setHatList(uint8[] = []) required ownrecv db; - setGlassesList(uint8[] = []) required ownrecv db; - setBackpackList(uint8[] = []) required ownrecv db; - setShoesList(uint8[] = []) required ownrecv db; - setHat(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; - setGlasses(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; - setBackpack(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; - setShoes(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; - setGardenSpecials(gardenSpecial [] = []) required ownrecv db airecv; - setEarnedExperience(uint16[]) ownrecv; - setTunnelIn(int16, int16/10, int16/10, int16/10, int16/100, int32/100) ownsend broadcast; - setTunnelOut(int16, int16/10, int16/10, int16/10, int16/10, int16/100, int32/100) ownsend broadcast; - setAnimState(char [0-1024], int16/1000, int16) broadcast ram ownsend airecv; - setEmoteState(int16, int16/1000, int16) broadcast ram ownsend; - setEmoteAccess(uint8[] = [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) required ownrecv db; - setCustomMessages(uint16[] = []) required ownrecv db; - setSleepAutoReply(uint32) broadcast clsend ownrecv; - setResistanceMessages(pair16 [] = []) required ownrecv db; - setPetTrickPhrases(uint8[] = [0]) required ownrecv db; - setCatalogSchedule(uint16 = 0, uint32 = 0) required ownrecv db; - setCatalog(blob = [], blob = [], blob = []) required ownrecv db; - setMailboxContents(blob = []) required ownrecv db; - setDeliverySchedule(blob = []) required ownrecv db airecv; - setGiftSchedule(blob = []) required ownrecv db airecv; - setAwardMailboxContents(blob = []) required ownrecv db; - setAwardSchedule(blob = []) required ownrecv db airecv; - setAwardNotify(uint8 = 0) required ownrecv db; - setCatalogNotify(uint8 = 0, uint8 = 0) required ownrecv db; - playSplashEffect(int16/10, int16/10, int16/10) broadcast ownsend; - setWhisperSCToontaskFrom(uint32, uint32, uint32, uint32, uint8) ownrecv clsend; - setSCToontask(uint32, uint32, uint32, uint8) broadcast ownsend; - reqSCResistance(uint16, uint32 []) ownsend airecv; - setSCResistance(uint16, uint32 []) broadcast ownrecv; - setSpeedChatStyleIndex(uint8 = 1) required ownsend broadcast db; - setTrophyScore(uint16) broadcast ownrecv ram; - setTeleportAccess(uint32[] = []) required ownrecv db; - setScavengerHunt(uint32[] = []) required ownrecv db; - checkTeleportAccess(uint16) airecv ownsend; - setTeleportOverride(uint8) clsend airecv; - battleSOS(uint32) ownrecv clsend; - teleportQuery(uint32) ownrecv clsend; - teleportResponse(uint32, int8, uint32, uint32, uint32) ownrecv clsend; - teleportResponseToAI(uint32, int8, uint32, uint32, uint32, uint32) ownsend airecv; - teleportGiveup(uint32) ownrecv clsend; - teleportGreeting(uint32) broadcast ownsend; - setCogStatus(uint32[] = [1 * 32]) required ownrecv db; - setCogCount(uint32[] = [0 * 32]) required ownrecv db; - setCogRadar(uint8[] = [0 * 4]) required ownrecv db; - setBuildingRadar(uint8[] = [0 * 4]) required ownrecv db; - setCogLevels(uint8[] = [0 * 4]) required broadcast ownrecv db; - setCogTypes(uint8[] = [0 * 4]) required broadcast ownrecv db; - setCogParts(uint32[] = [0 * 4]) required broadcast ownrecv db; - setCogMerits(uint16[] = [0 * 4]) required ownrecv db; - setPromotionStatus(uint8[] = [0 * 4]) required broadcast ownrecv db; - requestPromotion(uint8) ownsend airecv; - setCogIndex(int8) broadcast ram; - setDisguisePageFlag(int8) ownrecv; - setSosPageFlag(int8) ownrecv; - setHouseId(uint32 = 0) required ownrecv db; - setQuests(uint32[] = []) required broadcast ownrecv db; - setQuestHistory(uint16[] = []) required ownrecv db; - setRewardHistory(uint8 = 0, uint16[] = []) required ownrecv db; - setQuestCarryLimit(uint8 = 1) required ownrecv db; - requestDeleteQuest(uint32[]) ownsend airecv; - setCheesyEffect(int16 = 0, uint32 = 0, uint32 = 0) required broadcast ownrecv db; - setGhostMode(uint8) broadcast ownrecv ram; - setPosIndex(uint8 = 0) required ownrecv db; - setFishCollection(uint8[] = [], uint8[] = [], uint16[] = []) required ownrecv db; - setMaxFishTank(uint8 = 20) required ownrecv db; - setFishTank(uint8[] = [], uint8[] = [], uint16[] = []) required ownrecv db; - setFishingRod(uint8 = 0) required broadcast ownrecv db; - setFishingTrophies(uint8[] = []) required ownrecv db; - setFlowerCollection(uint8[] = [], uint8[] = []) required ownrecv db; - setFlowerBasket(uint8[] = [], uint8[] = []) required ownrecv db; - setMaxFlowerBasket(uint8 = 20) required ownrecv db; - setGardenTrophies(uint8[] = []) required ownrecv db; - setShovel(uint8 = 0) required broadcast ownrecv db; - setShovelSkill(uint32 = 0) required ownrecv db; - setWateringCan(uint8 = 0) required broadcast ownrecv db; - setWateringCanSkill(uint32 = 0) required ownrecv db; - promoteShovel(uint8) ownrecv; - promoteWateringCan(uint8) ownrecv; - reactivateWater() ownrecv; - presentPie(int16/10 x, int16/10 y, int16/10 z, int16/10 h, int32 timestamp) broadcast ownsend; - tossPie(int16/10 x, int16/10 y, int16/10 z, int16/10 h, uint8 sequence, uint8 power, uint8 throwType, int32 timestamp) broadcast ownsend; - pieSplat(int16/10, int16/10, int16/10, uint8, uint8, int32) broadcast ownsend; - setPieType(uint8) broadcast ownrecv ram; - setNumPies(uint16) broadcast ownrecv ram; - catalogGenClothes(uint32) broadcast ownrecv; - catalogGenAccessories(uint32) broadcast ownrecv; - setPetId(uint32 = 0) required broadcast ownrecv db; - setPetMovie(uint32, uint8) ownsend airecv; - setPetTutorialDone(uint8 = 0) required ownsend airecv db; - setFishBingoTutorialDone(uint8 = 0) required ownsend airecv db; - setFishBingoMarkTutorialDone(uint8 = 0) required ownsend airecv db; - setKartBodyType(int8 = -1) required broadcast ownrecv db; - setKartBodyColor(int8 = -1) required broadcast ownrecv db; - setKartAccessoryColor(int8 = -1) required broadcast ownrecv db; - setKartEngineBlockType(int8 = -1) required broadcast ownrecv db; - setKartSpoilerType(int8 = -1) required broadcast ownrecv db; - setKartFrontWheelWellType(int8 = -1) required broadcast ownrecv db; - setKartBackWheelWellType(int8 = -1) required broadcast ownrecv db; - setKartRimType(int8 = -1) required broadcast ownrecv db; - setKartDecalType(int8 = -1) required broadcast ownrecv db; - updateKartDNAField(int8, int8) ownsend airecv; - addOwnedAccessory(int8) ownsend airecv; - removeOwnedAccessory(int8) ownsend airecv; - setTickets(uint32 = 200) required broadcast ownrecv db; - setKartingHistory(uint8 [16] = [0*16]) required ownrecv db; - setKartingTrophies(uint8 [33] = [0*33]) required ownrecv db; - setKartingPersonalBest(uint32/1000 [6] = [0*6]) required ownrecv db; - setKartingPersonalBest2(uint32/1000 [12] = [0*12]) required ownrecv db; - setKartAccessoriesOwned(int8 [16] = [-1*16]) required broadcast ownrecv db; - setCurrentKart(uint32) broadcast ownrecv ram; - squish(uint8) ownsend airecv; - announceBingo() broadcast ownrecv; - trickOrTreatTargetMet(uint32) ownrecv; - trickOrTreatMilestoneMet() ownrecv; - winterCarolingTargetMet(uint32) ownrecv; - setCogSummonsEarned(uint8[] = [0*32]) required ownrecv db; - reqCogSummons(char [0-256], uint32) ownsend airecv; - cogSummonsResponse(string, uint32, uint32) ownrecv; - reqUseSpecial(int32) ownsend airecv; - useSpecialResponse(string) ownrecv; - setGardenStarted(uint8 = 0) required ownrecv db; - sendToGolfCourse(uint32) ownrecv; - setGolfHistory(uint16 [18] = [0*18]) required ownrecv db; - setPackedGolfHoleBest(uint8 [18] = [0*18]) required ownrecv db; - setGolfCourseBest(uint8 [3] = [0*3]) required ownrecv db; - setUnlimitedSwing(uint8) broadcast ownrecv ram; - logSuspiciousEvent(char [0-1024]) ownsend airecv; - logMessage(char [0-1024]) ownsend airecv; - forceLogoutWithNotify() ownrecv; - setPinkSlips(uint8 = 0) required ownrecv db; - setNametagStyle(uint8 = 0) required broadcast ownrecv db; - setMail(simpleMail []) ownrecv; - setNumMailItems(uint32) airecv; - setSimpleMailNotify(uint8) ownrecv airecv; - setInvites(invite []) ownrecv airecv ram; - setPartiesInvitedTo(party []) ownrecv airecv ram; - setHostedParties(party []) ownrecv airecv ram; - setPartyReplies(repliesForOneParty []) ownrecv airecv ram; - updateInvite(uint64, uint8) ownrecv airecv; - updateReply(uint64, uint64, uint8) ownrecv airecv; - setPartyCanStart(uint64) ownrecv airecv; - setPartyStatus(uint64, uint8) ownrecv airecv; - announcePartyStarted(uint64) ownrecv; - setAchievements(uint16[] = []) required broadcast ownrecv db; - setNeverStartedPartyRefunded(uint64, int8, uint16) ownrecv; - setModuleInfo(string []) airecv clsend; - setDISLname(string) ram; - setDISLid(uint32) ram db airecv; - flagAv(uint32, uint16, string []) airecv ownsend; - setAnimalSound(uint8 index) ram broadcast ownrecv; - setBuffs(uint32[] = []) required ownrecv db; - setRedeemedCodes(string [] = []) required ownrecv db; -}; - -dclass DistributedCCharBase : DistributedObject { - setChat(uint32, uint32, uint32) broadcast; - fadeAway() broadcast; - setWalk(string, string, int16) required broadcast ram; - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - setNearbyAvatarChat(char [0-1024]) airecv clsend; - setNearbyAvatarSC(uint16) airecv clsend; - setNearbyAvatarSCCustom(uint16) airecv clsend; - setNearbyAvatarSCToontask(uint32, uint32, uint32, uint8) airecv clsend; -}; - -dclass DistributedMickey : DistributedCCharBase { -}; - -dclass DistributedVampireMickey : DistributedMickey { -}; - -dclass DistributedWitchMinnie : DistributedMickey { -}; - -dclass DistributedMinnie : DistributedCCharBase { -}; - -dclass DistributedGoofy : DistributedCCharBase { -}; - -dclass DistributedDaisy : DistributedCCharBase { -}; - -dclass DistributedSockHopDaisy : DistributedDaisy { -}; - -dclass DistributedChip : DistributedCCharBase { -}; - -dclass DistributedPoliceChip : DistributedChip { -}; - -dclass DistributedDale : DistributedCCharBase { - setFollowChip(string, string, int16, int16/100, int16/100) broadcast ram; - setChipId(uint32) required broadcast ram; -}; - -dclass DistributedJailbirdDale : DistributedDale { -}; - -dclass DistributedDonald : DistributedCCharBase { -}; - -dclass DistributedFrankenDonald : DistributedDonald { -}; - -dclass DistributedDonaldDock : DistributedCCharBase { -}; - -dclass DistributedPluto : DistributedCCharBase { -}; - -dclass DistributedWesternPluto : DistributedPluto { -}; - -dclass DistributedGoofySpeedway : DistributedCCharBase { -}; - -dclass DistributedSuperGoofy : DistributedGoofySpeedway { -}; - -dclass DistributedPartyGate : DistributedObject { - getPartyList(uint32) airecv clsend; - partyChoiceRequest(uint32, uint64, uint64) airecv clsend; - listAllPublicParties(publicPartyInfo []); - partyRequestDenied(uint8); - setParty(publicPartyInfo, uint32 hostId); -}; - -dclass DistributedTrolley : DistributedObject { - setState(string, int16) broadcast ram; - fillSlot0(uint32) broadcast ram; - fillSlot1(uint32) broadcast ram; - fillSlot2(uint32) broadcast ram; - fillSlot3(uint32) broadcast ram; - emptySlot0(uint32, int16) broadcast ram; - emptySlot1(uint32, int16) broadcast ram; - emptySlot2(uint32, int16) broadcast ram; - emptySlot3(uint32, int16) broadcast ram; - requestBoard() airecv clsend; - rejectBoard(uint32); - requestExit() airecv clsend; - setMinigameZone(uint32, uint16); -}; - -dclass DistributedSuitPlanner : DistributedObject { - setZoneId(uint32) required broadcast ram; - suitListQuery() airecv clsend; - suitListResponse(uint8[]); - buildingListQuery() airecv clsend; - buildingListResponse(uint8[]); -}; - -dclass DistributedSuitBase : DistributedObject { - denyBattle(); - setDNAString(blob) required broadcast ram; - setLevelDist(int16) required broadcast ram; - setBrushOff(int16) broadcast; - setWaiter(uint8) broadcast ram; - setSkelecog(uint8) required broadcast ram; - setSkeleRevives(uint8) required broadcast ram; - setHP(int16) required broadcast ram; -}; - -dclass DistributedSuit : DistributedSuitBase { - requestBattle(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) airecv clsend; - setSPDoId(uint32) required broadcast ram; - setPathEndpoints(uint16, uint16, uint16, uint16) required broadcast ram; - setPathPosition(uint16, int16) required broadcast ram; - setPathState(int8) required broadcast ram; - debugSuitPosition(int16/10, int16, int16/10, int16/10, int16) broadcast; -}; - -dclass DistributedTutorialSuit : DistributedSuitBase { - requestBattle(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) airecv clsend; -}; - -dclass DistributedFactorySuit : DistributedSuitBase { - setLevelDoId(uint32) required broadcast ram; - setCogId(uint32) required broadcast ram; - setReserve(uint8) required broadcast ram; - requestBattle(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) airecv clsend; - setAlert(uint32) airecv clsend; - setConfrontToon(uint32) broadcast; - setStrayed() airecv clsend; - setReturn() broadcast; -}; - -dclass DistributedMintSuit : DistributedFactorySuit { -}; - -dclass DistributedStageSuit : DistributedFactorySuit { -}; - -dclass DistributedBossCog : DistributedNode { - setDNAString(blob) required broadcast db; - setToonIds(uint32[], uint32[], uint32[]) broadcast ram; - setBattleIds(uint8, uint32, uint32) broadcast ram; - setArenaSide(uint8) broadcast ram; - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - avatarNearEnter() airecv clsend; - avatarNearExit() airecv clsend; - toonDied(uint32) broadcast; - setBattleExperience(int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], uint8[], int16[], uint32[]) required broadcast ram; - zapToon(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10, int8/100, int8/100, uint8, int16) airecv clsend; - showZapToon(uint32, int16/10, int16/10, int16/10, int16/10, int16/10, int16/10, uint8, int16) broadcast; - setAttackCode(uint8, uint32) broadcast; -}; - -dclass DistributedSellbotBoss : DistributedBossCog { - setCagedToonNpcId(uint32) required broadcast ram; - setDooberIds(uint32[]) broadcast ram; - setBossDamage(uint16, uint8, int16) broadcast ram; - setState(string) broadcast ram; - hitBoss(uint8) airecv clsend; - hitBossInsides() airecv clsend; - hitToon(uint32) airecv clsend; - finalPieSplat() airecv clsend; - touchCage() airecv clsend; - doStrafe(uint8, uint8) broadcast; - cagedToonBattleThree(uint16, uint32) broadcast; - toonPromoted(uint8(0-1)); -}; - -dclass DistributedCashbotBoss : DistributedBossCog { - setState(string) broadcast ram; - setBossDamage(uint16) broadcast ram; - setRewardId(uint16) broadcast ram; - applyReward() airecv clsend; -}; - -struct LinkPosition { - int16/100 x; - int16/100 y; - int16/100 z; -}; - -dclass DistributedCashbotBossCrane : DistributedObject { - setBossCogId(uint32) required broadcast ram; - setIndex(uint8) required broadcast ram; - setState(char, uint32) broadcast ram; - requestControl() airecv clsend; - requestFree() airecv clsend; - clearSmoothing(int8) broadcast clsend; - setCablePos(uint8, int16/100, uint16%360/100, LinkPosition [3], int16) broadcast clsend; -}; - -dclass DistributedCashbotBossObject : DistributedObject { - setBossCogId(uint32) required broadcast ram; - setObjectState(char, uint32, uint32) broadcast ram; - requestGrab() airecv clsend; - rejectGrab(); - requestDrop() airecv clsend; - hitFloor() clsend; - requestFree(int16/10, int16/10, int16/10, uint16%360/100) airecv clsend; - hitBoss(uint16/255) airecv clsend; - setX(int16/10) broadcast ram clsend airecv; - setY(int16/10) broadcast ram clsend airecv; - setZ(int16/10) broadcast ram clsend airecv; - setH(int16%360/10) broadcast ram clsend airecv; - setP(int16%360/10) broadcast ram clsend airecv; - setR(int16%360/10) broadcast ram clsend airecv; - setPos : setX, setY, setZ; - setHpr : setH, setP, setR; - setPosHpr : setX, setY, setZ, setH, setP, setR; - setXY : setX, setY; - setXZ : setX, setZ; - setXYH : setX, setY, setH; - setXYZH : setX, setY, setZ, setH; - setComponentL(uint64) broadcast ram clsend airecv; - setComponentX(int16/10) broadcast ram clsend airecv; - setComponentY(int16/10) broadcast ram clsend airecv; - setComponentZ(int16/10) broadcast ram clsend airecv; - setComponentH(int16%360/10) broadcast ram clsend airecv; - setComponentP(int16%360/10) broadcast ram clsend airecv; - setComponentR(int16%360/10) broadcast ram clsend airecv; - setComponentT(int16) broadcast ram clsend airecv; - setSmStop : setComponentT; - setSmH : setComponentH, setComponentT; - setSmZ : setComponentZ, setComponentT; - setSmXY : setComponentX, setComponentY, setComponentT; - setSmXZ : setComponentX, setComponentZ, setComponentT; - setSmPos : setComponentX, setComponentY, setComponentZ, setComponentT; - setSmHpr : setComponentH, setComponentP, setComponentR, setComponentT; - setSmXYH : setComponentX, setComponentY, setComponentH, setComponentT; - setSmXYZH : setComponentX, setComponentY, setComponentZ, setComponentH, setComponentT; - setSmPosHpr : setComponentX, setComponentY, setComponentZ, setComponentH, setComponentP, setComponentR, setComponentT; - setSmPosHprL : setComponentL, setComponentX, setComponentY, setComponentZ, setComponentH, setComponentP, setComponentR, setComponentT; - clearSmoothing(int8) broadcast clsend; -}; - -dclass DistributedCashbotBossSafe : DistributedCashbotBossObject { - setIndex(uint8) required broadcast ram; - requestInitial() airecv clsend; -}; - -dclass DistributedCashbotBossGoon : DistributedCashbotBossObject { - requestBattle(int16/10) airecv clsend; - requestStunned(int16/10) airecv clsend; - setVelocity(uint8/10) broadcast ram; - setHFov(uint8) broadcast ram; - setAttackRadius(uint8) broadcast ram; - setStrength(uint8) broadcast ram; - setGoonScale(uint8/50) broadcast ram; - setupGoon : setVelocity, setHFov, setAttackRadius, setStrength, setGoonScale; - setTarget(int16/10, int16/10, uint16%360/100, int16) broadcast ram; - destroyGoon() broadcast clsend airecv; -}; - -dclass DistributedBattleBase : DistributedObject { - setLevelDoId(uint32) required broadcast ram; - setBattleCellId(uint32) required broadcast ram; - setInteractivePropTrackBonus(int8) required broadcast ram; - setPosition(int16/10, int16/10, int16/10) required broadcast ram; - setZoneId(uint32) required broadcast ram; - setInitialSuitPos(int16/10, int16/10, int16/10) required broadcast ram; - setMembers(uint32[], string, string, string, string, string, uint32[], string, string, string, string, int16) required broadcast ram; - adjust(int16) broadcast; - setMovie(int8, uint32[], uint32[], int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int16[], int8, int8, int8, int8, int8, int8, int16[], int8, int8, int8, int8, int8, int8, int16[], int8, int8, int8, int8, int8, int8, int16[], int8, int8, int8) required broadcast ram; - setChosenToonAttacks(uint32[], int16[], int16[], int32[]) broadcast ram; - setBattleExperience(int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], uint8[], int16[], uint32[]) required broadcast ram; - denyLocalToonJoin(); - setBossBattle(uint8) required broadcast ram; - setState(string, int16) required broadcast ram; - faceOffDone() airecv clsend; - toonRequestJoin(int16/10, int16/10, int16/10) airecv clsend; - toonRequestRun() airecv clsend; - toonDied() airecv clsend; - adjustDone() airecv clsend; - timeout() airecv clsend; - movieDone() airecv clsend; - rewardDone() airecv clsend; - joinDone(uint32) airecv clsend; - requestAttack(int8, int8, int32) airecv clsend; - requestPetProxy(uint32) airecv clsend; -}; - -dclass DistributedBattle : DistributedBattleBase { -}; - -dclass DistributedBattleBldg : DistributedBattleBase { -}; - -dclass DistributedBattleTutorial : DistributedBattle { -}; - -dclass DistributedLevelBattle : DistributedBattle { -}; - -dclass DistributedBattleFactory : DistributedLevelBattle { -}; - -dclass DistributedMintBattle : DistributedLevelBattle { -}; - -dclass DistributedStageBattle : DistributedLevelBattle { -}; - -dclass DistributedBattleFinal : DistributedBattleBase { - setBossCogId(uint32) required broadcast ram; - setBattleNumber(uint8) required broadcast ram; - setBattleSide(uint8) required broadcast ram; -}; - -dclass DistributedBoat : DistributedObject { - setState(string, int16) required broadcast ram; -}; - -dclass DistributedButterfly : DistributedObject { - setArea(int16, int16) required broadcast ram; - setState(int8, uint8, uint8, uint16/10, int16) required broadcast ram; - avatarEnter() airecv clsend; -}; - -dclass DistributedMMPiano : DistributedObject { - requestSpeedUp() airecv clsend; - requestChangeDirection() airecv clsend; - setSpeed(int16/1000, uint16/100, int16) broadcast ram; - playSpeedUp(uint32) broadcast; - playChangeDirection(uint32) broadcast; -}; - -dclass DistributedDGFlower : DistributedObject { - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - setHeight(uint8/10) broadcast ram; -}; - -dclass DistributedFishingPond : DistributedObject { - hitTarget(uint32) airecv clsend; - setArea(uint32) required broadcast ram; -}; - -dclass DistributedFishingTarget : DistributedNode { - setPondDoId(uint32) required broadcast ram; - setState(uint8, int16/10, uint16/100, uint16/10, int16) required broadcast ram; -}; - -dclass DistributedFishingSpot : DistributedObject { - setPondDoId(uint32) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - requestEnter() airecv clsend; - rejectEnter(); - requestExit() airecv clsend; - setOccupied(uint32) broadcast ram; - doCast(uint8/255, int16/100) airecv clsend; - sellFish() airecv clsend; - sellFishComplete(uint8, uint16); - setMovie(uint8, uint8, uint16, uint16, uint16, uint8/100, int16/100) broadcast ram; -}; - -dclass DistributedPondBingoManager : DistributedObject { - setPondDoId(uint32) required broadcast ram; - updateGameState(uint32, uint8); - setCardState(uint16, uint8, uint16, uint32); - setState(string, int16); - cardUpdate(uint16, uint8, uint8, uint8) airecv clsend; - enableBingo(); - handleBingoCall(uint16) airecv clsend; - setJackpot(uint16); -}; - -dclass DistributedCannon : DistributedObject { - setEstateId(uint32) required broadcast ram; - setTargetId(uint32) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - setActive(uint8) airecv clsend; - setActiveState(uint8) broadcast ram; - requestEnter() airecv clsend; - requestExit() broadcast; - setMovie(uint8, uint32) broadcast ram; - setCannonPosition(int32/100, uint32/100) airecv clsend; - setCannonLit(int32/100, uint32/100) airecv clsend; - setFired() airecv clsend; - setLanded() airecv clsend; - updateCannonPosition(uint32, int32/100, uint32/100) broadcast ram; - setCannonWillFire(uint32, int32/100, int32/100, uint32/100, int16) broadcast; - setCannonExit(uint32) broadcast; - requestBumperMove(int32/100, int32/100, int32/100) airecv clsend; - setCannonBumperPos(int32/100, int32/100, int32/100) required broadcast ram; -}; - -dclass DistributedTarget : DistributedObject { - setPosition(int16/10, int16/10, int16/10) required broadcast ram; - setState(uint8, uint32/10, uint8) broadcast; - setReward(uint32) broadcast; - setResult(uint32) airecv clsend; - setBonus(int16/10) airecv clsend; - setCurPinballScore(uint32, int32, int32) clsend airecv; - setPinballHiScorer(string) broadcast ram; - setPinballHiScore(int32) broadcast ram; -}; - -dclass DistributedMinigame : DistributedObject { - setParticipants(uint32[]) broadcast ram required; - setTrolleyZone(uint32) broadcast ram required; - setStartingVotes(uint16[]) broadcast ram required; - setMetagameRound(int8) broadcast ram required; - setDifficultyOverrides(int32, int32) broadcast ram required; - setAvatarJoined() airecv clsend; - setAvatarReady() airecv clsend; - setAvatarExited() airecv clsend; - requestExit() airecv clsend; - setGameReady() broadcast; - setGameStart(int16) broadcast; - setGameExit() broadcast; - setGameAbort() broadcast; -}; - -dclass DistributedMinigameTemplate : DistributedMinigame { -}; - -dclass DistributedRaceGame : DistributedMinigame { - setTimerStartTime(int16) broadcast; - setAvatarChoice(uint8) airecv clsend; - setAvatarChose(uint32) broadcast; - setChancePositions(uint8[]) broadcast; - setServerChoices(int8[], uint8[], int8[]) broadcast; -}; - -dclass DistributedCannonGame : DistributedMinigame { - setCannonPosition(int32/100, uint32/100) airecv clsend; - setCannonLit(int32/100, uint32/100) airecv clsend; - updateCannonPosition(uint32, int32/100, uint32/100) broadcast; - setCannonWillFire(uint32, int32/100, int32/100, uint32/100) broadcast; - setToonWillLandInWater(int32/100) airecv clsend; - announceToonWillLandInWater(uint32, int32/100) broadcast; -}; - -dclass DistributedPhotoGame : DistributedMinigame { - newClientPhotoScore(uint8, char [0-256], uint32/100) airecv clsend; - newAIPhotoScore(uint32, uint8, uint32/100) broadcast; - filmOut() airecv clsend; -}; - -dclass DistributedPatternGame : DistributedMinigame { - reportPlayerReady() airecv clsend; - setPattern(uint8[]) broadcast; - reportPlayerPattern(uint8[], uint16/1000) airecv clsend; - setPlayerPatterns(uint8[], uint8[], uint8[], uint8[], uint32) broadcast; - reportButtonPress(uint8, uint8) airecv clsend; - remoteButtonPressed(uint32, uint8, uint8) broadcast; -}; - -dclass DistributedRingGame : DistributedMinigame { - setTimeBase(int16) broadcast ram required; - setColorIndices(int8, int8, int8, int8) broadcast ram required; - setToonGotRing(uint8) airecv clsend; - setRingGroupResults(uint8) broadcast; -}; - -dclass DistributedTagGame : DistributedMinigame { - tag(uint32) airecv clsend; - setIt(uint32) broadcast; - setTreasureScore(uint16[]) broadcast; -}; - -dclass DistributedMazeGame : DistributedMinigame { - claimTreasure(uint32) airecv clsend; - setTreasureGrabbed(uint32, uint32) broadcast; - allTreasuresTaken() broadcast; - hitBySuit(uint32, int16) clsend broadcast; -}; - -dclass DistributedTugOfWarGame : DistributedMinigame { - reportPlayerReady(uint8) airecv clsend; - sendGoSignal(uint8[]) broadcast; - sendStopSignal(uint32[], uint32[], uint32[]) broadcast; - sendGameType(uint8, uint8) broadcast; - reportEndOfContest(uint8) airecv clsend; - sendNewAvIdList(uint32[]) airecv clsend; - reportCurrentKeyRate(uint32, int16/100) airecv clsend; - sendCurrentPosition(uint32[], int16/1000[]) broadcast; - sendSuitPosition(int32/1000) broadcast; - remoteKeyRateUpdate(uint32, uint32) broadcast; -}; - -dclass DistributedCatchGame : DistributedMinigame { - claimCatch(uint32, uint32) airecv clsend; - setObjectCaught(uint32, uint32) broadcast; - hitBySuit(uint32, int16) clsend broadcast; - reportDone() airecv clsend; - setEveryoneDone() broadcast; -}; - -dclass DistributedDivingGame : DistributedMinigame { - pickupTreasure(uint32) airecv clsend; - setTreasureGrabbed(uint32, uint32) broadcast; - handleFishCollision(uint32, uint32, uint32, char [0-256]) airecv clsend; - performFishCollision(uint32, uint32, uint32, int16) broadcast; - handleCrabCollision(uint32, char [0-256]) airecv clsend; - performCrabCollision(uint32, int16) broadcast; - setTreasureDropped(uint32, int16) broadcast; - fishSpawn(int16, uint32, uint32, uint16) broadcast; - removeFish(uint32) airecv clsend; - getCrabMoving(uint32, int16, int8) airecv clsend; - setCrabMoving(uint32, int16, int8, int8, int16, int8) broadcast; - treasureRecovered() airecv clsend; - incrementScore(uint32, uint32, int16) broadcast; -}; - -dclass DistributedTargetGame : DistributedMinigame { - setTimeBase(int16) broadcast ram required; - setToonGotRing(uint8) airecv clsend; - setRingGroupResults(uint8) broadcast; - setPlayerDone() airecv clsend; - setScore(int32, int32) airecv clsend; - setTargetSeed(uint32) broadcast ram; - setRoundDone() broadcast; - setSingleScore(uint16, uint32) broadcast; - setGameDone() broadcast; -}; - -dclass EstateManager : DistributedObject { - startAprilFools() broadcast; - stopAprilFools() broadcast; - getEstateZone(uint32 avId) airecv clsend; - setEstateZone(uint32 ownerId, uint32 zoneId); - setAvHouseId(uint32, uint32[]) broadcast; - sendAvToPlayground(DoId avId, uint8 reason); - exitEstate() airecv clsend; - removeFriend(uint32, uint32) airecv clsend; -}; - -struct decorItem { - uint8 decorType; - uint8 dataByte[]; - uint32 dataWord[]; -}; - -struct lawnItem { - uint8 type; - uint8 hardPoint; - int8 waterLevel; - int8 growthLevel; - uint16 optional; -}; - -dclass DistributedEstate : DistributedObject { - string DcObjectType db; - setEstateReady() broadcast; - setClientReady() airecv clsend; - setEstateType(uint8 type = 0) required broadcast db; - setClosestHouse(uint8) airecv clsend; - setTreasureIds(uint32[]) broadcast ram; - requestServerTime() airecv clsend; - setServerTime(uint32); - setDawnTime(uint32) required broadcast ram; - placeOnGround(uint32) broadcast ram; - setDecorData(lawnItem items[] = []) required airecv db; - setLastEpochTimeStamp(uint32 timestamp = 0) required airecv db; - setRentalTimeStamp(uint32 timestamp = 0) required airecv db; - setRentalType(uint8 type = 0) required airecv db; - setSlot0ToonId(uint32 toonId = 0) required airecv db; - setSlot0Items(lawnItem items[] = []) required airecv db; - setSlot1ToonId(uint32 toonId = 0) required airecv db; - setSlot1Items(lawnItem items[] = []) required airecv db; - setSlot2ToonId(uint32 toonId = 0) required airecv db; - setSlot2Items(lawnItem items[] = []) required airecv db; - setSlot3ToonId(uint32 toonId = 0) required airecv db; - setSlot3Items(lawnItem items[] = []) required airecv db; - setSlot4ToonId(uint32 toonId = 0) required airecv db; - setSlot4Items(lawnItem items[] = []) required airecv db; - setSlot5ToonId(uint32 toonId = 0) required airecv db; - setSlot5Items(lawnItem items[] = []) required airecv db; - setIdList(uint32 []) broadcast ram; - completeFlowerSale(uint8) airecv clsend; - awardedTrophy(uint32) broadcast; - setClouds(uint8) required broadcast ram; - cannonsOver() broadcast; - gameTableOver() broadcast; -}; - -dclass DistributedHouse : DistributedObject { - string DcObjectType db; - setHousePos(uint8) required broadcast; - setHouseType(uint8 type = 0) required broadcast db; - setGardenPos(uint8 index = 0) required broadcast db; - setAvatarId(uint32 toonId = 0) required broadcast db; - setName(string toonName = "") required broadcast db; - setColor(uint8 colorIndex = 0) required broadcast db; - setAtticItems(blob = "") required db; - setInteriorItems(blob = "") required db; - setAtticWallpaper(blob = "") required db; - setInteriorWallpaper(blob = "") required db; - setAtticWindows(blob = "") required db; - setInteriorWindows(blob = "") required db; - setDeletedItems(blob = "") required db; - setInteriorInitialized(uint8 initialized = 0) required db; - setCannonEnabled(uint8) required; - setHouseReady() broadcast ram; -}; - -dclass DistributedHouseInterior : DistributedObject { - setHouseId(uint32) required broadcast ram; - setHouseIndex(uint8) required broadcast ram; - setWallpaper(blob) required broadcast ram; - setWindows(blob) required broadcast ram; -}; - -dclass DistributedGarden : DistributedObject { - sendNewProp(uint8, int16/10, int16/10, int16/10) broadcast; -}; - -dclass DistributedParty : DistributedObject { - setPartyClockInfo(uint8, uint8, uint8) required broadcast; - setInviteeIds(uint32[]) required broadcast; - setPartyState(bool) required broadcast; - setPartyInfoTuple(party) required broadcast; - setAvIdsAtParty(uint32 []) required broadcast; - setPartyStartedTime(string) required broadcast; - setHostName(string) required broadcast; - enteredParty() clsend airecv; -}; - -dclass DistributedPartyActivity : DistributedObject { - setX(int16/10) broadcast required; - setY(int16/10) broadcast required; - setH(uint16%360/100) broadcast required; - setPartyDoId(uint32) broadcast required; - toonJoinRequest() airecv clsend; - toonExitRequest() airecv clsend; - toonExitDemand() airecv clsend; - toonReady() airecv clsend; - joinRequestDenied(uint8); - exitRequestDenied(uint8); - setToonsPlaying(uint32 []) broadcast ram; - setState(string, int16) broadcast ram; - showJellybeanReward(uint32, uint32, string); -}; - -dclass DistributedPartyTeamActivity : DistributedPartyActivity { - toonJoinRequest(uint8(0-1)) airecv clsend; - toonExitRequest(uint8(0-1)) airecv clsend; - toonSwitchTeamRequest() airecv clsend; - setPlayersPerTeam(uint8, uint8) broadcast required; - setDuration(uint8) broadcast required; - setCanSwitchTeams(bool) broadcast required; - setState(string, int16, uint32) broadcast ram; - setToonsPlaying(uint32 [0-8], uint32 [0-8]) required broadcast ram; - setAdvantage(uint16/100); - switchTeamRequestDenied(uint8); -}; - -struct CatchGeneration { - uint32 generation; - uint32 timestamp; - int8 numPlayers; -}; - -dclass DistributedPartyCatchActivity : DistributedPartyActivity { - setStartTimestamp(uint32) required broadcast ram; - setGenerations(CatchGeneration []) required broadcast ram; - requestActivityStart() airecv clsend; - startRequestResponse(uint8); - claimCatch(uint32, uint32, uint32) airecv clsend; - setObjectCaught(uint32, uint32, uint32) broadcast; -}; - -dclass DistributedPartyWinterCatchActivity : DistributedPartyCatchActivity { -}; - -dclass DistributedPartyCogActivity : DistributedPartyTeamActivity { - pieThrow(uint32, int32, int32/100, int32/100, int32/100, int32/100, uint8) clsend broadcast; - pieHitsToon(uint32, int32, int32/100, int32/100, int32/100) clsend broadcast; - pieHitsCog(uint32, int32, int8(0-2), int32/100, int32/100, int32/100, int32, bool) clsend broadcast airecv; - setCogDistances(int8/100 [3]) broadcast ram; - setHighScore(string, uint16) broadcast ram; -}; - -dclass DistributedPartyWinterCogActivity : DistributedPartyCogActivity { -}; - -dclass DistributedPartyDanceActivityBase : DistributedPartyActivity { - updateDancingToon(uint8, char [0-256]) clsend airecv; - setToonsPlaying(uint32 [], uint16%360/100 []) broadcast ram; - setDancingToonState(uint32, uint8, string) broadcast; -}; - -dclass DistributedPartyDanceActivity : DistributedPartyDanceActivityBase { -}; - -dclass DistributedPartyDance20Activity : DistributedPartyDanceActivityBase { -}; - -dclass DistributedPartyValentineDanceActivity : DistributedPartyDanceActivityBase { -}; - -dclass DistributedPartyValentineDance20Activity : DistributedPartyDanceActivityBase { -}; - -dclass DistributedPartyJukeboxActivityBase : DistributedPartyActivity { - setNextSong(jukeboxSongInfo) clsend airecv; - setSongPlaying(jukeboxSongInfo, uint32) broadcast ram; - queuedSongsRequest() clsend airecv; - queuedSongsResponse(jukeboxSongInfo [], int16); - setSongInQueue(jukeboxSongInfo); - moveHostSongToTopRequest() clsend airecv; - moveHostSongToTop(); -}; - -dclass DistributedPartyJukeboxActivity : DistributedPartyJukeboxActivityBase { -}; - -dclass DistributedPartyJukebox40Activity : DistributedPartyJukeboxActivityBase { -}; - -dclass DistributedPartyValentineJukeboxActivity : DistributedPartyJukeboxActivityBase { -}; - -dclass DistributedPartyValentineJukebox40Activity : DistributedPartyJukeboxActivityBase { -}; - -dclass DistributedPartyCannonActivity : DistributedPartyActivity { - setMovie(uint8, uint32) broadcast; - setLanded(uint32) airecv broadcast clsend; - setCannonWillFire(uint32, int32/100, uint32/100) broadcast; - cloudsColorRequest() clsend airecv; - cloudsColorResponse(partyCloudColor []); - requestCloudHit(uint16, uint8/100, uint8/100, uint8/100) clsend airecv; - setCloudHit(uint16, uint8/100, uint8/100, uint8/100) broadcast; - setToonTrajectoryAi(int32, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100) airecv clsend; - setToonTrajectory(uint32, int32, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100) broadcast; - updateToonTrajectoryStartVelAi(int32/100, int32/100, int32/100) airecv clsend; - updateToonTrajectoryStartVel(uint32, int32/100, int32/100, int32/100) broadcast; -}; - -dclass DistributedPartyCannon : DistributedObject { - setActivityDoId(uint64) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - requestEnter() airecv clsend; - requestExit() broadcast; - setMovie(uint8, uint32) broadcast ram; - setCannonPosition(int32/100, uint32/100) airecv clsend; - setCannonLit(int32/100, uint32/100) airecv clsend; - setFired() airecv clsend; - setLanded(uint32) airecv clsend; - updateCannonPosition(uint32, int32/100, uint32/100) broadcast ram; - setCannonExit(uint32) broadcast; - setTimeout() clsend airecv; -}; - -dclass DistributedPartyFireworksActivity : DistributedPartyActivity { - setEventId(uint8 eventId) required broadcast; - setShowStyle(uint8 style) required broadcast; - setSongId(uint8 songId) required broadcast; -}; - -dclass DistributedPartyTrampolineActivity : DistributedPartyActivity { - awardBeans(uint8, uint16) clsend airecv; - setBestHeightInfo(string, uint16) broadcast ram; - reportHeightInformation(uint16) airecv clsend; - leaveTrampoline() broadcast; - requestAnim(char [0-256]) clsend airecv; - requestAnimEcho(string) broadcast; - removeBeans(int8 []) clsend airecv; - removeBeansEcho(int8 []) broadcast; -}; - -dclass DistributedPartyValentineTrampolineActivity : DistributedPartyTrampolineActivity { -}; - -dclass DistributedPartyVictoryTrampolineActivity : DistributedPartyTrampolineActivity { -}; - -dclass DistributedPartyWinterTrampolineActivity : DistributedPartyTrampolineActivity { -}; - -dclass DistributedPartyTugOfWarActivity : DistributedPartyTeamActivity { - reportKeyRateForce(uint32, int16/100) airecv clsend; - reportFallIn(uint8) airecv clsend; - setToonsPlaying(uint32 [0-4], uint32 [0-4]) required broadcast ram; - updateToonKeyRate(uint32, uint32) broadcast; - updateToonPositions(int16/1000) broadcast; -}; - -dclass DeleteManager : DistributedObject { - setInventory(blob) airecv clsend; -}; - -struct weeklyCalendarHoliday { - uint8 holidayId; - uint8 dayOfTheWeek; -}; - -struct yearlyCalendarHoliday { - uint8 holidayId; - uint8[] firstStartTime; - uint8[] lastEndTime; -}; - -struct oncelyCalendarHoliday { - uint8 holidayId; - uint16[] firstStartTime; - uint16[] lastEndTime; -}; - -struct relativelyCalendarHoliday { - uint8 holidayId; - uint16[] firstStartTime; - uint16[] lastEndTime; -}; - -struct startAndEndTime { - uint16[] startTime; - uint16[] endTime; -}; - -struct multipleStartHoliday { - uint8 holidayId; - startAndEndTime times[]; -}; - -dclass NewsManager : DistributedObject { - setPopulation(uint32) broadcast ram; - setBingoWin(uint32) broadcast ram; - setBingoStart() broadcast; - setBingoEnd() broadcast; - setCircuitRaceStart() broadcast; - setCircuitRaceEnd() broadcast; - setTrolleyHolidayStart() broadcast; - setTrolleyHolidayEnd() broadcast; - setTrolleyWeekendStart() broadcast; - setTrolleyWeekendEnd() broadcast; - setRoamingTrialerWeekendStart() broadcast; - setRoamingTrialerWeekendEnd() broadcast; - setInvasionStatus(uint8, string, uint32, uint8) broadcast; - setHolidayIdList(uint32[]) broadcast ram; - holidayNotify() broadcast; - setWeeklyCalendarHolidays(weeklyCalendarHoliday []) required broadcast ram; - setYearlyCalendarHolidays(yearlyCalendarHoliday []) required broadcast ram; - setOncelyCalendarHolidays(oncelyCalendarHoliday []) required broadcast ram; - setRelativelyCalendarHolidays(relativelyCalendarHoliday []) required broadcast ram; - setMultipleStartHolidays(multipleStartHoliday []) required broadcast ram; - sendSystemMessage(string, uint8) broadcast ram; -}; - -dclass PurchaseManager : DistributedObject { - setPlayerIds(uint32, uint32, uint32, uint32) required broadcast ram; - setNewbieIds(uint32[]) required broadcast ram; - setMinigamePoints(uint8, uint8, uint8, uint8) required broadcast ram; - setPlayerMoney(uint16, uint16, uint16, uint16) required broadcast ram; - setPlayerStates(uint8, uint8, uint8, uint8) required broadcast ram; - setCountdown(int16) required broadcast ram; - setMetagameRound(int8) required broadcast ram; - setVotesArray(int16[]) required broadcast ram; - requestExit() airecv clsend; - requestPlayAgain() airecv clsend; - setInventory(blob, int16, uint8) airecv clsend; - setPurchaseExit() broadcast; -}; - -dclass NewbiePurchaseManager : PurchaseManager { - setOwnedNewbieId(uint32) required broadcast ram; -}; - -dclass SafeZoneManager : DistributedObject { - enterSafeZone() airecv clsend; - exitSafeZone() airecv clsend; -}; - -dclass TutorialManager : DistributedObject { - requestTutorial() airecv clsend; - rejectTutorial() airecv clsend; - requestSkipTutorial() airecv clsend; - skipTutorialResponse(uint8); - enterTutorial(uint32, uint32, uint32, uint32); - allDone() airecv clsend; - toonArrived() airecv clsend; -}; - -dclass CatalogManager : DistributedObject { - startCatalog() airecv clsend; - fetchPopularItems() airecv clsend; - setPopularItems(blob); -}; - -dclass DistributedMyTest : DistributedObject { - setMyTest(uint16) broadcast; -}; - -dclass DistributedTreasure : DistributedObject { - setTreasureType(uint16) required broadcast ram; - setPosition(int16/10, int16/10, int16/10) required broadcast ram; - requestGrab() airecv clsend; - setGrab(uint32) broadcast ram; - setReject() broadcast; -}; - -dclass DistributedCashbotBossTreasure : DistributedTreasure { - setGoonId(uint32) required broadcast ram; - setFinalPosition(int16/10, int16/10, int16/10) required broadcast ram; - setStyle(uint16) required broadcast ram; -}; - -dclass DistributedLargeBlobSender : DistributedObject { - setMode(uint8) required broadcast ram; - setTargetAvId(uint32) required broadcast ram; - setChunk(blob); - setFilename(string); - setAck() airecv clsend; -}; - -dclass DistributedLevel : DistributedObject { - setLevelZoneId(uint32) required broadcast ram; - setPlayerIds(uint32[]) required broadcast ram; - setEntranceId(uint8) required broadcast ram; - setZoneIds(uint32[]) broadcast ram; - setStartTimestamp(int32) broadcast ram; - setOuch(uint8) airecv clsend; - requestCurrentLevelSpec(string, string) airecv clsend; - setSpecDeny(blob); - setSpecSenderDoId(uint32); - setAttribChange(uint32, blob, blob, blob) broadcast; -}; - -dclass DistributedEntity : DistributedObject { - setLevelDoId(uint32) required broadcast ram; - setEntId(uint32) required broadcast ram; -}; - -dclass DistributedInteractiveEntity : DistributedEntity { - setAvatarInteract(uint32) required broadcast ram; - requestInteract() airecv clsend; - rejectInteract(); - requestExit() airecv clsend; - avatarExit(uint32) broadcast; - setState(string, int32) required broadcast ram; -}; - -dclass DistributedTrophyMgr : DistributedObject { - requestTrophyScore() airecv clsend; -}; - -dclass DistributedBuilding : DistributedObject { - setBlock(uint16, uint32) required broadcast ram; - setSuitData(int8, int8, int8) required broadcast ram; - setVictorList(uint32[]) broadcast ram; - setState(string, int16) broadcast ram; - setVictorReady() airecv clsend; -}; - -dclass DistributedAnimBuilding : DistributedBuilding { -}; - -dclass DistributedBuildingQueryMgr : DistributedObject { - isSuit(uint8, uint32) airecv clsend; - response(uint8, bool); -}; - -dclass DistributedToonInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; - setToonData(blob) required broadcast ram; - setState(string, int16) required broadcast ram; - nextSnowmanHeadPart() clsend airecv; -}; - -dclass DistributedToonHallInterior : DistributedToonInterior { -}; - -dclass DistributedSuitInterior : DistributedObject { - setZoneId(uint32) required broadcast ram; - setExtZoneId(uint32) required broadcast ram; - setDistBldgDoId(uint32) required broadcast ram; - setNumFloors(int8) required broadcast ram; - setToons(uint32[], uint16) broadcast ram; - setSuits(uint32[], uint32[], uint16[]) broadcast ram; - setState(string, int16) required broadcast ram; - setAvatarJoined() airecv clsend; - elevatorDone() airecv clsend; - reserveJoinDone() airecv clsend; -}; - -dclass DistributedCogdoBarrel : DistributedObject { - requestGrab() airecv clsend; - setIndex(uint32) required broadcast ram; - setState(uint32) required broadcast ram; - setGrab(uint32) broadcast ram; - setReject() broadcast; -}; - -dclass DistributedCogdoInterior : DistributedObject { - setZoneId(uint32) required broadcast ram; - setExtZoneId(uint32) required broadcast ram; - setDistBldgDoId(uint32) required broadcast ram; - setNumFloors(int8) required broadcast ram; - setShopOwnerNpcId(uint32) required broadcast ram; - setSOSNpcId(uint32) broadcast ram; - setFOType(int8) broadcast ram; - setToons(uint32[], uint16) broadcast ram; - setSuits(uint32[], uint32[], uint16[]) broadcast ram; - setState(string, int16) required broadcast ram; - setAvatarJoined() airecv clsend; - elevatorDone() airecv clsend; - reserveJoinDone() airecv clsend; - toonLeftBarrelRoom() airecv clsend; - toonBarrelRoomIntroDone() airecv clsend; - setBarrelRoomReward(uint32 [], uint8 []) broadcast; - toonBarrelRoomRewardDone() airecv clsend; -}; - -dclass DistributedCogdoBattleBldg : DistributedBattleBldg { -}; - -dclass DistCogdoGame : DistributedObject { - setInteriorId(uint32) required broadcast ram; - setExteriorZone(uint32) broadcast ram required; - setDifficultyOverrides(int32, int32) broadcast ram required; - setVisible() broadcast; - setIntroStart() broadcast; - setToonSad(uint32) broadcast; - setToonDisconnect(uint32) broadcast; - setAvatarReady() airecv clsend; - setGameStart(int16) broadcast; - setGameFinish(int16) broadcast; -}; - -dclass DistCogdoLevelGame : DistCogdoGame, DistributedLevel { -}; - -dclass DistCogdoMazeGame : DistCogdoGame { - requestAction(uint8, uint32) airecv clsend; - doAction(uint8, uint32, int16) broadcast; - setNumSuits(uint8 [3]) required broadcast; - requestUseGag(int16/10, int16/10, int16/10, int16) clsend airecv; - toonUsedGag(uint32, int16/10, int16/10, int16/10, int16) broadcast; - requestSuitHitByGag(uint8, uint8) clsend airecv; - suitHitByGag(uint32, uint8, uint8) broadcast; - requestHitBySuit(uint8, uint8, int16) clsend airecv; - toonHitBySuit(uint32, uint8, uint8, int16) broadcast; - requestHitByDrop() clsend airecv; - toonHitByDrop(uint32) broadcast; - requestPickUp(uint8) clsend airecv; - pickUp(uint32, uint8, int16) broadcast; - requestGag(uint8) clsend airecv; - hasGag(uint32, int16) broadcast; -}; - -dclass DistCogdoFlyingGame : DistCogdoGame { - requestAction(uint8, uint8) airecv clsend; - requestPickUp(uint16, uint8) airecv clsend; - pickUp(uint32, uint16, int16) broadcast; - debuffPowerup(uint32, uint16, int16) broadcast; - doAction(uint8, uint32) broadcast; - eagleExitCooldown(uint32, int16) broadcast; - toonSetAsEagleTarget(uint32, uint8, int16) broadcast; - toonClearAsEagleTarget(uint32, uint8, int16) broadcast; - toonDied(uint32, int32) broadcast; - toonSpawn(uint32, int32) broadcast; - toonSetBlades(uint32, int32) broadcast; - toonBladeLost(uint32) broadcast; -}; - -dclass DistCogdoBoardroomGame : DistCogdoLevelGame { -}; - -dclass DistCogdoCraneGame : DistCogdoLevelGame { -}; - -dclass DistCogdoCrane : DistributedObject { - setCraneGameId(uint32) required broadcast ram; - setIndex(uint8) required broadcast ram; - setState(char, uint32) broadcast ram; - clearSmoothing(int8) broadcast clsend; - setCablePos(uint8, int16/100, uint16%360/100, LinkPosition [3], int16) broadcast clsend; -}; - -dclass DistCogdoCraneObject : DistributedObject { - setCraneGameId(uint32) required broadcast ram; - setObjectState(char, uint32, uint32) broadcast ram; - requestGrab() airecv clsend; - rejectGrab(); - requestDrop() airecv clsend; - hitFloor() clsend; - requestFree(int16/10, int16/10, int16/10, uint16%360/100) airecv clsend; - hitBoss(uint16/255) airecv clsend; - setX(int16/10) broadcast ram clsend airecv; - setY(int16/10) broadcast ram clsend airecv; - setZ(int16/10) broadcast ram clsend airecv; - setH(int16%360/10) broadcast ram clsend airecv; - setP(int16%360/10) broadcast ram clsend airecv; - setR(int16%360/10) broadcast ram clsend airecv; - setPos : setX, setY, setZ; - setHpr : setH, setP, setR; - setPosHpr : setX, setY, setZ, setH, setP, setR; - setXY : setX, setY; - setXZ : setX, setZ; - setXYH : setX, setY, setH; - setXYZH : setX, setY, setZ, setH; - setComponentL(uint64) broadcast ram clsend airecv; - setComponentX(int16/10) broadcast ram clsend airecv; - setComponentY(int16/10) broadcast ram clsend airecv; - setComponentZ(int16/10) broadcast ram clsend airecv; - setComponentH(int16%360/10) broadcast ram clsend airecv; - setComponentP(int16%360/10) broadcast ram clsend airecv; - setComponentR(int16%360/10) broadcast ram clsend airecv; - setComponentT(int16) broadcast ram clsend airecv; - setSmStop : setComponentT; - setSmH : setComponentH, setComponentT; - setSmZ : setComponentZ, setComponentT; - setSmXY : setComponentX, setComponentY, setComponentT; - setSmXZ : setComponentX, setComponentZ, setComponentT; - setSmPos : setComponentX, setComponentY, setComponentZ, setComponentT; - setSmHpr : setComponentH, setComponentP, setComponentR, setComponentT; - setSmXYH : setComponentX, setComponentY, setComponentH, setComponentT; - setSmXYZH : setComponentX, setComponentY, setComponentZ, setComponentH, setComponentT; - setSmPosHpr : setComponentX, setComponentY, setComponentZ, setComponentH, setComponentP, setComponentR, setComponentT; - setSmPosHprL : setComponentL, setComponentX, setComponentY, setComponentZ, setComponentH, setComponentP, setComponentR, setComponentT; - clearSmoothing(int8) broadcast clsend; -}; - -dclass DistCogdoCraneMoneyBag : DistCogdoCraneObject { - setIndex(uint8) required broadcast ram; - requestInitial() airecv clsend; -}; - -dclass DistCogdoCraneCog : DistributedObject { - setGameId(uint32) required broadcast ram; - setDNAString(blob) required broadcast ram; - setSpawnInfo(uint8, int16) required broadcast ram; -}; - -dclass DistributedHQInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; - setLeaderBoard(blob) required broadcast ram; - setTutorial(uint8) required broadcast ram; -}; - -dclass DistributedGagshopInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; -}; - -dclass DistributedPetshopInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; -}; - -dclass DistributedKartShopInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; -}; - -dclass DistributedBankInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; - setState(string, int16) broadcast ram; -}; - -dclass DistributedLibraryInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; -}; - -dclass DistributedDoor : DistributedObject { - setZoneIdAndBlock(uint32, uint32) required broadcast ram; - setSwing(int8) required broadcast ram; - setDoorType(uint8) required broadcast ram; - setDoorIndex(uint8) required broadcast ram; - setOtherZoneIdAndDoId(uint32, uint32); - requestEnter() airecv clsend; - requestExit() airecv clsend; - rejectEnter(int8); - avatarEnter(uint32) broadcast; - avatarExit(uint32) broadcast; - setState(string, int16) required broadcast ram; - setExitDoorState(string, int16) required broadcast ram; -}; - -dclass DistributedAnimDoor : DistributedDoor { -}; - -dclass DistributedHouseDoor : DistributedDoor { -}; - -dclass DistributedCogHQDoor : DistributedDoor { -}; - -dclass DistributedSellbotHQDoor : DistributedCogHQDoor { - informPlayer(uint8) broadcast ram; -}; - -dclass DistributedNPCToonBase : DistributedNode { - setName(string) required broadcast ram; - setDNAString(blob) required broadcast ram; - setPositionIndex(uint8) required broadcast ram; - setAnimState(string, int16/1000, int16) broadcast ram; - setPageNumber(int16, int8, int16) broadcast ram clsend; - avatarEnter() airecv clsend; - freeAvatar(); - setHat(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; - setGlasses(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; - setBackpack(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; - setShoes(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; -}; - -dclass DistributedNPCToon : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, uint16[], int16) broadcast ram; - setMovieDone() airecv clsend; - chooseQuest(uint16) airecv clsend; - chooseTrack(int8) airecv clsend; -}; - -dclass DistributedSmartNPC : DistributedNPCToonBase { - greet(uint32, uint32) broadcast ram; - talkMessage(uint32, string) airecv clsend; - respond(uint32, string, uint32) broadcast ram; - dismiss(uint32, uint16) broadcast ram; -}; - -dclass DistributedNPCBanker : DistributedNPCToonBase { - setMovie(uint8, uint32, int16) broadcast ram; - setMovieDone() airecv clsend; - transferMoney(int16) airecv clsend; -}; - -dclass DistributedNPCSpecialQuestGiver : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, uint16[], int16) broadcast ram; - setMovieDone() airecv clsend; - chooseQuest(uint16) airecv clsend; - chooseTrack(int8) airecv clsend; -}; - -dclass DistributedNPCFlippyInToonHall : DistributedNPCToon { -}; - -dclass DistributedNPCScientist : DistributedNPCToonBase { - setChat(char [0-1024], uint8, uint32, uint8, uint8) ownsend broadcast; -}; - -dclass DistributedNPCClerk : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, int16) broadcast ram; - setInventory(blob, int16, uint8) airecv clsend; -}; - -dclass DistributedNPCTailor : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, int16) broadcast ram; - setDNA(blob, int8, uint8) airecv clsend; - setCustomerDNA(uint32, blob) broadcast ram; -}; - -dclass DistributedNPCBlocker : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, int16) broadcast ram; -}; - -dclass DistributedNPCFisherman : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; - completeSale(uint8) airecv clsend; -}; - -dclass DistributedNPCPartyPerson : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; - answer(uint8) airecv clsend; -}; - -dclass DistributedNPCPetclerk : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; - setPetSeeds(uint32[]); - petAdopted(uint8, uint32) airecv clsend; - petReturned() airecv clsend; - fishSold() airecv clsend; - transactionDone() airecv clsend; -}; - -dclass DistributedNPCKartClerk : DistributedNPCToonBase { - setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; - buyKart(uint8) airecv clsend; - buyAccessory(uint8) airecv clsend; - transactionDone() airecv clsend; -}; - -dclass DistributedNPCYin : DistributedNPCToonBase { - doTransformation(uint32 avId) broadcast; - requestTransformation() airecv clsend; -}; - -dclass DistributedNPCYang : DistributedNPCToonBase { - doTransformation(uint32 avId) broadcast; - requestTransformation() airecv clsend; -}; - -dclass DistributedKnockKnockDoor : DistributedAnimatedProp { -}; - -dclass DistributedElevator : DistributedObject { - setBldgDoId(uint32) required broadcast ram; - setState(string, int16) broadcast ram; - fillSlot0(uint32, uint8) broadcast ram; - fillSlot1(uint32, uint8) broadcast ram; - fillSlot2(uint32, uint8) broadcast ram; - fillSlot3(uint32, uint8) broadcast ram; - fillSlot4(uint32, uint8) broadcast ram; - fillSlot5(uint32, uint8) broadcast ram; - fillSlot6(uint32, uint8) broadcast ram; - fillSlot7(uint32, uint8) broadcast ram; - emptySlot0(uint32, int8, int16, int16) broadcast ram; - emptySlot1(uint32, int8, int16, int16) broadcast ram; - emptySlot2(uint32, int8, int16, int16) broadcast ram; - emptySlot3(uint32, int8, int16, int16) broadcast ram; - emptySlot4(uint32, int8, int16, int16) broadcast ram; - emptySlot5(uint32, int8, int16, int16) broadcast ram; - emptySlot6(uint32, int8, int16, int16) broadcast ram; - emptySlot7(uint32, int8, int16, int16) broadcast ram; - requestBoard() airecv clsend; - rejectBoard(uint32, uint8); - requestExit() airecv clsend; - setElevatorTripId(uint32) required broadcast ram; - setAntiShuffle(uint8) required broadcast ram; - setMinLaff(uint8) required broadcast ram; -}; - -dclass DistributedElevatorFSM : DistributedObject { - setBldgDoId(uint32) required broadcast ram; - setState(string, int16) broadcast ram; - fillSlot0(uint32) broadcast ram; - fillSlot1(uint32) broadcast ram; - fillSlot2(uint32) broadcast ram; - fillSlot3(uint32) broadcast ram; - fillSlot4(uint32) broadcast ram; - fillSlot5(uint32) broadcast ram; - fillSlot6(uint32) broadcast ram; - fillSlot7(uint32) broadcast ram; - emptySlot0(uint32, int8, int16) broadcast ram; - emptySlot1(uint32, int8, int16) broadcast ram; - emptySlot2(uint32, int8, int16) broadcast ram; - emptySlot3(uint32, int8, int16) broadcast ram; - emptySlot4(uint32, int8, int16) broadcast ram; - emptySlot5(uint32, int8, int16) broadcast ram; - emptySlot6(uint32, int8, int16) broadcast ram; - emptySlot7(uint32, int8, int16) broadcast ram; - requestBoard() airecv clsend; - rejectBoard(uint32, uint8); - requestExit() airecv clsend; - setElevatorTripId(uint32) required broadcast ram; - setAntiShuffle(uint8) required broadcast ram; - setMinLaff(uint8) required broadcast ram; -}; - -dclass DistributedElevatorFloor : DistributedElevatorFSM { - setFloor(int8) broadcast ram; - setLocked(uint16) required broadcast ram; - setEntering(uint16) required broadcast ram; - kickToonsOut() broadcast; - setLatch(uint32) required broadcast ram; -}; - -dclass DistributedElevatorExt : DistributedElevator { - setFloor(int8) broadcast ram; -}; - -dclass DistributedLawOfficeElevatorExt : DistributedElevatorExt { - setEntranceId(uint8) required broadcast ram; - setLawOfficeInteriorZone(uint32); - setLawOfficeInteriorZoneForce(uint32); -}; - -dclass DistributedElevatorInt : DistributedElevator { - requestBuildingExit() airecv clsend; - forcedExit(uint32); -}; - -dclass DistributedFactoryElevatorExt : DistributedElevatorExt { - setEntranceId(uint8) required broadcast ram; - setFactoryInteriorZone(uint32); - setFactoryInteriorZoneForce(uint32); -}; - -dclass DistributedMintElevatorExt : DistributedElevatorExt { - setMintId(uint16) required broadcast ram; - setMintInteriorZone(uint32); - setMintInteriorZoneForce(uint32); -}; - -dclass DistributedCogdoElevatorExt : DistributedElevatorExt { -}; - -dclass DistributedLawOfficeElevatorInt : DistributedElevatorFloor { - setLawOfficeInteriorZone(uint32); -}; - -dclass DistributedCogdoElevatorInt : DistributedElevatorInt { -}; - -dclass DistributedBossElevator : DistributedElevatorExt { - setBossOfficeZone(uint32); - setBossOfficeZoneForce(uint32); -}; - -dclass DistributedVPElevator : DistributedBossElevator { -}; - -dclass DistributedCFOElevator : DistributedBossElevator { -}; - -dclass DistributedCJElevator : DistributedBossElevator { -}; - -dclass DistributedBBElevator : DistributedBossElevator { -}; - -dclass DistributedBoardingParty : DistributedObject { - postGroupInfo(uint32, uint32[], uint32[], uint32[]) broadcast; - informDestinationInfo(uint8) clsend airecv; - postDestinationInfo(uint8) broadcast; - postInvite(uint32, uint32, bool) broadcast; - postInviteCanceled() broadcast; - postKick(uint32) broadcast; - postKickReject(uint32, uint32, uint32) broadcast; - postSizeReject(uint32, uint32, uint32) broadcast; - postInviteAccepted(uint32) broadcast; - postInviteDelcined(uint32) broadcast; - postInviteNotQualify(uint32, int8, uint32) broadcast; - postAlreadyInGroup() broadcast; - postGroupDissolve(uint32, uint32, uint32 [], uint8) broadcast; - postMessageAcceptanceFailed(uint32, int8) broadcast; - postGroupAlreadyFull() broadcast; - postSomethingMissing() broadcast; - postRejectBoard(uint32, int8, uint32 [], uint32 []) broadcast; - postRejectGoto(uint32, int8, uint32 [], uint32 []) broadcast; - postMessageInvited(uint32, uint32) broadcast; - postMessageInvitationFailed(uint32) broadcast; - acceptGoToFirstTime(uint32) broadcast; - acceptGoToSecondTime(uint32) broadcast; - rejectGoToRequest(uint32, int8, uint32 [], uint32 []) broadcast; - requestInvite(uint32) airecv clsend; - requestCancelInvite(uint32) airecv clsend; - requestAcceptInvite(uint32, uint32) airecv clsend; - requestRejectInvite(uint32, uint32) airecv clsend; - requestKick(uint32) airecv clsend; - requestLeave(uint32) airecv clsend; - requestBoard(uint32) airecv clsend; - requestGoToFirstTime(uint32) airecv clsend; - requestGoToSecondTime(uint32) airecv clsend; - setElevatorIdList(uint32[]) required broadcast ram; - setGroupSize(uint8) required broadcast ram; -}; - -dclass DistributedTutorialInterior : DistributedObject { - setZoneIdAndBlock(uint32, uint16) required broadcast ram; - setTutorialNpcId(uint32) required broadcast ram; -}; - -dclass DistributedBankMgr : DistributedObject { - transferMoney(int16) airecv clsend; -}; - -dclass DistributedMailbox : DistributedObject { - setHouseId(uint32) required broadcast ram; - setHousePos(uint8) required broadcast ram; - setName(string) required broadcast ram; - setFullIndicator(uint8) broadcast ram; - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - freeAvatar(); - setMovie(uint8, uint32) broadcast ram; - acceptItemMessage(uint16, blob, uint8, int32) airecv clsend; - acceptItemResponse(uint16, int8); - discardItemMessage(uint16, blob, uint8, int32) airecv clsend; - discardItemResponse(uint16, int8); - acceptInviteMessage(uint16, uint64) airecv clsend; - rejectInviteMessage(uint16, uint64) airecv clsend; - markInviteReadButNotReplied(uint64) airecv clsend; -}; - -dclass DistributedFurnitureManager : DistributedObject { - setOwnerId(uint32 ownerId) required broadcast ram; - setOwnerName(string ownerName) required broadcast ram; - setInteriorId(uint32 interiorId) required broadcast ram; - setAtticItems(blob atticItems) required broadcast ram; - setAtticWallpaper(blob atticWallpaper) required broadcast ram; - setAtticWindows(blob atticWindows) required broadcast ram; - setDeletedItems(blob deletedItems) required broadcast ram; - suggestDirector(uint32 directorId) airecv clsend; - setDirector(uint32 directorId) broadcast ram; - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - moveItemToAtticMessage(uint32 doId, uint16 context) airecv clsend; - moveItemToAtticResponse(int8 retval, uint16 context); - moveItemFromAtticMessage(uint16 index, int16/10 x, int16/10 y, int16/100 z, int16/10 h, int16/10 p, int16/10 r, uint16 context) airecv clsend; - moveItemFromAtticResponse(int8 retval, uint32 doId, uint16 context); - deleteItemFromAtticMessage(blob item, uint16 index, uint16 context) airecv clsend; - deleteItemFromAtticResponse(int8 retval, uint16 context); - deleteItemFromRoomMessage(blob item, uint32 doId, uint16 context) airecv clsend; - deleteItemFromRoomResponse(int8 retval, uint16 context); - moveWallpaperFromAtticMessage(uint16 index, uint8 room, uint16 context) airecv clsend; - moveWallpaperFromAtticResponse(int8 retval, uint16 context); - deleteWallpaperFromAtticMessage(blob item, uint16 index, uint16 context) airecv clsend; - deleteWallpaperFromAtticResponse(int8 retval, uint16 context); - moveWindowToAtticMessage(uint8 slot, uint16 context) airecv clsend; - moveWindowToAtticResponse(int8 retval, uint16 context); - moveWindowFromAtticMessage(uint16 index, uint8 slot, uint16 context) airecv clsend; - moveWindowFromAtticResponse(int8 retval, uint16 context); - moveWindowMessage(uint8 fromSlot, uint8 toSlot, uint16 context) airecv clsend; - moveWindowResponse(int8 retval, uint16 context); - deleteWindowFromAtticMessage(blob item, uint16 index, uint16 context) airecv clsend; - deleteWindowFromAtticResponse(int8 retval, uint16 context); - recoverDeletedItemMessage(blob item, uint16 index, uint16 context) airecv clsend; - recoverDeletedItemResponse(int8 retval, uint16 context); -}; - -dclass DistributedFurnitureItem : DistributedSmoothNode { - setItem(uint32 furnitureMgrId, blob item) required broadcast ram; - requestPosHpr(uint8 final, int16/10 x, int16/10 y, int16/100 z, int16/10 h, int16/10 p, int16/10 r, int16 t) airecv clsend; - setMode(uint8 mdoe, uint32 avId) required broadcast ram; -}; - -dclass DistributedBank : DistributedFurnitureItem { - avatarEnter() airecv clsend; - freeAvatar(); - setMovie(uint8, uint32, int16) broadcast ram; - transferMoney(int16) airecv clsend; -}; - -dclass DistributedBankCollectable : DistributedObject { - requestGrab() airecv clsend; - grab(uint32) broadcast ram; -}; - -dclass DistributedCloset : DistributedFurnitureItem { - setOwnerId(uint32) required broadcast ram; - enterAvatar() airecv clsend; - freeAvatar(); - removeItem(blob, uint8) airecv clsend; - setDNA(blob, int8, uint8) airecv clsend; - setState(uint8, uint32, uint32, string, uint8[], uint8[]) broadcast ram; - setMovie(uint8, uint32, int16) broadcast ram; - resetItemLists() broadcast ram; - setCustomerDNA(uint32, blob) broadcast ram; -}; - -dclass DistributedTrunk : DistributedCloset { - setState(uint8, uint32, uint32, string, uint8[], uint8[], uint8[], uint8[]) broadcast ram; - removeItem(uint8, uint8, uint8, uint8) airecv clsend; - setDNA(uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, int8, uint8) airecv clsend; - setCustomerDNA(uint32, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8) broadcast ram; -}; - -dclass DistributedPhone : DistributedFurnitureItem { - setInitialScale(uint8/170, uint8/170, uint8/170) required broadcast ram; - setNewScale(uint8/170, uint8/170, uint8/170) airecv clsend; - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - freeAvatar(); - setLimits(uint16); - setMovie(uint8, uint32, int32) broadcast ram; - requestPurchaseMessage(uint16, blob, int32) airecv clsend; - requestPurchaseResponse(uint16, int8); - requestGiftPurchaseMessage(uint16, uint32, blob, int32) airecv clsend; - requestGiftPurchaseResponse(uint16, int8); - purchaseItemComplete(); -}; - -dclass DistributedFireworkShow : DistributedObject { - startShow(uint8, uint8, uint8, int16) broadcast ram; - requestFirework(int16/10, int16/10, int16/100, uint8, uint8, uint8) airecv clsend; - shootFirework(int16/10, int16/10, int16/100, uint8, uint8, uint8) broadcast; -}; - -dclass DistributedFireworksCannon : DistributedFireworkShow { - avatarEnter() airecv clsend; - avatarExit() airecv clsend; - freeAvatar(); - setMovie(uint8, uint32, int16) broadcast ram; - setPosition(int16/10, int16/10, int16/10) required broadcast ram; -}; - -dclass LobbyManager : DistributedObject { -}; - -dclass DistributedFactory : DistributedLevel { - setFactoryId(uint16) required broadcast ram; - setSuits(uint32[], uint32[]) broadcast ram; - setForemanConfronted(uint32) broadcast ram; - setDefeated() broadcast ram; -}; - -dclass DistributedMegaCorp: DistributedFactory { -}; - -dclass DistributedLawOffice : DistributedObject { - setLawOfficeId(uint16) required broadcast ram; - startSignal() broadcast ram; - readyForNextFloor() airecv clsend; -}; - -dclass DistributedLawOfficeFloor : DistributedLevel { - setLawOfficeId(uint16) required broadcast ram; - setSuits(uint32[], uint32[]) broadcast ram; - readyForNextFloor() airecv clsend; - setForemanConfronted(uint32) broadcast ram; - setDefeated() broadcast ram; -}; - -dclass DistributedMint : DistributedObject { - setZoneId(uint32) required broadcast ram; - setMintId(uint16) required broadcast ram; - setFloorNum(uint8) required broadcast ram; - setRoomDoIds(uint32[]) broadcast ram; -}; - -dclass DistributedMintRoom : DistributedLevel { - setMintId(uint16) required broadcast ram; - setRoomId(uint16) required broadcast ram; - setRoomNum(uint8) required broadcast ram; - setSuits(uint32[], uint32[]) broadcast ram; - setBossConfronted(uint32) broadcast ram; - setDefeated() broadcast ram; -}; - -dclass DistributedStage : DistributedObject { - setZoneId(uint32) required broadcast ram; - setStageId(uint16) required broadcast ram; - setLayoutIndex(uint16) required broadcast ram; - setFloorNum(uint8) required broadcast ram; - setRoomDoIds(uint32[]) broadcast ram; - setStageZone(uint32) broadcast ram; - elevatorAlert(uint32) broadcast ram; -}; - -dclass DistributedStageRoom : DistributedLevel { - setStageId(uint16) required broadcast ram; - setRoomId(uint16) required broadcast ram; - setRoomNum(uint8) required broadcast ram; - setSuits(uint32[], uint32[]) broadcast ram; - setBossConfronted(uint32) broadcast ram; - setDefeated() broadcast ram; -}; - -dclass DistributedInGameEditor : DistributedObject { - setEditorAvId(uint32) required broadcast ram; - setEditUsername(blob) required broadcast ram; - setLevelDoId(uint32) required broadcast ram; - requestCurrentLevelSpec() airecv clsend; - setSpecSenderDoId(uint32); - setEdit(uint32, blob, blob, blob) airecv clsend; - setAttribChange(uint32, blob, blob, blob); - setFinished() airecv clsend; -}; - -dclass DistributedLift : DistributedEntity { - setStateTransition(uint8, uint8, uint32) required broadcast ram; - setAvatarEnter() airecv clsend; - setAvatarLeave() airecv clsend; -}; - -dclass DistributedDoorEntity : DistributedEntity { - setLocksState(uint16) required broadcast ram; - setDoorState(uint8, int32) required broadcast ram; - requestOpen() airecv clsend; -}; - -dclass DistributedSwitch : DistributedInteractiveEntity { -}; - -dclass DistributedButton : DistributedSwitch { -}; - -dclass DistributedTrigger : DistributedSwitch { -}; - -dclass DistributedCrushableEntity : DistributedEntity { - setPosition(int16/10, int16/10, int16/10) broadcast ram; - setCrushed(uint32, uint8) broadcast ram; -}; - -dclass DistributedCrusherEntity : DistributedEntity { -}; - -dclass DistributedElevatorMarker : DistributedEntity { -}; - -dclass DistributedStomper : DistributedCrusherEntity { - setMovie(uint8, int16, uint32[]) broadcast ram; -}; - -dclass DistributedStomperPair : DistributedEntity { - setChildren(uint32[]) broadcast ram; - setSquash() airecv clsend; -}; - -dclass DistributedBarrelBase : DistributedEntity { - requestGrab() airecv clsend; - setGrab(uint32) broadcast ram; - setReject() broadcast; -}; - -dclass DistributedGagBarrel : DistributedBarrelBase { -}; - -dclass DistributedBeanBarrel : DistributedBarrelBase { -}; - -dclass DistributedHealBarrel : DistributedBarrelBase { -}; - -dclass DistributedGrid : DistributedEntity { -}; - -dclass ActiveCell : DistributedEntity { - setState(uint8, uint32) broadcast ram; -}; - -dclass DirectionalCell : ActiveCell { -}; - -dclass CrusherCell : ActiveCell { -}; - -dclass DistributedCrate : DistributedCrushableEntity { - requestPush(uint8) airecv clsend; - setReject(); - setAccept() broadcast; - setMoveTo(uint32, int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) broadcast ram; - setDone() airecv clsend; -}; - -dclass DistributedSinkingPlatform : DistributedEntity { - setOnOff(uint8, uint32) airecv clsend; - setSinkMode(uint32, uint8, uint32) broadcast ram; -}; - -dclass DistributedGoon : DistributedCrushableEntity { - requestBattle(int16/10) airecv clsend; - requestStunned(int16/10) airecv clsend; - requestResync() airecv clsend; - setParameterize(int16/10, int16/10, int16/10, uint32) airecv clsend; - setMovie(uint8, uint32, int32/10, int16) broadcast ram; -}; - -dclass DistributedGridGoon : DistributedGoon { - setPathPts(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) broadcast ram; -}; - -dclass BattleBlocker : DistributedEntity { - setActive(uint8) required broadcast ram; - setSuits(uint32[]) broadcast ram; - setBattle(uint32) broadcast ram; - setBattleFinished() broadcast ram; -}; - -dclass DistributedLaserField : BattleBlocker { - setGrid(uint8, uint8) required broadcast ram; - setField(uint8 []) required broadcast ram; - setSuccess(uint8) broadcast ram; - hit(int8, int8, int8, int8) airecv clsend; - trapFire() airecv clsend; - setActiveLF(uint8) broadcast ram; - hideSuit(uint32[]) broadcast ram; - showSuit(uint32[]) broadcast ram; - setGridGame(string) broadcast ram; -}; - -struct golfGreenGameBoardData { - uint8 posX; - uint8 posZ; - uint8 typeIndex; -}; - -struct golfGreenGameScoreData { - uint32 avId; - uint8 score; -}; - -dclass DistributedGolfGreenGame : BattleBlocker { - requestJoin() airecv clsend; - leaveGame() airecv clsend; - acceptJoin(uint16, int32, uint32 []) broadcast ram; - requestBoard(uint8) airecv clsend; - startBoard(golfGreenGameBoardData [], uint8 []); - signalDone(uint8) broadcast ram; - boardCleared(uint32); - scoreData(uint8, uint8, golfGreenGameScoreData []) broadcast ram; - informGag(uint8, uint8); - helpOthers(uint32) broadcast; - setTimerStart(uint16, int32) broadcast ram; -}; - -dclass DistributedSecurityCamera : DistributedEntity { - trapFire() airecv clsend; - setTarget(uint8) broadcast ram; -}; - -dclass DistributedMover : DistributedEntity { - startMove(int16) broadcast ram; -}; - -typedef uint16/10000 PetTrait; - -dclass DistributedPet : DistributedSmoothNode { - string DcObjectType db; - setOwnerId(uint32) required broadcast db; - setPetName(string) required broadcast db; - setTraitSeed(uint32) required broadcast db; - setSafeZone(uint32) required broadcast db; - setForgetfulness(PetTrait) required broadcast db; - setBoredomThreshold(PetTrait) required broadcast db; - setRestlessnessThreshold(PetTrait) required broadcast db; - setPlayfulnessThreshold(PetTrait) required broadcast db; - setLonelinessThreshold(PetTrait) required broadcast db; - setSadnessThreshold(PetTrait) required broadcast db; - setFatigueThreshold(PetTrait) required broadcast db; - setHungerThreshold(PetTrait) required broadcast db; - setConfusionThreshold(PetTrait) required broadcast db; - setExcitementThreshold(PetTrait) required broadcast db; - setAngerThreshold(PetTrait) required broadcast db; - setSurpriseThreshold(PetTrait) required broadcast db; - setAffectionThreshold(PetTrait) required broadcast db; - setHead(int8(-1 - 1)) required broadcast db; // Supposed to be -1 - 0, but minification causes this to become -1-0, which is a parse problem. - setEars(int8(-1 - 4)) required broadcast db; - setNose(int8(-1 - 3)) required broadcast db; - setTail(int8(-1 - 6)) required broadcast db; - setBodyTexture(int8(0-6)) required broadcast db; - setColor(int8(0-25)) required broadcast db; - setColorScale(int8(0-8)) required broadcast db; - setEyeColor(int8(0-5)) required broadcast db; - setGender(int8(0-1)) required broadcast db; - setLastSeenTimestamp(uint32) required broadcast db; - setBoredom(uint16/1000(0-1)) required broadcast db; - setRestlessness(uint16/1000(0-1)) required broadcast db; - setPlayfulness(uint16/1000(0-1)) required broadcast db; - setLoneliness(uint16/1000(0-1)) required broadcast db; - setSadness(uint16/1000(0-1)) required broadcast db; - setAffection(uint16/1000(0-1)) required broadcast db; - setHunger(uint16/1000(0-1)) required broadcast db; - setConfusion(uint16/1000(0-1)) required broadcast db; - setExcitement(uint16/1000(0-1)) required broadcast db; - setFatigue(uint16/1000(0-1)) required broadcast db; - setAnger(uint16/1000(0-1)) required broadcast db; - setSurprise(uint16/1000(0-1)) required broadcast db; - setMood : setBoredom, setRestlessness, setPlayfulness, setLoneliness, setSadness, setAffection, setHunger, setConfusion, setExcitement, setFatigue, setAnger, setSurprise; - teleportIn(int16) broadcast ownsend; - teleportOut(int16) broadcast ownsend; - setTrickAptitudes(uint16/10000(0-1) []) required broadcast db; - doTrick(uint8, int16) broadcast ram; - avatarInteract(uint32); - setMovie(uint8, uint32, int16) broadcast ram; - freeAvatar(); -}; - -dclass DistributedPetProxy : DistributedPet { - setDominantMood(string) broadcast ram; -}; - -dclass DistributedAprilToonsMgr : DistributedObject { - setEventActive(uint8 eventId, bool) broadcast; - requestEventsList() clsend airecv; - requestEventsListResp(uint8 []); -}; - -dclass DistributedBlackCatMgr : DistributedObject { - doBlackCatTransformation(uint32 avId) broadcast; - requestBlackCatTransformation() airecv clsend; -}; - -dclass DistributedPolarBearMgr : DistributedObject { - doPolarBearTransformation(uint32 avId) broadcast; - requestPolarBearTransformation() airecv clsend; -}; - -dclass DistributedPolarPlaceEffectMgr : DistributedObject { - addPolarPlaceEffect() airecv clsend; -}; - -dclass DistributedGreenToonEffectMgr : DistributedObject { - addGreenToonEffect() airecv clsend; -}; - -dclass DistributedResistanceEmoteMgr : DistributedObject { - addResistanceEmote() clsend airecv; -}; - -dclass DistributedScavengerHuntTarget : DistributedObject { - attemptScavengerHunt() airecv clsend; -}; - -dclass DistributedTrickOrTreatTarget : DistributedObject { - doScavengerHunt(int8); - requestScavengerHunt() airecv clsend; -}; - -dclass DistributedWinterCarolingTarget : DistributedObject { - doScavengerHunt(int8) broadcast; - requestScavengerHunt() airecv clsend; -}; - -dclass DistributedDataStoreManager : DistributedObject { - startStore(uint8); - stopStore(uint8); - queryStore(uint8, string); - receiveResults(uint8, string); - deleteBackupStores(); -}; - -dclass DistributedVehicle : DistributedSmoothNode { - setOwner(uint32) required broadcast ram; - setState(char, uint32) broadcast ram; - setBodyType(int8) required broadcast ram; - setBodyColor(int8) required broadcast ram; - setAccessoryColor(int8) required broadcast ram; - setEngineBlockType(int8) required broadcast ram; - setSpoilerType(int8) required broadcast ram; - setFrontWheelWellType(int8) required broadcast ram; - setBackWheelWellType(int8) required broadcast ram; - setRimType(int8) required broadcast ram; - setDecalType(int8) required broadcast ram; - requestControl() airecv clsend; - requestParked() airecv clsend; - setInput(int8) broadcast ram; -}; - -struct avatarAndKart { - uint32 avId; - uint32 kartId; -}; - -dclass DistributedRace : DistributedObject { - setZoneId(uint32) required broadcast ram; - setTrackId(uint16) required broadcast ram; - setRaceType(uint16) required broadcast ram; - setCircuitLoop(uint16[]) required broadcast ram; - setAvatars(uint32[]) required broadcast ram; - setStartingPlaces(uint8[]) required broadcast ram; - setLapCount(uint8) broadcast required ram; - waitingForJoin() broadcast ram; - setEnteredRacers(avatarAndKart []) broadcast ram; - prepForRace() broadcast ram; - startTutorial() broadcast ram; - startRace(int16) broadcast ram; - goToSpeedway(uint32[], uint8) broadcast ram; - genGag(uint8, uint16, uint8) broadcast ram; - dropAnvilOn(uint32, uint32, int16) broadcast ram; - shootPiejectile(uint32, uint32, uint8) broadcast ram; - racerDisconnected(uint32) broadcast ram; - setPlace(uint32, uint32/1000, uint8, uint32, uint8, uint32, uint32, uint32[], uint16[], uint32/1000) broadcast ram; - setCircuitPlace(uint32, uint8, uint32, uint32, uint32, uint32[]) broadcast ram; - endCircuitRace() broadcast ram; - setRaceZone(uint32, uint32); - hasGag(uint8, uint8, uint8) broadcast airecv clsend; - racerLeft(uint32) clsend airecv broadcast ram; - heresMyT(uint32, int8, uint16/65535, int16) clsend airecv broadcast; - requestThrow(int32/1000, int32/1000, int32/1000) clsend airecv; - requestKart() clsend airecv; -}; - -dclass DistributedGag : DistributedObject { - setInitTime(int16) required broadcast ram; - setActivateTime(int16) required broadcast ram; - setPos(int32/1000, int32/1000, int32/1000) required broadcast ram; - setRace(uint32) required broadcast ram; - setOwnerId(uint32) required broadcast ram; - setType(uint8) required broadcast ram; - hitSomebody(uint32, int16) broadcast clsend airecv; -}; - -dclass DistributedProjectile : DistributedObject { - setInitTime(int16) required broadcast ram; - setPos(int32/1000, int32/1000, int32/1000) required broadcast ram; - setRace(uint32) required broadcast ram; - setOwnerId(uint32) required broadcast ram; - setType(uint8) required broadcast ram; - hitSomebody(uint32, int16) broadcast clsend airecv; -}; - -dclass DistributedKartPad : DistributedObject { - setArea(uint32) required broadcast ram; -}; - -dclass DistributedRacePad : DistributedKartPad { - setState(string, int16) required broadcast ram; - setRaceZone(uint32); - setTrackInfo(uint16[]) required broadcast ram; -}; - -dclass DistributedViewPad : DistributedKartPad { - setLastEntered(int16) required broadcast ram; -}; - -dclass DistributedStartingBlock : DistributedObject { - setPadDoId(uint32) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - setPadLocationId(uint8) required broadcast ram; - requestEnter(uint8) airecv clsend; - rejectEnter(uint8); - requestExit() airecv clsend; - setOccupied(uint32) broadcast ram; - setMovie(uint8) broadcast ram; - movieFinished() airecv clsend; -}; - -dclass DistributedViewingBlock : DistributedStartingBlock { -}; - -dclass DistributedLeaderBoard : DistributedObject { - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - setDisplay(blob) broadcast ram; -}; - -dclass DistributedDeliveryManager : DistributedObject { - hello(string) clsend; - rejectHello(string); - helloResponse(string); - getName(uint32); - receiveRejectGetName(string); - receiveAcceptGetName(string); - addName(uint32, string); - receiveRejectAddName(uint32); - receiveAcceptAddName(uint32); - addGift(uint32, blob, uint32, uint32, uint32); - receiveRejectAddGift(uint32); - receiveAcceptAddGift(uint32, uint32, uint32, uint32); - deliverGifts(uint32, uint32); - receiveAcceptDeliverGifts(uint32, string); - receiveRejectDeliverGifts(uint32, string); - receiveRequestPayForGift(blob, uint32, uint32) airecv clsend; - receiveRequestPurchaseGift(blob, uint32, uint32, uint32) airecv; - receiveAcceptPurchaseGift(uint32, uint32, int16); - receiveRejectPurchaseGift(uint32, uint32, int16, uint16); - heartbeat() airecv; - giveBeanBonus(uint32, uint16); - requestAck() clsend; - returnAck(); - givePartyRefund(uint32, uint32, uint64, int8, uint16); -}; - -dclass DistributedLawbotBoss : DistributedBossCog { - setState(string) broadcast ram; - setBossDamage(uint16, uint8, int16) broadcast ram; - touchWitnessStand() airecv clsend; - hitBoss(uint8) airecv clsend; - healBoss(uint8) airecv clsend; - hitToon(uint32) airecv clsend; - hitDefensePan() airecv clsend; - hitProsecutionPan() airecv clsend; - hitChair(uint8, uint8) airecv clsend; - setLawyerIds(uint32[]) broadcast ram; - setTaunt(int8, int8) broadcast; - toonGotHealed(uint32) broadcast; - enteredBonusState() broadcast; - setBattleDifficulty(uint8) broadcast ram; -}; - -dclass DistributedLawbotBossSuit : DistributedSuitBase { - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - doAttack(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) broadcast; - doProsecute() broadcast; - hitByToon() airecv clsend; - doStun() broadcast; -}; - -dclass DistributedLawbotBossGavel : DistributedObject { - setBossCogId(uint32) required broadcast ram; - setIndex(uint8) required broadcast ram; - setState(char) broadcast ram; -}; - -dclass DistributedLawbotCannon : DistributedObject { - setBossCogId(uint32) required broadcast ram; - setIndex(uint8) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - requestEnter() airecv clsend; - setMovie(int8, uint32, uint8) broadcast; - setCannonPosition(int16/10, int16/10) airecv clsend; - updateCannonPosition(uint32, int16/10, int16/10) broadcast; - setCannonLit(int16/10, int16/10) airecv clsend; - setCannonWillFire(uint32, int16/10, int16/10, int16/10, int16) broadcast; - setLanded() airecv clsend; - requestLeave() airecv clsend; -}; - -dclass DistributedLawbotChair : DistributedObject { - setBossCogId(uint32) required broadcast ram; - setIndex(uint8) required broadcast ram; - setState(char) broadcast ram; - showCogJurorFlying() broadcast; - setToonJurorIndex(int8) broadcast ram; -}; - -dclass DistributedLawnDecor : DistributedNode { - setPlot(int8) required broadcast ram; - setHeading(int16/10) required broadcast ram; - setPosition(int16/10, int16/10, int16/10) required broadcast ram; - setOwnerIndex(int8) required broadcast ram; - plotEntered() airecv clsend; - removeItem() airecv clsend; - setMovie(uint8, uint32) broadcast ram; - movieDone() airecv clsend; - interactionDenied(uint32) broadcast ram; -}; - -dclass DistributedGardenPlot : DistributedLawnDecor { - plantFlower(uint8, uint8) airecv clsend; - plantGagTree(uint8, uint8) airecv clsend; - plantStatuary(uint8) airecv clsend; - plantToonStatuary(uint8, uint16) airecv clsend; - plantNothing(uint8) airecv clsend; -}; - -dclass DistributedGardenBox : DistributedLawnDecor { - setTypeIndex(uint8) required broadcast ram; -}; - -dclass DistributedStatuary : DistributedLawnDecor { - setTypeIndex(uint8) required broadcast ram; - setWaterLevel(int8) required broadcast ram; - setGrowthLevel(int8) required broadcast ram; -}; - -dclass DistributedToonStatuary : DistributedStatuary { - setOptional(uint16) required broadcast ram; -}; - -dclass DistributedAnimatedStatuary : DistributedStatuary { -}; - -dclass DistributedChangingStatuary : DistributedStatuary { - setGrowthLevel(int8) required broadcast ram; -}; - -dclass DistributedPlantBase : DistributedLawnDecor { - setTypeIndex(uint8) required broadcast ram; - setWaterLevel(int8) required broadcast ram; - setGrowthLevel(int8) required broadcast ram; - waterPlant() airecv clsend; - waterPlantDone() airecv clsend; -}; - -dclass DistributedFlower : DistributedPlantBase { - setTypeIndex(uint8) required broadcast ram; - setVariety(uint8) required broadcast ram; -}; - -dclass DistributedGagTree : DistributedPlantBase { - setWilted(int8) required broadcast ram; - requestHarvest() airecv clsend; -}; - -dclass DistributedTravelGame : DistributedMinigame { - setTimerStartTime(int16) broadcast; - setAvatarChoice(uint16, uint8) airecv clsend; - setAvatarVotes(uint32, uint16) broadcast; - setAvatarChose(uint32) broadcast; - setServerChoices(int16[], uint8[], uint8, uint8) broadcast; - setMinigames(uint8[], uint8[]) broadcast; - setBonuses(uint8[], uint8[]) broadcast; - setBoardIndex(uint8) required broadcast ram; -}; - -dclass DistributedPairingGame : DistributedMinigame { - setDeckSeed(uint32) required broadcast ram; - setMaxOpenCards(uint8) broadcast ram; - openCardRequest(int16, int16) airecv clsend; - openCardResult(int16, uint32, int16, int8, int16[]) broadcast; - reportDone() airecv clsend; - setEveryoneDone() broadcast; - setSignaling(uint32) clsend broadcast; -}; - -struct golfData { - int16 frame; - int32/100000 x; - int32/100000 y; - int32/100000 z; -}; - -struct Coord3 { - int32/100000 x; - int32/100000 y; - int32/100000 z; -}; - -struct CommonObjectData { - uint8 id; - uint8 type; - int32/100000 x; - int32/100000 y; - int32/100000 z; - int32/100000 q1; - int32/100000 q2; - int32/100000 q3; - int32/100000 q4; - int32/100000 aVX; - int32/100000 aVY; - int32/100000 aVZ; - int32/100000 lVX; - int32/100000 lVY; - int32/100000 lVZ; -}; - -dclass DistributedPhysicsWorld : DistributedObject { - clientCommonObject(uint8, uint8, Coord3, Coord3, int32/100, int32/100, int32/1000) broadcast ram; - setCommonObjects(CommonObjectData []) broadcast; - upSetCommonObjects(CommonObjectData []) airecv clsend; -}; - -dclass DistributedGolfHole : DistributedPhysicsWorld { - setHoleId(int8) broadcast ram required; - setTimingCycleLength(uint32/1000) broadcast ram required; - setAvatarReadyHole() airecv clsend; - setGolfCourseDoId(uint32) broadcast ram required; - turnDone() airecv clsend; - ballInHole() airecv clsend; - setAvatarTempTee(uint32, uint8) clsend broadcast; - setTempAimHeading(uint32, int32/1000) clsend broadcast; - setAvatarFinalTee(uint32, uint8) broadcast; - setGolferIds(uint32[]) broadcast ram required; - golfersTurn(uint32) broadcast; - golferChooseTee(uint32) broadcast; - setAvatarTee(uint8) airecv clsend; - postSwing(uint32/1000, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) airecv clsend; - postSwingState(uint32/1000, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, uint16/100, CommonObjectData []) airecv clsend; - swing(uint32, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) broadcast; - ballMovie2AI(uint32/1000, uint32, golfData [], golfData [], uint16, uint16, uint16, CommonObjectData []) airecv clsend; - ballMovie2Client(uint32/1000, uint32, golfData [], golfData [], uint16, uint16, uint16, CommonObjectData []) broadcast; - assignRecordSwing(uint32, uint32/1000, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, CommonObjectData []); - setBox(int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) airecv clsend; - sendBox(int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) broadcast; -}; - -dclass DistributedGolfCourse : DistributedObject { - setGolferIds(uint32[]) broadcast ram required; - setCourseId(int8) broadcast ram required; - setAvatarJoined() airecv clsend; - setAvatarReadyCourse() airecv clsend; - setAvatarReadyHole() airecv clsend; - setAvatarExited() airecv clsend; - setCurHoleIndex(int8) broadcast ram required; - setCurHoleDoId(uint32) broadcast ram required; - setDoneReward() airecv clsend; - setReward(uint8[] [], int8[], uint8[] [], uint8[] [], uint8[] [], uint32, uint32/100, uint32/100, uint32/100, uint32/100) broadcast; - setCourseReady(int8, int16[], int8) broadcast; - setHoleStart(int16) broadcast; - setCourseExit() broadcast; - setCourseAbort(uint32) broadcast; - setPlayHole() broadcast; - avExited(uint32) broadcast; - setScores(int16 []) broadcast; - changeDrivePermission(uint32, int8) broadcast; -}; - -dclass DistributedVineGame : DistributedMinigame { - reachedEndVine(int8) clsend airecv; - setNewVine(uint32, int8, uint32/10000, int8) airecv clsend broadcast; - setNewVineT(uint32, uint32/10000, int8) clsend broadcast; - setJumpingFromVine(uint32, int8, int8, int32/100, int16/100, int16/100, int16) clsend broadcast; - claimTreasure(uint32) airecv clsend; - setTreasureGrabbed(uint32, uint32) broadcast; - setScore(uint32, uint32) broadcast; - allAtEndVine() broadcast; - setFallingFromVine(uint32, int8, int8, int32/100, int16/100, int16/100, int16, int8) clsend broadcast; - setFallingFromMidair(uint32, int8, int32/100, int16/100, int16/100, int16, int8) clsend broadcast; - setVineSections(uint8[]) required broadcast ram; -}; - -dclass TTAvatarFriendsManager : AvatarFriendsManager { -}; - -dclass TTPlayerFriendsManager : PlayerFriendsManager { -}; - -dclass DistributedGolfKart : DistributedObject { - setState(string, int16) broadcast ram; - fillSlot0(uint32) broadcast ram; - fillSlot1(uint32) broadcast ram; - fillSlot2(uint32) broadcast ram; - fillSlot3(uint32) broadcast ram; - emptySlot0(uint32, int16) broadcast ram; - emptySlot1(uint32, int16) broadcast ram; - emptySlot2(uint32, int16) broadcast ram; - emptySlot3(uint32, int16) broadcast ram; - requestBoard() airecv clsend; - rejectBoard(uint32); - requestExit() airecv clsend; - setMinigameZone(uint32, uint16); - setGolfZone(uint32, uint16); - setGolfCourse(int8) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - setColor(int16, int16, int16) required broadcast ram; -}; - -dclass DistributedTimer : DistributedObject { - setStartTime(int32) broadcast ram required; -}; - -dclass DistributedPicnicBasket : DistributedObject { - setState(string, uint16, int16) broadcast ram; - fillSlot0(uint32) broadcast ram; - fillSlot1(uint32) broadcast ram; - fillSlot2(uint32) broadcast ram; - fillSlot3(uint32) broadcast ram; - emptySlot0(uint32, int16) broadcast ram; - emptySlot1(uint32, int16) broadcast ram; - emptySlot2(uint32, int16) broadcast ram; - emptySlot3(uint32, int16) broadcast ram; - requestBoard(int16) airecv clsend; - rejectBoard(uint32); - requestExit() airecv clsend; - doneExit() airecv clsend; - setMinigameZone(uint32, uint16); - setPicnicDone(); - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - setTableNumber(int16) required broadcast ram; -}; - -dclass DistributedGameTable : DistributedObject { - requestJoin(uint8) airecv clsend; - rejectJoin(); - requestExit() airecv clsend; - fillSlot0(uint32) broadcast ram; - fillSlot1(uint32) broadcast ram; - fillSlot2(uint32) broadcast ram; - fillSlot3(uint32) broadcast ram; - fillSlot4(uint32) broadcast ram; - fillSlot5(uint32) broadcast ram; - emptySlot0(uint32, int16) broadcast ram; - emptySlot1(uint32, int16) broadcast ram; - emptySlot2(uint32, int16) broadcast ram; - emptySlot3(uint32, int16) broadcast ram; - emptySlot4(uint32, int16) broadcast ram; - emptySlot5(uint32, int16) broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - announceWinner(uint32) broadcast; -}; - -dclass DistributedBossbotBoss : DistributedBossCog { - setState(string) broadcast ram; - setBattleDifficulty(uint8) broadcast ram; - requestGetFood(int8, int8, uint32) airecv clsend; - toonGotFood(uint32, int8, int8, uint32) broadcast; - requestServeFood(int8, int8) airecv clsend; - toonServeFood(uint32, int8, int8) broadcast; - hitBoss(uint8) airecv clsend; - hitToon(uint32) airecv clsend; - ballHitBoss(uint8) airecv clsend; - setBossDamage(uint16, uint8, int16) broadcast ram; - setSpeedDamage(uint16, uint8, int16) broadcast ram; - reachedTable(uint8) airecv clsend; - hitTable(uint8) airecv clsend; - awayFromTable(uint8) airecv clsend; - toonGotHealed(uint32) broadcast; - requestGetToonup(int8, int8, uint32) airecv clsend; - toonGotToonup(uint32, int8, int8, uint32) broadcast; -}; - -dclass DistributedCogKart : DistributedElevatorExt { - setCountryClubId(uint16) required broadcast ram; - setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; - setCountryClubInteriorZone(uint32); - setCountryClubInteriorZoneForce(uint32); -}; - -dclass DistributedCountryClub : DistributedObject { - setZoneId(uint32) required broadcast ram; - setBlockedRooms(uint8[]) required broadcast ram; - setCountryClubId(uint16) required broadcast ram; - setLayoutIndex(uint16) required broadcast ram; - setFloorNum(uint8) required broadcast ram; - setRoomDoIds(uint32[]) broadcast ram; - setCountryClubZone(uint32) broadcast ram; - elevatorAlert(uint32) broadcast ram; -}; - -dclass DistributedCountryClubRoom : DistributedLevel { - setCountryClubId(uint16) required broadcast ram; - setRoomId(uint16) required broadcast ram; - setRoomNum(uint8) required broadcast ram; - setSuits(uint32[], uint32[]) broadcast ram; - setBossConfronted(uint32) broadcast ram; - setDefeated() broadcast ram; - forceOuch(uint8) broadcast; -}; - -dclass DistributedMoleField : DistributedEntity { - setGameStart(int16, uint8, uint16) broadcast; - setClientTriggered() airecv clsend; - whackedMole(int8, int16) airecv clsend; - whackedBomb(int8, int16, int32) airecv clsend; - updateMole(int8, int8) broadcast; - reportToonHitByBomb(uint32, int8, int32) broadcast; - setScore(int16) required broadcast ram; - damageMe() airecv clsend; - setPityWin() broadcast; -}; - -dclass DistributedCountryClubBattle : DistributedLevelBattle { -}; - -dclass DistributedClubElevator : DistributedElevatorFSM { - setFloor(int8) broadcast ram; - setLocked(uint16) required broadcast ram; - setEntering(uint16) required broadcast ram; - kickToonsOut() broadcast; - setLatch(uint32) required broadcast ram; -}; - -dclass DistributedMaze : DistributedEntity { - setRoomDoId(uint32) required broadcast ram; - setGameStart(int16) broadcast; - setClientTriggered() airecv clsend; - setFinishedMaze() airecv clsend; - setGameOver() broadcast; - toonFinished(uint32, uint8, uint8) broadcast; - damageMe() airecv clsend; -}; - -dclass DistributedBattleWaiters : DistributedBattleFinal { -}; - -dclass DistributedFoodBelt : DistributedObject { - setBossCogId(uint32) required broadcast ram; - setIndex(uint8) required broadcast ram; - setState(char) broadcast ram; -}; - -dclass DistributedBanquetTable : DistributedObject { - setIndex(uint8) required broadcast ram; - setNumDiners(uint8) required broadcast ram; - setBossCogId(uint32) required broadcast ram; - setDinerInfo(uint8[], uint8[], uint8[]) required broadcast ram; - setState(char, uint32, int8) broadcast ram; - setDinerStatus(uint8, uint8) broadcast; - requestControl() airecv clsend; - requestFree(int8) airecv clsend; - setPitcherPos(uint8, uint16%360/100, int16) broadcast clsend; - clearSmoothing(int8) broadcast clsend; - firingWater(int32/100, int32/100, int32/100, int32/100, int32/100, int32/100) broadcast clsend; - waterHitBoss(uint8) broadcast clsend; -}; - -dclass DistributedBattleDiners : DistributedBattleFinal { -}; - -dclass DistributedGolfSpot : DistributedObject { - setIndex(uint8) required broadcast ram; - setBossCogId(uint32) required broadcast ram; - setState(char, uint32, int8) broadcast ram; - setGoingToReward() broadcast ram; - requestControl() airecv clsend; - requestFree(int8) airecv clsend; - setGolfSpotPos(uint8, uint16%360/100, int16) broadcast clsend; - clearSmoothing(int8) broadcast clsend; - setSwingInfo(uint8, int16/10, uint8) broadcast clsend; -}; - -struct TireInput { - int32/100 force; - int32/100 heading; -}; - -dclass DistributedIceGame : DistributedMinigame { - setForceArrowInfo(uint32, int32/100, int32/100) broadcast clsend; - setAvatarChoice(int32/100, int32/100) airecv clsend; - endingPositions(Coord3 []) airecv clsend; - reportScoringMovieDone() airecv clsend; - claimTreasure(uint8) airecv clsend; - claimPenalty(uint8) airecv clsend; - setTireInputs(TireInput []) broadcast; - setTimerStartTime(int16) broadcast; - setFinalPositions(Coord3 []) broadcast; - setMatchAndRound(int8, int8) broadcast; - setScores(int8, int8, int16[]) broadcast; - setNewState(string) broadcast; - setTreasureGrabbed(uint32, uint32) broadcast; - setPenaltyGrabbed(uint32, uint32) broadcast; -}; - -dclass DistributedCogThiefGame : DistributedMinigame { - throwingPie(uint32, int32, int32/100, int32/100, int32/100, int32/100) clsend broadcast; - hitBySuit(uint32, int32, int8, int32/100, int32/100, int32/100) clsend broadcast airecv; - pieHitSuit(uint32, int32, int8, int32/100, int32/100, int32/100) clsend broadcast airecv; - cogHitBarrel(int32, int8, int8, int32/100, int32/100, int32/100) clsend airecv; - cogAtReturnPos(int32, int8, int8) clsend airecv; - updateSuitGoal(int32, int32, int8, int8, int64, int32/100, int32/100, int32/100) broadcast; - makeCogCarryBarrel(int32, int32, int8, int8, int32/100, int32/100, int32/100) broadcast; - makeCogDropBarrel(int32, int32, int8, int8, int32/100, int32/100, int32/100) broadcast; - markBarrelStolen(int32, int32, int8) broadcast; -}; - -struct twoDTreasureInfo { - uint8 treasureIndex; - uint8 treasureValue; -}; - -struct twoDSectionInfo { - uint8 sectionIndex; - uint8 enemyIndicesSelected[]; - twoDTreasureInfo treasureIndicesSelected[]; - uint8 spawnPointIndicesSelected[]; - uint8 stomperIndicesSelected[]; -}; - -dclass DistributedTwoDGame : DistributedMinigame { - showShootGun(uint32, int16) clsend broadcast; - toonHitByEnemy(uint32, int16) clsend broadcast airecv; - toonFellDown(uint32, int16) clsend broadcast airecv; - toonSquished(uint32, int16) clsend broadcast airecv; - toonVictory(uint32, int16) clsend broadcast airecv; - claimTreasure(uint8, uint8) airecv clsend; - claimEnemyShot(uint8, uint8) airecv clsend; - reportDone() airecv clsend; - setSectionsSelected(twoDSectionInfo []) required broadcast ram; - setTreasureGrabbed(uint32, uint8, uint8) broadcast; - setEnemyShot(uint32, uint8, uint8, uint32) broadcast; - addVictoryScore(uint32, uint8) broadcast; - setEveryoneDone() broadcast; -}; - -dclass DistributedChineseCheckers : DistributedNode { - requestExit() clsend airecv; - requestBegin() clsend airecv; - requestMove(uint8 []) clsend airecv; - requestTimer() clsend airecv; - requestSeatPositions() clsend airecv; - startBeginTimer(uint16, int16) broadcast ram; - gameStart(uint8) broadcast; - setTableDoId(uint32) required broadcast ram; - setGameState(uint8 [], uint8 []) required broadcast ram; - setTimer(int16) broadcast ram required; - setTurnTimer(int16) broadcast ram required; - sendTurn(uint8) broadcast ram; - requestWin() clsend airecv; - announceWin(uint32) broadcast; - announceSeatPositions(uint8 []) broadcast; -}; - -dclass DistributedCheckers : DistributedNode { - requestExit() clsend airecv; - requestBegin() clsend airecv; - requestTimer() clsend airecv; - requestMove(uint8 []) clsend airecv; - startBeginTimer(uint16, int16) broadcast ram; - gameStart(uint8) broadcast; - setTableDoId(uint32) required broadcast ram; - setGameState(uint8 [], uint8 []) required broadcast ram; - setTimer(int16) broadcast ram required; - setTurnTimer(int16) broadcast ram required; - sendTurn(uint8) broadcast ram; - requestWin() clsend airecv; - announceWin(uint32) broadcast; - illegalMove() broadcast; -}; - -dclass DistributedFindFour : DistributedNode { - requestExit() clsend airecv; - requestBegin() clsend airecv; - requestMove(uint8) clsend airecv; - requestTimer() clsend airecv; - requestWin(uint8 []) clsend airecv; - startBeginTimer(uint16, int16) broadcast ram; - setTableDoId(uint32) required broadcast ram; - setGameState(uint8 [][], uint8, uint8, uint8) required broadcast ram; - setTimer(int16) broadcast ram required; - setTurnTimer(int16) broadcast ram required; - gameStart(uint8) broadcast; - sendTurn(uint8) broadcast ram; - announceWin(uint32) broadcast; - announceWinLocation(uint8, uint8, uint8, uint8) broadcast; - announceWinnerPosition(uint8, uint8, uint8, uint8) broadcast; - illegalMove() broadcast; - tie() broadcast; -}; - -dclass DistributedMailManager : DistributedObject { - sendSimpleMail(uint32, uint32, string); - setNumMailItems(uint32, uint32) airecv; -}; - -dclass DistributedPartyManager : DistributedObject { - addParty(uint32, uint32, string, string, int8, int8, activity [], decoration [], uint32[], uint16); - addPartyRequest(uint32, char [0-256], char [0-256], int8, int8, activity [], decoration [], uint32[]) airecv clsend; - addPartyResponse(uint32, int8); - addPartyResponseUdToAi(uint64, int8, party) airecv; - - markInviteAsReadButNotReplied(uint32, uint64); - respondToInvite(uint32, uint32, uint16, uint64, uint8); - respondToInviteResponse(uint32, uint16, uint64, int8, uint8) airecv; - - changePrivateRequest(uint64, int8) airecv clsend; - changePrivateRequestAiToUd(uint32, uint64, int8); - changePrivateResponseUdToAi(uint32, uint64, int8, int8) airecv; - changePrivateResponse(uint64, int8, int8); - - changePartyStatusRequest(uint64, int8) airecv clsend; - changePartyStatusRequestAiToUd(uint32, uint64, int8); - changePartyStatusResponseUdToAi(uint32, uint64, int8, int8) airecv; - changePartyStatusResponse(uint64, int8, int8, uint16); - - partyInfoOfHostRequestAiToUd(uint32, uint32); - partyInfoOfHostFailedResponseUdToAi(uint32) airecv; - partyInfoOfHostResponseUdToAi(party, uint32[]) airecv; - - givePartyRefundResponse(uint32, uint64, int8, uint16, uint32); - getPartyZone(uint32, uint32, uint8) clsend airecv; - receivePartyZone(uint32, uint64, uint32); - freeZoneIdFromPlannedParty(uint32, uint32) clsend airecv; - - sendAvToPlayground(uint32, uint8); - exitParty(uint32) clsend airecv; - removeGuest(uint32, uint32) airecv clsend; - partyManagerAIStartingUp(uint32, uint32); - partyManagerAIGoingDown(uint32, uint32); - partyHasStartedAiToUd(uint64 partyId, uint32 shardId, uint32 zoneId, string hostName); - toonHasEnteredPartyAiToUd(uint32); - toonHasExitedPartyAiToUd(uint32); - partyHasFinishedUdToAllAi(uint64 partyId) airecv; - updateToPublicPartyInfoUdToAllAi(uint32 shardId, uint32 zoneId, uint64 partyId, uint32 hostId, uint8 numGuests, uint8 maxGuests, string hostName, uint8 activities[], uint8 minLeft) airecv; - updateToPublicPartyCountUdToAllAi(uint32 partyCount, uint64 partyId) airecv; - requestShardIdZoneIdForHostId(uint32) clsend airecv; - sendShardIdZoneIdToAvatar(uint32, uint32); - partyManagerUdStartingUp() airecv; - partyManagerUdLost() airecv; - updateAllPartyInfoToUd(uint32, uint64, uint32, uint32, uint8, uint8, string, uint8 [], uint64); - forceCheckStart(); - requestMw(uint32, string, uint32, uint32); - mwResponseUdToAllAi(uint32, string, uint32, uint32) airecv; - receiveId(uint64 ids[]) airecv; -}; - -dclass DistributedObjectGlobal : DistributedObject { -}; - -dclass GlobalPartyManager : DistributedObjectGlobal { - partyManagerAIHello(uint32 channel); - queryParty(uint32 hostId); - addParty(DoId avId, uint64 partyId, string start, string end, int8 isPrivate, - int8 inviteTheme, activity [], decoration [], DoIdList inviteeIds); - partyHasStarted(uint64 partyId, uint32 shardId, uint32 zoneId, string hostName); - toonJoinedParty(uint64 partyId, uint32 avId); - toonLeftParty(uint64 partyId, uint32 avId); - requestPartySlot(uint64 partyId, uint32 avId, uint32 gateId); - partyDone(uint64 partyId); - allocIds(uint16 count); -}; - -struct PotentialToon { - uint32 avNum; - string avName; - string avDNA; - uint8 avPosition; - uint8 aname; -}; - -dclass ClientServicesManager : DistributedObjectGlobal { - login(string cookie, char auth [0-256]) clsend; - acceptLogin(uint32 timestamp); - - requestAvatars() clsend; - setAvatars(PotentialToon[]); - - createAvatar(blob dna, uint8 index) clsend; - createAvatarResp(uint32 avId); - - setNameTyped(uint32 avId, string name) clsend; - setNameTypedResp(uint32 avId, uint8 status); - setNamePattern(uint32 avId, int16 p1, uint8 f1, int16 p2, uint8 f2, int16 p3, uint8 f3, int16 p4, uint8 f4) clsend; - setNamePatternResp(uint32 avId, uint8 status); - - acknowledgeAvatarName(uint32 avId) clsend; - acknowledgeAvatarNameResp(); - - deleteAvatar(uint32 avId) clsend; - - chooseAvatar(uint32 avId) clsend; - - systemMessage(string message); -}; - -dclass AwardManager : DistributedObjectGlobal { - giveAwardToToon(uint32, DoId, string, DoId, uint32, uint32); -}; - -dclass DistributedCpuInfoMgr : DistributedObjectGlobal { - setCpuInfoToUd(uint32, uint32, string, string); -}; - -dclass NonRepeatableRandomSourceClient { - getRandomSamplesReply(uint32, uint32 []) airecv; -}; - -dclass TTCodeRedemptionMgr : DistributedObject, NonRepeatableRandomSourceClient { - redeemCode(uint32, char [0-256]) airecv clsend; - redeemCodeResult(uint32, uint32, uint32); -}; - -dclass NonRepeatableRandomSource : DistributedObject, NonRepeatableRandomSourceClient { - getRandomSamples(DoId, string, uint32, uint32); - randomSample(DoId, uint32); - randomSampleAck() airecv; -}; - -dclass DistributedInGameNewsMgr : DistributedObjectGlobal { - setLatestIssueStr(string) required broadcast ram; - inGameNewsMgrAIStartingUp(uint32, uint32); - newIssueUDtoAI(string) airecv; -}; - -struct Friend -{ -uint32 doId; -string name; -blob dna; -uint32 petId; -}; - -dclass TTUFriendsManager : DistributedObjectGlobal { - removeFriend(uint32) clsend; - requestAvatarInfo(uint32[]) clsend; - - requestFriendsList() clsend; - - friendInfo(Friend); - friendList(Friend []); - - friendOnline(uint32, uint8, uint8); - friendOffline(uint32); - - goingOffline(uint32 avId); - - getAvatarDetails(uint32) clsend; - friendDetails(uint32, blob, uint16[], uint16, int16, int16, uint32, uint32, blob, blob, int8[]); - - routeTeleportQuery(uint32 toId) clsend; - teleportQuery(uint32 fromId); - - teleportResponse(uint32 fromId, uint8 tpAvailable, uint32 defaultShard, uint32 hoodId, uint32 zoneId) clsend; - setTeleportResponse(uint32 toId, uint8 tpAvailable, uint32 defaultShard, uint32 hoodId, uint32 zoneId); - - whisperSCTo(uint32 toId, uint16 msgIndex) clsend; - setWhisperSCFrom(uint32 fromId, uint16 msgIndex); - - whisperSCCustomTo(uint32 toId, uint16 msgIndex) clsend; - setWhisperSCCustomFrom(uint32 fromId, uint16 msgIndex); - - whisperSCEmoteTo(uint32 toId, uint16 emoteId) clsend; - setWhisperSCEmoteFrom(uint32 fromId, uint16 emoteId); - - requestSecret() clsend; - requestSecretResponse(int8 status, string secret); - - submitSecret(string(0-256) secret) clsend; - submitSecretResponse(int8 status, int32 avId); - - sendTalkWhisper(uint32 toId, string message) clsend; - receiveTalkWhisper(uint32 fromId, string message); - - battleSOS(uint32 toId) clsend; - setBattleSOS(uint32 fromId); - - teleportGiveup(uint32 toId) clsend; - setTeleportGiveup(uint32 fromId); - - whisperSCToontaskTo(uint32, uint32, uint32, uint32, uint8) clsend; - setWhisperSCToontaskFrom(uint32, uint32, uint32, uint32, uint8); - - sleepAutoReply(uint32 toId) clsend; - setSleepAutoReply(uint32 fromId); -}; - - -dclass DistributedPhaseEventMgr : DistributedObject { - setNumPhases(uint8) required broadcast ram; - setDates(datetime []) broadcast required; - setCurPhase(int8) required broadcast ram; - setIsRunning(bool) required broadcast ram; -}; - -dclass DistributedHydrantZeroMgr : DistributedPhaseEventMgr { -}; - -dclass DistributedMailboxZeroMgr : DistributedPhaseEventMgr { -}; - -dclass DistributedTrashcanZeroMgr : DistributedPhaseEventMgr { -}; - -dclass DistributedSillyMeterMgr : DistributedPhaseEventMgr { -}; +from direct.distributed import DistributedObjectGlobal +from toontown.ai import WelcomeValleyManager/AI +from toontown.building import DistributedAnimatedProp/AI +from toontown.toon import DistributedToon/AI/UD +from toontown.classicchars import DistributedCCharBase/AI +from toontown.classicchars import DistributedMickey/AI +from toontown.classicchars import DistributedVampireMickey/AI +from toontown.classicchars import DistributedMinnie/AI +from toontown.classicchars import DistributedWitchMinnie/AI +from toontown.classicchars import DistributedGoofy/AI +from toontown.classicchars import DistributedSuperGoofy/AI +from toontown.classicchars import DistributedDaisy/AI +from toontown.classicchars import DistributedSockHopDaisy/AI +from toontown.classicchars import DistributedChip/AI +from toontown.classicchars import DistributedPoliceChip/AI +from toontown.classicchars import DistributedDale/AI +from toontown.classicchars import DistributedJailbirdDale/AI +from toontown.classicchars import DistributedGoofySpeedway/AI +from toontown.classicchars import DistributedDonald/AI +from toontown.classicchars import DistributedFrankenDonald/AI +from toontown.classicchars import DistributedDonaldDock/AI +from toontown.classicchars import DistributedPluto/AI +from toontown.classicchars import DistributedWesternPluto/AI +from toontown.safezone import DistributedTrolley/AI +from toontown.safezone import DistributedPartyGate/AI +from toontown.suit import DistributedSuitPlanner/AI +from toontown.suit import DistributedSuitBase/AI +from toontown.suit import DistributedSuit/AI +from toontown.suit import DistributedTutorialSuit/AI +from toontown.suit import DistributedFactorySuit/AI +from toontown.suit import DistributedMintSuit/AI +from toontown.suit import DistributedStageSuit/AI +from toontown.suit import DistributedSellbotBoss/AI +from toontown.suit import DistributedCashbotBoss/AI +from toontown.coghq import DistributedCashbotBossSafe/AI +from toontown.coghq import DistributedCashbotBossCrane/AI +from toontown.suit import DistributedCashbotBossGoon/AI +from toontown.battle import DistributedBattleBase/AI +from toontown.battle import DistributedBattle/AI +from toontown.battle import DistributedBattleBldg/AI +from toontown.tutorial import DistributedBattleTutorial/AI +from toontown.coghq import DistributedBattleFactory/AI +from toontown.battle import DistributedBattleFinal/AI +from toontown.safezone import DistributedBoat/AI +from toontown.safezone import DistributedButterfly/AI +from toontown.safezone import DistributedMMPiano/AI +from toontown.safezone import DistributedDGFlower/AI +from toontown.fishing import DistributedFishingPond/AI +from toontown.fishing import DistributedFishingTarget/AI +from toontown.fishing import DistributedPondBingoManager/AI +from toontown.safezone import DistributedFishingSpot/AI +from toontown.estate import DistributedCannon/AI +from toontown.estate import DistributedTarget/AI +from toontown.minigame import DistributedMinigame/AI +from toontown.minigame import DistributedMinigameTemplate/AI +from toontown.minigame import DistributedRaceGame/AI +from toontown.minigame import DistributedCannonGame/AI +from toontown.minigame import DistributedPhotoGame/AI +from toontown.minigame import DistributedPatternGame/AI +from toontown.minigame import DistributedRingGame/AI +from toontown.minigame import DistributedTagGame/AI +from toontown.minigame import DistributedMazeGame/AI +from toontown.minigame import DistributedTugOfWarGame/AI +from toontown.minigame import DistributedCatchGame/AI +from toontown.minigame import DistributedDivingGame/AI +from toontown.minigame import DistributedTargetGame/AI +from toontown.estate import EstateManager/AI +from toontown.estate import DistributedEstate/AI +from toontown.estate import DistributedHouse/AI +from toontown.estate import DistributedHouseInterior/AI +from toontown.estate import DistributedGarden/AI +from toontown.shtiker import DeleteManager/AI +from toontown.ai import NewsManager/AI +from toontown.shtiker import PurchaseManager/AI +from toontown.shtiker import NewbiePurchaseManager/AI +from toontown.safezone import SafeZoneManager/AI +from toontown.tutorial import TutorialManager/AI +from toontown.catalog import CatalogManager/AI +from toontown.safezone import DistributedTreasure/AI +from toontown.coghq import DistributedCashbotBossTreasure/AI +from toontown.building import DistributedTrophyMgr/AI +from toontown.building import DistributedBuilding/AI +from toontown.building import DistributedAnimBuilding/AI +from toontown.building import DistributedBuildingQueryMgr/AI +from toontown.building import DistributedToonInterior/AI +from toontown.building import DistributedToonHallInterior/AI +from toontown.building import DistributedSuitInterior/AI +from toontown.building import DistributedHQInterior/AI +from toontown.building import DistributedGagshopInterior/AI +from toontown.building import DistributedPetshopInterior/AI +from toontown.building import DistributedKartShopInterior/AI +from toontown.building import DistributedBankInterior/AI +from toontown.building import DistributedBankCollectable/AI +from toontown.building import DistributedLibraryInterior/AI +from toontown.building import DistributedDoor/AI +from toontown.building import DistributedAnimDoor/AI +from toontown.estate import DistributedHouseDoor/AI +from toontown.coghq import DistributedCogHQDoor/AI +from toontown.coghq import DistributedSellbotHQDoor/AI +from toontown.toon import DistributedNPCToonBase/AI +from toontown.toon import DistributedNPCToon/AI +from toontown.toon import DistributedSmartNPC/AI +from toontown.toon import DistributedSmartNPC/AI +from toontown.toon import DistributedNPCSpecialQuestGiver/AI +from toontown.toon import DistributedNPCFlippyInToonHall/AI +from toontown.toon import DistributedNPCScientist/AI +from toontown.toon import DistributedNPCClerk/AI +from toontown.toon import DistributedNPCTailor/AI +from toontown.toon import DistributedNPCBlocker/AI +from toontown.toon import DistributedNPCFisherman/AI +from toontown.toon import DistributedNPCPartyPerson/AI +from toontown.toon import DistributedNPCPetclerk/AI +from toontown.toon import DistributedNPCKartClerk/AI +from toontown.toon import DistributedNPCYin/AI +from toontown.toon import DistributedNPCYang/AI +from toontown.building import DistributedKnockKnockDoor/AI +from toontown.building import DistributedElevator/AI +from toontown.building import DistributedElevatorFSM/AI +from toontown.building import DistributedElevatorExt/AI +from toontown.building import DistributedElevatorInt/AI +from toontown.coghq import DistributedFactoryElevatorExt/AI +from toontown.coghq import DistributedMintElevatorExt/AI +from toontown.coghq import DistributedLawOfficeElevatorExt/AI +from toontown.coghq import DistributedLawOfficeElevatorInt/AI +from toontown.building import DistributedElevatorFloor/AI +from toontown.building import DistributedBossElevator/AI +from toontown.building import DistributedVPElevator/AI +from toontown.building import DistributedCFOElevator/AI +from toontown.building import DistributedCJElevator/AI +from toontown.building import DistributedBBElevator/AI +from toontown.building import DistributedBoardingParty/AI +from toontown.building import DistributedTutorialInterior/AI +from toontown.estate import DistributedBankMgr/AI +from toontown.estate import DistributedMailbox/AI +from toontown.estate import DistributedFurnitureManager/AI +from toontown.estate import DistributedFurnitureItem/AI +from toontown.estate import DistributedBank/AI +from toontown.toon import DistributedNPCBanker/AI +from toontown.estate import DistributedCloset/AI +from toontown.estate import DistributedTrunk/AI +from toontown.estate import DistributedPhone/AI +from toontown.effects import DistributedFireworkShow/AI +from toontown.estate import DistributedFireworksCannon/AI +from toontown.coghq import LobbyManager/AI +from otp.level import DistributedLevel/AI +from otp.level import DistributedEntity/AI +from otp.level import DistributedInteractiveEntity/AI +from toontown.coghq import DistributedMegaCorp/AI +from toontown.coghq import DistributedFactory/AI +from toontown.coghq import DistributedLawOffice/AI +from toontown.coghq import DistributedLawOfficeFloor/AI +from toontown.coghq import DistributedLift/AI +from toontown.coghq import DistributedDoorEntity/AI +from toontown.coghq import DistributedSwitch/AI +from toontown.coghq import DistributedButton/AI +from toontown.coghq import DistributedTrigger/AI +from toontown.coghq import DistributedCrushableEntity/AI +from toontown.coghq import DistributedCrusherEntity/AI +from toontown.coghq import DistributedStomper/AI +from toontown.coghq import DistributedStomperPair/AI +from toontown.coghq import DistributedLaserField/AI +from toontown.coghq import DistributedGolfGreenGame/AI +from toontown.coghq import DistributedSecurityCamera/AI +from toontown.coghq import DistributedMover/AI +from toontown.coghq import DistributedElevatorMarker/AI +from toontown.coghq import DistributedBarrelBase/AI +from toontown.coghq import DistributedGagBarrel/AI +from toontown.coghq import DistributedBeanBarrel/AI +from toontown.coghq import DistributedHealBarrel/AI +from toontown.coghq import DistributedGrid/AI +from toontown.coghq import ActiveCell/AI +from toontown.coghq import DirectionalCell/AI +from toontown.coghq import CrusherCell/AI +from toontown.coghq import DistributedCrate/AI +from toontown.coghq import DistributedSinkingPlatform/AI +from toontown.suit import DistributedGoon/AI +from toontown.suit import DistributedGridGoon/AI +from toontown.coghq import BattleBlocker/AI +from toontown.ai import DistributedAprilToonsMgr/AI +from toontown.ai import DistributedBlackCatMgr/AI +from toontown.ai import DistributedPolarBearMgr/AI +from toontown.ai import DistributedPolarPlaceEffectMgr/AI +from toontown.ai import DistributedGreenToonEffectMgr/AI +from toontown.ai import DistributedResistanceEmoteMgr/AI +from toontown.ai import DistributedScavengerHuntTarget/AI +from toontown.ai import DistributedTrickOrTreatTarget/AI +from toontown.ai import DistributedWinterCarolingTarget/AI +from toontown.coghq import DistributedMint/AI +from toontown.coghq import DistributedMintRoom/AI +from toontown.coghq import DistributedMintBattle/AI +from toontown.coghq import DistributedStage/AI +from toontown.coghq import DistributedStageRoom/AI +from toontown.coghq import DistributedStageBattle/AI +from toontown.pets.PetDCImports/AI import * +from toontown.pets import DistributedPetProxy/AI +from toontown.coghq.InGameEditorDCImports/AI import * +from toontown.distributed import ToontownDistrict/AI +from toontown.distributed import ToontownDistrictStats/AI +from toontown.racing import DistributedVehicle/AI +from toontown.racing import DistributedStartingBlock/AI +from toontown.racing import DistributedRace/AI +from toontown.racing import DistributedKartPad/AI +from toontown.racing import DistributedRacePad/AI +from toontown.racing import DistributedViewPad/AI +from toontown.racing import DistributedStartingBlock/AI +from toontown.racing import DistributedLeaderBoard/AI +from toontown.racing import DistributedGag/AI +from toontown.racing import DistributedProjectile/AI +from toontown.racing.DistributedStartingBlock/AI import DistributedViewingBlock/AI +from toontown.uberdog.ClientServicesManager/UD import ClientServicesManager/UD +from toontown.uberdog.DistributedDeliveryManager/AI/UD import DistributedDeliveryManager/AI/UD +from toontown.uberdog.DistributedDataStoreManager/AI/UD import DistributedDataStoreManager/AI/UD +from toontown.suit import DistributedLawbotBoss/AI +from toontown.coghq import DistributedLawbotBossGavel/AI +from toontown.suit import DistributedLawbotBossSuit/AI +from toontown.coghq import DistributedLawbotCannon/AI +from toontown.coghq import DistributedLawbotChair/AI +from toontown.estate import DistributedLawnDecor/AI +from toontown.estate import DistributedGardenPlot/AI +from toontown.estate import DistributedGardenBox/AI +from toontown.estate import DistributedFlower/AI +from toontown.estate import DistributedGagTree/AI +from toontown.estate import DistributedStatuary/AI +from toontown.estate import DistributedToonStatuary/AI +from toontown.estate import DistributedChangingStatuary/AI +from toontown.estate import DistributedAnimatedStatuary/AI +from toontown.estate import DistributedPlantBase/AI +from toontown.estate import DistributedLawnDecor/AI +from toontown.minigame import DistributedTravelGame/AI +from toontown.minigame import DistributedPairingGame/AI +from toontown.minigame import DistributedVineGame/AI +from toontown.golf import DistributedPhysicsWorld/AI +from toontown.golf import DistributedGolfHole/AI +from toontown.golf import DistributedGolfCourse/AI +from toontown.parties import DistributedParty/AI +from toontown.parties import DistributedPartyActivity/AI +from toontown.parties import DistributedPartyTeamActivity/AI +from toontown.parties import DistributedPartyCannon/AI +from toontown.parties import DistributedPartyCannonActivity/AI +from toontown.parties import DistributedPartyCatchActivity/AI +from toontown.parties import DistributedPartyWinterCatchActivity/AI +from toontown.parties import DistributedPartyCogActivity/AI +from toontown.parties import DistributedPartyWinterCogActivity/AI +from toontown.parties import DistributedPartyFireworksActivity/AI +from toontown.parties import DistributedPartyDanceActivityBase/AI +from toontown.parties import DistributedPartyDanceActivity/AI +from toontown.parties import DistributedPartyDance20Activity/AI +from toontown.parties import DistributedPartyValentineDanceActivity/AI +from toontown.parties import DistributedPartyValentineDance20Activity/AI +from toontown.parties import DistributedPartyTrampolineActivity/AI +from toontown.parties import DistributedPartyValentineTrampolineActivity/AI +from toontown.parties import DistributedPartyVictoryTrampolineActivity/AI +from toontown.parties import DistributedPartyWinterTrampolineActivity/AI +from toontown.parties import DistributedPartyTugOfWarActivity/AI +from toontown.parties import DistributedPartyJukeboxActivityBase/AI +from toontown.parties import DistributedPartyJukeboxActivity/AI +from toontown.parties import DistributedPartyJukebox40Activity/AI +from toontown.parties import DistributedPartyValentineJukeboxActivity/AI +from toontown.parties import DistributedPartyValentineJukebox40Activity/AI +from toontown.friends import TTPlayerFriendsManager/UD +from toontown.friends import TTUFriendsManager/UD +from toontown.safezone import DistributedGolfKart/AI +from toontown.safezone import DistributedPicnicBasket/AI +from toontown.safezone import DistributedGameTable/AI +from toontown.distributed import DistributedTimer/AI +from toontown.suit import DistributedBossbotBoss/AI +from toontown.coghq import DistributedCogKart/AI +from toontown.coghq import DistributedCountryClub/AI +from toontown.coghq import DistributedCountryClubRoom/AI +from toontown.coghq import DistributedMoleField/AI +from toontown.coghq import DistributedCountryClubBattle/AI +from toontown.building import DistributedClubElevator/AI +from toontown.coghq import DistributedMaze/AI +from toontown.battle import DistributedBattleWaiters/AI +from toontown.coghq import DistributedFoodBelt/AI +from toontown.coghq import DistributedBanquetTable/AI +from toontown.battle import DistributedBattleDiners/AI +from toontown.coghq import DistributedGolfSpot/AI +from toontown.minigame import DistributedIceGame/AI +from toontown.minigame import DistributedCogThiefGame/AI +from toontown.minigame import DistributedTwoDGame/AI +from toontown.safezone import DistributedChineseCheckers/AI +from toontown.safezone import DistributedCheckers/AI +from toontown.safezone import DistributedFindFour/AI +from toontown.uberdog.DistributedMailManager/AI/UD import DistributedMailManager/AI/UD +from toontown.uberdog.DistributedPartyManager/AI/UD import DistributedPartyManager/AI/UD +from toontown.rpc.AwardManager/UD import AwardManager/UD +from toontown.uberdog.DistributedCpuInfoMgr/AI/UD import DistributedCpuInfoMgr/AI/UD +from toontown.uberdog.DistributedInGameNewsMgr/AI/UD import DistributedInGameNewsMgr/AI/UD +from toontown.coderedemption.TTCodeRedemptionMgr/AI import TTCodeRedemptionMgr/AI +from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI +from toontown.distributed.NonRepeatableRandomSourceUD import NonRepeatableRandomSourceUD +from toontown.ai.DistributedPhaseEventMgr/AI import DistributedPhaseEventMgr/AI +from toontown.ai.DistributedHydrantZeroMgr/AI import DistributedHydrantZeroMgr/AI +from toontown.ai.DistributedMailboxZeroMgr/AI import DistributedMailboxZeroMgr/AI +from toontown.ai.DistributedTrashcanZeroMgr/AI import DistributedTrashcanZeroMgr/AI +from toontown.ai import DistributedSillyMeterMgr/AI +from toontown.cogdominium import DistributedCogdoInterior/AI +from toontown.cogdominium import DistributedCogdoBattleBldg/AI +from toontown.cogdominium import DistributedCogdoElevatorExt/AI +from toontown.cogdominium import DistributedCogdoElevatorInt/AI +from toontown.cogdominium import DistributedCogdoBarrel/AI +from toontown.cogdominium import DistCogdoGame/AI +from toontown.cogdominium import DistCogdoLevelGame/AI +from toontown.cogdominium import DistCogdoBoardroomGame/AI +from toontown.cogdominium import DistCogdoCraneGame/AI +from toontown.cogdominium import DistCogdoMazeGame/AI +from toontown.cogdominium import DistCogdoFlyingGame/AI +from toontown.cogdominium import DistCogdoCrane/AI +from toontown.cogdominium import DistCogdoCraneMoneyBag/AI +from toontown.cogdominium import DistCogdoCraneCog/AI +from toontown.parties.GlobalPartyManager/AI/UD import GlobalPartyManager/AI/UD + +struct GiftItem { + blob Item; + string giftTag; +}; + +struct gardenSpecial { + uint8 index; + uint8 count; +}; + +struct simpleMail { + uint64 msgId; + uint32 senderId; + uint16 year; + uint8 month; + uint8 day; + string body; +}; + +struct invite { + uint64 inviteKey; + uint64 partyId; + uint8 status; +}; + +struct decoration { + uint8 decorId; + uint8 x; + uint8 y; + uint8 h; +}; + +struct activity { + uint8 activityId; + uint8 x; + uint8 y; + uint8 h; +}; + +struct party { + uint64 partyId; + uint32 hostId; + uint16 startYear; + uint8 startMonth; + uint8 startDay; + uint8 startHour; + uint8 startMinute; + uint16 endYear; + uint8 endMonth; + uint8 endDay; + uint8 endHour; + uint8 endMinute; + uint8 isPrivate; + uint8 inviteTheme; + activity activities[]; + decoration decors[]; + uint8 status; +}; + +struct partyReply { + uint32 inviteeId; + uint8 status; +}; + +struct repliesForOneParty { + uint64 partyId; + partyReply partyReplies[]; +}; + +struct publicPartyInfo { + uint32 shardId; + uint32 zoneId; + uint8 numberOfGuests; + string hostName; + uint8[] activityIds; + uint16 minLeft; +}; + +struct jukeboxSongInfo { + uint8/10 phase; + string fileName; +}; + +struct partyCloudColor { + uint16 cloudNumber; + uint8/100 r; + uint8/100 g; + uint8/100 b; +}; + +struct datetime { + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minutes; + uint8 seconds; +}; + +dclass ToontownDistrict : DistributedDistrict { + setParentingRules(string, string) broadcast ram; + allowAHNNLog(bool) broadcast required ram; +}; + +dclass ToontownDistrictStats : DistributedObject { + settoontownDistrictId(uint32) broadcast required ram; + setAvatarCount(uint32) broadcast required ram; + setNewAvatarCount(uint32) broadcast required ram; + setInvasionStatus(uint8) broadcast required ram; + setStats : setAvatarCount, setNewAvatarCount; +}; + +dclass WelcomeValleyManager : DistributedObject { + clientSetZone(uint32) airecv clsend; + requestZoneIdMessage(uint32, uint16) airecv clsend; + requestZoneIdResponse(uint32, uint16); +}; + +dclass DistributedAnimatedProp : DistributedObject { + setPropId(uint16) required broadcast ram; + setAvatarInteract(uint32) required broadcast ram; + requestInteract() airecv clsend; + rejectInteract(); + requestExit() airecv clsend; + avatarExit(uint32) broadcast; + setState(string, int16) required broadcast ram; +}; + +typedef int16 pair16[2]; + +dclass DistributedToon : DistributedPlayer { + setDNAString(blob) required broadcast ownrecv db; + setGM(uint16 = 0) required broadcast ownrecv db; + setMoney(int16 = 0) required ownrecv db; + setBankMoney(int32 = 0) required ownrecv; + setMaxHp(int16 = 15) required broadcast ownrecv db; + setHp(int16 = 15) required broadcast ownrecv db; + toonUp(uint16) broadcast ownrecv; + takeDamage(uint16) broadcast ownrecv; + setBattleId(uint32 = 0) required broadcast ram; + setExperience(blob = [0*14]) required broadcast db; + setMaxCarry(uint8 = 20) required ownrecv db; + setTrackAccess(uint16[] = [0,0,0,0,1,1,0]) required broadcast ownrecv db; + setTrackProgress(int8 = -1, uint32 = 0) required ownrecv db; + setTrackBonusLevel(int8[] = [-1,-1,-1,-1,-1,-1,-1]) required broadcast ownrecv db; + setInventory(blob = [0*7, 0*7, 0*7, 0*7, 1, 0*6, 1, 0*6, 0*7]) required ownrecv db; + setMaxNPCFriends(uint16 = 16) required ownrecv db; + setNPCFriendsDict(FriendEntry[] = []) required ownrecv db; + setDefaultShard(uint32 = 0) required ownrecv broadcast db; + setDefaultZone(uint32 = 0) required ownrecv broadcast db; + setShtickerBook(blob = []) required ownrecv db; + setZonesVisited(uint32[] = [ 2000 ]) required ownrecv db; + setHoodsVisited(uint32[] = [ 2000 ]) required ownrecv db; + setInterface(blob = []) required ownrecv db; + setLastHood(uint32 = 0) required ownrecv broadcast db; + setTutorialAck(uint8) required ownrecv db; + setMaxClothes(uint32 = 10) required ownrecv db; + setClothesTopsList(uint8[] = []) required ownrecv db; + setClothesBottomsList(uint8[] = []) required ownrecv db; + setMaxAccessories(uint32 = 0) required ownrecv db; + setHatList(uint8[] = []) required ownrecv db; + setGlassesList(uint8[] = []) required ownrecv db; + setBackpackList(uint8[] = []) required ownrecv db; + setShoesList(uint8[] = []) required ownrecv db; + setHat(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; + setGlasses(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; + setBackpack(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; + setShoes(uint8 = 0, uint8 = 0, uint8 = 0) required broadcast db ownrecv; + setGardenSpecials(gardenSpecial [] = []) required ownrecv db airecv; + setEarnedExperience(uint16[]) ownrecv; + setTunnelIn(int16, int16/10, int16/10, int16/10, int16/100, int32/100) ownsend broadcast; + setTunnelOut(int16, int16/10, int16/10, int16/10, int16/10, int16/100, int32/100) ownsend broadcast; + setAnimState(char [0-1024], int16/1000, int16) broadcast ram ownsend airecv; + setEmoteState(int16, int16/1000, int16) broadcast ram ownsend; + setEmoteAccess(uint8[] = [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) required ownrecv db; + setCustomMessages(uint16[] = []) required ownrecv db; + setSleepAutoReply(uint32) broadcast clsend ownrecv; + setResistanceMessages(pair16 [] = []) required ownrecv db; + setPetTrickPhrases(uint8[] = [0]) required ownrecv db; + setCatalogSchedule(uint16 = 0, uint32 = 0) required ownrecv db; + setCatalog(blob = [], blob = [], blob = []) required ownrecv db; + setMailboxContents(blob = []) required ownrecv db; + setDeliverySchedule(blob = []) required ownrecv db airecv; + setGiftSchedule(blob = []) required ownrecv db airecv; + setAwardMailboxContents(blob = []) required ownrecv db; + setAwardSchedule(blob = []) required ownrecv db airecv; + setAwardNotify(uint8 = 0) required ownrecv db; + setCatalogNotify(uint8 = 0, uint8 = 0) required ownrecv db; + playSplashEffect(int16/10, int16/10, int16/10) broadcast ownsend; + setWhisperSCToontaskFrom(uint32, uint32, uint32, uint32, uint8) ownrecv clsend; + setSCToontask(uint32, uint32, uint32, uint8) broadcast ownsend; + reqSCResistance(uint16, uint32 []) ownsend airecv; + setSCResistance(uint16, uint32 []) broadcast ownrecv; + setSpeedChatStyleIndex(uint8 = 1) required ownsend broadcast db; + setTrophyScore(uint16) broadcast ownrecv ram; + setTeleportAccess(uint32[] = []) required ownrecv db; + setScavengerHunt(uint32[] = []) required ownrecv db; + checkTeleportAccess(uint16) airecv ownsend; + setTeleportOverride(uint8) clsend airecv; + battleSOS(uint32) ownrecv clsend; + teleportQuery(uint32) ownrecv clsend; + teleportResponse(uint32, int8, uint32, uint32, uint32) ownrecv clsend; + teleportResponseToAI(uint32, int8, uint32, uint32, uint32, uint32) ownsend airecv; + teleportGiveup(uint32) ownrecv clsend; + teleportGreeting(uint32) broadcast ownsend; + setCogStatus(uint32[] = [1 * 32]) required ownrecv db; + setCogCount(uint32[] = [0 * 32]) required ownrecv db; + setCogRadar(uint8[] = [0 * 4]) required ownrecv db; + setBuildingRadar(uint8[] = [0 * 4]) required ownrecv db; + setCogLevels(uint8[] = [0 * 4]) required broadcast ownrecv db; + setCogTypes(uint8[] = [0 * 4]) required broadcast ownrecv db; + setCogParts(uint32[] = [0 * 4]) required broadcast ownrecv db; + setCogMerits(uint16[] = [0 * 4]) required ownrecv db; + setPromotionStatus(uint8[] = [0 * 4]) required broadcast ownrecv db; + requestPromotion(uint8) ownsend airecv; + setCogIndex(int8) broadcast ram; + setDisguisePageFlag(int8) ownrecv; + setSosPageFlag(int8) ownrecv; + setHouseId(uint32 = 0) required ownrecv db; + setQuests(uint32[] = []) required broadcast ownrecv db; + setQuestHistory(uint16[] = []) required ownrecv db; + setRewardHistory(uint8 = 0, uint16[] = []) required ownrecv db; + setQuestCarryLimit(uint8 = 1) required ownrecv db; + requestDeleteQuest(uint32[]) ownsend airecv; + setCheesyEffect(int16 = 0, uint32 = 0, uint32 = 0) required broadcast ownrecv db; + setGhostMode(uint8) broadcast ownrecv ram; + setPosIndex(uint8 = 0) required ownrecv db; + setFishCollection(uint8[] = [], uint8[] = [], uint16[] = []) required ownrecv db; + setMaxFishTank(uint8 = 20) required ownrecv db; + setFishTank(uint8[] = [], uint8[] = [], uint16[] = []) required ownrecv db; + setFishingRod(uint8 = 0) required broadcast ownrecv db; + setFishingTrophies(uint8[] = []) required ownrecv db; + setFlowerCollection(uint8[] = [], uint8[] = []) required ownrecv db; + setFlowerBasket(uint8[] = [], uint8[] = []) required ownrecv db; + setMaxFlowerBasket(uint8 = 20) required ownrecv db; + setGardenTrophies(uint8[] = []) required ownrecv db; + setShovel(uint8 = 0) required broadcast ownrecv db; + setShovelSkill(uint32 = 0) required ownrecv db; + setWateringCan(uint8 = 0) required broadcast ownrecv db; + setWateringCanSkill(uint32 = 0) required ownrecv db; + promoteShovel(uint8) ownrecv; + promoteWateringCan(uint8) ownrecv; + reactivateWater() ownrecv; + presentPie(int16/10 x, int16/10 y, int16/10 z, int16/10 h, int32 timestamp) broadcast ownsend; + tossPie(int16/10 x, int16/10 y, int16/10 z, int16/10 h, uint8 sequence, uint8 power, uint8 throwType, int32 timestamp) broadcast ownsend; + pieSplat(int16/10, int16/10, int16/10, uint8, uint8, int32) broadcast ownsend; + setPieType(uint8) broadcast ownrecv ram; + setNumPies(uint16) broadcast ownrecv ram; + catalogGenClothes(uint32) broadcast ownrecv; + catalogGenAccessories(uint32) broadcast ownrecv; + setPetId(uint32 = 0) required broadcast ownrecv db; + setPetMovie(uint32, uint8) ownsend airecv; + setPetTutorialDone(uint8 = 0) required ownsend airecv db; + setFishBingoTutorialDone(uint8 = 0) required ownsend airecv db; + setFishBingoMarkTutorialDone(uint8 = 0) required ownsend airecv db; + setKartBodyType(int8 = -1) required broadcast ownrecv db; + setKartBodyColor(int8 = -1) required broadcast ownrecv db; + setKartAccessoryColor(int8 = -1) required broadcast ownrecv db; + setKartEngineBlockType(int8 = -1) required broadcast ownrecv db; + setKartSpoilerType(int8 = -1) required broadcast ownrecv db; + setKartFrontWheelWellType(int8 = -1) required broadcast ownrecv db; + setKartBackWheelWellType(int8 = -1) required broadcast ownrecv db; + setKartRimType(int8 = -1) required broadcast ownrecv db; + setKartDecalType(int8 = -1) required broadcast ownrecv db; + updateKartDNAField(int8, int8) ownsend airecv; + addOwnedAccessory(int8) ownsend airecv; + removeOwnedAccessory(int8) ownsend airecv; + setTickets(uint32 = 200) required broadcast ownrecv db; + setKartingHistory(uint8 [16] = [0*16]) required ownrecv db; + setKartingTrophies(uint8 [33] = [0*33]) required ownrecv db; + setKartingPersonalBest(uint32/1000 [6] = [0*6]) required ownrecv db; + setKartingPersonalBest2(uint32/1000 [12] = [0*12]) required ownrecv db; + setKartAccessoriesOwned(int8 [16] = [-1*16]) required broadcast ownrecv db; + setCurrentKart(uint32) broadcast ownrecv ram; + squish(uint8) ownsend airecv; + announceBingo() broadcast ownrecv; + trickOrTreatTargetMet(uint32) ownrecv; + trickOrTreatMilestoneMet() ownrecv; + winterCarolingTargetMet(uint32) ownrecv; + setCogSummonsEarned(uint8[] = [0*32]) required ownrecv db; + reqCogSummons(char [0-256], uint32) ownsend airecv; + cogSummonsResponse(string, uint32, uint32) ownrecv; + reqUseSpecial(int32) ownsend airecv; + useSpecialResponse(string) ownrecv; + setGardenStarted(uint8 = 0) required ownrecv db; + sendToGolfCourse(uint32) ownrecv; + setGolfHistory(uint16 [18] = [0*18]) required ownrecv db; + setPackedGolfHoleBest(uint8 [18] = [0*18]) required ownrecv db; + setGolfCourseBest(uint8 [3] = [0*3]) required ownrecv db; + setUnlimitedSwing(uint8) broadcast ownrecv ram; + logSuspiciousEvent(char [0-1024]) ownsend airecv; + logMessage(char [0-1024]) ownsend airecv; + forceLogoutWithNotify() ownrecv; + setPinkSlips(uint8 = 0) required ownrecv db; + setNametagStyle(uint8 = 0) required broadcast ownrecv db; + setMail(simpleMail []) ownrecv; + setNumMailItems(uint32) airecv; + setSimpleMailNotify(uint8) ownrecv airecv; + setInvites(invite []) ownrecv airecv ram; + setPartiesInvitedTo(party []) ownrecv airecv ram; + setHostedParties(party []) ownrecv airecv ram; + setPartyReplies(repliesForOneParty []) ownrecv airecv ram; + updateInvite(uint64, uint8) ownrecv airecv; + updateReply(uint64, uint64, uint8) ownrecv airecv; + setPartyCanStart(uint64) ownrecv airecv; + setPartyStatus(uint64, uint8) ownrecv airecv; + announcePartyStarted(uint64) ownrecv; + setAchievements(uint16[] = []) required broadcast ownrecv db; + setNeverStartedPartyRefunded(uint64, int8, uint16) ownrecv; + setModuleInfo(string []) airecv clsend; + setDISLname(string) ram; + setDISLid(uint32) ram db airecv; + flagAv(uint32, uint16, string []) airecv ownsend; + setAnimalSound(uint8 index) ram broadcast ownrecv; + setBuffs(uint32[] = []) required ownrecv db; + setRedeemedCodes(string [] = []) required ownrecv db; +}; + +dclass DistributedCCharBase : DistributedObject { + setChat(uint32, uint32, uint32) broadcast; + fadeAway() broadcast; + setWalk(string, string, int16) required broadcast ram; + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + setNearbyAvatarChat(char [0-1024]) airecv clsend; + setNearbyAvatarSC(uint16) airecv clsend; + setNearbyAvatarSCCustom(uint16) airecv clsend; + setNearbyAvatarSCToontask(uint32, uint32, uint32, uint8) airecv clsend; +}; + +dclass DistributedMickey : DistributedCCharBase { +}; + +dclass DistributedVampireMickey : DistributedMickey { +}; + +dclass DistributedWitchMinnie : DistributedMickey { +}; + +dclass DistributedMinnie : DistributedCCharBase { +}; + +dclass DistributedGoofy : DistributedCCharBase { +}; + +dclass DistributedDaisy : DistributedCCharBase { +}; + +dclass DistributedSockHopDaisy : DistributedDaisy { +}; + +dclass DistributedChip : DistributedCCharBase { +}; + +dclass DistributedPoliceChip : DistributedChip { +}; + +dclass DistributedDale : DistributedCCharBase { + setFollowChip(string, string, int16, int16/100, int16/100) broadcast ram; + setChipId(uint32) required broadcast ram; +}; + +dclass DistributedJailbirdDale : DistributedDale { +}; + +dclass DistributedDonald : DistributedCCharBase { +}; + +dclass DistributedFrankenDonald : DistributedDonald { +}; + +dclass DistributedDonaldDock : DistributedCCharBase { +}; + +dclass DistributedPluto : DistributedCCharBase { +}; + +dclass DistributedWesternPluto : DistributedPluto { +}; + +dclass DistributedGoofySpeedway : DistributedCCharBase { +}; + +dclass DistributedSuperGoofy : DistributedGoofySpeedway { +}; + +dclass DistributedPartyGate : DistributedObject { + getPartyList(uint32) airecv clsend; + partyChoiceRequest(uint32, uint64, uint64) airecv clsend; + listAllPublicParties(publicPartyInfo []); + partyRequestDenied(uint8); + setParty(publicPartyInfo, uint32 hostId); +}; + +dclass DistributedTrolley : DistributedObject { + setState(string, int16) broadcast ram; + fillSlot0(uint32) broadcast ram; + fillSlot1(uint32) broadcast ram; + fillSlot2(uint32) broadcast ram; + fillSlot3(uint32) broadcast ram; + emptySlot0(uint32, int16) broadcast ram; + emptySlot1(uint32, int16) broadcast ram; + emptySlot2(uint32, int16) broadcast ram; + emptySlot3(uint32, int16) broadcast ram; + requestBoard() airecv clsend; + rejectBoard(uint32); + requestExit() airecv clsend; + setMinigameZone(uint32, uint16); +}; + +dclass DistributedSuitPlanner : DistributedObject { + setZoneId(uint32) required broadcast ram; + suitListQuery() airecv clsend; + suitListResponse(uint8[]); + buildingListQuery() airecv clsend; + buildingListResponse(uint8[]); +}; + +dclass DistributedSuitBase : DistributedObject { + denyBattle(); + setDNAString(blob) required broadcast ram; + setLevelDist(int16) required broadcast ram; + setBrushOff(int16) broadcast; + setWaiter(uint8) broadcast ram; + setSkelecog(uint8) required broadcast ram; + setSkeleRevives(uint8) required broadcast ram; + setHP(int16) required broadcast ram; +}; + +dclass DistributedSuit : DistributedSuitBase { + requestBattle(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) airecv clsend; + setSPDoId(uint32) required broadcast ram; + setPathEndpoints(uint16, uint16, uint16, uint16) required broadcast ram; + setPathPosition(uint16, int16) required broadcast ram; + setPathState(int8) required broadcast ram; + debugSuitPosition(int16/10, int16, int16/10, int16/10, int16) broadcast; +}; + +dclass DistributedTutorialSuit : DistributedSuitBase { + requestBattle(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) airecv clsend; +}; + +dclass DistributedFactorySuit : DistributedSuitBase { + setLevelDoId(uint32) required broadcast ram; + setCogId(uint32) required broadcast ram; + setReserve(uint8) required broadcast ram; + requestBattle(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) airecv clsend; + setAlert(uint32) airecv clsend; + setConfrontToon(uint32) broadcast; + setStrayed() airecv clsend; + setReturn() broadcast; +}; + +dclass DistributedMintSuit : DistributedFactorySuit { +}; + +dclass DistributedStageSuit : DistributedFactorySuit { +}; + +dclass DistributedBossCog : DistributedNode { + setDNAString(blob) required broadcast db; + setToonIds(uint32[], uint32[], uint32[]) broadcast ram; + setBattleIds(uint8, uint32, uint32) broadcast ram; + setArenaSide(uint8) broadcast ram; + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + avatarNearEnter() airecv clsend; + avatarNearExit() airecv clsend; + toonDied(uint32) broadcast; + setBattleExperience(int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], uint8[], int16[], uint32[]) required broadcast ram; + zapToon(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10, int8/100, int8/100, uint8, int16) airecv clsend; + showZapToon(uint32, int16/10, int16/10, int16/10, int16/10, int16/10, int16/10, uint8, int16) broadcast; + setAttackCode(uint8, uint32) broadcast; +}; + +dclass DistributedSellbotBoss : DistributedBossCog { + setCagedToonNpcId(uint32) required broadcast ram; + setDooberIds(uint32[]) broadcast ram; + setBossDamage(uint16, uint8, int16) broadcast ram; + setState(string) broadcast ram; + hitBoss(uint8) airecv clsend; + hitBossInsides() airecv clsend; + hitToon(uint32) airecv clsend; + finalPieSplat() airecv clsend; + touchCage() airecv clsend; + doStrafe(uint8, uint8) broadcast; + cagedToonBattleThree(uint16, uint32) broadcast; + toonPromoted(uint8(0-1)); +}; + +dclass DistributedCashbotBoss : DistributedBossCog { + setState(string) broadcast ram; + setBossDamage(uint16) broadcast ram; + setRewardId(uint16) broadcast ram; + applyReward() airecv clsend; +}; + +struct LinkPosition { + int16/100 x; + int16/100 y; + int16/100 z; +}; + +dclass DistributedCashbotBossCrane : DistributedObject { + setBossCogId(uint32) required broadcast ram; + setIndex(uint8) required broadcast ram; + setState(char, uint32) broadcast ram; + requestControl() airecv clsend; + requestFree() airecv clsend; + clearSmoothing(int8) broadcast clsend; + setCablePos(uint8, int16/100, uint16%360/100, LinkPosition [3], int16) broadcast clsend; +}; + +dclass DistributedCashbotBossObject : DistributedObject { + setBossCogId(uint32) required broadcast ram; + setObjectState(char, uint32, uint32) broadcast ram; + requestGrab() airecv clsend; + rejectGrab(); + requestDrop() airecv clsend; + hitFloor() clsend; + requestFree(int16/10, int16/10, int16/10, uint16%360/100) airecv clsend; + hitBoss(uint16/255) airecv clsend; + setX(int16/10) broadcast ram clsend airecv; + setY(int16/10) broadcast ram clsend airecv; + setZ(int16/10) broadcast ram clsend airecv; + setH(int16%360/10) broadcast ram clsend airecv; + setP(int16%360/10) broadcast ram clsend airecv; + setR(int16%360/10) broadcast ram clsend airecv; + setPos : setX, setY, setZ; + setHpr : setH, setP, setR; + setPosHpr : setX, setY, setZ, setH, setP, setR; + setXY : setX, setY; + setXZ : setX, setZ; + setXYH : setX, setY, setH; + setXYZH : setX, setY, setZ, setH; + setComponentL(uint64) broadcast ram clsend airecv; + setComponentX(int16/10) broadcast ram clsend airecv; + setComponentY(int16/10) broadcast ram clsend airecv; + setComponentZ(int16/10) broadcast ram clsend airecv; + setComponentH(int16%360/10) broadcast ram clsend airecv; + setComponentP(int16%360/10) broadcast ram clsend airecv; + setComponentR(int16%360/10) broadcast ram clsend airecv; + setComponentT(int16) broadcast ram clsend airecv; + setSmStop : setComponentT; + setSmH : setComponentH, setComponentT; + setSmZ : setComponentZ, setComponentT; + setSmXY : setComponentX, setComponentY, setComponentT; + setSmXZ : setComponentX, setComponentZ, setComponentT; + setSmPos : setComponentX, setComponentY, setComponentZ, setComponentT; + setSmHpr : setComponentH, setComponentP, setComponentR, setComponentT; + setSmXYH : setComponentX, setComponentY, setComponentH, setComponentT; + setSmXYZH : setComponentX, setComponentY, setComponentZ, setComponentH, setComponentT; + setSmPosHpr : setComponentX, setComponentY, setComponentZ, setComponentH, setComponentP, setComponentR, setComponentT; + setSmPosHprL : setComponentL, setComponentX, setComponentY, setComponentZ, setComponentH, setComponentP, setComponentR, setComponentT; + clearSmoothing(int8) broadcast clsend; +}; + +dclass DistributedCashbotBossSafe : DistributedCashbotBossObject { + setIndex(uint8) required broadcast ram; + requestInitial() airecv clsend; +}; + +dclass DistributedCashbotBossGoon : DistributedCashbotBossObject { + requestBattle(int16/10) airecv clsend; + requestStunned(int16/10) airecv clsend; + setVelocity(uint8/10) broadcast ram; + setHFov(uint8) broadcast ram; + setAttackRadius(uint8) broadcast ram; + setStrength(uint8) broadcast ram; + setGoonScale(uint8/50) broadcast ram; + setupGoon : setVelocity, setHFov, setAttackRadius, setStrength, setGoonScale; + setTarget(int16/10, int16/10, uint16%360/100, int16) broadcast ram; + destroyGoon() broadcast clsend airecv; +}; + +dclass DistributedBattleBase : DistributedObject { + setLevelDoId(uint32) required broadcast ram; + setBattleCellId(uint32) required broadcast ram; + setInteractivePropTrackBonus(int8) required broadcast ram; + setPosition(int16/10, int16/10, int16/10) required broadcast ram; + setZoneId(uint32) required broadcast ram; + setInitialSuitPos(int16/10, int16/10, int16/10) required broadcast ram; + setMembers(uint32[], string, string, string, string, string, uint32[], string, string, string, string, int16) required broadcast ram; + adjust(int16) broadcast; + setMovie(int8, uint32[], uint32[], int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int32, int16[], int16, int16, int16[], int8, int8, int8, int8, int8, int16[], int8, int8, int8, int8, int8, int8, int16[], int8, int8, int8, int8, int8, int8, int16[], int8, int8, int8, int8, int8, int8, int16[], int8, int8, int8) required broadcast ram; + setChosenToonAttacks(uint32[], int16[], int16[], int32[]) broadcast ram; + setBattleExperience(int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], int32, int16[], int16[], uint32[], int16[], int16[], int16[], int16[], uint32[], uint8[], int16[], uint32[]) required broadcast ram; + denyLocalToonJoin(); + setBossBattle(uint8) required broadcast ram; + setState(string, int16) required broadcast ram; + faceOffDone() airecv clsend; + toonRequestJoin(int16/10, int16/10, int16/10) airecv clsend; + toonRequestRun() airecv clsend; + toonDied() airecv clsend; + adjustDone() airecv clsend; + timeout() airecv clsend; + movieDone() airecv clsend; + rewardDone() airecv clsend; + joinDone(uint32) airecv clsend; + requestAttack(int8, int8, int32) airecv clsend; + requestPetProxy(uint32) airecv clsend; +}; + +dclass DistributedBattle : DistributedBattleBase { +}; + +dclass DistributedBattleBldg : DistributedBattleBase { +}; + +dclass DistributedBattleTutorial : DistributedBattle { +}; + +dclass DistributedLevelBattle : DistributedBattle { +}; + +dclass DistributedBattleFactory : DistributedLevelBattle { +}; + +dclass DistributedMintBattle : DistributedLevelBattle { +}; + +dclass DistributedStageBattle : DistributedLevelBattle { +}; + +dclass DistributedBattleFinal : DistributedBattleBase { + setBossCogId(uint32) required broadcast ram; + setBattleNumber(uint8) required broadcast ram; + setBattleSide(uint8) required broadcast ram; +}; + +dclass DistributedBoat : DistributedObject { + setState(string, int16) required broadcast ram; +}; + +dclass DistributedButterfly : DistributedObject { + setArea(int16, int16) required broadcast ram; + setState(int8, uint8, uint8, uint16/10, int16) required broadcast ram; + avatarEnter() airecv clsend; +}; + +dclass DistributedMMPiano : DistributedObject { + requestSpeedUp() airecv clsend; + requestChangeDirection() airecv clsend; + setSpeed(int16/1000, uint16/100, int16) broadcast ram; + playSpeedUp(uint32) broadcast; + playChangeDirection(uint32) broadcast; +}; + +dclass DistributedDGFlower : DistributedObject { + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + setHeight(uint8/10) broadcast ram; +}; + +dclass DistributedFishingPond : DistributedObject { + hitTarget(uint32) airecv clsend; + setArea(uint32) required broadcast ram; +}; + +dclass DistributedFishingTarget : DistributedNode { + setPondDoId(uint32) required broadcast ram; + setState(uint8, int16/10, uint16/100, uint16/10, int16) required broadcast ram; +}; + +dclass DistributedFishingSpot : DistributedObject { + setPondDoId(uint32) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + requestEnter() airecv clsend; + rejectEnter(); + requestExit() airecv clsend; + setOccupied(uint32) broadcast ram; + doCast(uint8/255, int16/100) airecv clsend; + sellFish() airecv clsend; + sellFishComplete(uint8, uint16); + setMovie(uint8, uint8, uint16, uint16, uint16, uint8/100, int16/100) broadcast ram; +}; + +dclass DistributedPondBingoManager : DistributedObject { + setPondDoId(uint32) required broadcast ram; + updateGameState(uint32, uint8); + setCardState(uint16, uint8, uint16, uint32); + setState(string, int16); + cardUpdate(uint16, uint8, uint8, uint8) airecv clsend; + enableBingo(); + handleBingoCall(uint16) airecv clsend; + setJackpot(uint16); +}; + +dclass DistributedCannon : DistributedObject { + setEstateId(uint32) required broadcast ram; + setTargetId(uint32) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + setActive(uint8) airecv clsend; + setActiveState(uint8) broadcast ram; + requestEnter() airecv clsend; + requestExit() broadcast; + setMovie(uint8, uint32) broadcast ram; + setCannonPosition(int32/100, uint32/100) airecv clsend; + setCannonLit(int32/100, uint32/100) airecv clsend; + setFired() airecv clsend; + setLanded() airecv clsend; + updateCannonPosition(uint32, int32/100, uint32/100) broadcast ram; + setCannonWillFire(uint32, int32/100, int32/100, uint32/100, int16) broadcast; + setCannonExit(uint32) broadcast; + requestBumperMove(int32/100, int32/100, int32/100) airecv clsend; + setCannonBumperPos(int32/100, int32/100, int32/100) required broadcast ram; +}; + +dclass DistributedTarget : DistributedObject { + setPosition(int16/10, int16/10, int16/10) required broadcast ram; + setState(uint8, uint32/10, uint8) broadcast; + setReward(uint32) broadcast; + setResult(uint32) airecv clsend; + setBonus(int16/10) airecv clsend; + setCurPinballScore(uint32, int32, int32) clsend airecv; + setPinballHiScorer(string) broadcast ram; + setPinballHiScore(int32) broadcast ram; +}; + +dclass DistributedMinigame : DistributedObject { + setParticipants(uint32[]) broadcast ram required; + setTrolleyZone(uint32) broadcast ram required; + setStartingVotes(uint16[]) broadcast ram required; + setMetagameRound(int8) broadcast ram required; + setDifficultyOverrides(int32, int32) broadcast ram required; + setAvatarJoined() airecv clsend; + setAvatarReady() airecv clsend; + setAvatarExited() airecv clsend; + requestExit() airecv clsend; + setGameReady() broadcast; + setGameStart(int16) broadcast; + setGameExit() broadcast; + setGameAbort() broadcast; +}; + +dclass DistributedMinigameTemplate : DistributedMinigame { +}; + +dclass DistributedRaceGame : DistributedMinigame { + setTimerStartTime(int16) broadcast; + setAvatarChoice(uint8) airecv clsend; + setAvatarChose(uint32) broadcast; + setChancePositions(uint8[]) broadcast; + setServerChoices(int8[], uint8[], int8[]) broadcast; +}; + +dclass DistributedCannonGame : DistributedMinigame { + setCannonPosition(int32/100, uint32/100) airecv clsend; + setCannonLit(int32/100, uint32/100) airecv clsend; + updateCannonPosition(uint32, int32/100, uint32/100) broadcast; + setCannonWillFire(uint32, int32/100, int32/100, uint32/100) broadcast; + setToonWillLandInWater(int32/100) airecv clsend; + announceToonWillLandInWater(uint32, int32/100) broadcast; +}; + +dclass DistributedPhotoGame : DistributedMinigame { + newClientPhotoScore(uint8, char [0-256], uint32/100) airecv clsend; + newAIPhotoScore(uint32, uint8, uint32/100) broadcast; + filmOut() airecv clsend; +}; + +dclass DistributedPatternGame : DistributedMinigame { + reportPlayerReady() airecv clsend; + setPattern(uint8[]) broadcast; + reportPlayerPattern(uint8[], uint16/1000) airecv clsend; + setPlayerPatterns(uint8[], uint8[], uint8[], uint8[], uint32) broadcast; + reportButtonPress(uint8, uint8) airecv clsend; + remoteButtonPressed(uint32, uint8, uint8) broadcast; +}; + +dclass DistributedRingGame : DistributedMinigame { + setTimeBase(int16) broadcast ram required; + setColorIndices(int8, int8, int8, int8) broadcast ram required; + setToonGotRing(uint8) airecv clsend; + setRingGroupResults(uint8) broadcast; +}; + +dclass DistributedTagGame : DistributedMinigame { + tag(uint32) airecv clsend; + setIt(uint32) broadcast; + setTreasureScore(uint16[]) broadcast; +}; + +dclass DistributedMazeGame : DistributedMinigame { + claimTreasure(uint32) airecv clsend; + setTreasureGrabbed(uint32, uint32) broadcast; + allTreasuresTaken() broadcast; + hitBySuit(uint32, int16) clsend broadcast; +}; + +dclass DistributedTugOfWarGame : DistributedMinigame { + reportPlayerReady(uint8) airecv clsend; + sendGoSignal(uint8[]) broadcast; + sendStopSignal(uint32[], uint32[], uint32[]) broadcast; + sendGameType(uint8, uint8) broadcast; + reportEndOfContest(uint8) airecv clsend; + sendNewAvIdList(uint32[]) airecv clsend; + reportCurrentKeyRate(uint32, int16/100) airecv clsend; + sendCurrentPosition(uint32[], int16/1000[]) broadcast; + sendSuitPosition(int32/1000) broadcast; + remoteKeyRateUpdate(uint32, uint32) broadcast; +}; + +dclass DistributedCatchGame : DistributedMinigame { + claimCatch(uint32, uint32) airecv clsend; + setObjectCaught(uint32, uint32) broadcast; + hitBySuit(uint32, int16) clsend broadcast; + reportDone() airecv clsend; + setEveryoneDone() broadcast; +}; + +dclass DistributedDivingGame : DistributedMinigame { + pickupTreasure(uint32) airecv clsend; + setTreasureGrabbed(uint32, uint32) broadcast; + handleFishCollision(uint32, uint32, uint32, char [0-256]) airecv clsend; + performFishCollision(uint32, uint32, uint32, int16) broadcast; + handleCrabCollision(uint32, char [0-256]) airecv clsend; + performCrabCollision(uint32, int16) broadcast; + setTreasureDropped(uint32, int16) broadcast; + fishSpawn(int16, uint32, uint32, uint16) broadcast; + removeFish(uint32) airecv clsend; + getCrabMoving(uint32, int16, int8) airecv clsend; + setCrabMoving(uint32, int16, int8, int8, int16, int8) broadcast; + treasureRecovered() airecv clsend; + incrementScore(uint32, uint32, int16) broadcast; +}; + +dclass DistributedTargetGame : DistributedMinigame { + setTimeBase(int16) broadcast ram required; + setToonGotRing(uint8) airecv clsend; + setRingGroupResults(uint8) broadcast; + setPlayerDone() airecv clsend; + setScore(int32, int32) airecv clsend; + setTargetSeed(uint32) broadcast ram; + setRoundDone() broadcast; + setSingleScore(uint16, uint32) broadcast; + setGameDone() broadcast; +}; + +dclass EstateManager : DistributedObject { + startAprilFools() broadcast; + stopAprilFools() broadcast; + getEstateZone(uint32 avId) airecv clsend; + setEstateZone(uint32 ownerId, uint32 zoneId); + setAvHouseId(uint32, uint32[]) broadcast; + sendAvToPlayground(DoId avId, uint8 reason); + exitEstate() airecv clsend; + removeFriend(uint32, uint32) airecv clsend; +}; + +struct decorItem { + uint8 decorType; + uint8 dataByte[]; + uint32 dataWord[]; +}; + +struct lawnItem { + uint8 type; + uint8 hardPoint; + int8 waterLevel; + int8 growthLevel; + uint16 optional; +}; + +dclass DistributedEstate : DistributedObject { + string DcObjectType db; + setEstateReady() broadcast; + setClientReady() airecv clsend; + setEstateType(uint8 type = 0) required broadcast db; + setClosestHouse(uint8) airecv clsend; + setTreasureIds(uint32[]) broadcast ram; + requestServerTime() airecv clsend; + setServerTime(uint32); + setDawnTime(uint32) required broadcast ram; + placeOnGround(uint32) broadcast ram; + setDecorData(lawnItem items[] = []) required airecv db; + setLastEpochTimeStamp(uint32 timestamp = 0) required airecv db; + setRentalTimeStamp(uint32 timestamp = 0) required airecv db; + setRentalType(uint8 type = 0) required airecv db; + setSlot0ToonId(uint32 toonId = 0) required airecv db; + setSlot0Items(lawnItem items[] = []) required airecv db; + setSlot1ToonId(uint32 toonId = 0) required airecv db; + setSlot1Items(lawnItem items[] = []) required airecv db; + setSlot2ToonId(uint32 toonId = 0) required airecv db; + setSlot2Items(lawnItem items[] = []) required airecv db; + setSlot3ToonId(uint32 toonId = 0) required airecv db; + setSlot3Items(lawnItem items[] = []) required airecv db; + setSlot4ToonId(uint32 toonId = 0) required airecv db; + setSlot4Items(lawnItem items[] = []) required airecv db; + setSlot5ToonId(uint32 toonId = 0) required airecv db; + setSlot5Items(lawnItem items[] = []) required airecv db; + setIdList(uint32 []) broadcast ram; + completeFlowerSale(uint8) airecv clsend; + awardedTrophy(uint32) broadcast; + setClouds(uint8) required broadcast ram; + cannonsOver() broadcast; + gameTableOver() broadcast; +}; + +dclass DistributedHouse : DistributedObject { + string DcObjectType db; + setHousePos(uint8) required broadcast; + setHouseType(uint8 type = 0) required broadcast db; + setGardenPos(uint8 index = 0) required broadcast db; + setAvatarId(uint32 toonId = 0) required broadcast db; + setName(string toonName = "") required broadcast db; + setColor(uint8 colorIndex = 0) required broadcast db; + setAtticItems(blob = "") required db; + setInteriorItems(blob = "") required db; + setAtticWallpaper(blob = "") required db; + setInteriorWallpaper(blob = "") required db; + setAtticWindows(blob = "") required db; + setInteriorWindows(blob = "") required db; + setDeletedItems(blob = "") required db; + setInteriorInitialized(uint8 initialized = 0) required db; + setCannonEnabled(uint8) required; + setHouseReady() broadcast ram; +}; + +dclass DistributedHouseInterior : DistributedObject { + setHouseId(uint32) required broadcast ram; + setHouseIndex(uint8) required broadcast ram; + setWallpaper(blob) required broadcast ram; + setWindows(blob) required broadcast ram; +}; + +dclass DistributedGarden : DistributedObject { + sendNewProp(uint8, int16/10, int16/10, int16/10) broadcast; +}; + +dclass DistributedParty : DistributedObject { + setPartyClockInfo(uint8, uint8, uint8) required broadcast; + setInviteeIds(uint32[]) required broadcast; + setPartyState(bool) required broadcast; + setPartyInfoTuple(party) required broadcast; + setAvIdsAtParty(uint32 []) required broadcast; + setPartyStartedTime(string) required broadcast; + setHostName(string) required broadcast; + enteredParty() clsend airecv; +}; + +dclass DistributedPartyActivity : DistributedObject { + setX(int16/10) broadcast required; + setY(int16/10) broadcast required; + setH(uint16%360/100) broadcast required; + setPartyDoId(uint32) broadcast required; + toonJoinRequest() airecv clsend; + toonExitRequest() airecv clsend; + toonExitDemand() airecv clsend; + toonReady() airecv clsend; + joinRequestDenied(uint8); + exitRequestDenied(uint8); + setToonsPlaying(uint32 []) broadcast ram; + setState(string, int16) broadcast ram; + showJellybeanReward(uint32, uint32, string); +}; + +dclass DistributedPartyTeamActivity : DistributedPartyActivity { + toonJoinRequest(uint8(0-1)) airecv clsend; + toonExitRequest(uint8(0-1)) airecv clsend; + toonSwitchTeamRequest() airecv clsend; + setPlayersPerTeam(uint8, uint8) broadcast required; + setDuration(uint8) broadcast required; + setCanSwitchTeams(bool) broadcast required; + setState(string, int16, uint32) broadcast ram; + setToonsPlaying(uint32 [0-8], uint32 [0-8]) required broadcast ram; + setAdvantage(uint16/100); + switchTeamRequestDenied(uint8); +}; + +struct CatchGeneration { + uint32 generation; + uint32 timestamp; + int8 numPlayers; +}; + +dclass DistributedPartyCatchActivity : DistributedPartyActivity { + setStartTimestamp(uint32) required broadcast ram; + setGenerations(CatchGeneration []) required broadcast ram; + requestActivityStart() airecv clsend; + startRequestResponse(uint8); + claimCatch(uint32, uint32, uint32) airecv clsend; + setObjectCaught(uint32, uint32, uint32) broadcast; +}; + +dclass DistributedPartyWinterCatchActivity : DistributedPartyCatchActivity { +}; + +dclass DistributedPartyCogActivity : DistributedPartyTeamActivity { + pieThrow(uint32, int32, int32/100, int32/100, int32/100, int32/100, uint8) clsend broadcast; + pieHitsToon(uint32, int32, int32/100, int32/100, int32/100) clsend broadcast; + pieHitsCog(uint32, int32, int8(0-2), int32/100, int32/100, int32/100, int32, bool) clsend broadcast airecv; + setCogDistances(int8/100 [3]) broadcast ram; + setHighScore(string, uint16) broadcast ram; +}; + +dclass DistributedPartyWinterCogActivity : DistributedPartyCogActivity { +}; + +dclass DistributedPartyDanceActivityBase : DistributedPartyActivity { + updateDancingToon(uint8, char [0-256]) clsend airecv; + setToonsPlaying(uint32 [], uint16%360/100 []) broadcast ram; + setDancingToonState(uint32, uint8, string) broadcast; +}; + +dclass DistributedPartyDanceActivity : DistributedPartyDanceActivityBase { +}; + +dclass DistributedPartyDance20Activity : DistributedPartyDanceActivityBase { +}; + +dclass DistributedPartyValentineDanceActivity : DistributedPartyDanceActivityBase { +}; + +dclass DistributedPartyValentineDance20Activity : DistributedPartyDanceActivityBase { +}; + +dclass DistributedPartyJukeboxActivityBase : DistributedPartyActivity { + setNextSong(jukeboxSongInfo) clsend airecv; + setSongPlaying(jukeboxSongInfo, uint32) broadcast ram; + queuedSongsRequest() clsend airecv; + queuedSongsResponse(jukeboxSongInfo [], int16); + setSongInQueue(jukeboxSongInfo); + moveHostSongToTopRequest() clsend airecv; + moveHostSongToTop(); +}; + +dclass DistributedPartyJukeboxActivity : DistributedPartyJukeboxActivityBase { +}; + +dclass DistributedPartyJukebox40Activity : DistributedPartyJukeboxActivityBase { +}; + +dclass DistributedPartyValentineJukeboxActivity : DistributedPartyJukeboxActivityBase { +}; + +dclass DistributedPartyValentineJukebox40Activity : DistributedPartyJukeboxActivityBase { +}; + +dclass DistributedPartyCannonActivity : DistributedPartyActivity { + setMovie(uint8, uint32) broadcast; + setLanded(uint32) airecv broadcast clsend; + setCannonWillFire(uint32, int32/100, uint32/100) broadcast; + cloudsColorRequest() clsend airecv; + cloudsColorResponse(partyCloudColor []); + requestCloudHit(uint16, uint8/100, uint8/100, uint8/100) clsend airecv; + setCloudHit(uint16, uint8/100, uint8/100, uint8/100) broadcast; + setToonTrajectoryAi(int32, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100) airecv clsend; + setToonTrajectory(uint32, int32, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100, int32/100) broadcast; + updateToonTrajectoryStartVelAi(int32/100, int32/100, int32/100) airecv clsend; + updateToonTrajectoryStartVel(uint32, int32/100, int32/100, int32/100) broadcast; +}; + +dclass DistributedPartyCannon : DistributedObject { + setActivityDoId(uint64) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + requestEnter() airecv clsend; + requestExit() broadcast; + setMovie(uint8, uint32) broadcast ram; + setCannonPosition(int32/100, uint32/100) airecv clsend; + setCannonLit(int32/100, uint32/100) airecv clsend; + setFired() airecv clsend; + setLanded(uint32) airecv clsend; + updateCannonPosition(uint32, int32/100, uint32/100) broadcast ram; + setCannonExit(uint32) broadcast; + setTimeout() clsend airecv; +}; + +dclass DistributedPartyFireworksActivity : DistributedPartyActivity { + setEventId(uint8 eventId) required broadcast; + setShowStyle(uint8 style) required broadcast; + setSongId(uint8 songId) required broadcast; +}; + +dclass DistributedPartyTrampolineActivity : DistributedPartyActivity { + awardBeans(uint8, uint16) clsend airecv; + setBestHeightInfo(string, uint16) broadcast ram; + reportHeightInformation(uint16) airecv clsend; + leaveTrampoline() broadcast; + requestAnim(char [0-256]) clsend airecv; + requestAnimEcho(string) broadcast; + removeBeans(int8 []) clsend airecv; + removeBeansEcho(int8 []) broadcast; +}; + +dclass DistributedPartyValentineTrampolineActivity : DistributedPartyTrampolineActivity { +}; + +dclass DistributedPartyVictoryTrampolineActivity : DistributedPartyTrampolineActivity { +}; + +dclass DistributedPartyWinterTrampolineActivity : DistributedPartyTrampolineActivity { +}; + +dclass DistributedPartyTugOfWarActivity : DistributedPartyTeamActivity { + reportKeyRateForce(uint32, int16/100) airecv clsend; + reportFallIn(uint8) airecv clsend; + setToonsPlaying(uint32 [0-4], uint32 [0-4]) required broadcast ram; + updateToonKeyRate(uint32, uint32) broadcast; + updateToonPositions(int16/1000) broadcast; +}; + +dclass DeleteManager : DistributedObject { + setInventory(blob) airecv clsend; +}; + +struct weeklyCalendarHoliday { + uint8 holidayId; + uint8 dayOfTheWeek; +}; + +struct yearlyCalendarHoliday { + uint8 holidayId; + uint8[] firstStartTime; + uint8[] lastEndTime; +}; + +struct oncelyCalendarHoliday { + uint8 holidayId; + uint16[] firstStartTime; + uint16[] lastEndTime; +}; + +struct relativelyCalendarHoliday { + uint8 holidayId; + uint16[] firstStartTime; + uint16[] lastEndTime; +}; + +struct startAndEndTime { + uint16[] startTime; + uint16[] endTime; +}; + +struct multipleStartHoliday { + uint8 holidayId; + startAndEndTime times[]; +}; + +dclass NewsManager : DistributedObject { + setPopulation(uint32) broadcast ram; + setBingoWin(uint32) broadcast ram; + setBingoStart() broadcast; + setBingoEnd() broadcast; + setCircuitRaceStart() broadcast; + setCircuitRaceEnd() broadcast; + setTrolleyHolidayStart() broadcast; + setTrolleyHolidayEnd() broadcast; + setTrolleyWeekendStart() broadcast; + setTrolleyWeekendEnd() broadcast; + setRoamingTrialerWeekendStart() broadcast; + setRoamingTrialerWeekendEnd() broadcast; + setInvasionStatus(uint8, string, uint32, uint8) broadcast; + setHolidayIdList(uint32[]) broadcast ram; + holidayNotify() broadcast; + setWeeklyCalendarHolidays(weeklyCalendarHoliday []) required broadcast ram; + setYearlyCalendarHolidays(yearlyCalendarHoliday []) required broadcast ram; + setOncelyCalendarHolidays(oncelyCalendarHoliday []) required broadcast ram; + setRelativelyCalendarHolidays(relativelyCalendarHoliday []) required broadcast ram; + setMultipleStartHolidays(multipleStartHoliday []) required broadcast ram; + sendSystemMessage(string, uint8) broadcast ram; +}; + +dclass PurchaseManager : DistributedObject { + setPlayerIds(uint32, uint32, uint32, uint32) required broadcast ram; + setNewbieIds(uint32[]) required broadcast ram; + setMinigamePoints(uint8, uint8, uint8, uint8) required broadcast ram; + setPlayerMoney(uint16, uint16, uint16, uint16) required broadcast ram; + setPlayerStates(uint8, uint8, uint8, uint8) required broadcast ram; + setCountdown(int16) required broadcast ram; + setMetagameRound(int8) required broadcast ram; + setVotesArray(int16[]) required broadcast ram; + requestExit() airecv clsend; + requestPlayAgain() airecv clsend; + setInventory(blob, int16, uint8) airecv clsend; + setPurchaseExit() broadcast; +}; + +dclass NewbiePurchaseManager : PurchaseManager { + setOwnedNewbieId(uint32) required broadcast ram; +}; + +dclass SafeZoneManager : DistributedObject { + enterSafeZone() airecv clsend; + exitSafeZone() airecv clsend; +}; + +dclass TutorialManager : DistributedObject { + requestTutorial() airecv clsend; + rejectTutorial() airecv clsend; + requestSkipTutorial() airecv clsend; + skipTutorialResponse(uint8); + enterTutorial(uint32, uint32, uint32, uint32); + allDone() airecv clsend; + toonArrived() airecv clsend; +}; + +dclass CatalogManager : DistributedObject { + startCatalog() airecv clsend; + fetchPopularItems() airecv clsend; + setPopularItems(blob); +}; + +dclass DistributedMyTest : DistributedObject { + setMyTest(uint16) broadcast; +}; + +dclass DistributedTreasure : DistributedObject { + setTreasureType(uint16) required broadcast ram; + setPosition(int16/10, int16/10, int16/10) required broadcast ram; + requestGrab() airecv clsend; + setGrab(uint32) broadcast ram; + setReject() broadcast; +}; + +dclass DistributedCashbotBossTreasure : DistributedTreasure { + setGoonId(uint32) required broadcast ram; + setFinalPosition(int16/10, int16/10, int16/10) required broadcast ram; + setStyle(uint16) required broadcast ram; +}; + +dclass DistributedLargeBlobSender : DistributedObject { + setMode(uint8) required broadcast ram; + setTargetAvId(uint32) required broadcast ram; + setChunk(blob); + setFilename(string); + setAck() airecv clsend; +}; + +dclass DistributedLevel : DistributedObject { + setLevelZoneId(uint32) required broadcast ram; + setPlayerIds(uint32[]) required broadcast ram; + setEntranceId(uint8) required broadcast ram; + setZoneIds(uint32[]) broadcast ram; + setStartTimestamp(int32) broadcast ram; + setOuch(uint8) airecv clsend; + requestCurrentLevelSpec(string, string) airecv clsend; + setSpecDeny(blob); + setSpecSenderDoId(uint32); + setAttribChange(uint32, blob, blob, blob) broadcast; +}; + +dclass DistributedEntity : DistributedObject { + setLevelDoId(uint32) required broadcast ram; + setEntId(uint32) required broadcast ram; +}; + +dclass DistributedInteractiveEntity : DistributedEntity { + setAvatarInteract(uint32) required broadcast ram; + requestInteract() airecv clsend; + rejectInteract(); + requestExit() airecv clsend; + avatarExit(uint32) broadcast; + setState(string, int32) required broadcast ram; +}; + +dclass DistributedTrophyMgr : DistributedObject { + requestTrophyScore() airecv clsend; +}; + +dclass DistributedBuilding : DistributedObject { + setBlock(uint16, uint32) required broadcast ram; + setSuitData(int8, int8, int8) required broadcast ram; + setVictorList(uint32[]) broadcast ram; + setState(string, int16) broadcast ram; + setVictorReady() airecv clsend; +}; + +dclass DistributedAnimBuilding : DistributedBuilding { +}; + +dclass DistributedBuildingQueryMgr : DistributedObject { + isSuit(uint8, uint32) airecv clsend; + response(uint8, bool); +}; + +dclass DistributedToonInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; + setToonData(blob) required broadcast ram; + setState(string, int16) required broadcast ram; + nextSnowmanHeadPart() clsend airecv; +}; + +dclass DistributedToonHallInterior : DistributedToonInterior { +}; + +dclass DistributedSuitInterior : DistributedObject { + setZoneId(uint32) required broadcast ram; + setExtZoneId(uint32) required broadcast ram; + setDistBldgDoId(uint32) required broadcast ram; + setNumFloors(int8) required broadcast ram; + setToons(uint32[], uint16) broadcast ram; + setSuits(uint32[], uint32[], uint16[]) broadcast ram; + setState(string, int16) required broadcast ram; + setAvatarJoined() airecv clsend; + elevatorDone() airecv clsend; + reserveJoinDone() airecv clsend; +}; + +dclass DistributedCogdoBarrel : DistributedObject { + requestGrab() airecv clsend; + setIndex(uint32) required broadcast ram; + setState(uint32) required broadcast ram; + setGrab(uint32) broadcast ram; + setReject() broadcast; +}; + +dclass DistributedCogdoInterior : DistributedObject { + setZoneId(uint32) required broadcast ram; + setExtZoneId(uint32) required broadcast ram; + setDistBldgDoId(uint32) required broadcast ram; + setNumFloors(int8) required broadcast ram; + setShopOwnerNpcId(uint32) required broadcast ram; + setSOSNpcId(uint32) broadcast ram; + setFOType(int8) broadcast ram; + setToons(uint32[], uint16) broadcast ram; + setSuits(uint32[], uint32[], uint16[]) broadcast ram; + setState(string, int16) required broadcast ram; + setAvatarJoined() airecv clsend; + elevatorDone() airecv clsend; + reserveJoinDone() airecv clsend; + toonLeftBarrelRoom() airecv clsend; + toonBarrelRoomIntroDone() airecv clsend; + setBarrelRoomReward(uint32 [], uint8 []) broadcast; + toonBarrelRoomRewardDone() airecv clsend; +}; + +dclass DistributedCogdoBattleBldg : DistributedBattleBldg { +}; + +dclass DistCogdoGame : DistributedObject { + setInteriorId(uint32) required broadcast ram; + setExteriorZone(uint32) broadcast ram required; + setDifficultyOverrides(int32, int32) broadcast ram required; + setVisible() broadcast; + setIntroStart() broadcast; + setToonSad(uint32) broadcast; + setToonDisconnect(uint32) broadcast; + setAvatarReady() airecv clsend; + setGameStart(int16) broadcast; + setGameFinish(int16) broadcast; +}; + +dclass DistCogdoLevelGame : DistCogdoGame, DistributedLevel { +}; + +dclass DistCogdoMazeGame : DistCogdoGame { + requestAction(uint8, uint32) airecv clsend; + doAction(uint8, uint32, int16) broadcast; + setNumSuits(uint8 [3]) required broadcast; + requestUseGag(int16/10, int16/10, int16/10, int16) clsend airecv; + toonUsedGag(uint32, int16/10, int16/10, int16/10, int16) broadcast; + requestSuitHitByGag(uint8, uint8) clsend airecv; + suitHitByGag(uint32, uint8, uint8) broadcast; + requestHitBySuit(uint8, uint8, int16) clsend airecv; + toonHitBySuit(uint32, uint8, uint8, int16) broadcast; + requestHitByDrop() clsend airecv; + toonHitByDrop(uint32) broadcast; + requestPickUp(uint8) clsend airecv; + pickUp(uint32, uint8, int16) broadcast; + requestGag(uint8) clsend airecv; + hasGag(uint32, int16) broadcast; +}; + +dclass DistCogdoFlyingGame : DistCogdoGame { + requestAction(uint8, uint8) airecv clsend; + requestPickUp(uint16, uint8) airecv clsend; + pickUp(uint32, uint16, int16) broadcast; + debuffPowerup(uint32, uint16, int16) broadcast; + doAction(uint8, uint32) broadcast; + eagleExitCooldown(uint32, int16) broadcast; + toonSetAsEagleTarget(uint32, uint8, int16) broadcast; + toonClearAsEagleTarget(uint32, uint8, int16) broadcast; + toonDied(uint32, int32) broadcast; + toonSpawn(uint32, int32) broadcast; + toonSetBlades(uint32, int32) broadcast; + toonBladeLost(uint32) broadcast; +}; + +dclass DistCogdoBoardroomGame : DistCogdoLevelGame { +}; + +dclass DistributedHQInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; + setLeaderBoard(blob) required broadcast ram; + setTutorial(uint8) required broadcast ram; +}; + +dclass DistributedGagshopInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; +}; + +dclass DistributedPetshopInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; +}; + +dclass DistributedKartShopInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; +}; + +dclass DistributedBankInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; + setState(string, int16) broadcast ram; +}; + +dclass DistributedLibraryInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; +}; + +dclass DistributedDoor : DistributedObject { + setZoneIdAndBlock(uint32, uint32) required broadcast ram; + setSwing(int8) required broadcast ram; + setDoorType(uint8) required broadcast ram; + setDoorIndex(uint8) required broadcast ram; + setOtherZoneIdAndDoId(uint32, uint32); + requestEnter() airecv clsend; + requestExit() airecv clsend; + rejectEnter(int8); + avatarEnter(uint32) broadcast; + avatarExit(uint32) broadcast; + setState(string, int16) required broadcast ram; + setExitDoorState(string, int16) required broadcast ram; +}; + +dclass DistributedAnimDoor : DistributedDoor { +}; + +dclass DistributedHouseDoor : DistributedDoor { +}; + +dclass DistributedCogHQDoor : DistributedDoor { +}; + +dclass DistributedSellbotHQDoor : DistributedCogHQDoor { + informPlayer(uint8) broadcast ram; +}; + +dclass DistributedNPCToonBase : DistributedNode { + setName(string) required broadcast ram; + setDNAString(blob) required broadcast ram; + setPositionIndex(uint8) required broadcast ram; + setAnimState(string, int16/1000, int16) broadcast ram; + setPageNumber(int16, int8, int16) broadcast ram clsend; + avatarEnter() airecv clsend; + freeAvatar(); + setHat(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; + setGlasses(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; + setBackpack(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; + setShoes(uint8 = 0, uint8 = 0, uint8 = 0) broadcast ram; +}; + +dclass DistributedNPCToon : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, uint16[], int16) broadcast ram; + setMovieDone() airecv clsend; + chooseQuest(uint16) airecv clsend; + chooseTrack(int8) airecv clsend; +}; + +dclass DistributedSmartNPC : DistributedNPCToonBase { + greet(uint32, uint32) broadcast ram; + talkMessage(uint32, string) airecv clsend; + respond(uint32, string, uint32) broadcast ram; + dismiss(uint32, uint16) broadcast ram; +}; + +dclass DistributedNPCBanker : DistributedNPCToonBase { + setMovie(uint8, uint32, int16) broadcast ram; + setMovieDone() airecv clsend; + transferMoney(int16) airecv clsend; +}; + +dclass DistributedNPCSpecialQuestGiver : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, uint16[], int16) broadcast ram; + setMovieDone() airecv clsend; + chooseQuest(uint16) airecv clsend; + chooseTrack(int8) airecv clsend; +}; + +dclass DistributedNPCFlippyInToonHall : DistributedNPCToon { +}; + +dclass DistributedNPCScientist : DistributedNPCToonBase { + setChat(char [0-1024], uint8, uint32, uint8, uint8) ownsend broadcast; +}; + +dclass DistributedNPCClerk : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, int16) broadcast ram; + setInventory(blob, int16, uint8) airecv clsend; +}; + +dclass DistributedNPCTailor : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, int16) broadcast ram; + setDNA(blob, int8, uint8) airecv clsend; + setCustomerDNA(uint32, blob) broadcast ram; +}; + +dclass DistributedNPCBlocker : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, int16) broadcast ram; +}; + +dclass DistributedNPCFisherman : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; + completeSale(uint8) airecv clsend; +}; + +dclass DistributedNPCPartyPerson : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; + answer(uint8) airecv clsend; +}; + +dclass DistributedNPCPetclerk : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; + setPetSeeds(uint32[]); + petAdopted(uint8, uint32) airecv clsend; + petReturned() airecv clsend; + fishSold() airecv clsend; + transactionDone() airecv clsend; +}; + +dclass DistributedNPCKartClerk : DistributedNPCToonBase { + setMovie(uint8, uint32, uint32, uint32[], int16) broadcast ram; + buyKart(uint8) airecv clsend; + buyAccessory(uint8) airecv clsend; + transactionDone() airecv clsend; +}; + +dclass DistributedNPCYin : DistributedNPCToonBase { + doTransformation(uint32 avId) broadcast; + requestTransformation() airecv clsend; +}; + +dclass DistributedNPCYang : DistributedNPCToonBase { + doTransformation(uint32 avId) broadcast; + requestTransformation() airecv clsend; +}; + +dclass DistributedKnockKnockDoor : DistributedAnimatedProp { +}; + +dclass DistributedElevator : DistributedObject { + setBldgDoId(uint32) required broadcast ram; + setState(string, int16) broadcast ram; + fillSlot0(uint32, uint8) broadcast ram; + fillSlot1(uint32, uint8) broadcast ram; + fillSlot2(uint32, uint8) broadcast ram; + fillSlot3(uint32, uint8) broadcast ram; + fillSlot4(uint32, uint8) broadcast ram; + fillSlot5(uint32, uint8) broadcast ram; + fillSlot6(uint32, uint8) broadcast ram; + fillSlot7(uint32, uint8) broadcast ram; + emptySlot0(uint32, int8, int16, int16) broadcast ram; + emptySlot1(uint32, int8, int16, int16) broadcast ram; + emptySlot2(uint32, int8, int16, int16) broadcast ram; + emptySlot3(uint32, int8, int16, int16) broadcast ram; + emptySlot4(uint32, int8, int16, int16) broadcast ram; + emptySlot5(uint32, int8, int16, int16) broadcast ram; + emptySlot6(uint32, int8, int16, int16) broadcast ram; + emptySlot7(uint32, int8, int16, int16) broadcast ram; + requestBoard() airecv clsend; + rejectBoard(uint32, uint8); + requestExit() airecv clsend; + setElevatorTripId(uint32) required broadcast ram; + setAntiShuffle(uint8) required broadcast ram; + setMinLaff(uint8) required broadcast ram; +}; + +dclass DistributedElevatorFSM : DistributedObject { + setBldgDoId(uint32) required broadcast ram; + setState(string, int16) broadcast ram; + fillSlot0(uint32) broadcast ram; + fillSlot1(uint32) broadcast ram; + fillSlot2(uint32) broadcast ram; + fillSlot3(uint32) broadcast ram; + fillSlot4(uint32) broadcast ram; + fillSlot5(uint32) broadcast ram; + fillSlot6(uint32) broadcast ram; + fillSlot7(uint32) broadcast ram; + emptySlot0(uint32, int8, int16) broadcast ram; + emptySlot1(uint32, int8, int16) broadcast ram; + emptySlot2(uint32, int8, int16) broadcast ram; + emptySlot3(uint32, int8, int16) broadcast ram; + emptySlot4(uint32, int8, int16) broadcast ram; + emptySlot5(uint32, int8, int16) broadcast ram; + emptySlot6(uint32, int8, int16) broadcast ram; + emptySlot7(uint32, int8, int16) broadcast ram; + requestBoard() airecv clsend; + rejectBoard(uint32, uint8); + requestExit() airecv clsend; + setElevatorTripId(uint32) required broadcast ram; + setAntiShuffle(uint8) required broadcast ram; + setMinLaff(uint8) required broadcast ram; +}; + +dclass DistributedElevatorFloor : DistributedElevatorFSM { + setFloor(int8) broadcast ram; + setLocked(uint16) required broadcast ram; + setEntering(uint16) required broadcast ram; + kickToonsOut() broadcast; + setLatch(uint32) required broadcast ram; +}; + +dclass DistributedElevatorExt : DistributedElevator { + setFloor(int8) broadcast ram; +}; + +dclass DistributedLawOfficeElevatorExt : DistributedElevatorExt { + setEntranceId(uint8) required broadcast ram; + setLawOfficeInteriorZone(uint32); + setLawOfficeInteriorZoneForce(uint32); +}; + +dclass DistributedElevatorInt : DistributedElevator { + requestBuildingExit() airecv clsend; + forcedExit(uint32); +}; + +dclass DistributedFactoryElevatorExt : DistributedElevatorExt { + setEntranceId(uint8) required broadcast ram; + setFactoryInteriorZone(uint32); + setFactoryInteriorZoneForce(uint32); +}; + +dclass DistributedMintElevatorExt : DistributedElevatorExt { + setMintId(uint16) required broadcast ram; + setMintInteriorZone(uint32); + setMintInteriorZoneForce(uint32); +}; + +dclass DistributedCogdoElevatorExt : DistributedElevatorExt { +}; + +dclass DistributedLawOfficeElevatorInt : DistributedElevatorFloor { + setLawOfficeInteriorZone(uint32); +}; + +dclass DistributedCogdoElevatorInt : DistributedElevatorInt { +}; + +dclass DistributedBossElevator : DistributedElevatorExt { + setBossOfficeZone(uint32); + setBossOfficeZoneForce(uint32); +}; + +dclass DistributedVPElevator : DistributedBossElevator { +}; + +dclass DistributedCFOElevator : DistributedBossElevator { +}; + +dclass DistributedCJElevator : DistributedBossElevator { +}; + +dclass DistributedBBElevator : DistributedBossElevator { +}; + +dclass DistributedBoardingParty : DistributedObject { + postGroupInfo(uint32, uint32[], uint32[], uint32[]) broadcast; + informDestinationInfo(uint8) clsend airecv; + postDestinationInfo(uint8) broadcast; + postInvite(uint32, uint32, bool) broadcast; + postInviteCanceled() broadcast; + postKick(uint32) broadcast; + postKickReject(uint32, uint32, uint32) broadcast; + postSizeReject(uint32, uint32, uint32) broadcast; + postInviteAccepted(uint32) broadcast; + postInviteDelcined(uint32) broadcast; + postInviteNotQualify(uint32, int8, uint32) broadcast; + postAlreadyInGroup() broadcast; + postGroupDissolve(uint32, uint32, uint32 [], uint8) broadcast; + postMessageAcceptanceFailed(uint32, int8) broadcast; + postGroupAlreadyFull() broadcast; + postSomethingMissing() broadcast; + postRejectBoard(uint32, int8, uint32 [], uint32 []) broadcast; + postRejectGoto(uint32, int8, uint32 [], uint32 []) broadcast; + postMessageInvited(uint32, uint32) broadcast; + postMessageInvitationFailed(uint32) broadcast; + acceptGoToFirstTime(uint32) broadcast; + acceptGoToSecondTime(uint32) broadcast; + rejectGoToRequest(uint32, int8, uint32 [], uint32 []) broadcast; + requestInvite(uint32) airecv clsend; + requestCancelInvite(uint32) airecv clsend; + requestAcceptInvite(uint32, uint32) airecv clsend; + requestRejectInvite(uint32, uint32) airecv clsend; + requestKick(uint32) airecv clsend; + requestLeave(uint32) airecv clsend; + requestBoard(uint32) airecv clsend; + requestGoToFirstTime(uint32) airecv clsend; + requestGoToSecondTime(uint32) airecv clsend; + setElevatorIdList(uint32[]) required broadcast ram; + setGroupSize(uint8) required broadcast ram; +}; + +dclass DistributedTutorialInterior : DistributedObject { + setZoneIdAndBlock(uint32, uint16) required broadcast ram; + setTutorialNpcId(uint32) required broadcast ram; +}; + +dclass DistributedBankMgr : DistributedObject { + transferMoney(int16) airecv clsend; +}; + +dclass DistributedMailbox : DistributedObject { + setHouseId(uint32) required broadcast ram; + setHousePos(uint8) required broadcast ram; + setName(string) required broadcast ram; + setFullIndicator(uint8) broadcast ram; + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + freeAvatar(); + setMovie(uint8, uint32) broadcast ram; + acceptItemMessage(uint16, blob, uint8, int32) airecv clsend; + acceptItemResponse(uint16, int8); + discardItemMessage(uint16, blob, uint8, int32) airecv clsend; + discardItemResponse(uint16, int8); + acceptInviteMessage(uint16, uint64) airecv clsend; + rejectInviteMessage(uint16, uint64) airecv clsend; + markInviteReadButNotReplied(uint64) airecv clsend; +}; + +dclass DistributedFurnitureManager : DistributedObject { + setOwnerId(uint32 ownerId) required broadcast ram; + setOwnerName(string ownerName) required broadcast ram; + setInteriorId(uint32 interiorId) required broadcast ram; + setAtticItems(blob atticItems) required broadcast ram; + setAtticWallpaper(blob atticWallpaper) required broadcast ram; + setAtticWindows(blob atticWindows) required broadcast ram; + setDeletedItems(blob deletedItems) required broadcast ram; + suggestDirector(uint32 directorId) airecv clsend; + setDirector(uint32 directorId) broadcast ram; + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + moveItemToAtticMessage(uint32 doId, uint16 context) airecv clsend; + moveItemToAtticResponse(int8 retval, uint16 context); + moveItemFromAtticMessage(uint16 index, int16/10 x, int16/10 y, int16/100 z, int16/10 h, int16/10 p, int16/10 r, uint16 context) airecv clsend; + moveItemFromAtticResponse(int8 retval, uint32 doId, uint16 context); + deleteItemFromAtticMessage(blob item, uint16 index, uint16 context) airecv clsend; + deleteItemFromAtticResponse(int8 retval, uint16 context); + deleteItemFromRoomMessage(blob item, uint32 doId, uint16 context) airecv clsend; + deleteItemFromRoomResponse(int8 retval, uint16 context); + moveWallpaperFromAtticMessage(uint16 index, uint8 room, uint16 context) airecv clsend; + moveWallpaperFromAtticResponse(int8 retval, uint16 context); + deleteWallpaperFromAtticMessage(blob item, uint16 index, uint16 context) airecv clsend; + deleteWallpaperFromAtticResponse(int8 retval, uint16 context); + moveWindowToAtticMessage(uint8 slot, uint16 context) airecv clsend; + moveWindowToAtticResponse(int8 retval, uint16 context); + moveWindowFromAtticMessage(uint16 index, uint8 slot, uint16 context) airecv clsend; + moveWindowFromAtticResponse(int8 retval, uint16 context); + moveWindowMessage(uint8 fromSlot, uint8 toSlot, uint16 context) airecv clsend; + moveWindowResponse(int8 retval, uint16 context); + deleteWindowFromAtticMessage(blob item, uint16 index, uint16 context) airecv clsend; + deleteWindowFromAtticResponse(int8 retval, uint16 context); + recoverDeletedItemMessage(blob item, uint16 index, uint16 context) airecv clsend; + recoverDeletedItemResponse(int8 retval, uint16 context); +}; + +dclass DistributedFurnitureItem : DistributedSmoothNode { + setItem(uint32 furnitureMgrId, blob item) required broadcast ram; + requestPosHpr(uint8 final, int16/10 x, int16/10 y, int16/100 z, int16/10 h, int16/10 p, int16/10 r, int16 t) airecv clsend; + setMode(uint8 mdoe, uint32 avId) required broadcast ram; +}; + +dclass DistributedBank : DistributedFurnitureItem { + avatarEnter() airecv clsend; + freeAvatar(); + setMovie(uint8, uint32, int16) broadcast ram; + transferMoney(int16) airecv clsend; +}; + +dclass DistributedBankCollectable : DistributedObject { + requestGrab() airecv clsend; + grab(uint32) broadcast ram; +}; + +dclass DistributedCloset : DistributedFurnitureItem { + setOwnerId(uint32) required broadcast ram; + enterAvatar() airecv clsend; + freeAvatar(); + removeItem(blob, uint8) airecv clsend; + setDNA(blob, int8, uint8) airecv clsend; + setState(uint8, uint32, uint32, string, uint8[], uint8[]) broadcast ram; + setMovie(uint8, uint32, int16) broadcast ram; + resetItemLists() broadcast ram; + setCustomerDNA(uint32, blob) broadcast ram; +}; + +dclass DistributedTrunk : DistributedCloset { + setState(uint8, uint32, uint32, string, uint8[], uint8[], uint8[], uint8[]) broadcast ram; + removeItem(uint8, uint8, uint8, uint8) airecv clsend; + setDNA(uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, int8, uint8) airecv clsend; + setCustomerDNA(uint32, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8) broadcast ram; +}; + +dclass DistributedPhone : DistributedFurnitureItem { + setInitialScale(uint8/170, uint8/170, uint8/170) required broadcast ram; + setNewScale(uint8/170, uint8/170, uint8/170) airecv clsend; + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + freeAvatar(); + setLimits(uint16); + setMovie(uint8, uint32, int32) broadcast ram; + requestPurchaseMessage(uint16, blob, int32) airecv clsend; + requestPurchaseResponse(uint16, int8); + requestGiftPurchaseMessage(uint16, uint32, blob, int32) airecv clsend; + requestGiftPurchaseResponse(uint16, int8); + purchaseItemComplete(); +}; + +dclass DistributedFireworkShow : DistributedObject { + startShow(uint8, uint8, uint8, int16) broadcast ram; + requestFirework(int16/10, int16/10, int16/100, uint8, uint8, uint8) airecv clsend; + shootFirework(int16/10, int16/10, int16/100, uint8, uint8, uint8) broadcast; +}; + +dclass DistributedFireworksCannon : DistributedFireworkShow { + avatarEnter() airecv clsend; + avatarExit() airecv clsend; + freeAvatar(); + setMovie(uint8, uint32, int16) broadcast ram; + setPosition(int16/10, int16/10, int16/10) required broadcast ram; +}; + +dclass LobbyManager : DistributedObject { +}; + +dclass DistributedFactory : DistributedLevel { + setFactoryId(uint16) required broadcast ram; + setSuits(uint32[], uint32[]) broadcast ram; + setForemanConfronted(uint32) broadcast ram; + setDefeated() broadcast ram; +}; + +dclass DistributedMegaCorp: DistributedFactory { +}; + +dclass DistributedLawOffice : DistributedObject { + setLawOfficeId(uint16) required broadcast ram; + startSignal() broadcast ram; + readyForNextFloor() airecv clsend; +}; + +dclass DistributedLawOfficeFloor : DistributedLevel { + setLawOfficeId(uint16) required broadcast ram; + setSuits(uint32[], uint32[]) broadcast ram; + readyForNextFloor() airecv clsend; + setForemanConfronted(uint32) broadcast ram; + setDefeated() broadcast ram; +}; + +dclass DistributedMint : DistributedObject { + setZoneId(uint32) required broadcast ram; + setMintId(uint16) required broadcast ram; + setFloorNum(uint8) required broadcast ram; + setRoomDoIds(uint32[]) broadcast ram; +}; + +dclass DistributedMintRoom : DistributedLevel { + setMintId(uint16) required broadcast ram; + setRoomId(uint16) required broadcast ram; + setRoomNum(uint8) required broadcast ram; + setSuits(uint32[], uint32[]) broadcast ram; + setBossConfronted(uint32) broadcast ram; + setDefeated() broadcast ram; +}; + +dclass DistributedStage : DistributedObject { + setZoneId(uint32) required broadcast ram; + setStageId(uint16) required broadcast ram; + setLayoutIndex(uint16) required broadcast ram; + setFloorNum(uint8) required broadcast ram; + setRoomDoIds(uint32[]) broadcast ram; + setStageZone(uint32) broadcast ram; + elevatorAlert(uint32) broadcast ram; +}; + +dclass DistributedStageRoom : DistributedLevel { + setStageId(uint16) required broadcast ram; + setRoomId(uint16) required broadcast ram; + setRoomNum(uint8) required broadcast ram; + setSuits(uint32[], uint32[]) broadcast ram; + setBossConfronted(uint32) broadcast ram; + setDefeated() broadcast ram; +}; + +dclass DistributedInGameEditor : DistributedObject { + setEditorAvId(uint32) required broadcast ram; + setEditUsername(blob) required broadcast ram; + setLevelDoId(uint32) required broadcast ram; + requestCurrentLevelSpec() airecv clsend; + setSpecSenderDoId(uint32); + setEdit(uint32, blob, blob, blob) airecv clsend; + setAttribChange(uint32, blob, blob, blob); + setFinished() airecv clsend; +}; + +dclass DistributedLift : DistributedEntity { + setStateTransition(uint8, uint8, uint32) required broadcast ram; + setAvatarEnter() airecv clsend; + setAvatarLeave() airecv clsend; +}; + +dclass DistributedDoorEntity : DistributedEntity { + setLocksState(uint16) required broadcast ram; + setDoorState(uint8, int32) required broadcast ram; + requestOpen() airecv clsend; +}; + +dclass DistributedSwitch : DistributedInteractiveEntity { +}; + +dclass DistributedButton : DistributedSwitch { +}; + +dclass DistributedTrigger : DistributedSwitch { +}; + +dclass DistributedCrushableEntity : DistributedEntity { + setPosition(int16/10, int16/10, int16/10) broadcast ram; + setCrushed(uint32, uint8) broadcast ram; +}; + +dclass DistributedCrusherEntity : DistributedEntity { +}; + +dclass DistributedElevatorMarker : DistributedEntity { +}; + +dclass DistributedStomper : DistributedCrusherEntity { + setMovie(uint8, int16, uint32[]) broadcast ram; +}; + +dclass DistributedStomperPair : DistributedEntity { + setChildren(uint32[]) broadcast ram; + setSquash() airecv clsend; +}; + +dclass DistributedBarrelBase : DistributedEntity { + requestGrab() airecv clsend; + setGrab(uint32) broadcast ram; + setReject() broadcast; +}; + +dclass DistributedGagBarrel : DistributedBarrelBase { +}; + +dclass DistributedBeanBarrel : DistributedBarrelBase { +}; + +dclass DistributedHealBarrel : DistributedBarrelBase { +}; + +dclass DistributedGrid : DistributedEntity { +}; + +dclass ActiveCell : DistributedEntity { + setState(uint8, uint32) broadcast ram; +}; + +dclass DirectionalCell : ActiveCell { +}; + +dclass CrusherCell : ActiveCell { +}; + +dclass DistributedCrate : DistributedCrushableEntity { + requestPush(uint8) airecv clsend; + setReject(); + setAccept() broadcast; + setMoveTo(uint32, int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) broadcast ram; + setDone() airecv clsend; +}; + +dclass DistributedSinkingPlatform : DistributedEntity { + setOnOff(uint8, uint32) airecv clsend; + setSinkMode(uint32, uint8, uint32) broadcast ram; +}; + +dclass DistributedGoon : DistributedCrushableEntity { + requestBattle(int16/10) airecv clsend; + requestStunned(int16/10) airecv clsend; + requestResync() airecv clsend; + setParameterize(int16/10, int16/10, int16/10, uint32) airecv clsend; + setMovie(uint8, uint32, int32/10, int16) broadcast ram; +}; + +dclass DistributedGridGoon : DistributedGoon { + setPathPts(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) broadcast ram; +}; + +dclass BattleBlocker : DistributedEntity { + setActive(uint8) required broadcast ram; + setSuits(uint32[]) broadcast ram; + setBattle(uint32) broadcast ram; + setBattleFinished() broadcast ram; +}; + +dclass DistributedLaserField : BattleBlocker { + setGrid(uint8, uint8) required broadcast ram; + setField(uint8 []) required broadcast ram; + setSuccess(uint8) broadcast ram; + hit(int8, int8, int8, int8) airecv clsend; + trapFire() airecv clsend; + setActiveLF(uint8) broadcast ram; + hideSuit(uint32[]) broadcast ram; + showSuit(uint32[]) broadcast ram; + setGridGame(string) broadcast ram; +}; + +struct golfGreenGameBoardData { + uint8 posX; + uint8 posZ; + uint8 typeIndex; +}; + +struct golfGreenGameScoreData { + uint32 avId; + uint8 score; +}; + +dclass DistributedGolfGreenGame : BattleBlocker { + requestJoin() airecv clsend; + leaveGame() airecv clsend; + acceptJoin(uint16, int32, uint32 []) broadcast ram; + requestBoard(uint8) airecv clsend; + startBoard(golfGreenGameBoardData [], uint8 []); + signalDone(uint8) broadcast ram; + boardCleared(uint32); + scoreData(uint8, uint8, golfGreenGameScoreData []) broadcast ram; + informGag(uint8, uint8); + helpOthers(uint32) broadcast; + setTimerStart(uint16, int32) broadcast ram; +}; + +dclass DistributedSecurityCamera : DistributedEntity { + trapFire() airecv clsend; + setTarget(uint8) broadcast ram; +}; + +dclass DistributedMover : DistributedEntity { + startMove(int16) broadcast ram; +}; + +typedef uint16/10000 PetTrait; + +dclass DistributedPet : DistributedSmoothNode { + string DcObjectType db; + setOwnerId(uint32) required broadcast db; + setPetName(string) required broadcast db; + setTraitSeed(uint32) required broadcast db; + setSafeZone(uint32) required broadcast db; + setForgetfulness(PetTrait) required broadcast db; + setBoredomThreshold(PetTrait) required broadcast db; + setRestlessnessThreshold(PetTrait) required broadcast db; + setPlayfulnessThreshold(PetTrait) required broadcast db; + setLonelinessThreshold(PetTrait) required broadcast db; + setSadnessThreshold(PetTrait) required broadcast db; + setFatigueThreshold(PetTrait) required broadcast db; + setHungerThreshold(PetTrait) required broadcast db; + setConfusionThreshold(PetTrait) required broadcast db; + setExcitementThreshold(PetTrait) required broadcast db; + setAngerThreshold(PetTrait) required broadcast db; + setSurpriseThreshold(PetTrait) required broadcast db; + setAffectionThreshold(PetTrait) required broadcast db; + setHead(int8(-1 - 1)) required broadcast db; // Supposed to be -1 - 0, but minification causes this to become -1-0, which is a parse problem. + setEars(int8(-1 - 4)) required broadcast db; + setNose(int8(-1 - 3)) required broadcast db; + setTail(int8(-1 - 6)) required broadcast db; + setBodyTexture(int8(0-6)) required broadcast db; + setColor(int8(0-25)) required broadcast db; + setColorScale(int8(0-8)) required broadcast db; + setEyeColor(int8(0-5)) required broadcast db; + setGender(int8(0-1)) required broadcast db; + setLastSeenTimestamp(uint32) required broadcast db; + setBoredom(uint16/1000(0-1)) required broadcast db; + setRestlessness(uint16/1000(0-1)) required broadcast db; + setPlayfulness(uint16/1000(0-1)) required broadcast db; + setLoneliness(uint16/1000(0-1)) required broadcast db; + setSadness(uint16/1000(0-1)) required broadcast db; + setAffection(uint16/1000(0-1)) required broadcast db; + setHunger(uint16/1000(0-1)) required broadcast db; + setConfusion(uint16/1000(0-1)) required broadcast db; + setExcitement(uint16/1000(0-1)) required broadcast db; + setFatigue(uint16/1000(0-1)) required broadcast db; + setAnger(uint16/1000(0-1)) required broadcast db; + setSurprise(uint16/1000(0-1)) required broadcast db; + setMood : setBoredom, setRestlessness, setPlayfulness, setLoneliness, setSadness, setAffection, setHunger, setConfusion, setExcitement, setFatigue, setAnger, setSurprise; + teleportIn(int16) broadcast ownsend; + teleportOut(int16) broadcast ownsend; + setTrickAptitudes(uint16/10000(0-1) []) required broadcast db; + doTrick(uint8, int16) broadcast ram; + avatarInteract(uint32); + setMovie(uint8, uint32, int16) broadcast ram; + freeAvatar(); +}; + +dclass DistributedPetProxy : DistributedPet { + setDominantMood(string) broadcast ram; +}; + +dclass DistributedAprilToonsMgr : DistributedObject { + setEventActive(uint8 eventId, bool) broadcast; + requestEventsList() clsend airecv; + requestEventsListResp(uint8 []); +}; + +dclass DistributedBlackCatMgr : DistributedObject { + doBlackCatTransformation(uint32 avId) broadcast; + requestBlackCatTransformation() airecv clsend; +}; + +dclass DistributedPolarBearMgr : DistributedObject { + doPolarBearTransformation(uint32 avId) broadcast; + requestPolarBearTransformation() airecv clsend; +}; + +dclass DistributedPolarPlaceEffectMgr : DistributedObject { + addPolarPlaceEffect() airecv clsend; +}; + +dclass DistributedGreenToonEffectMgr : DistributedObject { + addGreenToonEffect() airecv clsend; +}; + +dclass DistributedResistanceEmoteMgr : DistributedObject { + addResistanceEmote() clsend airecv; +}; + +dclass DistributedScavengerHuntTarget : DistributedObject { + attemptScavengerHunt() airecv clsend; +}; + +dclass DistributedTrickOrTreatTarget : DistributedObject { + doScavengerHunt(int8); + requestScavengerHunt() airecv clsend; +}; + +dclass DistributedWinterCarolingTarget : DistributedObject { + doScavengerHunt(int8) broadcast; + requestScavengerHunt() airecv clsend; +}; + +dclass DistributedDataStoreManager : DistributedObject { + startStore(uint8); + stopStore(uint8); + queryStore(uint8, string); + receiveResults(uint8, string); + deleteBackupStores(); +}; + +dclass DistributedVehicle : DistributedSmoothNode { + setOwner(uint32) required broadcast ram; + setState(char, uint32) broadcast ram; + setBodyType(int8) required broadcast ram; + setBodyColor(int8) required broadcast ram; + setAccessoryColor(int8) required broadcast ram; + setEngineBlockType(int8) required broadcast ram; + setSpoilerType(int8) required broadcast ram; + setFrontWheelWellType(int8) required broadcast ram; + setBackWheelWellType(int8) required broadcast ram; + setRimType(int8) required broadcast ram; + setDecalType(int8) required broadcast ram; + requestControl() airecv clsend; + requestParked() airecv clsend; + setInput(int8) broadcast ram; +}; + +struct avatarAndKart { + uint32 avId; + uint32 kartId; +}; + +dclass DistributedRace : DistributedObject { + setZoneId(uint32) required broadcast ram; + setTrackId(uint16) required broadcast ram; + setRaceType(uint16) required broadcast ram; + setCircuitLoop(uint16[]) required broadcast ram; + setAvatars(uint32[]) required broadcast ram; + setStartingPlaces(uint8[]) required broadcast ram; + setLapCount(uint8) broadcast required ram; + waitingForJoin() broadcast ram; + setEnteredRacers(avatarAndKart []) broadcast ram; + prepForRace() broadcast ram; + startTutorial() broadcast ram; + startRace(int16) broadcast ram; + goToSpeedway(uint32[], uint8) broadcast ram; + genGag(uint8, uint16, uint8) broadcast ram; + dropAnvilOn(uint32, uint32, int16) broadcast ram; + shootPiejectile(uint32, uint32, uint8) broadcast ram; + racerDisconnected(uint32) broadcast ram; + setPlace(uint32, uint32/1000, uint8, uint32, uint8, uint32, uint32, uint32[], uint16[], uint32/1000) broadcast ram; + setCircuitPlace(uint32, uint8, uint32, uint32, uint32, uint32[]) broadcast ram; + endCircuitRace() broadcast ram; + setRaceZone(uint32, uint32); + hasGag(uint8, uint8, uint8) broadcast airecv clsend; + racerLeft(uint32) clsend airecv broadcast ram; + heresMyT(uint32, int8, uint16/65535, int16) clsend airecv broadcast; + requestThrow(int32/1000, int32/1000, int32/1000) clsend airecv; + requestKart() clsend airecv; +}; + +dclass DistributedGag : DistributedObject { + setInitTime(int16) required broadcast ram; + setActivateTime(int16) required broadcast ram; + setPos(int32/1000, int32/1000, int32/1000) required broadcast ram; + setRace(uint32) required broadcast ram; + setOwnerId(uint32) required broadcast ram; + setType(uint8) required broadcast ram; + hitSomebody(uint32, int16) broadcast clsend airecv; +}; + +dclass DistributedProjectile : DistributedObject { + setInitTime(int16) required broadcast ram; + setPos(int32/1000, int32/1000, int32/1000) required broadcast ram; + setRace(uint32) required broadcast ram; + setOwnerId(uint32) required broadcast ram; + setType(uint8) required broadcast ram; + hitSomebody(uint32, int16) broadcast clsend airecv; +}; + +dclass DistributedKartPad : DistributedObject { + setArea(uint32) required broadcast ram; +}; + +dclass DistributedRacePad : DistributedKartPad { + setState(string, int16) required broadcast ram; + setRaceZone(uint32); + setTrackInfo(uint16[]) required broadcast ram; +}; + +dclass DistributedViewPad : DistributedKartPad { + setLastEntered(int16) required broadcast ram; +}; + +dclass DistributedStartingBlock : DistributedObject { + setPadDoId(uint32) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + setPadLocationId(uint8) required broadcast ram; + requestEnter(uint8) airecv clsend; + rejectEnter(uint8); + requestExit() airecv clsend; + setOccupied(uint32) broadcast ram; + setMovie(uint8) broadcast ram; + movieFinished() airecv clsend; +}; + +dclass DistributedViewingBlock : DistributedStartingBlock { +}; + +dclass DistributedLeaderBoard : DistributedObject { + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + setDisplay(blob) broadcast ram; +}; + +dclass DistributedDeliveryManager : DistributedObject { + hello(string) clsend; + rejectHello(string); + helloResponse(string); + getName(uint32); + receiveRejectGetName(string); + receiveAcceptGetName(string); + addName(uint32, string); + receiveRejectAddName(uint32); + receiveAcceptAddName(uint32); + addGift(uint32, blob, uint32, uint32, uint32); + receiveRejectAddGift(uint32); + receiveAcceptAddGift(uint32, uint32, uint32, uint32); + deliverGifts(uint32, uint32); + receiveAcceptDeliverGifts(uint32, string); + receiveRejectDeliverGifts(uint32, string); + receiveRequestPayForGift(blob, uint32, uint32) airecv clsend; + receiveRequestPurchaseGift(blob, uint32, uint32, uint32) airecv; + receiveAcceptPurchaseGift(uint32, uint32, int16); + receiveRejectPurchaseGift(uint32, uint32, int16, uint16); + heartbeat() airecv; + giveBeanBonus(uint32, uint16); + requestAck() clsend; + returnAck(); + givePartyRefund(uint32, uint32, uint64, int8, uint16); +}; + +dclass DistributedLawbotBoss : DistributedBossCog { + setState(string) broadcast ram; + setBossDamage(uint16, uint8, int16) broadcast ram; + touchWitnessStand() airecv clsend; + hitBoss(uint8) airecv clsend; + healBoss(uint8) airecv clsend; + hitToon(uint32) airecv clsend; + hitDefensePan() airecv clsend; + hitProsecutionPan() airecv clsend; + hitChair(uint8, uint8) airecv clsend; + setLawyerIds(uint32[]) broadcast ram; + setTaunt(int8, int8) broadcast; + toonGotHealed(uint32) broadcast; + enteredBonusState() broadcast; + setBattleDifficulty(uint8) broadcast ram; +}; + +dclass DistributedLawbotBossSuit : DistributedSuitBase { + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + doAttack(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) broadcast; + doProsecute() broadcast; + hitByToon() airecv clsend; + doStun() broadcast; +}; + +dclass DistributedLawbotBossGavel : DistributedObject { + setBossCogId(uint32) required broadcast ram; + setIndex(uint8) required broadcast ram; + setState(char) broadcast ram; +}; + +dclass DistributedLawbotCannon : DistributedObject { + setBossCogId(uint32) required broadcast ram; + setIndex(uint8) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + requestEnter() airecv clsend; + setMovie(int8, uint32, uint8) broadcast; + setCannonPosition(int16/10, int16/10) airecv clsend; + updateCannonPosition(uint32, int16/10, int16/10) broadcast; + setCannonLit(int16/10, int16/10) airecv clsend; + setCannonWillFire(uint32, int16/10, int16/10, int16/10, int16) broadcast; + setLanded() airecv clsend; + requestLeave() airecv clsend; +}; + +dclass DistributedLawbotChair : DistributedObject { + setBossCogId(uint32) required broadcast ram; + setIndex(uint8) required broadcast ram; + setState(char) broadcast ram; + showCogJurorFlying() broadcast; + setToonJurorIndex(int8) broadcast ram; +}; + +dclass DistributedLawnDecor : DistributedNode { + setPlot(int8) required broadcast ram; + setHeading(int16/10) required broadcast ram; + setPosition(int16/10, int16/10, int16/10) required broadcast ram; + setOwnerIndex(int8) required broadcast ram; + plotEntered() airecv clsend; + removeItem() airecv clsend; + setMovie(uint8, uint32) broadcast ram; + movieDone() airecv clsend; + interactionDenied(uint32) broadcast ram; +}; + +dclass DistributedGardenPlot : DistributedLawnDecor { + plantFlower(uint8, uint8) airecv clsend; + plantGagTree(uint8, uint8) airecv clsend; + plantStatuary(uint8) airecv clsend; + plantToonStatuary(uint8, uint16) airecv clsend; + plantNothing(uint8) airecv clsend; +}; + +dclass DistributedGardenBox : DistributedLawnDecor { + setTypeIndex(uint8) required broadcast ram; +}; + +dclass DistributedStatuary : DistributedLawnDecor { + setTypeIndex(uint8) required broadcast ram; + setWaterLevel(int8) required broadcast ram; + setGrowthLevel(int8) required broadcast ram; +}; + +dclass DistributedToonStatuary : DistributedStatuary { + setOptional(uint16) required broadcast ram; +}; + +dclass DistributedAnimatedStatuary : DistributedStatuary { +}; + +dclass DistributedChangingStatuary : DistributedStatuary { + setGrowthLevel(int8) required broadcast ram; +}; + +dclass DistributedPlantBase : DistributedLawnDecor { + setTypeIndex(uint8) required broadcast ram; + setWaterLevel(int8) required broadcast ram; + setGrowthLevel(int8) required broadcast ram; + waterPlant() airecv clsend; + waterPlantDone() airecv clsend; +}; + +dclass DistributedFlower : DistributedPlantBase { + setTypeIndex(uint8) required broadcast ram; + setVariety(uint8) required broadcast ram; +}; + +dclass DistributedGagTree : DistributedPlantBase { + setWilted(int8) required broadcast ram; + requestHarvest() airecv clsend; +}; + +dclass DistributedTravelGame : DistributedMinigame { + setTimerStartTime(int16) broadcast; + setAvatarChoice(uint16, uint8) airecv clsend; + setAvatarVotes(uint32, uint16) broadcast; + setAvatarChose(uint32) broadcast; + setServerChoices(int16[], uint8[], uint8, uint8) broadcast; + setMinigames(uint8[], uint8[]) broadcast; + setBonuses(uint8[], uint8[]) broadcast; + setBoardIndex(uint8) required broadcast ram; +}; + +dclass DistributedPairingGame : DistributedMinigame { + setDeckSeed(uint32) required broadcast ram; + setMaxOpenCards(uint8) broadcast ram; + openCardRequest(int16, int16) airecv clsend; + openCardResult(int16, uint32, int16, int8, int16[]) broadcast; + reportDone() airecv clsend; + setEveryoneDone() broadcast; + setSignaling(uint32) clsend broadcast; +}; + +struct golfData { + int16 frame; + int32/100000 x; + int32/100000 y; + int32/100000 z; +}; + +struct Coord3 { + int32/100000 x; + int32/100000 y; + int32/100000 z; +}; + +struct CommonObjectData { + uint8 id; + uint8 type; + int32/100000 x; + int32/100000 y; + int32/100000 z; + int32/100000 q1; + int32/100000 q2; + int32/100000 q3; + int32/100000 q4; + int32/100000 aVX; + int32/100000 aVY; + int32/100000 aVZ; + int32/100000 lVX; + int32/100000 lVY; + int32/100000 lVZ; +}; + +dclass DistributedPhysicsWorld : DistributedObject { + clientCommonObject(uint8, uint8, Coord3, Coord3, int32/100, int32/100, int32/1000) broadcast ram; + setCommonObjects(CommonObjectData []) broadcast; + upSetCommonObjects(CommonObjectData []) airecv clsend; +}; + +dclass DistributedGolfHole : DistributedPhysicsWorld { + setHoleId(int8) broadcast ram required; + setTimingCycleLength(uint32/1000) broadcast ram required; + setAvatarReadyHole() airecv clsend; + setGolfCourseDoId(uint32) broadcast ram required; + turnDone() airecv clsend; + ballInHole() airecv clsend; + setAvatarTempTee(uint32, uint8) clsend broadcast; + setTempAimHeading(uint32, int32/1000) clsend broadcast; + setAvatarFinalTee(uint32, uint8) broadcast; + setGolferIds(uint32[]) broadcast ram required; + golfersTurn(uint32) broadcast; + golferChooseTee(uint32) broadcast; + setAvatarTee(uint8) airecv clsend; + postSwing(uint32/1000, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) airecv clsend; + postSwingState(uint32/1000, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, uint16/100, CommonObjectData []) airecv clsend; + swing(uint32, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) broadcast; + ballMovie2AI(uint32/1000, uint32, golfData [], golfData [], uint16, uint16, uint16, CommonObjectData []) airecv clsend; + ballMovie2Client(uint32/1000, uint32, golfData [], golfData [], uint16, uint16, uint16, CommonObjectData []) broadcast; + assignRecordSwing(uint32, uint32/1000, int32, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, CommonObjectData []); + setBox(int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) airecv clsend; + sendBox(int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000, int32/1000) broadcast; +}; + +dclass DistributedGolfCourse : DistributedObject { + setGolferIds(uint32[]) broadcast ram required; + setCourseId(int8) broadcast ram required; + setAvatarJoined() airecv clsend; + setAvatarReadyCourse() airecv clsend; + setAvatarReadyHole() airecv clsend; + setAvatarExited() airecv clsend; + setCurHoleIndex(int8) broadcast ram required; + setCurHoleDoId(uint32) broadcast ram required; + setDoneReward() airecv clsend; + setReward(uint8[] [], int8[], uint8[] [], uint8[] [], uint8[] [], uint32, uint32/100, uint32/100, uint32/100, uint32/100) broadcast; + setCourseReady(int8, int16[], int8) broadcast; + setHoleStart(int16) broadcast; + setCourseExit() broadcast; + setCourseAbort(uint32) broadcast; + setPlayHole() broadcast; + avExited(uint32) broadcast; + setScores(int16 []) broadcast; + changeDrivePermission(uint32, int8) broadcast; +}; + +dclass DistributedVineGame : DistributedMinigame { + reachedEndVine(int8) clsend airecv; + setNewVine(uint32, int8, uint32/10000, int8) airecv clsend broadcast; + setNewVineT(uint32, uint32/10000, int8) clsend broadcast; + setJumpingFromVine(uint32, int8, int8, int32/100, int16/100, int16/100, int16) clsend broadcast; + claimTreasure(uint32) airecv clsend; + setTreasureGrabbed(uint32, uint32) broadcast; + setScore(uint32, uint32) broadcast; + allAtEndVine() broadcast; + setFallingFromVine(uint32, int8, int8, int32/100, int16/100, int16/100, int16, int8) clsend broadcast; + setFallingFromMidair(uint32, int8, int32/100, int16/100, int16/100, int16, int8) clsend broadcast; + setVineSections(uint8[]) required broadcast ram; +}; + +dclass TTAvatarFriendsManager : AvatarFriendsManager { +}; + +dclass TTPlayerFriendsManager : PlayerFriendsManager { +}; + +dclass DistributedGolfKart : DistributedObject { + setState(string, int16) broadcast ram; + fillSlot0(uint32) broadcast ram; + fillSlot1(uint32) broadcast ram; + fillSlot2(uint32) broadcast ram; + fillSlot3(uint32) broadcast ram; + emptySlot0(uint32, int16) broadcast ram; + emptySlot1(uint32, int16) broadcast ram; + emptySlot2(uint32, int16) broadcast ram; + emptySlot3(uint32, int16) broadcast ram; + requestBoard() airecv clsend; + rejectBoard(uint32); + requestExit() airecv clsend; + setMinigameZone(uint32, uint16); + setGolfZone(uint32, uint16); + setGolfCourse(int8) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + setColor(int16, int16, int16) required broadcast ram; +}; + +dclass DistributedTimer : DistributedObject { + setStartTime(int32) broadcast ram required; +}; + +dclass DistributedPicnicBasket : DistributedObject { + setState(string, uint16, int16) broadcast ram; + fillSlot0(uint32) broadcast ram; + fillSlot1(uint32) broadcast ram; + fillSlot2(uint32) broadcast ram; + fillSlot3(uint32) broadcast ram; + emptySlot0(uint32, int16) broadcast ram; + emptySlot1(uint32, int16) broadcast ram; + emptySlot2(uint32, int16) broadcast ram; + emptySlot3(uint32, int16) broadcast ram; + requestBoard(int16) airecv clsend; + rejectBoard(uint32); + requestExit() airecv clsend; + doneExit() airecv clsend; + setMinigameZone(uint32, uint16); + setPicnicDone(); + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + setTableNumber(int16) required broadcast ram; +}; + +dclass DistributedGameTable : DistributedObject { + requestJoin(uint8) airecv clsend; + rejectJoin(); + requestExit() airecv clsend; + fillSlot0(uint32) broadcast ram; + fillSlot1(uint32) broadcast ram; + fillSlot2(uint32) broadcast ram; + fillSlot3(uint32) broadcast ram; + fillSlot4(uint32) broadcast ram; + fillSlot5(uint32) broadcast ram; + emptySlot0(uint32, int16) broadcast ram; + emptySlot1(uint32, int16) broadcast ram; + emptySlot2(uint32, int16) broadcast ram; + emptySlot3(uint32, int16) broadcast ram; + emptySlot4(uint32, int16) broadcast ram; + emptySlot5(uint32, int16) broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + announceWinner(uint32) broadcast; +}; + +dclass DistributedBossbotBoss : DistributedBossCog { + setState(string) broadcast ram; + setBattleDifficulty(uint8) broadcast ram; + requestGetFood(int8, int8, uint32) airecv clsend; + toonGotFood(uint32, int8, int8, uint32) broadcast; + requestServeFood(int8, int8) airecv clsend; + toonServeFood(uint32, int8, int8) broadcast; + hitBoss(uint8) airecv clsend; + hitToon(uint32) airecv clsend; + ballHitBoss(uint8) airecv clsend; + setBossDamage(uint16, uint8, int16) broadcast ram; + setSpeedDamage(uint16, uint8, int16) broadcast ram; + reachedTable(uint8) airecv clsend; + hitTable(uint8) airecv clsend; + awayFromTable(uint8) airecv clsend; + toonGotHealed(uint32) broadcast; + requestGetToonup(int8, int8, uint32) airecv clsend; + toonGotToonup(uint32, int8, int8, uint32) broadcast; +}; + +dclass DistributedCogKart : DistributedElevatorExt { + setCountryClubId(uint16) required broadcast ram; + setPosHpr(int16/10, int16/10, int16/10, int16/10, int16/10, int16/10) required broadcast ram; + setCountryClubInteriorZone(uint32); + setCountryClubInteriorZoneForce(uint32); +}; + +dclass DistributedCountryClub : DistributedObject { + setZoneId(uint32) required broadcast ram; + setBlockedRooms(uint8[]) required broadcast ram; + setCountryClubId(uint16) required broadcast ram; + setLayoutIndex(uint16) required broadcast ram; + setFloorNum(uint8) required broadcast ram; + setRoomDoIds(uint32[]) broadcast ram; + setCountryClubZone(uint32) broadcast ram; + elevatorAlert(uint32) broadcast ram; +}; + +dclass DistributedCountryClubRoom : DistributedLevel { + setCountryClubId(uint16) required broadcast ram; + setRoomId(uint16) required broadcast ram; + setRoomNum(uint8) required broadcast ram; + setSuits(uint32[], uint32[]) broadcast ram; + setBossConfronted(uint32) broadcast ram; + setDefeated() broadcast ram; + forceOuch(uint8) broadcast; +}; + +dclass DistributedMoleField : DistributedEntity { + setGameStart(int16, uint8, uint16) broadcast; + setClientTriggered() airecv clsend; + whackedMole(int8, int16) airecv clsend; + whackedBomb(int8, int16, int32) airecv clsend; + updateMole(int8, int8) broadcast; + reportToonHitByBomb(uint32, int8, int32) broadcast; + setScore(int16) required broadcast ram; + damageMe() airecv clsend; + setPityWin() broadcast; +}; + +dclass DistributedCountryClubBattle : DistributedLevelBattle { +}; + +dclass DistributedClubElevator : DistributedElevatorFSM { + setFloor(int8) broadcast ram; + setLocked(uint16) required broadcast ram; + setEntering(uint16) required broadcast ram; + kickToonsOut() broadcast; + setLatch(uint32) required broadcast ram; +}; + +dclass DistributedMaze : DistributedEntity { + setRoomDoId(uint32) required broadcast ram; + setGameStart(int16) broadcast; + setClientTriggered() airecv clsend; + setFinishedMaze() airecv clsend; + setGameOver() broadcast; + toonFinished(uint32, uint8, uint8) broadcast; + damageMe() airecv clsend; +}; + +dclass DistributedBattleWaiters : DistributedBattleFinal { +}; + +dclass DistributedFoodBelt : DistributedObject { + setBossCogId(uint32) required broadcast ram; + setIndex(uint8) required broadcast ram; + setState(char) broadcast ram; +}; + +dclass DistributedBanquetTable : DistributedObject { + setIndex(uint8) required broadcast ram; + setNumDiners(uint8) required broadcast ram; + setBossCogId(uint32) required broadcast ram; + setDinerInfo(uint8[], uint8[], uint8[]) required broadcast ram; + setState(char, uint32, int8) broadcast ram; + setDinerStatus(uint8, uint8) broadcast; + requestControl() airecv clsend; + requestFree(int8) airecv clsend; + setPitcherPos(uint8, uint16%360/100, int16) broadcast clsend; + clearSmoothing(int8) broadcast clsend; + firingWater(int32/100, int32/100, int32/100, int32/100, int32/100, int32/100) broadcast clsend; + waterHitBoss(uint8) broadcast clsend; +}; + +dclass DistributedBattleDiners : DistributedBattleFinal { +}; + +dclass DistributedGolfSpot : DistributedObject { + setIndex(uint8) required broadcast ram; + setBossCogId(uint32) required broadcast ram; + setState(char, uint32, int8) broadcast ram; + setGoingToReward() broadcast ram; + requestControl() airecv clsend; + requestFree(int8) airecv clsend; + setGolfSpotPos(uint8, uint16%360/100, int16) broadcast clsend; + clearSmoothing(int8) broadcast clsend; + setSwingInfo(uint8, int16/10, uint8) broadcast clsend; +}; + +struct TireInput { + int32/100 force; + int32/100 heading; +}; + +dclass DistributedIceGame : DistributedMinigame { + setForceArrowInfo(uint32, int32/100, int32/100) broadcast clsend; + setAvatarChoice(int32/100, int32/100) airecv clsend; + endingPositions(Coord3 []) airecv clsend; + reportScoringMovieDone() airecv clsend; + claimTreasure(uint8) airecv clsend; + claimPenalty(uint8) airecv clsend; + setTireInputs(TireInput []) broadcast; + setTimerStartTime(int16) broadcast; + setFinalPositions(Coord3 []) broadcast; + setMatchAndRound(int8, int8) broadcast; + setScores(int8, int8, int16[]) broadcast; + setNewState(string) broadcast; + setTreasureGrabbed(uint32, uint32) broadcast; + setPenaltyGrabbed(uint32, uint32) broadcast; +}; + +dclass DistributedCogThiefGame : DistributedMinigame { + throwingPie(uint32, int32, int32/100, int32/100, int32/100, int32/100) clsend broadcast; + hitBySuit(uint32, int32, int8, int32/100, int32/100, int32/100) clsend broadcast airecv; + pieHitSuit(uint32, int32, int8, int32/100, int32/100, int32/100) clsend broadcast airecv; + cogHitBarrel(int32, int8, int8, int32/100, int32/100, int32/100) clsend airecv; + cogAtReturnPos(int32, int8, int8) clsend airecv; + updateSuitGoal(int32, int32, int8, int8, int64, int32/100, int32/100, int32/100) broadcast; + makeCogCarryBarrel(int32, int32, int8, int8, int32/100, int32/100, int32/100) broadcast; + makeCogDropBarrel(int32, int32, int8, int8, int32/100, int32/100, int32/100) broadcast; + markBarrelStolen(int32, int32, int8) broadcast; +}; + +struct twoDTreasureInfo { + uint8 treasureIndex; + uint8 treasureValue; +}; + +struct twoDSectionInfo { + uint8 sectionIndex; + uint8 enemyIndicesSelected[]; + twoDTreasureInfo treasureIndicesSelected[]; + uint8 spawnPointIndicesSelected[]; + uint8 stomperIndicesSelected[]; +}; + +dclass DistributedTwoDGame : DistributedMinigame { + showShootGun(uint32, int16) clsend broadcast; + toonHitByEnemy(uint32, int16) clsend broadcast airecv; + toonFellDown(uint32, int16) clsend broadcast airecv; + toonSquished(uint32, int16) clsend broadcast airecv; + toonVictory(uint32, int16) clsend broadcast airecv; + claimTreasure(uint8, uint8) airecv clsend; + claimEnemyShot(uint8, uint8) airecv clsend; + reportDone() airecv clsend; + setSectionsSelected(twoDSectionInfo []) required broadcast ram; + setTreasureGrabbed(uint32, uint8, uint8) broadcast; + setEnemyShot(uint32, uint8, uint8, uint32) broadcast; + addVictoryScore(uint32, uint8) broadcast; + setEveryoneDone() broadcast; +}; + +dclass DistributedChineseCheckers : DistributedNode { + requestExit() clsend airecv; + requestBegin() clsend airecv; + requestMove(uint8 []) clsend airecv; + requestTimer() clsend airecv; + requestSeatPositions() clsend airecv; + startBeginTimer(uint16, int16) broadcast ram; + gameStart(uint8) broadcast; + setTableDoId(uint32) required broadcast ram; + setGameState(uint8 [], uint8 []) required broadcast ram; + setTimer(int16) broadcast ram required; + setTurnTimer(int16) broadcast ram required; + sendTurn(uint8) broadcast ram; + requestWin() clsend airecv; + announceWin(uint32) broadcast; + announceSeatPositions(uint8 []) broadcast; +}; + +dclass DistributedCheckers : DistributedNode { + requestExit() clsend airecv; + requestBegin() clsend airecv; + requestTimer() clsend airecv; + requestMove(uint8 []) clsend airecv; + startBeginTimer(uint16, int16) broadcast ram; + gameStart(uint8) broadcast; + setTableDoId(uint32) required broadcast ram; + setGameState(uint8 [], uint8 []) required broadcast ram; + setTimer(int16) broadcast ram required; + setTurnTimer(int16) broadcast ram required; + sendTurn(uint8) broadcast ram; + requestWin() clsend airecv; + announceWin(uint32) broadcast; + illegalMove() broadcast; +}; + +dclass DistributedFindFour : DistributedNode { + requestExit() clsend airecv; + requestBegin() clsend airecv; + requestMove(uint8) clsend airecv; + requestTimer() clsend airecv; + requestWin(uint8 []) clsend airecv; + startBeginTimer(uint16, int16) broadcast ram; + setTableDoId(uint32) required broadcast ram; + setGameState(uint8 [][], uint8, uint8, uint8) required broadcast ram; + setTimer(int16) broadcast ram required; + setTurnTimer(int16) broadcast ram required; + gameStart(uint8) broadcast; + sendTurn(uint8) broadcast ram; + announceWin(uint32) broadcast; + announceWinLocation(uint8, uint8, uint8, uint8) broadcast; + announceWinnerPosition(uint8, uint8, uint8, uint8) broadcast; + illegalMove() broadcast; + tie() broadcast; +}; + +dclass DistributedMailManager : DistributedObject { + sendSimpleMail(uint32, uint32, string); + setNumMailItems(uint32, uint32) airecv; +}; + +dclass DistributedPartyManager : DistributedObject { + addParty(uint32, uint32, string, string, int8, int8, activity [], decoration [], uint32[], uint16); + addPartyRequest(uint32, char [0-256], char [0-256], int8, int8, activity [], decoration [], uint32[]) airecv clsend; + addPartyResponse(uint32, int8); + addPartyResponseUdToAi(uint64, int8, party) airecv; + + markInviteAsReadButNotReplied(uint32, uint64); + respondToInvite(uint32, uint32, uint16, uint64, uint8); + respondToInviteResponse(uint32, uint16, uint64, int8, uint8) airecv; + + changePrivateRequest(uint64, int8) airecv clsend; + changePrivateRequestAiToUd(uint32, uint64, int8); + changePrivateResponseUdToAi(uint32, uint64, int8, int8) airecv; + changePrivateResponse(uint64, int8, int8); + + changePartyStatusRequest(uint64, int8) airecv clsend; + changePartyStatusRequestAiToUd(uint32, uint64, int8); + changePartyStatusResponseUdToAi(uint32, uint64, int8, int8) airecv; + changePartyStatusResponse(uint64, int8, int8, uint16); + + partyInfoOfHostRequestAiToUd(uint32, uint32); + partyInfoOfHostFailedResponseUdToAi(uint32) airecv; + partyInfoOfHostResponseUdToAi(party, uint32[]) airecv; + + givePartyRefundResponse(uint32, uint64, int8, uint16, uint32); + getPartyZone(uint32, uint32, uint8) clsend airecv; + receivePartyZone(uint32, uint64, uint32); + freeZoneIdFromPlannedParty(uint32, uint32) clsend airecv; + + sendAvToPlayground(uint32, uint8); + exitParty(uint32) clsend airecv; + removeGuest(uint32, uint32) airecv clsend; + partyManagerAIStartingUp(uint32, uint32); + partyManagerAIGoingDown(uint32, uint32); + partyHasStartedAiToUd(uint64 partyId, uint32 shardId, uint32 zoneId, string hostName); + toonHasEnteredPartyAiToUd(uint32); + toonHasExitedPartyAiToUd(uint32); + partyHasFinishedUdToAllAi(uint64 partyId) airecv; + updateToPublicPartyInfoUdToAllAi(uint32 shardId, uint32 zoneId, uint64 partyId, uint32 hostId, uint8 numGuests, uint8 maxGuests, string hostName, uint8 activities[], uint8 minLeft) airecv; + updateToPublicPartyCountUdToAllAi(uint32 partyCount, uint64 partyId) airecv; + requestShardIdZoneIdForHostId(uint32) clsend airecv; + sendShardIdZoneIdToAvatar(uint32, uint32); + partyManagerUdStartingUp() airecv; + partyManagerUdLost() airecv; + updateAllPartyInfoToUd(uint32, uint64, uint32, uint32, uint8, uint8, string, uint8 [], uint64); + forceCheckStart(); + requestMw(uint32, string, uint32, uint32); + mwResponseUdToAllAi(uint32, string, uint32, uint32) airecv; + receiveId(uint64 ids[]) airecv; +}; + +dclass DistributedObjectGlobal : DistributedObject { +}; + +dclass GlobalPartyManager : DistributedObjectGlobal { + partyManagerAIHello(uint32 channel); + queryParty(uint32 hostId); + addParty(DoId avId, uint64 partyId, string start, string end, int8 isPrivate, + int8 inviteTheme, activity [], decoration [], DoIdList inviteeIds); + partyHasStarted(uint64 partyId, uint32 shardId, uint32 zoneId, string hostName); + toonJoinedParty(uint64 partyId, uint32 avId); + toonLeftParty(uint64 partyId, uint32 avId); + requestPartySlot(uint64 partyId, uint32 avId, uint32 gateId); + partyDone(uint64 partyId); + allocIds(uint16 count); +}; + +struct PotentialToon { + uint32 avNum; + string avName; + string avDNA; + uint8 avPosition; + uint8 aname; +}; + +dclass ClientServicesManager : DistributedObjectGlobal { + login(string cookie, char auth [0-256]) clsend; + acceptLogin(uint32 timestamp); + + requestAvatars() clsend; + setAvatars(PotentialToon[]); + + createAvatar(blob dna, uint8 index) clsend; + createAvatarResp(uint32 avId); + + setNameTyped(uint32 avId, string name) clsend; + setNameTypedResp(uint32 avId, uint8 status); + setNamePattern(uint32 avId, int16 p1, uint8 f1, int16 p2, uint8 f2, int16 p3, uint8 f3, int16 p4, uint8 f4) clsend; + setNamePatternResp(uint32 avId, uint8 status); + + acknowledgeAvatarName(uint32 avId) clsend; + acknowledgeAvatarNameResp(); + + deleteAvatar(uint32 avId) clsend; + + chooseAvatar(uint32 avId) clsend; + + systemMessage(string message); +}; + +dclass AwardManager : DistributedObjectGlobal { + giveAwardToToon(uint32, DoId, string, DoId, uint32, uint32); +}; + +dclass DistributedCpuInfoMgr : DistributedObjectGlobal { + setCpuInfoToUd(uint32, uint32, string, string); +}; + +dclass NonRepeatableRandomSourceClient { + getRandomSamplesReply(uint32, uint32 []) airecv; +}; + +dclass TTCodeRedemptionMgr : DistributedObject, NonRepeatableRandomSourceClient { + redeemCode(uint32, char [0-256]) airecv clsend; + redeemCodeResult(uint32, uint32, uint32); +}; + +dclass NonRepeatableRandomSource : DistributedObject, NonRepeatableRandomSourceClient { + getRandomSamples(DoId, string, uint32, uint32); + randomSample(DoId, uint32); + randomSampleAck() airecv; +}; + +dclass DistributedInGameNewsMgr : DistributedObjectGlobal { + setLatestIssueStr(string) required broadcast ram; + inGameNewsMgrAIStartingUp(uint32, uint32); + newIssueUDtoAI(string) airecv; +}; + +struct Friend +{ +uint32 doId; +string name; +blob dna; +uint32 petId; +}; + +dclass TTUFriendsManager : DistributedObjectGlobal { + removeFriend(uint32) clsend; + requestAvatarInfo(uint32[]) clsend; + + requestFriendsList() clsend; + + friendInfo(Friend); + friendList(Friend []); + + friendOnline(uint32, uint8, uint8); + friendOffline(uint32); + + goingOffline(uint32 avId); + + getAvatarDetails(uint32) clsend; + friendDetails(uint32, blob, uint16[], uint16, int16, int16, uint32, uint32, blob, blob, int8[]); + + routeTeleportQuery(uint32 toId) clsend; + teleportQuery(uint32 fromId); + + teleportResponse(uint32 fromId, uint8 tpAvailable, uint32 defaultShard, uint32 hoodId, uint32 zoneId) clsend; + setTeleportResponse(uint32 toId, uint8 tpAvailable, uint32 defaultShard, uint32 hoodId, uint32 zoneId); + + whisperSCTo(uint32 toId, uint16 msgIndex) clsend; + setWhisperSCFrom(uint32 fromId, uint16 msgIndex); + + whisperSCCustomTo(uint32 toId, uint16 msgIndex) clsend; + setWhisperSCCustomFrom(uint32 fromId, uint16 msgIndex); + + whisperSCEmoteTo(uint32 toId, uint16 emoteId) clsend; + setWhisperSCEmoteFrom(uint32 fromId, uint16 emoteId); + + requestSecret() clsend; + requestSecretResponse(int8 status, string secret); + + submitSecret(string(0-256) secret) clsend; + submitSecretResponse(int8 status, int32 avId); + + sendTalkWhisper(uint32 toId, string message) clsend; + receiveTalkWhisper(uint32 fromId, string message); + + battleSOS(uint32 toId) clsend; + setBattleSOS(uint32 fromId); + + teleportGiveup(uint32 toId) clsend; + setTeleportGiveup(uint32 fromId); + + whisperSCToontaskTo(uint32, uint32, uint32, uint32, uint8) clsend; + setWhisperSCToontaskFrom(uint32, uint32, uint32, uint32, uint8); + + sleepAutoReply(uint32 toId) clsend; + setSleepAutoReply(uint32 fromId); +}; + + +dclass DistributedPhaseEventMgr : DistributedObject { + setNumPhases(uint8) required broadcast ram; + setDates(datetime []) broadcast required; + setCurPhase(int8) required broadcast ram; + setIsRunning(bool) required broadcast ram; +}; + +dclass DistributedHydrantZeroMgr : DistributedPhaseEventMgr { +}; + +dclass DistributedMailboxZeroMgr : DistributedPhaseEventMgr { +}; + +dclass DistributedTrashcanZeroMgr : DistributedPhaseEventMgr { +}; + +dclass DistributedSillyMeterMgr : DistributedPhaseEventMgr { +}; diff --git a/config/general.prc b/config/general.prc index 1f6631ad..5843f841 100644 --- a/config/general.prc +++ b/config/general.prc @@ -1,130 +1,135 @@ -# Window settings: -window-title Toontown Unlimited -win-origin -1 -1 -icon-filename phase_3/etc/icon.ico -cursor-filename phase_3/etc/toonmono.cur - -# Audio: -audio-library-name p3fmod_audio - -# Graphics: -aux-display pandagl -aux-display pandadx9 -aux-display p3tinydisplay - -# Models: -model-cache-models #f -model-cache-textures #f -default-model-extension .bam - -# Textures: -texture-anisotropic-degree 16 - -# Preferences: -preferences-filename preferences.json - -# Content packs: -content-packs-filepath contentpacks/ -content-packs-sort-filename sort.yaml - -# Backups: -backups-filepath backups/ -backups-extension .json - -# Server: -server-timezone EST/EDT/-5 -server-port 7199 -account-server-endpoint https://toontownunlimited.com/api/ -account-bridge-filename astron/databases/account-bridge.db - -# Performance: -sync-video #f -texture-power-2 none -gl-check-errors #f -garbage-collect-states #f - -# Egg object types: -egg-object-type-barrier collide-mask { 0x01 } { Polyset descend } -egg-object-type-trigger collide-mask { 0x01 } { Polyset descend intangible } -egg-object-type-sphere collide-mask { 0x01 } { Sphere descend } -egg-object-type-trigger-sphere collide-mask { 0x01 } { Sphere descend intangible } -egg-object-type-floor collide-mask { 0x02 } { Polyset descend } -egg-object-type-dupefloor collide-mask { 0x02 } { Polyset keep descend } -egg-object-type-camera-collide collide-mask { 0x04 } { Polyset descend } -egg-object-type-camera-collide-sphere collide-mask { 0x04 } { Sphere descend } -egg-object-type-camera-barrier collide-mask { 0x05 } { Polyset descend } -egg-object-type-camera-barrier-sphere collide-mask { 0x05 } { Sphere descend } -egg-object-type-model { 1 } -egg-object-type-dcs { 1 } - -# Safe zones: -want-safe-zones #t -want-toontown-central #t -want-donalds-dock #t -want-daisys-garden #t -want-minnies-melodyland #t -want-the-burrrgh #t -want-donalds-dreamland #t -want-goofy-speedway #t -want-outdoor-zone #t -want-golf-zone #t - -# Safe zone settings: -want-treasure-planners #t -want-suit-planners #t -want-butterflies #f - -# Classic characters: -want-classic-chars #t -want-mickey #t -want-donald-dock #t -want-daisy #t -want-minnie #t -want-pluto #t -want-donald-dreamland #t -want-chip-and-dale #t -want-goofy #t - -# Trolley minigames: -want-minigames #t -want-photo-game #f -want-travel-game #f - -# Picnic table board games: -want-game-tables #f - -# Cog headquarters: -want-cog-headquarters #t -want-sellbot-headquarters #t -want-cashbot-headquarters #t -want-lawbot-headquarters #t -want-bossbot-headquarters #t - -# Cashbot boss: -want-resistance-toonup #t -want-resistance-restock #t -want-resistance-dance #f - -# Cog battles: -base-xp-multiplier 1.0 - -# Cog buildings: -want-cogbuildings #t - -# Optional: -show-total-population #t -want-mat-all-tailors #t -want-long-pattern-game #f -want-talkative-tyler #f -want-yin-yang #f - -# Developer options: -want-dev #f -want-pstats 0 - -# Temporary: -smooth-lag 0.4 -want-old-fireworks #t - -# Live updates: +# Window settings: +window-title Toontown Unlimited +win-origin -1 -1 +icon-filename phase_3/etc/icon.ico +cursor-filename phase_3/etc/toonmono.cur + +# Audio: +audio-library-name p3fmod_audio + +# Graphics: +aux-display pandagl +aux-display pandadx9 +aux-display p3tinydisplay + +# Models: +model-cache-models #f +model-cache-textures #f +default-model-extension .bam + +# Textures: +texture-anisotropic-degree 16 + +# Preferences: +preferences-filename preferences.json + +# Content packs: +content-packs-filepath contentpacks/ +content-packs-sort-filename sort.yaml + +# Backups: +backups-filepath backups/ +backups-extension .json + +# Server: +server-timezone EST/EDT/-5 +server-port 7199 +account-server-endpoint https://toontownunlimited.com/api/ +account-bridge-filename astron/databases/account-bridge.db + +# Performance: +sync-video #f +texture-power-2 none +gl-check-errors #f +garbage-collect-states #f + +# Egg object types: +egg-object-type-barrier collide-mask { 0x01 } { Polyset descend } +egg-object-type-trigger collide-mask { 0x01 } { Polyset descend intangible } +egg-object-type-sphere collide-mask { 0x01 } { Sphere descend } +egg-object-type-trigger-sphere collide-mask { 0x01 } { Sphere descend intangible } +egg-object-type-floor collide-mask { 0x02 } { Polyset descend } +egg-object-type-dupefloor collide-mask { 0x02 } { Polyset keep descend } +egg-object-type-camera-collide collide-mask { 0x04 } { Polyset descend } +egg-object-type-camera-collide-sphere collide-mask { 0x04 } { Sphere descend } +egg-object-type-camera-barrier collide-mask { 0x05 } { Polyset descend } +egg-object-type-camera-barrier-sphere collide-mask { 0x05 } { Sphere descend } +egg-object-type-model { 1 } +egg-object-type-dcs { 1 } + +# Safe zones: +want-safe-zones #t +want-toontown-central #t +want-donalds-dock #t +want-daisys-garden #t +want-minnies-melodyland #t +want-the-burrrgh #t +want-donalds-dreamland #t +want-goofy-speedway #t +want-outdoor-zone #t +want-golf-zone #t + +# Safe zone settings: +want-treasure-planners #t +want-suit-planners #t +want-butterflies #f + +# Classic characters: +want-classic-chars #t +want-mickey #t +want-donald-dock #t +want-daisy #t +want-minnie #t +want-pluto #t +want-donald-dreamland #t +want-chip-and-dale #t +want-goofy #t + +# Trolley minigames: +want-minigames #t +want-photo-game #f +want-travel-game #f + +# Picnic table board games: +want-game-tables #f + +# Cog headquarters: +want-cog-headquarters #t +want-sellbot-headquarters #t +want-cashbot-headquarters #t +want-lawbot-headquarters #t +want-bossbot-headquarters #t + +# Cashbot boss: +want-resistance-toonup #t +want-resistance-restock #t +want-resistance-dance #f + +# Cog battles: +base-xp-multiplier 1.0 + +# Cog Dominiums +want-emblems #t +cogdo-want-barrel-room #t +want-lawbot-cogdo #t + +# Cog buildings: +want-cogbuildings #t + +# Optional: +show-total-population #t +want-mat-all-tailors #t +want-long-pattern-game #f +want-talkative-tyler #f +want-yin-yang #f + +# Developer options: +want-dev #f +want-pstats 0 + +# Temporary: +smooth-lag 0.4 +want-old-fireworks #t + +# Live updates: want-live-updates #t \ No newline at end of file diff --git a/otp/distributed/DCClassImports.py b/otp/distributed/DCClassImports.py index 7b063f86..6a9fbdec 100644 --- a/otp/distributed/DCClassImports.py +++ b/otp/distributed/DCClassImports.py @@ -1,58 +1,58 @@ -# This file was generated by the parse_dclass.py utility. -from pandac.PandaModules import * - - -hashVal = 1165841663 - - -from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot -from toontown.golf import DistributedPhysicsWorld, DistributedGolfHole, DistributedGolfCourse -from toontown.building import DistributedAnimatedProp, DistributedTrophyMgr, DistributedBuilding, DistributedAnimBuilding, DistributedBuildingQueryMgr, DistributedToonInterior, DistributedToonHallInterior, DistributedSuitInterior, DistributedHQInterior, DistributedGagshopInterior, DistributedPetshopInterior, DistributedKartShopInterior, DistributedBankInterior, DistributedBankCollectable, DistributedLibraryInterior, DistributedDoor, DistributedAnimDoor, DistributedKnockKnockDoor, DistributedElevator, DistributedElevatorFSM, DistributedElevatorExt, DistributedElevatorInt, DistributedElevatorFloor, DistributedBossElevator, DistributedVPElevator, DistributedCFOElevator, DistributedCJElevator, DistributedBBElevator, DistributedBoardingParty, DistributedTutorialInterior, DistributedClubElevator -from toontown.uberdog.DistributedPartyManager import DistributedPartyManager -from otp.friends import FriendManager, AvatarFriendsManager, PlayerFriendsManager, GuildManager, FriendInfo, AvatarFriendInfo -from otp.level import DistributedLevel, DistributedEntity, DistributedInteractiveEntity -from toontown.shtiker import DeleteManager, PurchaseManager, NewbiePurchaseManager -from toontown.pets import DistributedPetProxy -from toontown.uberdog.ClientServicesManager import ClientServicesManager -from toontown.ai import WelcomeValleyManager, NewsManager, DistributedAprilToonsMgr, DistributedBlackCatMgr, DistributedPolarBearMgr, DistributedPolarPlaceEffectMgr, DistributedGreenToonEffectMgr, DistributedResistanceEmoteMgr, DistributedScavengerHuntTarget, DistributedTrickOrTreatTarget, DistributedWinterCarolingTarget, DistributedSillyMeterMgr -from toontown.ai.DistributedTrashcanZeroMgr import DistributedTrashcanZeroMgr -from toontown.uberdog.DistributedMailManager import DistributedMailManager -from otp.chat import ChatAgent -from toontown.classicchars import DistributedCCharBase, DistributedMickey, DistributedVampireMickey, DistributedMinnie, DistributedWitchMinnie, DistributedGoofy, DistributedSuperGoofy, DistributedDaisy, DistributedSockHopDaisy, DistributedChip, DistributedPoliceChip, DistributedDale, DistributedJailbirdDale, DistributedGoofySpeedway, DistributedDonald, DistributedFrankenDonald, DistributedDonaldDock, DistributedPluto, DistributedWesternPluto -from toontown.uberdog.DistributedCpuInfoMgr import DistributedCpuInfoMgr -from toontown.parties.GlobalPartyManager import GlobalPartyManager -from toontown.racing.DistributedStartingBlock import DistributedViewingBlock -from toontown.ai.DistributedPhaseEventMgr import DistributedPhaseEventMgr -from toontown.pets.PetDCImports import * -from toontown.suit import DistributedSuitPlanner, DistributedSuitBase, DistributedSuit, DistributedTutorialSuit, DistributedFactorySuit, DistributedMintSuit, DistributedStageSuit, DistributedSellbotBoss, DistributedCashbotBoss, DistributedCashbotBossGoon, DistributedGoon, DistributedGridGoon, DistributedLawbotBoss, DistributedLawbotBossSuit, DistributedBossbotBoss -from toontown.distributed import ToontownDistrict, ToontownDistrictStats, DistributedTimer -from toontown.effects import DistributedFireworkShow -from toontown.uberdog.DistributedDataStoreManager import DistributedDataStoreManager -from toontown.safezone import DistributedTrolley, DistributedPartyGate, DistributedBoat, DistributedButterfly, DistributedMMPiano, DistributedDGFlower, DistributedFishingSpot, SafeZoneManager, DistributedTreasure, DistributedGolfKart, DistributedPicnicBasket, DistributedGameTable, DistributedChineseCheckers, DistributedCheckers, DistributedFindFour -from toontown.fishing import DistributedFishingPond, DistributedFishingTarget, DistributedPondBingoManager -from toontown.minigame import DistributedMinigame, DistributedMinigameTemplate, DistributedRaceGame, DistributedCannonGame, DistributedPhotoGame, DistributedPatternGame, DistributedRingGame, DistributedTagGame, DistributedMazeGame, DistributedTugOfWarGame, DistributedCatchGame, DistributedDivingGame, DistributedTargetGame, DistributedTravelGame, DistributedPairingGame, DistributedVineGame, DistributedIceGame, DistributedCogThiefGame, DistributedTwoDGame -from toontown.racing import DistributedVehicle, DistributedStartingBlock, DistributedRace, DistributedKartPad, DistributedRacePad, DistributedViewPad, DistributedStartingBlock, DistributedLeaderBoard, DistributedGag, DistributedProjectile -from toontown.distributed.NonRepeatableRandomSourceUD import NonRepeatableRandomSourceUD -from toontown.catalog import CatalogManager -from toontown.ai.DistributedHydrantZeroMgr import DistributedHydrantZeroMgr -from toontown.rpc.AwardManager import AwardManager -from toontown.parties import DistributedParty, DistributedPartyActivity, DistributedPartyTeamActivity, DistributedPartyCannon, DistributedPartyCannonActivity, DistributedPartyCatchActivity, DistributedPartyWinterCatchActivity, DistributedPartyCogActivity, DistributedPartyWinterCogActivity, DistributedPartyFireworksActivity, DistributedPartyDanceActivityBase, DistributedPartyDanceActivity, DistributedPartyDance20Activity, DistributedPartyValentineDanceActivity, DistributedPartyValentineDance20Activity, DistributedPartyTrampolineActivity, DistributedPartyValentineTrampolineActivity, DistributedPartyVictoryTrampolineActivity, DistributedPartyWinterTrampolineActivity, DistributedPartyTugOfWarActivity, DistributedPartyJukeboxActivityBase, DistributedPartyJukeboxActivity, DistributedPartyJukebox40Activity, DistributedPartyValentineJukeboxActivity, DistributedPartyValentineJukebox40Activity -from toontown.uberdog.DistributedInGameNewsMgr import DistributedInGameNewsMgr -from toontown.coghq.InGameEditorDCImports import * -from toontown.friends import TTPlayerFriendsManager, TTUFriendsManager -from toontown.cogdominium import DistributedCogdoInterior, DistributedCogdoBattleBldg, DistributedCogdoElevatorExt, DistributedCogdoElevatorInt, DistributedCogdoBarrel, DistCogdoGame, DistCogdoLevelGame, DistCogdoBoardroomGame, DistCogdoCraneGame, DistCogdoMazeGame, DistCogdoFlyingGame, DistCogdoCrane, DistCogdoCraneMoneyBag, DistCogdoCraneCog -from otp.distributed import Account, ObjectServer, DistributedDistrict, DistributedDirectory, DistributedTestObject, CentralLogger -from toontown.estate import DistributedCannon, DistributedTarget, EstateManager, DistributedEstate, DistributedHouse, DistributedHouseInterior, DistributedGarden, DistributedHouseDoor, DistributedBankMgr, DistributedMailbox, DistributedFurnitureManager, DistributedFurnitureItem, DistributedBank, DistributedCloset, DistributedTrunk, DistributedPhone, DistributedFireworksCannon, DistributedLawnDecor, DistributedGardenPlot, DistributedGardenBox, DistributedFlower, DistributedGagTree, DistributedStatuary, DistributedToonStatuary, DistributedChangingStatuary, DistributedAnimatedStatuary, DistributedPlantBase, DistributedLawnDecor -from toontown.toon import DistributedToon, DistributedNPCToonBase, DistributedNPCToon, DistributedSmartNPC, DistributedSmartNPC, DistributedNPCSpecialQuestGiver, DistributedNPCFlippyInToonHall, DistributedNPCScientist, DistributedNPCClerk, DistributedNPCTailor, DistributedNPCBlocker, DistributedNPCFisherman, DistributedNPCPartyPerson, DistributedNPCPetclerk, DistributedNPCKartClerk, DistributedNPCYin, DistributedNPCYang, DistributedNPCBanker -from toontown.tutorial import DistributedBattleTutorial, TutorialManager -from toontown.coderedemption.TTCodeRedemptionMgr import TTCodeRedemptionMgr -from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI -from toontown.ai.DistributedMailboxZeroMgr import DistributedMailboxZeroMgr -from toontown.uberdog.DistributedDeliveryManager import DistributedDeliveryManager -from direct.distributed import DistributedObject, DistributedNode, DistributedSmoothNode, DistributedCartesianGrid, DistributedCamera, DistributedObjectGlobal -from otp.ai import TimeManager, MagicWordManager -from otp.avatar import DistributedAvatar, DistributedPlayer, AvatarHandle -from toontown.battle import DistributedBattleBase, DistributedBattle, DistributedBattleBldg, DistributedBattleFinal, DistributedBattleWaiters, DistributedBattleDiners - - -dcImports = locals().copy() +# This file was generated by the parse_dclass.py utility. +from pandac.PandaModules import * + + +hashVal = 2177730225L + + +from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot +from toontown.golf import DistributedPhysicsWorld, DistributedGolfHole, DistributedGolfCourse +from toontown.building import DistributedAnimatedProp, DistributedTrophyMgr, DistributedBuilding, DistributedAnimBuilding, DistributedBuildingQueryMgr, DistributedToonInterior, DistributedToonHallInterior, DistributedSuitInterior, DistributedHQInterior, DistributedGagshopInterior, DistributedPetshopInterior, DistributedKartShopInterior, DistributedBankInterior, DistributedBankCollectable, DistributedLibraryInterior, DistributedDoor, DistributedAnimDoor, DistributedKnockKnockDoor, DistributedElevator, DistributedElevatorFSM, DistributedElevatorExt, DistributedElevatorInt, DistributedElevatorFloor, DistributedBossElevator, DistributedVPElevator, DistributedCFOElevator, DistributedCJElevator, DistributedBBElevator, DistributedBoardingParty, DistributedTutorialInterior, DistributedClubElevator +from toontown.uberdog.DistributedPartyManager import DistributedPartyManager +from otp.friends import FriendManager, AvatarFriendsManager, PlayerFriendsManager, GuildManager, FriendInfo, AvatarFriendInfo +from otp.level import DistributedLevel, DistributedEntity, DistributedInteractiveEntity +from toontown.shtiker import DeleteManager, PurchaseManager, NewbiePurchaseManager +from toontown.pets import DistributedPetProxy +from toontown.uberdog.ClientServicesManager import ClientServicesManager +from toontown.ai import WelcomeValleyManager, NewsManager, DistributedAprilToonsMgr, DistributedBlackCatMgr, DistributedPolarBearMgr, DistributedPolarPlaceEffectMgr, DistributedGreenToonEffectMgr, DistributedResistanceEmoteMgr, DistributedScavengerHuntTarget, DistributedTrickOrTreatTarget, DistributedWinterCarolingTarget, DistributedSillyMeterMgr +from toontown.ai.DistributedTrashcanZeroMgr import DistributedTrashcanZeroMgr +from toontown.uberdog.DistributedMailManager import DistributedMailManager +from otp.chat import ChatAgent +from toontown.classicchars import DistributedCCharBase, DistributedMickey, DistributedVampireMickey, DistributedMinnie, DistributedWitchMinnie, DistributedGoofy, DistributedSuperGoofy, DistributedDaisy, DistributedSockHopDaisy, DistributedChip, DistributedPoliceChip, DistributedDale, DistributedJailbirdDale, DistributedGoofySpeedway, DistributedDonald, DistributedFrankenDonald, DistributedDonaldDock, DistributedPluto, DistributedWesternPluto +from toontown.uberdog.DistributedCpuInfoMgr import DistributedCpuInfoMgr +from toontown.parties.GlobalPartyManager import GlobalPartyManager +from toontown.racing.DistributedStartingBlock import DistributedViewingBlock +from toontown.ai.DistributedPhaseEventMgr import DistributedPhaseEventMgr +from toontown.pets.PetDCImports import * +from toontown.suit import DistributedSuitPlanner, DistributedSuitBase, DistributedSuit, DistributedTutorialSuit, DistributedFactorySuit, DistributedMintSuit, DistributedStageSuit, DistributedSellbotBoss, DistributedCashbotBoss, DistributedCashbotBossGoon, DistributedGoon, DistributedGridGoon, DistributedLawbotBoss, DistributedLawbotBossSuit, DistributedBossbotBoss +from toontown.distributed import ToontownDistrict, ToontownDistrictStats, DistributedTimer +from toontown.effects import DistributedFireworkShow +from toontown.uberdog.DistributedDataStoreManager import DistributedDataStoreManager +from toontown.safezone import DistributedTrolley, DistributedPartyGate, DistributedBoat, DistributedButterfly, DistributedMMPiano, DistributedDGFlower, DistributedFishingSpot, SafeZoneManager, DistributedTreasure, DistributedGolfKart, DistributedPicnicBasket, DistributedGameTable, DistributedChineseCheckers, DistributedCheckers, DistributedFindFour +from toontown.fishing import DistributedFishingPond, DistributedFishingTarget, DistributedPondBingoManager +from toontown.minigame import DistributedMinigame, DistributedMinigameTemplate, DistributedRaceGame, DistributedCannonGame, DistributedPhotoGame, DistributedPatternGame, DistributedRingGame, DistributedTagGame, DistributedMazeGame, DistributedTugOfWarGame, DistributedCatchGame, DistributedDivingGame, DistributedTargetGame, DistributedTravelGame, DistributedPairingGame, DistributedVineGame, DistributedIceGame, DistributedCogThiefGame, DistributedTwoDGame +from toontown.racing import DistributedVehicle, DistributedStartingBlock, DistributedRace, DistributedKartPad, DistributedRacePad, DistributedViewPad, DistributedStartingBlock, DistributedLeaderBoard, DistributedGag, DistributedProjectile +from toontown.distributed.NonRepeatableRandomSourceUD import NonRepeatableRandomSourceUD +from toontown.catalog import CatalogManager +from toontown.ai.DistributedHydrantZeroMgr import DistributedHydrantZeroMgr +from toontown.rpc.AwardManager import AwardManager +from toontown.parties import DistributedParty, DistributedPartyActivity, DistributedPartyTeamActivity, DistributedPartyCannon, DistributedPartyCannonActivity, DistributedPartyCatchActivity, DistributedPartyWinterCatchActivity, DistributedPartyCogActivity, DistributedPartyWinterCogActivity, DistributedPartyFireworksActivity, DistributedPartyDanceActivityBase, DistributedPartyDanceActivity, DistributedPartyDance20Activity, DistributedPartyValentineDanceActivity, DistributedPartyValentineDance20Activity, DistributedPartyTrampolineActivity, DistributedPartyValentineTrampolineActivity, DistributedPartyVictoryTrampolineActivity, DistributedPartyWinterTrampolineActivity, DistributedPartyTugOfWarActivity, DistributedPartyJukeboxActivityBase, DistributedPartyJukeboxActivity, DistributedPartyJukebox40Activity, DistributedPartyValentineJukeboxActivity, DistributedPartyValentineJukebox40Activity +from toontown.uberdog.DistributedInGameNewsMgr import DistributedInGameNewsMgr +from toontown.coghq.InGameEditorDCImports import * +from toontown.friends import TTPlayerFriendsManager, TTUFriendsManager +from toontown.cogdominium import DistributedCogdoInterior, DistributedCogdoBattleBldg, DistributedCogdoElevatorExt, DistributedCogdoElevatorInt, DistributedCogdoBarrel, DistCogdoGame, DistCogdoLevelGame, DistCogdoBoardroomGame, DistCogdoCraneGame, DistCogdoMazeGame, DistCogdoFlyingGame, DistCogdoCrane, DistCogdoCraneMoneyBag, DistCogdoCraneCog +from otp.distributed import Account, ObjectServer, DistributedDistrict, DistributedDirectory, DistributedTestObject, CentralLogger +from toontown.estate import DistributedCannon, DistributedTarget, EstateManager, DistributedEstate, DistributedHouse, DistributedHouseInterior, DistributedGarden, DistributedHouseDoor, DistributedBankMgr, DistributedMailbox, DistributedFurnitureManager, DistributedFurnitureItem, DistributedBank, DistributedCloset, DistributedTrunk, DistributedPhone, DistributedFireworksCannon, DistributedLawnDecor, DistributedGardenPlot, DistributedGardenBox, DistributedFlower, DistributedGagTree, DistributedStatuary, DistributedToonStatuary, DistributedChangingStatuary, DistributedAnimatedStatuary, DistributedPlantBase, DistributedLawnDecor +from toontown.toon import DistributedToon, DistributedNPCToonBase, DistributedNPCToon, DistributedSmartNPC, DistributedSmartNPC, DistributedNPCSpecialQuestGiver, DistributedNPCFlippyInToonHall, DistributedNPCScientist, DistributedNPCClerk, DistributedNPCTailor, DistributedNPCBlocker, DistributedNPCFisherman, DistributedNPCPartyPerson, DistributedNPCPetclerk, DistributedNPCKartClerk, DistributedNPCYin, DistributedNPCYang, DistributedNPCBanker +from toontown.tutorial import DistributedBattleTutorial, TutorialManager +from toontown.coderedemption.TTCodeRedemptionMgr import TTCodeRedemptionMgr +from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI +from toontown.ai.DistributedMailboxZeroMgr import DistributedMailboxZeroMgr +from toontown.uberdog.DistributedDeliveryManager import DistributedDeliveryManager +from direct.distributed import DistributedObject, DistributedNode, DistributedSmoothNode, DistributedCartesianGrid, DistributedCamera, DistributedObjectGlobal +from otp.ai import TimeManager, MagicWordManager +from otp.avatar import DistributedAvatar, DistributedPlayer, AvatarHandle +from toontown.battle import DistributedBattleBase, DistributedBattle, DistributedBattleBldg, DistributedBattleFinal, DistributedBattleWaiters, DistributedBattleDiners + + +dcImports = locals().copy() diff --git a/toontown/cogdominium/CogdoBarrelRoom.py b/toontown/cogdominium/CogdoBarrelRoom.py index 61d98163..958cd119 100644 --- a/toontown/cogdominium/CogdoBarrelRoom.py +++ b/toontown/cogdominium/CogdoBarrelRoom.py @@ -37,8 +37,6 @@ class CogdoBarrelRoom: self.model.setPos(*CogdoBarrelRoomConsts.BarrelRoomModelPos) self.model.reparentTo(render) self.model.stash() - self.dummyElevInNode = self.model.attachNewNode('elevator-in') - self.dummyElevInNode.hide() self.entranceNode = self.model.attachNewNode('door-entrance') self.entranceNode.setPos(0, -65, 0) self.nearBattleNode = self.model.attachNewNode('near-battle') @@ -49,6 +47,11 @@ class CogdoBarrelRoom: self.fog = Fog('barrel-room-fog') self.fog.setColor(CogdoBarrelRoomConsts.BarrelRoomFogColor) self.fog.setLinearRange(*CogdoBarrelRoomConsts.BarrelRoomFogLinearRange) + self.brBarrel = render.attachNewNode('@@CogdoBarrels') + for i in range(len(CogdoBarrelRoomConsts.BarrelProps)): + self.bPath = self.brBarrel.attachNewNode('%s%s'% (CogdoBarrelRoomConsts.BarrelPathName, i)) + self.bPath.setPos(CogdoBarrelRoomConsts.BarrelProps[i]['pos']) + self.bPath.setH(CogdoBarrelRoomConsts.BarrelProps[i]['heading']) self._isLoaded = True def unload(self): @@ -61,9 +64,10 @@ class CogdoBarrelRoom: if self.rewardUi: self.rewardUi.destroy() self.rewardUi = None - if self.fog: - render.setFogOff() - del self.fog + if hasattr(self, 'fog'): + if self.fog: + render.setFogOff() + del self.fog taskMgr.remove(self.rewardUiTaskName) taskMgr.remove(self.rewardCameraTaskName) self._isLoaded = False @@ -75,8 +79,9 @@ class CogdoBarrelRoom: def show(self): if not self.cogdoBarrelsNode: self.cogdoBarrelsNode = render.find('**/@@CogdoBarrels') - self.cogdoBarrelsNode.reparentTo(self.model) - self.cogdoBarrelsNode.unstash() + if not self.cogdoBarrelsNode.isEmpty(): + self.cogdoBarrelsNode.reparentTo(self.model) + self.cogdoBarrelsNode.unstash() self.defaultFar = base.camLens.getFar() base.camLens.setFar(CogdoBarrelRoomConsts.BarrelRoomCameraFar) self.showBattleAreaLight(True) @@ -85,7 +90,7 @@ class CogdoBarrelRoom: def hide(self): self.model.stash() - render.setFogOff() + #render.setFogOff() if self.defaultFar is not None: base.camLens.setFar(self.defaultFar) return @@ -103,11 +108,11 @@ class CogdoBarrelRoom: self.timer.stash() def placeToonsAtEntrance(self, toons): - for i in xrange(len(toons)): + for i in range(len(toons)): toons[i].setPosHpr(self.entranceNode, *CogdoBarrelRoomConsts.BarrelRoomPlayerSpawnPoints[i]) def placeToonsNearBattle(self, toons): - for i in xrange(len(toons)): + for i in range(len(toons)): toons[i].setPosHpr(self.nearBattleNode, *CogdoBarrelRoomConsts.BarrelRoomPlayerSpawnPoints[i]) def showBattleAreaLight(self, visible = True): @@ -158,10 +163,10 @@ class CogdoBarrelRoom: track = Sequence(Func(camera.reparentTo, render), Func(camera.setPosHpr, self.model, 0, 0, 11.0, 0, -14, 0), Func(self.showBattleAreaLight, False), name=trackName) return (track, trackName) - def showRewardUi(self, results, callback = None): + def showRewardUi(self, callback = None): track, trackName = self.__rewardCamera() if CogdoBarrelRoomConsts.ShowRewardUI: - self.rewardUi.setRewards(results) + self.rewardUi.setRewards() self.rewardUi.unstash() taskMgr.doMethodLater(CogdoBarrelRoomConsts.RewardUiTime, self.__rewardUiTimeout, self.rewardUiTaskName, extraArgs=[callback]) return (track, trackName) diff --git a/toontown/cogdominium/CogdoBarrelRoomConsts.py b/toontown/cogdominium/CogdoBarrelRoomConsts.py index ca4055d1..d665f7cf 100644 --- a/toontown/cogdominium/CogdoBarrelRoomConsts.py +++ b/toontown/cogdominium/CogdoBarrelRoomConsts.py @@ -1,9 +1,9 @@ from pandac.PandaModules import * CollectionTime = 30 -BarrelRoomIntroTimeout = 15.0 +BarrelRoomIntroTimeout = 12.0 RewardUiTime = 5.0 -EndWithAllBarrelsCollected = False -ShowRewardUI = False +EndWithAllBarrelsCollected = True +ShowRewardUI = True AllBarrelsCollectedTime = 5.0 ToonUp = (2, 4) BarrelProps = [{'pos': (-10, -66, 0), @@ -26,7 +26,7 @@ BarrelProps = [{'pos': (-10, -66, 0), 'heading': 141}, {'pos': (10, -14.4, 0), 'heading': 2}] -StomperProps = [{'path': '**/stomper_GRP_01/stomper_cylinder_01', +StomperProps = [{'path': '**/stomper_GRP_01/stomper_cylinder_034', 'motion': 'up'}, {'path': '**/stomper_GRP_02/stomper_cylinder_034', 'motion': 'down'}, @@ -55,6 +55,7 @@ StomperSound = 'phase_9/audio/sfx/CHQ_FACT_stomper_raise.ogg' MaxToons = 4 BarrelRoomModel = 'phase_5/models/cogdominium/tt_m_ara_cbr_barrelRoom' BarrelRoomModelPos = (0, 0, 0) +BarrelRoomElevatorInPath = '**/elevatorIn_locator' BarrelRoomElevatorOutPath = '**/elevatorOut_locator' BarrelRoomPlayerSpawnPoints = [(-4, 0, @@ -83,6 +84,7 @@ BarrelRoomPlayerSpawnPoints = [(-4, BarrelRoomCameraFar = 525.0 BarrelRoomFogColor = Vec4(0.65, 0.21, 0, 1.0) BarrelRoomFogLinearRange = (0.0, 800.0) +BarrelPathName = 'CogdoBarrel_' BarrelModel = 'phase_5/models/cogdominium/tt_m_ara_cbr_laughBarrel' BarrelModelScale = 1.0 BarrelCollParams = (0, @@ -91,6 +93,8 @@ BarrelCollParams = (0, 2.0) BarrelBumpSound = 'phase_4/audio/sfx/Golf_Hit_Barrier_2.ogg' BarrelGrabSound = 'phase_4/audio/sfx/SZ_DD_treasure.ogg' +BarrelAvailableTexture = 'phase_5/maps/tt_t_ara_cbr_Barrel_notUsed.jpg' +BarrelUsedTexture = 'phase_5/maps/tt_t_ara_cbr_Barrel_Used.jpg' StateHidden, StateAvailable, StateUsed, StateCrushed = range(4) def numBarrels(): diff --git a/toontown/cogdominium/CogdoBarrelRoomMovies.py b/toontown/cogdominium/CogdoBarrelRoomMovies.py new file mode 100644 index 00000000..3b709c16 --- /dev/null +++ b/toontown/cogdominium/CogdoBarrelRoomMovies.py @@ -0,0 +1,118 @@ +from pandac.PandaModules import NodePath, Point3, PlaneNode, TextNode +from direct.interval.IntervalGlobal import * +from direct.showbase.ShowBase import Plane +from direct.directnotify import DirectNotifyGlobal +from direct.showbase.RandomNumGen import RandomNumGen +from direct.interval.MetaInterval import Sequence, Parallel +from direct.interval.FunctionInterval import Func, Wait +from direct.gui.DirectGui import * +from toontown.toonbase.ToontownGlobals import * +from toontown.toonbase import TTLocalizer +from toontown.suit import Suit, SuitDNA +from toontown.toon import Toon, ToonHead, ToonDNA +from DistributedCogdoInterior import * +from CogdoUtil import CogdoGameMovie +import CogdoBarrelRoomConsts, CogdoUtil + +class CogdoBarrelRoomIntro(CogdoGameMovie): + notify = DirectNotifyGlobal.directNotify.newCategory('CogdoElevatorMovie') + + def __init__(self): + CogdoGameMovie.__init__(self) + self._toonDialogueSfx = None + self.toonHead = None + self.frame = None + return + + def displayLine(self, text): + self.notify.debug('displayLine') + self._dialogueLabel.node().setText(text) + self.toonHead.reparentTo(aspect2d) + self._toonDialogueSfx.play() + self.toonHead.setClipPlane(self.clipPlane) + + def makeSuit(self, suitType): + self.notify.debug('makeSuit()') + suit = Suit.Suit() + dna = SuitDNA.SuitDNA() + dna.newSuit(suitType) + suit.setStyle(dna) + suit.isDisguised = 1 + suit.generateSuit() + suit.setScale(1, 1, 2) + suit.setPos(0, 0, -4.4) + suit.reparentTo(self.toonHead) + for part in suit.getHeadParts(): + part.hide() + + suit.loop('neutral') + + def load(self): + self.notify.debug('load()') + CogdoGameMovie.load(self) + backgroundGui = loader.loadModel('phase_5/models/cogdominium/tt_m_gui_csa_flyThru') + self.bg = backgroundGui.find('**/background') + self.chatBubble = backgroundGui.find('**/chatBubble') + self.chatBubble.setScale(6.5, 6.5, 7.3) + self.chatBubble.setPos(0.32, 0, -0.78) + self.bg.setScale(5.2) + self.bg.setPos(0.14, 0, -0.6667) + self.bg.reparentTo(aspect2d) + self.chatBubble.reparentTo(aspect2d) + self.frame = DirectFrame(geom=self.bg, relief=None, pos=(0.2, 0, -0.6667)) + self.bg.wrtReparentTo(self.frame) + self.gameTitleText = DirectLabel(parent=self.frame, text=TTLocalizer.CogdoBarrelRoomTitle, scale=TTLocalizer.MRPgameTitleText * 0.8, text_align=TextNode.ACenter, text_font=getSignFont(), text_fg=(1.0, 0.33, 0.33, 1.0), pos=TTLocalizer.MRgameTitleTextPos, relief=None) + self.chatBubble.wrtReparentTo(self.frame) + self.frame.hide() + backgroundGui.removeNode() + self.toonDNA = ToonDNA.ToonDNA() + self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14) + self.toonHead = Toon.Toon() + self.toonHead.setDNA(self.toonDNA) + self.makeSuit('sc') + self.toonHead.getGeomNode().setDepthWrite(1) + self.toonHead.getGeomNode().setDepthTest(1) + self.toonHead.loop('neutral') + self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18, 0.18) + self.toonHead.reparentTo(hidden) + self.toonHead.startBlink() + self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip')) + self.clipPlane.node().setPlane(Plane(0, 0, 1, 0)) + self.clipPlane.setPos(0, 0, 2.45) + self._toonDialogueSfx = loader.loadSfx('phase_3.5/audio/dial/AV_dog_long.ogg') + self._camHelperNode = NodePath('CamHelperNode') + self._camHelperNode.reparentTo(render) + dialogue = TTLocalizer.CogdoBarrelRoomIntroDialog + + def start(): + self.frame.show() + base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 0) + + def end(): + self._dialogueLabel.reparentTo(hidden) + self.toonHead.reparentTo(hidden) + self.frame.hide() + base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 1) + self._stopUpdateTask() + + self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Wait(CogdoBarrelRoomConsts.BarrelRoomIntroTimeout), Func(end)) + self._startUpdateTask() + return + + def _updateTask(self, task): + dt = globalClock.getDt() + return task.cont + + def unload(self): + self.frame.destroy() + del self.frame + self.bg.removeNode() + del self.bg + self.chatBubble.removeNode() + del self.chatBubble + self.toonHead.stopBlink() + self.toonHead.stop() + self.toonHead.removeNode() + self.toonHead.delete() + del self.toonHead + CogdoGameMovie.unload(self) \ No newline at end of file diff --git a/toontown/cogdominium/CogdoBarrelRoomRewardPanel.py b/toontown/cogdominium/CogdoBarrelRoomRewardPanel.py index 620c4bb7..051c4d22 100644 --- a/toontown/cogdominium/CogdoBarrelRoomRewardPanel.py +++ b/toontown/cogdominium/CogdoBarrelRoomRewardPanel.py @@ -1,12 +1,13 @@ from pandac.PandaModules import * from direct.gui.DirectGui import * +from toontown.toon import DistributedToon from toontown.toonbase import ToontownGlobals, TTLocalizer from toontown.cogdominium import CogdoBarrelRoomConsts class CogdoBarrelRoomRewardPanel(DirectFrame): def __init__(self): - DirectFrame.__init__(self, relief=None, geom=DGG.getDefaultDialogGeom(), geom_color=ToontownGlobals.GlobalDialogColor, geom_scale=TTLocalizer.RPdirectFrame, pos=(0, 0, 0.587)) + DirectFrame.__init__(self, relief=None, geom=DGG.getDefaultDialogGeom(), geom_color=ToontownGlobals.GlobalDialogColor, geom_scale=TTLocalizer.RPdirectFrame, pos=(0, 0, -0.587)) self.initialiseoptions(CogdoBarrelRoomRewardPanel) self.avNameLabel = DirectLabel(parent=self, relief=None, pos=(0, 0, 0.3), text='Toon Ups', text_scale=0.08) self.rewardLines = [] @@ -22,15 +23,15 @@ class CogdoBarrelRoomRewardPanel(DirectFrame): return - def setRewards(self, results): - for p in xrange(len(results[0])): - doId = results[0][p] - laff = results[1][p] - if doId > 0 and doId in base.cr.doId2do: - toon = base.cr.doId2do[doId] - self.rewardLines[p]['name'].setProp('text', toon.getName()) - self.rewardLines[p]['laff'].setProp('text', str(laff)) + def setRewards(self): + RewardLineIndex = 0 + for doId in base.cr.doId2do: + toon = base.cr.doId2do.get(doId) + if isinstance(toon, DistributedToon.DistributedToon): + self.rewardLines[RewardLineIndex]['name'].setProp('text', toon.getName()) + self.rewardLines[RewardLineIndex]['laff'].setProp('text', '%s/%s' % (str(toon.hp), str(toon.maxHp))) if doId == base.localAvatar.getDoId(): - self.rewardLines[p]['frame'].setProp('relief', DGG.RIDGE) - self.rewardLines[p]['frame'].setProp('borderWidth', (0.01, 0.01)) - self.rewardLines[p]['frame'].setProp('frameColor', (1, 1, 1, 0.5)) + self.rewardLines[RewardLineIndex]['frame'].setProp('relief', DGG.RIDGE) + self.rewardLines[RewardLineIndex]['frame'].setProp('borderWidth', (0.01, 0.01)) + self.rewardLines[RewardLineIndex]['frame'].setProp('frameColor', (1, 1, 1, 0.5)) + RewardLineIndex += 1 diff --git a/toontown/cogdominium/CogdoCraneGame.py b/toontown/cogdominium/CogdoCraneGame.py new file mode 100644 index 00000000..653012dc --- /dev/null +++ b/toontown/cogdominium/CogdoCraneGame.py @@ -0,0 +1,74 @@ +import CogdoCraneGameConsts as Globals +from CogdoGameAudioManager import CogdoGameAudioManager + +class CogdoCraneGame(DirectObject): + notify = directNotify.newCategory('CogdoFlyingGame') + + def __init__(self, distGame): + self.distGame = distGame + self.toonId2Player = {} + self.players = [] + + def _initAudio(self): + self._audioMgr = CogdoGameAudioManager(Globals.MusicFiles, Globals.SfxFiles, camera, cutoff=Globals.AudioCutoff) + + def _destroyAudio(self): + self._audioMgr.destroy() + del self._audioMgr + + def load(self): + self._initAudio() + + def unload(self): + self._destroyAudio() + del self.toonId2Player + + def onstage(self): + pass + + def offstage(self): + pass + + def startIntro(self): + self._audioMgr.playMusic('normal') + + def endIntro(self): + for player in self.players: + self.placePlayer(player) + if player.toon is localAvatar: + localAvatar.sendCurrentPosition() + player.request('Ready') + + def startFinish(self): + pass + + def endFinish(self): + pass + + def start(self): + for player in self.players: + player.handleGameStart() + player.request('Normal') + + def exit(self): + for player in self.players: + player.request('Done') + + def _addPlayer(self, player): + self.players.append(player) + self.toonId2Player[player.toon.doId] = player + + def _removePlayer(self, player): + if player in self.players: + self.players.remove(player) + else: + for cPlayer in self.players: + if cPlayer.toon == player.toon: + self.players.remove(cPlayer) + break + + if self.toonId2Player.has_key(player.toon.doId): + del self.toonId2Player[player.toon.doId] + + def handleToonLeft(self, toonId): + self._removePlayer(self.toonId2Player[toonId]) \ No newline at end of file diff --git a/toontown/cogdominium/CogdoCraneGameConsts.py b/toontown/cogdominium/CogdoCraneGameConsts.py index 2ea2f3ee..3f75ac51 100644 --- a/toontown/cogdominium/CogdoCraneGameConsts.py +++ b/toontown/cogdominium/CogdoCraneGameConsts.py @@ -1,6 +1,14 @@ from direct.fsm.StatePush import StateVar from otp.level.EntityStateVarSet import EntityStateVarSet +from CogdoUtil import VariableContainer from toontown.cogdominium.CogdoEntityTypes import CogdoCraneGameSettings, CogdoCraneCogSettings +Gameplay = VariableContainer() +Gameplay.SecondsUntilGameOver = 60.0 * 3.0 +Gameplay.TimeRunningOutSeconds = 45.0 +Audio = VariableContainer() +Audio.MusicFiles = {'normal': 'phase_9/audio/bgm/CHQ_FACT_bg.ogg', + 'end': 'phase_7/audio/bgm/encntr_toon_winning_indoor.ogg', + 'timeRunningOut': 'phase_7/audio/bgm/encntr_suit_winning_indoor.ogg'} Settings = EntityStateVarSet(CogdoCraneGameSettings) CogSettings = EntityStateVarSet(CogdoCraneCogSettings) CranePosHprs = [(13.4, -136.6, 6, -45, 0, 0), diff --git a/toontown/cogdominium/CogdoElevatorMovie.py b/toontown/cogdominium/CogdoElevatorMovie.py index 29eca097..67fb0256 100644 --- a/toontown/cogdominium/CogdoElevatorMovie.py +++ b/toontown/cogdominium/CogdoElevatorMovie.py @@ -10,6 +10,7 @@ from toontown.toonbase.ToontownGlobals import * from toontown.toonbase import TTLocalizer from toontown.suit import Suit, SuitDNA from toontown.toon import Toon, ToonHead, ToonDNA +from DistributedCogdoInterior import * from CogdoUtil import CogdoGameMovie import CogdoUtil @@ -82,17 +83,17 @@ class CogdoElevatorMovie(CogdoGameMovie): self._toonDialogueSfx = loader.loadSfx('phase_3.5/audio/dial/AV_dog_long.ogg') self._camHelperNode = NodePath('CamHelperNode') self._camHelperNode.reparentTo(render) - dialogue = TTLocalizer.CogdoElevatorRewardLaff + dialogue = TTLocalizer.CogdoMazeGameElevatorRewardLaff def start(): self.frame.show() - base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 0) + base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 0) def end(): self._dialogueLabel.reparentTo(hidden) self.toonHead.reparentTo(hidden) self.frame.hide() - base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 1) + base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 1) self._stopUpdateTask() self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Wait(self.elevatorDuration), Func(end)) diff --git a/toontown/cogdominium/CogdoExecutiveSuiteMovies.py b/toontown/cogdominium/CogdoExecutiveSuiteMovies.py index 4ed95df8..96709977 100644 --- a/toontown/cogdominium/CogdoExecutiveSuiteMovies.py +++ b/toontown/cogdominium/CogdoExecutiveSuiteMovies.py @@ -91,7 +91,7 @@ class CogdoExecutiveSuiteIntro(CogdoGameMovie): def start(): self.frame.show() - base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 0) + base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 0) def showShopOwner(): self._setCamTarget(self._shopOwner, -10, offset=Point3(0, 0, 5)) @@ -100,7 +100,7 @@ class CogdoExecutiveSuiteIntro(CogdoGameMovie): self._dialogueLabel.reparentTo(hidden) self.toonHead.reparentTo(hidden) self.frame.hide() - base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 1) + base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 1) self._stopUpdateTask() self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Func(showShopOwner), ParallelEndTogether(camera.posInterval(self.cameraMoveDuration, Point3(8, 0, 13), blendType='easeInOut'), camera.hprInterval(0.5, self._camHelperNode.getHpr(), blendType='easeInOut')), Wait(self.introDuration), Func(end)) diff --git a/toontown/cogdominium/CogdoFlyingCameraManager.py b/toontown/cogdominium/CogdoFlyingCameraManager.py index c77bf741..d0142399 100644 --- a/toontown/cogdominium/CogdoFlyingCameraManager.py +++ b/toontown/cogdominium/CogdoFlyingCameraManager.py @@ -161,26 +161,30 @@ class CogdoFlyingCameraManager: name = entry.getIntoNode().getName() if name.find('col_') >= 0: np = entry.getIntoNodePath().getParent() - if np not in nodesInBetween: + if not nodesInBetween.has_key(np): nodesInBetween[np] = np.getParent() for np in nodesInBetween.keys(): - if np in self._betweenCamAndToon: + if self._betweenCamAndToon.has_key(np): del self._betweenCamAndToon[np] else: np.setTransparency(True) np.wrtReparentTo(self._transNP) if np.getName().find('lightFixture') >= 0: - np.find('**/*floor_mesh').hide() + if not np.find('**/*floor_mesh').isEmpty(): + np.find('**/*floor_mesh').hide() elif np.getName().find('platform') >= 0: - np.find('**/*Floor').hide() + if not np.find('**/*Floor').isEmpty(): + np.find('**/*Floor').hide() for np, parent in self._betweenCamAndToon.items(): np.wrtReparentTo(parent) np.setTransparency(False) if np.getName().find('lightFixture') >= 0: - np.find('**/*floor_mesh').show() + if not np.find('**/*floor_mesh').isEmpty(): + np.find('**/*floor_mesh').show() elif np.getName().find('platform') >= 0: - np.find('**/*Floor').show() + if not np.find('**/*Floor').isEmpty(): + np.find('**/*Floor').show() self._betweenCamAndToon = nodesInBetween diff --git a/toontown/cogdominium/CogdoFlyingGame.py b/toontown/cogdominium/CogdoFlyingGame.py index c46fe749..9cb6d892 100644 --- a/toontown/cogdominium/CogdoFlyingGame.py +++ b/toontown/cogdominium/CogdoFlyingGame.py @@ -160,13 +160,7 @@ class CogdoFlyingGame(DirectObject): self.acceptOnce(CogdoFlyingLocalPlayer.RanOutOfTimeEventName, self.handleLocalPlayerRanOutOfTime) self.__startUpdateTask() self.isGameComplete = False - if __debug__ and base.config.GetBool('schellgames-dev', True): - self.acceptOnce('end', self.guiMgr.forceTimerDone) - def toggleFog(): - self.levelFog.setVisible(not self.levelFog.isVisible()) - - self.accept('home', toggleFog) for eagle in self.legalEagles: eagle.gameStart(self.distGame.getStartTime()) @@ -299,20 +293,22 @@ class CogdoFlyingGame(DirectObject): if gatherable.type in [Globals.Level.GatherableTypes.InvulPowerup]: if player.toon.isLocal(): self.audioMgr.playMusic('invul') + taskMgr.doMethodLater(30, lambda task: self.debuffPowerup(toonId, gatherable.type, elapsedTime), 'gatherable-timeout') else: self.notify.warning('Trying to pickup gatherable nonetype:%s' % pickupNum) return def debuffPowerup(self, toonId, pickupType, elapsedTime): self.notify.debugCall() - player = self.toonId2Player[toonId] - if player.isBuffActive(pickupType): - if pickupType in [Globals.Level.GatherableTypes.InvulPowerup]: - if self.guiMgr.isTimeRunningOut(): - self.audioMgr.playMusic('timeRunningOut') - else: - self.audioMgr.playMusic('normal') - player.handleDebuffPowerup(pickupType, elapsedTime) + if toonId in self.toonId2Player: + player = self.toonId2Player[toonId] + if player.isBuffActive(pickupType): + if pickupType in [Globals.Level.GatherableTypes.InvulPowerup]: + if self.guiMgr.isTimeRunningOut(): + self.audioMgr.playMusic('timeRunningOut') + else: + self.audioMgr.playMusic('normal') + player.handleDebuffPowerup(pickupType, elapsedTime) def handleLocalToonEnterLegalEagle(self, eagle, collEntry): if not self.localPlayer.isEnemyHitting() and not self.localPlayer.isInvulnerable(): diff --git a/toontown/cogdominium/CogdoFlyingGameGlobals.py b/toontown/cogdominium/CogdoFlyingGameGlobals.py index 8f3ecc34..e68348b3 100644 --- a/toontown/cogdominium/CogdoFlyingGameGlobals.py +++ b/toontown/cogdominium/CogdoFlyingGameGlobals.py @@ -9,25 +9,29 @@ AI.SafezoneId2DeathDamage = {2000: 1, 5000: 4, 4000: 8, 3000: 12, - 9000: 16} + 9000: 16, + 7000: 20} AI.SafezoneId2WhirlwindDamage = {2000: 1, 1000: 2, 5000: 4, 4000: 8, 3000: 12, - 9000: 16} + 9000: 16, + 7000: 20} AI.SafezoneId2LegalEagleDamage = {2000: 2, 1000: 4, 5000: 8, 4000: 16, 3000: 24, - 9000: 32} + 9000: 32, + 7000: 36} AI.SafezoneId2MinionDamage = {2000: 1, 1000: 2, 5000: 4, 4000: 8, 3000: 12, - 9000: 16} + 9000: 16, + 7000: 20} Camera = VariableContainer() Camera.Angle = 12.5 Camera.Distance = 20 @@ -41,6 +45,7 @@ Camera.AlphaBetweenToon = 0.35 Camera.SpinRadius = 9.0 Camera.MaxSpinAngle = 20.0 Camera.MaxSpinX = 16.0 +Camera.GameCameraFar = 400.0 Gameplay = VariableContainer() Gameplay.SecondsUntilGameOver = 60.0 * 3.0 Gameplay.TimeRunningOutSeconds = 45.0 @@ -95,7 +100,8 @@ Gameplay.SafezoneId2LaffPickupHealAmount = {2000: 1, 5000: 4, 4000: 8, 3000: 12, - 9000: 16} + 9000: 16, + 7000: 20} Gameplay.InvulBuffTime = 15.0 Gameplay.InvulBlinkTime = 5.0 Gameplay.InvulSingleBlinkTime = 0.5 @@ -167,15 +173,15 @@ LegalEagle.PostCooldownHeightOffNest = 40.0 Dev = DevVariableContainer('cogdoflying') Dev.DisableDeath = False Dev.InfiniteFuel = False -Dev.InfiniteTimeLimit = True +Dev.InfiniteTimeLimit = False Dev.Invincibility = False Dev.NoLegalEagleAttacks = False Audio = VariableContainer() Audio.Cutoff = 75.0 -Audio.MusicFiles = {'normal': 'phase_4/audio/bgm/MG_cannon_game.ogg', - 'end': 'phase_4/audio/bgm/FF_safezone.ogg', - 'waiting': 'phase_4/audio/bgm/m_match_bg2.ogg', - 'invul': 'phase_4/audio/bgm/MG_CogThief.ogg', +Audio.MusicFiles = {'normal': 'phase_9/audio/bgm/CHQ_FACT_bg.ogg', + 'end': 'phase_7/audio/bgm/encntr_toon_winning_indoor.ogg', + 'waiting': 'phase_7/audio/bgm/encntr_toon_winning_indoor.ogg', + 'invul': 'phase_9/audio/bgm/encntr_toon_winning.ogg', 'timeRunningOut': 'phase_7/audio/bgm/encntr_suit_winning_indoor.ogg'} Audio.SfxFiles = {'propeller': 'phase_4/audio/sfx/TB_propeller.ogg', 'propeller_damaged': 'phase_5/audio/sfx/tt_s_ara_cfg_propellers_damaged.ogg', @@ -226,7 +232,8 @@ Level.DifficultyOrder = {2000: (1, 1, 1, 2, 1), 5000: (1, 2, 1, 2, 2), 4000: (1, 2, 1, 2, 3, 2), 3000: (1, 2, 2, 3, 2, 3), - 9000: (2, 3, 2, 3, 2, 3, 2)} + 9000: (2, 3, 2, 3, 2, 3, 2), + 7000: (2, 3, 2, 3, 2, 3, 2)} Dev.WantTempLevel = True Dev.DevQuadsOrder = (1, 2, 3, 4, 5, 6, 7, 8) Level.AddSparkleToPowerups = True diff --git a/toontown/cogdominium/CogdoFlyingGameGuis.py b/toontown/cogdominium/CogdoFlyingGameGuis.py index 380ec8fb..6fd2e8cb 100644 --- a/toontown/cogdominium/CogdoFlyingGameGuis.py +++ b/toontown/cogdominium/CogdoFlyingGameGuis.py @@ -57,7 +57,10 @@ class CogdoFlyingProgressGui(DirectFrame): return def _getToonMarker(self, toon): - return self._laffMeterModel.find('**/' + toon.style.getType() + 'head') + type = self._laffMeterModel.find('**/' + toon.style.getType() + 'head') + if type.isEmpty(): + type = self._laffMeterModel.find('**/bunnyhead') + return type def update(self): for toon, marker in self._toonMarkers.items(): @@ -144,13 +147,13 @@ class CogdoFlyingFuelGui(DirectFrame): return numBlades = fuelState - 1 if len(self.activeBlades) != numBlades: - for i in xrange(len(self.activeBlades)): + for i in range(len(self.activeBlades)): blade = self.activeBlades.pop() blade.stash() if numBlades > len(self.blades): numBlades = len(self.blades) - for i in xrange(numBlades): + for i in range(numBlades): blade = self.blades[i] self.activeBlades.append(blade) blade.unstash() diff --git a/toontown/cogdominium/CogdoFlyingGuiManager.py b/toontown/cogdominium/CogdoFlyingGuiManager.py index b3b598b4..caf845e2 100644 --- a/toontown/cogdominium/CogdoFlyingGuiManager.py +++ b/toontown/cogdominium/CogdoFlyingGuiManager.py @@ -28,7 +28,7 @@ class CogdoFlyingGuiManager: self._progressGui = CogdoFlyingProgressGui(self.root, self._level) def _initHud(self): - self._memoGui = CogdoMemoGui(self.root) + self._memoGui = CogdoMemoGui(self.root, 'memo_card') self._memoGui.posNextToLaffMeter() def _initTimer(self): diff --git a/toontown/cogdominium/CogdoFlyingLegalEagle.py b/toontown/cogdominium/CogdoFlyingLegalEagle.py index f7eabefc..880259ca 100644 --- a/toontown/cogdominium/CogdoFlyingLegalEagle.py +++ b/toontown/cogdominium/CogdoFlyingLegalEagle.py @@ -70,6 +70,8 @@ class CogdoFlyingLegalEagle(DirectObject, FSM): audioMgr = base.cogdoGameAudioMgr self._screamSfx = audioMgr.createSfx('legalEagleScream', self.suit) self.initIntervals() + self.suit.nametag3d.stash() + self.suit.nametag.destroy() return def attachPropeller(self): diff --git a/toontown/cogdominium/CogdoFlyingLevel.py b/toontown/cogdominium/CogdoFlyingLevel.py index 67e23e1e..8ff596c4 100644 --- a/toontown/cogdominium/CogdoFlyingLevel.py +++ b/toontown/cogdominium/CogdoFlyingLevel.py @@ -7,7 +7,7 @@ import CogdoUtil import CogdoFlyingGameGlobals as Globals from CogdoFlyingLevelQuadrant import CogdoFlyingLevelQuadrant from CogdoFlyingObjects import CogdoFlyingGatherableFactory, CogdoFlyingPlatform, CogdoFlyingLevelFog -from CogdoFlyingObstacles import CogdoFlyingObtacleFactory +from CogdoFlyingObstacles import CogdoFlyingObstacleFactory from CogdoGameExit import CogdoGameExit from otp.otpbase import OTPGlobals @@ -51,7 +51,7 @@ class CogdoFlyingLevel(DirectObject): self.forwardLimit = self.quadLengthUnits * 20 self._frameModel.flattenStrong() self.gatherableFactory = CogdoFlyingGatherableFactory() - self.obstacleFactory = CogdoFlyingObtacleFactory() + self.obstacleFactory = CogdoFlyingObstacleFactory() return def getExit(self): @@ -159,7 +159,7 @@ class CogdoFlyingLevel(DirectObject): if quadNum >= 0: if quadNum > 0: self.quadrants[max(quadNum - self.quadVisibiltyBehind, 0)].onstage() - for i in xrange(quadNum, min(quadNum + self.quadVisibiltyAhead + 1, self._numQuads)): + for i in range(quadNum, min(quadNum + self.quadVisibiltyAhead + 1, self._numQuads)): self.quadrants[i].onstage() self.visibleQuadIndices.append(i) if i == 0: @@ -168,7 +168,7 @@ class CogdoFlyingLevel(DirectObject): self.endPlatform.onstage() self._currentQuadNum = quadNum - for i in xrange(0, max(self._currentQuadNum - self.quadVisibiltyBehind, 0)) + range(min(self._currentQuadNum + self.quadVisibiltyAhead + 1, self._numQuads), self._numQuads): + for i in range(0, max(self._currentQuadNum - self.quadVisibiltyBehind, 0)) + range(min(self._currentQuadNum + self.quadVisibiltyAhead + 1, self._numQuads), self._numQuads): self.quadrants[i].offstage() if i == 0: self.startPlatform.offstage() @@ -193,6 +193,7 @@ class CogdoFlyingLevelFactory: self.quadVisibiltyAhead = quadVisibilityAhead self.quadVisibiltyBehind = quadVisibiltyBehind self._rng = rng or RandomNumGen(1) + self.isOrg = self._rng.randint(0, 1) self._level = None return @@ -200,7 +201,8 @@ class CogdoFlyingLevelFactory: levelNode = NodePath('level') frameModel = CogdoUtil.loadFlyingModel('level') startPlatformModel = CogdoUtil.loadFlyingModel('levelStart') - endPlatformModel = CogdoUtil.loadFlyingModel('levelEnd') + ver = '_org' if self.isOrg else '' + endPlatformModel = CogdoUtil.loadFlyingModel('levelEnd%s' % ver) for fan in frameModel.findAllMatches('**/*wallFan'): fan.flattenStrong() @@ -211,7 +213,8 @@ class CogdoFlyingLevelFactory: frameModel.find('**/wallL').setBin('opaque', 2) frameModel.find('**/fogTranslucent_top').setBin('fixed', 2) frameModel.getChildren().reparentTo(levelNode) - levelNode.hide() + if not self.isOrg: + levelNode.hide() self._level = CogdoFlyingLevel(self.parent, levelNode, startPlatformModel, endPlatformModel, self.quadLengthUnits, self.quadVisibiltyAhead, self.quadVisibiltyBehind) if Globals.Dev.WantTempLevel: quads = Globals.Dev.DevQuadsOrder @@ -223,7 +226,8 @@ class CogdoFlyingLevelFactory: quads.append(quadList[self._rng.randint(0, len(quadList) - 1)]) for i in quads: - filePath = CogdoUtil.getModelPath('quadrant%i' % i, 'flying') + ver = '_org' if self.isOrg else '' + filePath = CogdoUtil.getModelPath('quadrant%i%s' % (i, ver), 'flying') quadModel = loader.loadModel(filePath) for np in quadModel.findAllMatches('**/*lightCone*'): CogdoUtil.initializeLightCone(np, 'fixed', 3) @@ -240,4 +244,7 @@ class CogdoFlyingLevelFactory: def createLevelFog(self): if self._level is None: self.loadAndBuildLevel() - return CogdoFlyingLevelFog(self._level) + if self.isOrg: + return CogdoFlyingLevelFog(self._level, (0,0,0,1)) + else: + return CogdoFlyingLevelFog(self._level) diff --git a/toontown/cogdominium/CogdoFlyingLevelQuadrant.py b/toontown/cogdominium/CogdoFlyingLevelQuadrant.py index 51fadefb..b2635d7a 100644 --- a/toontown/cogdominium/CogdoFlyingLevelQuadrant.py +++ b/toontown/cogdominium/CogdoFlyingLevelQuadrant.py @@ -52,8 +52,9 @@ class CogdoFlyingLevelQuadrant: for np in self._model.findAllMatches('**/*LayerStack*'): np.wrtReparentTo(self._model) - for np in self._model.find('**/static').getChildren(): - np.wrtReparentTo(self._model) + if not self._model.find('**/static').isEmpty(): + for np in self._model.find('**/static').getChildren(): + np.wrtReparentTo(self._model) self._model.flattenMedium() @@ -138,8 +139,6 @@ class CogdoFlyingLevelQuadrant: def generatePowerUps(): for powerupType, locName in Globals.Level.PowerupType2Loc.iteritems(): - if powerupType == Globals.Level.GatherableTypes.LaffPowerup and Globals.Level.IgnoreLaffPowerups: - continue gatherables = gatherableModel.findAllMatches('**/%s' % locName) for gatherable in gatherables: pickup = self._level.gatherableFactory.createPowerup(powerupType) diff --git a/toontown/cogdominium/CogdoFlyingLocalPlayer.py b/toontown/cogdominium/CogdoFlyingLocalPlayer.py index 17e078bb..3442288d 100644 --- a/toontown/cogdominium/CogdoFlyingLocalPlayer.py +++ b/toontown/cogdominium/CogdoFlyingLocalPlayer.py @@ -555,29 +555,33 @@ class CogdoFlyingLocalPlayer(CogdoFlyingPlayer): power = math.fabs(distance / fanHeight - 1.0) * powerRange + min power = clamp(power, min, max) blowVec *= power - fanVelocity = self.fanIndex2ToonVelocity[fan.index] - fanVelocity += blowVec + if fan.index in self.fanIndex2ToonVelocity: + fanVelocity = self.fanIndex2ToonVelocity[fan.index] + fanVelocity += blowVec removeList = [] for fan in self.fansStillHavingEffect: if fan not in self.activeFans: blowVec = fan.getBlowDirection() blowVec *= Globals.Gameplay.ToonDeceleration['fan'] * dt - fanVelocity = Vec3(self.fanIndex2ToonVelocity[fan.index]) - lastLen = fanVelocity.length() - fanVelocity -= blowVec - if fanVelocity.length() > lastLen: - removeList.append(fan) - else: - self.fanIndex2ToonVelocity[fan.index] = fanVelocity + if fan.index in self.fanIndex2ToonVelocity: + fanVelocity = Vec3(self.fanIndex2ToonVelocity[fan.index]) + lastLen = fanVelocity.length() + fanVelocity -= blowVec + if fanVelocity.length() > lastLen: + removeList.append(fan) + else: + self.fanIndex2ToonVelocity[fan.index] = fanVelocity for fan in removeList: self.fansStillHavingEffect.remove(fan) - del self.fanIndex2ToonVelocity[fan.index] + if fan.index in self.fanIndex2ToonVelocity: + del self.fanIndex2ToonVelocity[fan.index] self.fanVelocity = Vec3(0.0, 0.0, 0.0) for fan in self.fansStillHavingEffect: - self.fanVelocity += self.fanIndex2ToonVelocity[fan.index] + if fan.index in self.fanIndex2ToonVelocity: + self.fanVelocity += self.fanIndex2ToonVelocity[fan.index] minVal = -Globals.Gameplay.ToonVelMax['fan'] maxVal = Globals.Gameplay.ToonVelMax['fan'] @@ -1073,10 +1077,9 @@ class CogdoFlyingLocalPlayer(CogdoFlyingPlayer): elif gatherable.type == Globals.Level.GatherableTypes.Propeller: self.handleEnterPropeller(gatherable) elif gatherable.type == Globals.Level.GatherableTypes.LaffPowerup: - self._getLaffSfx.play() + self.handleEnterLaffPowerup(gatherable) elif gatherable.type == Globals.Level.GatherableTypes.InvulPowerup: - self._getRedTapeSfx.play() - messenger.send(CogdoFlyingGuiManager.InvulnerableEventName) + self.handleEnterInvulPowerup(gatherable) def handleEnterMemo(self, gatherable): self.score += 1 @@ -1097,3 +1100,10 @@ class CogdoFlyingLocalPlayer(CogdoFlyingPlayer): self._guiMgr.update() self._refuelSfx.play() self._refuelSpinSfx.play(volume=0.15) + + def handleEnterLaffPowerup(self, gatherable): + self._getLaffSfx.play() + + def handleEnterInvulPowerup(self, gatherable): + messenger.send(CogdoFlyingGuiManager.InvulnerableEventName) + self._getRedTapeSfx.play() \ No newline at end of file diff --git a/toontown/cogdominium/CogdoFlyingObjects.py b/toontown/cogdominium/CogdoFlyingObjects.py index 7f8a4a9a..0c9c4eb7 100644 --- a/toontown/cogdominium/CogdoFlyingObjects.py +++ b/toontown/cogdominium/CogdoFlyingObjects.py @@ -242,7 +242,8 @@ class CogdoFlyingPowerup(CogdoFlyingGatherable): self._model.setAlphaScale(0.5) if Globals.Level.AddSparkleToPowerups: self.f = self.find('**/particleEffect_sparkles') - self.f.hide() + if not self.f.isEmpty(): + self.f.hide() def pickUp(self, toon, elapsedSeconds = 0.0): if self.wasPickedUpByToon(toon) == True: @@ -339,6 +340,7 @@ class CogdoFlyingLevelFog: def __init__(self, level, color = Globals.Level.FogColor): self._level = level self.color = color + self.defaultFar = None fogDistance = self._level.quadLengthUnits * max(1, self._level.quadVisibiltyAhead * 0.2) self.fog = Fog('RenderFog') self.fog.setColor(self.color) @@ -346,11 +348,16 @@ class CogdoFlyingLevelFog: self._visible = False self._clearColor = Vec4(base.win.getClearColor()) self._clearColor.setW(1.0) + self.defaultFar = base.camLens.getFar() + base.camLens.setFar(Globals.Camera.GameCameraFar) + base.setBackgroundColor(self.color) def destroy(self): self.setVisible(False) if hasattr(self, 'fog'): del self.fog + if self.defaultFar is not None: + base.camLens.setFar(self.defaultFar) def isVisible(self): return self._visible diff --git a/toontown/cogdominium/CogdoFlyingObstacles.py b/toontown/cogdominium/CogdoFlyingObstacles.py index 7cfbd223..c7e12fd1 100644 --- a/toontown/cogdominium/CogdoFlyingObstacles.py +++ b/toontown/cogdominium/CogdoFlyingObstacles.py @@ -16,7 +16,7 @@ from direct.particles import ParticleEffect from direct.particles import Particles from direct.particles import ForceGroup -class CogdoFlyingObtacleFactory: +class CogdoFlyingObstacleFactory: def __init__(self): self._index = -1 @@ -29,8 +29,9 @@ class CogdoFlyingObtacleFactory: self._fanModel.removeNode() del self._fanModel if Globals.Level.AddParticlesToStreamers: - self.f.cleanup() - del self.f + if hasattr(self, 'f'): + self.f.cleanup() + del self.f def createFan(self): self._index += 1 @@ -237,6 +238,8 @@ class CogdoFlyingMinion(CogdoFlyingObstacle): d.newSuit(Globals.Gameplay.MinionDnaName) self.suit.setDNA(d) self.suit.setScale(Globals.Gameplay.MinionScale) + self.suit.nametag3d.stash() + self.suit.nametag.destroy() swapAvatarShadowPlacer(self.suit, 'minion-%sShadowPlacer' % index) self.mopathNodePath = NodePath('mopathNodePath') self.suit.reparentTo(self.mopathNodePath) diff --git a/toontown/cogdominium/CogdoFlyingPlayer.py b/toontown/cogdominium/CogdoFlyingPlayer.py index f4cae889..7c610924 100644 --- a/toontown/cogdominium/CogdoFlyingPlayer.py +++ b/toontown/cogdominium/CogdoFlyingPlayer.py @@ -233,14 +233,14 @@ class CogdoFlyingPlayer(FSM): return numBlades = fuelState - 1 if len(self.activeBlades) != numBlades: - for i in xrange(len(self.activeBlades)): + for i in range(len(self.activeBlades)): blade = self.activeBlades.pop() blade.stash() if numBlades > len(self.blades): numBlades = len(self.blades) if numBlades > 0: - for i in xrange(numBlades): + for i in range(numBlades): blade = self.blades[i] self.activeBlades.append(blade) blade.unstash() diff --git a/toontown/cogdominium/CogdoGameGatherable.py b/toontown/cogdominium/CogdoGameGatherable.py index ef5ebd40..1bbf4720 100644 --- a/toontown/cogdominium/CogdoGameGatherable.py +++ b/toontown/cogdominium/CogdoGameGatherable.py @@ -102,10 +102,7 @@ class CogdoMemo(CogdoGameGatherable): def __init__(self, serialNum, model = None, pitch = 0, triggerRadius = 1.0, spinRate = 60): if model is None: - node = CogdoUtil.loadModel('memo', 'shared') - model = node.find('**/memo') - model.detachNode() - node.removeNode() + model = CogdoUtil.loadModel('joke', 'shared') model.setP(pitch) self._spinRate = spinRate CogdoGameGatherable.__init__(self, serialNum, model, triggerRadius, name='CogdoMemo') diff --git a/toontown/cogdominium/CogdoInterior.py b/toontown/cogdominium/CogdoInterior.py index efa56e4f..54c724d4 100644 --- a/toontown/cogdominium/CogdoInterior.py +++ b/toontown/cogdominium/CogdoInterior.py @@ -76,7 +76,7 @@ class CogdoInterior(Place.Place): self.parentFSM.getStateNamed('cogdoInterior').addChild(self.fsm) self.townBattle = TownBattle.TownBattle('town-battle-done') self.townBattle.load() - for i in xrange(1, 3): + for i in range(1, 3): Suit.loadSuits(i) def unload(self): @@ -90,7 +90,7 @@ class CogdoInterior(Place.Place): self.townBattle.unload() self.townBattle.cleanup() del self.townBattle - for i in xrange(1, 3): + for i in range(1, 3): Suit.unloadSuits(i) def setState(self, state, battleEvent = None): diff --git a/toontown/cogdominium/CogdoMaze.py b/toontown/cogdominium/CogdoMaze.py index 735d44ec..281accf0 100644 --- a/toontown/cogdominium/CogdoMaze.py +++ b/toontown/cogdominium/CogdoMaze.py @@ -109,8 +109,8 @@ class CogdoMazeFactory: quadrantKeys = self._cogdoMazeData.QuadrantCollisions.keys() self._rng.shuffle(quadrantKeys) i = 0 - for y in xrange(self.height): - for x in xrange(self.width): + for y in range(self.height): + for x in range(self.width): key = quadrantKeys[i] collTable = self._cogdoMazeData.QuadrantCollisions[key] angle = self._cogdoMazeData.QuadrantAngles[self._rng.randint(0, len(self._cogdoMazeData.QuadrantAngles) - 1)] @@ -121,9 +121,9 @@ class CogdoMazeFactory: def _generateBarrierData(self): data = [] - for y in xrange(self.height): + for y in range(self.height): data.append([]) - for x in xrange(self.width): + for x in range(self.width): if x == self.width - 1: ax = -1 else: @@ -204,12 +204,12 @@ class CogdoMazeFactory: self._data['originX'] = int(self._data['width'] / 2) self._data['originY'] = int(self._data['height'] / 2) collisionTable = [] - horizontalWall = [ 1 for x in xrange(self._data['width']) ] + horizontalWall = [ 1 for x in range(self._data['width']) ] collisionTable.append(horizontalWall) - for i in xrange(0, len(self.quadrantData), self.width): - for y in xrange(self.quadrantSize): + for i in range(0, len(self.quadrantData), self.width): + for y in range(self.quadrantSize): row = [1] - for x in xrange(i, i + self.width): + for x in range(i, i + self.width): if x == 1 and y < self.quadrantSize / 2 - 2: newData = [] for j in self.quadrantData[x][1][y]: @@ -227,17 +227,17 @@ class CogdoMazeFactory: collisionTable.append(horizontalWall[:]) barriers = Globals.MazeBarriers - for i in xrange(len(barriers)): + for i in range(len(barriers)): for coords in barriers[i]: collisionTable[coords[1]][coords[0]] = 0 y = self._data['originY'] - for x in xrange(len(collisionTable[y])): + for x in range(len(collisionTable[y])): if collisionTable[y][x] == 0: collisionTable[y][x] = 2 x = self._data['originX'] - for y in xrange(len(collisionTable)): + for y in range(len(collisionTable)): if collisionTable[y][x] == 0: collisionTable[y][x] = 2 @@ -254,8 +254,8 @@ class CogdoMazeFactory: halfWidth = int(self.width / 2) halfHeight = int(self.height / 2) i = 0 - for y in xrange(self.height): - for x in xrange(self.width): + for y in range(self.height): + for x in range(self.width): ax = (x - halfWidth) * size ay = (y - halfHeight) * size extension = '' @@ -272,7 +272,7 @@ class CogdoMazeFactory: quadrantHalfUnitSize = quadrantUnitSize * 0.5 barrierModel = CogdoUtil.loadMazeModel('grouping_blockerDivider').find('**/divider') y = 3 - for x in xrange(self.width): + for x in range(self.width): if x == (self.width - 1) / 2: continue ax = (x - halfWidth) * size @@ -284,7 +284,7 @@ class CogdoMazeFactory: offset = self.cellWidth - 0.5 for x in (0, 3): - for y in xrange(self.height): + for y in range(self.height): ax = (x - halfWidth) * size - quadrantHalfUnitSize - frameActualSize + offset ay = (y - halfHeight) * size b = NodePath('barrier') diff --git a/toontown/cogdominium/CogdoMazeGame.py b/toontown/cogdominium/CogdoMazeGame.py index 11df5666..d950c618 100644 --- a/toontown/cogdominium/CogdoMazeGame.py +++ b/toontown/cogdominium/CogdoMazeGame.py @@ -49,20 +49,20 @@ class CogdoMazeGame(DirectObject): self.lastBalloonTimestamp = None difficulty = self.distGame.getDifficulty() serialNum = 0 - for i in xrange(numSuits[0]): + for i in range(numSuits[0]): suitRng = RandomNumGen(self.distGame.doId + serialNum * 10) suit = CogdoMazeBossSuit(serialNum, self.maze, suitRng, difficulty, startTile=suitSpawnSpot[0][i]) self.addSuit(suit) self.guiMgr.mazeMapGui.addSuit(suit.suit) serialNum += 1 - for i in xrange(numSuits[1]): + for i in range(numSuits[1]): suitRng = RandomNumGen(self.distGame.doId + serialNum * 10) suit = CogdoMazeFastMinionSuit(serialNum, self.maze, suitRng, difficulty, startTile=suitSpawnSpot[1][i]) self.addSuit(suit) serialNum += 1 - for i in xrange(numSuits[2]): + for i in range(numSuits[2]): suitRng = RandomNumGen(self.distGame.doId + serialNum * 10) suit = CogdoMazeSlowMinionSuit(serialNum, self.maze, suitRng, difficulty, startTile=suitSpawnSpot[2][i]) self.addSuit(suit) @@ -269,7 +269,7 @@ class CogdoMazeGame(DirectObject): self.players.remove(cPlayer) break - if player.toon.doId in self.toonId2Player: + if self.toonId2Player.has_key(player.toon.doId): del self.toonId2Player[player.toon.doId] self.guiMgr.mazeMapGui.removeToon(player.toon) @@ -302,7 +302,7 @@ class CogdoMazeGame(DirectObject): def __updateGags(self): remove = [] - for i in xrange(len(self.gags)): + for i in range(len(self.gags)): balloon = self.gags[i] if balloon.isSingleton(): remove.append(i) @@ -353,7 +353,7 @@ class CogdoMazeGame(DirectObject): start = math.radians(random.randint(0, 360)) step = math.radians(360.0 / numDrops) radius = 2.0 - for i in xrange(numDrops): + for i in range(numDrops): angle = start + i * step x = radius * math.cos(angle) + suit.suit.getX() y = radius * math.sin(angle) + suit.suit.getY() diff --git a/toontown/cogdominium/CogdoMazeGameGuis.py b/toontown/cogdominium/CogdoMazeGameGuis.py index e576caef..52b20e89 100644 --- a/toontown/cogdominium/CogdoMazeGameGuis.py +++ b/toontown/cogdominium/CogdoMazeGameGuis.py @@ -188,7 +188,7 @@ class CogdoMazeBossGui(DirectFrame): self._openDoor.stash() spacingX = codeFrameWidth + codeFrameGap startX = -0.5 * ((self._codeLength - 1) * spacingX - codeFrameGap) - for i in xrange(self._codeLength): + for i in range(self._codeLength): marker = CogdoMazeBossCodeFrame(i, self._code[i], bossCard) marker.reparentTo(self) marker.setPos(bossCard, startX + spacingX * i, 0, 0) diff --git a/toontown/cogdominium/CogdoMazeGameMovies.py b/toontown/cogdominium/CogdoMazeGameMovies.py index 4057fe37..c5ed394e 100644 --- a/toontown/cogdominium/CogdoMazeGameMovies.py +++ b/toontown/cogdominium/CogdoMazeGameMovies.py @@ -123,7 +123,7 @@ class CogdoMazeGameIntro(CogdoGameMovie): def end(): self._stopUpdateTask() - self._ival = Sequence(Func(start), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[0])), showExitIval, Func(showWaterCooler), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[1])), Wait(waitDuration), Func(showBoss), bossSuit.hprInterval(1.0, bossSuit.getHpr() + Point3(180, 0, 0), blendType='easeInOut'), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[2])), Wait(waitDuration - 1.0), Func(end)) + self._ival = Sequence(Func(start), Func(self.displayLine, 'cog', self._getRandomLine(dialogue[0])), showExitIval, Func(showWaterCooler), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[1])), Wait(waitDuration), Func(showBoss), bossSuit.hprInterval(1.0, bossSuit.getHpr() + Point3(180, 0, 0), blendType='easeInOut'), Func(self.displayLine, 'cog', self._getRandomLine(dialogue[2])), Wait(waitDuration - 1.0), Func(end)) self._startUpdateTask() def _setCamTarget(self, targetNP, distance, offset = Point3(0, 0, 0), angle = Point3(0, 0, 0)): diff --git a/toontown/cogdominium/CogdoMazeGuiManager.py b/toontown/cogdominium/CogdoMazeGuiManager.py index 8373ad2c..a3a7ac08 100644 --- a/toontown/cogdominium/CogdoMazeGuiManager.py +++ b/toontown/cogdominium/CogdoMazeGuiManager.py @@ -102,6 +102,7 @@ class CogdoMazeGuiManager: self._initTimer() self._timer.setTime(duration) self._timer.countdown(duration, timerExpiredCallback) + self._timer.show() self._presentTimerIval = ToontownIntervals.start(ToontownIntervals.getPresentGuiIval(self._timer, 'present_timer', startPos=(0, 0, 0.35))) return diff --git a/toontown/cogdominium/CogdoMazeSuits.py b/toontown/cogdominium/CogdoMazeSuits.py index 69d6715c..cf7f9e59 100644 --- a/toontown/cogdominium/CogdoMazeSuits.py +++ b/toontown/cogdominium/CogdoMazeSuits.py @@ -19,7 +19,7 @@ class CogdoMazeSuit(MazeSuit, FSM, CogdoMazeSplattable): MazeSuit.__init__(self, serialNum, maze, randomNumGen, data['cellWalkPeriod'], difficulty, data['dnaName'], startTile=startTile, walkSameDirectionProb=Globals.SuitWalkSameDirectionProb, walkTurnAroundProb=Globals.SuitWalkTurnAroundProb, uniqueRandomNumGen=False, walkAnimName=walkAnimName) FSM.__init__(self, 'CogdoMazeSuit') CogdoMazeSplattable.__init__(self, self.suit, '%s-%i' % (Globals.SuitCollisionName, self.serialNum), 1.5) - if 'scale' in data: + if data.has_key('scale'): self.suit.setScale(data['scale']) self.hp = data['hp'] self.type = cogdoSuitType @@ -228,8 +228,8 @@ class CogdoMazeBossSuit(CogdoMazeSuit): def pickRandomValidSpot(self, r = 5): validSpots = [] - for x in xrange(self.TX - r, self.TX + r): - for y in xrange(self.TY - r, self.TY + r): + for x in range(self.TX - r, self.TX + r): + for y in range(self.TY - r, self.TY + r): if self.maze.isWalkable(x, y): validSpots.append([x, y]) diff --git a/toontown/cogdominium/CogdoMemoGui.py b/toontown/cogdominium/CogdoMemoGui.py index 47cf60c4..a4a5512d 100644 --- a/toontown/cogdominium/CogdoMemoGui.py +++ b/toontown/cogdominium/CogdoMemoGui.py @@ -9,9 +9,9 @@ MEMOICON_SCALE = 0.2 class CogdoMemoGui(DirectFrame): - def __init__(self, parent): + def __init__(self, parent, type='joke_card'): DirectFrame.__init__(self, parent=parent, relief=None, state=DGG.NORMAL, sortOrder=DGG.BACKGROUND_SORT_INDEX) - self._initModel() + self._initModel(type) self.hide() return @@ -26,9 +26,9 @@ class CogdoMemoGui(DirectFrame): def posNextToLaffMeter(self): self.setPos(-0.975, 0, -0.875) - def _initModel(self): + def _initModel(self, type='joke_card'): self._countLabel = DirectLabel(parent=self, relief=None, pos=(0.0625, 0, -0.025), scale=CogdoGameConsts.MemoGuiTextScale, text=str(0), text_fg=CogdoGameConsts.MemoGuiTextColor, text_shadow=(0.2, 0.2, 0.2, 1), text_align=TextNode.ALeft, text_font=ToontownGlobals.getToonFont()) - self._memoIcon = CogdoUtil.loadModel('memo_card', game='shared', group='gui') + self._memoIcon = CogdoUtil.loadModel(type, game='shared', group='gui') self._memoIcon.reparentTo(self) self._memoIcon.setScale(MEMOICON_SCALE) return diff --git a/toontown/cogdominium/CogdoUtil.py b/toontown/cogdominium/CogdoUtil.py index 05817bae..ac145791 100644 --- a/toontown/cogdominium/CogdoUtil.py +++ b/toontown/cogdominium/CogdoUtil.py @@ -69,7 +69,7 @@ class CogdoGameMovie: textNode.setFont(ToontownGlobals.getToonFont()) self._dialogueLabel = aspect2d.attachNewNode(textNode) self._dialogueLabel.setScale(0.06, 0.06, 0.06) - self._dialogueLabel.setPos(0.32, 0, -0.75) + self._dialogueLabel.setPos(0.32, 0, -0.7325) self._dialogueLabel.reparentTo(hidden) def unload(self): @@ -120,9 +120,9 @@ def rotateTable(table, angle): t = [] width = len(table[0]) height = len(table) - for j in xrange(width): + for j in range(width): row = [] - for i in xrange(height): + for i in range(height): row.append(table[height - 1 - i][j]) t.append(row) @@ -137,9 +137,9 @@ def rotateTable(table, angle): t = [] width = len(table[0]) height = len(table) - for j in xrange(width): + for j in range(width): row = [] - for i in xrange(height): + for i in range(height): row.append(table[i][width - 1 - j]) t.append(row) diff --git a/toontown/cogdominium/DistCogdoCrane.py b/toontown/cogdominium/DistCogdoCrane.py index b41545d8..3f7eb445 100644 --- a/toontown/cogdominium/DistCogdoCrane.py +++ b/toontown/cogdominium/DistCogdoCrane.py @@ -1,20 +1,17 @@ -from direct.distributed import DistributedObject +from direct.gui.DirectGui import * +from pandac.PandaModules import * +from direct.interval.IntervalGlobal import * from direct.distributed.ClockDelta import * from direct.fsm import FSM -from direct.gui.DirectGui import * -from direct.interval.IntervalGlobal import * -from direct.showbase import PythonUtil +from direct.distributed import DistributedObject from direct.showutil import Rope +from direct.showbase import PythonUtil from direct.task import Task -from pandac.PandaModules import * -import random - +from toontown.toonbase import ToontownGlobals +from toontown.toonbase import TTLocalizer from otp.otpbase import OTPGlobals from toontown.cogdominium import CogdoCraneGameConsts as GameConsts -from toontown.nametag import NametagGlobals -from toontown.toonbase import TTLocalizer -from toontown.toonbase import ToontownGlobals - +import random class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): notify = DirectNotifyGlobal.directNotify.newCategory('DistCogdoCrane') @@ -235,7 +232,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): self.physicsActivated = 0 def __straightenCable(self): - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): an, anp, cnp = self.activeLinks[linkNum] an.getPhysicsObject().setVelocity(0, 0, 0) z = float(linkNum + 1) / float(self.numLinks) * self.cableLength @@ -258,7 +255,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): self.links = [] self.links.append((self.topLink, Point3(0, 0, 0))) anchor = self.topLink - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): anchor = self.__makeLink(anchor, linkNum) self.collisions.stash() @@ -401,7 +398,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): taskMgr.add(self.__watchControls, 'watchCraneControls') taskMgr.doMethodLater(5, self.__displayCraneAdvice, self.craneAdviceName) taskMgr.doMethodLater(10, self.__displayMagnetAdvice, self.magnetAdviceName) - NametagGlobals.setForceOnscreenChat(True) + NametagGlobals.setOnscreenChatForced(1) self.arrowVert = 0 self.arrowHorz = 0 @@ -418,7 +415,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): self.ignore('InputState-turnRight') self.arrowVert = 0 self.arrowHorz = 0 - NametagGlobals.setForceOnscreenChat(False) + NametagGlobals.setOnscreenChatForced(0) taskMgr.remove('watchCraneControls') self.__setMoveSound(None) return @@ -554,7 +551,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): def startFlicker(self): self.magnetSoundInterval.start() self.lightning = [] - for i in xrange(4): + for i in range(4): t = float(i) / 3.0 - 0.5 l = self.craneGame.lightning.copyTo(self.gripper) l.setScale(random.choice([1, -1]), 1, 5) @@ -683,7 +680,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): self.armSmoother.setPos(self.crane.getPos()) self.armSmoother.setHpr(self.arm.getHpr()) self.armSmoother.setPhonyTimestamp() - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): smoother = self.linkSmoothers[linkNum] an, anp, cnp = self.activeLinks[linkNum] smoother.clearPositions(0) @@ -692,7 +689,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): def doSmoothTask(self, task): self.armSmoother.computeAndApplySmoothPosHpr(self.crane, self.arm) - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): smoother = self.linkSmoothers[linkNum] anp = self.activeLinks[linkNum][1] smoother.computeAndApplySmoothPos(anp) @@ -719,7 +716,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): self.armSmoother.applySmoothPos(self.crane) self.armSmoother.applySmoothHpr(self.arm) self.armSmoother.clearPositions(1) - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): smoother = self.linkSmoothers[linkNum] an, anp, cnp = self.activeLinks[linkNum] if smoother.getLatestPosition(): @@ -735,7 +732,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): self.armSmoother.setH(h) self.armSmoother.setTimestamp(local) self.armSmoother.markPosition() - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): smoother = self.linkSmoothers[linkNum] lp = links[linkNum] smoother.setPos(*lp) @@ -749,7 +746,7 @@ class DistCogdoCrane(DistributedObject.DistributedObject, FSM.FSM): def d_sendCablePos(self): timestamp = globalClockDelta.getFrameNetworkTime() links = [] - for linkNum in xrange(self.numLinks): + for linkNum in range(self.numLinks): an, anp, cnp = self.activeLinks[linkNum] p = anp.getPos() links.append((p[0], p[1], p[2])) diff --git a/toontown/cogdominium/DistCogdoCraneGame.py b/toontown/cogdominium/DistCogdoCraneGame.py index 262b684a..98f688ae 100644 --- a/toontown/cogdominium/DistCogdoCraneGame.py +++ b/toontown/cogdominium/DistCogdoCraneGame.py @@ -102,7 +102,7 @@ class DistCogdoCraneGame(CogdoCraneGameBase, DistCogdoLevelGame): self.notify.warning('Not a collision node: %s' % repr(cnp)) break newCollideMask = newCollideMask | cn.getIntoCollideMask() - for i in xrange(cn.getNumSolids()): + for i in range(cn.getNumSolids()): solid = cn.getSolid(i) if isinstance(solid, PM.CollisionPolygon): plane = PM.Plane(solid.getPlane()) diff --git a/toontown/cogdominium/DistCogdoCraneGameAI.py b/toontown/cogdominium/DistCogdoCraneGameAI.py index d7788f68..1ac2594f 100644 --- a/toontown/cogdominium/DistCogdoCraneGameAI.py +++ b/toontown/cogdominium/DistCogdoCraneGameAI.py @@ -1,6 +1,70 @@ -from direct.directnotify import DirectNotifyGlobal +from direct.directnotify.DirectNotifyGlobal import directNotify from toontown.cogdominium.DistCogdoLevelGameAI import DistCogdoLevelGameAI +from toontown.cogdominium.DistCogdoCraneAI import DistCogdoCraneAI +from toontown.cogdominium import CogdoCraneGameConsts as GameConsts +from toontown.cogdominium.CogdoCraneGameBase import CogdoCraneGameBase -class DistCogdoCraneGameAI(DistCogdoLevelGameAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistCogdoCraneGameAI") +class DistCogdoCraneGameAI(DistCogdoLevelGameAI, CogdoCraneGameBase): + notify = directNotify.newCategory('DistCogdoCraneGameAI') + + def __init__(self, air, interior): + DistCogdoLevelGameAI.__init__(self, air, interior) + self._cranes = [ + None] * self.MaxPlayers + + def enterLoaded(self): + DistCogdoLevelGameAI.enterLoaded(self) + for i in xrange(self.MaxPlayers): + crane = DistCogdoCraneAI(self.air, self, i) + crane.generateWithRequired(self.zoneId) + self._cranes[i] = crane + + def exitLoaded(self): + for i in xrange(self.MaxPlayers): + if self._cranes[i]: + self._cranes[i].requestDelete() + self._cranes[i] = None + continue + + DistCogdoLevelGameAI.exitLoaded(self) + + def enterGame(self): + DistCogdoLevelGameAI.enterGame(self) + for i in xrange(self.getNumPlayers()): + self._cranes[i].request('Controlled', self.getToonIds()[i]) + + self._scheduleGameDone() + + def _scheduleGameDone(self): + timeLeft = GameConsts.Settings.GameDuration.get() - globalClock.getRealTime() - self.getStartTime() + if timeLeft > 0: + self._gameDoneEvent = taskMgr.doMethodLater(timeLeft, self._gameDoneDL, self.uniqueName('boardroomGameDone')) + else: + self._gameDoneDL() + + def exitGame(self): + taskMgr.remove(self._gameDoneEvent) + self._gameDoneEvent = None + + def _gameDoneDL(self, task = None): + self._handleGameFinished() + return task.done + + def enterFinish(self): + DistCogdoLevelGameAI.enterFinish(self) + self._finishDoneEvent = taskMgr.doMethodLater(10.0, self._finishDoneDL, self.uniqueName('boardroomFinishDone')) + + def exitFinish(self): + taskMgr.remove(self._finishDoneEvent) + self._finishDoneEvent = None + + def _finishDoneDL(self, task): + self.announceGameDone() + return task.done + if __dev__: + + def _handleGameDurationChanged(self, gameDuration): + if hasattr(self, '_gameDoneEvent') and self._gameDoneEvent != None: + taskMgr.remove(self._gameDoneEvent) + self._scheduleGameDone() \ No newline at end of file diff --git a/toontown/cogdominium/DistCogdoCraneObject.py b/toontown/cogdominium/DistCogdoCraneObject.py index b6a65424..319f9fba 100644 --- a/toontown/cogdominium/DistCogdoCraneObject.py +++ b/toontown/cogdominium/DistCogdoCraneObject.py @@ -126,10 +126,12 @@ class DistCogdoCraneObject(DistributedSmoothNode.DistributedSmoothNode, FSM.FSM) vel.normalize() impact = vel[1] if impact >= self.getMinImpact(): + print 'hit! %s' % impact self.hitBossSoundInterval.start() self.doHitBoss(impact) else: self.touchedBossSoundInterval.start() + print '--not hard enough: %s' % impact def doHitBoss(self, impact): self.d_hitBoss(impact) diff --git a/toontown/cogdominium/DistCogdoFlyingGame.py b/toontown/cogdominium/DistCogdoFlyingGame.py index 3c49f035..475d8ed7 100644 --- a/toontown/cogdominium/DistCogdoFlyingGame.py +++ b/toontown/cogdominium/DistCogdoFlyingGame.py @@ -10,8 +10,6 @@ class DistCogdoFlyingGame(DistCogdoGame): def __init__(self, cr): DistCogdoGame.__init__(self, cr) - if __debug__ and base.config.GetBool('schellgames-dev', True): - self.accept('onCodeReload', self.__sgOnCodeReload) self.game = CogdoFlyingGame(self) def delete(self): diff --git a/toontown/cogdominium/DistCogdoFlyingGameAI.py b/toontown/cogdominium/DistCogdoFlyingGameAI.py index d69382e9..3412000d 100644 --- a/toontown/cogdominium/DistCogdoFlyingGameAI.py +++ b/toontown/cogdominium/DistCogdoFlyingGameAI.py @@ -1,42 +1,129 @@ from direct.directnotify import DirectNotifyGlobal +from direct.distributed.ClockDelta import * from toontown.cogdominium.DistCogdoGameAI import DistCogdoGameAI +import CogdoFlyingGameGlobals as Globals class DistCogdoFlyingGameAI(DistCogdoGameAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistCogdoFlyingGameAI") + + def __init__(self, air): + DistCogdoGameAI.__init__(self, air) + self.completed = [] + self.eagles = {} + self.totalMemos = 0 + + def requestAction(self, action, data): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if not av: + return + + if action == Globals.AI.GameActions.LandOnWinPlatform: + self.completed.append(avId) + for toon in self.toons: + if toon not in self.completed: + return + + self.gameDone() + + elif action == Globals.AI.GameActions.BladeLost: + self.sendUpdate("toonBladeLost", [avId]) + + elif action == Globals.AI.GameActions.SetBlades: + self.sendUpdate("toonSetBlades", [avId, data]) + + elif action == Globals.AI.GameActions.Died: + damage = Globals.AI.SafezoneId2DeathDamage[self.getSafezoneId()] + self.__damage(av, damage) + self.sendUpdate("toonDied", [avId, globalClockDelta.getRealNetworkTime()]) + + elif action == Globals.AI.GameActions.Spawn: + self.sendUpdate("toonSpawn", [avId, globalClockDelta.getRealNetworkTime()]) + + elif action == Globals.AI.GameActions.RequestEnterEagleInterest: + if not self.eagles.get(data): + self.eagles[data] = avId + self.sendUpdate("toonSetAsEagleTarget", [avId, data, globalClockDelta.getRealNetworkTime()]) + + elif action == Globals.AI.GameActions.RequestExitEagleInterest: + if self.eagles.get(data) == avId: + self.eagles[data] = 0 + self.sendUpdate("toonClearAsEagleTarget", [avId, data, globalClockDelta.getRealNetworkTime()]) + + elif action == Globals.AI.GameActions.HitLegalEagle: + damage = Globals.AI.SafezoneId2LegalEagleDamage[self.getSafezoneId()] + self.__damage(av, damage) + + elif action == Globals.AI.GameActions.HitMinion: + damage = Globals.AI.SafezoneId2MinionDamage[self.getSafezoneId()] + self.__damage(av, damage) + + elif action == Globals.AI.GameActions.HitWhirlwind: + damage = Globals.AI.SafezoneId2WhirlwindDamage[self.getSafezoneId()] + self.__damage(av, damage) + + elif action == Globals.AI.GameActions.RanOutOfTimePenalty: + damage = int(20 * self.getDifficulty()) + self.__damage(av, damage) + + else: + self.notify.warning('Client requested unknown action \'%s\'' %action) - def requestAction(self, todo0, todo1): - pass + def requestPickUp(self, pickupNum, pickupType): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if not av: + return + + if pickupType <= len(Globals.Level.GatherableTypes): + self.sendUpdate("pickUp", [avId, pickupNum, globalClockDelta.getRealNetworkTime()]) + if pickupType == Globals.Level.GatherableTypes.LaffPowerup: + av.toonUp(int(27 * self.getDifficulty()) + 3) + + if pickupType == Globals.Level.GatherableTypes.Memo: + self.totalMemos += 1 + + else: + self.notify.warning('Client requested unknown pickup \'%s\'' % pickupType) - def requestPickUp(self, todo0, todo1): - pass + def handleStart(self): + for toon in self.toons: + self.acceptOnce(self.air.getAvatarExitEvent(toon), self.__handleAvExit, [toon]) + + def __handleAvExit(self, toon): + if self.air: + if toon in self.toons: + self.toons.remove(toon) + self.ignore(self.air.getAvatarExitEvent(toon)) + if not self.toons: + self.gameDone(failed=True) + + def requestDelete(self): + DistCogdoGameAI.requestDelete(self) + self.ignoreAll() + + def __removeToon(self, avId): + if avId not in self.toons: + return + + self.toons.pop(self.toons.index(avId)) + if len(self.toons) == 0: + self.gameDone(failed=True) + + def __damage(self, av, damage): + av.takeDamage(damage) + if av.getHp() < 1: + self.__removeToon(av.doId) + + def getTotalMemos(self): + return self.totalMemos - def pickUp(self, todo0, todo1, todo2): - pass - - def debuffPowerup(self, todo0, todo1, todo2): - pass - - def doAction(self, todo0, todo1): - pass - - def eagleExitCooldown(self, todo0, todo1): - pass - - def toonSetAsEagleTarget(self, todo0, todo1, todo2): - pass - - def toonClearAsEagleTarget(self, todo0, todo1, todo2): - pass - - def toonDied(self, todo0, todo1): - pass - - def toonSpawn(self, todo0, todo1): - pass - - def toonSetBlades(self, todo0, todo1): - pass - - def toonBladeLost(self, todo0): - pass +from otp.ai.MagicWordGlobal import * +@magicWord(category=CATEGORY_MODERATOR) +def endFly(): + if hasattr(simbase.air, 'cogdoGame'): + game = simbase.air.cogdoGame + game.requestAction(Globals.AI.GameActions.LandOnWinPlatform, 0) + return 'Finished cogdo flying game!' + \ No newline at end of file diff --git a/toontown/cogdominium/DistCogdoGame.py b/toontown/cogdominium/DistCogdoGame.py index e93249ec..2d2da09b 100644 --- a/toontown/cogdominium/DistCogdoGame.py +++ b/toontown/cogdominium/DistCogdoGame.py @@ -11,7 +11,7 @@ from toontown.minigame.MinigameRulesPanel import MinigameRulesPanel from toontown.cogdominium.CogdoGameRulesPanel import CogdoGameRulesPanel from toontown.minigame import MinigameGlobals from toontown.toonbase import TTLocalizer as TTL -SCHELLGAMES_DEV = __debug__ and base.config.GetBool('schellgames-dev', False) +SCHELLGAMES_DEV = __debug__ and base.config.GetBool('cogdo-enable-cheat', True) class DistCogdoGame(DistCogdoGameBase, DistributedObject): notify = directNotify.newCategory('DistCogdoGame') @@ -19,6 +19,7 @@ class DistCogdoGame(DistCogdoGameBase, DistributedObject): def __init__(self, cr): DistributedObject.__init__(self, cr) base.cogdoGame = self + cr.cogdoGame = self self._waitingStartLabel = DirectLabel(text=TTL.MinigameWaitingForOtherPlayers, text_fg=VBase4(1, 1, 1, 1), relief=None, pos=(-0.6, 0, -0.75), scale=0.075) self._waitingStartLabel.hide() self.loadFSM = ClassicFSM.ClassicFSM('DistCogdoGame.loaded', [State.State('NotLoaded', self.enterNotLoaded, self.exitNotLoaded, ['Loaded']), State.State('Loaded', self.enterLoaded, self.exitLoaded, ['NotLoaded'])], 'NotLoaded', 'NotLoaded') @@ -71,7 +72,7 @@ class DistCogdoGame(DistCogdoGameBase, DistributedObject): return def getToon(self, toonId): - if toonId in self.cr.doId2do: + if self.cr.doId2do.has_key(toonId): return self.cr.doId2do[toonId] else: return None @@ -88,8 +89,8 @@ class DistCogdoGame(DistCogdoGameBase, DistributedObject): def announceGenerate(self): DistributedObject.announceGenerate(self) - self._requestInterior() self.loadFSM.request('Loaded') + self._requestInterior() self.notify.info('difficulty: %s, safezoneId: %s' % (self.getDifficulty(), self.getSafezoneId())) def _requestInterior(self): @@ -116,6 +117,7 @@ class DistCogdoGame(DistCogdoGameBase, DistributedObject): def disable(self): base.cogdoGame = None + self.cr.cogdoGame = None self.fsm.requestFinalState() self.loadFSM.requestFinalState() self.fsm = None @@ -230,7 +232,7 @@ class DistCogdoGame(DistCogdoGameBase, DistributedObject): def enterGame(self): if SCHELLGAMES_DEV: - self.acceptOnce('escape', messenger.send, ['magicWord', ['~endgame']]) + self.acceptOnce('escape', messenger.send, ['magicWord', ['~endMaze']]) def exitGame(self): if SCHELLGAMES_DEV: diff --git a/toontown/cogdominium/DistCogdoGameAI.py b/toontown/cogdominium/DistCogdoGameAI.py index 1a9f6052..9f494890 100644 --- a/toontown/cogdominium/DistCogdoGameAI.py +++ b/toontown/cogdominium/DistCogdoGameAI.py @@ -1,36 +1,108 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI +from direct.distributed.ClockDelta import * +import CogdoGameConsts class DistCogdoGameAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistCogdoGameAI") - - def setInteriorId(self, todo0): - pass - - def setExteriorZone(self, todo0): - pass - - def setDifficultyOverrides(self, todo0, todo1): - pass - - def setVisible(self): - pass - - def setIntroStart(self): - pass - - def setToonSad(self, todo0): - pass - - def setToonDisconnect(self, todo0): - pass - + delayIntro = .1 + + def __init__(self, air): + DistributedObjectAI.__init__(self, air) + air.cogdoGame = self + self.interiorId = 0 + self.exteriorZone = 0 + self.difficultyOverrides = [2147483647, -1] + self.requests = {} + self.toons = [] + + def announceGenerate(self): + DistributedObjectAI.announceGenerate(self) + + self.finishEvent = self.uniqueName('CogdoMazeGameDone') + self.gameOverEvent = self.uniqueName('CogdoMazeGameLose') + + self.resetRequests() + + def d_startIntro(self): + self.sendUpdate('setVisible', []) + taskMgr.doMethodLater(self.delayIntro, self.__startIntro, self.taskName('CogdoStartIntro')) + + def getInterior(self): + return self.air.doId2do.get(self.interiorId) + + def resetRequests(self): + interior = self.getInterior() + toons = interior.getToons()[0] + for toon in toons: + self.requests[toon] = 0 + + def __startIntro(self, task = None): + self.sendUpdate('setIntroStart', []) + if task: + return task.done + def setAvatarReady(self): + avId = self.air.getAvatarIdFromSender() + self.requests[avId] = 1 + if not avId in self.toons: self.toons.append(avId) + if self.allToonsReady(): + self.handleStart() + self.sendUpdate('setGameStart', [globalClockDelta.getRealNetworkTime()]) + + def allToonsReady(self): + interior = self.getInterior() + toons = interior.getToons()[0] + for toon in toons: + if self.requests.get(toon, 0) == 0: + return 0 + return 1 + + def handleStart(self): pass - def setGameStart(self, todo0): - pass + def setInteriorId(self, id): + self.interiorId = id + + def getInteriorId(self): + return self.interiorId - def setGameFinish(self, todo0): - pass + def setExteriorZone(self, zone): + self.exteriorZone = zone + + def getExteriorZone(self): + return self.exteriorZone + def setDifficultyOverrides(self, difficulty, exteriorDifficulty): + self.difficultyOverrides = [difficulty, exteriorDifficulty] + + def getDifficultyOverrides(self): + return self.difficultyOverrides + + def toonWentSad(self, avId): + self.sendUpdate('setToonSad', [avId]) + + def setToons(self, toons): + self.toons = toons + + def disable(self): + DistributedObjectAI.disable(self) + self.air.cogdoGame = None + del self.air.cogdoGame + + def gameDone(self, failed=False): + if not failed: + if len(self.toons) == 0: + failed = True + + if not failed: + messenger.send(self.finishEvent, [self.toons]) + else: + messenger.send(self.gameOverEvent) + + def getDifficulty(self): + return CogdoGameConsts.getDifficulty(self.getSafezoneId()) + + def getSafezoneId(self): + return CogdoGameConsts.getSafezoneId(self.exteriorZone) + \ No newline at end of file diff --git a/toontown/cogdominium/DistCogdoMazeGame.py b/toontown/cogdominium/DistCogdoMazeGame.py index c4d7113e..a79cd4d6 100644 --- a/toontown/cogdominium/DistCogdoMazeGame.py +++ b/toontown/cogdominium/DistCogdoMazeGame.py @@ -14,8 +14,6 @@ class DistCogdoMazeGame(DistCogdoGame, DistCogdoMazeGameBase): DistCogdoGame.__init__(self, cr) self.game = CogdoMazeGame(self) self._numSuits = (0, 0, 0) - if __debug__ and base.config.GetBool('schellgames-dev', True): - self.accept('onCodeReload', self.__sgOnCodeReload) def delete(self): del self.randomNumGen @@ -45,7 +43,7 @@ class DistCogdoMazeGame(DistCogdoGame, DistCogdoMazeGameBase): bossCode = None if self._numSuits[0] > 0: bossCode = '' - for u in xrange(self._numSuits[0]): + for u in range(self._numSuits[0]): bossCode += '%X' % self.randomNumGen.randint(0, 15) self.game.load(mazeFactory, self._numSuits, bossCode) @@ -230,3 +228,12 @@ class DistCogdoMazeGame(DistCogdoGame, DistCogdoMazeGameBase): def setToonDisconnect(self, toonId): DistCogdoGame.setToonDisconnect(self, toonId) self.game.handleToonDisconnected(toonId) + +from otp.ai.MagicWordGlobal import * + +@magicWord(category=CATEGORY_MODERATOR) +def revealMap(): + if hasattr(base.cr, 'cogdoGame'): + game = base.cr.cogdoGame + game.game.guiMgr.mazeMapGui.showExit() + game.game.guiMgr.mazeMapGui.revealAll() diff --git a/toontown/cogdominium/DistCogdoMazeGameAI.py b/toontown/cogdominium/DistCogdoMazeGameAI.py index c17e7014..eb748399 100644 --- a/toontown/cogdominium/DistCogdoMazeGameAI.py +++ b/toontown/cogdominium/DistCogdoMazeGameAI.py @@ -1,51 +1,249 @@ from direct.directnotify import DirectNotifyGlobal from toontown.cogdominium.DistCogdoGameAI import DistCogdoGameAI +import CogdoMazeGameGlobals +from direct.distributed.ClockDelta import * +from direct.task import Timer +from toontown.battle import BattleBase +from toontown.building.ElevatorConstants import * + +ALL_ABOARD_LAG = .7 + +BASE_TOON_UP = 10 +JOKE_TOON_UP = 5 class DistCogdoMazeGameAI(DistCogdoGameAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistCogdoMazeGameAI") - - def requestAction(self, todo0, todo1): - pass - - def doAction(self, todo0, todo1, todo2): - pass - - def setNumSuits(self, todo0): - pass - - def requestUseGag(self, todo0, todo1, todo2, todo3): - pass - - def toonUsedGag(self, todo0, todo1, todo2, todo3, todo4): - pass - - def requestSuitHitByGag(self, todo0, todo1): - pass - - def suitHitByGag(self, todo0, todo1, todo2): - pass - - def requestHitBySuit(self, todo0, todo1, todo2): - pass - - def toonHitBySuit(self, todo0, todo1, todo2, todo3): - pass - + delayIntro = BattleBase.ELEVATOR_T + ElevatorData[ELEVATOR_NORMAL]['openTime'] + BattleBase.SERVER_BUFFER_TIME + + def __init__(self, air): + DistCogdoGameAI.__init__(self, air) + self.numSuits = (0,0,0) + self.timer = Timer.Timer() + self.doorRevealed = False + self.toonsInDoor = [] + self.bosses = {} + self.fastMinions = {} + self.slowMinions = {} + self.suitTypes = [self.bosses, self.fastMinions, self.slowMinions] + self.numJokes = {} + + def announceGenerate(self): + DistCogdoGameAI.announceGenerate(self) + self.setupSuitsAI() + + def setupSuitsAI(self): + bossHp = CogdoMazeGameGlobals.SuitData[0]['hp'] + fastMiniHp = CogdoMazeGameGlobals.SuitData[1]['hp'] + slowMiniHp = CogdoMazeGameGlobals.SuitData[2]['hp'] + + serialNum = 0 + for i in range(self.numSuits[0]): + self.bosses[serialNum] = bossHp + serialNum += 1 + for i in range(self.numSuits[1]): + self.fastMinions[serialNum] = fastMiniHp + serialNum += 1 + for i in range(self.numSuits[2]): + self.slowMinions[serialNum] = slowMiniHp + serialNum += 1 + + def setNumSuits(self, num): + self.numSuits = num + + def getNumSuits(self): + return self.numSuits + + def requestUseGag(self, x, y, h, timestamp): + avId = self.air.getAvatarIdFromSender() + self.sendUpdate('toonUsedGag', [avId, x, y, h, globalClockDelta.getRealNetworkTime()]) + + def requestSuitHitByGag(self, suitType, suitNum): + hitAI = self.hitSuitAI(suitType, suitNum) + if not hitAI: + self.notify.warning('Cannot hit suit!') + return + avId = self.air.getAvatarIdFromSender() + self.sendUpdate('suitHitByGag', [avId, suitType, suitNum]) + + def requestHitBySuit(self, suitType, suitNum, nettime): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if av: + lostHp = CogdoMazeGameGlobals.SuitData[suitType]['toonDamage'] * self.getDifficulty() * 10 + av.takeDamage(lostHp) + networkTime = globalClockDelta.getRealNetworkTime() + self.sendUpdate('toonHitBySuit', [avId, suitType, suitNum, networkTime]) + if av.getHp() < 1: + self.toonWentSad(avId) + def requestHitByDrop(self): - pass + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if av: + lostHp = CogdoMazeGameGlobals.DropDamage + av.takeDamage(lostHp) + self.sendUpdate('toonHitByDrop', [avId]) + + def requestPickUp(self, pickupNum): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if av: + now = globalClockDelta.getRealNetworkTime() + + if avId in self.numJokes: + self.numJokes[avId] += 1 + + else: + self.numJokes[avId] = 1 + + self.sendUpdate('pickUp', [avId, pickupNum, now]) + + def requestGag(self, coolerIndex): + avId = self.air.getAvatarIdFromSender() + self.sendUpdate('hasGag', [avId, globalClockDelta.getRealNetworkTime()]) + + def hitSuitAI(self, suitType, suitNum): + cogKey = None + for cogNum in self.suitTypes[suitType].keys(): + if cogNum == suitNum: + cogKey = cogNum + break + if cogKey == None: + return 0 + cogHp = self.suitTypes[suitType][cogKey] + cogHp -= 1 + self.suitTypes[suitType][cogKey] = cogHp + if cogHp <= 0: + del self.suitTypes[suitType][cogKey] + return 1 + + def handleStart(self): + taskMgr.add(self.__checkGameDone, self.taskName('check-game-done')) + taskMgr.add(self.__checkPlayersTask, self.taskName('check-players-task')) + serverDelay = 1.0 + self.timer.startCallback(CogdoMazeGameGlobals.SecondsUntilTimeout + serverDelay, self.__handleGameOver) + taskMgr.doMethodLater(serverDelay, self.clientCountdown, self.taskName('client_countdown')) + taskMgr.add(self.__timeWarningTask, self.taskName('time-warning-task')) + + def clientCountdown(self, task): + self.doAction(CogdoMazeGameGlobals.GameActions.Countdown, 0) + return task.done + + def __handleGameOver(self): + self.removeAll() + self.gameDone(failed=True) + + def __checkGameDone(self, task): + bossesLeft = self.bosses + if len(bossesLeft) == 0: + self.timer.stop() + self.doAction(CogdoMazeGameGlobals.GameActions.OpenDoor, 0) + self.__startTimeout() + return task.done + + return task.again + + def __startTimeout(self): + self.timer.startCallback(CogdoMazeGameGlobals.SecondsUntilGameEnds, self.__handleTimeout) + + def __handleTimeout(self): + for toon in self.toons: + if not toon in self.toonsInDoor: + self.killToon(toon) + + self.removeAll() + self.gameDone() + + def __timeWarningTask(self, task): + if self.timer.getT() <= CogdoMazeGameGlobals.SecondsForTimeAlert: + self.doAction(CogdoMazeGameGlobals.GameActions.TimeAlert, 0) + return task.done + + return task.again + + def killToon(self, avId): + av = self.air.doId2do.get(avId) + if av: + if av.getHp() > 0: + av.takeDamage(av.getHp()) + self.toonWentSad(avId) + self.__playerDisconnected(avId) + + def __checkPlayersTask(self, task): + for toonId in self.toons: + toon = self.air.doId2do.get(toonId) + if not toon: + self.__playerDisconnected(toonId) + + return task.again + + def __playerDisconnected(self, avId): + self.sendUpdate('setToonDisconnect', [avId]) + self.toons.pop(self.toons.index(avId)) + if len(self.toons) == 0: + self.removeAll() + self.gameDone(failed=True) + + def doAction(self, action, data): + self.sendUpdate('doAction', [action, data, globalClockDelta.getRealNetworkTime()]) + + def requestAction(self, action, data): + Globals = CogdoMazeGameGlobals + avId = self.air.getAvatarIdFromSender() + if action == Globals.GameActions.RevealDoor: + if not self.doorRevealed: + self.doAction(action, avId) + self.doorRevealed = True + + else: + self.notify.warning('Toon tried to reveal door but it\'s already revealed! Ignoring.') + + elif action == Globals.GameActions.EnterDoor: + if not avId in self.toonsInDoor: + self.doAction(action, avId) + self.toonsInDoor.append(avId) + self.toonUpToon(avId) + + else: + self.notify.warning('Toon tried to enter into door but already entered! Ignoring.') + return + + if len(self.toonsInDoor) >= len(self.toons): + self.__handleAllAboard() + + else: + self.notify.warning('Client requested unknown action \'%s\'' %action) + + def __handleAllAboard(self): + if len(self.toonsInDoor) != len(self.toons): + self.notify.warning('__handleAllAboard expect all toons aboard!') + return + self.removeAll() + taskMgr.doMethodLater(ALL_ABOARD_LAG, lambda t: self.gameDone(), self.taskName('all-aboard-delay')) + + def toonUpToon(self, toonId): + if toonId in self.toonsInDoor: + toon = self.air.doId2do.get(toonId) + if toon: + val = min(BASE_TOON_UP + JOKE_TOON_UP * self.numJokes.get(toonId, 0), toon.getMaxHp()) + toon.toonUp(val) + + def removeAll(self): + taskMgr.remove(self.taskName('check-game-done')) + taskMgr.remove(self.taskName('check-players-task')) + taskMgr.remove(self.taskName('time-warning-task')) + taskMgr.remove(self.taskName('all-aboard-delay')) + self.timer.stop() + + def disable(self): + DistCogdoGameAI.disable(self) + self.removeAll() - def toonHitByDrop(self, todo0): - pass - - def requestPickUp(self, todo0): - pass - - def pickUp(self, todo0, todo1, todo2): - pass - - def requestGag(self, todo0): - pass - - def hasGag(self, todo0, todo1): - pass +from otp.ai.MagicWordGlobal import * +@magicWord(category=CATEGORY_MODERATOR) +def endMaze(): + if hasattr(simbase.air, 'cogdoGame'): + maze = simbase.air.cogdoGame + maze.doAction(CogdoMazeGameGlobals.GameActions.OpenDoor, 0) + return 'Finished cogdo maze game!' diff --git a/toontown/cogdominium/DistributedCogdoBarrel.py b/toontown/cogdominium/DistributedCogdoBarrel.py index d105fd0a..e0e0018c 100644 --- a/toontown/cogdominium/DistributedCogdoBarrel.py +++ b/toontown/cogdominium/DistributedCogdoBarrel.py @@ -3,12 +3,15 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed import DistributedObject from toontown.toonbase import ToontownGlobals, ToontownIntervals from toontown.cogdominium import CogdoBarrelRoomConsts +from toontown.cogdominium import CogdoBarrelRoom +import random class DistributedCogdoBarrel(DistributedObject.DistributedObject): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedCogdoBarrel') def __init__(self, cr): DistributedObject.DistributedObject.__init__(self, cr) + self.barrelRoom = CogdoBarrelRoom.CogdoBarrelRoom() self.index = None self.state = None self.model = None @@ -17,6 +20,7 @@ class DistributedCogdoBarrel(DistributedObject.DistributedObject): self.collNodePath = None self.availableTex = None self.usedTex = None + self.brLaff = 0 return def generate(self): @@ -32,7 +36,6 @@ class DistributedCogdoBarrel(DistributedObject.DistributedObject): cogdoBarrelsNode = render.find('@@CogdoBarrels') if not cogdoBarrelsNode or cogdoBarrelsNode.isEmpty(): cogdoBarrelsNode = render.attachNewNode('CogdoBarrels') - cogdoBarrelsNode.stash() self.model.reparentTo(cogdoBarrelsNode) self.availableTex = loader.loadTexture('phase_5/maps/tt_t_ara_cbr_Barrel_notUsed.jpg') self.usedTex = loader.loadTexture('phase_5/maps/tt_t_ara_cbr_Barrel_Used.jpg') @@ -110,13 +113,18 @@ class DistributedCogdoBarrel(DistributedObject.DistributedObject): self.sendUpdate('requestGrab', []) def setGrab(self, avId): + toonup = CogdoBarrelRoomConsts.ToonUp if avId == base.localAvatar.doId: ToontownIntervals.start(ToontownIntervals.getPulseIval(self.model, self.__pulseIvalName(), 1.15, duration=0.2)) self.setState(CogdoBarrelRoomConsts.StateUsed) + self.brLaff = random.randint(toonup[0], toonup[1]) def setReject(self): pass + def getBarrelLaff(self): + return self.brLaff + def __pulseIvalName(self): return 'DistributedCogdoBarrelPulse%s' % self.doId diff --git a/toontown/cogdominium/DistributedCogdoBarrelAI.py b/toontown/cogdominium/DistributedCogdoBarrelAI.py index 23c5e081..3479af63 100644 --- a/toontown/cogdominium/DistributedCogdoBarrelAI.py +++ b/toontown/cogdominium/DistributedCogdoBarrelAI.py @@ -1,21 +1,36 @@ from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectAI import DistributedObjectAI +from direct.distributed import DistributedObjectAI +import CogdoBarrelRoomConsts +import random -class DistributedCogdoBarrelAI(DistributedObjectAI): +class DistributedCogdoBarrelAI(DistributedObjectAI.DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCogdoBarrelAI") - + + def __init__(self, air, index): + DistributedObjectAI.DistributedObjectAI.__init__(self, air) + self.index = index + self.state = CogdoBarrelRoomConsts.StateAvailable + self.brLaff = 0 + def requestGrab(self): - pass - - def setIndex(self, todo0): - pass - - def setState(self, todo0): - pass - - def setGrab(self, todo0): - pass - - def setReject(self): - pass - + toonup = CogdoBarrelRoomConsts.ToonUp + if self.state == CogdoBarrelRoomConsts.StateAvailable: + self.state = CogdoBarrelRoomConsts.StateUsed + self.sendUpdate("setState", [CogdoBarrelRoomConsts.StateUsed]) + self.sendUpdate("setGrab", [self.air.getAvatarIdFromSender()]) + self.brLaff = random.randint(toonup[0], toonup[1]) + self.recieveToonUp() + + def getIndex(self): + return self.index + + def getState(self): + return self.state + + def recieveToonUp(self): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if not av: + return + + av.toonUp(self.brLaff) diff --git a/toontown/cogdominium/DistributedCogdoElevatorExt.py b/toontown/cogdominium/DistributedCogdoElevatorExt.py index 25f65334..b722f2da 100644 --- a/toontown/cogdominium/DistributedCogdoElevatorExt.py +++ b/toontown/cogdominium/DistributedCogdoElevatorExt.py @@ -1,17 +1,22 @@ +# File: D (Python 2.4) + from toontown.building.DistributedElevatorExt import DistributedElevatorExt +from toontown.building.ElevatorConstants import * +from toontown.building.ElevatorUtils import * +from toontown.toonbase import ToontownGlobals class DistributedCogdoElevatorExt(DistributedElevatorExt): - - def setupElevator(self): - DistributedElevatorExt.setupElevator(self) - self.elevatorSphereNodePath.setY(-1.0) - self.elevatorSphereNodePath.setZ(1.5) - + def __init__(self, cr): + DistributedElevatorExt.__init__(self, cr) + self.type = ELEVATOR_FIELD + def getElevatorModel(self): return self.bldg.getCogdoElevatorNodePath() + def getBldgDoorOrigin(self): return self.bldg.getCogdoDoorOrigin() + def _getDoorsClosedInfo(self): return ('cogdoInterior', 'cogdoInterior') diff --git a/toontown/cogdominium/DistributedCogdoElevatorExtAI.py b/toontown/cogdominium/DistributedCogdoElevatorExtAI.py index 5f69fdf5..4624df08 100644 --- a/toontown/cogdominium/DistributedCogdoElevatorExtAI.py +++ b/toontown/cogdominium/DistributedCogdoElevatorExtAI.py @@ -1,6 +1,12 @@ +# File: D (Python 2.4) + from direct.directnotify import DirectNotifyGlobal from toontown.building.DistributedElevatorExtAI import DistributedElevatorExtAI class DistributedCogdoElevatorExtAI(DistributedElevatorExtAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCogdoElevatorExtAI") + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedCogdoElevatorExtAI') + + def _createInterior(self): + self.bldg.createCogdoInterior() + diff --git a/toontown/cogdominium/DistributedCogdoInterior.py b/toontown/cogdominium/DistributedCogdoInterior.py index 9d06b5dc..0fabdb02 100644 --- a/toontown/cogdominium/DistributedCogdoInterior.py +++ b/toontown/cogdominium/DistributedCogdoInterior.py @@ -1,34 +1,37 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed import DistributedObject +import random +from direct.interval.IntervalGlobal import * from direct.distributed.ClockDelta import * +from toontown.building.ElevatorConstants import * +from toontown.toon import NPCToons +from pandac.PandaModules import NodePath +from toontown.building import ElevatorUtils +from toontown.toonbase import ToontownGlobals +from toontown.toonbase import ToontownBattleGlobals +from direct.directnotify import DirectNotifyGlobal from direct.fsm import ClassicFSM, State +from direct.distributed import DistributedObject from direct.fsm import State from direct.fsm.StatePush import StateVar, FunctionCall -from direct.interval.IntervalGlobal import * -from pandac.PandaModules import NodePath -import random - -from CogdoElevatorMovie import CogdoElevatorMovie -from CogdoExecutiveSuiteMovies import CogdoExecutiveSuiteIntro from toontown.battle import BattleBase -from toontown.building import ElevatorUtils -from toontown.building.ElevatorConstants import * -from toontown.chat.ChatGlobals import * -from toontown.cogdominium import CogdoBarrelRoom, CogdoBarrelRoomConsts -from toontown.cogdominium import CogdoGameConsts -from toontown.cogdominium.CogdoLayout import CogdoLayout -from toontown.distributed import DelayDelete from toontown.hood import ZoneUtil -from toontown.toon import NPCToons +from toontown.cogdominium.CogdoLayout import CogdoLayout +from toontown.cogdominium import CogdoGameConsts +from toontown.cogdominium import CogdoBarrelRoom, CogdoBarrelRoomConsts +from toontown.distributed import DelayDelete from toontown.toonbase import TTLocalizer -from toontown.toonbase import ToontownBattleGlobals -from toontown.toonbase import ToontownGlobals - - +from CogdoExecutiveSuiteMovies import CogdoExecutiveSuiteIntro +from CogdoBarrelRoomMovies import CogdoBarrelRoomIntro +from CogdoElevatorMovie import CogdoElevatorMovie +SUITE_DICT = {'s': 'tt_m_ara_crg_penthouse_sell', + 'l': 'tt_m_ara_crg_penthouse_law', + 'm': 'tt_m_ara_crg_penthouse_sell', + 'c': 'tt_m_ara_crg_penthouse_sell'} PAINTING_DICT = {'s': 'tt_m_ara_crg_paintingMoverShaker', 'l': 'tt_m_ara_crg_paintingLegalEagle', 'm': 'tt_m_ara_crg_paintingMoverShaker', 'c': 'tt_m_ara_crg_paintingMoverShaker'} + +from toontown.nametag.NametagGlobals import * class DistributedCogdoInterior(DistributedObject.DistributedObject): id = 0 @@ -73,7 +76,7 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): 120, 12, 38] - self._wantBarrelRoom = config.GetBool('cogdo-want-barrel-room', 0) + self._wantBarrelRoom = config.GetBool('cogdo-want-barrel-room', 1) self.barrelRoom = CogdoBarrelRoom.CogdoBarrelRoom() self.brResults = [[], []] self.barrelRoomIntroTrack = None @@ -83,8 +86,8 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.waitMusic = base.loadMusic('phase_7/audio/bgm/encntr_toon_winning_indoor.ogg') self.elevatorMusic = base.loadMusic('phase_7/audio/bgm/tt_elevator.ogg') self.fsm = ClassicFSM.ClassicFSM('DistributedCogdoInterior', [State.State('WaitForAllToonsInside', self.enterWaitForAllToonsInside, self.exitWaitForAllToonsInside, ['Elevator']), - State.State('Elevator', self.enterElevator, self.exitElevator, ['Game']), - State.State('Game', self.enterGame, self.exitGame, ['Resting', 'Failed', 'BattleIntro']), + State.State('Elevator', self.enterElevator, self.exitElevator, ['Game', 'BattleIntro', 'BarrelRoomIntro']), + State.State('Game', self.enterGame, self.exitGame, ['Resting', 'Failed', 'BattleIntro', 'BarrelRoomIntro', 'Elevator']), State.State('BarrelRoomIntro', self.enterBarrelRoomIntro, self.exitBarrelRoomIntro, ['CollectBarrels', 'Off']), State.State('CollectBarrels', self.enterCollectBarrels, self.exitCollectBarrels, ['BarrelRoomReward', 'Off']), State.State('BarrelRoomReward', self.enterBarrelRoomReward, self.exitBarrelRoomReward, ['Battle', @@ -121,6 +124,9 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): def setFOType(self, typeId): self.FOType = chr(typeId) + def getFOType(self): + return self.FOType + def __uniqueName(self, name): DistributedCogdoInterior.id += 1 return name + '%d' % DistributedCogdoInterior.id @@ -132,7 +138,7 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.elevatorModelIn = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_csa_elevatorB') self.leftDoorIn = self.elevatorModelIn.find('**/left_door') self.rightDoorIn = self.elevatorModelIn.find('**/right_door') - self.elevatorModelOut = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_csa_elevatorB') + self.elevatorModelOut = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_csa_elevator') self.leftDoorOut = self.elevatorModelOut.find('**/left_door') self.rightDoorOut = self.elevatorModelOut.find('**/right_door') @@ -152,12 +158,13 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): def setElevatorLights(self, elevatorModel): npc = elevatorModel.findAllMatches('**/floor_light_?;+s') - for i in xrange(npc.getNumPaths()): + for i in range(npc.getNumPaths()): np = npc.getPath(i) + np.setDepthOffset(120) floor = int(np.getName()[-1:]) - 1 if floor == self.currentFloor: np.setColor(LIGHT_ON_COLOR) - elif floor < self.layout.getNumGameFloors(): + elif floor < self.layout.getNumGameFloors() + (1 if self.FOType != "s" else 0): if self.isBossFloor(self.currentFloor): np.setColor(LIGHT_ON_COLOR) else: @@ -219,10 +226,10 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): return def isBossFloor(self, floorNum): - if self.layout.hasBossBattle(): - if self.layout.getBossBattleFloor() == floorNum: - return True - return False + if not self.layout.hasBossBattle(): + return False + + return (self.layout.getBossBattleFloor() + 0) == floorNum def __cleanup(self): self.toons = [] @@ -259,7 +266,7 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.ignore(toon.uniqueName('disable')) def __finishInterval(self, name): - if name in self.activeIntervals: + if self.activeIntervals.has_key(name): interval = self.activeIntervals[name] if interval.isPlaying(): interval.finish() @@ -308,7 +315,7 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.toons = [] for toonId in toonIds: if toonId != 0: - if toonId in self.cr.doId2do: + if self.cr.doId2do.has_key(toonId): toon = self.cr.doId2do[toonId] toon.stopSmooth() self.toons.append(toon) @@ -326,7 +333,7 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.suits = [] self.joiningReserves = [] for suitId in suitIds: - if suitId in self.cr.doId2do: + if self.cr.doId2do.has_key(suitId): suit = self.cr.doId2do[suitId] self.suits.append(suit) suit.fsm.request('Battle') @@ -334,13 +341,20 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): suit.reparentTo(render) if oldsuits.count(suit) == 0: self.joiningReserves.append(suit) + + if 'Elevator' in repr(self.fsm): + # fix the pos + pos, h = BattleBase.BattleBase.suitPoints[len(suitIds) - 1][suitIds.index(suitId)] + suit.setPos(pos) + suit.setH(h) + else: self.notify.warning('setSuits() - no suit: %d' % suitId) self.reserveSuits = [] - for index in xrange(len(reserveIds)): + for index in range(len(reserveIds)): suitId = reserveIds[index] - if suitId in self.cr.doId2do: + if self.cr.doId2do.has_key(suitId): suit = self.cr.doId2do[suitId] self.reserveSuits.append((suit, values[index])) else: @@ -405,17 +419,26 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): def __playElevator(self, ts, name, callback): SuitHs = [] SuitPositions = [] + if self.floorModel: self.floorModel.removeNode() self.floorModel = None + if self.cage: self.cage = None + if self.currentFloor == 0: SuitHs = self.BottomFloor_SuitHs SuitPositions = self.BottomFloor_SuitPositions + if self.isBossFloor(self.currentFloor): + self.notify.info('__playElevator: currentFloor %s is boss' % self.currentFloor) self.barrelRoom.unload() - self.floorModel = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_crg_penthouse') + if self.FOType: + penthouseName = SUITE_DICT.get(self.FOType) + for i in range(4): + self.floorModel = loader.loadModel('phase_5/models/cogdominium/%s' % penthouseName) + self.cage = self.floorModel.find('**/cage') pos = self.cage.getPos() self.cagePos = [] @@ -426,57 +449,79 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.cageDoor.wrtReparentTo(self.cage) if self.FOType: paintingModelName = PAINTING_DICT.get(self.FOType) - for i in xrange(4): + for i in range(4): paintingModel = loader.loadModel('phase_5/models/cogdominium/%s' % paintingModelName) loc = self.floorModel.find('**/loc_painting%d' % (i + 1)) paintingModel.reparentTo(loc) + if not self.floorModel.find('**/trophyCase').isEmpty(): + for i in range(4): + goldEmblem = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_crg_goldTrophy.bam') + loc = self.floorModel.find('**/gold_0%d' % (i + 1)) + goldEmblem.reparentTo(loc) + for i in range(20): + silverEmblem = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_crg_silverTrophy.bam') + loc = self.floorModel.find('**/silver_0%d' % (i + 1)) + silverEmblem.reparentTo(loc) + SuitHs = self.BossOffice_SuitHs SuitPositions = self.BossOffice_SuitPositions self.__makeShopOwnerNpc() + else: if self._wantBarrelRoom: self.barrelRoom.load() self.barrelRoom.hide() SuitHs = self.Cubicle_SuitHs SuitPositions = self.Cubicle_SuitPositions + if self.floorModel: self.floorModel.reparentTo(render) if self.isBossFloor(self.currentFloor): - self.notify.debug('Load boss_suit_office') + self.notify.info('Load boss_suit_office') elevIn = self.floorModel.find(CogdoGameConsts.PenthouseElevatorInPath).copyTo(render) elevOut = self.floorModel.find(CogdoGameConsts.PenthouseElevatorOutPath) frame = self.elevatorModelOut.find('**/frame') + if not frame.isEmpty(): frame.hide() + frame = self.elevatorModelIn.find('**/frame') + if not frame.isEmpty(): frame.hide() + self.elevatorModelOut.reparentTo(elevOut) + self.elevatorModelOut.setY(0) + else: elevIn = self.floorModel.find('**/elevator-in') elevOut = self.floorModel.find('**/elevator-out') - elif self._wantBarrelRoom and self.barrelRoom.isLoaded(): - elevIn = self.barrelRoom.dummyElevInNode + + elif self._wantBarrelRoom and self.barrelRoom.isLoaded() and self.currentFloor == 2 and self.FOType == 'l': #i know this is really ugly + elevIn = self.barrelRoom.model.find(CogdoBarrelRoomConsts.BarrelRoomElevatorInPath) elevOut = self.barrelRoom.model.find(CogdoBarrelRoomConsts.BarrelRoomElevatorOutPath) y = elevOut.getY(render) elevOut = elevOut.copyTo(render) elevOut.setY(render, y - 0.75) + else: floorModel = loader.loadModel('phase_7/models/modules/boss_suit_office') elevIn = floorModel.find('**/elevator-in').copyTo(render) elevOut = floorModel.find('**/elevator-out').copyTo(render) floorModel.removeNode() + self.elevIn = elevIn self.elevOut = elevOut self._haveEntranceElevator.set(True) - for index in xrange(len(self.suits)): - self.suits[index].setPos(SuitPositions[index]) - if len(self.suits) > 2: - self.suits[index].setH(SuitHs[index]) - else: - self.suits[index].setH(170) - self.suits[index].loop('neutral') + for index in range(len(self.suits)): + if not self.suits[index].isEmpty(): + self.suits[index].setPos(SuitPositions[index]) + if len(self.suits) > 2: + self.suits[index].setH(SuitHs[index]) + else: + self.suits[index].setH(170) + self.suits[index].loop('neutral') for toon in self.toons: toon.reparentTo(self.elevatorModelIn) @@ -500,7 +545,6 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): track.append(Func(callback)) track.start(ts) self.activeIntervals[name] = track - return def enterElevator(self, ts = 0): if not self._CogdoGameRepeat: @@ -512,9 +556,10 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.elevatorModelOut.detachNode() messenger.send('sellbotFieldOfficeChanged', [True]) else: - self._movie = CogdoElevatorMovie() - self._movie.load() - self._movie.play() + if self.FOType == 's': + self._movie = CogdoElevatorMovie() + self._movie.load() + self._movie.play() self.__playElevator(ts, self.elevatorName, self.__handleElevatorDone) mult = ToontownBattleGlobals.getCreditMultiplier(self.currentFloor) base.localAvatar.inventory.setBattleCreditMultiplier(mult) @@ -531,12 +576,16 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): return None def __setupBarrelRoom(self): - base.cr.playGame.getPlace().fsm.request('stopped') + self.currentFloor += 1 base.transitions.irisOut(0.0) - self.elevatorModelIn.detachNode() + self.elevatorModelOut.setY(-12) + self.elevatorModelIn.reparentTo(self.barrelRoom.model.find(CogdoBarrelRoomConsts.BarrelRoomElevatorInPath)) + self.leftDoorIn.setPos(3.5, 0, 0) + self.rightDoorIn.setPos(-3.5, 0, 0) self._showExitElevator() self.barrelRoom.show() self.barrelRoom.placeToonsAtEntrance(self.toons) + self.setElevatorLights(self.elevatorModelOut) def barrelRoomIntroDone(self): self.sendUpdate('toonBarrelRoomIntroDone', []) @@ -550,6 +599,9 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self.accept(self.barrelRoomIntroDoneEvent, self.barrelRoomIntroDone) self.activeIntervals[trackName] = self.barrelRoomIntroTrack self.barrelRoomIntroTrack.start(ts) + self._movie = CogdoBarrelRoomIntro() + self._movie.load() + self._movie.play() else: self._showExitElevator() @@ -583,16 +635,13 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): def __brRewardDone(self, task = None): self.notify.info('Toon finished watching the barrel room reward.') self.sendUpdate('toonBarrelRoomRewardDone', []) - - def setBarrelRoomReward(self, avIds, laffs): - self.brResults = [avIds, laffs] - self.barrelRoom.setRewardResults(self.brResults) + self.fsm.request('Battle') def enterBarrelRoomReward(self, ts = 0): if self._wantBarrelRoom and not self.isBossFloor(self.currentFloor): base.cr.playGame.getPlace().fsm.request('stopped') self.startAlertElevatorLightIval(self.elevatorModelOut) - track, trackName = self.barrelRoom.showRewardUi(self.brResults, callback=self.__brRewardDone) + track, trackName = self.barrelRoom.showRewardUi(callback=self.__brRewardDone) self.activeIntervals[trackName] = track track.start() self.barrelRoom.placeToonsNearBattle(self.toons) @@ -680,7 +729,7 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): self._stashEntranceElevator.set(False) def _setAvPosToExit(self): - base.localAvatar.setPos(self.elevOut, 0, -10, 0) + base.localAvatar.setPos(self.elevOut, 0, -22, 0) base.localAvatar.setHpr(self.elevOut, 0, 0, 0) base.cr.playGame.getPlace().fsm.request('walk') @@ -739,12 +788,12 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): pass else: self.notify.warning('Invalid floor number for display badges.') - for player in xrange(len(self.toons)): + for player in range(len(self.toons)): goldBadge = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_crg_goldTrophy') goldBadge.setScale(1.2) goldNode = render.find('**/gold_0' + str(player + 1)) goldBadge.reparentTo(goldNode) - for floor in xrange(numFloors): + for floor in range(numFloors): silverBadge = loader.loadModel('phase_5/models/cogdominium/tt_m_ara_crg_silverTrophy.bam') silverBadge.setScale(1.2) silverNode = render.find('**/silver_0' + str(floor * 4 + (player + 1))) @@ -755,7 +804,13 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): trackName = '__outroPenthouse-%d' % avatar.doId track = Parallel(name=trackName) base.cr.playGame.getPlace().fsm.request('stopped') - speech = TTLocalizer.CogdoExecutiveSuiteToonThankYou % self.SOSToonName + + if self.FOType == "l": + speech = TTLocalizer.CogdoExecutiveSuiteToonThankYouLawbot + + else: + speech = TTLocalizer.CogdoExecutiveSuiteToonThankYou % self.SOSToonName + track.append(Sequence(Func(camera.wrtReparentTo, localAvatar), Func(camera.setPos, 0, -9, 9), Func(camera.lookAt, Point3(5, 15, 0)), Parallel(self.cage.posInterval(0.75, self.cagePos[1], blendType='easeOut'), SoundInterval(self.cageLowerSfx, duration=0.5)), Parallel(self.cageDoor.hprInterval(0.5, VBase3(0, 90, 0), blendType='easeOut'), Sequence(SoundInterval(self.cageDoorSfx), duration=0)), Wait(0.25), Func(self.shopOwnerNpc.wrtReparentTo, render), Func(self.shopOwnerNpc.setScale, 1), Func(self.shopOwnerNpc.loop, 'walk'), Func(self.shopOwnerNpc.headsUp, Point3(0, 10, 0)), ParallelEndTogether(self.shopOwnerNpc.posInterval(1.5, Point3(0, 10, 0)), self.shopOwnerNpc.hprInterval(0.5, VBase3(180, 0, 0), blendType='easeInOut')), Func(self.shopOwnerNpc.setChatAbsolute, TTLocalizer.CagedToonYippee, CFSpeech), ActorInterval(self.shopOwnerNpc, 'jump'), Func(self.shopOwnerNpc.loop, 'neutral'), Func(self.shopOwnerNpc.headsUp, localAvatar), Func(self.shopOwnerNpc.setLocalPageChat, speech, 0), Func(camera.lookAt, self.shopOwnerNpc, Point3(0, 0, 2)))) self.activeIntervals[trackName] = track self.accept('doneChatPage', self.__outroPenthouseChatDone) @@ -764,6 +819,6 @@ class DistributedCogdoInterior(DistributedObject.DistributedObject): def __outroPenthouseChatDone(self, elapsed = None): self.shopOwnerNpc.setChatAbsolute(TTLocalizer.CogdoExecutiveSuiteToonBye, CFSpeech) self.ignore('doneChatPage') - track = Parallel(Sequence(ActorInterval(self.shopOwnerNpc, 'wave'), Func(self.shopOwnerNpc.loop, 'neutral')), Sequence(Wait(2.0), Func(self.exitCogdoBuilding), Func(base.camLens.setMinFov, ToontownGlobals.DefaultCameraFov/(4./3.)))) + track = Parallel(Sequence(ActorInterval(self.shopOwnerNpc, 'wave'), Func(self.shopOwnerNpc.loop, 'neutral')), Sequence(Wait(2.0), Func(self.exitCogdoBuilding), Func(base.camLens.setFov, ToontownGlobals.DefaultCameraFov))) track.start() self.penthouseOutroChatDoneTrack = track diff --git a/toontown/cogdominium/DistributedCogdoInteriorAI.py b/toontown/cogdominium/DistributedCogdoInteriorAI.py index e2fe2142..75648648 100644 --- a/toontown/cogdominium/DistributedCogdoInteriorAI.py +++ b/toontown/cogdominium/DistributedCogdoInteriorAI.py @@ -1,57 +1,559 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI +from direct.distributed.ClockDelta import * +from direct.fsm import FSM +from direct.task import Timer +from toontown.battle import BattleBase +from toontown.building.ElevatorConstants import * +from toontown.toonbase.ToontownGlobals import * +from toontown.toonbase.ToontownBattleGlobals import * +import DistCogdoMazeGameAI, CogdoMazeGameGlobals, DistributedCogdoElevatorIntAI +import DistCogdoFlyingGameAI, DistributedCogdoBarrelAI +from DistributedCogdoBattleBldgAI import DistributedCogdoBattleBldgAI +from SuitPlannerCogdoInteriorAI import SuitPlannerCogdoInteriorAI +from toontown.cogdominium import CogdoBarrelRoomConsts -class DistributedCogdoInteriorAI(DistributedObjectAI): +from toontown.toon import NPCToons +import random, math + +NUM_FLOORS_DICT = { + 's': 1, + 'l': 2, + 'm':1, + 'c': 1 + } + +BATTLE_INTRO_DURATION = 10 +BARREL_INTRO_DURATION = 12 +BARREL_ROOM_DURATION = 30 +BARREL_ROOM_REWARD_DURATION = 7 + +class DistributedCogdoInteriorAI(DistributedObjectAI, FSM.FSM): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCogdoInteriorAI") + + def __init__(self, air, exterior): + DistributedObjectAI.__init__(self, air) + FSM.FSM.__init__(self, 'CogdoInteriorAIFSM') + self.toons = filter(None, exterior.elevator.seats[:]) + self.responses = {} + self.bldgDoId = exterior.doId + self.numFloors = NUM_FLOORS_DICT[exterior.track] + self.sosNPC = self.__generateSOS(exterior.difficulty) + + self.shopOwnerNpcId = 0 + + self.extZoneId, self.zoneId = exterior.getExteriorAndInteriorZoneId() + npcIdList = NPCToons.zone2NpcDict.get(self.zoneId, []) + + if len(npcIdList) == 0: + self.notify.info('No NPC in taken cogdo at %s' % self.zoneId) + + else: + if len(npcIdList) > 1: + self.notify.warning('Multiple NPCs in taken cogdo at %s' % self.zoneId) + + self.shopOwnerNpcId = npcIdList[0] - def setZoneId(self, todo0): - pass + self.gameDone = 0 + self.bossBattleDone = 0 + self.curFloor = 0 + self.topFloor = 2 + self.timer = Timer.Timer() + self.exterior = exterior + self.planner = self.exterior.planner + self.savedByMap = { } + self.battle = None + + self.FOType = exterior.track - def setExtZoneId(self, todo0): - pass + self.gameFloor = 1 + self.battleFloor = 2 + self.barrelFloor = -1 + + if self.FOType == 'l': + self.battleFloor = 3 + self.barrelFloor = 2 + self.topFloor += 1 + + self.toonSkillPtsGained = { } + self.toonExp = { } + self.toonOrigQuests = { } + self.toonItems = { } + self.toonOrigMerits = { } + self.toonMerits = { } + self.toonParts = { } + self.helpfulToons = [] + self.barrels = [] + self.suits = [] + self.activeSuits = [] + self.reserveSuits = [] + self.joinedReserves = [] + self.suitsKilled = [] + self.suitsKilledPerFloor = [] + self.ignoreResponses = 0 + self.ignoreElevatorDone = 0 + self.ignoreReserveJoinDone = 0 + + def __generateSOS(self, difficulty): + g = lambda: random.choice(NPCToons.FOnpcFriends.keys()) + v = g() + + getStars = lambda x: NPCToons.getNPCTrackLevelHpRarity(x)[-1] + + maxStars = min(2, int(math.ceil(difficulty / 5.))) + minStars = max(0, maxStars - 1) + + while not (minStars <= getStars(v) <= maxStars): + v = g() + + self.notify.info('selected SOS %s (stars = %s)' % (v, getStars(v))) + return v + + def setZoneId(self, zoneId): + self.zoneId = zoneId + + def getZoneId(self): + return self.zoneId - def setDistBldgDoId(self, todo0): - pass + def setExtZoneId(self, extZoneId): + self.extZoneId = extZoneId + + def getExtZoneId(self): + return self.extZoneId + + def setDistBldgDoId(self, bldgDoId): + self.bldgDoId = bldgDoId + + def getDistBldgDoId(self): + return self.bldgDoId - def setNumFloors(self, todo0): - pass + def setNumFloors(self, numFloors): + self.numFloors = numFloors + + def getNumFloors(self): + return self.numFloors - def setShopOwnerNpcId(self, todo0): - pass - - def setSOSNpcId(self, todo0): - pass - - def setFOType(self, todo0): - pass - - def setToons(self, todo0, todo1): - pass - - def setSuits(self, todo0, todo1, todo2): - pass - - def setState(self, todo0, todo1): - pass - - def setAvatarJoined(self): - pass - - def elevatorDone(self): - pass + def setShopOwnerNpcId(self, id): + self.shopOwnerNpcId = id + + def getShopOwnerNpcId(self): + return self.shopOwnerNpcId + + def setState(self, state, timestamp): + self.request(state) + + def getState(self): + timestamp = globalClockDelta.getRealNetworkTime() + return [self.state, timestamp] + + def b_setState(self, state): + self.setState(state, 0) + self.d_setState(state) + + def d_setState(self, state): + timestamp = globalClockDelta.getRealNetworkTime() + self.sendUpdate('setState', [state, timestamp]) def reserveJoinDone(self): - pass + toonId = self.air.getAvatarIdFromSender() + if self.ignoreResponses == 1: + return None + elif self.toons.count(toonId) == 0: + self.notify.warning('reserveJoinDone() - toon not in list: %d' % toonId) + return None + self.b_setState('Battle') + + def elevatorDone(self): + toonId = self.air.getAvatarIdFromSender() + if self.ignoreResponses == 1: + return None + + elif self.toons.count(toonId) == 0: + self.notify.warning('elevatorDone() - toon not in toon list: %d' % toonId) + + def enterWaitForAllToonsInside(self): + self.resetResponses() + + if self.FOType == "s": + self.game = DistCogdoMazeGameAI.DistCogdoMazeGameAI(self.air) + self.game.setNumSuits(CogdoMazeGameGlobals.NumSuits) + + elif self.FOType == "l": + self.game = DistCogdoFlyingGameAI.DistCogdoFlyingGameAI(self.air) + + elif self.FOType == "m": + self.game = DistCogdoCraneGameAI.DistCogdoCraneGameAI(self.air) - def toonLeftBarrelRoom(self): - pass + self.sendUpdate("setSOSNpcId", [self.sosNPC]) + self.sendUpdate("setFOType", [ord(self.FOType)]) + + def resetResponses(self): + for toon in self.toons: + self.responses[toon] = 0 + + def setAvatarJoined(self): + avId = self.air.getAvatarIdFromSender() + self.responses[avId] = 1 + avatar = self.air.doId2do.get(avId) + if avatar != None: + self.savedByMap[avId] = (avatar.getName(), avatar.dna.asTuple()) + self.addToon(avId) + if self.allToonsJoined(): + self.request('Elevator') + + def addToon(self, avId): + if not avId in self.toons: + self.toons.append(avId) + + if self.air.doId2do.has_key(avId): + event = self.air.getAvatarExitEvent(avId) + self.accept(event, self.__handleUnexpectedExit, [avId]) + + def __handleUnexpectedExit(self, avId): + self.removeToon(avId) + if len(self.toons) == 0: + self.exterior.deleteSuitInterior() + if self.battle: + self.battle.requestDelete() + self.battle = None + + def removeToon(self, avId): + if avId in self.toons: self.toons.pop(avId) + + def enterElevator(self): + self.curFloor += 1 + self.d_setToons() + self.resetResponses() + + if self.curFloor == self.gameFloor: + self.enterGame() + + self.d_setState('Elevator') + self.timer.stop() + self.timer.startCallback(BattleBase.ELEVATOR_T + ElevatorData[ELEVATOR_NORMAL]['openTime'] + BattleBase.SERVER_BUFFER_TIME, self.serverElevatorDone) + + if self.curFloor == self.battleFloor: + self.planner.myPrint() + suitHandles = self.planner.genFloorSuits(0) + + self.suits = suitHandles['activeSuits'] + self.activeSuits = self.suits[:] + self.reserveSuits = suitHandles['reserveSuits'] + + self.d_setSuits() + + def exitElevator(self): + self.timer.stop() + + def serverElevatorDone(self): + if self.curFloor == self.gameFloor: + self.d_setState('Game') + + elif self.curFloor == self.battleFloor: + self.b_setState('BattleIntro') + self.timer.startCallback(BATTLE_INTRO_DURATION, self.battleIntroDone) + + else: + self.notify.warning('Unknown floor %s (track=%s)' % (self.curFloor, self.FOType)) + + def battleIntroDone(self): + if self.air: + self.createBattle() + self.b_setState('Battle') + + def barrelIntroDone(self): + if not self.air: + return + + self.b_setState('CollectBarrels') + for i in xrange(len(CogdoBarrelRoomConsts.BarrelProps)): + barrel = DistributedCogdoBarrelAI.DistributedCogdoBarrelAI(self.air, i) + barrel.generateWithRequired(self.zoneId) + self.barrels.append(barrel) + self.timer.startCallback(BARREL_ROOM_DURATION, self.barrelReward) - def toonBarrelRoomIntroDone(self): - pass + def barrelReward(self): + if not self.air: + return + + self.b_setState('BarrelRoomReward') + for i in self.barrels: + i.requestDelete() + self.timer.startCallback(BARREL_ROOM_REWARD_DURATION, self.barrelRewardDone) + + def barrelRewardDone(self): + if not self.air: + return + + barrelPlanner = SuitPlannerCogdoInteriorAI(self.exterior._cogdoLayout, max(0, self.exterior.difficulty - 5), + self.FOType, self.exterior.getExteriorAndInteriorZoneId()[1]) + barrelPlanner.myPrint() + suitHandles = barrelPlanner.genFloorSuits(0) + + self.suits = suitHandles['activeSuits'] + self.activeSuits = self.suits[:] + self.reserveSuits = suitHandles['reserveSuits'] + + self.d_setSuits() + + self.battleIntroDone() + + def handleAllAboard(self, seats): + if not hasattr(self, 'air') or not self.air: + return None + + numOfEmptySeats = seats.count(None) + if numOfEmptySeats == 4: + self.exterior.deleteSuitInterior() + return + + elif not 0 <= numOfEmptySeats <= 3: + self.notify.error('Bad number of empty seats: %s' % numOfEmptySeats) + + for toon in self.toons: + if toon not in seats: + self.removeToon(toon) + + self.toons = filter(None, seats) + self.d_setToons() - def setBarrelRoomReward(self, todo0, todo1): - pass + self.request('Elevator') + + def enterGame(self): + self.game.setToons(self.toons) + self.game.setInteriorId(self.doId) + self.game.setExteriorZone(self.exterior.zoneId) + self.game.setDifficultyOverrides(2147483647, -1) + self.game.generateWithRequired(self.zoneId) + self.game.d_startIntro() + self.accept(self.game.finishEvent, self.__handleGameDone) + self.accept(self.game.gameOverEvent, self.__handleGameOver) + + def __handleGameDone(self, toons): + self.game.requestDelete() + self.gameDone = 1 + self.toons = toons + if self.curFloor == self.barrelFloor - 1: + self.curFloor += 1 + self.d_setToons() + self.resetResponses() + self.b_setState('BarrelRoomIntro') + self.timer.startCallback(BARREL_INTRO_DURATION, self.barrelIntroDone) + else: + self.request('Elevator') + + def __handleGameOver(self): + self.game.requestDelete() + self.exterior.deleteSuitInterior() + + def createBattle(self): + isBoss = self.curFloor == self.topFloor + self.battle = DistributedCogdoBattleBldgAI(self.air, self.zoneId, self.__handleRoundDone, self.__handleBattleDone, bossBattle = isBoss) + self.battle.suitsKilled = self.suitsKilled + self.battle.suitsKilledPerFloor = self.suitsKilledPerFloor + self.battle.battleCalc.toonSkillPtsGained = self.toonSkillPtsGained + self.battle.toonExp = self.toonExp + self.battle.toonOrigQuests = self.toonOrigQuests + self.battle.toonItems = self.toonItems + self.battle.toonOrigMerits = self.toonOrigMerits + self.battle.toonMerits = self.toonMerits + self.battle.toonParts = self.toonParts + self.battle.helpfulToons = self.helpfulToons + self.battle.setInitialMembers(self.toons, self.suits) + self.battle.generateWithRequired(self.zoneId) + + mult = getCreditMultiplier(self.curFloor) + + self.battle.battleCalc.setSkillCreditMultiplier(self.battle.battleCalc.getSkillCreditMultiplier() * mult) + + def enterBattleDone(self, toonIds): + toonIds = toonIds[0] + if len(toonIds) != len(self.toons): + deadToons = [] + for toon in self.toons: + if toonIds.count(toon) == 0: + deadToons.append(toon) + continue + + for toon in deadToons: + self.removeToon(toon) + + self.d_setToons() + if len(self.toons) == 0: + self.exterior.deleteSuitInterior() + + elif self.curFloor == self.topFloor: + self.battle.resume(self.curFloor, topFloor = 1) + + else: + self.battle.resume(self.curFloor, topFloor = 0) + + def __doDeleteInterior(self, task): + self.exterior.deleteSuitInterior() + return task.done + + def exitBattleDone(self): + self.cleanupFloorBattle() + + def cleanupFloorBattle(self): + for suit in self.suits: + if suit.isDeleted(): + continue + suit.requestDelete() + + self.suits = [] + self.reserveSuits = [] + self.activeSuits = [] + if self.battle != None: + self.battle.requestDelete() + + self.battle = None + + def __handleRoundDone(self, toonIds, totalHp, deadSuits): + totalMaxHp = 0 + for suit in self.suits: + totalMaxHp += suit.maxHP + + for suit in deadSuits: + self.activeSuits.remove(suit) + + if len(self.reserveSuits) > 0 and len(self.activeSuits) < 4: + self.joinedReserves = [] + hpPercent = 100 - (totalHp / totalMaxHp) * 100.0 + for info in self.reserveSuits: + if info[1] <= hpPercent and len(self.activeSuits) < 4: + self.suits.append(info[0]) + self.activeSuits.append(info[0]) + self.joinedReserves.append(info) + continue + + for info in self.joinedReserves: + self.reserveSuits.remove(info) + + if len(self.joinedReserves) > 0: + self.d_setSuits() + self.request('ReservesJoining') + return + + if len(self.activeSuits) == 0: + self.request('BattleDone', [ + toonIds]) + else: + self.battle.resume() + + def enterReservesJoining(self): + self.resetResponses() + self.timer.startCallback(ElevatorData[ELEVATOR_NORMAL]['openTime'] + SUIT_HOLD_ELEVATOR_TIME + BattleBase.SERVER_BUFFER_TIME, self.serverReserveJoinDone) - def toonBarrelRoomRewardDone(self): - pass + def exitReservesJoining(self): + self.timer.stop() + self.resetResponses() + for info in self.joinedReserves: + self.battle.suitRequestJoin(info[0]) + + self.battle.resume() + self.joinedReserves = [] + + def serverReserveJoinDone(self): + self.ignoreReserveJoinDone = 1 + self.b_setState('Battle') + + def __handleBattleDone(self, zoneId, toonIds): + if len(toonIds) == 0: + taskMgr.doMethodLater(10, self.__doDeleteInterior, self.taskName('deleteInterior')) + elif self.curFloor == self.topFloor: + self.request('Reward') + else: + self.b_setState('Resting') + + def enterResting(self): + self.intElevator = DistributedCogdoElevatorIntAI.DistributedCogdoElevatorIntAI(self.air, self, self.toons) + self.intElevator.generateWithRequired(self.zoneId) + + def exitResting(self): + self.intElevator.requestDelete() + + def enterReward(self): + victors = self.toons[:] + savedBy = [] + for v in victors: + tuple = self.savedByMap.get(v) + if tuple: + savedBy.append([ + v, + tuple[0], + tuple[1]]) + + toon = self.air.doId2do.get(v) + if toon: + if self.FOType == 's': + if not toon.attemptAddNPCFriend(self.sosNPC, numCalls=1): + self.notify.info('%s unable to add NPCFriend %s to %s.' % (self.doId, self.sosNPC, v)) + + elif self.FOType == 'l': + reward = self.getEmblemsReward() + toon.addEmblems(reward) + + else: + self.notify.warning('%s unable to reward %s: unknown reward for track %s' % (self.doId, v, self.FOType)) + + self.exterior.fsm.request('waitForVictorsFromCogdo', [ + victors, + savedBy]) + self.d_setState('Reward') + + def removeToon(self, toonId): + if self.toons.count(toonId): + self.toons.remove(toonId) + + def d_setToons(self): + self.sendUpdate('setToons', self.getToons()) + + def getToons(self): + return [self.toons, 0] + + def d_setSuits(self): + self.sendUpdate('setSuits', self.getSuits()) + + def getSuits(self): + suitIds = [] + for suit in self.activeSuits: + suitIds.append(suit.doId) + + reserveIds = [] + values = [] + for info in self.reserveSuits: + reserveIds.append(info[0].doId) + values.append(info[1]) + + return [ + suitIds, + reserveIds, + values] + + def allToonsJoined(self): + for toon in self.toons: + if self.responses[toon] == 0: + return 0 + return 1 + def delete(self): + DistributedObjectAI.delete(self) + self.timer.stop() + + def getEmblemsReward(self): + hoodIdMap = {2: .5, # ttc + 1: 1., # dd + 5: 1.5, # dg + 4: 2., # mm + 3: 2.7, # br + 9: 3.5, # dl + 7: 4 # ff + } + + hoodValue = hoodIdMap[int(self.exterior.zoneId // 1000)] + diff = max(self.exterior.difficulty, 1) + memos = self.game.getTotalMemos() + + E = (hoodValue * max(memos, 1) * diff) / 2.5 + return divmod(E, 100)[::-1] diff --git a/toontown/cogdominium/SuitPlannerCogdoInteriorAI.py b/toontown/cogdominium/SuitPlannerCogdoInteriorAI.py index 2a492ef3..d2a604fd 100644 --- a/toontown/cogdominium/SuitPlannerCogdoInteriorAI.py +++ b/toontown/cogdominium/SuitPlannerCogdoInteriorAI.py @@ -1,10 +1,206 @@ -from toontown.building.SuitPlannerInteriorAI import SuitPlannerInteriorAI +from otp.ai.AIBaseGlobal import * +from toontown.suit import SuitDNA +from direct.directnotify import DirectNotifyGlobal +from toontown.suit import DistributedSuitAI +from toontown.building import SuitBuildingGlobals +import types, math, random +BASE_RESERVE = 10 -class SuitPlannerCogdoInteriorAI(SuitPlannerInteriorAI): - def __init__(self, cogdoLayout, bldgLevel, bldgTrack, zone): - self._cogdoLayout = cogdoLayout - SuitPlannerInteriorAI.__init__(self, self._cogdoLayout.getNumGameFloors(), bldgLevel, bldgTrack, zone) +MAX_RESERVES = { + 's': BASE_RESERVE * .9, + 'm': BASE_RESERVE * 1.1, + 'l': BASE_RESERVE * 1.25, + 'c': BASE_RESERVE * 1.5, + } - def _genSuitInfos(self, numFloors, bldgLevel, bldgTrack): - SuitPlannerInteriorAI._genSuitInfos(self, self._cogdoLayout.getNumFloors(), bldgLevel, bldgTrack) +def filterReviveChance(track, revive): + if revive >= 0: + return revive + + return random.randint(config.GetInt('min-lt-vs', 0), config.GetInt('max-lt-vs', 2)) + # implements difficulty 19 / LT + +def getMaxReserves(track): + return int(math.ceil(MAX_RESERVES[track])) + +class SuitPlannerCogdoInteriorAI: + notify = DirectNotifyGlobal.directNotify.newCategory('SuitPlannerCogdoInteriorAI') + + def __init__(self, layout, difficulty, track, zoneId, numFloors = 1): + self.zoneId = zoneId + self.numFloors = layout.getNumFloors() + difficulty = min(difficulty + 4, len(SuitBuildingGlobals.SuitBuildingInfo) - 1) + + self.respectInvasions = 1 + + if isinstance(difficulty, types.StringType): + self.notify.warning('difficulty is a string!') + difficulty = int(difficulty) + + self._genSuitInfos(numFloors, difficulty, track) + + def __genJoinChances(self, num): + joinChances = [] + for currChance in range(num): + joinChances.append(random.randint(1, 100)) + + joinChances.sort(cmp) + return joinChances + + def _genSuitInfos(self, numFloors, difficulty, bldgTrack): + self.suitInfos = [] + self.notify.debug('\n\ngenerating suitsInfos with numFloors (' + str(numFloors) + ') difficulty (' + str(difficulty) + '+1) and bldgTrack (' + str(bldgTrack) + ')') + for currFloor in range(numFloors): + infoDict = {} + lvls = self.__genLevelList(difficulty, currFloor, numFloors) + activeDicts = [] + numActive = random.randint(1, min(4, len(lvls))) + + if currFloor + 1 == numFloors and len(lvls) > 1: + origBossSpot = len(lvls) - 1 + + if numActive == 1: + newBossSpot = numActive - 1 + + else: + newBossSpot = numActive - 2 + + tmp = lvls[newBossSpot] + lvls[newBossSpot] = lvls[origBossSpot] + lvls[origBossSpot] = tmp + + bldgInfo = SuitBuildingGlobals.SuitBuildingInfo[difficulty] + + if len(bldgInfo) > SuitBuildingGlobals.SUIT_BLDG_INFO_REVIVES: + revives = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_REVIVES][0] + + else: + revives = 0 + + for currActive in range(numActive - 1, -1, -1): + level = lvls[currActive] + type = self.__genNormalSuitType(level) + activeDict = {} + activeDict['type'] = type + activeDict['track'] = bldgTrack + activeDict['level'] = level + activeDict['revives'] = filterReviveChance(bldgTrack, revives) + activeDicts.append(activeDict) + + infoDict['activeSuits'] = activeDicts + reserveDicts = [] + numReserve = min(len(lvls) - numActive, getMaxReserves(bldgTrack)) + joinChances = self.__genJoinChances(numReserve) + for currReserve in range(numReserve): + level = lvls[currReserve + numActive] + type = self.__genNormalSuitType(level) + reserveDict = {} + reserveDict['type'] = type + reserveDict['track'] = bldgTrack + reserveDict['level'] = level + reserveDict['revives'] = filterReviveChance(bldgTrack, revives) + reserveDict['joinChance'] = joinChances[currReserve] + reserveDicts.append(reserveDict) + + infoDict['reserveSuits'] = reserveDicts + self.suitInfos.append(infoDict) + + def __genNormalSuitType(self, lvl): + return SuitDNA.getRandomSuitType(lvl) + + def __genLevelList(self, difficulty, currFloor, numFloors): + bldgInfo = SuitBuildingGlobals.SuitBuildingInfo[difficulty] + + lvlPoolRange = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_LVL_POOL] + maxFloors = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_FLOORS][1] + lvlPoolMults = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_LVL_POOL_MULTS] + floorIdx = min(currFloor, maxFloors - 1) + lvlPoolMin = lvlPoolRange[0] * lvlPoolMults[floorIdx] + lvlPoolMax = lvlPoolRange[1] * lvlPoolMults[floorIdx] + lvlPool = random.randint(int(lvlPoolMin), int(lvlPoolMax)) + lvlMin = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_SUIT_LVLS][0] + lvlMax = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_SUIT_LVLS][1] + self.notify.debug('Level Pool: ' + str(lvlPool)) + lvlList = [] + while lvlPool >= lvlMin: + newLvl = random.randint(lvlMin, min(lvlPool, lvlMax)) + lvlList.append(newLvl) + lvlPool -= newLvl + + if currFloor + 1 == numFloors: + bossLvlRange = bldgInfo[SuitBuildingGlobals.SUIT_BLDG_INFO_BOSS_LVLS] + newLvl = random.randint(bossLvlRange[0], bossLvlRange[1]) + lvlList.append(newLvl) + lvlList.sort(cmp) + self.notify.debug('LevelList: ' + repr(lvlList)) + return lvlList + + def __setupSuitInfo(self, suit, bldgTrack, suitLevel, suitType): + suitName, skeleton = simbase.air.suitInvasionManager.getInvadingCog() + if suitName and self.respectInvasions: + suitType = SuitDNA.getSuitType(suitName) + bldgTrack = SuitDNA.getSuitDept(suitName) + suitLevel = min(max(suitLevel, suitType), suitType + 4) + dna = SuitDNA.SuitDNA() + dna.newSuitRandom(suitType, bldgTrack) + suit.dna = dna + self.notify.debug('Creating suit type ' + suit.dna.name + ' of level ' + str(suitLevel) + ' from type ' + str(suitType) + ' and track ' + str(bldgTrack)) + suit.setLevel(suitLevel) + return skeleton + + def __genSuitObject(self, suitZone, suitType, bldgTrack, suitLevel, revives = 0): + newSuit = DistributedSuitAI.DistributedSuitAI(simbase.air, None) + skel = self.__setupSuitInfo(newSuit, bldgTrack, suitLevel, suitType) + if skel: + newSuit.setSkelecog(1) + newSuit.setSkeleRevives(revives) + newSuit.generateWithRequired(suitZone) + newSuit.node().setName('suit-%s' % newSuit.doId) + return newSuit + + def myPrint(self): + print 'Generated suits for cogdo: ' + + for floor, currInfo in enumerate(self.suitInfos): + floor += 1 + + actives = currInfo['activeSuits'] + reserves = currInfo['reserveSuits'] + + print ' Floor %d has %d active suits.' % (floor, len(actives)) + print ' Floor %d has %d reserve suits.' % (floor, len(reserves)) + + for idx, currActive in enumerate(actives): + type, track, level, revives = map(lambda x: currActive[x], ('type', 'track', 'level', 'revives')) + + print '-- Active suit %d is %s, %s and level %d and revives is %d' % (idx, type, track, level, revives) + + for idx, currReserve in enumerate(reserves): + type, track, level, revives, res = map(lambda x: currReserve[x], ('type', 'track', 'level', 'revives', 'joinChance')) + print '- Reserve suit %d is %s, %s and level %d and JC = %d and revives is %d' % (idx, type, track, level, res, revives) + + def genFloorSuits(self, floor): + suitHandles = {} + floorInfo = self.suitInfos[floor] + activeSuits = [] + for activeSuitInfo in floorInfo['activeSuits']: + suit = self.__genSuitObject(self.zoneId, activeSuitInfo['type'], activeSuitInfo['track'], activeSuitInfo['level'], activeSuitInfo['revives']) + activeSuits.append(suit) + + suitHandles['activeSuits'] = activeSuits + reserveSuits = [] + for reserveSuitInfo in floorInfo['reserveSuits']: + suit = self.__genSuitObject(self.zoneId, reserveSuitInfo['type'], reserveSuitInfo['track'], reserveSuitInfo['level'], reserveSuitInfo['revives']) + reserveSuits.append((suit, reserveSuitInfo['joinChance'])) + + suitHandles['reserveSuits'] = reserveSuits + return suitHandles + + def genSuits(self): + suitHandles = [] + for floor in range(len(self.suitInfos)): + floorSuitHandles = self.genFloorSuits(floor) + suitHandles.append(floorSuitHandles) + + return suitHandles From a7e57a869450868fd15bcb1ef028be2da9d17773 Mon Sep 17 00:00:00 2001 From: Wilee999 Date: Fri, 6 Mar 2015 18:49:31 -0800 Subject: [PATCH 16/20] TTCodeRedemptionMgrAI: added temp expiration date, renamed back to weed --- toontown/coderedemption/TTCodeRedemptionMgrAI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index c4d7c064..f9388800 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -31,11 +31,11 @@ Expiration date, month and day are optional fields. class TTCodeRedemptionMgrAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrAI") codes = { - 'test': { + 'weed': { 'items': [ CatalogClothingItem.CatalogClothingItem(1821, 0) ] - 'expirationDate': datetime(2015, 3, 30) + 'expirationDate': datetime(2016, 3, 30) # temporary expiration until release } } From 9ed74026312455264e16c4b9b15a3bed77613aae Mon Sep 17 00:00:00 2001 From: Wilee999 Date: Tue, 1 Jan 1980 18:56:35 -0800 Subject: [PATCH 17/20] picnic: use ttr's checker boards --- toontown/safezone/CheckersBoard.py | 672 ++++----- toontown/safezone/ChineseCheckersBoard.py | 1614 ++++++++++----------- 2 files changed, 1143 insertions(+), 1143 deletions(-) diff --git a/toontown/safezone/CheckersBoard.py b/toontown/safezone/CheckersBoard.py index 7d46aeee..c59fbab5 100644 --- a/toontown/safezone/CheckersBoard.py +++ b/toontown/safezone/CheckersBoard.py @@ -1,336 +1,336 @@ - - -class CheckersBoard: - - def __init__(self): - self.squareList = [] - for x in xrange(32): - self.squareList.append(CheckersTile(x)) - - self.squareList[0].setAdjacent([None, - None, - 4, - None]) - self.squareList[1].setAdjacent([None, - 4, - 5, - None]) - self.squareList[2].setAdjacent([None, - 5, - 6, - None]) - self.squareList[3].setAdjacent([None, - 6, - 7, - None]) - self.squareList[4].setAdjacent([0, - 8, - 9, - 1]) - self.squareList[5].setAdjacent([1, - 9, - 10, - 2]) - self.squareList[6].setAdjacent([2, - 10, - 11, - 3]) - self.squareList[7].setAdjacent([3, - 11, - None, - None]) - self.squareList[8].setAdjacent([None, - None, - 12, - 4]) - self.squareList[9].setAdjacent([4, - 12, - 13, - 5]) - self.squareList[10].setAdjacent([5, - 13, - 14, - 6]) - self.squareList[11].setAdjacent([6, - 14, - 15, - 7]) - self.squareList[12].setAdjacent([8, - 16, - 17, - 9]) - self.squareList[13].setAdjacent([9, - 17, - 18, - 10]) - self.squareList[14].setAdjacent([10, - 18, - 19, - 11]) - self.squareList[15].setAdjacent([11, - 19, - None, - None]) - self.squareList[16].setAdjacent([None, - None, - 20, - 12]) - self.squareList[17].setAdjacent([12, - 20, - 21, - 13]) - self.squareList[18].setAdjacent([13, - 21, - 22, - 14]) - self.squareList[19].setAdjacent([14, - 22, - 23, - 15]) - self.squareList[20].setAdjacent([16, - 24, - 25, - 17]) - self.squareList[21].setAdjacent([17, - 25, - 26, - 18]) - self.squareList[22].setAdjacent([18, - 26, - 27, - 19]) - self.squareList[23].setAdjacent([19, - 27, - None, - None]) - self.squareList[24].setAdjacent([None, - None, - 28, - 20]) - self.squareList[25].setAdjacent([20, - 28, - 29, - 21]) - self.squareList[26].setAdjacent([21, - 29, - 30, - 22]) - self.squareList[27].setAdjacent([22, - 30, - 31, - 23]) - self.squareList[28].setAdjacent([24, - None, - None, - 25]) - self.squareList[29].setAdjacent([25, - None, - None, - 26]) - self.squareList[30].setAdjacent([26, - None, - None, - 27]) - self.squareList[31].setAdjacent([27, - None, - None, - None]) - self.squareList[0].setJumps([None, - None, - 9, - None]) - self.squareList[1].setJumps([None, - 8, - 10, - None]) - self.squareList[2].setJumps([None, - 9, - 11, - None]) - self.squareList[3].setJumps([None, - 10, - None, - None]) - self.squareList[4].setJumps([None, - None, - 13, - None]) - self.squareList[5].setJumps([None, - 12, - 14, - None]) - self.squareList[6].setJumps([None, - 13, - 15, - None]) - self.squareList[7].setJumps([None, - 14, - None, - None]) - self.squareList[8].setJumps([None, - None, - 17, - 1]) - self.squareList[9].setJumps([0, - 16, - 18, - 2]) - self.squareList[10].setJumps([1, - 17, - 19, - 3]) - self.squareList[11].setJumps([2, - 18, - None, - None]) - self.squareList[12].setJumps([None, - None, - 21, - 5]) - self.squareList[13].setJumps([4, - 20, - 22, - 6]) - self.squareList[14].setJumps([5, - 21, - 23, - 7]) - self.squareList[15].setJumps([6, - 22, - None, - None]) - self.squareList[16].setJumps([None, - None, - 25, - 9]) - self.squareList[17].setJumps([8, - 24, - 26, - 10]) - self.squareList[18].setJumps([9, - 25, - 27, - 11]) - self.squareList[19].setJumps([10, - 26, - None, - None]) - self.squareList[20].setJumps([None, - None, - 29, - 13]) - self.squareList[21].setJumps([12, - 28, - 30, - 14]) - self.squareList[22].setJumps([13, - 29, - 31, - 15]) - self.squareList[23].setJumps([14, - 30, - None, - None]) - self.squareList[24].setJumps([None, - None, - None, - 17]) - self.squareList[25].setJumps([16, - None, - None, - 18]) - self.squareList[26].setJumps([17, - None, - None, - 19]) - self.squareList[27].setJumps([18, - None, - None, - None]) - self.squareList[28].setJumps([None, - None, - None, - 21]) - self.squareList[29].setJumps([20, - None, - None, - 22]) - self.squareList[30].setJumps([21, - None, - None, - 23]) - self.squareList[31].setJumps([22, - None, - None, - None]) - return - - def delete(self): - for x in self.squareList: - x.delete() - - del self.squareList - - def getSquare(self, arrayLoc): - return self.squareList[arrayLoc] - - def getState(self, squareNum): - return self.squareList[squareNum].getState() - - def setState(self, squareNum, newState): - self.squareList[squareNum].setState(newState) - - def getAdjacent(self, squareNum): - return self.squareList[squareNum].adjacent - - def getStates(self): - retList = [] - for x in xrange(32): - retList.append(self.squareList[x].getState()) - - return retList - - def setStates(self, squares): - y = 0 - for x in xrange(32): - self.squareList[x].setState(squares[x]) - - def getJumps(self, squareNum): - return self.squareList[squareNum].jumps - - -class CheckersTile: - - def __init__(self, tileNum): - self.tileNum = tileNum - self.state = 0 - self.adjacent = [] - self.jumps = [] - - def delete(self): - del self.tileNum - del self.state - del self.adjacent - - def setJumps(self, jumpList): - for x in jumpList: - self.jumps.append(x) - - def getJumps(self): - return self.jumps - - def setAdjacent(self, adjList): - for x in adjList: - self.adjacent.append(x) - - def getAdjacent(self): - return self.adjacent - - def setState(self, newState): - self.state = newState - - def getState(self): - return self.state - - def getNum(self): - return self.tileNum + + +class CheckersBoard: + + def __init__(self): + self.squareList = [] + for x in range(32): + self.squareList.append(CheckersTile(x)) + + self.squareList[0].setAdjacent([None, + None, + 4, + None]) + self.squareList[1].setAdjacent([None, + 4, + 5, + None]) + self.squareList[2].setAdjacent([None, + 5, + 6, + None]) + self.squareList[3].setAdjacent([None, + 6, + 7, + None]) + self.squareList[4].setAdjacent([0, + 8, + 9, + 1]) + self.squareList[5].setAdjacent([1, + 9, + 10, + 2]) + self.squareList[6].setAdjacent([2, + 10, + 11, + 3]) + self.squareList[7].setAdjacent([3, + 11, + None, + None]) + self.squareList[8].setAdjacent([None, + None, + 12, + 4]) + self.squareList[9].setAdjacent([4, + 12, + 13, + 5]) + self.squareList[10].setAdjacent([5, + 13, + 14, + 6]) + self.squareList[11].setAdjacent([6, + 14, + 15, + 7]) + self.squareList[12].setAdjacent([8, + 16, + 17, + 9]) + self.squareList[13].setAdjacent([9, + 17, + 18, + 10]) + self.squareList[14].setAdjacent([10, + 18, + 19, + 11]) + self.squareList[15].setAdjacent([11, + 19, + None, + None]) + self.squareList[16].setAdjacent([None, + None, + 20, + 12]) + self.squareList[17].setAdjacent([12, + 20, + 21, + 13]) + self.squareList[18].setAdjacent([13, + 21, + 22, + 14]) + self.squareList[19].setAdjacent([14, + 22, + 23, + 15]) + self.squareList[20].setAdjacent([16, + 24, + 25, + 17]) + self.squareList[21].setAdjacent([17, + 25, + 26, + 18]) + self.squareList[22].setAdjacent([18, + 26, + 27, + 19]) + self.squareList[23].setAdjacent([19, + 27, + None, + None]) + self.squareList[24].setAdjacent([None, + None, + 28, + 20]) + self.squareList[25].setAdjacent([20, + 28, + 29, + 21]) + self.squareList[26].setAdjacent([21, + 29, + 30, + 22]) + self.squareList[27].setAdjacent([22, + 30, + 31, + 23]) + self.squareList[28].setAdjacent([24, + None, + None, + 25]) + self.squareList[29].setAdjacent([25, + None, + None, + 26]) + self.squareList[30].setAdjacent([26, + None, + None, + 27]) + self.squareList[31].setAdjacent([27, + None, + None, + None]) + self.squareList[0].setJumps([None, + None, + 9, + None]) + self.squareList[1].setJumps([None, + 8, + 10, + None]) + self.squareList[2].setJumps([None, + 9, + 11, + None]) + self.squareList[3].setJumps([None, + 10, + None, + None]) + self.squareList[4].setJumps([None, + None, + 13, + None]) + self.squareList[5].setJumps([None, + 12, + 14, + None]) + self.squareList[6].setJumps([None, + 13, + 15, + None]) + self.squareList[7].setJumps([None, + 14, + None, + None]) + self.squareList[8].setJumps([None, + None, + 17, + 1]) + self.squareList[9].setJumps([0, + 16, + 18, + 2]) + self.squareList[10].setJumps([1, + 17, + 19, + 3]) + self.squareList[11].setJumps([2, + 18, + None, + None]) + self.squareList[12].setJumps([None, + None, + 21, + 5]) + self.squareList[13].setJumps([4, + 20, + 22, + 6]) + self.squareList[14].setJumps([5, + 21, + 23, + 7]) + self.squareList[15].setJumps([6, + 22, + None, + None]) + self.squareList[16].setJumps([None, + None, + 25, + 9]) + self.squareList[17].setJumps([8, + 24, + 26, + 10]) + self.squareList[18].setJumps([9, + 25, + 27, + 11]) + self.squareList[19].setJumps([10, + 26, + None, + None]) + self.squareList[20].setJumps([None, + None, + 29, + 13]) + self.squareList[21].setJumps([12, + 28, + 30, + 14]) + self.squareList[22].setJumps([13, + 29, + 31, + 15]) + self.squareList[23].setJumps([14, + 30, + None, + None]) + self.squareList[24].setJumps([None, + None, + None, + 17]) + self.squareList[25].setJumps([16, + None, + None, + 18]) + self.squareList[26].setJumps([17, + None, + None, + 19]) + self.squareList[27].setJumps([18, + None, + None, + None]) + self.squareList[28].setJumps([None, + None, + None, + 21]) + self.squareList[29].setJumps([20, + None, + None, + 22]) + self.squareList[30].setJumps([21, + None, + None, + 23]) + self.squareList[31].setJumps([22, + None, + None, + None]) + return + + def delete(self): + for x in self.squareList: + x.delete() + + del self.squareList + + def getSquare(self, arrayLoc): + return self.squareList[arrayLoc] + + def getState(self, squareNum): + return self.squareList[squareNum].getState() + + def setState(self, squareNum, newState): + self.squareList[squareNum].setState(newState) + + def getAdjacent(self, squareNum): + return self.squareList[squareNum].adjacent + + def getStates(self): + retList = [] + for x in range(32): + retList.append(self.squareList[x].getState()) + + return retList + + def setStates(self, squares): + y = 0 + for x in range(32): + self.squareList[x].setState(squares[x]) + + def getJumps(self, squareNum): + return self.squareList[squareNum].jumps + + +class CheckersTile: + + def __init__(self, tileNum): + self.tileNum = tileNum + self.state = 0 + self.adjacent = [] + self.jumps = [] + + def delete(self): + del self.tileNum + del self.state + del self.adjacent + + def setJumps(self, jumpList): + for x in jumpList: + self.jumps.append(x) + + def getJumps(self): + return self.jumps + + def setAdjacent(self, adjList): + for x in adjList: + self.adjacent.append(x) + + def getAdjacent(self): + return self.adjacent + + def setState(self, newState): + self.state = newState + + def getState(self): + return self.state + + def getNum(self): + return self.tileNum diff --git a/toontown/safezone/ChineseCheckersBoard.py b/toontown/safezone/ChineseCheckersBoard.py index afc14087..f8f3b348 100644 --- a/toontown/safezone/ChineseCheckersBoard.py +++ b/toontown/safezone/ChineseCheckersBoard.py @@ -1,807 +1,807 @@ - - -class ChineseCheckersBoard: - - def __init__(self): - self.squareList = [] - for x in xrange(121): - self.squareList.append(CheckersSquare(x)) - - self.squareList[0].setAdjacent([None, - 1, - 2, - None, - None, - None]) - self.squareList[1].setAdjacent([None, - 3, - 4, - 2, - 0, - None]) - self.squareList[2].setAdjacent([1, - 4, - 5, - None, - None, - 0]) - self.squareList[3].setAdjacent([None, - 6, - 7, - 4, - 1, - None]) - self.squareList[4].setAdjacent([3, - 7, - 8, - 5, - 2, - 1]) - self.squareList[5].setAdjacent([4, - 8, - 9, - None, - None, - 2]) - self.squareList[6].setAdjacent([None, - 14, - 15, - 7, - 3, - None]) - self.squareList[7].setAdjacent([6, - 15, - 16, - 8, - 4, - 3]) - self.squareList[8].setAdjacent([7, - 16, - 17, - 9, - 5, - 4]) - self.squareList[9].setAdjacent([8, - 17, - 18, - None, - None, - 5]) - self.squareList[10].setAdjacent([None, - None, - 23, - 11, - None, - None]) - self.squareList[11].setAdjacent([10, - 23, - 24, - 12, - None, - None]) - self.squareList[12].setAdjacent([11, - 24, - 25, - 13, - None, - None]) - self.squareList[13].setAdjacent([12, - 25, - 26, - 14, - None, - None]) - self.squareList[14].setAdjacent([13, - 26, - 27, - 15, - 6, - None]) - self.squareList[15].setAdjacent([14, - 27, - 28, - 16, - 7, - 6]) - self.squareList[16].setAdjacent([15, - 28, - 29, - 17, - 8, - 7]) - self.squareList[17].setAdjacent([16, - 29, - 30, - 18, - 9, - 8]) - self.squareList[18].setAdjacent([17, - 30, - 31, - 19, - None, - 9]) - (self.squareList[19].setAdjacent([18, - 31, - 32, - 20, - None, - None]),) - self.squareList[20].setAdjacent([19, - 32, - 33, - 21, - None, - None]) - self.squareList[21].setAdjacent([20, - 33, - 34, - 22, - None, - None]) - self.squareList[22].setAdjacent([21, - 34, - None, - None, - None, - None]) - self.squareList[23].setAdjacent([None, - None, - 35, - 24, - 11, - 10]) - self.squareList[24].setAdjacent([23, - 35, - 36, - 25, - 12, - 11]) - self.squareList[25].setAdjacent([24, - 36, - 37, - 26, - 13, - 12]) - self.squareList[26].setAdjacent([25, - 37, - 38, - 27, - 14, - 13]) - self.squareList[27].setAdjacent([26, - 38, - 39, - 28, - 15, - 14]) - self.squareList[28].setAdjacent([27, - 39, - 40, - 29, - 16, - 15]) - self.squareList[29].setAdjacent([28, - 40, - 41, - 30, - 17, - 16]) - self.squareList[30].setAdjacent([29, - 41, - 42, - 31, - 18, - 17]) - self.squareList[31].setAdjacent([30, - 42, - 43, - 32, - 19, - 18]) - self.squareList[32].setAdjacent([31, - 43, - 44, - 33, - 20, - 19]) - self.squareList[33].setAdjacent([32, - 44, - 45, - 34, - 21, - 20]) - self.squareList[34].setAdjacent([33, - 45, - None, - None, - 22, - 21]) - self.squareList[35].setAdjacent([None, - None, - 46, - 36, - 24, - 23]) - self.squareList[36].setAdjacent([35, - 46, - 47, - 37, - 25, - 24]) - self.squareList[37].setAdjacent([36, - 47, - 48, - 38, - 26, - 25]) - self.squareList[38].setAdjacent([37, - 48, - 49, - 39, - 27, - 26]) - self.squareList[39].setAdjacent([38, - 49, - 50, - 40, - 28, - 27]) - self.squareList[40].setAdjacent([39, - 50, - 51, - 41, - 29, - 28]) - self.squareList[41].setAdjacent([40, - 51, - 52, - 42, - 30, - 29]) - self.squareList[42].setAdjacent([41, - 52, - 53, - 43, - 31, - 30]) - self.squareList[43].setAdjacent([42, - 53, - 54, - 44, - 32, - 31]) - self.squareList[44].setAdjacent([43, - 54, - 55, - 45, - 33, - 32]) - self.squareList[45].setAdjacent([44, - 55, - None, - None, - 34, - 33]) - self.squareList[46].setAdjacent([None, - None, - 56, - 47, - 36, - 35]) - self.squareList[47].setAdjacent([46, - 56, - 57, - 48, - 37, - 36]) - self.squareList[48].setAdjacent([47, - 57, - 58, - 49, - 38, - 37]) - self.squareList[49].setAdjacent([48, - 58, - 59, - 50, - 39, - 38]) - self.squareList[50].setAdjacent([49, - 59, - 60, - 51, - 40, - 39]) - self.squareList[51].setAdjacent([50, - 60, - 61, - 52, - 41, - 40]) - self.squareList[52].setAdjacent([51, - 61, - 62, - 53, - 42, - 41]) - self.squareList[53].setAdjacent([52, - 62, - 63, - 54, - 43, - 42]) - self.squareList[54].setAdjacent([53, - 63, - 64, - 55, - 44, - 43]) - self.squareList[55].setAdjacent([54, - 64, - None, - None, - 45, - 44]) - self.squareList[56].setAdjacent([None, - 65, - 66, - 57, - 47, - 46]) - self.squareList[57].setAdjacent([56, - 66, - 67, - 58, - 48, - 47]) - self.squareList[58].setAdjacent([57, - 67, - 68, - 59, - 49, - 48]) - self.squareList[59].setAdjacent([58, - 68, - 69, - 60, - 50, - 49]) - self.squareList[60].setAdjacent([59, - 69, - 70, - 61, - 51, - 50]) - self.squareList[61].setAdjacent([60, - 70, - 71, - 62, - 52, - 51]) - self.squareList[62].setAdjacent([61, - 71, - 72, - 63, - 53, - 52]) - self.squareList[63].setAdjacent([62, - 72, - 73, - 64, - 54, - 53]) - self.squareList[64].setAdjacent([63, - 73, - 74, - None, - 55, - 54]) - self.squareList[65].setAdjacent([None, - 75, - 76, - 66, - 56, - None]) - self.squareList[66].setAdjacent([65, - 76, - 77, - 67, - 57, - 56]) - self.squareList[67].setAdjacent([66, - 77, - 78, - 68, - 58, - 57]) - self.squareList[68].setAdjacent([67, - 78, - 79, - 69, - 59, - 58]) - self.squareList[69].setAdjacent([68, - 79, - 80, - 70, - 60, - 61]) - self.squareList[70].setAdjacent([69, - 80, - 81, - 71, - 61, - 60]) - self.squareList[71].setAdjacent([70, - 81, - 82, - 72, - 62, - 61]) - self.squareList[72].setAdjacent([71, - 82, - 83, - 73, - 63, - 62]) - self.squareList[73].setAdjacent([72, - 83, - 84, - 74, - 64, - 63]) - self.squareList[74].setAdjacent([73, - 84, - 85, - None, - None, - 64]) - self.squareList[75].setAdjacent([None, - 86, - 87, - 76, - 65, - None]) - self.squareList[76].setAdjacent([75, - 87, - 88, - 77, - 66, - 65]) - self.squareList[77].setAdjacent([76, - 88, - 89, - 78, - 67, - 66]) - self.squareList[78].setAdjacent([77, - 89, - 90, - 79, - 68, - 67]) - self.squareList[79].setAdjacent([78, - 90, - 91, - 80, - 69, - 68]) - self.squareList[80].setAdjacent([79, - 91, - 92, - 81, - 70, - 69]) - self.squareList[81].setAdjacent([80, - 92, - 93, - 82, - 71, - 70]) - self.squareList[82].setAdjacent([81, - 93, - 94, - 83, - 72, - 71]) - self.squareList[83].setAdjacent([82, - 94, - 95, - 84, - 73, - 72]) - self.squareList[84].setAdjacent([83, - 95, - 96, - 85, - 74, - 73]) - self.squareList[85].setAdjacent([84, - 96, - 97, - None, - None, - 74]) - self.squareList[86].setAdjacent([None, - 98, - 99, - 87, - 75, - None]) - self.squareList[87].setAdjacent([86, - 99, - 100, - 88, - 76, - 75]) - self.squareList[88].setAdjacent([87, - 100, - 101, - 89, - 77, - 76]) - self.squareList[89].setAdjacent([88, - 101, - 102, - 90, - 78, - 77]) - self.squareList[90].setAdjacent([89, - 102, - 103, - 91, - 79, - 78]) - self.squareList[91].setAdjacent([90, - 103, - 104, - 92, - 80, - 79]) - self.squareList[92].setAdjacent([91, - 104, - 105, - 93, - 81, - 80]) - self.squareList[93].setAdjacent([92, - 105, - 106, - 94, - 82, - 81]) - self.squareList[94].setAdjacent([93, - 106, - 107, - 95, - 83, - 82]) - self.squareList[95].setAdjacent([94, - 107, - 108, - 96, - 84, - 83]) - self.squareList[96].setAdjacent([95, - 108, - 109, - 97, - 85, - 84]) - self.squareList[97].setAdjacent([96, - 109, - 110, - None, - None, - 85]) - self.squareList[98].setAdjacent([None, - None, - None, - 99, - 86, - None]) - self.squareList[99].setAdjacent([98, - None, - None, - 100, - 87, - 86]) - self.squareList[100].setAdjacent([99, - None, - None, - 101, - 88, - 87]) - self.squareList[101].setAdjacent([100, - None, - None, - 102, - 89, - 88]) - self.squareList[102].setAdjacent([101, - None, - 111, - 103, - 90, - 89]) - self.squareList[103].setAdjacent([102, - 111, - 112, - 104, - 91, - 90]) - self.squareList[104].setAdjacent([103, - 112, - 113, - 105, - 92, - 91]) - self.squareList[105].setAdjacent([104, - 113, - 114, - 106, - 93, - 92]) - self.squareList[106].setAdjacent([105, - 114, - None, - 107, - 94, - 93]) - self.squareList[107].setAdjacent([106, - None, - None, - 108, - 95, - 94]) - self.squareList[108].setAdjacent([107, - None, - None, - 109, - 96, - 95]) - self.squareList[109].setAdjacent([108, - None, - None, - 110, - 97, - 96]) - self.squareList[110].setAdjacent([109, - None, - None, - None, - None, - 97]) - self.squareList[111].setAdjacent([None, - None, - 115, - 112, - 103, - 102]) - self.squareList[112].setAdjacent([111, - 115, - 116, - 113, - 104, - 103]) - self.squareList[113].setAdjacent([112, - 116, - 117, - 114, - 105, - 104]) - self.squareList[114].setAdjacent([113, - 117, - None, - None, - 106, - 105]) - self.squareList[115].setAdjacent([None, - None, - 118, - 116, - 112, - 111]) - self.squareList[116].setAdjacent([115, - 118, - 119, - 117, - 113, - 112]) - self.squareList[117].setAdjacent([116, - 119, - None, - None, - 114, - 113]) - self.squareList[118].setAdjacent([None, - None, - 120, - 119, - 116, - 115]) - self.squareList[119].setAdjacent([118, - 120, - None, - None, - 117, - 116]) - self.squareList[120].setAdjacent([None, - None, - None, - None, - 119, - 118]) - return - - def delete(self): - for x in self.squareList: - x.delete() - - del self.squareList - - def getSquare(self, arrayLoc): - return self.squareList[arrayLoc] - - def getSquareOffset(self, arrayLoc): - return self.squareList[arrayLoc - 1] - - def getState(self, squareNum): - return self.squareList[squareNum].getState() - - def getStateOffset(self, arrayLoc): - return self.squareList[squareNum - 1].getState() - - def setState(self, squareNum, newState): - self.squareList[squareNum].setState(newState) - - def setStateOffset(self, squareNum, newState): - self.squareList[squareNum - 1].setState(newState) - - def getAdjacent(self, squareNum): - return self.squareList[squareNum].adjacent - - def getAdjacentOffset(self, squareNum): - return self.squareList[squareNum - 1].adjacent - - def getStates(self): - retList = [] - for x in xrange(121): - retList.append(self.squareList[x].getState()) - - return retList - - def setStates(self, squares): - y = 0 - for x in xrange(121): - self.squareList[x].setState(squares[x]) - - -class CheckersSquare: - - def __init__(self, tileNu): - self.tileNum = tileNu - self.state = 0 - self.adjacent = [] - - def delete(self): - del self.tileNum - del self.state - del self.adjacent - - def setAdjacent(self, adjList): - for x in adjList: - self.adjacent.append(x) - - def getAdjacent(self): - return self.adjacent - - def setState(self, newState): - self.state = newState - - def getState(self): - return self.state - - def getNum(self): - return self.tileNum + + +class ChineseCheckersBoard: + + def __init__(self): + self.squareList = [] + for x in range(121): + self.squareList.append(CheckersSquare(x)) + + self.squareList[0].setAdjacent([None, + 1, + 2, + None, + None, + None]) + self.squareList[1].setAdjacent([None, + 3, + 4, + 2, + 0, + None]) + self.squareList[2].setAdjacent([1, + 4, + 5, + None, + None, + 0]) + self.squareList[3].setAdjacent([None, + 6, + 7, + 4, + 1, + None]) + self.squareList[4].setAdjacent([3, + 7, + 8, + 5, + 2, + 1]) + self.squareList[5].setAdjacent([4, + 8, + 9, + None, + None, + 2]) + self.squareList[6].setAdjacent([None, + 14, + 15, + 7, + 3, + None]) + self.squareList[7].setAdjacent([6, + 15, + 16, + 8, + 4, + 3]) + self.squareList[8].setAdjacent([7, + 16, + 17, + 9, + 5, + 4]) + self.squareList[9].setAdjacent([8, + 17, + 18, + None, + None, + 5]) + self.squareList[10].setAdjacent([None, + None, + 23, + 11, + None, + None]) + self.squareList[11].setAdjacent([10, + 23, + 24, + 12, + None, + None]) + self.squareList[12].setAdjacent([11, + 24, + 25, + 13, + None, + None]) + self.squareList[13].setAdjacent([12, + 25, + 26, + 14, + None, + None]) + self.squareList[14].setAdjacent([13, + 26, + 27, + 15, + 6, + None]) + self.squareList[15].setAdjacent([14, + 27, + 28, + 16, + 7, + 6]) + self.squareList[16].setAdjacent([15, + 28, + 29, + 17, + 8, + 7]) + self.squareList[17].setAdjacent([16, + 29, + 30, + 18, + 9, + 8]) + self.squareList[18].setAdjacent([17, + 30, + 31, + 19, + None, + 9]) + (self.squareList[19].setAdjacent([18, + 31, + 32, + 20, + None, + None]),) + self.squareList[20].setAdjacent([19, + 32, + 33, + 21, + None, + None]) + self.squareList[21].setAdjacent([20, + 33, + 34, + 22, + None, + None]) + self.squareList[22].setAdjacent([21, + 34, + None, + None, + None, + None]) + self.squareList[23].setAdjacent([None, + None, + 35, + 24, + 11, + 10]) + self.squareList[24].setAdjacent([23, + 35, + 36, + 25, + 12, + 11]) + self.squareList[25].setAdjacent([24, + 36, + 37, + 26, + 13, + 12]) + self.squareList[26].setAdjacent([25, + 37, + 38, + 27, + 14, + 13]) + self.squareList[27].setAdjacent([26, + 38, + 39, + 28, + 15, + 14]) + self.squareList[28].setAdjacent([27, + 39, + 40, + 29, + 16, + 15]) + self.squareList[29].setAdjacent([28, + 40, + 41, + 30, + 17, + 16]) + self.squareList[30].setAdjacent([29, + 41, + 42, + 31, + 18, + 17]) + self.squareList[31].setAdjacent([30, + 42, + 43, + 32, + 19, + 18]) + self.squareList[32].setAdjacent([31, + 43, + 44, + 33, + 20, + 19]) + self.squareList[33].setAdjacent([32, + 44, + 45, + 34, + 21, + 20]) + self.squareList[34].setAdjacent([33, + 45, + None, + None, + 22, + 21]) + self.squareList[35].setAdjacent([None, + None, + 46, + 36, + 24, + 23]) + self.squareList[36].setAdjacent([35, + 46, + 47, + 37, + 25, + 24]) + self.squareList[37].setAdjacent([36, + 47, + 48, + 38, + 26, + 25]) + self.squareList[38].setAdjacent([37, + 48, + 49, + 39, + 27, + 26]) + self.squareList[39].setAdjacent([38, + 49, + 50, + 40, + 28, + 27]) + self.squareList[40].setAdjacent([39, + 50, + 51, + 41, + 29, + 28]) + self.squareList[41].setAdjacent([40, + 51, + 52, + 42, + 30, + 29]) + self.squareList[42].setAdjacent([41, + 52, + 53, + 43, + 31, + 30]) + self.squareList[43].setAdjacent([42, + 53, + 54, + 44, + 32, + 31]) + self.squareList[44].setAdjacent([43, + 54, + 55, + 45, + 33, + 32]) + self.squareList[45].setAdjacent([44, + 55, + None, + None, + 34, + 33]) + self.squareList[46].setAdjacent([None, + None, + 56, + 47, + 36, + 35]) + self.squareList[47].setAdjacent([46, + 56, + 57, + 48, + 37, + 36]) + self.squareList[48].setAdjacent([47, + 57, + 58, + 49, + 38, + 37]) + self.squareList[49].setAdjacent([48, + 58, + 59, + 50, + 39, + 38]) + self.squareList[50].setAdjacent([49, + 59, + 60, + 51, + 40, + 39]) + self.squareList[51].setAdjacent([50, + 60, + 61, + 52, + 41, + 40]) + self.squareList[52].setAdjacent([51, + 61, + 62, + 53, + 42, + 41]) + self.squareList[53].setAdjacent([52, + 62, + 63, + 54, + 43, + 42]) + self.squareList[54].setAdjacent([53, + 63, + 64, + 55, + 44, + 43]) + self.squareList[55].setAdjacent([54, + 64, + None, + None, + 45, + 44]) + self.squareList[56].setAdjacent([None, + 65, + 66, + 57, + 47, + 46]) + self.squareList[57].setAdjacent([56, + 66, + 67, + 58, + 48, + 47]) + self.squareList[58].setAdjacent([57, + 67, + 68, + 59, + 49, + 48]) + self.squareList[59].setAdjacent([58, + 68, + 69, + 60, + 50, + 49]) + self.squareList[60].setAdjacent([59, + 69, + 70, + 61, + 51, + 50]) + self.squareList[61].setAdjacent([60, + 70, + 71, + 62, + 52, + 51]) + self.squareList[62].setAdjacent([61, + 71, + 72, + 63, + 53, + 52]) + self.squareList[63].setAdjacent([62, + 72, + 73, + 64, + 54, + 53]) + self.squareList[64].setAdjacent([63, + 73, + 74, + None, + 55, + 54]) + self.squareList[65].setAdjacent([None, + 75, + 76, + 66, + 56, + None]) + self.squareList[66].setAdjacent([65, + 76, + 77, + 67, + 57, + 56]) + self.squareList[67].setAdjacent([66, + 77, + 78, + 68, + 58, + 57]) + self.squareList[68].setAdjacent([67, + 78, + 79, + 69, + 59, + 58]) + self.squareList[69].setAdjacent([68, + 79, + 80, + 70, + 60, + 61]) + self.squareList[70].setAdjacent([69, + 80, + 81, + 71, + 61, + 60]) + self.squareList[71].setAdjacent([70, + 81, + 82, + 72, + 62, + 61]) + self.squareList[72].setAdjacent([71, + 82, + 83, + 73, + 63, + 62]) + self.squareList[73].setAdjacent([72, + 83, + 84, + 74, + 64, + 63]) + self.squareList[74].setAdjacent([73, + 84, + 85, + None, + None, + 64]) + self.squareList[75].setAdjacent([None, + 86, + 87, + 76, + 65, + None]) + self.squareList[76].setAdjacent([75, + 87, + 88, + 77, + 66, + 65]) + self.squareList[77].setAdjacent([76, + 88, + 89, + 78, + 67, + 66]) + self.squareList[78].setAdjacent([77, + 89, + 90, + 79, + 68, + 67]) + self.squareList[79].setAdjacent([78, + 90, + 91, + 80, + 69, + 68]) + self.squareList[80].setAdjacent([79, + 91, + 92, + 81, + 70, + 69]) + self.squareList[81].setAdjacent([80, + 92, + 93, + 82, + 71, + 70]) + self.squareList[82].setAdjacent([81, + 93, + 94, + 83, + 72, + 71]) + self.squareList[83].setAdjacent([82, + 94, + 95, + 84, + 73, + 72]) + self.squareList[84].setAdjacent([83, + 95, + 96, + 85, + 74, + 73]) + self.squareList[85].setAdjacent([84, + 96, + 97, + None, + None, + 74]) + self.squareList[86].setAdjacent([None, + 98, + 99, + 87, + 75, + None]) + self.squareList[87].setAdjacent([86, + 99, + 100, + 88, + 76, + 75]) + self.squareList[88].setAdjacent([87, + 100, + 101, + 89, + 77, + 76]) + self.squareList[89].setAdjacent([88, + 101, + 102, + 90, + 78, + 77]) + self.squareList[90].setAdjacent([89, + 102, + 103, + 91, + 79, + 78]) + self.squareList[91].setAdjacent([90, + 103, + 104, + 92, + 80, + 79]) + self.squareList[92].setAdjacent([91, + 104, + 105, + 93, + 81, + 80]) + self.squareList[93].setAdjacent([92, + 105, + 106, + 94, + 82, + 81]) + self.squareList[94].setAdjacent([93, + 106, + 107, + 95, + 83, + 82]) + self.squareList[95].setAdjacent([94, + 107, + 108, + 96, + 84, + 83]) + self.squareList[96].setAdjacent([95, + 108, + 109, + 97, + 85, + 84]) + self.squareList[97].setAdjacent([96, + 109, + 110, + None, + None, + 85]) + self.squareList[98].setAdjacent([None, + None, + None, + 99, + 86, + None]) + self.squareList[99].setAdjacent([98, + None, + None, + 100, + 87, + 86]) + self.squareList[100].setAdjacent([99, + None, + None, + 101, + 88, + 87]) + self.squareList[101].setAdjacent([100, + None, + None, + 102, + 89, + 88]) + self.squareList[102].setAdjacent([101, + None, + 111, + 103, + 90, + 89]) + self.squareList[103].setAdjacent([102, + 111, + 112, + 104, + 91, + 90]) + self.squareList[104].setAdjacent([103, + 112, + 113, + 105, + 92, + 91]) + self.squareList[105].setAdjacent([104, + 113, + 114, + 106, + 93, + 92]) + self.squareList[106].setAdjacent([105, + 114, + None, + 107, + 94, + 93]) + self.squareList[107].setAdjacent([106, + None, + None, + 108, + 95, + 94]) + self.squareList[108].setAdjacent([107, + None, + None, + 109, + 96, + 95]) + self.squareList[109].setAdjacent([108, + None, + None, + 110, + 97, + 96]) + self.squareList[110].setAdjacent([109, + None, + None, + None, + None, + 97]) + self.squareList[111].setAdjacent([None, + None, + 115, + 112, + 103, + 102]) + self.squareList[112].setAdjacent([111, + 115, + 116, + 113, + 104, + 103]) + self.squareList[113].setAdjacent([112, + 116, + 117, + 114, + 105, + 104]) + self.squareList[114].setAdjacent([113, + 117, + None, + None, + 106, + 105]) + self.squareList[115].setAdjacent([None, + None, + 118, + 116, + 112, + 111]) + self.squareList[116].setAdjacent([115, + 118, + 119, + 117, + 113, + 112]) + self.squareList[117].setAdjacent([116, + 119, + None, + None, + 114, + 113]) + self.squareList[118].setAdjacent([None, + None, + 120, + 119, + 116, + 115]) + self.squareList[119].setAdjacent([118, + 120, + None, + None, + 117, + 116]) + self.squareList[120].setAdjacent([None, + None, + None, + None, + 119, + 118]) + return + + def delete(self): + for x in self.squareList: + x.delete() + + del self.squareList + + def getSquare(self, arrayLoc): + return self.squareList[arrayLoc] + + def getSquareOffset(self, arrayLoc): + return self.squareList[arrayLoc - 1] + + def getState(self, squareNum): + return self.squareList[squareNum].getState() + + def getStateOffset(self, arrayLoc): + return self.squareList[squareNum - 1].getState() + + def setState(self, squareNum, newState): + self.squareList[squareNum].setState(newState) + + def setStateOffset(self, squareNum, newState): + self.squareList[squareNum - 1].setState(newState) + + def getAdjacent(self, squareNum): + return self.squareList[squareNum].adjacent + + def getAdjacentOffset(self, squareNum): + return self.squareList[squareNum - 1].adjacent + + def getStates(self): + retList = [] + for x in range(121): + retList.append(self.squareList[x].getState()) + + return retList + + def setStates(self, squares): + y = 0 + for x in range(121): + self.squareList[x].setState(squares[x]) + + +class CheckersSquare: + + def __init__(self, tileNu): + self.tileNum = tileNu + self.state = 0 + self.adjacent = [] + + def delete(self): + del self.tileNum + del self.state + del self.adjacent + + def setAdjacent(self, adjList): + for x in adjList: + self.adjacent.append(x) + + def getAdjacent(self): + return self.adjacent + + def setState(self, newState): + self.state = newState + + def getState(self): + return self.state + + def getNum(self): + return self.tileNum From 2815df8203c15b7e883336eecf68d5071cef29b2 Mon Sep 17 00:00:00 2001 From: Wilee999 Date: Thu, 31 Dec 2015 19:01:51 -0800 Subject: [PATCH 18/20] GameTutorials: use ttr --- toontown/safezone/GameTutorials.py | 518 ++++++++++++++--------------- 1 file changed, 259 insertions(+), 259 deletions(-) diff --git a/toontown/safezone/GameTutorials.py b/toontown/safezone/GameTutorials.py index b2578c74..eb1f1fa0 100644 --- a/toontown/safezone/GameTutorials.py +++ b/toontown/safezone/GameTutorials.py @@ -1,259 +1,259 @@ -from direct.gui.DirectGui import * -from direct.fsm import FSM -from direct.directnotify import DirectNotifyGlobal -from toontown.toonbase import ToontownGlobals -from toontown.toonbase import TTLocalizer -from pandac.PandaModules import * -from direct.interval.IntervalGlobal import * - -class ChineseTutorial(DirectFrame, FSM.FSM): - - def __init__(self, doneFunction, doneEvent = None, callback = None): - FSM.FSM.__init__(self, 'ChineseTutorial') - self.doneFunction = doneFunction - base.localAvatar.startSleepWatch(self.handleQuit) - self.doneEvent = doneEvent - self.callback = callback - self.setStateArray(['Page1', 'Page2', 'Quit']) - base.localAvatar.startSleepWatch(self.handleQuit) - DirectFrame.__init__(self, pos=(-0.7, 0.0, 0.0), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.5, 1.0), text='', text_scale=0.06) - self.accept('stoppedAsleep', self.handleQuit) - self['image'] = DGG.getDefaultDialogGeom() - self.title = DirectLabel(self, relief=None, text='', text_pos=(0.0, 0.4), text_fg=(1, 0, 0, 1), text_scale=0.13, text_font=ToontownGlobals.getSignFont()) - images = loader.loadModel('phase_6/models/golf/checker_tutorial.bam') - images.setTransparency(1) - self.iPage1 = images.find('**/tutorialPage1*') - self.iPage1.reparentTo(aspect2d) - self.iPage1.setPos(0.43, -0.1, 0.0) - self.iPage1.setScale(13.95) - self.iPage1.setTransparency(1) - self.iPage1.hide() - self.iPage1.getChildren()[1].hide() - self.iPage2 = images.find('**/tutorialPage3*') - self.iPage2.reparentTo(aspect2d) - self.iPage2.setPos(0.43, -0.1, 0.5) - self.iPage2.setScale(13.95) - self.iPage2.setTransparency(1) - self.iPage2.hide() - self.iPage3 = images.find('**/tutorialPage2*') - self.iPage3.reparentTo(aspect2d) - self.iPage3.setPos(0.43, -0.1, -0.5) - self.iPage3.setScale(13.95) - self.iPage3.setTransparency(1) - self.iPage3.hide() - buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') - gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') - self.bNext = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), - gui.find('**/Horiz_Arrow_DN'), - gui.find('**/Horiz_Arrow_Rllvr'), - gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), relief=None, text=TTLocalizer.ChineseTutorialNext, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.35, -0.3, -0.33), command=self.requestNext) - self.bPrev = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), - gui.find('**/Horiz_Arrow_DN'), - gui.find('**/Horiz_Arrow_Rllvr'), - gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), image_scale=(-1.0, 1.0, 1.0), relief=None, text=TTLocalizer.ChineseTutorialPrev, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.35, -0.3, -0.33), command=self.requestPrev) - self.bQuit = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.ChineseTutorialDone, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, -0.3, -0.33), command=self.handleQuit) - self.bQuit.hide() - buttons.removeNode() - gui.removeNode() - self.request('Page1') - return - - def __del__(self): - self.cleanup() - - def enterPage1(self, *args): - self.bNext.show() - self.title['text'] = (TTLocalizer.ChineseTutorialTitle1,) - self['text'] = TTLocalizer.ChinesePage1 - self['text_pos'] = (0.0, 0.23) - self['text_wordwrap'] = 13.5 - self.bPrev['state'] = DGG.DISABLED - self.bPrev.hide() - self.bNext['state'] = DGG.NORMAL - self.iPage1.show() - self.blinker = Sequence() - obj = self.iPage1.getChildren()[1] - self.iPage1.getChildren()[1].show() - self.blinker.append(LerpColorInterval(obj, 0.5, Vec4(0.5, 0.5, 0, 0.0), Vec4(0.2, 0.2, 0.2, 1))) - self.blinker.append(LerpColorInterval(obj, 0.5, Vec4(0.2, 0.2, 0.2, 1), Vec4(0.5, 0.5, 0, 0.0))) - self.blinker.loop() - - def exitPage1(self, *args): - self.bPrev['state'] = DGG.NORMAL - self.iPage1.hide() - self.iPage1.getChildren()[1].hide() - self.blinker.finish() - - def enterPage2(self, *args): - self.bPrev.show() - self.title['text'] = (TTLocalizer.ChineseTutorialTitle2,) - self['text'] = TTLocalizer.ChinesePage2 - self['text_pos'] = (0.0, 0.28) - self['text_wordwrap'] = 12.5 - self.bNext['state'] = DGG.DISABLED - self.bNext.hide() - self.iPage2.show() - self.iPage3.show() - self.bQuit.show() - - def exitPage2(self, *args): - self.iPage2.hide() - self.bQuit.hide() - self.iPage3.hide() - - def enterQuit(self, *args): - self.iPage1.removeNode() - self.iPage2.removeNode() - self.iPage3.removeNode() - self.bNext.destroy() - self.bPrev.destroy() - self.bQuit.destroy() - DirectFrame.destroy(self) - - def exitQuit(self, *args): - pass - - def handleQuit(self, task = None): - base.cr.playGame.getPlace().setState('walk') - self.forceTransition('Quit') - self.doneFunction() - if task != None: - task.done - return - - -class CheckersTutorial(DirectFrame, FSM.FSM): - - def __init__(self, doneFunction, doneEvent = None, callback = None): - FSM.FSM.__init__(self, 'CheckersTutorial') - self.doneFunction = doneFunction - base.localAvatar.startSleepWatch(self.handleQuit) - self.doneEvent = doneEvent - self.callback = callback - self.setStateArray(['Page1', - 'Page2', - 'Page3', - 'Quit']) - DirectFrame.__init__(self, pos=(-0.7, 0.0, 0.0), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.5, 1.0), text='', text_scale=0.06) - self.accept('stoppedAsleep', self.handleQuit) - self['image'] = DGG.getDefaultDialogGeom() - self.title = DirectLabel(self, relief=None, text='', text_pos=(0.0, 0.4), text_fg=(1, 0, 0, 1), text_scale=0.13, text_font=ToontownGlobals.getSignFont()) - images = loader.loadModel('phase_6/models/golf/regularchecker_tutorial.bam') - images.setTransparency(1) - self.iPage1 = images.find('**/tutorialPage1*') - self.iPage1.reparentTo(aspect2d) - self.iPage1.setPos(0.43, -0.1, 0.0) - self.iPage1.setScale(0.4) - self.iPage1.setTransparency(1) - self.iPage1.hide() - self.iPage2 = images.find('**/tutorialPage2*') - self.iPage2.reparentTo(aspect2d) - self.iPage2.setPos(0.43, -0.1, 0.0) - self.iPage2.setScale(0.4) - self.iPage2.setTransparency(1) - self.iPage2.hide() - self.iPage3 = images.find('**/tutorialPage3*') - self.iPage3.reparentTo(aspect2d) - self.iPage3.setPos(0.6, -0.1, 0.5) - self.iPage3.setScale(0.4) - self.iPage3.setTransparency(1) - self.obj = self.iPage3.find('**/king*') - self.iPage3.hide() - self.iPage4 = images.find('**/tutorialPage4*') - self.iPage4.reparentTo(aspect2d) - self.iPage4.setPos(0.6, -0.1, -0.5) - self.iPage4.setScale(0.4) - self.iPage4.setTransparency(1) - self.iPage4.hide() - buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') - gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') - self.bNext = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), - gui.find('**/Horiz_Arrow_DN'), - gui.find('**/Horiz_Arrow_Rllvr'), - gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), relief=None, text=TTLocalizer.ChineseTutorialNext, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.35, -0.3, -0.33), command=self.requestNext) - self.bPrev = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), - gui.find('**/Horiz_Arrow_DN'), - gui.find('**/Horiz_Arrow_Rllvr'), - gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), image_scale=(-1.0, 1.0, 1.0), relief=None, text=TTLocalizer.ChineseTutorialPrev, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.35, -0.3, -0.33), command=self.requestPrev) - self.bQuit = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.ChineseTutorialDone, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, -0.3, -0.33), command=self.handleQuit) - self.bQuit.hide() - buttons.removeNode() - gui.removeNode() - self.request('Page1') - return - - def __del__(self): - self.cleanup() - - def enterPage1(self, *args): - self.bNext.show() - self.title['text'] = (TTLocalizer.ChineseTutorialTitle1,) - self['text'] = TTLocalizer.CheckersPage1 - self['text_pos'] = (0.0, 0.23) - self['text_wordwrap'] = 13.5 - self['text_scale'] = 0.06 - self.bPrev['state'] = DGG.DISABLED - self.bPrev.hide() - self.bNext['state'] = DGG.NORMAL - self.iPage1.show() - - def exitPage1(self, *args): - self.bPrev['state'] = DGG.NORMAL - self.iPage1.hide() - - def enterPage2(self, *args): - self.bPrev.show() - self.bNext.show() - self.title['text'] = (TTLocalizer.ChineseTutorialTitle2,) - self['text'] = TTLocalizer.CheckersPage2 - self['text_pos'] = (0.0, 0.28) - self['text_wordwrap'] = 12.5 - self['text_scale'] = 0.06 - self.bNext['state'] = DGG.NORMAL - self.iPage2.show() - - def exitPage2(self, *args): - self.iPage2.hide() - - def enterPage3(self, *args): - self.bPrev.show() - self.title['text'] = (TTLocalizer.ChineseTutorialTitle2,) - self['text'] = TTLocalizer.CheckersPage3 + '\n\n' + TTLocalizer.CheckersPage4 - self['text_pos'] = (0.0, 0.32) - self['text_wordwrap'] = 19 - self['text_scale'] = 0.05 - self.bNext['state'] = DGG.DISABLED - self.blinker = Sequence() - self.blinker.append(LerpColorInterval(self.obj, 0.5, Vec4(0.5, 0.5, 0, 0.0), Vec4(0.9, 0.9, 0, 1))) - self.blinker.append(LerpColorInterval(self.obj, 0.5, Vec4(0.9, 0.9, 0, 1), Vec4(0.5, 0.5, 0, 0.0))) - self.blinker.loop() - self.bNext.hide() - self.iPage3.show() - self.iPage4.show() - self.bQuit.show() - - def exitPage3(self, *args): - self.blinker.finish() - self.iPage3.hide() - self.bQuit.hide() - self.iPage4.hide() - - def enterQuit(self, *args): - self.iPage1.removeNode() - self.iPage2.removeNode() - self.iPage3.removeNode() - self.bNext.destroy() - self.bPrev.destroy() - self.bQuit.destroy() - DirectFrame.destroy(self) - - def exitQuit(self, *args): - pass - - def handleQuit(self, task = None): - self.forceTransition('Quit') - base.cr.playGame.getPlace().setState('walk') - self.doneFunction() - if task != None: - task.done - return +from direct.gui.DirectGui import * +from direct.fsm import FSM +from direct.directnotify import DirectNotifyGlobal +from toontown.toonbase import ToontownGlobals +from toontown.toonbase import TTLocalizer +from pandac.PandaModules import * +from direct.interval.IntervalGlobal import * + +class ChineseTutorial(DirectFrame, FSM.FSM): + + def __init__(self, doneFunction, doneEvent = None, callback = None): + FSM.FSM.__init__(self, 'ChineseTutorial') + self.doneFunction = doneFunction + base.localAvatar.startSleepWatch(self.handleQuit) + self.doneEvent = doneEvent + self.callback = callback + self.setStateArray(['Page1', 'Page2', 'Quit']) + base.localAvatar.startSleepWatch(self.handleQuit) + DirectFrame.__init__(self, pos=(-0.7, 0.0, 0.0), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.5, 1.0), text='', text_scale=0.06) + self.accept('stoppedAsleep', self.handleQuit) + self['image'] = DGG.getDefaultDialogGeom() + self.title = DirectLabel(self, relief=None, text='', text_pos=(0.0, 0.4), text_fg=(1, 0, 0, 1), text_scale=0.13, text_font=ToontownGlobals.getSignFont()) + images = loader.loadModel('phase_6/models/golf/checker_tutorial') + images.setTransparency(1) + self.iPage1 = images.find('**/tutorialPage1*') + self.iPage1.reparentTo(aspect2d) + self.iPage1.setPos(0.43, -0.1, 0.0) + self.iPage1.setScale(13.95) + self.iPage1.setTransparency(1) + self.iPage1.hide() + self.iPage1.getChildren()[1].hide() + self.iPage2 = images.find('**/tutorialPage3*') + self.iPage2.reparentTo(aspect2d) + self.iPage2.setPos(0.43, -0.1, 0.5) + self.iPage2.setScale(13.95) + self.iPage2.setTransparency(1) + self.iPage2.hide() + self.iPage3 = images.find('**/tutorialPage2*') + self.iPage3.reparentTo(aspect2d) + self.iPage3.setPos(0.43, -0.1, -0.5) + self.iPage3.setScale(13.95) + self.iPage3.setTransparency(1) + self.iPage3.hide() + buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') + gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') + self.bNext = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), + gui.find('**/Horiz_Arrow_DN'), + gui.find('**/Horiz_Arrow_Rllvr'), + gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), relief=None, text=TTLocalizer.ChineseTutorialNext, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.35, -0.3, -0.33), command=self.requestNext) + self.bPrev = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), + gui.find('**/Horiz_Arrow_DN'), + gui.find('**/Horiz_Arrow_Rllvr'), + gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), image_scale=(-1.0, 1.0, 1.0), relief=None, text=TTLocalizer.ChineseTutorialPrev, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.35, -0.3, -0.33), command=self.requestPrev) + self.bQuit = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.ChineseTutorialDone, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, -0.3, -0.33), command=self.handleQuit) + self.bQuit.hide() + buttons.removeNode() + gui.removeNode() + self.request('Page1') + return + + def __del__(self): + self.cleanup() + + def enterPage1(self, *args): + self.bNext.show() + self.title['text'] = (TTLocalizer.ChineseTutorialTitle1,) + self['text'] = TTLocalizer.ChinesePage1 + self['text_pos'] = (0.0, 0.23) + self['text_wordwrap'] = 13.5 + self.bPrev['state'] = DGG.DISABLED + self.bPrev.hide() + self.bNext['state'] = DGG.NORMAL + self.iPage1.show() + self.blinker = Sequence() + obj = self.iPage1.getChildren()[1] + self.iPage1.getChildren()[1].show() + self.blinker.append(LerpColorInterval(obj, 0.5, Vec4(0.5, 0.5, 0, 0.0), Vec4(0.2, 0.2, 0.2, 1))) + self.blinker.append(LerpColorInterval(obj, 0.5, Vec4(0.2, 0.2, 0.2, 1), Vec4(0.5, 0.5, 0, 0.0))) + self.blinker.loop() + + def exitPage1(self, *args): + self.bPrev['state'] = DGG.NORMAL + self.iPage1.hide() + self.iPage1.getChildren()[1].hide() + self.blinker.finish() + + def enterPage2(self, *args): + self.bPrev.show() + self.title['text'] = (TTLocalizer.ChineseTutorialTitle2,) + self['text'] = TTLocalizer.ChinesePage2 + self['text_pos'] = (0.0, 0.28) + self['text_wordwrap'] = 12.5 + self.bNext['state'] = DGG.DISABLED + self.bNext.hide() + self.iPage2.show() + self.iPage3.show() + self.bQuit.show() + + def exitPage2(self, *args): + self.iPage2.hide() + self.bQuit.hide() + self.iPage3.hide() + + def enterQuit(self, *args): + self.iPage1.removeNode() + self.iPage2.removeNode() + self.iPage3.removeNode() + self.bNext.destroy() + self.bPrev.destroy() + self.bQuit.destroy() + DirectFrame.destroy(self) + + def exitQuit(self, *args): + pass + + def handleQuit(self, task = None): + base.cr.playGame.getPlace().setState('walk') + self.forceTransition('Quit') + self.doneFunction() + if task != None: + task.done + return + + +class CheckersTutorial(DirectFrame, FSM.FSM): + + def __init__(self, doneFunction, doneEvent = None, callback = None): + FSM.FSM.__init__(self, 'CheckersTutorial') + self.doneFunction = doneFunction + base.localAvatar.startSleepWatch(self.handleQuit) + self.doneEvent = doneEvent + self.callback = callback + self.setStateArray(['Page1', + 'Page2', + 'Page3', + 'Quit']) + DirectFrame.__init__(self, pos=(-0.7, 0.0, 0.0), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.5, 1.0), text='', text_scale=0.06) + self.accept('stoppedAsleep', self.handleQuit) + self['image'] = DGG.getDefaultDialogGeom() + self.title = DirectLabel(self, relief=None, text='', text_pos=(0.0, 0.4), text_fg=(1, 0, 0, 1), text_scale=0.13, text_font=ToontownGlobals.getSignFont()) + images = loader.loadModel('phase_6/models/golf/regularchecker_tutorial') + images.setTransparency(1) + self.iPage1 = images.find('**/tutorialPage1*') + self.iPage1.reparentTo(aspect2d) + self.iPage1.setPos(0.43, -0.1, 0.0) + self.iPage1.setScale(0.4) + self.iPage1.setTransparency(1) + self.iPage1.hide() + self.iPage2 = images.find('**/tutorialPage2*') + self.iPage2.reparentTo(aspect2d) + self.iPage2.setPos(0.43, -0.1, 0.0) + self.iPage2.setScale(0.4) + self.iPage2.setTransparency(1) + self.iPage2.hide() + self.iPage3 = images.find('**/tutorialPage3*') + self.iPage3.reparentTo(aspect2d) + self.iPage3.setPos(0.6, -0.1, 0.5) + self.iPage3.setScale(0.4) + self.iPage3.setTransparency(1) + self.obj = self.iPage3.find('**/king*') + self.iPage3.hide() + self.iPage4 = images.find('**/tutorialPage4*') + self.iPage4.reparentTo(aspect2d) + self.iPage4.setPos(0.6, -0.1, -0.5) + self.iPage4.setScale(0.4) + self.iPage4.setTransparency(1) + self.iPage4.hide() + buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui') + gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') + self.bNext = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), + gui.find('**/Horiz_Arrow_DN'), + gui.find('**/Horiz_Arrow_Rllvr'), + gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), relief=None, text=TTLocalizer.ChineseTutorialNext, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.35, -0.3, -0.33), command=self.requestNext) + self.bPrev = DirectButton(self, image=(gui.find('**/Horiz_Arrow_UP'), + gui.find('**/Horiz_Arrow_DN'), + gui.find('**/Horiz_Arrow_Rllvr'), + gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), image_scale=(-1.0, 1.0, 1.0), relief=None, text=TTLocalizer.ChineseTutorialPrev, text3_fg=Vec4(0, 0, 0, 0.5), text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.35, -0.3, -0.33), command=self.requestPrev) + self.bQuit = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.ChineseTutorialDone, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, -0.3, -0.33), command=self.handleQuit) + self.bQuit.hide() + buttons.removeNode() + gui.removeNode() + self.request('Page1') + return + + def __del__(self): + self.cleanup() + + def enterPage1(self, *args): + self.bNext.show() + self.title['text'] = (TTLocalizer.ChineseTutorialTitle1,) + self['text'] = TTLocalizer.CheckersPage1 + self['text_pos'] = (0.0, 0.23) + self['text_wordwrap'] = 13.5 + self['text_scale'] = 0.06 + self.bPrev['state'] = DGG.DISABLED + self.bPrev.hide() + self.bNext['state'] = DGG.NORMAL + self.iPage1.show() + + def exitPage1(self, *args): + self.bPrev['state'] = DGG.NORMAL + self.iPage1.hide() + + def enterPage2(self, *args): + self.bPrev.show() + self.bNext.show() + self.title['text'] = (TTLocalizer.ChineseTutorialTitle2,) + self['text'] = TTLocalizer.CheckersPage2 + self['text_pos'] = (0.0, 0.28) + self['text_wordwrap'] = 12.5 + self['text_scale'] = 0.06 + self.bNext['state'] = DGG.NORMAL + self.iPage2.show() + + def exitPage2(self, *args): + self.iPage2.hide() + + def enterPage3(self, *args): + self.bPrev.show() + self.title['text'] = (TTLocalizer.ChineseTutorialTitle2,) + self['text'] = TTLocalizer.CheckersPage3 + '\n\n' + TTLocalizer.CheckersPage4 + self['text_pos'] = (0.0, 0.32) + self['text_wordwrap'] = 19 + self['text_scale'] = 0.05 + self.bNext['state'] = DGG.DISABLED + self.blinker = Sequence() + self.blinker.append(LerpColorInterval(self.obj, 0.5, Vec4(0.5, 0.5, 0, 0.0), Vec4(0.9, 0.9, 0, 1))) + self.blinker.append(LerpColorInterval(self.obj, 0.5, Vec4(0.9, 0.9, 0, 1), Vec4(0.5, 0.5, 0, 0.0))) + self.blinker.loop() + self.bNext.hide() + self.iPage3.show() + self.iPage4.show() + self.bQuit.show() + + def exitPage3(self, *args): + self.blinker.finish() + self.iPage3.hide() + self.bQuit.hide() + self.iPage4.hide() + + def enterQuit(self, *args): + self.iPage1.removeNode() + self.iPage2.removeNode() + self.iPage3.removeNode() + self.bNext.destroy() + self.bPrev.destroy() + self.bQuit.destroy() + DirectFrame.destroy(self) + + def exitQuit(self, *args): + pass + + def handleQuit(self, task = None): + self.forceTransition('Quit') + base.cr.playGame.getPlace().setState('walk') + self.doneFunction() + if task != None: + task.done + return From 308a1ac5635d6cfb33c436273fbc1ab3adeca282 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 7 Mar 2015 08:10:27 +0000 Subject: [PATCH 19/20] Oops, wrong delivery time check! --- toontown/coderedemption/TTCodeRedemptionMgrAI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index f9388800..39dc4624 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -46,7 +46,7 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): count = 0 for item in items: - if item.getDeliveryTime() < 1: + if item.getDeliveryTime() > 0: count += 1 return count @@ -90,4 +90,4 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): av.onOrder.append(item) av.b_setDeliverySchedule(av.onOrder) - self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 0, 0]) + self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [context, 0, 0]) \ No newline at end of file From edd78503d1cfd76030bde007f22dd4e4157ac301 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 7 Mar 2015 10:32:15 +0200 Subject: [PATCH 20/20] ty loudrob and .gitignore update --- .gitignore | 3 +-- save.dat | 1 - toontown/coderedemption/TTCodeRedemptionMgrAI.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 save.dat diff --git a/.gitignore b/.gitignore index d695f7d1..c7885aa0 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,5 @@ logs/ screenshots/ backups/ contentpacks/ -toondata/ resources/ -panel_save.mp \ No newline at end of file +save.dat \ No newline at end of file diff --git a/save.dat b/save.dat deleted file mode 100644 index 6b2aaa76..00000000 --- a/save.dat +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index 39dc4624..bdf4cfcd 100644 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -34,7 +34,7 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): 'weed': { 'items': [ CatalogClothingItem.CatalogClothingItem(1821, 0) - ] + ], 'expirationDate': datetime(2016, 3, 30) # temporary expiration until release } }