def startup(self): HoodAI.HoodAI.startup(self) if simbase.config.GetBool('want-minigames', True): self.createTrolley() if simbase.config.GetBool('want-butterflies', True): self.createButterflies() NPCToons.createNPC( simbase.air, 2021, (ToontownGlobals.ToontownCentral, TTLocalizer.NPCToonNames[2021], ('dss', 'ls', 's', 'm', 13, 41, 13, 13, 1, 6, 1, 6, 0, 18, 0), 'm', 1, NPCToons.NPC_GLOVE), ToontownGlobals.ToontownCentral, posIndex=0) self.trickOrTreatMgr = DistributedEffectMgrAI.DistributedEffectMgrAI( self.air, ToontownGlobals.HALLOWEEN, 12) self.trickOrTreatMgr.generateWithRequired( 2649) # All Fun and Games Shop, Silly Street self.winterCarolingMgr = DistributedEffectMgrAI.DistributedEffectMgrAI( self.air, ToontownGlobals.CHRISTMAS, 14) self.winterCarolingMgr.generateWithRequired( 2659) # Joy Buzzers to the World, Silly Street
def __makeShopOwnerNpc(self): if self.shopOwnerNpc: return self.shopOwnerNpc = NPCToons.createLocalNPC(self.shopOwnerNpcId) if not self.shopOwnerNpc: self.notify.warning('No shopkeeper in this cogdominium, using ForestGrove Sellbot FO NPCToons') random.seed(self.doId) shopkeeper = random.randint(7001, 7009) self.shopOwnerNpc = NPCToons.createLocalNPC(shopkeeper) self.shopOwnerNpc.addActive() self.shopOwnerNpc.reparentTo(self.cage) self.shopOwnerNpc.setPosHpr(0, -2, 0, 180, 0, 0) self.shopOwnerNpc.loop('neutral')
def setVictors(self, victorIds): DistributedFactoryAI.DistributedFactoryAI.setVictors(self, victorIds) activeVictors = [] for victorId in victorIds: toon = self.air.doId2do.get(victorId) if toon is not None: activeVictors.append(toon) npcId = random.choice(NPCToons.npcFriendsMinMaxStars(3, 3)) for toon in activeVictors: toon.attemptAddNPCFriend(npcId) toon.d_setSystemMessage( 0, 'You got a %s SOS card.' % (NPCToons.getNPCName(npcId)))
def createCogHeadquarters(self): NPCToons.generateZone2NpcDict() if self.config.GetBool('want-sellbot-headquarters', True): self.factoryMgr = FactoryManagerAI.FactoryManagerAI(self) self.cogHeadquarters.append(SellbotHQAI.SellbotHQAI(self)) if self.config.GetBool('want-cashbot-headquarters', True): self.mintMgr = MintManagerAI.MintManagerAI(self) self.cogHeadquarters.append(CashbotHQAI.CashbotHQAI(self)) if self.config.GetBool('want-lawbot-headquarters', True): self.lawOfficeMgr = LawOfficeManagerAI.LawOfficeManagerAI(self) self.cogHeadquarters.append(LawbotHQAI.LawbotHQAI(self)) if self.config.GetBool('want-bossbot-headquarters', True): self.countryClubMgr = CountryClubManagerAI.CountryClubManagerAI(self) self.cogHeadquarters.append(BossbotHQAI.BossbotHQAI(self))
def setVictors(self, victorIds): DistributedFactoryAI.DistributedFactoryAI.setVictors(self, victorIds) activeVictors = [] for victorId in victorIds: toon = self.air.doId2do.get(victorId) if toon is not None: activeVictors.append(toon) npcId = random.choice(NPCToons.npcFriendsMinMaxStars(3, 3)) for toon in activeVictors: toon.attemptAddNPCFriend(npcId) toon.d_setSystemMessage(0, 'You got a %s SOS card.' % (NPCToons.getNPCName(npcId)))
def createFishingPonds(self): self.fishingPonds = [] fishingPondGroups = [] for zoneId in self.getZoneTable(): dnaData = self.air.dnaDataMap.get(zoneId, None) if dnaData.getName() == 'root': area = ZoneUtil.getCanonicalZoneId(zoneId) (foundFishingPonds, foundFishingPondGroups) = self.findFishingPonds(dnaData, zoneId, area) self.fishingPonds.extend(foundFishingPonds) fishingPondGroups.extend(foundFishingPondGroups) for fishingPond in self.fishingPonds: NPCToons.createNpcsInZone(self.air, fishingPond.zoneId) fishingSpots = [] for (dnaGroup, fishingPond) in zip(fishingPondGroups, self.fishingPonds): fishingSpots.extend(self.findFishingSpots(dnaGroup, fishingPond))
def createCogHeadquarters(self): NPCToons.generateZone2NpcDict() if self.config.GetBool('want-sellbot-headquarters', True): self.factoryMgr = FactoryManagerAI.FactoryManagerAI(self) self.cogHeadquarters.append(SellbotHQAI.SellbotHQAI(self)) if self.config.GetBool('want-cashbot-headquarters', True): self.mintMgr = MintManagerAI.MintManagerAI(self) self.cogHeadquarters.append(CashbotHQAI.CashbotHQAI(self)) if self.config.GetBool('want-lawbot-headquarters', True): self.lawOfficeMgr = LawOfficeManagerAI.LawOfficeManagerAI(self) self.cogHeadquarters.append(LawbotHQAI.LawbotHQAI(self)) if self.config.GetBool('want-bossbot-headquarters', True): self.countryClubMgr = CountryClubManagerAI.CountryClubManagerAI( self) self.cogHeadquarters.append(BossbotHQAI.BossbotHQAI(self))
def announceGenerate(self): PurchaseManager.PurchaseManager.announceGenerate(self) if self.hasLocalToon: self.npc = NPCToons.createLocalNPC(2011) self.npc.addActive() def getDoId(): return 0 self.npc.getDoId = getDoId def acquireDelayDelete(name): return serialNum() self.npc.acquireDelayDelete = acquireDelayDelete def releaseDelayDelete(token): pass self.npc.releaseDelayDelete = releaseDelayDelete def uniqueName(string): return string self.npc.uniqueName = uniqueName self.accept('gagScreenIsUp', self.playMovie) self.purchase = base.cr.playGame.hood.purchase self.purchase.enterTutorialMode(self.ownedNewbieId)
def startup(self): self.createLobbyManager() self.createLobbyElevator() self.extDoor = self.makeCogHQDoor(self.lobbyZoneId, 0, 0, self.lobbyFADoorCode) if simbase.config.GetBool('want-boarding-groups', True): self.createBoardingParty() self.npcs = NPCToons.createNpcsInZone(self.air, self.zoneId)
def setup(self, blockNumber): self.interior = DistributedHQInteriorAI.DistributedHQInteriorAI( blockNumber, self.air, self.interiorZone) self.interior.generateWithRequired(self.interiorZone) self.npcs = NPCToons.createNpcsInZone(self.air, self.interiorZone) door0 = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.EXT_HQ, doorIndex=0) door1 = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.EXT_HQ, doorIndex=1) insideDoor0 = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.INT_HQ, doorIndex=0) insideDoor1 = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.INT_HQ, doorIndex=1) door0.setOtherDoor(insideDoor0) insideDoor0.setOtherDoor(door0) door1.setOtherDoor(insideDoor1) insideDoor1.setOtherDoor(door1) door0.zoneId = self.exteriorZone door1.zoneId = self.exteriorZone insideDoor0.zoneId = self.interiorZone insideDoor1.zoneId = self.interiorZone door0.generateWithRequired(self.exteriorZone) door1.generateWithRequired(self.exteriorZone) door0.sendUpdate('setDoorIndex', [door0.getDoorIndex()]) door1.sendUpdate('setDoorIndex', [door1.getDoorIndex()]) insideDoor0.generateWithRequired(self.interiorZone) insideDoor1.generateWithRequired(self.interiorZone) insideDoor0.sendUpdate('setDoorIndex', [insideDoor0.getDoorIndex()]) insideDoor1.sendUpdate('setDoorIndex', [insideDoor1.getDoorIndex()]) self.door0 = door0 self.door1 = door1 self.insideDoor0 = insideDoor0 self.insideDoor1 = insideDoor1
def createInitialSuitBuildings(self): if self.buildingMgr is None: return # If we aren't at our minimum number of buildings, let's spawn some! suitBlockCount = len(self.buildingMgr.getSuitBlocks()) if suitBlockCount < self.targetNumSuitBuildings: for _ in xrange(self.targetNumSuitBuildings - suitBlockCount): blockNumber = random.choice(self.buildingMgr.getToonBlocks()) building = self.buildingMgr.getBuilding(blockNumber) if building is None: continue if NPCToons.isZoneProtected( building.getExteriorAndInteriorZoneId()[1]): continue suitName = self.air.suitInvasionManager.getInvadingCog()[0] if suitName is None: suitName = self.defaultSuitName suitType = None suitTrack = None if suitName is not None: suitType = SuitDNA.getSuitType(suitName) suitTrack = SuitDNA.getSuitDept(suitName) (suitLevel, suitType, suitTrack) = self.pickLevelTypeAndTrack( None, suitType, suitTrack) isCogdo = random.random() < self.CogdoRatio if isCogdo: building.cogdoTakeOver(suitLevel, None) else: building.suitTakeOver(suitTrack, suitLevel, None) # Save the building manager's state: self.buildingMgr.save()
def cogSummonsDone(self, returnCode, suitIndex, buildingId): self.cancel['state'] = DGG.NORMAL if self.summonsType == 'building' or self.summonsType == 'cogdo': if returnCode == 'success': building = base.cr.doId2do.get(buildingId) dnaStore = base.cr.playGame.dnaStore buildingTitle = dnaStore.getTitleFromBlockNumber(building.block) buildingInteriorZone = building.zoneId + 500 + building.block npcName = TTLocalizer.SummonDlgShopkeeper npcId = NPCToons.zone2NpcDict.get(buildingInteriorZone) if npcId: npcName = NPCToons.getNPCName(npcId[0]) if buildingTitle: self.statusLabel['text'] = TTLocalizer.SummonDlgBldgSuccess % (npcName, buildingTitle) else: self.statusLabel['text'] = TTLocalizer.SummonDlgBldgSuccess2 elif returnCode == 'badlocation': self.statusLabel['text'] = TTLocalizer.SummonDlgBldgBadLoc elif returnCode == 'fail': self.statusLabel['text'] = TTLocalizer.SummonDlgInvasionFail elif returnCode == 'disabled': self.statusLabel['text'] = TTLocalizer.SummonDlgBldgNoCogdos elif self.summonsType.endswith('invasion'): if returnCode == 'success': self.statusLabel['text'] = TTLocalizer.SummonDlgInvasionSuccess elif returnCode == 'busy': self.statusLabel['text'] = TTLocalizer.SummonDlgInvasionBusy % self.suitFullName elif returnCode == 'fail': self.statusLabel['text'] = TTLocalizer.SummonDlgInvasionFail
def teleportToShop(self, npcId): npcZone = NPCToons.getNPCZone(npcId) npcHood = ZoneUtil.getCanonicalHoodId(npcZone) avZone = base.localAvatar.getZoneId() avHood = ZoneUtil.getCanonicalHoodId(avZone) avShard = base.localAvatar.defaultShard avPlace = base.cr.playGame.getPlace() hqZone = { 2000: 2520, 1000: 1507, 3000: 3508, 4000: 4504, 5000: 5502, 7000: 7503, 9000: 9505 } def callback(flag): if flag: npcZone = None base.cr.buildingQueryMgr.d_isSuit(npcZone, callback) if avShard not in base.cr.activeDistrictMap: return if npcZone in [-1, 0, None]: return if not ZoneUtil.isInterior(npcZone): return if ZoneUtil.isHQ(npcZone): args = (avHood, hqZone[avHood], avShard, -1) else: args = (npcHood, npcZone, avShard, -1) avPlace.requestTeleport(*args)
def setup(self, blockNumber): self.kartShopInterior = DistributedKartShopInteriorAI( blockNumber, self.air, self.interiorZone) self.kartShopInterior.generateWithRequired(self.interiorZone) self.npcs = NPCToons.createNpcsInZone(self.air, self.interiorZone) self.outsideDoor0 = DistributedDoorAI( self.air, blockNumber, DoorTypes.EXT_KS, doorIndex=1) self.outsideDoor1 = DistributedDoorAI( self.air, blockNumber, DoorTypes.EXT_KS, doorIndex=2) self.insideDoor0 = DistributedDoorAI( self.air, blockNumber, DoorTypes.INT_KS, doorIndex=1) self.insideDoor1 = DistributedDoorAI( self.air, blockNumber, DoorTypes.INT_KS, doorIndex=2) self.outsideDoor0.setOtherDoor(self.insideDoor0) self.outsideDoor1.setOtherDoor(self.insideDoor1) self.insideDoor0.setOtherDoor(self.outsideDoor0) self.insideDoor1.setOtherDoor(self.outsideDoor1) self.outsideDoor0.zoneId = self.exteriorZone self.outsideDoor1.zoneId = self.exteriorZone self.insideDoor0.zoneId = self.interiorZone self.insideDoor1.zoneId = self.interiorZone self.outsideDoor0.generateWithRequired(self.exteriorZone) self.outsideDoor1.generateWithRequired(self.exteriorZone) self.insideDoor0.generateWithRequired(self.interiorZone) self.insideDoor1.generateWithRequired(self.interiorZone) self.outsideDoor0.sendUpdate('setDoorIndex', [self.outsideDoor0.getDoorIndex()]) self.outsideDoor1.sendUpdate('setDoorIndex', [self.outsideDoor1.getDoorIndex()]) self.insideDoor0.sendUpdate('setDoorIndex', [self.insideDoor0.getDoorIndex()]) self.insideDoor1.sendUpdate('setDoorIndex', [self.insideDoor1.getDoorIndex()])
def findToonAttack(toons, attacks, track): foundAttacks = [] for t in toons: if t in attacks: attack = attacks[t] local_track = attack[TOON_TRACK_COL] if track != NPCSOS and attack[TOON_TRACK_COL] == NPCSOS: local_track = NPCToons.getNPCTrack(attack[TOON_TGT_COL]) if local_track == track: if local_track == FIRE: canFire = 1 for attackCheck in foundAttacks: if attackCheck[TOON_TGT_COL] == attack[TOON_TGT_COL]: canFire = 0 if canFire: foundAttacks.append(attack) else: foundAttacks.append(attack) def compFunc(a, b): if a[TOON_LVL_COL] > b[TOON_LVL_COL]: return 1 elif a[TOON_LVL_COL] < b[TOON_LVL_COL]: return -1 return 0 foundAttacks.sort(compFunc) return foundAttacks
def showChoicePoster(self, questId, fromNpcId, toNpcId, rewardId, callback): self.update((questId, fromNpcId, toNpcId, rewardId, 0)) quest = Quests.getQuest(questId) self.rewardText.show() self.rewardText.setZ(-0.205) self.questProgress.hide() if not hasattr(self, 'chooseButton'): guiButton = loader.loadModel('phase_3/models/gui/quit_button') self.chooseButton = DirectButton( parent=self.questFrame, relief=None, image=(guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale=(0.7, 1, 1), text=TTLocalizer.QuestPageChoose, text_scale=0.06, text_pos=(0, -0.02), pos=(0.285, 0, 0.245), scale=0.65) guiButton.removeNode() npcZone = NPCToons.getNPCZone(toNpcId) hoodId = ZoneUtil.getCanonicalHoodId(npcZone) self.chooseButton['command'] = callback self.chooseButton['extraArgs'] = [questId] self.unbind(DGG.WITHIN) self.unbind(DGG.WITHOUT) if not quest.getType() == Quests.TrackChoiceQuest: self.questInfo.setZ(-0.0625) return
def doNPCTeleports(attacks): npcs = [] npcDatas = [] arrivals = Sequence() departures = Parallel() for attack in attacks: if 'npcId' in attack: npcId = attack['npcId'] npc = NPCToons.createLocalNPC(npcId) if npc != None: npcs.append(npc) attack['npc'] = npc toon = attack['toon'] battle = attack['battle'] pos = toon.getPos(battle) + offset hpr = toon.getHpr(battle) npcDatas.append((npc, battle, hpr)) arrival = teleportIn(attack, npc, pos=pos) arrivals.append(arrival) departure = teleportOut(attack, npc) departures.append(departure) turns = Parallel() unturns = Parallel() hpr = Vec3(180.0, 0, 0) for npc in npcDatas: turns.append(Func(npc[0].setHpr, npc[1], npc[2])) unturns.append(Func(npc[0].setHpr, npc[1], hpr)) arrivals.append(turns) unturns.append(departures) return (arrivals, unturns, npcs)
def announceGenerate(self): PurchaseManager.PurchaseManager.announceGenerate(self) if self.hasLocalToon: self.npc = NPCToons.createLocalNPC(2011) self.npc.addActive() def getDoId(): return 0 self.npc.getDoId = getDoId def acquireDelayDelete(name): return serialNum() self.npc.acquireDelayDelete = acquireDelayDelete def releaseDelayDelete(token): pass self.npc.releaseDelayDelete = releaseDelayDelete def uniqueName(string): return string self.npc.uniqueName = uniqueName self.accept('gagScreenIsUp', self.playMovie) self.purchase = base.cr.playGame.hood.purchase self.purchase.enterTutorialMode(self.ownedNewbieId)
def __doSprinkle(attack, recipients, hp = 0): toon = NPCToons.createLocalNPC(attack['npcId']) if toon == None: return targets = attack[recipients] level = 4 battle = attack['battle'] track = Sequence(teleportIn(attack, toon)) def face90(target, toon, battle): vec = Point3(target.getPos(battle) - toon.getPos(battle)) vec.setZ(0) temp = vec[0] vec.setX(-vec[1]) vec.setY(temp) targetPoint = Point3(toon.getPos(battle) + vec) toon.headsUp(battle, targetPoint) delay = 2.5 effectTrack = Sequence() for target in targets: sprayEffect = BattleParticles.createParticleEffect(file='pixieSpray') dropEffect = BattleParticles.createParticleEffect(file='pixieDrop') explodeEffect = BattleParticles.createParticleEffect(file='pixieExplode') poofEffect = BattleParticles.createParticleEffect(file='pixiePoof') wallEffect = BattleParticles.createParticleEffect(file='pixieWall') mtrack = Parallel(__getPartTrack(sprayEffect, 1.5, 0.5, [sprayEffect, toon, 0]), __getPartTrack(dropEffect, 1.9, 2.0, [dropEffect, target, 0]), __getPartTrack(explodeEffect, 2.7, 1.0, [explodeEffect, toon, 0]), __getPartTrack(poofEffect, 3.4, 1.0, [poofEffect, target, 0]), __getPartTrack(wallEffect, 4.05, 1.2, [wallEffect, toon, 0]), __getSoundTrack(level, 2, duration=3.1, node=toon), Sequence(Func(face90, target, toon, battle), ActorInterval(toon, 'sprinkle-dust')), Sequence(Wait(delay), Func(__healToon, target, hp))) effectTrack.append(mtrack) track.append(effectTrack) track.append(Func(toon.setHpr, Vec3(180.0, 0.0, 0.0))) track.append(teleportOut(attack, toon)) return track
def load(self): SafeZoneLoader.SafeZoneLoader.load(self) self.seagullSound = base.loadSfx('phase_6/audio/sfx/SZ_DD_Seagull.ogg') self.underwaterSound = base.loadSfx('phase_4/audio/sfx/AV_ambient_water.ogg') self.swimSound = base.loadSfx('phase_4/audio/sfx/AV_swim_single_stroke.ogg') self.submergeSound = base.loadSfx('phase_5.5/audio/sfx/AV_jump_in_water.ogg') self.boat = self.geom.find('**/donalds_boat') self.dockSound = base.loadSfx('phase_6/audio/sfx/SZ_DD_dockcreak.ogg') self.foghornSound = base.loadSfx('phase_5/audio/sfx/SZ_DD_foghorn.ogg') self.bellSound = base.loadSfx('phase_6/audio/sfx/SZ_DD_shipbell.ogg') self.waterSound = base.loadSfx('phase_6/audio/sfx/SZ_DD_waterlap.ogg') if not self.boat.isEmpty(): wheel = self.boat.find('**/wheel') if not wheel.isEmpty(): wheel.hide() self.boat.stash() self.donald = NPCToons.createLocalNPC(7011) self.donald.setPos(0, -1, 3.95) self.donald.reparentTo(self.boat) self.donald.setHat(48, 0, 0) self.donald.hideShadow() random.shuffle(TTLocalizer.DonaldChatter) self.donaldSpeech = self.donald.createTalkSequence(TTLocalizer.DonaldChatter, 15) self.donaldSpeech.loop(0) water = self.geom.find('**/water') water.setColorScale(1, 1, 1, 0.7) water.setTransparency(1)
def doNPCTeleports(attacks): npcs = [] npcDatas = [] arrivals = Sequence() departures = Parallel() for attack in attacks: if 'npcId' in attack: npcId = attack['npcId'] npc = NPCToons.createLocalNPC(npcId) if npc != None: npcs.append(npc) attack['npc'] = npc toon = attack['toon'] battle = attack['battle'] pos = toon.getPos(battle) + offset hpr = toon.getHpr(battle) npcDatas.append((npc, battle, hpr)) arrival = teleportIn(attack, npc, pos=pos) arrivals.append(arrival) departure = teleportOut(attack, npc) departures.append(departure) turns = Parallel() unturns = Parallel() hpr = Vec3(180.0, 0, 0) for npc in npcDatas: turns.append(Func(npc[0].setHpr, npc[1], npc[2])) unturns.append(Func(npc[0].setHpr, npc[1], hpr)) arrivals.append(turns) unturns.append(departures) return (arrivals, unturns, npcs)
def findToonAttack(toons, attacks, track): foundAttacks = [] for t in toons: if t in attacks: attack = attacks[t] local_track = attack[TOON_TRACK_COL] if track != NPCSOS and attack[TOON_TRACK_COL] == NPCSOS: local_track = NPCToons.getNPCTrack(attack[TOON_TGT_COL]) if local_track == track: if local_track == FIRE: canFire = 1 for attackCheck in foundAttacks: if attackCheck[TOON_TGT_COL] == attack[TOON_TGT_COL]: canFire = 0 if canFire: foundAttacks.append(attack) else: foundAttacks.append(attack) def compFunc(a, b): if a[TOON_LVL_COL] > b[TOON_LVL_COL]: return 1 elif a[TOON_LVL_COL] < b[TOON_LVL_COL]: return -1 return 0 foundAttacks.sort(compFunc) return foundAttacks
def createInitialSuitBuildings(self): if self.buildingMgr is None: return # If we aren't at our minimum number of buildings, let's spawn some! suitBlockCount = len(self.buildingMgr.getSuitBlocks()) if suitBlockCount < self.targetNumSuitBuildings: for _ in xrange(self.targetNumSuitBuildings - suitBlockCount): blockNumber = random.choice(self.buildingMgr.getToonBlocks()) building = self.buildingMgr.getBuilding(blockNumber) if building is None: continue if NPCToons.isZoneProtected(building.getExteriorAndInteriorZoneId()[1]): continue suitName = self.air.suitInvasionManager.getInvadingCog()[0] if suitName is None: suitName = self.defaultSuitName suitType = None suitTrack = None if suitName is not None: suitType = SuitDNA.getSuitType(suitName) suitTrack = SuitDNA.getSuitDept(suitName) (suitLevel, suitType, suitTrack) = self.pickLevelTypeAndTrack(None, suitType, suitTrack) isCogdo = random.random() < self.CogdoRatio if isCogdo: building.cogdoTakeOver(suitLevel, None) else: building.suitTakeOver(suitTrack, suitLevel, None) # Save the building manager's state: self.buildingMgr.save()
def chooseDestination(self, suit, startTime, toonBlockTakeover=None, cogdoTakeover=None, minPathLen=None, maxPathLen=None): possibles = [] backup = [] if toonBlockTakeover is not None: suit.attemptingTakeover = 1 blockNumber = toonBlockTakeover if blockNumber in self.buildingFrontDoors: possibles.append((blockNumber, self.buildingFrontDoors[blockNumber])) elif suit.attemptingTakeover: for blockNumber in self.buildingMgr.getToonBlocks(): building = self.buildingMgr.getBuilding(blockNumber) (extZoneId, intZoneId) = building.getExteriorAndInteriorZoneId() if not NPCToons.isZoneProtected(intZoneId): if blockNumber in self.buildingFrontDoors: possibles.append((blockNumber, self.buildingFrontDoors[blockNumber])) if cogdoTakeover is None: if suit.dna.dept in ALLOWED_FO_TRACKS: cogdoTakeover = random.random() < self.CogdoRatio elif self.buildingMgr: for blockNumber in self.buildingMgr.getSuitBlocks(): track = self.buildingMgr.getBuildingTrack(blockNumber) if (track == suit.track) and (blockNumber in self.buildingSideDoors): for doorPoint in self.buildingSideDoors[blockNumber]: possibles.append((blockNumber, doorPoint)) backup = [] for p in self.streetPointList: backup.append((None, p)) if self.notify.getDebug(): self.notify.debug('Choosing destination point from %s+%s possibles.' % (len(possibles), len(backup))) if len(possibles) == 0: possibles = backup backup = [] if minPathLen is None: if suit.attemptingTakeover: minPathLen = self.MIN_TAKEOVER_PATH_LEN else: minPathLen = self.MIN_PATH_LEN if maxPathLen is None: maxPathLen = self.MAX_PATH_LEN retryCount = 0 while (len(possibles) > 0) and (retryCount < 50): p = random.choice(possibles) possibles.remove(p) if len(possibles) == 0: possibles = backup backup = [] path = self.genPath(suit.startPoint, p[1], minPathLen, maxPathLen) if path and (not self.pathCollision(path, startTime)): suit.endPoint = p[1] suit.minPathLen = minPathLen suit.maxPathLen = maxPathLen suit.buildingDestination = p[0] suit.buildingDestinationIsCogdo = cogdoTakeover suit.setPath(path) return 1 retryCount += 1 return 0
def __doNPCSOS(sos): npcId = sos['npcId'] track, level, hp = NPCToons.getNPCTrackLevelHp(npcId) if track != None: return NPCSOSfn_dict[track](sos, level, hp) else: return __cogsMiss(sos, 0, 0) return
def startup(self): self.createLobbyManager() self.createLobbyElevator() self.extDoor = self.makeCogHQDoor(self.lobbyZoneId, 0, 0, self.lobbyFADoorCode) if simbase.config.GetBool('want-boarding-groups', True): self.createBoardingParty() self.npcs = NPCToons.createNpcsInZone(self.air, self.zoneId)
def __doNPCSOS(sos): npcId = sos['npcId'] track, level, hp = NPCToons.getNPCTrackLevelHp(npcId) if track != None: return NPCSOSfn_dict[track](sos, level, hp) else: return __cogsMiss(sos, 0, 0) return
def createFishingPonds(self): self.fishingPonds = [] fishingPondGroups = [] for zoneId in self.getZoneTable(): dnaData = self.air.dnaDataMap.get(zoneId, None) if dnaData.getName() == 'root': area = ZoneUtil.getCanonicalZoneId(zoneId) (foundFishingPonds, foundFishingPondGroups) = self.findFishingPonds( dnaData, zoneId, area) self.fishingPonds.extend(foundFishingPonds) fishingPondGroups.extend(foundFishingPondGroups) for fishingPond in self.fishingPonds: NPCToons.createNpcsInZone(self.air, fishingPond.zoneId) fishingSpots = [] for (dnaGroup, fishingPond) in zip(fishingPondGroups, self.fishingPonds): fishingSpots.extend(self.findFishingSpots(dnaGroup, fishingPond))
def startup(self): HoodAI.HoodAI.startup(self) if simbase.config.GetBool('want-minigames', True): self.createTrolley() if simbase.config.GetBool('want-butterflies', True): self.createButterflies() NPCToons.createNPC( simbase.air, 2021, (ToontownGlobals.ToontownCentral, TTLocalizer.NPCToonNames[2021], ('dss', 'ls', 's', 'm', 13, 41, 13, 13, 1, 6, 1, 6, 0, 18, 0), 'm', 1, NPCToons.NPC_GLOVE), ToontownGlobals.ToontownCentral, posIndex=0) self.trickOrTreatMgr = DistributedEffectMgrAI.DistributedEffectMgrAI(self.air, ToontownGlobals.HALLOWEEN, 12) self.trickOrTreatMgr.generateWithRequired(2649) # All Fun and Games Shop, Silly Street self.winterCarolingMgr = DistributedEffectMgrAI.DistributedEffectMgrAI(self.air, ToontownGlobals.CHRISTMAS, 14) self.winterCarolingMgr.generateWithRequired(2659) # Joy Buzzers to the World, Silly Street
def __healJoke(heal, hasInteractivePropHealBonus): npcId = 0 if 'npcId' in heal: npcId = heal['npcId'] toon = NPCToons.createLocalNPC(npcId) if toon == None: return else: toon = heal['toon'] targets = heal['target'] ineffective = heal['sidestep'] level = heal['level'] jokeIndex = heal['hpbonus'] % len(TTLocalizer.ToonHealJokes) if npcId != 0: track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) tracks = Parallel() fSpeakPunchline = 58 tSpeakSetup = 0.0 tSpeakPunchline = 3.0 dPunchLine = 3.0 tTargetReact = tSpeakPunchline + 1.0 dTargetLaugh = 1.5 tRunBack = tSpeakPunchline + dPunchLine tDoSoundAnimation = tSpeakPunchline - float(fSpeakPunchline) / toon.getFrameRate('sound') megaphone = globalPropPool.getProp('megaphone') megaphone2 = MovieUtil.copyProp(megaphone) megaphones = [megaphone, megaphone2] hands = toon.getRightHands() dMegaphoneScale = 0.5 tracks.append(Sequence(Wait(tDoSoundAnimation), Func(MovieUtil.showProps, megaphones, hands), MovieUtil.getScaleIntervals(megaphones, dMegaphoneScale, MovieUtil.PNT3_NEARZERO, MovieUtil.PNT3_ONE), Wait(toon.getDuration('sound') - 2.0 * dMegaphoneScale), MovieUtil.getScaleIntervals(megaphones, dMegaphoneScale, MovieUtil.PNT3_ONE, MovieUtil.PNT3_NEARZERO), Func(MovieUtil.removeProps, megaphones))) tracks.append(Sequence(Wait(tDoSoundAnimation), ActorInterval(toon, 'sound'))) soundTrack = __getSoundTrack(level, 2.0, node=toon) tracks.append(soundTrack) joke = TTLocalizer.ToonHealJokes[jokeIndex] tracks.append(Sequence(Wait(tSpeakSetup), Func(toon.setChatAbsolute, joke[0], CFSpeech | CFTimeout))) tracks.append(Sequence(Wait(tSpeakPunchline), Func(toon.setChatAbsolute, joke[1], CFSpeech | CFTimeout))) reactTrack = Sequence(Wait(tTargetReact)) for target in targets: targetToon = target['toon'] hp = target['hp'] reactTrack.append(Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus)) reactTrack.append(Wait(dTargetLaugh)) for target in targets: targetToon = target['toon'] reactTrack.append(Func(targetToon.clearChat)) tracks.append(reactTrack) if npcId != 0: track.append(Sequence(Wait(tRunBack), Func(toon.clearChat), *MovieNPCSOS.teleportOut(heal, toon))) else: tracks.append(Sequence(Wait(tRunBack), Func(toon.clearChat), *__returnToBase(heal))) track.append(tracks) return track
def createSafeZones(self): NPCToons.generateZone2NpcDict() if self.config.GetBool('want-toontown-central', True): self.hoods.append(TTHoodAI.TTHoodAI(self)) if self.config.GetBool('want-donalds-dock', True): self.hoods.append(DDHoodAI.DDHoodAI(self)) if self.config.GetBool('want-daisys-garden', True): self.hoods.append(DGHoodAI.DGHoodAI(self)) if self.config.GetBool('want-minnies-melodyland', True): self.hoods.append(MMHoodAI.MMHoodAI(self)) if self.config.GetBool('want-the-brrrgh', True): self.hoods.append(BRHoodAI.BRHoodAI(self)) if self.config.GetBool('want-donalds-dreamland', True): self.hoods.append(DLHoodAI.DLHoodAI(self)) if self.config.GetBool('want-goofy-speedway', True): self.hoods.append(GSHoodAI.GSHoodAI(self)) if self.config.GetBool('want-outdoor-zone', True): self.hoods.append(OZHoodAI.OZHoodAI(self)) if self.config.GetBool('want-golf-zone', True): self.hoods.append(GZHoodAI.GZHoodAI(self))
def __updateNPCFriendsPanel(self): self.NPCFriends = {} for friend, count in base.localAvatar.NPCFriendsDict.items(): track = NPCToons.getNPCTrack(friend) if track == ToontownBattleGlobals.LURE_TRACK and self.canLure == 0 or track == ToontownBattleGlobals.TRAP_TRACK and self.canTrap == 0: self.NPCFriends[friend] = 0 else: self.NPCFriends[friend] = count self.NPCFriendPanel.setFriends(self.NPCFriends) self.NPCFriendPanel.update()
def createSafeZones(self): NPCToons.generateZone2NpcDict() if self.config.GetBool('want-toontown-central', True): self.hoods.append(TTHoodAI.TTHoodAI(self)) if self.config.GetBool('want-donalds-dock', True): self.hoods.append(DDHoodAI.DDHoodAI(self)) if self.config.GetBool('want-daisys-garden', True): self.hoods.append(DGHoodAI.DGHoodAI(self)) if self.config.GetBool('want-minnies-melodyland', True): self.hoods.append(MMHoodAI.MMHoodAI(self)) if self.config.GetBool('want-the-brrrgh', True): self.hoods.append(BRHoodAI.BRHoodAI(self)) if self.config.GetBool('want-donalds-dreamland', True): self.hoods.append(DLHoodAI.DLHoodAI(self)) if self.config.GetBool('want-goofy-speedway', True): self.hoods.append(GSHoodAI.GSHoodAI(self)) if self.config.GetBool('want-outdoor-zone', True): self.hoods.append(OZHoodAI.OZHoodAI(self)) if self.config.GetBool('want-golf-zone', True): self.hoods.append(GZHoodAI.GZHoodAI(self))
def __init__(self, air, zones, avId): FSM.__init__(self, 'TutorialFSM') self.air = air self.zones = zones self.avId = avId npcDesc = NPCToons.NPCToonDict.get(20000) self.tutorialTom = NPCToons.createNPC(self.air, 20000, npcDesc, self.zones['building']) self.tutorialTom.setTutorial(1) npcDesc = NPCToons.NPCToonDict.get(20002) self.hqHarry = NPCToons.createNPC(self.air, 20002, npcDesc, self.zones['hq']) self.hqHarry.setTutorial(1) self.hqHarry.setHq(1) self.building = TutorialBuildingAI( self.air, self.zones['street'], self.zones['building'], 2, self.tutorialTom.getDoId()) self.hq = HQBuildingAI(self.air, self.zones['street'], self.zones['hq'], 1) self.forceTransition('Introduction')
def createNpcToonHead(self, toNpcId): npcInfo = NPCToons.NPCToonDict[toNpcId] dnaList = npcInfo[2] gender = npcInfo[3] if dnaList == 'r': dnaList = NPCToons.getRandomDNA(toNpcId, gender) dna = ToonDNA.ToonDNA() dna.newToonFromProperties(*dnaList) head = ToonHead.ToonHead() head.setupHead(dna, forGui=1) self.fitGeometry(head, fFlip=1) return head
def __createToonModels(self): self.model_Created = 1 self.jurorToon = NPCToons.createLocalNPC(ToontownGlobals.LawbotBossBaseJurorNpcId + self.index) self.toonScale = self.jurorToon.getScale() jurorToonParent = render.attachNewNode('toonOriginChange') self.jurorToon.wrtReparentTo(jurorToonParent) self.jurorToon.setPosHpr(0, 0, -(self.jurorToon.getHeight() / 2.0), 0, -90, 0) self.toonModel = jurorToonParent self.toonHead = ToonHead.ToonHead() self.toonHead.setupHead(self.jurorToon.style) self.toonHead.reparentTo(hidden) self.__loadToonInCannon()
def createNpcToonHead(self, toNpcId): npcInfo = NPCToons.NPCToonDict[toNpcId] dnaList = npcInfo[2] gender = npcInfo[3] if dnaList == 'r': dnaList = NPCToons.getRandomDNA(toNpcId, gender) dna = ToonDNA.ToonDNA() dna.newToonFromProperties(*dnaList) head = ToonHead.ToonHead() head.setupHead(dna, forGui=1) self.fitGeometry(head, fFlip=1) return head
def enterTunnel(self): npcDesc = NPCToons.NPCToonDict.get(20001) self.flippy = NPCToons.createNPC(self.air, 20001, npcDesc, self.zones['street'], 0) if simbase.air.wantHalloween: self.BlackCatManager = DistributedBlackCatMgrAI.DistributedBlackCatMgrAI(self.air) self.BlackCatManager.generateWithRequired(self.zones['street']) self.hq.insideDoor0.setDoorLock(FADoorCodes.WRONG_DOOR_HQ) self.hq.insideDoor1.setDoorLock(FADoorCodes.UNLOCKED) self.hq.door0.setDoorLock(FADoorCodes.GO_TO_PLAYGROUND) self.hq.door1.setDoorLock(FADoorCodes.GO_TO_PLAYGROUND) self.building.door.setDoorLock(FADoorCodes.GO_TO_PLAYGROUND)
def decodeTTSCToontaskMsg(taskId, toNpcId, toonProgress, msgIndex): q = Quests.getQuest(taskId) if q is None: return name = NPCToons.getNPCName(toNpcId) if name is None: return msgs = q.getSCStrings(toNpcId, toonProgress) if type(msgs) != type([]): msgs = [msgs] if msgIndex >= len(msgs): return return msgs[msgIndex]
def decodeTTSCToontaskMsg(taskId, toNpcId, toonProgress, msgIndex): q = Quests.getQuest(taskId) if q is None: return name = NPCToons.getNPCName(toNpcId) if name is None: return msgs = q.getSCStrings(toNpcId, toonProgress) if type(msgs) != type([]): msgs = [msgs] if msgIndex >= len(msgs): return return msgs[msgIndex]
def __healDance(heal, hasInteractivePropHealBonus): npcId = 0 if 'npcId' in heal: npcId = heal['npcId'] toon = NPCToons.createLocalNPC(npcId) if toon == None: return else: toon = heal['toon'] targets = heal['target'] ineffective = heal['sidestep'] level = heal['level'] if npcId != 0: track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) delay = 3.0 first = 1 targetTrack = Sequence() for target in targets: targetToon = target['toon'] hp = target['hp'] reactIval = Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus) if first: targetTrack.append(Wait(delay)) first = 0 targetTrack.append(reactIval) hat = globalPropPool.getProp('hat') hat2 = MovieUtil.copyProp(hat) hats = [hat, hat2] cane = globalPropPool.getProp('cane') cane2 = MovieUtil.copyProp(cane) canes = [cane, cane2] leftHands = toon.getLeftHands() rightHands = toon.getRightHands() dScale = 0.5 propTrack = Sequence(Func(MovieUtil.showProps, hats, rightHands, Point3(0.23, 0.09, 0.69), Point3(180, 0, 0)), Func(MovieUtil.showProps, canes, leftHands, Point3(-0.28, 0.0, 0.14), Point3(0.0, 0.0, -150.0)), MovieUtil.getScaleIntervals(hats + canes, dScale, MovieUtil.PNT3_NEARZERO, MovieUtil.PNT3_ONE), Wait(toon.getDuration('happy-dance') - 2.0 * dScale), MovieUtil.getScaleIntervals(hats + canes, dScale, MovieUtil.PNT3_ONE, MovieUtil.PNT3_NEARZERO), Func(MovieUtil.removeProps, hats + canes)) mtrack = Parallel(propTrack, ActorInterval(toon, 'happy-dance'), __getSoundTrack(level, 0.2, duration=6.4, node=toon), targetTrack) track.append(Func(toon.loop, 'neutral')) track.append(Wait(0.1)) track.append(mtrack) if npcId != 0: track.append(MovieNPCSOS.teleportOut(heal, toon)) else: track.append(__returnToBase(heal)) for target in targets: targetToon = target['toon'] track.append(Func(targetToon.clearChat)) return track
def updateQuestInfo(self): for marker in self.buildingMarkers: marker.destroy() self.buildingMarkers = [] for (i, questDesc) in enumerate(self.av.quests): mapIndex = i + 1 quest = Quests.getQuest(questDesc[0]) toNpcId = questDesc[2] completed = quest.getCompletionStatus(self.av, questDesc) == Quests.COMPLETE if not completed: if quest.getType() == Quests.RecoverItemQuest: if quest.getHolder() == Quests.AnyFish: self.putBuildingMarker(self.fishingSpotInfo, mapIndex=mapIndex) continue elif quest.getType() not in (Quests.DeliverGagQuest, Quests.DeliverItemQuest, Quests.VisitQuest, Quests.TrackChoiceQuest): continue if toNpcId == Quests.ToonHQ: self.putBuildingMarker(self.hqPosInfo, mapIndex=mapIndex) continue npcZoneId = NPCToons.getNPCZone(toNpcId) hoodId = ZoneUtil.getCanonicalHoodId(npcZoneId) branchId = ZoneUtil.getCanonicalBranchZone(npcZoneId) if (self.hoodId != hoodId) or (self.zoneId != branchId): continue for blockIndex in xrange( base.cr.playGame.dnaStore.getNumBlockNumbers()): blockNumber = base.cr.playGame.dnaStore.getBlockNumberAt( blockIndex) zoneId = base.cr.playGame.dnaStore.getZoneFromBlockNumber( blockNumber) interiorZoneId = (zoneId - (zoneId % 100)) + 500 + blockNumber if npcZoneId == interiorZoneId: self.putBuildingMarker( base.cr.playGame.dnaStore.getDoorPosHprFromBlockNumber( blockNumber).getPos(render), base.cr.playGame.dnaStore.getDoorPosHprFromBlockNumber( blockNumber).getHpr(render), mapIndex=mapIndex, zoneId=zoneId)
def __init__(self, block, air, zoneId, building): DistributedObjectAI.DistributedObjectAI.__init__(self, air) self.block = block self.zoneId = zoneId self.building = building self.npcs = NPCToons.createNpcsInZone(air, zoneId) self.fsm = ClassicFSM.ClassicFSM('DistributedToonInteriorAI', [ State.State('toon', self.enterToon, self.exitToon, ['beingTakenOver']), State.State('beingTakenOver', self.enterBeingTakenOver, self.exitBeingTakenOver, []), State.State('off', self.enterOff, self.exitOff, []) ], 'toon', 'off') self.fsm.enterInitialState()
def __generateSOS(self, difficulty): g = lambda: random.choice(NPCToons.FOnpcFriends.keys()) v = g() getStars = lambda x: NPCToons.getNPCTrackLevelHpRarity(x)[-1] maxStars = min(2, int(math.ceil(difficulty / 5.))) minStars = max(0, maxStars - 1) while not (minStars <= getStars(v) <= maxStars): v = g() self.notify.info('selected SOS %s (stars = %s)' % (v, getStars(v))) return v
def __generateSOS(self, difficulty): g = lambda: random.choice(NPCToons.FOnpcFriends.keys()) v = g() getStars = lambda x: NPCToons.getNPCTrackLevelHpRarity(x)[-1] maxStars = min(2, int(math.ceil(difficulty / 5.))) minStars = max(0, maxStars - 1) while not (minStars <= getStars(v) <= maxStars): v = g() self.notify.info('selected SOS %s (stars = %s)' % (v, getStars(v))) return v
def __init__(self, block, air, zoneId, building): DistributedObjectAI.DistributedObjectAI.__init__(self, air) self.block = block self.zoneId = zoneId self.building = building self.npcs = NPCToons.createNpcsInZone(air, zoneId) self.fsm = ClassicFSM.ClassicFSM( 'DistributedToonInteriorAI', [ State.State('toon', self.enterToon, self.exitToon, ['beingTakenOver']), State.State('beingTakenOver', self.enterBeingTakenOver, self.exitBeingTakenOver, []), State.State('off', self.enterOff, self.exitOff, []) ], 'toon', 'off') self.fsm.enterInitialState()
def __updateNPCFriendsPanel(self): self.NPCFriends = {} for friend, count in base.localAvatar.NPCFriendsDict.items(): track = NPCToons.getNPCTrack(friend) if ( track == ToontownBattleGlobals.LURE_TRACK and self.canLure == 0 or track == ToontownBattleGlobals.TRAP_TRACK and self.canTrap == 0 ): self.NPCFriends[friend] = 0 else: self.NPCFriends[friend] = count self.NPCFriendPanel.setFriends(self.NPCFriends) self.NPCFriendPanel.update()
def __healJuggle(heal, hasInteractivePropHealBonus): npcId = 0 if 'npcId' in heal: npcId = heal['npcId'] toon = NPCToons.createLocalNPC(npcId) if toon == None: return else: toon = heal['toon'] targets = heal['target'] ineffective = heal['sidestep'] level = heal['level'] if npcId != 0: track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) delay = 4.0 first = 1 targetTrack = Sequence() for target in targets: targetToon = target['toon'] hp = target['hp'] reactIval = Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus) if first == 1: targetTrack.append(Wait(delay)) first = 0 targetTrack.append(reactIval) cube = globalPropPool.getProp('cubes') cube2 = MovieUtil.copyProp(cube) cubes = [cube, cube2] hips = [toon.getLOD(toon.getLODNames()[0]).find('**/joint_hips'), toon.getLOD(toon.getLODNames()[1]).find('**/joint_hips')] cubeTrack = Sequence(Func(MovieUtil.showProps, cubes, hips), MovieUtil.getActorIntervals(cubes, 'cubes'), Func(MovieUtil.removeProps, cubes)) mtrack = Parallel(cubeTrack, __getSoundTrack(level, 0.7, duration=7.7, node=toon), ActorInterval(toon, 'juggle'), targetTrack) track.append(mtrack) if npcId != 0: track.append(MovieNPCSOS.teleportOut(heal, toon)) else: track.append(__returnToBase(heal)) for target in targets: targetToon = target['toon'] track.append(Func(targetToon.clearChat)) return track
def setup(self, blockNumber): self.interior = DistributedGagshopInteriorAI.DistributedGagshopInteriorAI( blockNumber, self.air, self.interiorZone) self.interior.generateWithRequired(self.interiorZone) self.npcs = NPCToons.createNpcsInZone(self.air, self.interiorZone) door = DistributedDoorAI.DistributedDoorAI(self.air, blockNumber, DoorTypes.EXT_STANDARD) insideDoor = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.INT_STANDARD) door.setOtherDoor(insideDoor) insideDoor.setOtherDoor(door) door.zoneId = self.exteriorZone insideDoor.zoneId = self.interiorZone door.generateWithRequired(self.exteriorZone) insideDoor.generateWithRequired(self.interiorZone) self.door = door self.insideDoor = insideDoor
def setup(self, blockNumber): self.interior = DistributedPetshopInteriorAI.DistributedPetshopInteriorAI( blockNumber, self.air, self.interiorZone) self.interior.generateWithRequired(self.interiorZone) self.npcs = NPCToons.createNpcsInZone(self.air, self.interiorZone) door = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.EXT_STANDARD) insideDoor = DistributedDoorAI.DistributedDoorAI( self.air, blockNumber, DoorTypes.INT_STANDARD) door.setOtherDoor(insideDoor) insideDoor.setOtherDoor(door) door.zoneId = self.exteriorZone insideDoor.zoneId = self.interiorZone door.generateWithRequired(self.exteriorZone) insideDoor.generateWithRequired(self.interiorZone) self.door = door self.insideDoor = insideDoor
def setup(self, blockNumber): self.kartShopInterior = DistributedKartShopInteriorAI( blockNumber, self.air, self.interiorZone) self.kartShopInterior.generateWithRequired(self.interiorZone) self.npcs = NPCToons.createNpcsInZone(self.air, self.interiorZone) self.outsideDoor0 = DistributedDoorAI(self.air, blockNumber, DoorTypes.EXT_KS, doorIndex=1) self.outsideDoor1 = DistributedDoorAI(self.air, blockNumber, DoorTypes.EXT_KS, doorIndex=2) self.insideDoor0 = DistributedDoorAI(self.air, blockNumber, DoorTypes.INT_KS, doorIndex=1) self.insideDoor1 = DistributedDoorAI(self.air, blockNumber, DoorTypes.INT_KS, doorIndex=2) self.outsideDoor0.setOtherDoor(self.insideDoor0) self.outsideDoor1.setOtherDoor(self.insideDoor1) self.insideDoor0.setOtherDoor(self.outsideDoor0) self.insideDoor1.setOtherDoor(self.outsideDoor1) self.outsideDoor0.zoneId = self.exteriorZone self.outsideDoor1.zoneId = self.exteriorZone self.insideDoor0.zoneId = self.interiorZone self.insideDoor1.zoneId = self.interiorZone self.outsideDoor0.generateWithRequired(self.exteriorZone) self.outsideDoor1.generateWithRequired(self.exteriorZone) self.insideDoor0.generateWithRequired(self.interiorZone) self.insideDoor1.generateWithRequired(self.interiorZone) self.outsideDoor0.sendUpdate('setDoorIndex', [self.outsideDoor0.getDoorIndex()]) self.outsideDoor1.sendUpdate('setDoorIndex', [self.outsideDoor1.getDoorIndex()]) self.insideDoor0.sendUpdate('setDoorIndex', [self.insideDoor0.getDoorIndex()]) self.insideDoor1.sendUpdate('setDoorIndex', [self.insideDoor1.getDoorIndex()])
def __doSprinkle(attack, recipients, hp=0): toon = NPCToons.createLocalNPC(attack['npcId']) if toon == None: return targets = attack[recipients] level = 4 battle = attack['battle'] track = Sequence(teleportIn(attack, toon)) def face90(target, toon, battle): vec = Point3(target.getPos(battle) - toon.getPos(battle)) vec.setZ(0) temp = vec[0] vec.setX(-vec[1]) vec.setY(temp) targetPoint = Point3(toon.getPos(battle) + vec) toon.headsUp(battle, targetPoint) delay = 2.5 effectTrack = Sequence() for target in targets: sprayEffect = BattleParticles.createParticleEffect(file='pixieSpray') dropEffect = BattleParticles.createParticleEffect(file='pixieDrop') explodeEffect = BattleParticles.createParticleEffect( file='pixieExplode') poofEffect = BattleParticles.createParticleEffect(file='pixiePoof') wallEffect = BattleParticles.createParticleEffect(file='pixieWall') mtrack = Parallel( __getPartTrack(sprayEffect, 1.5, 0.5, [sprayEffect, toon, 0]), __getPartTrack(dropEffect, 1.9, 2.0, [dropEffect, target, 0]), __getPartTrack(explodeEffect, 2.7, 1.0, [explodeEffect, toon, 0]), __getPartTrack(poofEffect, 3.4, 1.0, [poofEffect, target, 0]), __getPartTrack(wallEffect, 4.05, 1.2, [wallEffect, toon, 0]), __getSoundTrack(level, 2, duration=3.1, node=toon), Sequence(Func(face90, target, toon, battle), ActorInterval(toon, 'sprinkle-dust')), Sequence(Wait(delay), Func(__healToon, target, hp))) effectTrack.append(mtrack) track.append(effectTrack) track.append(Func(toon.setHpr, Vec3(180.0, 0.0, 0.0))) track.append(teleportOut(attack, toon)) return track