def test_nodes(self): store = DNAStorage() store.storeNode('files/node.bam', 'dummy', 'node') store.storeHoodNode('files/hood_node.bam', 'dummy', 'hood_node') store.storePlaceNode('files/place_node.bam', 'dummy', 'place_node') self.assertTrue(store.findNode('bad').isEmpty()) self.assertFalse(store.findNode('node').isEmpty()) self.assertFalse(store.findNode('hood_node').isEmpty()) self.assertFalse(store.findNode('place_node').isEmpty()) store.resetNodes() self.assertTrue(store.findNode('node').isEmpty()) store.resetHoodNodes() self.assertTrue(store.findNode('hood_node').isEmpty()) store.resetPlaceNodes() self.assertTrue(store.findNode('place_node').isEmpty())
def test_nodes(self): store = DNAStorage() store.storeNode('files/node.bam', 'dummy', 'node') store.storeHoodNode('files/hood_node.bam', 'dummy', 'hood_node') store.storePlaceNode('files/place_node.bam', 'dummy', 'place_node') self.assertTrue(store.findNode('bad').isEmpty()) self.assertFalse(store.findNode('node').isEmpty()) self.assertFalse(store.findNode('hood_node').isEmpty()) self.assertFalse(store.findNode('place_node').isEmpty()) store.resetNodes() self.assertTrue(store.findNode('node').isEmpty()) store.resetHoodNodes() self.assertTrue(store.findNode('hood_node').isEmpty()) store.resetPlaceNodes() self.assertTrue(store.findNode('place_node').isEmpty())
class PlayGame(StateData.StateData): notify = DirectNotifyGlobal.directNotify.newCategory('PlayGame') Hood2ClassDict = { ToontownGlobals.ToontownCentral: TTHood.TTHood, ToontownGlobals.DonaldsDock: DDHood.DDHood, ToontownGlobals.TheBrrrgh: BRHood.BRHood, ToontownGlobals.MinniesMelodyland: MMHood.MMHood, ToontownGlobals.DaisyGardens: DGHood.DGHood, ToontownGlobals.DonaldsDreamland: DLHood.DLHood, ToontownGlobals.GoofySpeedway: GSHood.GSHood, ToontownGlobals.OutdoorZone: OZHood.OZHood, ToontownGlobals.Tutorial: TutorialHood.TutorialHood, ToontownGlobals.MyEstate: EstateHood.EstateHood, ToontownGlobals.BossbotHQ: BossbotHQ.BossbotHQ, ToontownGlobals.SellbotHQ: SellbotHQ.SellbotHQ, ToontownGlobals.CashbotHQ: CashbotHQ.CashbotHQ, ToontownGlobals.LawbotHQ: LawbotHQ.LawbotHQ, ToontownGlobals.GolfZone: GZHood.GZHood, ToontownGlobals.PartyHood: PartyHood.PartyHood } Hood2StateDict = { ToontownGlobals.ToontownCentral: 'TTHood', ToontownGlobals.DonaldsDock: 'DDHood', ToontownGlobals.TheBrrrgh: 'BRHood', ToontownGlobals.MinniesMelodyland: 'MMHood', ToontownGlobals.DaisyGardens: 'DGHood', ToontownGlobals.DonaldsDreamland: 'DLHood', ToontownGlobals.GoofySpeedway: 'GSHood', ToontownGlobals.OutdoorZone: 'OZHood', ToontownGlobals.Tutorial: 'TutorialHood', ToontownGlobals.MyEstate: 'EstateHood', ToontownGlobals.BossbotHQ: 'BossbotHQ', ToontownGlobals.SellbotHQ: 'SellbotHQ', ToontownGlobals.CashbotHQ: 'CashbotHQ', ToontownGlobals.LawbotHQ: 'LawbotHQ', ToontownGlobals.GolfZone: 'GZHood', ToontownGlobals.PartyHood: 'PartyHood' } def __init__(self, parentFSM, doneEvent): StateData.StateData.__init__(self, doneEvent) self.place = None self.fsm = ClassicFSM.ClassicFSM('PlayGame', [ State.State('start', self.enterStart, self.exitStart, ['quietZone']), State.State('quietZone', self.enterQuietZone, self.exitQuietZone, [ 'TTHood', 'DDHood', 'BRHood', 'MMHood', 'DGHood', 'DLHood', 'GSHood', 'OZHood', 'GZHood', 'SellbotHQ', 'CashbotHQ', 'LawbotHQ', 'BossbotHQ', 'TutorialHood', 'EstateHood', 'PartyHood' ]), State.State('TTHood', self.enterTTHood, self.exitTTHood, ['quietZone']), State.State('DDHood', self.enterDDHood, self.exitDDHood, ['quietZone']), State.State('BRHood', self.enterBRHood, self.exitBRHood, ['quietZone']), State.State('MMHood', self.enterMMHood, self.exitMMHood, ['quietZone']), State.State('DGHood', self.enterDGHood, self.exitDGHood, ['quietZone']), State.State('DLHood', self.enterDLHood, self.exitDLHood, ['quietZone']), State.State('GSHood', self.enterGSHood, self.exitGSHood, ['quietZone']), State.State('OZHood', self.enterOZHood, self.exitOZHood, ['quietZone']), State.State('GZHood', self.enterGZHood, self.exitGZHood, ['quietZone']), State.State('BossbotHQ', self.enterBossbotHQ, self.exitBossbotHQ, ['quietZone']), State.State('SellbotHQ', self.enterSellbotHQ, self.exitSellbotHQ, ['quietZone']), State.State('CashbotHQ', self.enterCashbotHQ, self.exitCashbotHQ, ['quietZone']), State.State('LawbotHQ', self.enterLawbotHQ, self.exitLawbotHQ, ['quietZone']), State.State('TutorialHood', self.enterTutorialHood, self.exitTutorialHood, ['quietZone']), State.State('EstateHood', self.enterEstateHood, self.exitEstateHood, ['quietZone']), State.State('PartyHood', self.enterPartyHood, self.exitPartyHood, ['quietZone']) ], 'start', 'start') self.fsm.enterInitialState() self.parentFSM = parentFSM self.parentFSM.getStateNamed('playGame').addChild(self.fsm) self.hoodDoneEvent = 'hoodDone' self.hood = None self.quietZoneDoneEvent = uniqueName('quietZoneDone') self.quietZoneStateData = None return def enter(self, hoodId, zoneId, avId): if hoodId == ToontownGlobals.Tutorial: loaderName = 'townLoader' whereName = 'toonInterior' elif hoodId == ToontownGlobals.MyEstate: self.getEstateZoneAndGoHome(avId, zoneId) return elif hoodId == ToontownGlobals.PartyHood: self.getPartyZoneAndGoToParty(avId, zoneId) return else: loaderName = ZoneUtil.getLoaderName(zoneId) whereName = ZoneUtil.getToonWhereName(zoneId) self.fsm.request('quietZone', [{ 'loader': loaderName, 'where': whereName, 'how': 'teleportIn', 'hoodId': hoodId, 'zoneId': zoneId, 'shardId': None, 'avId': avId }]) return def exit(self): if base.placeBeforeObjects and self.quietZoneStateData: self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None self.ignore(self.quietZoneDoneEvent) return def load(self): pass def loadDnaStoreTutorial(self): self.dnaStore = DNAStorage() files = ('phase_3.5/dna/storage_tutorial.dna', 'phase_3.5/dna/storage_interior.dna') dnaBulk = DNABulkLoader(self.dnaStore, files) dnaBulk.loadDNAFiles() def loadDnaStore(self): if not hasattr(self, 'dnaStore'): self.dnaStore = DNAStorage() files = ('phase_4/dna/storage.dna', 'phase_3.5/dna/storage_interior.dna') dnaBulk = DNABulkLoader(self.dnaStore, files) dnaBulk.loadDNAFiles() self.dnaStore.storeFont('humanist', ToontownGlobals.getInterfaceFont()) self.dnaStore.storeFont('mickey', ToontownGlobals.getSignFont()) self.dnaStore.storeFont('suit', ToontownGlobals.getSuitFont()) def unloadDnaStore(self): if hasattr(self, 'dnaStore'): del self.dnaStore ModelPool.garbageCollect() TexturePool.garbageCollect() def unload(self): self.unloadDnaStore() if self.hood: self.notify.info('Aggressively cleaning up hood: %s' % self.hood) self.hood.exit() self.hood.unload() self.hood = None base.cr.cache.flush() def enterStart(self): pass def exitStart(self): pass def handleHoodDone(self): doneStatus = self.hood.getDoneStatus() shardId = doneStatus['shardId'] if shardId != None: self.doneStatus = doneStatus messenger.send(self.doneEvent) base.transitions.fadeOut(0) return if doneStatus['where'] == 'party': self.getPartyZoneAndGoToParty(doneStatus['avId'], doneStatus['zoneId']) return how = doneStatus['how'] if how in ['tunnelIn', 'teleportIn', 'doorIn', 'elevatorIn', 'walk']: self.fsm.request('quietZone', [doneStatus]) else: self.notify.error('Exited hood with unexpected mode %s' % how) return def _destroyHood(self): self.unload() def enterQuietZone(self, requestStatus): self.acceptOnce(self.quietZoneDoneEvent, self.handleQuietZoneDone) self.quietZoneStateData = QuietZoneState.QuietZoneState( self.quietZoneDoneEvent) self._quietZoneLeftEvent = self.quietZoneStateData.getQuietZoneLeftEvent( ) if base.placeBeforeObjects: self.acceptOnce(self._quietZoneLeftEvent, self.handleLeftQuietZone) self._enterWaitForSetZoneResponseMsg = self.quietZoneStateData.getEnterWaitForSetZoneResponseMsg( ) self.acceptOnce(self._enterWaitForSetZoneResponseMsg, self.handleWaitForSetZoneResponse) self.quietZoneStateData.load() self.quietZoneStateData.enter(requestStatus) def exitQuietZone(self): self.ignore(self._quietZoneLeftEvent) self.ignore(self._enterWaitForSetZoneResponseMsg) if not base.placeBeforeObjects: self.ignore(self.quietZoneDoneEvent) self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None return def handleWaitForSetZoneResponse(self, requestStatus): hoodId = requestStatus['hoodId'] canonicalHoodId = ZoneUtil.getCanonicalZoneId(hoodId) toHoodPhrase = ToontownGlobals.hoodNameMap[canonicalHoodId][0] hoodName = ToontownGlobals.hoodNameMap[canonicalHoodId][-1] zoneId = requestStatus['zoneId'] requestStatus['loader'] = 'cogHQLoader' if ZoneUtil.isCogHQZone( hoodId) else requestStatus['loader'] loaderName = requestStatus['loader'] avId = requestStatus.get('avId', -1) ownerId = requestStatus.get('ownerId', avId) if base.config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: NEIGHBORHOODS: Visit %s' % hoodName) count = ToontownGlobals.hoodCountMap[canonicalHoodId] if loaderName == 'safeZoneLoader': count += ToontownGlobals.safeZoneCountMap[canonicalHoodId] elif loaderName == 'townLoader': count += ToontownGlobals.townCountMap[canonicalHoodId] if not loader.inBulkBlock: if hoodId == ToontownGlobals.MyEstate: if avId == -1: loader.beginBulkLoad('hood', TTLocalizer.HeadingToYourEstate, count, 1, TTLocalizer.TIP_ESTATE, zoneId) else: owner = base.cr.identifyAvatar(ownerId) if owner == None: friend = base.cr.identifyAvatar(avId) if friend != None: avName = friend.getName() loader.beginBulkLoad( 'hood', TTLocalizer.HeadingToFriend % avName, count, 1, TTLocalizer.TIP_ESTATE, zoneId) else: self.notify.warning( "we can't perform this teleport") return else: avName = owner.getName() loader.beginBulkLoad( 'hood', TTLocalizer.HeadingToEstate % avName, count, 1, TTLocalizer.TIP_ESTATE, zoneId) elif ZoneUtil.isCogHQZone(zoneId): loader.beginBulkLoad( 'hood', TTLocalizer.HeadingToHood % { 'to': toHoodPhrase, 'hood': hoodName }, count, 1, TTLocalizer.TIP_COGHQ, zoneId) elif ZoneUtil.isGoofySpeedwayZone(zoneId): loader.beginBulkLoad( 'hood', TTLocalizer.HeadingToHood % { 'to': toHoodPhrase, 'hood': hoodName }, count, 1, TTLocalizer.TIP_KARTING, zoneId) else: loader.beginBulkLoad( 'hood', TTLocalizer.HeadingToHood % { 'to': toHoodPhrase, 'hood': hoodName }, count, 1, TTLocalizer.TIP_GENERAL, zoneId) if hoodId == ToontownGlobals.Tutorial: self.loadDnaStoreTutorial() else: if not hasattr(self, 'dnaStore'): self.loadDnaStore() hoodClass = self.getHoodClassByNumber(canonicalHoodId) self.hood = hoodClass(self.fsm, self.hoodDoneEvent, self.dnaStore, hoodId) self.hood.load() self.hood.loadLoader(requestStatus) if not base.placeBeforeObjects: loader.endBulkLoad('hood') return def handleLeftQuietZone(self): status = self.quietZoneStateData.getRequestStatus() hoodId = ZoneUtil.getCanonicalZoneId(status['hoodId']) hoodState = self.getHoodStateByNumber(hoodId) self.fsm.request(hoodState, [status]) def handleQuietZoneDone(self): if base.placeBeforeObjects: self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None loader.endBulkLoad('hood') else: self.handleLeftQuietZone() return def enterTTHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitTTHood(self): self._destroyHood() def enterDDHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitDDHood(self): self._destroyHood() def enterMMHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitMMHood(self): self._destroyHood() def enterBRHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitBRHood(self): self._destroyHood() def enterDGHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitDGHood(self): self._destroyHood() def enterDLHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitDLHood(self): self._destroyHood() def enterGSHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitGSHood(self): self._destroyHood() def enterOZHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitOZHood(self): self._destroyHood() def enterGZHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitGZHood(self): self._destroyHood() def enterSellbotHQ(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitSellbotHQ(self): self._destroyHood() def enterCashbotHQ(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitCashbotHQ(self): self._destroyHood() def enterLawbotHQ(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitLawbotHQ(self): self._destroyHood() def enterBossbotHQ(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitBossbotHQ(self): self._destroyHood() def enterTutorialHood(self, requestStatus): messenger.send('toonArrivedTutorial') self.accept(self.hoodDoneEvent, self.handleHoodDone) base.localAvatar.book.obscureButton(1) base.localAvatar.book.setSafeMode(1) base.localAvatar.laffMeter.obscure(1) base.localAvatar.chatMgr.obscure(1, 1, 1) base.localAvatar.obscureFriendsListButton(1) requestStatus['how'] = 'tutorial' if base.config.GetString('language', 'english') == 'japanese': musicVolume = base.config.GetFloat('tutorial-music-volume', 0.5) requestStatus['musicVolume'] = musicVolume self.hood.enter(requestStatus) def exitTutorialHood(self): self.unloadDnaStore() self._destroyHood() base.localAvatar.book.obscureButton(0) base.localAvatar.book.setSafeMode(0) base.localAvatar.laffMeter.obscure(0) base.localAvatar.chatMgr.obscure(0, 0, 0) base.localAvatar.obscureFriendsListButton(-1) def enterEstateHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) self.hood.enter(requestStatus) def exitEstateHood(self): self._destroyHood() def getEstateZoneAndGoHome(self, avId, zoneId): self.doneStatus = { 'avId': avId, 'zoneId': zoneId, 'hoodId': ToontownGlobals.MyEstate, 'loader': 'safeZoneLoader', 'how': 'teleportIn', 'shardId': None } self.acceptOnce('setLocalEstateZone', self.goHome) if avId > 0: base.cr.estateMgr.getLocalEstateZone(avId) else: base.cr.estateMgr.getLocalEstateZone(base.localAvatar.getDoId()) return def goHome(self, ownerId, zoneId): self.notify.debug('goHome ownerId = %s' % ownerId) if ownerId > 0 and ownerId != base.localAvatar.doId and not base.cr.isFriend( ownerId): self.doneStatus['failed'] = 1 taskMgr.remove('goHomeFailed') taskMgr.add(self.goHomeFailed, 'goHomeFailed') return if ownerId == 0 and zoneId == 0: self.doneStatus['failed'] = 1 self.goHomeFailed(None) return if self.doneStatus['zoneId'] != zoneId: self.doneStatus['where'] = 'house' else: self.doneStatus['where'] = 'estate' self.doneStatus['ownerId'] = ownerId self.fsm.request('quietZone', [self.doneStatus]) return def goHomeFailed(self, task): self.notify.debug('goHomeFailed') failedToVisitAvId = self.doneStatus.get('avId') if failedToVisitAvId > 0: message = TTLocalizer.EstateTeleportFailedNotFriends % base.cr.identifyAvatar( failedToVisitAvId).getName() else: message = TTLocalizer.EstateTeleportFailed self.notify.debug('goHomeFailed, why =: %s' % message) self.ignore('setLocalEstateZone') zoneId = base.localAvatar.lastHood loaderName = ZoneUtil.getLoaderName(zoneId) whereName = ZoneUtil.getToonWhereName(zoneId) base.localAvatar.setSystemMessage(0, message) self.fsm.request('quietZone', [{ 'loader': loaderName, 'where': whereName, 'how': 'teleportIn', 'hoodId': zoneId, 'zoneId': zoneId, 'shardId': None }]) return Task.done def enterPartyHood(self, requestStatus): self.accept(self.hoodDoneEvent, self.handleHoodDone) requestStatus['where'] = 'party' self.hood.enter(requestStatus) def exitPartyHood(self): self._destroyHood() def getPartyZoneAndGoToParty(self, avId, zoneId): self.doneStatus = { 'avId': avId, 'zoneId': zoneId, 'hoodId': ToontownGlobals.PartyHood, 'loader': 'safeZoneLoader', 'how': 'teleportIn', 'shardId': None } if avId < 0: avId = base.localAvatar.getDoId() base.cr.partyManager.requestPartyZone(avId, zoneId, callback=self.goToParty) return def goToParty(self, ownerId, partyId, zoneId): if ownerId == 0 or partyId == 0 or zoneId == 0: self.doneStatus['where'] = 'playground' else: self.doneStatus['where'] = 'party' self.doneStatus['ownerId'] = ownerId self.doneStatus['partyId'] = partyId self.doneStatus['zoneId'] = zoneId self.fsm.request('quietZone', [self.doneStatus]) def goToPartyFailed(self, reason): self.notify.debug('goToPartyFailed') failedToVisitAvId = self.doneStatus.get('avId') message = base.cr.partyManager.getGoToPartyFailedMessage(reason) self.notify.debug('goToPartyFailed, why =: %s' % message) self.ignore('gotLocalPartyZone') zoneId = base.localAvatar.lastHood loaderName = ZoneUtil.getLoaderName(zoneId) whereName = ZoneUtil.getToonWhereName(zoneId) base.localAvatar.setSystemMessage(0, message) self.fsm.request('quietZone', [{ 'loader': loaderName, 'where': whereName, 'how': 'teleportIn', 'hoodId': zoneId, 'zoneId': zoneId, 'shardId': None }]) return Task.done def getCatalogCodes(self, category): numCodes = self.dnaStore.getNumCatalogCodes(category) codes = [] for i in range(numCodes): codes.append(self.dnaStore.getCatalogCode(category, i)) return codes def getNodePathList(self, catalogGroup): result = [] codes = self.getCatalogCodes(catalogGroup) for code in codes: np = self.dnaStore.findNode(code) result.append(np) return result def getNodePathDict(self, catalogGroup): result = {} codes = self.getCatalogCodes(catalogGroup) for code in codes: np = self.dnaStore.findNode(code) result[code] = np return result def getHoodClassByNumber(self, hoodNumber): return self.Hood2ClassDict[hoodNumber] def getHoodStateByNumber(self, hoodNumber): return self.Hood2StateDict[hoodNumber] def setPlace(self, place): self.place = place if self.place: messenger.send('playGameSetPlace') def getPlace(self): return self.place def getPlaceId(self): if self.hood: return self.hood.hoodId else: return None return None