class HomeHood: dnaStore = DNAStorage() def createHood(self, loadStorage=1): self.isLoaded = 0 if loadStorage: loadDNAFile(self.dnaStore, "phase_5.5/dna/storage_estate.dna") node = loadDNAFile(self.dnaStore, "phase_5.5/dna/estate_1.dna") if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(self.node) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.setName('home') self.geom.find('**/Path').setTransparency(TransparencyAttrib.MBinary, 1) self.sky = loader.loadModel("phase_3.5/models/props/TT_sky.bam") self.sky.reparentTo(self.geom) self.sky.setPos(-4.99989, -0.000152588, 2.28882e-005) self.geom.find('**/terrain').setCollideMask(BitMask32.allOff()) self.geom.find('**/terrain_barrier').node().setIntoCollideMask( CIGlobals.WallBitmask) self.geom.find("**/collision_fence").node().setIntoCollideMask( CIGlobals.WallBitmask) self.geom.find('**/collision4').node().setIntoCollideMask( CIGlobals.FloorBitmask) self.geom.find("**/collision3").node().setIntoCollideMask( CIGlobals.FloorBitmask) self.geom.find("**/collision1").node().setIntoCollideMask( CIGlobals.FloorBitmask) self.geom.reparentTo(render) messenger.send("loadedHood") self.skyUtil = SkyUtil() self.skyUtil.startSky(self.sky) self.isLoaded = 1 def unloadHood(self): self.skyUtil.stopSky() self.geom.remove() self.isLoaded = 0
class MinigameHood: def __init__(self, cr): self.cr = cr self.isLoaded = 0 self.dnaStore = DNAStorage() def createHood(self, loadStorage=1): if loadStorage: loadDNAFile(self.dnaStore, "phase_13/dna/storage_party_sz.dna") self.node = loadDNAFile(self.dnaStore, "phase_13/dna/party_sz.dna") if self.node.getNumParents() == 1: self.geom = NodePath(self.node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(self.node) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.setName('minigames') base.hoodBGM = base.loadMusic( "phase_13/audio/bgm/party_original_theme.ogg") base.hoodBGM.setVolume(0.7) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.sky = loader.loadModel("phase_3.5/models/props/TT_sky.bam") self.sky.reparentTo(self.geom) self.sky.setPos(9.15527e-005, -1.90735e-006, 2.6226e-006) self.sky.setH(-90) self.skyUtil = SkyUtil() self.skyUtil.startSky(self.sky) self.geom.reparentTo(render) self.isLoaded = 1 messenger.send("loadedHood") def unloadHood(self): self.isLoaded = 0 self.skyUtil.stopSky() self.geom.removeNode() base.hoodBGM.stop()
class MinigameHood: def __init__(self, cr): self.cr = cr self.isLoaded = 0 self.dnaStore = DNAStorage() def createHood(self, loadStorage = 1): if loadStorage: loadDNAFile(self.dnaStore, 'phase_13/dna/storage_party_sz.dna') self.node = loadDNAFile(self.dnaStore, 'phase_13/dna/party_sz.dna') if self.node.getNumParents() == 1: self.geom = NodePath(self.node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(self.node) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.setName('minigames') base.hoodBGM = base.loadMusic('phase_13/audio/bgm/party_original_theme.ogg') base.hoodBGM.setVolume(0.7) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam') self.sky.reparentTo(self.geom) self.sky.setPos(9.15527e-05, -1.90735e-06, 2.6226e-06) self.sky.setH(-90) self.skyUtil = SkyUtil() self.skyUtil.startSky(self.sky) self.geom.reparentTo(render) self.isLoaded = 1 messenger.send('loadedHood') def unloadHood(self): self.isLoaded = 0 self.skyUtil.stopSky() self.geom.removeNode() base.hoodBGM.stop()
class HomeHood: dnaStore = DNAStorage() def createHood(self, loadStorage = 1): self.isLoaded = 0 if loadStorage: loadDNAFile(self.dnaStore, 'phase_5.5/dna/storage_estate.dna') node = loadDNAFile(self.dnaStore, 'phase_5.5/dna/estate_1.dna') if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(self.node) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.setName('home') self.geom.find('**/Path').setTransparency(TransparencyAttrib.MBinary, 1) self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam') self.sky.reparentTo(self.geom) self.sky.setPos(-4.99989, -0.000152588, 2.28882e-05) self.geom.find('**/terrain').setCollideMask(BitMask32.allOff()) self.geom.find('**/terrain_barrier').node().setIntoCollideMask(CIGlobals.WallBitmask) self.geom.find('**/collision_fence').node().setIntoCollideMask(CIGlobals.WallBitmask) self.geom.find('**/collision4').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/collision3').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/collision1').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.reparentTo(render) messenger.send('loadedHood') self.skyUtil = SkyUtil() self.skyUtil.startSky(self.sky) self.isLoaded = 1 def unloadHood(self): self.skyUtil.stopSky() self.geom.remove() self.isLoaded = 0
class DistributedRaceGame(DistributedMinigame.DistributedMinigame): def __init__(self, cr): try: self.DistributedRaceGame_initialized return except: self.DistributedRaceGame_initialized = 1 DistributedMinigame.DistributedMinigame.__init__(self, cr) self.movement = RaceGameMovement.RaceGameMovement(base.localAvatar) self.skyUtil = SkyUtil() self.raceFSM = ClassicFSM('DistributedRaceGame', [ State('race', self.enterRace, self.exitRace), State('raceTransition', self.enterRaceTransition, self.exitRaceTransition), State('off', self.enterRaceOff, self.exitRaceOff) ], 'off', 'off') self.raceFSM.enterInitialState() self.cr = cr self.track = None self.sky = None self.countSfx = base.loadSfx("phase_5/audio/sfx/firehydrant_popup.ogg") self.goSfx = base.loadSfx("phase_4/audio/sfx/AA_sound_whistle.ogg") self.game = CIGlobals.RaceGame self.trackPath = "phase_4/models/minigames/sprint_track.egg" self.skyPath = "phase_3.5/models/props/TT_sky.bam" self.lanePos = [(-22.00, -205.00, 0.00), (-11.66, -205.00, 0.00), (0.00, -205.00, 0.00), (-33.66, -205.00, 0.00)] self.initialCamPos = { "pos": (41.10, -145.00, 25.88), "hpr": (135.00, 345.96, 0.0) } self.raceCamPos = (-24.52, -37.22, 25.00) self.lane = 0 return def load(self): self.deleteWorld() self.track = loader.loadModel(self.trackPath) self.track.reparentTo(render) self.sky = loader.loadModel(self.skyPath) self.sky.reparentTo(self.track) self.skyUtil.startSky(self.sky) self.setMinigameMusic("phase_4/audio/bgm/MG_toontag.ogg") self.setDescription("Tap the left and right arrow keys repeatedly, in turns, as fast as " + \ "you can to win the race! Every time your power bar hits the top, the boost bar starts" + \ " to fill. When the boost bar is full, press CTRL to boost for a few seconds.") self.setWinnerPrize(100) self.setLoserPrize(5) self.d_requestToonLane() camera.reparentTo(render) camera.setPos(self.initialCamPos["pos"]) camera.setHpr(self.initialCamPos["hpr"]) DistributedMinigame.DistributedMinigame.load(self) def enterPlay(self): DistributedMinigame.DistributedMinigame.enterPlay(self) self.raceFSM.request('raceTransition') def exitPlay(self): DistributedMinigame.DistributedMinigame.exitPlay(self) self.raceFSM.request('off') def enterRace(self): self.startMovement() def exitRace(self): self.stopMovement() def enterRaceOff(self): pass def exitRaceOff(self): pass def enterRaceTransition(self): self.raceTrans = Sequence(Wait(0.5), Func(self.moveCameraToToon), Wait(4.5), Func(self.moveCameraToTop), Wait(4.5), Func(self.startCountdown)) self.raceTrans.start() def exitRaceTransition(self): self.raceTrans.pause() del self.raceTrans def startMovement(self): self.movement.createGui() self.movement.fsm.request('run') def enterGameOver(self, winner=0, winnerDoId=0, allPrize=0): self.raceFSM.request('off') DistributedMinigame.DistributedMinigame.enterGameOver( self, winner, winnerDoId, allPrize) def stopMovement(self): self.movement.cleanup() self.movement.deleteGui() def startCountdown(self): """ Start the countdown to the start of the race. """ self.countdownLbl = DirectLabel(text="", text_scale=0.3, text_font=CIGlobals.getMickeyFont(), text_fg=(1, 1, 0, 1), pos=(0, 0, 0.5)) Sequence(Func(self.setCountdownText, "3"), Wait(1.0), Func(self.setCountdownText, "2"), Wait(1.0), Func(self.setCountdownText, "1"), Wait(1.0), Func(self.setCountdownText, "GO!"), Wait(1.5), Func(self.deleteCountdownLabel)).start() def setCountdownText(self, number): self.countdownLbl['text'] = number if number == "GO!": self.countdownLbl['text_fg'] = (0, 1, 0, 1) self.goSfx.play() self.raceFSM.request('race') else: self.countSfx.play() def deleteCountdownLabel(self): self.countdownLbl.destroy() del self.countdownLbl def moveCameraToToon(self): camPInt = LerpPosInterval(camera, duration=3.0, pos=self.localAv.getPos(render) + (0, 15, 3), startPos=(camera.getPos(render)), blendType="easeInOut") camQInt = camera.quatInterval(3.0, hpr=Vec3(180, 0, 0), blendType="easeInOut") camPInt.start() camQInt.start() def moveCameraToTop(self): camera.setPos(camera.getPos(self.localAv)) camera.reparentTo(self.localAv) oldPos = camera.getPos() camera.setPos(self.raceCamPos) oldHpr = camera.getHpr() camera.lookAt(self.localAv.getPart('head')) newHpr = camera.getHpr() camera.setHpr(oldHpr) camera.setPos(oldPos) camPInt = LerpPosInterval(camera, duration=3.0, pos=self.raceCamPos, startPos=oldPos, blendType="easeInOut") camQInt = camera.quatInterval(3.0, hpr=newHpr, blendType="easeInOut") camPInt.start() camQInt.start() def deleteWorld(self): if self.track: self.track.removeNode() self.track = None if self.sky: self.skyUtil.stopSky() self.sky.removeNode() self.sky = None def setToonLane(self, lane): self.lane = lane base.localAvatar.setPos(self.lanePos[lane]) base.localAvatar.setHpr(0, 0, 0) def getToonLane(self): return self.lane def d_requestToonLane(self): self.sendUpdate('requestToonLane', []) def announceGenerate(self): DistributedMinigame.DistributedMinigame.announceGenerate(self) self.load() def disable(self): DistributedMinigame.DistributedMinigame.disable(self) self.deleteWorld() self.raceFSM.requestFinalState() del self.raceFSM self.countSfx = None self.goSfx = None
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 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 DistributedCameraShyGame(DistributedMinigame): notify = directNotify.newCategory('DistributedCameraShyGame') def __init__(self, cr): try: self.DistributedCameraShyGame_initialized return except: self.DistributedCameraShyGame_initialized = 1 DistributedMinigame.__init__(self, cr) self.headPanels.delete() self.headPanels = CameraShyHeadPanels() self.fsm.addState(State('countdown', self.enterCountdown, self.exitCountdown, ['play'])) self.fsm.addState(State('announceGameOver', self.enterAnnounceGameOver, self.exitAnnounceGameOver, ['showWinner'])) self.fsm.addState(State('showWinner', self.enterShowWinner, self.exitShowWinner, ['gameOver'])) self.fsm.getStateNamed('waitForOthers').addTransition('countdown') self.fsm.getStateNamed('play').addTransition('announceGameOver') self.maze = None self.mazeCollModel = None self.spawnPoints = [] self.remoteAvatars = [] self.myRemoteAvatar = None self.thisPlayerWinsLbl = None self.sky = None self.firstPerson = CameraShyFirstPerson(self) self.skyUtil = None self.pbpText = None return def generateOtherPlayerGui(self): self.headPanels.generateOtherPlayerGui() def updateOtherPlayerHead(self, avId, otherAvId, state): self.headPanels.updateOtherPlayerHead(avId, otherAvId, state) def getPlayByPlayText(self): return OnscreenText(text='', fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), pos=(0, 0.75)) def removePlayByPlay(self): if self.pbpText: taskMgr.remove('DCameraShyGame-removePlayByPlay') self.pbpText.destroy() self.pbpText = None return def removePlayByPlayTask(self, task): self.removePlayByPlay() return Task.done def showPlayByPlay(self, situation, avId): self.removePlayByPlay() av = self.cr.doId2do.get(avId) name = av.getName() if situation == 0: self.pbpText = self.getPlayByPlayText() self.pbpText.setText('{0} took a picture of you!'.format(name)) taskMgr.doMethodLater(3.0, self.removePlayByPlayTask, 'DCameraShyGame-removePlayByPlay') def tookPictureOfMe(self, avId): self.headPanels.hideFrames() self.firstPerson.stopCameraFlash() base.transitions.setFadeColor(1, 1, 1) base.transitions.fadeOut(0.1) self.showPlayByPlay(0, avId) Sequence(Wait(1), Func(self.respawn)).start() def respawn(self): base.transitions.fadeIn() pos, hpr = self.pickSpawnPoint() base.localAvatar.setPos(pos) base.localAvatar.setHpr(hpr - (180, 0, 0)) base.localAvatar.d_broadcastPositionNow() Sequence(Wait(0.6), Func(self.headPanels.showFrames), Func(base.transitions.setFadeColor, 0, 0, 0)).start() def announceGameOver(self): self.fsm.request('announceGameOver') def showWinner(self, avId): base.transitions.fadeOut() Sequence(Wait(0.51), Func(self.fsm.request, 'showWinner', [avId])).start() def enterGameOver(self, winner, winnerDoId, allPrize): try: currentCamPos = base.camera.getPos(render) currentCamHpr = base.camera.getHpr(render) self.firstPerson.reallyEnd() base.camera.setPos(currentCamPos) base.camera.setHpr(currentCamHpr) except: pass DistributedMinigame.enterGameOver(self, winner, winnerDoId, allPrize) def enterShowWinner(self, winnerId): self.firstPerson.reallyEnd() avatar = self.getRemoteAvatar(winnerId) avatar.avatar.loop('neutral') avatar.detachCamera() self.thisPlayerWinsLbl = OnscreenText(text='{0} Wins!'.format(avatar.avatar.getName()), fg=(1, 1, 1, 1), font=CIGlobals.getMinnieFont(), pos=(0, 0.8), scale=0.1) if winnerId == base.localAvatar.doId: self.thisPlayerWinsLbl.setText('You Win!') base.camera.reparentTo(avatar.avatar) base.camera.setPos(0, 7, 3) base.camera.setH(180) base.transitions.fadeIn() Sequence(Wait(0.5), Func(avatar.doWinDance)).start() def exitShowWinner(self): pass def enterAnnounceGameOver(self): whistle = base.loadSfx('phase_4/audio/sfx/AA_sound_whistle.mp3') base.playSfx(whistle) self.gameOverLbl = OnscreenText(text='Game Over!', fg=(1, 1, 1, 1), font=CIGlobals.getMinnieFont(), scale=0.1) self.gameOverScaleIval = LerpScaleInterval(self.gameOverLbl, duration=1.0, scale=0.1, startScale=0.0, blendType='easeOut') def exitAnnounceGameOver(self): self.gameOverScaleIval.finish() del self.gameOverScaleIval self.gameOverLbl.destroy() del self.gameOverLbl def remoteAvatarTakePicture(self, avId): avatar = self.getRemoteAvatar(avId) if avatar: avatar.takePicture() def standingAvatar(self, avId): avatar = self.getRemoteAvatar(avId) if avatar: avatar.stand() def runningAvatar(self, avId): avatar = self.getRemoteAvatar(avId) if avatar: avatar.run() def createRemoteAvatar(self, avId): if avId == base.localAvatar.doId: self.myRemoteAvatar = RemoteCameraShyAvatar(self, self.cr, avId) self.remoteAvatars.append(self.myRemoteAvatar) else: av = RemoteCameraShyAvatar(self, self.cr, avId) av.stand() self.remoteAvatars.append(av) def getRemoteAvatar(self, avId): for avatar in self.remoteAvatars: if avatar.avId == avId: return avatar def allPlayersReady(self): self.fsm.request('countdown') def enterCountdown(self): base.localAvatar.chatInput.disableKeyboardShortcuts() base.localAvatar.disableChatInput() base.setBackgroundColor(CIGlobals.DefaultBackgroundColor) base.render.show() self.playMinigameMusic() self.countdownLbl = OnscreenText(text='', fg=(1, 1, 1, 1), font=CIGlobals.getMinnieFont(), scale=0.1) self.countdownTrack = Sequence(Func(self.countdownLbl.setText, '5'), Wait(1.0), Func(self.countdownLbl.setText, '4'), Wait(1.0), Func(self.countdownLbl.setText, '3'), Wait(1.0), Func(self.countdownLbl.setText, '2'), Wait(1.0), Func(self.countdownLbl.setText, '1'), Wait(1.0), Func(self.fsm.request, 'play')) self.countdownTrack.start() self.firstPerson.start() self.firstPerson.disableMouse() def exitCountdown(self): if hasattr(self, 'countdownTrack'): self.countdownTrack.pause() del self.countdownTrack if hasattr(self, 'countdownLbl'): self.countdownLbl.destroy() del self.countdownLbl def enterPlay(self): self.createTimer() self.firstPerson.reallyStart() def exitPlay(self): self.firstPerson.end() self.firstPerson.enableMouse() self.deleteTimer() base.localAvatar.createChatInput() base.localAvatar.chatInput.enableKeyboardShortcuts() DistributedMinigame.exitPlay(self) def createWorld(self): self.deleteWorld() self.maze = loader.loadModel('phase_4/models/minigames/maze_1player.bam') self.maze.find('**/maze_walls').setSz(1.5) self.maze.reparentTo(base.render) self.mazeCollModel = loader.loadModel('phase_4/models/minigames/maze_1player_collisions.egg') self.mazeCollModel.reparentTo(base.render) self.mazeCollModel.hide() self.mazeCollModel.setTransparency(1) self.mazeCollModel.setColorScale(1, 1, 1, 0) for node in self.mazeCollModel.findAllMatches('**'): node.setSz(1.5) self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam') self.skyUtil = SkyUtil() self.skyUtil.startSky(self.sky) self.sky.reparentTo(base.camera) ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.sky.node().setEffect(ce) self.spawnPoints.append((Point3(0, 0, 0), Vec3(0, 0, 0))) self.spawnPoints.append((Point3(-23.89, 18.58, 0.0), Vec3(90.0, 0.0, 0.0))) self.spawnPoints.append((Point3(-23.89, 6.3, 0.0), Vec3(0.0, 0.0, 0.0))) self.spawnPoints.append((Point3(23.78, 6.3, 0.0), Vec3(0.0, 0.0, 0.0))) self.spawnPoints.append((Point3(8.12, -17.79, 0.0), Vec3(270.0, 0.0, 0.0))) def deleteWorld(self): if self.maze: self.maze.removeNode() self.maze = None if self.mazeCollModel: self.mazeCollModel.removeNode() self.mazeCollModel = None if self.skyUtil: self.skyUtil.stopSky() self.skyUtil = None if self.sky: self.sky.removeNode() self.sky = None return def pickSpawnPoint(self): return random.choice(self.spawnPoints) def setSpawnPoint(self, index): pos, hpr = self.spawnPoints[index] base.localAvatar.setPos(pos) base.localAvatar.setHpr(hpr) def load(self): self.createWorld() self.setMinigameMusic('phase_6/audio/bgm/GS_Race_SS.mid') self.setDescription('Be the first to take 3 pictures of all the other Toons with your camera. ' + 'Use WASD to move and the mouse to look around. Press the left mouse button to take a picture. ' + 'Your camera takes some time to recharge after taking a picture. ' + 'You know you have a good shot when the view finder is green!') self.setWinnerPrize(30) self.setLoserPrize(15) base.render.hide() base.setBackgroundColor(0, 0, 0) DistributedMinigame.load(self) def announceGenerate(self): base.camLens.setMinFov(CIGlobals.GunGameFOV / (4.0 / 3.0)) self.load() DistributedMinigame.announceGenerate(self) def disable(self): if self.thisPlayerWinsLbl: self.thisPlayerWinsLbl.destroy() self.thisPlayerWinsLbl = None base.camera.reparentTo(render) base.camera.setPos(0, 0, 0) base.camera.setHpr(0, 0, 0) if self.myRemoteAvatar: self.myRemoteAvatar.cleanup() del self.myRemoteAvatar self.firstPerson.cleanup() del self.firstPerson self.deleteWorld() base.camLens.setMinFov(CIGlobals.DefaultCameraFov / (4.0 / 3.0)) DistributedMinigame.disable(self) return
class TTCHood: def __init__(self, cr): self.cr = cr self.dnaStore = DNAStorage() self.isLoaded = 0 self.suitEffectEnabled = False self.amblight = None self.ambNode = None self.sky = None self.skyTrack = None self.skySeq = None self.lightTrack = None self.skyUtil = SkyUtil() def createHood(self, loadStorage = 1, AI = 0): if loadStorage: loadDNAFile(self.dnaStore, "phase_4/dna/storage.dna") loadDNAFile(self.dnaStore, "phase_4/dna/storage_TT.dna") loadDNAFile(self.dnaStore, "phase_4/dna/storage_TT_sz.dna") loadDNAFile(self.dnaStore, "phase_5/dna/storage_town.dna") loadDNAFile(self.dnaStore, "phase_5/dna/storage_TT_town.dna") self.node = loadDNAFile(self.dnaStore, "phase_4/dna/toontown_central_sz.dna") if self.node.getNumParents() == 1: self.geom = NodePath(self.node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(self.node) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.setName('toontown_central') self.geom.find('**/hill').setTransparency(TransparencyAttrib.MBinary, 1) self.createSky("tt") base.hoodBGM = base.loadMusic("phase_4/audio/bgm/TC_nbrhood.ogg") base.hoodBGM.setVolume(0.25) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.clerk_node = render.attach_new_node('clerk_node') self.clerk_node.set_pos(-80, -85.57, 0.5) self.clerk_node.set_h(165.07) self.geom.find('**/toontown_central').setCollideMask(BitMask32.allOff()) self.geom.find('**/coll_sidewalk').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/collision_1').node().setIntoCollideMask(CIGlobals.WallBitmask) self.geom.find('**/coll_mainFoolr').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/left_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/right_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_bridge_floor').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_bridge').node().setIntoCollideMask(CIGlobals.WallBitmask) self.geom.find('**/coll_r_stair').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_l_stair_2').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_l_stairend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_r_satirend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_plaza').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_hedges').node().setIntoCollideMask(CIGlobals.WallBitmask) self.coll_list = ['coll_sidewalk', 'collision_1', 'coll_mainFoolr', 'left_ear', 'right_ear', 'coll_bridge_floor', 'coll_bridge', 'coll_r_stair', 'coll_l_stair_2', 'coll_l_stairend_1', 'coll_r_stairend_1', 'coll_plaza', 'coll_hedges'] self.geom.reparentTo(render) self.telescope = Actor(self.geom.find('**/*animated_prop_HQTelescopeAnimatedProp*'), {"chan": "phase_3.5/models/props/HQ_telescope-chan.bam"}, copy=0) self.telescope.reparentTo(self.geom.find('**/*toon_landmark_hqTT*')) self.createLights(1, 1, 1) #if AI: # self.createTrolley() taskMgr.add(self.telescopeTask, "telescopeTask") self.isLoaded = 1 messenger.send("loadedHood") def createLights(self, r, g, b, startColor=1, fade=0): self.deleteLights() self.amblight = AmbientLight("amblight") self.amblight.setColor(VBase4(r, g, b, 1)) self.ambNode = render.attachNewNode(self.amblight) render.setLight(self.ambNode) if fade: self.lightTrack = LerpFunc(self.setLightColor, fromData=startColor, toData=r, duration=2.5, blendType="easeInOut") self.lightTrack.start() self.skyTrack = LerpColorInterval(self.sky, color=VBase4(r + 0.4, g + 0.4, b + 0.4, 1.0), startColor=VBase4(startColor, startColor, startColor, 1.0), duration=1.5) self.skyTrack.start() sky = "tt" if r < 0.6: sky = "br" self.skySeq = Sequence(Wait(1.5), Func(self.createSky, sky)) self.skySeq.start() def createSky(self, sky): self.deleteSky() skyPath = "phase_3.5/models/props/" + sky.upper() + "_sky.bam" self.sky = loader.loadModel(skyPath) self.sky.reparentTo(self.geom) self.sky.setPos(9.15527e-005, -1.90735e-006, 2.6226e-006) self.sky.setH(-90) if sky == "tt": self.skyUtil.startSky(self.sky) def deleteSky(self): self.skyUtil.stopSky() if self.sky: self.sky.removeNode() self.sky = None if self.lightTrack: self.lightTrack.pause() self.lightTrack = None if self.skyTrack: self.skyTrack.pause() self.skyTrack = None if self.skySeq: self.skySeq.pause() self.skySeq = None def setLightColor(self, color): self.amblight.setColor(VBase4(color, color, color, 1)) def deleteLights(self): if self.ambNode: render.clearLight(self.ambNode) self.ambNode.removeNode() self.ambNode = None def telescopeTask(self, task): if not self.isLoaded: return task.done self.telescope.play("chan") task.delayTime = 12 return task.again def enableSuitEffect(self, size): self.createLights(0.4, 0.4, 0.4, startColor=1, fade=1) self.fogNode = Fog("fog") self.fogNode.setColor(0.3, 0.3, 0.3) self.fogNode.setExpDensity(0.0025) render.setFog(self.fogNode) base.hoodBGM.stop() song = random.randint(1, 4) base.hoodBGM = base.loadMusic("phase_3.5/audio/bgm/encntr_general_bg.ogg") base.hoodBGM.setVolume(0.7) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.suitEffectEnabled = True def bossSpawned(self): base.hoodBGM.stop() base.hoodBGM = base.loadMusic("phase_7/audio/bgm/encntr_suit_winning_indoor.ogg") base.hoodBGM.setVolume(0.7) base.hoodBGM.setLoop(True) Sequence(Wait(0.5), Func(base.hoodBGM.play)).start() def disableSuitEffect(self): self.createLights(1, 1, 1) self.createSky("tt") #render.clearFog() base.hoodBGM.stop() base.hoodBGM = base.loadMusic("phase_4/audio/bgm/TC_nbrhood.ogg") base.hoodBGM.setVolume(0.25) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.suitEffectEnabled = False def unloadHood(self): self.isLoaded = 0 if self.suitEffectEnabled: self.disableSuitEffect() self.deleteSky() self.deleteLights() self.geom.remove() self.clerk_node.remove_node() base.hoodBGM.stop()
class DistributedRaceGame(DistributedMinigame.DistributedMinigame): def __init__(self, cr): try: self.DistributedRaceGame_initialized return except: self.DistributedRaceGame_initialized = 1 DistributedMinigame.DistributedMinigame.__init__(self, cr) self.movement = RaceGameMovement.RaceGameMovement(base.localAvatar) self.skyUtil = SkyUtil() self.raceFSM = ClassicFSM('DistributedRaceGame', [State('race', self.enterRace, self.exitRace), State('raceTransition', self.enterRaceTransition, self.exitRaceTransition), State('off', self.enterRaceOff, self.exitRaceOff)], 'off', 'off') self.raceFSM.enterInitialState() self.cr = cr self.track = None self.sky = None self.countSfx = base.loadSfx('phase_5/audio/sfx/firehydrant_popup.mp3') self.goSfx = base.loadSfx('phase_4/audio/sfx/AA_sound_whistle.mp3') self.game = CIGlobals.RaceGame self.trackPath = 'phase_4/models/minigames/sprint_track.egg' self.skyPath = 'phase_3.5/models/props/TT_sky.bam' self.lanePos = [(-22.0, -205.0, 0.0), (-11.66, -205.0, 0.0), (0.0, -205.0, 0.0), (-33.66, -205.0, 0.0)] self.initialCamPos = {'pos': (41.1, -145.0, 25.88), 'hpr': (135.0, 345.96, 0.0)} self.raceCamPos = (-24.52, -37.22, 25.0) self.lane = 0 return def load(self): self.deleteWorld() self.track = loader.loadModel(self.trackPath) self.track.reparentTo(render) self.sky = loader.loadModel(self.skyPath) self.sky.reparentTo(self.track) self.skyUtil.startSky(self.sky) self.setMinigameMusic('phase_4/audio/bgm/MG_toontag.mid') self.setDescription('Tap the left and right arrow keys repeatedly, in turns, as fast as ' + 'you can to win the race! Every time your power bar hits the top, the boost bar starts' + ' to fill. When the boost bar is full, press CTRL to boost for a few seconds.') self.setWinnerPrize(20) self.setLoserPrize(5) self.d_requestToonLane() camera.reparentTo(render) camera.setPos(self.initialCamPos['pos']) camera.setHpr(self.initialCamPos['hpr']) DistributedMinigame.DistributedMinigame.load(self) def enterPlay(self): DistributedMinigame.DistributedMinigame.enterPlay(self) self.raceFSM.request('raceTransition') def exitPlay(self): DistributedMinigame.DistributedMinigame.exitPlay(self) self.raceFSM.request('off') def enterRace(self): self.startMovement() def exitRace(self): self.stopMovement() def enterRaceOff(self): pass def exitRaceOff(self): pass def enterRaceTransition(self): self.raceTrans = Sequence(Wait(0.5), Func(self.moveCameraToToon), Wait(4.5), Func(self.moveCameraToTop), Wait(4.5), Func(self.startCountdown)) self.raceTrans.start() def exitRaceTransition(self): self.raceTrans.pause() del self.raceTrans def startMovement(self): self.movement.createGui() self.movement.fsm.request('run') def enterGameOver(self, winner = 0, winnerDoId = 0, allPrize = 0): self.raceFSM.request('off') DistributedMinigame.DistributedMinigame.enterGameOver(self, winner, winnerDoId, allPrize) def stopMovement(self): self.movement.cleanup() self.movement.deleteGui() def startCountdown(self): """ Start the countdown to the start of the race. """ self.countdownLbl = DirectLabel(text='', text_scale=0.3, text_font=CIGlobals.getMickeyFont(), text_fg=(1, 1, 0, 1), pos=(0, 0, 0.5)) Sequence(Func(self.setCountdownText, '3'), Wait(1.0), Func(self.setCountdownText, '2'), Wait(1.0), Func(self.setCountdownText, '1'), Wait(1.0), Func(self.setCountdownText, 'GO!'), Wait(1.5), Func(self.deleteCountdownLabel)).start() def setCountdownText(self, number): self.countdownLbl['text'] = number if number == 'GO!': self.countdownLbl['text_fg'] = (0, 1, 0, 1) self.goSfx.play() self.raceFSM.request('race') else: self.countSfx.play() def deleteCountdownLabel(self): self.countdownLbl.destroy() del self.countdownLbl def moveCameraToToon(self): camPInt = LerpPosInterval(camera, duration=3.0, pos=self.localAv.getPos(render) + (0, 15, 3), startPos=camera.getPos(render), blendType='easeInOut') camQInt = camera.quatInterval(3.0, hpr=Vec3(180, 0, 0), blendType='easeInOut') camPInt.start() camQInt.start() def moveCameraToTop(self): camera.setPos(camera.getPos(self.localAv)) camera.reparentTo(self.localAv) oldPos = camera.getPos() camera.setPos(self.raceCamPos) oldHpr = camera.getHpr() camera.lookAt(self.localAv.getPart('head')) newHpr = camera.getHpr() camera.setHpr(oldHpr) camera.setPos(oldPos) camPInt = LerpPosInterval(camera, duration=3.0, pos=self.raceCamPos, startPos=oldPos, blendType='easeInOut') camQInt = camera.quatInterval(3.0, hpr=newHpr, blendType='easeInOut') camPInt.start() camQInt.start() def deleteWorld(self): if self.track: self.track.removeNode() self.track = None if self.sky: self.skyUtil.stopSky() self.sky.removeNode() self.sky = None return def setToonLane(self, lane): self.lane = lane base.localAvatar.setPos(self.lanePos[lane]) base.localAvatar.setHpr(0, 0, 0) def getToonLane(self): return self.lane def d_requestToonLane(self): self.sendUpdate('requestToonLane', []) def announceGenerate(self): DistributedMinigame.DistributedMinigame.announceGenerate(self) self.load() def disable(self): DistributedMinigame.DistributedMinigame.disable(self) self.deleteWorld() self.raceFSM.requestFinalState() del self.raceFSM self.countSfx = None self.goSfx = None return
class TTCHood: def __init__(self, cr): self.cr = cr self.dnaStore = DNAStorage() self.isLoaded = 0 self.suitEffectEnabled = False self.amblight = None self.ambNode = None self.sky = None self.skyTrack = None self.skySeq = None self.lightTrack = None self.skyUtil = SkyUtil() return def createHood(self, loadStorage = 1, AI = 0): if loadStorage: loadDNAFile(self.dnaStore, 'phase_4/dna/storage.dna') loadDNAFile(self.dnaStore, 'phase_4/dna/storage_TT.dna') loadDNAFile(self.dnaStore, 'phase_4/dna/storage_TT_sz.dna') loadDNAFile(self.dnaStore, 'phase_5/dna/storage_town.dna') loadDNAFile(self.dnaStore, 'phase_5/dna/storage_TT_town.dna') self.node = loadDNAFile(self.dnaStore, 'phase_4/dna/toontown_central_sz.dna') if self.node.getNumParents() == 1: self.geom = NodePath(self.node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(self.node) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.setName('toontown_central') self.geom.find('**/hill').setTransparency(TransparencyAttrib.MBinary, 1) self.createSky('tt') base.hoodBGM = base.loadMusic('phase_4/audio/bgm/TC_nbrhood.ogg') base.hoodBGM.setVolume(0.25) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.clerk_node = render.attach_new_node('clerk_node') self.clerk_node.set_pos(-80, -85.57, 0.5) self.clerk_node.set_h(165.07) self.geom.find('**/toontown_central').setCollideMask(BitMask32.allOff()) self.geom.find('**/coll_sidewalk').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/collision_1').node().setIntoCollideMask(CIGlobals.WallBitmask) self.geom.find('**/coll_mainFoolr').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/left_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/right_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_bridge_floor').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_bridge').node().setIntoCollideMask(CIGlobals.WallBitmask) self.geom.find('**/coll_r_stair').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_l_stair_2').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_l_stairend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_r_satirend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_plaza').node().setIntoCollideMask(CIGlobals.FloorBitmask) self.geom.find('**/coll_hedges').node().setIntoCollideMask(CIGlobals.WallBitmask) self.coll_list = ['coll_sidewalk', 'collision_1', 'coll_mainFoolr', 'left_ear', 'right_ear', 'coll_bridge_floor', 'coll_bridge', 'coll_r_stair', 'coll_l_stair_2', 'coll_l_stairend_1', 'coll_r_stairend_1', 'coll_plaza', 'coll_hedges'] self.geom.reparentTo(render) self.telescope = Actor(self.geom.find('**/*animated_prop_HQTelescopeAnimatedProp*'), {'chan': 'phase_3.5/models/props/HQ_telescope-chan.bam'}, copy=0) self.telescope.reparentTo(self.geom.find('**/*toon_landmark_hqTT*')) self.createLights(1, 1, 1) taskMgr.add(self.telescopeTask, 'telescopeTask') self.isLoaded = 1 messenger.send('loadedHood') def createLights(self, r, g, b, startColor = 1, fade = 0): self.deleteLights() self.amblight = AmbientLight('amblight') self.amblight.setColor(VBase4(r, g, b, 1)) self.ambNode = render.attachNewNode(self.amblight) render.setLight(self.ambNode) if fade: self.lightTrack = LerpFunc(self.setLightColor, fromData=startColor, toData=r, duration=2.5, blendType='easeInOut') self.lightTrack.start() self.skyTrack = LerpColorInterval(self.sky, color=VBase4(r + 0.4, g + 0.4, b + 0.4, 1.0), startColor=VBase4(startColor, startColor, startColor, 1.0), duration=1.5) self.skyTrack.start() sky = 'tt' if r < 0.6: sky = 'br' self.skySeq = Sequence(Wait(1.5), Func(self.createSky, sky)) self.skySeq.start() def createSky(self, sky): self.deleteSky() skyPath = 'phase_3.5/models/props/' + sky.upper() + '_sky.bam' self.sky = loader.loadModel(skyPath) self.sky.reparentTo(self.geom) self.sky.setPos(9.15527e-05, -1.90735e-06, 2.6226e-06) self.sky.setH(-90) if sky == 'tt': self.skyUtil.startSky(self.sky) def deleteSky(self): self.skyUtil.stopSky() if self.sky: self.sky.removeNode() self.sky = None if self.lightTrack: self.lightTrack.pause() self.lightTrack = None if self.skyTrack: self.skyTrack.pause() self.skyTrack = None if self.skySeq: self.skySeq.pause() self.skySeq = None return def setLightColor(self, color): self.amblight.setColor(VBase4(color, color, color, 1)) def deleteLights(self): if self.ambNode: render.clearLight(self.ambNode) self.ambNode.removeNode() self.ambNode = None return def telescopeTask(self, task): if not self.isLoaded: return task.done self.telescope.play('chan') task.delayTime = 12 return task.again def createTrolley(self): self.trolley = TrolleyBase(self.cr) def enableSuitEffect(self, size): self.createLights(0.4, 0.4, 0.4, startColor=1, fade=1) self.fogNode = Fog('fog') self.fogNode.setColor(0.3, 0.3, 0.3) self.fogNode.setExpDensity(0.0025) render.setFog(self.fogNode) base.hoodBGM.stop() song = random.randint(1, 4) base.hoodBGM = base.loadMusic('phase_3.5/audio/bgm/encntr_general_bg.ogg') base.hoodBGM.setVolume(0.7) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.suitEffectEnabled = True def bossSpawned(self): base.hoodBGM.stop() base.hoodBGM = base.loadMusic('phase_7/audio/bgm/encntr_suit_winning_indoor.ogg') base.hoodBGM.setVolume(0.7) base.hoodBGM.setLoop(True) Sequence(Wait(0.5), Func(base.hoodBGM.play)).start() def disableSuitEffect(self): self.createLights(1, 1, 1) self.createSky('tt') base.hoodBGM.stop() base.hoodBGM = base.loadMusic('phase_4/audio/bgm/TC_nbrhood.ogg') base.hoodBGM.setVolume(0.25) base.hoodBGM.setLoop(True) base.hoodBGM.play() self.suitEffectEnabled = False def unloadHood(self): self.isLoaded = 0 if self.suitEffectEnabled: self.disableSuitEffect() self.deleteSky() self.deleteLights() self.geom.remove() self.clerk_node.remove_node() base.hoodBGM.stop()