def makeText(font, color, text, width, letter_space=0.5, line_space=(0.2)): special = {"(": "parenthesis_l", ")": "parenthesis_r", "_": "underscore"} textnode = NodePath(text[:10]) words = text.split(" ") l = 0 line = 0 for word in words: if l + len(word) > width * 2: line += 3 + line_space l = 0 for letter in word: if letter in special: letter = special[letter] letter = letter.lower() letter_model_node = font[color][0].find("l_" + letter) letter_model_node.setPos(0, 0, 0) i = NodePath(letter) letter_model_node.instanceTo(i) i.setPos(l, 0.2, -(line + (line * line_space))) i.reparentTo(textnode) letter_model_node = font[color][1].find("l_" + letter) letter_model_node.setPos(0, 0, 0) i = NodePath(letter) letter_model_node.instanceTo(i) i.setPos(l, 0.21, -(line + (line * line_space))) i.reparentTo(textnode) l += 2 + letter_space l += 2 #for the space after every word, sweet! textnode.flattenMedium() return textnode
class StageGrid: START_POS = '*' DOOR_LIST = ['N', 'E', 'W', 'S'] NPC = 'n' ENEMY = 'e' BOSS = 'b' def __init__(self, map_str, stage, blockTypes): self.stage = stage self.door_index = 0 self.npc_index = 0 self.enemy_index = 0 self.boss_index = 0 self.rawList = map_str self.startPosList = [] self.optimize = NodePath(PandaNode("optimization node")) self.blockTypes = blockTypes self.loadBlocks() self.optimizeGeometry() def loadBlocks(self): index = 0 for blockKey in self.rawList: block = self.blockTypes[blockKey] if not block: index += 1 continue blockModel = base.loader.loadModel("{}".format(block)) index_str = str(index).zfill(5) blockName = self.stage.find('**/block.{}'.format(index_str)) blockPos = blockName.getPos() blockModel.setPos(blockPos) if blockKey == self.START_POS: self.startPosList.append(blockPos) elif blockKey in self.DOOR_LIST: self.addDoor(blockModel) elif blockKey == self.NPC: self.addNPC(blockName) elif blockKey == self.ENEMY: self.addEnemy(blockName) elif blockKey == self.BOSS: self.addBoss(blockName) else: blockModel.reparentTo(self.optimize) index += 1 continue blockModel.reparentTo(self.stage) index += 1 def addBoss(self, blockName): blockName.setName('boss_{}'.format(self.boss_index)) self.boss_index += 1 def addEnemy(self, blockName): blockName.setName('enemy_{}'.format(self.enemy_index)) self.enemy_index += 1 def addNPC(self, blockName): blockName.setName('npc_{}'.format(self.npc_index)) self.npc_index += 1 def addDoor(self, blockModel): doorBlock = blockModel.find('**/door') doorBlock.setName('door_{}'.format(self.door_index)) self.door_index += 1 def optimizeGeometry(self): self.optimize.flattenMedium() self.optimize.reparentTo(self.stage)
class GunGameLevelLoader: notify = directNotify.newCategory('GunGameLevelLoader') LevelData = {'momada': {'name': CIGlobals.ToonBattleOriginalLevel, 'camera': ( Point3(0.0, -25.8, 7.59), Vec3(0.0, 0.0, 0.0)), 'models': [ 'phase_11/models/lawbotHQ/LB_Zone03a.bam', 'phase_11/models/lawbotHQ/LB_Zone04a.bam', 'phase_11/models/lawbotHQ/LB_Zone7av2.bam', 'phase_11/models/lawbotHQ/LB_Zone08a.bam', 'phase_11/models/lawbotHQ/LB_Zone13a.bam', 'phase_10/models/cashbotHQ/ZONE17a.bam', 'phase_10/models/cashbotHQ/ZONE18a.bam', 'phase_11/models/lawbotHQ/LB_Zone22a.bam'], 'parents': [ render, 'EXIT', 'EXIT', 'EXIT', 'ENTRANCE', 'ENTRANCE', 'ENTRANCE', 'EXIT'], 'model_positions': [ Point3(0.0, 0.0, 0.0), Point3(-1.02, 59.73, 0.0), Point3(0.0, 74.77, 0.0), Point3(0.0, 89.37, -13.5), Point3(16.33, -136.53, 0.0), Point3(-1.01, -104.4, 0.0), Point3(0.65, -23.86, 0.0), Point3(-55.66, -29.01, 0.0)], 'model_orientations': [ Vec3(0.0, 0.0, 0.0), Vec3(0.0, 0.0, 0.0), Vec3(90.0, 0.0, 0.0), Vec3(180.0, 0.0, 0.0), Vec3(97.0, 0.0, 0.0), Vec3(359.95, 0.0, 0.0), Vec3(90.0, 0.0, 0.0), Vec3(270.0, 0.0, 0.0)], 'spawn_points': [ ( Point3(0, 0, 0), Vec3(0, 0, 0)), ( Point3(-20, 50, 0), Vec3(0, 0, 0)), ( Point3(20, 50, 0), Vec3(0, 0, 0)), ( Point3(0, 120, 0), Vec3(0, 0, 0)), ( Point3(0, 100, 0), Vec3(180, 0, 0)), ( Point3(-90, 0, 0), Vec3(0, 0, 0)), ( Point3(-170, 0, 0), Vec3(0, 0, 0)), ( Point3(-90, 50, 0), Vec3(0, 0, 0)), ( Point3(-170, 50, 0), Vec3(0, 0, 0)), ( Point3(35, 250, 0), Vec3(-90, 0, 0)), ( Point3(0, 285, 0), Vec3(180, 0, 0)), ( Point3(-185, 250, 0), Vec3(90, 0, 0))]}, 'dg': {'name': CIGlobals.DaisyGardens, 'camera': ( Point3(-33.13, -3.2, 48.62), Vec3(326.31, 332.68, 0.0)), 'dna': [ 'phase_8/dna/storage_DG.pdna', 'phase_8/dna/storage_DG_sz.pdna', 'phase_8/dna/daisys_garden_sz.pdna'], 'sky': 'TT', 'spawn_points': hoodMgr.dropPoints[CIGlobals.DaisyGardens]}, 'mml': {'name': CIGlobals.MinniesMelodyland, 'camera': ( Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)), 'dna': [ 'phase_6/dna/storage_MM.pdna', 'phase_6/dna/storage_MM_sz.pdna', 'phase_6/dna/minnies_melody_land_sz.pdna'], 'sky': 'MM', 'spawn_points': hoodMgr.dropPoints[CIGlobals.MinniesMelodyland]}, 'oz': {'name': CIGlobals.OutdoorZone, 'camera': ( Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)), 'dna': [ 'phase_6/dna/storage_OZ.pdna', 'phase_6/dna/storage_OZ_sz.pdna', 'phase_6/dna/outdoor_zone_sz.pdna'], 'sky': 'TT', 'spawn_points': hoodMgr.dropPoints[CIGlobals.OutdoorZone]}, 'cbhq': {'name': CIGlobals.CashbotHQ, 'camera': ( Point3(302.64, 5.0, 15.2), Vec3(135.0, 341.57, 0.0)), 'model': 'phase_10/models/cogHQ/CashBotShippingStation.bam', 'sky': None, 'spawn_points': hoodMgr.dropPoints[CIGlobals.CashbotHQ]}, 'sbf': {'name': CIGlobals.SellbotFactory, 'camera': ( Point3(0, 0, 0), Vec3(0, 0, 0)), 'model': 'phase_9/models/cogHQ/SelbotLegFactory.bam', 'sky': 'cog', 'sky_scale': 10.0, 'occluders': 'phase_9/models/cogHQ/factory_sneak_occluders.egg', 'spawn_points': {GGG.Teams.BLUE: [ ( Point3(13, 30, 3.73), Point3(0, 0, 0)), (Point3(21, 30, 3.73), Point3(0, 0, 0)), (Point3(29, 30, 3.73), Point3(0, 0, 0)), ( Point3(13, 20, 3.73), Point3(0, 0, 0)), (Point3(21, 20, 3.73), Point3(0, 0, 0)), (Point3(29, 30, 3.73), Point3(0, 0, 0))], GGG.Teams.RED: [ ( Point3(-644.43, 378.12, 8.73), Point3(270, 0, 0)), (Point3(-644.43, 370.75, 8.73), Point3(270, 0, 0)), (Point3(-644.43, 363.22, 8.73), Point3(270, 0, 0)), ( Point3(-659.05, 378.12, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 370.75, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 363.22, 8.73), Point3(270, 0, 0))]}, 'flag_points': {GGG.Teams.BLUE: [Point3(213.23, 340.59, 19.73), Point3(90, 0, 0)], GGG.Teams.RED: [ Point3(-543.6, 595.79, 9.73), Point3(270, 0, 0)]}, 'flagpoint_points': {GGG.Teams.BLUE: [Point3(-543.6, 595.79, 9.73), Point3(270, 0, 0)], GGG.Teams.RED: [ Point3(213.23, 340.59, 19.73), Point3(0, 0, 0)]}}, 'ttc': {'name': CIGlobals.ToontownCentral, 'dna': [ 'phase_4/dna/storage_TT.pdna', 'phase_4/dna/storage_TT_sz.pdna', 'phase_4/dna/new_ttc_sz.pdna'], 'sky': 'TT', 'spawn_points': [ (9.90324401855, 91.9139556885, 8.0364112854, -545.909545898, 0.0, 0.0), (77.9181442261, 50.953086853, 7.52815723419, -598.509460449, 0.0, 0.0), (93.7379760742, 6.37303066254, 7.99749088287, -626.209533691, 0.0, 0.0), (39.0383415222, -81.5989837646, 8.01874637604, -694.309265137, 0.0, 0.0), (-19.2093048096, -95.1359481812, 8.07303524017, -731.409240723, 0.0, 0.0), (-84.4093933105, -45.4780502319, 8.06541728973, -781.809143066, 0.0, 0.0), (-92.2512283325, 2.41426730156, 8.03108692169, -811.70916748, 0.0, 0.0), (46.8868179321, 81.3593673706, 8.04793071747, -955.309509277, 0.0, 0.0), (32.3203735352, 90.0017929077, 8.06353855133, -884.409301758, 0.0, 0.0)], 'cap_point': Point3(-1.5, 0, 0)}} SkyData = {'TT': 'phase_3.5/models/props', 'MM': 'phase_6/models/props', 'cog': 'phase_9/models/cogHQ', 'MovingSkies': [ 'TT']} def __init__(self, mg): self.mg = mg self.levelName = None self.dnaStore = DNAStorage() self.loadingText = None self.levelGeom = None self.skyUtil = None self.skyModel = None self.occluders = None self.momadaAreas = [] self.momadaAreaName2areaModel = {} return def getFlagPoint_Point(self, team): return self.LevelData[self.levelName]['flagpoint_points'][team] def getFlagPoint(self, team): return self.LevelData[self.levelName]['flag_points'][team] def getCapturePoint(self): return self.LevelData[self.levelName]['cap_point'] def setLevel(self, level): self.levelName = level def getLevel(self): return self.levelName def getCameraOfCurrentLevel(self): return self.LevelData[self.getLevel()]['camera'] def getSpawnPoints(self): pointData = self.LevelData[self.levelName]['spawn_points'] if self.levelName == 'momada': return pointData if self.mg.gameMode in [GGG.GameModes.CASUAL, GGG.GameModes.KOTH]: array = [] for posAndHpr in pointData: array.append(( Point3(posAndHpr[0], posAndHpr[1], posAndHpr[2]), Vec3(posAndHpr[3], posAndHpr[4], posAndHpr[5]))) else: if self.mg.gameMode == GGG.GameModes.CTF: array = pointData[self.mg.team] return array def getNameOfCurrentLevel(self): return self.LevelData[self.getLevel()]['name'] def load(self): self.unload() if self.loadingText: self.loadingText.destroy() self.loadingText = None self.loadingText = OnscreenText(text='', font=CIGlobals.getMinnieFont(), fg=(1, 1, 1, 1)) self.loadingText.setBin('gui-popup', 0) base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() if self.levelName == 'momada': self.__momadaLoad() else: if self.levelName in ('cbhq', 'sbf'): modelPath = self.LevelData[self.levelName]['model'] self.levelGeom = loader.loadModel(modelPath) self.levelGeom.flattenMedium() self.levelGeom.reparentTo(render) if self.LevelData[self.levelName]['sky'] != None: self.skyModel = loader.loadModel(self.SkyData['cog'] + '/cog_sky.bam') self.skyUtil = SkyUtil() self.skyUtil.startSky(self.skyModel) self.skyModel.reparentTo(render) self.skyModel.setScale(self.LevelData[self.levelName].get('sky_scale', 1.0)) if self.LevelData[self.levelName].get('occluders'): self.occluders = loader.loadModel(self.LevelData[self.levelName]['occluders']) for occluderNode in self.occluders.findAllMatches('**/+OccluderNode'): base.render.setOccluder(occluderNode) occluderNode.node().setDoubleSided(True) if self.levelName == 'sbf': base.camLens.setFar(250) else: dnaFiles = self.LevelData[self.levelName]['dna'] skyType = self.LevelData[self.levelName]['sky'] skyPhase = self.SkyData[skyType] loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna') for index in range(len(dnaFiles)): if index == len(dnaFiles) - 1: node = loadDNAFile(self.dnaStore, dnaFiles[index]) if node.getNumParents() == 1: self.levelGeom = NodePath(node.getParent(0)) self.levelGeom.reparentTo(hidden) else: self.levelGeom = hidden.attachNewNode(node) if self.levelName == 'ttc' and dnaFiles[index] == 'phase_4/dna/new_ttc_sz.pdna': self.levelGeom.find('**/prop_gazebo_DNARoot').removeNode() else: self.levelGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.levelGeom.prepareScene(gsg) self.levelGeom.reparentTo(render) else: loadDNAFile(self.dnaStore, dnaFiles[index]) children = self.levelGeom.findAllMatches('**/*doorFrameHole*') for child in children: child.hide() self.skyModel = loader.loadModel(skyPhase + '/' + skyType + '_sky.bam') self.skyUtil = SkyUtil() self.skyUtil.startSky(self.skyModel) self.skyModel.reparentTo(camera) ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.skyModel.node().setEffect(ce) if self.loadingText: self.loadingText.destroy() self.loadingText = None return def __momadaLoad(self): def attachArea(itemNum): name = 'MomadaArea-%s' % itemNum area = self.momadaAreaName2areaModel.get(name) parents = self.LevelData['momada']['parents'] parent = parents[itemNum] if type(parent) == type(''): parent = self.momadaAreas[itemNum - 1].find('**/' + parent) pos = self.LevelData['momada']['model_positions'][itemNum] hpr = self.LevelData['momada']['model_orientations'][itemNum] area.reparentTo(parent) area.setPos(pos) area.setHpr(hpr) _numItems = 0 name = None for item in self.LevelData['momada']['models']: name = 'MomadaArea-%s' % _numItems area = loader.loadModel(item) self.momadaAreas.append(area) self.momadaAreaName2areaModel[name] = area attachArea(_numItems) _numItems += 1 self.notify.info('Loaded and attached %s momada areas.' % _numItems) return def unload(self): render.clearOccluder() if self.levelName == 'sbf': base.camLens.setFar(CIGlobals.DefaultCameraFar) if self.levelName == 'momada': for area in self.momadaAreas: self.momadaAreas.remove(area) area.removeNode() del area self.momadaAreas = [] self.momadaAreaName2areaModel = {} else: if self.occluders: self.occluders.removeNode() self.occluders = None if self.skyUtil: self.skyUtil.stopSky() self.skyUtil = None if self.skyModel: self.skyModel.removeNode() self.skyModel = None if self.levelGeom: self.levelGeom.removeNode() self.levelGeom = None return def cleanup(self): self.momadaAreas = None self.momadaAreaName2areaModel = None if self.dnaStore: self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_textures() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() self.dnaStore = None return
class CameraShyLevelLoader: notify = directNotify.newCategory('CameraShyLevelLoader') levelData = { 'TT_maze': { 'name': CIGlobals.ToontownCentral, 'models': { 'phase_4/models/minigames/maze_1player.bam': { 'name': 'maze' }, 'phase_4/models/minigames/maze_1player_collisions.egg': { 'name': 'maze_collisions' }, }, 'sky': 'TT', 'spawnPoints': [[Point3(0, 0, 0), Vec3(0, 0, 0)], [Point3(-23.89, 18.58, 0.00), Vec3(90.00, 0.00, 0.00)], [Point3(-23.89, 6.30, 0.00), Vec3(0.00, 0.00, 0.00)], [Point3(23.78, 6.30, 0.00), Vec3(0.00, 0.00, 0.00)], [Point3(8.12, -17.79, 0.00), Vec3(270.00, 0.00, 0.00)]] }, 'DG_playground': { 'name': CIGlobals.DaisyGardens, 'dna': [ 'phase_8/dna/storage_DG.pdna', 'phase_8/dna/storage_DG_sz.pdna', 'phase_8/dna/daisys_garden_sz.pdna' ], 'sky': 'TT', 'spawnPoints': hoodMgr.dropPoints[CIGlobals.DaisyGardens] } } skyData = { 'TT': { 'model': 'phase_3.5/models/props/TT_sky.bam', 'moving': 1 } } def __init__(self): self.level = None self.dnaStore = DNAStorage() self.levelGeom = None self.skyUtil = None self.skyModel = None # To keep track of all the models. self.models = [] def setLevel(self, level): self.level = level def getLevel(self): return self.level def load(self): if not self.level: self.notify.warning('Attempted to load a null level!') return def loadSky(sky): data = self.skyData[sky] if data: model = data['model'] moving = 0 if data.get('moving'): moving = data['moving'] self.skyModel = loader.loadModel(model) self.skyModel.reparentTo(camera) self.skyUtil = SkyUtil() self.skyUtil.startSky(self.skyModel) if moving: compass = CompassEffect.make( NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.skyModel.node().setEffect(compass) self.unload() data = self.levelData[self.level] skyType = data['sky'] # Are we loading a DNA level? if data.get('dna'): dnaFiles = data['dna'] loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna') for index in range(len(dnaFiles)): if 'storage' not in dnaFiles[index]: # It's an environment file, let's load that up and reparent it to render. node = loader.loadDNAFile(self.dnaStore, dnaFiles[index]) if node.getNumParents() == 1: self.levelGeom = NodePath(node.getParent(0)) self.levelGeom.reparentTo(hidden) else: self.levelGeom = hidden.attachNewNode(node) self.levelGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.levelGeom.prepareScene(gsg) self.levelGeom.reparentTo(render) else: # It's just a storage file, let's just load that up. loadDNAFile(self.dnaStore, dnaFiles[index]) elif data.get('models'): models = data['models'] for model, modifiers in models.items(): mdl = loader.loadModel(model) if modifiers.get('name'): mdl.setName(modifiers['name']) if modifiers.get('hpr'): mdl.setHpr(modifiers['hpr']) if modifiers.get('pos'): mdl.setPos(modifiers['pos']) if modifiers.get('scale'): mdl.setScale(modifiers['scale']) if modifiers.get('parent'): mdl.reparentTo(modifiers['parent']) else: mdl.reparentTo(render) self.models.append(mdl) else: self.notify.warning( 'Attempted to load a level with no data on how to generate it. Level is empty!' ) return loadSky(skyType) self.levelLoaded() def unload(self): if self.models: if len(self.models) > 0: for model in self.models: model.removeNode() self.models = [] if self.levelGeom: self.levelGeom.removeNode() self.levelGeom = None if self.skyUtil: self.skyUtil.stopSky() self.skyUtil = None if self.skyModel: self.skyModel.removeNode() self.skyModel = None if self.dnaStore: self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_textures() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() # This is set outside of the class, so no need to check if it exists. hoodMgr = None def cleanup(self): try: self.CameraShyLevelLoader_deleted except: self.CameraShyLevelLoader_deleted = 1 if self.dnaStore: self.unload() self.models = None self.levelGeom = None self.skyUtil = None self.skyModel = None self.dnaStore = None self.levelData = None def levelLoaded(self): if self.level == 'TT_maze': for model in self.models: if model.getName() == 'maze': model.find('**/maze_walls').setSz(1.5) elif model.getName() == 'maze_collisions': model.hide() model.setTransparency(1) model.setColorScale(1, 1, 1, 0) for node in model.findAllMatches('**'): node.setSz(1.5) def getSpawnPoints(self): if self.level: points = self.levelData[self.level].get('spawnPoints') # Do we need to disect the pos and hpr coordinates? if points in hoodMgr.dropPoints.values(): twoPointArray = [] for posHpr in points: twoPointArray.append( Point3(posHpr[0], posHpr[1], posHpr[2]), Vec3(posHpr[3], posHpr[4], posHpr[5])) points = twoPointArray return points else: self.notify.warning( 'Attempted to get spawn points of a null level!') return None
class SafeZoneLoader(StateData): notify = directNotify.newCategory('SafeZoneLoader') def __init__(self, hood, parentFSMState, doneEvent): StateData.__init__(self, doneEvent) self.hood = hood self.parentFSMState = parentFSMState self.fsm = ClassicFSM('safeZoneLoader', [ State('off', self.enterOff, self.exitOff), State('playground', self.enterPlayground, self.exitPlayground, ['quietZone']), State('toonInterior', self.enterToonInterior, self.exitToonInterior, ['quietZone']), State('quietZone', self.enterQuietZone, self.exitQuietZone, ['playground', 'toonInterior']) ], 'off', 'off') self.placeDoneEvent = 'placeDone' self.place = None self.playground = None self.battleMusic = None self.invasionMusic = None self.invasionMusicFiles = None self.interiorMusic = None self.bossBattleMusic = None self.music = None self.tournamentMusic = None self.linkTunnels = [] self.szHolidayDNAFile = None self.animatedFish = None return def findAndMakeLinkTunnels(self): for tunnel in self.geom.findAllMatches('**/*linktunnel*'): dnaRootStr = tunnel.getName() link = LinkTunnel.SafeZoneLinkTunnel(tunnel, dnaRootStr) self.linkTunnels.append(link) def load(self): StateData.load(self) if self.pgMusicFilename: if type(self.pgMusicFilename) == types.ListType: filename = random.choice(self.pgMusicFilename) else: filename = self.pgMusicFilename self.music = base.loadMusic(filename) if self.battleMusicFile: self.battleMusic = base.loadMusic(self.battleMusicFile) if self.invasionMusicFiles: self.invasionMusic = None if self.bossBattleMusicFile: self.bossBattleMusic = base.loadMusic(self.bossBattleMusicFile) if self.interiorMusicFilename: self.interiorMusic = base.loadMusic(self.interiorMusicFilename) if self.tournamentMusicFiles: self.tournamentMusic = None self.createSafeZone(self.dnaFile) children = self.geom.findAllMatches('**/*doorFrameHole*') for child in children: child.hide() self.parentFSMState.addChild(self.fsm) _, _, _, _, _, _, _, _, af = SettingsManager().getSettings( 'settings.json') if af == 'on': self.notify.info( 'Anisotropic Filtering is on, applying to textures.') for nodepath in self.geom.findAllMatches('*'): try: for node in nodepath.findAllMatches('**'): try: node.findTexture('*').setAnisotropicDegree(8) except: pass except: continue return def unload(self): StateData.unload(self) if self.animatedFish: self.animatedFish.cleanup() self.animatedFish.removeNode() self.animatedFish = None self.parentFSMState.removeChild(self.fsm) del self.parentFSMState del self.animatedFish self.geom.removeNode() del self.geom del self.fsm del self.hood del self.playground del self.music del self.interiorMusic del self.battleMusic del self.bossBattleMusic del self.tournamentMusic self.ignoreAll() ModelPool.garbageCollect() TexturePool.garbageCollect() return def enter(self, requestStatus): StateData.enter(self) if base.localAvatar.zoneId < CIGlobals.DynamicZonesBegin: self.findAndMakeLinkTunnels() self.fsm.enterInitialState() messenger.send('enterSafeZone') self.setState(requestStatus['where'], requestStatus) partyGate = self.geom.find('**/prop_party_gate_DNARoot') if not partyGate.isEmpty(): partyGate.removeNode() del partyGate petShop = self.geom.find('**/*pet_shop_DNARoot*') if not petShop.isEmpty(): fish = petShop.find( '**/animated_prop_PetShopFishAnimatedProp_DNARoot') if fish: self.animatedFish = Actor( 'phase_4/models/props/exteriorfish-zero.bam', {'chan': 'phase_4/models/props/exteriorfish-swim.bam'}) self.animatedFish.reparentTo(petShop) self.animatedFish.setPos(fish.getPos()) self.animatedFish.loop('chan') fish.removeNode() def exit(self): StateData.exit(self) messenger.send('exitSafeZone') for link in self.linkTunnels: link.cleanup() if self.animatedFish: self.animatedFish.stop('chan') self.linkTunnels = [] def setState(self, stateName, requestStatus): self.fsm.request(stateName, [requestStatus]) def createSafeZone(self, dnaFile): if self.szStorageDNAFile: loader.loadDNAFile(self.hood.dnaStore, self.szStorageDNAFile) if self.szHolidayDNAFile: loader.loadDNAFile(self.hood.dnaStore, self.szHolidayDNAFile) node = loader.loadDNAFile(self.hood.dnaStore, dnaFile) if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(node) self.makeDictionaries(self.hood.dnaStore) if self.__class__.__name__ not in ('TTSafeZoneLoader', ): self.geom.flattenMedium() gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) def makeDictionaries(self, dnaStore): self.nodeList = [] for i in xrange(dnaStore.getNumDNAVisGroups()): groupFullName = dnaStore.getDNAVisGroupName(i) groupNode = self.geom.find('**/' + groupFullName) if groupNode.isEmpty(): self.notify.error('Could not find visgroup') if self.__class__.__name__ not in ('TTSafeZoneLoader', ): groupNode.flattenMedium() self.nodeList.append(groupNode) self.hood.dnaStore.resetPlaceNodes() self.hood.dnaStore.resetDNAGroups() self.hood.dnaStore.resetDNAVisGroups() self.hood.dnaStore.resetDNAVisGroupsAI() def enterPlayground(self, requestStatus): try: self.hood.stopSuitEffect() except: pass self.acceptOnce(self.placeDoneEvent, self.handlePlaygroundDone) self.place = self.playground(self, self.fsm, self.placeDoneEvent) self.place.load() def exitPlayground(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handlePlaygroundDone(self): status = self.place.doneStatus if self.hood.isSameHood(status) and status[ 'loader'] == 'safeZoneLoader' and status['where'] not in ( 'minigame', ): self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) def enterToonInterior(self, requestStatus): self.acceptOnce(self.placeDoneEvent, self.handleToonInteriorDone) self.place = ToonInterior.ToonInterior(self, self.fsm, self.placeDoneEvent) self.place.load() def enterThePlace(self, requestStatus): base.cr.playGame.setPlace(self.place) if self.place is not None: self.place.enter(requestStatus) return def exitToonInterior(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handleToonInteriorDone(self): status = self.place.doneStatus if status['loader'] == 'safeZoneLoader' and self.hood.isSameHood( status ) and status['shardId'] == None or status['how'] == 'doorOut': self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterQuietZone(self, requestStatus): self.fsm.request(requestStatus['where'], [requestStatus], exitCurrent=0) self.quietZoneDoneEvent = uniqueName('quietZoneDone') self.acceptOnce(self.quietZoneDoneEvent, self.handleQuietZoneDone) self.quietZoneStateData = QuietZoneState(self.quietZoneDoneEvent) self.quietZoneStateData.load() self.quietZoneStateData.enter(requestStatus) def exitQuietZone(self): self.ignore(self.quietZoneDoneEvent) del self.quietZoneDoneEvent self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None return def handleQuietZoneDone(self): status = self.quietZoneStateData.getDoneStatus() self.exitQuietZone() if status['where'] == 'estate' or status['loader'] == 'townLoader': self.doneStatus = status messenger.send(self.doneEvent) else: self.enterThePlace(status) def enterOff(self): pass def exitOff(self): pass
class GunGameLevelLoader: notify = directNotify.newCategory('GunGameLevelLoader') LevelData = {'momada': {'name': CIGlobals.ToonBattleOriginalLevel, 'camera': (Point3(0.0, -25.8, 7.59), Vec3(0.0, 0.0, 0.0)), 'models': ['phase_11/models/lawbotHQ/LB_Zone03a.bam', 'phase_11/models/lawbotHQ/LB_Zone04a.bam', 'phase_11/models/lawbotHQ/LB_Zone7av2.bam', 'phase_11/models/lawbotHQ/LB_Zone08a.bam', 'phase_11/models/lawbotHQ/LB_Zone13a.bam', 'phase_10/models/cashbotHQ/ZONE17a.bam', 'phase_10/models/cashbotHQ/ZONE18a.bam', 'phase_11/models/lawbotHQ/LB_Zone22a.bam'], 'parents': [render, 'EXIT', 'EXIT', 'EXIT', 'ENTRANCE', 'ENTRANCE', 'ENTRANCE', 'EXIT'], 'model_positions': [Point3(0.0, 0.0, 0.0), Point3(-1.02, 59.73, 0.0), Point3(0.0, 74.77, 0.0), Point3(0.0, 89.37, -13.5), Point3(16.33, -136.53, 0.0), Point3(-1.01, -104.4, 0.0), Point3(0.65, -23.86, 0.0), Point3(-55.66, -29.01, 0.0)], 'model_orientations': [Vec3(0.0, 0.0, 0.0), Vec3(0.0, 0.0, 0.0), Vec3(90.0, 0.0, 0.0), Vec3(180.0, 0.0, 0.0), Vec3(97.0, 0.0, 0.0), Vec3(359.95, 0.0, 0.0), Vec3(90.0, 0.0, 0.0), Vec3(270.0, 0.0, 0.0)], 'spawn_points': [(Point3(0, 0, 0), Vec3(0, 0, 0)), (Point3(-20, 50, 0), Vec3(0, 0, 0)), (Point3(20, 50, 0), Vec3(0, 0, 0)), (Point3(0, 120, 0), Vec3(0, 0, 0)), (Point3(0, 100, 0), Vec3(180, 0, 0)), (Point3(-90, 0, 0), Vec3(0, 0, 0)), (Point3(-170, 0, 0), Vec3(0, 0, 0)), (Point3(-90, 50, 0), Vec3(0, 0, 0)), (Point3(-170, 50, 0), Vec3(0, 0, 0)), (Point3(35, 250, 0), Vec3(-90, 0, 0)), (Point3(0, 285, 0), Vec3(180, 0, 0)), (Point3(-185, 250, 0), Vec3(90, 0, 0))]}, 'dg': {'name': CIGlobals.DaisyGardens, 'camera': (Point3(-33.13, -3.2, 48.62), Vec3(326.31, 332.68, 0.0)), 'dna': ['phase_8/dna/storage_DG.dna', 'phase_8/dna/storage_DG_sz.dna', 'phase_8/dna/daisys_garden_sz.dna'], 'sky': 'TT', 'spawn_points': hoodMgr.dropPoints[CIGlobals.DaisyGardens]}, 'mml': {'name': CIGlobals.MinniesMelodyland, 'camera': (Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)), 'dna': ['phase_6/dna/storage_MM.dna', 'phase_6/dna/storage_MM_sz.dna', 'phase_6/dna/minnies_melody_land_sz.dna'], 'sky': 'MM', 'spawn_points': hoodMgr.dropPoints[CIGlobals.MinniesMelodyland]}, 'oz': {'name': CIGlobals.OutdoorZone, 'camera': (Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)), 'dna': ['phase_6/dna/storage_OZ.dna', 'phase_6/dna/storage_OZ_sz.dna', 'phase_6/dna/outdoor_zone_sz.dna'], 'sky': 'TT', 'spawn_points': hoodMgr.dropPoints[CIGlobals.OutdoorZone]}, 'cbhq': {'name': CIGlobals.CashbotHQ, 'camera': (Point3(302.64, 5.0, 15.2), Vec3(135.0, 341.57, 0.0)), 'model': 'phase_10/models/cogHQ/CashBotShippingStation.bam', 'sky': None, 'spawn_points': hoodMgr.dropPoints[CIGlobals.CashbotHQ]}} SkyData = {'TT': 'phase_3.5/models/props', 'MM': 'phase_6/models/props', 'cog': 'phase_9/models/cogHQ', 'MovingSkies': ['TT']} def __init__(self): self.levelName = None self.dnaStore = DNAStorage() self.loadingText = None self.levelGeom = None self.skyUtil = None self.skyModel = None self.momadaAreas = [] self.momadaAreaName2areaModel = {} return def setLevel(self, level): self.levelName = level def getLevel(self): return self.levelName def getCameraOfCurrentLevel(self): return self.LevelData[self.getLevel()]['camera'] def getSpawnPoints(self): pointData = self.LevelData[self.levelName]['spawn_points'] if self.levelName == 'momada': return pointData else: array = [] for posAndHpr in pointData: array.append((Point3(posAndHpr[0], posAndHpr[1], posAndHpr[2]), Vec3(posAndHpr[3], posAndHpr[4], posAndHpr[5]))) return array def getNameOfCurrentLevel(self): return self.LevelData[self.getLevel()]['name'] def load(self): self.unload() if self.loadingText: self.loadingText.destroy() self.loadingText = None self.loadingText = OnscreenText(text='Loading ' + self.getNameOfCurrentLevel() + '...', font=CIGlobals.getMinnieFont(), fg=(1, 1, 1, 1)) self.loadingText.setBin('gui-popup', 0) base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() if self.levelName == 'momada': self.__momadaLoad() elif self.levelName in ('cbhq',): modelPath = self.LevelData[self.levelName]['model'] self.levelGeom = loader.loadModel(modelPath) self.levelGeom.flattenMedium() self.levelGeom.reparentTo(render) if self.LevelData[self.levelName]['sky'] != None: self.skyModel = loader.loadModel(self.SkyData['cog'] + '/cog_sky.bam') self.skyUtil = SkyUtil() self.skyUtil.startSky(self.skyModel) self.skyModel.reparentTo(render) else: dnaFiles = self.LevelData[self.levelName]['dna'] skyType = self.LevelData[self.levelName]['sky'] skyPhase = self.SkyData[skyType] loader.loadDNAFile(self.dnaStore, 'phase_4/dna/storage.dna') for index in range(len(dnaFiles)): if index == len(dnaFiles) - 1: node = loader.loadDNAFile(self.dnaStore, dnaFiles[index]) if node.getNumParents() == 1: self.levelGeom = NodePath(node.getParent(0)) self.levelGeom.reparentTo(hidden) else: self.levelGeom = hidden.attachNewNode(node) self.levelGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.levelGeom.prepareScene(gsg) self.levelGeom.reparentTo(render) else: loader.loadDNAFile(self.dnaStore, dnaFiles[index]) self.skyModel = loader.loadModel(skyPhase + '/' + skyType + '_sky.bam') self.skyUtil = SkyUtil() self.skyUtil.startSky(self.skyModel) self.skyModel.reparentTo(camera) ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.skyModel.node().setEffect(ce) if self.loadingText: self.loadingText.destroy() self.loadingText = None return def __momadaLoad(self): def attachArea(itemNum): name = 'MomadaArea-%s' % itemNum area = self.momadaAreaName2areaModel.get(name) parents = self.LevelData['momada']['parents'] parent = parents[itemNum] if type(parent) == type(''): parent = self.momadaAreas[itemNum - 1].find('**/' + parent) pos = self.LevelData['momada']['model_positions'][itemNum] hpr = self.LevelData['momada']['model_orientations'][itemNum] area.reparentTo(parent) area.setPos(pos) area.setHpr(hpr) _numItems = 0 name = None for item in self.LevelData['momada']['models']: name = 'MomadaArea-%s' % _numItems area = loader.loadModel(item) self.momadaAreas.append(area) self.momadaAreaName2areaModel[name] = area attachArea(_numItems) _numItems += 1 self.notify.info('Loaded and attached %s momada areas.' % _numItems) return def unload(self): if self.levelName == 'momada': for area in self.momadaAreas: self.momadaAreas.remove(area) area.removeNode() del area self.momadaAreas = [] self.momadaAreaName2areaModel = {} else: if self.skyUtil: self.skyUtil.stopSky() self.skyUtil = None if self.skyModel: self.skyModel.removeNode() self.skyModel = None if self.levelGeom: self.levelGeom.removeNode() self.levelGeom = None return def cleanup(self): self.momadaAreas = None self.momadaAreaName2areaModel = None self.dnaStore.resetAll() self.dnaStore = None return
class DistributedTutorial(DistributedObject): notify = directNotify.newCategory('DistributedTutorial') GUIDE_NAME = 'Professor Prepostera' GUIDE_START_POS = (5, 10, -0.5) GUIDE_WATCH_POS = (12.4, 27.92, 0) GUIDE_WATCH_HPR = (41.63, 0, 0) GUIDE_INTRO_SPEECH = [ 'Hey, looks like you made it!', 'So, welcome to OToontown.', 'OToontown is short for Old Toontown, or Toontown from the past.', 'Not long ago, Toons used to live in present day Toontown.', 'Unfortunately, the Cogs planned a mega-invasion that was sure to be a complete takeover of Toontown and make all Toons go sad for good.', "There was no way we could have let that happen, so we built a time machine, and sent every Toon back in time to OToontown, where Cogs didn't exist yet.", 'The Cogs completely took over present day Toontown, and turned it into what they wanted it to be - a business metropolis.', 'Toons happily live and play in OToontown now, but we want to learn about present day Toontown...', ' ...or as we now call it, CogTropolis.', "We've built time machines that send Toons back to CogTropolis to fight Cogs and to see what the Cogs have done.", "We know that the Cogs took over Toontown and turned it into a grey business city, but we don't know how they did it.", 'Shopkeepers around OToontown will reward you for finding evidence that may help solve the mystery of how the Cogs turned Toontown into CogTropolis.', 'Before you are able to head to CogTropolis, you need to be trained for battle.', 'The Cogs have become much more skilled battlers and no longer wait for you to throw a gag before attacking you.', 'This is much more difficult for Toons, and it may take some time to get used to.', "I'm going to give you 2 gags to start...", 'A cupcake, and a squirting flower.', 'Equip Gags in your loadout to use by pressing the corresponding key on your keyboard.', 'You can use or throw the Gag that you have equipped by pressing the ALT key.', 'Also, use the Arrow Keys on your keyboard to move, and press CTRL to jump.', "I'm going to summon one of our dummy bots for you to practice battling.", "Click your mouse when you're ready." ] GUIDE_PT2_INFO = [ "Now it'll get a tad bit tougher.", 'This next dummy bot will be walking around.', 'This will test your aiming skills.', "Click your mouse when you're ready." ] GUIDE_PT3_INFO = [ 'This final dummy bot will walk around and try to attack you at times.', 'Defeat this Cog to continue on to the next part of the tutorial.' ] GUIDE_DONE = [ 'Great!', 'Did you know that Cog Invasion Online Alpha allows you to use any Gag that you want?', 'Just use the Gags page in your Shticker Book to swap out the Gags that you want to be able to use!', 'Also during Alpha testing, your Toon will start off with 5000 jellybeans and 100 Laff points.', "If you're looking to fight some Cogs, hop on the Trolley in the playgrounds to be teleported to CogTropolis!", 'Each playground has a different difficulty of Cogs, so be careful!', "You can only fight Cogs in Toontown Central, Minnie's Melodyland, Donald's Dock, and Donald's Dreamland at the moment.", 'You can also visit the Minigame Area using your Shticker Book to play some fun minigames!', 'These games are best to play with other Toons!', 'Remember, if you find any bugs or strange things during gameplay, you can go to the Contact Us page at coginvasion.com to report the issue.', 'Have fun!' ] GUIDE_START_TRAINING = "Alright! Let's do this!" def __init__(self, cr): DistributedObject.__init__(self, cr) self.fsm = ClassicFSM.ClassicFSM('TutorialFSM', [ State.State('off', self.enterOff, self.exitOff), State.State('newPlayerEmerge', self.enterPlayerEmerge, self.exitPlayerEmerge, ['off', 'introSpeech']), State.State('introSpeech', self.enterGuideIntroSpeech, self.exitGuideIntroSpeech, ['off', 'introSpeech2Training']), State.State('introSpeech2Training', self.enterIntroSpeech2Training, self.exitIntroSpeech2Training, ['off', 'training1']), State.State('training1', self.enterTrainingPT1, self.exitTrainingPT1, ['off', 'training2info']), State.State('training2info', self.enterTraining2Info, self.exitTraining2Info, ['off', 'training2']), State.State('training2', self.enterTrainingPT2, self.exitTrainingPT2, ['off', 'training3info']), State.State('training3info', self.enterTraining3Info, self.exitTraining3Info, ['off', 'training3']), State.State('training3', self.enterTrainingPT3, self.exitTrainingPT3, ['off', 'trainingDone']), State.State('trainingDone', self.enterTrainingDone, self.exitTrainingDone, ['off', 'leaveTutorial']), State.State('leaveTutorial', self.enterLeaveTutorial, self.exitLeaveTutorial, ['off']) ], 'off', 'off') self.fsm.enterInitialState() self.dnaStore = DNAStorage() self.streetGeom = None self.sky = None self.skyUtil = SkyUtil() self.guide = None self.music = None self.battleMusic = None self.playerCamPos = None self.playerCamHpr = None return def enterOff(self): pass def exitOff(self): pass def introStuff(self): base.localAvatar.getGeomNode().hide() base.localAvatar.setPos(0, 0, -0.5) base.localAvatar.setHpr(0, 0, 0) self.guide.setPos(self.GUIDE_START_POS) self.guide.headsUp(base.localAvatar) base.localAvatar.attachCamera() def enterPlayerEmerge(self): self.introStuff() self.guide.loop('neutral') base.transitions.irisIn() base.taskMgr.doMethodLater(1.0, self.__playerEmerge, 'playerEmergeTask') def __playerEmerge(self, task): base.localAvatar.setAnimState('teleportIn', callback=self.__playerEmergeFinished) return Task.done def __playerEmergeFinished(self): base.localAvatar.setAnimState('neutral') self.fsm.request('introSpeech') def exitPlayerEmerge(self): base.localAvatar.detachCamera() base.taskMgr.remove('playerEmergeTask') base.transitions.noTransitions() def enterGuideIntroSpeech(self): base.localAvatar.attachCamera() renderPos = base.camera.getPos(render) renderHpr = base.camera.getHpr(render) base.localAvatar.detachCamera() endPos = base.localAvatar.getPos(render) + (0, 0, 4) base.camera.setPos(endPos) base.camera.lookAt(self.guide, 0, 0, 3) endHpr = base.camera.getHpr(render) base.camera.setPos(renderPos) base.camera.setHpr(renderHpr) self.chatIndex = -1 self.doNextIntroSpeech() self.camMoveTrack = Sequence( Parallel( LerpPosInterval(base.camera, duration=3.0, pos=endPos, startPos=renderPos, blendType='easeOut'), LerpQuatInterval(base.camera, duration=3.0, hpr=endHpr, startHpr=renderHpr, blendType='easeOut')), Func(base.localAvatar.getGeomNode().hide)) self.camMoveTrack.start() def __finishedReadingGuideIntroSpeech(self): self.guide.autoClearChat = True self.guide.setChat(self.GUIDE_START_TRAINING) self.fsm.request('introSpeech2Training') def doNextIntroSpeech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_INTRO_SPEECH): self.__finishedReadingGuideIntroSpeech() return self.guide.setChat(self.GUIDE_INTRO_SPEECH[self.chatIndex]) Sequence(Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextIntroSpeech)).start() def exitGuideIntroSpeech(self): self.camMoveTrack.finish() base.localAvatar.getGeomNode().show() del self.camMoveTrack del self.chatIndex def enterIntroSpeech2Training(self): startCamPos = base.camera.getPos(render) startCamHpr = base.camera.getHpr(render) base.camera.setPosHpr(0, 0, 0, 0, 0, 0) base.localAvatar.attachCamera() endCamPos = base.camera.getPos(render) endCamHpr = base.camera.getHpr(render) base.localAvatar.detachCamera() startHpr = self.guide.getHpr(render) self.guide.headsUp(self.GUIDE_WATCH_POS) endHpr = self.guide.getHpr(render) self.guide.loop('run') self.camMoveIval = Parallel( LerpPosInterval(base.camera, duration=2.0, pos=endCamPos, startPos=startCamPos, blendType='easeOut'), LerpQuatInterval(base.camera, duration=2.0, hpr=endCamHpr, startHpr=startCamHpr, blendType='easeOut'), Sequence( LerpPosInterval(self.guide, duration=2.0, pos=self.GUIDE_WATCH_POS, startPos=self.guide.getPos(render)), Func(self.guide.loop, 'walk'), LerpHprInterval(self.guide, duration=1.0, hpr=self.GUIDE_WATCH_HPR, startHpr=endHpr), Func(self.guide.loop, 'neutral')), LerpHprInterval(self.guide, duration=1.0, hpr=endHpr, startHpr=startHpr)) self.camMoveIval.setDoneEvent('introSpeech2TrainingDone') self.acceptOnce('introSpeech2TrainingDone', self.__handleIS2TDone) self.camMoveIval.start() def __handleIS2TDone(self): self.fsm.request('training1') def exitIntroSpeech2Training(self): self.ignore('introSpeech2TrainingDone') self.camMoveIval.finish() del self.camMoveIval def makeWhisper(self, msg): whisper = WhisperPopup(msg, CIGlobals.getToonFont(), ChatGlobals.WTSystem) whisper.manage(base.marginManager) def enterTrainingPT1(self): self.music.stop() base.playMusic(self.battleMusic, volume=0.8, looping=1) self.sendUpdate('makeSuit', [0]) base.localAvatar.startPosHprBroadcast() base.localAvatar.d_broadcastPositionNow() base.localAvatar.startBlink() base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.collisionsOn() base.localAvatar.enableAvatarControls() base.localAvatar.enableGags(1) base.localAvatar.showGagButton() base.localAvatar.startTrackAnimToSpeed() self.makeWhisper( 'This should be pretty simple. Just throw a gag at this dummy bot to defeat it.' ) def suitNoHealth(self, index): if index == 0: self.makeWhisper( ('Good job, {0}!').format(base.localAvatar.getName())) else: if index == 1: self.makeWhisper("Wow, you're doing very well!") def suitExploded(self, index): if index == 0: self.makeWhisper( 'Pick up the jellybean that he dropped. You can use them to buy more gags for your Toon.' ) self.battleMusic.stop() base.playMusic(self.music, looping=1, volume=0.8) def pickedUpJellybean(self): if self.fsm.getCurrentState().getName() == 'training1': self.fsm.request('training2info') else: if self.fsm.getCurrentState().getName() == 'training2': self.fsm.request('training3info') else: if self.fsm.getCurrentState().getName() == 'training3': self.fsm.request('trainingDone') def exitTrainingPT1(self): base.localAvatar.lastState = None base.localAvatar.disableAvatarControls() base.localAvatar.detachCamera() base.localAvatar.stopSmartCamera() base.localAvatar.stopPosHprBroadcast() base.localAvatar.stopBlink() base.localAvatar.collisionsOff() base.localAvatar.controlManager.placeOnFloor() base.localAvatar.disableGags() base.localAvatar.stopTrackAnimToSpeed() base.localAvatar.hideGagButton() return def enterTraining2Info(self): base.camera.setPos(3.09, 37.16, 3.93) base.camera.setHpr(225, 0, 0) self.guide.autoClearChat = False self.chatIndex = -1 self.doNextTraining2Speech() def __finishedReadingGuideTraining2Speech(self): self.guide.autoClearChat = True self.guide.clearChat() self.fsm.request('training2') def doNextTraining2Speech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_PT2_INFO): self.__finishedReadingGuideTraining2Speech() return self.guide.setChat(self.GUIDE_PT2_INFO[self.chatIndex]) Sequence( Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextTraining2Speech)).start() def exitTraining2Info(self): base.camera.setPosHpr(0, 0, 0, 0, 0, 0) del self.chatIndex def enterTrainingPT2(self): self.music.stop() base.playMusic(self.battleMusic, volume=0.8, looping=1) self.sendUpdate('makeSuit', [1]) base.localAvatar.startPosHprBroadcast() base.localAvatar.d_broadcastPositionNow() base.localAvatar.startBlink() base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.collisionsOn() base.localAvatar.enableAvatarControls() base.localAvatar.enableGags(1) base.localAvatar.showGagButton() base.localAvatar.startTrackAnimToSpeed() def exitTrainingPT2(self): base.localAvatar.lastState = None base.localAvatar.disableAvatarControls() base.localAvatar.detachCamera() base.localAvatar.stopSmartCamera() base.localAvatar.stopPosHprBroadcast() base.localAvatar.stopBlink() base.localAvatar.collisionsOff() base.localAvatar.controlManager.placeOnFloor() base.localAvatar.disableGags() base.localAvatar.stopTrackAnimToSpeed() base.localAvatar.hideGagButton() return def enterTraining3Info(self): base.camera.setPos(3.09, 37.16, 3.93) base.camera.setHpr(225, 0, 0) self.guide.autoClearChat = False self.chatIndex = -1 self.doNextTraining3Speech() def __finishedReadingGuideTraining3Speech(self): self.guide.autoClearChat = True self.guide.clearChat() self.fsm.request('training3') def doNextTraining3Speech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_PT3_INFO): self.__finishedReadingGuideTraining3Speech() return self.guide.setChat(self.GUIDE_PT3_INFO[self.chatIndex]) Sequence( Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextTraining3Speech)).start() def exitTraining3Info(self): base.camera.setPosHpr(0, 0, 0, 0, 0, 0) del self.chatIndex def enterTrainingPT3(self): self.music.stop() base.playMusic(self.battleMusic, volume=0.8, looping=1) self.sendUpdate('makeSuit', [2]) base.localAvatar.startPosHprBroadcast() base.localAvatar.d_broadcastPositionNow() base.localAvatar.startBlink() base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.collisionsOn() base.localAvatar.enableAvatarControls() base.localAvatar.enableGags(1) base.localAvatar.showGagButton() base.localAvatar.startTrackAnimToSpeed() def exitTrainingPT3(self): base.localAvatar.lastState = None base.localAvatar.disableAvatarControls() base.localAvatar.detachCamera() base.localAvatar.stopSmartCamera() base.localAvatar.stopPosHprBroadcast() base.localAvatar.stopBlink() base.localAvatar.collisionsOff() base.localAvatar.controlManager.placeOnFloor() base.localAvatar.disableGags() base.localAvatar.stopTrackAnimToSpeed() base.localAvatar.hideGagButton() return def enterTrainingDone(self): base.camera.setPos(3.09, 37.16, 3.93) base.camera.setHpr(225, 0, 0) self.guide.autoClearChat = False self.chatIndex = -1 self.doNextTrainingDoneSpeech() def __finishedReadingGuideTrainingDoneSpeech(self): self.guide.autoClearChat = True self.guide.clearChat() self.fsm.request('leaveTutorial') def doNextTrainingDoneSpeech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_DONE): self.__finishedReadingGuideTrainingDoneSpeech() return self.guide.setChat(self.GUIDE_DONE[self.chatIndex]) Sequence( Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextTrainingDoneSpeech)).start() def exitTrainingDone(self): base.camera.setPosHpr(0, 0, 0, 0, 0, 0) del self.chatIndex def enterLeaveTutorial(self): base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.b_setAnimState('teleportOut', callback=self.__teleOutDone) def __teleOutDone(self): zoneId = CIGlobals.ToontownCentralId hoodId = CIGlobals.ToontownCentral whereName = 'playground' avId = base.localAvatar.doId loaderName = 'safeZoneLoader' self.sendUpdate('finishedTutorial') self.cr.playGame.load() self.cr.playGame.enter(hoodId, zoneId, base.localAvatar.doId) def exitLeaveTutorial(self): base.localAvatar.stopSmartCamera() base.localAvatar.detachCamera() def announceGenerate(self): DistributedObject.announceGenerate(self) base.transitions.fadeScreen(0.0) self.guide = Toon(base.cr) self.guide.autoClearChat = False self.guide.parseDNAStrand(NPCGlobals.NPC_DNA[self.GUIDE_NAME]) self.guide.setName(self.GUIDE_NAME) self.guide.generateToon() self.guide.nametag.setNametagColor( NametagGlobals.NametagColors[NametagGlobals.CCNPC]) self.guide.nametag.setActive(0) self.guide.nametag.updateAll() self.guide.startBlink() self.guide.reparentTo(render) base.localAvatar.reparentTo(render) loader.loadDNAFile(self.dnaStore, 'phase_3.5/dna/storage_tutorial.pdna') node = loader.loadDNAFile(self.dnaStore, 'phase_3.5/dna/tutorial_street.pdna') if node.getNumParents() == 1: self.streetGeom = NodePath(node.getParent(0)) self.streetGeom.reparentTo(hidden) else: self.streetGeom = hidden.attachNewNode(node) self.streetGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.streetGeom.prepareScene(gsg) self.streetGeom.reparentTo(render) self.streetGeom.setPos(20.5, -20, 0) self.streetGeom.setH(90) self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam') self.skyUtil.startSky(self.sky) self.sky.reparentTo(camera) ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.sky.node().setEffect(ce) self.music = base.loadMusic('phase_3.5/audio/bgm/TC_SZ.mid') base.playMusic(self.music, volume=0.8, looping=1) self.battleMusic = base.loadMusic( 'phase_3.5/audio/bgm/encntr_general_bg.mid') self.fsm.request('newPlayerEmerge') base.localAvatar.inTutorial = True def disable(self): self.fsm.requestFinalState() del self.fsm if self.guide: self.guide.disable() self.guide.delete() self.guide = None if self.streetGeom: self.streetGeom.removeNode() self.streetGeom = None if self.sky: self.sky.removeNode() self.sky = None if self.music: self.music.stop() self.music = None if self.battleMusic: self.battleMusic.stop() self.battleMusic = None self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_textures() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() self.dnaStore = None self.skyUtil = None base.localAvatar.inTutorial = False DistributedObject.disable(self) return
class SafeZoneLoader(StateData): notify = directNotify.newCategory("SafeZoneLoader") def __init__(self, hood, parentFSMState, doneEvent): StateData.__init__(self, doneEvent) self.hood = hood self.parentFSMState = parentFSMState self.fsm = ClassicFSM('safeZoneLoader', [ State('off', self.enterOff, self.exitOff), State('playground', self.enterPlayground, self.exitPlayground, ['quietZone']), State('toonInterior', self.enterToonInterior, self.exitToonInterior, ['quietZone']), State('quietZone', self.enterQuietZone, self.exitQuietZone, ['playground', 'toonInterior']) ], 'off', 'off') self.placeDoneEvent = 'placeDone' self.place = None self.playground = None self.nodeList = [] self.linkTunnels = [] self.szHolidayDNAFile = None self.animatedFish = None self.safeZoneSong = '' self.interiorSong = '' return def doBaseOptimizations(self): # Performs base optimizations that all playgrounds can benefit from. # Combines all flat walls together, optimizes all landmark buildings, # tunnels, trees, fishing docks. # # Any optimizations for a specific playground should be done in # doFlatten() in that playground's SafeZoneLoader. flats = self.geom.attachNewNode('flats') for np in self.geom.findAllMatches("**/sz0:*_DNARoot"): np.wrtReparentTo(flats) for np in self.geom.findAllMatches("**/tb0:*_DNARoot"): np.wrtReparentTo(flats) for np in self.geom.findAllMatches("**/*random*_DNARoot"): np.wrtReparentTo(flats) CIGlobals.removeDNACodes(flats) flats.clearModelNodes() flats.flattenStrong() CIGlobals.moveChildren(flats, self.geom) tunnels = self.geom.findAllMatches("**/*linktunnel*") for tunnel in tunnels: tunnel.flattenStrong() for landmark in self.geom.findAllMatches("**/*toon_landmark*_DNARoot"): CIGlobals.removeDNACodes(landmark) landmark.flattenStrong() signs = self.geom.attachNewNode("signs") CIGlobals.moveNodes(self.geom, "*neighborhood_sign*_DNARoot", signs) #for sign in signs.getChildren(): #sign.clearTransform() CIGlobals.removeDNACodes(signs) signs.clearModelNodes() signs.flattenStrong() CIGlobals.moveChildren(signs, self.geom) fish = self.geom.attachNewNode("fishspots") CIGlobals.moveNodes(self.geom, "fishing_spot_DNARoot", fish) CIGlobals.removeDNACodes(fish) fish.clearModelNodes() fish.flattenStrong() CIGlobals.moveChildren(fish, self.geom) trees = self.geom.attachNewNode("trees") for np in self.geom.findAllMatches("**/*prop_tree*_DNARoot"): np.wrtReparentTo(trees) CIGlobals.removeDNACodes(trees) trees.clearModelNodes() trees.flattenStrong() CIGlobals.moveChildren(trees, self.geom) def findAndMakeLinkTunnels(self): for tunnel in self.geom.findAllMatches('**/*linktunnel*'): dnaRootStr = tunnel.getName() link = LinkTunnel.SafeZoneLinkTunnel(tunnel, dnaRootStr) self.linkTunnels.append(link) def load(self, flattenNow=True): StateData.load(self) self.createSafeZone(self.dnaFile, flattenNow) children = self.geom.findAllMatches('**/*doorFrameHole*') for child in children: child.hide() self.parentFSMState.addChild(self.fsm) def unload(self): StateData.unload(self) base.waterReflectionMgr.clearWaterNodes() if self.animatedFish: self.animatedFish.cleanup() self.animatedFish.removeNode() self.animatedFish = None if self.linkTunnels is not None: for link in self.linkTunnels: link.cleanup() self.linkTunnels = None if self.nodeList is not None: for node in self.nodeList: node.removeNode() self.nodeList = None self.parentFSMState.removeChild(self.fsm) del self.parentFSMState del self.animatedFish base.disableAndRemovePhysicsNodes(self.geom) self.geom.removeNode() del self.geom del self.fsm del self.hood del self.playground del self.safeZoneSong del self.interiorSong self.ignoreAll() #CIGlobals.doSceneCleanup() def enter(self, requestStatus): StateData.enter(self) if base.localAvatar.zoneId < ZoneUtil.DynamicZonesBegin: self.findAndMakeLinkTunnels() self.fsm.enterInitialState() messenger.send('enterSafeZone') self.setState(requestStatus['where'], requestStatus) # Delete party gate partyGate = self.geom.find('**/prop_party_gate_DNARoot') if not partyGate.isEmpty(): partyGate.removeNode() del partyGate # Delete pet shop petShop = self.geom.find('**/*pet_shop_DNARoot*') if not petShop.isEmpty(): fish = petShop.find( '**/animated_prop_PetShopFishAnimatedProp_DNARoot') if fish: """ self.animatedFish = Actor('phase_4/models/props/exteriorfish-zero.bam', {'chan' : 'phase_4/models/props/exteriorfish-swim.bam'}) #self.animatedFish.reparentTo(hidden)#petShop) #self.animatedFish.setPos(fish.getPos()) #self.animatedFish.loop('chan') #self.animatedFish.cleanup() """ fish.removeNode() #petShop.removeNode() #del petShop CIGlobals.preRenderScene(self.geom) def exit(self): StateData.exit(self) messenger.send('exitSafeZone') for link in self.linkTunnels: link.cleanup() if self.animatedFish: self.animatedFish.stop('chan') self.linkTunnels = [] def setState(self, stateName, requestStatus): self.fsm.request(stateName, [requestStatus]) def createSafeZone(self, dnaFile, flattenNow=True): if self.szStorageDNAFile: if isinstance(self.szStorageDNAFile, list): # We are loading multiple sz storages. for i in xrange(len(self.szStorageDNAFile)): loader.loadDNAFile(self.hood.dnaStore, self.szStorageDNAFile[i]) else: loader.loadDNAFile(self.hood.dnaStore, self.szStorageDNAFile) if self.szHolidayDNAFile: loader.loadDNAFile(self.hood.dnaStore, self.szHolidayDNAFile) node = loader.loadDNAFile(self.hood.dnaStore, dnaFile) if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(node) CIGlobals.replaceDecalEffectsWithDepthOffsetAttrib(self.geom) if flattenNow: self.doFlatten() base.createPhysicsNodes(self.geom) CIGlobals.preRenderScene(self.geom) def doFlatten(self): self.doBaseOptimizations() self.makeDictionaries(self.hood.dnaStore) self.geom.flattenMedium() def makeDictionaries(self, dnaStore): self.nodeList = [] for i in xrange(dnaStore.getNumDNAVisGroups()): groupFullName = dnaStore.getDNAVisGroupName(i) #groupName = base.cr.hoodMgr.extractGroupName(groupFullName) groupNode = self.geom.find('**/' + groupFullName) if groupNode.isEmpty(): self.notify.error('Could not find visgroup') groupNode.flattenMedium() self.nodeList.append(groupNode) self.hood.dnaStore.resetPlaceNodes() self.hood.dnaStore.resetDNAGroups() self.hood.dnaStore.resetDNAVisGroups() self.hood.dnaStore.resetDNAVisGroupsAI() def enterPlayground(self, requestStatus): try: self.hood.stopSuitEffect() except: pass self.acceptOnce(self.placeDoneEvent, self.handlePlaygroundDone) self.place = self.playground(self, self.fsm, self.placeDoneEvent) self.place.load() def exitPlayground(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handlePlaygroundDone(self): status = self.place.doneStatus if self.hood.isSameHood(status) and status[ 'loader'] == 'safeZoneLoader' and not status['where'] in [ 'minigame' ]: self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterToonInterior(self, requestStatus): self.acceptOnce(self.placeDoneEvent, self.handleToonInteriorDone) self.place = ToonInterior.ToonInterior(self, self.fsm, self.placeDoneEvent) self.place.load() def enterThePlace(self, requestStatus): base.cr.playGame.setPlace(self.place) if self.place is not None: self.place.enter(requestStatus) def exitToonInterior(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handleToonInteriorDone(self): status = self.place.doneStatus if (status['loader'] == 'safeZoneLoader' and self.hood.isSameHood(status) and status['shardId'] is None or status['how'] == 'doorOut'): self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterQuietZone(self, requestStatus): self.fsm.request(requestStatus['where'], [requestStatus], exitCurrent=0) self.quietZoneDoneEvent = uniqueName('quietZoneDone') self.acceptOnce(self.quietZoneDoneEvent, self.handleQuietZoneDone) self.quietZoneStateData = QuietZoneState(self.quietZoneDoneEvent) self.quietZoneStateData.load() self.quietZoneStateData.enter(requestStatus) def exitQuietZone(self): self.ignore(self.quietZoneDoneEvent) del self.quietZoneDoneEvent self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None return def handleQuietZoneDone(self): status = self.quietZoneStateData.getDoneStatus() self.exitQuietZone() if status['where'] == 'estate' or status['loader'] == 'townLoader': self.doneStatus = status messenger.send(self.doneEvent) else: self.enterThePlace(status) def enterOff(self): pass def exitOff(self): pass
class DistributedTutorial(DistributedObject): notify = directNotify.newCategory('DistributedTutorial') GUIDE_NAME = 'Professor Prepostera' GUIDE_START_POS = (5, 10, -0.5) GUIDE_WATCH_POS = (12.4, 27.92, 0) GUIDE_WATCH_HPR = (41.63, 0, 0) GUIDE_INTRO_SPEECH = ['Hey, looks like you made it!', 'So, welcome to OToontown.', 'OToontown is short for Old Toontown, or Toontown from the past.', 'Not long ago, Toons used to live present day Toontown.', 'Unfortunately, the Cogs planned a mega-invasion that was sure to be a complete takeover of Toontown and make all Toons go sad for good.', "There was no way we could have let that happen, so we built a time machine, and sent every Toon back in time to OToontown, where Cogs didn't exist yet.", 'The Cogs completely took over present day Toontown, and turned it into what they wanted it to be - a business metropolis.', 'Toons happily live and play in OToontown now, but we want to learn about present day Toontown...', ' ...or as we now call it, CogTropolis.', "We've built time machines that send Toons back to CogTropolis to fight Cogs and to see what the Cogs have done.", "We know that the Cogs took over Toontown and turned it into a grey business city, but we don't know how they did it.", 'Shopkeepers around OToontown will reward you for finding evidence that may help solve the mystery of how the Cogs turned Toontown into CogTropolis.', 'Before you are able to head to CogTropolis, you need to be trained for battle.', 'The Cogs have become much more skilled battlers and no longer wait for you to throw a gag before attacking you.', 'This is much more difficult for Toons, and it may take some time to get used to.', "I'm going to give you 4 gags to start...", 'A Toon-Up megaphone, a cupcake, a fruit pie slice, and a cream pie slice.', 'Equip Gags in your loadout to use by pressing the corresponding key on your keyboard.', 'You can use or throw the Gag that you have equipped by pressing the Delete key...', ' ...or by pressing the Throw Gag button at the top of your screen.', 'Also, use the Arrow Keys on your keyboard to move, and press CTRL to jump.', "I'm going to summon one of our dummy bots for you to practice battling.", "Click your mouse when you're ready."] GUIDE_PT2_INFO = ["Now it'll get a tad bit tougher.", 'This next dummy bot will be walking around.', 'This will test your aiming skills.', "Click your mouse when you're ready."] GUIDE_PT3_INFO = ['This final dummy bot will walk around and try to attack you at times.', 'Defeat this Cog, and you should be ready to go.'] GUIDE_DONE = ['Wow, you did great!', "You're definitely ready for battle in CogTropolis.", 'Click your mouse to head to OToontown.'] GUIDE_START_TRAINING = "Alright! Let's do this!" def __init__(self, cr): DistributedObject.__init__(self, cr) self.fsm = ClassicFSM.ClassicFSM('TutorialFSM', [State.State('off', self.enterOff, self.exitOff), State.State('newPlayerEmerge', self.enterPlayerEmerge, self.exitPlayerEmerge, ['off', 'introSpeech']), State.State('introSpeech', self.enterGuideIntroSpeech, self.exitGuideIntroSpeech, ['off', 'introSpeech2Training']), State.State('introSpeech2Training', self.enterIntroSpeech2Training, self.exitIntroSpeech2Training, ['off', 'training1']), State.State('training1', self.enterTrainingPT1, self.exitTrainingPT1, ['off', 'training2info']), State.State('training2info', self.enterTraining2Info, self.exitTraining2Info, ['off', 'training2']), State.State('training2', self.enterTrainingPT2, self.exitTrainingPT2, ['off', 'training3info']), State.State('training3info', self.enterTraining3Info, self.exitTraining3Info, ['off', 'training3']), State.State('training3', self.enterTrainingPT3, self.exitTrainingPT3, ['off', 'trainingDone']), State.State('trainingDone', self.enterTrainingDone, self.exitTrainingDone, ['off', 'leaveTutorial']), State.State('leaveTutorial', self.enterLeaveTutorial, self.exitLeaveTutorial, ['off'])], 'off', 'off') self.fsm.enterInitialState() self.dnaStore = DNAStorage() self.streetGeom = None self.sky = None self.skyUtil = SkyUtil() self.guide = None self.music = None self.battleMusic = None self.playerCamPos = None self.playerCamHpr = None return def enterOff(self): pass def exitOff(self): pass def introStuff(self): base.localAvatar.getGeomNode().hide() base.localAvatar.setPos(0, 0, -0.5) base.localAvatar.setHpr(0, 0, 0) self.guide.setPos(self.GUIDE_START_POS) self.guide.headsUp(base.localAvatar) base.localAvatar.attachCamera() def enterPlayerEmerge(self): self.introStuff() self.guide.loop('neutral') base.transitions.irisIn() base.taskMgr.doMethodLater(1.0, self.__playerEmerge, 'playerEmergeTask') def __playerEmerge(self, task): base.localAvatar.setAnimState('teleportIn', callback=self.__playerEmergeFinished) return Task.done def __playerEmergeFinished(self): base.localAvatar.setAnimState('neutral') self.fsm.request('introSpeech') def exitPlayerEmerge(self): base.localAvatar.detachCamera() base.taskMgr.remove('playerEmergeTask') base.transitions.noTransitions() def enterGuideIntroSpeech(self): base.localAvatar.attachCamera() renderPos = base.camera.getPos(render) renderHpr = base.camera.getHpr(render) base.localAvatar.detachCamera() endPos = base.localAvatar.getPos(render) + (0, 0, 4) base.camera.setPos(endPos) base.camera.lookAt(self.guide, 0, 0, 3) endHpr = base.camera.getHpr(render) base.camera.setPos(renderPos) base.camera.setHpr(renderHpr) self.chatIndex = -1 self.doNextIntroSpeech() self.camMoveTrack = Sequence(Parallel(LerpPosInterval(base.camera, duration=3.0, pos=endPos, startPos=renderPos, blendType='easeOut'), LerpQuatInterval(base.camera, duration=3.0, hpr=endHpr, startHpr=renderHpr, blendType='easeOut')), Func(base.localAvatar.getGeomNode().hide)) self.camMoveTrack.start() def __finishedReadingGuideIntroSpeech(self): self.guide.autoClearChat = True self.guide.setChat(self.GUIDE_START_TRAINING) self.fsm.request('introSpeech2Training') def doNextIntroSpeech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_INTRO_SPEECH): self.__finishedReadingGuideIntroSpeech() return self.guide.setChat(self.GUIDE_INTRO_SPEECH[self.chatIndex]) Sequence(Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextIntroSpeech)).start() def exitGuideIntroSpeech(self): self.camMoveTrack.finish() base.localAvatar.getGeomNode().show() del self.camMoveTrack del self.chatIndex def enterIntroSpeech2Training(self): startCamPos = base.camera.getPos(render) startCamHpr = base.camera.getHpr(render) base.camera.setPosHpr(0, 0, 0, 0, 0, 0) base.localAvatar.attachCamera() endCamPos = base.camera.getPos(render) endCamHpr = base.camera.getHpr(render) base.localAvatar.detachCamera() startHpr = self.guide.getHpr(render) self.guide.headsUp(self.GUIDE_WATCH_POS) endHpr = self.guide.getHpr(render) self.guide.loop('run') self.camMoveIval = Parallel(LerpPosInterval(base.camera, duration=2.0, pos=endCamPos, startPos=startCamPos, blendType='easeOut'), LerpQuatInterval(base.camera, duration=2.0, hpr=endCamHpr, startHpr=startCamHpr, blendType='easeOut'), Sequence(LerpPosInterval(self.guide, duration=2.0, pos=self.GUIDE_WATCH_POS, startPos=self.guide.getPos(render)), Func(self.guide.loop, 'walk'), LerpHprInterval(self.guide, duration=1.0, hpr=self.GUIDE_WATCH_HPR, startHpr=endHpr), Func(self.guide.loop, 'neutral')), LerpHprInterval(self.guide, duration=1.0, hpr=endHpr, startHpr=startHpr)) self.camMoveIval.setDoneEvent('introSpeech2TrainingDone') self.acceptOnce('introSpeech2TrainingDone', self.__handleIS2TDone) self.camMoveIval.start() def __handleIS2TDone(self): self.fsm.request('training1') def exitIntroSpeech2Training(self): self.ignore('introSpeech2TrainingDone') self.camMoveIval.finish() del self.camMoveIval def enterTrainingPT1(self): self.music.stop() base.playMusic(self.battleMusic, volume=0.8, looping=1) self.sendUpdate('makeSuit', [0]) base.localAvatar.startPosHprBroadcast() base.localAvatar.d_broadcastPositionNow() base.localAvatar.startBlink() base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.collisionsOn() base.localAvatar.enableAvatarControls() base.localAvatar.enablePies(1) Whisper().createSystemMessage('This should be pretty simple. Just throw a gag at this dummy bot to defeat it.') def suitNoHealth(self, index): if index == 0: Whisper().createSystemMessage('Good job, {0}!'.format(base.localAvatar.getName())) elif index == 1: Whisper().createSystemMessage("Wow, you're doing very well!") def suitExploded(self, index): if index == 0: Whisper().createSystemMessage('Pick up the jellybean that he dropped. You can use them to buy more gags for your Toon.') self.battleMusic.stop() base.playMusic(self.music, looping=1, volume=0.8) def pickedUpJellybean(self): if self.fsm.getCurrentState().getName() == 'training1': self.fsm.request('training2info') elif self.fsm.getCurrentState().getName() == 'training2': self.fsm.request('training3info') elif self.fsm.getCurrentState().getName() == 'training3': self.fsm.request('trainingDone') def exitTrainingPT1(self): base.localAvatar.lastState = None base.localAvatar.disableAvatarControls() base.localAvatar.detachCamera() base.localAvatar.stopSmartCamera() base.localAvatar.stopPosHprBroadcast() base.localAvatar.stopBlink() base.localAvatar.collisionsOff() base.localAvatar.controlManager.placeOnFloor() base.localAvatar.disablePies() return def enterTraining2Info(self): base.camera.setPos(3.09, 37.16, 3.93) base.camera.setHpr(225, 0, 0) self.guide.autoClearChat = False self.chatIndex = -1 self.doNextTraining2Speech() def __finishedReadingGuideTraining2Speech(self): self.guide.autoClearChat = True self.guide.clearChat() self.fsm.request('training2') def doNextTraining2Speech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_PT2_INFO): self.__finishedReadingGuideTraining2Speech() return self.guide.setChat(self.GUIDE_PT2_INFO[self.chatIndex]) Sequence(Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextTraining2Speech)).start() def exitTraining2Info(self): base.camera.setPosHpr(0, 0, 0, 0, 0, 0) del self.chatIndex def enterTrainingPT2(self): self.music.stop() base.playMusic(self.battleMusic, volume=0.8, looping=1) self.sendUpdate('makeSuit', [1]) base.localAvatar.startPosHprBroadcast() base.localAvatar.d_broadcastPositionNow() base.localAvatar.startBlink() base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.collisionsOn() base.localAvatar.enableAvatarControls() base.localAvatar.enablePies(1) def exitTrainingPT2(self): base.localAvatar.lastState = None base.localAvatar.disableAvatarControls() base.localAvatar.detachCamera() base.localAvatar.stopSmartCamera() base.localAvatar.stopPosHprBroadcast() base.localAvatar.stopBlink() base.localAvatar.collisionsOff() base.localAvatar.controlManager.placeOnFloor() base.localAvatar.disablePies() return def enterTraining3Info(self): base.camera.setPos(3.09, 37.16, 3.93) base.camera.setHpr(225, 0, 0) self.guide.autoClearChat = False self.chatIndex = -1 self.doNextTraining3Speech() def __finishedReadingGuideTraining3Speech(self): self.guide.autoClearChat = True self.guide.clearChat() self.fsm.request('training3') def doNextTraining3Speech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_PT3_INFO): self.__finishedReadingGuideTraining3Speech() return self.guide.setChat(self.GUIDE_PT3_INFO[self.chatIndex]) Sequence(Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextTraining3Speech)).start() def exitTraining3Info(self): base.camera.setPosHpr(0, 0, 0, 0, 0, 0) del self.chatIndex def enterTrainingPT3(self): self.music.stop() base.playMusic(self.battleMusic, volume=0.8, looping=1) self.sendUpdate('makeSuit', [2]) base.localAvatar.startPosHprBroadcast() base.localAvatar.d_broadcastPositionNow() base.localAvatar.startBlink() base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.collisionsOn() base.localAvatar.enableAvatarControls() base.localAvatar.enablePies(1) def exitTrainingPT3(self): base.localAvatar.lastState = None base.localAvatar.disableAvatarControls() base.localAvatar.detachCamera() base.localAvatar.stopSmartCamera() base.localAvatar.stopPosHprBroadcast() base.localAvatar.stopBlink() base.localAvatar.collisionsOff() base.localAvatar.controlManager.placeOnFloor() base.localAvatar.disablePies() return def enterTrainingDone(self): base.camera.setPos(3.09, 37.16, 3.93) base.camera.setHpr(225, 0, 0) self.guide.autoClearChat = False self.chatIndex = -1 self.doNextTrainingDoneSpeech() def __finishedReadingGuideTrainingDoneSpeech(self): self.guide.autoClearChat = True self.guide.clearChat() self.fsm.request('leaveTutorial') def doNextTrainingDoneSpeech(self): self.chatIndex += 1 if self.chatIndex >= len(self.GUIDE_DONE): self.__finishedReadingGuideTrainingDoneSpeech() return self.guide.setChat(self.GUIDE_DONE[self.chatIndex]) Sequence(Wait(0.1), Func(self.acceptOnce, 'mouse1-up', self.doNextTrainingDoneSpeech)).start() def exitTrainingDone(self): base.camera.setPosHpr(0, 0, 0, 0, 0, 0) del self.chatIndex def enterLeaveTutorial(self): base.localAvatar.attachCamera() base.localAvatar.startSmartCamera() base.localAvatar.b_setAnimState('teleportOut', callback=self.__teleOutDone) def __teleOutDone(self): zoneId = CIGlobals.ToontownCentralId hoodId = CIGlobals.ToontownCentral whereName = 'playground' avId = base.localAvatar.doId loaderName = 'safeZoneLoader' self.sendUpdate('finishedTutorial') self.cr.playGame.fsm.request('quietZone', [{'zoneId': zoneId, 'hoodId': hoodId, 'where': whereName, 'how': 'teleportIn', 'avId': avId, 'shardId': None, 'loader': loaderName}]) return def exitLeaveTutorial(self): base.localAvatar.stopSmartCamera() base.localAvatar.detachCamera() def announceGenerate(self): DistributedObject.announceGenerate(self) base.transitions.fadeScreen(0.0) self.guide = Toon(base.cr) self.guide.autoClearChat = False self.guide.parseDNAStrand(NPCGlobals.NPC_DNA[self.GUIDE_NAME]) self.guide.setName(self.GUIDE_NAME) self.guide.generateToon() self.guide.startBlink() self.guide.reparentTo(render) base.localAvatar.reparentTo(render) loader.loadDNAFile(self.dnaStore, 'phase_3.5/dna/storage_tutorial.dna') node = loader.loadDNAFile(self.dnaStore, 'phase_3.5/dna/tutorial_street.dna') if node.getNumParents() == 1: self.streetGeom = NodePath(node.getParent(0)) self.streetGeom.reparentTo(hidden) else: self.streetGeom = hidden.attachNewNode(node) self.streetGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.streetGeom.prepareScene(gsg) self.streetGeom.reparentTo(render) self.streetGeom.setPos(20.5, -20, 0) self.streetGeom.setH(90) self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam') self.skyUtil.startSky(self.sky) self.sky.reparentTo(camera) ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.sky.node().setEffect(ce) self.music = base.loadMusic('phase_3.5/audio/bgm/TC_SZ.mid') base.playMusic(self.music, volume=0.8, looping=1) self.battleMusic = base.loadMusic('phase_3.5/audio/bgm/encntr_general_bg.mid') self.fsm.request('newPlayerEmerge') base.localAvatar.inTutorial = True def disable(self): self.fsm.requestFinalState() del self.fsm if self.guide: self.guide.disable() self.guide.delete() self.guide = None if self.streetGeom: self.streetGeom.removeNode() self.streetGeom = None if self.sky: self.sky.removeNode() self.sky = None if self.music: self.music.stop() self.music = None if self.battleMusic: self.battleMusic.stop() self.battleMusic = None self.dnaStore = None self.skyUtil = None base.localAvatar.inTutorial = False DistributedObject.disable(self) return
class CameraShyLevelLoader: notify = directNotify.newCategory('CameraShyLevelLoader') levelData = { 'TT_maze': { 'name': ZoneUtil.ToontownCentral, 'models': { 'phase_4/models/minigames/maze_1player.bam': { 'name': 'maze', 'scale': Point3(3.0, 3.0, 3.0) }, 'phase_4/models/minigames/maze_1player_collisions.egg': { 'name': 'maze_collisions', 'scale': Point3(3.0, 3.0, 3.0) }, 'phase_4/models/minigames/tag_arena.bam': { 'name': "tag_arena_bg", 'pos': Point3(0, 0, -0.5), 'scale': Point3(2.0, 2.0, 2.0) } }, 'spawnPoints': [[Point3(0, 0, 0), Vec3(0, 0, 0)], [Point3(-23.89, 18.58, 0.00), Vec3(90.00, 0.00, 0.00)], [Point3(-23.89, 6.30, 0.00), Vec3(0.00, 0.00, 0.00)], [Point3(23.78, 6.30, 0.00), Vec3(0.00, 0.00, 0.00)], [Point3(8.12, -17.79, 0.00), Vec3(270.00, 0.00, 0.00)]] }, 'DG_playground': { 'name': ZoneUtil.DaisyGardens, 'dna': [ 'phase_8/dna/storage_DG.pdna', 'phase_8/dna/storage_DG_sz.pdna', 'phase_8/dna/daisys_garden_sz.pdna' ], 'spawnPoints': hoodMgr.dropPoints[ZoneUtil.DaisyGardens] } } def __init__(self): self.level = None self.dnaStore = DNAStorage() self.levelGeom = None self.olc = None # To keep track of all the models. self.models = [] def setLevel(self, level): self.level = level def getLevel(self): return self.level def load(self): if not self.level: self.notify.warning('Attempted to load a null level!') return self.unload() data = self.levelData[self.level] # Are we loading a DNA level? if data.get('dna'): dnaFiles = data['dna'] loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna') for index in range(len(dnaFiles)): if 'storage' not in dnaFiles[index]: # It's an environment file, let's load that up and reparent it to render. node = loader.loadDNAFile(self.dnaStore, dnaFiles[index]) if node.getNumParents() == 1: self.levelGeom = NodePath(node.getParent(0)) self.levelGeom.reparentTo(hidden) else: self.levelGeom = hidden.attachNewNode(node) self.levelGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.levelGeom.prepareScene(gsg) self.levelGeom.reparentTo(render) else: # It's just a storage file, let's just load that up. loadDNAFile(self.dnaStore, dnaFiles[index]) elif data.get('models'): models = data['models'] for model, modifiers in models.items(): mdl = loader.loadModel(model) if modifiers.get('name'): mdl.setName(modifiers['name']) if modifiers.get('hpr'): mdl.setHpr(modifiers['hpr']) if modifiers.get('pos'): mdl.setPos(modifiers['pos']) if modifiers.get('scale'): mdl.setScale(modifiers['scale']) if modifiers.get('parent'): mdl.reparentTo(modifiers['parent']) else: mdl.reparentTo(render) self.models.append(mdl) else: self.notify.warning( 'Attempted to load a level with no data on how to generate it. Level is empty!' ) return self.olc = ZoneUtil.getOutdoorLightingConfig(data.get('name')) self.olc.setupAndApply() self.levelLoaded() def unload(self): if self.models: if len(self.models) > 0: for model in self.models: model.removeNode() self.models = [] if self.levelGeom: self.levelGeom.removeNode() self.levelGeom = None if self.olc: self.olc.cleanup() self.olc = None if self.dnaStore: self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_materials() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() # This is set outside of the class, so no need to check if it exists. hoodMgr = None def cleanup(self): try: self.CameraShyLevelLoader_deleted except: self.CameraShyLevelLoader_deleted = 1 if self.dnaStore: self.unload() self.models = None self.levelGeom = None self.olc = None self.dnaStore = None self.levelData = None def levelLoaded(self): if self.level == 'TT_maze': for model in self.models: if model.getName() == 'maze': brightenMat = Material() brightenMat.setShininess(2.0) brightenMat.setEmission((0, 0.25, 0.16, 1)) walls = model.find('**/maze_walls') walls.setSz(1.5) walls.setBSPMaterial('phase_4/maps/DGhedge.mat', 1) walls.setMaterial(brightenMat) floor = model.find('**/maze_floor') floor.setBSPMaterial('phase_4/maps/grass.mat', 1) model.setShaderAuto() elif model.getName() == 'maze_collisions': model.hide() model.setTransparency(1) model.setColorScale(1, 1, 1, 0) for node in model.findAllMatches('**'): node.setSz(1.5) elif model.getName() == 'tag_arena_bg': model.find('**/g1').removeNode() def getSpawnPoints(self): if self.level: points = self.levelData[self.level].get('spawnPoints') # Do we need to disect the pos and hpr coordinates? if points in hoodMgr.dropPoints.values(): twoPointArray = [] for posHpr in points: twoPointArray.append( Point3(posHpr[0], posHpr[1], posHpr[2]), Vec3(posHpr[3], posHpr[4], posHpr[5])) points = twoPointArray return points else: self.notify.warning( 'Attempted to get spawn points of a null level!') return None
class GunGameLevelLoader: notify = directNotify.newCategory("GunGameLevelLoader") LevelData = { # momada means: Mix Of Mint And District Attorney's 'momada': { 'name': ZoneUtil.ToonBattleOriginalLevel, 'camera': (Point3(0.0, -25.80, 7.59), Vec3(0.00, 0.00, 0.00)), 'models': [ "phase_11/models/lawbotHQ/LB_Zone03a.bam", "phase_11/models/lawbotHQ/LB_Zone04a.bam", "phase_11/models/lawbotHQ/LB_Zone7av2.bam", "phase_11/models/lawbotHQ/LB_Zone08a.bam", "phase_11/models/lawbotHQ/LB_Zone13a.bam", "phase_10/models/cashbotHQ/ZONE17a.bam", "phase_10/models/cashbotHQ/ZONE18a.bam", "phase_11/models/lawbotHQ/LB_Zone22a.bam" ], 'parents': [ render, "EXIT", "EXIT", "EXIT", "ENTRANCE", "ENTRANCE", "ENTRANCE", "EXIT" ], 'model_positions': [ Point3(0.00, 0.00, 0.00), Point3(-1.02, 59.73, 0.00), Point3(0.00, 74.77, 0.00), Point3(0.00, 89.37, -13.50), Point3(16.33, -136.53, 0.00), Point3(-1.01, -104.40, 0.00), Point3(0.65, -23.86, 0.00), Point3(-55.66, -29.01, 0.00) ], 'model_orientations': [ Vec3(0.00, 0.00, 0.00), Vec3(0.00, 0.00, 0.00), Vec3(90.00, 0.00, 0.00), Vec3(180.00, 0.00, 0.00), Vec3(97.00, 0.00, 0.00), Vec3(359.95, 0.00, 0.00), Vec3(90.00, 0.00, 0.00), Vec3(270.00, 0.00, 0.00) ], 'spawn_points': [ (Point3(0, 0, 0), Vec3(0, 0, 0)), (Point3(-20, 50, 0), Vec3(0, 0, 0)), (Point3(20, 50, 0), Vec3(0, 0, 0)), (Point3(0, 120, 0), Vec3(0, 0, 0)), (Point3(0, 100, 0), Vec3(180, 0, 0)), (Point3(-90, 0, 0), Vec3(0, 0, 0)), (Point3(-170, 0, 0), Vec3(0, 0, 0)), (Point3(-90, 50, 0), Vec3(0, 0, 0)), (Point3(-170, 50, 0), Vec3(0, 0, 0)), (Point3(35, 250, 0), Vec3(-90, 0, 0)), (Point3(0, 285, 0), Vec3(180, 0, 0)), (Point3(-185, 250, 0), Vec3(90, 0, 0)) ] }, 'dg': { 'name': ZoneUtil.DaisyGardens, 'camera': (Point3(-33.13, -3.20, 48.62), Vec3(326.31, 332.68, 0.00)), 'dna': [ 'phase_8/dna/storage_DG.pdna', 'phase_8/dna/storage_DG_sz.pdna', 'phase_8/dna/daisys_garden_sz.pdna' ], 'sky': 'TT', 'spawn_points': hoodMgr.dropPoints[ZoneUtil.DaisyGardens] }, 'mml': { 'name': ZoneUtil.MinniesMelodyland, 'camera': (Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.80, 0.00)), 'dna': [ 'phase_6/dna/storage_MM.pdna', 'phase_6/dna/storage_MM_sz.pdna', 'phase_6/dna/minnies_melody_land_sz.pdna' ], 'sky': 'MM', 'spawn_points': hoodMgr.dropPoints[ZoneUtil.MinniesMelodyland] }, 'oz': { 'name': ZoneUtil.OutdoorZone, 'camera': (Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.80, 0.00)), 'dna': [ 'phase_6/dna/storage_OZ.pdna', 'phase_6/dna/storage_OZ_sz.pdna', 'phase_6/dna/outdoor_zone_sz.pdna' ], 'sky': 'TT', 'spawn_points': hoodMgr.dropPoints[ZoneUtil.OutdoorZone] }, 'cbhq': { 'name': ZoneUtil.CashbotHQ, 'camera': (Point3(302.64, 5.00, 15.20), Vec3(135.00, 341.57, 0.00)), 'model': 'phase_10/models/cogHQ/CashBotShippingStation.bam', 'sky': None, 'spawn_points': hoodMgr.dropPoints[ZoneUtil.CashbotHQ] }, 'sbf': { 'name': ZoneUtil.SellbotFactory, 'camera': (Point3(0, 0, 0), Vec3(0, 0, 0)), 'model': "phase_9/models/cogHQ/SelbotLegFactory.bam", 'sky': 'cog', 'sky_scale': 10.0, 'occluders': 'phase_9/models/cogHQ/factory_sneak_occluders.egg', 'spawn_points': {GGG.Teams.BLUE: [ (Point3(13, 30, 3.73), Point3(0, 0, 0)), (Point3(21, 30, 3.73), Point3(0, 0, 0)), (Point3(29, 30, 3.73), Point3(0, 0, 0)), (Point3(13, 20, 3.73), Point3(0, 0, 0)), (Point3(21, 20, 3.73), Point3(0, 0, 0)), (Point3(29, 30, 3.73), Point3(0, 0, 0))], GGG.Teams.RED: [ (Point3(-644.43, 378.12, 8.73), Point3(270, 0, 0)), (Point3(-644.43, 370.75, 8.73), Point3(270, 0, 0)), (Point3(-644.43, 363.22, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 378.12, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 370.75, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 363.22, 8.73), Point3(270, 0, 0))] }, 'flag_points': {GGG.Teams.BLUE: [Point3(213.23, 340.59, 19.73), Point3(90, 0, 0)], GGG.Teams.RED: [Point3(-543.60, 595.79, 9.73), Point3(270, 0, 0)]}, 'flagpoint_points': {GGG.Teams.BLUE: [Point3(-543.60, 595.79, 9.73), Point3(270, 0, 0)], GGG.Teams.RED: [Point3(213.23, 340.59, 19.73), Point3(0, 0, 0)]} }, 'ttc' : { 'name' : ZoneUtil.ToontownCentral, 'dna' : [ 'phase_4/dna/storage_TT.pdna', 'phase_4/dna/storage_TT_sz.pdna', 'phase_4/dna/new_ttc_sz.pdna', ], 'sky' : 'TT', 'spawn_points' : [ (9.90324401855, 91.9139556885, 8.0364112854, -545.909545898, 0.0, 0.0), (77.9181442261, 50.953086853, 7.52815723419, -598.509460449, 0.0, 0.0), (93.7379760742, 6.37303066254, 7.99749088287, -626.209533691, 0.0, 0.0), (39.0383415222, -81.5989837646, 8.01874637604, -694.309265137, 0.0, 0.0), (-19.2093048096, -95.1359481812, 8.07303524017, -731.409240723, 0.0, 0.0), (-84.4093933105, -45.4780502319, 8.06541728973, -781.809143066, 0.0, 0.0), (-92.2512283325, 2.41426730156, 8.03108692169, -811.70916748, 0.0, 0.0), (46.8868179321, 81.3593673706, 8.04793071747, -955.309509277, 0.0, 0.0), (32.3203735352, 90.0017929077, 8.06353855133, -884.409301758, 0.0, 0.0) ], 'cap_point' : Point3(-1.5, 0, 0) } } SkyData = { 'TT': 'phase_3.5/models/props', 'MM': 'phase_6/models/props', 'cog': 'phase_9/models/cogHQ', 'MovingSkies': ['TT'] } def __init__(self, mg): self.mg = mg self.levelName = None self.dnaStore = DNAStorage() self.loadingText = None # for not momada only: self.levelGeom = None self.olc = None self.occluders = None # for momada only: self.momadaAreas = [] self.momadaAreaName2areaModel = {} def getFlagPoint_Point(self, team): return self.LevelData[self.levelName]['flagpoint_points'][team] def getFlagPoint(self, team): return self.LevelData[self.levelName]['flag_points'][team] def getCapturePoint(self): return self.LevelData[self.levelName]['cap_point'] def setLevel(self, level): self.levelName = level def getLevel(self): return self.levelName def getCameraOfCurrentLevel(self): return self.LevelData[self.getLevel()]['camera'] def getSpawnPoints(self): # Return the spawn points for this level. pointData = self.LevelData[self.levelName]['spawn_points'] if self.levelName == "momada": return pointData else: if self.mg.gameMode in [GGG.GameModes.CASUAL, GGG.GameModes.KOTH]: # These points come from src.coginvasion.distributed.HoodMgr, # which is a tuple of a bunch of arrays with pos as first # 3, and hpr as last 3 list elements. # # Disect the arrays and return a tuple holding a Point3 pos, and a Vec3 hpr. array = [] for posAndHpr in pointData: array.append( ( Point3( posAndHpr[0], posAndHpr[1], posAndHpr[2] ), Vec3( posAndHpr[3], posAndHpr[4], posAndHpr[5] ) ) ) elif self.mg.gameMode == GGG.GameModes.CTF: array = pointData[self.mg.team] return array def getNameOfCurrentLevel(self): return self.LevelData[self.getLevel()]['name'] def load(self): self.unload() if self.loadingText: self.loadingText.destroy() self.loadingText = None self.loadingText = OnscreenText(text = "", font = CIGlobals.getMinnieFont(), fg = (1, 1, 1, 1)) self.loadingText.setBin('gui-popup', 0) base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() if self.levelName == "momada": # momada is completely different from the other levels, # so it has it's own separate method for loading. self.__momadaLoad() elif self.levelName in ['cbhq', 'sbf']: # Cog hqs are just one model with everything in it. no dna loading needed. modelPath = self.LevelData[self.levelName]['model'] self.levelGeom = loader.loadModel(modelPath) self.levelGeom.flattenMedium() self.levelGeom.reparentTo(render) if self.LevelData[self.levelName].get('occluders'): self.occluders = loader.loadModel(self.LevelData[self.levelName]['occluders']) for occluderNode in self.occluders.findAllMatches('**/+OccluderNode'): base.render.setOccluder(occluderNode) occluderNode.node().setDoubleSided(True) if self.levelName == 'sbf': base.camLens.setFar(250) else: # It's a playground with dna and stuff. Just do the # normal loading procedure. dnaFiles = self.LevelData[self.levelName]['dna'] loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna') for index in range(len(dnaFiles)): if index == len(dnaFiles) - 1: node = loadDNAFile(self.dnaStore, dnaFiles[index]) if node.getNumParents() == 1: self.levelGeom = NodePath(node.getParent(0)) self.levelGeom.reparentTo(hidden) else: self.levelGeom = hidden.attachNewNode(node) if self.levelName == 'ttc' and dnaFiles[index] == 'phase_4/dna/new_ttc_sz.pdna': self.levelGeom.find('**/prop_gazebo_DNARoot').removeNode() else: self.levelGeom.flattenMedium() gsg = base.win.getGsg() if gsg: self.levelGeom.prepareScene(gsg) self.levelGeom.reparentTo(render) else: loadDNAFile(self.dnaStore, dnaFiles[index]) children = self.levelGeom.findAllMatches('**/*doorFrameHole*') for child in children: child.hide() self.olc = ZoneUtil.getOutdoorLightingConfig(self.LevelData[self.levelName].get('name')) self.olc.setupAndApply() if self.loadingText: self.loadingText.destroy() self.loadingText = None def __momadaLoad(self): def attachArea(itemNum): name = 'MomadaArea-%s' % itemNum area = self.momadaAreaName2areaModel.get(name) parents = self.LevelData['momada']['parents'] parent = parents[itemNum] if type(parent) == type(""): parent = self.momadaAreas[itemNum - 1].find('**/' + parent) pos = self.LevelData['momada']['model_positions'][itemNum] hpr = self.LevelData['momada']['model_orientations'][itemNum] area.reparentTo(parent) area.setPos(pos) area.setHpr(hpr) _numItems = 0 name = None for item in self.LevelData['momada']['models']: name = 'MomadaArea-%s' % _numItems area = loader.loadModel(item) self.momadaAreas.append(area) self.momadaAreaName2areaModel[name] = area attachArea(_numItems) _numItems += 1 self.notify.info("Loaded and attached %s momada areas." % _numItems) def unload(self): render.clearOccluder() if self.olc: self.olc.cleanup() self.olc = None if self.levelName == "sbf": base.camLens.setFar(CIGlobals.DefaultCameraFar) if self.levelName == "momada": for area in self.momadaAreas: self.momadaAreas.remove(area) area.removeNode() del area self.momadaAreas = [] self.momadaAreaName2areaModel = {} else: if self.occluders: self.occluders.removeNode() self.occluders = None if self.levelGeom: self.levelGeom.removeNode() self.levelGeom = None def cleanup(self): self.momadaAreas = None self.momadaAreaName2areaModel = None if self.dnaStore: self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_materials() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() self.dnaStore = None