From 3c8eb1c8483de0b406ab28732d9559652822eb9d Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sat, 11 Jul 2015 16:36:04 -0400 Subject: [PATCH 001/161] pushed branch k --- kfc.bucket | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 kfc.bucket diff --git a/kfc.bucket b/kfc.bucket new file mode 100644 index 00000000..e69de29b From cd56e91057864c86a92da59458a10ce219ff95a3 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sun, 12 Jul 2015 12:48:58 -0400 Subject: [PATCH 002/161] New NetMessenger --- toontown/ai/ToontownAIRepository.py | 1 + toontown/distributed/ShardStatusReceiver.py | 5 ++- toontown/distributed/ToontownDistrictAI.py | 15 +++----- .../distributed/ToontownDistrictStatsAI.py | 6 ++-- .../distributed/ToontownInternalRepository.py | 25 ++++++++++--- .../distributed/ToontownNetMessengerAI.py | 35 +++++++++++++++++++ toontown/rpc/ToontownRPCHandler.py | 4 +-- toontown/suit/SuitInvasionManagerAI.py | 12 +++---- toontown/uberdog/ToontownUberRepository.py | 1 + 9 files changed, 75 insertions(+), 29 deletions(-) create mode 100644 toontown/distributed/ToontownNetMessengerAI.py diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index 62b13812..1435a642 100755 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -178,6 +178,7 @@ class ToontownAIRepository(ToontownInternalRepository): self.cogHeadquarters.append(BossbotHQAI.BossbotHQAI(self)) def handleConnected(self): + ToontownInternalRepository.handleConnected(self) self.districtId = self.allocateChannel() self.notify.info('Creating ToontownDistrictAI(%d)...' % self.districtId) self.distributedDistrict = ToontownDistrictAI(self) diff --git a/toontown/distributed/ShardStatusReceiver.py b/toontown/distributed/ShardStatusReceiver.py index e7c01afd..e297cdbb 100755 --- a/toontown/distributed/ShardStatusReceiver.py +++ b/toontown/distributed/ShardStatusReceiver.py @@ -5,10 +5,9 @@ class ShardStatusReceiver: self.shards = {} # Accept the shardStatus event: - self.air.netMessenger.accept('shardStatus', self, self.handleShardStatus) + self.air.accept('shardStatus', self.handleShardStatus) - # Query the status of any existing shards: - self.air.netMessenger.send('queryShardStatus') + self.air.sendNetEvent('queryShardStatus') def handleShardStatus(self, channel, status): self.shards.setdefault(channel, {}).update(status) diff --git a/toontown/distributed/ToontownDistrictAI.py b/toontown/distributed/ToontownDistrictAI.py index a98cb931..aff9e313 100755 --- a/toontown/distributed/ToontownDistrictAI.py +++ b/toontown/distributed/ToontownDistrictAI.py @@ -14,7 +14,7 @@ class ToontownDistrictAI(DistributedDistrictAI): # We want to handle shard status queries so that a ShardStatusReceiver # being created after we're generated will know where we're at: - self.air.netMessenger.accept('queryShardStatus', self, self.handleShardStatusQuery) + self.air.accept('shardStatus', self.handleShardStatusQuery) # Send a shard status update with the information we have: status = { @@ -22,12 +22,7 @@ class ToontownDistrictAI(DistributedDistrictAI): 'name': self.name, 'created': int(time.time()) } - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) - - # Add a post remove shard status update in-case we go down: - status = {'available': False} - datagram = self.air.netMessenger.prepare('shardStatus', [self.air.ourChannel, status]) - self.air.addPostRemove(datagram) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) def handleShardStatusQuery(self): # Send a shard status update with the information we have: @@ -36,18 +31,18 @@ class ToontownDistrictAI(DistributedDistrictAI): 'name': self.name, 'created': int(time.time()) } - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) def setName(self, name): DistributedDistrictAI.setName(self, name) # Send a shard status update containing our name: status = {'name': name} - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) def setAvailable(self, available): DistributedDistrictAI.setAvailable(self, available) # Send a shard status update containing our availability: status = {'available': bool(available)} - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) diff --git a/toontown/distributed/ToontownDistrictStatsAI.py b/toontown/distributed/ToontownDistrictStatsAI.py index 15a615b1..60d71fae 100755 --- a/toontown/distributed/ToontownDistrictStatsAI.py +++ b/toontown/distributed/ToontownDistrictStatsAI.py @@ -13,12 +13,12 @@ class ToontownDistrictStatsAI(DistributedObjectAI): # We want to handle shard status queries so that a ShardStatusReceiver # being created after we're generated will know where we're at: - self.air.netMessenger.accept('queryShardStatus', self, self.handleShardStatusQuery) + self.air.accept('shardStatus', self.handleShardStatusQuery) def handleShardStatusQuery(self): # Send a shard status update containing our population: status = {'population': self.avatarCount} - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) + self.air.sentNetEvent('shardStatus', [self.air.ourChannel, status]) def setDistrictId(self, districtId): self.districtId = districtId @@ -38,7 +38,7 @@ class ToontownDistrictStatsAI(DistributedObjectAI): # Send a shard status update containing our population: status = {'population': self.avatarCount} - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) def d_setAvatarCount(self, avatarCount): self.sendUpdate('setAvatarCount', [avatarCount]) diff --git a/toontown/distributed/ToontownInternalRepository.py b/toontown/distributed/ToontownInternalRepository.py index 084809ad..49ad9269 100755 --- a/toontown/distributed/ToontownInternalRepository.py +++ b/toontown/distributed/ToontownInternalRepository.py @@ -1,5 +1,6 @@ from direct.distributed.AstronInternalRepository import AstronInternalRepository from otp.distributed.OtpDoGlobals import * +from toontown.distributed.ToontownNetMessengerAI import ToontownNetMessengerAI class ToontownInternalRepository(AstronInternalRepository): GameGlobalsId = OTP_DO_ID_TOONTOWN @@ -10,11 +11,25 @@ class ToontownInternalRepository(AstronInternalRepository): AstronInternalRepository.__init__( self, baseChannel, serverId=serverId, dcFileNames=dcFileNames, dcSuffix=dcSuffix, connectMethod=connectMethod, threadedNet=threadedNet) - - self.netMessenger.register(0, 'shardStatus') - self.netMessenger.register(1, 'queryShardStatus') - self.netMessenger.register(2, 'startInvasion') - self.netMessenger.register(3, 'stopInvasion') + + def handleConnected(self): + self.__messenger = ToontownNetMessengerAI(self) + + def sendNetEvent(self, message, sentArgs=[]): + self.__messenger.send(message, sentArgs) + + def addExitEvent(self, message): + dg = self.__messenger.prepare(message) + self.addPostRemove(dg) + + def handleDatagram(self, di): + msgType = self.getMsgType() + + if msgType == self.__messenger.msgType: + self.__messenger.handle(msgType, di) + return + + AstronInternalRepository.handleDatagram(self, di) def getAvatarIdFromSender(self): return self.getMsgSender() & 0xFFFFFFFF diff --git a/toontown/distributed/ToontownNetMessengerAI.py b/toontown/distributed/ToontownNetMessengerAI.py new file mode 100644 index 00000000..81ef7ff8 --- /dev/null +++ b/toontown/distributed/ToontownNetMessengerAI.py @@ -0,0 +1,35 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.PyDatagram import PyDatagram +import cPickle, zlib + +class ToontownNetMessengerAI: + """ + This works very much like the NetMessenger class except that + this is much simpler and makes much more sense. + """ + notify = DirectNotifyGlobal.directNotify.newCategory('ToontownNetMessengerAI') + + def __init__(self, air, msgChannel=40000, msgType=54321): + self.air = air + self.air.registerForChannel(msgChannel) + self.msgChannel = msgChannel + self.msgType = msgType + + def prepare(self, message, sentArgs=[]): + dg = PyDatagram() + dg.addServerHeader(self.msgChannel, self.air.ourChannel, self.msgType) + dg.addString(message) + dg.addString(zlib.compress(cPickle.dumps(sentArgs))) + return dg + + def send(self, message, sentArgs=[]): + self.notify.debug('sendNetEvent: %s %r' % (message, sentArgs)) + dg = self.prepare(message, sentArgs) + self.air.send(dg) + + def handle(self, msgType, di): + message = di.getString() + data = zlib.decompress(di.getString()) + sentArgs = cPickle.loads(data) + messenger.send(message, sentArgs) + \ No newline at end of file diff --git a/toontown/rpc/ToontownRPCHandler.py b/toontown/rpc/ToontownRPCHandler.py index cf246871..0f98f723 100755 --- a/toontown/rpc/ToontownRPCHandler.py +++ b/toontown/rpc/ToontownRPCHandler.py @@ -716,7 +716,7 @@ class ToontownRPCHandler(ToontownRPCHandlerBase): = Extra invasion flags. = The invasion type. """ - self.air.netMessenger.send( + self.air.sendNetEvent( 'startInvasion', [shardId, suitDeptIndex, suitTypeIndex, flags, type]) @@ -730,7 +730,7 @@ class ToontownRPCHandler(ToontownRPCHandlerBase): [int shardId] = The ID of the shard that is running the invasion to be terminated. """ - self.air.netMessenger.send('stopInvasion', [shardId]) + self.air.sendNetEvent('stopInvasion', [shardId]) # --- NAME APPROVAL --- diff --git a/toontown/suit/SuitInvasionManagerAI.py b/toontown/suit/SuitInvasionManagerAI.py index cf1a595b..055bf96e 100755 --- a/toontown/suit/SuitInvasionManagerAI.py +++ b/toontown/suit/SuitInvasionManagerAI.py @@ -18,14 +18,14 @@ class SuitInvasionManagerAI: self.suitTypeIndex = None self.flags = 0 - self.air.netMessenger.accept( - 'startInvasion', self, self.handleStartInvasion) - self.air.netMessenger.accept( - 'stopInvasion', self, self.handleStopInvasion) + self.air.accept( + 'startInvasion', self.handleStartInvasion) + self.air.accept( + 'stopInvasion', self.handleStopInvasion) # We want to handle shard status queries so that a ShardStatusReceiver # being created after we're created will know where we're at: - self.air.netMessenger.accept('queryShardStatus', self, self.sendInvasionStatus) + self.air.accept('queryShardStatus', self.sendInvasionStatus) self.sendInvasionStatus() @@ -224,4 +224,4 @@ class SuitInvasionManagerAI: } else: status = {'invasion': None} - self.air.netMessenger.send('shardStatus', [self.air.ourChannel, status]) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) diff --git a/toontown/uberdog/ToontownUberRepository.py b/toontown/uberdog/ToontownUberRepository.py index 720f10c0..8d3464b0 100755 --- a/toontown/uberdog/ToontownUberRepository.py +++ b/toontown/uberdog/ToontownUberRepository.py @@ -29,6 +29,7 @@ class ToontownUberRepository(ToontownInternalRepository): self.notify.setInfo(True) def handleConnected(self): + ToontownInternalRepository.handleConnected(self) rootObj = DistributedDirectoryAI(self) rootObj.generateWithRequiredAndId(self.getGameDoId(), 0, 0) From cb9b4f8d09ec13fe2d9d34eeeea1527327c1a464 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sun, 12 Jul 2015 12:51:05 -0400 Subject: [PATCH 003/161] Typo. --- toontown/distributed/ToontownDistrictStatsAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/distributed/ToontownDistrictStatsAI.py b/toontown/distributed/ToontownDistrictStatsAI.py index 60d71fae..e31fe4d0 100755 --- a/toontown/distributed/ToontownDistrictStatsAI.py +++ b/toontown/distributed/ToontownDistrictStatsAI.py @@ -18,7 +18,7 @@ class ToontownDistrictStatsAI(DistributedObjectAI): def handleShardStatusQuery(self): # Send a shard status update containing our population: status = {'population': self.avatarCount} - self.air.sentNetEvent('shardStatus', [self.air.ourChannel, status]) + self.air.sendNetEvent('shardStatus', [self.air.ourChannel, status]) def setDistrictId(self, districtId): self.districtId = districtId From c8919bf0aa973b1cb6bf7ac82d2deb4e59a53975 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sun, 12 Jul 2015 13:44:01 -0400 Subject: [PATCH 004/161] Fix buttons hiding behind catalog screen. --- toontown/catalog/CatalogScreen.py | 1 + 1 file changed, 1 insertion(+) diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index 30d3e947..03a6a1a2 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -33,6 +33,7 @@ class CatalogScreen(DirectFrame): def __init__(self, parent = aspect2d, **kw): guiItems = loader.loadModel('phase_5.5/models/gui/catalog_gui') background = guiItems.find('**/catalog_background') + background.setBin("background", 10) guiButton = loader.loadModel('phase_3/models/gui/quit_button') guiBack = loader.loadModel('phase_5.5/models/gui/package_delivery_panel') optiondefs = (('scale', 0.667, None), From 4e8fb45531b753a5b4e5def54a4e0f050546083a Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sun, 12 Jul 2015 15:42:55 -0400 Subject: [PATCH 005/161] Current progress on gifting. --- dependencies/config/release/dev.prc | 1 + toontown/catalog/CatalogItem.py | 4 +- toontown/catalog/CatalogManagerUD.py | 43 +++ toontown/catalog/CatalogScreen.py | 2 + toontown/estate/DistributedPhoneAI.py | 305 +++++++++++++-------- toontown/toon/DistributedToonAI.py | 11 +- toontown/uberdog/ToontownUberRepository.py | 4 + toontown/uberdog/TopToonsGlobals.py | 15 + 8 files changed, 266 insertions(+), 119 deletions(-) create mode 100644 toontown/catalog/CatalogManagerUD.py create mode 100644 toontown/uberdog/TopToonsGlobals.py diff --git a/dependencies/config/release/dev.prc b/dependencies/config/release/dev.prc index 03c7bf6e..4bf0134a 100644 --- a/dependencies/config/release/dev.prc +++ b/dependencies/config/release/dev.prc @@ -29,6 +29,7 @@ want-find-four #t want-chinese-checkers #t want-checkers #t want-house-types #t +want-gifting #t # Chat: want-whitelist #t diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index 58c91f4d..a54abc36 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -287,7 +287,7 @@ class CatalogItem: p, r) if store & GiftTag: - self.giftTag = di.getString() + self.giftTag = di.getUint32() self.specialEventId = di.getUint8() def encodeDatagram(self, dg, store): @@ -301,7 +301,7 @@ class CatalogItem: dg.putArg(self.posHpr[4], STInt8, 256.0 / 360.0) dg.putArg(self.posHpr[5], STInt8, 256.0 / 360.0) if store & GiftTag: - dg.addString(self.giftTag) + dg.addUint32(self.giftTag) dg.addUint8(self.specialEventId) def getTypeCode(self): diff --git a/toontown/catalog/CatalogManagerUD.py b/toontown/catalog/CatalogManagerUD.py new file mode 100644 index 00000000..aec62c1b --- /dev/null +++ b/toontown/catalog/CatalogManagerUD.py @@ -0,0 +1,43 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.showbase.DirectObject import DirectObject + +from toontown.catalog import CatalogItem, CatalogItemList + +class CatalogManagerUD(DirectObject): + notify = DirectNotifyGlobal.directNotify.newCategory('CatalogManagerUD') + TIMEOUT = 15 + + def __init__(self, air): + self.air = air + + self.accept('CATALOG_addGift_AI2UD', self.__handleCatalogAddGift) + self.accept('CATALOG_addGift_UD2Toon_resp', self.__handleToonResp) + + self.__context = 0 + + def __handleCatalogAddGift(self, avId, blob): + ctx = self.__context + self.__context += 1 + self.air.sendNetEvent('CATALOG_addGift_UD2Toon_%d' % avId, [blob, ctx]) + taskMgr.doMethodLater(self.TIMEOUT, self.__doTimeout, 'catalogMgr-timeout-%d' % ctx, [blob, avId]) + + def __handleToonResp(self, avId, ctx): + self.notify.info('%d is online, gift deliver order handled by AI' % avId) + taskMgr.remove('catalogMgr-timeout-%d' % ctx) + + def __doTimeout(self, blob, avId): + self.notify.info('%d is offline, adding order to database' % avId) + self.air.dbInterface.queryObject(self.air.dbId, avId, lambda a, b: self.__handleRetrieve(a, b, avId, blob)) + + def __handleRetrieve(self, dclass, fields, avId, blob): + if dclass != self.air.dclassesByName['DistributedToonUD']: + self.notify.warning('Unable to deliver gift: avId is not a DistributedToon!') + return + + store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag + giftOnOrder = CatalogItemList.CatalogItemList(fields.get('setGiftSchedule', [''])[0], store=store) + giftOnOrder.append(CatalogItem.getItem(blob, store=store)) + fields['setGiftSchedule'] = (giftOnOrder.getBlob(store=store),) + + self.air.dbInterface.updateObject(self.air.dbId, avId, self.air.dclassesByName['DistributedToonUD'], fields) + self.notify.info('Successfully delivered gift to %d' % avId) \ No newline at end of file diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index 03a6a1a2..1fa5d661 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -94,6 +94,7 @@ class CatalogScreen(DirectFrame): if hasattr(self, 'giftToggle'): self.giftToggle['state'] = DGG.NORMAL self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOn + #self.__handleUDack() def hide(self): self.ignore('CatalogItemPurchaseRequest') @@ -544,6 +545,7 @@ class CatalogScreen(DirectFrame): -1.45), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.9 + lift), image=backDown, pressEffect=0, command=self.showEmblemItems, text=TTLocalizer.CatalogEmblem, text_font=ToontownGlobals.getSignFont(), text_pos=(1.75, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.emblemCatalogButton2.hide() self.__makeFFlist() + print self.ffList if len(self.ffList) > 0: if config.GetBool('want-gifting', True): self.giftToggle = DirectButton(self.base, relief=None, pressEffect=0, image=(giftToggleUp, giftToggleDown, giftToggleUp), image_scale=(1.0, 1, 0.7), command=self.__giftToggle, text=TTLocalizer.CatalogGiftToggleOff, text_font=ToontownGlobals.getSignFont(), text_pos=TTLocalizer.CSgiftTogglePos, text_scale=TTLocalizer.CSgiftToggle, text_fg=(0.353, 0.627, 0.627, 1.0), text3_fg=(0.15, 0.3, 0.3, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0), image_color=Vec4(1.0, 1.0, 0.2, 1.0), image1_color=Vec4(0.9, 0.85, 0.2, 1.0), image2_color=Vec4(0.9, 0.85, 0.2, 1.0), image3_color=Vec4(0.5, 0.45, 0.2, 1.0)) diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 34f72eb1..badc0ad2 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -1,138 +1,211 @@ -from toontown.estate.DistributedFurnitureItemAI import DistributedFurnitureItemAI -from toontown.toonbase import ToontownGlobals -from toontown.catalog import CatalogItem -from toontown.catalog.CatalogInvalidItem import CatalogInvalidItem -from toontown.catalog.CatalogItemList import CatalogItemList +from direct.directnotify import DirectNotifyGlobal from direct.distributed.ClockDelta import * -import time -import PhoneGlobals +from toontown.estate.DistributedFurnitureItemAI import DistributedFurnitureItemAI +from PhoneGlobals import * +from toontown.toonbase import ToontownGlobals +from toontown.catalog import CatalogItem, CatalogInvalidItem +from toontown.catalog.CatalogItemList import CatalogItemList +from toontown.uberdog import TopToonsGlobals + +import time + +MAX_MAILBOX = 10 +MAX_ON_ORDER = 10 class DistributedPhoneAI(DistributedFurnitureItemAI): - notify = directNotify.newCategory('DistributedPhoneAI') - - def __init__(self, air, furnitureMgr, item): - DistributedFurnitureItemAI.__init__(self, air, furnitureMgr, item) - - self.avId = None - + notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPhoneAI") + + def __init__(self, air, furnitureMgr, catalogItem): + DistributedFurnitureItemAI.__init__(self, air, furnitureMgr, catalogItem) + self.initialScale = (1, 1, 1) + self.inUse = False + self.currAvId = 0 + + def calcHouseItems(self, avatar): + houseId = avatar.houseId + + if not houseId: + self.notify.warning('Avatar %s has no houseId associated.' % avatar.doId) + return 0 + + house = simbase.air.doId2do.get(houseId) + if not house: + self.notify.warning('House %s (for avatar %s) not instantiated.' % (houseId, avatar.doId)) + return 0 + + mgr = house.interior.furnitureManager + attic = (mgr.atticItems, mgr.atticWallpaper, mgr.atticWindows) + numHouseItems = len(CatalogItemList(house.getInteriorItems(), store=CatalogItem.Customization | CatalogItem.Location)) + numAtticItems = sum(len(x) for x in attic) + + return numHouseItems + numAtticItems + + def setInitialScale(self, scale): + self.initialScale = scale + def getInitialScale(self): - return (0.8, 0.8, 0.8) - - def setNewScale(self, sx, sy, sz): - if sx + sy + sz < 5: - return - self.sendUpdate('setInitialScale', [sx, sy, sz]) + return self.initialScale def avatarEnter(self): avId = self.air.getAvatarIdFromSender() - if self.avId: - if self.avId == avId: - self.air.writeServerEvent('suspicious', avId, 'Tried to use a phone twice!') - return - self.sendUpdateToAvatarId(avId, 'freeAvatar', []) + if self.inUse: + self.ejectAvatar(avId) return - + av = self.air.doId2do.get(avId) - if not av: - return - - if not av.houseId: - self.d_setMovie(PhoneGlobals.PHONE_MOVIE_NO_HOUSE, avId, globalClockDelta.getRealNetworkTime(bits=32)) - taskMgr.doMethodLater(1, self.__resetMovie, 'resetMovie-%d' % self.getDoId(), extraArgs=[]) - return - - if len(av.monthlyCatalog) == 0 and len(av.weeklyCatalog) == 0 and len(av.backCatalog) == 0: - self.d_setMovie(PhoneGlobals.PHONE_MOVIE_EMPTY, avId, globalClockDelta.getRealNetworkTime(bits=32)) - taskMgr.doMethodLater(1, self.__resetMovie, 'resetMovie-%d' % self.getDoId(), extraArgs=[]) - return - - self.air.questManager.toonUsedPhone(avId) - self.avId = avId - self.d_setMovie(PhoneGlobals.PHONE_MOVIE_PICKUP, avId, globalClockDelta.getRealNetworkTime(bits=32)) - - house = self.air.doId2do.get(av.houseId) - if house: - numItems = len(house.interiorItems) + len(house.atticItems) + len(house.atticWallpaper) + len(house.atticWindows) + len (house.interiorWallpaper) + len(house.interiorWindows) - self.sendUpdateToAvatarId(avId, 'setLimits', [numItems]) - else: - self.air.dbInterface.queryObject(self.air.dbId, av.houseId, self.__gotHouse) - - av.b_setCatalogNotify(ToontownGlobals.NoItems, av.mailboxNotify) - - def __gotHouse(self, dclass, fields): - if dclass != self.air.dclassesByName['DistributedHouseAI']: - return - - numItems = len(CatalogItemList(fields['setInteriorItems'][0], store=CatalogItem.Customization)) + len(CatalogItemList(fields['setAtticItems'][0], store=CatalogItem.Customization)) + len(CatalogItemList(fields['setAtticWallpaper'][0], store=CatalogItem.Customization)) + len(CatalogItemList(fields['setAtticWindows'][0], store=CatalogItem.Customization)) + len(CatalogItemList(fields['setInteriorWallpaper'][0], store=CatalogItem.Customization)) + len(CatalogItemList(fields['setInteriorWindows'][0], store=CatalogItem.Customization)) - self.sendUpdateToAvatarId(fields['setAvatarId'][0], 'setLimits', [numItems]) - + if av: + self.setInUse(avId) + self.sendUpdateToAvatarId(avId, 'setLimits', [self.calcHouseItems(av)]) + self.d_setMovie(PHONE_MOVIE_PICKUP, avId) + av.b_setCatalogNotify(0, av.mailboxNotify) + def avatarExit(self): - avId = self.air.getAvatarIdFromSender() - if avId != self.avId: - self.air.writeServerEvent('suspicious', avId, 'Tried to exit a phone they weren\'t using!') + if not self.inUse: + self.notify.warning('Requested avatarExit but phone isn\'t in use!') return - - self.avId = None - self.d_setMovie(PhoneGlobals.PHONE_MOVIE_HANGUP, avId, globalClockDelta.getRealNetworkTime(bits=32)) - taskMgr.doMethodLater(1, self.__resetMovie, 'resetMovie-%d' % self.getDoId(), extraArgs=[]) - - def d_setMovie(self, mode, avId, time): - self.sendUpdate('setMovie', [mode, avId, time]) - - def __resetMovie(self): - self.d_setMovie(PhoneGlobals.PHONE_MOVIE_CLEAR, 0, globalClockDelta.getRealNetworkTime(bits=32)) - - def requestPurchaseMessage(self, context, item, optional): avId = self.air.getAvatarIdFromSender() - if avId != self.avId: - self.air.writeServerEvent('suspicious', avId, 'Tried to purchase while not using the phone!') + if avId != self.currAvId: + self.notify.warning('Requested avatarExit from unknown avatar %s' %avId) return - + self.d_setMovie(PHONE_MOVIE_HANGUP, avId) + taskMgr.doMethodLater(1, self.resetMovie, self.taskName('resetMovie')) + self.setFree() + + def setFree(self): + self.inUse = False + self.currAvId = 0 + + def setInUse(self, avId): + self.inUse = True + self.currAvId = avId + + def d_setMovie(self, movie, avId): + self.sendUpdate('setMovie', args=[movie, avId, globalClockDelta.getRealNetworkTime(bits=32)]) + + def ejectAvatar(self, avId): + self.sendUpdateToAvatarId(avId, 'freeAvatar', []) + + def __getCaller(self): + avId = self.air.getAvatarIdFromSender() + if avId != self.currAvId: + self.air.writeServerEvent('suspicious', avId, 'tried purchasing item, but not using phone') + self.notify.warning('%d tried purchasing item, but not using phone' % avId) + return + av = self.air.doId2do.get(avId) if not av: - self.air.writeServerEvent('suspicious', avId, 'Used phone from other shard!') + self.air.writeServerEvent('suspicious', avId, 'tried purchasing item, but not on shard') + self.notify.warning('%d tried purchasing item, but not on shard' % avId) return - - item = CatalogItem.getItem(item) - if isinstance(item, CatalogInvalidItem): - self.air.writeServerEvent('suspicious', avId, 'Tried to purchase invalid catalog item.') - return - if item in av.backCatalog: - price = item.getPrice(CatalogItem.CatalogTypeBackorder) - elif item in av.weeklyCatalog or item in av.monthlyCatalog: - price = item.getPrice(0) - elif item.hasEmblemPrices(): - price = 0 + + return av + + def attemptPurchase(self, avBuying, recepient, blob, optional, payMethod, gifting=False): + avId = avBuying.doId + + item = CatalogItem.getItem(blob, CatalogItem.Customization) + if isinstance(item, CatalogInvalidItem.CatalogInvalidItem): + self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item') + self.notify.warning('%d tried purchasing invalid item' % avId) + return ToontownGlobals.P_NotInCatalog + + if item in avBuying.backCatalog: + priceType = CatalogItem.CatalogTypeBackorder + + elif item in avBuying.weeklyCatalog or item in avBuying.monthlyCatalog: + priceType = 0 + + elif item.__class__.__name__ == "CatalogHouseItem": + priceType = 0 + else: - return - - if item.getDeliveryTime(): - if len(av.onOrder) > 25: - self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_OnOrderListFull]) - return - - if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents: - self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_MailboxFull]) - - if not (av.takeMoney(price) and av.subtractEmblems(item.getEmblemPrices())): - return - - item.deliveryDate = int(time.time()/60) + item.getDeliveryTime() - av.onOrder.append(item) - av.b_setDeliverySchedule(av.onOrder) - self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_ItemOnOrder]) - taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []]) + self.air.writeServerEvent('suspicious', avId, 'tried purchasing non-existing item') + self.notify.warning('%d tried purchasing non-existing item' % avId) + return ToontownGlobals.P_NotInCatalog + + def _getEmblemPrices(): + if config.GetBool('catalog-emblems-OR', False): + ep = list(item.getEmblemPrices()) + if len(ep) != 2: + return [] + + if all(ep): + ep[payMethod] = 0 + + else: + ep = item.getEmblemPrices() + + return ep + + def charge(): + ep = _getEmblemPrices() + if ep: + avBuying.subtractEmblems(ep) + + avBuying.takeMoney(item.getPrice(priceType)) + + if not gifting and item.reachedPurchaseLimit(recepient): + retcode = ToontownGlobals.P_ReachedPurchaseLimit + + elif not gifting and len(recepient.onOrder) >= MAX_ON_ORDER: + retcode = ToontownGlobals.P_ReachedPurchaseLimit + + elif not gifting and len(recepient.mailboxContents) >= MAX_MAILBOX: + retcode = ToontownGlobals.P_MailboxFull + + elif item.getPrice(priceType) >= avBuying.getTotalMoney(): + retcode = ToontownGlobals.P_NotEnoughMoney + + elif not avBuying.isEnoughEmblemsToBuy(_getEmblemPrices()): + retcode = ToontownGlobals.P_NotEnoughMoney + + elif gifting and not item.isGift(): + retcode = ToontownGlobals.P_NotAGift + + elif not item.getDeliveryTime() and not gifting: + retcode = item.recordPurchase(recepient, optional) + if retcode == ToontownGlobals.P_ItemAvailable: + + charge() + else: - if not (av.takeMoney(price) and av.subtractEmblems(item.getEmblemPrices())): - return + retcode = ToontownGlobals.P_ItemOnOrder + charge() + + deliveryTime = item.getDeliveryTime() + if config.GetBool('want-instant-delivery', False): + deliveryTime = 0 + + item.deliveryDate = int(time.time() / 60. + deliveryTime + .5) - resp = item.recordPurchase(av, optional) - if resp < 0: - av.addMoney(price) + if not gifting: + recepient.onOrder.append(item) + recepient.b_setDeliverySchedule(recepient.onOrder) + + else: + item.giftTag = avBuying.doId + store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag + self.air.sendNetEvent('CATALOG_addGift_AI2UD', [recepient, item.getBlob(store=store)]) + + return retcode - self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, resp]) - taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []]) + def requestPurchaseMessage(self, context, blob, optional, payMethod=0): + av = self.__getCaller() + if av: + retcode = self.attemptPurchase(av, av, blob, optional, payMethod) + if retcode in (ToontownGlobals.P_ItemOnOrder, ToontownGlobals.P_ItemAvailable): + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_CATALOG, 1]) + self.sendUpdateToAvatarId(av.doId, 'requestPurchaseResponse', [context, retcode]) + + def requestGiftPurchaseMessage(self, context, targetDoID, blob, optional, payMethod=0): + av = self.__getCaller() + if av: + retcode = self.attemptPurchase(av, targetDoID, blob, optional, payMethod, gifting=True) + if retcode in (ToontownGlobals.P_ItemOnOrder, ToontownGlobals.P_ItemAvailable): + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_CATALOG | TopToonsGlobals.CAT_GIFTS, 1]) + self.sendUpdateToAvatarId(av.doId, 'requestGiftPurchaseResponse', [context, retcode]) - def requestGiftPurchaseMessage(self, context, avId, item, optional): - pass # TODO + def resetMovie(self, task): + self.d_setMovie(PHONE_MOVIE_CLEAR, 0) + return task.done \ No newline at end of file diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index e4da0b2f..1519e49c 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -175,6 +175,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo from toontown.toon.DistributedNPCToonBaseAI import DistributedNPCToonBaseAI if not isinstance(self, DistributedNPCToonBaseAI): self.sendUpdate('setDefaultShard', [self.air.districtId]) + self.accept('CATALOG_addGift_UD2Toon_%d' % self.doId, self.__handleAddGift) def setLocation(self, parentId, zoneId): DistributedPlayerAI.DistributedPlayerAI.setLocation(self, parentId, zoneId) @@ -239,6 +240,8 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo DistributedSmoothNodeAI.DistributedSmoothNodeAI.delete(self) DistributedPlayerAI.DistributedPlayerAI.delete(self) + + self.ignore('CATALOG_addGift_UD2Toon_%d' % self.doId) def deleteDummy(self): if self.inventory: @@ -2178,7 +2181,13 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.b_setMailboxContents(self.mailboxContents + delivered) self.b_setCatalogNotify(self.catalogNotify, ToontownGlobals.NewItems) return Task.done - + + def __handleAddGift(self, blob): + store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag + self.onGiftOrder.append(CatalogItem.getItem(blob, store=store)) + self.b_setBothSchedules(self.onOrder, self.onGiftOrder) + self.air.sendNetEvent('CATALOG_addGift_UD2Toon_resp', [self.doId, ctx]) + def __deliverPurchase(self, task): now = int(time.time() / 60 + 0.5) delivered, remaining = self.onOrder.extractDeliveryItems(now) diff --git a/toontown/uberdog/ToontownUberRepository.py b/toontown/uberdog/ToontownUberRepository.py index 8d3464b0..d4821459 100755 --- a/toontown/uberdog/ToontownUberRepository.py +++ b/toontown/uberdog/ToontownUberRepository.py @@ -3,6 +3,7 @@ import urlparse from otp.distributed.OtpDoGlobals import * from otp.distributed.DistributedDirectoryAI import DistributedDirectoryAI from toontown.distributed.ToontownInternalRepository import ToontownInternalRepository +from toontown.catalog.CatalogManagerUD import CatalogManagerUD import toontown.minigame.MinigameCreatorAI if config.GetBool('want-rpc-server', False): @@ -25,6 +26,8 @@ class ToontownUberRepository(ToontownInternalRepository): self.mongo = pymongo.MongoClient(url) db = (urlparse.urlparse(url).path or '/test')[1:] self.mongodb = self.mongo[db] + + self.catalogManager = CatalogManagerUD(self) self.notify.setInfo(True) @@ -51,3 +54,4 @@ class ToontownUberRepository(ToontownInternalRepository): self.friendsManager = simbase.air.generateGlobalObject(OTP_DO_ID_TTS_FRIENDS_MANAGER, 'TTSFriendsManager') self.globalPartyMgr = simbase.air.generateGlobalObject(OTP_DO_ID_GLOBAL_PARTY_MANAGER, 'GlobalPartyManager') self.groupManager = simbase.air.generateGlobalObject(OPT_DO_ID_GROUP_MANAGER, 'GroupManager') + diff --git a/toontown/uberdog/TopToonsGlobals.py b/toontown/uberdog/TopToonsGlobals.py new file mode 100644 index 00000000..51daf629 --- /dev/null +++ b/toontown/uberdog/TopToonsGlobals.py @@ -0,0 +1,15 @@ +CAT_COGS = 1 +CAT_BLDG = 2 +CAT_CATALOG = 4 +CAT_GIFTS = 8 +CAT_TASKS = 16 +CAT_TROLLEY = 32 +CAT_RACE_WON = 64 +CAT_FISH = 128 +CAT_JELLYBEAN = 256 +CAT_HOLE_IN_ONE = 512 +CAT_COURSE_UNDER_PAR = 1024 +CAT_VP = 2048 +CAT_CFO = 4096 +CAT_CJ = 8192 +CAT_CEO = 16384 From e4f432858eb83b59fc9a9ba217bcb91863caa4f7 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sun, 12 Jul 2015 19:16:38 -0400 Subject: [PATCH 006/161] it's supposed to be like this --- toontown/catalog/CatalogScreen.py | 16 +++++++++++++--- toontown/toonbase/TTLocalizerEnglish.py | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index 1fa5d661..3084f07d 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -92,9 +92,9 @@ class CatalogScreen(DirectFrame): taskMgr.doMethodLater(1.0, clarabelleGreeting, 'clarabelleGreeting') taskMgr.doMethodLater(12.0, clarabelleHelpText1, 'clarabelleHelpText1') if hasattr(self, 'giftToggle'): - self.giftToggle['state'] = DGG.NORMAL - self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOn - #self.__handleUDack() + self.giftToggle['state'] = DGG.DISABLED + self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleWait + self.__handleUDack() def hide(self): self.ignore('CatalogItemPurchaseRequest') @@ -1104,3 +1104,13 @@ class CatalogScreen(DirectFrame): self.showEmblems() self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOff self.update() + + def __handleUDack(self, caller = None): + taskMgr.remove('ackTimeOut') + if hasattr(self, 'giftToggle') and self.giftToggle: + self.giftToggle['state'] = DGG.NORMAL + self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOff + + def __handleNoAck(self, caller = None): + if hasattr(self, 'giftToggle') and self.giftToggle: + self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleNoAck \ No newline at end of file diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index cc9580f7..edf6f92c 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5463,6 +5463,8 @@ CatalogGiftFor = 'Buy Gift for:' CatalogGiftTo = 'To: %s' CatalogGiftToggleOn = 'Stop Gifting' CatalogGiftToggleOff = 'Buy Gifts' +CatalogGiftToggleWait = 'Trying!...' +CatalogGiftToggleNoAck = 'Unavailable' CatalogPurchaseItemAvailable = 'Congratulations on your new purchase! You can start using it right away.' CatalogPurchaseGiftItemAvailable = 'Excellent! %s can start using your gift right away.' CatalogPurchaseItemOnOrder = 'Congratulations! Your purchase will be delivered to your mailbox soon.' From c1654a3f421be0e5b3525b1a799e5995ad65cdf6 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sun, 12 Jul 2015 20:17:17 -0400 Subject: [PATCH 007/161] fuck ur tabs --- toontown/toon/DistributedToonAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 1519e49c..017e9ed3 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -240,7 +240,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo DistributedSmoothNodeAI.DistributedSmoothNodeAI.delete(self) DistributedPlayerAI.DistributedPlayerAI.delete(self) - + self.ignore('CATALOG_addGift_UD2Toon_%d' % self.doId) def deleteDummy(self): From 8ad6894fb533d4870b2e052d7ad6b9a5c4e16e64 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 13 Jul 2015 07:13:05 -0400 Subject: [PATCH 008/161] another fix --- toontown/distributed/ToontownDistrictAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/distributed/ToontownDistrictAI.py b/toontown/distributed/ToontownDistrictAI.py index aff9e313..b8695e04 100755 --- a/toontown/distributed/ToontownDistrictAI.py +++ b/toontown/distributed/ToontownDistrictAI.py @@ -14,7 +14,7 @@ class ToontownDistrictAI(DistributedDistrictAI): # We want to handle shard status queries so that a ShardStatusReceiver # being created after we're generated will know where we're at: - self.air.accept('shardStatus', self.handleShardStatusQuery) + self.air.accept('queryShardStatus', self.handleShardStatusQuery) # Send a shard status update with the information we have: status = { From 87efdba167b0951b0182a00e001276b836f89e65 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 13 Jul 2015 10:17:56 -0400 Subject: [PATCH 009/161] More gifting. --- toontown/catalog/CatalogItem.py | 4 ++-- toontown/distributed/ToontownInternalRepository.py | 4 ++-- toontown/toon/DistributedToonAI.py | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index a54abc36..8d9149c2 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -42,8 +42,8 @@ class CatalogItem: return def isAward(self): - result = self.specialEventId != 0 - return result + #result = self.specialEventId != 0 + return False def makeNewItem(self): pass diff --git a/toontown/distributed/ToontownInternalRepository.py b/toontown/distributed/ToontownInternalRepository.py index 49ad9269..0dba7ba3 100755 --- a/toontown/distributed/ToontownInternalRepository.py +++ b/toontown/distributed/ToontownInternalRepository.py @@ -11,10 +11,10 @@ class ToontownInternalRepository(AstronInternalRepository): AstronInternalRepository.__init__( self, baseChannel, serverId=serverId, dcFileNames=dcFileNames, dcSuffix=dcSuffix, connectMethod=connectMethod, threadedNet=threadedNet) - + def handleConnected(self): self.__messenger = ToontownNetMessengerAI(self) - + def sendNetEvent(self, message, sentArgs=[]): self.__messenger.send(message, sentArgs) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 017e9ed3..b59ca30a 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -175,6 +175,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo from toontown.toon.DistributedNPCToonBaseAI import DistributedNPCToonBaseAI if not isinstance(self, DistributedNPCToonBaseAI): self.sendUpdate('setDefaultShard', [self.air.districtId]) + self.accept('CATALOG_addGift_UD2Toon_%d' % self.doId, self.__handleAddGift) def setLocation(self, parentId, zoneId): @@ -237,11 +238,11 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo PetLookerAI.PetLookerAI.destroy(self) del self.kart self._sendExitServerEvent() + + self.ignore('CATALOG_addGift_UD2Toon_%d' % self.doId) DistributedSmoothNodeAI.DistributedSmoothNodeAI.delete(self) DistributedPlayerAI.DistributedPlayerAI.delete(self) - - self.ignore('CATALOG_addGift_UD2Toon_%d' % self.doId) def deleteDummy(self): if self.inventory: @@ -2182,7 +2183,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.b_setCatalogNotify(self.catalogNotify, ToontownGlobals.NewItems) return Task.done - def __handleAddGift(self, blob): + def __handleAddGift(self, blob, ctx): store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag self.onGiftOrder.append(CatalogItem.getItem(blob, store=store)) self.b_setBothSchedules(self.onOrder, self.onGiftOrder) From b7d8cd0a3a3568d78b7536afb556028596cdcd4d Mon Sep 17 00:00:00 2001 From: John Date: Mon, 13 Jul 2015 18:13:17 +0300 Subject: [PATCH 010/161] Fix offline gifting --- toontown/catalog/CatalogManagerUD.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toontown/catalog/CatalogManagerUD.py b/toontown/catalog/CatalogManagerUD.py index aec62c1b..d73f8571 100644 --- a/toontown/catalog/CatalogManagerUD.py +++ b/toontown/catalog/CatalogManagerUD.py @@ -34,9 +34,9 @@ class CatalogManagerUD(DirectObject): self.notify.warning('Unable to deliver gift: avId is not a DistributedToon!') return - store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag + store = CatalogItem.Customization | CatalogItem.DeliveryDate giftOnOrder = CatalogItemList.CatalogItemList(fields.get('setGiftSchedule', [''])[0], store=store) - giftOnOrder.append(CatalogItem.getItem(blob, store=store)) + giftOnOrder.append(CatalogItem.getItem(blob, store=store | CatalogItem.GiftTag)) fields['setGiftSchedule'] = (giftOnOrder.getBlob(store=store),) self.air.dbInterface.updateObject(self.air.dbId, avId, self.air.dclassesByName['DistributedToonUD'], fields) From 6ac39df62add3f89a2f93ad0394e572e10571535 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 13 Jul 2015 13:04:39 -0400 Subject: [PATCH 011/161] District Reset Prevention. --- otp/otpbase/OTPLocalizerEnglish.py | 3 +- .../distributed/ToontownInternalRepository.py | 29 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/otp/otpbase/OTPLocalizerEnglish.py b/otp/otpbase/OTPLocalizerEnglish.py index 401fcdb1..490d7151 100755 --- a/otp/otpbase/OTPLocalizerEnglish.py +++ b/otp/otpbase/OTPLocalizerEnglish.py @@ -132,7 +132,8 @@ CRBootedReasons = {100: 'You have been disconnected because someone else just lo 102: 'You are not authorized to use administrator privileges.', 103: 'You were banned by a moderator.\n\nBehave next time!', 105: 'Toontown Stride is now temporarily closed for maintenance. Everyone who was playing has been disconnected from the game.\n\nFor more information, please visit the Toontown Stride website.', - 153: 'The district you were playing on has been reset. Everyone who was playing on that district has been disconnected. However, you should be able to connect again and go right back into the game.'} + 153: 'The district you were playing on has been reset. Everyone who was playing on that district has been disconnected. However, you should be able to connect again and go right back into the game.', + 166: 'You were disconnected to prevent a district reset.'} CRBootedReasonUnknownCode = 'An unexpected problem has occurred (error code %s). Your connection has been lost, but you should be able to connect again and go right back into the game.' CRTryConnectAgain = '\n\nTry to connect again?' CRToontownUnavailable = 'The server appears to be temporarily unavailable, still trying...' diff --git a/toontown/distributed/ToontownInternalRepository.py b/toontown/distributed/ToontownInternalRepository.py index 0dba7ba3..3bf1b399 100755 --- a/toontown/distributed/ToontownInternalRepository.py +++ b/toontown/distributed/ToontownInternalRepository.py @@ -1,6 +1,9 @@ from direct.distributed.AstronInternalRepository import AstronInternalRepository from otp.distributed.OtpDoGlobals import * from toontown.distributed.ToontownNetMessengerAI import ToontownNetMessengerAI +from direct.distributed.PyDatagram import PyDatagram +import traceback +import sys class ToontownInternalRepository(AstronInternalRepository): GameGlobalsId = OTP_DO_ID_TOONTOWN @@ -32,13 +35,35 @@ class ToontownInternalRepository(AstronInternalRepository): AstronInternalRepository.handleDatagram(self, di) def getAvatarIdFromSender(self): - return self.getMsgSender() & 0xFFFFFFFF + return int(self.getMsgSender() & 0xFFFFFFFF) def getAccountIdFromSender(self): - return (self.getMsgSender()>>32) & 0xFFFFFFFF + return int((self.getMsgSender()>>32) & 0xFFFFFFFF) def _isValidPlayerLocation(self, parentId, zoneId): if zoneId < 1000 and zoneId != 1: return False return True + + def readerPollOnce(self): + try: + return AstronInternalRepository.readerPollOnce(self) + + except SystemExit, KeyboardInterrupt: + raise + + except Exception as e: + if self.getAvatarIdFromSender() > 100000000: + dg = PyDatagram() + dg.addServerHeader(self.getMsgSender(), self.ourChannel, CLIENTAGENT_EJECT) + dg.addUint16(166) + dg.addString('You were disconnected to prevent a district reset.') + self.send(dg) + + self.writeServerEvent('INTERNAL-EXCEPTION', self.getAvatarIdFromSender(), self.getAccountIdFromSender(), repr(e), traceback.format_exc()) + self.notify.warning('INTERNAL-EXCEPTION: %s (%s)' % (repr(e), self.getAvatarIdFromSender())) + print traceback.format_exc() + sys.exc_clear() + + return 1 From 1d48a7fa2811fb86a90c8422c866f6a29237e982 Mon Sep 17 00:00:00 2001 From: Master Voltage Date: Tue, 14 Jul 2015 10:40:11 -0400 Subject: [PATCH 012/161] praise nacib --- toontown/toon/DistributedToonAI.py | 1 + 1 file changed, 1 insertion(+) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index b59ca30a..86627bf7 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -2180,6 +2180,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo delivered, remaining = self.onGiftOrder.extractDeliveryItems(now) self.notify.info('Gift Delivery for %s: %s.' % (self.doId, delivered)) self.b_setMailboxContents(self.mailboxContents + delivered) + self.b_setDeliverySchedule(None, remaining) self.b_setCatalogNotify(self.catalogNotify, ToontownGlobals.NewItems) return Task.done From dfcd7c2124f4373df52f66fba2e7350812dbb21e Mon Sep 17 00:00:00 2001 From: Loudrob Date: Tue, 14 Jul 2015 14:35:15 -0400 Subject: [PATCH 013/161] Gift duplication fixed. --- toontown/toon/DistributedToonAI.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 86627bf7..4f34b883 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -2100,6 +2100,9 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo def d_setDeliverySchedule(self, onOrder): self.sendUpdate('setDeliverySchedule', [onOrder.getBlob(store=CatalogItem.Customization | CatalogItem.DeliveryDate)]) + def d_setGiftSchedule(self, onGiftOrder): + self.sendUpdate('setGiftSchedule', [self.onGiftOrder.getBlob(store=CatalogItem.Customization | CatalogItem.DeliveryDate)]) + def setDeliverySchedule(self, onOrder, doUpdateLater = True): self.setBothSchedules(onOrder, None) @@ -2109,6 +2112,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo def b_setBothSchedules(self, onOrder, onGiftOrder, doUpdateLater = True): self.setBothSchedules(onOrder, onGiftOrder, doUpdateLater) self.d_setDeliverySchedule(onOrder) + self.d_setGiftSchedule(onGiftOrder) def setBothSchedules(self, onOrder, onGiftOrder, doUpdateLater = True): if onOrder != None: @@ -2180,7 +2184,6 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo delivered, remaining = self.onGiftOrder.extractDeliveryItems(now) self.notify.info('Gift Delivery for %s: %s.' % (self.doId, delivered)) self.b_setMailboxContents(self.mailboxContents + delivered) - self.b_setDeliverySchedule(None, remaining) self.b_setCatalogNotify(self.catalogNotify, ToontownGlobals.NewItems) return Task.done From e2f45d0a0a4cb61cbf1ff6350e0678b070a749f6 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 15 Jul 2015 21:55:49 +0300 Subject: [PATCH 014/161] Bitches --- toontown/suit/DistributedSuit.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/toontown/suit/DistributedSuit.py b/toontown/suit/DistributedSuit.py index ee020857..6f243ecd 100755 --- a/toontown/suit/DistributedSuit.py +++ b/toontown/suit/DistributedSuit.py @@ -55,7 +55,7 @@ class DistributedSuit(DistributedSuitBase.DistributedSuitBase, DelayDeletable): self.pathState = 0 self.path = None self.localPathState = 0 - self.currentLeg = 0 + self.currentLeg = -1 self.pathStartTime = 0.0 self.legList = None self.initState = None @@ -219,7 +219,7 @@ class DistributedSuit(DistributedSuitBase.DistributedSuitBase, DelayDeletable): self.maxPathLen = maxPathLen self.path = None self.pathLength = 0 - self.currentLeg = 0 + self.currentLeg = -1 self.legList = None if self.maxPathLen == 0 or not self.verifySuitPlanner() or start not in self.sp.pointIndexes or end not in self.sp.pointIndexes: return @@ -327,7 +327,7 @@ class DistributedSuit(DistributedSuitBase.DistributedSuitBase, DelayDeletable): return Task.done now = globalClock.getFrameTime() elapsed = now - self.pathStartTime - nextLeg = self.legList.getLegIndexAtTime(elapsed, self.currentLeg) + nextLeg = self.legList.getLegIndexAtTime(elapsed, 0) numLegs = self.legList.getNumLegs() if self.currentLeg != nextLeg: self.currentLeg = nextLeg @@ -348,7 +348,7 @@ class DistributedSuit(DistributedSuitBase.DistributedSuitBase, DelayDeletable): def stopPathNow(self): name = self.taskName('move') taskMgr.remove(name) - self.currentLeg = 0 + self.currentLeg = -1 def calculateHeading(self, a, b): xdelta = b[0] - a[0] From 4eac6a3f582db41a362c965b538d9f2f648375f2 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 15 Jul 2015 16:30:15 -0400 Subject: [PATCH 015/161] i love updating panda3d --- dependencies/config/general.prc | 2 +- dependencies/libpandadna.pyd | Bin 623104 -> 623104 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/config/general.prc b/dependencies/config/general.prc index 78a58f5a..07a99380 100644 --- a/dependencies/config/general.prc +++ b/dependencies/config/general.prc @@ -36,7 +36,7 @@ account-bridge-filename astron/databases/account-bridge.db # Performance: texture-power-2 none gl-check-errors #f -garbage-collect-states #f +garbage-collect-states #t # Egg object types: egg-object-type-barrier collide-mask { 0x01 } { Polyset descend } diff --git a/dependencies/libpandadna.pyd b/dependencies/libpandadna.pyd index bb41a70ea691d53ca81220749d0d7bea23a44f89..c3caaf7bb5f74b8a65e0cf2e468c75392a721c09 100644 GIT binary patch literal 623104 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 {8 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 GFYs>|B&Kix literal 623104 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 z zdz;Okj3-&6hnV>MKOO|0xmo=4Ha%VdCC7n2Xf9dXPZ{tIY%w(Djq;4cYNE8WPoi&D zby+gDVbfhfXB_XYly}hH9_j7N*L!Qb%ic+MH@nLUlIH~7Ewf~0e=Nj1VM>@TC5F@X z1%u3CyPubLcHG_adFIXC7WUq9?sB!nCnep@(b*&Fwv@Yv*d4*x{Zi>4bO0yKC{x5i zFC0?p?(JA-Qn;YLs*&TX&TZI~9h!R|sEbEU?VB!1T0ODdV~vR&V2>4gI;b9NOW9%e zSgW@??6JCZ-DHmyr|mv_tl878_E=l*hGfbPwZ}GkrcB*!;4;2=8lt-qs5`VCTbI-$ z_gJH+r|!A7gdTkR6}snCQg)E><0@vCYKnM5Ei-#!*Or;v({E*FP1z}B7V-8tnR(N7 zCz++v_7$1MJRL!1)^4~yWfRVB}Lh}E5T;4cuIEeIxu7^zd#ix=tD4N5y)A)UQcJ9D4vU3a1%+6f_ z+Rn<(-FS9(Zca&dZm5)e%dqqLoZQ0(TskW!if%9v32VU({WP5lj_-qwLF{{!o9h*7@PBU0Djm3?=}9ZY-{0oOIZr!4=k^uKPox0i05$G8^yzsFw#tC)LGo~-S4$p6ayuLru} zfz8$QHxpHEpKi$fFYEt*9#}T3pFOT0$+N0#PRkJz`*vq2q?DO9llO~MOe;GlQqH|k z%r(=d@MKHtLO>0kng)Ky+2JJ}Uupfc(C4CTk}U1(l!# z%mm|sqz?+Seq$Xae^;=U+Q#o{AivvKQ>_K7fc!T7itn5~jpXaj21fFA*@{Y+mb4j@ znBNp`P*v+3O*@J?t6G}kx*Zdza;u<}*S<}U%#H9G&+^DP`!ye-1lv5kgo&v?g{UWe zYH5w+kQ8@CRkiaY74qD8%uOCScV~}Ndwg_I&hBx*X8f$+;PT4SdU-Qkl|29BR5Z7D z?U1nF|!w`j1qL4AO9+Anw!q*bWTsNj~dLN&n+nO<1ft49di+TAz%~OxR`c!G5aK! zu!jMj0Y#T)=WYc>OR{r|FJlh`ECcyhu$KbHU&%hoRqVTf=+*3*K#QQErSM;yox23O z4%%@Y*IJOhp1I=<$lsWqJNhQ}ZNTzn^g+-ew;+Er`z5!scf;RXp`(}6Ux57E&;?q4 znw|STv>LkhXV|y`ozN@qpbVg-H9PkKunCO*Il4hRXjz$^dnOov7yMuy$X!LA_o5$c z0i*BZZ;S6YSpdF8p{uuf}@f!4l!v7*2%y}Fc(EJ1x zG_Qq%<|m<``65K41k0a+g4SP>A6NudJ&R3XbsN3`OF{K>$bP9{{zd{wlH3Q9a~eEZ`IyALvA&2 z>-4`f?fC!LI}dOl>;M0Mj&+=@W0Reob?-gM4k0@`JA`C~kQFk@N(k9Wl$|75NkVqA zvXhXNB>%_zK1knjUElBZ`~AP;|F7%1JI3Lh`@Y}r=j-`=zMikQbL{2v$^O*)|H&`u zfAM>(ehjS7_uuorYwZQwZ^iw&KK~cjz`ygaYJC!Jr2OmFU-kX0_uu0F^cU{E^oQ$p z+K1|Ot-r%ZdZ$T9%mN?rxc;5%<{$mq58q$0hwAmx8-KfAznM89QOlB$*o5mJ{Tlzy z&wKd(T0eAu<8J=#`?InpB<|(p#7Wzj%`QGOYxq$wt{IA24 zf8tyFzw)USzD2)e{MX&@rnB(F@L%`!{-+P^;r+3z*YAA2>y^K~KMp1&B)<4aLgF;8 z|LNEMSN!=;e?SLUPxfa$yZ5l0oI>jx|2Sq;N3Z`g@9E+7G~}UrnRxAQucy`N6B6rY zNJ#9*_0N2rf7juezds$xACJ`M)E;i zKXCm|zxKc4&nKQ1dAJ+9yXmjB!z zokAaen)Sa2k6Rq4eiTfWSnxmhk^WQP+0p~(i)8;j&;Osgx&H@0`C&Zx;UPTO^>_H$ z&+xJdXoQcs{u>_0!}mAsq5B*7cl7J4=+;7sC`q%$B)B3l6|L^@-F}nFzIYW_Q<<~{PwNnSqIx73uf9D@YKKbpx{9f-5 zZT{u2Ck=3@pJLt(zy7<)XCx#&v7+L&PT3T z%J@VpReWOm`1r&sspAuub7e{3^B##$T+Njw4Zof?KJh(1?&V{S^!z!lgBjuzDM%dK8NdLeq1GA zeB#Xf@rhjv#3z=0EIu)RLB5B)@rgh1>kSLVCyp!3_gIvxSbXBZ;(YGod|f_XoN_=9X8lQMva^`p@6b_iioLn&)u;$N%WZho48UmZ+L81uIR_`*REWxxx~+3Oc$TniA((WTllO7pA|p;0Zx00 z>sv1I^ULttb6m%{#LuU}btiD8fa{8%*Mj3#;SxXYnhhS!C4Srw&if*l`0-4*?=^U^ z_;Fe|@2~fM+$1+#m!Ie6`j*eF4nG#3a|$lpnyU$y_<5`de_rrl{b^N z^_qKayguIN-hS`2*UWG2&-QBsRl=3w=J1>FSom|uH=jQiTfm2SsghJj>LLx0E=#rK zUh*_~rTn>kM{cIPq`a;iR(?`CsFT%?)z8$FT2`%+R$Y5rdtW=Ioz_gfvc5#$q94?Y z7+Z~l#&1RnGlx0A9BR%q*P5xU>{c;rwzbeYZk@LtwF}yH?WT4&?qP?0)V^fLoQ%$6 zj_Xu$8au0<&mF_9=r(hQx?9{m?r-ic@1~dAH~jK`OhUWzeQweB>6i6edUB(bG1wSo ztTa9`wi~;RRAyH5aZ@uVm~WdK%&q1w^OSkXOktI>Ua_j&@$*2j0>g)D}ueju^?@jDa;j?3nzrr z!%LyqO`Q--d8ML~EVY$7O1-4dq%Wic(h=!5DPGPfOY)O)Te-J9PJT;1C8t(0DZ1h+ z6_h&43rc@wva(Xyp!8G+swdTKS~0Dx_M|pL+o)rHzx@@?{ z+s0SM0po=6s}W~rFw2+~%$jBs^I3D4Ini9qii)$cTKTLp)>Bp^tGo4vHQg#?m$v)a z^XwJ8nFDr7r>yg&^NiEm8SG4V);e398g6}ej=SGI?WXq9d6~W9UTIJBs(H1%`d%~d z1+Sks-ka}z;GOZVdkOwy{^Pv0ntlVnrQg}_;lJdM_ow>Dc~+PF9m5{s zz;Hx3K72czAAS&i%!=O0nm!p`6sx*cELJiZeNicmlugPf6_+&0mnus&rFv3Jsh!kK z>LX2-=1T8LYot%4P0~*3xO85+BHfgd%W36oa$dO*Z^Mww@kZLoJ>-7!2ziV=L7pKm zmDk7{S@hEknUQ4FywV@sy0tsqOH+3u@(+!-)R@L>sm}t&@=0K z^`g40dwNB^rrtnrs&~-4=za7-`ec2s{+_-@|3u%U@6?a$=k+W4O?FgTBb$-eC}c>6 zVU#nTG};@_8)J;g#w^y+8RL=>Z>BeMnFY+itZddcyP3ny_gP6B%;V;D_IXxIvTUoo z)zo^$8g7ke$8WUuT4$}Fth?;JT()Vqu{+x@+ArC!*yHV4_5%BTd!@b8K4V|E(>d9k z{Ep398|7?uzIJ|d;@ymHHTP+^x!cAa<4$&Gxu3fG+%xWV_i67LZ=g5IJL28&Qu>mw zv(DQ3omgWd{P+E3{(AqAf8Ng!)DGGQJ%dk!uYzxbpMpEVBVl4#H|!L?5cUrzh4aEg z;dz07E#L#}%k)xqsen{YY9PHV4VPY*wn*FAn~%wl%ckth%~%KB*qQU?59HPIW_gEv zP(CUDCdc#cD=F2K2Fg3iyUHq1{-|*8zJCLqFPkw^+mi39X)!J=c=DFv!i`ueX&8}y6 zw7c4U>iM1v@z7$S=t8n$8TD^o>8v`Qa0Dy=wsLmv-D4?DL=9U;#l{tQQ3II zc#8_W_#T4B%tS&v#psWDGk4Xl>dKx?u!%UVFC zUT1x7?XiBeZd!4+Yd>Mv?m~wCnrenN-L;TpG!Z2k8yG?c#bQVm8;6Fs8xg66O-gmK*Zhh1>R5w zC5w_rag^FhW93qDSKm;l ztMk?658hrHI7SIg(rm2``=z%wR2v1`Sj8JWrk&D$(o*Z`_3XL>u05l-(>vdLj~n&R z_5FHE;}LM|Wn+Xf$(RN^*a|ziU|cuSn2BaiQ;ptX3$ra%aErOm{NDV{Om1bg3Rt1_ zq}3Yi8f|5<^Vv=8=jHYD&?5NXFlD?_1gzhp?or!<*;}+j+9>_7KFl0%7O_<8RqLwN$(h7% z%i(FkrZ6@$>CYCCZFzw_Nm;1mP*Z{auWFO@g?bKnPEPYxv!^w}`q?^T-?G~~SKI}x zhR^-4{Mgc1bih|JxwJelToVeyl$-D4U8>wND%UW$&l)GWmmt2mT}i*UUp=oT=mm}9 z#tlCqC?4(s7h}g`F>$8dJadhC$m$Mi@RQ3)pI=FCB==EHD(97zu%`3wRqqymTU;y$ zpCaxJW@aXs`>EahLSkGjEgupj{+B;4)|(G)L9xZ=Uh@aD61;32`z58F+wN|UfYXY7 z@t9K%uCd2S<>qyD*LQ2V!@!~?Ad%+P@J4#GBh)YEmjU;Ezqa4P@8b`EeW^j6pnEVr zSQhLFehrF+4Z~N%)vWE96c>AuubV@vFLjdUOJ7RYr55sg@@LfWlCY}<%6e+^6KZ3% zojOddr8j~<4b@W{3k>m{CRn|#mDV<^5qO!($>}U~Za4|<6zb3|cLc2Zyw}G+7rpz1 zL5{F~*de?nYD(F-=>4~6-&~e%Ng0iK?lQNCr+UNSNEyIQ)t^VDI_b-S$xdAvYzsP3 zlje&*TPrTsi4TG!_K|YK2z$t>l&s1mWiIPThZ}5;6vTd*cU!%OJ{qk0+}LL%Gqb_1 z>)1IR-Kpf%bM`wYSyi*$Y+ga{u2WwbKJ8PnNOKO3dZ=4MBbaIiVnoNCTD zmzkfK*UX+&aLWr|gdMzOyc@AAJ`B=`uhlh9ETPyus$@BJk~&u{qUqXBZ6EA4nVwoN zuIsw1H;Jm?SbZv}{F(lhzE{5vD#sh4QO&5$j-F^tHTJLvaF>PeOmyZr zi=Ep}S~rhd+I=%pPlw$LZf;NP@V;=3k0Vx_%P-+K@n7|C_$h+O?ZcW^Ga z8$1!#3)_d|sBhnfH^lu8jEnushvZUescf|NCP}lUwbED8QIIs7TuiP*h3kmY8Z3{M zr@}0j$?N6q@&S0oPcVx#N_M4)Qd#M)3|3|-JCq~5fugFZwpDwmBVmbK)H7-tEu&Ud zds=I#jnk%}1`ePn&uDq|Dtdit+bEvmLA{bu4;DAk*l(OP(o@G?F+T-;uwO(<*tD zCzZBT^tY%EOO>yc3lUD%SNp2_(Kxr&N409)SqJSUZHV?6E9Dz_ZBgCl?zZb`z^n4c zbExH!?9^q(r^a3*hdIz3ZN6#lVb_MB_(E&BwZS@PUAJO(I#`fpKV>(xpM?j_u-~)S z*#}Xd`JBg{s!n%j2K;9|4Csh+*15t;NahxG1GlZ)%^mB000TPb-f>fU`B)2!y^p-@ z?EKUqP-A#!U;j0K3c7kR_4pHZ^l$#-sG28(r`c&mLN%-wHim1i2+xMs!1g!+yRno~ zZmERSUm7V*lx9hWToG*Ef?sf4z9c`wd*7y{Rx_%_*ynX%FY~lz+DT2;O?|Zf78P!v zp3KN;=tejA;btQ<6|Iulz-(%EFkdiVhLevsrOS2kU&8+9FwN^2^ zcf_{SgArns5?u$5Jt3-RIl05q-T?2M*U;bM?}N={1uh?gMvSXQGxcrym|k<2V>wliO2x1R)KideeU z#~NUbv39U}tMDEL-aXICJ?FG=hr92&2YFxhaXw!5=6XMSW&L)%qt#SMgFV|U7#bW5 z@`q1`UBX!?$3sG!e;OD0I4PxEX!FWaQ>i<5uo^5(3*YH2&y^R+>*PmSueFpmtkn%L z{F_QzwSn3mPh`6Kp&DZ+RzQ(A*A{D^XjinGT3VP%M}4|JTVJiGGP0wlYT@oIGd39+ z;gdS(waZLqQ_P#h{d|Ix zBkD&pbk4@0ML05C5`HJ}W>;M76dzK7<+fBodR59H50fX#@57yo@jZW|+*M?lavcz4 z3ocX?ygCVB|7-8;gu1#tq{UIMZWh37Bssv!U72>~8im zzc3Gjw|C6+Rt2l4HP)JAy=#38k{rO{`N_I%rL(iyt>I3??8$upN5PfiPT*8<>Vq!b zoR=cJo$o9~<7I&B%I*_xE4PEY3Rhv0KNl8r)Xy7K3hKdP$DrMA1S!MPVGzC?E`XQB z#lGbpvq^=eKxz|JtfSI1VCV$2K^>(NKHEpiF(oq$vpm)OP4$p^Oue8!p}l}x^+9y6 zd$l8YZa+mjAhVvEyY8)zU|%hw)_j8!){KfE%9qBQk)kba)w3qyUVUYqu%5QZ*&pE= zWsE9pL+3s8(iJDAo5p?AE$Aw)>ptn$ai2v!t;91r=$?0faSMATJja`iW3<`Z=jHch z7<^qkqo4iURE_#!8}4f^dgy8xyPU+2^0ETo!HK<<#LKTFYx4sJENU> z&I**mQKt|-*)I2xTY_5K#v9^|@s4>he-z5#EYGiKAP3b^z|DhKf|2+t)8QDKgKvUU zFg!J^3|hAfUkmrMli9t3rolJr^F&{ghDdv4mnPp3UMII#|iTH=4*h+b&v$9dy zt{g<=W>X8R71XEH3F->9ELCVK%yu7o_BXAj-c`R13vXZyqwXv<))*UEOUcZ5GqYLT zEN|9jFTW7^gHv%2PMa6ao2;gkRyM1URT{MNc;-E=p{%R-t!q|Rd#1h6zHJxbsn>Oy zIZHt4#&`m&A}@dl8~n!io<%El_eQ`DmwQ`LOUKwHx4rCsMZX4$sj1(_@97Wm$M_Tc zY5t1Hu}cx859$WJgXCe_uvs`PoER<-KN0&VFaGDs?{`E%(}xsqHD1nWbcUMwe9 z(kMBoT=l_$A<7tKuky1pSbYu6nF__CX@NEtv<|3IZ$&7UfiLau=k6?oT|VcXTbp59Pzj`u!n zHow1!w-_G?Jbx#67ma%u<&`zmz=pK*CYdN@=rn3eFYEEh3Ft8AdxC zcWy7d|2yRuB~DGRW>F2in$}dLnK{6R_pINnBDN08Y-TU9_t?#x_RdGn8Rt6nH7Dp$117%6UG0A2-hf9G zqRPJLz3CP7OZqRP1XlQaLA^34n4_SA6FwjI3I~N#!gp~s1yesRs%_b1v2)y0N~sWx z@7YH2RI z`V)5ix8@1+LgeG6w;sbslC6q(5OuBgR%fdhDrOu`-uu=v+@#&$!g0{>mX+Mjj$STe zJ9cPSrIYfk-N_zEH)X6nn`--^y@k%kKKm@*-mi9olitbV&&GZ)14_M`G#KGF{9raFmmr?I= z{v&=-)Vt?bjjCaDzbhJkkUtz3Wg5HTeSbM#;ue25TH_{4D=iu_Z%`;G6O^S}P@6tW zEBXaJ;Ri$LwoD3UfdE^BeYm{mgCB!yXtBgFXILOCN~QDQtWUANT7+%GZsALy;N0*% zaPX6G6a50ARjvp;Y>_PX8fz}OlomHKFFQ<i<*Dhuy;K*eMiAq|A6~HrVS@rQ(pTpgrXiY=ey$>#} zw{}^F;ALlV(0;X2Q8TmH`PmsVd!r#ZoaDEP`m)pBYag+Hfw|?vUn+z1`h-)%Y2dV` zx{kqpoke}!=llR#-*s}a?kl^s=>hg~`?(|CHDLA^?zgT=H?@lQ6zjXQ*9$LvC~RC* zqvd!52P01^zh4|)UX?Cu2fvp;7?!sfrf~~*HeHaJE|=&J4y8Nz39EHC9!%OWdzd#Y z$qKC(b`AT4gTuvwe{@YItP<8@8Yu^BQLwUstibWoN36F%t}NGv*NSha(9H3+0|#&=WxgSt8cSjJ^&eoKmIdarF7t8L45Lx z)be+=U1+aTdL>ps54?lf`U3p}{X6{!{SKO-s8NMFan#6XmNG4~BK2tyRu!|?m*{fqCK7d!%{nm*~XklqwYfsDt~vl z?T6seM$qW0lL8ca%q@chSdBL^(VgzjcNfEXwnVJwl=}l!w1}tU2-f#nfHxb_i-v?(h1$aK=kTDxyd5Qt)apE!Yrj3BC?~z#Gg9>+Xkc+KX1|5l}S{v%|5PA|5v}xLE?WlGZ#aM)jW77SZ zsK3LL|4KigpU`7QR-?3G(u->hpBi8cF-9BjvahxqUsGGo8b488;@Me`-s{K>Ge?<| z&F}Dc1f$LyRg|{q%3jtN);{YyypZ%%j{vBKT%o zBAHTosSz4{2wmEDq$Ttpwo7NDH{rv^YvE2Vlh?BLli`r*5sJ2=L;j93Us;BCa#FcQ zXDAaIu(0Z)(TAxM)y4RxpP~i@A8Lmh6kbCzD!qi~I9i_vZ{4R~V4bHnGE&p48%=Q@ zhNA;jp6r0gRho<2c*^`0&7RIG0xDIq`ck21SzCCr7fBby?3{Khyrucn;QjV#at#S& zGkj;fGu2su)ABnPe9|2fxh)FyvW3^tTSsj?O(!!K=wbQg{1^Ow@TKwiNr(Nm^u<4< zhq)ck;%HEadiDez@U~%3_|l|sdw7`o#j~54ELMnT7cUjTfvLr_YlXM83I8Ii{DS-v zjD8U~kxeN~kGe6{rnfRk`B3>7S8)$MMlN+8sPGdWMw*BxwbuG+uV|z3omRq&_QQj7 zu{O)mLGG+iqI0~CTCfYHtkNs%WxNux;$6le{Ka%;D?H)exKJy>^W)}u^Q!qMd}fk0 z*GgtTVoUVGMn?&Qef9-Axs#gg#}iIWBlZM%r#r=MIg!420>7;*`GFmgx1BXC5ta|Dgtfz0(74mlJzK*IVQgu# zn8q{eDGkDv-z6QE&QZZNs`k@zQ@JOYItebl5`}PE&IqFVkvBOS-+iXChJBre9^=zd zA9tp@5Qcd~RnbCKw5OtO?o#^i8@2DXLb~wezs5<38EIHWJ&mEpTw^WRd5|7@CNnqq zsp8i4rstI2s!6ZBz14%2wA}g%klieu@i>pJ; z>gBxRj729cqEjx|cOJKhE4fwal1z0ExZlCZvU-wdvokwKxOfoemCY~gm!&q)1_JhM0$O%f))q)ekzv4rY#0yT0S*E(<13$GXHlCRZoqIK3ZQY3y2i6i(g4=xZ#;i}^b8qEeaJ%pzuER@fj=?udB<&!Dj7T6OR@ zTasXzW-W#*AD}Nb*d9a8KY~WNj&q=~!k%W0^@Q_I!aq6eTp;O_{a&5#2DcSzI+ORP zSC%x(bo9&S$UVsH=kN>oPviJ^_PhI&{k482*ykI;OggKpsp2WZ+~H$kDe8Cq2Rrhs z@Tl;4cO{Fp=ea$CCu-pHP9kfvnH6`H=NBg{vM1M|p7g@?FGA&hfwagdYWCYCM1Cb7 zl8zc;sFh%PZPlryK{lud)Qe<(3d82A;t0Q_Er+$GM5Pqxi8Y0tt;H4o3YRe}$qhU5 z#pjUMxNaoUD=cW%FlU2Zt5F={iRHJ7({+4?lz?y=Vs?U^nGVU*b_39>54nsv_A1f= zJJApq(B&c<&=k$k)fs{RaG1WpWA0OK12jP&xY1l{@<-${j-mywxQX85@S_G^OX~4R zoJ!%8f6CfB>s|2@NdqPIuKV~SarqYeAHngD;#FPo6NAU^v7Xg!y%?_aDK6GoGCheT zIG&Ol$SrYjM&jfymOmm-a8y1kUy&1)$4PJ00}DT*dS6g{o_QOR8dKTdt9kA}p&iq~ zrcE^C8EUkmmnAvSP;aKsff0YE?|=>8;JIg`JJlElJRIe>iu!!q_{GR;7BywFs`-rB z!|ZR4B*k|>EAxw)jdlBqH4=`r7PnOR1|pp?m|pYiJo_(MxhHw{CFnM9pc5f#Z!r}1 zi|%Xg8!(}jRFD0*UpMgnT(36uw|~^3+2tMbPI`~{6{1AOQh$xVks4e+s7Ai389He$ zPjwsJ(O&|M`Y|->|1YEe&pyALEb9HMk}Fl=Ne;uo7utKH^u1Il>OhW@r=Vtb$OV-W zc=&o&@$5Us&X0@I~hh)|Y@!X!!YLZs!s12uTQLV{Aa;vq`k9s_sio6onZ9j>JT&%&$XssTszbW9rI@sY^s&Ycq z7pffPhT2enCjU(ya}*!pid_QlzPi&0_x@$7^y`r~_dA>UqqCKtRG>;eYeK|np75VU z+xPW%_-Fj<^pZ;8`&0o#U!i+AoqW(%+^+68;OlX@4u+>im1Z+1kLBk16_Px9(lzLU z_hdb;g#n(RQ&ttHf4ls%{1hp>9?F+=MVr$P9j0E2`h_yS-OF(5_wRYpae6@zvcBF* z?@L1D?P$GSqn}(D-P+dZPI~lhcI-jpE|o-TGCkab}~)y-wUrGHD{0 zoCX$CA2)Y``4fCt?8g42o|fSh9>$?k?F!_bn&3-K!jbyYcF6WNaq7E0$??5Sf>b!y z-?%wFg`B{Pq(;YjUy!5NLcj4*@}2eJA!EpO&JWjyUyC$_lsuM#^^gglx<0(NFWI~~ z?4%-eCpyckU>;AwV$UcgP+fz`6^PzeVLEa3NLY{1?r3@R()v?myY2mHEiSUofF^lit2SBd!Dys)QP;E(2=YecOJ8(uIeG8# z2Z70pNXl&jNixtseVn@zRj@Vp_682YCNGtrnfG0btlT8}#B2Q{=%O6tRqo@-FtB+c z{#6{j)rvalE#VV`!)esJl{|x!c)!VG#drn@(qnkPPoPnI!^c*E&j(Pb>0}ia+feRA zTJ9Y(+b86UC?nCO&`_x_;B~(RRxd-N9#HPkV>d{g4n-5a6)B?AQNA<-{;0s~7q#(t z`X{w~tb+<<2qx$o@2!D?nQN?$_(dW7%r{6;9b_G3MQs}NnO_D=W|Ay8 zOSkz+{KDXHAdJiS`52$4`(OMhK()(UjjN5U9(MGU_zdh$8k z@i*`U7gEc1k+b;)u8dDV@jw4uoYbB4J;yGoJa+0z(SuZVF zFEe5L`#_I7(qK~Ui(&T#VO=%YADzjz52PQx4#fR}1j0%Bx?&w!_`hBF*s1^z&O{Wm>@k-^AMjzLD@mq&Bf$Bl1obVV}^BGoXTUc<-6HZq8N z(fXH-TjaP!2Q4=oxHLKUvaHwIunVEKrr{_rp*H@A?vLXwxOg#d;2qBgxi-@!-)nt? z`oBsRF*Pn(He10RYlp%Zhr;-TDT3YhWil~&c}KESjb3_3_+B5B>jGyP&e)cRw5!O+ z*QNjTBFT^m?pwUQFL`$&*<^dqVe)4iKiX_yR?1N*$?I1V3t1@Vkw!GtUbV6p6I@nFOl3sm_7vRr)t1G`>ZX4Om!n}j3c$vdV zCcH(WCOiGh$MGrKkOLh7j;yn?*(G2jPuNwWnT?tBF_)1gJVEY6IP=-bAI)$+VQynL zJ0h!V!b_gy$rhw%+>Shbe|Ez-@`VSPH24)15pH=CzerFzaD#I2kXNao@6p%275s*m zxF1%0L9pVk$s;aTM6#IYXhQv52=n+@8U{K{B}@CQe43O=8l@!8Nr)TJ4<z>8jLGyPWnq%tqSh411R23lqOQ_KK6ZWXO;(Lqb{3euVxafCb46%iir?|wmUl9**+B!lUG zOoEjhL=z{o(?*?+uIQ5~_B(cOX8lgIY5 z){|HsRV&J&6P&(kbj38;a z3`KlZiK(gXCI7pty{X6x=~%6THGiv~R+Hi0Cu$0vs>;;n=ke_a(W9CJ=i7%ndn)Qq zW!4S)QVmcc9rf<|%cK{^>oZ}3NuFUg(i=tTM!kd@84Xe|MnQ{i)E@kYbHIJ$5O+m)BD>^rsF&2Wo}0PR?9PhP1&~?+q(@kBOdB&Ut+GtZ0}*^piwF;tW};)LsTJH+|4DcwiOb-VNy( z4fkG$Bdun|pZ9)b?kBsS8`q*b8LMv8fg$%2&&T{z{!ehpTy%sg;QQ1GUPLucqz}A+ zw8(+r1by#Z^nQAWW5c&d_`FYj*Z_JQp!5B`;85d|i%96bynjWhSu_taPg+DhO(s7g zXP5KHI*I=Z%zivg#Sdgcci>n16PRc013d_t!n!5nmrzL86?ISIYw8OW0KI&K%qY1nGxKR*~ zt0FE}TdLD=bjLOr^=X{I*QiNHa7#;)$ehRg+Husyul6IjfJN!b)QNn+jwCV%J0nTN z$5UxqlE$1tzp*Ue>oRuo2ENlozchScJsrYtne&K`cJK_`<^A;jUSXum2iZc8w{$a`*x5NVp1)RG1m7YV1(qyd+TfOOi`Jf`a`XpDK|a+6HYa zb^R3TKSSiqFVQ#S?_JghlSUmEDXqOmJF_#rtdUfK)ubD0<3~LY51M8PE$ZQ|JWGc* zGwI>{_$lR`mgE|Ki5#dxWS{oAhwc0ps1tmj?^n-;zTow*pC9EFSqU+g^ci19qjjz{<4%3Tx z#&3onGAp%_&c`{_YNRPXP10NO^gb<8RZV!$ebK9jQ5P3*tm4@bqPy7um$Wrr@^BJm z2cmsYgn6eX`0j(1k?_kEbU{8N8FU)Y&%+UD1#gK;C8t`7zIz+`9Y5i^r@cNCoz!?!v*_6!#gmHjiZY{C+iOfV=p9zO@IhDj+nGbV z$jn|PW+i%&mYIt$B2v+f@ju7Hx<5pbeks<^t|aa83h1yG{#Zn=2^!2|+TkMJQAyC< zCw0*ngnx~>6j4FXfbV(Lrl9)x$hj**`l20sUpVL%SUrw4v>Y9JQ2(9;hQ)sA#{KR$ zt{Aza36nESl#BpzcXOZDNnGS%YN|3iYB}A@Y~<)%I%SJVmV8dS`zqZ^k9vfY*YY_G;X2Mw0UWd{Al_$sdy*0>Nv?lq{9@WxV{-N{ljxj4 z>T7%Cf|usb=h$mWGaR;mwzE0~m~yS@G;{`$TA0TZ*y-dTJLr?Fd6o|C4ise?w3kD# zpgM26W0cz7=A9w6oR$jGg9PYrema~S0|%m2(3zUCkSW7GLDtY@r?jIV#Z6vL9!pJa z$Ux7v8~M*oc;1(!yHWvEw&(zM;oZ-Zx1q3_u-cC?6Z@NzUd^kPrk+1Vr)eOyd=06a z8)`nS49MS!Ij^~N2ENnM=(+SVD5{qFOZqUfVN00zJJXR|ncR)H|hB7_-Zy-g?l6FRL&nKk;2?p|IhzyUIs zr$N@+c0*XwC(aJ%7}KpWH=A47Z9(s8EUbN%dy3tW8rAg}HCS|5TH$@o17mNHA0vGe zYtQ2l69Hm|B^7<4DRlo&>euvK?9|#MuQwQ3(IF-%-yi)U=6thS^T^#-!pj`w{NiTw z3RBNN^WuUu%z73JB=D+!ly@A3SGI?~A76lza8~mn7InGjF^{sC0R4=@U0KxpeAzPgS;6aZ(1DcDsaT@AVXT5swaciBqk3qIh8)tQRO}9 z8P5)vC9#P7N#A!yCI(gdZTmq=;V*AtDzFBLjvjPC-ephhLQ&pO64Y8CLI?c3mzi`L z4=R4Z6!kg0Ws%j$MU5GahFpq6x|P|q+RSCH*N;(QB-Vt;LtHm=(Pvx^?p2Rcfg`Bx ztMDXt+ofHN6lh1@WD4HkJEZgvk$k-BrNeP3>JMR!Po?i&nRL~(q*-q%MXU;sJB?HZ z2dOGO{=9uf(nI84M1ZNBbgWl=UmZ z>T1SYniNfrh;D9$DDSrm6&I%zpnIV)V<%DwZ`1o;%S7Z|CI_;j;2vl0v=@&2Le^PY zGC=j15D`f9B{+Ol`$bEoXC>`p>Q(XLd+7c7F6WW`KB=dt5?4a&c8tE?Ylc_{Gr^xP zNap-RIxs79Bb{NKBhdsKqw@%gz&fij*IOU$)z=-x)42)~dy)T}B0}CVyzAX0o^#-$ z7YBXoMEwX+Z)5pWMzuw!BlZM*TO?7c&|j*Hi`s(ei%#wfZg2NxFl!`T;Yqlv??j#9 zD0|0sHbQp#xlKN&nLBPp|zu&qXD zj~D4#%|K7Cp}L*{N3MW-=}DA5&IGzi=c=yUo;=x`^4m-v?Q1I9AJl6gPHN^9vPJ2zGHA?7OxQHm zTHpY8LeG!T-aylTLaj=qw^&3k8OWPDH;e*tqQVl{`{z#(t7bAv-&x1Ot z%Va?3sLwUR{17#{g)GtN8|0&PXPxBAmF9Gr^h7*#cjX zF^MB}_=MZqeU~>Wd0lalzVXh%_Oml*Q;+Gj&i+_9j7XLw3o^2fET)W`!`_AkZ^L7* z1TrW$lI~!n@ye!*X3ZXD7Ud;4|2NVju>R-dH{=iHubHmOgg^c?&gdIp^!G|0^$8ME zui)~1hAW;7kMBuX%NuC!lUjb}0lVVfeMAx}neiC=xDvT`;ejr~$M}|7oroi+kcVo( z6X;7SYP7kOPU~Kh&Z%&Ns*q*x2zDQg^0PTOVWA?u{dK5iF@yGu(}QlxF8sA;+*eu0 zSxA^QC+EC`4)kG9r<3=L-=CSQ%}iBSB11EdJN*W>7Dv9Z5~;Cq;SAEj%sAFc8T%RR zNzD|_(|DfKxaTjJzR7|k){Ly!TPW94ay}ff8Zh?BWDHNhTk-dhTd0CYd4r04fHdXfs;#~lz3mS`=^G@1sxoCZ9&G%a+LZ}sr8~WX zb?~!zLo-^U#@FJT+=%=>pZk7+``&|Bl82;jFWBmCcvlJXhHWD>UkqbCOqME{lSt|| zBx5M%3%BBV|46d13eIVNQs7%a$?I-9*lIg(v^R}R%N;K(2`UY}*ATAyGP#y_(0s>n zM>9|*U7kdT;02z>a4Px|e2#C>D+ysSG+$ZtUBB=vkz}K0CawEaoOz*3)tKP!LzeAL z>72UnoFnKqVoYYQysM~5T)`JQ{G|>i< zmRdshc0WA!$EbE>icXf0IJICgY~>0G!35HvPZ-aV*O&}5+<{*$SXoHD>qsVT3Q565 z=5lt$ZL=gimipe~#(;k5J*6@D-oF zhiqS?#518so@K4SOOD|eCZ03V7p*~$=Xp|H1IfO9L%Q&B(w^m*EF6jsUkDG_M}{N? z>4m51zxPCq?}sD(KrTHSu3#Y?!K!rr>e!8NYg@qy#N>E?I%vb`0ZoRr&L$nV*!}?a z`YGCddz3Ocgl~8rNBlao?03n8iPT(9Qiuh4dZiqdwIP!0)tC;c$9V~D=uLD3HT&WK z4~-MpES^D`nQvLGqYHWOL;$QNxW}%x4Ao+wmOE!KJQ+FfEmorp6tycv$i7gbvBbw-3L2A4?n*{Ry7TbA}g7{d^i#% zmdBC;wi4QU1a}wW6I6-&NY6(%gID3$X zsfto`6-|1`<>-&qVuG$Q6|xP;(Iw~;48ZFi5sYPGc?x}lg`mhX_R+dvBR!Yh=$yki zr>BDpu$J4@my}_eFar}c`RK!xpcA9x421YfHDLA)!ls-d(GIVq7bmFYhb3&;iI3>>IX^s}@jv5(G ze|IVw9?{oXLEnEfr}G>F!7k#o-zIM_@@E-f!nx!E%&F^m??Rb3#n0;s<_|!PjEJU9 zC(F}O>+`7rn^5dKaVrin$#xR{bQKTx4lZuIl8#y1Jahw#QW<3sqbzQHH9F_@$mKW3 z6BOLKk1~MjF@jSZrYJK&l!eM-eEg4@0o}?Z+-^Ld!+2g7=p2fy+g&`63^4FqQTnvF zT81-Vd~{J|_;_s`f|gX=&XGsbm;C;yXkJB}__IRYL^awO&8!>)e=ng)l9SKQt`)#V z);R|wgd10b$2VspTAchdoX+DokZfu+!?K9}<61C!CtduL+C{Pg(J{ry z=t3MI%Xfn8@)f4v?nFJ!G_Xi=g^nB!8igP}T%2Z)Fx}w56 zsfXLtCUVY2@^S!^hGUs3m}<=+rMl2s0+U&Xw%JPGba#|sKZ|31g_B%v(?3lEcg@aO zMg{D`;Jt>X4Z-}Xb`4NZU|xp^^?HGN0`ta4s5cALTS|{)ElKOmXvv*;md9{t1nOM{ z^#tZ+h)^#Ns8^C6tO;)_NAgbeVjJTZ3)JfZ>Iuvn6`|e~P;UW_#xiQkI#Oa=Bg{KO zH|#9wMlr!2=f+2N`dT?Ywspl)DMe z#rXp1D$u*EN%pi698cg|cjkTiGa)gYob%*AAl#>L-R=HPvLFKI&NDA|oe7G&5zb|1 z4k#bz+!T*+&Wlj48fhYdb8X0&cf%Rz8{ynoT#Bi|418UIbE_ki+e$iE;M@t4TNlv_ zHzS-&!`Wil=@%7b%Aq- z=uDp`$9{<~O^MXtVw|^C^jpNV(eCJsxD%uqg*v<)&D5u1>PTQ2lXKg^zavrR@iqye1SJD=NV({Jl!>N#YjA#*aIxDc9V5)^OFn!Q znsP>z@LLDc?Sds9!_7KRlISX#@jFaS#*>LI#5rbVVAS_9t_~frRuRUD)0jr7bKsL7 zgKcLb{V9}ZAvk4qtuFcBe)PrWY44Fe+OK^}hb5JsR?iY?&X5jSRhW1kl1TT_suy@Q z`~g~tsidV*Mrl3$m~EV5cIW|GU5!o$ypL9Sz^jr`#=@n)P?4l&y$5L31-u&Y0IjBg zR}1KuE+fOa4i+oU4Z4q37r?9A56~(rcvXm5<}&!SHnZ{N>CfFqE71$;^#HA22d`%0 zOD-axv4W|;_4LB-qt(eMAAcXM(t%f^_gxfbDRU-(ORDNVS~Ul+xO#cK?&6?kcJf5|5EopkiW8s2#=4Lb8O-F)WTqTu!owE9!&ac^H;`)B zhwprzF2x->d5O5s`B3=9=~t*E9ent2Wm1@}nf&hp^Xdch8XPgNDKM|u(X`Jh&R*OI zH{L6B=5+z)bsgq)*GUB_R zDmXP4WxaxYr>3fxXbAKY>}(nAY#rxuZ6&9)k3O9^j>A2>9K&2%1HHVYDmf%gViIV#} z9`LTS_4nZ<>qv6gYN#zydI2MBc_!YIMe#9Uh(3@tIjseB++ z@d&Fz7+O^rS{)c#tB9d>hoOlcWe&;Ee@8uWR%1&}rs&8-{Rn+53~dSwZFa=a*1*s4Rq zASDwg8JGdcY2=F-nhrw?VQ5wHa~t8`v|>uLGfsTJ$iW-M8H3_9CBe`>fT698&Lr4L zy6G^EK>s!m|uWW=B|78Rk`+*@ecW9{Sh=(3&G6-X*l=LbT?xs8h0) z`L;du#g34@I!o3~OoiOVflGjQ1Mr)QqYua?@1-8{8?c9`^q)uqfUTDoh5$~D^ z#?5+waqF3!-cA>CAKun6PM*1V59uOyy}4~ekBq+~{eXOqFR<&m!32$JpK3>l*TjT(g~d7o=73O*niznPO;58+%~gki?83kzy3cbwx~O(}PbLdlT%!KW8FVoL7-EI??q$c9jRc>fod& zVOM9+s~;0y!(mge!={9iypLV$BQ1F!yUv4NKjRoBm(!7OC?IQasF0jPHG2H@aFIHY z=IT$M`*l)tb3v*l@Tj$%{J9eyDOBW5=EP!3O3njG;!*{ej1Y;ss$f%7W^ubRBax&W zN247lE7L)y`5@CKCKPv)SUyB<=w!sEZo#IK!=}~)Q8g&2S<|@Q%G`)Ika_5ejmcWJxxaM5*gLIq*OC&d6+kqnNO>TyD26x1S)mW z`f%pKXwu$OwV8B-7UAlx0GBp^O8Yoh@jRWOJ9Hq$EOo zcT!72ISSpFgi1m=3f-85O1r_OKL z{{fk%aq{haPCfY`QiPjv!FJOPI2sz!B1I@%uo}2v4I)J-T(Dl? z(kSKt=S1$8U|j-}c7jJIK_hXRbsCb9IpJNx^U^`1s*&5(j*f9xw+G$20i3fv%6*-= z!MU8UxCXYhBVt--?m1j{@VMeR>p7#B9Zb?tfxok?ru1<;L=!W;z$Jl7<3XkAI9~JV zr9I5D4xtH8gH4yvgtxrpeuAF?Y|05XiStin|96&Ej}z5ef=wO4rXJ+chB8Y$mJ^Mp z_%r+k5zAT!!`e*(@O-2UZ=(!T1{q*k1<`~iicp|aqsaB@h#DM#<24>9bv`pYOG${W z4c3EC+tGoCVOf_*&L$7jq5s6msAb?-HY}?=JgWw?qYXH>?M0^Y2av=c5otexRSUtY zbfS=;GzC*yAEl!YMR;@* zWhYLk&KWsaB{*?1jMBhOQFY>!6~T)JFh3x?tErsgxP-(@5+^#2%DaTme2eT)a*_?{ z=rv|1-=IbARe6x82Gfg8wN?)ttU2W7lQ3xgAH1tLGGbYAuJT3au;?%&(Wh=2F`};Y ztNU^`#Zb;Dc%2gt=aQva1NI0$Bu=Ne#Js|-=*)t6BOTM+*~!Cdf503u+nvOOdKvwr zla9sR6919p~wH2b=nXPQ#sX;M3Fx4*i-4p|*ihdm@xN z&zUnN`aI~wQqh!xk4~(NPHe#W%B|3eozaQCNCOC+I2N5aCGxX` zPF#ad6zpnGl&ZPUu717eX=RMu`@)e<)X|B8UDc#h-S`2!>K*CC(KuYQnDJUeV)eea zC7i9RxcBjNvPHkAc%%(ArYU&XN(+$$Y=FguE{K%@zEx|1O%!&l{;>qgOe_rL4H_m~1*#k}4I zys+(L;|`Onz0bgebN{<8EXKc@p)zme{Z;c0^Sl{B zzQPgmCAnTTLA_QH;`L>cW+*%?$)BGE;;o3#ZVxQ%ET`MwcnIgR+j;IG-G6fzvU}8l zoWn_5OCEF{Mc?tHd(pi~Upx(td`?_1ajv8e8>@=n)iiRux<+o-fC$H4kEXDefM6TZ zh6kc7Qxf~S1OF1*Fv;c8d>h;kQq4PC?`G0f3f=F}tM&UcCU*nLEsf;+!}N&jWRD%|-E z(TPY0$V>@${sQj&ZF-RL^dK|hf8`1b@oxwG&d-E5-zakD+u_cO9^_zpkfWnH*_oub z7vasX$Crnr#Ztvy`XkUl_mZ6RTlh=~xJ+3eFec$Lg%2206S{lt9%LGZqUT-y$)Fi+eJdVlvB(+qs|MUk^E7}MvG z8+8Cb>O^$%$IS;_z>JZvUi1ND`v0sen3yWo9xO^8>BWC_Pw>8$?1iT_7*}g_bUxwC zs6Qy2tu;}Pa3?vzL-H~Ft@BYz;w~wP1X2>2IkT_;DTxxKBy{GbL`tGIDT&6UB--5T z7!F{LbOe*6Z{l>##_3wjIfkpEl*A5F5(h|0oQP5qH%UpvsVUKzSt5;DkPc!gW^zRb zu_`HvI;13o*6gfykIt+cL}q?mlxv-V+FTgv&Gq~n2qG=92j}Y~|9-{qsx$39%~=3m zCUO%l|6Y>FO$ZOHIUZQY$eHiM-1e(c>V7h_+hUIO104Ew(X7{YPDVV;i9}~{=&vxd zavM}lcqmCxiW4PlJhAf8>7c@?Z-p-H%)h(Ui+{&WsM4`y$)+&xy%1%(0&Th;b-Im7 z*h6$EPm-s&h(Z-pvGMS-j5uSt$X%77L#cC~R!E1kX4Ii?wBl!fU~mZ3u# zMjgtU_gs8&W@&dc>TvXFl5ZwF{LLuSL#R^Wmx=U5)~Fj<7(J>-KAA{Ow2S^_qWem8 z6ldVv??P^j{w1>GoW5`=N=n=zD-rLcV{%&i1Bwc-zQY6EIh=mvcsi2PaqGo7<128+ zl6L@BCd<&95;27INohv9Pd^#lk{@EEdkpJ2UUheP^$QEV5WwNRY+CLN>Bk zSXfA~u&^+Tg@uJ#EQCmq#eju{1PdV&WU-h+7P(j$kRUe}78bHtB=XnmivH-l9$9b6alfOgt^bd5Ae`F5!C+1*(QJlrUu^AyK>>t*@*d&)N za_{X|@LFSV;S2Cu|9sn_Km3`!*Comj_Ai}qlq|Td-=cDwW1qYQQ)>WM>7OvQwy;~> z;GwTz_{9__rGz4X2kq*gxjV5G%;R~Zc4FVKXYOP>&_WCTTP~mEU=cJ>&iFffl2dqG zd-i011Fy+A{Vi%2H$*x zis^T3;{G0#^F1o!Kd>wCqq+bzI{%58_InV|2fnlYa&9v|1NVH+=D-)sl5UjFehf|1 z6gSXv>N>>tFbjVG3H`_}!C$$9_7iyMJsSld4BjK~M(sw&(63LRB9wwjn;`;na8nC# z&r5JiDyZYsxE#^oTYZapO@|%s9$d}=`$Z#kdM9Z0PuXXmGeusq^}N2?p!>YL+Fxm= z&D2f1=`fw9i|_XyW;i}nO9SYbo9r9~(Jl>}5%f!AutF1TO{P$M%a~a+2ji_ke^cTD zPzA1gjc@u5lrvf=sdV@P)?*K8U=Ga@m!u{role;ypQ8c1WOH^+@3TecY>$4I4NV98 zwSzg2hyBYW7yN2$8}YldZ?qI#wk0}uYp&2}r?yj_dj{@P4_hNX7#Bg?s=;30VEG+73fh_NOh2>p9d?5)cV{&&1~mA3&@$R=ZghF?zR^S1V!#cp z5h`R8HfX1?8|SE7=%^<+E}fUIOE)?fUKF(b=v$;OGwjsn$ZG|*OiPz#cyCp773!Bw zbYt6>9cFMn^hE~T^cb--Het_x%JhE@uXxEO_L|+|Eng=0un%lk`jwpv1y1h4xKVKN z!lCqE1yIK@uPoFVLfm?az@z)v_W#Y|t1BHlT3D-yReHSs3f6)b9fu^Wg(mkSr+h`^ zjW=)P^wGl`Z~3CMKfbgd{)T}@&HXz^(5+0P(em+oH&0t=R&=;5*yFO?0By3-vv+r* zJYgQY@X9;nY=$wmvhCA^SPw^9d|~DcU(}RD`#v!|vff+YFta!$H)UbR9t= zFU;;vllJ~~P-dcdHY_hK#MCm1rVpJ3b(KyOKNi+-7d`r!uJDo=} zym(W(DYF${h5b>#X|OlaVwbH$rtY!BJAf@Pg5NrU7cm9(&bf-V!#bA-HjGK z(Y)+FSJ9?vpnI_7Zt9+|-;SfFc`vQYAS~j8pXKo_@v9ELBwlpyKYKWq;w|@n5+N^0 zM!5Hk2Jt^4^6z7Q&DOI-_+xAbiD!xALkw3`+zwToN_;*>rt@0Z?!oIQ+VF8yk&@iT z$Xu6*(mLu$9b&Zy6Mn!(^cX(;=6ZW=Ll@Hyf8d_g?Bhk{EkE^&b@g(S|9GiAoKG8b zRWJL_CU;?j=r4rdMqpQEP&O{Ysw%^(YI84T#LoQ;jpHQ@Dh)L>H{W_fa8V*?Xk_5x zlwnG>_}<({oo5CsXN?|-#{RMsg+%wQhkEAYOHKg(f{Dsx9F>wBb*&8NwhEJ>j)G4U zovSuegz@c+I=7(Gt!_8BI(%d|iauVZ1|gVXNqAH_ZZZ_nz7lGfN zL_aA_Ma)tY3uwr+U|;o7NEyQS9rJBwrJ~q=>Ns_>)8ZyuTIef9QTRwbL~wyDDRFxr zv14`bcda7VLA5-@toO`!79eINS~GkRzK_>3eEBZ5a&$I^HGW66oN>`m)F18V4%EKA z-2OSlutlXz5xr02w#H0AqV^E4bCf1lN~^$0h4gXNCGcXrCee;7P$wmGcj3BBsE=Fp zD6|U~iWGjXga%=H#h4uAE;?{jW_W|ma)5G7d?AG&YPeS*3ZR;8w$$O$ECy4)Iy!1>9e5!`||+=s!s1kpIix)yjQO)V2N zGvsE#8a{*zEuavHC4&u$yncr_Us2QSAQL~CGD&VMpa#_BU8hW2cD$&EceKcKNf}LMq>+Q%u=<0SNh(}H)wCh?YtKbw9~CJA?kIpb zT4a_fXkvfm0V^0_gFHB(LfyZk#xGGa^s!rPku8eo9Ms4Vv+E`II_+p2_>>x7ifmdZ zXZFaFGcqH2QN_9krAUhy&l2G!wARK%_ME8ppw(;;&3O=N#p9#>J9;ot#zdk0oeTSz=u4!~lgM#@w+Sz$i=KoaPsKkfo@g#| zvxECqA!1D8t3g}|;@onN$P3;KW1B39qlks7@ETjxJGqs;0Bh*r3^$c7M3swE+lth+ z8gVj2opS~La1t9K;vu7~RicK~&Kuyy4s~n>UbIoG0@SJ?bt(onlnv7=-acTzbj8g` z2fpsX*CW_2$$YHEB@D6M2;4FSvn)~O+EPtyAQ!Qu4@Hw0NJX$o8(h){lZ>(F3@ow& zhwLvspo}mGBM!1mW8FN6vJ9GRfE*Vf#SJJ?10g!79bT|t1X~NL5L@>_bYg3}(yb4I zE}~exfC^}vs?bN3TWr2XJIzCNjZgs+)X_3^vrfevVflmI?ObaxuzHxwFgZ558`!;z zX3C76$u%0vE+RNcHjgQ_y%L&IU6`(i2;NyP^0#+5lT7v3Z4_p$}RRn{Th2^Z`L^odM++!1rx10G?Vz&13uV0F)C>h8~%FsU17KVshdg|2Djd4-wFA5PD~%{ z6(s*=uvDEm9v!*L8nw&&WaESNANS0t*dAim}?wuhj-JC)UKiYaQ6)l*>PJh9!x_7kx0 z9NfD>dEcd!vm$Tfe`$fGqefd4h&zJk;RRk^z-+5o?iy8Y-mWi)Xc;I0w%VFu>X=ue&WOcs4< z^jIS*bVhwtHI_^v9AGI+eL2Zc8|qZ?Hnm|&ZP3o`s*1;{4Wd}r1s}~H{Kx|)ick+E z?z75|2E@I5Gns>d)~cf06!$=~fUw>zn2}N=5`0C;C?6|bR8+t5STXL%4Ld6Sr#&u9 zgOiDaS0RWXRV7Wf zsWC%nD{q{WZ9L$J0Qu%nTkf+?o!WBme+x9iHt6fvZoJeOgYGR%jmhGNl7obse#k+G zN~5#K?;;oZ(3>~ONMSVh;wUww!5eux3h5^r%*+;O@E!7#4uW){#o$voQmRl?WvdJ* zX6 z>DwD@V0G}|fvR7U50~mI;GT(@;8HhzfS+n6*)a{`seyIcbn18b_Wl9ugdVC{lZnif z{J1d=Jes)j-V&NqT`xF5;^u6 zO)%<&UUNqkJLIPz6)X=n>8rf7#Nry7FS^o-)&fsEJvUj#OP=wAGz_{vi~GAF)%!)U zSp1_7Fb@(bf$u(i%KO|p`YZ@K|&x1pMi zu+B=&P+G?>>(0o5F^BXAWhPyHW{PFd-wvI!Hoeq>4$4LLjgot%W3E!6$JFRMn7)TT zc}<_Z1%t`&6(4sTduAU!b3mzJr1A7N`FKVTCH<4s?J+k9bgiQNHb|FL1x`sO$~$4S*azcl-*fi@cSdo5zB zdz^$VnSJSM;w89nMQzv^Euv?v=9+mrx-^yF#jI84QSrBlx6%{WL0wHNhN5?#>RG%s zsFrb%a#Bq#Oe&+c(6tifPkd7RE5Qj@>J1Y zvDEBpNk?&*H}{ziOZ3d>?-p-s`~`ig`_K}cS6364Fqv@2y`%9#%Wk79EyNOCS6j^+ zQ)HpT+))049-Z%u%(6JIG2iXeGYyS2)z1r(3ZqaK1@pS7P%) zE)=4W>F8lLYNy+D!f5oUsf)}=gWy$}kH*0oN%C?Uypf~RDAI>kuxgE-qj{Xb^wbM) q=t{j{4gS;Df3Gj_`U0;n@cII;FYx*TuP^ZW0s1~XK From 02444d40266ae2ffe442a2d956df4f1ed557f465 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Thu, 16 Jul 2015 08:41:54 -0400 Subject: [PATCH 016/161] family 2 pls --- toontown/catalog/CatalogScreen.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index 3084f07d..f30e9fab 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -1019,6 +1019,11 @@ class CatalogScreen(DirectFrame): return test def __makeFFlist(self): + for familyMember in base.cr.avList: + if familyMember.id != base.localAvatar.doId: + newFF = (familyMember.id, familyMember.name, NametagGroup.CCNonPlayer) + self.ffList.append(newFF) + for id, handle in base.cr.friendsMap.items(): if isinstance(handle, FriendHandle.FriendHandle): self.ffList.append((id, handle.getName(), None))#NametagGlobals.getFriendColor(handle))) From ae40f210340d1e34695d9953001a76d526a4e457 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Thu, 16 Jul 2015 09:26:34 -0400 Subject: [PATCH 017/161] Better phone scale. --- toontown/estate/DistributedPhoneAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index badc0ad2..0df7c825 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -18,7 +18,7 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): def __init__(self, air, furnitureMgr, catalogItem): DistributedFurnitureItemAI.__init__(self, air, furnitureMgr, catalogItem) - self.initialScale = (1, 1, 1) + self.initialScale = (0.8, 0.8, 0.8) self.inUse = False self.currAvId = 0 From a89e89f99aa6b89b59541e8ad7e4f2761a74b8e9 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Thu, 16 Jul 2015 14:14:00 -0400 Subject: [PATCH 018/161] Chat Offense --- otp/chat/ChatAgentUD.py | 91 +- toontown/friends/TTSFriendsManagerUD.py | 19 + toontown/toonbase/TTLocalizerEnglish.py | 1265 ++++++++++++++++++- toontown/uberdog/ClientServicesManagerUD.py | 6 +- 4 files changed, 1355 insertions(+), 26 deletions(-) diff --git a/otp/chat/ChatAgentUD.py b/otp/chat/ChatAgentUD.py index 2e13d84a..1ece070f 100755 --- a/otp/chat/ChatAgentUD.py +++ b/otp/chat/ChatAgentUD.py @@ -1,40 +1,83 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectGlobalUD import DistributedObjectGlobalUD +from direct.distributed.PyDatagram import PyDatagram +from direct.distributed.MsgTypes import * from otp.distributed import OtpDoGlobals - +from toontown.toonbase import TTLocalizer + +BLACKLIST = TTLocalizer.Blacklist +OFFENSE_MSGS = ('-- DEV CHAT -- word blocked: %s', 'Watch your language! This is your first offense. You said "%s".', + 'Watch your language! This is your second offense. Next offense you\'ll get banned for 24 hours. You said "%s".') + class ChatAgentUD(DistributedObjectGlobalUD): - notify = DirectNotifyGlobal.directNotify.newCategory("ChatAgentUD") - - def announceGenerate(self): - DistributedObjectGlobalUD.announceGenerate(self) - - self.chatMode2channel = { + notify = DirectNotifyGlobal.directNotify.newCategory('ChatAgentUD') + WantWhitelist = config.GetBool('want-whitelist', True) + + chatMode2channel = { 1 : OtpDoGlobals.OTP_MOD_CHANNEL, 2 : OtpDoGlobals.OTP_ADMIN_CHANNEL, 3 : OtpDoGlobals.OTP_SYSADMIN_CHANNEL, - } - self.chatMode2prefix = { + } + chatMode2prefix = { 1 : "[MOD] ", 2 : "[ADMIN] ", 3 : "[SYSADMIN] ", - } - + } + + def announceGenerate(self): + DistributedObjectGlobalUD.announceGenerate(self) + + self.offenses = {} + def chatMessage(self, message, chatMode): sender = self.air.getAvatarIdFromSender() - if sender == 0: - self.air.writeServerEvent('suspicious', accId=self.air.getAccountIdFromSender(), - issue='Account sent chat without an avatar', message=message) + self.air.writeServerEvent('suspicious', self.air.getAccountIdFromSender(), + 'Account sent chat without an avatar', message) return - - self.air.writeServerEvent('chat-said', avId=sender, chatMode=chatMode, msg=message) - - if chatMode != 0: - if message.startswith('.'): - message = '.' + self.chatMode2prefix.get(chatMode, "") + message[1:] - else: - message = self.chatMode2prefix.get(chatMode, "") + message - + + if chatMode == 0: + if self.detectBadWords(self.air.getMsgSender(), message): + return + + self.air.writeServerEvent('chat-said', sender, message) + DistributedAvatar = self.air.dclassesByName['DistributedAvatarUD'] - dg = DistributedAvatar.aiFormatUpdate('setTalk', sender, self.chatMode2channel.get(chatMode, sender), self.air.ourChannel, [message]) + dg = DistributedAvatar.aiFormatUpdate('setTalk', sender, sender, + self.air.ourChannel, + [message]) self.air.send(dg) + + def detectBadWords(self, sender, message): + words = message.split() + print words + for word in words: + if word.lower() in BLACKLIST: + accountId = (sender >> 32) & 0xFFFFFFFF + avId = sender & 0xFFFFFFFF + + if not sender in self.offenses: + self.offenses[sender] = 0 + + if self.air.friendsManager.getToonAccess(avId) < 300: + self.offenses[sender] += 1 + + if self.offenses[sender] >= 3: + msg = 'Banned' + + else: + msg = OFFENSE_MSGS[self.offenses[sender]] % word + dclass = self.air.dclassesByName['ClientServicesManagerUD'] + dg = dclass.aiFormatUpdate('systemMessage', + OtpDoGlobals.OTP_DO_ID_CLIENT_SERVICES_MANAGER, + sender, 1000000, [msg]) + self.air.send(dg) + #self.air.banManager.ban(sender, 2, 'language') + + self.air.writeServerEvent('chat-offense', accountId, word=word, num=self.offenses[sender], msg=msg) + if self.offenses[sender] >= 3: + del self.offenses[sender] + + return 1 + + return 0 \ No newline at end of file diff --git a/toontown/friends/TTSFriendsManagerUD.py b/toontown/friends/TTSFriendsManagerUD.py index 39443f18..5a118b5b 100755 --- a/toontown/friends/TTSFriendsManagerUD.py +++ b/toontown/friends/TTSFriendsManagerUD.py @@ -149,6 +149,7 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD): self.onlineToons = [] self.tpRequests = {} self.whisperRequests = {} + self.toon2data = {} self.operations = [] self.delayTime = 1.0 @@ -252,6 +253,8 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD): self.sendUpdateToAvatarId(friendId, 'friendOffline', [doId]) if doId in self.onlineToons: self.onlineToons.remove(doId) + if doId in self.toon2data: + del self.toon2data[doId] self.air.dbInterface.queryObject(self.air.dbId, doId, handleToon) # -- Clear List -- @@ -356,3 +359,19 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD): def sleepAutoReply(self, toId): requester = self.air.getAvatarIdFromSender() self.sendUpdateToAvatarId(toId, 'setSleepAutoReply', [requester]) + + def getToonAccess(self, doId): + return self.toon2data.get(doId, {}).get('access', 0) + + def getToonName(self, doId): + return self.toon2data.get(doId, {}).get('name', '???') + + def getToonAccId(self, doId): + return self.toon2data.get(doId, {}).get('accId', 0) + + def addToonData(self, doId, fields): + data = {} + data['access'] = fields.get('setAdminAccess', [0])[0] + data['name'] = fields['setName'][0] + data['accId'] = fields.get('setDISLid', [0])[0] + self.toon2data[doId] = data diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 46a4e9f1..5bb247e3 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -8601,4 +8601,1267 @@ CEOSpeech = [ 'And thus we, the Cog Nation, are striving.', 'I am very delighted by this news, I just wanted to thank you all for working so hard for this news.', "Wait, what's going on? I can't see but I hear explosions." -] # Len of words + 10 \ No newline at end of file + ] +Blacklist = [ + "$1ut", + "$h1t", + "$hit", + "$lut", + "'ho", + "'hobag", + "a$$", + "anal", + "anus", + "ass", + "assmunch", + "b1tch", + "ballsack", + "bastard", + "beaner", + "beastiality", + "biatch", + "beeyotch", + "bitch", + "bitchy", + "blow job", + "blow me", + "blowjob", + "bollock", + "bollocks", + "bollok", + "boner", + "boob", + "bugger", + "buttplug", + "c-0-c-k", + "c-o-c-k", + "c-u-n-t", + "c.0.c.k", + "c.o.c.k.", + "c.u.n.t", + "jerk", + "jackoff", + "jackhole", + "j3rk0ff", + "homo", + "hom0", + "hobag", + "hell", + "h0mo", + "h0m0", + "goddamn", + "goddammit", + "godamnit", + "god damn", + "ghey", + "ghay", + "gfy", + "gay", + "fudgepacker", + "fudge packer", + "fuckwad", + "fucktard", + "fuckoff", + "fucker", + "fuck-tard", + "fuck off", + "fuck", + "fellatio", + "fellate", + "felching", + "felcher", + "felch", + "fartknocker", + "fart", + "fannybandit", + "fanny bandit", + "faggot", + "fagg", + "fag", + "f.u.c.k", + "f-u-c-k", + "f u c k", + "dyke", + "douchebag", + "douche", + "douch3", + "doosh", + "dildo", + "dike", + "dick", + "damnit", + "damn", + "dammit", + "d1ldo", + "d1ld0", + "d1ck", + "d0uche", + "d0uch3", + "cunt", + "cumstain", + "cum", + "crap", + "coon", + "cock", + "clitoris", + "clit", + "cl1t", + "cawk", + "c0ck", + "jerk0ff", + "jerkoff", + "jizz", + "knob end", + "knobend", + "labia", + "lmfao", + "lul", + "moolie", + "muff", + "nigga", + "nigger", + "p.u.s.s.y.", + "penis", + "piss", + "piss-off", + "pissoff", + "prick", + "pube", + "pussy", + "queer", + "retard", + "retarded", + "s hit", + "s-h-1-t", + "s-h-i-t", + "s.h.i.t.", + "scrotum", + "sex", + "sh1t", + "shit", + "slut", + "smegma", + "t1t", + "tard", + "terd", + "tit", + "tits", + "titties", + "turd", + "twat", + "vag", + "vagina", + "wank", + "wetback", + "whore", + "whoreface", + "F*ck", + "sh*t", + "pu$$y", + "p*ssy", + "diligaf", + "wtf", + "stfu", + "fu*ck", + "fack", + "shite", + "fxck", + "sh!t", + "@sshole", + "assh0le", + "assho!e", + "a$$hole", + "a$$h0le", + "a$$h0!e", + "a$$h01e", + "assho1e", + "wh0re", + "f@g", + "f@gg0t", + "f@ggot", + "motherf*cker", + "mofo", + "cuntlicker", + "cuntface", + "dickbag", + "douche waffle", + "jizz bag", + "cockknocker", + "beatch", + "fucknut", + "nucking futs", + "mams", + "carpet muncher", + "ass munch", + "ass hat", + "cunny", + "quim", + "clitty", + "fuck wad", + "kike", + "spic", + "wop", + "chink", + "wet back", + "mother humper", + "feltch", + "feltcher", + "FvCk", + "ahole", + "nads", + "spick", + "douchey", + "Bullturds", + "gonads", + "bitch", + "butt", + "fellatio", + "lmao", + "s-o-b", + "spunk", + "he11", + "jizm", + "jism", + "bukkake", + "shiz", + "wigger", + "gook", + "ritard", + "reetard", + "masterbate", + "masturbate", + "goatse", + "masterbating", + "masturbating", + "hitler", + "nazi", + "tubgirl", + "GTFO", + "FOAD", + "r-tard", + "rtard", + "hoor", + "g-spot", + "gspot", + "vulva", + "assmaster", + "viagra", + "Phuck", + "frack", + "fuckwit", + "assbang", + "assbanged", + "assbangs", + "asshole", + "assholes", + "asswipe", + "asswipes", + "b1tch", + "bastards", + "bitched", + "bitches", + "blow jobs", + "boners", + "bullshit", + "bullshits", + "bullshitted", + "cameltoe", + "camel toe", + "camel toes", + "chinc", + "chincs", + "chink", + "chode", + "chodes", + "clit", + "clits", + "cocks", + "coons", + "cumming", + "cunts", + "d1ck", + "dickhead", + "dickheads", + "doggie-style", + "dildos", + "douchebags", + "dumass", + "dumb ass", + "dumbasses", + "dykes", + "f-u-c-k", + "faggit", + "fags", + "fucked", + "fucker", + "fuckface", + "fucks", + "godamnit", + "gooks", + "humped", + "humping", + "jackass", + "jap", + "japs", + "jerk off", + "jizzed", + "kikes", + "knobend", + "kooch", + "kooches", + "kootch", + "mother fucker", + "mother fuckers", + "motherfucking", + "niggah", + "niggas", + "niggers", + "p.u.s.s.y.", + "porch monkey", + "porch monkeys", + "pussies", + "queers", + "rim job", + "rim jobs", + "sand nigger", + "sand niggers", + "s0b", + "shitface", + "shithead", + "shits", + "shitted", + "s.o.b.", + "spik", + "spiks", + "twats", + "whack off", + "whores", + "zoophile", + "m-fucking", + "mthrfucking", + "muthrfucking", + "mutherfucking", + "mutherfucker", + "mtherfucker", + "mthrfucker", + "mthrf*cker", + "whorehopper", + "maternal copulator", + "(!)", + "whoralicious", + "whorealicious", + "( Y )", + "(@ Y @)", + "(. Y .)", + "aeolus", + "Analprobe", + "Areola", + "areole", + "aryan", + "arian", + "asses", + "assfuck", + "azazel", + "baal", + "Babes", + "bang", + "banger", + "Barf", + "bawdy", + "Beardedclam", + "beater", + "Beaver", + "beer", + "bigtits", + "bimbo", + "Blew", + "blow", + "blowjobs", + "blowup", + "bod", + "bodily", + "boink", + "Bone", + "boned", + "bong", + "Boobies", + "Boobs", + "booby", + "booger", + "Bookie", + "Booky", + "bootee", + "bootie", + "Booty", + "Booze", + "boozer", + "boozy", + "bosom", + "bosomy", + "bowel", + "bowels", + "bra", + "Brassiere", + "breast", + "breasts", + "bung", + "babe", + "bush", + "buttfuck", + "cocaine", + "kinky", + "klan", + "panties", + "pedophile", + "pedophilia", + "pedophiliac", + "punkass", + "queaf", + "rape", + "scantily", + "essohbee", + "shithouse", + "smut", + "snatch", + "toots", + "doggie style", + "anorexia", + "bulimia", + "bulimiic", + "burp", + "busty", + "Buttfucker", + "caca", + "cahone", + "Carnal", + "Carpetmuncher", + "cervix", + "climax", + "Cocain", + "Cocksucker", + "Coital", + "coke", + "commie", + "condom", + "corpse", + "Coven", + "Crabs", + "crack", + "Crackwhore", + "crappy", + "cuervo", + "Cummin", + "Cumshot", + "cumshots", + "Cunnilingus", + "dago", + "dagos", + "damned", + "dick-ish", + "dickish", + "Dickweed", + "anorexic", + "prostitute", + "marijuana", + "LSD", + "PCP", + "diddle", + "dawgie-style", + "dimwit", + "dingle", + "doofus", + "dopey", + "douche", + "Drunk", + "Dummy", + "Ejaculate", + "enlargement", + "erect", + "erotic", + "exotic", + "extacy", + "Extasy", + "faerie", + "faery", + "fagged", + "fagot", + "Fairy", + "fisted", + "fisting", + "Fisty", + "floozy", + "fondle", + "foobar", + "foreskin", + "frigg", + "frigga", + "fubar", + "Fucking", + "fuckup", + "ganja", + "gays", + "glans", + "godamn", + "goddam", + "Goldenshower", + "gonad", + "gonads", + "Handjob", + "hebe", + "hemp", + "heroin", + "herpes", + "hijack", + "Hiv", + "Homey", + "Honky", + "hooch", + "hookah", + "Hooker", + "Hootch", + "hooter", + "hooters", + "hump", + "hussy", + "hymen", + "inbred", + "incest", + "injun", + "jerked", + "Jiz", + "Jizm", + "horny", + "junkie", + "junky", + "kill", + "kkk", + "kraut", + "kyke", + "lech", + "leper", + "lesbians", + "lesbos", + "Lez", + "Lezbian", + "lezbians", + "Lezbo", + "Lezbos", + "Lezzie", + "Lezzies", + "Lezzy", + "loin", + "loins", + "lube", + "Lust", + "lusty", + "Massa", + "Masterbation", + "Masturbation", + "maxi", + "Menses", + "Menstruate", + "Menstruation", + "meth", + "molest", + "moron", + "Motherfucka", + "Motherfucker", + "murder", + "Muthafucker", + "nad", + "naked", + "napalm", + "Nappy", + "nazism", + "negro", + "niggle", + "nimrod", + "ninny", + "Nipple", + "nooky", + "Nympho", + "Opiate", + "opium", + "oral", + "orally", + "organ", + "orgasm", + "orgies", + "orgy", + "ovary", + "ovum", + "ovums", + "Paddy", + "pantie", + "panty", + "Pastie", + "pasty", + "Pecker", + "pedo", + "pee", + "Peepee", + "Penetrate", + "Penetration", + "penial", + "penile", + "perversion", + "peyote", + "phalli", + "Phallic", + "Pillowbiter", + "pimp", + "pinko", + "pissed", + "pms", + "polack", + "porn", + "porno", + "pornography", + "pot", + "potty", + "prig", + "prude", + "pubic", + "pubis", + "punky", + "puss", + "Queef", + "quicky", + "Racist", + "racy", + "raped", + "Raper", + "rapist", + "raunch", + "rectal", + "rectum", + "rectus", + "reefer", + "reich", + "revue", + "risque", + "rum", + "rump", + "sadism", + "sadist", + "satan", + "scag", + "schizo", + "screw", + "Screwed", + "scrog", + "Scrot", + "Scrote", + "scrud", + "scum", + "seaman", + "seamen", + "seduce", + "semen", + "sex_story", + "sexual", + "Shithole", + "Shitter", + "shitty", + "s*o*b", + "sissy", + "skag", + "slave", + "sleaze", + "sleazy", + "sluts", + "smutty", + "sniper", + "snuff", + "sodom", + "souse", + "soused", + "sperm", + "spooge", + "Stab", + "steamy", + "Stiffy", + "stoned", + "strip", + "Stroke", + "whacking off", + "suck", + "sucked", + "sucking", + "tampon", + "tawdry", + "teat", + "teste", + "testee", + "testes", + "Testis", + "thrust", + "thug", + "tinkle", + "Titfuck", + "titi", + "titty", + "whacked off", + "toke", + "tramp", + "trashy", + "tush", + "undies", + "unwed", + "urinal", + "urine", + "uterus", + "uzi", + "valium", + "virgin", + "vixen", + "vodka", + "vomit", + "voyeur", + "vulgar", + "wad", + "wazoo", + "wedgie", + "weed", + "weenie", + "weewee", + "weiner", + "weirdo", + "wench", + "whitey", + "whiz", + "Whored", + "Whorehouse", + "Whoring", + "womb", + "woody", + "x-rated", + "xxx", + "B@lls", + "yeasty", + "yobbo", + "sumofabiatch", + "doggy-style", + "doggy style", + "wang", + "dong", + "d0ng", + "w@ng", + "wh0reface", + "wh0ref@ce", + "wh0r3f@ce", + "tittyfuck", + "tittyfucker", + "tittiefucker", + "cockholster", + "cockblock", + "gai", + "gey", + "faig", + "faigt", + "a55", + "a55hole", + "gae", + "corksucker", + "rumprammer", + "slutdumper", + "niggaz", + "muthafuckaz", + "gigolo", + "pussypounder", + "herp", + "herpy", + "transsexual", + "gender dysphoria", + "orgasmic", + "cunilingus", + "anilingus", + "dickdipper", + "dickwhipper", + "dicksipper", + "dickripper", + "dickflipper", + "dickzipper", + "homoey", + "queero", + "freex", + "cunthunter", + "shamedame", + "slutkiss", + "shiteater", + "slut devil", + "fuckass", + "fucka$$", + "clitorus", + "assfucker", + "dillweed", + "cracker", + "teabagging", + "shitt", + "azz", + "fuk", + "fucknugget", + "cuntlick", + "g@y", + "@ss", + "beotch", + "a55", + "anal", + "anus", + "ar5e", + "arrse", + "arse", + "ass", + "ass-fucker", + "asses", + "assfucker", + "assfukka", + "asshole", + "assholes", + "asswhole", + "a_s_s", + "b!tch", + "b00bs", + "b17ch", + "b1tch", + "ballbag", + "balls", + "ballsack", + "bastard", + "batard", + "beastial", + "beastiality", + "bellend", + "bestial", + "bestiality", + "bi\+ch", + "biatch", + "bitch", + "bitcher", + "bitchers", + "bitches", + "bitchin", + "bitching", + "bloody", + "blow job", + "blowjob", + "blowjobs", + "boiolas", + "bollock", + "bollok", + "boner", + "boob", + "boobs", + "booobs", + "boooobs", + "booooobs", + "booooooobs", + "breasts", + "buceta", + "bugger", + "bum", + "bunny fucker", + "butt", + "butthole", + "buttmuch", + "buttplug", + "c0ck", + "c0cksucker", + "carpet muncher", + "cawk", + "chink", + "chieuse", + "chieur", + "cipa", + "cl1t", + "clit", + "clitoris", + "clits", + "cnut", + "cock", + "cock-sucker", + "cock sucker", + "cockface", + "cockhead", + "cockmunch", + "cockmuncher", + "cocks", + "cocksuck", + "cocksucked", + "cocksucker", + "cocksucking", + "cocksucks", + "cocksuka", + "cocksukka", + "cok", + "cokmuncher", + "coksucka", + "coon", + "connard", + "connasse", + "conne", + "cox", + "crap", + "cum", + "cummer", + "cumming", + "cums", + "cumshot", + "cunilingus", + "cunillingus", + "cunnilingus", + "cunt", + "cuntlick", + "cuntlicker", + "cuntlicking", + "cunts", + "cyalis", + "cyberfuc", + "cyberfuck", + "cyberfucked", + "cyberfucker", + "cyberfuckers", + "cyberfucking", + "d1ck", + "damn", + "dick", + "dickhead", + "dildo", + "dildos", + "dink", + "dinks", + "dirsa", + "dlck", + "dog-fucker", + "doggin", + "dogging", + "donkeyribber", + "doosh", + "duche", + "dyke", + "ejaculate", + "ejaculated", + "ejaculates", + "ejaculating", + "ejaculatings", + "ejaculation", + "ejakulate", + "enculer", + "f u c k", + "f u c k e r", + "f4nny", + "fag", + "fagging", + "faggitt", + "faggot", + "faggs", + "fagot", + "fagots", + "fags", + "fanny", + "fannyflaps", + "fannyfucker", + "fanyy", + "fatass", + "fcuk", + "fcuker", + "fcuking", + "feck", + "fecker", + "felching", + "fellate", + "fellatio", + "fingerfuck", + "fingerfucked", + "fingerfucker", + "fingerfuckers", + "fingerfucking", + "fingerfucks", + "fistfuck", + "fistfucked", + "fistfucker", + "fistfuckers", + "fistfucking", + "fistfuckings", + "fistfucks", + "flange", + "fook", + "fooker", + "fuck", + "fucka", + "fucked", + "fucker", + "fuckers", + "fuckhead", + "fuckheads", + "fuckin", + "fucking", + "fuckings", + "fuckingshitmotherfucker", + "fuckme", + "fucks", + "fuckwhit", + "fuckwit", + "fudge packer", + "fudgepacker", + "fuk", + "fuker", + "fukker", + "fukkin", + "fuks", + "fukwhit", + "fukwit", + "fux", + "fux0r", + "f_u_c_k", + "gangbang", + "gangbanged", + "gangbangs", + "gaylord", + "gaysex", + "goatse", + "God", + "god-dam", + "god-damned", + "goddamn", + "goddamned", + "hardcoresex", + "hell", + "heshe", + "hoar", + "hoare", + "hoer", + "homo", + "hore", + "horniest", + "horny", + "hotsex", + "jack-off", + "jackoff", + "jap", + "jerk-off", + "jism", + "jiz", + "jizm", + "jizz", + "kawk", + "knob", + "knobead", + "knobed", + "knobend", + "knobhead", + "knobjocky", + "knobjokey", + "kock", + "kondum", + "kondums", + "kum", + "kummer", + "kumming", + "kums", + "kunilingus", + "l3i\+ch", + "l3itch", + "labia", + "lmfao", + "lust", + "lusting", + "m0f0", + "m0fo", + "m45terbate", + "ma5terb8", + "ma5terbate", + "masochist", + "master-bate", + "masterb8", + "masterbat", + "masterbat3", + "masterbate", + "masterbation", + "masterbations", + "masturbate", + "merde", + "mo-fo", + "mof0", + "mofo", + "mothafuck", + "mothafucka", + "mothafuckas", + "mothafuckaz", + "mothafucked", + "mothafucker", + "mothafuckers", + "mothafuckin", + "mothafucking", + "mothafuckings", + "mothafucks", + "motherfuck", + "motherfucked", + "motherfucker", + "motherfuckers", + "motherfuckin", + "motherfucking", + "motherfuckings", + "motherfuckka", + "motherfucks", + "muff", + "mutha", + "muthafecker", + "muthafuckker", + "muther", + "mutherfucker", + "n1gga", + "n1gger", + "nazi", + "nigg3r", + "nigg4h", + "nigga", + "niggah", + "niggas", + "niggaz", + "nigger", + "niggers", + "nique", + "niquer", + "nob", + "nobhead", + "nobjocky", + "nobjokey", + "numbnuts", + "nutsack", + "orgasim", + "orgasims", + "orgasm", + "orgasms", + "p0rn", + "pauvre con", + "pawn", + "pecker", + "penis", + "penisfucker", + "phonesex", + "phuck", + "phuk", + "phuked", + "phuking", + "phukked", + "phukking", + "phuks", + "phuq", + "pigfucker", + "pimpis", + "piss", + "pissed", + "pisser", + "pissers", + "pisses", + "pissflaps", + "pissin", + "pissing", + "pissoff", + "poop", + "porn", + "porno", + "pornography", + "pornos", + "prick", + "pron", + "pube", + "pusse", + "pussi", + "pussies", + "pussy", + "pute", + "putain", + "rectum", + "retard", + "rimjaw", + "rimming", + "s.o.b.", + "sadist", + "salaud", + "salop", + "salope", + "saloperie", + "schlong", + "screwing", + "scroat", + "scrote", + "scrotum", + "semen", + "sex", + "sh!\+", + "sh!t", + "sh1t", + "shag", + "shagger", + "shaggin", + "shagging", + "shemale", + "shi\+", + "shit", + "shitdick", + "shite", + "shited", + "shitey", + "shitfuck", + "shitfull", + "shithead", + "shiting", + "shits", + "shitted", + "shitter", + "shitting", + "shitty", + "skank", + "slut", + "sluts", + "smegma", + "smut", + "snatch", + "son-of-a-bitch", + "spac", + "spunk", + "s_h_i_t", + "t1tt1e5", + "t1tties", + "teets", + "teez", + "testical", + "testicle", + "tit", + "titfuck", + "tits", + "titt", + "tittie5", + "tittiefucker", + "titties", + "tittyfuck", + "tittywank", + "titwank", + "tosser", + "trou du cul", + "turd", + "tw4t", + "twat", + "twathead", + "twatty", + "twunt", + "twunter", + "v14gra", + "v1gra", + "vagina", + "viagra", + "vulva", + "w00se", + "wang", + "wank", + "wanker", + "wanky", + "whoar", + "whore", + "willies", + "willy", + "xrated", + "xxx" + ] # Len of words + 10 \ No newline at end of file diff --git a/toontown/uberdog/ClientServicesManagerUD.py b/toontown/uberdog/ClientServicesManagerUD.py index abdeda0f..afd68ade 100755 --- a/toontown/uberdog/ClientServicesManagerUD.py +++ b/toontown/uberdog/ClientServicesManagerUD.py @@ -916,6 +916,10 @@ class LoadAvatarFSM(AvatarOperationFSM): # Tell the GlobalPartyManager as well: self.csm.air.globalPartyMgr.avatarJoined(self.avId) + + fields = self.avatar + fields.update({'setAdminAccess': [self.account.get('ACCESS_LEVEL', 100)]}) + self.csm.air.friendsManager.addToonData(self.avId, fields) self.csm.air.writeServerEvent('avatarChosen', self.avId, self.target) self.demand('Off') @@ -966,7 +970,7 @@ class LoadAvatarFSM(AvatarOperationFSM): # Eliminate race conditions. taskMgr.doMethodLater(0.2, self.enterSetAvatarTask, 'avatarTask-%s' % self.avId, extraArgs=[channel], - appendTask=True) + appendTask=True) class UnloadAvatarFSM(OperationFSM): notify = directNotify.newCategory('UnloadAvatarFSM') From 61705bbf209f1e0cdc36734ad2f10a468855d713 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 14:50:16 +0300 Subject: [PATCH 019/161] Gifting update!!! --- dependencies/astron/dclass/stride.dc | 2 + otp/nametag/NametagConstants.py | 7 + toontown/catalog/CatalogAccessoryItem.py | 2 - toontown/catalog/CatalogBeanItem.py | 4 +- toontown/catalog/CatalogChatItem.py | 4 +- toontown/catalog/CatalogClothingItem.py | 2 - toontown/catalog/CatalogEmoteItem.py | 2 +- toontown/catalog/CatalogGardenItem.py | 5 - toontown/catalog/CatalogGardenStarterItem.py | 4 +- toontown/catalog/CatalogItemPanel.py | 7 +- toontown/catalog/CatalogManagerUD.py | 43 ---- toontown/catalog/CatalogNametagItem.py | 2 +- toontown/catalog/CatalogPetTrickItem.py | 2 +- toontown/catalog/CatalogRentalItem.py | 4 +- toontown/catalog/CatalogScreen.py | 174 +++++-------- toontown/estate/DistributedPhone.py | 15 +- toontown/estate/DistributedPhoneAI.py | 243 ++++++++++++------- toontown/toon/DistributedToonAI.py | 10 - toontown/toonbase/TTLocalizerEnglish.py | 8 +- toontown/uberdog/ToontownUberRepository.py | 3 - 20 files changed, 242 insertions(+), 301 deletions(-) delete mode 100644 toontown/catalog/CatalogManagerUD.py diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index e30e0294..e40ff817 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -2093,6 +2093,8 @@ dclass DistributedPhone : DistributedFurnitureItem { requestGiftPurchaseMessage(uint16, uint32, blob, int32) airecv clsend; requestGiftPurchaseResponse(uint16, int8); purchaseItemComplete(); + requestGiftAvatar(uint32) airecv clsend; + setGiftAvatar(blob); }; dclass DistributedFireworkShow : DistributedObject { diff --git a/otp/nametag/NametagConstants.py b/otp/nametag/NametagConstants.py index d0de16f3..7accb974 100644 --- a/otp/nametag/NametagConstants.py +++ b/otp/nametag/NametagConstants.py @@ -230,3 +230,10 @@ WHISPER_COLORS = { ), # TODO: WTToontownBoardingGroup } + +def getFriendColor(handle): + if handle.isAdmin(): + return CCAdmin + elif settings['trueFriends'] and base.localAvatar.isTrueFriends(handle.doId): + return CCNormal + return CCSpeedChat \ No newline at end of file diff --git a/toontown/catalog/CatalogAccessoryItem.py b/toontown/catalog/CatalogAccessoryItem.py index 8f1121c9..ec13dcc6 100755 --- a/toontown/catalog/CatalogAccessoryItem.py +++ b/toontown/catalog/CatalogAccessoryItem.py @@ -64,8 +64,6 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): return 1 if avatar.mailboxContents.count(self) != 0: return 1 - if self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 str = AccessoryTypes[self.accessoryType][ATString] if self.isHat(): defn = ToonDNA.HatStyles[str] diff --git a/toontown/catalog/CatalogBeanItem.py b/toontown/catalog/CatalogBeanItem.py index b2f09b66..5ae535e7 100755 --- a/toontown/catalog/CatalogBeanItem.py +++ b/toontown/catalog/CatalogBeanItem.py @@ -16,9 +16,7 @@ class CatalogBeanItem(CatalogItem.CatalogItem): return 0 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 - return 0 + return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder def getAcceptItemErrorText(self, retcode): if retcode == ToontownGlobals.P_ItemAvailable: diff --git a/toontown/catalog/CatalogChatItem.py b/toontown/catalog/CatalogChatItem.py index 51f2e523..9e5f8ecc 100755 --- a/toontown/catalog/CatalogChatItem.py +++ b/toontown/catalog/CatalogChatItem.py @@ -15,9 +15,7 @@ class CatalogChatItem(CatalogItem.CatalogItem): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 - return avatar.customMessages.count(self.customIndex) != 0 + return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or avatar.customMessages.count(self.customIndex) != 0 def getTypeName(self): return TTLocalizer.ChatTypeName diff --git a/toontown/catalog/CatalogClothingItem.py b/toontown/catalog/CatalogClothingItem.py index 6e4eae93..c13d5362 100755 --- a/toontown/catalog/CatalogClothingItem.py +++ b/toontown/catalog/CatalogClothingItem.py @@ -338,8 +338,6 @@ class CatalogClothingItem(CatalogItem.CatalogItem): return 1 if avatar.mailboxContents.count(self) != 0: return 1 - if self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 str = ClothingTypes[self.clothingType][CTString] dna = avatar.getStyle() if self.isShirt(): diff --git a/toontown/catalog/CatalogEmoteItem.py b/toontown/catalog/CatalogEmoteItem.py index 7e139110..2849a58c 100755 --- a/toontown/catalog/CatalogEmoteItem.py +++ b/toontown/catalog/CatalogEmoteItem.py @@ -17,7 +17,7 @@ class CatalogEmoteItem(CatalogItem.CatalogItem): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder: return 1 if self.emoteIndex >= len(avatar.emoteAccess): return 0 diff --git a/toontown/catalog/CatalogGardenItem.py b/toontown/catalog/CatalogGardenItem.py index 1d340357..eb6f731c 100755 --- a/toontown/catalog/CatalogGardenItem.py +++ b/toontown/catalog/CatalogGardenItem.py @@ -22,11 +22,6 @@ class CatalogGardenItem(CatalogItem.CatalogItem): else: return 100 - def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 - return 0 - def getAcceptItemErrorText(self, retcode): if retcode == ToontownGlobals.P_ItemAvailable: return TTLocalizer.CatalogAcceptGarden diff --git a/toontown/catalog/CatalogGardenStarterItem.py b/toontown/catalog/CatalogGardenStarterItem.py index 876bbafe..237642ee 100755 --- a/toontown/catalog/CatalogGardenStarterItem.py +++ b/toontown/catalog/CatalogGardenStarterItem.py @@ -16,9 +16,7 @@ class CatalogGardenStarterItem(CatalogItem.CatalogItem): return 0 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder or hasattr(avatar, 'gardenStarted') and avatar.getGardenStarted(): - return 1 - return 0 + return self in avatar.onOrder or self in avatar.mailboxContents or hasattr(avatar, 'gardenStarted') and avatar.getGardenStarted() def saveHistory(self): return 1 diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index 3341f822..caee7b43 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -402,11 +402,10 @@ class CatalogItemPanel(DirectFrame): 'item': self['item'].getName(), 'price': self['item'].getPrice(self['type'])} else: - friendIndex = self.parentCatalogScreen.friendGiftIndex friendText = 'Error' numFriends = len(base.localAvatar.friendsList) + len(base.cr.avList) - 1 if numFriends > 0: - friendText = self.parentCatalogScreen.receiverName + friendText = self.parentCatalogScreen.friendName message = TTLocalizer.CatalogVerifyGift % {'item': self['item'].getName(), 'price': self['item'].getPrice(self['type']), 'friend': friendText} @@ -456,8 +455,8 @@ class CatalogItemPanel(DirectFrame): auxText = TTLocalizer.CatalogNotAGift self.auxText['text'] = auxText return - elif self.parentCatalogScreen.gotAvatar == 1: - avatar = self.parentCatalogScreen.giftAvatar + elif self.parentCatalogScreen.friend: + avatar = self.parentCatalogScreen.friend if self['item'].forBoysOnly() and avatar.getStyle().getGender() == 'f' or self['item'].forGirlsOnly() and avatar.getStyle().getGender() == 'm': self.giftButton.show() self.giftButton['state'] = DGG.DISABLED diff --git a/toontown/catalog/CatalogManagerUD.py b/toontown/catalog/CatalogManagerUD.py deleted file mode 100644 index d73f8571..00000000 --- a/toontown/catalog/CatalogManagerUD.py +++ /dev/null @@ -1,43 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.showbase.DirectObject import DirectObject - -from toontown.catalog import CatalogItem, CatalogItemList - -class CatalogManagerUD(DirectObject): - notify = DirectNotifyGlobal.directNotify.newCategory('CatalogManagerUD') - TIMEOUT = 15 - - def __init__(self, air): - self.air = air - - self.accept('CATALOG_addGift_AI2UD', self.__handleCatalogAddGift) - self.accept('CATALOG_addGift_UD2Toon_resp', self.__handleToonResp) - - self.__context = 0 - - def __handleCatalogAddGift(self, avId, blob): - ctx = self.__context - self.__context += 1 - self.air.sendNetEvent('CATALOG_addGift_UD2Toon_%d' % avId, [blob, ctx]) - taskMgr.doMethodLater(self.TIMEOUT, self.__doTimeout, 'catalogMgr-timeout-%d' % ctx, [blob, avId]) - - def __handleToonResp(self, avId, ctx): - self.notify.info('%d is online, gift deliver order handled by AI' % avId) - taskMgr.remove('catalogMgr-timeout-%d' % ctx) - - def __doTimeout(self, blob, avId): - self.notify.info('%d is offline, adding order to database' % avId) - self.air.dbInterface.queryObject(self.air.dbId, avId, lambda a, b: self.__handleRetrieve(a, b, avId, blob)) - - def __handleRetrieve(self, dclass, fields, avId, blob): - if dclass != self.air.dclassesByName['DistributedToonUD']: - self.notify.warning('Unable to deliver gift: avId is not a DistributedToon!') - return - - store = CatalogItem.Customization | CatalogItem.DeliveryDate - giftOnOrder = CatalogItemList.CatalogItemList(fields.get('setGiftSchedule', [''])[0], store=store) - giftOnOrder.append(CatalogItem.getItem(blob, store=store | CatalogItem.GiftTag)) - fields['setGiftSchedule'] = (giftOnOrder.getBlob(store=store),) - - self.air.dbInterface.updateObject(self.air.dbId, avId, self.air.dclassesByName['DistributedToonUD'], fields) - self.notify.info('Successfully delivered gift to %d' % avId) \ No newline at end of file diff --git a/toontown/catalog/CatalogNametagItem.py b/toontown/catalog/CatalogNametagItem.py index 2d3ffd45..f0796b66 100755 --- a/toontown/catalog/CatalogNametagItem.py +++ b/toontown/catalog/CatalogNametagItem.py @@ -17,7 +17,7 @@ class CatalogNametagItem(CatalogItem.CatalogItem): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder: return 1 if avatar.nametagStyle == self.nametagStyle: return 1 diff --git a/toontown/catalog/CatalogPetTrickItem.py b/toontown/catalog/CatalogPetTrickItem.py index 7932ee07..c1372855 100755 --- a/toontown/catalog/CatalogPetTrickItem.py +++ b/toontown/catalog/CatalogPetTrickItem.py @@ -17,7 +17,7 @@ class CatalogPetTrickItem(CatalogItem.CatalogItem): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder or not hasattr(avatar, 'petTrickPhrases'): + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or not hasattr(avatar, 'petTrickPhrases'): return 1 return self.trickId in avatar.petTrickPhrases diff --git a/toontown/catalog/CatalogRentalItem.py b/toontown/catalog/CatalogRentalItem.py index 51dd0ae2..40998d83 100755 --- a/toontown/catalog/CatalogRentalItem.py +++ b/toontown/catalog/CatalogRentalItem.py @@ -24,9 +24,7 @@ class CatalogRentalItem(CatalogItem.CatalogItem): return 0 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 - return 0 + return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder def saveHistory(self): return 1 diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index f30e9fab..5ea5e21c 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -15,7 +15,7 @@ import random from toontown.toon import DistributedToon from direct.directnotify import DirectNotifyGlobal from otp.nametag.ChatBalloon import ChatBalloon -from otp.nametag import NametagGroup +from otp.nametag import NametagGroup, NametagConstants NUM_CATALOG_ROWS = 3 NUM_CATALOG_COLS = 2 @@ -31,6 +31,7 @@ class CatalogScreen(DirectFrame): notify = DirectNotifyGlobal.directNotify.newCategory('CatalogScreen') def __init__(self, parent = aspect2d, **kw): + self.gifting = -1 guiItems = loader.loadModel('phase_5.5/models/gui/catalog_gui') background = guiItems.find('**/catalog_background') background.setBin("background", 10) @@ -44,19 +45,11 @@ class CatalogScreen(DirectFrame): ('relief', None, None)) self.defineoptions(kw, optiondefs) DirectFrame.__init__(self, parent) - self.friendGiftIndex = 0 - self.friendGiftHandle = None - self.frienddoId = None - self.receiverName = 'Error Nameless Toon' - self.friends = {} - self.family = {} - self.ffList = [] - self.textRolloverColor = Vec4(1, 1, 0, 1) - self.textDownColor = Vec4(0.5, 0.9, 1, 1) - self.textDisabledColor = Vec4(0.4, 0.8, 0.4, 1) - self.giftAvatar = None - self.gotAvatar = 0 - self.allowGetDetails = 1 + self.friend = None + self.friendAvId = None + self.friendName = 'Error Nameless Toon' + self.friendList = [] + self.friends = [] self.load(guiItems, guiButton, guiBack) self.initialiseoptions(CatalogScreen) self.enableBackorderCatalogButton() @@ -66,10 +59,8 @@ class CatalogScreen(DirectFrame): self.hide() self.clarabelleChatNP = None self.clarabelleChatBalloon = None - self.gifting = -1 self.createdGiftGui = None self.viewing = None - return def show(self): self.accept('CatalogItemPurchaseRequest', self.__handlePurchaseRequest) @@ -91,10 +82,6 @@ class CatalogScreen(DirectFrame): taskMgr.doMethodLater(1.0, clarabelleGreeting, 'clarabelleGreeting') taskMgr.doMethodLater(12.0, clarabelleHelpText1, 'clarabelleHelpText1') - if hasattr(self, 'giftToggle'): - self.giftToggle['state'] = DGG.DISABLED - self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleWait - self.__handleUDack() def hide(self): self.ignore('CatalogItemPurchaseRequest') @@ -544,16 +531,15 @@ class CatalogScreen(DirectFrame): -2.0, -1.45), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.9 + lift), image=backDown, pressEffect=0, command=self.showEmblemItems, text=TTLocalizer.CatalogEmblem, text_font=ToontownGlobals.getSignFont(), text_pos=(1.75, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.emblemCatalogButton2.hide() - self.__makeFFlist() - print self.ffList - if len(self.ffList) > 0: + self.__makeFriendList() + if len(self.friendList) > 0: if config.GetBool('want-gifting', True): self.giftToggle = DirectButton(self.base, relief=None, pressEffect=0, image=(giftToggleUp, giftToggleDown, giftToggleUp), image_scale=(1.0, 1, 0.7), command=self.__giftToggle, text=TTLocalizer.CatalogGiftToggleOff, text_font=ToontownGlobals.getSignFont(), text_pos=TTLocalizer.CSgiftTogglePos, text_scale=TTLocalizer.CSgiftToggle, text_fg=(0.353, 0.627, 0.627, 1.0), text3_fg=(0.15, 0.3, 0.3, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0), image_color=Vec4(1.0, 1.0, 0.2, 1.0), image1_color=Vec4(0.9, 0.85, 0.2, 1.0), image2_color=Vec4(0.9, 0.85, 0.2, 1.0), image3_color=Vec4(0.5, 0.45, 0.2, 1.0)) self.giftToggle.setPos(0.0, 0, -0.035) self.giftLabel = DirectLabel(self.base, relief=None, image=giftFriends, image_scale=(1.15, 1, 1.14), text=' ', text_font=ToontownGlobals.getSignFont(), text_pos=(1.2, -0.97), text_scale=0.07, text_fg=(0.392, 0.549, 0.627, 1.0), sortOrder=100, textMayChange=1) self.giftLabel.setPos(-0.15, 0, 0.08) self.giftLabel.hide() - self.friendLabel = DirectLabel(self.base, relief=None, text='Friend Name', text_font=ToontownGlobals.getSignFont(), text_pos=(-0.25, 0.132), text_scale=0.068, text_align=TextNode.ALeft, text_fg=(0.992, 0.949, 0.327, 1.0), sortOrder=100, textMayChange=1) + self.friendLabel = DirectLabel(self.base, relief=None, text=TTLocalizer.CatalogGiftChoose, text_font=ToontownGlobals.getSignFont(), text_pos=(-0.25, 0.132), text_scale=0.068, text_align=TextNode.ALeft, text_fg=(0.992, 0.949, 0.327, 1.0), sortOrder=100, textMayChange=1) self.friendLabel.setPos(0.5, 0, -0.42) self.friendLabel.hide() gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') @@ -572,9 +558,6 @@ class CatalogScreen(DirectFrame): clipNP = self.scrollList.attachNewNode(clipper) self.scrollList.setClipPlane(clipNP) self.__makeScrollList() - friendId = self.ffList[0] - self.__chooseFriend(self.ffList[0][0], self.ffList[0][1]) - self.update() self.createdGiftGui = 1 for i in xrange(4): self.newCatalogButton.component('text%d' % i).setR(90) @@ -831,8 +814,6 @@ class CatalogScreen(DirectFrame): taskMgr.remove('clarabelleGreeting') taskMgr.remove('clarabelleHelpText1') taskMgr.remove('clarabelleAskAnythingElse') - if self.giftAvatar: - base.cr.cancelAvatarDetailsRequest(self.giftAvatar) self.hide() self.hangup.hide() self.destroy() @@ -864,16 +845,12 @@ class CatalogScreen(DirectFrame): del self.giftLabel del self.friendLabel del self.scrollList + del self.friend + del self.friends self.unloadClarabelle() if self.responseDialog: self.responseDialog.cleanup() self.responseDialog = None - if self.giftAvatar: - if hasattr(self.giftAvatar, 'doId'): - self.giftAvatar.delete() - else: - self.giftAvatar = None - return def unloadClarabelle(self): base.win.removeDisplayRegion(self.cDr) @@ -891,8 +868,6 @@ class CatalogScreen(DirectFrame): del self.clarabelleChatBalloon def hangUp(self): - if hasattr(self, 'giftAvatar') and self.giftAvatar: - self.giftAvatar.disable() self.setClarabelleChat(random.choice(TTLocalizer.CatalogGoodbyeList), type='goodbye') self.setPageIndex(-1) self.showPageItems() @@ -921,9 +896,8 @@ class CatalogScreen(DirectFrame): self.update() def update(self, task = None): - if not hasattr(self.giftAvatar, 'doId'): - if self.gifting == 1: - self.__giftToggle() + if (not self.friend) and self.gifting == 1: + self.__giftToggle() if hasattr(self, 'beanBank'): self.beanBank['text'] = str(base.localAvatar.getTotalMoney()) for item in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: @@ -935,7 +909,7 @@ class CatalogScreen(DirectFrame): taskMgr.remove('clarabelleAskAnythingElse') def __handleGiftPurchaseRequest(self, item): - item.requestGiftPurchase(self['phone'], self.frienddoId, self.__handleGiftPurchaseResponse) + item.requestGiftPurchase(self['phone'], self.friendAvId, self.__handleGiftPurchaseResponse) taskMgr.remove('clarabelleAskAnythingElse') def __handlePurchaseResponse(self, retCode, item): @@ -954,7 +928,7 @@ class CatalogScreen(DirectFrame): return if self.isEmpty() or self.isHidden(): return - self.setClarabelleChat(item.getRequestGiftPurchaseErrorText(retCode) % self.receiverName) + self.setClarabelleChat(item.getRequestGiftPurchaseErrorText(retCode) % self.friendName) self.__loadFriend() def askAnythingElse(task): @@ -1010,85 +984,56 @@ class CatalogScreen(DirectFrame): self.silverLabel.hide() self.goldLabel.hide() - def checkFamily(self, doId): - test = 0 - for familyMember in base.cr.avList: - if familyMember.id == doId: - test = 1 - - return test - - def __makeFFlist(self): - for familyMember in base.cr.avList: - if familyMember.id != base.localAvatar.doId: - newFF = (familyMember.id, familyMember.name, NametagGroup.CCNonPlayer) - self.ffList.append(newFF) + def __makeFriendList(self): + for av in base.cr.avList: + if av.id != base.localAvatar.doId: + self.friendList.append((av.id, av.name, NametagGroup.CCNonPlayer)) for id, handle in base.cr.friendsMap.items(): if isinstance(handle, FriendHandle.FriendHandle): - self.ffList.append((id, handle.getName(), None))#NametagGlobals.getFriendColor(handle))) + self.friendList.append((id, handle.getName(), NametagConstants.getFriendColor(handle))) def __makeScrollList(self): - for ff in self.ffList: - ffbutton = self.makeFamilyButton(ff[0], ff[1], ff[2]) - if ffbutton: - self.scrollList.addItem(ffbutton, refresh=0) - self.friends[ff] = ffbutton + for friend in self.friendList: + button = self.makeFriendButton(*friend) + self.scrollList.addItem(button, refresh=0) + self.friends.append(button) self.scrollList.refresh() - def makeFamilyButton(self, familyId, familyName, colorCode): - # fg = NametagGlobals.getNameFg(colorCode, PGButton.SInactive) - return DirectButton( - relief=None, - text=familyName, - text_scale=0.04, - text_align=TextNode.ALeft, - # text_fg=fg, - text1_bg=self.textDownColor, - text2_bg=self.textRolloverColor, - text3_fg=self.textDisabledColor, - textMayChange=0, - command=self.__chooseFriend, - extraArgs=[familyId, familyName] - ) + def makeFriendButton(self, avId, name, colorCode): + color = NametagConstants.NAMETAG_COLORS[colorCode] - def __chooseFriend(self, friendId, friendName): + return DirectButton(relief=None, text=name, text_scale=0.04, text_align=TextNode.ALeft, text_fg=color[0][0], text1_bg=(1, 1, 0, 1), + text2_bg=(0.5, 0.9, 1, 1), text3_fg=(0.4, 0.8, 0.4, 1), command=self.__chooseFriend, extraArgs=[avId, name]) + + def __chooseFriend(self, avId, name): messenger.send('wakeup') - self.frienddoId = friendId - self.receiverName = friendName - self.friendLabel['text'] = TTLocalizer.CatalogGiftTo % self.receiverName + + if self.friendAvId == avId: + return + + self.friendAvId = avId + self.friendName = name self.__loadFriend() def __loadFriend(self): - if self.allowGetDetails == 0: - CatalogScreen.notify.warning('smashing requests') - if self.frienddoId and self.allowGetDetails: - if self.giftAvatar: - if hasattr(self.giftAvatar, 'doId'): - self.giftAvatar.disable() - self.giftAvatar.delete() - self.giftAvatar = None - self.giftAvatar = DistributedToon.DistributedToon(base.cr) - self.giftAvatar.doId = self.frienddoId - self.giftAvatar.forceAllowDelayDelete() - self.giftAvatar.generate() - base.cr.getAvatarDetails(self.giftAvatar, self.__handleAvatarDetails, 'DistributedToon') - self.gotAvatar = 0 - self.allowGetDetails = 0 - self.scrollList['state'] = DGG.DISABLED - return - - def __handleAvatarDetails(self, gotData, avatar, dclass): - if self.giftAvatar.doId != avatar.doId or gotData == 0: - CatalogScreen.notify.error('Get Gift Avatar Failed') - self.gotAvatar = 0 + if not self.friendAvId: return - else: - self.gotAvatar = 1 - self.giftAvatar = avatar - self.scrollList['state'] = DGG.NORMAL - self.allowGetDetails = 1 + + for friendButton in self.friends: + friendButton['state'] = DGG.DISABLED + + self.friend = None + self.friendLabel['text'] = TTLocalizer.CatalogGiftUpdating + self['phone'].requestGiftAvatar(self.friendAvId) + + def setFriendReady(self, friend): + for friendButton in self.friends: + friendButton['state'] = DGG.NORMAL + + self.friend = friend + self.friendLabel['text'] = TTLocalizer.CatalogGiftTo % self.friendName self.update() def __giftToggle(self): @@ -1102,20 +1047,13 @@ class CatalogScreen(DirectFrame): self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOn self.__loadFriend() else: + self.friend = None + self.friendAvId = 0 + self.friendName = None self.gifting = -1 self.giftLabel.hide() self.friendLabel.hide() self.scrollList.hide() self.showEmblems() self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOff - self.update() - - def __handleUDack(self, caller = None): - taskMgr.remove('ackTimeOut') - if hasattr(self, 'giftToggle') and self.giftToggle: - self.giftToggle['state'] = DGG.NORMAL - self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOff - - def __handleNoAck(self, caller = None): - if hasattr(self, 'giftToggle') and self.giftToggle: - self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleNoAck \ No newline at end of file + self.update() \ No newline at end of file diff --git a/toontown/estate/DistributedPhone.py b/toontown/estate/DistributedPhone.py index c97beede..bfabe965 100755 --- a/toontown/estate/DistributedPhone.py +++ b/toontown/estate/DistributedPhone.py @@ -2,6 +2,7 @@ from toontown.toonbase import ToontownGlobals import PhoneGlobals from toontown.catalog import CatalogScreen from toontown.catalog import CatalogItem +from toontown.catalog import GiftAvatar from toontown.toontowngui import TTDialog from toontown.toonbase import TTLocalizer import DistributedHouseInterior @@ -13,7 +14,6 @@ from direct.showutil import Rope from direct.directnotify.DirectNotifyGlobal import * from panda3d.core import * from direct.interval.IntervalGlobal import * -import string from toontown.quest import Quests from direct.task import Task @@ -274,7 +274,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.sendUpdate('requestPurchaseMessage', [context, blob, optional]) def requestGiftPurchase(self, item, targetDoID, callback, optional = -1): - print 'in the client phone' blob = item.getBlob(store=CatalogItem.Customization) context = self.getCallbackContext(callback, [item]) self.sendUpdate('requestGiftPurchaseMessage', [context, targetDoID, blob, optional]) @@ -382,3 +381,15 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): ringIval = Parallel(Func(base.playSfx, self.ringSfx), shakeSeq, Func(phone.setR, 0)) self.playInterval(ringIval, 0.0, None) return + + def requestGiftAvatar(self, doId): + if not self.phoneGui: + return + + self.sendUpdate('requestGiftAvatar', [doId]) + + def setGiftAvatar(self, fields): + if not self.phoneGui: + return + + self.phoneGui.setFriendReady(GiftAvatar.createFromJson(fields)) \ No newline at end of file diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 0df7c825..38e80db8 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -4,20 +4,53 @@ from toontown.estate.DistributedFurnitureItemAI import DistributedFurnitureItemA from PhoneGlobals import * from toontown.toonbase import ToontownGlobals -from toontown.catalog import CatalogItem, CatalogInvalidItem +from toontown.catalog import CatalogItem, CatalogInvalidItem, GiftAvatar from toontown.catalog.CatalogItemList import CatalogItemList from toontown.uberdog import TopToonsGlobals +import base64 +import json import time MAX_MAILBOX = 10 MAX_ON_ORDER = 10 +class LoadGiftAvatar: + + def __init__(self, phone, avId, targetId, optional, callback): + self.air = phone.air + self.phone = phone + self.avId = avId + self.targetId = targetId + self.optional = optional + self.callback = callback + + def start(self): + self.air.dbInterface.queryObject(self.air.dbId, self.targetId, self.__gotAvatar) + + def copyDict(self, dict, *keys): + return {key: dict[key] for key in keys} + + def __gotAvatar(self, dclass, fields): + if dclass != self.air.dclassesByName['DistributedToonAI']: + return + + for key in ('setDNAString', 'setMailboxContents', 'setGiftSchedule', 'setDeliverySchedule'): + fields[key] = base64.b64encode(fields[key][0]) + + newDict = self.copyDict(fields, 'setDNAString', 'setMailboxContents', 'setGiftSchedule', 'setDeliverySchedule', 'setHat', 'setGlasses', 'setBackpack', + 'setShoes', 'setHatList', 'setGlassesList', 'setBackpackList', 'setShoes', 'setShoesList', 'setCustomMessages', 'setEmoteAccess', + 'setClothesTopsList', 'setClothesBottomsList', 'setPetTrickPhrases') + + self.callback(self.avId, self.targetId, newDict, self.optional) + del self.phone.fsms[self.avId] + class DistributedPhoneAI(DistributedFurnitureItemAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPhoneAI") def __init__(self, air, furnitureMgr, catalogItem): DistributedFurnitureItemAI.__init__(self, air, furnitureMgr, catalogItem) + self.fsms = {} self.initialScale = (0.8, 0.8, 0.8) self.inUse = False self.currAvId = 0 @@ -100,111 +133,135 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): return return av + + def checkPurchaseLimit(self, recipient, item): + if len(recipient.onOrder) >= MAX_ON_ORDER: + return ToontownGlobals.P_ReachedPurchaseLimit + elif len(recipient.mailboxContents) >= MAX_MAILBOX: + return ToontownGlobals.P_MailboxFull + elif item.reachedPurchaseLimit(recipient): + return ToontownGlobals.P_ReachedPurchaseLimit - def attemptPurchase(self, avBuying, recepient, blob, optional, payMethod, gifting=False): - avId = avBuying.doId - + return ToontownGlobals.P_ItemOnOrder + + def chargeAvatar(self, av, money, emblems): + av.takeMoney(money) + av.subtractEmblems(emblems) + + def attemptPurchase(self, context, av, blob, optional, gifting=False): + avId = av.doId item = CatalogItem.getItem(blob, CatalogItem.Customization) + if isinstance(item, CatalogInvalidItem.CatalogInvalidItem): self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item') self.notify.warning('%d tried purchasing invalid item' % avId) return ToontownGlobals.P_NotInCatalog - - if item in avBuying.backCatalog: - priceType = CatalogItem.CatalogTypeBackorder - - elif item in avBuying.weeklyCatalog or item in avBuying.monthlyCatalog: - priceType = 0 - - elif item.__class__.__name__ == "CatalogHouseItem": - priceType = 0 - - else: + elif (not item.hasEmblemPrices()) and item not in av.backCatalog and item not in av.weeklyCatalog and item not in av.monthlyCatalog: self.air.writeServerEvent('suspicious', avId, 'tried purchasing non-existing item') self.notify.warning('%d tried purchasing non-existing item' % avId) return ToontownGlobals.P_NotInCatalog - - def _getEmblemPrices(): - if config.GetBool('catalog-emblems-OR', False): - ep = list(item.getEmblemPrices()) - if len(ep) != 2: - return [] - - if all(ep): - ep[payMethod] = 0 - - else: - ep = item.getEmblemPrices() - - return ep - - def charge(): - ep = _getEmblemPrices() - if ep: - avBuying.subtractEmblems(ep) - - avBuying.takeMoney(item.getPrice(priceType)) - - if not gifting and item.reachedPurchaseLimit(recepient): - retcode = ToontownGlobals.P_ReachedPurchaseLimit - - elif not gifting and len(recepient.onOrder) >= MAX_ON_ORDER: - retcode = ToontownGlobals.P_ReachedPurchaseLimit - - elif not gifting and len(recepient.mailboxContents) >= MAX_MAILBOX: - retcode = ToontownGlobals.P_MailboxFull - - elif item.getPrice(priceType) >= avBuying.getTotalMoney(): - retcode = ToontownGlobals.P_NotEnoughMoney - - elif not avBuying.isEnoughEmblemsToBuy(_getEmblemPrices()): - retcode = ToontownGlobals.P_NotEnoughMoney - - elif gifting and not item.isGift(): - retcode = ToontownGlobals.P_NotAGift - - elif not item.getDeliveryTime() and not gifting: - retcode = item.recordPurchase(recepient, optional) - if retcode == ToontownGlobals.P_ItemAvailable: - - charge() - - else: - retcode = ToontownGlobals.P_ItemOnOrder - charge() - deliveryTime = item.getDeliveryTime() - if config.GetBool('want-instant-delivery', False): - deliveryTime = 0 - + if gifting and not item.isGift(): + return ToontownGlobals.P_NotAGift + + price = item.getPrice(CatalogItem.CatalogTypeBackorder if item in av.backCatalog else 0) + + if price > av.getTotalMoney() or (item.hasEmblemPrices() and not av.isEnoughEmblemsToBuy(item.getEmblemPrices())): + return ToontownGlobals.P_NotEnoughMoney + + if item.getDeliveryTime() or gifting: + deliveryTime = 0 if config.GetBool('want-instant-delivery', False) else item.getDeliveryTime() item.deliveryDate = int(time.time() / 60. + deliveryTime + .5) - - if not gifting: - recepient.onOrder.append(item) - recepient.b_setDeliverySchedule(recepient.onOrder) - - else: - item.giftTag = avBuying.doId - store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag - self.air.sendNetEvent('CATALOG_addGift_AI2UD', [recepient, item.getBlob(store=store)]) - - return retcode - - def requestPurchaseMessage(self, context, blob, optional, payMethod=0): - av = self.__getCaller() - if av: - retcode = self.attemptPurchase(av, av, blob, optional, payMethod) - if retcode in (ToontownGlobals.P_ItemOnOrder, ToontownGlobals.P_ItemAvailable): - messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_CATALOG, 1]) - self.sendUpdateToAvatarId(av.doId, 'requestPurchaseResponse', [context, retcode]) - def requestGiftPurchaseMessage(self, context, targetDoID, blob, optional, payMethod=0): + if gifting: + return self.requestGiftAvatarOperation(avId, gifting, [context, item, price], self.attemptGiftPurchase) + else: + returnCode = self.checkPurchaseLimit(av, item) + + if returnCode != ToontownGlobals.P_ItemOnOrder: + return returnCode + + if item.getDeliveryTime(): + self.chargeAvatar(av, price, item.getEmblemPrices()) + av.onOrder.append(item) + av.b_setDeliverySchedule(av.onOrder) + else: + returnCode = item.recordPurchase(av, optional) + + if returnCode == ToontownGlobals.P_ItemAvailable: + self.chargeAvatar(av, price, item.getEmblemPrices()) + + return returnCode + + return None + + def attemptGiftPurchase(self, avId, targetId, avatar, optional): + av = self.air.doId2do.get(avId) + + if not av: + return + + recipient = GiftAvatar.createFromFields(avatar) + context = optional[0] + item = optional[1] + returnCode = self.checkPurchaseLimit(recipient, item) + + if returnCode != ToontownGlobals.P_ItemOnOrder: + self.sendGiftPurchaseResponse(context, avId, returnCode) + return + + item.giftTag = avId + self.chargeAvatar(av, optional[2], item.getEmblemPrices()) + recipient.onGiftOrder.append(item) + + dg = self.air.dclassesByName['DistributedToonAI'].aiFormatUpdate('setGiftSchedule', targetId, targetId, self.air.ourChannel, [recipient.getGiftScheduleBlob()]) + self.air.send(dg) + self.sendGiftPurchaseResponse(context, avId, ToontownGlobals.P_ItemOnOrder) + + def sendGiftPurchaseResponse(self, context, avId, returnCode): + if returnCode in (ToontownGlobals.P_ItemOnOrder, ToontownGlobals.P_ItemAvailable): + messenger.send('topToonsManager-event', [avId, TopToonsGlobals.CAT_CATALOG | TopToonsGlobals.CAT_GIFTS, 1]) + + self.sendUpdateToAvatarId(avId, 'requestGiftPurchaseResponse', [context, returnCode]) + + def requestPurchaseMessage(self, context, blob, optional): av = self.__getCaller() - if av: - retcode = self.attemptPurchase(av, targetDoID, blob, optional, payMethod, gifting=True) - if retcode in (ToontownGlobals.P_ItemOnOrder, ToontownGlobals.P_ItemAvailable): - messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_CATALOG | TopToonsGlobals.CAT_GIFTS, 1]) - self.sendUpdateToAvatarId(av.doId, 'requestGiftPurchaseResponse', [context, retcode]) + + if not av: + return + + returnCode = self.attemptPurchase(context, av, blob, optional) + + if returnCode in (ToontownGlobals.P_ItemOnOrder, ToontownGlobals.P_ItemAvailable): + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_CATALOG, 1]) + + self.sendUpdateToAvatarId(av.doId, 'requestPurchaseResponse', [context, returnCode]) + + def requestGiftPurchaseMessage(self, context, targetId, blob, optional): + av = self.__getCaller() + + if not av: + return + + returnCode = self.attemptPurchase(context, av, blob, optional, gifting=targetId) + + if returnCode: + self.sendGiftPurchaseResponse(context, av.doId, returnCode) + + def requestGiftAvatar(self, doId): + self.requestGiftAvatarOperation(self.air.getAvatarIdFromSender(), doId, None, self.sendGiftAvatarResponse) + + def requestGiftAvatarOperation(self, avId, doId, optional, callback): + if avId in self.fsms: + return + + loadOperation = LoadGiftAvatar(self, avId, doId, optional, callback) + loadOperation.start() + self.fsms[avId] = loadOperation + return None + + def sendGiftAvatarResponse(self, avId, targetId, avatar, optional): + self.sendUpdateToAvatarId(avId, 'setGiftAvatar', [json.dumps(avatar)]) def resetMovie(self, task): self.d_setMovie(PHONE_MOVIE_CLEAR, 0) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 4f34b883..58cfae0b 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -175,8 +175,6 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo from toontown.toon.DistributedNPCToonBaseAI import DistributedNPCToonBaseAI if not isinstance(self, DistributedNPCToonBaseAI): self.sendUpdate('setDefaultShard', [self.air.districtId]) - - self.accept('CATALOG_addGift_UD2Toon_%d' % self.doId, self.__handleAddGift) def setLocation(self, parentId, zoneId): DistributedPlayerAI.DistributedPlayerAI.setLocation(self, parentId, zoneId) @@ -238,8 +236,6 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo PetLookerAI.PetLookerAI.destroy(self) del self.kart self._sendExitServerEvent() - - self.ignore('CATALOG_addGift_UD2Toon_%d' % self.doId) DistributedSmoothNodeAI.DistributedSmoothNodeAI.delete(self) DistributedPlayerAI.DistributedPlayerAI.delete(self) @@ -2187,12 +2183,6 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.b_setCatalogNotify(self.catalogNotify, ToontownGlobals.NewItems) return Task.done - def __handleAddGift(self, blob, ctx): - store = CatalogItem.Customization | CatalogItem.DeliveryDate | CatalogItem.GiftTag - self.onGiftOrder.append(CatalogItem.getItem(blob, store=store)) - self.b_setBothSchedules(self.onOrder, self.onGiftOrder) - self.air.sendNetEvent('CATALOG_addGift_UD2Toon_resp', [self.doId, ctx]) - def __deliverPurchase(self, task): now = int(time.time() / 60 + 0.5) delivered, remaining = self.onOrder.extractDeliveryItems(now) diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 5bb247e3..8e0a38fd 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5466,8 +5466,8 @@ CatalogGiftFor = 'Buy Gift for:' CatalogGiftTo = 'To: %s' CatalogGiftToggleOn = 'Stop Gifting' CatalogGiftToggleOff = 'Buy Gifts' -CatalogGiftToggleWait = 'Trying!...' -CatalogGiftToggleNoAck = 'Unavailable' +CatalogGiftUpdating = 'Updating...' +CatalogGiftChoose = 'Choose a friend!' CatalogPurchaseItemAvailable = 'Congratulations on your new purchase! You can start using it right away.' CatalogPurchaseGiftItemAvailable = 'Excellent! %s can start using your gift right away.' CatalogPurchaseItemOnOrder = 'Congratulations! Your purchase will be delivered to your mailbox soon.' @@ -8601,7 +8601,7 @@ CEOSpeech = [ 'And thus we, the Cog Nation, are striving.', 'I am very delighted by this news, I just wanted to thank you all for working so hard for this news.', "Wait, what's going on? I can't see but I hear explosions." - ] +] # Len of words + 10 Blacklist = [ "$1ut", "$h1t", @@ -9864,4 +9864,4 @@ Blacklist = [ "willy", "xrated", "xxx" - ] # Len of words + 10 \ No newline at end of file +] \ No newline at end of file diff --git a/toontown/uberdog/ToontownUberRepository.py b/toontown/uberdog/ToontownUberRepository.py index d4821459..7ead157f 100755 --- a/toontown/uberdog/ToontownUberRepository.py +++ b/toontown/uberdog/ToontownUberRepository.py @@ -3,7 +3,6 @@ import urlparse from otp.distributed.OtpDoGlobals import * from otp.distributed.DistributedDirectoryAI import DistributedDirectoryAI from toontown.distributed.ToontownInternalRepository import ToontownInternalRepository -from toontown.catalog.CatalogManagerUD import CatalogManagerUD import toontown.minigame.MinigameCreatorAI if config.GetBool('want-rpc-server', False): @@ -26,8 +25,6 @@ class ToontownUberRepository(ToontownInternalRepository): self.mongo = pymongo.MongoClient(url) db = (urlparse.urlparse(url).path or '/test')[1:] self.mongodb = self.mongo[db] - - self.catalogManager = CatalogManagerUD(self) self.notify.setInfo(True) From c21c7d53fd9e6b0e50ea17626b1b33788e66199b Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 14:55:14 +0300 Subject: [PATCH 020/161] Sorry loudrob --- toontown/catalog/GiftAvatar.py | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 toontown/catalog/GiftAvatar.py diff --git a/toontown/catalog/GiftAvatar.py b/toontown/catalog/GiftAvatar.py new file mode 100644 index 00000000..a9771ca5 --- /dev/null +++ b/toontown/catalog/GiftAvatar.py @@ -0,0 +1,86 @@ +from toontown.toon import ToonDNA +import CatalogItem, CatalogItemList +import base64, json + +def createFromJson(jsonData): + return createFromFields(json.loads(jsonData)) + +def createFromFields(fields): + avatar = GiftAvatar() + + for key, value in fields.iteritems(): + getattr(avatar, key)(value) + + return avatar + +class GiftAvatar: + + def getStyle(self): + return self.style + + def getHat(self): + return self.hat + + def getGlasses(self): + return self.glasses + + def getBackpack(self): + return self.backpack + + def getShoes(self): + return self.shoes + + def getGiftScheduleBlob(self): + return self.onGiftOrder.getBlob(store=CatalogItem.Customization | CatalogItem.DeliveryDate) + + def setDNAString(self, dnaString): + self.style = ToonDNA.ToonDNA() + self.style.makeFromNetString(base64.b64decode(dnaString)) + + def setMailboxContents(self, contents): + self.mailboxContents = CatalogItemList.CatalogItemList(base64.b64decode(contents), store=CatalogItem.Customization) + + def setGiftSchedule(self, onOrder): + self.onGiftOrder = CatalogItemList.CatalogItemList(base64.b64decode(onOrder), store=CatalogItem.Customization | CatalogItem.DeliveryDate) + + def setDeliverySchedule(self, onOrder): + self.onOrder = CatalogItemList.CatalogItemList(base64.b64decode(onOrder), store=CatalogItem.Customization | CatalogItem.DeliveryDate) + + def setHat(self, hat): + self.hat = hat + + def setGlasses(self, glasses): + self.glasses = glasses + + def setBackpack(self, backpack): + self.backpack = backpack + + def setShoes(self, shoes): + self.shoes = shoes + + def setHatList(self, list): + self.hatList = list[0] + + def setGlassesList(self, list): + self.glassesList = list[0] + + def setBackpackList(self, list): + self.backpackList = list[0] + + def setShoesList(self, list): + self.shoesList = list[0] + + def setCustomMessages(self, customMessages): + self.customMessages = customMessages[0] + + def setClothesTopsList(self, clothesList): + self.clothesTopsList = clothesList[0] + + def setClothesBottomsList(self, clothesList): + self.clothesBottomsList = clothesList[0] + + def setEmoteAccess(self, emoteAccess): + self.emoteAccess = emoteAccess[0] + + def setPetTrickPhrases(self, tricks): + self.petTrickPhrases = tricks[0] \ No newline at end of file From 5a4dc305d1cfd3cbe7a224df214fd2e12e6b6f55 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 15:04:59 +0300 Subject: [PATCH 021/161] Fix Loudrob's stuff --- toontown/catalog/CatalogItemPanel.py | 6 +----- toontown/catalog/CatalogScreen.py | 3 ++- toontown/toonbase/TTLocalizerEnglish.py | 1 + 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index caee7b43..6c7d2a7a 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -402,13 +402,9 @@ class CatalogItemPanel(DirectFrame): 'item': self['item'].getName(), 'price': self['item'].getPrice(self['type'])} else: - friendText = 'Error' - numFriends = len(base.localAvatar.friendsList) + len(base.cr.avList) - 1 - if numFriends > 0: - friendText = self.parentCatalogScreen.friendName message = TTLocalizer.CatalogVerifyGift % {'item': self['item'].getName(), 'price': self['item'].getPrice(self['type']), - 'friend': friendText} + 'friend': TTLocalizer.CatalogGiftError if not self.parentCatalogScreen.friendName else self.parentCatalogScreen.friendName} self.verify = TTDialog.TTGlobalDialog(doneEvent='verifyGiftDone', message=message, style=TTDialog.TwoChoice) self.verify.show() self.accept('verifyGiftDone', self.__handleVerifyGift) diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index 5ea5e21c..ceb0e33b 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -47,7 +47,7 @@ class CatalogScreen(DirectFrame): DirectFrame.__init__(self, parent) self.friend = None self.friendAvId = None - self.friendName = 'Error Nameless Toon' + self.friendName = None self.friendList = [] self.friends = [] self.load(guiItems, guiButton, guiBack) @@ -1045,6 +1045,7 @@ class CatalogScreen(DirectFrame): self.scrollList.show() self.hideEmblems() self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOn + self.friendLabel['text'] = TTLocalizer.CatalogGiftChoose self.__loadFriend() else: self.friend = None diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 8e0a38fd..88583b0c 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5462,6 +5462,7 @@ CatalogGoodbyeList = ['Bye now!', 'Bye!'] CatalogHelpText1 = 'Turn the page to see items for sale.' CatalogSeriesLabel = 'Series %s' +CatalogGiftError = 'Error' CatalogGiftFor = 'Buy Gift for:' CatalogGiftTo = 'To: %s' CatalogGiftToggleOn = 'Stop Gifting' From 0d3f31971eca4d4755a32518af9b43c05230d8c7 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 15:29:08 +0300 Subject: [PATCH 022/161] X on order + mailbox sync + grammar --- toontown/catalog/CatalogItemPanel.py | 66 +++++++++---------- .../coderedemption/TTCodeRedemptionMgrAI.py | 11 +--- toontown/estate/DistributedPhoneAI.py | 9 +-- toontown/toonbase/TTLocalizerEnglish.py | 2 +- 4 files changed, 34 insertions(+), 54 deletions(-) diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index 6c7d2a7a..65f0c400 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -404,7 +404,7 @@ class CatalogItemPanel(DirectFrame): else: message = TTLocalizer.CatalogVerifyGift % {'item': self['item'].getName(), 'price': self['item'].getPrice(self['type']), - 'friend': TTLocalizer.CatalogGiftError if not self.parentCatalogScreen.friendName else self.parentCatalogScreen.friendName} + 'friend': self.parentCatalogScreen.friendName if self.parentCatalogScreen.friendName else TTLocalizer.CatalogGiftError} self.verify = TTDialog.TTGlobalDialog(doneEvent='verifyGiftDone', message=message, style=TTDialog.TwoChoice) self.verify.show() self.accept('verifyGiftDone', self.__handleVerifyGift) @@ -436,44 +436,38 @@ class CatalogItemPanel(DirectFrame): def updateGiftButton(self, giftUpdate = 0): if not self.loaded: return + self.giftButton.show() + if giftUpdate == 0: return - self.auxText['text'] = ' ' - numFriends = len(base.localAvatar.friendsList) + len(base.cr.avList) - 1 - if numFriends > 0: - self.giftButton['state'] = DGG.DISABLED - self.giftButton.show() - auxText = ' ' - if self['item'].isGift() <= 0: - self.giftButton.show() - self.giftButton['state'] = DGG.DISABLED - auxText = TTLocalizer.CatalogNotAGift - self.auxText['text'] = auxText - return - elif self.parentCatalogScreen.friend: - avatar = self.parentCatalogScreen.friend - if self['item'].forBoysOnly() and avatar.getStyle().getGender() == 'f' or self['item'].forGirlsOnly() and avatar.getStyle().getGender() == 'm': - self.giftButton.show() - self.giftButton['state'] = DGG.DISABLED - auxText = TTLocalizer.CatalogNoFit - self.auxText['text'] = auxText - return - elif self['item'].reachedPurchaseLimit(avatar): - self.giftButton.show() - self.giftButton['state'] = DGG.DISABLED - auxText = TTLocalizer.CatalogPurchasedGiftText - self.auxText['text'] = auxText - return - elif len(avatar.mailboxContents) + len(avatar.onGiftOrder) >= ToontownGlobals.MaxMailboxContents: - self.giftButton.show() - self.giftButton['state'] = DGG.DISABLED - auxText = TTLocalizer.CatalogMailboxFull - self.auxText['text'] = auxText - return - elif self['item'].getPrice(self['type']) <= base.localAvatar.getMoney() + base.localAvatar.getBankMoney(): - self.giftButton['state'] = DGG.NORMAL - self.giftButton.show() + + self.auxText['text'] = '' + self.giftButton['state'] = DGG.DISABLED + self.giftButton.show() + + if self['item'].isGift() <= 0: + self.auxText['text'] = TTLocalizer.CatalogNotAGift + return + + if not self.parentCatalogScreen.friend: + return + + avatar = self.parentCatalogScreen.friend + + if self['item'].forBoysOnly() and avatar.getStyle().getGender() == 'f' or self['item'].forGirlsOnly() and avatar.getStyle().getGender() == 'm': + self.auxText['text'] = TTLocalizer.CatalogNoFit + elif self['item'].reachedPurchaseLimit(avatar): + self.auxText['text'] = TTLocalizer.CatalogPurchasedGiftText + elif len(avatar.mailboxContents) + len(avatar.onOrder) + len(avatar.onGiftOrder) + 1 >= ToontownGlobals.MaxMailboxContents: + self.auxText['text'] = TTLocalizer.CatalogMailboxFull + else: + orderCount = avatar.onGiftOrder.count(self['item']) + + if orderCount: + self.auxText['text'] = TTLocalizer.CatalogOnOrderText if orderCount == 1 else '%d %s' % (orderCount, TTLocalizer.CatalogOnOrderText) + if self['item'].getPrice(self['type']) <= base.localAvatar.getMoney() + base.localAvatar.getBankMoney(): + self.giftButton['state'] = DGG.NORMAL def handleSoundOnButton(self): item = self.items[self.itemIndex] diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index d4f7fe9f..9722c418 100755 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -75,15 +75,6 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): def announceGenerate(self): DistributedObjectAI.announceGenerate(self) - def getMailboxCount(self, items): - count = 0 - - for item in items: - if item.getDeliveryTime() > 0: - count += 1 - - return count - def redeemCode(self, code): avId = self.air.getAvatarIdFromSender() av = self.air.doId2do.get(avId) @@ -121,7 +112,7 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): def requestCodeRedeem(self, avId, av, items): count = self.getMailboxCount(items) - if len(av.onOrder) + count > 5 or len(av.mailboxContents) + len(av.onOrder) + count >= ToontownGlobals.MaxMailboxContents: + if len(av.mailboxContents) + len(av.onOrder) + len(av.onGiftOrder) + len(items) >= ToontownGlobals.MaxMailboxContents: self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [3]) return diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 38e80db8..dd50c845 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -12,9 +12,6 @@ import base64 import json import time -MAX_MAILBOX = 10 -MAX_ON_ORDER = 10 - class LoadGiftAvatar: def __init__(self, phone, avId, targetId, optional, callback): @@ -135,13 +132,11 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): return av def checkPurchaseLimit(self, recipient, item): - if len(recipient.onOrder) >= MAX_ON_ORDER: - return ToontownGlobals.P_ReachedPurchaseLimit - elif len(recipient.mailboxContents) >= MAX_MAILBOX: + if len(recipient.mailboxContents) + len(recipient.onOrder) + len(recipient.onGiftOrder) + 1 >= ToontownGlobals.MaxMailboxContents: return ToontownGlobals.P_MailboxFull elif item.reachedPurchaseLimit(recipient): return ToontownGlobals.P_ReachedPurchaseLimit - + return ToontownGlobals.P_ItemOnOrder def chargeAvatar(self, av, money, emblems): diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 88583b0c..7baf7d84 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5511,7 +5511,7 @@ CatalogPurchaseGeneralError = 'The item could not be purchased because of some i CatalogPurchaseGiftGeneralError = 'The item could not be gifted to %(friend)s because of some internal game error: error code %(error)s.' CatalogPurchaseGiftNotAGift = 'This item could not be sent to %s because it would be an unfair advantage.' CatalogPurchaseGiftWillNotFit = "This item could not be sent to %s because it doesn't fit them." -CatalogPurchaseGiftLimitReached = "This item could not be sent to %s because they've already have it." +CatalogPurchaseGiftLimitReached = "This item could not be sent to %s because they already have it." CatalogPurchaseGiftNotEnoughMoney = "This item could not be sent to %s because you can't afford it." CatalogAcceptGeneralError = 'The item could not be removed from your mailbox because of some internal game error: error code %s.' CatalogAcceptRoomError = "You don't have any place to put this. You'll have to get rid of something." From 81e339d9e98c83fe1442b05c3c32b9c318dba655 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 15:40:14 +0300 Subject: [PATCH 023/161] Preparation for next commit (sry have to git reset) --- dependencies/astron/dclass/stride.dc | 5 ----- toontown/catalog/CatalogFurnitureItem.py | 1 - toontown/catalog/CatalogSurfaceItem.py | 1 - toontown/catalog/CatalogWindowItem.py | 1 - toontown/catalog/MailboxScreen.py | 3 +-- toontown/toon/DistributedToon.py | 1 - 6 files changed, 1 insertion(+), 11 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index e40ff817..700c568a 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -445,11 +445,6 @@ from toontown.parties.GlobalPartyManager/AI/UD import GlobalPartyManager/AI/UD from toontown.uberdog.GlobalLobbyManager/AI/UD import GlobalLobbyManager/AI/UD from toontown.uberdog.ARGManager import ARGManager -struct GiftItem { - blob Item; - string giftTag; -}; - struct gardenSpecial { uint8 index; uint8 count; diff --git a/toontown/catalog/CatalogFurnitureItem.py b/toontown/catalog/CatalogFurnitureItem.py index 3e5716e8..c0122786 100755 --- a/toontown/catalog/CatalogFurnitureItem.py +++ b/toontown/catalog/CatalogFurnitureItem.py @@ -1014,7 +1014,6 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): def recordPurchase(self, avatar, optional): house, retcode = self.getHouseInfo(avatar) - self.giftTag = None if retcode >= 0: if self.getFlags() & FLCloset: if avatar.getMaxClothes() > self.getMaxClothes(): diff --git a/toontown/catalog/CatalogSurfaceItem.py b/toontown/catalog/CatalogSurfaceItem.py index 62691408..97f49aca 100755 --- a/toontown/catalog/CatalogSurfaceItem.py +++ b/toontown/catalog/CatalogSurfaceItem.py @@ -24,7 +24,6 @@ class CatalogSurfaceItem(CatalogAtticItem.CatalogAtticItem): return 1 def recordPurchase(self, avatar, optional): - self.giftTag = None house, retcode = self.getHouseInfo(avatar) if retcode >= 0: house.addWallpaper(self) diff --git a/toontown/catalog/CatalogWindowItem.py b/toontown/catalog/CatalogWindowItem.py index 91aee656..192f97bf 100755 --- a/toontown/catalog/CatalogWindowItem.py +++ b/toontown/catalog/CatalogWindowItem.py @@ -37,7 +37,6 @@ class CatalogWindowItem(CatalogAtticItem.CatalogAtticItem): return TTLocalizer.WindowViewNames.get(self.windowType) def recordPurchase(self, avatar, optional): - self.giftTag = None house, retcode = self.getHouseInfo(avatar) if retcode >= 0: house.addWindow(self) diff --git a/toontown/catalog/MailboxScreen.py b/toontown/catalog/MailboxScreen.py index 7b2f62ac..be613f79 100755 --- a/toontown/catalog/MailboxScreen.py +++ b/toontown/catalog/MailboxScreen.py @@ -31,7 +31,6 @@ class MailboxScreen(DirectObject.DirectObject): self.dialogBox = None self.load() self.hide() - return def show(self): self.frame.show() @@ -79,7 +78,7 @@ class MailboxScreen(DirectObject.DirectObject): self.quitButton = DirectButton(parent=self.frame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0.5, 1.0, -0.42), scale=0.9, text=TTLocalizer.MailboxExitButton, text_font=ToontownGlobals.getSignFont(), text0_fg=(0.152, 0.75, 0.258, 1), text1_fg=(0.152, 0.75, 0.258, 1), text2_fg=(0.977, 0.816, 0.133, 1), text_scale=0.045, text_pos=(0, -0.01), command=self.__handleExit) self.gettingText = DirectLabel(parent=self.frame, relief=None, text='', text_wordwrap=10, pos=(0.0, 0.0, 0.32), scale=0.09) self.gettingText.hide() - self.giftTagPanel = DirectLabel(parent=self.frame, relief=None, text='Gift TAG!!', text_wordwrap=16, pos=(0.0, 0.0, 0.01), scale=0.06) + self.giftTagPanel = DirectLabel(parent=self.frame, relief=None, text=TTLocalizer.MailboxGiftTag % TTLocalizer.MailboxGiftTagAnonymous, text_wordwrap=16, pos=(0.0, 0.0, 0.01), scale=0.06) self.giftTagPanel.hide() self.itemText = DirectLabel(parent=self.frame, relief=None, text='', text_wordwrap=16, pos=(0.0, 0.0, -0.022), scale=0.07) self.itemText.hide() diff --git a/toontown/toon/DistributedToon.py b/toontown/toon/DistributedToon.py index 159bfcdc..57653721 100755 --- a/toontown/toon/DistributedToon.py +++ b/toontown/toon/DistributedToon.py @@ -119,7 +119,6 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute self.onOrder = CatalogItemList.CatalogItemList(store=CatalogItem.Customization | CatalogItem.DeliveryDate) self.onGiftOrder = CatalogItemList.CatalogItemList(store=CatalogItem.Customization | CatalogItem.DeliveryDate) self.mailboxContents = CatalogItemList.CatalogItemList(store=CatalogItem.Customization) - self.deliveryboxContentsContents = CatalogItemList.CatalogItemList(store=CatalogItem.Customization | CatalogItem.GiftTag) self.awardMailboxContents = CatalogItemList.CatalogItemList(store=CatalogItem.Customization) self.onAwardOrder = CatalogItemList.CatalogItemList(store=CatalogItem.Customization | CatalogItem.DeliveryDate) self.splash = None From f3ca3df3c0cd9fdd8c3721687b1b1df12824d411 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 15:42:04 +0300 Subject: [PATCH 024/161] Fix family member display name in the mailbox --- toontown/catalog/MailboxScreen.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/toontown/catalog/MailboxScreen.py b/toontown/catalog/MailboxScreen.py index be613f79..6ffe231e 100755 --- a/toontown/catalog/MailboxScreen.py +++ b/toontown/catalog/MailboxScreen.py @@ -512,4 +512,11 @@ class MailboxScreen(DirectObject.DirectObject): def getSenderName(self, avId): sender = base.cr.identifyFriend(avId) - return sender.getName() if sender else TTLocalizer.MailboxGiftTagAnonymous + if sender: + return sender.getName() + + for av in base.cr.avList: + if av.id == avId: + return av.name + + return TTLocalizer.MailboxGiftTagAnonymous From 96d78ae33dee9f27e311c30c1f88fe40ea2613b0 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 15:54:12 +0300 Subject: [PATCH 025/161] Lock friends list for 1.5 seconds after loading a friend + show text when player is sending gifts too fast. --- toontown/catalog/CatalogItem.py | 2 ++ toontown/catalog/CatalogScreen.py | 10 +++++++--- toontown/estate/DistributedPhoneAI.py | 2 +- toontown/toonbase/TTLocalizerEnglish.py | 1 + toontown/toonbase/ToontownGlobals.py | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index 8d9149c2..9004a9f4 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -196,6 +196,8 @@ class CatalogItem: return TTLocalizer.CatalogPurchaseGiftLimitReached elif retcode == ToontownGlobals.P_NotEnoughMoney: return TTLocalizer.CatalogPurchaseGiftNotEnoughMoney + elif retcode == ToontownGlobals.P_TooFast: + return TTLocalizer.CatalogPurchaseGiftTooFast else: return TTLocalizer.CatalogPurchaseGiftGeneralError % {'friend': '%s', 'error': retcode} diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index ceb0e33b..0278f052 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -814,6 +814,7 @@ class CatalogScreen(DirectFrame): taskMgr.remove('clarabelleGreeting') taskMgr.remove('clarabelleHelpText1') taskMgr.remove('clarabelleAskAnythingElse') + taskMgr.remove('friendButtonsReady') self.hide() self.hangup.hide() self.destroy() @@ -1026,15 +1027,18 @@ class CatalogScreen(DirectFrame): self.friend = None self.friendLabel['text'] = TTLocalizer.CatalogGiftUpdating + taskMgr.remove('friendButtonsReady') self['phone'].requestGiftAvatar(self.friendAvId) def setFriendReady(self, friend): - for friendButton in self.friends: - friendButton['state'] = DGG.NORMAL - self.friend = friend self.friendLabel['text'] = TTLocalizer.CatalogGiftTo % self.friendName + taskMgr.doMethodLater(1.5, self.setFriendButtonsReady, 'friendButtonsReady') self.update() + + def setFriendButtonsReady(self, task=None): + for friendButton in self.friends: + friendButton['state'] = DGG.NORMAL def __giftToggle(self): messenger.send('wakeup') diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index dd50c845..b836a9e0 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -248,7 +248,7 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): def requestGiftAvatarOperation(self, avId, doId, optional, callback): if avId in self.fsms: - return + return ToontownGlobals.P_TooFast loadOperation = LoadGiftAvatar(self, avId, doId, optional, callback) loadOperation.start() diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 7baf7d84..7ae0f1ba 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5513,6 +5513,7 @@ CatalogPurchaseGiftNotAGift = 'This item could not be sent to %s because it woul CatalogPurchaseGiftWillNotFit = "This item could not be sent to %s because it doesn't fit them." CatalogPurchaseGiftLimitReached = "This item could not be sent to %s because they already have it." CatalogPurchaseGiftNotEnoughMoney = "This item could not be sent to %s because you can't afford it." +CatalogPurchaseGiftTooFast = "This item could not be sent to %s because you are sending gifts too fast." CatalogAcceptGeneralError = 'The item could not be removed from your mailbox because of some internal game error: error code %s.' CatalogAcceptRoomError = "You don't have any place to put this. You'll have to get rid of something." CatalogAcceptLimitError = "You already have as many of these as you can handle. You'll have to get rid of something." diff --git a/toontown/toonbase/ToontownGlobals.py b/toontown/toonbase/ToontownGlobals.py index 68b42ecf..b5bf9b66 100755 --- a/toontown/toonbase/ToontownGlobals.py +++ b/toontown/toonbase/ToontownGlobals.py @@ -46,6 +46,7 @@ CatalogNumWeeksPerSeries = 13 CatalogNumWeeks = 78 PetFloorCollPriority = 5 PetPanelProximityPriority = 6 +P_TooFast = -29 P_NoTrunk = -28 P_AlreadyOwnBiggerCloset = -27 P_ItemAlreadyRented = -26 From feba8e73c0ed6c4f9ce13d529ab94df450a79e49 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 16:51:45 +0300 Subject: [PATCH 026/161] Add trunks to houses --- toontown/catalog/CatalogItem.py | 14 +++++++------- toontown/estate/DNAFurnitureReaderAI.py | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index 9004a9f4..667921bf 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -279,9 +279,9 @@ class CatalogItem: x = di.getArg(STInt16, 10) y = di.getArg(STInt16, 10) z = di.getArg(STInt16, 100) - h = di.getArg(STInt8, 256.0 / 360.0) - p = di.getArg(STInt8, 256.0 / 360.0) - r = di.getArg(STInt8, 256.0 / 360.0) + h = di.getArg(STInt16, 256.0 / 360.0) + p = di.getArg(STInt16, 256.0 / 360.0) + r = di.getArg(STInt16, 256.0 / 360.0) self.posHpr = (x, y, z, @@ -299,11 +299,11 @@ class CatalogItem: dg.putArg(self.posHpr[0], STInt16, 10) dg.putArg(self.posHpr[1], STInt16, 10) dg.putArg(self.posHpr[2], STInt16, 100) - dg.putArg(self.posHpr[3], STInt8, 256.0 / 360.0) - dg.putArg(self.posHpr[4], STInt8, 256.0 / 360.0) - dg.putArg(self.posHpr[5], STInt8, 256.0 / 360.0) + dg.putArg(self.posHpr[3], STInt16, 256.0 / 360.0) + dg.putArg(self.posHpr[4], STInt16, 256.0 / 360.0) + dg.putArg(self.posHpr[5], STInt16, 256.0 / 360.0) if store & GiftTag: - dg.addUint32(self.giftTag) + dg.addString(self.giftTag) dg.addUint8(self.specialEventId) def getTypeCode(self): diff --git a/toontown/estate/DNAFurnitureReaderAI.py b/toontown/estate/DNAFurnitureReaderAI.py index 69fc1678..020c7eee 100755 --- a/toontown/estate/DNAFurnitureReaderAI.py +++ b/toontown/estate/DNAFurnitureReaderAI.py @@ -27,7 +27,8 @@ DNA2Furniture = { 'bookcase': 1120, 'bookcase_low': 1130, 'ending_table': 1200, - 'jellybeanBank': 1300 + 'jellybeanBank': 1300, + 'trunkBoy': 4000 } From fea04b73e798a964149147ecf80d9a590b6a6892 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 17:24:21 +0300 Subject: [PATCH 027/161] Give girls girl furniture --- dependencies/astron/dclass/stride.dc | 1 + toontown/estate/DNAFurnitureReaderAI.py | 11 +++++++---- toontown/estate/DistributedHouseAI.py | 14 +++++++------- toontown/estate/DistributedHouseInteriorAI.py | 2 +- toontown/estate/EstateManagerAI.py | 6 ++++++ 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 700c568a..65e1baf8 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -1264,6 +1264,7 @@ dclass DistributedHouse : DistributedObject { setAvatarId(uint32 toonId = 0) required broadcast db; setName(string toonName = "") required broadcast db; setColor(uint8 colorIndex = 0) required broadcast db; + setGender(uint8 = 0) required broadcast db; setAtticItems(blob = "") required db; setInteriorItems(blob = "") required db; setAtticWallpaper(blob = "") required db; diff --git a/toontown/estate/DNAFurnitureReaderAI.py b/toontown/estate/DNAFurnitureReaderAI.py index 020c7eee..53248c27 100755 --- a/toontown/estate/DNAFurnitureReaderAI.py +++ b/toontown/estate/DNAFurnitureReaderAI.py @@ -9,9 +9,9 @@ DNA2Furniture = { 'chairA': 100, 'chair': 110, - 'regular_bed': 200, + 'regular_bed': (200, 210), 'FireplaceSq': 400, - 'closetBoy': 500, + 'closetBoy': (500, 510), 'lamp_short': 600, 'lamp_tall': 610, 'couch_1person': 700, @@ -28,7 +28,7 @@ DNA2Furniture = { 'bookcase_low': 1130, 'ending_table': 1200, 'jellybeanBank': 1300, - 'trunkBoy': 4000 + 'trunkBoy': (4000, 4010) } @@ -39,8 +39,9 @@ class DNAFurnitureReaderAI: # house to the default furniture arrangement. notify = directNotify.newCategory("DNAFurnitureReaderAI") - def __init__(self, dnaData, phonePos): + def __init__(self, dnaData, gender, phonePos): self.dnaData = dnaData + self.gender = gender self.phonePos = phonePos self.itemList = None @@ -70,6 +71,8 @@ class DNAFurnitureReaderAI: itemId = DNA2Furniture[code] if itemId is None: continue + if hasattr(itemId, '__getitem__'): + itemId = itemId[self.gender] x, y, z = child.getPos() h, p, r = child.getHpr() diff --git a/toontown/estate/DistributedHouseAI.py b/toontown/estate/DistributedHouseAI.py index 20cda9c6..1b763e9e 100755 --- a/toontown/estate/DistributedHouseAI.py +++ b/toontown/estate/DistributedHouseAI.py @@ -21,7 +21,7 @@ class DistributedHouseAI(DistributedObjectAI): self.name = '' self.color = 0 self.housePos = 0 - self.gender = 1 + self.gender = 0 self.isInteriorInitialized = 1 self.atticItems = CatalogItemList(store=Customization) @@ -55,12 +55,6 @@ class DistributedHouseAI(DistributedObjectAI): if self.avatarId: self.mailbox = DistributedMailboxAI(self.air, self) self.mailbox.generateWithRequired(self.zoneId) - - if not self.isInteriorInitialized: - self.notify.info('Initializing interior...') - self.interior.initialize() - self.b_setInteriorInitialized(1) - self.sendUpdate('setHouseReady', []) def delete(self): @@ -305,3 +299,9 @@ class DistributedHouseAI(DistributedObjectAI): self.atticWallpaper.append(item) self.d_setAtticWallpaper(self.atticWallpaper.getBlob()) self.interior.furnitureManager.loadFromHouse() + + def initializeInterior(self): + if (not self.isInteriorInitialized): + self.notify.info('Initializing interior...') + self.interior.initialize() + self.b_setInteriorInitialized(1) \ No newline at end of file diff --git a/toontown/estate/DistributedHouseInteriorAI.py b/toontown/estate/DistributedHouseInteriorAI.py index c48727ff..1805f1f0 100755 --- a/toontown/estate/DistributedHouseInteriorAI.py +++ b/toontown/estate/DistributedHouseInteriorAI.py @@ -70,7 +70,7 @@ class DistributedHouseInteriorAI(DistributedObjectAI): dnaData = loadDNAFileAI(dnaStorage, dnaFile) # Read it into furniture... - furnitureReader = DNAFurnitureReaderAI(dnaData, [-11, 2, 0, 0, 0, 0]) + furnitureReader = DNAFurnitureReaderAI(dnaData, self.house.gender, [-11, 2, 0, 0, 0, 0]) # Set furniture: self.furnitureManager.setItems(furnitureReader.getBlob()) diff --git a/toontown/estate/EstateManagerAI.py b/toontown/estate/EstateManagerAI.py index 954259a0..709aa872 100755 --- a/toontown/estate/EstateManagerAI.py +++ b/toontown/estate/EstateManagerAI.py @@ -3,6 +3,7 @@ from direct.distributed.DistributedObjectAI import DistributedObjectAI from direct.fsm.FSM import FSM from toontown.estate.DistributedEstateAI import DistributedEstateAI from toontown.estate.DistributedHouseAI import DistributedHouseAI +from toontown.toon import ToonDNA import HouseGlobals import functools @@ -48,12 +49,16 @@ class LoadHouseFSM(FSM): self.demand('Off') def enterCreateHouse(self): + style = ToonDNA.ToonDNA() + style.makeFromNetString(self.toon['setDNAString'][0]) + self.mgr.air.dbInterface.createObject( self.mgr.air.dbId, self.mgr.air.dclassesByName['DistributedHouseAI'], { 'setName' : [self.toon['setName'][0]], 'setAvatarId' : [self.toon['ID']], + 'setGender': [0 if style.getGender() == 'm' else 1] }, self.__handleCreate) @@ -90,6 +95,7 @@ class LoadHouseFSM(FSM): def __gotHouse(self, house): self.house = house + house.initializeInterior() self.estate.houses[self.houseIndex] = self.house From a20de7714308af877a42fd9ca4809b4644e2204b Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 17 Jul 2015 10:29:56 -0400 Subject: [PATCH 028/161] Disable this for now. --- dependencies/astron/dclass/stride.dc | 84 ++++++++++++++-------------- toontown/ai/ToontownAIRepository.py | 10 ++-- toontown/hood/CogHQAI.py | 2 +- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 700c568a..512ad4db 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -250,7 +250,7 @@ from toontown.building import DistributedKartShopInterior/AI from toontown.building import DistributedDoor/AI from toontown.estate import DistributedHouseDoor/AI from toontown.coghq import DistributedCogHQDoor/AI -from toontown.coghq import DistributedCogHQExteriorDoor/AI +//from toontown.coghq import DistributedCogHQExteriorDoor/AI from toontown.coghq import DistributedSellbotHQDoor/AI from toontown.toon import DistributedNPCToonBase/AI from toontown.toon import DistributedNPCToon/AI @@ -425,7 +425,7 @@ from toontown.safezone import DistributedChineseCheckers/AI from toontown.safezone import DistributedCheckers/AI from toontown.safezone import DistributedFindFour/AI from toontown.uberdog.DistributedPartyManager/AI/UD import DistributedPartyManager/AI/UD -from toontown.uberdog.DistributedLobbyManager/AI/UD import DistributedLobbyManager/AI/UD +//from toontown.uberdog.DistributedLobbyManager/AI/UD import DistributedLobbyManager/AI/UD from toontown.coderedemption.TTCodeRedemptionMgr/AI import TTCodeRedemptionMgr/AI from toontown.cogdominium import DistributedCogdoInterior/AI from toontown.cogdominium import DistributedCogdoBattleBldg/AI @@ -442,7 +442,7 @@ from toontown.cogdominium import DistCogdoCrane/AI from toontown.cogdominium import DistCogdoCraneMoneyBag/AI from toontown.cogdominium import DistCogdoCraneCog/AI from toontown.parties.GlobalPartyManager/AI/UD import GlobalPartyManager/AI/UD -from toontown.uberdog.GlobalLobbyManager/AI/UD import GlobalLobbyManager/AI/UD +//from toontown.uberdog.GlobalLobbyManager/AI/UD import GlobalLobbyManager/AI/UD from toontown.uberdog.ARGManager import ARGManager struct gardenSpecial { @@ -479,10 +479,10 @@ struct activity { uint8 h; }; -struct lobby { - uint64 lobbyId; - uint32 hostId; -}; +//struct lobby { +// uint64 lobbyId; +// uint32 hostId; +//}; struct party { uint64 partyId; @@ -1725,10 +1725,10 @@ dclass DistributedHouseDoor : DistributedDoor { dclass DistributedCogHQDoor : DistributedDoor { }; -dclass DistributedCogHQExteriorDoor : DistributedCogHQDoor { - selectLobby(uint32) broadcast; - confirmEntrance(uint32, bool) airecv clsend; -}; +//dclass DistributedCogHQExteriorDoor : DistributedCogHQDoor { +// selectLobby(uint32) broadcast; +// confirmEntrance(uint32, bool) airecv clsend; +//}; dclass DistributedSellbotHQDoor : DistributedCogHQDoor { informPlayer(uint8) broadcast ram; @@ -3041,34 +3041,34 @@ dclass DistributedFindFour : DistributedNode { tie() broadcast; }; -dclass DistributedLobbyManager : DistributedObject { - addLobby(uint32, uint32, string, string, int8, int8, activity [], decoration [], uint32[], uint16); - addLobbyRequest(uint32) airecv clsend; - addLobbyResponse(uint32, int8); - addLobbyResponseUdToAi(uint64, int8, lobby) airecv; +//dclass DistributedLobbyManager : DistributedObject { +// addLobby(uint32, uint32, string, string, int8, int8, activity [], decoration [], uint32[], uint16); +// addLobbyRequest(uint32) airecv clsend; +// addLobbyResponse(uint32, int8); +// addLobbyResponseUdToAi(uint64, int8, lobby) airecv; - getLobbyZone(uint32, uint32, uint8) clsend airecv; - receiveLobbyZone(uint32, uint64, uint32); - freeZoneIdFromCreatedLobby(uint32, uint32) clsend airecv; +// getLobbyZone(uint32, uint32, uint8) clsend airecv; +// receiveLobbyZone(uint32, uint64, uint32); +// freeZoneIdFromCreatedLobby(uint32, uint32) clsend airecv; - sendAvToPlayground(uint32, uint8); - exitParty(uint32) clsend airecv; +// sendAvToPlayground(uint32, uint8); +// exitParty(uint32) clsend airecv; - toonHasEnteredPartyAiToUd(uint32); - toonHasExitedPartyAiToUd(uint32); +// toonHasEnteredPartyAiToUd(uint32); +// toonHasExitedPartyAiToUd(uint32); - lobbyManagerAIStartingUp(uint32, uint32); - lobbyManagerAIGoingDown(uint32, uint32); - lobbyHasFinishedUdToAllAi(uint64 lobbyId) airecv; +// lobbyManagerAIStartingUp(uint32, uint32); +// lobbyManagerAIGoingDown(uint32, uint32); +// lobbyHasFinishedUdToAllAi(uint64 lobbyId) airecv; - requestShardIdZoneIdForHostId(uint32) clsend airecv; - sendShardIdZoneIdToAvatar(uint32, uint32); +// requestShardIdZoneIdForHostId(uint32) clsend airecv; +// sendShardIdZoneIdToAvatar(uint32, uint32); - lobbyManagerUdStartingUp() airecv; - lobbyManagerUdLost() airecv; +// lobbyManagerUdStartingUp() airecv; +// lobbyManagerUdLost() airecv; - receiveId(uint64 ids[]) airecv; -}; +// receiveId(uint64 ids[]) airecv; +//}; dclass DistributedPartyManager : DistributedObject { addParty(uint32, uint32, string, string, int8, int8, activity [], decoration [], uint32[], uint16); @@ -3121,16 +3121,16 @@ dclass DistributedPartyManager : DistributedObject { receiveId(uint64 ids[]) airecv; }; -dclass GlobalLobbyManager : DistributedObjectGlobal { - lobbyManagerAIHello(uint32 channel); - queryLobby(uint32 hostId); - addLobby(DoId avId, uint64 lobbyId); - toonJoinedLobby(uint64 lobbyId, uint32 avId); - toonLeftLobby(uint64 lobbyId, uint32 avId); - requestLobbySlot(uint64 lobbyId, uint32 avId); - lobbyDone(uint64 lobbyId); - allocIds(uint16 count); -}; +//dclass GlobalLobbyManager : DistributedObjectGlobal { +// lobbyManagerAIHello(uint32 channel); +// queryLobby(uint32 hostId); +// addLobby(DoId avId, uint64 lobbyId); +// toonJoinedLobby(uint64 lobbyId, uint32 avId); +// toonLeftLobby(uint64 lobbyId, uint32 avId); +// requestLobbySlot(uint64 lobbyId, uint32 avId); +// lobbyDone(uint64 lobbyId); +// allocIds(uint16 count); +//}; dclass GlobalPartyManager : DistributedObjectGlobal { partyManagerAIHello(uint32 channel); diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index 1435a642..62f2d0d4 100755 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -51,7 +51,7 @@ from toontown.toon import NPCToons from toontown.toonbase import ToontownGlobals from toontown.tutorial.TutorialManagerAI import TutorialManagerAI from toontown.uberdog.DistributedPartyManagerAI import DistributedPartyManagerAI -from toontown.uberdog.DistributedLobbyManagerAI import DistributedLobbyManagerAI +#from toontown.uberdog.DistributedLobbyManagerAI import DistributedLobbyManagerAI class ToontownAIRepository(ToontownInternalRepository): def __init__(self, baseChannel, stateServerChannel, districtName): @@ -136,10 +136,10 @@ class ToontownAIRepository(ToontownInternalRepository): self.partyManager.generateWithRequired(2) self.globalPartyMgr = self.generateGlobalObject( OTP_DO_ID_GLOBAL_PARTY_MANAGER, 'GlobalPartyManager') - self.lobbyManager = DistributedLobbyManagerAI(self) - self.lobbyManager.generateWithRequired(2) - self.globalLobbyMgr = self.generateGlobalObject( - OTP_DO_ID_GLOBAL_LOBBY_MANAGER, 'GlobalLobbyManager') + #self.lobbyManager = DistributedLobbyManagerAI(self) + #self.lobbyManager.generateWithRequired(2) + #self.globalLobbyMgr = self.generateGlobalObject( + # OTP_DO_ID_GLOBAL_LOBBY_MANAGER, 'GlobalLobbyManager') def createSafeZones(self): NPCToons.generateZone2NpcDict() diff --git a/toontown/hood/CogHQAI.py b/toontown/hood/CogHQAI.py index 7f5070bd..dfcd7a1a 100755 --- a/toontown/hood/CogHQAI.py +++ b/toontown/hood/CogHQAI.py @@ -61,7 +61,7 @@ class CogHQAI: doorIndex=intDoorIndex, lockValue=lock) intDoor.zoneId = destinationZone - extDoor = DistributedCogHQExteriorDoorAI.DistributedCogHQExteriorDoorAI( + extDoor = DistributedCogHQDoorAI.DistributedCogHQDoorAI( self.air, 0, DoorTypes.EXT_COGHQ, destinationZone, doorIndex=extDoorIndex, lockValue=lock) From 50297ca4893fd4bed17269caef39c850423d6994 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 17:51:43 +0300 Subject: [PATCH 029/161] Trunks --- dependencies/astron/dclass/stride.dc | 1 - toontown/catalog/CatalogAccessoryItem.py | 12 ++----- toontown/catalog/CatalogFurnitureItem.py | 45 +++--------------------- toontown/catalog/CatalogGenerator.py | 6 +--- toontown/catalog/CatalogItemPanel.py | 11 ++---- toontown/catalog/MailboxScreen.py | 5 +-- toontown/estate/DistributedHouseAI.py | 7 ++-- toontown/estate/TrunkGUI.py | 13 ------- toontown/toon/DistributedToon.py | 8 +---- toontown/toon/DistributedToonAI.py | 15 +------- toontown/toon/DistributedToonUD.py | 3 -- toontown/toonbase/TTLocalizerEnglish.py | 3 -- toontown/toonbase/ToontownGlobals.py | 5 ++- 13 files changed, 19 insertions(+), 115 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index ad2dfb22..5f2e1cb7 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -594,7 +594,6 @@ dclass DistributedToon : DistributedPlayer { setMaxClothes(uint32 = 10) required ownrecv db; setClothesTopsList(uint8[] = []) required ownrecv db; setClothesBottomsList(uint8[] = []) required ownrecv db; - setMaxAccessories(uint32 = 0) required ownrecv db; setHatList(uint8[] = []) required ownrecv db; setGlassesList(uint8[] = []) required ownrecv db; setBackpackList(uint8[] = []) required ownrecv db; diff --git a/toontown/catalog/CatalogAccessoryItem.py b/toontown/catalog/CatalogAccessoryItem.py index ec13dcc6..1c0e9496 100755 --- a/toontown/catalog/CatalogAccessoryItem.py +++ b/toontown/catalog/CatalogAccessoryItem.py @@ -120,10 +120,7 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): def recordPurchase(self, avatar, optional): if avatar.isTrunkFull(): - if avatar.getMaxAccessories() == 0: - return ToontownGlobals.P_NoTrunk - else: - return ToontownGlobals.P_NoRoomForItem + return ToontownGlobals.P_NoRoomForItem str = AccessoryTypes[self.accessoryType][ATString] if self.isHat(): defn = ToonDNA.HatStyles[str] @@ -269,10 +266,7 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): if avatar.isTrunkFull(accessoriesOnOrder): self.requestPurchaseCleanup() buttonCallback = PythonUtil.Functor(self.__handleFullPurchaseDialog, phone, callback) - if avatar.getMaxAccessories() == 0: - text = TTLocalizer.CatalogPurchaseNoTrunk - else: - text = TTLocalizer.CatalogPurchaseTrunkFull + text = TTLocalizer.CatalogPurchaseTrunkFull self.dialog = TTDialog.TTDialog(style=TTDialog.YesNo, text=text, text_wordwrap=15, command=buttonCallback) self.dialog.show() else: @@ -303,8 +297,6 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): return TTLocalizer.CatalogAcceptShoes elif retcode == ToontownGlobals.P_NoRoomForItem: return TTLocalizer.CatalogAcceptTrunkFull - elif retcode == ToontownGlobals.P_NoTrunk: - return TTLocalizer.CatalogAcceptNoTrunk return CatalogItem.CatalogItem.getAcceptItemErrorText(self, retcode) def isHat(self): diff --git a/toontown/catalog/CatalogFurnitureItem.py b/toontown/catalog/CatalogFurnitureItem.py index c0122786..c76d35fd 100755 --- a/toontown/catalog/CatalogFurnitureItem.py +++ b/toontown/catalog/CatalogFurnitureItem.py @@ -70,7 +70,6 @@ for closetId, maxClothes in ClosetToClothes.items(): ClothesToCloset[maxClothes] += (closetId,) MaxClosetIds = (508, 518) -MaxTrunkIds = (4000, 4010) TvToPosScale = { 1530: ((-1.15, -0.5, 1.1), (2.5, 1.7, 1.4)), @@ -910,7 +909,7 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): return 1 def replacesExisting(self): - return self.getFlags() & (FLCloset | FLBank | FLTrunk) != 0 + return self.getFlags() & (FLCloset | FLBank) != 0 def hasExisting(self): return 1 @@ -920,16 +919,14 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): return TTLocalizer.FurnitureYourOldCloset elif self.getFlags() & FLBank: return TTLocalizer.FurnitureYourOldBank - elif self.getFlags() & FLTrunk: - return TTLocalizer.FurnitureYourOldTrunk else: return None return None def notOfferedTo(self, avatar): - if self.getFlags() & FLCloset or self.getFlags() & FLTrunk: + if self.getFlags() & FLCloset: decade = self.furnitureType - self.furnitureType % 10 - forBoys = (decade == 500 or decade == 4000) + forBoys = decade == 500 if avatar.getStyle().getGender() == 'm': return not forBoys else: @@ -955,9 +952,6 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): def isDeletable(self): return self.getFlags() & (FLBank | FLCloset | FLPhone | FLTrunk) == 0 - def getMaxAccessories(self): - return ToontownGlobals.MaxAccessories - def getMaxBankMoney(self): return BankToMoney.get(self.furnitureType) @@ -975,11 +969,6 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): return 1 if self in avatar.onOrder or self in avatar.mailboxContents: return 1 - if self.getFlags() & FLTrunk: - if self.getMaxAccessories() <= avatar.getMaxAccessories(): - return 1 - if self in avatar.onOrder or self in avatar.mailboxContents: - return 1 return 0 def getTypeName(self): @@ -1007,7 +996,7 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): def isGift(self): if self.getEmblemPrices(): return 0 - if self.getFlags() & (FLCloset | FLBank | FLTrunk): + if self.getFlags() & (FLCloset | FLBank): return 0 else: return 1 @@ -1019,11 +1008,8 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): if avatar.getMaxClothes() > self.getMaxClothes(): return ToontownGlobals.P_AlreadyOwnBiggerCloset avatar.b_setMaxClothes(self.getMaxClothes()) - if self.getFlags() & FLTrunk: - avatar.b_setMaxAccessories(self.getMaxAccessories()) if self.getFlags() & FLBank: avatar.b_setMaxBankMoney(self.getMaxBankMoney()) - return retcode house.addAtticItem(self) return retcode @@ -1209,29 +1195,6 @@ def getAllBanks(): return list -def get50ItemTrunk(avatar, duplicateItems): - if config.GetBool('want-accessories', 1): - if avatar.getStyle().getGender() == 'm': - index = 0 - else: - index = 1 - trunkId = MaxTrunkIds[index] - item = CatalogFurnitureItem(trunkId) - if item in avatar.onOrder or item in avatar.mailboxContents: - return None - return item - # If we get here, we probably don't want accessories yet. - return None - - -def getMaxTrunks(): - list = [] - for trunkId in MaxTrunkIds: - list.append(CatalogFurnitureItem(trunkId)) - - return list - - def getAllFurnitures(index): list = [] colors = FurnitureTypes[index][FTColorOptions] diff --git a/toontown/catalog/CatalogGenerator.py b/toontown/catalog/CatalogGenerator.py index 8160f265..4afffce7 100755 --- a/toontown/catalog/CatalogGenerator.py +++ b/toontown/catalog/CatalogGenerator.py @@ -1,7 +1,7 @@ from direct.directnotify import DirectNotifyGlobal import CatalogItem import CatalogItemList -from CatalogFurnitureItem import CatalogFurnitureItem, nextAvailableCloset, nextAvailableBank, getAllClosets, get50ItemCloset, getMaxClosets, get50ItemTrunk, getAllBanks +from CatalogFurnitureItem import CatalogFurnitureItem, nextAvailableCloset, nextAvailableBank, getAllClosets, get50ItemCloset, getMaxClosets, getAllBanks from CatalogAnimatedFurnitureItem import CatalogAnimatedFurnitureItem from CatalogClothingItem import CatalogClothingItem, getAllClothes from CatalogChatItem import CatalogChatItem, getChatRange @@ -1518,8 +1518,6 @@ class CatalogGenerator: if nextAvailableTank not in schedule: weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem=0) - - weeklyCatalog += self.__selectItem(avatar, get50ItemTrunk, monthlyCatalog, saleItem=0) if True: def hasPetTrick(catalog): @@ -1720,8 +1718,6 @@ class CatalogGenerator: item = getAllTanks() elif item == get50ItemCloset: item = getMaxClosets() - elif item == get50ItemTrunk: - item = getMaxTrunks() else: self.notify.warning("Don't know how to interpret function " % repr(name)) item = None diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index 65f0c400..57e74af3 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -10,7 +10,6 @@ from CatalogFlooringItem import getAllFloorings from CatalogMouldingItem import getAllMouldings from CatalogWainscotingItem import getAllWainscotings from CatalogFurnitureItem import getAllFurnitures -from CatalogFurnitureItem import FLTrunk from otp.otpbase import OTPGlobals CATALOG_PANEL_WORDWRAP = 10 CATALOG_PANEL_CHAT_WORDWRAP = 9 @@ -325,13 +324,9 @@ class CatalogItemPanel(DirectFrame): def __handlePurchaseRequest(self): if self['item'].replacesExisting() and self['item'].hasExisting(): - if self['item'].getFlags() & FLTrunk: - message = TTLocalizer.CatalogVerifyPurchase % {'item': self['item'].getName(), - 'price': self['item'].getPrice(self['type'])} - else: - message = TTLocalizer.CatalogOnlyOnePurchase % {'old': self['item'].getYourOldDesc(), - 'item': self['item'].getName(), - 'price': self['item'].getPrice(self['type'])} + message = TTLocalizer.CatalogOnlyOnePurchase % {'old': self['item'].getYourOldDesc(), + 'item': self['item'].getName(), + 'price': self['item'].getPrice(self['type'])} elif self['item'].isRental(): message = TTLocalizer.CatalogVerifyRent % {'item': self['item'].getName(), 'price': self['item'].getPrice(self['type'])} diff --git a/toontown/catalog/MailboxScreen.py b/toontown/catalog/MailboxScreen.py index 6ffe231e..d9ae600d 100755 --- a/toontown/catalog/MailboxScreen.py +++ b/toontown/catalog/MailboxScreen.py @@ -248,10 +248,7 @@ class MailboxScreen(DirectObject.DirectObject): self.acceptingIndex = None if retcode < 0: self.notify.info('Could not take item %s: retcode %s' % (item, retcode)) - if retcode == ToontownGlobals.P_NoTrunk: - self.dialogBox = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.CatalogAcceptNoTrunk, text_wordwrap=15, command=self.__acceptError) - else: - self.dialogBox = TTDialog.TTDialog(style=TTDialog.TwoChoiceCustom, text=item.getAcceptItemErrorText(retcode), text_wordwrap=15, command=self.__handleDiscard, buttonText=[TTLocalizer.MailboxDiscard, TTLocalizer.MailboxLeave]) + self.dialogBox = TTDialog.TTDialog(style=TTDialog.TwoChoiceCustom, text=item.getAcceptItemErrorText(retcode), text_wordwrap=15, command=self.__handleDiscard, buttonText=[TTLocalizer.MailboxDiscard, TTLocalizer.MailboxLeave]) self.dialogBox.show() elif hasattr(item, 'storedInAttic') and item.storedInAttic(): self.numAtticAccepted += 1 diff --git a/toontown/estate/DistributedHouseAI.py b/toontown/estate/DistributedHouseAI.py index 1b763e9e..407b5ac5 100755 --- a/toontown/estate/DistributedHouseAI.py +++ b/toontown/estate/DistributedHouseAI.py @@ -269,16 +269,17 @@ class DistributedHouseAI(DistributedObjectAI): self.atticItems.append(item) elif item.replacesExisting() and item.hasExisting(): if item.getFlags() & FLCloset: - closets = ClosetToClothes.keys() + items = ClosetToClothes.keys() if item.getFlags() & FLCloset else BankToMoney.keys() + for itItem in self.interiorItems: - if itItem.furnitureType in closets: + if itItem.furnitureType in items: posHpr = itItem.posHpr self.interiorItems.remove(itItem) item.posHpr = posHpr self.interiorItems.append(item) break for itItem in self.atticItems: - if itItem.furnitureType in closets: + if itItem.furnitureType in items: self.atticItems.remove(itItem) self.atticItems.append(item) break diff --git a/toontown/estate/TrunkGUI.py b/toontown/estate/TrunkGUI.py index c6b6b50f..3c86dc15 100755 --- a/toontown/estate/TrunkGUI.py +++ b/toontown/estate/TrunkGUI.py @@ -253,19 +253,6 @@ class TrunkGUI(StateData.StateData): self.backpackChoice = 0 self.shoesChoice = 0 - if (self.toon.hat[0] != 0 or self.toon.hat[1] != 0 or self.toon.hat[2] != 0): - self.hatChoice = 1 - self.hats.append((self.toon.hat[0], self.toon.hat[1], self.toon.hat[2])) - if (self.toon.glasses[0] != 0 or self.toon.glasses[1] != 0 or self.toon.glasses[2] != 0): - self.glassesChoice = 1 - self.glasses.append((self.toon.glasses[0], self.toon.glasses[1], self.toon.glasses[2])) - if (self.toon.backpack[0] != 0 or self.toon.backpack[1] != 0 or self.toon.backpack[2] != 0): - self.backpackChoice = 1 - self.backpacks.append((self.toon.backpack[0], self.toon.backpack[1], self.toon.backpack[2])) - if (self.toon.shoes[0] != 0 or self.toon.shoes[1] != 0 or self.toon.shoes[2] != 0): - self.shoesChoice = 1 - self.shoes.append((self.toon.shoes[0], self.toon.shoes[1], self.toon.shoes[2])) - i = 0 while i < len(self.hatList): self.hats.append((self.hatList[i], self.hatList[i + 1], self.hatList[i + 2])) diff --git a/toontown/toon/DistributedToon.py b/toontown/toon/DistributedToon.py index 57653721..4ba1c770 100755 --- a/toontown/toon/DistributedToon.py +++ b/toontown/toon/DistributedToon.py @@ -498,12 +498,6 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute self.NPCFriendsDict = NPCFriendsDict - def setMaxAccessories(self, max): - self.maxAccessories = max - - def getMaxAccessories(self): - return self.maxAccessories - def setHatList(self, clothesList): self.hatList = clothesList @@ -530,7 +524,7 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute def isTrunkFull(self, extraAccessories = 0): numAccessories = (len(self.hatList) + len(self.glassesList) + len(self.backpackList) + len(self.shoesList)) / 3 - return numAccessories + extraAccessories >= self.maxAccessories + return numAccessories + extraAccessories >= ToontownGlobals.MaxAccessories def setMaxClothes(self, max): self.maxClothes = max diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 58cfae0b..71a5d9f5 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -594,22 +594,9 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo for npcId in desiredNpcFriends: self.attemptAddNPCFriend(npcId) - def d_setMaxAccessories(self, max): - self.sendUpdate('setMaxAccessories', [self.maxAccessories]) - - def setMaxAccessories(self, max): - self.maxAccessories = max - - def b_setMaxAccessories(self, max): - self.setMaxAccessories(max) - self.d_setMaxAccessories(max) - - def getMaxAccessories(self): - return self.maxAccessories - def isTrunkFull(self, extraAccessories = 0): numAccessories = (len(self.hatList) + len(self.glassesList) + len(self.backpackList) + len(self.shoesList)) / 3 - return numAccessories + extraAccessories >= self.maxAccessories + return numAccessories + extraAccessories >= ToontownGlobals.MaxAccessories def d_setHatList(self, clothesList): self.sendUpdate('setHatList', [clothesList]) diff --git a/toontown/toon/DistributedToonUD.py b/toontown/toon/DistributedToonUD.py index aba9771b..4c39dc39 100755 --- a/toontown/toon/DistributedToonUD.py +++ b/toontown/toon/DistributedToonUD.py @@ -82,9 +82,6 @@ class DistributedToonUD(DistributedObjectUD): def setClothesBottomsList(self, todo0): pass - def setMaxAccessories(self, todo0): - pass - def setHatList(self, todo0): pass diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 7ae0f1ba..abe222ec 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5035,7 +5035,6 @@ MessageConfirmRent = 'Begin rental? Cancel to save the rental for later' MessageConfirmGarden = 'Are you sure you want to start a garden?' FurnitureYourOldCloset = 'your old wardrobe' FurnitureYourOldBank = 'your old bank' -FurnitureYourOldTrunk = 'your old trunk' TrunkHatGUI = 'Hats' TrunkGlassesGUI = 'Glasses' TrunkBackpackGUI = 'Backpacks' @@ -5475,10 +5474,8 @@ CatalogPurchaseItemOnOrder = 'Congratulations! Your purchase will be delivered t CatalogPurchaseGiftItemOnOrder = 'Excellent! Your gift to %s will be delivered to their mailbox.' CatalogAnythingElse = 'Anything else I can get you today?' CatalogPurchaseClosetFull = 'Your closet is full. You may purchase this item anyway, but if you do you will need to delete something from your closet to make room for it when it arrives.\n\nDo you still want to purchase this item?' -CatalogPurchaseNoTrunk = 'In order to wear this item, you need to buy a trunk.\n\nDo you still want to purchase this item?' CatalogPurchaseTrunkFull = 'Your trunk is full. If you purchase this item, you\xe2\x80\x99ll need to delete another item from your trunk to make more room.\n\nDo you still want to purchase this item?' CatalogAcceptClosetFull = 'Your closet is full. You must go inside and delete something from your closet to make room for this item before you can take it out of your mailbox.' -CatalogAcceptNoTrunk = "You don't have a trunk. You must buy a trunk before you can take this item out of your mailbox." CatalogAcceptTrunkFull = 'Your trunk is full. You must delete something from your trunk before you can take this item out of your mailbox.' CatalogAcceptShirt = 'You are now wearing your new hat. The hat you were wearing before has been moved to your trunk.' CatalogAcceptShorts = 'You are now wearing your new shorts. What you were wearing before has been moved to your closet.' diff --git a/toontown/toonbase/ToontownGlobals.py b/toontown/toonbase/ToontownGlobals.py index b5bf9b66..81b35170 100755 --- a/toontown/toonbase/ToontownGlobals.py +++ b/toontown/toonbase/ToontownGlobals.py @@ -39,15 +39,14 @@ SpeedwayCameraFar = 8000.0 SpeedwayCameraNear = 1.0 MaxMailboxContents = 60 MaxHouseItems = 250 -MaxAccessories = 75 +MaxAccessories = 100 ExtraDeletedItems = 5 DeletedItemLifetime = 7 * 24 * 60 CatalogNumWeeksPerSeries = 13 CatalogNumWeeks = 78 PetFloorCollPriority = 5 PetPanelProximityPriority = 6 -P_TooFast = -29 -P_NoTrunk = -28 +P_TooFast = -28 P_AlreadyOwnBiggerCloset = -27 P_ItemAlreadyRented = -26 P_OnAwardOrderListFull = -25 From cc91c43036bee3ed6b7190f6baee9bf5acdbe077 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 18:08:49 +0300 Subject: [PATCH 030/161] Fix 63 or nick --- .../estate/DistributedFurnitureManagerAI.py | 185 +++++------------- 1 file changed, 47 insertions(+), 138 deletions(-) diff --git a/toontown/estate/DistributedFurnitureManagerAI.py b/toontown/estate/DistributedFurnitureManagerAI.py index 5dba1b5e..4f9a53cf 100755 --- a/toontown/estate/DistributedFurnitureManagerAI.py +++ b/toontown/estate/DistributedFurnitureManagerAI.py @@ -92,53 +92,15 @@ class DistributedFurnitureManagerAI(DistributedObjectAI): self.interior.b_setWindows(self.windows.getBlob()) def setItems(self, items): - # Decode the blob: items = CatalogItemList(items, store=CatalogItem.Customization|CatalogItem.Location) - # Throw out our old items: for item in self.items: item.destroy() + self.items = [] - items.removeDuplicates(FLCloset) - - # Due to a bug, some people are missing their closets... - hasCloset = False for item in items: - if item.getFlags() & FLCloset: - hasCloset = True - break - - if not hasCloset and self.ownerId != 0: - item = CatalogFurnitureItem(500) # the basic closet... - item.posHpr = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) - items.append(item) - # Since we have modified the items list, should we save it back to the house? - - for item in items: - if item.getFlags() & FLTrunk: - if self.house.gender is 0: - if item.furnitureType - 4000 < 10: - item.furnitureType += 10 - elif item.furnitureType - 4000 > 10: - item.furnitureType -= 10 - do = DistributedTrunkAI(self.air, self, item) - elif item.getFlags() & FLCloset: - if self.house.gender is 0: - if item.furnitureType - 500 < 10: - item.furnitureType += 10 - elif item.furnitureType - 500 > 10: - item.furnitureType -= 10 - do = DistributedClosetAI(self.air, self, item) - elif item.getFlags() & FLBank: - do = DistributedBankAI(self.air, self, item) - elif item.getFlags() & FLPhone: - do = DistributedPhoneAI(self.air, self, item) - else: - do = DistributedFurnitureItemAI(self.air, self, item) - if self.isGenerated(): - do.generateWithRequired(self.zoneId) - self.items.append(do) + self.generateItem(item) def getItems(self): items = CatalogItemList(store=CatalogItem.Customization|CatalogItem.Location) @@ -271,6 +233,25 @@ class DistributedFurnitureManagerAI(DistributedObjectAI): pass # Furniture-manipulation: + + def generateItem(self, item): + if item.getFlags() & FLTrunk: + do = DistributedTrunkAI(self.air, self, item) + elif item.getFlags() & FLCloset: + do = DistributedClosetAI(self.air, self, item) + elif item.getFlags() & FLBank: + do = DistributedBankAI(self.air, self, item) + elif item.getFlags() & FLPhone: + do = DistributedPhoneAI(self.air, self, item) + else: + do = DistributedFurnitureItemAI(self.air, self, item) + + if self.isGenerated(): + do.generateWithRequired(self.zoneId) + + self.items.append(do) + return do + def moveItemToAttic(self, doId): item = self.getItemObject(doId) @@ -289,32 +270,9 @@ class DistributedFurnitureManagerAI(DistributedObjectAI): self.d_setAtticItems(self.getAtticItems()) item.posHpr = (x, y, z, h, p, r) + object = self.generateItem(item) - if item.getFlags() & FLTrunk: - if self.house.gender is 0: - if item.furnitureType - 4000 < 10: - item.furnitureType += 10 - elif item.furnitureType - 4000 > 10: - item.furnitureType -= 10 - do = DistributedTrunkAI(self.air, self, item) - elif item.getFlags() & FLCloset: - if self.house.gender is 0: - if item.furnitureType - 500 < 10: - item.furnitureType += 10 - elif item.furnitureType - 500 > 10: - item.furnitureType -= 10 - do = DistributedClosetAI(self.air, self, item) - elif item.getFlags() & FLBank: - do = DistributedBankAI(self.air, self, item) - elif item.getFlags() & FLPhone: - do = DistributedPhoneAI(self.air, self, item) - else: - do = DistributedFurnitureItemAI(self.air, self, item) - - do.generateWithRequired(self.zoneId) - self.items.append(do) - - return (ToontownGlobals.FM_MovedItem, do.doId) + return (ToontownGlobals.FM_MovedItem, object.doId) def deleteItemFromAttic(self, blob, index): item = self.getAtticFurniture(self.atticItems, index) @@ -493,96 +451,47 @@ class DistributedFurnitureManagerAI(DistributedObjectAI): return window return None -@magicWord(category=CATEGORY_PROGRAMMER, types=[]) -def findCloset(): - """ - find the closet - """ - target = spellbook.getTarget() - if not target: - target = spellbook.getInvoker() - if not target: - return "Strange.. who are we talking about?" - - if not hasattr(target, "estate") or not hasattr(target.estate, "houses"): - return "no houses in the state" - - for house in target.estate.houses: - if house.doId == target.houseId: - fm = house.interior.furnitureManager - for item in fm.items: - if item.catalogItem.getFlags() & FLCloset: - return 'items: %s'%(str(item.catalogItem)) - for item in fm.atticItems: - if item.getFlags() & FLCloset: - return 'atticItems: %s'%(str(item)) - return "I cannot find your closet" - -@magicWord(category=CATEGORY_PROGRAMMER, types=[]) -def recoverCloset(): - """ - recover the closet - """ - target = spellbook.getTarget() - if not target: - target = spellbook.getInvoker() - if not target: - return "Strange.. who are we talking about?" - - if not hasattr(target, "estate") or not hasattr(target.estate, "houses"): - return "no houses in the state" - - for house in target.estate.houses: - if house.doId == target.houseId: - fm = house.interior.furnitureManager - for item in reversed(fm.items): - if item.catalogItem.getFlags() & FLCloset: - fm.moveItemToAttic(item.doId); - return "Moved the closet" - fm.saveToHouse() - return "I cannot find your closet" - -@magicWord(category=CATEGORY_PROGRAMMER, types=[]) +@magicWord(category=CATEGORY_PROGRAMMER) def fillAttic(): """ - move everything to the attic + Move everything to the attic. """ target = spellbook.getTarget() - if not target: - target = spellbook.getInvoker() - if not target: - return "Strange.. who are we talking about?" if not hasattr(target, "estate") or not hasattr(target.estate, "houses"): - return "no houses in the state" + return "The target is not in an estate!" for house in target.estate.houses: if house.doId == target.houseId: - fm = house.interior.furnitureManager - for item in reversed(fm.items): - fm.moveItemToAttic(item.doId); - fm.saveToHouse() - return "everything has been moved to the attic" + manager = house.interior.furnitureManager -@magicWord(category=CATEGORY_PROGRAMMER, types=[]) + for item in reversed(manager.items): + manager.moveItemToAttic(item.doId) + + manager.saveToHouse() + return "Everything has been moved to the attic!" + + return "The target is not in his estate!" + +@magicWord(category=CATEGORY_PROGRAMMER) def emptyHouse(): """ - delete everything in the house + Delete everything in the house. """ target = spellbook.getTarget() - if not target: - target = spellbook.getInvoker() - if not target: - return "Strange.. who are we talking about?" if not hasattr(target, "estate") or not hasattr(target.estate, "houses"): - return "no houses in the state" + return "The target is not in an estate!" for house in target.estate.houses: if house.doId == target.houseId: - fm = house.interior.furnitureManager - for item in reversed(fm.items): + manager = house.interior.furnitureManager + + for item in reversed(manager.items): item.destroy() - fm.items.remove(item) - fm.saveToHouse() - return "The house is empty" + + manager.items = [] + manager.saveToHouse() + return "Everything has been deleted!" + + return "The target is not in his estate!" \ No newline at end of file From d2834a6f65d8b09257abe89d3c87ced75054aab2 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 18:36:33 +0300 Subject: [PATCH 031/161] Fix phone's 63 and nick --- toontown/estate/DistributedPhone.py | 29 +++++-------------------- toontown/estate/PhoneGlobals.py | 6 ++--- toontown/toonbase/TTLocalizerEnglish.py | 2 -- 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/toontown/estate/DistributedPhone.py b/toontown/estate/DistributedPhone.py index bfabe965..2f559787 100755 --- a/toontown/estate/DistributedPhone.py +++ b/toontown/estate/DistributedPhone.py @@ -44,7 +44,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.intervalAvatar = None self.phoneInUse = 0 self.origToonHpr = None - return def announceGenerate(self): self.notify.debug('announceGenerate') @@ -136,7 +135,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): (self.model.find('**/CurveNode7'), (0, 0, 0)))) self.cord.reparentTo(self.model) self.cord.node().setBounds(BoundingSphere(Point3(-1.0, -3.2, 2.6), 2.0)) - return def disable(self): self.notify.debug('disable') @@ -154,7 +152,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.freeAvatar() self.ignoreAll() DistributedFurnitureItem.DistributedFurnitureItem.disable(self) - return def delete(self): self.notify.debug('delete') @@ -168,16 +165,18 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.usedInitialScale = 1 def __handleEnterSphere(self, collEntry): - if self.smoothStarted: + if self.phoneGui or self.smoothStarted: return + if base.localAvatar.doId == self.lastAvId and globalClock.getFrameTime() <= self.lastTime + 0.5: self.notify.debug('Ignoring duplicate entry for avatar.') return + if self.hasLocalAvatar: self.freeAvatar() + self.notify.debug('Entering Phone Sphere....') taskMgr.remove(self.uniqueName('ringDoLater')) - self.ignore(self.phoneSphereEnterEvent) self.cr.playGame.getPlace().detectedPhoneCollision() self.hasLocalAvatar = 1 self.sendUpdate('avatarEnter', []) @@ -185,9 +184,8 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): def __handlePhoneDone(self): self.sendUpdate('avatarExit', []) self.ignore(self.phoneGuiDoneEvent) - self.accept(self.phoneSphereEnterEvent, self.__handleEnterSphere) + self.setPos(self.getPos()) self.phoneGui = None - return def freeAvatar(self): if self.hasLocalAvatar: @@ -198,9 +196,7 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): base.cr.playGame.getPlace().setState('walk') self.hasLocalAvatar = 0 self.ignore(self.pickupMovieDoneEvent) - self.accept(self.phoneSphereEnterEvent, self.__handleEnterSphere) self.lastTime = globalClock.getFrameTime() - return def setLimits(self, numHouseItems): self.numHouseItems = numHouseItems @@ -223,14 +219,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): if self.phoneInUse: self.clearInterval() self.phoneInUse = 0 - - elif mode == PhoneGlobals.PHONE_MOVIE_EMPTY: - self.notify.debug('setMovie: empty') - if isLocalToon: - self.phoneDialog = TTDialog.TTDialog(dialogName='PhoneEmpty', style=TTDialog.Acknowledge, text=TTLocalizer.DistributedPhoneEmpty, text_wordwrap=15, fadeScreen=1, command=self.__clearDialog) - self.numHouseItems = None - self.phoneInUse = 0 - elif mode == PhoneGlobals.PHONE_MOVIE_PICKUP: self.notify.debug('setMovie: gui') if avatar: @@ -241,7 +229,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.acceptOnce(self.pickupMovieDoneEvent, self.__showPhoneGui) self.playInterval(interval, elapsed, avatar) self.phoneInUse = 1 - elif mode == PhoneGlobals.PHONE_MOVIE_HANGUP: self.notify.debug('setMovie: gui') if avatar: @@ -249,10 +236,8 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.playInterval(interval, elapsed, avatar) self.numHouseItems = None self.phoneInUse = 0 - else: self.notify.warning('unknown mode in setMovie: %s' % mode) - return def __showPhoneGui(self): if self.toonScale: @@ -288,7 +273,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.phoneDialog.cleanup() self.phoneDialog = None self.freeAvatar() - return def takePhoneInterval(self, toon): torso = TextEncoder.upper(toon.style.torso[0]) @@ -348,7 +332,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): if avatar: self.accept(avatar.uniqueName('disable'), self.clearInterval) self.intervalAvatar = avatar - return def clearInterval(self): if self.interval != None: @@ -360,7 +343,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): self.__receiverToPhone() self.model.pose('SS_phoneOut', 0) self.phoneInUse = 0 - return def ringIfHasPhoneQuest(self, task): if Quests.avatarHasPhoneQuest(base.localAvatar) and not Quests.avatarHasCompletedPhoneQuest(base.localAvatar): @@ -380,7 +362,6 @@ class DistributedPhone(DistributedFurnitureItem.DistributedFurnitureItem): ringIval = Parallel(Func(base.playSfx, self.ringSfx), shakeSeq, Func(phone.setR, 0)) self.playInterval(ringIval, 0.0, None) - return def requestGiftAvatar(self, doId): if not self.phoneGui: diff --git a/toontown/estate/PhoneGlobals.py b/toontown/estate/PhoneGlobals.py index 44e31f6a..d4a1e6a4 100755 --- a/toontown/estate/PhoneGlobals.py +++ b/toontown/estate/PhoneGlobals.py @@ -1,5 +1,3 @@ PHONE_MOVIE_CLEAR = 2 -PHONE_MOVIE_EMPTY = 3 -PHONE_MOVIE_PICKUP = 4 -PHONE_MOVIE_HANGUP = 5 -PHONE_MOVIE_NO_HOUSE = 6 +PHONE_MOVIE_PICKUP = 3 +PHONE_MOVIE_HANGUP = 4 \ No newline at end of file diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index abe222ec..8a7ead35 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5426,8 +5426,6 @@ DistributedMailboxEmpty = 'Your mailbox is empty right now. Come back here to l DistributedMailboxWaiting = 'Your mailbox is empty right now, but the package you ordered is on its way. Check back later!' DistributedMailboxReady = 'Your order has arrived!' DistributedMailboxNotOwner = 'Sorry, this is not your mailbox.' -DistributedPhoneEmpty = "You can use any phone to order special items for you and your house. New items will become available to order over time.\n\nYou don't have any items available to order right now, but check back later!" -DistributedPhoneNoHouse = 'You must have a house to use the catalog!' Clarabelle = 'Clarabelle' MailboxExitButton = 'Close Mailbox' MailboxAcceptButton = 'Take this item' From d5dc2c9d5042f4d07c32af5b02a42bf64a86f2fe Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 19:05:29 +0300 Subject: [PATCH 032/161] PotentialAvatar cleanup --- otp/distributed/PotentialAvatar.py | 10 +--------- toontown/toon/DistributedToonUD.py | 6 ++++++ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/otp/distributed/PotentialAvatar.py b/otp/distributed/PotentialAvatar.py index 3c979fc6..67bab13c 100755 --- a/otp/distributed/PotentialAvatar.py +++ b/otp/distributed/PotentialAvatar.py @@ -1,19 +1,11 @@ class PotentialAvatar: - def __init__(self, id, names, dna, position, allowedName, creator = 1, shared = 1, online = 0, wishState = 'CLOSED', wishName = '', defaultShard = 0, lastLogout = 0): + def __init__(self, id, names, dna, position, allowedName): self.id = id self.name = names[0] self.dna = dna - self.avatarType = None self.position = position self.wantName = names[1] self.approvedName = names[2] self.rejectedName = names[3] self.allowedName = allowedName - self.wishState = wishState - self.wishName = wishName - self.creator = creator - self.shared = shared - self.online = online - self.defaultShard = defaultShard - self.lastLogout = lastLogout diff --git a/toontown/toon/DistributedToonUD.py b/toontown/toon/DistributedToonUD.py index 4c39dc39..4bd6cb29 100755 --- a/toontown/toon/DistributedToonUD.py +++ b/toontown/toon/DistributedToonUD.py @@ -510,3 +510,9 @@ class DistributedToonUD(DistributedObjectUD): def setTrueFriends(self, trueFriends): pass + + def setWishName(self, todo0): + pass + + def setWishNameState(self, todo0): + pass From 18fb9b1924d4aa4bc1e0c664a8818886866f56ff Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 19:48:30 +0300 Subject: [PATCH 033/161] Sorry nacib --- toontown/catalog/GiftAvatar.py | 10 +++++----- toontown/estate/DistributedPhoneAI.py | 3 +-- toontown/rpc/ToontownRPCHandlerBase.py | 3 +-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/toontown/catalog/GiftAvatar.py b/toontown/catalog/GiftAvatar.py index a9771ca5..52d58780 100644 --- a/toontown/catalog/GiftAvatar.py +++ b/toontown/catalog/GiftAvatar.py @@ -1,6 +1,6 @@ from toontown.toon import ToonDNA import CatalogItem, CatalogItemList -import base64, json +import json def createFromJson(jsonData): return createFromFields(json.loads(jsonData)) @@ -35,16 +35,16 @@ class GiftAvatar: def setDNAString(self, dnaString): self.style = ToonDNA.ToonDNA() - self.style.makeFromNetString(base64.b64decode(dnaString)) + self.style.makeFromNetString(dnaString.decode('base64')) def setMailboxContents(self, contents): - self.mailboxContents = CatalogItemList.CatalogItemList(base64.b64decode(contents), store=CatalogItem.Customization) + self.mailboxContents = CatalogItemList.CatalogItemList(contents.decode('base64'), store=CatalogItem.Customization) def setGiftSchedule(self, onOrder): - self.onGiftOrder = CatalogItemList.CatalogItemList(base64.b64decode(onOrder), store=CatalogItem.Customization | CatalogItem.DeliveryDate) + self.onGiftOrder = CatalogItemList.CatalogItemList(onOrder.decode('base64'), store=CatalogItem.Customization | CatalogItem.DeliveryDate) def setDeliverySchedule(self, onOrder): - self.onOrder = CatalogItemList.CatalogItemList(base64.b64decode(onOrder), store=CatalogItem.Customization | CatalogItem.DeliveryDate) + self.onOrder = CatalogItemList.CatalogItemList(onOrder.decode('base64'), store=CatalogItem.Customization | CatalogItem.DeliveryDate) def setHat(self, hat): self.hat = hat diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index b836a9e0..6dd24e38 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -8,7 +8,6 @@ from toontown.catalog import CatalogItem, CatalogInvalidItem, GiftAvatar from toontown.catalog.CatalogItemList import CatalogItemList from toontown.uberdog import TopToonsGlobals -import base64 import json import time @@ -33,7 +32,7 @@ class LoadGiftAvatar: return for key in ('setDNAString', 'setMailboxContents', 'setGiftSchedule', 'setDeliverySchedule'): - fields[key] = base64.b64encode(fields[key][0]) + fields[key] = fields[key][0].encode('base64') newDict = self.copyDict(fields, 'setDNAString', 'setMailboxContents', 'setGiftSchedule', 'setDeliverySchedule', 'setHat', 'setGlasses', 'setBackpack', 'setShoes', 'setHatList', 'setGlassesList', 'setBackpackList', 'setShoes', 'setShoesList', 'setCustomMessages', 'setEmoteAccess', diff --git a/toontown/rpc/ToontownRPCHandlerBase.py b/toontown/rpc/ToontownRPCHandlerBase.py index dbf2ab7c..a5aaec0f 100755 --- a/toontown/rpc/ToontownRPCHandlerBase.py +++ b/toontown/rpc/ToontownRPCHandlerBase.py @@ -1,4 +1,3 @@ -import base64 from direct.directnotify.DirectNotifyGlobal import directNotify import json import time @@ -41,7 +40,7 @@ class ToontownRPCHandlerBase: """ # First, base64 decode the token: try: - token = base64.b64decode(token) + token = token.decode('base64') except TypeError: return (-32001, 'Token decode failure') From 98347f5b7fe0a9961b94148f3ea93378e58e8522 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jul 2015 20:30:29 +0300 Subject: [PATCH 034/161] Accessory gender equality (Clothing equality is harder and will be done later cause of 63) --- toontown/catalog/CatalogAccessoryItem.py | 56 ++---------------- .../catalog/CatalogAccessoryItemGlobals.py | 57 ++++++++----------- toontown/catalog/CatalogItem.py | 3 - 3 files changed, 30 insertions(+), 86 deletions(-) diff --git a/toontown/catalog/CatalogAccessoryItem.py b/toontown/catalog/CatalogAccessoryItem.py index 1c0e9496..e71d6544 100755 --- a/toontown/catalog/CatalogAccessoryItem.py +++ b/toontown/catalog/CatalogAccessoryItem.py @@ -15,45 +15,6 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): self.isSpecial = isSpecial CatalogItem.CatalogItem.makeNewItem(self) - def storedInTrunk(self): - return 1 - - def notOfferedTo(self, avatar): - article = AccessoryTypes[self.accessoryType][ATArticle] - if article in [AHat, - AGlasses, - ABackpack, - AShoes]: - return 0 - forBoys = article in [ABoysHat, - ABoysGlasses, - ABoysBackpack, - ABoysShoes] - if avatar.getStyle().getGender() == 'm': - return not forBoys - else: - return forBoys - - def forBoysOnly(self): - article = AccessoryTypes[self.accessoryType][ATArticle] - if article in [ABoysHat, - ABoysGlasses, - ABoysBackpack, - ABoysShoes]: - return 1 - else: - return 0 - - def forGirlsOnly(self): - article = AccessoryTypes[self.accessoryType][ATArticle] - if article in [AGirlsHat, - AGirlsGlasses, - AGirlsBackpack, - AGirlsShoes]: - return 1 - else: - return 0 - def getPurchaseLimit(self): return 1 @@ -234,7 +195,6 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): model.setColorScale(color, 1) if needsAlpha: model.setTransparency(1) - return def loadModel(self): modelPath = self.getFilename() @@ -259,8 +219,8 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): from toontown.toontowngui import TTDialog avatar = base.localAvatar accessoriesOnOrder = 0 - for item in avatar.onOrder + avatar.mailboxContents: - if item.storedInTrunk(): + for item in avatar.onOrder + avatar.mailboxContents + avatar.onGiftOrder: + if hasattr(item, 'isHat'): accessoriesOnOrder += 1 if avatar.isTrunkFull(accessoriesOnOrder): @@ -300,20 +260,16 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): return CatalogItem.CatalogItem.getAcceptItemErrorText(self, retcode) def isHat(self): - article = AccessoryTypes[self.accessoryType][ATArticle] - return article in [AHat, ABoysHat, AGirlsHat] + return AccessoryTypes[self.accessoryType][ATArticle] == AHat def areGlasses(self): - article = AccessoryTypes[self.accessoryType][ATArticle] - return article in [AGlasses, ABoysGlasses, AGirlsGlasses] + return AccessoryTypes[self.accessoryType][ATArticle] == AGlasses def isBackpack(self): - article = AccessoryTypes[self.accessoryType][ATArticle] - return article in [ABackpack, ABoysBackpack, AGirlsBackpack] + return AccessoryTypes[self.accessoryType][ATArticle] == ABackpack def areShoes(self): - article = AccessoryTypes[self.accessoryType][ATArticle] - return article in [AShoes, ABoysShoes, AGirlsShoes] + return AccessoryTypes[self.accessoryType][ATArticle] == AShoes def output(self, store = -1): return 'CatalogAccessoryItem(%s%s)' % (self.accessoryType, self.formatOptionalData(store)) diff --git a/toontown/catalog/CatalogAccessoryItemGlobals.py b/toontown/catalog/CatalogAccessoryItemGlobals.py index 764c3da4..f72765a5 100755 --- a/toontown/catalog/CatalogAccessoryItemGlobals.py +++ b/toontown/catalog/CatalogAccessoryItemGlobals.py @@ -7,15 +7,6 @@ AHat = 0 AGlasses = 1 ABackpack = 2 AShoes = 3 -ABoysHat = 4 -ABoysGlasses = 5 -ABoysBackpack = 6 -ABoysShoes = 7 -AGirlsHat = 8 -AGirlsGlasses = 9 -AGirlsBackpack = 10 -AGirlsShoes = 11 -APriceTest = 5 APriceBasic = 250 APriceBasicPlus = 400 APriceCool = 800 @@ -28,7 +19,7 @@ AccessoryTypes = {101: (AHat, 'hsf1', APriceCool, 5), - 103: (AGirlsHat, + 103: (AHat, 'hrb1', APriceBasic, 1), @@ -40,11 +31,11 @@ AccessoryTypes = {101: (AHat, 'hsf3', APriceCool, 0), - 106: (AGirlsHat, + 106: (AHat, 'hrb2', APriceBasicPlus, 3), - 107: (AGirlsHat, + 107: (AHat, 'hrb3', APriceBasicPlus, 0), @@ -96,7 +87,7 @@ AccessoryTypes = {101: (AHat, 'hpb1', APriceBasicPlus, 6), - 120: (ABoysHat, + 120: (AHat, 'hcr1', 10000, 5), @@ -132,23 +123,23 @@ AccessoryTypes = {101: (AHat, 'hst1', APriceBasicPlus, 1), - 129: (AGirlsHat, + 129: (AHat, 'hsu1', APriceCool, 1), - 130: (AGirlsHat, + 130: (AHat, 'hrb4', APriceBasic, 1), - 131: (AGirlsHat, + 131: (AHat, 'hrb5', APriceBasicPlus, 4), - 132: (AGirlsHat, + 132: (AHat, 'hrb6', APriceBasic, 2), - 133: (AGirlsHat, + 133: (AHat, 'hrb7', APriceBasicPlus, 6), @@ -156,7 +147,7 @@ AccessoryTypes = {101: (AHat, 'hat1', APriceCool, 2), - 135: (AGirlsHat, + 135: (AHat, 'hhd1', APriceCool, 2), @@ -188,11 +179,11 @@ AccessoryTypes = {101: (AHat, 'hft2', APriceCool, 6), - 143: (ABoysHat, + 143: (AHat, 'hhd2', APriceCool, 3), - 144: (AGirlsHat, + 144: (AHat, 'hpc1', APriceCool, 5), @@ -208,7 +199,7 @@ AccessoryTypes = {101: (AHat, 'hat2', APriceCool, 2), - 148: (AGirlsHat, + 148: (AHat, 'htr1', 10000, 3), @@ -280,7 +271,7 @@ AccessoryTypes = {101: (AHat, 'hby1', APriceAwesome, 5), - 166: (AGirlsHat, + 166: (AHat, 'hrb8', APriceBasicPlus, 6), @@ -292,7 +283,7 @@ AccessoryTypes = {101: (AHat, 'hbb7', APriceBasic, 6), - 169: (AGirlsHat, + 169: (AHat, 'hrb9', APriceBasicPlus, 6), @@ -300,7 +291,7 @@ AccessoryTypes = {101: (AHat, 'hwt2', APriceAwesome, 4), - 171: (AGirlsHat, + 171: (AHat, 'hhw1', APriceBasicPlus, 7), @@ -412,11 +403,11 @@ AccessoryTypes = {101: (AHat, 'gsr1', APriceBasicPlus, 5), - 223: (ABoysGlasses, + 223: (AGlasses, 'ghw1', - APriceTest, + APriceBasic, 0), - 224: (ABoysGlasses, + 224: (AGlasses, 'ghw2', APriceBasic, 7), @@ -564,11 +555,11 @@ AccessoryTypes = {101: (AHat, 'scs1', APriceBasicPlus, 6), - 405: (ABoysShoes, + 405: (AShoes, 'swt1', APriceBasicPlus, 1), - 406: (AGirlsShoes, + 406: (AShoes, 'smj1', APriceBasicPlus, 1), @@ -604,11 +595,11 @@ AccessoryTypes = {101: (AHat, 'sht1', APriceAwesome, 4), - 415: (AGirlsShoes, + 415: (AShoes, 'smj2', APriceBasicPlus, 3), - 416: (AGirlsShoes, + 416: (AShoes, 'smj3', APriceBasicPlus, 4), @@ -664,7 +655,7 @@ AccessoryTypes = {101: (AHat, 'slf1', APriceBasicPlus, 3), - 430: (AGirlsShoes, + 430: (AShoes, 'smj4', APriceBasicPlus, 2), diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index 667921bf..f4633050 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -78,9 +78,6 @@ class CatalogItem: def storedInCloset(self): return 0 - def storedInTrunk(self): - return 0 - def storedInAttic(self): return 0 From c76b2ca2c8974e86b4ecf3fbf430757ba53945af Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 17 Jul 2015 14:01:50 -0400 Subject: [PATCH 035/161] Easy Promotion Papers --- dependencies/astron/dclass/stride.dc | 1 + toontown/ai/ServiceStart.py | 6 ++ toontown/quest/Quests.py | 28 ++++++++- toontown/toon/DistributedToonAI.py | 78 +++++++++++++++++++++---- toontown/toonbase/TTLocalizerEnglish.py | 2 + 5 files changed, 102 insertions(+), 13 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 5f2e1cb7..1e739ad1 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -741,6 +741,7 @@ dclass DistributedToon : DistributedPlayer { setEmblems(uint32[] = [0, 0]) required ownrecv db; setTrueFriends(uint32[] = []) required clsend ownrecv db; setNextKnockHeal(uint32) ram airecv; + setEPP(uint8[] = []) required ownrecv db; }; dclass DistributedPartyGate : DistributedObject { diff --git a/toontown/ai/ServiceStart.py b/toontown/ai/ServiceStart.py index 78d05e9a..5149d09f 100755 --- a/toontown/ai/ServiceStart.py +++ b/toontown/ai/ServiceStart.py @@ -19,6 +19,10 @@ sys.path.append( ) import argparse +import gc + +# Panda3D 1.10.0 is 63. +gc.disable() parser = argparse.ArgumentParser() parser.add_argument('--base-channel', help='The base channel that the server may use.') @@ -58,6 +62,8 @@ if ':' in host: port = int(port) simbase.air.connect(host, port) +gc.enable() + try: run() except SystemExit: diff --git a/toontown/quest/Quests.py b/toontown/quest/Quests.py index bcf746f8..6973e553 100755 --- a/toontown/quest/Quests.py +++ b/toontown/quest/Quests.py @@ -1675,6 +1675,7 @@ class PhoneQuest(Quest): def getObjectiveStrings(self): return [TTLocalizer.QuestsPhoneQuestString] + DefaultDialog = {GREETING: DefaultGreeting, QUEST: DefaultQuest, @@ -4007,6 +4008,27 @@ class BuffReward(Reward): def getPosterString(self): return TTLocalizer.getBuffPosterString(self.getBuffId()) +class EPPReward(Reward): + trackNames = [TTLocalizer.Bossbot, + TTLocalizer.Lawbot, + TTLocalizer.Cashbot, + TTLocalizer.Sellbot] + + def sendRewardAI(self, av): + av.addEPP(self.reward[0]) + + def countReward(self, qrc): + pass + + def getCogTrackName(self): + return EPPReward.trackNames[self.reward[0]] + + def getString(self): + return TTLocalizer.QuestsEPPReward % self.getCogTrackName() + + def getPosterString(self): + return TTLocalizer.QuestsEPPRewardPoster % self.getCogTrackName() + def getRewardClass(id): reward = RewardDict.get(id) @@ -4401,7 +4423,11 @@ RewardDict = { 3001: (BuffReward, ToontownGlobals.BMovementSpeed, 30), 3002: (BuffReward, ToontownGlobals.BMovementSpeed, 60), 3003: (BuffReward, ToontownGlobals.BMovementSpeed, 180), - 3004: (BuffReward, ToontownGlobals.BMovementSpeed, 360) + 3004: (BuffReward, ToontownGlobals.BMovementSpeed, 360), + 10000: (EPPReward, 0), # Bossbot + 10001: (EPPReward, 1), # Lawbot + 10002: (EPPReward, 2), # Cashbot + 10003: (EPPReward, 3), # Sellbot } diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 71a5d9f5..f19a16ca 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -160,6 +160,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.trueFriends = [] self.fishBingoTutorialDone = False self.nextKnockHeal = 0 + self.epp = [] def generate(self): DistributedPlayerAI.DistributedPlayerAI.generate(self) @@ -1262,20 +1263,27 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo return self.cogMerits def b_promote(self, dept): - self.promote(dept) - self.d_promote(dept) - - def promote(self, dept): - if self.cogLevels[dept] < ToontownGlobals.MaxCogSuitLevel: - self.cogMerits[dept] = 0 + oldMerits = CogDisguiseGlobals.getTotalMerits(self, dept) self.incCogLevel(dept) - - def d_promote(self, dept): - merits = self.getCogMerits() + if self.cogLevels[dept] < ToontownGlobals.MaxCogSuitLevel: - merits[dept] = 0 - self.d_setCogMerits(merits) - + merits = self.getCogMerits() + + if not self.hasEPP(dept): + merits[dept] = 0 + + else: + # If we have EPP, check if the merit count is too much (i.e. enough to promote again) + if oldMerits >= CogDisguiseGlobals.getTotalMerits(self, dept): + # We have more merits than needed (i.e. promoting to another cog or earning laff) + # Therefore: + merits[dept] = 0 + + else: + merits[dept] = oldMerits + + self.d_setCogMerits(merits) + def readyForPromotion(self, dept): merits = self.cogMerits[dept] totalMerits = CogDisguiseGlobals.getTotalMerits(self, dept) @@ -4037,6 +4045,29 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo def getNextKnockHeal(self): return self.nextKnockHeal + def setEPP(self, epp): + self.epp = epp + + def d_setEPP(self, epp): + self.sendUpdate("setEPP", [epp]) + + def b_setEPP(self, epp): + self.setEPP(epp) + self.d_setEPP(epp) + + def addEPP(self, dept): + self.epp.append(dept) + self.d_setEPP(self.epp) + + def removeEPP(self, dept): + if dept in self.epp: + self.epp.remove(dept) + + self.d_setEPP(self.epp) + + def hasEPP(self, dept): + return dept in self.epp + @magicWord(category=CATEGORY_PROGRAMMER, types=[str, int, int]) def cheesyEffect(value, hood=0, expire=0): """ @@ -4904,3 +4935,26 @@ def canSkill(skill): """ av = spellbook.getTarget() av.b_setWateringCanSkill(skill) + +@magicWord(category=CATEGORY_PROGRAMMER, types=[int, str]) +def epp(dept, command="add"): + av = spellbook.getTarget() + if command == "add": + av.addEPP(dept) + + elif command == "remove": + av.removeEPP(dept) + + elif command == "get": + if dept == -1: + return av.epp + + return av.hasEPP(dept) + + else: + return "Unknown command!" + +@magicWord(category=CATEGORY_PROGRAMMER, types=[int]) +def promote(dept): + spellbook.getTarget().b_promote(dept) + diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 8a7ead35..b4023062 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -398,6 +398,8 @@ TIPQuestsClothingTicketRewardPoster = 'Reward: TIP Clothing Ticket' QuestsCheesyEffectRewardPoster = 'Reward: %s' QuestsCogSuitPartReward = 'You now have a %(cogTrack)s %(part)s Cog Suit Part.' QuestsCogSuitPartRewardPoster = 'Reward: %(cogTrack)s %(part)s Part' +QuestsEPPReward = 'You now have %s Easy Promotion Papers.' +QuestsEPPRewardPoster = 'Reward: %s Easy Promotion Papers' QuestsStreetLocationThisPlayground = 'in this playground' QuestsStreetLocationThisStreet = 'on this street' QuestsStreetLocationNamedPlayground = 'in the %s playground' From 72e4dc11adbe12a3f326c085a9e4aa8eff8254b7 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 17 Jul 2015 16:07:43 -0400 Subject: [PATCH 036/161] Somebody come up with quests for EPP --- toontown/quest/Quests.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/toontown/quest/Quests.py b/toontown/quest/Quests.py index 6973e553..f88d54e9 100755 --- a/toontown/quest/Quests.py +++ b/toontown/quest/Quests.py @@ -65,6 +65,7 @@ Easy = 75 Medium = 50 Hard = 25 VeryHard = 20 +Fun = 15 TT_TIER = 0 DD_TIER = 4 DG_TIER = 7 @@ -73,7 +74,8 @@ BR_TIER = 11 DL_TIER = 14 LAWBOT_HQ_TIER = 18 BOSSBOT_HQ_TIER = 32 -ELDER_TIER = 49 +PRE_ELDER_TIER = 49 +ELDER_TIER = 50 LOOPING_FINAL_TIER = ELDER_TIER VISIT_QUEST_ID = 1000 TROLLEY_QUEST_ID = 110 @@ -3025,7 +3027,7 @@ QuestDict = { 9503: (DL_TIER + 3, Start, (BuildingQuest, Anywhere, 25, Any, 3, 1), Any, ToonHQ, Any, NA, DefaultDialog), 9504: (DL_TIER + 3, Start, (BuildingQuest, Anywhere, 20, 's', 5, 1), Any, ToonHQ, Any, NA, DefaultDialog), 9505: (DL_TIER + 3, Start, (BuildingQuest, Anywhere, 20, 'l', 5, 1), Any, ToonHQ, Any, NA, DefaultDialog), - 9506: (DL_TIER + 3, Start, (RescueQuest, InFO, 10), Any, ToonHQ, Any, NA, DefaultDialog), + 9506: (DL_TIER + 3, Start, (RescueQuest, InFO, 10), Any, ToonHQ, Any, NA, DefaultDialog), 10100: (ELDER_TIER, Start, (CogQuest, Anywhere, 80, Any), Any, ToonHQ, Any, NA, DefaultDialog), 10101: (ELDER_TIER, Start, (CogQuest, Anywhere, 100, Any), Any, ToonHQ, Any, NA, DefaultDialog), 10102: (ELDER_TIER, Start, (CogQuest, Anywhere, 120, Any), Any, ToonHQ, Any, NA, DefaultDialog), @@ -4427,7 +4429,7 @@ RewardDict = { 10000: (EPPReward, 0), # Bossbot 10001: (EPPReward, 1), # Lawbot 10002: (EPPReward, 2), # Cashbot - 10003: (EPPReward, 3), # Sellbot + 10003: (EPPReward, 3) # Sellbot } @@ -4472,12 +4474,12 @@ RequiredRewardTrackDict = { MM_TIER + 1: (100, 801, 802, 203, 803, 804, 101, 805, 806, 102, 807, 808, 100, 809, 810, 101, 811, 812, 703, 813, 814, 815, 303), MM_TIER + 2: (900,), BR_TIER: (400,), - BR_TIER + 1: (100, 801, 802, 704, 803, 804, 101, 805, 806, 502, 807, 808, 102, 809, 810, 204, 811, 812, 100, 813, 814, 101, 815, 304), + BR_TIER + 1: (100, 801, 802, 704, 803, 804, 101, 805, 806, 502, 807, 808, 102, 809, 810, 204, 811, 812, 100, 813, 814, 101, 815, 304, 10003), BR_TIER + 2: (900,), DL_TIER: (4000, 100, 205, 101, 102, 705, 103, 305, 4001, 4002), DL_TIER + 1: (100, 206, 101, 4003, 4004, 4005, 102, 4006, 4007, 4008, 706, 103, 4009, 4010, 4011, 4000, 4001, 4002), DL_TIER + 2: (4006, 4007, 4008, 100, 4000, 4001, 4002, 4003, 101, 4004, 4005, 4009, 102, 103, 4010, 4011), - DL_TIER + 3: (4009, 4010, 4011, 100, 4000, 4001, 101, 4002, 4003, 102, 4004, 4005, 102, 4006, 4007, 707, 207, 4008), + DL_TIER + 3: (4009, 4010, 4011, 100, 4000, 4001, 101, 4002, 4003, 102, 4004, 4005, 102, 4006, 4007, 707, 207, 4008, 10002), LAWBOT_HQ_TIER: (4100,), LAWBOT_HQ_TIER + 1: (4101,), LAWBOT_HQ_TIER + 2: (4102,), @@ -4509,6 +4511,7 @@ RequiredRewardTrackDict = { BOSSBOT_HQ_TIER + 14: (4214,), BOSSBOT_HQ_TIER + 15: (4215,), BOSSBOT_HQ_TIER + 16: (4216,), + PRE_ELDER_TIER: (10001, 10000), ELDER_TIER: (4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011)} OptionalRewardTrackDict = { From a17151ef96e57f570ef2c8cef1ecfa678d2e08f8 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 00:25:20 +0300 Subject: [PATCH 037/161] You can now buy any nametag style, the game will store it. Changeable in the shticker book! --- dependencies/astron/dclass/stride.dc | 2 + toontown/catalog/CatalogNametagItem.py | 26 ++----------- toontown/shtiker/OptionsPage.py | 51 ++++++++++++++++++++++++- toontown/toon/DistributedToon.py | 14 +++++++ toontown/toon/DistributedToonAI.py | 23 ++++++++++- toontown/toon/DistributedToonUD.py | 3 ++ toontown/toon/LocalToon.py | 1 + toontown/toonbase/TTLocalizerEnglish.py | 1 + 8 files changed, 97 insertions(+), 24 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 1e739ad1..3899febc 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -722,6 +722,7 @@ dclass DistributedToon : DistributedPlayer { forceLogoutWithNotify() ownrecv; setPinkSlips(uint8 = 0) required ownrecv db; setNametagStyle(uint8 = 0) required broadcast ownrecv db; + setNametagStyles(uint8[] = [0]) required broadcast ownrecv db; setMail(simpleMail []) ownrecv; setNumMailItems(uint32) airecv; setSimpleMailNotify(uint8) ownrecv airecv; @@ -742,6 +743,7 @@ dclass DistributedToon : DistributedPlayer { setTrueFriends(uint32[] = []) required clsend ownrecv db; setNextKnockHeal(uint32) ram airecv; setEPP(uint8[] = []) required ownrecv db; + requestNametagStyle(uint8) airecv ownsend; }; dclass DistributedPartyGate : DistributedObject { diff --git a/toontown/catalog/CatalogNametagItem.py b/toontown/catalog/CatalogNametagItem.py index f0796b66..0b07af99 100755 --- a/toontown/catalog/CatalogNametagItem.py +++ b/toontown/catalog/CatalogNametagItem.py @@ -17,11 +17,7 @@ class CatalogNametagItem(CatalogItem.CatalogItem): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder: - return 1 - if avatar.nametagStyle == self.nametagStyle: - return 1 - return 0 + return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self.nametagStyle in avatar.nametagStyles def getAcceptItemErrorText(self, retcode): if retcode == ToontownGlobals.P_ItemAvailable: @@ -44,6 +40,8 @@ class CatalogNametagItem(CatalogItem.CatalogItem): def recordPurchase(self, avatar, optional): if avatar: + avatar.nametagStyles.append(self.nametagStyle) + avatar.b_setNametagStyles(avatar.nametagStyles) avatar.b_setNametagStyle(self.nametagStyle) return ToontownGlobals.P_ItemAvailable @@ -52,10 +50,7 @@ class CatalogNametagItem(CatalogItem.CatalogItem): def getPicture(self, avatar): frame = self.makeFrame() - if self.nametagStyle == 100: - inFont = ToontownGlobals.getToonFont() - else: - inFont = ToontownGlobals.getNametagFont(self.nametagStyle) + inFont = ToontownGlobals.getNametagFont(self.nametagStyle) nameTagDemo = DirectLabel(parent=frame, relief=None, pos=(0, 0, 0.24), scale=0.5, text=base.localAvatar.getName(), text_fg=(1.0, 1.0, 1.0, 1), text_shadow=(0, 0, 0, 1), text_font=inFont, text_wordwrap=9) self.hasPicture = True return (frame, None) @@ -71,16 +66,6 @@ class CatalogNametagItem(CatalogItem.CatalogItem): def getBasePrice(self): return 500 - cost = 500 - if self.nametagStyle == 0: - cost = 600 - elif self.nametagStyle == 1: - cost = 600 - elif self.nametagStyle == 2: - cost = 600 - elif self.nametagStyle == 100: - cost = 50 - return cost def decodeDatagram(self, di, versionNumber, store): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) @@ -92,9 +77,6 @@ class CatalogNametagItem(CatalogItem.CatalogItem): dg.addUint16(self.nametagStyle) dg.addBool(self.isSpecial) - def isGift(self): - return 0 - def getBackSticky(self): itemType = 1 numSticky = 4 diff --git a/toontown/shtiker/OptionsPage.py b/toontown/shtiker/OptionsPage.py index ebe40404..1bfce8a9 100755 --- a/toontown/shtiker/OptionsPage.py +++ b/toontown/shtiker/OptionsPage.py @@ -713,6 +713,7 @@ class ExtraOptionsTabPage(DirectFrame): def load(self): guiButton = loader.loadModel('phase_3/models/gui/quit_button') circleModel = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_nameShop') + matGui = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui') titleHeight = 0.61 textStartHeight = 0.45 textRowHeight = 0.145 @@ -724,11 +725,13 @@ class ExtraOptionsTabPage(DirectFrame): options_text_scale = 0.052 disabled_arrow_color = Vec4(0.6, 0.6, 0.6, 1.0) button_image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')) + arrow_image = (matGui.find('**/tt_t_gui_mat_shuffleArrowUp'), matGui.find('**/tt_t_gui_mat_shuffleArrowDown')) self.speed_chat_scale = 0.055 self.fov_label = DirectLabel(parent=self, relief=None, text=TTLocalizer.FieldOfViewLabel, text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight)) self.speedchatPlus_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - textRowHeight)) self.trueFriends_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 2 * textRowHeight)) self.cogInterface_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 3 * textRowHeight)) + self.nametagStyle_label = DirectLabel(parent=self, relief=None, text=TTLocalizer.NametagStyleLabel, text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 4 * textRowHeight)) self.fov_slider = DirectSlider(parent=self, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord), value=settings['fov'], pageSize=5, range=(ToontownGlobals.DefaultCameraFov, ToontownGlobals.MaxCameraFov), command=self.__doFov, thumb_geom=(circleModel.find('**/tt_t_gui_mat_namePanelCircle')), thumb_relief=None, thumb_geom_scale=2) @@ -736,10 +739,15 @@ class ExtraOptionsTabPage(DirectFrame): self.speedchatPlus_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight), command=self.__doToggleSpeedchatPlus) self.trueFriends_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 2 * textRowHeight), command=self.__doToggleTrueFriends) self.cogInterface_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 3 * textRowHeight), command=self.__doToggleCogInterface) + self.nametagStyle_name = DirectLabel(self, relief=None, text='', scale=0.06, text_wordwrap=9, pos=(buttonbase_xcoord, 0, textStartHeight - 4 * textRowHeight)) + self.nametagStyle_leftButton = DirectButton(self, relief=None, image=arrow_image, scale=0.45, pos=(0.05, 0, textStartHeight - 4 * textRowHeight), command=self.__updateNametagIndex, extraArgs=[-1]) + self.nametagStyle_rightButton = DirectButton(self, relief=None, image=arrow_image, scale=-0.45, pos=(0.65, 0, textStartHeight - 4 * textRowHeight), command=self.__updateNametagIndex, extraArgs=[1]) + self.nametagStyle_index = -1 self.bugReportButton = DirectButton(parent=self, relief=None, text=TTLocalizer.BugReportButton, image=button_image, image_scale=button_image_scale, text_pos=(0, -0.01), text_fg=(0, 0, 0, 1), command=self.showReportNotice, pos=(0.0, 0.0, -0.6), text_scale=(0.045)) guiButton.removeNode() circleModel.removeNode() + matGui.removeNode() def enter(self): self.show() @@ -747,12 +755,17 @@ class ExtraOptionsTabPage(DirectFrame): self.__setSpeedchatPlusButton() self.__setTrueFriendsButton() self.__setCogInterfaceButton() + self.__updateNametagStyle() + self.accept('refreshNametagStyle', self.__updateNametagStyle) def exit(self): - self.ignore('confirmDone') + self.ignoreAll() self.destroyReportNotice() self.hide() + if self.nametagStyle_index != -1 and self.nametagStyle_index != base.localAvatar.nametagStyles.index(base.localAvatar.getNametagStyle()): + base.localAvatar.requestNametagStyle(base.localAvatar.nametagStyles[self.nametagStyle_index]) + def unload(self): self.fov_label.destroy() del self.fov_label @@ -764,8 +777,22 @@ class ExtraOptionsTabPage(DirectFrame): del self.trueFriends_label self.cogInterface_label.destroy() del self.cogInterface_label + self.nametagStyle_label.destroy() + del self.nametagStyle_label + self.speedchatPlus_toggleButton.destroy() + del speedchatPlus_toggleButton + self.trueFriends_toggleButton.destroy() + del self.trueFriends_toggleButton self.cogInterface_toggleButton.destroy() del self.cogInterface_toggleButton + self.bugReportButton.destroy() + del self.bugReportButton + self.nametagStyle_name.destroy() + del self.nametagStyle_name + self.nametagStyle_leftButton.destroy() + del self.nametagStyle_leftButton + self.nametagStyle_rightButton.destroy() + del self.nametagStyle_rightButton self.destroyReportNotice() def __doFov(self): @@ -805,6 +832,28 @@ class ExtraOptionsTabPage(DirectFrame): self.trueFriends_label['text'] = TTLocalizer.TrueFriendsLabelOn if settings['trueFriends'] else TTLocalizer.TrueFriendsLabelOff self.trueFriends_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['trueFriends'] else TTLocalizer.OptionsPageToggleOn + def __updateNametagStyle(self, resetIndex=True): + if resetIndex: + self.nametagStyle_index = base.localAvatar.nametagStyles.index(base.localAvatar.getNametagStyle()) + + self.nametagStyle_name['text'] = base.localAvatar.getName() + self.nametagStyle_name['text_font'] = ToontownGlobals.getNametagFont(base.localAvatar.nametagStyles[self.nametagStyle_index]) + nametagCount = len(base.localAvatar.nametagStyles) + + if self.nametagStyle_index >= (nametagCount - 1): + self.nametagStyle_rightButton.hide() + else: + self.nametagStyle_rightButton.show() + + if self.nametagStyle_index <= 0: + self.nametagStyle_leftButton.hide() + else: + self.nametagStyle_leftButton.show() + + def __updateNametagIndex(self, offset): + self.nametagStyle_index += offset + self.__updateNametagStyle(False) + def destroyReportNotice(self): if hasattr(self, 'dialog'): self.dialog.destroy() diff --git a/toontown/toon/DistributedToon.py b/toontown/toon/DistributedToon.py index 4ba1c770..f76edb17 100755 --- a/toontown/toon/DistributedToon.py +++ b/toontown/toon/DistributedToon.py @@ -1960,6 +1960,20 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute nametagStyle = 0 self.nametagStyle = nametagStyle self.setDisplayName(self.getName()) + + def getNametagStyles(self): + return self.nametagStyles + + def setNametagStyles(self, nametagStyles): + self.nametagStyles = nametagStyles + if self == base.localAvatar: + messenger.send('refreshNametagStyle') + + def requestNametagStyle(self, nametagStyle): + if nametagStyle not in self.nametagStyles: + return + + self.sendUpdate('requestNametagStyle', [nametagStyle]) def getAvIdName(self): return '%s\n%s' % (self.getName(), self.doId) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index f19a16ca..9e071657 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -3672,6 +3672,25 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo def getNametagStyle(self): return self.nametagStyle + + def b_setNametagStyles(self, nametagStyles): + self.d_setNametagStyles(nametagStyles) + self.setNametagStyles(nametagStyles) + + def d_setNametagStyles(self, nametagStyles): + self.sendUpdate('setNametagStyles', [nametagStyles]) + + def setNametagStyles(self, nametagStyles): + self.nametagStyles = nametagStyles + + def getNametagStyles(self): + return self.nametagStyles + + def requestNametagStyle(self, nametagStyle): + if nametagStyle not in self.nametagStyles: + return + + self.b_setNametagStyle(nametagStyle) def b_setMail(self, mail): self.d_setMail(mail) @@ -4837,10 +4856,12 @@ def getZone(): @magicWord(category=CATEGORY_MODERATOR, types=[int]) def nametagStyle(nametagStyle): - currentAccess = spellbook.getInvokerAccess() if nametagStyle >= len(TTLocalizer.NametagFontNames): return 'Invalid nametag style.' target = spellbook.getTarget() + if nametagStyle not in target.nametagStyles: + target.nametagStyles.append(nametagStyle) + target.b_setNametagStyles(target.nametagStyles) target.b_setNametagStyle(nametagStyle) return 'Nametag style set to: %s.' % TTLocalizer.NametagFontNames[nametagStyle] diff --git a/toontown/toon/DistributedToonUD.py b/toontown/toon/DistributedToonUD.py index 4bd6cb29..0ad3ff62 100755 --- a/toontown/toon/DistributedToonUD.py +++ b/toontown/toon/DistributedToonUD.py @@ -462,6 +462,9 @@ class DistributedToonUD(DistributedObjectUD): def setNametagStyle(self, todo0): pass + + def setNametagStyles(self, todo0): + return def setMail(self, todo0): pass diff --git a/toontown/toon/LocalToon.py b/toontown/toon/LocalToon.py index 204215c2..80f05bfd 100755 --- a/toontown/toon/LocalToon.py +++ b/toontown/toon/LocalToon.py @@ -168,6 +168,7 @@ class LocalToon(DistributedToon.DistributedToon, LocalAvatar.LocalAvatar): def setName(self, name): base.localAvatarName = name DistributedToon.DistributedToon.setName(self, name) + messenger.send('refreshNametagStyle') def wantLegacyLifter(self): return True diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index b4023062..0acfa56c 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -8506,6 +8506,7 @@ SpeedchatPlusLabelOff = 'Speedchat Plus is off.' TrueFriendsLabelOn = 'True Friends is on.' TrueFriendsLabelOff = 'True Friends is off.' FieldOfViewLabel = 'Field of View:' +NametagStyleLabel = 'Nametag Style:' BossLocations = { 'c': 'Bossbot Clubhouse\nBanquet', 'l': "Lawbot Courthouse\nBumpy Bumblebehr's Trial", From 24aefa840842963b6b498e502588d5debb30f962 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 00:39:11 +0300 Subject: [PATCH 038/161] Nametag styles are sent now --- toontown/catalog/CatalogGenerator.py | 4 ++-- toontown/catalog/GiftAvatar.py | 5 ++++- toontown/estate/DistributedPhoneAI.py | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/toontown/catalog/CatalogGenerator.py b/toontown/catalog/CatalogGenerator.py index 4afffce7..40752063 100755 --- a/toontown/catalog/CatalogGenerator.py +++ b/toontown/catalog/CatalogGenerator.py @@ -497,7 +497,6 @@ MonthlySchedule = ((7, CatalogRentalItem(1, 2880, 1000), CatalogRentalItem(2, 2890, 1000), CatalogGardenStarterItem(), - CatalogNametagItem(0), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), @@ -1249,7 +1248,8 @@ WeeklySchedule = ((100, 4020, 4520, CatalogClothingItem(130, 0), - CatalogFurnitureItem(150)), + CatalogFurnitureItem(150), + CatalogNametagItem(14)), (100, (1, 2010), (2, 2020), diff --git a/toontown/catalog/GiftAvatar.py b/toontown/catalog/GiftAvatar.py index 52d58780..4303b2fd 100644 --- a/toontown/catalog/GiftAvatar.py +++ b/toontown/catalog/GiftAvatar.py @@ -83,4 +83,7 @@ class GiftAvatar: self.emoteAccess = emoteAccess[0] def setPetTrickPhrases(self, tricks): - self.petTrickPhrases = tricks[0] \ No newline at end of file + self.petTrickPhrases = tricks[0] + + def setNametagStyles(self, nametagStyles): + self.nametagStyles = nametagStyles[0] \ No newline at end of file diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 6dd24e38..4aa404bc 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -36,7 +36,7 @@ class LoadGiftAvatar: newDict = self.copyDict(fields, 'setDNAString', 'setMailboxContents', 'setGiftSchedule', 'setDeliverySchedule', 'setHat', 'setGlasses', 'setBackpack', 'setShoes', 'setHatList', 'setGlassesList', 'setBackpackList', 'setShoes', 'setShoesList', 'setCustomMessages', 'setEmoteAccess', - 'setClothesTopsList', 'setClothesBottomsList', 'setPetTrickPhrases') + 'setClothesTopsList', 'setClothesBottomsList', 'setPetTrickPhrases', 'setNametagStyles') self.callback(self.avId, self.targetId, newDict, self.optional) del self.phone.fsms[self.avId] From 207f397e32d021703dc72efb1df25fab9d339ee6 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 01:09:01 +0300 Subject: [PATCH 039/161] Fix trunk --- toontown/catalog/CatalogItemPanel.py | 6 +----- toontown/estate/TrunkGUI.py | 17 ++++++++++++----- toontown/toonbase/TTLocalizerEnglish.py | 2 -- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index 57e74af3..0513e36d 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -291,11 +291,7 @@ class CatalogItemPanel(DirectFrame): auxText = TTLocalizer.CatalogOnOrderText else: auxText = '' - isNameTag = typeCode == CatalogItemTypes.NAMETAG_ITEM - if isNameTag and self['item'].nametagStyle == base.localAvatar.getNametagStyle(): - auxText = TTLocalizer.CatalogCurrent - self.buyButton['state'] = DGG.DISABLED - elif self['item'].reachedPurchaseLimit(base.localAvatar): + if self['item'].reachedPurchaseLimit(base.localAvatar): max = self['item'].getPurchaseLimit() if max <= 1: auxText = TTLocalizer.CatalogPurchasedText diff --git a/toontown/estate/TrunkGUI.py b/toontown/estate/TrunkGUI.py index 3c86dc15..7a26e96a 100755 --- a/toontown/estate/TrunkGUI.py +++ b/toontown/estate/TrunkGUI.py @@ -242,17 +242,14 @@ class TrunkGUI(StateData.StateData): self.glasses = [] self.backpacks = [] self.shoes = [] + choices = [0, 0, 0, 0] + currentAccessories = (self.toon.getHat(), self.toon.getGlasses(), self.toon.getBackpack(), self.toon.getShoes()) self.hats.append((0, 0, 0)) self.glasses.append((0, 0, 0)) self.backpacks.append((0, 0, 0)) self.shoes.append((0, 0, 0)) - self.hatChoice = 0 - self.glassesChoice = 0 - self.backpackChoice = 0 - self.shoesChoice = 0 - i = 0 while i < len(self.hatList): self.hats.append((self.hatList[i], self.hatList[i + 1], self.hatList[i + 2])) @@ -272,7 +269,17 @@ class TrunkGUI(StateData.StateData): while i < len(self.shoesList): self.shoes.append((self.shoesList[i], self.shoesList[i + 1], self.shoesList[i + 2])) i = i + 3 + + for i, list in enumerate((self.hats, self.glasses, self.backpacks, self.shoes)): + if len(list) >= 3: + index = list.index(currentAccessories[i]) + list[index], list[1] = list[1], list[index] + choices[i] = 1 + self.hatChoice = choices[0] + self.glassesChoice = choices[1] + self.backpackChoice = choices[2] + self.shoesChoice = choices[3] self.swapHat(0) self.swapGlasses(0) self.swapBackpack(0) diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 0acfa56c..37e6d20b 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5565,7 +5565,6 @@ CatalogRentText = 'Rent' CatalogGiftText = 'Gift' CatalogOnOrderText = 'On Order' CatalogPurchasedText = 'Already\nPurchased' -CatalogCurrent = 'Current' CatalogGiftedText = 'Gifted\nTo You' CatalogPurchasedGiftText = 'Already\nOwned' CatalogMailboxFull = 'No Room' @@ -5585,7 +5584,6 @@ CatalogVerifyRent = 'Rent %(item)s for %(price)s Jellybeans?' CatalogVerifyGift = 'Purchase %(item)s for %(price)s Jellybeans as a gift for %(friend)s?' CatalogOnlyOnePurchase = 'You may only have one of these items at a time. If you purchase this one, it will replace %(old)s.\n\nAre you sure you want to purchase %(item)s for %(price)s Jellybeans?' CatalogExitButtonText = 'Hang Up' -CatalogCurrentButtonText = 'To Current Items' CatalogPastButtonText = 'To Past Items' TutorialHQOfficerName = 'HQ Harry' NPCToonNames = {20000: 'Tutorial Tom', From f28c65d32b31fe76863d4c45f860f119cc67a069 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 01:21:43 +0300 Subject: [PATCH 040/161] Match Jaymo --- toontown/minigame/DistributedPatternGame.py | 58 ++++++++++----------- toontown/toon/NPCToons.py | 21 ++++---- toontown/toonbase/TTLocalizerEnglish.py | 10 ++-- toontown/toonbase/ToontownGlobals.py | 2 +- 4 files changed, 46 insertions(+), 45 deletions(-) diff --git a/toontown/minigame/DistributedPatternGame.py b/toontown/minigame/DistributedPatternGame.py index aabf128c..30ce5942 100755 --- a/toontown/minigame/DistributedPatternGame.py +++ b/toontown/minigame/DistributedPatternGame.py @@ -122,13 +122,13 @@ class DistributedPatternGame(DistributedMinigame): minnieX.removeNode() minnieCircle.removeNode() matchingGameGui.removeNode() - self.blinky = NPCToons.createLocalNPC(7010) - self.blinky.reparentTo(hidden) + self.toon = NPCToons.createLocalNPC(7010) + self.toon.reparentTo(hidden) self.backRowHome = Point3(3, 11, 0) self.backRowXSpacing = 1.8 self.frontRowHome = Point3(0, 18, 0) self.frontRowXSpacing = 3.0 - self.stdNumDanceStepPingFrames = self.blinky.getNumFrames(self.toonAnimNames[0]) + self.stdNumDanceStepPingFrames = self.toon.getNumFrames(self.toonAnimNames[0]) self.stdNumDanceStepPingPongFrames = self.__numPingPongFrames(self.stdNumDanceStepPingFrames) self.buttonPressDelayPercent = (self.stdNumDanceStepPingFrames - 1.0) / self.stdNumDanceStepPingPongFrames self.animPlayRates = [] @@ -185,8 +185,8 @@ class DistributedPatternGame(DistributedMinigame): del self.statusBalls self.room.removeNode() del self.room - self.blinky.delete() - del self.blinky + self.toon.delete() + del self.toon self.removeChildGameFSM(self.gameFSM) del self.gameFSM @@ -238,19 +238,19 @@ class DistributedPatternGame(DistributedMinigame): self.arrowDict['lt'][k].setPos(0, 0, 1) self.formatStatusBalls(self.arrowDict['lt'][2], self.lt.nametag3d) - self.blinky.reparentTo(render) - self.blinky.setPos(-1.6, 20, 0) - self.blinky.setScale(1) - self.makeToonLookatCamera(self.blinky) - self.blinky.loop('neutral') - self.blinky.nametag.manage(base.marginManager) - self.blinky.nametag.getNametag3d().setChatWordwrap(8) + self.toon.reparentTo(render) + self.toon.setPos(-1.6, 20, 0) + self.toon.setScale(1) + self.makeToonLookatCamera(self.toon) + self.toon.loop('neutral') + self.toon.nametag.manage(base.marginManager) + self.toon.nametag.getNametag3d().setChatWordwrap(8) self.arrowDict['m'] = [self.arrows.pop(), self.xs.pop()] for k in xrange(0, 2): self.arrowDict['m'][k].setBillboardAxis() self.arrowDict['m'][k].setBin('fixed', 100) self.arrowDict['m'][k].setColor(self.arrowColor) - self.arrowDict['m'][k].reparentTo(self.blinky.nametag3d) + self.arrowDict['m'][k].reparentTo(self.toon.nametag3d) self.arrowDict['m'][k].setScale(4) self.arrowDict['m'][k].setPos(0, 0, 1.7) @@ -267,9 +267,9 @@ class DistributedPatternGame(DistributedMinigame): del self.arrowKeys self.room.reparentTo(hidden) self.roundText.hide() - self.blinky.nametag.unmanage(base.marginManager) - self.blinky.stop() - self.blinky.reparentTo(hidden) + self.toon.nametag.unmanage(base.marginManager) + self.toon.stop() + self.toon.reparentTo(hidden) self.lt.setScale(1) for avId in self.remoteAvIdList: toon = self.getAvatar(avId) @@ -387,7 +387,7 @@ class DistributedPatternGame(DistributedMinigame): def getDanceStepDuration(self): numFrames = self.stdNumDanceStepPingPongFrames - return numFrames / abs(self.animPlayRate * self.toonAnimSpeedMult[self.toonAnimNames[0]] * self.blinky.getFrameRate(self.toonAnimNames[0])) + return numFrames / abs(self.animPlayRate * self.toonAnimSpeedMult[self.toonAnimNames[0]] * self.toon.getFrameRate(self.toonAnimNames[0])) def __getDanceStepAnimTrack(self, toon, anim, speedScale): numFrames = toon.getNumFrames(anim) @@ -516,12 +516,12 @@ class DistributedPatternGame(DistributedMinigame): index = self.avIdList.index(avId) return self.__getRowPos(self.frontRowHome, self.frontRowXSpacing, index, len(self.avIdList)) - def __setBlinkyChat(self, str, giggle): + def __setToonChat(self, str, giggle): str = str.replace('%s', self.getAvatar(self.localAvId).getName()) - self.blinky.setChatAbsolute(str, CFSpeech) + self.toon.setChatAbsolute(str, CFSpeech) - def __clearBlinkyChat(self): - self.blinky.clearChat() + def __clearToonChat(self): + self.toon.clearChat() def enterOff(self): self.notify.debug('enterOff') @@ -557,13 +557,13 @@ class DistributedPatternGame(DistributedMinigame): toon.setPlayRate(self.animPlayRate * self.toonAnimSpeedMult[anim], anim) for anim in self.toonAnimNames: - self.blinky.setPlayRate(self.animPlayRate * self.toonAnimSpeedMult[anim], anim) + self.toon.setPlayRate(self.animPlayRate * self.toonAnimSpeedMult[anim], anim) text = self.strWatch - danceTrack = self.getDanceSequenceAnimTrack(self.blinky, self.__serverPattern) + danceTrack = self.getDanceSequenceAnimTrack(self.toon, self.__serverPattern) arrowTrack = self.getDanceArrowAnimTrack('m', self.__serverPattern, 0) soundTrack = self.getDanceSequenceButtonSoundTrack(self.__serverPattern) - self.showTrack = Sequence(Func(self.__setBlinkyChat, text, 1), Wait(0.5), Parallel(danceTrack, soundTrack, arrowTrack), Wait(0.2), Func(self.__clearBlinkyChat), Func(self.gameFSM.request, 'getUserInput')) + self.showTrack = Sequence(Func(self.__setToonChat, text, 1), Wait(0.5), Parallel(danceTrack, soundTrack, arrowTrack), Wait(0.2), Func(self.__clearToonChat), Func(self.gameFSM.request, 'getUserInput')) self.showTrack.start() def exitShowServerPattern(self): @@ -605,7 +605,7 @@ class DistributedPatternGame(DistributedMinigame): self.showStatusBalls(avId) self.__otherToonIndex[avId] = 0 - self.setupTrack = Sequence(Func(self.__setBlinkyChat, self.strGo, 0), Func(self.setText, self.roundText, TTLocalizer.PatternGameGo), Func(self.roundText.setScale, 0.3), Func(enableKeys), Func(startTimer), Wait(0.8), Func(self.__clearBlinkyChat), Func(self.setText, self.roundText, ' '), Func(self.roundText.setScale, 0.12), Func(self.setTextFG, self.roundText, self.normalTextColor)) + self.setupTrack = Sequence(Func(self.__setToonChat, self.strGo, 0), Func(self.setText, self.roundText, TTLocalizer.PatternGameGo), Func(self.roundText.setScale, 0.3), Func(enableKeys), Func(startTimer), Wait(0.8), Func(self.__clearToonChat), Func(self.setText, self.roundText, ' '), Func(self.roundText.setScale, 0.12), Func(self.setTextFG, self.roundText, self.normalTextColor)) self.setupTrack.start() return @@ -685,7 +685,7 @@ class DistributedPatternGame(DistributedMinigame): self.proceedTrack.pause() del self.setupTrack del self.proceedTrack - self.__clearBlinkyChat() + self.__clearToonChat() def enterWaitForPlayerPatterns(self): self.notify.debug('enterWaitForPlayerPatterns') @@ -751,7 +751,7 @@ class DistributedPatternGame(DistributedMinigame): sound = self.incorrectSound text = self.strWrong soundTrack = Sequence(Func(base.playSfx, sound), Wait(1.6)) - textTrack = Sequence(Wait(0.2), Func(self.__setBlinkyChat, text, 0), Wait(1.3), Func(self.__clearBlinkyChat)) + textTrack = Sequence(Wait(0.2), Func(self.__setToonChat, text, 0), Wait(1.3), Func(self.__clearToonChat)) self.playBackPatternsTrack = Sequence(Parallel(soundTrack, textTrack, jumpTrack), Func(self.gameFSM.request, 'checkGameOver')) self.playBackPatternsTrack.start() @@ -775,9 +775,9 @@ class DistributedPatternGame(DistributedMinigame): delay = 2.2 if self.celebrate: text = TTLocalizer.PatternGameImprov - self.__winTrack = Sequence(Func(self.__setBlinkyChat, text, 1), Func(base.playSfx, self.perfectSound), Sequence(self.returnCelebrationIntervals(1)), Sequence(self.returnCelebrationIntervals(0)), Func(self.__clearBlinkyChat), Func(self.gameOver)) + self.__winTrack = Sequence(Func(self.__setToonChat, text, 1), Func(base.playSfx, self.perfectSound), Sequence(self.returnCelebrationIntervals(1)), Sequence(self.returnCelebrationIntervals(0)), Func(self.__clearToonChat), Func(self.gameOver)) else: - self.__winTrack = Sequence(Func(self.__setBlinkyChat, text, 1), Func(base.playSfx, sound), Wait(delay), Func(self.__clearBlinkyChat), Func(self.gameOver)) + self.__winTrack = Sequence(Func(self.__setToonChat, text, 1), Func(base.playSfx, sound), Wait(delay), Func(self.__clearToonChat), Func(self.gameOver)) self.__winTrack.start() return diff --git a/toontown/toon/NPCToons.py b/toontown/toon/NPCToons.py index ec4cbe32..11a0c8b0 100755 --- a/toontown/toon/NPCToons.py +++ b/toontown/toon/NPCToons.py @@ -11536,20 +11536,21 @@ NPCToonDict = {20000: (-1, NPC_REGULAR), 7010: (-1, lnames[7010], - ('dss', + ('rll', 'ms', - 's', 'm', - 13, + 'm', + 2, 0, + 2, + 2, + 19, + 10, 13, - 13, - 4, - 4, - 4, - 4, - 1, - 4), + 10, + 7, + 14, + 0), 'm', 0, NPC_REGULAR), diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 37e6d20b..dcbcf8b0 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -4312,8 +4312,8 @@ TugOfWarGameReady = 'Ready...' TugOfWarGameEnd = 'Good game!' TugOfWarGameTie = 'You tied!' TugOfWarPowerMeter = 'Power meter' -PatternGameTitle = 'Match Blinky' -PatternGameInstructions = 'Little Blinky will show you a dance sequence. ' + "Try to repeat Little Blinky's dance just the way you see it using the arrow keys!" +PatternGameTitle = 'Match Jaymo' +PatternGameInstructions = 'Jaymo will show you a dance sequence. ' + "Try to repeat Jaymo's dance just the way you see it using the arrow keys!" PatternGameWatch = 'Watch these dance steps...' PatternGameGo = 'GO!' PatternGameRight = 'Good, %s!' @@ -6241,7 +6241,7 @@ NPCToonNames = {20000: 'Tutorial Tom', 7007: 'Dewin Tymme', 7008: 'Ima Cagedtoon', 7009: 'Jimmy Thelock', - 7010: 'Little Blinky', + 7010: 'Jaymo', 7011: 'Donald', 10001: 'Healer Sara', 11001: 'Healer Gabriel', @@ -6995,10 +6995,10 @@ TipDict = {TIP_NONE: ('',), 'If you wait too long to attack a lured Cog, it will wake up. Higher level lures last longer.', 'There are fishing ponds on every street in Toontown. Some streets have unique fish.'), TIP_MINIGAME: ('After you fill up your Jellybean jar, any Jellybeans you get from Trolley Games automatically spill over into your bank.', - 'You can use the arrow keys instead of the mouse in the "Match Blinky" Trolley Game.', + 'You can use the arrow keys instead of the mouse in the "Match Jaymo" Trolley Game.', 'In the Cannon Game you can use the arrow keys to move your cannon and press the "Control" key to fire.', 'In the Ring Game, bonus points are awarded when the entire group successfully swims through its rings.', - 'A perfect game of Match Blinky will double your points.', + 'A perfect game of Match Jaymo will double your points.', 'In the Tug-of-War you are awarded more Jellybeans if you play against a tougher Cog.', 'Trolley Game difficulty varies by neighborhood; ' + lToontownCentral + ' has the easiest and ' + lDonaldsDreamland + ' has the hardest.', 'Certain Trolley Games can only be played in a group.'), diff --git a/toontown/toonbase/ToontownGlobals.py b/toontown/toonbase/ToontownGlobals.py index 81b35170..bcbc304d 100755 --- a/toontown/toonbase/ToontownGlobals.py +++ b/toontown/toonbase/ToontownGlobals.py @@ -347,7 +347,7 @@ MinigameNames = {'race': RaceGameId, 'cannon': CannonGameId, 'tag': TagGameId, 'pattern': PatternGameId, - 'minnie': PatternGameId, + 'jaymo': PatternGameId, 'match': PatternGameId, 'matching': PatternGameId, 'ring': RingGameId, From 7be88f4d331ef6faffefc1851d4d111a7daa8d49 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 01:36:45 +0300 Subject: [PATCH 041/161] Tank items should have delivery date --- toontown/catalog/CatalogTankItem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toontown/catalog/CatalogTankItem.py b/toontown/catalog/CatalogTankItem.py index 21d87d84..c4cc612c 100644 --- a/toontown/catalog/CatalogTankItem.py +++ b/toontown/catalog/CatalogTankItem.py @@ -33,13 +33,13 @@ class CatalogTankItem(CatalogItem.CatalogItem): if self.maxTank <= avatar.getMaxFishTank(): return ToontownGlobals.P_ItemUnneeded avatar.b_setMaxFishTank(self.maxTank) - return ToontownGlobals.P_ItemAvailable + return ToontownGlobals.P_ItemOnOrder def isGift(self): return 0 def getDeliveryTime(self): - return 0 + return 1 def getPicture(self, avatar): gui = loader.loadModel('phase_4/models/gui/fishingGui') From 0be23c6abe60ff1b8eef5acc1c5eb01ddc454fcc Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 01:41:22 +0300 Subject: [PATCH 042/161] Show name of nametag while choosing --- toontown/shtiker/OptionsPage.py | 5 +++-- toontown/toonbase/TTLocalizerEnglish.py | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/toontown/shtiker/OptionsPage.py b/toontown/shtiker/OptionsPage.py index 1bfce8a9..4d9f25c2 100755 --- a/toontown/shtiker/OptionsPage.py +++ b/toontown/shtiker/OptionsPage.py @@ -836,8 +836,9 @@ class ExtraOptionsTabPage(DirectFrame): if resetIndex: self.nametagStyle_index = base.localAvatar.nametagStyles.index(base.localAvatar.getNametagStyle()) - self.nametagStyle_name['text'] = base.localAvatar.getName() - self.nametagStyle_name['text_font'] = ToontownGlobals.getNametagFont(base.localAvatar.nametagStyles[self.nametagStyle_index]) + nametagId = base.localAvatar.nametagStyles[self.nametagStyle_index] + self.nametagStyle_name['text'] = base.localAvatar.getName() + '\n' + TTLocalizer.NametagFontNames[nametagId] + self.nametagStyle_name['text_font'] = ToontownGlobals.getNametagFont(nametagId) nametagCount = len(base.localAvatar.nametagStyles) if self.nametagStyle_index >= (nametagCount - 1): diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index dcbcf8b0..c13e2d7a 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -36,7 +36,7 @@ NametagFonts = ( 'phase_3/models/fonts/DinosaursAreAlive.ttf' ) NametagFontNames = ( - 'Default', + 'Basic', 'Plain', 'Shivering', 'Wonky', @@ -56,7 +56,6 @@ NametagFontNames = ( 'Dinosaurs' ) NametagLabel = ' Nametag' -BasicNameTag = 'Basic' ScreenshotPath = 'user/screenshots/' Flippy = 'Flippy' lTheBrrrgh = 'The Brrrgh' From 95f67faab580ec2b6b18d134968da7139afafdcb Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 02:28:36 +0300 Subject: [PATCH 043/161] Stuff --- otp/avatar/Avatar.py | 65 +------- otp/otpbase/OTPBase.py | 155 +----------------- otp/otpbase/OTPLocalizerEnglish.py | 2 +- otp/otpbase/OTPRender.py | 1 - .../coderedemption/TTCodeRedemptionMgrAI.py | 2 - toontown/suit/BossCog.py | 2 +- toontown/suit/Suit.py | 2 +- toontown/toon/DistributedToon.py | 4 - toontown/toon/Toon.py | 6 +- toontown/toonbase/ToonBase.py | 10 -- 10 files changed, 11 insertions(+), 238 deletions(-) diff --git a/otp/avatar/Avatar.py b/otp/avatar/Avatar.py index d0129bc1..900b9ce0 100755 --- a/otp/avatar/Avatar.py +++ b/otp/avatar/Avatar.py @@ -27,24 +27,15 @@ def reconsiderAllUnderstandable(): for av in Avatar.ActiveAvatars: av.considerUnderstandable() - class Avatar(Actor, ShadowCaster): notify = directNotify.newCategory('Avatar') ActiveAvatars = [] - ManagesNametagAmbientLightChanged = False def __init__(self, other = None): - self.name = '' - try: - self.Avatar_initialized - return - except: - self.Avatar_initialized = 1 - Actor.__init__(self, None, None, other, flattenable=0, setFinal=1) ShadowCaster.__init__(self) self.__font = OTPGlobals.getInterfaceFont() - self.__speechFont = OTPGlobals.getInterfaceFont() + self.name = '' self.soundChatBubble = None self.avatarType = '' self.nametagNodePath = None @@ -59,18 +50,11 @@ class Avatar(Actor, ShadowCaster): self.nametag3d = self.attachNewNode('nametag3d') self.nametag3d.setTag('cam', 'nametag') self.nametag3d.setLightOff() - if self.ManagesNametagAmbientLightChanged: - self.acceptNametagAmbientLightChange() - OTPRender.renderReflection(False, self.nametag3d, 'otp_avatar_nametag', None) self.getGeomNode().showThrough(OTPRender.ShadowCameraBitmask) self.nametag3d.hide(OTPRender.ShadowCameraBitmask) self.collTube = None - self.battleTube = None self.scale = 1.0 - self.nametagScale = 1.0 self.height = 0.0 - self.battleTubeHeight = 0.0 - self.battleTubeRadius = 0.0 self.style = None self.understandable = 1 self.setPlayerType(NametagGroup.CCNormal) @@ -91,11 +75,8 @@ class Avatar(Actor, ShadowCaster): except: self.deleteNametag3d() Actor.cleanup(self) - if self.ManagesNametagAmbientLightChanged: - self.ignoreNametagAmbientLightChange() self.Avatar_deleted = 1 del self.__font - del self.__speechFont del self.style del self.soundChatBubble self.nametag.destroy() @@ -104,12 +85,6 @@ class Avatar(Actor, ShadowCaster): ShadowCaster.delete(self) Actor.delete(self) - def acceptNametagAmbientLightChange(self): - self.accept('nametagAmbientLightChanged', self.nametagAmbientLightChanged) - - def ignoreNametagAmbientLightChange(self): - self.ignore('nametagAmbientLightChanged') - def isLocal(self): return 0 @@ -177,13 +152,6 @@ class Avatar(Actor, ShadowCaster): self.getGeomNode().setScale(scale) self.setHeight(self.height) - def getNametagScale(self): - return self.nametagScale - - def setNametagScale(self, scale): - self.nametagScale = scale - self.nametag3d.setScale(scale) - def adjustNametag3d(self, parentScale = 1.0): self.nametag3d.setPos(0, 0, self.height + 0.5) @@ -197,8 +165,6 @@ class Avatar(Actor, ShadowCaster): self.collTube.setPointB(0, 0, height - self.getRadius()) if self.collNodePath: self.collNodePath.forceRecomputeBounds() - if self.battleTube: - self.battleTube.setPointB(0, 0, height - self.getRadius()) def getRadius(self): return OTPGlobals.AvatarDefaultRadius @@ -245,13 +211,6 @@ class Avatar(Actor, ShadowCaster): self.__font = font self.nametag.setFont(font) - def getSpeechFont(self): - return self.__speechFont - - def setSpeechFont(self, font): - self.__speechFont = font - self.nametag.setSpeechFont(font) - def getStyle(self): return self.style @@ -349,9 +308,6 @@ class Avatar(Actor, ShadowCaster): self.nametag.setChat(chatString, chatFlags) self.playCurrentDialogue(dialogue, chatFlags, interrupt) - def setChatMuted(self, chatString, chatFlags, dialogue = None, interrupt = 1, quiet = 0): - pass - def displayTalk(self, chatString): if not base.localAvatar.isIgnored(self.doId): self.clearChat() @@ -364,11 +320,6 @@ class Avatar(Actor, ShadowCaster): def clearChat(self): self.nametag.clearChat() - def isInView(self): - pos = self.getPos(camera) - eyePos = Point3(pos[0], pos[1], pos[2] + self.getHeight()) - return base.camNode.isInView(eyePos) - def getNameVisible(self): return self.__nameVisible @@ -539,11 +490,6 @@ class Avatar(Actor, ShadowCaster): cJoint.clearNetTransforms() cJoint.addNetTransform(nametagNode) - def nametagAmbientLightChanged(self, newlight): - self.nametag3d.setLightOff() - if newlight: - self.nametag3d.setLight(newlight) - def deleteNametag3d(self): if self.nametagNodePath: self.nametagNodePath.removeNode() @@ -615,10 +561,5 @@ def target(): Returns the current Spellbook target. """ target = spellbook.getTarget() - print 'Called target.' - print 'Name: ' + target.getName() - doId = str(int(target.doId)) - print 'doId: ', doId - accessLevel = str(int(target.getAdminAccess())) - print 'Access Level: ', accessLevel - return 'Target: %s-%d [%d]' % (target.getName(), int(target.doId), int(target.getAdminAccess())) + + return 'Target: %s-%d [%d]' % (target.getName(), int(target.doId), int(target.getAdminAccess())) \ No newline at end of file diff --git a/otp/otpbase/OTPBase.py b/otp/otpbase/OTPBase.py index bbf96ae0..2071199e 100755 --- a/otp/otpbase/OTPBase.py +++ b/otp/otpbase/OTPBase.py @@ -7,7 +7,6 @@ import OTPGlobals, OTPRender, math class OTPBase(ShowBase): def __init__(self, windowType = None): - self.wantEnviroDR = False ShowBase.__init__(self, windowType=windowType) self.idTags = config.GetBool('want-id-tags', 0) if not self.idTags: @@ -15,9 +14,6 @@ class OTPBase(ShowBase): self.wantNametags = self.config.GetBool('want-nametags', 1) self.wantDynamicShadows = 1 self.stereoEnabled = False - self.enviroDR = None - self.enviroCam = None - self.pixelZoomSetup = False self.whiteList = None if config.GetBool('want-whitelist', True): @@ -27,159 +23,12 @@ class OTPBase(ShowBase): if config.GetBool('want-sequence-list', True): self.whiteList.setSequenceList(SequenceListData.SEQUENCES) - if base.cam: - if self.wantEnviroDR: - base.cam.node().setCameraMask(OTPRender.MainCameraBitmask) - else: - base.cam.node().setCameraMask(OTPRender.MainCameraBitmask | OTPRender.EnviroCameraBitmask) - taskMgr.setupTaskChain('net') - - def setTaskChainNetThreaded(self): - if base.config.GetBool('want-threaded-network', 0): - taskMgr.setupTaskChain('net', numThreads=1, frameBudget=0.001, threadPriority=TPLow) - - def setTaskChainNetNonthreaded(self): - taskMgr.setupTaskChain('net', numThreads=0, frameBudget=-1) - - def toggleStereo(self): - self.stereoEnabled = not self.stereoEnabled - if self.stereoEnabled: - if not base.win.isStereo(): - base.win.setRedBlueStereo(True, ColorWriteAttrib.CRed, ColorWriteAttrib.CGreen | ColorWriteAttrib.CBlue) - if self.wantEnviroDR: - self.setupEnviroCamera() - return - mainDR = base.camNode.getDisplayRegion(0) - if self.stereoEnabled: - if not mainDR.isStereo(): - base.win.removeDisplayRegion(mainDR) - mainDR = base.win.makeStereoDisplayRegion() - mainDR.getRightEye().setClearDepthActive(True) - mainDR.setCamera(base.cam) - elif mainDR.isStereo(): - base.win.removeDisplayRegion(mainDR) - mainDR = base.win.makeMonoDisplayRegion() - mainDR.setCamera(base.cam) - - def setupEnviroCamera(self): - clearColor = VBase4(0, 0, 0, 1) - if self.enviroDR: - clearColor = self.enviroDR.getClearColor() - self.win.removeDisplayRegion(self.enviroDR) - if not self.enviroCam: - self.enviroCam = self.cam.attachNewNode(Camera('enviroCam')) - mainDR = self.camNode.getDisplayRegion(0) - if self.stereoEnabled: - self.enviroDR = self.win.makeStereoDisplayRegion() - if not mainDR.isStereo(): - self.win.removeDisplayRegion(mainDR) - mainDR = self.win.makeStereoDisplayRegion() - mainDR.setCamera(self.cam) - ml = mainDR.getLeftEye() - mr = mainDR.getRightEye() - el = self.enviroDR.getLeftEye() - er = self.enviroDR.getRightEye() - el.setSort(-8) - ml.setSort(-6) - er.setSort(-4) - er.setClearDepthActive(True) - mr.setSort(-2) - mr.setClearDepthActive(False) - else: - self.enviroDR = self.win.makeMonoDisplayRegion() - if mainDR.isStereo(): - self.win.removeDisplayRegion(mainDR) - mainDR = self.win.makeMonoDisplayRegion() - mainDR.setCamera(self.cam) - self.enviroDR.setSort(-10) - self.enviroDR.setClearColor(clearColor) - self.win.setClearColor(clearColor) - self.enviroDR.setCamera(self.enviroCam) - self.enviroCamNode = self.enviroCam.node() - self.enviroCamNode.setLens(self.cam.node().getLens()) - self.enviroCamNode.setCameraMask(OTPRender.EnviroCameraBitmask) - render.hide(OTPRender.EnviroCameraBitmask) - self.camList.append(self.enviroCam) - self.backgroundDrawable = self.enviroDR - self.enviroDR.setTextureReloadPriority(-10) - if self.pixelZoomSetup: - self.setupAutoPixelZoom() - - def setupAutoPixelZoom(self): - self.win.setPixelZoom(1) - self.enviroDR.setPixelZoom(1) - if not self.stereoEnabled: - self.enviroDR.setClearColorActive(True) - self.enviroDR.setClearDepthActive(True) - self.win.setClearColorActive(False) - self.win.setClearDepthActive(False) - self.backgroundDrawable = self.enviroDR - else: - self.enviroDR.setClearColorActive(False) - self.enviroDR.setClearDepthActive(False) - self.enviroDR.getRightEye().setClearDepthActive(True) - self.win.setClearColorActive(True) - self.win.setClearDepthActive(True) - self.backgroundDrawable = self.win - self.pixelZoomSetup = True - self.targetPixelZoom = 1.0 - self.pixelZoomTask = None - self.pixelZoomCamHistory = 2.0 - self.pixelZoomCamMovedList = [] - self.pixelZoomStarted = None - flag = self.config.GetBool('enable-pixel-zoom', True) - self.enablePixelZoom(flag) - return - - def enablePixelZoom(self, flag): - if not self.backgroundDrawable.supportsPixelZoom(): - flag = False - self.pixelZoomEnabled = flag - taskMgr.remove('chasePixelZoom') - if flag: - taskMgr.add(self.__chasePixelZoom, 'chasePixelZoom', priority=-52) - else: - self.backgroundDrawable.setPixelZoom(1) - - def __chasePixelZoom(self, task): - now = globalClock.getFrameTime() - pos = base.cam.getNetTransform().getPos() - prevPos = base.cam.getNetPrevTransform().getPos() - d2 = (pos - prevPos).lengthSquared() - if d2: - d = math.sqrt(d2) - self.pixelZoomCamMovedList.append((now, d)) - while self.pixelZoomCamMovedList and self.pixelZoomCamMovedList[0][0] < now - self.pixelZoomCamHistory: - del self.pixelZoomCamMovedList[0] - - dist = sum(map(lambda pair: pair[1], self.pixelZoomCamMovedList)) - speed = dist / self.pixelZoomCamHistory - if speed < 5: - self.backgroundDrawable.setPixelZoom(4) - self.pixelZoomStart = None - elif speed > 10: - if self.pixelZoomStart == None: - self.pixelZoomStart = now - elapsed = now - self.pixelZoomStart - if elapsed > 10: - self.backgroundDrawable.setPixelZoom(16) - elif elapsed > 5: - self.backgroundDrawable.setPixelZoom(8) - return task.cont - - def getShardPopLimits(self): - return (100, 200, -1) + base.cam.node().setCameraMask(OTPRender.MainCameraBitmask) + taskMgr.setupTaskChain('net', numThreads=1, frameBudget=0.001, threadPriority=TPLow) def getRepository(self): return self.cr - def openMainWindow(self, *args, **kw): - result = ShowBase.openMainWindow(self, *args, **kw) - if result: - self.wantEnviroDR = not self.win.getGsg().isHardware() or config.GetBool('want-background-region', 1) - self.backgroundDrawable = self.win - return result - def run(self): try: taskMgr.run() diff --git a/otp/otpbase/OTPLocalizerEnglish.py b/otp/otpbase/OTPLocalizerEnglish.py index 490d7151..26bdaaa2 100755 --- a/otp/otpbase/OTPLocalizerEnglish.py +++ b/otp/otpbase/OTPLocalizerEnglish.py @@ -621,7 +621,7 @@ SuitFaceoffTaunts = {'b': ['Do you have a donation for me?', 'Would you like some hand-me-downs?', 'Let me show you some of my handiwork.', 'I think the handwriting is on the wall.', - "I'll gladly handle your gags for you"], + "I'll gladly handle your gags for you."], 'sc': ['I will make short work of you.', "You're about to have money trouble.", "You're about to be overcharged.", diff --git a/otp/otpbase/OTPRender.py b/otp/otpbase/OTPRender.py index fee55ca5..ecb99b74 100755 --- a/otp/otpbase/OTPRender.py +++ b/otp/otpbase/OTPRender.py @@ -4,7 +4,6 @@ ReflectionCameraBitmask = BitMask32.bit(1) ShadowCameraBitmask = BitMask32.bit(2) SkyReflectionCameraBitmask = BitMask32.bit(3) GlowCameraBitmask = BitMask32.bit(4) -EnviroCameraBitmask = BitMask32.bit(5) def setCameraBitmask(default, node_path, camera_bitmask, tag = None, tag_function = None, context = None): if node_path: diff --git a/toontown/coderedemption/TTCodeRedemptionMgrAI.py b/toontown/coderedemption/TTCodeRedemptionMgrAI.py index 9722c418..331757e4 100755 --- a/toontown/coderedemption/TTCodeRedemptionMgrAI.py +++ b/toontown/coderedemption/TTCodeRedemptionMgrAI.py @@ -110,8 +110,6 @@ class TTCodeRedemptionMgrAI(DistributedObjectAI): self.air.writeServerEvent('suspicious', avId, 'Toon tried to redeem non-existent code %s' % code) def requestCodeRedeem(self, avId, av, items): - count = self.getMailboxCount(items) - if len(av.mailboxContents) + len(av.onOrder) + len(av.onGiftOrder) + len(items) >= ToontownGlobals.MaxMailboxContents: self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [3]) return diff --git a/toontown/suit/BossCog.py b/toontown/suit/BossCog.py index 3b88fd12..f20276ad 100755 --- a/toontown/suit/BossCog.py +++ b/toontown/suit/BossCog.py @@ -34,7 +34,7 @@ class BossCog(Avatar.Avatar): def __init__(self): Avatar.Avatar.__init__(self) self.setFont(ToontownGlobals.getSuitFont()) - self.setSpeechFont(ToontownGlobals.getSuitFont()) + self.nametag.setSpeechFont(ToontownGlobals.getSuitFont()) self.setPlayerType(NametagGroup.CCSuit) self.setPickable(0) self.doorA = None diff --git a/toontown/suit/Suit.py b/toontown/suit/Suit.py index bd5afc57..f2b734f5 100755 --- a/toontown/suit/Suit.py +++ b/toontown/suit/Suit.py @@ -333,7 +333,7 @@ class Suit(Avatar.Avatar): Avatar.Avatar.__init__(self) self.setFont(ToontownGlobals.getSuitFont()) - self.setSpeechFont(ToontownGlobals.getSuitFont()) + self.nametag.setSpeechFont(ToontownGlobals.getSuitFont()) self.setPlayerType(NametagGroup.CCSuit) self.setPickable(1) self.leftHand = None diff --git a/toontown/toon/DistributedToon.py b/toontown/toon/DistributedToon.py index f76edb17..05594372 100755 --- a/toontown/toon/DistributedToon.py +++ b/toontown/toon/DistributedToon.py @@ -2056,10 +2056,6 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute def setChatAbsolute(self, chatString, chatFlags, dialogue = None, interrupt = 1, quiet = 0): DistributedAvatar.DistributedAvatar.setChatAbsolute(self, chatString, chatFlags, dialogue, interrupt) - def setChatMuted(self, chatString, chatFlags, dialogue=None, interrupt=1, quiet=0): - self.nametag.setChat(chatString, chatFlags) - self.playCurrentDialogue(dialogue, chatFlags - CFSpeech, interrupt) - def displayTalk(self, chatString): flags = CFSpeech | CFTimeout if ChatUtil.isThought(chatString): diff --git a/toontown/toon/Toon.py b/toontown/toon/Toon.py index 67ad6e52..4c1e369c 100755 --- a/toontown/toon/Toon.py +++ b/toontown/toon/Toon.py @@ -453,7 +453,7 @@ class Toon(Avatar.Avatar, ToonHead): self.partyHat = None self.setTag('pieCode', str(ToontownGlobals.PieCodeToon)) self.setFont(ToontownGlobals.getToonFont()) - self.setSpeechFont(ToontownGlobals.getToonFont()) + self.nametag.setSpeechFont(ToontownGlobals.getToonFont()) self.soundChatBubble = base.loadSfx('phase_3/audio/sfx/GUI_balloon_popup.ogg') self.swimRunSfx = base.loadSfx('phase_4/audio/sfx/AV_footstep_runloop_water.ogg') self.swimRunLooping = False @@ -2748,7 +2748,7 @@ class Toon(Avatar.Avatar, ToonHead): self.suit.loop('neutral') self.isDisguised = 1 self.setFont(ToontownGlobals.getSuitFont()) - self.setSpeechFont(ToontownGlobals.getSuitFont()) + self.nametag.setSpeechFont(ToontownGlobals.getSuitFont()) if setDisplayName: if hasattr(base, 'idTags') and base.idTags: name = self.getAvIdName() @@ -2782,7 +2782,7 @@ class Toon(Avatar.Avatar, ToonHead): Emote.globalEmote.releaseAll(self) self.isDisguised = 0 self.setFont(ToontownGlobals.getToonFont()) - self.setSpeechFont(ToontownGlobals.getToonFont()) + self.nametag.setSpeechFont(ToontownGlobals.getToonFont()) self.nametag.setWordwrap(None) if hasattr(base, 'idTags') and base.idTags: name = self.getAvIdName() diff --git a/toontown/toonbase/ToonBase.py b/toontown/toonbase/ToonBase.py index 3b62fa8c..e4aa8e80 100755 --- a/toontown/toonbase/ToonBase.py +++ b/toontown/toonbase/ToonBase.py @@ -147,9 +147,6 @@ class ToonBase(OTPBase.OTPBase): self.setCursorAndIcon() return result - def windowEvent(self, win): - OTPBase.OTPBase.windowEvent(self, win) - def setCursorAndIcon(self): tempdir = tempfile.mkdtemp() atexit.register(shutil.rmtree, tempdir) @@ -419,13 +416,6 @@ class ToonBase(OTPBase.OTPBase): self.cr.sendDisconnect() sys.exit() - def getShardPopLimits(self): - return ( - config.GetInt('shard-low-pop', ToontownGlobals.LOW_POP), - config.GetInt('shard-mid-pop', ToontownGlobals.MID_POP), - config.GetInt('shard-high-pop', ToontownGlobals.HIGH_POP) - ) - def playMusic(self, music, looping = 0, interrupt = 1, volume = None, time = 0.0): OTPBase.OTPBase.playMusic(self, music, looping, interrupt, volume, time) From 18f600b593c64426d431a6e6745961105d4210af Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 03:00:24 +0300 Subject: [PATCH 044/161] RIP Pillows --- dependencies/astron/dclass/stride.dc | 4 - toontown/hood/DLHoodAI.py | 10 +-- toontown/safezone/DistributedPillow.py | 95 ------------------------ toontown/safezone/DistributedPillowAI.py | 13 ---- 4 files changed, 2 insertions(+), 120 deletions(-) delete mode 100644 toontown/safezone/DistributedPillow.py delete mode 100644 toontown/safezone/DistributedPillowAI.py diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 3899febc..221a1099 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -180,7 +180,6 @@ dclass FriendManager : DistributedObject { from toontown.building import DistributedAnimatedProp/AI from toontown.toon import DistributedToon/AI/UD from toontown.safezone import DistributedTrolley/AI -from toontown.safezone import DistributedPillow/AI from toontown.safezone import DistributedPartyGate/AI from toontown.suit import DistributedSuitPlanner/AI from toontown.suit import DistributedSuitBase/AI @@ -770,9 +769,6 @@ dclass DistributedTrolley : DistributedObject { setMinigameZone(uint32, uint16); }; -dclass DistributedPillow : DistributedObject { -}; - dclass DistributedSuitPlanner : DistributedObject { setZoneId(uint32) required broadcast ram; suitListQuery() airecv clsend; diff --git a/toontown/hood/DLHoodAI.py b/toontown/hood/DLHoodAI.py index 905311e1..2ee55fa2 100755 --- a/toontown/hood/DLHoodAI.py +++ b/toontown/hood/DLHoodAI.py @@ -1,5 +1,5 @@ from toontown.hood import HoodAI -from toontown.safezone import DistributedTrolleyAI, DistributedPillowAI +from toontown.safezone import DistributedTrolleyAI from toontown.toonbase import ToontownGlobals from toontown.ai import DistributedResistanceEmoteMgrAI from toontown.ai import DistributedEffectMgrAI @@ -29,13 +29,7 @@ class DLHoodAI(HoodAI.HoodAI): self.winterCarolingMgr = DistributedEffectMgrAI.DistributedEffectMgrAI(self.air, ToontownGlobals.CHRISTMAS, 14) self.winterCarolingMgr.generateWithRequired(9722) # Dream On Talent Agency, Pajama Place - self.createPillow() - def createTrolley(self): self.trolley = DistributedTrolleyAI.DistributedTrolleyAI(self.air) self.trolley.generateWithRequired(self.zoneId) - self.trolley.start() - - def createPillow(self): - self.pillow = DistributedPillowAI.DistributedPillowAI(self.air) - self.pillow.generateWithRequired(self.zoneId) + self.trolley.start() \ No newline at end of file diff --git a/toontown/safezone/DistributedPillow.py b/toontown/safezone/DistributedPillow.py deleted file mode 100644 index 104111f8..00000000 --- a/toontown/safezone/DistributedPillow.py +++ /dev/null @@ -1,95 +0,0 @@ -from panda3d.core import Point3, NodePath -from pandac.PandaModules import CollisionPolygon -from otp.otpbase import OTPGlobals -from direct.distributed.DistributedObject import DistributedObject -from direct.fsm import ClassicFSM, State -from toontown.toonbase import ToontownGlobals - -class DistributedPillow(DistributedObject): - - points = [ - Point3(-62.2896, 59.2746, -6.0), - Point3(-119.969, 59.2746, -6.0), - Point3(-67.1297, 55.2920, -1.6), - Point3(-120.063, 55.2920, -1.6), - Point3(-64.9566, 35.6930, 1.0), - Point3(-119.993, 35.6930, 1.0), - Point3(-63.4717, 0.00000, 1.6), - Point3(-119.670, 0.00000, 1.6), - Point3(-64.9566, -35.6930, 1.0), - Point3(-119.993, -35.6930, 1.0), - Point3(-67.1297, -55.2920, -1.6), - Point3(-120.063, -55.2920, -1.6), - Point3(-62.2896, -58.3746, -6.0), - Point3(-119.969, -58.3746, -6.0), - Point3(-104.100, 59.2746, -6.0), - Point3(-104.100, -58.3746, -6.0), - Point3(-104.100, 55.2920, -6.0), - Point3(-104.100, -55.2920, -6.0), - ] - polygons = [[0, 1, 3, 2], [2, 3, 5, 4], [4, 5, 7, 6], - [6, 7, 9, 8], [8, 9, 11, 10], [10, 11, 13, 12]] - walls = [[0, 2], [2, 4], [4, 6], [6, 8], [8, 10], [10, 12], - [3, 1], [5, 3], [7, 5], [9, 7], [11, 9], [13, 11], - [3, 16], [17, 11], [16, 14], [15, 17]] - - def __init__(self, cr): - DistributedObject.__init__(self, cr) - self.floorpolys = [] - self.wallpolys = [] - self.npaths = [] - self.np = None - - def generate(self): - DistributedObject.generate(self) - self.loader = self.cr.playGame.hood.loader - self.np = NodePath('Pillow') - self.np.reparentTo(render) - for point in DistributedPillow.polygons: - orderedPoints = [] - for index in point: - orderedPoints.append(DistributedPillow.points[index]) - self.floorpolys.append(CollisionPolygon(*orderedPoints)) - for n, p in enumerate(self.floorpolys): - polyNode = CollisionNode("FloorPoly-%d" % n) - polyNode.addSolid(p) - polyNode.setFromCollideMask(OTPGlobals.FloorBitmask) - polyNodePath = self.np.attachNewNode(polyNode) - self.npaths.append(polyNodePath) - self.accept("enterFloorPoly-%d" % n, self.gravityHigh) - self.accept("enterdonalds_dreamland", self.gravityLow) - for wall in DistributedPillow.walls: - ab = DistributedPillow.points[wall[0]] - bb = DistributedPillow.points[wall[1]] - cb = Point3(bb.getX(), bb.getY(), bb.getZ() + 20) - db = Point3(ab.getX(), ab.getY(), ab.getZ() + 20) - self.wallpolys.append(CollisionPolygon(ab, bb, cb, db)) - for n, p in enumerate(self.wallpolys): - polyNode = CollisionNode("WallPoly-%d" % n) - polyNode.addSolid(p) - polyNode.setFromCollideMask(OTPGlobals.FloorBitmask) - polyNodePath = self.np.attachNewNode(polyNode) - self.npaths.append(polyNodePath) - - def disable(self): - DistributedObject.disable(self) - self.floorpolys = [] - self.wallpolys = [] - self.npaths = [] - if self.np: - self.np.removeNode() - self.np = None - if hasattr(self, 'loader'): - del self.loader - - def delete(self): - if self.np: - self.np.removeNode() - self.np = None - DistributedObject.delete(self) - - def gravityLow(self, entry): - base.localAvatar.controlManager.currentControls.setGravity(ToontownGlobals.GravityValue * 1.25) - - def gravityHigh(self, entry): - base.localAvatar.controlManager.currentControls.setGravity(ToontownGlobals.GravityValue * 2.00) diff --git a/toontown/safezone/DistributedPillowAI.py b/toontown/safezone/DistributedPillowAI.py deleted file mode 100644 index d4c43bf9..00000000 --- a/toontown/safezone/DistributedPillowAI.py +++ /dev/null @@ -1,13 +0,0 @@ -from direct.distributed.DistributedObjectAI import DistributedObjectAI -from direct.fsm import ClassicFSM, State - -class DistributedPillowAI(DistributedObjectAI): - - def __init__(self, air): - DistributedObjectAI.__init__(self, air) - - def generate(self): - DistributedObjectAI.generate(self) - - def delete(self): - DistributedObjectAI.delete(self) From 0a248d7391df6e0937ad4b698f106465b9f55219 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 17 Jul 2015 20:02:41 -0400 Subject: [PATCH 045/161] crack babies --- otp/avatar/Avatar.py | 60 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/otp/avatar/Avatar.py b/otp/avatar/Avatar.py index 900b9ce0..58f5e4dd 100755 --- a/otp/avatar/Avatar.py +++ b/otp/avatar/Avatar.py @@ -309,17 +309,20 @@ class Avatar(Actor, ShadowCaster): self.playCurrentDialogue(dialogue, chatFlags, interrupt) def displayTalk(self, chatString): - if not base.localAvatar.isIgnored(self.doId): - self.clearChat() - if ChatUtil.isThought(chatString): - chatString = ChatUtil.removeThoughtPrefix(chatString) - self.nametag.setChat(chatString, CFThought) + if not base.cr.avatarFriendsManager.checkIgnored(self.doId): + if base.talkAssistant.isThought(chatString): + self.nametag.setChat(base.talkAssistant.removeThoughtPrefix(chatString), CFThought) else: self.nametag.setChat(chatString, CFSpeech | CFTimeout) def clearChat(self): self.nametag.clearChat() + def isInView(self): + pos = self.getPos(camera) + eyePos = Point3(pos[0], pos[1], pos[2] + self.getHeight()) + return base.camNode.isInView(eyePos) + def getNameVisible(self): return self.__nameVisible @@ -331,36 +334,30 @@ class Avatar(Actor, ShadowCaster): self.hideName() def hideName(self): - nametag3d = self.nametag.getNametag3d() - nametag3d.setContents(Nametag.CSpeech | Nametag.CThought) + self.nametag.getNametag3d().setContents(Nametag.CSpeech | Nametag.CThought) def showName(self): - if self.__nameVisible and (not self.ghostMode): - nametag3d = self.nametag.getNametag3d() - nametag3d.setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) + if self.__nameVisible and not self.ghostMode: + self.nametag.getNametag3d().setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) def hideNametag2d(self): - nametag2d = self.nametag.getNametag2d() self.nametag2dContents = 0 - nametag2d.setContents(self.nametag2dContents & self.nametag2dDist) + self.nametag.getNametag2d().setContents(self.nametag2dContents & self.nametag2dDist) def showNametag2d(self): - nametag2d = self.nametag.getNametag2d() self.nametag2dContents = self.nametag2dNormalContents if self.ghostMode: self.nametag2dContents = Nametag.CSpeech - nametag2d.setContents(self.nametag2dContents & self.nametag2dDist) + self.nametag.getNametag2d().setContents(self.nametag2dContents & self.nametag2dDist) def hideNametag3d(self): - nametag3d = self.nametag.getNametag3d() - nametag3d.setContents(0) + self.nametag.getNametag3d().setContents(0) def showNametag3d(self): - nametag3d = self.nametag.getNametag3d() - if self.__nameVisible and (not self.ghostMode): - nametag3d.setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) + if self.__nameVisible and not self.ghostMode: + self.nametag.getNametag3d().setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) else: - nametag3d.setContents(0) + self.nametag.getNametag3d().setContents(0) def setPickable(self, flag): self.nametag.setActive(flag) @@ -372,8 +369,7 @@ class Avatar(Actor, ShadowCaster): elif self.nametag.isActive(): messenger.send('clickedNametag', [self]) - def setPageChat(self, addressee, paragraph, message, quitButton, - extraChatFlags=None, dialogueList=[], pageButton=True): + def setPageChat(self, addressee, paragraph, message, quitButton, extraChatFlags = None, dialogueList = [], pageButton = True): self.__chatAddressee = addressee self.__chatPageNumber = None self.__chatParagraph = paragraph @@ -394,9 +390,9 @@ class Avatar(Actor, ShadowCaster): elif quitButton: self.__chatFlags |= CFQuitButton self.b_setPageNumber(self.__chatParagraph, 0) + return - def setLocalPageChat(self, message, quitButton, extraChatFlags=None, - dialogueList=[]): + def setLocalPageChat(self, message, quitButton, extraChatFlags = None, dialogueList = []): self.__chatAddressee = base.localAvatar.doId self.__chatPageNumber = None self.__chatParagraph = None @@ -420,9 +416,10 @@ class Avatar(Actor, ShadowCaster): self.clearChat() self.setChatAbsolute(message, self.__chatFlags, dialogue) self.setPageNumber(None, 0) + return - def setPageNumber(self, paragraph, pageNumber, timestamp=None): - if timestamp is None: + def setPageNumber(self, paragraph, pageNumber, timestamp = None): + if timestamp == None: elapsed = 0.0 else: elapsed = ClockDelta.globalClockDelta.localElapsedTime(timestamp) @@ -437,11 +434,10 @@ class Avatar(Actor, ShadowCaster): messenger.send('nextChatPage', [pageNumber, elapsed]) else: messenger.send('doneChatPage', [elapsed]) + return def advancePageNumber(self): - if (self.__chatAddressee == base.localAvatar.doId) and ( - self.__chatPageNumber is not None) and ( - self.__chatPageNumber[0] == self.__chatParagraph): + if self.__chatAddressee == base.localAvatar.doId and self.__chatPageNumber != None and self.__chatPageNumber[0] == self.__chatParagraph: pageNumber = self.__chatPageNumber[1] if pageNumber >= 0: pageNumber += 1 @@ -451,10 +447,10 @@ class Avatar(Actor, ShadowCaster): self.setPageNumber(self.__chatParagraph, pageNumber) else: self.b_setPageNumber(self.__chatParagraph, pageNumber) + return def __updatePageChat(self): - if (self.__chatPageNumber is not None) and ( - self.__chatPageNumber[0] == self.__chatParagraph): + if self.__chatPageNumber != None and self.__chatPageNumber[0] == self.__chatParagraph: pageNumber = self.__chatPageNumber[1] if pageNumber >= 0: if not self.__chatSet: @@ -476,6 +472,7 @@ class Avatar(Actor, ShadowCaster): self.clearChat() else: self.clearChat() + return def getAirborneHeight(self): height = self.getPos(self.shadowPlacer.shadowNodePath) @@ -494,6 +491,7 @@ class Avatar(Actor, ShadowCaster): if self.nametagNodePath: self.nametagNodePath.removeNode() self.nametagNodePath = None + return def initializeBodyCollisions(self, collIdStr): self.collTube = CollisionTube(0, 0, 0.5, 0, 0, self.height - self.getRadius(), self.getRadius()) From 534f63df23c9a23591e98ba01f06982093ed3533 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Fri, 17 Jul 2015 20:14:41 -0400 Subject: [PATCH 046/161] Revert "crack babies" This reverts commit 0a248d7391df6e0937ad4b698f106465b9f55219. --- otp/avatar/Avatar.py | 60 +++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/otp/avatar/Avatar.py b/otp/avatar/Avatar.py index 58f5e4dd..900b9ce0 100755 --- a/otp/avatar/Avatar.py +++ b/otp/avatar/Avatar.py @@ -309,20 +309,17 @@ class Avatar(Actor, ShadowCaster): self.playCurrentDialogue(dialogue, chatFlags, interrupt) def displayTalk(self, chatString): - if not base.cr.avatarFriendsManager.checkIgnored(self.doId): - if base.talkAssistant.isThought(chatString): - self.nametag.setChat(base.talkAssistant.removeThoughtPrefix(chatString), CFThought) + if not base.localAvatar.isIgnored(self.doId): + self.clearChat() + if ChatUtil.isThought(chatString): + chatString = ChatUtil.removeThoughtPrefix(chatString) + self.nametag.setChat(chatString, CFThought) else: self.nametag.setChat(chatString, CFSpeech | CFTimeout) def clearChat(self): self.nametag.clearChat() - def isInView(self): - pos = self.getPos(camera) - eyePos = Point3(pos[0], pos[1], pos[2] + self.getHeight()) - return base.camNode.isInView(eyePos) - def getNameVisible(self): return self.__nameVisible @@ -334,30 +331,36 @@ class Avatar(Actor, ShadowCaster): self.hideName() def hideName(self): - self.nametag.getNametag3d().setContents(Nametag.CSpeech | Nametag.CThought) + nametag3d = self.nametag.getNametag3d() + nametag3d.setContents(Nametag.CSpeech | Nametag.CThought) def showName(self): - if self.__nameVisible and not self.ghostMode: - self.nametag.getNametag3d().setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) + if self.__nameVisible and (not self.ghostMode): + nametag3d = self.nametag.getNametag3d() + nametag3d.setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) def hideNametag2d(self): + nametag2d = self.nametag.getNametag2d() self.nametag2dContents = 0 - self.nametag.getNametag2d().setContents(self.nametag2dContents & self.nametag2dDist) + nametag2d.setContents(self.nametag2dContents & self.nametag2dDist) def showNametag2d(self): + nametag2d = self.nametag.getNametag2d() self.nametag2dContents = self.nametag2dNormalContents if self.ghostMode: self.nametag2dContents = Nametag.CSpeech - self.nametag.getNametag2d().setContents(self.nametag2dContents & self.nametag2dDist) + nametag2d.setContents(self.nametag2dContents & self.nametag2dDist) def hideNametag3d(self): - self.nametag.getNametag3d().setContents(0) + nametag3d = self.nametag.getNametag3d() + nametag3d.setContents(0) def showNametag3d(self): - if self.__nameVisible and not self.ghostMode: - self.nametag.getNametag3d().setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) + nametag3d = self.nametag.getNametag3d() + if self.__nameVisible and (not self.ghostMode): + nametag3d.setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) else: - self.nametag.getNametag3d().setContents(0) + nametag3d.setContents(0) def setPickable(self, flag): self.nametag.setActive(flag) @@ -369,7 +372,8 @@ class Avatar(Actor, ShadowCaster): elif self.nametag.isActive(): messenger.send('clickedNametag', [self]) - def setPageChat(self, addressee, paragraph, message, quitButton, extraChatFlags = None, dialogueList = [], pageButton = True): + def setPageChat(self, addressee, paragraph, message, quitButton, + extraChatFlags=None, dialogueList=[], pageButton=True): self.__chatAddressee = addressee self.__chatPageNumber = None self.__chatParagraph = paragraph @@ -390,9 +394,9 @@ class Avatar(Actor, ShadowCaster): elif quitButton: self.__chatFlags |= CFQuitButton self.b_setPageNumber(self.__chatParagraph, 0) - return - def setLocalPageChat(self, message, quitButton, extraChatFlags = None, dialogueList = []): + def setLocalPageChat(self, message, quitButton, extraChatFlags=None, + dialogueList=[]): self.__chatAddressee = base.localAvatar.doId self.__chatPageNumber = None self.__chatParagraph = None @@ -416,10 +420,9 @@ class Avatar(Actor, ShadowCaster): self.clearChat() self.setChatAbsolute(message, self.__chatFlags, dialogue) self.setPageNumber(None, 0) - return - def setPageNumber(self, paragraph, pageNumber, timestamp = None): - if timestamp == None: + def setPageNumber(self, paragraph, pageNumber, timestamp=None): + if timestamp is None: elapsed = 0.0 else: elapsed = ClockDelta.globalClockDelta.localElapsedTime(timestamp) @@ -434,10 +437,11 @@ class Avatar(Actor, ShadowCaster): messenger.send('nextChatPage', [pageNumber, elapsed]) else: messenger.send('doneChatPage', [elapsed]) - return def advancePageNumber(self): - if self.__chatAddressee == base.localAvatar.doId and self.__chatPageNumber != None and self.__chatPageNumber[0] == self.__chatParagraph: + if (self.__chatAddressee == base.localAvatar.doId) and ( + self.__chatPageNumber is not None) and ( + self.__chatPageNumber[0] == self.__chatParagraph): pageNumber = self.__chatPageNumber[1] if pageNumber >= 0: pageNumber += 1 @@ -447,10 +451,10 @@ class Avatar(Actor, ShadowCaster): self.setPageNumber(self.__chatParagraph, pageNumber) else: self.b_setPageNumber(self.__chatParagraph, pageNumber) - return def __updatePageChat(self): - if self.__chatPageNumber != None and self.__chatPageNumber[0] == self.__chatParagraph: + if (self.__chatPageNumber is not None) and ( + self.__chatPageNumber[0] == self.__chatParagraph): pageNumber = self.__chatPageNumber[1] if pageNumber >= 0: if not self.__chatSet: @@ -472,7 +476,6 @@ class Avatar(Actor, ShadowCaster): self.clearChat() else: self.clearChat() - return def getAirborneHeight(self): height = self.getPos(self.shadowPlacer.shadowNodePath) @@ -491,7 +494,6 @@ class Avatar(Actor, ShadowCaster): if self.nametagNodePath: self.nametagNodePath.removeNode() self.nametagNodePath = None - return def initializeBodyCollisions(self, collIdStr): self.collTube = CollisionTube(0, 0, 0.5, 0, 0, self.height - self.getRadius(), self.getRadius()) From 5d8bcfc5005d15b59f00b9a333859e44221feb1a Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 03:14:45 +0300 Subject: [PATCH 047/161] Revert "crack babies" This reverts commit 0a248d7391df6e0937ad4b698f106465b9f55219. --- otp/avatar/Avatar.py | 60 +++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/otp/avatar/Avatar.py b/otp/avatar/Avatar.py index 58f5e4dd..900b9ce0 100755 --- a/otp/avatar/Avatar.py +++ b/otp/avatar/Avatar.py @@ -309,20 +309,17 @@ class Avatar(Actor, ShadowCaster): self.playCurrentDialogue(dialogue, chatFlags, interrupt) def displayTalk(self, chatString): - if not base.cr.avatarFriendsManager.checkIgnored(self.doId): - if base.talkAssistant.isThought(chatString): - self.nametag.setChat(base.talkAssistant.removeThoughtPrefix(chatString), CFThought) + if not base.localAvatar.isIgnored(self.doId): + self.clearChat() + if ChatUtil.isThought(chatString): + chatString = ChatUtil.removeThoughtPrefix(chatString) + self.nametag.setChat(chatString, CFThought) else: self.nametag.setChat(chatString, CFSpeech | CFTimeout) def clearChat(self): self.nametag.clearChat() - def isInView(self): - pos = self.getPos(camera) - eyePos = Point3(pos[0], pos[1], pos[2] + self.getHeight()) - return base.camNode.isInView(eyePos) - def getNameVisible(self): return self.__nameVisible @@ -334,30 +331,36 @@ class Avatar(Actor, ShadowCaster): self.hideName() def hideName(self): - self.nametag.getNametag3d().setContents(Nametag.CSpeech | Nametag.CThought) + nametag3d = self.nametag.getNametag3d() + nametag3d.setContents(Nametag.CSpeech | Nametag.CThought) def showName(self): - if self.__nameVisible and not self.ghostMode: - self.nametag.getNametag3d().setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) + if self.__nameVisible and (not self.ghostMode): + nametag3d = self.nametag.getNametag3d() + nametag3d.setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) def hideNametag2d(self): + nametag2d = self.nametag.getNametag2d() self.nametag2dContents = 0 - self.nametag.getNametag2d().setContents(self.nametag2dContents & self.nametag2dDist) + nametag2d.setContents(self.nametag2dContents & self.nametag2dDist) def showNametag2d(self): + nametag2d = self.nametag.getNametag2d() self.nametag2dContents = self.nametag2dNormalContents if self.ghostMode: self.nametag2dContents = Nametag.CSpeech - self.nametag.getNametag2d().setContents(self.nametag2dContents & self.nametag2dDist) + nametag2d.setContents(self.nametag2dContents & self.nametag2dDist) def hideNametag3d(self): - self.nametag.getNametag3d().setContents(0) + nametag3d = self.nametag.getNametag3d() + nametag3d.setContents(0) def showNametag3d(self): - if self.__nameVisible and not self.ghostMode: - self.nametag.getNametag3d().setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) + nametag3d = self.nametag.getNametag3d() + if self.__nameVisible and (not self.ghostMode): + nametag3d.setContents(Nametag.CName | Nametag.CSpeech | Nametag.CThought) else: - self.nametag.getNametag3d().setContents(0) + nametag3d.setContents(0) def setPickable(self, flag): self.nametag.setActive(flag) @@ -369,7 +372,8 @@ class Avatar(Actor, ShadowCaster): elif self.nametag.isActive(): messenger.send('clickedNametag', [self]) - def setPageChat(self, addressee, paragraph, message, quitButton, extraChatFlags = None, dialogueList = [], pageButton = True): + def setPageChat(self, addressee, paragraph, message, quitButton, + extraChatFlags=None, dialogueList=[], pageButton=True): self.__chatAddressee = addressee self.__chatPageNumber = None self.__chatParagraph = paragraph @@ -390,9 +394,9 @@ class Avatar(Actor, ShadowCaster): elif quitButton: self.__chatFlags |= CFQuitButton self.b_setPageNumber(self.__chatParagraph, 0) - return - def setLocalPageChat(self, message, quitButton, extraChatFlags = None, dialogueList = []): + def setLocalPageChat(self, message, quitButton, extraChatFlags=None, + dialogueList=[]): self.__chatAddressee = base.localAvatar.doId self.__chatPageNumber = None self.__chatParagraph = None @@ -416,10 +420,9 @@ class Avatar(Actor, ShadowCaster): self.clearChat() self.setChatAbsolute(message, self.__chatFlags, dialogue) self.setPageNumber(None, 0) - return - def setPageNumber(self, paragraph, pageNumber, timestamp = None): - if timestamp == None: + def setPageNumber(self, paragraph, pageNumber, timestamp=None): + if timestamp is None: elapsed = 0.0 else: elapsed = ClockDelta.globalClockDelta.localElapsedTime(timestamp) @@ -434,10 +437,11 @@ class Avatar(Actor, ShadowCaster): messenger.send('nextChatPage', [pageNumber, elapsed]) else: messenger.send('doneChatPage', [elapsed]) - return def advancePageNumber(self): - if self.__chatAddressee == base.localAvatar.doId and self.__chatPageNumber != None and self.__chatPageNumber[0] == self.__chatParagraph: + if (self.__chatAddressee == base.localAvatar.doId) and ( + self.__chatPageNumber is not None) and ( + self.__chatPageNumber[0] == self.__chatParagraph): pageNumber = self.__chatPageNumber[1] if pageNumber >= 0: pageNumber += 1 @@ -447,10 +451,10 @@ class Avatar(Actor, ShadowCaster): self.setPageNumber(self.__chatParagraph, pageNumber) else: self.b_setPageNumber(self.__chatParagraph, pageNumber) - return def __updatePageChat(self): - if self.__chatPageNumber != None and self.__chatPageNumber[0] == self.__chatParagraph: + if (self.__chatPageNumber is not None) and ( + self.__chatPageNumber[0] == self.__chatParagraph): pageNumber = self.__chatPageNumber[1] if pageNumber >= 0: if not self.__chatSet: @@ -472,7 +476,6 @@ class Avatar(Actor, ShadowCaster): self.clearChat() else: self.clearChat() - return def getAirborneHeight(self): height = self.getPos(self.shadowPlacer.shadowNodePath) @@ -491,7 +494,6 @@ class Avatar(Actor, ShadowCaster): if self.nametagNodePath: self.nametagNodePath.removeNode() self.nametagNodePath = None - return def initializeBodyCollisions(self, collIdStr): self.collTube = CollisionTube(0, 0, 0.5, 0, 0, self.height - self.getRadius(), self.getRadius()) From 25f782d54944424894787f4beb110256bc078cfa Mon Sep 17 00:00:00 2001 From: John Cote Date: Sat, 18 Jul 2015 02:52:06 -0400 Subject: [PATCH 048/161] chicken --- kfc.bucket | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 kfc.bucket diff --git a/kfc.bucket b/kfc.bucket deleted file mode 100644 index e69de29b..00000000 From 071d59f4d08f85d16370161cc18b132bfd93a7f0 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 11:21:53 +0300 Subject: [PATCH 049/161] Leaderboard fix + ~race finish magic word --- toontown/racing/DistributedRace.py | 14 +++++++++----- toontown/racing/LeaderboardMgrAI.py | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/toontown/racing/DistributedRace.py b/toontown/racing/DistributedRace.py index 000069d5..7293057e 100755 --- a/toontown/racing/DistributedRace.py +++ b/toontown/racing/DistributedRace.py @@ -74,6 +74,7 @@ class DistributedRace(DistributedObject.DistributedObject): self.bananaSound = base.loadSfx('phase_6/audio/sfx/KART_tossBanana.ogg') self.anvilFall = base.loadSfx('phase_6/audio/sfx/KART_Gag_Hit_Anvil.ogg') self.accept('leaveRace', self.leaveRace) + self.accept('finishRace', self.finishRace) self.toonsToLink = [] self.curveTs = [] self.curvePoints = [] @@ -569,11 +570,7 @@ class DistributedRace(DistributedObject.DistributedObject): now = globalClock.getFrameTime() timestamp = globalClockDelta.localToNetworkTime(now) if self.laps == self.lapCount: - self.sendUpdate('heresMyT', [localAvatar.doId, - self.laps, - self.currLapT, - timestamp]) - self.fsm.request('finished') + self.finishRace() if self.laps > self.maxLap: self.maxLap = self.laps self.sendUpdate('heresMyT', [localAvatar.doId, @@ -1088,6 +1085,10 @@ class DistributedRace(DistributedObject.DistributedObject): def leaveRace(self): self.fsm.request('leave') + + def finishRace(self): + self.sendUpdate('heresMyT', [localAvatar.doId, self.lapCount, self.currLapT, globalClockDelta.localToNetworkTime(globalClock.getFrameTime())]) + self.fsm.request('finished') def racerLeft(self, avId): if avId != localAvatar.doId: @@ -1243,4 +1244,7 @@ def race(command): if command == 'leave': messenger.send('leaveRace') return 'You left the race!' + elif command == 'finish': + messenger.send('finishRace') + return 'You finished the race!' return 'Invalid command!' diff --git a/toontown/racing/LeaderboardMgrAI.py b/toontown/racing/LeaderboardMgrAI.py index aebbd059..682dac40 100644 --- a/toontown/racing/LeaderboardMgrAI.py +++ b/toontown/racing/LeaderboardMgrAI.py @@ -31,14 +31,14 @@ class LeaderboardMgrAI: originalRace = self.database[race][1] newRace = list(originalRace) - newRace.append((name, timestamp)) + newRace.append([name, timestamp]) sortedRace = self.trimList(sorted(newRace, key=operator.itemgetter(1))) if originalRace != sortedRace: self.database[race][1] = sortedRace self.saveDatabase() else: - self.database[race] = (time.time(), [(name, timestamp)]) + self.database[race] = [time.time(), [(name, timestamp)]] self.saveDatabase() @magicWord(category=CATEGORY_PROGRAMMER, types=[str, int, int, str, int]) From 2c451321b2357056bd53996df065b3c949328a51 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Jul 2015 15:25:47 +0300 Subject: [PATCH 050/161] nametags: Removed a few unused nametags, added boardinggroup and battlesos color, fixed toon statue selection GUI, doodles now have green nametags. --- otp/avatar/Avatar.py | 2 +- otp/nametag/NametagConstants.py | 76 +++++++++-------------- otp/nametag/NametagGroup.py | 2 - toontown/estate/ToonStatueSelectionGUI.py | 11 +--- toontown/pets/Pet.py | 2 +- 5 files changed, 36 insertions(+), 57 deletions(-) diff --git a/otp/avatar/Avatar.py b/otp/avatar/Avatar.py index 900b9ce0..8190ad90 100755 --- a/otp/avatar/Avatar.py +++ b/otp/avatar/Avatar.py @@ -102,7 +102,7 @@ class Avatar(Actor, ShadowCaster): if self.isUnderstandable(): self.nametag.setColorCode(self.playerType) else: - self.nametag.setColorCode(NametagGroup.CCNoChat) + self.nametag.setColorCode(NametagGroup.CCNonPlayer) self.setNametagName() def considerUnderstandable(self): diff --git a/otp/nametag/NametagConstants.py b/otp/nametag/NametagConstants.py index 7accb974..b702f90b 100644 --- a/otp/nametag/NametagConstants.py +++ b/otp/nametag/NametagConstants.py @@ -9,15 +9,13 @@ CFThought=2 CFTimeout=8 CCNormal = 0 -CCNoChat = 1 -CCNonPlayer = 2 -CCSuit = 3 -CCToonBuilding = 4 -CCSuitBuilding = 5 -CCHouseBuilding = 6 -CCSpeedChat = 7 -CCFreeChat = 8 -CCAdmin = 9 +CCNonPlayer = 1 +CCSuit = 2 +CCToonBuilding = 3 +CCSuitBuilding = 4 +CCHouseBuilding = 5 +CCSpeedChat = 6 +CCAdmin = 7 NAMETAG_COLORS = { CCNormal: ( @@ -34,20 +32,6 @@ NAMETAG_COLORS = { ((0.3, 0.3, 0.7, 1.0), (0.8, 0.8, 0.8, 0.5), # Name (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat ), - CCNoChat: ( - # Normal FG BG - ((0.8, 0.4, 0.0, 1.0), (0.8, 0.8, 0.8, 0.5), # Name - (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - # Click FG BG - ((1.0, 0.5, 0.5, 1.0), (0.2, 0.2, 0.2, 0.6), # Name - (1.0, 0.5, 0.5, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - # Hover FG BG - ((1.0, 0.5, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0), # Name - (0.0, 0.6, 0.6, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - # Disable FG BG - ((0.8, 0.4, 0.0, 1.0), (0.8, 0.8, 0.8, 0.5), # Name - (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - ), CCNonPlayer: ( # Normal FG BG ((0.8, 0.4, 0.0, 1.0), (0.8, 0.8, 0.8, 0.5), # Name @@ -132,20 +116,6 @@ NAMETAG_COLORS = { ((0.0, 0.6, 0.2, 1.0), (0.8, 0.8, 0.8, 0.5), # Name (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat ), - CCFreeChat: ( - # Normal FG BG - ((0.3, 0.3, 0.7, 1.0), (0.8, 0.8, 0.8, 0.5), # Name - (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - # Click FG BG - ((0.2, 0.2, 0.5, 1.0), (0.2, 0.2, 0.2, 0.6), # Name - (1.0, 0.5, 0.5, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - # Hover FG BG - ((0.5, 0.5, 1.0, 1.0), (1.0, 1.0, 1.0, 1.0), # Name - (0.0, 0.6, 0.6, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - # Disable FG BG - ((0.3, 0.3, 0.7, 1.0), (0.8, 0.8, 0.8, 0.5), # Name - (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0, 1.0)), # Chat - ), CCAdmin: ( # Normal FG BG ((1.0, 0.35, 0.25, 1.0), (0.8, 0.8, 0.8, 0.5), # Name @@ -168,14 +138,12 @@ ARROW_COLORS = { DEFAULT_WORDWRAPS = { CCNormal: 7.5, - CCNoChat: 7.5, CCNonPlayer: 7.5, CCSuit: 7.5, CCToonBuilding: 8.5, CCSuitBuilding: 8.5, CCHouseBuilding: 10.0, CCSpeedChat: 7.5, - CCFreeChat: 7.5, CCAdmin: 7.5 } @@ -195,7 +163,7 @@ WHISPER_COLORS = { # Hover FG BG ((0.0, 0.0, 0.0, 1.0), (0.2, 0.7, 0.9, 0.6)), # Disable FG BG - ((0.0, 0.0, 0.0, 1.0), (0.2, 0.7, 0.8, 0.6)), + ((0.0, 0.0, 0.0, 1.0), (0.2, 0.7, 0.8, 0.6)) ), WTQuickTalker: ( # Normal FG BG @@ -205,7 +173,7 @@ WHISPER_COLORS = { # Hover FG BG ((0.0, 0.0, 0.0, 1.0), (0.2, 0.7, 0.9, 0.6)), # Disable FG BG - ((0.0, 0.0, 0.0, 1.0), (0.2, 0.7, 0.8, 0.6)), + ((0.0, 0.0, 0.0, 1.0), (0.2, 0.7, 0.8, 0.6)) ), WTSystem: ( # Normal FG BG @@ -215,9 +183,18 @@ WHISPER_COLORS = { # Hover FG BG ((0.0, 0.0, 0.0, 1.0), (0.8, 0.4, 1.0, 0.6)), # Disable FG BG - ((0.0, 0.0, 0.0, 1.0), (0.8, 0.3, 0.6, 0.6)), + ((0.0, 0.0, 0.0, 1.0), (0.8, 0.3, 0.6, 0.6)) + ), + WTBattleSOS: ( + # Normal FG BG + ((0.0, 0.0, 0.0, 1.0), (0.8, 0.3, 0.6, 0.6)), + # Click FG BG + ((1.0, 0.5, 0.5, 1.0), (1.0, 1.0, 1.0, 0.8)), + # Hover FG BG + ((0.0, 0.0, 0.0, 1.0), (0.8, 0.4, 0.0, 0.8)), + # Disable FG BG + ((0.0, 0.0, 0.0, 1.0), (0.8, 0.3, 0.6, 0.6)) ), - # TODO: WTBattleSOS WTEmote: ( # Normal FG BG ((0.0, 0.0, 0.0, 1.0), (0.9, 0.5, 0.1, 0.6)), @@ -226,9 +203,18 @@ WHISPER_COLORS = { # Hover FG BG ((0.0, 0.0, 0.0, 1.0), (0.9, 0.6, 0.2, 0.6)), # Disable FG BG - ((0.0, 0.0, 0.0, 1.0), (0.9, 0.6, 0.1, 0.6)), + ((0.0, 0.0, 0.0, 1.0), (0.9, 0.6, 0.1, 0.6)) ), - # TODO: WTToontownBoardingGroup + WTToontownBoardingGroup: ( + # Normal FG BG + ((0.0, 0.0, 0.0, 1.0), (0.9, 0.5, 0.1, 0.6)), + # Click FG BG + ((1.0, 0.5, 0.5, 1.0), (1.0, 1.0, 1.0, 0.8)), + # Hover FG BG + ((0.0, 0.0, 0.0, 1.0), (0.9, 0.6, 0.2, 0.6)), + # Disable FG BG + ((0.0, 0.0, 0.0, 1.0), (0.9, 0.6, 0.1, 0.6)) + ) } def getFriendColor(handle): diff --git a/otp/nametag/NametagGroup.py b/otp/nametag/NametagGroup.py index 8f0a3e4f..357d459b 100644 --- a/otp/nametag/NametagGroup.py +++ b/otp/nametag/NametagGroup.py @@ -5,14 +5,12 @@ from Nametag2d import * class NametagGroup: CCNormal = CCNormal - CCNoChat = CCNoChat CCNonPlayer = CCNonPlayer CCSuit = CCSuit CCToonBuilding = CCToonBuilding CCSuitBuilding = CCSuitBuilding CCHouseBuilding = CCHouseBuilding CCSpeedChat = CCSpeedChat - CCFreeChat = CCFreeChat CCAdmin = CCAdmin CHAT_TIMEOUT_MAX = 12.0 diff --git a/toontown/estate/ToonStatueSelectionGUI.py b/toontown/estate/ToonStatueSelectionGUI.py index 7fd5dcc1..0bfe95cf 100755 --- a/toontown/estate/ToonStatueSelectionGUI.py +++ b/toontown/estate/ToonStatueSelectionGUI.py @@ -9,7 +9,7 @@ from panda3d.core import * from toontown.estate import DistributedToonStatuary from toontown.estate import GardenGlobals from toontown.estate import PlantingGUI -from otp.nametag import NametagGlobals +from otp.nametag import NametagGlobals, NametagConstants from otp.nametag.NametagGroup import * from toontown.toon import DistributedToon from toontown.toon import Toon @@ -110,11 +110,7 @@ class ToonStatueSelectionGUI(DirectFrame): handle = base.cr.identifyFriend(friendId) if handle and not self.checkFamily(friendId): if hasattr(handle, 'getName'): - colorCode = CCSpeedChat - if flags & ToontownGlobals.FriendChat: - colorCode = CCFreeChat - newFF = (friendId, handle.getName(), colorCode) - self.ffList.append(newFF) + self.ffList.append((friendId, handle.getName(), NametagConstants.getFriendColor(handle))) else: self.notify.warning('Bad Handle for getName in makeFFlist') @@ -128,8 +124,7 @@ class ToonStatueSelectionGUI(DirectFrame): self.scrollList.refresh() def makeFamilyButton(self, familyId, familyName, colorCode): - fg = NametagGlobals.getNameFg(colorCode, PGButton.SInactive) - return DirectButton(relief=None, text=familyName, text_scale=0.04, text_align=TextNode.ALeft, text_fg=fg, text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, text3_fg=self.textDisabledColor, textMayChange=0, command=self.__chooseFriend, extraArgs=[familyId, familyName]) + return DirectButton(relief=None, text=familyName, text_scale=0.04, text_align=TextNode.ALeft, text_fg=NametagConstants.NAMETAG_COLORS[colorCode][0][0], text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, text3_fg=self.textDisabledColor, textMayChange=0, command=self.__chooseFriend, extraArgs=[familyId, familyName]) def __chooseFriend(self, friendId, friendName): messenger.send('wakeup') diff --git a/toontown/pets/Pet.py b/toontown/pets/Pet.py index 62e5c869..6ccaf0d8 100755 --- a/toontown/pets/Pet.py +++ b/toontown/pets/Pet.py @@ -46,7 +46,7 @@ class Pet(Avatar.Avatar): Pet.SerialNum += 1 self.lockedDown = 0 self.setPickable(1) - self.setPlayerType(NametagGroup.CCNonPlayer) + self.setPlayerType(NametagGroup.CCSpeedChat) self.animFSM = ClassicFSM('petAnimFSM', [State('off', self.enterOff, self.exitOff), State('neutral', self.enterNeutral, self.exitNeutral), State('neutralHappy', self.enterNeutralHappy, self.exitNeutralHappy), From 7505459b5974f45b40c58d879f6b2231e13588a7 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sat, 18 Jul 2015 12:17:05 -0400 Subject: [PATCH 051/161] Newer pet manager. --- toontown/pets/PetManagerAI.py | 55 ++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/toontown/pets/PetManagerAI.py b/toontown/pets/PetManagerAI.py index 79c03f7b..1e1f081f 100755 --- a/toontown/pets/PetManagerAI.py +++ b/toontown/pets/PetManagerAI.py @@ -1,67 +1,68 @@ +import PetUtil, PetDNA from toontown.toonbase import ToontownGlobals, TTLocalizer -import PetUtil, PetDNA, time, random +import time, random, os -DAY = 24 * 60 * 60 +MINUTE = 60 +HOUR = 60 * MINUTE +DAY = 24 * HOUR def getDayId(): - return int(time.time() / DAY) - + return int(time.time() // DAY) + class PetManagerAI: - NUM_DAILY_PETS = 10 - + NUM_DAILY_PETS = 5 # per hood + def __init__(self, air): self.air = air - self.seeds = simbase.backups.load('pet-seeds', (self.air.districtId,), default={}) - - if self.seeds.get('day', -1) != getDayId(): - self.generateSeeds() - + self.generateSeeds() + def generateSeeds(self): seeds = range(0, 255) - random.shuffle(seeds) - + random.Random(getDayId()).shuffle(seeds) + self.seeds = {} for hood in (ToontownGlobals.ToontownCentral, ToontownGlobals.DonaldsDock, ToontownGlobals.DaisyGardens, - ToontownGlobals.MinniesMelodyland, ToontownGlobals.TheBrrrgh, ToontownGlobals.DonaldsDreamland): - self.seeds[str(hood)] = [seeds.pop() for _ in xrange(self.NUM_DAILY_PETS)] - + ToontownGlobals.MinniesMelodyland, ToontownGlobals.TheBrrrgh, ToontownGlobals.DonaldsDreamland, + ToontownGlobals.FunnyFarm): + self.seeds[hood] = [seeds.pop() for _ in xrange(self.NUM_DAILY_PETS)] + self.seeds['day'] = getDayId() - simbase.backups.save('pet-seeds', (self.air.districtId,), self.seeds) - def getAvailablePets(self, safezoneId): + def getAvailablePets(self, seed, safezoneId): if self.seeds.get('day', -1) != getDayId(): self.generateSeeds() - - return self.seeds.get(str(safezoneId), [random.randint(0, 255)]) + + return list(set(self.seeds.get(safezoneId, [seed]))) def createNewPetFromSeed(self, avId, seed, nameIndex, gender, safeZoneId): av = self.air.doId2do[avId] - + name = TTLocalizer.getPetName(nameIndex) _, dna, traitSeed = PetUtil.getPetInfoFromSeed(seed, safeZoneId) head, ears, nose, tail, body, color, cs, eye, _ = dna numGenders = len(PetDNA.PetGenders) gender %= numGenders - + fields = {'setOwnerId' : avId, 'setPetName' : name, 'setTraitSeed' : traitSeed, 'setSafeZone' : safeZoneId, 'setHead' : head, 'setEars' : ears, 'setNose' : nose, 'setTail' : tail, 'setBodyTexture' : body, 'setColor' : color, 'setColorScale' : cs, 'setEyeColor' : eye, 'setGender' : gender} - + def response(doId): if not doId: self.air.notify.warning("Cannot create pet for %s!" % avId) return - + self.air.writeServerEvent('bought-pet', avId, doId) av.b_setPetId(doId) - + self.air.dbInterface.createObject(self.air.dbId, self.air.dclassesByName['DistributedPetAI'], {k: (v,) for k,v in fields.items()}, response) - + def deleteToonsPet(self, avId): av = self.air.doId2do[avId] pet = av.getPetId() if pet: if pet in self.air.doId2do: self.air.doId2do[pet].requestDelete() - av.b_setPetId(0) + + av.b_setPetId(0) \ No newline at end of file From 7cb50fc828e1ba77c7036ae218994ef5137b7590 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Sat, 18 Jul 2015 12:57:36 -0400 Subject: [PATCH 052/161] Mongo --- toontown/distributed/ToontownInternalRepository.py | 9 +++++++++ toontown/pets/PetManagerAI.py | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/toontown/distributed/ToontownInternalRepository.py b/toontown/distributed/ToontownInternalRepository.py index 3bf1b399..8a083f4b 100755 --- a/toontown/distributed/ToontownInternalRepository.py +++ b/toontown/distributed/ToontownInternalRepository.py @@ -17,6 +17,15 @@ class ToontownInternalRepository(AstronInternalRepository): def handleConnected(self): self.__messenger = ToontownNetMessengerAI(self) + if config.GetBool('want-mongo', False): + import pymongo + self.dbConn = pymongo.MongoClient(config.GetString('mongodb-url', 'localhost')) + self.dbGlobalCursor = self.dbConn.toontownstride + self.dbCursor = self.dbGlobalCursor['air-%d' % self.ourChannel] + else: + self.dbConn = None + self.dbGlobalCursor = None + self.dbCursor = None def sendNetEvent(self, message, sentArgs=[]): self.__messenger.send(message, sentArgs) diff --git a/toontown/pets/PetManagerAI.py b/toontown/pets/PetManagerAI.py index 1e1f081f..a7128304 100755 --- a/toontown/pets/PetManagerAI.py +++ b/toontown/pets/PetManagerAI.py @@ -28,11 +28,11 @@ class PetManagerAI: self.seeds['day'] = getDayId() - def getAvailablePets(self, seed, safezoneId): + def getAvailablePets(self, safezoneId): if self.seeds.get('day', -1) != getDayId(): self.generateSeeds() - return list(set(self.seeds.get(safezoneId, [seed]))) + return list(set(self.seeds.get(safezoneId, [random.randint(0, 255)]))) def createNewPetFromSeed(self, avId, seed, nameIndex, gender, safeZoneId): av = self.air.doId2do[avId] From cf319c587bcb055b14c892ca9630e88b9de6f996 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 20 Jul 2015 09:25:21 -0400 Subject: [PATCH 053/161] useless --- toontown/distributed/ToontownClientRepository.py | 1 - 1 file changed, 1 deletion(-) diff --git a/toontown/distributed/ToontownClientRepository.py b/toontown/distributed/ToontownClientRepository.py index ff7dd89f..c14480d9 100755 --- a/toontown/distributed/ToontownClientRepository.py +++ b/toontown/distributed/ToontownClientRepository.py @@ -184,7 +184,6 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): TexturePool.garbageCollect() self.sendSetAvatarIdMsg(0) self.clearFriendState() - self.startHeartbeat() if self.music == None and base.musicManagerIsValid: self.music = base.musicManager.getSound('phase_3/audio/bgm/tt_theme.ogg') if self.music: From c93fec2f19da937653e6f9071751e36973abc144 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 20 Jul 2015 13:16:39 -0400 Subject: [PATCH 054/161] Top Toons --- toontown/ai/FishManagerAI.py | 3 + toontown/ai/QuestManagerAI.py | 5 +- toontown/ai/ToontownAIRepository.py | 4 +- toontown/golf/DistributedGolfCourseAI.py | 9 +- toontown/minigame/MinigameCreatorAI.py | 4 +- toontown/racing/DistributedRaceAI.py | 3 + toontown/suit/DistributedBossCogAI.py | 4 + toontown/suit/DistributedBossbotBossAI.py | 1 + toontown/suit/DistributedCashbotBossAI.py | 1 + toontown/suit/DistributedLawbotBossAI.py | 1 + toontown/suit/DistributedSellbotBossAI.py | 1 + toontown/toon/DistributedToonAI.py | 3 + .../uberdog/DistributedTopToonsManagerAI.py | 32 +++ .../uberdog/DistributedTopToonsManagerUD.py | 247 ++++++++++++++++++ toontown/uberdog/ToontownUberRepository.py | 15 +- toontown/uberdog/TopToonsGlobals.py | 4 + 16 files changed, 320 insertions(+), 17 deletions(-) create mode 100644 toontown/uberdog/DistributedTopToonsManagerAI.py create mode 100644 toontown/uberdog/DistributedTopToonsManagerUD.py diff --git a/toontown/ai/FishManagerAI.py b/toontown/ai/FishManagerAI.py index fe0b7c20..bf45b494 100755 --- a/toontown/ai/FishManagerAI.py +++ b/toontown/ai/FishManagerAI.py @@ -4,6 +4,7 @@ from otp.ai.MagicWordGlobal import * from toontown.fishing import FishGlobals from toontown.fishing.FishBase import FishBase from toontown.toonbase import TTLocalizer +from toontown.uberdog import TopToonsGlobals class FishManagerAI: @@ -66,6 +67,7 @@ class FishManagerAI: av.fishTank.addFish(fish) netlist = av.fishTank.getNetLists() av.d_setFishTank(netlist[0], netlist[1], netlist[2]) + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_FISH, 1]) return [itemType, genus, species, weight] elif itemType == FishGlobals.BootItem: return [itemType, 0, 0, 0] @@ -89,6 +91,7 @@ class FishManagerAI: av.fishTank.addFish(fish) netlist = av.fishTank.getNetLists() av.d_setFishTank(netlist[0], netlist[1], netlist[2]) + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_FISH, 1]) return [itemType, genus, species, weight] else: money = FishGlobals.Rod2JellybeanDict[av.getFishingRod()] diff --git a/toontown/ai/QuestManagerAI.py b/toontown/ai/QuestManagerAI.py index b965e85a..0309b98a 100755 --- a/toontown/ai/QuestManagerAI.py +++ b/toontown/ai/QuestManagerAI.py @@ -3,7 +3,7 @@ from toontown.building import FADoorCodes from otp.ai.MagicWordGlobal import * from toontown.hood import ZoneUtil from toontown.quest import Quests - +from toontown.uberdog import TopToonsGlobals QuestIdIndex = 0 QuestFromNpcIdIndex = 1 @@ -75,6 +75,7 @@ class QuestManagerAI: # If they've completed a quest. if completeStatus == Quests.COMPLETE: # ToonUp the toon to max health. + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_TASKS, 1]) av.toonUp(av.maxHp) # If it's a TrackChoiceQuest then present their track choices. @@ -437,6 +438,7 @@ class QuestManagerAI: def toonKilledBuilding(self, av, type, difficulty, floors, zoneId, cogdo): # Get the avatars current quests. + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_BLDG, 1]) avQuests = av.getQuests() questList = [] zoneId = ZoneUtil.getBranchZone(zoneId) @@ -491,6 +493,7 @@ class QuestManagerAI: def toonKilledCogs(self, av, suitsKilled, zoneId): # Get the avatar's current quests. + messenger.send('topToonsManager-event', [av.doId, TopToonsGlobals.CAT_COGS, len(suitsKilled)]) avQuests = av.getQuests() questList = [] diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index 62f2d0d4..d272506b 100755 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -51,6 +51,7 @@ from toontown.toon import NPCToons from toontown.toonbase import ToontownGlobals from toontown.tutorial.TutorialManagerAI import TutorialManagerAI from toontown.uberdog.DistributedPartyManagerAI import DistributedPartyManagerAI +from toontown.uberdog.DistributedTopToonsManagerAI import DistributedTopToonsManagerAI #from toontown.uberdog.DistributedLobbyManagerAI import DistributedLobbyManagerAI class ToontownAIRepository(ToontownInternalRepository): @@ -72,6 +73,7 @@ class ToontownAIRepository(ToontownInternalRepository): self.lawOfficeMgr = None self.countryClubMgr = None self.groupManager = GroupManagerAI(self) + self.topToonsMgr = DistributedTopToonsManagerAI(self) self.zoneAllocator = UniqueIdAllocator(ToontownGlobals.DynamicZonesBegin, ToontownGlobals.DynamicZonesEnd) @@ -103,7 +105,7 @@ class ToontownAIRepository(ToontownInternalRepository): self.tutorialManager.generateWithRequired(2) self.friendManager = FriendManagerAI(self) self.friendManager.generateWithRequired(2) - self.questManager = QuestManagerAI(self) + self.questManager = QuestManagerAI(self) self.banManager = BanManagerAI.BanManagerAI(self) self.suitInvasionManager = SuitInvasionManagerAI(self) self.blackCatMgr = DistributedBlackCatMgrAI(self) diff --git a/toontown/golf/DistributedGolfCourseAI.py b/toontown/golf/DistributedGolfCourseAI.py index cb4b26e8..a5b2df81 100755 --- a/toontown/golf/DistributedGolfCourseAI.py +++ b/toontown/golf/DistributedGolfCourseAI.py @@ -6,6 +6,7 @@ from panda3d.core import * from direct.fsm.FSM import FSM from toontown.ai.ToonBarrier import * from toontown.golf import GolfGlobals +from toontown.uberdog import TopToonsGlobals INITIAL = 0 EXITED = 1 EXPECTED = 2 @@ -970,12 +971,17 @@ class DistributedGolfCourseAI(DistributedObjectAI.DistributedObjectAI, FSM): stillPlaying = self.getStillPlayingAvIds() for avId in stillPlaying: scoreList = self.scores[avId] + ns = 0 for holeIndex in xrange(len(scoreList)): strokes = scoreList[holeIndex] if strokes == 1: + ns +=1 holeId = self.holeIds[holeIndex] self.air.writeServerEvent('golf_ace', avId, '%d|%d|%s' % (self.courseId, holeId, stillPlaying)) + if ns: + messenger.send('topToonsManager-event', [avId, TopToonsGlobals.CAT_HOLE_IN_ONE, ns]) + def recordCourseUnderPar(self): coursePar = self.calcCoursePar() stillPlaying = self.getStillPlayingAvIds() @@ -984,7 +990,8 @@ class DistributedGolfCourseAI(DistributedObjectAI.DistributedObjectAI, FSM): netScore = totalScore - coursePar if netScore < 0: self.air.writeServerEvent('golf_underPar', avId, '%d|%d|%s' % (self.courseId, netScore, stillPlaying)) - + messenger.send('topToonsManager-event', [avId, TopToonsGlobals.CAT_COURSE_UNDER_PAR, 1]) + def addAimTime(self, avId, aimTime): if avId in self.aimTimes: self.aimTimes[avId] += aimTime diff --git a/toontown/minigame/MinigameCreatorAI.py b/toontown/minigame/MinigameCreatorAI.py index 877e4255..154f98a5 100755 --- a/toontown/minigame/MinigameCreatorAI.py +++ b/toontown/minigame/MinigameCreatorAI.py @@ -20,7 +20,7 @@ import DistributedTwoDGameAI import DistributedVineGameAI from otp.ai.MagicWordGlobal import * from toontown.toonbase import ToontownGlobals - +from toontown.uberdog import TopToonsGlobals simbase.forcedMinigameId = simbase.config.GetInt('force-minigame', 0) RequestMinigame = {} @@ -84,6 +84,8 @@ def createMinigame(air, playerArray, trolleyZone, minigameZone=None, toon = simbase.air.doId2do.get(doId) if toon is not None: toons.append(toon) + for toon in toons: + messenger.send('topToonsManager-event', [toon.doId, TopToonsGlobals.CAT_TROLLEY, 1]) for toon in toons: simbase.air.questManager.toonPlayedMinigame(toon, toons) retVal = {} diff --git a/toontown/racing/DistributedRaceAI.py b/toontown/racing/DistributedRaceAI.py index 5a9f942f..4fce5142 100755 --- a/toontown/racing/DistributedRaceAI.py +++ b/toontown/racing/DistributedRaceAI.py @@ -3,6 +3,7 @@ from direct.distributed.ClockDelta import * from direct.distributed.DistributedObjectAI import DistributedObjectAI from direct.fsm.FSM import FSM from direct.task import Task +from toontown.uberdog import TopToonsGlobals import random from toontown.racing import RaceGlobals @@ -320,6 +321,8 @@ class DistributedRaceAI(DistributedObjectAI, FSM): self.sendUpdate('setPlace', [avId, totalTime, place, entryFee, qualify, max((winnings-entryFee), 0), bonus, trophies, [], 0]) def calculateTrophies(self, avId, won, qualify, time): + if won: + messenger.send('topToonsManager-event', [avId, TopToonsGlobals.CAT_RACE_WON, 1]) av = self.air.doId2do[avId] kartingHistory = av.getKartingHistory() avTrophies = av.getKartingTrophies() diff --git a/toontown/suit/DistributedBossCogAI.py b/toontown/suit/DistributedBossCogAI.py index 6b1ba371..b73af025 100755 --- a/toontown/suit/DistributedBossCogAI.py +++ b/toontown/suit/DistributedBossCogAI.py @@ -145,6 +145,10 @@ class DistributedBossCogAI(DistributedAvatarAI.DistributedAvatarAI): def d_setBattleExperience(self): self.sendUpdate('setBattleExperience', self.getBattleExperience()) + for toonId in self.involvedToons: + toon = simbase.air.doId2do.get(toonId) + if toon: + self.air.topToonsMgr.toonKilledBoss(toon, self.BossName) def getBattleExperience(self): result = BattleExperienceAI.getBattleExperience(8, self.involvedToons, self.toonExp, self.toonSkillPtsGained, self.toonOrigQuests, self.toonItems, self.toonOrigMerits, self.toonMerits, self.toonParts, self.suitsKilled, self.helpfulToons) diff --git a/toontown/suit/DistributedBossbotBossAI.py b/toontown/suit/DistributedBossbotBossAI.py index ae453cec..5e9d1a7a 100755 --- a/toontown/suit/DistributedBossbotBossAI.py +++ b/toontown/suit/DistributedBossbotBossAI.py @@ -28,6 +28,7 @@ class DistributedBossbotBossAI(DistributedBossCogAI.DistributedBossCogAI, FSM.FS 2, 3, 4] + BossName = "CEO" def __init__(self, air): DistributedBossCogAI.DistributedBossCogAI.__init__(self, air, 'c') diff --git a/toontown/suit/DistributedCashbotBossAI.py b/toontown/suit/DistributedCashbotBossAI.py index 49e1f196..ec40d9d3 100755 --- a/toontown/suit/DistributedCashbotBossAI.py +++ b/toontown/suit/DistributedCashbotBossAI.py @@ -17,6 +17,7 @@ import math class DistributedCashbotBossAI(DistributedBossCogAI.DistributedBossCogAI, FSM.FSM): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedCashbotBossAI') maxGoons = 8 + BossName = "CFO" def __init__(self, air): DistributedBossCogAI.DistributedBossCogAI.__init__(self, air, 'm') diff --git a/toontown/suit/DistributedLawbotBossAI.py b/toontown/suit/DistributedLawbotBossAI.py index 2f1fd77d..ce42202c 100755 --- a/toontown/suit/DistributedLawbotBossAI.py +++ b/toontown/suit/DistributedLawbotBossAI.py @@ -29,6 +29,7 @@ class DistributedLawbotBossAI(DistributedBossCogAI.DistributedBossCogAI, FSM.FSM hitCountDamage = 35 numPies = 10 maxToonLevels = 77 + BossName = "CJ" def __init__(self, air): DistributedBossCogAI.DistributedBossCogAI.__init__(self, air, 'l') diff --git a/toontown/suit/DistributedSellbotBossAI.py b/toontown/suit/DistributedSellbotBossAI.py index a5590795..5cd80854 100755 --- a/toontown/suit/DistributedSellbotBossAI.py +++ b/toontown/suit/DistributedSellbotBossAI.py @@ -20,6 +20,7 @@ class DistributedSellbotBossAI(DistributedBossCogAI.DistributedBossCogAI, FSM.FS limitHitCount = 6 hitCountDamage = 35 numPies = ToontownGlobals.FullPies + BossName = "VP" def __init__(self, air): DistributedBossCogAI.DistributedBossCogAI.__init__(self, air, 's') diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 9e071657..802e7622 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -32,6 +32,7 @@ from toontown.toonbase import TTLocalizer, ToontownBattleGlobals, ToontownGlobal from toontown.toonbase.ToontownGlobals import * from NPCToons import npcFriends import Experience, InventoryBase, ToonDNA, random, time +from toontown.uberdog import TopToonsGlobals if simbase.wantPets: from toontown.pets import PetLookerAI, PetObserve @@ -2271,6 +2272,8 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo return self.maxBankMoney def addMoney(self, deltaMoney): + if deltaMoney > 0: + messenger.send('topToonsManager-event', [self.doId, TopToonsGlobals.CAT_JELLYBEAN, deltaMoney]) money = deltaMoney + self.money pocketMoney = min(money, self.maxMoney) self.b_setMoney(pocketMoney) diff --git a/toontown/uberdog/DistributedTopToonsManagerAI.py b/toontown/uberdog/DistributedTopToonsManagerAI.py new file mode 100644 index 00000000..f91ae38d --- /dev/null +++ b/toontown/uberdog/DistributedTopToonsManagerAI.py @@ -0,0 +1,32 @@ +from direct.distributed.DistributedObjectAI import * +from direct.showbase.DirectObject import * +import TopToonsGlobals + +class DistributedTopToonsManagerAI(DirectObject): + def __init__(self, air): + self.air = air + + self.accept('topToonsManager-event', self.__handleEvent) + + def toonKilledBoss(self, av, boss): + cat = {'VP': TopToonsGlobals.CAT_VP, + 'CFO': TopToonsGlobals.CAT_CFO, + 'CJ': TopToonsGlobals.CAT_CJ, + 'CEO': TopToonsGlobals.CAT_CEO}.get(boss, 0) + self.__handleEvent(av.doId, cat, 1) + + def __handleEvent(self, *args): # avId, categories, score + self.air.sendNetEvent('topToonsManager-AI-score-site', list(args)) + +from otp.ai.MagicWordGlobal import * +@magicWord(types=[int, int]) +def topToon(score, cat=TopToonsGlobals._CAT_ALL): + av = spellbook.getTarget() + mgr = av.air.topToonsMgr + if not mgr: + return 'No manager!' + + if cat > TopToonsGlobals._CAT_ALL: + return 'Max value: %d' % TopToonsGlobals._CAT_ALL + + messenger.send('topToonsManager-event', [av.doId, cat, score]) \ No newline at end of file diff --git a/toontown/uberdog/DistributedTopToonsManagerUD.py b/toontown/uberdog/DistributedTopToonsManagerUD.py new file mode 100644 index 00000000..eb0b55a5 --- /dev/null +++ b/toontown/uberdog/DistributedTopToonsManagerUD.py @@ -0,0 +1,247 @@ +# CLEANUP IMPORTS + +from direct.directnotify import DirectNotifyGlobal +from direct.fsm.FSM import FSM +from direct.distributed.DistributedObjectUD import * +from direct.showbase.DirectObject import * +from toontown.toon.ToonDNA import ToonDNA, getSpeciesName +import TopToonsGlobals +import time, cPickle, random +import datetime, json +import urllib +import urllib2 +import hashlib + +def getCurrentMonth(): + dt = datetime.date.today() + month = dt.month + year = dt.year + return year * 100 + month + +def getPrevMonth(): + current = getCurrentMonth() + year, month = divmod(current, 100) + month -= 1 + if not month: + month = 12 + year -= 1 + + return year * 100 + month + +def getNextMonth(): + current = getCurrentMonth() + year, month = divmod(current, 100) + month += 1 + if month > 12: + month = 1 + year += 1 + + return year * 100 + month + +def timeToNextMonth(): + now = datetime.datetime.now() + year, month = divmod(getNextMonth(), 100) + return (datetime.datetime(year, month, 1) - now).total_seconds() + +def getEmptySiteToonsColl(month): + coll = {} + + start = TopToonsGlobals._CAT_BEGIN + end = TopToonsGlobals._CAT_END + while start <= end: + coll[str(start)] = {} + start *= 2 + + coll['month'] = month + return coll + +class SiteUploadFSM(FSM): + notify = DirectNotifyGlobal.directNotify.newCategory('SiteUploadFSM') + URL = config.GetString('toptoons-api-endpoint', 'http://toontownstride.com/toptoons/post/') # Let's hope jumbleweed hasn't changed this + + def __init__(self, mgr, data): + FSM.__init__(self, 'SiteUploadFSM') + + self.mgr = mgr + self.data = {} + self.month = data.pop('month') + for category, avs in data.items(): + self.data[int(category)] = sorted(avs.items(), key=lambda x: -x[1]) + + self.__cat = TopToonsGlobals._CAT_BEGIN + self.__responses = {} + self.__cache = {} + self.__waiting = {} + self.__dataToSend = {} + self.__failures = -1 + + self.demand('QueryAvatars') + + def enterQueryAvatars(self): + avs = self.data[self.__cat] + cutoff = self.__failures + if cutoff == -1: + cutoff = 5 + selected, remaining = avs[:cutoff], avs[cutoff:] + self.data[self.__cat] = remaining + + self.__waiting = {int(x[0]): x[1] for x in selected} + avIds = self.__waiting.keys() + for avId in avIds: + if avId in self.__cache: + self.__responses[avId] = (self.__cache[avId][0], self.__waiting.pop(avId)) + + self.__failures = 0 + for avId in self.__waiting: + def response(x, y, avId=avId): + self.__handleToon(avId, x, y) + + self.mgr.air.dbInterface.queryObject(self.mgr.air.dbId, avId, response) + + if not self.__waiting: + self.demand('SortResults') + + def __handleToon(self, avId, dclass, fields): + if avId not in self.__waiting: + return + + if dclass != self.mgr.air.dclassesByName['DistributedToonUD']: + self.__failures += 1 + self.notify.warning('%d query failed!' % avId) + del self.__waiting[avId] + if not self.__waiting: + self.demand('QueryAvatars') + return + + name = fields['setName'][0] + hp = fields['setMaxHp'][0] + + dna = ToonDNA(fields['setDNAString'][0]) + species = getSpeciesName(dna.head) + color = dna.headColor + + if species == 'pig': + dna = 'pig' + + else: + if species == 'cat' and color == 26: + dna = 'blackcat' + + else: + if color > 23: + color = 0 + + dna = '%s_%s_%d' % (species, dna.head[1:], color) + + self.__responses[avId] = ((name, dna, hp), self.__waiting.pop(avId)) + + if not self.__waiting: + self.demand('QueryAvatars') + + def enterSortResults(self): + responses = sorted(self.__responses.values(), key=lambda x: -x[-1]) + self.__dataToSend[self.__cat] = responses + self.__cache.update(self.__responses) + self.__failures = -1 + self.__responses = {} + self.__cat *= 2 + if self.__cat * 2 == TopToonsGlobals._CAT_END: + self.demand('Upload') + return + + self.demand('QueryAvatars') + + def enterUpload(self): + self.__dataToSend['month'] = self.month + + (success, error), res = self.post(self.URL, self.__dataToSend) + print (success, error), res + + def post(self, url, data): + headers = {'User-Agent' : 'TTUberAgent'} + + innerData = json.dumps(data) + hmac = hashlib.sha512(innerData + self.mgr.air.getApiKey()).hexdigest() # XXX PROVIDE THE KEY HERE + + data = 'data=%s' % urllib.quote(innerData) + data += '&hmac=%s' % urllib.quote(hmac) + + success = True + error = None + res = {} + + try: + req = urllib2.Request(url, data, headers) + res = json.loads(urllib2.urlopen(req).read()) + success = res['success'] + error = res.get('error') + + except Exception as e: + if hasattr(e, 'read'): + with open('../e.html', 'wb') as f: + f.write(e.read()) + + success = False + error = str(e) + + return (success, error), res + +class DistributedTopToonsManagerUD(DirectObject): + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedTopToonsManagerUD') + + def __init__(self, air): + self.air = air + + self.__curMonth = getCurrentMonth() + coll = None + if self.air.dbConn: + coll = self.air.dbGlobalCursor.strideToons.find_one({'month': self.__curMonth}) + if not coll: + lastMonthColl = self.air.dbGlobalCursor.strideToons.find_one({'month': getPrevMonth()}) + if lastMonthColl: + self.__uploadLastMonth(lastMonthColl) + + if not coll: + coll = getEmptySiteToonsColl(self.__curMonth) + + self.__topToonsData = coll + self.__topToonsData.pop('_id', None) + + self.accept('topToonsManager-AI-score-site', self.__topToonsScore) + self.waitForNextMonth() + + def __uploadLastMonth(self, data): + self.notify.info('Sending last month result to site...') + SiteUploadFSM(self, data) + + def waitForNextMonth(self): + def _nm(task): + self.__uploadLastMonth(self.__topToonsData) + + self.__curMonth = getCurrentMonth() + self.__topToonsData = getEmptySiteToonsColl(self.__curMonth) + + self.waitForNextMonth() + + return task.done + + taskMgr.doMethodLater(timeToNextMonth() + 1, _nm, 'DistributedTopToonsManagerUD-nextMonth') + + def saveSite(self): + if self.air.dbConn: + self.air.dbGlobalCursor.strideToons.update({'month': self.__curMonth}, {'$set': self.__topToonsData}, upsert=True) + + def __topToonsScore(self, avId, categories, score): + def _add(cat): + cd = self.__topToonsData[str(cat)] + cd[str(avId)] = cd.get(str(avId), 0) + score + + start = TopToonsGlobals._CAT_BEGIN + end = TopToonsGlobals._CAT_END + while start <= end: + if categories & start: + _add(start) + + start *= 2 + + self.saveSite() \ No newline at end of file diff --git a/toontown/uberdog/ToontownUberRepository.py b/toontown/uberdog/ToontownUberRepository.py index 7ead157f..88958d61 100755 --- a/toontown/uberdog/ToontownUberRepository.py +++ b/toontown/uberdog/ToontownUberRepository.py @@ -4,28 +4,16 @@ from otp.distributed.OtpDoGlobals import * from otp.distributed.DistributedDirectoryAI import DistributedDirectoryAI from toontown.distributed.ToontownInternalRepository import ToontownInternalRepository import toontown.minigame.MinigameCreatorAI +from toontown.uberdog.DistributedTopToonsManagerUD import DistributedTopToonsManagerUD if config.GetBool('want-rpc-server', False): from toontown.rpc.ToontownRPCServer import ToontownRPCServer from toontown.rpc.ToontownRPCHandler import ToontownRPCHandler -if config.GetBool('want-mongo-client', False): - import pymongo - class ToontownUberRepository(ToontownInternalRepository): def __init__(self, baseChannel, serverId): ToontownInternalRepository.__init__(self, baseChannel, serverId, dcSuffix='UD') - if config.GetBool('want-mongo-client', False): - url = config.GetString('mongodb-url', 'mongodb://localhost') - replicaset = config.GetString('mongodb-replicaset', '') - if replicaset: - self.mongo = pymongo.MongoClient(url, replicaset=replicaset) - else: - self.mongo = pymongo.MongoClient(url) - db = (urlparse.urlparse(url).path or '/test')[1:] - self.mongodb = self.mongo[db] - self.notify.setInfo(True) def handleConnected(self): @@ -51,4 +39,5 @@ class ToontownUberRepository(ToontownInternalRepository): self.friendsManager = simbase.air.generateGlobalObject(OTP_DO_ID_TTS_FRIENDS_MANAGER, 'TTSFriendsManager') self.globalPartyMgr = simbase.air.generateGlobalObject(OTP_DO_ID_GLOBAL_PARTY_MANAGER, 'GlobalPartyManager') self.groupManager = simbase.air.generateGlobalObject(OPT_DO_ID_GROUP_MANAGER, 'GroupManager') + self.topToonsMgr = DistributedTopToonsManagerUD(self) diff --git a/toontown/uberdog/TopToonsGlobals.py b/toontown/uberdog/TopToonsGlobals.py index 51daf629..7786d828 100644 --- a/toontown/uberdog/TopToonsGlobals.py +++ b/toontown/uberdog/TopToonsGlobals.py @@ -13,3 +13,7 @@ CAT_VP = 2048 CAT_CFO = 4096 CAT_CJ = 8192 CAT_CEO = 16384 + +_CAT_BEGIN = CAT_COGS +_CAT_END = CAT_CEO +_CAT_ALL = (_CAT_END << 1) - 1 \ No newline at end of file From 1236e38d62f3db82c257653b71934f97732ac46b Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 20 Jul 2015 15:53:53 -0400 Subject: [PATCH 055/161] Current garden progress. --- dependencies/astron/dclass/stride.dc | 52 +- toontown/ai/ServiceStart.py | 3 +- toontown/catalog/CatalogGardenItem.py | 16 +- toontown/catalog/CatalogGardenStarterItem.py | 18 +- toontown/catalog/CatalogToonStatueItem.py | 3 +- .../estate/DistributedAnimatedStatuaryAI.py | 3 - .../estate/DistributedChangingStatuaryAI.py | 11 +- toontown/estate/DistributedEstateAI.py | 927 ++++++++++++------ toontown/estate/DistributedFlower.py | 39 +- toontown/estate/DistributedFlowerAI.py | 157 ++- toontown/estate/DistributedGagTree.py | 66 +- toontown/estate/DistributedGagTreeAI.py | 224 ++++- toontown/estate/DistributedGarden.py | 25 +- toontown/estate/DistributedGardenAI.py | 23 +- toontown/estate/DistributedGardenBox.py | 22 +- toontown/estate/DistributedGardenBoxAI.py | 10 +- toontown/estate/DistributedGardenPlot.py | 85 +- toontown/estate/DistributedGardenPlotAI.py | 412 ++++---- toontown/estate/DistributedLawnDecor.py | 65 +- toontown/estate/DistributedLawnDecorAI.py | 74 +- toontown/estate/DistributedPlantBase.py | 14 +- toontown/estate/DistributedPlantBaseAI.py | 123 ++- toontown/estate/DistributedStatuary.py | 10 +- toontown/estate/DistributedStatuaryAI.py | 75 +- toontown/estate/DistributedToonStatuary.py | 6 +- toontown/estate/DistributedToonStatuaryAI.py | 10 +- toontown/estate/EstateManagerAI.py | 2 +- toontown/estate/GardenGlobals.py | 106 +- 28 files changed, 1569 insertions(+), 1012 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 221a1099..c8e2c8bd 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -1209,46 +1209,41 @@ struct decorItem { }; struct lawnItem { - int8 plot; uint8 type; - uint8 species; - uint8 variety; + uint8 hardPoint; int8 waterLevel; int8 growthLevel; uint16 optional; - uint64 plantedAt; - uint64 wateredAt; }; dclass DistributedEstate : DistributedObject { + string DcObjectType db; setEstateReady() broadcast; setClientReady() airecv clsend; + setEstateType(uint8 type = 0) required broadcast db; setClosestHouse(uint8) airecv clsend; setTreasureIds(uint32[]) broadcast ram; requestServerTime() airecv clsend; setServerTime(uint32); setDawnTime(uint32) required broadcast ram; placeOnGround(uint32) broadcast ram; - setDecorData(lawnItem items[] = []) required airecv db; setLastEpochTimeStamp(uint32 timestamp = 0) required airecv db; setRentalTimeStamp(uint32 timestamp = 0) required airecv db; setRentalType(uint8 type = 0) required airecv db; setSlot0ToonId(uint32 toonId = 0) required airecv db; - setSlot0Items(lawnItem items[] = []) required broadcast ownrecv db; + setSlot0Garden(blob g) required airecv db; setSlot1ToonId(uint32 toonId = 0) required airecv db; - setSlot1Items(lawnItem items[] = []) required broadcast ownrecv db; + setSlot1Garden(blob g) required airecv db; setSlot2ToonId(uint32 toonId = 0) required airecv db; - setSlot2Items(lawnItem items[] = []) required broadcast ownrecv db; + setSlot2Garden(blob g) required airecv db; setSlot3ToonId(uint32 toonId = 0) required airecv db; - setSlot3Items(lawnItem items[] = []) required broadcast ownrecv db; + setSlot3Garden(blob g) required airecv db; setSlot4ToonId(uint32 toonId = 0) required airecv db; - setSlot4Items(lawnItem items[] = []) required broadcast ownrecv db; + setSlot4Garden(blob g) required airecv db; setSlot5ToonId(uint32 toonId = 0) required airecv db; - setSlot5Items(lawnItem items[] = []) required broadcast ownrecv db; + setSlot5Garden(blob g) required airecv db; setIdList(uint32 []) broadcast ram; completeFlowerSale(uint8) airecv clsend; - completeFishSale(uint8) airecv clsend; - thankSeller(int8, int8, int8); awardedTrophy(uint32) broadcast; setClouds(uint8) required broadcast ram; cannonsOver() broadcast; @@ -1283,8 +1278,7 @@ dclass DistributedHouseInterior : DistributedObject { }; dclass DistributedGarden : DistributedObject { - sendNewProp(uint8, int16/10, int16/10, int16/10) broadcast; - setProps(uint8[]) airecv clsend; + sendNewProp(uint8 prop, int16/10 x, int16/10 y, int16/10 z) broadcast; }; dclass DistributedParty : DistributedObject { @@ -2556,27 +2550,24 @@ dclass DistributedLawbotChair : DistributedObject { }; dclass DistributedLawnDecor : DistributedNode { - setEstate(uint32) required broadcast ram; setPlot(int8) required broadcast ram; setHeading(int16/10) required broadcast ram; - setPosition(int16/10, int16/10, int16/10) required broadcast ram; setOwnerIndex(int8) required broadcast ram; + setPosition(int16/10, int16/10, int16/10) required broadcast ram; plotEntered() airecv clsend; - removeItem(uint32) airecv clsend; + removeItem() airecv clsend; setMovie(uint8, uint32) broadcast ram; movieDone() airecv clsend; interactionDenied(uint32) broadcast ram; + setBoxDoId(uint32, uint8) broadcast ram; }; dclass DistributedGardenPlot : DistributedLawnDecor { - plantedItem(uint32) broadcast ram; - finishPlanting(uint32) airecv clsend; - finishRemoving(uint32) airecv clsend; - plantFlower(uint8, uint8, uint32) airecv clsend; - plantGagTree(uint8, uint8, uint32) airecv clsend; - plantStatuary(uint8, uint32) airecv clsend; - plantToonStatuary(uint8, uint16, uint32) airecv clsend; - plantNothing(uint8, uint32) airecv clsend; + plantFlower(uint8, uint8) airecv clsend; + plantGagTree(uint8, uint8) airecv clsend; + plantStatuary(uint8) airecv clsend; + plantToonStatuary(uint8, uint16) airecv clsend; + plantNothing(uint8) airecv clsend; }; dclass DistributedGardenBox : DistributedLawnDecor { @@ -2584,7 +2575,6 @@ dclass DistributedGardenBox : DistributedLawnDecor { }; dclass DistributedStatuary : DistributedLawnDecor { - setOwnerPlot(uint32) required broadcast ram; setTypeIndex(uint8) required broadcast ram; setWaterLevel(int8) required broadcast ram; setGrowthLevel(int8) required broadcast ram; @@ -2602,11 +2592,10 @@ dclass DistributedChangingStatuary : DistributedStatuary { }; dclass DistributedPlantBase : DistributedLawnDecor { - setOwnerPlot(uint32) required broadcast ram; setTypeIndex(uint8) required broadcast ram; setWaterLevel(int8) required broadcast ram; setGrowthLevel(int8) required broadcast ram; - waterPlant(uint32) airecv clsend; + waterPlant() airecv clsend; waterPlantDone() airecv clsend; }; @@ -2617,7 +2606,8 @@ dclass DistributedFlower : DistributedPlantBase { dclass DistributedGagTree : DistributedPlantBase { setWilted(int8) required broadcast ram; - requestHarvest(uint32) airecv clsend; + setFruiting(bool) required broadcast ram; + requestHarvest() airecv clsend; }; struct golfData { diff --git a/toontown/ai/ServiceStart.py b/toontown/ai/ServiceStart.py index 5149d09f..9854b017 100755 --- a/toontown/ai/ServiceStart.py +++ b/toontown/ai/ServiceStart.py @@ -62,10 +62,9 @@ if ':' in host: port = int(port) simbase.air.connect(host, port) -gc.enable() - try: run() + gc.enable() except SystemExit: raise except Exception: diff --git a/toontown/catalog/CatalogGardenItem.py b/toontown/catalog/CatalogGardenItem.py index eb6f731c..97ed7fb2 100755 --- a/toontown/catalog/CatalogGardenItem.py +++ b/toontown/catalog/CatalogGardenItem.py @@ -22,6 +22,11 @@ class CatalogGardenItem(CatalogItem.CatalogItem): else: return 100 + def reachedPurchaseLimit(self, avatar): + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: + return 1 + return 0 + def getAcceptItemErrorText(self, retcode): if retcode == ToontownGlobals.P_ItemAvailable: return TTLocalizer.CatalogAcceptGarden @@ -45,7 +50,7 @@ class CatalogGardenItem(CatalogItem.CatalogItem): def getPicture(self, avatar): photoModel = GardenGlobals.Specials[self.gardenIndex]['photoModel'] - if 'photoAnimation' in GardenGlobals.Specials[self.gardenIndex]: + if GardenGlobals.Specials[self.gardenIndex].has_key('photoAnimation'): modelPath = photoModel + GardenGlobals.Specials[self.gardenIndex]['photoAnimation'][0] animationName = GardenGlobals.Specials[self.gardenIndex]['photoAnimation'][1] animationPath = photoModel + animationName @@ -74,9 +79,8 @@ class CatalogGardenItem(CatalogItem.CatalogItem): def cleanupPicture(self): CatalogItem.CatalogItem.cleanupPicture(self) - if hasattr(self, 'model') and self.model: - self.model.detachNode() - self.model = None + self.model.detachNode() + self.model = None return def output(self, store = -1): @@ -121,7 +125,7 @@ class CatalogGardenItem(CatalogItem.CatalogItem): def getDeliveryTime(self): if self.gardenIndex == GardenGlobals.GardenAcceleratorSpecial: - return 1 + return 24 * 60 else: return 0 @@ -156,7 +160,7 @@ class CatalogGardenItem(CatalogItem.CatalogItem): result = False if canPlant < numBeansRequired: result = True - if not result and self.gardenIndex in GardenGlobals.Specials and 'minSkill' in GardenGlobals.Specials[self.gardenIndex]: + if not result and GardenGlobals.Specials.has_key(self.gardenIndex) and GardenGlobals.Specials[self.gardenIndex].has_key('minSkill'): minSkill = GardenGlobals.Specials[self.gardenIndex]['minSkill'] if avatar.shovelSkill < minSkill: result = True diff --git a/toontown/catalog/CatalogGardenStarterItem.py b/toontown/catalog/CatalogGardenStarterItem.py index 237642ee..d33e5903 100755 --- a/toontown/catalog/CatalogGardenStarterItem.py +++ b/toontown/catalog/CatalogGardenStarterItem.py @@ -15,8 +15,10 @@ class CatalogGardenStarterItem(CatalogItem.CatalogItem): def getPurchaseLimit(self): return 0 - def reachedPurchaseLimit(self, avatar): - return self in avatar.onOrder or self in avatar.mailboxContents or hasattr(avatar, 'gardenStarted') and avatar.getGardenStarted() + def reachedPurchaseLimit(self, avatar): + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder or hasattr(avatar, 'gardenStarted') and avatar.getGardenStarted(): + return 1 + return 0 def saveHistory(self): return 1 @@ -29,13 +31,13 @@ class CatalogGardenStarterItem(CatalogItem.CatalogItem): def recordPurchase(self, avatar, optional): if avatar: - estate = simbase.air.estateManager.toon2estate.get(avatar) + self.notify.debug('rental -- has avatar') + estate = simbase.air.estateManager._lookupEstate(avatar) if estate: - av = simbase.air.doId2do.get(avatar) - if av: - av.b_setGardenStarted(True) - print('garden saved') - estate.placeStarterGarden(avatar) + self.notify.debug('rental -- has estate') + estate.placeStarterGarden(avatar.doId) + else: + self.notify.warning('rental -- something not there') return ToontownGlobals.P_ItemAvailable def getPicture(self, avatar): diff --git a/toontown/catalog/CatalogToonStatueItem.py b/toontown/catalog/CatalogToonStatueItem.py index 8c95d199..ea09a38c 100755 --- a/toontown/catalog/CatalogToonStatueItem.py +++ b/toontown/catalog/CatalogToonStatueItem.py @@ -25,6 +25,7 @@ class CatalogToonStatueItem(CatalogGardenItem.CatalogGardenItem): model, ival = self.makeFrameModel(toonStatuary.toon, 1) self.pictureToonStatue = toonStatuary self.hasPicture = True + toonStatuary.toon.setBin('gui-popup', 60) return (model, ival) def cleanupPicture(self): @@ -50,7 +51,7 @@ class CatalogToonStatueItem(CatalogGardenItem.CatalogGardenItem): def getAllToonStatues(self): self.statueList = [] - for index in xrange(self.startPoseIndex, self.endPoseIndex + 1): + for index in range(self.startPoseIndex, self.endPoseIndex + 1): self.statueList.append(CatalogToonStatueItem(index, 1, endPoseIndex=index)) return self.statueList diff --git a/toontown/estate/DistributedAnimatedStatuaryAI.py b/toontown/estate/DistributedAnimatedStatuaryAI.py index 40fe8781..e7ce70d7 100755 --- a/toontown/estate/DistributedAnimatedStatuaryAI.py +++ b/toontown/estate/DistributedAnimatedStatuaryAI.py @@ -4,6 +4,3 @@ from toontown.estate.DistributedStatuaryAI import DistributedStatuaryAI class DistributedAnimatedStatuaryAI(DistributedStatuaryAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedAnimatedStatuaryAI") - def __init__(self, air, species): - self.air = air - self.species = species diff --git a/toontown/estate/DistributedChangingStatuaryAI.py b/toontown/estate/DistributedChangingStatuaryAI.py index 36641bf5..cbdc1877 100755 --- a/toontown/estate/DistributedChangingStatuaryAI.py +++ b/toontown/estate/DistributedChangingStatuaryAI.py @@ -4,13 +4,6 @@ from toontown.estate.DistributedStatuaryAI import DistributedStatuaryAI class DistributedChangingStatuaryAI(DistributedStatuaryAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedChangingStatuaryAI") - def __init__(self, air): - DistributedStatuaryAI.__init__(self, air) - self.air = air - self.growthLevel = -1 + def setGrowthLevel(self, todo0): + pass - def setGrowthLevel(self, growthLevel): - self.growthLevel = growthLevel - - def getGrowthLevel(self): - return self.growthLevel diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index 048776a3..f4f8176e 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -1,54 +1,417 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI from toontown.toonbase import ToontownGlobals +import HouseGlobals +import time, random + from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI from toontown.fishing.DistributedFishingTargetAI import DistributedFishingTargetAI from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI from toontown.fishing import FishingTargetGlobals -from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI -from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI +from toontown.safezone import TreasurePlannerAI from toontown.safezone import DistributedTreasureAI -from toontown.safezone import TreasureGlobals +from toontown.safezone import ButterflyGlobals +from toontown.safezone import DistributedButterflyAI +from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI + +from DistributedGardenBoxAI import * +from DistributedGardenPlotAI import * +from DistributedGagTreeAI import * +from DistributedFlowerAI import * +from DistributedStatuaryAI import * +from DistributedToonStatuaryAI import * +from DistributedAnimatedStatuaryAI import * +from DistributedChangingStatuaryAI import * +import GardenGlobals + from DistributedCannonAI import * from DistributedTargetAI import * import CannonGlobals -import TableGlobals -import HouseGlobals -import GardenGlobals -from DistributedGardenPlotAI import DistributedGardenPlotAI -from DistributedGardenBoxAI import DistributedGardenBoxAI -from DistributedFlowerAI import DistributedFlowerAI -from DistributedGagTreeAI import DistributedGagTreeAI -from DistributedStatuaryAI import DistributedStatuaryAI -from DistributedToonStatuaryAI import DistributedToonStatuaryAI -import time -import random -from toontown.fishing import FishGlobals -from toontown.parties.DistributedPartyJukeboxActivityAI import DistributedPartyJukeboxActivityAI + +# planted, waterLevel, lastCheck, growthLevel, optional +NULL_PLANT = [-1, -1, 0, 0, 0] +NULL_TREES = [NULL_PLANT] * 8 +NULL_FLOWERS = [NULL_PLANT] * 10 +NULL_STATUARY = 0 + +NULL_DATA = {'trees': NULL_TREES, 'statuary': NULL_STATUARY, 'flowers': NULL_FLOWERS} + +from direct.distributed.PyDatagramIterator import * +from direct.distributed.PyDatagram import * + +class Garden: + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedEstateAI') + + WANT_FLOWERS = True # puke + WANT_TREES = True + WANT_STATUARY = True + + def __init__(self, air, avId): + self.air = air + self.avId = avId + + self.trees = set() + self.flowers = set() + self.objects = set() + + if not self.air.dbConn: + self.notify.warning('Not using mongodb, garden data will be non-persistent') + self.data = NULL_DATA.copy() + + else: + d = self.air.dbGlobalCursor.gardens.find_one({'avId': avId}) + if d is None: + self.data = NULL_DATA.copy() + self.air.dbGlobalCursor.gardens.update({'avId': avId}, {'$set': NULL_DATA}, upsert=True) + + else: + self.data = d + + self.data.pop('_id', None) + + def destroy(self): + messenger.send('garden-%d-666-going-down' % self.avId) + + for tree in self.trees: + tree.requestDelete() + + for flower in self.flowers: + flower.requestDelete() + + for object in self.objects: + object.requestDelete() + + self.air = None + self.estateMgr = None + + def create(self, estateMgr): + self.estateMgr = estateMgr + + if self.avId not in estateMgr.toons: + estateMgr.notify.warning('Garden associated to unknown avatar %d, deleting...' % self.avId) + return False + + houseIndex = estateMgr.toons.index(self.avId) + + if self.WANT_FLOWERS: + boxIndex = 0 + boxes = [] + boxDefs = GardenGlobals.estateBoxes[houseIndex] + for x, y, h, boxType in boxDefs: + box = DistributedGardenBoxAI(self) + + box.setTypeIndex(boxType) + box.setPos(x, y, 0) + box.setH(h) + box.setOwnerIndex(houseIndex) + box.generateWithRequired(estateMgr.zoneId) + + self.objects.add(box) + boxes.append(box) + boxIndex += 1 + + self._boxes = boxes + + plots = GardenGlobals.estatePlots[houseIndex] + treeIndex = 0 + flowerIndex = 0 + for plot, (x, y, h, type) in enumerate(plots): + if type == GardenGlobals.GAG_TREE_TYPE and self.WANT_TREES: + data = self.data['trees'][treeIndex] + + planted, waterLevel, lastCheck, growthLevel, lastHarvested = data + + if planted != -1: + obj = self.plantTree(treeIndex, planted, waterLevel=waterLevel, + lastCheck=lastCheck, growthLevel=growthLevel, + lastHarvested=lastHarvested, generate=False) + + self.trees.add(obj) + + else: + obj = self.placePlot(treeIndex) + + obj.setPos(x, y, 0) + obj.setH(h) + obj.setPlot(plot) + obj.setOwnerIndex(houseIndex) + obj.generateWithRequired(estateMgr.zoneId) + treeIndex += 1 + + elif type == GardenGlobals.FLOWER_TYPE and self.WANT_FLOWERS: + data = self.data['flowers'][flowerIndex] + + planted, waterLevel, lastCheck, growthLevel, variety = data + + if planted != -1: + obj = self.plantFlower(flowerIndex, planted, variety, waterLevel=waterLevel, + lastCheck=lastCheck, growthLevel=growthLevel, + generate=False) + + else: + obj = self.placePlot(flowerIndex) + obj.flowerIndex = flowerIndex + + obj.setPlot(plot) + obj.setOwnerIndex(houseIndex) + obj.generateWithRequired(estateMgr.zoneId) + + index = (0, 1, 2, 2, 2, 3, 3, 3, 4, 4)[flowerIndex] + idx = (0, 0, 0, 1, 2, 0, 1, 2, 0, 1)[flowerIndex] + obj.sendUpdate('setBoxDoId', [boxes[index].doId, idx]) + flowerIndex += 1 + + elif type == GardenGlobals.STATUARY_TYPE and self.WANT_STATUARY: + data = self.data['statuary'] + if data == 0: + obj = self.placePlot(-1) + + else: + obj = self.placeStatuary(data, generate=False) + + obj.setPos(x, y, 0) + obj.setH(h) + obj.setPlot(plot) + obj.setOwnerIndex(houseIndex) + obj.generateWithRequired(estateMgr.zoneId) + + for tree in self.trees: + tree.calcDependencies() + + self.reconsiderAvatarOrganicBonus() + + return True + + def hasTree(self, track, index): + x = track * 7 + index + for tree in self.data['trees']: + if tree[0] == x: + return True + + return False + + def getTree(self, track, index): + for tree in self.trees: + if tree.typeIndex == track * 7 + index: + return tree + + def plantTree(self, treeIndex, value, plot=None, waterLevel=-1, + lastCheck=0, growthLevel=0, lastHarvested=0, + ownerIndex=-1, plotId=-1, pos=None, generate=True): + if not self.air: + return + + if plot: + if plot not in self.objects: + return + + plot.requestDelete() + self.objects.remove(plot) + + tree = DistributedGagTreeAI(self) + + tree.setTypeIndex(value) + tree.setWaterLevel(waterLevel) + tree.setGrowthLevel(growthLevel) + if ownerIndex != -1: + tree.setOwnerIndex(ownerIndex) + + if plotId != -1: + tree.setPlot(plotId) + + if pos is not None: + pos, h = pos + tree.setPos(pos) + tree.setH(h) + + tree.treeIndex = treeIndex + tree.calculate(lastHarvested, lastCheck) + self.trees.add(tree) + + if generate: + tree.generateWithRequired(self.estateMgr.zoneId) + + return tree + + def placePlot(self, treeIndex): + obj = DistributedGardenPlotAI(self) + obj.treeIndex = treeIndex + self.objects.add(obj) + + return obj + + def plantFlower(self, flowerIndex, species, variety, plot=None, waterLevel=-1, + lastCheck=0, growthLevel=0, ownerIndex=-1, plotId=-1, generate=True): + if not self.air: + return + + if plot: + if plot not in self.objects: + return + + plot.requestDelete() + self.objects.remove(plot) + + flower = DistributedFlowerAI(self) + + flower.setTypeIndex(species) + flower.setVariety(variety) + flower.setWaterLevel(waterLevel) + flower.setGrowthLevel(growthLevel) + if ownerIndex != -1: + flower.setOwnerIndex(ownerIndex) + + if plotId != -1: + flower.setPlot(plotId) + + flower.flowerIndex = flowerIndex + flower.calculate(lastCheck) + self.flowers.add(flower) + + if generate: + flower.generateWithRequired(self.estateMgr.zoneId) + + return flower + + def placeStatuary(self, data, plot=None, plotId=-1, ownerIndex=-1, + pos=None, generate=True): + if not self.air: + return + + if plot: + if plot not in self.objects: + return + + plot.requestDelete() + self.objects.remove(plot) + + data, lastCheck, index, growthLevel = self.S_unpack(data) + + dclass = DistributedStatuaryAI + if index in GardenGlobals.ToonStatuaryTypeIndices: + dclass = DistributedToonStatuaryAI + + elif index in GardenGlobals.ChangingStatuaryTypeIndices: + dclass = DistributedChangingStatuaryAI + + elif index in GardenGlobals.AnimatedStatuaryTypeIndices: + dclass = DistributedAnimatedStatuaryAI + + obj = dclass(self) + obj.growthLevel = growthLevel + obj.index = index + obj.data = data + + if ownerIndex != -1: + obj.setOwnerIndex(ownerIndex) + + if plotId != -1: + obj.setPlot(plotId) + + if pos is not None: + pos, h = pos + obj.setPos(pos) + obj.setH(h) + + obj.calculate(lastCheck) + + self.objects.add(obj) + + if generate: + obj.announceGenerate() + + return obj + + # Data structure + # VERY HIGH (vh) (64-bit) + # high high (H) = data (32-bit) + # high low (L) = lastCheck (32-bit) + # VERY LOW (vl) (16-bit) + # low high (h) = index (8-bit) + # low low (l) = growthLevel (8-bit) + + @staticmethod + def S_pack(data, lastCheck, index, growthLevel): + vh = data << 32 | lastCheck + vl = index << 8 | growthLevel + + return vh << 16 | vl + + @staticmethod + def S_unpack(x): + vh = x >> 16 + vl = x & 0xFFFF + + data = vh >> 32 + lastCheck = vh & 0xFFFFFFFF + + index = vl >> 8 + growthLevel = vl & 0xFF + + return data, lastCheck, index, growthLevel + + def getNullPlant(self): + return NULL_PLANT + + def reconsiderAvatarOrganicBonus(self): + av = self.air.doId2do.get(self.avId) + if not av: + return + + bonus = [-1] * 7 + for track in xrange(7): + for level in xrange(8):#7 + if not self.hasTree(track, level): + break + + tree = self.getTree(track, level) + if tree.getGrowthLevel() < tree.growthThresholds[1] or tree.getWilted(): + break + + bonus[track] = level - 1 + + av.b_setTrackBonusLevel(bonus) + + def update(self): + if self.air.dbConn: + self.air.dbGlobalCursor.gardens.update({'avId': self.avId}, {'$set': self.data}, upsert=True) + +class GardenManager: + def __init__(self, mgr): + self.mgr = mgr + self.gardens = {} + + def handleSingleGarden(self, avId): + g = Garden(self.mgr.air, avId) + g.gardenMgr = self + res = g.create(self.mgr) + if res: + self.gardens[avId] = g + + def destroy(self): + for garden in self.gardens.values(): + garden.destroy() + + del self.gardens class Rental: - def __init__(self, estate): self.estate = estate self.objects = set() - + def destroy(self): del self.estate - for obj in self.objects: - if not obj.isDeleted(): - obj.requestDelete() - taskMgr.remove(obj.uniqueName('delete')) + for object in self.objects: + if not object.isDeleted(): + object.requestDelete() + taskMgr.remove(object.uniqueName('delete')) self.objects = set() - + class CannonRental(Rental): - - def __init__(self, estate): - Rental.__init__(self, estate) - def generateObjects(self): target = DistributedTargetAI(self.estate.air) target.generateWithRequired(self.estate.zoneId) - + for drop in CannonGlobals.cannonDrops: cannon = DistributedCannonAI(self.estate.air) cannon.setEstateId(self.estate.doId) @@ -56,39 +419,40 @@ class CannonRental(Rental): cannon.setPosHpr(*drop) cannon.generateWithRequired(self.estate.zoneId) self.objects.add(cannon) - + self.generateTreasures() self.estate.b_setClouds(1) - + def destroy(self): self.estate.b_setClouds(0) Rental.destroy(self) - + def generateTreasures(self): doIds = [] z = 35 - + for i in xrange(20): x = random.randint(100, 300) - 200 y = random.randint(100, 300) - 200 - treasure = DistributedTreasureAI.DistributedTreasureAI(self.estate.air, self, 7, x, y, z) + treasure = DistributedTreasureAI.DistributedTreasureAI(self.estate.air, self, 9, x, y, z) treasure.generateWithRequired(self.estate.zoneId) self.objects.add(treasure) doIds.append(treasure.doId) - - self.estate.sendUpdate("setTreasureIds", [doIds]) - + + self.estate.sendUpdate('setTreasureIds', [doIds]) + def grabAttempt(self, avId, treasureId): av = self.estate.air.doId2do.get(avId) if av == None: self.estate.air.writeServerEvent('suspicious', avId, 'TreasurePlannerAI.grabAttempt unknown avatar') self.estate.notify.warning('avid: %s does not exist' % avId) return - + treasure = self.estate.air.doId2do.get(treasureId) if self.validAvatar(av): treasure.d_setGrab(avId) self.deleteTreasureSoon(treasure) + else: treasure.d_setReject() @@ -98,71 +462,57 @@ class CannonRental(Rental): def __deleteTreasureNow(self, treasure, taskName): treasure.requestDelete() - + def validAvatar(self, av): if av.getMaxHp() == av.getHp(): return 0 - + av.toonUp(3) return 1 -# Once we make rental game tables. -class TableRental(Rental): - - def __init__(self, estate): - Rental.__init__(self, estate) - - def generateObjects(self): - for drop in TableGlobals.tableDrops: - table = None - table.setEstateId(self.estate.doId) - table.setPosHpr(*drop) - table.generateWithRequired(self.estate.zoneId) - self.objects.add(table) - - def destroy(self): - Rental.destroy(self) - class DistributedEstateAI(DistributedObjectAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedEstateAI") - + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedEstateAI') + def __init__(self, air): DistributedObjectAI.__init__(self, air) self.toons = [0, 0, 0, 0, 0, 0] self.items = [[], [], [], [], [], []] - self.boxes = [[], [], [], [], [], []] - self.plots = [[], [], [], [], [], []] - self.decorData = [] + self.estateType = 0 self.cloudType = 0 self.dawnTime = 0 self.lastEpochTimestamp = 0 - self.rentalType = 0 - self.rentalHandle = None self.rentalTimestamp = 0 self.houses = [None] * 6 + self.rentalType = 0 + self.rentalHandle = None + self.doId2do = { } + self.pond = None self.spots = [] + self.targets = [] - self.jukebox = None + self.owner = None - - @property - def hostId(self): - return 1000000001 - + + self.gardenManager = GardenManager(self) + self.__pendingGardens = {} + def generate(self): DistributedObjectAI.generate(self) - + self.pond = DistributedFishingPondAI(simbase.air) self.pond.setArea(ToontownGlobals.MyEstate) self.pond.generateWithRequired(self.zoneId) - - for i in xrange(FishingTargetGlobals.getNumTargets(ToontownGlobals.MyEstate)): + + for i in range(FishingTargetGlobals.getNumTargets(ToontownGlobals.MyEstate)): target = DistributedFishingTargetAI(self.air) target.setPondDoId(self.pond.getDoId()) target.generateWithRequired(self.zoneId) self.targets.append(target) + #self.treasurePlanner = ETreasurePlannerAI.ETreasurePlannerAI(self.zoneId) + #self.treasurePlanner.start() + spot = DistributedFishingSpotAI(self.air) spot.setPondDoId(self.pond.getDoId()) spot.setPosHpr(49.1029, -124.805, 0.344704, 90, 0, 0) @@ -187,236 +537,153 @@ class DistributedEstateAI(DistributedObjectAI): spot.generateWithRequired(self.zoneId) self.spots.append(spot) - self.jukebox = DistributedPartyJukeboxActivityAI( - self.air, - self.doId, - (0, 0, 0, 0) - ) - self.jukebox.generateWithRequired(self.zoneId) - self.jukebox.sendUpdate('setX', [-21.8630]) - self.jukebox.sendUpdate('setY', [-154.669]) - self.jukebox.sendUpdate('setH', [148.7050]) - self.jukebox.sendUpdate('unloadSign') - - self.createTreasurePlanner() - - def generateRegisteredObjects(self, slot): - if len(self.plots[slot]) > 0: - for item in self.items[slot]: - plotData = GardenGlobals.estatePlots[slot][item[0]] - if item[1] == GardenGlobals.FLOWER_TYPE: - newItem = DistributedFlowerAI(self.air) - newItem.setEstate(self.doId) - newItem.setOwnerPlot(self.plots[slot][item[0]].doId) - newItem.setPlot(item[0]) - newItem.setHeading(plotData[2]) - newItem.setPosition(plotData[0], plotData[1], 1.3) - newItem.setOwnerIndex(slot) - newItem.setWaterLevel(item[4]) - newItem.setGrowthLevel(item[5]) - newItem.setTypeIndex(item[2]) - newItem.setVariety(item[3]) - elif item[1] == GardenGlobals.GAG_TREE_TYPE: - newItem = DistributedGagTreeAI(self.air) - newItem.setEstate(self.doId) - newItem.setOwnerPlot(self.plots[slot][item[0]].doId) - newItem.setPlot(item[0]) - newItem.setHeading(plotData[2]) - newItem.setPosition(plotData[0], plotData[1], 1.3) - newItem.setOwnerIndex(slot) - newItem.setTypeIndex(item[2]) - newItem.setWaterLevel(item[4]) - newItem.setGrowthLevel(item[5]) - elif item[1] == GardenGlobals.STATUARY_TYPE: - newItem = DistributedStatuaryAI(self.air) - newItem.setEstate(self.doId) - newItem.setOwnerPlot(self.plots[slot][item[0]].doId) - newItem.setPlot(item[0]) - newItem.setHeading(plotData[2]) - newItem.setPosition(plotData[0], plotData[1], 1.3) - newItem.setOwnerIndex(slot) - newItem.setTypeIndex(item[2]) - newItem.setWaterLevel(item[4]) - newItem.setGrowthLevel(item[5]) - elif item[1] == GardenGlobals.TOON_STATUARY_TYPE: - newItem = DistributedToonStatuaryAI(self.air) - newItem.setEstate(self.doId) - newItem.setOwnerPlot(self.plots[slot][item[0]].doId) - newItem.setPlot(item[0]) - newItem.setHeading(plotData[2]) - newItem.setPosition(plotData[0], plotData[1], 1.3) - newItem.setOwnerIndex(slot) - newItem.setTypeIndex(item[2]) - newItem.setWaterLevel(item[4]) - newItem.setGrowthLevel(item[5]) - newItem.setOptional(item[6]) - else: - continue - newItem.generateWithRequired(self.zoneId) - self.plots[slot][item[0]].planted = newItem - self.plots[slot][item[0]].sendUpdate('plantedItem', [newItem.doId]) - self.plots[slot][item[0]].sendUpdate('setMovie', [GardenGlobals.MOVIE_PLANT, 999999999]) - + ButterflyGlobals.generateIndexes(self.zoneId, ButterflyGlobals.ESTATE) + for i in range(0, ButterflyGlobals.NUM_BUTTERFLY_AREAS[ButterflyGlobals.ESTATE]): + for j in range(0, ButterflyGlobals.NUM_BUTTERFLIES[ButterflyGlobals.ESTATE]): + bfly = DistributedButterflyAI.DistributedButterflyAI(self.air, ButterflyGlobals.ESTATE, i, self.zoneId) + bfly.generateWithRequired(self.zoneId) + bfly.start() + self.addDistObj(bfly) def destroy(self): for house in self.houses: if house: house.requestDelete() - del self.houses[:] - + self.houses = [] if self.pond: - self.pond.requestDelete() for spot in self.spots: spot.requestDelete() + self.spots = [] for target in self.targets: target.requestDelete() - - if self.jukebox: - self.jukebox.requestDelete() - - if self.treasurePlanner: - self.treasurePlanner.stop() - + self.targets = [] + self.pond.requestDelete() + self.pond = None + + self.gardenManager.destroy() if self.rentalHandle: self.rentalHandle.destroy() self.rentalHandle = None - + self.requestDelete() - def setEstateReady(self): - pass + def addDistObj(self, distObj): + self.doId2do[distObj.doId] = distObj def setClientReady(self): self.sendUpdate('setEstateReady', []) - def setClosestHouse(self, todo0): - pass + def setEstateType(self, type): + self.estateType = type + + def d_setEstateType(self, type): + self.sendUpdate('setEstateType', [type]) + + def b_setEstateType(self, type): + self.setEstateType(type) + self.d_setEstateType(type) - def setTreasureIds(self, todo0): - pass - - def createTreasurePlanner(self): - treasureType, healAmount, spawnPoints, spawnRate, maxTreasures = TreasureGlobals.SafeZoneTreasureSpawns[ToontownGlobals.MyEstate] - self.treasurePlanner = SZTreasurePlannerAI(self.zoneId, treasureType, healAmount, spawnPoints, spawnRate, maxTreasures) - self.treasurePlanner.start() + def getEstateType(self): + return self.estateType def requestServerTime(self): avId = self.air.getAvatarIdFromSender() self.sendUpdateToAvatarId(avId, 'setServerTime', [time.time() % HouseGlobals.DAY_NIGHT_PERIOD]) - def setServerTime(self, todo0): - pass - def setDawnTime(self, dawnTime): self.dawnTime = dawnTime - + def d_setDawnTime(self, dawnTime): self.sendUpdate('setDawnTime', [dawnTime]) - + def b_setDawnTime(self, dawnTime): self.setDawnTime(dawnTime) self.d_setDawnTime(dawnTime) - + def getDawnTime(self): return self.dawnTime - def placeOnGround(self, todo0): - pass - - def setDecorData(self, decorData): - self.decorData = decorData - - def d_setDecorData(self, decorData): - self.sendUpdate('setDecorData', [decorData]) - - def b_setDecorData(self, decorData): - self.setDecorData(decorData) - self.d_setDecorData(decorData) - - def getDecorData(self): - return self.decorData - def setLastEpochTimeStamp(self, last): self.lastEpochTimestamp = last - + def d_setLastEpochTimeStamp(self, last): self.sendUpdate('setLastEpochTimeStamp', [last]) - + def b_setLastEpochTimeStamp(self, last): self.setLastEpochTimeStamp(last) self.d_setLastEpochTimeStamp(last) - + def getLastEpochTimeStamp(self): return self.lastEpochTimestamp def setRentalTimeStamp(self, rental): self.rentalTimestamp = rental - + def d_setRentalTimeStamp(self, rental): self.sendUpdate('setRentalTimeStamp', [rental]) - + def b_setRentalTimeStamp(self, rental): self.setRentalTimeStamp(rental) self.d_setRentalTimeStamp(rental) - + def getRentalTimeStamp(self): return self.rentalTimestamp def b_setRentalType(self, type): self.d_setRentalType(type) self.setRentalType(type) - + def d_setRentalType(self, type): - self.sendUpdate("setRentalType", [type]) - + self.sendUpdate('setRentalType', [type]) + def setRentalType(self, type): expirestamp = self.getRentalTimeStamp() if expirestamp == 0: expire = 0 + else: expire = int(expirestamp - time.time()) - + if expire < 0: self.rentalType = 0 self.d_setRentalType(0) self.b_setRentalTimeStamp(0) + else: if self.rentalType == type: return - + self.rentalType = type if self.rentalHandle: self.rentalHandle.destroy() self.rentalHandle = None - + if self.rentalType == ToontownGlobals.RentalCannon: self.rentalHandle = CannonRental(self) - elif self.rentalType == ToontownGlobals.RentalGameTable: - self.rentalHandle = TableRental(self) + else: self.notify.warning('Unknown rental %s' % self.rentalType) return - + self.rentalHandle.generateObjects() - + def getRentalType(self): return self.rentalType - + def rentItem(self, rentType, duration): - self.rentalType = rentType self.b_setRentalTimeStamp(time.time() + duration * 60) self.b_setRentalType(rentType) def setSlot0ToonId(self, id): self.toons[0] = id - + def d_setSlot0ToonId(self, id): self.sendUpdate('setSlot0ToonId', [id]) - + def b_setSlot0ToonId(self, id): self.setSlot0ToonId(id) self.d_setSlot0ToonId(id) - + def getSlot0ToonId(self): return self.toons[0] @@ -424,38 +691,38 @@ class DistributedEstateAI(DistributedObjectAI): self.items[0] = items def d_setSlot0Items(self, items): - self.sendUpdate('setSlot0Items', [items]) - + self.sendUpdate('setSlot5Items', [items]) + def b_setSlot0Items(self, items): self.setSlot0Items(items) self.d_setSlot0Items(items) - + def getSlot0Items(self): return self.items[0] - + def setSlot1ToonId(self, id): self.toons[1] = id def d_setSlot1ToonId(self, id): self.sendUpdate('setSlot1ToonId', [id]) - + def b_setSlot1ToonId(self, id): self.setSlot1ToonId(id) self.d_setSlot1ToonId(id) - + def getSlot1ToonId(self): return self.toons[1] - + def setSlot1Items(self, items): self.items[1] = items - + def d_setSlot1Items(self, items): - self.sendUpdate('setSlot1Items', [items]) - + self.sendUpdate('setSlot2Items', [items]) + def b_setSlot1Items(self, items): - self.setSlot1Items(items) - self.d_setSlot1Items(items) - + self.setSlot2Items(items) + self.d_setSlot2Items(items) + def getSlot1Items(self): return self.items[1] @@ -464,11 +731,11 @@ class DistributedEstateAI(DistributedObjectAI): def d_setSlot2ToonId(self, id): self.sendUpdate('setSlot2ToonId', [id]) - + def b_setSlot2ToonId(self, id): self.setSlot2ToonId(id) self.d_setSlot2ToonId(id) - + def getSlot2ToonId(self): return self.toons[2] @@ -477,198 +744,204 @@ class DistributedEstateAI(DistributedObjectAI): def d_setSlot2Items(self, items): self.sendUpdate('setSlot2Items', [items]) - + def b_setSlot2Items(self, items): self.setSlot2Items(items) self.d_setSlot2Items(items) - + def getSlot2Items(self): return self.items[2] def setSlot3ToonId(self, id): self.toons[3] = id - + def d_setSlot3ToonId(self, id): self.sendUpdate('setSlot3ToonId', [id]) - + def b_setSlot3ToonId(self, id): self.setSlot3ToonId(id) self.d_setSlot3ToonId(id) - + def getSlot3ToonId(self): return self.toons[3] def setSlot3Items(self, items): self.items[3] = items - + def d_setSlot3Items(self, items): self.sendUpdate('setSlot3Items', [items]) - + def b_setSlot3Items(self, items): self.setSlot3Items(items) self.d_setSlot3Items(items) - + def getSlot3Items(self): return self.items[3] def setSlot4ToonId(self, id): self.toons[4] = id - + def d_setSlot4ToonId(self, id): self.sendUpdate('setSlot4ToonId', [id]) - + def b_setSlot5ToonId(self, id): self.setSlot4ToonId(id) self.d_setSlot4ToonId(id) - + def getSlot4ToonId(self): return self.toons[4] def setSlot4Items(self, items): self.items[4] = items - + def d_setSlot4Items(self, items): self.sendUpdate('setSlot4Items', [items]) - + def b_setSlot4Items(self, items): self.setSlot4Items(items) self.d_setSlot4Items(items) - + def getSlot4Items(self): return self.items[4] def setSlot5ToonId(self, id): self.toons[5] = id - + def d_setSlot5ToonId(self, id): self.sendUpdate('setSlot5ToonId', [id]) - + def b_setSlot5ToonId(self, id): self.setSlot5ToonId(id) self.d_setSlot5ToonId(id) - + def getSlot5ToonId(self): return self.toons[5] def setSlot5Items(self, items): self.items[5] = items - + def d_setSlot5Items(self, items): self.sendUpdate('setSlot5Items', [items]) - + def b_setSlot5Items(self, items): self.setSlot5Items(items) self.d_setSlot5Items(items) - + def getSlot5Items(self): return self.items[5] def setIdList(self, idList): - for i in xrange(len(idList)): + for i in range(len(idList)): if i >= 6: return self.toons[i] = idList[i] - + def d_setIdList(self, idList): self.sendUpdate('setIdList', [idList]) - + def b_setIdList(self, idList): self.setIdList(idList) - self.d_setIdList(idList) - - def completeFlowerSale(self, todo0): - pass - - def completeFishSale(self, sell): + self.d_setIdLst(idList) + + def completeFlowerSale(self, flag): + if not flag: + return + avId = self.air.getAvatarIdFromSender() av = self.air.doId2do.get(avId) - if av: - if sell: - trophyResult = self.air.fishManager.creditFishTank(av) - if trophyResult: - self.sendUpdateToAvatarId(avId, 'thankSeller', [ToontownGlobals.FISHSALE_TROPHY, len(av.fishCollection), FishGlobals.getTotalNumFish()]) - else: - self.sendUpdateToAvatarId(avId, 'thankSeller', [ToontownGlobals.FISHSALE_COMPLETE, 0, 0]) - else: - self.sendUpdateToAvatarId(avId, 'thankSeller', [ToontownGlobals.FISHSALE_NONE, 0, 0]) - - def awardedTrophy(self, todo0): - pass - + if not av: + return + + collection = av.flowerCollection + + earning = 0 + newSpecies = 0 + for flower in av.flowerBasket.getFlower(): + if collection.collectFlower(flower) == GardenGlobals.COLLECT_NEW_ENTRY: + newSpecies += 1 + + earning += flower.getValue() + + av.b_setFlowerBasket([], []) + av.d_setFlowerCollection(*av.flowerCollection.getNetLists()) + av.addMoney(earning) + + oldSpecies = len(collection) - newSpecies + dt = abs(len(collection) // 10 - oldSpecies // 10) + if dt: + self.notify.info('%d is getting a gardening trophy!' % avId) + + maxHp = av.getMaxHp() + maxHp = min(ToontownGlobals.MaxHpLimit, maxHp + dt) + av.b_setMaxHp(maxHp) + av.toonUp(maxHp) + + self.sendUpdate('awardedTrophy', [avId]) + + av.b_setGardenTrophies(range(len(collection) // 10)) + def setClouds(self, clouds): self.cloudType = clouds - + def d_setClouds(self, clouds): self.sendUpdate('setClouds', [clouds]) - + def b_setClouds(self, clouds): self.setClouds(clouds) self.d_setClouds(clouds) - + def getClouds(self): return self.cloudType + + # Garden methods + def getToonSlot(self, avId): + if avId not in self.toons: + return + + return self.toons.index(avId) + + def setSlot0Garden(self, flag): + self.__pendingGardens[0] = flag - def cannonsOver(self): - pass + def setSlot1Garden(self, flag): + self.__pendingGardens[1] = flag - def gameTableOver(self): - pass + def setSlot2Garden(self, flag): + self.__pendingGardens[2] = flag + + def setSlot3Garden(self, flag): + self.__pendingGardens[3] = flag + + def setSlot4Garden(self, flag): + self.__pendingGardens[4] = flag - def placeStarterGarden(self, avatar): - # TODO: Place garden if a toon already owns one. - avId = avatar.doId - slot = self.toons.index(avId) - plotPos = GardenGlobals.estatePlots[slot] - boxPos = GardenGlobals.estateBoxes[slot] - for p, n in enumerate(boxPos): - x, y, h, i = n - newBox = DistributedGardenBoxAI(self.air) - newBox.setEstate(self.doId) - newBox.setTypeIndex(i) - newBox.setPlot(p) - newBox.setOwnerIndex(slot) - newBox.setPosition(x, y, 0) - newBox.setHeading(h) - newBox.generateWithRequired(self.zoneId) - self.boxes[slot].append(newBox) - for p, n in enumerate(plotPos): - i = n[3] - if i in [GardenGlobals.GAG_TREE_TYPE, GardenGlobals.STATUARY_TYPE]: - x, y, h = n[:3] - newPlot = DistributedGardenPlotAI(self.air) - newPlot.setEstate(self.doId) - newPlot.setPlot(p) - newPlot.setOwnerIndex(slot) - newPlot.setPosition(x, y, 0) - newPlot.setHeading(h) - newPlot.generateWithRequired(self.zoneId) - self.plots[slot].append(newPlot) - elif i == GardenGlobals.FLOWER_TYPE: - # TODO: Place flower plots more accurately. - x, y, h = n[:3] - newPlot = DistributedGardenPlotAI(self.air) - newPlot.setEstate(self.doId) - newPlot.setPlot(p) - newPlot.setOwnerIndex(slot) - newPlot.setPosition(x, y, 1.3) - newPlot.setHeading(h) - newPlot.generateWithRequired(self.zoneId) - self.plots[slot].append(newPlot) - self.generateRegisteredObjects(slot) + def setSlot5Garden(self, flag): + self.__pendingGardens[5] = flag + + def placeStarterGarden(self, avId, record=1): + av = self.air.doId2do.get(avId) + if not av: + return - def updateToons(self): - self.d_setSlot0ToonId(self.toons[0]) - self.d_setSlot1ToonId(self.toons[1]) - self.d_setSlot2ToonId(self.toons[2]) - self.d_setSlot3ToonId(self.toons[3]) - self.d_setSlot4ToonId(self.toons[4]) - self.d_setSlot5ToonId(self.toons[5]) + slot = self.getToonSlot(avId) + if slot is None: + return + + if record: + av.b_setGardenStarted(1) + self.sendUpdate('setSlot%dGarden' % slot, ['started']) + + self.notify.info('placeStarterGarden %d %d' % (avId, slot)) + self.gardenManager.handleSingleGarden(avId) + + def announceGenerate(self): + DistributedObjectAI.announceGenerate(self) self.sendUpdate('setIdList', [self.toons]) - - def updateItems(self): - self.d_setSlot0Items(self.items[0]) - self.d_setSlot1Items(self.items[1]) - self.d_setSlot2Items(self.items[2]) - self.d_setSlot3Items(self.items[3]) - self.d_setSlot4Items(self.items[4]) - self.d_setSlot5Items(self.items[5]) + + for index, started in self.__pendingGardens.items(): + if started: + self.gardenManager.handleSingleGarden(self.toons[index]) + + self.__pendingGardens = {} + if config.GetBool('fake-garden-started-ai', False): + self.placeStarterGarden(100000002, 0) \ No newline at end of file diff --git a/toontown/estate/DistributedFlower.py b/toontown/estate/DistributedFlower.py index 324130c9..d90f0cab 100755 --- a/toontown/estate/DistributedFlower.py +++ b/toontown/estate/DistributedFlower.py @@ -4,11 +4,15 @@ from toontown.estate import FlowerBase from toontown.estate import GardenGlobals from toontown.toontowngui import TTDialog from toontown.toonbase import TTLocalizer + +from DistributedGardenBox import DistributedGardenBox + DIRT_AS_WATER_INDICATOR = True DIRT_MOUND_HEIGHT = 0.3 class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.FlowerBase): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedFlower') + deferFor = 2 def __init__(self, cr): DistributedPlantBase.DistributedPlantBase.__init__(self, cr) @@ -17,16 +21,16 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl self.stickUp = 1.07 if DIRT_AS_WATER_INDICATOR: self.stickUp += DIRT_MOUND_HEIGHT - self.collSphereRadius = 2.8 + self.collSphereRadius = 2.2 self.shadowScale = 0.5 self.collSphereOffset = 0.0 self.dirtMound = None self.sandMound = None self.resultDialog = None - return def delete(self): DistributedPlantBase.DistributedPlantBase.delete(self) + del self.dirtMound del self.sandMound @@ -34,9 +38,6 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl DistributedPlantBase.DistributedPlantBase.setTypeIndex(self, typeIndex) self.setSpecies(typeIndex) - def getTypeIndex(self): - return self.typeIndex - def showWiltOrBloom(self): if not self.model: return @@ -52,7 +53,7 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl desat = wilt.find('**/*desat*') bloom.hide() leaves = wilt.findAllMatches('**/*leaf*') - for leafIndex in xrange(leaves.getNumPaths()): + for leafIndex in range(leaves.getNumPaths()): leaf = leaves.getPath(leafIndex) leaf.setColorScale(1.0, 0.3, 0.1, 1.0) @@ -132,7 +133,7 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl base.localAvatar.removeShovelRelatedDoId(self.doId) base.localAvatar.setInGardenAction(self) base.cr.playGame.getPlace().detectedGardenPlotUse() - self.sendUpdate('removeItem', [base.localAvatar.doId]) + self.sendUpdate('removeItem', []) def setWaterLevel(self, waterLevel): DistributedPlantBase.DistributedPlantBase.setWaterLevel(self, waterLevel) @@ -140,18 +141,15 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl if self.model: self.adjustWaterIndicator() - def getWaterLevel(self): - return self.waterLevel - def setGrowthLevel(self, growthLevel): origGrowthLevel = self.growthLevel self.growthLevel = growthLevel if origGrowthLevel > -1: self.loadModel() self.makeMovieNode() - - def getGrowthLevel(self): - return self.growthLevel + + if hasattr(self, '_boxDoId'): + self.setBoxDoId(*self._boxDoId) def makeMovieNode(self): self.movieNode = self.rotateNode.attachNewNode('moviePos') @@ -200,4 +198,17 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl self.resultDialog.destroy() self.resultDialog = None self.finishInteraction() - return + + def setBoxDoId(self, boxId, index): + self._boxDoId = (boxId, index) + box = base.cr.doId2do[boxId] + x = GardenGlobals.FLOWER_POS[box.typeIndex][index] + + self.setPos(0, 0, 0) + self.reparentTo(box) + self.setZ(1.5) + self.setX(x) + + def stick2Ground(self): + pass + \ No newline at end of file diff --git a/toontown/estate/DistributedFlowerAI.py b/toontown/estate/DistributedFlowerAI.py index e7d5621d..efc59041 100755 --- a/toontown/estate/DistributedFlowerAI.py +++ b/toontown/estate/DistributedFlowerAI.py @@ -1,26 +1,145 @@ from direct.directnotify import DirectNotifyGlobal -from toontown.estate.DistributedPlantBaseAI import DistributedPlantBaseAI +from otp.ai.MagicWordGlobal import * +from DistributedPlantBaseAI import DistributedPlantBaseAI +from FlowerBase import FlowerBase -# TODO: Add flower to basket when picking, give shovel skill only if the -# flower is player's tier. +import GardenGlobals +import time -class DistributedFlowerAI(DistributedPlantBaseAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedFlowerAI") +ONE_DAY = 86400 - def __init__(self, air): - DistributedPlantBaseAI.__init__(self, air) - self.air = air - self.typeIndex = None +class DistributedFlowerAI(DistributedPlantBaseAI, FlowerBase): + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedFlowerAI') + + def setTypeIndex(self, value): + DistributedPlantBaseAI.setTypeIndex(self, value) + FlowerBase.setSpecies(self, value) + + def calculate(self, lastCheck): + now = int(time.time()) + if lastCheck == 0: + lastCheck = now + + grown = 0 + + # Water level + elapsed = now - lastCheck + while elapsed > ONE_DAY: + if self.waterLevel >= 0: + grown += 1 + + elapsed -= ONE_DAY + self.waterLevel -= 1 + + self.waterLevel = max(self.waterLevel, -2) + + # Growth level + maxGrowth = self.growthThresholds[2] + newGL = min(self.growthLevel + grown, maxGrowth) + self.setGrowthLevel(newGL) + + self.lastCheck = now - elapsed + self.update() + + def update(self): + mdata = map(list, self.mgr.data['flowers']) + mdata[self.flowerIndex] = [self.getSpecies(), self.waterLevel, self.lastCheck, self.getGrowthLevel(), self.getVariety()] + self.mgr.data['flowers'] = mdata + self.mgr.update() + + def removeItem(self, usingSatanPickAll=0): + avId = self.air.getAvatarIdFromSender() + if not usingSatanPickAll: + if avId != self.ownerDoId: + self.air.writeServerEvent('suspicious', avId, 'tried to remove someone else\'s flower!') + return - def setTypeIndex(self, typeIndex): - DistributedPlantBaseAI.setTypeIndex(self, typeIndex) - self.typeIndex = typeIndex + self.d_setMovie(GardenGlobals.MOVIE_REMOVE) + + action = 'remove' + if self.getGrowthLevel() >= self.growthThresholds[2]: + action = 'pick' + + def _remove(task): + if not self.air: + return + + av = self.air.doId2do.get(self.ownerDoId) + if not av: + return + + plot = self.mgr.placePlot(self.flowerIndex) + plot.flowerIndex = self.flowerIndex + plot.setPlot(self.plot) + plot.setOwnerIndex(self.ownerIndex) + plot.generateWithRequired(self.zoneId) + + index = (0, 1, 2, 2, 2, 3, 3, 3, 4, 4)[self.flowerIndex] + idx = (0, 0, 0, 1, 2, 0, 1, 2, 0, 1)[self.flowerIndex] + plot.sendUpdate('setBoxDoId', [self.mgr._boxes[index].doId, idx]) + + self.air.writeServerEvent('%s-flower' % action, avId, plot=self.plot) + self.requestDelete() + + self.mgr.flowers.remove(self) + + mdata = map(list, self.mgr.data['flowers']) + mdata[self.flowerIndex] = self.mgr.getNullPlant() + self.mgr.data['flowers'] = mdata + self.mgr.update() + + if action == 'pick': + av.b_setShovelSkill(av.getShovelSkill() + self.getValue()) + av.addFlowerToBasket(self.getSpecies(), self.getVariety()) + + if task: + return task.done + + if usingSatanPickAll: + _remove(None) + + else: + taskMgr.doMethodLater(7, _remove, self.uniqueName('do-remove')) + +@magicWord(category=CATEGORY_PROGRAMMER) +def satanGrowFlowers(): + av = spellbook.getTarget() + estate = av.air.estateManager._lookupEstate(av) + + if not estate: + return 'Estate not found!' + + garden = estate.gardenManager.gardens.get(av.doId) + if not garden: + return 'Garden not found!' - def getTypeIndex(self): - return self.typeIndex + now = int(time.time()) + i = 0 + for flower in garden.flowers: + flower.b_setWaterLevel(5) + flower.b_setGrowthLevel(2) + flower.update() + i += 1 + + return '%d disgusting flowers grown' % i + +@magicWord(category=CATEGORY_PROGRAMMER) +def satanPickAll(): + av = spellbook.getTarget() + estate = av.air.estateManager._lookupEstate(av) + + if not estate: + return 'Estate not found!' + + garden = estate.gardenManager.gardens.get(av.doId) + if not garden: + return 'Garden not found!' - def setVariety(self, variety): - self.variety = variety - - def getVariety(self): - return self.variety + i = 0 + for flower in garden.flowers.copy(): + if flower.getGrowthLevel() >= flower.growthThresholds[2]: + flower.removeItem(1) + i += 1 + + return '%d disgusting flowers picked' % i + \ No newline at end of file diff --git a/toontown/estate/DistributedGagTree.py b/toontown/estate/DistributedGagTree.py index dc208312..f5f3cb64 100755 --- a/toontown/estate/DistributedGagTree.py +++ b/toontown/estate/DistributedGagTree.py @@ -29,7 +29,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.backupFruits = [] self.signHasBeenStuck2Ground = False self.setName('DistributedGagTree') - return + self.fruiting = 0 def delete(self): DistributedPlantBase.DistributedPlantBase.delete(self) @@ -79,7 +79,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.model.reparentTo(self.rotateNode) if self.isFruiting() and not self.isWilted(): self.fruits = [] - for i in xrange(1, self.maxFruit + 1): + for i in range(1, self.maxFruit + 1): pos = self.model.find('**/locator' + str(i)) if pos and not pos.isEmpty(): fruit = self.prop.copyTo(self.model) @@ -141,8 +141,6 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.confirmDialog.destroy() self.confirmDialog = None if value > 0: - base.localAvatar.showGardeningGui() - base.localAvatar.removeShovelRelatedDoId(self.doId) self.doPicking() else: self.finishInteraction() @@ -151,7 +149,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): def doPicking(self): if not self.canBePicked(): return - self.sendUpdate('removeItem', [base.localAvatar.doId]) + self.sendUpdate('removeItem', []) def createBackupFruits(self): if not hasattr(self, 'fruits'): @@ -175,6 +173,11 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.backupFruits.append(newFruit) def clearBackupFruits(self): + if self.fruits: + for fruit in self.fruits: + fruit.removeNode() + + self.fruits = None self.backupFruits = [] def doHarvesting(self): @@ -184,14 +187,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): for fruit in self.backupFruits: fruit.show() - self.sendUpdate('requestHarvest', [base.localAvatar.doId]) - - def hideItems(self): - if hasattr(self, 'fruits') and self.fruits: - seq = Parallel() - for item in self.fruits: - seq.append(LerpFunc(item.setAlphaScale, fromData=1, toData=0, duration=1)) - seq.start() + self.sendUpdate('requestHarvest', []) def getTrack(self): return self.gagTrack @@ -268,7 +264,6 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.movie.append(Func(toon.loop, 'neutral')) if avId == localAvatar.doId: self.movie.append(Func(self.finishInteraction)) - self.movie.append(Func(self.hideItems)) self.movie.append(Func(self.movieDone)) self.movie.append(Func(self.doResultDialog)) self.movie.start() @@ -299,7 +294,6 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): for fruit in self.backupFruits: fruitTrack.append(Sequence(Func(fruit.show), LerpPosInterval(fruit, 1.5, pos, startPos=Point3(fruit.getX(), fruit.getY(), fruit.getZ() + self.model.getZ())), Func(fruit.removeNode))) - self.fruits = None harvestTrack = Sequence(fruitTrack, Func(self.clearBackupFruits)) return harvestTrack @@ -343,7 +337,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): picker.traverse(render) if queue.getNumEntries() > 0: queue.sortEntries() - for index in xrange(queue.getNumEntries()): + for index in range(queue.getNumEntries()): entry = queue.getEntry(index) if DistributedLawnDecor.recurseParent(entry.getIntoNode(), 'terrain_DNARoot'): self.signModel.wrtReparentTo(render) @@ -356,25 +350,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): return Task.done def canBeHarvested(self): - myTrack, myLevel = GardenGlobals.getTreeTrackAndLevel(self.typeIndex) - levelsInTrack = [] - levelTreeDict = {} - allGagTrees = base.cr.doFindAll('DistributedGagTree') - for gagTree in allGagTrees: - if gagTree.getOwnerId() == localAvatar.doId: - curTrack, curLevel = GardenGlobals.getTreeTrackAndLevel(gagTree.typeIndex) - if curTrack == myTrack: - levelsInTrack.append(curLevel) - levelTreeDict[curLevel] = gagTree - - for levelToTest in xrange(myLevel): - if levelToTest not in levelsInTrack: - return False - curTree = levelTreeDict[levelToTest] - if not curTree.isGTEFullGrown(): - return False - - return True + return self.isFruiting() def hasDependentTrees(self): myTrack, myLevel = GardenGlobals.getTreeTrackAndLevel(self.typeIndex) @@ -403,8 +379,14 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.finishInteraction() return + def velvetRoped(self): + return not base.cr.isPaid() and ToontownBattleGlobals.gagIsPaidOnly(self.gagTrack, self.gagLevel) + def allowedToPick(self): - return True + retval = True + if self.velvetRoped(): + retval = False + return retval def unlockPick(self): retval = True @@ -417,3 +399,15 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): if inventory.numItem(self.gagTrack, self.gagLevel) >= inventory.getMax(self.gagTrack, self.gagLevel): retval = False return retval + + def setFruiting(self, fruiting): + self.fruiting = fruiting + if self.model: + self.model.removeNode() + self.loadModel() + self.adjustWaterIndicator() + self.stick2Ground() + + def isFruiting(self): + return self.fruiting + \ No newline at end of file diff --git a/toontown/estate/DistributedGagTreeAI.py b/toontown/estate/DistributedGagTreeAI.py index 67d80265..285eb3cc 100755 --- a/toontown/estate/DistributedGagTreeAI.py +++ b/toontown/estate/DistributedGagTreeAI.py @@ -1,35 +1,223 @@ from direct.directnotify import DirectNotifyGlobal +from otp.ai.MagicWordGlobal import * from toontown.estate.DistributedPlantBaseAI import DistributedPlantBaseAI -import GardenGlobals +import GardenGlobals, time + +ONE_DAY = 86400 + +PROBLEM_WILTED = 1 +PROBLEM_NOT_GROWN = 2 +PROBLEM_HARVESTED_LATELY = 4 class DistributedGagTreeAI(DistributedPlantBaseAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedGagTreeAI") + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGagTreeAI') + GrowRate = config.GetBool('trees-grow-rate', 2) - def __init__(self, air): - DistributedPlantBaseAI.__init__(self, air) - self.air = air + def __init__(self, mgr): + DistributedPlantBaseAI.__init__(self, mgr) self.wilted = 0 - + def announceGenerate(self): DistributedPlantBaseAI.announceGenerate(self) - - def delete(self): - DistributedPlantBaseAI.delete(self) - - def disable(self): - DistributedPlantBaseAI.disable(self) - + messenger.send(self.getEventName('generate')) + def setWilted(self, wilted): self.wilted = wilted - + + def d_setWilted(self, wilted): + self.sendUpdate('setWilted', [wilted]) + + def b_setWilted(self, wilted): + self.setWilted(wilted) + self.d_setWilted(wilted) + def getWilted(self): return self.wilted + + def calculate(self, lastHarvested, lastCheck): + now = int(time.time()) + if lastCheck == 0: + lastCheck = now + + grown = 0 + + # Water level + elapsed = now - lastCheck + while elapsed > ONE_DAY: + if self.waterLevel >= 0: + grown += self.GrowRate + + elapsed -= ONE_DAY + self.waterLevel -= 1 + + self.waterLevel = max(self.waterLevel, -2) + + # Growth level + maxGrowth = self.growthThresholds[2] + newGL = min(self.growthLevel + grown, maxGrowth) + self.setGrowthLevel(newGL) + + self.setWilted(self.waterLevel == -2) + + self.lastCheck = now - elapsed + self.lastHarvested = lastHarvested + self.update() + + def calcDependencies(self): + if self.getWilted(): + return + + missingPrevIndex = 0 + track, value = GardenGlobals.getTreeTrackAndLevel(self.typeIndex) + while value: + value -= 1 + if not self.mgr.hasTree(track, value): + self.b_setWilted(1) + continue + + tree = self.mgr.getTree(track, value) + if not tree: + self.b_setWilted(1) + continue + + self.accept(self.getEventName('going-down', 666), self.ignoreAll) + self.accept(self.getEventName('remove', track * 7 + value), self.calcDependencies) + + def getEventName(self, string, typeIndex=None): + typeIndex = typeIndex if typeIndex is not None else self.typeIndex + return 'garden-%d-%d-%s' % (self.ownerDoId, typeIndex, string) + + def delete(self): + messenger.send(self.getEventName('remove')) + self.ignoreAll() + DistributedPlantBaseAI.delete(self) + + def update(self): + mdata = map(list, self.mgr.data['trees']) + mdata[self.treeIndex] = [self.typeIndex, self.waterLevel, self.lastCheck, self.getGrowthLevel(), self.lastHarvested] + self.mgr.data['trees'] = mdata + self.mgr.update() + + def isFruiting(self): + problem = 0 + if self.getWilted(): + problem |= PROBLEM_WILTED + + if self.getGrowthLevel() < self.growthThresholds[2]: + problem |= PROBLEM_NOT_GROWN + + if (self.lastCheck - self.lastHarvested) < ONE_DAY: + problem |= PROBLEM_HARVESTED_LATELY + + return problem + + def getFruiting(self): + return self.isFruiting() == 0 + + def requestHarvest(self): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if not av: + return + + if avId != self.ownerDoId: + self.air.writeServerEvent('suspicious', avId, 'tried to harvest someone else\'s tree!') + return + + problem = self.isFruiting() + if problem: + self.air.writeServerEvent('suspicious', avId, 'tried to harvest a tree that\'s not fruiting!', problem=problem) + return - def requestHarvest(self, doId): - # TODO: Actually harvest the gags and add them to toon inventory. - av = simbase.air.doId2do.get(doId) harvested = 0 track, level = GardenGlobals.getTreeTrackAndLevel(self.typeIndex) while av.inventory.addItem(track, level) > 0 and harvested < 10: harvested += 1 - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_HARVEST, doId]) + + av.d_setInventory(av.getInventory()) + + self.lastHarvested = int(time.time()) + self.sendUpdate('setFruiting', [self.getFruiting()]) + self.d_setMovie(GardenGlobals.MOVIE_HARVEST) + self.update() + + def removeItem(self): + avId = self.air.getAvatarIdFromSender() + self.d_setMovie(GardenGlobals.MOVIE_REMOVE) + + def _remove(task): + if not self.air: + return + + plot = self.mgr.placePlot(self.treeIndex) + plot.setPlot(self.plot) + plot.setPos(self.getPos()) + plot.setH(self.getH()) + plot.setOwnerIndex(self.ownerIndex) + plot.generateWithRequired(self.zoneId) + + self.air.writeServerEvent('remove-tree', avId, plot=self.plot) + self.requestDelete() + + self.mgr.trees.remove(self) + + mdata = map(list, self.mgr.data['trees']) + mdata[self.treeIndex] = self.mgr.getNullPlant() + self.mgr.data['trees'] = mdata + self.mgr.update() + + self.mgr.reconsiderAvatarOrganicBonus() + + return task.done + + taskMgr.doMethodLater(7, _remove, self.uniqueName('do-remove')) + + def doGrow(self, grown): + maxGrowth = self.growthThresholds[2] + newGL = max(0, min(self.growthLevel + grown, maxGrowth)) + oldGrowthLevel = self.growthLevel + + self.b_setGrowthLevel(newGL) + self.update() + + return newGL - oldGrowthLevel + +@magicWord(category=CATEGORY_PROGRAMMER, types=[int, int, int]) +def satanGrow(track, index, grown=21): + av = spellbook.getTarget() + estate = av.air.estateManager._lookupEstate(av) + + if not estate: + return 'Estate not found!' + + garden = estate.gardenManager.gardens.get(av.doId) + if not garden: + return 'Garden not found!' + + tree = garden.getTree(track, index) + if not tree: + return 'Tree not found!' + + result = tree.doGrow(grown) + return 'Satan has grown %d units!' % result + +@magicWord(category=CATEGORY_PROGRAMMER, types=[int, int]) +def satanFruit(track, index): + av = spellbook.getTarget() + estate = av.air.estateManager._lookupEstate(av) + + if not estate: + return 'Estate not found!' + + garden = estate.gardenManager.gardens.get(av.doId) + if not garden: + return 'Garden not found!' + + tree = garden.getTree(track, index) + if not tree: + return 'Tree not found!' + + tree.calculate(0, tree.lastCheck) + tree.sendUpdate('setFruiting', [tree.getFruiting()]) + return 'Satan is now fruiting!' + \ No newline at end of file diff --git a/toontown/estate/DistributedGarden.py b/toontown/estate/DistributedGarden.py index 46ee2ea5..e52a5a72 100755 --- a/toontown/estate/DistributedGarden.py +++ b/toontown/estate/DistributedGarden.py @@ -1,9 +1,22 @@ -from panda3d.core import * -from direct.distributed import DistributedObject -from direct.distributed.ClockDelta import * -from direct.directnotify import DirectNotifyGlobal -from direct.gui.DirectGui import * +from pandac.PandaModules import * from toontown.toonbase.ToonBaseGlobal import * +from direct.gui.DirectGui import * +from pandac.PandaModules import * +from direct.distributed.ClockDelta import * +from toontown.toonbase import ToontownGlobals +from direct.distributed import DistributedObject +from direct.directnotify import DirectNotifyGlobal +from direct.fsm import ClassicFSM +from direct.fsm import State +from toontown.toon import Toon +from direct.showbase import RandomNumGen +from toontown.toonbase import TTLocalizer +import random +import random +import cPickle +from direct.showbase import PythonUtil +from toontown.hood import Place +import Estate import HouseGlobals class DistributedGarden(DistributedObject.DistributedObject): @@ -18,7 +31,7 @@ class DistributedGarden(DistributedObject.DistributedObject): self.radius = 0 self.gridCells = 20 self.propTable = [None] * self.gridCells - for i in xrange(len(self.propTable)): + for i in range(len(self.propTable)): self.propTable[i] = [None] * self.gridCells self.dx = 1.0 / self.gridCells diff --git a/toontown/estate/DistributedGardenAI.py b/toontown/estate/DistributedGardenAI.py index 302e02d0..34378ce2 100755 --- a/toontown/estate/DistributedGardenAI.py +++ b/toontown/estate/DistributedGardenAI.py @@ -4,25 +4,6 @@ from direct.distributed.DistributedObjectAI import DistributedObjectAI class DistributedGardenAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedGardenAI") - def __init__(self, air): - DistributedObjectAI.__init__(self, air) - self.air = air - self.props = [] + def sendNewProp(self, todo0, todo1, todo2, todo3): + pass - def generate(self): - DistributedObjectAI.generate(self) - - def announceGenerate(self): - DistributedObjectAI.announceGenerate(self) - - def disable(self): - DistributedObjectAI.disable(self) - - def delete(self): - DistributedObjectAI.delete(self) - - def setProps(self, props): - self.props = props - - def d_sendNewProp(self, prop, x, y, z): - self.sendUpdate('sendNewProp', [prop, x, y, z]) diff --git a/toontown/estate/DistributedGardenBox.py b/toontown/estate/DistributedGardenBox.py index b62dcf13..48edda74 100755 --- a/toontown/estate/DistributedGardenBox.py +++ b/toontown/estate/DistributedGardenBox.py @@ -11,7 +11,7 @@ from pandac.PandaModules import Vec3 class DistributedGardenBox(DistributedLawnDecor.DistributedLawnDecor): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGardenPlot') - + def __init__(self, cr): DistributedLawnDecor.DistributedLawnDecor.__init__(self, cr) self.plantPath = NodePath('plantPath') @@ -19,25 +19,21 @@ class DistributedGardenBox(DistributedLawnDecor.DistributedLawnDecor): self.plotScale = 1.0 self.plantingGuiDoneEvent = 'plantingGuiDone' self.defaultModel = 'phase_5.5/models/estate/planterC' - - def announceGenerate(self): - self.notify.debug('announceGenerate') - DistributedLawnDecor.DistributedLawnDecor.announceGenerate(self) - + def doModelSetup(self): if self.typeIndex == GardenGlobals.BOX_THREE: self.defaultModel = 'phase_5.5/models/estate/planterA' elif self.typeIndex == GardenGlobals.BOX_TWO: self.defaultModel = 'phase_5.5/models/estate/planterC' else: - self.defaultModel = 'phase_5.5/models/estate/planterB' + self.defaultModel = 'phase_5.5/models/estate/planterD' self.collSphereOffset = 0.0 self.collSphereRadius = self.collSphereRadius * 1.41 self.plotScale = Vec3(1.0, 1.0, 1.0) - + def setupShadow(self): pass - + def loadModel(self): self.rotateNode = self.plantPath.attachNewNode('rotate') self.model = None @@ -45,13 +41,13 @@ class DistributedGardenBox(DistributedLawnDecor.DistributedLawnDecor): self.model.setScale(self.plotScale) self.model.reparentTo(self.rotateNode) self.stick2Ground() - return - + def handleEnterPlot(self, entry = None): pass - + def handleExitPlot(self, entry = None): DistributedLawnDecor.DistributedLawnDecor.handleExitPlot(self, entry) - + def setTypeIndex(self, typeIndex): self.typeIndex = typeIndex + \ No newline at end of file diff --git a/toontown/estate/DistributedGardenBoxAI.py b/toontown/estate/DistributedGardenBoxAI.py index 1c24b315..eadd31a9 100755 --- a/toontown/estate/DistributedGardenBoxAI.py +++ b/toontown/estate/DistributedGardenBoxAI.py @@ -4,13 +4,9 @@ from toontown.estate.DistributedLawnDecorAI import DistributedLawnDecorAI class DistributedGardenBoxAI(DistributedLawnDecorAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedGardenBoxAI") - def __init__(self, air): - DistributedLawnDecorAI.__init__(self, air) - self.air = air - self.typeIndex = 0 - def setTypeIndex(self, index): - self.typeIndex = index + self.index = index def getTypeIndex(self): - return self.typeIndex + return self.index + \ No newline at end of file diff --git a/toontown/estate/DistributedGardenPlot.py b/toontown/estate/DistributedGardenPlot.py index f613df9f..5e7ea074 100755 --- a/toontown/estate/DistributedGardenPlot.py +++ b/toontown/estate/DistributedGardenPlot.py @@ -2,6 +2,7 @@ import DistributedLawnDecor from direct.directnotify import DirectNotifyGlobal from direct.showbase.ShowBase import * from direct.interval.IntervalGlobal import * +from DistributedGardenBox import DistributedGardenBox import GardenGlobals from toontown.toonbase import TTLocalizer from toontown.estate import PlantingGUI @@ -14,6 +15,7 @@ import types class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGardenPlot') + deferFor = 2 def __init__(self, cr): DistributedLawnDecor.DistributedLawnDecor.__init__(self, cr) @@ -25,7 +27,6 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): self.defaultModel = 'phase_5.5/models/estate/dirt_mound' self.colorScaler = Vec4(1, 1, 1, 1) self.plantingGui = None - self.planted = None return def delete(self): @@ -84,8 +85,6 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): return self.getPlantingText() def handleEnterPlot(self, entry = None): - #Force Gardens -Zach - base.localAvatar.setGardenStarted(True) dist = self.getDistance(localAvatar) if self.canBePlanted(): base.localAvatar.addShovelRelatedDoId(self.doId) @@ -110,12 +109,7 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): return plantText def canBePlanted(self): - retval = True - if not base.localAvatar.doId == self.getOwnerId(): - retval = False - if hasattr(self, 'planted') and self.planted: - retval = False - return retval + return base.localAvatar.doId == self.getOwnerId() def plantSomething(self): whatCanBePlanted = GardenGlobals.whatCanBePlanted(self.ownerIndex, self.plot) @@ -143,13 +137,14 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): recipeKey = GardenGlobals.getRecipeKey(recipeStr, special) if recipeKey >= 0: species, variety = GardenGlobals.getSpeciesVarietyGivenRecipe(recipeKey) + print 'RK>0', species, variety if species >= 0 and variety >= 0: - self.sendUpdate('plantFlower', [species, variety, base.localAvatar.doId]) + self.sendUpdate('plantFlower', [species, variety]) successPlanting = True else: self.notify.debug('%s %d is not a valid recipe' % (recipeStr, special)) burntBeans = len(recipeStr) - self.sendUpdate('plantNothing', [burntBeans, base.localAvatar.doId]) + self.sendUpdate('plantNothing', [burntBeans]) if successPlanting: flowerName = GardenGlobals.getFlowerVarietyName(species, variety) stringToShow = TTLocalizer.getResultPlantedSomethingSentence(flowerName) @@ -209,11 +204,11 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): if species >= 205 and species <= 208: successToonStatue = True else: - self.sendUpdate('plantStatuary', [species, base.localAvatar.doId]) + self.sendUpdate('plantStatuary', [species]) else: self.notify.debug('%s %d is not a valid recipe' % (recipeStr, special)) burntBeans = len(recipeStr) - self.sendUpdate('plantNothing', [burntBeans, base.localAvatar.doId]) + self.sendUpdate('plantNothing', [burntBeans]) if successPlanting: itemName = GardenGlobals.PlantAttributes[species]['name'] stringToShow = TTLocalizer.getResultPlantedSomethingSentence(itemName) @@ -252,7 +247,7 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): base.localAvatar.showGardeningGui() base.localAvatar.removeShovelRelatedDoId(self.doId) if willPlant: - self.sendUpdate('plantToonStatuary', [species, dnaCode, base.localAvatar.doId]) + self.sendUpdate('plantToonStatuary', [species, dnaCode]) else: self.popupItemPlantingGui() return @@ -271,21 +266,11 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): base.localAvatar.showGardeningGui() base.localAvatar.removeShovelRelatedDoId(self.doId) if willPlant: - self.sendUpdate('plantGagTree', [gagTrack, gagLevel, base.localAvatar.doId]) + self.sendUpdate('plantGagTree', [gagTrack, gagLevel]) else: self.finishInteraction() return - def plantedItem(self, doId): - self.planted = doId - - def removePlanted(self): - if self.planted: - item = base.cr.doId2do.get(self.planted) - if item: - item.delete() - self.planted = None - def setMovie(self, mode, avId): if mode == GardenGlobals.MOVIE_PLANT: self.doPlaceItemTrack(avId) @@ -316,8 +301,8 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): self.movie.append(Func(toon.detachShovel)) if self.model: pos = self.model.getPos() - pos.setZ(pos[2] + 1) - animProp = LerpPosInterval(self.model, 3, pos, self.model.getPos()) + pos.setZ(pos[2] - 1) + animProp = LerpPosInterval(self.model, 3, self.model.getPos(), pos) shrinkProp = LerpScaleInterval(self.model, 3, scale=self.plotScale, startScale=0.01) objAnimShrink = ParallelEndTogether(animProp, shrinkProp) self.movie.append(objAnimShrink) @@ -325,16 +310,10 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): self.movie.append(Func(toon.loop, 'neutral')) if avId == localAvatar.doId: self.movie.append(Func(self.finishInteraction)) - self.movie.append(Func(self.removePlanted)) + self.movie.append(Func(self.movieDone)) self.movie.start() def doPlaceItemTrack(self, avId, item = None): - if avId == 999999999: - pos = self.model.getPos() - pos.setZ(pos[2] - 1) - self.model.setPos(pos) - self.model.setScale(0.01) - return toon = base.cr.doId2do.get(avId) if not toon: return @@ -348,24 +327,14 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): self.movie = Sequence(self.startCamIval(avId), moveTrack, Func(shovel.show), placeItemTrack) if avId == localAvatar.doId: self.expectingReplacement = 1 - self.movie.append(Func(self.sendUpdate, 'finishPlanting', [avId])) + self.movie.append(Func(self.movieDone)) self.movie.start() def generatePlaceItemTrack(self, toon, item): sound = loader.loadSfx('phase_5.5/audio/sfx/burrow.ogg') sound.setPlayRate(0.5) placeItemTrack = Parallel() - placeItemTrack.append(Sequence(ActorInterval(toon, 'start-dig'), - Parallel(ActorInterval(toon, 'loop-dig', loop=1, duration=5.13), - Sequence(Wait(0.25), - SoundInterval(sound, node=toon, duration=0.55), - Wait(0.8), - SoundInterval(sound, node=toon, duration=0.55), - Wait(1.35), - SoundInterval(sound, node=toon, duration=0.55))), - ActorInterval(toon, 'start-dig', playRate=-1), - Func(toon.loop, 'neutral'), - Func(toon.detachShovel))) + placeItemTrack.append(Sequence(ActorInterval(toon, 'start-dig'), Parallel(ActorInterval(toon, 'loop-dig', loop=1, duration=5.13), Sequence(Wait(0.25), SoundInterval(sound, node=toon, duration=0.55), Wait(0.8), SoundInterval(sound, node=toon, duration=0.55), Wait(1.35), SoundInterval(sound, node=toon, duration=0.55))), ActorInterval(toon, 'start-dig', playRate=-1), Func(toon.loop, 'neutral'), Func(toon.detachShovel))) if self.model: pos = self.model.getPos() pos.setZ(pos[2] - 1) @@ -374,12 +343,7 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): objAnimShrink = ParallelEndTogether(animProp, shrinkProp) placeItemTrack.append(objAnimShrink) if item: - placeItemTrack.append(Sequence(Func(item.reparentTo, toon.rightHand), - Wait(0.55), - Func(item.wrtReparentTo, render), - Parallel(LerpHprInterval(item, hpr=self.getHpr(render), duration=1.2), - ProjectileInterval(item, endPos=self.getPos(render), duration=1.2, gravityMult=0.45)), - Func(item.removeNode))) + placeItemTrack.append(Sequence(Func(item.reparentTo, toon.rightHand), Wait(0.55), Func(item.wrtReparentTo, render), Parallel(LerpHprInterval(item, hpr=self.getHpr(render), duration=1.2), ProjectileInterval(item, endPos=self.getPos(render), duration=1.2, gravityMult=0.45)), Func(item.removeNode))) return placeItemTrack def makeMovieNode(self): @@ -390,3 +354,20 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): self.stick2Ground() else: DistributedLawnDecor.DistributedLawnDecor.makeMovieNode(self) + + def setBoxDoId(self, boxId, index): + box = base.cr.doId2do[boxId] + x = GardenGlobals.FLOWER_POS[box.typeIndex][index] + + self.setPos(0, 0, 0) + self.reparentTo(box) + self.setZ(1.2) + self.setX(x) + + def stick2Ground(self, *args, **kwargs): + plotType = GardenGlobals.whatCanBePlanted(self.ownerIndex, self.plot) + if plotType == GardenGlobals.FLOWER_TYPE: + return + + return DistributedLawnDecor.DistributedLawnDecor.stick2Ground(self, *args, **kwargs) + \ No newline at end of file diff --git a/toontown/estate/DistributedGardenPlotAI.py b/toontown/estate/DistributedGardenPlotAI.py index ad9f0376..9f0ff7f1 100755 --- a/toontown/estate/DistributedGardenPlotAI.py +++ b/toontown/estate/DistributedGardenPlotAI.py @@ -1,189 +1,249 @@ from direct.directnotify import DirectNotifyGlobal -from toontown.estate.DistributedLawnDecorAI import DistributedLawnDecorAI -from DistributedToonStatuaryAI import DistributedToonStatuaryAI -from DistributedStatuaryAI import DistributedStatuaryAI -from DistributedGagTreeAI import DistributedGagTreeAI -from DistributedFlowerAI import DistributedFlowerAI +from otp.ai.MagicWordGlobal import * +from DistributedLawnDecorAI import DistributedLawnDecorAI import GardenGlobals -import datetime - -slots2plots = { - 0: GardenGlobals.plots0, - 1: GardenGlobals.plots1, - 2: GardenGlobals.plots2, - 3: GardenGlobals.plots3, - 4: GardenGlobals.plots4, - 5: GardenGlobals.plots5 -} class DistributedGardenPlotAI(DistributedLawnDecorAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedGardenPlotAI") - - def __init__(self, air): - DistributedLawnDecorAI.__init__(self, air) - self.air = air - self.planted = None - + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGardenPlotAI') + def announceGenerate(self): DistributedLawnDecorAI.announceGenerate(self) - - def delete(self): - DistributedLawnDecorAI.delete(self) - - def disable(self): - DistributedLawnDecorAI.disable(self) - - def finishPlanting(self, avId): - self.planted.generateWithRequired(self.zoneId) - self.addData() - self.sendUpdate('plantedItem', [self.planted.doId]) - self.planted.sendUpdate('setMovie', [GardenGlobals.MOVIE_FINISHPLANTING, avId]) - - def finishRemoving(self, avId): - self.removeData() - self.planted.removeNode() - self.planted.delete() - simbase.air.removeObject(self.planted.doId) - self.planted = None - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_FINISHREMOVING, avId]) - - def addData(self): - estate = simbase.air.doId2do.get(self.getEstate()) - plantedAt = int(datetime.datetime.now().strftime('%Y%m%d%H%M')) # TODO: Possibly store this in mongodb/cPickle instead. - if isinstance(self.planted, DistributedFlowerAI): - data = [ - self.getPlot(), - GardenGlobals.FLOWER_TYPE, - self.planted.getTypeIndex(), - self.planted.getVariety(), - self.planted.getWaterLevel(), - self.planted.getGrowthLevel(), - 0, - plantedAt, - plantedAt - ] - elif isinstance(self.planted, DistributedGagTreeAI): - data = [ - self.getPlot(), - GardenGlobals.GAG_TREE_TYPE, - self.planted.getTypeIndex(), - 0, - self.planted.getWaterLevel(), - self.planted.getGrowthLevel(), - 0, - plantedAt, - plantedAt - ] - elif isinstance(self.planted, DistributedToonStatuaryAI): - data = [ - self.getPlot(), - GardenGlobals.TOON_STATUARY_TYPE, - self.planted.getTypeIndex(), - 0, - self.planted.getWaterLevel(), - self.planted.getGrowthLevel(), - self.planted.getOptional(), - plantedAt, - plantedAt - ] - elif isinstance(self.planted, DistributedStatuaryAI): - data = [ - self.getPlot(), - GardenGlobals.STATUARY_TYPE, - self.planted.getTypeIndex(), - 0, - self.planted.getWaterLevel(), - self.planted.getGrowthLevel(), - 0, - plantedAt, - plantedAt - ] - else: + self.plotType = GardenGlobals.whatCanBePlanted(self.ownerIndex, self.plot) + self.__plantingAvId = 0 + + def __initialSanityCheck(self, wantedType=None, forceOwner=False): + if self.__plantingAvId: + # Busy, silently ignore return - estate.items[self.getOwnerIndex()].append(tuple(data)) - estate.updateItems() + + avId = self.air.getAvatarIdFromSender() + + av = self.air.doId2do.get(avId) + if not av: + self.air.writeServerEvent('suspicious', avId, 'called DistributedGardenPlotAI method outside shard!') + return + + if wantedType is not None and self.plotType != wantedType: + self.air.writeServerEvent('suspicious', avId, 'called incorrect DistributedGardenPlotAI method!', plotType=self.plotType, + wantedType=wantedType) + return self.d_interactionDenied() + + + if avId != self.ownerDoId and not forceOwner: + self.air.writeServerEvent('suspicious', avId, 'called someone else\'s DistributedGardenPlotAI plant method!', + ownerDoId=self.ownerDoId) + return self.d_interactionDenied() + + return av - def removeData(self): - estate = simbase.air.doId2do.get(self.getEstate()) - dataIndex = -1 - for n, item in enumerate(estate.items[self.getOwnerIndex()]): - if item[0] == self.getPlot(): - dataIndex = n - if dataIndex >= 0: - del estate.items[self.getOwnerIndex()][dataIndex] - estate.updateItems() + def plantFlower(self, species, variety, usingSatanFlowerAll=0): + av = self.__initialSanityCheck(GardenGlobals.FLOWER_TYPE if not usingSatanFlowerAll else None, usingSatanFlowerAll) + if not av: + return + + def invalid(problem): + msg = 'tried to plant flower but something went wrong: %s' % problem + self.notify.warning('%d %s' % (av.doId, msg)) + self.air.writeServerEvent('suspicious', av.doId, msg) + if not usingSatanFlowerAll: + return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED) + + attr = GardenGlobals.PlantAttributes.get(species, {}) + if attr.get('plantType') != GardenGlobals.FLOWER_TYPE: + return invalid('invalid species: %d' % species) + + if variety >= len(attr['varieties']): + return invalid('invalid variety: %d' % variety) + + if not usingSatanFlowerAll: + cost = len(GardenGlobals.Recipes[attr['varieties'][variety][0]]['beans']) + av.takeMoney(cost) + + self.d_setMovie(GardenGlobals.MOVIE_PLANT) + + def _plant(task): + flower = self.mgr.plantFlower(self.flowerIndex, species, variety, plot=self, + ownerIndex=self.ownerIndex, plotId=self.plot, + waterLevel=0) + index = (0, 1, 2, 2, 2, 3, 3, 3, 4, 4)[self.flowerIndex] + idx = (0, 0, 0, 1, 2, 0, 1, 2, 0, 1)[self.flowerIndex] + flower.sendUpdate('setBoxDoId', [self.mgr._boxes[index].doId, idx]) + + if not usingSatanFlowerAll: + flower.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId) + flower.d_setMovie(GardenGlobals.MOVIE_CLEAR, self.__plantingAvId) + + self.air.writeServerEvent('plant-flower', self.__plantingAvId, species=species, variety=variety, + plot=self.plot, name=attr.get('name', 'unknown satan flower')) + if task: + return task.done + + if usingSatanFlowerAll: + _plant(None) + + else: + taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant')) + + self.__plantingAvId = av.doId + return 1 + + def plantGagTree(self, track, index): + av = self.__initialSanityCheck(GardenGlobals.GAG_TREE_TYPE) + if not av: + return + + for i in xrange(index): + if not self.mgr.hasTree(track, i): + msg = 'tried to plant tree but an index is missing: %d' % index + self.notify.warning('%d %s' % (av.doId, msg)) + self.air.writeServerEvent('suspicious', av.doId, msg) + return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED) + + if self.mgr.hasTree(track, index): + msg = 'tried to plant tree but gag already planted' + self.notify.warning('%d %s' % (av.doId, msg)) + self.air.writeServerEvent('suspicious', av.doId, msg) + return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED) + + if av.inventory.useItem(track, index) == -1: + msg = 'tried to plant tree but not carrying selected gag' + self.notify.warning('%d %s' % (av.doId, msg)) + self.air.writeServerEvent('suspicious', av.doId, msg) + return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED) + + av.d_setInventory(av.getInventory()) + self.d_setMovie(GardenGlobals.MOVIE_PLANT) + + def _plant(task): + if not self.air: + return + + tree = self.mgr.plantTree(self.treeIndex, track * 7 + index, plot=self, ownerIndex=self.ownerIndex, + plotId=self.plot, pos=(self.getPos(), self.getH())) + tree.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId) + tree.d_setMovie(GardenGlobals.MOVIE_CLEAR, self.__plantingAvId) + self.air.writeServerEvent('plant-tree', self.__plantingAvId, track=track, index=index, plot=self.plot) + return task.done + + taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant')) + self.__plantingAvId = av.doId - def plantFlower(self, species, variety, toon): - #free for now - #av = simbase.air.doId2do.get(toon) - #av.takeMoney(GardenGlobals.getNumBeansRequired(species, variety)) - self.planted = DistributedFlowerAI(self.air) - self.planted.setEstate(self.getEstate()) - self.planted.setOwnerPlot(self.doId) - self.planted.setPlot(self.getPlot()) - self.planted.setHeading(self.getHeading()) - self.planted.setPosition(*self.getPosition()) - self.planted.setOwnerIndex(self.getOwnerIndex()) - self.planted.setWaterLevel(0) - self.planted.setGrowthLevel(0) - self.planted.setTypeIndex(species) - self.planted.setVariety(variety) - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_PLANT, toon]) + def plantStatuary(self, species): + av = self.__initialSanityCheck(GardenGlobals.STATUARY_TYPE) + if not av: + return + + def invalid(problem): + msg = 'tried to plant statuary but something went wrong: %s' % problem + self.notify.warning('%d %s' % (av.doId, msg)) + self.air.writeServerEvent('suspicious', av.doId, msg) + return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED) + + attr = GardenGlobals.PlantAttributes.get(species, {}) + if attr.get('plantType') != GardenGlobals.STATUARY_TYPE: + return invalid('invalid species: %d' % species) + + it = species - 100 + if it == 134: + it = 135 + + if not av.removeGardenItem(it, 1): + return invalid('av doesn\'t own item: %d' % species) + + self.d_setMovie(GardenGlobals.MOVIE_PLANT) + + def _plant(task): + if not self.air: + return + + statuary = self.mgr.placeStatuary(self.mgr.S_pack(0, 0, species, 0), plot=self, + ownerIndex=self.ownerIndex, plotId=self.plot, + pos=(self.getPos(), self.getH()), generate=False) + statuary.generateWithRequired(self.zoneId) + statuary.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId) + statuary.d_setMovie(GardenGlobals.MOVIE_CLEAR, self.__plantingAvId) + self.air.writeServerEvent('plant-statuary', self.__plantingAvId, species=species, plot=self.plot) + return task.done + + taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant')) + self.__plantingAvId = av.doId - def plantGagTree(self, track, level, toon): - #free for now - #av = simbase.air.doId2do.get(toon) - #av.inventory.useItem(track, level) - #av.d_setInventory(av.inventory.makeNetString()) - self.planted = DistributedGagTreeAI(self.air) - self.planted.setEstate(self.getEstate()) - self.planted.setOwnerPlot(self.doId) - self.planted.setPlot(self.getPlot()) - self.planted.setHeading(self.getHeading()) - self.planted.setPosition(*self.getPosition()) - self.planted.setOwnerIndex(self.getOwnerIndex()) - self.planted.setTypeIndex(GardenGlobals.getTreeTypeIndex(track, level)) - self.planted.setWaterLevel(0) - self.planted.setGrowthLevel(0) - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_PLANT, toon]) + def plantToonStatuary(self, species, dnaCode): + av = self.__initialSanityCheck(GardenGlobals.STATUARY_TYPE) + if not av: + return + + def invalid(problem): + msg = 'tried to plant statuary but something went wrong: %s' % problem + self.notify.warning('%d %s' % (av.doId, msg)) + self.air.writeServerEvent('suspicious', av.doId, msg) + return self.d_setMovie(GardenGlobals.MOVIE_PLANT_REJECTED) + + attr = GardenGlobals.PlantAttributes.get(species, {}) + if attr.get('plantType') != GardenGlobals.STATUARY_TYPE: + return invalid('invalid species: %d' % species) + + if not av.removeGardenItem(species - 100, 1): + return invalid('av doesn\'t own item: %d' % species) + + self.d_setMovie(GardenGlobals.MOVIE_PLANT) + + def _plant(task): + if not self.air: + return + + statuary = self.mgr.placeStatuary(self.mgr.S_pack(dnaCode, 0, species, 0), plot=self, + ownerIndex=self.ownerIndex, plotId=self.plot, + pos=(self.getPos(), self.getH()), generate=False) + statuary.generateWithRequired(self.zoneId) + statuary.d_setMovie(GardenGlobals.MOVIE_FINISHPLANTING, self.__plantingAvId) + self.air.writeServerEvent('plant-statuary', self.__plantingAvId, species=species, plot=self.plot) + return task.done + + taskMgr.doMethodLater(7, _plant, self.uniqueName('do-plant')) + self.__plantingAvId = av.doId - def plantStatuary(self, species, toon): - #free for now - #av = simbase.air.doId2do.get(toon) - #av.takeMoney(GardenGlobals.getNumBeansRequired(species, 0)) - self.planted = DistributedStatuaryAI(self.air) - self.planted.setEstate(self.getEstate()) - self.planted.setOwnerPlot(self.doId) - self.planted.setPlot(self.getPlot()) - self.planted.setHeading(self.getHeading()) - self.planted.setPosition(*self.getPosition()) - self.planted.setOwnerIndex(self.getOwnerIndex()) - self.planted.setTypeIndex(species) - self.planted.setWaterLevel(0) - self.planted.setGrowthLevel(0) - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_PLANT, toon]) - - def plantToonStatuary(self, species, dnaCode, toon): - #free for now - #av = simbase.air.doId2do.get(toon) - #av.takeMoney(GardenGlobals.getNumBeansRequired(species, 0)) - self.planted = DistributedToonStatuaryAI(self.air) - self.planted.setEstate(self.getEstate()) - self.planted.setOwnerPlot(self.doId) - self.planted.setPlot(self.getPlot()) - self.planted.setHeading(self.getHeading()) - self.planted.setPosition(*self.getPosition()) - self.planted.setOwnerIndex(self.getOwnerIndex()) - self.planted.setTypeIndex(species) - self.planted.setWaterLevel(0) - self.planted.setGrowthLevel(0) - self.planted.setOptional(dnaCode) - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_PLANT, toon]) - - def plantNothing(self, burntBeans, toon): - # TODO: Fix exploit. - sendAvId = self.air.getAvatarIdFromSender() - av = self.air.doId2do.get(sendAvId) + def plantNothing(self, burntBeans): + av = self.__initialSanityCheck() if av: av.takeMoney(burntBeans) - self.planted = None + +@magicWord(category=CATEGORY_PROGRAMMER, types=[int, int]) +def satanFlowerAll(species=49, variety=0): + invoker = spellbook.getInvoker() + av = spellbook.getTarget() + estate = av.air.estateManager._lookupEstate(av) + + if not estate: + return 'Estate not found!' + + garden = estate.gardenManager.gardens.get(av.doId) + if not garden: + return 'Garden not found!' + + i = 0 + for obj in garden.objects.copy(): + if isinstance(obj, DistributedGardenPlotAI): + if obj.plotType != GardenGlobals.FLOWER_TYPE: + continue + + if not obj.plantFlower(species, variety, 1): + return 'Error on plot %d' % i + + i += 1 + + def troll(task): + channel = invoker.GetPuppetConnectionChannel(invoker.doId) + av.air.sendSysMsg('OMG YOU SOLD YOUR SOUL NOOOOOOOOOOOOOOOOOOOO', channel) + return task.done + + taskMgr.doMethodLater(6.66, troll, 'satan-troll') + return '%d disgusting flowers planted' % i + +@magicWord(category=CATEGORY_PROGRAMMER) +def gibSpecials(): + av = spellbook.getTarget() + av.gardenSpecials = [] + for x in (100, 101, 103, 105, 106, 107, 108, 130, 131, 135): + av.addGardenItem(x, 99) + \ No newline at end of file diff --git a/toontown/estate/DistributedLawnDecor.py b/toontown/estate/DistributedLawnDecor.py index 9c42e2b7..b9bf5046 100755 --- a/toontown/estate/DistributedLawnDecor.py +++ b/toontown/estate/DistributedLawnDecor.py @@ -1,4 +1,4 @@ -from panda3d.core import * +from pandac.PandaModules import * from direct.interval.IntervalGlobal import * from direct.distributed import ClockDelta from direct.showbase.PythonUtil import lerp @@ -16,6 +16,7 @@ from otp.otpbase import OTPGlobals from toontown.estate import GardenGlobals def recurseParent(intoNode, ParentName): + # funny fact: cogtown had a func like this parent = intoNode.getParent(0) if not parent or parent.getName() == 'render': return 0 @@ -50,6 +51,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast return def setHeading(self, h): + self.notify.debug('setting h') DistributedNode.DistributedNode.setH(self, h) def generateInit(self): @@ -93,6 +95,11 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast if not self.rotateNode: self.rotateNode = self.plantPath.attachNewNode('rotate') self.model = None + if __dev__: + self.model = loader.loadModel(self.defaultModel) + self.model.setScale(0.4, 0.4, 0.1) + self.model.reparentTo(self.rotateNode) + return def setupShadow(self): self.shadowJoint = self.rotateNode.attachNewNode('shadow') @@ -121,6 +128,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast self.accept(self.exitMessageName, self.handleExitPlot) def handleEnterPlot(self, optional = None): + self.notify.debug('handleEnterPlot %d' % self.doId) self.sendUpdate('plotEntered', []) def handleExitPlot(self, optional = None): @@ -142,12 +150,6 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast taskMgr.remove(self.uniqueName('adjust tree')) return - def setEstate(self, estate): - self.estate = estate - - def getEstate(self): - return self.estate - def setPos(self, x, y, z): DistributedNode.DistributedNode.setPos(self, x, y, z) self.stick2Ground() @@ -175,7 +177,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast picker.traverse(render) if queue.getNumEntries() > 0: queue.sortEntries() - for index in xrange(queue.getNumEntries()): + for index in range(queue.getNumEntries()): entry = queue.getEntry(index) if recurseParent(entry.getIntoNode(), 'terrain_DNARoot'): self.movieNode.setZ(entry.getSurfacePoint(self)[2]) @@ -184,7 +186,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast picker.traverse(render) if queue.getNumEntries() > 0: queue.sortEntries() - for index in xrange(queue.getNumEntries()): + for index in range(queue.getNumEntries()): entry = queue.getEntry(index) if recurseParent(entry.getIntoNode(), 'terrain_DNARoot'): self.setZ(entry.getSurfacePoint(render)[2] + self.stickUp + 0.1) @@ -197,12 +199,12 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast def stickParts(self): pass - def setH(self, h): - DistributedNode.DistributedNode.setH(self, h) - def setPlot(self, plot): self.plot = plot + def setH(self, h): + DistributedNode.DistributedNode.setH(self, h) + def getPlot(self): return self.plot @@ -242,7 +244,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast base.localAvatar.hideShovelButton() base.localAvatar.hideWateringCanButton() self.startInteraction() - self.sendUpdate('removeItem', [base.localAvatar.doId]) + self.sendUpdate('removeItem', []) def generateToonMoveTrack(self, toon): node = NodePath('tempNode') @@ -261,10 +263,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast finalY = node.getY(render) finalZ = node.getZ(render) node.removeNode() - toonTrack = Sequence(Parallel(ActorInterval(toon, 'walk', loop=True, duration=1), - Parallel(LerpPosInterval(toon, 1.0, Point3(finalX, finalY, toon.getZ(render)), fluid=True, bakeInStart=False)), - LerpHprInterval(toon, 1.0, hpr=hpr)), - Func(toon.loop, 'neutral')) + toonTrack = Sequence(Parallel(ActorInterval(toon, 'walk', loop=True, duration=1), Parallel(LerpPosInterval(toon, 1.0, Point3(finalX, finalY, toon.getZ(render)), fluid=True, bakeInStart=False)), LerpHprInterval(toon, 1.0, hpr=hpr)), Func(toon.loop, 'neutral')) return toonTrack def unprint(self, string): @@ -288,16 +287,13 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast def startCamIval(self, avId): track = Sequence() if avId == localAvatar.doId: - track = Sequence(Func(base.localAvatar.disableSmartCameraViews), - Func(base.localAvatar.setCameraPosForPetInteraction)) + track = Sequence(Func(base.localAvatar.disableSmartCameraViews), Func(base.localAvatar.setCameraPosForPetInteraction)) return track def stopCamIval(self, avId): track = Sequence() if avId == localAvatar.doId: - track = Sequence(Func(base.localAvatar.unsetCameraPosForPetInteraction), - Wait(0.8), - Func(base.localAvatar.enableSmartCameraViews)) + track = Sequence(Func(base.localAvatar.unsetCameraPosForPetInteraction), Wait(0.8), Func(base.localAvatar.enableSmartCameraViews)) return track def canBeWatered(self): @@ -332,8 +328,6 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast if not toon: return self.finishMovies() - if avId == localAvatar.doId: - self.startInteraction() self.model.setTransparency(1) self.model.setAlphaScale(1) shovel = toon.attachShovel() @@ -341,11 +335,9 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast moveTrack = self.generateToonMoveTrack(toon) digupTrack = self.generateDigupTrack(toon) self.movie = Sequence(self.startCamIval(avId), moveTrack, Func(shovel.show), digupTrack) - self.movie.append(Func(base.cr.removeObject, self.doId)) if avId == localAvatar.doId: - self.expectingReplacement = 1 - plotAv = base.cr.doId2do.get(self.getOwnerPlot()) - self.movie.append(Func(plotAv.sendUpdate, 'finishRemoving', [avId])) + # self.expectingReplacement = 1 + self.movie.append(Func(self.movieDone)) self.movie.start() def generateDigupTrack(self, toon): @@ -354,22 +346,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast pos = self.model.getPos() pos.setZ(pos[2] - 1) track = Parallel() - sq = Sequence(ActorInterval(toon, 'start-dig'), - Parallel(ActorInterval(toon, 'loop-dig', loop=1, duration=5.13), - Sequence(Wait(0.25), - SoundInterval(sound, node=toon, duration=0.55), - Wait(0.8), - SoundInterval(sound, node=toon, duration=0.55), - Wait(1.35), - SoundInterval(sound, node=toon, duration=0.55))), - ActorInterval(toon, 'start-dig', playRate=-1), - LerpFunc(self.model.setAlphaScale, fromData=1, toData=0, duration=1)) - if hasattr(self, 'signModel'): - sq.append(Parallel(LerpFunc(self.signModel.setAlphaScale, fromData=1, toData=0, duration=1), - LerpScaleInterval(self.signModel, 1, 0, 1))) - sq.append(Func(toon.loop, 'neutral')) - sq.append(Func(toon.detachShovel)) - track.append(sq) + track.append(Sequence(ActorInterval(toon, 'start-dig'), Parallel(ActorInterval(toon, 'loop-dig', loop=1, duration=5.13), Sequence(Wait(0.25), SoundInterval(sound, node=toon, duration=0.55), Wait(0.8), SoundInterval(sound, node=toon, duration=0.55), Wait(1.35), SoundInterval(sound, node=toon, duration=0.55))), ActorInterval(toon, 'start-dig', playRate=-1), LerpFunc(self.model.setAlphaScale, fromData=1, toData=0, duration=1), Func(toon.loop, 'neutral'), Func(toon.detachShovel))) return track def doFinishPlantingTrack(self, avId): diff --git a/toontown/estate/DistributedLawnDecorAI.py b/toontown/estate/DistributedLawnDecorAI.py index 3f297c48..6bc3c61d 100755 --- a/toontown/estate/DistributedLawnDecorAI.py +++ b/toontown/estate/DistributedLawnDecorAI.py @@ -1,68 +1,40 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedNodeAI import DistributedNodeAI -import GardenGlobals class DistributedLawnDecorAI(DistributedNodeAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedLawnDecorAI") - def __init__(self, air): - DistributedNodeAI.__init__(self, air) - self.air = air - self.plot = None - self.ownerIndex = None - - def announceGenerate(self): - DistributedNodeAI.announceGenerate(self) - - def delete(self): - DistributedNodeAI.delete(self) - - def disable(self): - DistributedNodeAI.disable(self) - - def setEstate(self, estate): - self.estate = estate - - def getEstate(self): - return self.estate - + def __init__(self, mgr): + self.mgr = mgr + DistributedNodeAI.__init__(self, self.mgr.air) + self.plot = 0 + self.ownerIndex = 0 + def setPlot(self, plot): self.plot = plot - + def getPlot(self): return self.plot - def setOwnerIndex(self, index): - self.ownerIndex = index + def getHeading(self): + return self.getH() + def getPosition(self): + return self.getPos() + + def setOwnerIndex(self, ownerIndex): + self.ownerIndex = ownerIndex + self.ownerDoId = self.mgr.gardenMgr.mgr.toons[ownerIndex] + self.owner = self.air.doId2do.get(self.ownerDoId) + def getOwnerIndex(self): return self.ownerIndex - def setPosition(self, x, y, z): - self.position = (x, y, z) - - def getPosition(self): - return self.position - - def setHeading(self, heading): - self.heading = heading - - def getHeading(self): - return self.heading - - def plotEntered(self): - pass - - def removeItem(self, avId): - self.inUseBy = avId - self.d_setMovie(GardenGlobals.MOVIE_REMOVE, avId) - - def d_setMovie(self, mode, avId): + def d_setMovie(self, mode, avId=None): + if avId is None: + avId = self.air.getAvatarIdFromSender() + self.sendUpdate('setMovie', [mode, avId]) - def movieDone(self): - if hasattr(self, 'inUseBy'): - del self.inUseBy - - def interactionDenied(self, todo0): - pass + def d_interactionDenied(self): + self.sendUpdate('interactionDenied', [self.air.getAvatarIdFromSender()]) diff --git a/toontown/estate/DistributedPlantBase.py b/toontown/estate/DistributedPlantBase.py index 03453a52..4b1803c9 100755 --- a/toontown/estate/DistributedPlantBase.py +++ b/toontown/estate/DistributedPlantBase.py @@ -44,12 +44,6 @@ class DistributedPlantBase(DistributedLawnDecor.DistributedLawnDecor): DistributedLawnDecor.DistributedLawnDecor.setupShadow(self) self.adjustWaterIndicator() - def setOwnerPlot(self, owner): - self.ownerPlot = owner - - def getOwnerPlot(self): - return self.ownerPlot - def setTypeIndex(self, typeIndex): self.typeIndex = typeIndex self.attributes = GardenGlobals.PlantAttributes[typeIndex] @@ -69,9 +63,7 @@ class DistributedPlantBase(DistributedLawnDecor.DistributedLawnDecor): self.waterLevel = waterLevel def getWaterLevel(self): - if hasattr(self, 'waterLevel'): - return self.waterLevel - return 0 + return self.waterLevel def setGrowthLevel(self, growthLevel): self.growthLevel = growthLevel @@ -105,11 +97,11 @@ class DistributedPlantBase(DistributedLawnDecor.DistributedLawnDecor): def handleWatering(self): self.startInteraction() - self.sendUpdate('waterPlant', [localAvatar.doId]) + self.sendUpdate('waterPlant') def __handleWatering(self, plantToWaterId): if plantToWaterId == self.doId: - self.sendUpdate('waterPlant', [localAvatar.doId]) + self.sendUpdate('waterPlant') else: self.notify.debug('not sending water plant') diff --git a/toontown/estate/DistributedPlantBaseAI.py b/toontown/estate/DistributedPlantBaseAI.py index e59706cf..b2dcd3bf 100755 --- a/toontown/estate/DistributedPlantBaseAI.py +++ b/toontown/estate/DistributedPlantBaseAI.py @@ -1,84 +1,81 @@ from direct.directnotify import DirectNotifyGlobal from toontown.estate.DistributedLawnDecorAI import DistributedLawnDecorAI import GardenGlobals -import datetime class DistributedPlantBaseAI(DistributedLawnDecorAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPlantBaseAI") - - def __init__(self, air): - DistributedLawnDecorAI.__init__(self, air) - self.air = air - self.growthLevel = -1 - - def announceGenerate(self): - DistributedLawnDecorAI.announceGenerate(self) - - def delete(self): - DistributedLawnDecorAI.delete(self) - - def disable(self): - DistributedLawnDecorAI.disable(self) - - def setOwnerPlot(self, owner): - self.ownerPlot = owner - - def getOwnerPlot(self): - return self.ownerPlot + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedPlantBaseAI') + def __init__(self, mgr): + DistributedLawnDecorAI.__init__(self, mgr) + self.typeIndex = 0 + self.waterLevel = 0 + self.growthLevel = 0 + def setTypeIndex(self, typeIndex): self.typeIndex = typeIndex self.attributes = GardenGlobals.PlantAttributes[typeIndex] - self.name = self.attributes['name'] - self.plantType = self.attributes['plantType'] self.growthThresholds = self.attributes['growthThresholds'] - self.maxWaterLevel = self.attributes['maxWaterLevel'] - self.minWaterLevel = self.attributes['minWaterLevel'] - + + def d_setTypeIndex(self, typeIndex): + self.sendUpdate('setTypeIndex', [typeIndex]) + + def b_setTypeIndex(self, typeIndex): + self.setTypeIndex(typeIndex) + self.d_setTypeIndex(typeIndex) + def getTypeIndex(self): return self.typeIndex - def setWaterLevel(self, water): - self.waterLevel = water - + def setWaterLevel(self, waterLevel): + self.waterLevel = waterLevel + + def d_setWaterLevel(self, waterLevel): + self.sendUpdate('setWaterLevel', [waterLevel]) + + def b_setWaterLevel(self, waterLevel): + self.setWaterLevel(waterLevel) + self.d_setWaterLevel(waterLevel) + def getWaterLevel(self): return self.waterLevel - def setGrowthLevel(self, growth): - self.growthLevel = growth - + def setGrowthLevel(self, growthLevel): + self.growthLevel = growthLevel + + def d_setGrowthLevel(self, growthLevel): + self.sendUpdate('setGrowthLevel', [growthLevel]) + + def b_setGrowthLevel(self, growthLevel): + self.setGrowthLevel(growthLevel) + self.d_setGrowthLevel(growthLevel) + def getGrowthLevel(self): return self.growthLevel - def waterPlant(self, avId): - # TODO: Proper water threshold for watering can type. - # Not supposed to be 16 for all watering cans. - self.lastWateredBy = avId - newLevel = self.waterLevel + 1 - if newLevel > self.maxWaterLevel: - self.setWaterLevel(self.maxWaterLevel) - else: - self.setWaterLevel(newLevel) - self.sendUpdate('setMovie', [GardenGlobals.MOVIE_WATER, avId]) - self.sendUpdate('setWaterLevel', [self.getWaterLevel()]) + def waterPlant(self): + av = self.air.doId2do.get(self.air.getAvatarIdFromSender()) + if not av: + return + + level = max(1, self.getWaterLevel() + av.getWateringCan() + 1) + level = min(20, level) + self.b_setWaterLevel(level) + + self.d_setMovie(GardenGlobals.MOVIE_WATER) + self.update() def waterPlantDone(self): - if hasattr(self, 'lastWateredBy'): - av = simbase.air.doId2do.get(self.lastWateredBy) - skill = av.getWateringCanSkill() - skill += GardenGlobals.WateringCanAttributes[av.wateringCan]['skillPts'] / 100 - av.b_setWateringCanSkill(skill) - del self.lastWateredBy - estate = simbase.air.doId2do.get(self.getEstate()) - dataIndex = -1 - # TODO: Possibly store this in mongodb/cPickle instead. - for n, item in enumerate(estate.items[self.getOwnerIndex()]): - if item[0] == self.getPlot(): - dataIndex = n - if dataIndex >= 0: - dtime = int(datetime.datetime.now().strftime('%Y%m%d%H%M')) - data = list(estate.items[self.getOwnerIndex()][dataIndex]) - data[4] = self.getWaterLevel() - data[8] = dtime - estate.items[self.getOwnerIndex()][dataIndex] = tuple(data) - estate.updateItems() + av = self.air.doId2do.get(self.air.getAvatarIdFromSender()) + if not av: + return + + if self.waterLevel < 6: + av.b_setWateringCanSkill(av.getWateringCanSkill() + 1) + else: + av.b_setWateringCanSkill(av.getWateringCanSkill()) + + self.d_setMovie(GardenGlobals.MOVIE_CLEAR) + + def update(self): + pass + \ No newline at end of file diff --git a/toontown/estate/DistributedStatuary.py b/toontown/estate/DistributedStatuary.py index 9571696b..4af314d4 100755 --- a/toontown/estate/DistributedStatuary.py +++ b/toontown/estate/DistributedStatuary.py @@ -37,22 +37,16 @@ class DistributedStatuary(DistributedLawnDecor.DistributedLawnDecor): attrib = GardenGlobals.PlantAttributes[self.typeIndex] self.stick2Ground() - def setOwnerPlot(self, owner): - self.ownerPlot = owner - - def getOwnerPlot(self): - return self.ownerPlot - def setTypeIndex(self, typeIndex): self.typeIndex = typeIndex self.name = GardenGlobals.PlantAttributes[typeIndex]['name'] self.plantType = GardenGlobals.PlantAttributes[typeIndex]['plantType'] self.modelPath = GardenGlobals.PlantAttributes[typeIndex]['model'] self.pinballScore = None - if 'pinballScore' in GardenGlobals.PlantAttributes[typeIndex]: + if GardenGlobals.PlantAttributes[typeIndex].has_key('pinballScore'): self.pinballScore = GardenGlobals.PlantAttributes[typeIndex]['pinballScore'] self.worldScale = 1.0 - if 'worldScale' in GardenGlobals.PlantAttributes[typeIndex]: + if GardenGlobals.PlantAttributes[typeIndex].has_key('worldScale'): self.worldScale = GardenGlobals.PlantAttributes[typeIndex]['worldScale'] return diff --git a/toontown/estate/DistributedStatuaryAI.py b/toontown/estate/DistributedStatuaryAI.py index 066ffa06..20f24acd 100755 --- a/toontown/estate/DistributedStatuaryAI.py +++ b/toontown/estate/DistributedStatuaryAI.py @@ -1,33 +1,66 @@ from direct.directnotify import DirectNotifyGlobal -from toontown.estate.DistributedLawnDecorAI import DistributedLawnDecorAI +from DistributedLawnDecorAI import DistributedLawnDecorAI + +import GardenGlobals +import time + +FOUR_DAYS = 86400 * 4 class DistributedStatuaryAI(DistributedLawnDecorAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedStatuaryAI") + + def calculate(self, lastCheck): + self.attributes = GardenGlobals.PlantAttributes[self.index] + self.growthThresholds = self.attributes.get('growthThresholds', (0, 0)) + + now = int(time.time()) + self.lastCheck = lastCheck + if self.lastCheck == 0: + self.lastCheck = now - def __init__(self, air): - DistributedLawnDecorAI.__init__(self, air) - self.air = air - - def setTypeIndex(self, typeIndex): - self.typeIndex = typeIndex + self.growthLevel = min((now - self.lastCheck) // FOUR_DAYS, self.growthThresholds[-1] + 1) + self.update() def getTypeIndex(self): - return self.typeIndex - - def setOwnerPlot(self, owner): - self.ownerPlot = owner - - def getOwnerPlot(self): - return self.ownerPlot - - def setWaterLevel(self, waterLevel): - self.waterLevel = waterLevel + return self.index def getWaterLevel(self): - return self.waterLevel - - def setGrowthLevel(self, growthLevel): - self.growthLevel = growthLevel + return 1 def getGrowthLevel(self): return self.growthLevel + + def getOptional(self): + return self.data + + def update(self): + self.mgr.data['statuary'] = self.mgr.S_pack(self.data, self.lastCheck, self.index, self.growthLevel) + self.mgr.update() + + def removeItem(self): + avId = self.air.getAvatarIdFromSender() + self.d_setMovie(GardenGlobals.MOVIE_REMOVE) + + def _remove(task): + if not self.air: + return + + plot = self.mgr.placePlot(-1) + plot.setPlot(self.plot) + plot.setPos(self.getPos()) + plot.setH(self.getH()) + plot.setOwnerIndex(self.ownerIndex) + plot.generateWithRequired(self.zoneId) + + self.air.writeServerEvent('remove-statuary', avId, plot=self.plot) + self.requestDelete() + + self.mgr.objects.remove(self) + + self.mgr.data['statuary'] = 0 + self.mgr.update() + + return task.done + + taskMgr.doMethodLater(7, _remove, self.uniqueName('do-remove')) + \ No newline at end of file diff --git a/toontown/estate/DistributedToonStatuary.py b/toontown/estate/DistributedToonStatuary.py index faf96f76..4449a2dc 100755 --- a/toontown/estate/DistributedToonStatuary.py +++ b/toontown/estate/DistributedToonStatuary.py @@ -2,7 +2,7 @@ from toontown.estate import DistributedStatuary from toontown.estate import DistributedLawnDecor from direct.directnotify import DirectNotifyGlobal from direct.showbase.ShowBase import * -from panda3d.core import * +from pandac.PandaModules import * from toontown.toon import Toon from toontown.toon import ToonDNA import GardenGlobals @@ -46,7 +46,7 @@ class DistributedToonStatuary(DistributedStatuary.DistributedStatuary): self.model.setScale(self.worldScale * 1.5, self.worldScale * 1.5, self.worldScale) self.getToonPropertiesFromOptional() dna = ToonDNA.ToonDNA() - dna.newToonFromProperties(self.headType, self.torsoType, self.legType, self.gender, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + dna.newToonFromProperties(self.headType, self.torsoType, self.legType, self.gender, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) self.setupStoneToon(dna) self.poseToonFromTypeIndex(self.typeIndex) self.toon.reparentTo(self.model) @@ -112,7 +112,7 @@ class DistributedToonStatuary(DistributedStatuary.DistributedStatuary): if sleeves: sleeves.setTexture(desatSleeveTex, 1) bottoms = torso.findAllMatches('**/torso-bot*') - for bottomNum in xrange(0, bottoms.getNumPaths()): + for bottomNum in range(0, bottoms.getNumPaths()): bottom = bottoms.getPath(bottomNum) if bottom: if self.toon.style.torso[1] == 's': diff --git a/toontown/estate/DistributedToonStatuaryAI.py b/toontown/estate/DistributedToonStatuaryAI.py index 058ca7b0..880aa8b3 100755 --- a/toontown/estate/DistributedToonStatuaryAI.py +++ b/toontown/estate/DistributedToonStatuaryAI.py @@ -4,12 +4,6 @@ from toontown.estate.DistributedStatuaryAI import DistributedStatuaryAI class DistributedToonStatuaryAI(DistributedStatuaryAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedToonStatuaryAI") - def __init__(self, air): - DistributedStatuaryAI.__init__(self, air) - self.air = air + def setOptional(self, todo0): + pass - def setOptional(self, optional): - self.optional = optional - - def getOptional(self): - return self.optional diff --git a/toontown/estate/EstateManagerAI.py b/toontown/estate/EstateManagerAI.py index 709aa872..0347c903 100755 --- a/toontown/estate/EstateManagerAI.py +++ b/toontown/estate/EstateManagerAI.py @@ -239,7 +239,7 @@ class LoadEstateFSM(FSM): estate.pets = [] self.estate.toons = self.toonIds - self.estate.updateToons() + #self.estate.updateToons() # Gotcha! Now we need to load houses: self.demand('LoadHouses') diff --git a/toontown/estate/GardenGlobals.py b/toontown/estate/GardenGlobals.py index 51d4ad13..1cb3290c 100755 --- a/toontown/estate/GardenGlobals.py +++ b/toontown/estate/GardenGlobals.py @@ -12,7 +12,6 @@ INVALID_TYPE = -1 GAG_TREE_TYPE = 0 FLOWER_TYPE = 1 STATUARY_TYPE = 2 -TOON_STATUARY_TYPE = 3 WATERING_CAN_SMALL = 0 WATERING_CAN_MEDIUM = 1 WATERING_CAN_LARGE = 2 @@ -34,7 +33,7 @@ WateringMult = 2 def getWateringCanPower(wateringCan, wateringCanSkill): numBoxes = 0 - for curWateringCan in xrange(wateringCan + 1): + for curWateringCan in range(wateringCan + 1): wateringCanAttrib = WateringCanAttributes[curWateringCan] curBoxes = wateringCanAttrib['numBoxes'] skill = wateringCanAttrib['skillPts'] @@ -309,7 +308,7 @@ def getTreeTypeIndex(track, level): NUM_GAGS = 7 * 7 -for i in xrange(NUM_GAGS): +for i in range(NUM_GAGS): track, level = getTreeTrackAndLevel(i) if level <= 6: name = TTLocalizer.BattleGlobalAvPropStrings[track][level] + TTLocalizer.GardenGagTree @@ -495,7 +494,7 @@ ShovelAttributes = {0: {'numBoxes': 2, def getShovelPower(shovel, shovelSkill): numBoxes = 0 - for curShovel in xrange(shovel + 1): + for curShovel in range(shovel + 1): shovelAttrib = ShovelAttributes[curShovel] curBoxes = shovelAttrib['numBoxes'] skill = shovelAttrib['skillPts'] @@ -597,8 +596,8 @@ def getSpeciesVarietyGivenRecipe(recipeKey): attrib = PlantAttributes[species] if attrib['plantType'] == GAG_TREE_TYPE: continue - if 'varieties' in attrib: - for variety in xrange(len(attrib['varieties'])): + if attrib.has_key('varieties'): + for variety in range(len(attrib['varieties'])): if attrib['varieties'][variety][0] == recipeKey: return (species, variety) @@ -609,14 +608,14 @@ def getNumBeansRequired(species, variety): retval = -1 if not PlantAttributes.get(species): return retval - if 'varieties' not in PlantAttributes[species]: + if not PlantAttributes[species].has_key('varieties'): return retval if variety >= len(PlantAttributes[species]['varieties']): return -1 recipeKey = PlantAttributes[species]['varieties'][variety][0] recipe = Recipes.get(recipeKey) if recipe: - if 'beans' in recipe: + if recipe.has_key('beans'): retval = len(recipe['beans']) return retval @@ -653,7 +652,7 @@ def validateRecipes(notify): def validatePlantAttributes(notify): uniqueRecipes = [] flowerRecipeDistribution = [] - for i in xrange(getNumberOfShovelBoxes() + 1): + for i in range(getNumberOfShovelBoxes() + 1): flowerRecipeDistribution.append([]) for key in PlantAttributes.keys(): @@ -675,7 +674,7 @@ def validatePlantAttributes(notify): newInfo = (getFlowerVarietyName(key, list(varieties).index(variety)), Recipes[recipeNum]['beans'], TTLocalizer.FlowerColorStrings[variety[1]]) flowerRecipeDistribution[recipeLength].append(newInfo) - for numBeans in xrange(len(flowerRecipeDistribution)): + for numBeans in range(len(flowerRecipeDistribution)): notify.debug('%d flowers with %d beans' % (len(flowerRecipeDistribution[numBeans]), numBeans)) for flower in flowerRecipeDistribution[numBeans]: notify.debug(' %s, beans = %s, color=%s' % (flower[0], flower[1], flower[2])) @@ -683,7 +682,7 @@ def validatePlantAttributes(notify): notify.debug('plant attributes are ok') -plots0 = [(0, +plots0 = ((0, 0, 0.0, FLOWER_TYPE), @@ -758,45 +757,45 @@ plots0 = [(0, (-100, -43, -90.0, - STATUARY_TYPE)] -plots1 = [(85.0, - -67.0, + STATUARY_TYPE)) +plots1 = ((0, + 0, 0.0, FLOWER_TYPE), - (75, - -72, + (1, + 0, 0.0, FLOWER_TYPE), - (89.865, - -71.7725, + (2, + 0, 0.0, FLOWER_TYPE), - (91.0, - -74.0, + (2, + 1, 0.0, FLOWER_TYPE), - (92.135, - -76.2275, + (2, + 2, 0.0, FLOWER_TYPE), - (75.865, - -78.7725, + (3, + 0, 0.0, FLOWER_TYPE), - (77, - -81, + (3, + 1, 0.0, FLOWER_TYPE), - (78.135, - -83.2275, + (3, + 2, 0.0, FLOWER_TYPE), - (86.6518, - -86.6576, + (4, + 0, 0.0, FLOWER_TYPE), - (89.3482, - -85.3424, + (4, + 1, 0.0, FLOWER_TYPE), (62, @@ -834,8 +833,8 @@ plots1 = [(85.0, (47, -82, -30.0, - STATUARY_TYPE)] -plots2 = [(0, + STATUARY_TYPE)) +plots2 = ((0, 0, 0.0, FLOWER_TYPE), @@ -910,8 +909,8 @@ plots2 = [(0, (-97, -114, -60.0, - STATUARY_TYPE)] -plots3 = [(0, + STATUARY_TYPE)) +plots3 = ((0, 0, 0.0, FLOWER_TYPE), @@ -986,8 +985,8 @@ plots3 = [(0, (117, 27, 102.0, - STATUARY_TYPE)] -plots4 = [(0, + STATUARY_TYPE)) +plots4 = ((0, 0, 0.0, FLOWER_TYPE), @@ -1062,8 +1061,8 @@ plots4 = [(0, (16, 87, -140.0, - STATUARY_TYPE)] -plots5 = [(0, + STATUARY_TYPE)) +plots5 = ((0, 0, 0.0, FLOWER_TYPE), @@ -1138,7 +1137,7 @@ plots5 = [(0, (-55, 70, 213.0, - STATUARY_TYPE)] + STATUARY_TYPE)) estatePlots = (plots0, plots1, plots2, @@ -1148,7 +1147,8 @@ estatePlots = (plots0, BOX_ONE = 1 BOX_TWO = 2 BOX_THREE = 3 -flowerBoxes0 = [(-62.5, +FLOWER_POS = (None, (0,), (-1.5, 1.5), (-3.5, 0, 3.5)) +flowerBoxes0 = ((-62.5, -52.5, 182.0, BOX_ONE), @@ -1167,8 +1167,8 @@ flowerBoxes0 = [(-62.5, (-57, -33, 0.0, - BOX_TWO)] -flowerBoxes1 = [(85.0, + BOX_TWO)) +flowerBoxes1 = ((85.0, -67.0, 26.0, BOX_ONE), @@ -1187,8 +1187,8 @@ flowerBoxes1 = [(85.0, (88, -86, 206.0, - BOX_TWO)] -flowerBoxes2 = [(-62, + BOX_TWO)) +flowerBoxes2 = ((-62, -112, 350.0, BOX_ONE), @@ -1207,8 +1207,8 @@ flowerBoxes2 = [(-62, (-71, -129, 169.0, - BOX_TWO)] -flowerBoxes3 = [(72, + BOX_TWO)) +flowerBoxes3 = ((72, 5, 265.0, BOX_ONE), @@ -1227,8 +1227,8 @@ flowerBoxes3 = [(72, (54, 12, 86.0, - BOX_TWO)] -flowerBoxes4 = [(35.5, + BOX_TWO)) +flowerBoxes4 = ((35.5, 70, 152.0, BOX_ONE), @@ -1247,8 +1247,8 @@ flowerBoxes4 = [(35.5, (47, 86, -19.0, - BOX_TWO)] -flowerBoxes5 = [(-26.5, + BOX_TWO)) +flowerBoxes5 = ((-26.5, 37.5, 318.0, BOX_ONE), @@ -1267,7 +1267,7 @@ flowerBoxes5 = [(-26.5, (-45, 31, 124.0, - BOX_TWO)] + BOX_TWO)) estateBoxes = (flowerBoxes0, flowerBoxes1, flowerBoxes2, From 43b138e338e34d5b2577be1b62ee0eab0546f5b0 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Mon, 20 Jul 2015 19:02:13 -0400 Subject: [PATCH 056/161] gtfo has_key --- toontown/estate/GardenGlobals.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/toontown/estate/GardenGlobals.py b/toontown/estate/GardenGlobals.py index 1cb3290c..770318ce 100755 --- a/toontown/estate/GardenGlobals.py +++ b/toontown/estate/GardenGlobals.py @@ -33,7 +33,7 @@ WateringMult = 2 def getWateringCanPower(wateringCan, wateringCanSkill): numBoxes = 0 - for curWateringCan in range(wateringCan + 1): + for curWateringCan in xrange(wateringCan + 1): wateringCanAttrib = WateringCanAttributes[curWateringCan] curBoxes = wateringCanAttrib['numBoxes'] skill = wateringCanAttrib['skillPts'] @@ -308,7 +308,7 @@ def getTreeTypeIndex(track, level): NUM_GAGS = 7 * 7 -for i in range(NUM_GAGS): +for i in xrange(NUM_GAGS): track, level = getTreeTrackAndLevel(i) if level <= 6: name = TTLocalizer.BattleGlobalAvPropStrings[track][level] + TTLocalizer.GardenGagTree @@ -494,7 +494,7 @@ ShovelAttributes = {0: {'numBoxes': 2, def getShovelPower(shovel, shovelSkill): numBoxes = 0 - for curShovel in range(shovel + 1): + for curShovel in xrange(shovel + 1): shovelAttrib = ShovelAttributes[curShovel] curBoxes = shovelAttrib['numBoxes'] skill = shovelAttrib['skillPts'] @@ -596,8 +596,8 @@ def getSpeciesVarietyGivenRecipe(recipeKey): attrib = PlantAttributes[species] if attrib['plantType'] == GAG_TREE_TYPE: continue - if attrib.has_key('varieties'): - for variety in range(len(attrib['varieties'])): + if 'varieties' in attrib: + for variety in xrange(len(attrib['varieties'])): if attrib['varieties'][variety][0] == recipeKey: return (species, variety) @@ -608,14 +608,14 @@ def getNumBeansRequired(species, variety): retval = -1 if not PlantAttributes.get(species): return retval - if not PlantAttributes[species].has_key('varieties'): + if 'varieties' not in PlantAttributes[species]: return retval if variety >= len(PlantAttributes[species]['varieties']): return -1 recipeKey = PlantAttributes[species]['varieties'][variety][0] recipe = Recipes.get(recipeKey) if recipe: - if recipe.has_key('beans'): + if 'beans' in recipe: retval = len(recipe['beans']) return retval @@ -652,7 +652,7 @@ def validateRecipes(notify): def validatePlantAttributes(notify): uniqueRecipes = [] flowerRecipeDistribution = [] - for i in range(getNumberOfShovelBoxes() + 1): + for i in xrange(getNumberOfShovelBoxes() + 1): flowerRecipeDistribution.append([]) for key in PlantAttributes.keys(): @@ -674,7 +674,7 @@ def validatePlantAttributes(notify): newInfo = (getFlowerVarietyName(key, list(varieties).index(variety)), Recipes[recipeNum]['beans'], TTLocalizer.FlowerColorStrings[variety[1]]) flowerRecipeDistribution[recipeLength].append(newInfo) - for numBeans in range(len(flowerRecipeDistribution)): + for numBeans in xrange(len(flowerRecipeDistribution)): notify.debug('%d flowers with %d beans' % (len(flowerRecipeDistribution[numBeans]), numBeans)) for flower in flowerRecipeDistribution[numBeans]: notify.debug(' %s, beans = %s, color=%s' % (flower[0], flower[1], flower[2])) From 41d8b63ec22eeb623e5847e52c329b123e8ef987 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Tue, 21 Jul 2015 09:08:00 -0400 Subject: [PATCH 057/161] wtf this fixed it cool --- toontown/estate/DistributedEstateAI.py | 11 ++++++++++- toontown/estate/DistributedGardenPlotAI.py | 6 ------ toontown/estate/EstateManagerAI.py | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index f4f8176e..dfaf0f25 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -673,7 +673,16 @@ class DistributedEstateAI(DistributedObjectAI): def rentItem(self, rentType, duration): self.b_setRentalTimeStamp(time.time() + duration * 60) self.b_setRentalType(rentType) - + + def updateToons(self): + self.d_setSlot0ToonId(self.toons[0]) + self.d_setSlot1ToonId(self.toons[1]) + self.d_setSlot2ToonId(self.toons[2]) + self.d_setSlot3ToonId(self.toons[3]) + self.d_setSlot4ToonId(self.toons[4]) + self.d_setSlot5ToonId(self.toons[5]) + self.sendUpdate('setIdList', [self.toons]) + def setSlot0ToonId(self, id): self.toons[0] = id diff --git a/toontown/estate/DistributedGardenPlotAI.py b/toontown/estate/DistributedGardenPlotAI.py index 9f0ff7f1..648f9b38 100755 --- a/toontown/estate/DistributedGardenPlotAI.py +++ b/toontown/estate/DistributedGardenPlotAI.py @@ -232,12 +232,6 @@ def satanFlowerAll(species=49, variety=0): i += 1 - def troll(task): - channel = invoker.GetPuppetConnectionChannel(invoker.doId) - av.air.sendSysMsg('OMG YOU SOLD YOUR SOUL NOOOOOOOOOOOOOOOOOOOO', channel) - return task.done - - taskMgr.doMethodLater(6.66, troll, 'satan-troll') return '%d disgusting flowers planted' % i @magicWord(category=CATEGORY_PROGRAMMER) diff --git a/toontown/estate/EstateManagerAI.py b/toontown/estate/EstateManagerAI.py index 0347c903..709aa872 100755 --- a/toontown/estate/EstateManagerAI.py +++ b/toontown/estate/EstateManagerAI.py @@ -239,7 +239,7 @@ class LoadEstateFSM(FSM): estate.pets = [] self.estate.toons = self.toonIds - #self.estate.updateToons() + self.estate.updateToons() # Gotcha! Now we need to load houses: self.demand('LoadHouses') From 3d8d023af9dc5be60a1373853eefaff660ab0d83 Mon Sep 17 00:00:00 2001 From: John Cote Date: Tue, 21 Jul 2015 10:04:58 -0400 Subject: [PATCH 058/161] hot keyerror fix --- toontown/estate/DistributedGardenPlot.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/toontown/estate/DistributedGardenPlot.py b/toontown/estate/DistributedGardenPlot.py index 5e7ea074..e5367909 100755 --- a/toontown/estate/DistributedGardenPlot.py +++ b/toontown/estate/DistributedGardenPlot.py @@ -354,20 +354,25 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): self.stick2Ground() else: DistributedLawnDecor.DistributedLawnDecor.makeMovieNode(self) - + def setBoxDoId(self, boxId, index): - box = base.cr.doId2do[boxId] - x = GardenGlobals.FLOWER_POS[box.typeIndex][index] - + self.index = index + if boxId in base.cr.doId2do: + self.setBox(base.cr.doId2do[boxId]) + else: + self.acceptOnce('generate-%d' % boxId, self.setBox) + + def setBox(self, box): + x = GardenGlobals.FLOWER_POS[box.typeIndex][self.index] + self.setPos(0, 0, 0) self.reparentTo(box) self.setZ(1.2) self.setX(x) - + def stick2Ground(self, *args, **kwargs): plotType = GardenGlobals.whatCanBePlanted(self.ownerIndex, self.plot) if plotType == GardenGlobals.FLOWER_TYPE: return - + return DistributedLawnDecor.DistributedLawnDecor.stick2Ground(self, *args, **kwargs) - \ No newline at end of file From a06c6a7543a9706cfc80abc8aef49a1d9f037fb9 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Tue, 21 Jul 2015 10:34:55 -0400 Subject: [PATCH 059/161] Flower sell fix --- toontown/estate/DistributedEstate.py | 113 +++++++----------------- toontown/toonbase/TTLocalizerEnglish.py | 2 + 2 files changed, 32 insertions(+), 83 deletions(-) diff --git a/toontown/estate/DistributedEstate.py b/toontown/estate/DistributedEstate.py index e3e9cf69..47e551b7 100755 --- a/toontown/estate/DistributedEstate.py +++ b/toontown/estate/DistributedEstate.py @@ -24,10 +24,8 @@ from toontown.estate import GardenGlobals from toontown.estate import DistributedFlower from toontown.estate import DistributedGagTree from toontown.estate import DistributedStatuary -import GardenDropGame import GardenProgressMeter from toontown.estate import FlowerSellGUI -from toontown.fishing import FishSellGUI from toontown.toontowngui import TTDialog class DistributedEstate(DistributedObject.DistributedObject): @@ -48,7 +46,6 @@ class DistributedEstate(DistributedObject.DistributedObject): self.idList = [] base.estate = self self.flowerGuiDoneEvent = 'flowerGuiDone' - self.fishGuiDoneEvent = 'fishGuiDone' return def disable(self): @@ -57,7 +54,6 @@ class DistributedEstate(DistributedObject.DistributedObject): self.__stopCrickets() DistributedObject.DistributedObject.disable(self) self.ignore('enterFlowerSellBox') - self.ignore('enterFishSellBox') def delete(self): self.notify.debug('delete') @@ -65,19 +61,14 @@ class DistributedEstate(DistributedObject.DistributedObject): DistributedObject.DistributedObject.delete(self) def load(self): - self.defaultSignModel = loader.loadModel('phase_13/models/parties/eventSign') - self.activityIconsModel = loader.loadModel('phase_4/models/parties/eventSignIcons') self.lt = base.localAvatar if base.cr.newsManager.isHolidayRunning(ToontownGlobals.HALLOWEEN): self.loadWitch() else: self.loadAirplane() self.loadFlowerSellBox() - self.loadFishSellBox() self.oldClear = base.win.getClearColor() base.win.setClearColor(Vec4(0.09, 0.55, 0.21, 1.0)) - if config.GetBool('want-garden-game', False): - self.startGame() def unload(self): self.ignoreAll() @@ -104,23 +95,10 @@ class DistributedEstate(DistributedObject.DistributedObject): self.flowerSellBox.removeNode() del self.flowerSellBox self.flowerSellBox = None - if self.fishSellBox: - self.fishSellBox.removeNode() - del self.fishSellBox - self.fishSellBox = None - if config.GetBool('want-garden-game', False): - GardenDropGame.GardenDropGame().endGame() return def announceGenerate(self): DistributedObject.DistributedObject.announceGenerate(self) - self.accept('gardenGame', self.startGame) - - def startGame(self): - if config.GetBool('want-garden-game', False): - self.game = GardenDropGame.GardenDropGame().playGardenDrop() - else: - self.game = GardenDropGame.GardenDropGame() def loadAirplane(self): self.airplane = loader.loadModel('phase_4/models/props/airplane.bam') @@ -131,12 +109,14 @@ class DistributedEstate(DistributedObject.DistributedObject): bannerText.setTextColor(1, 0, 0, 1) bannerText.setAlign(bannerText.ACenter) bannerText.setFont(ToontownGlobals.getSignFont()) - bannerText.setText('Cog invasion!!!') + bannerText.setText(TTLocalizer.EstatePlaneReturn) self.bn = self.banner.attachNewNode(bannerText.generate()) self.bn.setHpr(180, 0, 0) - self.bn.setPos(-1.8, 0.1, 0) - self.bn.setScale(0.35) - self.banner.hide() + self.bn.setPos(-5.8, 0.1, -0.25) + self.bn.setScale(0.95) + self.bn.setDepthTest(1) + self.bn.setDepthWrite(1) + self.bn.setDepthOffset(500) def loadWitch(self): if not self.airplane: @@ -148,15 +128,19 @@ class DistributedEstate(DistributedObject.DistributedObject): self.airplane = loader.loadModel('phase_4/models/props/tt_m_prp_ext_flyingWitch.bam') self.airplane.setScale(2) self.airplane.setPos(0, 0, 1) + self.airplane.find('**/').setH(180) bannerText = TextNode('bannerText') bannerText.setTextColor(1, 0, 0, 1) bannerText.setAlign(bannerText.ACenter) bannerText.setFont(ToontownGlobals.getSignFont()) - bannerText.setText('Happy halloween!!!') + bannerText.setText(TTLocalizer.EstatePlaneHoliday) self.bn = self.airplane.attachNewNode(bannerText.generate()) - self.bn.setHpr(0, 0, 0) - self.bn.setPos(20.0, -.1, 0) + self.bn.setPos(-20.0, -.1, 0) + self.bn.setH(180) self.bn.setScale(2.35) + self.bn.setDepthTest(1) + self.bn.setDepthWrite(1) + self.bn.setDepthOffset(500) replacement = Sequence(LerpColorScaleInterval(self.airplane, 0.1, Vec4(1, 1, 1, 0)), Func(__replaceAirplane__), LerpColorScaleInterval(self.airplane, 0.1, Vec4(1, 1, 1, 1))) replacement.start() @@ -175,12 +159,14 @@ class DistributedEstate(DistributedObject.DistributedObject): bannerText.setTextColor(1, 0, 0, 1) bannerText.setAlign(bannerText.ACenter) bannerText.setFont(ToontownGlobals.getSignFont()) - bannerText.setText('Happy halloween!!!') + bannerText.setText(TTLocalizer.EstatePlaneReturn) self.bn = self.banner.attachNewNode(bannerText.generate()) self.bn.setHpr(180, 0, 0) - self.bn.setPos(-1.8, 0.1, 0) - self.bn.setScale(0.35) - self.banner.hide() + self.bn.setPos(-5.8, 0.1, -0.25) + self.bn.setScale(0.95) + self.bn.setDepthTest(1) + self.bn.setDepthWrite(1) + self.bn.setDepthOffset(500) replacement = Sequence(LerpColorScaleInterval(self.airplane, 0.1, Vec4(1, 1, 1, 0)), Func(__replaceWitch__), LerpColorScaleInterval(self.airplane, 0.1, Vec4(1, 1, 1, 1))) replacement.start() @@ -189,6 +175,9 @@ class DistributedEstate(DistributedObject.DistributedObject): initCamPos = VBase3(0, -10, 5) initCamHpr = VBase3(0, -10, 0) + def setEstateType(self, index): + self.estateType = index + def setHouseInfo(self, houseInfo): self.notify.debug('setHouseInfo') houseType, housePos = cPickle.loads(houseInfo) @@ -211,7 +200,7 @@ class DistributedEstate(DistributedObject.DistributedObject): def __pauseAirplaneTask(self): pause = 45 self.phi = 0 - self.airplane.hide() + self.airplane.reparentTo(hidden) self.theta = (self.theta + 10) % 360 taskMgr.remove(self.taskName('estate-airplane')) taskMgr.doMethodLater(pause, self.airplaneFlyTask, self.taskName('estate-airplane')) @@ -232,7 +221,7 @@ class DistributedEstate(DistributedObject.DistributedObject): y = rad * math.sin(angle) z = amp * sinPhi self.airplane.reparentTo(render) - self.airplane.setH(90 + self.theta + 180) + self.airplane.setH(90 + self.theta) self.airplane.setPos(x, y, z) return Task.cont @@ -280,7 +269,7 @@ class DistributedEstate(DistributedObject.DistributedObject): def __dayTimeTask(self, task): taskName = self.taskName('daytime') - track = Sequence(Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 0.6, 0.6, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 0.8, 0.8, 1))), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.2, 0.2, 0.5, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.4, 0.4, 0.6, 1))), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.6, 0.6, 0.8, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.7, 0.7, 0.8, 1))), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 1, 1, 1))), Func(base.cr.playGame.hood.loader.geom.clearColorScale), Func(base.cr.playGame.hood.sky.clearColorScale)) + track = Sequence(Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 0.6, 0.6, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 0.8, 0.8, 1))), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.2, 0.2, 0.5, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.2, 0.2, 0.4, 1))), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.6, 0.6, 0.8, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_NIGHT_PERIOD, Vec4(0.5, 0.5, 0.6, 1))), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.sky, HouseGlobals.HALF_DAY_PERIOD, Vec4(1, 1, 1, 1))), Func(base.cr.playGame.hood.loader.geom.clearColorScale), Func(base.cr.playGame.hood.sky.clearColorScale)) if self.dayTrack: self.dayTrack.finish() self.dayTrack = track @@ -344,8 +333,8 @@ class DistributedEstate(DistributedObject.DistributedObject): taskMgr.doMethodLater(1, self.__crickets, 'estate-crickets') def __crickets(self, task): - sfx = random.choice(base.cr.playGame.hood.loader.cricketSound) - track = Sequence(Func(base.playSfx, sfx), Wait(1)) + sfx = base.cr.playGame.hood.loader.cricketSound + track = Sequence(Func(base.playSfx, random.choice(sfx)), Wait(1)) track.start() t = random.random() * 20.0 + 1 taskMgr.doMethodLater(t, self.__crickets, 'estate-crickets') @@ -376,61 +365,19 @@ class DistributedEstate(DistributedObject.DistributedObject): if len(base.localAvatar.flowerBasket.flowerList): self.popupFlowerGUI() - def __handleFlowerSaleDone(self, sell = 0): + def __handleSaleDone(self, sell = 0): self.ignore(self.flowerGuiDoneEvent) self.sendUpdate('completeFlowerSale', [sell]) self.ignore('stoppedAsleep') self.flowerGui.destroy() self.flowerGui = None + return def popupFlowerGUI(self): - self.acceptOnce(self.flowerGuiDoneEvent, self.__handleFlowerSaleDone) + self.acceptOnce(self.flowerGuiDoneEvent, self.__handleSaleDone) self.flowerGui = FlowerSellGUI.FlowerSellGUI(self.flowerGuiDoneEvent) self.accept('stoppedAsleep', self.__handleSaleDone) - def loadFishSellBox(self): - self.fishSellBox = loader.loadModel('phase_4/models/minigames/treasure_chest.bam') - self.fishSellBox.setPos(45, -165.75, 0.025) - self.fishSellBox.setH(210) - self.fishSellBox.reparentTo(render) - cSphere = CollisionSphere(0.0, 0.0, 0.0, 2.25) - cSphere.setTangible(0) - colNode = CollisionNode('FishSellBox') - colNode.addSolid(cSphere) - cSpherePath = self.fishSellBox.attachNewNode(colNode) - cSpherePath.hide() - cSpherePath.setCollideMask(ToontownGlobals.WallBitmask) - self.accept('enterFishSellBox', self.__touchedFishSellBox) - - def __touchedFishSellBox(self, entry): - if base.localAvatar.doId in self.idList: - if base.localAvatar.fishTank.getFish(): - self.popupFishGUI() - - def __handleFishSaleDone(self, sell=0): - base.setCellsAvailable(base.bottomCells, 1) - base.cr.playGame.getPlace().setState('walk') - self.ignore(self.fishGuiDoneEvent) - self.sendUpdate('completeFishSale', [sell]) - self.ignore('stoppedAsleep') - self.fishGui.destroy() - self.fishGui = None - - def popupFishGUI(self): - base.setCellsAvailable(base.bottomCells, 0) - base.cr.playGame.getPlace().setState('stopped') - self.acceptOnce(self.fishGuiDoneEvent, self.__handleFishSaleDone) - self.fishGui = FishSellGUI.FishSellGUI(self.fishGuiDoneEvent) - self.accept('stoppedAsleep', self.__handleFishSaleDone) - - def thankSeller(self, mode, fish, maxFish): - if mode == ToontownGlobals.FISHSALE_TROPHY: - base.localAvatar.setSystemMessage(0, TTLocalizer.STOREOWNER_TROPHY % (fish, maxFish)) - elif mode == ToontownGlobals.FISHSALE_COMPLETE: - base.localAvatar.setSystemMessage(0, TTLocalizer.STOREOWNER_THANKSFISH) - elif mode == ToontownGlobals.FISHSALE_NONE: - base.localAvatar.setSystemMessage(0, TTLocalizer.STOREOWNER_NOFISH) - def closedAwardDialog(self, value): self.awardDialog.destroy() base.cr.playGame.getPlace().detectedGardenPlotDone() diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index c13e2d7a..a101d7d0 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -4279,6 +4279,8 @@ GardenTutorialPage2 = 'Flowers are finicky and require unique Jellybean recipes. GardenTutorialPage3 = 'Use a gag from your inventory to plant a tree. After a few days, that gag will do more damage! Remember to keep it healthy or the damage boost will go away.' GardenTutorialPage4 = 'Walk up to these spots to plant, water, dig up or harvest your garden.' GardenTutorialPage5 = "Statues can be purchased in Clarabelle's Cattlelog. Increase your skill to unlock the more extravagant statues!" +EstatePlaneReturn = "Cog invasion!!!" +EstatePlaneHoliday = "Happy halloween!!!" PlaygroundDeathAckMessage = TheCogs + ' took all your gags!\n\nYou are sad. You may not leave the playground until you are happy.' ForcedLeaveFactoryAckMsg = 'The ' + Foreman + ' was defeated before you could reach him. You did not recover any Cog parts.' ForcedLeaveMintAckMsg = 'The Mint Floor Supervisor was defeated before you could reach him. You did not recover any Cogbucks.' From ba42dcb7d84f072cc4ccda2a73e1e4e044a916ca Mon Sep 17 00:00:00 2001 From: Loudrob Date: Tue, 21 Jul 2015 12:04:01 -0400 Subject: [PATCH 060/161] Top Toons: More appropriate --- toontown/ai/ToontownAIRepository.py | 4 ++-- toontown/uberdog/ToontownUberRepository.py | 4 ++-- ...istributedTopToonsManagerAI.py => TopToonsManagerAI.py} | 3 +-- ...istributedTopToonsManagerUD.py => TopToonsManagerUD.py} | 7 +++---- 4 files changed, 8 insertions(+), 10 deletions(-) rename toontown/uberdog/{DistributedTopToonsManagerAI.py => TopToonsManagerAI.py} (90%) rename toontown/uberdog/{DistributedTopToonsManagerUD.py => TopToonsManagerUD.py} (96%) diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index d272506b..39a4b4c3 100755 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -51,7 +51,7 @@ from toontown.toon import NPCToons from toontown.toonbase import ToontownGlobals from toontown.tutorial.TutorialManagerAI import TutorialManagerAI from toontown.uberdog.DistributedPartyManagerAI import DistributedPartyManagerAI -from toontown.uberdog.DistributedTopToonsManagerAI import DistributedTopToonsManagerAI +from toontown.uberdog.TopToonsManagerAI import TopToonsManagerAI #from toontown.uberdog.DistributedLobbyManagerAI import DistributedLobbyManagerAI class ToontownAIRepository(ToontownInternalRepository): @@ -73,7 +73,6 @@ class ToontownAIRepository(ToontownInternalRepository): self.lawOfficeMgr = None self.countryClubMgr = None self.groupManager = GroupManagerAI(self) - self.topToonsMgr = DistributedTopToonsManagerAI(self) self.zoneAllocator = UniqueIdAllocator(ToontownGlobals.DynamicZonesBegin, ToontownGlobals.DynamicZonesEnd) @@ -122,6 +121,7 @@ class ToontownAIRepository(ToontownInternalRepository): self.buildingQueryMgr = DistributedBuildingQueryMgrAI(self) self.buildingQueryMgr.generateWithRequired(2) self.groupManager.generateWithRequired(2) + self.topToonsMgr = TopToonsManagerAI(self) if self.wantKarts: self.leaderboardMgr = LeaderboardMgrAI(self) if self.wantFishing: diff --git a/toontown/uberdog/ToontownUberRepository.py b/toontown/uberdog/ToontownUberRepository.py index 88958d61..e26c536a 100755 --- a/toontown/uberdog/ToontownUberRepository.py +++ b/toontown/uberdog/ToontownUberRepository.py @@ -4,7 +4,7 @@ from otp.distributed.OtpDoGlobals import * from otp.distributed.DistributedDirectoryAI import DistributedDirectoryAI from toontown.distributed.ToontownInternalRepository import ToontownInternalRepository import toontown.minigame.MinigameCreatorAI -from toontown.uberdog.DistributedTopToonsManagerUD import DistributedTopToonsManagerUD +from toontown.uberdog.TopToonsManagerUD import TopToonsManagerUD if config.GetBool('want-rpc-server', False): from toontown.rpc.ToontownRPCServer import ToontownRPCServer @@ -39,5 +39,5 @@ class ToontownUberRepository(ToontownInternalRepository): self.friendsManager = simbase.air.generateGlobalObject(OTP_DO_ID_TTS_FRIENDS_MANAGER, 'TTSFriendsManager') self.globalPartyMgr = simbase.air.generateGlobalObject(OTP_DO_ID_GLOBAL_PARTY_MANAGER, 'GlobalPartyManager') self.groupManager = simbase.air.generateGlobalObject(OPT_DO_ID_GROUP_MANAGER, 'GroupManager') - self.topToonsMgr = DistributedTopToonsManagerUD(self) + self.topToonsMgr = TopToonsManagerUD(self) diff --git a/toontown/uberdog/DistributedTopToonsManagerAI.py b/toontown/uberdog/TopToonsManagerAI.py similarity index 90% rename from toontown/uberdog/DistributedTopToonsManagerAI.py rename to toontown/uberdog/TopToonsManagerAI.py index f91ae38d..5b41ac26 100644 --- a/toontown/uberdog/DistributedTopToonsManagerAI.py +++ b/toontown/uberdog/TopToonsManagerAI.py @@ -1,8 +1,7 @@ -from direct.distributed.DistributedObjectAI import * from direct.showbase.DirectObject import * import TopToonsGlobals -class DistributedTopToonsManagerAI(DirectObject): +class TopToonsManagerAI(DirectObject): def __init__(self, air): self.air = air diff --git a/toontown/uberdog/DistributedTopToonsManagerUD.py b/toontown/uberdog/TopToonsManagerUD.py similarity index 96% rename from toontown/uberdog/DistributedTopToonsManagerUD.py rename to toontown/uberdog/TopToonsManagerUD.py index eb0b55a5..6fd93293 100644 --- a/toontown/uberdog/DistributedTopToonsManagerUD.py +++ b/toontown/uberdog/TopToonsManagerUD.py @@ -2,7 +2,6 @@ from direct.directnotify import DirectNotifyGlobal from direct.fsm.FSM import FSM -from direct.distributed.DistributedObjectUD import * from direct.showbase.DirectObject import * from toontown.toon.ToonDNA import ToonDNA, getSpeciesName import TopToonsGlobals @@ -186,8 +185,8 @@ class SiteUploadFSM(FSM): return (success, error), res -class DistributedTopToonsManagerUD(DirectObject): - notify = DirectNotifyGlobal.directNotify.newCategory('DistributedTopToonsManagerUD') +class TopToonsManagerUD(DirectObject): + notify = DirectNotifyGlobal.directNotify.newCategory('TopToonsManagerUD') def __init__(self, air): self.air = air @@ -225,7 +224,7 @@ class DistributedTopToonsManagerUD(DirectObject): return task.done - taskMgr.doMethodLater(timeToNextMonth() + 1, _nm, 'DistributedTopToonsManagerUD-nextMonth') + taskMgr.doMethodLater(timeToNextMonth() + 1, _nm, 'TopToonsManagerUD-nextMonth') def saveSite(self): if self.air.dbConn: From 3de77cb7b0d4c0347fa2d16b7aa7e1ac22a29e0f Mon Sep 17 00:00:00 2001 From: John Cote Date: Tue, 21 Jul 2015 12:21:20 -0400 Subject: [PATCH 061/161] Fix an error with plating statuary. --- toontown/toon/DistributedToonAI.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 802e7622..b4020148 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -3331,9 +3331,10 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.gardenSpecials.append((index, newCount)) self.gardenSpecials.sort() self.b_setGardenSpecials(self.gardenSpecials) - return + return 1 self.notify.warning("removing garden item %d that toon doesn't have" % index) + return 0 def b_setFlowerCollection(self, speciesList, varietyList): self.setFlowerCollection(speciesList, varietyList) From d0ff9ff63599828b44e18652fe9cdd1880e47f7c Mon Sep 17 00:00:00 2001 From: John Cote Date: Tue, 21 Jul 2015 14:12:56 -0400 Subject: [PATCH 062/161] widescreen gardening gui --- toontown/toon/LocalToon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/toon/LocalToon.py b/toontown/toon/LocalToon.py index 80f05bfd..61221902 100755 --- a/toontown/toon/LocalToon.py +++ b/toontown/toon/LocalToon.py @@ -1134,7 +1134,7 @@ class LocalToon(DistributedToon.DistributedToon, LocalAvatar.LocalAvatar): if self.__gardeningGui: return gardenGuiCard = loader.loadModel('phase_5.5/models/gui/planting_gui') - self.__gardeningGui = DirectFrame(relief=None, geom=gardenGuiCard, geom_color=GlobalDialogColor, geom_scale=(0.17, 1.0, 0.3), pos=(-1.2, 0, 0.5), scale=1.0) + self.__gardeningGui = DirectFrame(relief=None, parent=base.a2dTopLeft, geom=gardenGuiCard, geom_color=GlobalDialogColor, geom_scale=(0.17, 1.0, 0.3), pos=(0.1335, 0.0, -0.50), scale=1.0) self.__gardeningGui.setName('gardeningFrame') self.__gardeningGuiFake = DirectFrame(relief=None, geom=None, geom_color=GlobalDialogColor, geom_scale=(0.17, 1.0, 0.3), pos=(-1.2, 0, 0.5), scale=1.0) self.__gardeningGuiFake.setName('gardeningFrameFake') From b044f983055fdbe58622fa4a934b095c1f48892e Mon Sep 17 00:00:00 2001 From: John Cote Date: Tue, 21 Jul 2015 14:32:19 -0400 Subject: [PATCH 063/161] More gardening GUI widescreen --- toontown/toon/LocalToon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/toon/LocalToon.py b/toontown/toon/LocalToon.py index 61221902..117f19fd 100755 --- a/toontown/toon/LocalToon.py +++ b/toontown/toon/LocalToon.py @@ -1136,7 +1136,7 @@ class LocalToon(DistributedToon.DistributedToon, LocalAvatar.LocalAvatar): gardenGuiCard = loader.loadModel('phase_5.5/models/gui/planting_gui') self.__gardeningGui = DirectFrame(relief=None, parent=base.a2dTopLeft, geom=gardenGuiCard, geom_color=GlobalDialogColor, geom_scale=(0.17, 1.0, 0.3), pos=(0.1335, 0.0, -0.50), scale=1.0) self.__gardeningGui.setName('gardeningFrame') - self.__gardeningGuiFake = DirectFrame(relief=None, geom=None, geom_color=GlobalDialogColor, geom_scale=(0.17, 1.0, 0.3), pos=(-1.2, 0, 0.5), scale=1.0) + self.__gardeningGuiFake = DirectFrame(relief=None, parent=base.a2dTopLeft, geom=None, geom_color=GlobalDialogColor, geom_scale=(0.17, 1.0, 0.3), pos=(0.1335, 0.0, -0.50), scale=1.0) self.__gardeningGuiFake.setName('gardeningFrameFake') iconScale = 1 iconColorWhite = Vec4(1.0, 1.0, 1.0, 1.0) From f772fd8e2769e523fb27e21ed07e9b1df648d1fb Mon Sep 17 00:00:00 2001 From: Loudrob Date: Tue, 21 Jul 2015 14:38:59 -0400 Subject: [PATCH 064/161] Treasure planner --- toontown/estate/DistributedEstateAI.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index dfaf0f25..49b9613b 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -8,7 +8,8 @@ from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI from toontown.fishing.DistributedFishingTargetAI import DistributedFishingTargetAI from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI from toontown.fishing import FishingTargetGlobals -from toontown.safezone import TreasurePlannerAI +from toontown.safezone import TreasureGlobals +from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI from toontown.safezone import DistributedTreasureAI from toontown.safezone import ButterflyGlobals from toontown.safezone import DistributedButterflyAI @@ -434,7 +435,7 @@ class CannonRental(Rental): for i in xrange(20): x = random.randint(100, 300) - 200 y = random.randint(100, 300) - 200 - treasure = DistributedTreasureAI.DistributedTreasureAI(self.estate.air, self, 9, x, y, z) + treasure = DistributedTreasureAI.DistributedTreasureAI(self.estate.air, self, 7, x, y, z) treasure.generateWithRequired(self.estate.zoneId) self.objects.add(treasure) doIds.append(treasure.doId) @@ -510,8 +511,9 @@ class DistributedEstateAI(DistributedObjectAI): target.generateWithRequired(self.zoneId) self.targets.append(target) - #self.treasurePlanner = ETreasurePlannerAI.ETreasurePlannerAI(self.zoneId) - #self.treasurePlanner.start() + treasureType, healAmount, spawnPoints, spawnRate, maxTreasures = TreasureGlobals.SafeZoneTreasureSpawns[ToontownGlobals.MyEstate] + self.treasurePlanner = SZTreasurePlannerAI(self.zoneId, treasureType, healAmount, spawnPoints, spawnRate, maxTreasures) + self.treasurePlanner.start() spot = DistributedFishingSpotAI(self.air) spot.setPondDoId(self.pond.getDoId()) @@ -549,7 +551,7 @@ class DistributedEstateAI(DistributedObjectAI): for house in self.houses: if house: house.requestDelete() - self.houses = [] + del self.houses[:] if self.pond: for spot in self.spots: spot.requestDelete() @@ -559,6 +561,8 @@ class DistributedEstateAI(DistributedObjectAI): self.targets = [] self.pond.requestDelete() self.pond = None + if self.treasurePlanner: + self.treasurePlanner.stop() self.gardenManager.destroy() if self.rentalHandle: From c042107c4da1c227e8d41255f5115038213f4ee0 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Tue, 21 Jul 2015 23:41:50 -0400 Subject: [PATCH 065/161] maxGarden --- toontown/toon/DistributedToonAI.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index b4020148..16822a09 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -4982,4 +4982,11 @@ def epp(dept, command="add"): @magicWord(category=CATEGORY_PROGRAMMER, types=[int]) def promote(dept): spellbook.getTarget().b_promote(dept) - + +@magicWord(category=CATEGORY_PROGRAMMER) +def maxGarden(): + av = spellbook.getInvoker() + av.b_setShovel(3) + av.b_setWateringCan(3) + av.b_setShovelSkill(639) + av.b_setWateringCanSkill(999) From 4411cb805bc74b33f304910d273cf13740ff55b8 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 01:45:01 -0400 Subject: [PATCH 066/161] gtfo has_key and range --- toontown/catalog/CatalogGardenItem.py | 9 +++++---- toontown/catalog/CatalogToonStatueItem.py | 2 +- toontown/estate/DistributedEstateAI.py | 8 ++++---- toontown/estate/DistributedFlower.py | 9 ++++----- toontown/estate/DistributedGagTree.py | 4 ++-- toontown/estate/DistributedGarden.py | 2 +- toontown/estate/DistributedGardenPlot.py | 1 - toontown/estate/DistributedLawnDecor.py | 4 ++-- toontown/estate/DistributedStatuary.py | 4 ++-- toontown/estate/DistributedToonStatuary.py | 2 +- 10 files changed, 22 insertions(+), 23 deletions(-) diff --git a/toontown/catalog/CatalogGardenItem.py b/toontown/catalog/CatalogGardenItem.py index 97ed7fb2..799f32d7 100755 --- a/toontown/catalog/CatalogGardenItem.py +++ b/toontown/catalog/CatalogGardenItem.py @@ -50,7 +50,7 @@ class CatalogGardenItem(CatalogItem.CatalogItem): def getPicture(self, avatar): photoModel = GardenGlobals.Specials[self.gardenIndex]['photoModel'] - if GardenGlobals.Specials[self.gardenIndex].has_key('photoAnimation'): + if 'photoAnimation' in GardenGlobals.Specials[self.gardenIndex]: modelPath = photoModel + GardenGlobals.Specials[self.gardenIndex]['photoAnimation'][0] animationName = GardenGlobals.Specials[self.gardenIndex]['photoAnimation'][1] animationPath = photoModel + animationName @@ -79,8 +79,9 @@ class CatalogGardenItem(CatalogItem.CatalogItem): def cleanupPicture(self): CatalogItem.CatalogItem.cleanupPicture(self) - self.model.detachNode() - self.model = None + if hasattr(self, 'model') and self.model: + self.model.detachNode() + self.model = None return def output(self, store = -1): @@ -160,7 +161,7 @@ class CatalogGardenItem(CatalogItem.CatalogItem): result = False if canPlant < numBeansRequired: result = True - if not result and GardenGlobals.Specials.has_key(self.gardenIndex) and GardenGlobals.Specials[self.gardenIndex].has_key('minSkill'): + if not result and self.gardenIndex in GardenGlobals.Specials and 'minSkill' in GardenGlobals.Specials[self.gardenIndex]: minSkill = GardenGlobals.Specials[self.gardenIndex]['minSkill'] if avatar.shovelSkill < minSkill: result = True diff --git a/toontown/catalog/CatalogToonStatueItem.py b/toontown/catalog/CatalogToonStatueItem.py index ea09a38c..dcd4fe99 100755 --- a/toontown/catalog/CatalogToonStatueItem.py +++ b/toontown/catalog/CatalogToonStatueItem.py @@ -51,7 +51,7 @@ class CatalogToonStatueItem(CatalogGardenItem.CatalogGardenItem): def getAllToonStatues(self): self.statueList = [] - for index in range(self.startPoseIndex, self.endPoseIndex + 1): + for index in xrange(self.startPoseIndex, self.endPoseIndex + 1): self.statueList.append(CatalogToonStatueItem(index, 1, endPoseIndex=index)) return self.statueList diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index 49b9613b..eb0c12b0 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -505,7 +505,7 @@ class DistributedEstateAI(DistributedObjectAI): self.pond.setArea(ToontownGlobals.MyEstate) self.pond.generateWithRequired(self.zoneId) - for i in range(FishingTargetGlobals.getNumTargets(ToontownGlobals.MyEstate)): + for i in xrange(FishingTargetGlobals.getNumTargets(ToontownGlobals.MyEstate)): target = DistributedFishingTargetAI(self.air) target.setPondDoId(self.pond.getDoId()) target.generateWithRequired(self.zoneId) @@ -540,8 +540,8 @@ class DistributedEstateAI(DistributedObjectAI): self.spots.append(spot) ButterflyGlobals.generateIndexes(self.zoneId, ButterflyGlobals.ESTATE) - for i in range(0, ButterflyGlobals.NUM_BUTTERFLY_AREAS[ButterflyGlobals.ESTATE]): - for j in range(0, ButterflyGlobals.NUM_BUTTERFLIES[ButterflyGlobals.ESTATE]): + for i in xrange(0, ButterflyGlobals.NUM_BUTTERFLY_AREAS[ButterflyGlobals.ESTATE]): + for j in xrange(0, ButterflyGlobals.NUM_BUTTERFLIES[ButterflyGlobals.ESTATE]): bfly = DistributedButterflyAI.DistributedButterflyAI(self.air, ButterflyGlobals.ESTATE, i, self.zoneId) bfly.generateWithRequired(self.zoneId) bfly.start() @@ -844,7 +844,7 @@ class DistributedEstateAI(DistributedObjectAI): return self.items[5] def setIdList(self, idList): - for i in range(len(idList)): + for i in xrange(len(idList)): if i >= 6: return self.toons[i] = idList[i] diff --git a/toontown/estate/DistributedFlower.py b/toontown/estate/DistributedFlower.py index d90f0cab..2e885dab 100755 --- a/toontown/estate/DistributedFlower.py +++ b/toontown/estate/DistributedFlower.py @@ -1,12 +1,11 @@ -from toontown.estate import DistributedPlantBase from direct.directnotify import DirectNotifyGlobal +from toontown.estate import DistributedPlantBase +from toontown.estate.DistributedGardenBox import DistributedGardenBox from toontown.estate import FlowerBase from toontown.estate import GardenGlobals from toontown.toontowngui import TTDialog from toontown.toonbase import TTLocalizer -from DistributedGardenBox import DistributedGardenBox - DIRT_AS_WATER_INDICATOR = True DIRT_MOUND_HEIGHT = 0.3 @@ -30,7 +29,7 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl def delete(self): DistributedPlantBase.DistributedPlantBase.delete(self) - + del self.dirtMound del self.sandMound @@ -53,7 +52,7 @@ class DistributedFlower(DistributedPlantBase.DistributedPlantBase, FlowerBase.Fl desat = wilt.find('**/*desat*') bloom.hide() leaves = wilt.findAllMatches('**/*leaf*') - for leafIndex in range(leaves.getNumPaths()): + for leafIndex in xrange(leaves.getNumPaths()): leaf = leaves.getPath(leafIndex) leaf.setColorScale(1.0, 0.3, 0.1, 1.0) diff --git a/toontown/estate/DistributedGagTree.py b/toontown/estate/DistributedGagTree.py index f5f3cb64..69167904 100755 --- a/toontown/estate/DistributedGagTree.py +++ b/toontown/estate/DistributedGagTree.py @@ -79,7 +79,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.model.reparentTo(self.rotateNode) if self.isFruiting() and not self.isWilted(): self.fruits = [] - for i in range(1, self.maxFruit + 1): + for i in xrange(1, self.maxFruit + 1): pos = self.model.find('**/locator' + str(i)) if pos and not pos.isEmpty(): fruit = self.prop.copyTo(self.model) @@ -337,7 +337,7 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): picker.traverse(render) if queue.getNumEntries() > 0: queue.sortEntries() - for index in range(queue.getNumEntries()): + for index in xrange(queue.getNumEntries()): entry = queue.getEntry(index) if DistributedLawnDecor.recurseParent(entry.getIntoNode(), 'terrain_DNARoot'): self.signModel.wrtReparentTo(render) diff --git a/toontown/estate/DistributedGarden.py b/toontown/estate/DistributedGarden.py index e52a5a72..f7b1263e 100755 --- a/toontown/estate/DistributedGarden.py +++ b/toontown/estate/DistributedGarden.py @@ -31,7 +31,7 @@ class DistributedGarden(DistributedObject.DistributedObject): self.radius = 0 self.gridCells = 20 self.propTable = [None] * self.gridCells - for i in range(len(self.propTable)): + for i in xrange(len(self.propTable)): self.propTable[i] = [None] * self.gridCells self.dx = 1.0 / self.gridCells diff --git a/toontown/estate/DistributedGardenPlot.py b/toontown/estate/DistributedGardenPlot.py index e5367909..f56538a3 100755 --- a/toontown/estate/DistributedGardenPlot.py +++ b/toontown/estate/DistributedGardenPlot.py @@ -137,7 +137,6 @@ class DistributedGardenPlot(DistributedLawnDecor.DistributedLawnDecor): recipeKey = GardenGlobals.getRecipeKey(recipeStr, special) if recipeKey >= 0: species, variety = GardenGlobals.getSpeciesVarietyGivenRecipe(recipeKey) - print 'RK>0', species, variety if species >= 0 and variety >= 0: self.sendUpdate('plantFlower', [species, variety]) successPlanting = True diff --git a/toontown/estate/DistributedLawnDecor.py b/toontown/estate/DistributedLawnDecor.py index b9bf5046..1a2a7c1b 100755 --- a/toontown/estate/DistributedLawnDecor.py +++ b/toontown/estate/DistributedLawnDecor.py @@ -177,7 +177,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast picker.traverse(render) if queue.getNumEntries() > 0: queue.sortEntries() - for index in range(queue.getNumEntries()): + for index in xrange(queue.getNumEntries()): entry = queue.getEntry(index) if recurseParent(entry.getIntoNode(), 'terrain_DNARoot'): self.movieNode.setZ(entry.getSurfacePoint(self)[2]) @@ -186,7 +186,7 @@ class DistributedLawnDecor(DistributedNode.DistributedNode, NodePath, ShadowCast picker.traverse(render) if queue.getNumEntries() > 0: queue.sortEntries() - for index in range(queue.getNumEntries()): + for index in xrange(queue.getNumEntries()): entry = queue.getEntry(index) if recurseParent(entry.getIntoNode(), 'terrain_DNARoot'): self.setZ(entry.getSurfacePoint(render)[2] + self.stickUp + 0.1) diff --git a/toontown/estate/DistributedStatuary.py b/toontown/estate/DistributedStatuary.py index 4af314d4..4d9680b1 100755 --- a/toontown/estate/DistributedStatuary.py +++ b/toontown/estate/DistributedStatuary.py @@ -43,10 +43,10 @@ class DistributedStatuary(DistributedLawnDecor.DistributedLawnDecor): self.plantType = GardenGlobals.PlantAttributes[typeIndex]['plantType'] self.modelPath = GardenGlobals.PlantAttributes[typeIndex]['model'] self.pinballScore = None - if GardenGlobals.PlantAttributes[typeIndex].has_key('pinballScore'): + if 'pinballScore' in GardenGlobals.PlantAttributes[typeIndex]: self.pinballScore = GardenGlobals.PlantAttributes[typeIndex]['pinballScore'] self.worldScale = 1.0 - if GardenGlobals.PlantAttributes[typeIndex].has_key('worldScale'): + if 'worldScale' in GardenGlobals.PlantAttributes[typeIndex]: self.worldScale = GardenGlobals.PlantAttributes[typeIndex]['worldScale'] return diff --git a/toontown/estate/DistributedToonStatuary.py b/toontown/estate/DistributedToonStatuary.py index 4449a2dc..3926a79e 100755 --- a/toontown/estate/DistributedToonStatuary.py +++ b/toontown/estate/DistributedToonStatuary.py @@ -112,7 +112,7 @@ class DistributedToonStatuary(DistributedStatuary.DistributedStatuary): if sleeves: sleeves.setTexture(desatSleeveTex, 1) bottoms = torso.findAllMatches('**/torso-bot*') - for bottomNum in range(0, bottoms.getNumPaths()): + for bottomNum in xrange(0, bottoms.getNumPaths()): bottom = bottoms.getPath(bottomNum) if bottom: if self.toon.style.torso[1] == 's': From e2501c2832356973616ec920e219b52e478223b6 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 02:08:34 -0400 Subject: [PATCH 067/161] bye bye velvetRoped --- toontown/estate/DistributedGagTree.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/toontown/estate/DistributedGagTree.py b/toontown/estate/DistributedGagTree.py index 69167904..0a09e61e 100755 --- a/toontown/estate/DistributedGagTree.py +++ b/toontown/estate/DistributedGagTree.py @@ -379,14 +379,8 @@ class DistributedGagTree(DistributedPlantBase.DistributedPlantBase): self.finishInteraction() return - def velvetRoped(self): - return not base.cr.isPaid() and ToontownBattleGlobals.gagIsPaidOnly(self.gagTrack, self.gagLevel) - def allowedToPick(self): - retval = True - if self.velvetRoped(): - retval = False - return retval + return True def unlockPick(self): retval = True From c5af613514251f92c4f6ab0513a4d59d991a1be6 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 02:21:04 -0400 Subject: [PATCH 068/161] We don't need all these useless imports. --- toontown/estate/DistributedGarden.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/toontown/estate/DistributedGarden.py b/toontown/estate/DistributedGarden.py index f7b1263e..46ee2ea5 100755 --- a/toontown/estate/DistributedGarden.py +++ b/toontown/estate/DistributedGarden.py @@ -1,22 +1,9 @@ -from pandac.PandaModules import * -from toontown.toonbase.ToonBaseGlobal import * -from direct.gui.DirectGui import * -from pandac.PandaModules import * -from direct.distributed.ClockDelta import * -from toontown.toonbase import ToontownGlobals +from panda3d.core import * from direct.distributed import DistributedObject +from direct.distributed.ClockDelta import * from direct.directnotify import DirectNotifyGlobal -from direct.fsm import ClassicFSM -from direct.fsm import State -from toontown.toon import Toon -from direct.showbase import RandomNumGen -from toontown.toonbase import TTLocalizer -import random -import random -import cPickle -from direct.showbase import PythonUtil -from toontown.hood import Place -import Estate +from direct.gui.DirectGui import * +from toontown.toonbase.ToonBaseGlobal import * import HouseGlobals class DistributedGarden(DistributedObject.DistributedObject): From baeb2f38f4dff26a5a17e3d78fca69fb93593a10 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 02:27:51 -0400 Subject: [PATCH 069/161] move the pet model down a bit so it's closer to TTO. --- toontown/pets/PetAvatarPanel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/pets/PetAvatarPanel.py b/toontown/pets/PetAvatarPanel.py index ea398eee..131f091e 100755 --- a/toontown/pets/PetAvatarPanel.py +++ b/toontown/pets/PetAvatarPanel.py @@ -270,7 +270,7 @@ class PetAvatarPanel(AvatarPanel.AvatarPanel): def __fillPetInfo(self, avatar): self.notify.debug('__fillPetInfo(): doId=%s' % avatar.doId) self.petView = self.frame.attachNewNode('petView') - self.petView.setPos(0, 0, 5.4) + self.petView.setPos(0, 0, 5) if hasattr(avatar, 'announceGenerate'): avatar.announceGenerate() self.petModel = Pet.Pet(forGui=1) From 4b2e6c05d64fdd5b781515651e2a75ae5ae5425c Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 02:46:55 -0400 Subject: [PATCH 070/161] edit DistributedToonStatuary --- toontown/estate/DistributedToonStatuary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/estate/DistributedToonStatuary.py b/toontown/estate/DistributedToonStatuary.py index 3926a79e..18774b6b 100755 --- a/toontown/estate/DistributedToonStatuary.py +++ b/toontown/estate/DistributedToonStatuary.py @@ -46,7 +46,7 @@ class DistributedToonStatuary(DistributedStatuary.DistributedStatuary): self.model.setScale(self.worldScale * 1.5, self.worldScale * 1.5, self.worldScale) self.getToonPropertiesFromOptional() dna = ToonDNA.ToonDNA() - dna.newToonFromProperties(self.headType, self.torsoType, self.legType, self.gender, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + dna.newToonFromProperties(self.headType, self.torsoType, self.legType, self.gender, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) self.setupStoneToon(dna) self.poseToonFromTypeIndex(self.typeIndex) self.toon.reparentTo(self.model) From 634378555d74032bc323a13ccef2daf237d94d10 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Wed, 22 Jul 2015 09:11:48 -0400 Subject: [PATCH 071/161] For now. --- dependencies/config/release/dev.prc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/config/release/dev.prc b/dependencies/config/release/dev.prc index 4bf0134a..103688c0 100644 --- a/dependencies/config/release/dev.prc +++ b/dependencies/config/release/dev.prc @@ -20,7 +20,7 @@ dc-file dependencies/astron/dclass/stride.dc # Core features: want-pets #t -want-parties #t +want-parties #f want-cogdominiums #t want-lawbot-cogdo #t want-anim-props #t From 99e37a7f8a9c6d96680e98603facfbcd2d3b00a6 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 09:47:10 -0400 Subject: [PATCH 072/161] fix toon deletion --- toontown/uberdog/ClientServicesManagerUD.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/uberdog/ClientServicesManagerUD.py b/toontown/uberdog/ClientServicesManagerUD.py index 40715f8c..6c11f7a7 100755 --- a/toontown/uberdog/ClientServicesManagerUD.py +++ b/toontown/uberdog/ClientServicesManagerUD.py @@ -689,7 +689,7 @@ class DeleteAvatarFSM(GetAvatarsFSM): estateId, self.csm.air.dclassesByName['DistributedEstateAI'], {'setSlot%dToonId' % index: [0], - 'setSlot%dItems' % index: [[]]} + 'setSlot%dGarden' % index: [[]]} ) self.csm.air.dbInterface.updateObject( From ec388033c1dc1018f6ffc19b66d63f632aea6464 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 10:47:02 -0400 Subject: [PATCH 073/161] Implement Fish Bingo Every Wednesday and Saturday! --- .../fishing/DistributedPondBingoManagerAI.py | 44 ++++++++++++------- toontown/hood/HoodAI.py | 6 +++ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/toontown/fishing/DistributedPondBingoManagerAI.py b/toontown/fishing/DistributedPondBingoManagerAI.py index 2abd4284..f5d6e3e4 100755 --- a/toontown/fishing/DistributedPondBingoManagerAI.py +++ b/toontown/fishing/DistributedPondBingoManagerAI.py @@ -8,10 +8,9 @@ from toontown.fishing.ThreewayBingo import ThreewayBingo from toontown.fishing.DiagonalBingo import DiagonalBingo from toontown.fishing.BlockoutBingo import BlockoutBingo from toontown.fishing.FourCornerBingo import FourCornerBingo -from otp.ai.MagicWordGlobal import * from direct.task import Task from direct.distributed.ClockDelta import * -import random +import random, datetime RequestCard = {} @@ -25,26 +24,44 @@ class DistributedPondBingoManagerAI(DistributedObjectAI): self.tileSeed = None self.typeId = None self.state = 'Off' + self.pond = None self.canCall = False self.shouldStop = False self.lastUpdate = globalClockDelta.getRealNetworkTime() self.cardId = 0 + def initTasks(self): + now = datetime.datetime.now() + weekday = now.weekday() + targetday = 2 # Wednesday + if weekday in (3, 4): + targetday = 5 + togo = targetday - weekday + if togo < 0: + togo += 7 + s = now + datetime.timedelta(days=togo) + start = datetime.datetime(s.year, s.month, s.day) + secs = max(0, (start - now).total_seconds()) + self.notify.debug('Today it\'s %d, so we wait for %d, togo: %d %d' % (weekday, targetday, togo, secs)) + taskMgr.doMethodLater(secs, DistributedPondBingoManagerAI.startTask, self.taskName('start'), extraArgs=[self]) + + def startTask(self): + self.notify.debug('Starting game') + + def stop(task): + self.notify.debug('Stopping game') + self.shouldStop = True + return task.done + + taskMgr.doMethodLater(24 * 60 * 60, stop, self.taskName('stop')) + self.createGame() + def setPondDoId(self, pondId): self.pond = self.air.doId2do[pondId] def getPondDoId(self): return self.pond.getDoId() - def updateGameState(self, gameState, cellId): - pass - - def setCardState(self, cardId, typeId, tileSeed, gameState): - pass - - def setState(self, state, timeStamp): - pass - def cardUpdate(self, cardId, cellId, genus, species): avId = self.air.getAvatarIdFromSender() spot = self.pond.hasToon(avId) @@ -70,9 +87,6 @@ class DistributedPondBingoManagerAI(DistributedObjectAI): elif result == BingoGlobals.UPDATE: self.sendGameStateUpdate(cellId) - def enableBingo(self): - createGame() - def d_enableBingo(self): self.sendUpdate('enableBingo', []) @@ -150,8 +164,6 @@ class DistributedPondBingoManagerAI(DistributedObjectAI): taskMgr.doMethodLater(5, DistributedPondBingoManagerAI.startWait, 'startWait%d' % self.getDoId(), [self]) taskMgr.remove('finishGame%d' % self.getDoId()) - - def finishGame(self): self.state = 'GameOver' self.sendStateUpdate() diff --git a/toontown/hood/HoodAI.py b/toontown/hood/HoodAI.py index 592e302f..8b0446ad 100755 --- a/toontown/hood/HoodAI.py +++ b/toontown/hood/HoodAI.py @@ -5,6 +5,7 @@ from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI from toontown.hood import ZoneUtil from toontown.safezone import TreasureGlobals from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI +from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI from toontown.safezone.DistributedPartyGateAI import DistributedPartyGateAI from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI from toontown.suit import DistributedSuitPlannerAI @@ -90,6 +91,11 @@ class HoodAI: fishingPond.generateWithRequired(zoneId) fishingPond.start() + fishingPond.bingoMgr = DistributedPondBingoManagerAI(simbase.air) + fishingPond.bingoMgr.setPondDoId(fishingPond.getDoId()) + fishingPond.bingoMgr.generateWithRequired(zoneId) + fishingPond.bingoMgr.initTasks() + fishingPonds.append(fishingPond) elif isinstance(dnaGroup, DNAVisGroup): zoneId = int(dnaGroup.getName().split(':')[0]) From d1694f3d70caa809c27498b45e9fa012c59640ca Mon Sep 17 00:00:00 2001 From: Loudrob Date: Wed, 22 Jul 2015 10:49:36 -0400 Subject: [PATCH 074/161] nice --- toontown/estate/DistributedPhoneAI.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 4aa404bc..7c91051f 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -89,6 +89,8 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): self.d_setMovie(PHONE_MOVIE_PICKUP, avId) av.b_setCatalogNotify(0, av.mailboxNotify) + self.air.questManager.toonCalledClarabelle(av) + def avatarExit(self): if not self.inUse: self.notify.warning('Requested avatarExit but phone isn\'t in use!') From e4e2b17e4734e2789afd734c3c9358961d1944a0 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Wed, 22 Jul 2015 11:02:56 -0400 Subject: [PATCH 075/161] Forgot this, lel --- toontown/ai/QuestManagerAI.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/toontown/ai/QuestManagerAI.py b/toontown/ai/QuestManagerAI.py index 0309b98a..54b29696 100755 --- a/toontown/ai/QuestManagerAI.py +++ b/toontown/ai/QuestManagerAI.py @@ -290,6 +290,12 @@ class QuestManagerAI: questList.append(questDesc) av.b_setQuests(questList) + + def toonCalledClarabelle(self, toon): + for index, quest in enumerate(self.__toonQuestsList2Quests(toon.quests)): + if isinstance(quest, Quests.PhoneQuest): + self.__incrementQuestProgress(toon.quests[index]) + toon.updateQuests() def toonMadeNPCFriend(self, av, count, method): avQuests = av.getQuests() From 713babe5660409a1779491ad4b82ae9c4e6b5047 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 11:03:30 -0400 Subject: [PATCH 076/161] Fish Bingo in estates Same schedule. --- toontown/estate/DistributedEstateAI.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index eb0c12b0..aacc41d6 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -504,7 +504,13 @@ class DistributedEstateAI(DistributedObjectAI): self.pond = DistributedFishingPondAI(simbase.air) self.pond.setArea(ToontownGlobals.MyEstate) self.pond.generateWithRequired(self.zoneId) - + self.pond.start() + + self.pond.bingoMgr = DistributedPondBingoManagerAI(simbase.air) + self.pond.bingoMgr.setPondDoId(self.pond.getDoId()) + self.pond.bingoMgr.generateWithRequired(self.zoneId) + self.pond.bingoMgr.initTasks() + for i in xrange(FishingTargetGlobals.getNumTargets(ToontownGlobals.MyEstate)): target = DistributedFishingTargetAI(self.air) target.setPondDoId(self.pond.getDoId()) From 01b7437514dda14f62370603d183104b22e151c1 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Wed, 22 Jul 2015 11:12:00 -0400 Subject: [PATCH 077/161] Phone quest. --- toontown/ai/QuestManagerAI.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/toontown/ai/QuestManagerAI.py b/toontown/ai/QuestManagerAI.py index 54b29696..4a212157 100755 --- a/toontown/ai/QuestManagerAI.py +++ b/toontown/ai/QuestManagerAI.py @@ -291,11 +291,16 @@ class QuestManagerAI: av.b_setQuests(questList) - def toonCalledClarabelle(self, toon): - for index, quest in enumerate(self.__toonQuestsList2Quests(toon.quests)): - if isinstance(quest, Quests.PhoneQuest): - self.__incrementQuestProgress(toon.quests[index]) - toon.updateQuests() + def toonCalledClarabelle(self, av): + avQuests = av.getQuests() + questList = [] + for i in xrange(0, len(avQuests), 5): + questDesc = avQuests[i : i + 5] + questClass = Quests.getQuest(questDesc[QuestIdIndex]) + if isinstance(questClass, Quests.PhoneQuest) and questClass.getCompletionStatus(av, questDesc) == Quests.INCOMPLETE: + questDesc[QuestProgressIndex] += 1 + questList.append(questDesc) + av.b_setQuests(questList) def toonMadeNPCFriend(self, av, count, method): avQuests = av.getQuests() From f71a9124cc66b3748b8ceba7f25eb9d75ddcac80 Mon Sep 17 00:00:00 2001 From: John Cote Date: Wed, 22 Jul 2015 12:20:18 -0400 Subject: [PATCH 078/161] nice --- toontown/safezone/DistributedFishingSpotAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toontown/safezone/DistributedFishingSpotAI.py b/toontown/safezone/DistributedFishingSpotAI.py index 65e82f25..2fef583a 100755 --- a/toontown/safezone/DistributedFishingSpotAI.py +++ b/toontown/safezone/DistributedFishingSpotAI.py @@ -103,7 +103,7 @@ class DistributedFishingSpotAI(DistributedObjectAI): if self.avId != avId: self.air.writeServerEvent('suspicious', avId, 'Toon tried to sell fish at a pier they\'re not using!') return - if self.air.doId2do[pondDoId].getArea() != ToontownGlobals.MyEstate: + if self.air.doId2do[self.pondDoId].getArea() != ToontownGlobals.MyEstate: self.air.writeServerEvent('suspicious', avId, 'Toon tried to sell fish at a pier not in their estate!') av = self.air.doId2do[avId] result = self.air.fishManager.creditFishTank(av) From 1de4367482dd114291819eabf2dac92e6b95486d Mon Sep 17 00:00:00 2001 From: Loudrob Date: Wed, 22 Jul 2015 18:00:31 -0400 Subject: [PATCH 079/161] No more updateCoons. --- toontown/estate/DistributedEstateAI.py | 9 ----- toontown/estate/EstateManagerAI.py | 50 +++++++++++++++++++------- toontown/toon/DistributedToonAI.py | 4 +-- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index aacc41d6..75e00abc 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -683,15 +683,6 @@ class DistributedEstateAI(DistributedObjectAI): def rentItem(self, rentType, duration): self.b_setRentalTimeStamp(time.time() + duration * 60) self.b_setRentalType(rentType) - - def updateToons(self): - self.d_setSlot0ToonId(self.toons[0]) - self.d_setSlot1ToonId(self.toons[1]) - self.d_setSlot2ToonId(self.toons[2]) - self.d_setSlot3ToonId(self.toons[3]) - self.d_setSlot4ToonId(self.toons[4]) - self.d_setSlot5ToonId(self.toons[5]) - self.sendUpdate('setIdList', [self.toons]) def setSlot0ToonId(self, id): self.toons[0] = id diff --git a/toontown/estate/EstateManagerAI.py b/toontown/estate/EstateManagerAI.py index 709aa872..573ba265 100755 --- a/toontown/estate/EstateManagerAI.py +++ b/toontown/estate/EstateManagerAI.py @@ -215,20 +215,34 @@ class LoadEstateFSM(FSM): if self.state != 'CreateEstate': return # We must have aborted or something... self.estateId = estateId + self.demand('StoreEstate') - # Update our account so we can store this new estate object. + def enterStoreEstate(self): + # store the estate in account + # congrats however wrote this for forgetting it! + self.mgr.air.dbInterface.updateObject( self.mgr.air.dbId, self.accountId, self.mgr.air.dclassesByName['AccountAI'], - { 'ESTATE_ID': estateId } - ) - + {'ESTATE_ID': self.estateId}, + {'ESTATE_ID': 0}, + self.__handleStoreEstate) + + def __handleStoreEstate(self, fields): + if fields: + self.notify.warning("Failed to associate Estate %d with account %d, loading anyway." % (self.estateId, self.accountId)) + self.demand('LoadEstate') def enterLoadEstate(self): # Activate the estate: - self.mgr.air.sendActivate(self.estateId, self.mgr.air.districtId, self.zoneId) + fields = {} + for i, toon in enumerate(self.toonIds): + fields['setSlot%dToonId' % i] = (toon,) + + self.mgr.air.sendActivate(self.estateId, self.mgr.air.districtId, self.zoneId, + self.mgr.air.dclassesByName['DistributedEstateAI'], fields) # Now we wait for the estate to show up... We do this by hanging a messenger # hook which the DistributedEstateAI throws once it spawns. @@ -238,9 +252,6 @@ class LoadEstateFSM(FSM): self.estate = estate estate.pets = [] - self.estate.toons = self.toonIds - self.estate.updateToons() - # Gotcha! Now we need to load houses: self.demand('LoadHouses') @@ -312,6 +323,7 @@ class EstateManagerAI(DistributedObjectAI): self.estate2toons = {} self.toon2estate = {} self.estate2timeout = {} + self.zoneId2owner = {} def getEstateZone(self, avId): senderId = self.air.getAvatarIdFromSender() @@ -375,11 +387,12 @@ class EstateManagerAI(DistributedObjectAI): # And I guess we won't need our zoneId anymore... self.air.deallocateZone(zoneId) + del self.zoneId2owner[zoneId] toon.loadEstateFSM = None self.acceptOnce(self.air.getAvatarExitEvent(toon.doId), self._unloadEstate, extraArgs=[toon]) - + self.zoneId2owner[zoneId] = avId toon.loadEstateFSM = LoadEstateFSM(self, estateLoaded) toon.loadEstateFSM.start(accId, zoneId) @@ -443,6 +456,7 @@ class EstateManagerAI(DistributedObjectAI): # Free estate's zone: self.air.deallocateZone(estate.zoneId) + del self.zoneId2owner[estate.zoneId] def _sendToonsToPlayground(self, estate, reason): for toon in self.estate2toons.get(estate, []): @@ -451,10 +465,12 @@ class EstateManagerAI(DistributedObjectAI): def _mapToEstate(self, toon, estate): self._unmapFromEstate(toon) - self.estate2toons.setdefault(estate, []).append(toon) self.toon2estate[toon] = estate + if hasattr(toon, 'enterEstate'): + toon.enterEstate(estate.owner.doId, estate.zoneId) + def _unmapFromEstate(self, toon): estate = self.toon2estate.get(toon) if not estate: return @@ -464,9 +480,19 @@ class EstateManagerAI(DistributedObjectAI): self.estate2toons[estate].remove(toon) except (KeyError, ValueError): pass + + if hasattr(toon, 'exitEstate'): + toon.exitEstate() def _lookupEstate(self, toon): return self.toon2estate.get(toon) - def getOwnerFromZone(self, avId): - return False + def getOwnerFromZone(self, zoneId): + return self.zoneId2owner.get(zoneId, 0) + + def getEstateZones(self, ownerId): + estate = self._lookupEstate(self.air.doId2do.get(ownerId)) + if estate: + return [estate.zoneId] + + return [] diff --git a/toontown/toon/DistributedToonAI.py b/toontown/toon/DistributedToonAI.py index 16822a09..8c2f170e 100755 --- a/toontown/toon/DistributedToonAI.py +++ b/toontown/toon/DistributedToonAI.py @@ -2942,8 +2942,7 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo taskMgr.add(self._moveSphere, self._getMoveSphereTaskName(), priority=OTPGlobals.AICollMovePriority) self.inEstate = 1 self.estateOwnerId = ownerId - self.estateZones = simbase.air.estateMgr.getEstateZones(ownerId) - self.estateHouseZones = simbase.air.estateMgr.getEstateHouseZones(ownerId) + self.estateZones = [zoneId] self.enterPetLook() def _getPetLookerBodyNode(self): @@ -2967,7 +2966,6 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo self.collNodePath.removeNode() del self.collNodePath del self.estateOwnerId - del self.estateHouseZones del self.inEstate self._wasInEstate = 1 From 6ce7485ef4b021309d7634b59a6020f2eefb62f7 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 23 Jul 2015 12:59:17 +0300 Subject: [PATCH 080/161] Loudrob pls --- dependencies/astron/dclass/stride.dc | 3 +- toontown/catalog/CatalogGardenItem.py | 13 +--- toontown/estate/DistributedEstate.py | 74 +++++++++++++++----- toontown/estate/DistributedEstateAI.py | 43 ++++++++++-- toontown/estate/DistributedGarden.py | 2 - toontown/fishing/FishingTargetGlobals.py | 2 +- toontown/minigame/DistributedTugOfWarGame.py | 2 - toontown/toonbase/ToontownGlobals.py | 5 +- 8 files changed, 99 insertions(+), 45 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index c8e2c8bd..ddf3b618 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -1217,7 +1217,6 @@ struct lawnItem { }; dclass DistributedEstate : DistributedObject { - string DcObjectType db; setEstateReady() broadcast; setClientReady() airecv clsend; setEstateType(uint8 type = 0) required broadcast db; @@ -1244,6 +1243,8 @@ dclass DistributedEstate : DistributedObject { setSlot5Garden(blob g) required airecv db; setIdList(uint32 []) broadcast ram; completeFlowerSale(uint8) airecv clsend; + completeFishSale() airecv clsend; + thankSeller(int8, int8, int8); awardedTrophy(uint32) broadcast; setClouds(uint8) required broadcast ram; cannonsOver() broadcast; diff --git a/toontown/catalog/CatalogGardenItem.py b/toontown/catalog/CatalogGardenItem.py index 799f32d7..fba420ad 100755 --- a/toontown/catalog/CatalogGardenItem.py +++ b/toontown/catalog/CatalogGardenItem.py @@ -22,11 +22,6 @@ class CatalogGardenItem(CatalogItem.CatalogItem): else: return 100 - def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 - return 0 - def getAcceptItemErrorText(self, retcode): if retcode == ToontownGlobals.P_ItemAvailable: return TTLocalizer.CatalogAcceptGarden @@ -39,17 +34,16 @@ class CatalogGardenItem(CatalogItem.CatalogItem): return TTLocalizer.GardenTypeName def getName(self): - name = GardenGlobals.Specials[self.gardenIndex]['photoName'] - return name + return GardenGlobals.Specials[self.gardenIndex]['photoName'] def recordPurchase(self, avatar, optional): if avatar: avatar.addGardenItem(self.gardenIndex, self.numItems) - if 1: - return ToontownGlobals.P_ItemAvailable + return ToontownGlobals.P_ItemAvailable def getPicture(self, avatar): photoModel = GardenGlobals.Specials[self.gardenIndex]['photoModel'] + if 'photoAnimation' in GardenGlobals.Specials[self.gardenIndex]: modelPath = photoModel + GardenGlobals.Specials[self.gardenIndex]['photoAnimation'][0] animationName = GardenGlobals.Specials[self.gardenIndex]['photoAnimation'][1] @@ -75,7 +69,6 @@ class CatalogGardenItem(CatalogItem.CatalogItem): self.model.setScale(photoScale) self.hasPicture = True return (frame, None) - return None def cleanupPicture(self): CatalogItem.CatalogItem.cleanupPicture(self) diff --git a/toontown/estate/DistributedEstate.py b/toontown/estate/DistributedEstate.py index 47e551b7..a14acdbf 100755 --- a/toontown/estate/DistributedEstate.py +++ b/toontown/estate/DistributedEstate.py @@ -6,27 +6,16 @@ from direct.interval.IntervalGlobal import * import math from toontown.toonbase import ToontownGlobals from direct.distributed import DistributedObject -from direct.directnotify import DirectNotifyGlobal -from direct.fsm import ClassicFSM -from direct.fsm import State -from toontown.toon import Toon -from direct.showbase import RandomNumGen from direct.task.Task import Task from toontown.toonbase import TTLocalizer import random import cPickle import time -from direct.showbase import PythonUtil -from toontown.hood import Place -import Estate import HouseGlobals from toontown.estate import GardenGlobals -from toontown.estate import DistributedFlower -from toontown.estate import DistributedGagTree -from toontown.estate import DistributedStatuary -import GardenProgressMeter from toontown.estate import FlowerSellGUI from toontown.toontowngui import TTDialog +from toontown.fishing import FishSellGUI class DistributedEstate(DistributedObject.DistributedObject): notify = directNotify.newCategory('DistributedEstate') @@ -44,16 +33,15 @@ class DistributedEstate(DistributedObject.DistributedObject): self.initCamera() self.plotTable = [] self.idList = [] - base.estate = self self.flowerGuiDoneEvent = 'flowerGuiDone' - return + self.fishGuiDoneEvent = 'fishGuiDone' def disable(self): self.notify.debug('disable') self.__stopBirds() self.__stopCrickets() DistributedObject.DistributedObject.disable(self) - self.ignore('enterFlowerSellBox') + self.ignoreAll() def delete(self): self.notify.debug('delete') @@ -61,12 +49,14 @@ class DistributedEstate(DistributedObject.DistributedObject): DistributedObject.DistributedObject.delete(self) def load(self): - self.lt = base.localAvatar + self.defaultSignModel = loader.loadModel('phase_13/models/parties/eventSign') + self.activityIconsModel = loader.loadModel('phase_4/models/parties/eventSignIcons') if base.cr.newsManager.isHolidayRunning(ToontownGlobals.HALLOWEEN): self.loadWitch() else: self.loadAirplane() self.loadFlowerSellBox() + self.loadFishSellBox() self.oldClear = base.win.getClearColor() base.win.setClearColor(Vec4(0.09, 0.55, 0.21, 1.0)) @@ -95,7 +85,10 @@ class DistributedEstate(DistributedObject.DistributedObject): self.flowerSellBox.removeNode() del self.flowerSellBox self.flowerSellBox = None - return + if self.fishSellBox: + self.fishSellBox.removeNode() + del self.fishSellBox + self.fishSellBox = None def announceGenerate(self): DistributedObject.DistributedObject.announceGenerate(self) @@ -189,7 +182,6 @@ class DistributedEstate(DistributedObject.DistributedObject): self.housePos = posList self.numHouses = len(self.houseType) self.house = [None] * self.numHouses - return def __startAirplaneTask(self): self.theta = 0 @@ -371,12 +363,56 @@ class DistributedEstate(DistributedObject.DistributedObject): self.ignore('stoppedAsleep') self.flowerGui.destroy() self.flowerGui = None - return def popupFlowerGUI(self): self.acceptOnce(self.flowerGuiDoneEvent, self.__handleSaleDone) self.flowerGui = FlowerSellGUI.FlowerSellGUI(self.flowerGuiDoneEvent) self.accept('stoppedAsleep', self.__handleSaleDone) + + def loadFishSellBox(self): + self.fishSellBox = loader.loadModel('phase_4/models/minigames/treasure_chest.bam') + self.fishSellBox.setPos(45, -165.75, 0.025) + self.fishSellBox.setH(210) + self.fishSellBox.reparentTo(render) + cSphere = CollisionSphere(0.0, 0.0, 0.0, 2.25) + cSphere.setTangible(0) + colNode = CollisionNode('FishSellBox') + colNode.addSolid(cSphere) + cSpherePath = self.fishSellBox.attachNewNode(colNode) + cSpherePath.hide() + cSpherePath.setCollideMask(ToontownGlobals.WallBitmask) + self.accept('enterFishSellBox', self.__touchedFishSellBox) + + def __touchedFishSellBox(self, entry): + if base.localAvatar.doId in self.idList: + if base.localAvatar.fishTank.getFish(): + self.popupFishGUI() + + def __handleFishSaleDone(self, sell=0): + if sell: + self.sendUpdate('completeFishSale') + else: + base.localAvatar.setSystemMessage(0, TTLocalizer.STOREOWNER_NOFISH) + + base.setCellsAvailable(base.bottomCells, 1) + base.cr.playGame.getPlace().setState('walk') + self.ignore(self.fishGuiDoneEvent) + self.ignore('stoppedAsleep') + self.fishGui.destroy() + self.fishGui = None + + def popupFishGUI(self): + base.setCellsAvailable(base.bottomCells, 0) + base.cr.playGame.getPlace().setState('stopped') + self.acceptOnce(self.fishGuiDoneEvent, self.__handleFishSaleDone) + self.fishGui = FishSellGUI.FishSellGUI(self.fishGuiDoneEvent) + self.accept('stoppedAsleep', self.__handleFishSaleDone) + + def thankSeller(self, mode, fish, maxFish): + if mode == ToontownGlobals.FISHSALE_TROPHY: + base.localAvatar.setSystemMessage(0, TTLocalizer.STOREOWNER_TROPHY % (fish, maxFish)) + elif mode == ToontownGlobals.FISHSALE_COMPLETE: + base.localAvatar.setSystemMessage(0, TTLocalizer.STOREOWNER_THANKSFISH) def closedAwardDialog(self, value): self.awardDialog.destroy() diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index 75e00abc..a3cdcd50 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -7,13 +7,14 @@ import time, random from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI from toontown.fishing.DistributedFishingTargetAI import DistributedFishingTargetAI from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI -from toontown.fishing import FishingTargetGlobals +from toontown.fishing import FishingTargetGlobals, FishGlobals from toontown.safezone import TreasureGlobals from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI from toontown.safezone import DistributedTreasureAI from toontown.safezone import ButterflyGlobals from toontown.safezone import DistributedButterflyAI from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI +from toontown.parties.DistributedPartyJukeboxActivityAI import DistributedPartyJukeboxActivityAI from DistributedGardenBoxAI import * from DistributedGardenPlotAI import * @@ -486,17 +487,21 @@ class DistributedEstateAI(DistributedObjectAI): self.houses = [None] * 6 self.rentalType = 0 self.rentalHandle = None - self.doId2do = { } self.pond = None + self.jukebox = None self.spots = [] - + self.butterflies = [] self.targets = [] self.owner = None self.gardenManager = GardenManager(self) self.__pendingGardens = {} + + @property + def hostId(self): + return 1000000001 def generate(self): DistributedObjectAI.generate(self) @@ -544,19 +549,29 @@ class DistributedEstateAI(DistributedObjectAI): spot.setPosHpr(46.8254, -113.682, 0.46015, 135, 0, 0) spot.generateWithRequired(self.zoneId) self.spots.append(spot) + + self.jukebox = DistributedPartyJukeboxActivityAI(self.air, self.doId, (0, 0, 0, 0)) + self.jukebox.generateWithRequired(self.zoneId) + self.jukebox.sendUpdate('setX', [-21.8630]) + self.jukebox.sendUpdate('setY', [-154.669]) + self.jukebox.sendUpdate('setH', [148.7050]) + self.jukebox.sendUpdate('unloadSign') ButterflyGlobals.generateIndexes(self.zoneId, ButterflyGlobals.ESTATE) for i in xrange(0, ButterflyGlobals.NUM_BUTTERFLY_AREAS[ButterflyGlobals.ESTATE]): for j in xrange(0, ButterflyGlobals.NUM_BUTTERFLIES[ButterflyGlobals.ESTATE]): - bfly = DistributedButterflyAI.DistributedButterflyAI(self.air, ButterflyGlobals.ESTATE, i, self.zoneId) - bfly.generateWithRequired(self.zoneId) - bfly.start() - self.addDistObj(bfly) + butterfly = DistributedButterflyAI.DistributedButterflyAI(self.air, ButterflyGlobals.ESTATE, i, self.zoneId) + butterfly.generateWithRequired(self.zoneId) + butterfly.start() + self.butterflies.append(butterfly) def destroy(self): for house in self.houses: if house: house.requestDelete() + for butterfly in self.butterflies: + if butterfly: + butterfly.requestDelete() del self.houses[:] if self.pond: for spot in self.spots: @@ -567,6 +582,8 @@ class DistributedEstateAI(DistributedObjectAI): self.targets = [] self.pond.requestDelete() self.pond = None + if self.jukebox: + self.jukebox.requestDelete() if self.treasurePlanner: self.treasurePlanner.stop() @@ -889,6 +906,18 @@ class DistributedEstateAI(DistributedObjectAI): self.sendUpdate('awardedTrophy', [avId]) av.b_setGardenTrophies(range(len(collection) // 10)) + + def completeFishSale(self): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + + if not av: + return + + if self.air.fishManager.creditFishTank(av): + self.sendUpdateToAvatarId(avId, 'thankSeller', [ToontownGlobals.FISHSALE_TROPHY, len(av.fishCollection), FishGlobals.getTotalNumFish()]) + else: + self.sendUpdateToAvatarId(avId, 'thankSeller', [ToontownGlobals.FISHSALE_COMPLETE, 0, 0]) def setClouds(self, clouds): self.cloudType = clouds diff --git a/toontown/estate/DistributedGarden.py b/toontown/estate/DistributedGarden.py index 46ee2ea5..8a559e34 100755 --- a/toontown/estate/DistributedGarden.py +++ b/toontown/estate/DistributedGarden.py @@ -12,7 +12,6 @@ class DistributedGarden(DistributedObject.DistributedObject): def __init__(self, cr): self.notify.debug('init') DistributedObject.DistributedObject.__init__(self, cr) - self.lt = base.localAvatar self.props = [] self.pos = None self.radius = 0 @@ -23,7 +22,6 @@ class DistributedGarden(DistributedObject.DistributedObject): self.dx = 1.0 / self.gridCells self.occupied = [] - return def generate(self): DistributedObject.DistributedObject.generate(self) diff --git a/toontown/fishing/FishingTargetGlobals.py b/toontown/fishing/FishingTargetGlobals.py index 14112014..74c02f89 100755 --- a/toontown/fishing/FishingTargetGlobals.py +++ b/toontown/fishing/FishingTargetGlobals.py @@ -146,7 +146,7 @@ __targetInfoDict = {ToontownGlobals.ToontownCentral: (2, -2.1, 14, -2.1 - 0.378), - ToontownGlobals.MyEstate: (5, + ToontownGlobals.MyEstate: (3, 30, -126, -0.3, diff --git a/toontown/minigame/DistributedTugOfWarGame.py b/toontown/minigame/DistributedTugOfWarGame.py index 4f755987..bf2d8dd1 100755 --- a/toontown/minigame/DistributedTugOfWarGame.py +++ b/toontown/minigame/DistributedTugOfWarGame.py @@ -163,7 +163,6 @@ class DistributedTugOfWarGame(DistributedMinigame): def unload(self): self.notify.debug('unload') DistributedMinigame.unload(self) - del self.lt self.timer.destroy() del self.timer self.room.removeNode() @@ -250,7 +249,6 @@ class DistributedTugOfWarGame(DistributedMinigame): def onstage(self): self.notify.debug('onstage') DistributedMinigame.onstage(self) - self.lt = base.localAvatar NametagGlobals.setGlobalNametagScale(1) self.arrowKeys = ArrowKeys.ArrowKeys() self.room.reparentTo(render) diff --git a/toontown/toonbase/ToontownGlobals.py b/toontown/toonbase/ToontownGlobals.py index bcbc304d..39be7ac4 100755 --- a/toontown/toonbase/ToontownGlobals.py +++ b/toontown/toonbase/ToontownGlobals.py @@ -1622,9 +1622,8 @@ BMovementSpeedMultiplier = 1.3 BugReportSite = 'https://bugs.launchpad.net/toontown-united/+filebug' CostPerLaffRestock = 3 -FISHSALE_NONE = 0 -FISHSALE_COMPLETE = 1 -FISHSALE_TROPHY = 2 +FISHSALE_COMPLETE = 0 +FISHSALE_TROPHY = 1 NPCCollisionDelay = 2.5 KnockKnockHeal = 12 KnockKnockCooldown = 600 From fda14d3153c0c1471b21dc6feb7984f956370eb6 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 23 Jul 2015 13:19:57 +0300 Subject: [PATCH 081/161] Satan --- toontown/estate/DistributedEstateAI.py | 11 ----------- toontown/fishing/FishingTargetGlobals.py | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index a3cdcd50..500d0611 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -5,7 +5,6 @@ import HouseGlobals import time, random from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI -from toontown.fishing.DistributedFishingTargetAI import DistributedFishingTargetAI from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI from toontown.fishing import FishingTargetGlobals, FishGlobals from toontown.safezone import TreasureGlobals @@ -492,7 +491,6 @@ class DistributedEstateAI(DistributedObjectAI): self.jukebox = None self.spots = [] self.butterflies = [] - self.targets = [] self.owner = None @@ -516,12 +514,6 @@ class DistributedEstateAI(DistributedObjectAI): self.pond.bingoMgr.generateWithRequired(self.zoneId) self.pond.bingoMgr.initTasks() - for i in xrange(FishingTargetGlobals.getNumTargets(ToontownGlobals.MyEstate)): - target = DistributedFishingTargetAI(self.air) - target.setPondDoId(self.pond.getDoId()) - target.generateWithRequired(self.zoneId) - self.targets.append(target) - treasureType, healAmount, spawnPoints, spawnRate, maxTreasures = TreasureGlobals.SafeZoneTreasureSpawns[ToontownGlobals.MyEstate] self.treasurePlanner = SZTreasurePlannerAI(self.zoneId, treasureType, healAmount, spawnPoints, spawnRate, maxTreasures) self.treasurePlanner.start() @@ -577,9 +569,6 @@ class DistributedEstateAI(DistributedObjectAI): for spot in self.spots: spot.requestDelete() self.spots = [] - for target in self.targets: - target.requestDelete() - self.targets = [] self.pond.requestDelete() self.pond = None if self.jukebox: diff --git a/toontown/fishing/FishingTargetGlobals.py b/toontown/fishing/FishingTargetGlobals.py index 74c02f89..14112014 100755 --- a/toontown/fishing/FishingTargetGlobals.py +++ b/toontown/fishing/FishingTargetGlobals.py @@ -146,7 +146,7 @@ __targetInfoDict = {ToontownGlobals.ToontownCentral: (2, -2.1, 14, -2.1 - 0.378), - ToontownGlobals.MyEstate: (3, + ToontownGlobals.MyEstate: (5, 30, -126, -0.3, From 9ab1bd9534ed6b3a2a07c06df2d59007d7ba918e Mon Sep 17 00:00:00 2001 From: Loudrob Date: Thu, 23 Jul 2015 11:53:54 -0400 Subject: [PATCH 082/161] Disney estate cannons. --- toontown/estate/DistributedCannonAI.py | 174 ++++++++++++++----------- toontown/estate/DistributedEstateAI.py | 5 +- 2 files changed, 98 insertions(+), 81 deletions(-) diff --git a/toontown/estate/DistributedCannonAI.py b/toontown/estate/DistributedCannonAI.py index 3562f330..d11cf3e9 100755 --- a/toontown/estate/DistributedCannonAI.py +++ b/toontown/estate/DistributedCannonAI.py @@ -1,101 +1,121 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectAI import DistributedObjectAI -from direct.distributed.ClockDelta import * -from toontown.minigame import CannonGameGlobals from toontown.toonbase import ToontownGlobals +from direct.distributed.ClockDelta import * +from direct.fsm import ClassicFSM +from direct.fsm import State +from direct.task import Task +from toontown.minigame import CannonGameGlobals +from direct.distributed import DistributedObjectAI +from toontown.minigame import Trajectory import CannonGlobals -class DistributedCannonAI(DistributedObjectAI): - notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCannonAI") +class DistributedCannonAI(DistributedObjectAI.DistributedObjectAI): + notify = directNotify.newCategory('DistributedCannonAI') - def __init__(self, air): - DistributedObjectAI.__init__(self, air) - self.estateId = 0 - self.targetId = 0 - self.posHpr = (0, 0, 0, 0, 0, 0) - self.bumperPos = ToontownGlobals.PinballCannonBumperInitialPos - self.active = 0 + def __init__(self, air, estateId, targetId, x, y, z, h, p, r): + DistributedObjectAI.DistributedObjectAI.__init__(self, air) + self.posHpr = [x, + y, + z, + h, + p, + r] self.avId = 0 - - def setEstateId(self, estateId): self.estateId = estateId - - def getEstateId(self): - return self.estateId - - def setTargetId(self, targetId): + self.timeoutTask = None self.targetId = targetId + self.cannonBumperPos = list(ToontownGlobals.PinballCannonBumperInitialPos) + return - def getTargetId(self): - return self.targetId + def delete(self): + self.ignoreAll() + self.__stopTimeout() + DistributedObjectAI.DistributedObjectAI.delete(self) - def setPosHpr(self, x, y, z, h, p, r): - self.posHpr = (x, y, z, h, p, r) + def requestEnter(self): + avId = self.air.getAvatarIdFromSender() + if self.avId == 0: + self.avId = avId + self.__stopTimeout() + self.setMovie(CannonGlobals.CANNON_MOVIE_LOAD, self.avId) + self.acceptOnce(self.air.getAvatarExitEvent(avId), self.__handleUnexpectedExit, extraArgs=[avId]) + self.acceptOnce('bootAvFromEstate-' + str(avId), self.__handleBootMessage, extraArgs=[avId]) + self.__startTimeout(CannonGlobals.CANNON_TIMEOUT) + else: + self.air.writeServerEvent('suspicious', avId, 'DistributedCannonAI.requestEnter cannon already occupied') + self.notify.warning('requestEnter() - cannon already occupied') + self.sendUpdateToAvatarId(avId, 'requestExit', []) + + def setMovie(self, mode, avId): + self.avId = avId + self.sendUpdate('setMovie', [mode, avId]) + + def getCannonBumperPos(self): + self.notify.debug('---------getCannonBumperPos %s' % self.cannonBumperPos) + return self.cannonBumperPos + + def requestBumperMove(self, x, y, z): + self.cannonBumperPos = [x, y, z] + self.sendUpdate('setCannonBumperPos', [x, y, z]) def getPosHpr(self): return self.posHpr - def setActive(self, active): - self.active = active - self.sendUpdate("setActiveState", [active]) + def getEstateId(self): + return self.estateId - def requestEnter(self): + def getTargetId(self): + return self.targetId + + def setCannonPosition(self, zRot, angle): avId = self.air.getAvatarIdFromSender() - av = self.air.doId2do.get(avId) - if not av: + self.notify.debug('setCannonPosition: ' + str(avId) + ': zRot=' + str(zRot) + ', angle=' + str(angle)) + self.sendUpdate('updateCannonPosition', [avId, zRot, angle]) + + def setCannonLit(self, zRot, angle): + avId = self.air.getAvatarIdFromSender() + self.__stopTimeout() + self.notify.debug('setCannonLit: ' + str(avId) + ': zRot=' + str(zRot) + ', angle=' + str(angle)) + fireTime = CannonGameGlobals.FUSE_TIME + self.sendUpdate('setCannonWillFire', [avId, + fireTime, + zRot, + angle, + globalClockDelta.getRealNetworkTime()]) + + def setLanded(self): + self.ignore(self.air.getAvatarExitEvent(self.avId)) + self.setMovie(CannonGlobals.CANNON_MOVIE_LANDED, 0) + self.avId = 0 + + def setActive(self, active): + if active < 0 or active > 1: + self.air.writeServerEvent('suspicious', active, 'DistributedCannon.setActive value should be 0-1 range') return + self.active = active + self.sendUpdate('setActiveState', [active]) - if not self.avId: - self.avId = avId - self.d_setMovie(CannonGlobals.CANNON_MOVIE_LOAD) - self.acceptOnce(self.air.getAvatarExitEvent(avId), self.__handleUnexpectedExit, extraArgs=[avId]) - else: - self.air.writeServerEvent('suspicious', avId, 'DistributedCannonAI.requestEnter cannon already occupied') - self.notify.warning('requestEnter() - cannon already occupied') + def __startTimeout(self, timeLimit): + self.__stopTimeout() + self.timeoutTask = taskMgr.doMethodLater(timeLimit, self.__handleTimeout, self.taskName('timeout')) - def setMovie(self, mode, avId, extraInfo): - self.avId = avId - self.sendUpdate('setMovie', [mode, avId, extraInfo]) + def __stopTimeout(self): + if self.timeoutTask != None: + taskMgr.remove(self.timeoutTask) + self.timeoutTask = None + return + + def __handleTimeout(self, task): + self.notify.debug('Timeout expired!') + self.__doExit() + return Task.done def __handleUnexpectedExit(self, avId): self.notify.warning('avatar:' + str(avId) + ' has exited unexpectedly') self.__doExit() - def __doExit(self, movie=CannonGlobals.CANNON_MOVIE_FORCE_EXIT): - self.ignore(self.air.getAvatarExitEvent(self.avId)) - self.d_setMovie(movie) - self.avId = 0 + def __handleBootMessage(self, avId): + self.notify.warning('avatar:' + str(avId) + ' got booted ') + self.__doExit() - def requestExit(self): - pass - - def d_setMovie(self, movie): - self.sendUpdate("setMovie", [movie, self.avId]) - - def setCannonPosition(self, zRot, angle): - self.sendUpdate("updateCannonPosition", [self.avId, zRot, angle]) - - def setCannonLit(self, zRot, angle): - avId = self.air.getAvatarIdFromSender() - if avId != self.avId: - return - - fireTime = CannonGameGlobals.FUSE_TIME - self.sendUpdate('setCannonWillFire', [avId, fireTime, zRot, angle, globalClockDelta.getRealNetworkTime()]) - - def setFired(self): - pass - - def setLanded(self): - self.__doExit(CannonGlobals.CANNON_MOVIE_CLEAR) - self.sendUpdate('setCannonExit', [self.avId]) - - def setCannonExit(self, todo0): - pass - - def requestBumperMove(self, x, y, z): - self.bumperPos = (x, y, z) - self.sendUpdate('setCannonBumperPos', self.getCannonBumperPos()) - - def getCannonBumperPos(self): - return self.bumperPos + def __doExit(self): + self.setMovie(CannonGlobals.CANNON_MOVIE_FORCE_EXIT, self.avId) diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index 500d0611..172504a1 100755 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -414,10 +414,7 @@ class CannonRental(Rental): target.generateWithRequired(self.estate.zoneId) for drop in CannonGlobals.cannonDrops: - cannon = DistributedCannonAI(self.estate.air) - cannon.setEstateId(self.estate.doId) - cannon.setTargetId(target.doId) - cannon.setPosHpr(*drop) + cannon = DistributedCannonAI(self.estate.air, self.estate.zoneId, target.doId, *drop) cannon.generateWithRequired(self.estate.zoneId) self.objects.add(cannon) From 881a8007dfb19824bfa339e9ba98dbf417b06440 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Thu, 23 Jul 2015 15:54:46 -0400 Subject: [PATCH 083/161] Loyalty items cum back. ;(. & add ctime so mongo doesn't complain. --- dependencies/astron/dclass/stride.dc | 8 +- toontown/ai/ToontownAIRepository.py | 3 + toontown/catalog/AccountDate.py | 39 ++++ toontown/catalog/AccountDateAI.py | 23 ++ toontown/catalog/CatalogAccessoryItem.py | 17 +- .../catalog/CatalogAccessoryItemGlobals.py | 1 + toontown/catalog/CatalogClothingItem.py | 37 ++- toontown/catalog/CatalogEmoteItem.py | 20 +- toontown/catalog/CatalogGenerator.py | 211 ++++++++++++------ toontown/catalog/CatalogItem.py | 20 +- toontown/catalog/CatalogItemPanel.py | 3 + toontown/catalog/CatalogRentalItem.py | 9 +- toontown/catalog/CatalogScreen.py | 160 ++++++------- toontown/estate/DistributedPhoneAI.py | 2 +- toontown/toon/LocalToon.py | 3 + toontown/toonbase/TTLocalizerEnglish.py | 3 +- toontown/uberdog/ClientServicesManagerUD.py | 2 +- 17 files changed, 379 insertions(+), 182 deletions(-) create mode 100644 toontown/catalog/AccountDate.py create mode 100644 toontown/catalog/AccountDateAI.py diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index ddf3b618..d825cb06 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -27,7 +27,7 @@ dclass Account { uint32 ACCOUNT_AV_SET[] required db; uint32 ESTATE_ID db; AvatarPendingDel ACCOUNT_AV_SET_DEL[] db; - uint64 CREATED db; + string CREATED db; string LAST_LOGIN db; string ACCOUNT_ID db; uint16 ACCESS_LEVEL db; @@ -234,6 +234,7 @@ from toontown.shtiker import NewbiePurchaseManager/AI from toontown.safezone import SafeZoneManager/AI from toontown.tutorial import TutorialManager/AI from toontown.catalog import CatalogManager/AI +from toontown.catalog import AccountDate/AI from toontown.safezone import DistributedTreasure/AI from toontown.coghq import DistributedCashbotBossTreasure/AI from toontown.building import DistributedTrophyMgr/AI @@ -1519,6 +1520,11 @@ dclass CatalogManager : DistributedObject { startCatalog() airecv clsend; }; +dclass AccountDate : DistributedObject { + requestDate() airecv clsend; + requestDateResult(string); +}; + dclass DistributedTreasure : DistributedObject { setTreasureType(uint16) required broadcast ram; setPosition(int16/10, int16/10, int16/10) required broadcast ram; diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index 39a4b4c3..2c43d1bc 100755 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -18,6 +18,7 @@ from toontown.ai.DistributedReportMgrAI import DistributedReportMgrAI from toontown.building.DistributedBuildingQueryMgrAI import DistributedBuildingQueryMgrAI from toontown.building.DistributedTrophyMgrAI import DistributedTrophyMgrAI from toontown.catalog.CatalogManagerAI import CatalogManagerAI +from toontown.catalog.AccountDateAI import AccountDateAI from toontown.coghq import CountryClubManagerAI from toontown.coghq import FactoryManagerAI from toontown.coghq import LawOfficeManagerAI @@ -118,6 +119,8 @@ class ToontownAIRepository(ToontownInternalRepository): self.cogPageManager = CogPageManagerAI.CogPageManagerAI() self.codeRedemptionMgr = TTCodeRedemptionMgrAI(self) self.codeRedemptionMgr.generateWithRequired(2) + self.accountDateMgr = AccountDateAI(self) + self.accountDateMgr.generateWithRequired(2) self.buildingQueryMgr = DistributedBuildingQueryMgrAI(self) self.buildingQueryMgr.generateWithRequired(2) self.groupManager.generateWithRequired(2) diff --git a/toontown/catalog/AccountDate.py b/toontown/catalog/AccountDate.py new file mode 100644 index 00000000..610227e1 --- /dev/null +++ b/toontown/catalog/AccountDate.py @@ -0,0 +1,39 @@ +from direct.distributed.DistributedObject import DistributedObject +from direct.directnotify.DirectNotifyGlobal import directNotify +from datetime import datetime + +class AccountDate(DistributedObject): + neverDisable = 1 + notify = directNotify.newCategory('AccountDate') + + def __init__(self, cr): + DistributedObject.__init__(self, cr) + self.accountDays = 0 + + def announceGenerate(self): + DistributedObject.announceGenerate(self) + base.cr.accountDateMgr = self + taskMgr.doMethodLater(10, self.requestDate, 'request-task') + + def delete(self): + if hasattr(base.cr, 'accountDateMgr'): + if base.cr.accountDateMgr is self: + del base.cr.accountDateMgr + DistributedObject.delete(self) + + def getAccountDays(self): + return self.accountDays + + def requestDate(self, task=None): + self.sendUpdate('requestDate') + + if task is not None: + return task.done + + def requestDateResult(self, result): + if result is None: + notify.warning('Invalid response from server.') + self.accountDays = 0 + else: + date = datetime.strptime(result, "%a %b %d %H:%M:%S %Y") + self.accountDays = (datetime.now() - date).days \ No newline at end of file diff --git a/toontown/catalog/AccountDateAI.py b/toontown/catalog/AccountDateAI.py new file mode 100644 index 00000000..654048ea --- /dev/null +++ b/toontown/catalog/AccountDateAI.py @@ -0,0 +1,23 @@ +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.DistributedObjectAI import DistributedObjectAI + +class AccountDateAI(DistributedObjectAI): + notify = DirectNotifyGlobal.directNotify.newCategory("AccountDateAI") + + def announceGenerate(self): + DistributedObjectAI.announceGenerate(self) + + def requestDate(self): + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + + if not av: + return + + def callback(dclass, fields): + if dclass is not None and dclass == self.air.dclassesByName['AccountAI'] and fields.has_key('CREATED'): + self.sendUpdateToAvatarId(avId, 'requestDateResult', [fields.get('CREATED')]) + else: + self.sendUpdateToAvatarId(avId, 'requestDateResult', [None]) + + self.air.dbInterface.queryObject(self.air.dbId, av.DISLid, callback) \ No newline at end of file diff --git a/toontown/catalog/CatalogAccessoryItem.py b/toontown/catalog/CatalogAccessoryItem.py index e71d6544..0b93190f 100755 --- a/toontown/catalog/CatalogAccessoryItem.py +++ b/toontown/catalog/CatalogAccessoryItem.py @@ -10,9 +10,9 @@ from panda3d.core import * class CatalogAccessoryItem(CatalogItem.CatalogItem): - def makeNewItem(self, accessoryType, isSpecial = False): + def makeNewItem(self, accessoryType, loyaltyDays = 0): self.accessoryType = accessoryType - self.isSpecial = isSpecial + self.loyaltyDays = loyaltyDays CatalogItem.CatalogItem.makeNewItem(self) def getPurchaseLimit(self): @@ -328,7 +328,7 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): def decodeDatagram(self, di, versionNumber, store): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) self.accessoryType = di.getUint16() - self.isSpecial = di.getBool() + self.loyaltyDays = di.getUint16() str = AccessoryTypes[self.accessoryType][ATString] if self.isHat(): defn = ToonDNA.HatStyles[str] @@ -343,10 +343,17 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): def encodeDatagram(self, dg, store): CatalogItem.CatalogItem.encodeDatagram(self, dg, store) dg.addUint16(self.accessoryType) - dg.addBool(self.isSpecial) + dg.addUint16(self.loyaltyDays) def isGift(self): - return not self.getEmblemPrices() + if self.getEmblemPrices(): + return 0 + if self.loyaltyRequirement() > 0: + return 0 + elif self.accessoryType in LoyaltyAccessoryItems: + return 0 + else: + return 1 def getAllAccessories(*accessoryTypes): list = [] diff --git a/toontown/catalog/CatalogAccessoryItemGlobals.py b/toontown/catalog/CatalogAccessoryItemGlobals.py index f72765a5..2ac705e2 100755 --- a/toontown/catalog/CatalogAccessoryItemGlobals.py +++ b/toontown/catalog/CatalogAccessoryItemGlobals.py @@ -735,3 +735,4 @@ AccessoryTypes = {101: (AHat, 'shw2', APriceCool, 7)} +LoyaltyAccessoryItems = [] diff --git a/toontown/catalog/CatalogClothingItem.py b/toontown/catalog/CatalogClothingItem.py index c13d5362..a4b36bfd 100755 --- a/toontown/catalog/CatalogClothingItem.py +++ b/toontown/catalog/CatalogClothingItem.py @@ -17,7 +17,8 @@ ABoysShorts = 3 AGirlsShorts = 4 AGirlsSkirt = 5 AShorts = 6 -ClothingTypes = {101: (ABoysShirt, 'bss1', 40), +ClothingTypes = { + 101: (ABoysShirt, 'bss1', 40), 102: (ABoysShirt, 'bss2', 40), 103: (ABoysShirt, 'bss3', 40), 105: (ABoysShirt, 'bss4', 40), @@ -290,15 +291,23 @@ ClothingTypes = {101: (ABoysShirt, 'bss1', 40), 1817: (AGirlsSkirt, 'sa_gs19', 5000), 1818: (AGirlsSkirt, 'sa_gs20', 5000), 1819: (AGirlsSkirt, 'sa_gs21', 5000), - 1820: (AShirt, 'sa_ss55', 5000), - 1821: (AShirt, 'weed', 5000)} + 1820: (AShirt, 'sa_ss55', 5000)} +LoyaltyClothingItems = (1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608) class CatalogClothingItem(CatalogItem.CatalogItem): - def makeNewItem(self, clothingType, colorIndex, isSpecial = False): + def makeNewItem(self, clothingType, colorIndex, loyaltyDays = 0): self.clothingType = clothingType self.colorIndex = colorIndex - self.isSpecial = isSpecial + self.loyaltyDays = loyaltyDays CatalogItem.CatalogItem.makeNewItem(self) def storedInCloset(self): @@ -338,6 +347,8 @@ class CatalogClothingItem(CatalogItem.CatalogItem): return 1 if avatar.mailboxContents.count(self) != 0: return 1 + if self in avatar.awardMailboxContents or self in avatar.onAwardOrder: + return 1 str = ClothingTypes[self.clothingType][CTString] dna = avatar.getStyle() if self.isShirt(): @@ -417,7 +428,7 @@ class CatalogClothingItem(CatalogItem.CatalogItem): return ToontownGlobals.P_ItemAvailable def getDeliveryTime(self): - return 1 + return 60 def getPicture(self, avatar): from toontown.toon import Toon @@ -554,7 +565,7 @@ class CatalogClothingItem(CatalogItem.CatalogItem): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) self.clothingType = di.getUint16() self.colorIndex = di.getUint8() - self.isSpecial = di.getBool() + self.loyaltyDays = di.getUint16() str = ClothingTypes[self.clothingType][CTString] if self.isShirt(): color = ToonDNA.ShirtStyles[str][2][self.colorIndex] @@ -565,10 +576,18 @@ class CatalogClothingItem(CatalogItem.CatalogItem): CatalogItem.CatalogItem.encodeDatagram(self, dg, store) dg.addUint16(self.clothingType) dg.addUint8(self.colorIndex) - dg.addBool(self.isSpecial) + dg.addUint16(self.loyaltyDays) def isGift(self): - return not self.getEmblemPrices() + if self.getEmblemPrices(): + return 0 + if self.loyaltyRequirement() > 0: + return 0 + elif self.clothingType in LoyaltyClothingItems: + return 0 + else: + return 1 + def getAllClothes(*clothingTypes): list = [] diff --git a/toontown/catalog/CatalogEmoteItem.py b/toontown/catalog/CatalogEmoteItem.py index 2849a58c..168240b2 100755 --- a/toontown/catalog/CatalogEmoteItem.py +++ b/toontown/catalog/CatalogEmoteItem.py @@ -3,21 +3,22 @@ from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer from otp.otpbase import OTPLocalizer from direct.interval.IntervalGlobal import * +LoyaltyEmoteItems = (20, 21, 22, 23, 24, 25, 26) class CatalogEmoteItem(CatalogItem.CatalogItem): sequenceNumber = 0 pictureToon = None - def makeNewItem(self, emoteIndex, isSpecial = False): + def makeNewItem(self, emoteIndex, loyaltyDays = 0): self.emoteIndex = emoteIndex - self.isSpecial = isSpecial + self.loyaltyDays = loyaltyDays CatalogItem.CatalogItem.makeNewItem(self) def getPurchaseLimit(self): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder: + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: return 1 if self.emoteIndex >= len(avatar.emoteAccess): return 0 @@ -114,14 +115,21 @@ class CatalogEmoteItem(CatalogItem.CatalogItem): def decodeDatagram(self, di, versionNumber, store): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) self.emoteIndex = di.getUint8() - self.isSpecial = di.getBool() + self.loyaltyDays = di.getUint16() if self.emoteIndex > len(OTPLocalizer.EmoteList): raise ValueError def encodeDatagram(self, dg, store): CatalogItem.CatalogItem.encodeDatagram(self, dg, store) dg.addUint8(self.emoteIndex) - dg.addBool(self.isSpecial) + dg.addUint16(self.loyaltyDays) def isGift(self): - return not self.getEmblemPrices() + if self.getEmblemPrices(): + return 0 + if self.loyaltyRequirement() > 0: + return 0 + elif self.emoteIndex in LoyaltyEmoteItems: + return 0 + else: + return 1 diff --git a/toontown/catalog/CatalogGenerator.py b/toontown/catalog/CatalogGenerator.py index 40752063..3d04a55e 100755 --- a/toontown/catalog/CatalogGenerator.py +++ b/toontown/catalog/CatalogGenerator.py @@ -12,8 +12,8 @@ from CatalogMouldingItem import CatalogMouldingItem, getAllMouldings from CatalogWainscotingItem import CatalogWainscotingItem, getAllWainscotings from CatalogWindowItem import CatalogWindowItem from CatalogPoleItem import nextAvailablePole, getAllPoles -from CatalogTankItem import nextAvailableTank, getAllTanks from CatalogPetTrickItem import CatalogPetTrickItem, getAllPetTricks +from CatalogTankItem import nextAvailableTank, getAllTanks from CatalogGardenItem import CatalogGardenItem from CatalogToonStatueItem import CatalogToonStatueItem from CatalogRentalItem import CatalogRentalItem @@ -26,7 +26,7 @@ from toontown.toonbase import ToontownGlobals import types import random import time -from panda3d.core import * +from pandac.PandaModules import * MetaItems = {100: getAllClothes(101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 111, 115, 201, 202, 203, 204, 205, 206, 207, 208, 209, 209, 211, 215), 300: getAllClothes(301, 302, 303, 304, 305, 308, 401, 403, 404, 405, 407, 451, 452, 453), 2000: getChatRange(0, 1999), @@ -41,25 +41,20 @@ MetaItems = {100: getAllClothes(101, 102, 103, 104, 105, 106, 107, 108, 109, 109 2921: getChatRange(12050, 12099), 2930: getChatRange(13000, 13099), 2940: getChatRange(14000, 14099), - 3000: getWallpapers(1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100), 3010: getWallpapers(2200, 2300, 2400, 2500, 2600, 2700, 2800), 3020: getWallpapers(2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600), 3030: getWallpapers(3700, 3800, 3900), - 3500: getAllWainscotings(1000, 1010), 3510: getAllWainscotings(1020), 3520: getAllWainscotings(1030), 3530: getAllWainscotings(1040), - 4000: getFloorings(1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090, 1100), 4010: getFloorings(1110, 1120, 1130), 4020: getFloorings(1140, 1150, 1160, 1170, 1180, 1190), - 4500: getAllMouldings(1000, 1010), 4510: getAllMouldings(1020, 1030, 1040), 4520: getAllMouldings(1070), - 5000: getAllPetTricks()} MetaItemChatKeysSold = (2000, 2010, @@ -401,7 +396,29 @@ MonthlySchedule = ((7, 15, 8, 15, + 2010, + 2010, ((4, 2940),)), + (9, + 1, + 9, + 30, + (CatalogGardenItem(135, 1),)), + (1, + 1, + 1, + 31, + (CatalogGardenItem(135, 1),)), + (4, + 1, + 4, + 30, + (CatalogGardenItem(135, 1),)), + (6, + 1, + 6, + 30, + (CatalogGardenItem(135, 1),)), (6, 26, 7, @@ -460,16 +477,22 @@ MonthlySchedule = ((7, 9, 7, 15, + 2010, + 2010, (CatalogClothingItem(1751, 0),)), (6, 14, 7, 15, + 2010, + 2010, (CatalogClothingItem(1754, 0), CatalogClothingItem(1755, 0), CatalogClothingItem(1756, 0))), (7, 21, 8, 17, + 2010, + 2010, (CatalogClothingItem(1749, 0), CatalogClothingItem(1750, 0), CatalogClothingItem(1757, 0), @@ -478,6 +501,8 @@ MonthlySchedule = ((7, 25, 9, 21, + 2010, + 2010, (CatalogClothingItem(1763, 0),)), (6, 5, @@ -488,43 +513,48 @@ MonthlySchedule = ((7, 1, 12, 31, - ( - CatalogGardenItem(100, 1), + (CatalogGardenItem(100, 1), CatalogGardenItem(101, 1), CatalogGardenItem(103, 1), CatalogGardenItem(104, 1), CatalogToonStatueItem(105, endPoseIndex=108), CatalogRentalItem(1, 2880, 1000), - CatalogRentalItem(2, 2890, 1000), CatalogGardenStarterItem(), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), - CatalogFurnitureItem(1532), - CatalogClothingItem(1605, 0, True), - CatalogClothingItem(1602, 0, True), - CatalogClothingItem(1604, 0, True), - CatalogClothingItem(1601, 0, True), - CatalogClothingItem(1603, 0, True), - CatalogClothingItem(1600, 0, True), - CatalogEmoteItem(20, True), - CatalogEmoteItem(21, True), - CatalogEmoteItem(22, True), - CatalogEmoteItem(23, True), - CatalogEmoteItem(24, True), - CatalogEmoteItem(25, True), - CatalogEmoteItem(26, True), - CatalogNametagItem(15, True), - CatalogNametagItem(16, True), - CatalogNametagItem(17, True))), + CatalogFurnitureItem(1532), + CatalogNametagItem(15), + CatalogNametagItem(16), + CatalogNametagItem(17), + CatalogClothingItem(1608, 0, 720), + CatalogClothingItem(1605, 0, 720), + CatalogClothingItem(1602, 0, 720), + CatalogClothingItem(1607, 0, 540), + CatalogClothingItem(1604, 0, 540), + CatalogClothingItem(1601, 0, 540), + CatalogClothingItem(1606, 0, 360), + CatalogClothingItem(1603, 0, 360), + CatalogClothingItem(1600, 0, 360), + CatalogEmoteItem(25, 30), + CatalogEmoteItem(26, 60), + CatalogEmoteItem(20, 90), + CatalogEmoteItem(21, 180), + CatalogEmoteItem(22, 360), + CatalogEmoteItem(23, 540), + CatalogEmoteItem(24, 720))), (5, 26, 6, 30, + 2013, + 2013, (CatalogAccessoryItem(175),)), (8, 27, 9, 5, + 2013, + 2013, ((3, 2900), CatalogChatItem(10003), CatalogClothingItem(1001, 0), @@ -574,6 +604,8 @@ MonthlySchedule = ((7, 3, 9, 12, + 2013, + 2013, ((3, 2910), CatalogFurnitureItem(680), CatalogFurnitureItem(681), @@ -608,6 +640,8 @@ MonthlySchedule = ((7, 20, 9, 19, + 2013, + 2013, (CatalogAccessoryItem(101), CatalogAccessoryItem(103), CatalogAccessoryItem(117), @@ -830,9 +864,7 @@ WeeklySchedule = ((100, CatalogFurnitureItem(1000), CatalogClothingItem(117, 0), CatalogClothingItem(217, 0), - nextAvailableCloset, - nextAvailableBank, - nextAvailableTank), + nextAvailableCloset), (100, (5, 2000), CatalogFurnitureItem(1430), @@ -1353,7 +1385,7 @@ WeeklySchedule = ((100, Sale(CatalogClothingItem(116, 0), CatalogClothingItem(216, 0), CatalogClothingItem(408, 0), CatalogClothingItem(117, 0), CatalogClothingItem(217, 0), CatalogClothingItem(409, 0), CatalogClothingItem(118, 0), CatalogClothingItem(218, 0), CatalogClothingItem(410, 0), CatalogClothingItem(119, 0), CatalogClothingItem(219, 0), CatalogClothingItem(120, 0), CatalogClothingItem(220, 0), CatalogClothingItem(121, 0), CatalogClothingItem(221, 0), CatalogClothingItem(222, 0), CatalogClothingItem(123, 0), CatalogClothingItem(224, 0), CatalogClothingItem(411, 0), CatalogClothingItem(311, 0), CatalogClothingItem(310, 0)), Sale(CatalogWindowItem(40), CatalogWindowItem(70), CatalogWindowItem(50), CatalogWindowItem(60), CatalogWindowItem(80), CatalogWindowItem(100), CatalogWindowItem(90), CatalogWindowItem(110)), Sale(CatalogEmoteItem(5), CatalogEmoteItem(9), CatalogEmoteItem(13), CatalogEmoteItem(11), CatalogEmoteItem(6), CatalogEmoteItem(8), CatalogNametagItem(10)), - Sale(CatalogFurnitureItem(600), CatalogFurnitureItem(610), CatalogFurnitureItem(620), CatalogFurnitureItem(630), CatalogFurnitureItem(640), CatalogFurnitureItem(650), CatalogFurnitureItem(660), CatalogFurnitureItem(900), CatalogFurnitureItem(910), CatalogFurnitureItem(920), CatalogFurnitureItem(930), CatalogFurnitureItem(940), CatalogFurnitureItem(1000), CatalogFurnitureItem(1010), CatalogFurnitureItem(1020), CatalogFurnitureItem(1030), CatalogFurnitureItem(1400), CatalogFurnitureItem(1410), CatalogFurnitureItem(1420), CatalogFurnitureItem(1430), CatalogFurnitureItem(1440), CatalogFurnitureItem(1441), CatalogFurnitureItem(1442), CatalogFurnitureItem(1443), CatalogFurnitureItem(1500), CatalogFurnitureItem(1510), CatalogFurnitureItem(1520), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), CatalogFurnitureItem(1600), CatalogFurnitureItem(1610), CatalogFurnitureItem(1620), CatalogFurnitureItem(1630), CatalogFurnitureItem(1640), CatalogFurnitureItem(1650), CatalogFurnitureItem(1660), CatalogFurnitureItem(1661), CatalogFurnitureItem(1710), CatalogFurnitureItem(1800), CatalogFurnitureItem(1810), CatalogFurnitureItem(1900), CatalogFurnitureItem(1910)), + Sale(CatalogFurnitureItem(600), CatalogFurnitureItem(610), CatalogFurnitureItem(620), CatalogFurnitureItem(630), CatalogFurnitureItem(640), CatalogFurnitureItem(650), CatalogFurnitureItem(660), CatalogFurnitureItem(900), CatalogFurnitureItem(910), CatalogFurnitureItem(920), CatalogFurnitureItem(930), CatalogFurnitureItem(940), CatalogFurnitureItem(1000), CatalogFurnitureItem(1010), CatalogFurnitureItem(1020), CatalogFurnitureItem(1030), CatalogFurnitureItem(1400), CatalogFurnitureItem(1410), CatalogFurnitureItem(1420), CatalogFurnitureItem(1430), CatalogFurnitureItem(1440), CatalogFurnitureItem(1441), CatalogFurnitureItem(1442), CatalogFurnitureItem(1443), CatalogFurnitureItem(1500), CatalogFurnitureItem(1510), CatalogFurnitureItem(1520), CatalogFurnitureItem(1530), CatalogFurnitureItem(1600), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), CatalogFurnitureItem(1610), CatalogFurnitureItem(1620), CatalogFurnitureItem(1630), CatalogFurnitureItem(1640), CatalogFurnitureItem(1650), CatalogFurnitureItem(1660), CatalogFurnitureItem(1661), CatalogFurnitureItem(1710), CatalogFurnitureItem(1800), CatalogFurnitureItem(1810), CatalogFurnitureItem(1900), CatalogFurnitureItem(1910)), (300, (1, 2020), (2, 2030), @@ -1480,9 +1512,12 @@ class CatalogGenerator: def __init__(self): self.__itemLists = {} + self.__releasedItemLists = {} - if config.GetBool('save-catalog-schedule', False): - self.outputSchedule('catalog-schedule.txt') + def getReleasedCatalogList(self, weekStart): + dayNumber = int(weekStart / (24 * 60)) + itemLists = self.__getReleasedItemLists(dayNumber, weekStart) + return itemLists def generateMonthlyCatalog(self, avatar, weekStart): dayNumber = int(weekStart / (24 * 60)) @@ -1512,13 +1547,12 @@ class CatalogGenerator: if nextAvailableCloset not in schedule: weeklyCatalog += self.__selectItem(avatar, nextAvailableCloset, monthlyCatalog, saleItem=0) - + if nextAvailableBank not in schedule: - weeklyCatalog += self.__selectItem(avatar, nextAvailableBank, monthlyCatalog, saleItem=0) - + weeklyCatalog += self.__selectItem(avatar, nextAvailableBank, monthlyCatalog, saleItem = 0) if nextAvailableTank not in schedule: - weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem=0) - if True: + weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem = 0) + if time.time() < 1096617600.0: def hasPetTrick(catalog): for item in catalog: @@ -1528,6 +1562,7 @@ class CatalogGenerator: return 0 if not hasPetTrick(weeklyCatalog) and not hasPetTrick(avatar.weeklyCatalog) and not hasPetTrick(avatar.backCatalog): + self.notify.debug('Artificially adding pet trick to catalog') weeklyCatalog += self.__selectItem(avatar, 5000, monthlyCatalog, saleItem=saleItem) self.notify.debug('Generated catalog: %s' % weeklyCatalog) return weeklyCatalog @@ -1557,12 +1592,45 @@ class CatalogGenerator: return backCatalog + def __getReleasedItemLists(self, dayNumber, weekStart): + itemLists = self.__releasedItemLists.get(dayNumber) + if itemLists != None: + return itemLists + else: + self.__releasedItemLists.clear() + testDaysAhead = simbase.config.GetInt('test-server-holiday-days-ahead', 0) + nowtuple = time.localtime(weekStart * 60 + testDaysAhead * 24 * 60 * 60) + year = nowtuple[0] + month = nowtuple[1] + day = nowtuple[2] + itemLists = [] + for monthlyItems in MonthlySchedule: + startMM = monthlyItems[0] + startDD = monthlyItems[1] + endMM = monthlyItems[2] + endDD = monthlyItems[3] + if len(monthlyItems) == 7: + startYYYY = monthlyItems[4] + endYYYY = monthlyItems[5] + list = monthlyItems[6] + else: + startYYYY = 1969 + endYYYY = year + list = monthlyItems[4] + pastStart = year > startYYYY or (year == startYYYY and (month > startMM or (month == startMM and day >= startDD))) + if pastStart: + itemLists.append(list) + + self.__releasedItemLists[dayNumber] = itemLists + return itemLists + def __getMonthlyItemLists(self, dayNumber, weekStart): itemLists = self.__itemLists.get(dayNumber) if itemLists != None: return itemLists - testDaysAhead = config.GetInt('test-server-holiday-days-ahead', 0) + testDaysAhead = simbase.config.GetInt('test-server-holiday-days-ahead', 0) nowtuple = time.localtime(weekStart * 60 + testDaysAhead * 24 * 60 * 60) + year = nowtuple[0] month = nowtuple[1] day = nowtuple[2] self.notify.debug('Generating seasonal itemLists for %s/%s.' % (month, day)) @@ -1572,9 +1640,16 @@ class CatalogGenerator: startDD = monthlyItems[1] endMM = monthlyItems[2] endDD = monthlyItems[3] - list = monthlyItems[4] - pastStart = month > startMM or (month == startMM and day >= startDD) - beforeEnd = month < endMM or (month == endMM and day <= endDD) + if len(monthlyItems) == 7: + startYYYY = monthlyItems[4] + endYYYY = monthlyItems[5] + list = monthlyItems[6] + else: + startYYYY = 1969 + endYYYY = year + list = monthlyItems[4] + pastStart = year >= startYYYY and (month > startMM or (month == startMM and day >= startDD)) + beforeEnd = year <= endYYYY and (month < endMM or (month == endMM and day <= endDD)) if endMM < startMM: if pastStart or beforeEnd: itemLists.append(list) @@ -1705,33 +1780,31 @@ class CatalogGenerator: def __recordSchedule(self, sched, weekCode, schedule): if isinstance(schedule, Sale): schedule = schedule.args - try: - for item in list(schedule): - if callable(item): - if item == nextAvailablePole: - item = getAllPoles() - elif item == nextAvailableCloset: - item = getAllClosets() - elif item == nextAvailableBank: - item = getAllBanks() - elif item == nextAvailableTank: - item = getAllTanks() - elif item == get50ItemCloset: - item = getMaxClosets() - else: - self.notify.warning("Don't know how to interpret function " % repr(name)) - item = None - elif isinstance(item, types.TupleType): - item = item[1] - if isinstance(item, types.IntType): - item = MetaItems[item] - if isinstance(item, CatalogItem.CatalogItem): - self.__recordScheduleItem(sched, weekCode, None, item) - elif item != None: - for i in item: - self.__recordScheduleItem(sched, None, weekCode, i) - except: - print 'Wrong: %s' % schedule + for item in schedule: + if callable(item): + if item == nextAvailablePole: + item = getAllPoles() + elif item == nextAvailableCloset: + item = getAllClosets() + elif item == nextAvailableBank: + item = getAllBanks() + elif item == nextAvailableTank: + item == getAllTanks() + elif item == get50ItemCloset: + item = getMaxClosets() + else: + self.notify.warning("Don't know how to interpret function " % repr(name)) + item = None + elif isinstance(item, types.TupleType): + item = item[1] + if isinstance(item, types.IntType): + item = MetaItems[item] + if isinstance(item, CatalogItem.CatalogItem): + self.__recordScheduleItem(sched, weekCode, None, item) + elif item != None: + for i in item: + self.__recordScheduleItem(sched, None, weekCode, i) + return def __recordScheduleItem(self, sched, weekCode, maybeWeekCode, item): diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index f4633050..fad5e86a 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -20,7 +20,7 @@ CatalogTypeUnspecified = 0 CatalogTypeWeekly = 1 CatalogTypeBackorder = 2 CatalogTypeMonthly = 3 -CatalogTypeSpecial = 4 +CatalogTypeLoyalty = 4 class CatalogItem: notify = DirectNotifyGlobal.directNotify.newCategory('CatalogItem') @@ -32,7 +32,6 @@ class CatalogItem: self.giftTag = None self.giftCode = 0 self.hasPicture = False - self.isSpecial = False self.volume = 0 self.specialEventId = 0 if len(args) >= 1 and isinstance(args[0], DatagramIterator): @@ -125,8 +124,14 @@ class CatalogItem: def forGirlsOnly(self): return 0 - def getIsSpecial(self): - return self.isSpecial + def setLoyaltyRequirement(self, days): + self.loyaltyDays = days + + def loyaltyRequirement(self): + if not hasattr(self, 'loyaltyDays'): + return 0 + else: + return self.loyaltyDays def getPrice(self, catalogType): if catalogType == CatalogTypeBackorder: @@ -375,6 +380,13 @@ class CatalogItem: def getRequestPurchaseErrorTextTimeout(self): return 6 + + def getDaysToGo(self, avatar): + accountDays = avatar.getAccountDays() + daysToGo = self.loyaltyRequirement() - accountDays + if daysToGo < 0: + daysToGo = 0 + return int(daysToGo) def encodeCatalogItem(dg, item, store): import CatalogItemTypes diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index 0513e36d..40abaad8 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -306,6 +306,9 @@ class CatalogItemPanel(DirectFrame): elif hasattr(self['item'], 'isSkillTooLow') and self['item'].isSkillTooLow(base.localAvatar): auxText = TTLocalizer.SkillTooLow self.buyButton['state'] = DGG.DISABLED + elif hasattr(self['item'], 'getDaysToGo') and self['item'].getDaysToGo(base.localAvatar): + auxText = TTLocalizer.DaysToGo % self['item'].getDaysToGo(base.localAvatar) + self.buyButton['state'] = DGG.DISABLED elif self['item'].getEmblemPrices() and not base.localAvatar.isEnoughMoneyAndEmblemsToBuy(self['item'].getPrice(self['type']), self['item'].getEmblemPrices()): self.buyButton['state'] = DGG.DISABLED elif hasattr(self['item'], 'houseId') and self['item'].houseId == localAvatar.houseType: diff --git a/toontown/catalog/CatalogRentalItem.py b/toontown/catalog/CatalogRentalItem.py index 40998d83..4230154a 100755 --- a/toontown/catalog/CatalogRentalItem.py +++ b/toontown/catalog/CatalogRentalItem.py @@ -24,7 +24,7 @@ class CatalogRentalItem(CatalogItem.CatalogItem): return 0 def reachedPurchaseLimit(self, avatar): - return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder + return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder #or self in avatar.awardMailboxContents or self in avatar.onAwardOrder def saveHistory(self): return 1 @@ -45,14 +45,15 @@ class CatalogRentalItem(CatalogItem.CatalogItem): return TTLocalizer.RentalTypeName def recordPurchase(self, avatar, optional): + self.notify.debug('rental -- record purchase') if avatar: - self.notify.debug('rental -- has avatar') + self.notify.debug('rental -- has avater') estate = simbase.air.estateManager._lookupEstate(avatar) if estate: self.notify.debug('rental -- has estate') estate.rentItem(self.typeIndex, self.duration) else: - self.notify.warning('rental -- something not there') + self.notify.debug('rental -- something not there') return ToontownGlobals.P_ItemAvailable def getPicture(self, avatar): @@ -125,7 +126,5 @@ def getAllRentalItems(): list = [] for rentalType in (ToontownGlobals.RentalCannon,): list.append(CatalogRentalItem(rentalType, 2880, 1000)) - for rentalType in (ToontownGlobals.RentalGameTable,): - list.append(CatalogRentalItem(rentalType, 2890, 1000)) return list diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index 0278f052..e5c0bb6c 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -101,8 +101,8 @@ class CatalogScreen(DirectFrame): def setNumBackPages(self, numBackPages): self.numBackPages = numBackPages - def setNumSpecialPages(self, numSpecialPages): - self.numSpecialPages = numSpecialPages + def setNumLoyaltyPages(self, numLoyaltyPages): + self.numLoyaltyPages = numLoyaltyPages def setNumEmblemPages(self, numEmblemPages): self.numEmblemPages = numEmblemPages @@ -116,49 +116,49 @@ class CatalogScreen(DirectFrame): def enableBackorderCatalogButton(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.DISABLED - self.specialCatalogButton['state'] = DGG.DISABLED + self.loyaltyCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.DISABLED def enableNewCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.NORMAL - self.specialCatalogButton['state'] = DGG.DISABLED + self.loyaltyCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.DISABLED - def enableSpecialCatalogButton(self): + def enableLoyaltyCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.DISABLED - self.specialCatalogButton['state'] = DGG.NORMAL + self.loyaltyCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.DISABLED def enableEmblemCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.DISABLED - self.specialCatalogButton['state'] = DGG.DISABLED + self.loyaltyCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.NORMAL def modeBackorderCatalog(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.NORMAL - self.specialCatalogButton['state'] = DGG.NORMAL + self.loyaltyCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.NORMAL def modeNewCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.DISABLED - self.specialCatalogButton['state'] = DGG.NORMAL + self.loyaltyCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.NORMAL - def modeSpecialCatalog(self): + def modeLoyaltyCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.NORMAL - self.specialCatalogButton['state'] = DGG.DISABLED + self.loyaltyCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.NORMAL def modeEmblemCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.NORMAL - self.specialCatalogButton['state'] = DGG.NORMAL + self.loyaltyCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.DISABLED def showNewItems(self, index = None): @@ -195,15 +195,15 @@ class CatalogScreen(DirectFrame): self.showPageItems() return - def showSpecialItems(self, index = None): + def showLoyaltyItems(self, index = None): if config.GetBool('want-qa-regression', 0): - self.notify.info('QA-REGRESSION: CATALOG: Special item') + self.notify.info('QA-REGRESSION: CATALOG: Loyalty item') taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') - self.viewing = 'Special' - self.modeSpecialCatalog() - self.setMaxPageIndex(self.numSpecialPages) - if self.numSpecialPages == 0: + self.viewing = 'Loyalty' + self.modeLoyaltyCatalog() + self.setMaxPageIndex(self.numLoyaltyPages) + if self.numLoyaltyPages == 0: self.setPageIndex(-1) elif index is not None: self.setPageIndex(index) @@ -238,11 +238,11 @@ class CatalogScreen(DirectFrame): self.viewing == 'New' if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numBackPages > 0: self.showBackorderItems() - if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numSpecialPages > 0: - self.showSpecialItems() - elif self.viewing == 'Backorder' and self.pageIndex > self.maxPageIndex and self.numSpecialPages > 0: - self.showSpecialItems() - elif self.viewing == 'Special' and self.pageIndex > self.maxPageIndex and self.numEmblemPages > 0: + if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numLoyaltyPages > 0: + self.showLoyaltyItems() + elif self.viewing == 'Backorder' and self.pageIndex > self.maxPageIndex and self.numLoyaltyPages > 0: + self.showLoyaltyItems() + elif self.viewing == 'Loyalty' and self.pageIndex > self.maxPageIndex and self.numEmblemPages > 0: self.showEmblemItems() else: self.pageIndex = min(self.pageIndex, self.maxPageIndex) @@ -255,10 +255,10 @@ class CatalogScreen(DirectFrame): self.pageIndex = self.pageIndex - 1 if self.viewing == 'Backorder' and self.pageIndex < 0 and self.numNewPages > 0: self.showNewItems(self.numNewPages - 1) - elif self.viewing == 'Special' and self.pageIndex < 0 and self.numBackPages > 0: + elif self.viewing == 'Loyalty' and self.pageIndex < 0 and self.numBackPages > 0: self.showBackorderItems(self.numBackPages - 1) - elif self.viewing == 'Emblem' and self.pageIndex < 0 and self.numSpecialPages > 0: - self.showSpecialItems(self.numSpecialPages - 1) + elif self.viewing == 'Emblem' and self.pageIndex < 0 and self.numLoyaltyPages > 0: + self.showLoyaltyItems(self.numLoyaltyPages - 1) else: self.pageIndex = max(self.pageIndex, -1) self.showPageItems() @@ -274,16 +274,16 @@ class CatalogScreen(DirectFrame): self.openCover() if self.viewing == 'New': page = self.pageList[self.pageIndex] - newOrBackOrSpecial = 0 + newOrBackOrLoyalty = 0 elif self.viewing == 'Backorder': page = self.backPageList[self.pageIndex] - newOrBackOrSpecial = 1 - elif self.viewing == 'Special': - page = self.specialPageList[self.pageIndex] - newOrBackOrSpecial = 2 + newOrBackOrLoyalty = 1 + elif self.viewing == 'Loyalty': + page = self.loyaltyPageList[self.pageIndex] + newOrBackOrLoyalty = 2 elif self.viewing == 'Emblem': page = self.emblemPageList[self.pageIndex] - newOrBackOrSpecial = 3 + newOrBackOrLoyalty = 3 page.show() for panel in self.panelDict[page.get_key()]: panel.load() @@ -293,7 +293,7 @@ class CatalogScreen(DirectFrame): pIndex = 0 randGen = random.Random() - randGen.seed(base.localAvatar.catalogScheduleCurrentWeek + (self.pageIndex << 8) + (newOrBackOrSpecial << 16)) + randGen.seed(base.localAvatar.catalogScheduleCurrentWeek + (self.pageIndex << 8) + (newOrBackOrLoyalty << 16)) for i in xrange(NUM_CATALOG_ROWS): for j in xrange(NUM_CATALOG_COLS): if pIndex < len(self.visiblePanels): @@ -308,8 +308,8 @@ class CatalogScreen(DirectFrame): if self.viewing == 'New': text = TTLocalizer.CatalogNew - elif self.viewing == 'Special': - text = TTLocalizer.CatalogSpecial + elif self.viewing == 'Loyalty': + text = TTLocalizer.CatalogLoyalty elif self.viewing == 'Backorder': text = TTLocalizer.CatalogBackorder elif self.viewing == 'Emblem': @@ -317,13 +317,13 @@ class CatalogScreen(DirectFrame): self.pageLabel['text'] = text + ' - %d' % (self.pageIndex + 1) if self.pageIndex < self.maxPageIndex: self.nextPageButton.show() - elif self.viewing == 'New' and self.numBackPages == 0 and self.numSpecialPages == 0: + elif self.viewing == 'New' and self.numBackPages == 0 and self.numLoyaltyPages == 0: self.nextPageButton.hide() - elif self.viewing == 'Backorder' and self.numSpecialPages == 0: + elif self.viewing == 'Backorder' and self.numLoyaltyPages == 0: self.nextPageButton.hide() - elif self.viewing == 'Special' and self.numEmblemPages == 0: + elif self.viewing == 'Loyalty' and self.numEmblemPages == 0: self.nextPageButton.hide() - elif self.viewing == 'Special' and self.numEmblemPages > 0: + elif self.viewing == 'Loyalty' and self.numEmblemPages > 0: self.nextPageButton.show() elif self.viewing == 'Emblem': self.nextPageButton.hide() @@ -358,7 +358,7 @@ class CatalogScreen(DirectFrame): for page in self.backPageList: page.hide() - for page in self.specialPageList: + for page in self.loyaltyPageList: page.hide() for page in self.emblemPageList: @@ -389,26 +389,26 @@ class CatalogScreen(DirectFrame): self.newCatalogButton2.show() if self.numBackPages > 0: self.backCatalogButton2.show() - if self.numSpecialPages > 0: - self.specialCatalogButton2.show() + if self.numLoyaltyPages > 0: + self.loyaltyCatalogButton2.show() if self.numEmblemPages > 0: self.emblemCatalogButton2.show() self.newCatalogButton.hide() self.backCatalogButton.hide() - self.specialCatalogButton.hide() + self.loyaltyCatalogButton.hide() self.emblemCatalogButton.hide() def hideDummyTabs(self): self.newCatalogButton2.hide() self.backCatalogButton2.hide() - self.specialCatalogButton2.hide() + self.loyaltyCatalogButton2.hide() self.emblemCatalogButton2.hide() if self.numNewPages > 0: self.newCatalogButton.show() if self.numBackPages > 0: self.backCatalogButton.show() - if self.numSpecialPages > 0: - self.specialCatalogButton.show() + if self.numLoyaltyPages > 0: + self.loyaltyCatalogButton.show() if self.numEmblemPages > 0: self.emblemCatalogButton.show() @@ -442,14 +442,14 @@ class CatalogScreen(DirectFrame): self.maxPageIndex = 0 self.numNewPages = 0 self.numBackPages = 5 - self.numSpecialPages = 0 + self.numLoyaltyPages = 0 self.viewing = 'New' self.panelList = [] self.backPanelList = [] self.pageList = [] self.backPageList = [] - self.specialPanelList = [] - self.specialPageList = [] + self.loyaltyPanelList = [] + self.loyaltyPageList = [] self.emblemPanelList = [] self.emblemPageList = [] self.panelDict = {} @@ -505,19 +505,19 @@ class CatalogScreen(DirectFrame): -0.2, 0.4), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, lift), image=backDown, pressEffect=0, command=self.showBackorderItems, text=TTLocalizer.CatalogBackorder, text_font=ToontownGlobals.getSignFont(), text_pos=(0.25 - lift, 0.132), text_scale=TTLocalizer.CSbackCatalogButton, text_fg=(0.392, 0.549, 0.627, 1.0), text2_fg=(0.392, 0.349, 0.427, 1.0)) self.backCatalogButton2.hide() - self.specialCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, + self.loyaltyCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, 0.25, -0.85, -0.3), image=[newDown, newDown, newDown, - newUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), pressEffect=0, command=self.showSpecialItems, text=TTLocalizer.CatalogSpecial, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text3_pos=(1.0 - lift, 0.112), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) - self.specialCatalogButton.hide() - self.specialCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, + newUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), pressEffect=0, command=self.showLoyaltyItems, text=TTLocalizer.CatalogLoyalty, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text3_pos=(1.0 - lift, 0.112), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) + self.loyaltyCatalogButton.hide() + self.loyaltyCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, 0.25, -0.85, - -0.3), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), image=newDown, pressEffect=0, command=self.showSpecialItems, text=TTLocalizer.CatalogSpecial, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) - self.specialCatalogButton2.hide() + -0.3), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), image=newDown, pressEffect=0, command=self.showLoyaltyItems, text=TTLocalizer.CatalogLoyalty, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) + self.loyaltyCatalogButton2.hide() self.emblemCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 1.05), frameSize=(-0.2, 0.25, -2.0, @@ -564,8 +564,8 @@ class CatalogScreen(DirectFrame): self.newCatalogButton2.component('text%d' % i).setR(90) self.backCatalogButton.component('text%d' % i).setR(90) self.backCatalogButton2.component('text%d' % i).setR(90) - self.specialCatalogButton.component('text%d' % i).setR(90) - self.specialCatalogButton2.component('text%d' % i).setR(90) + self.loyaltyCatalogButton.component('text%d' % i).setR(90) + self.loyaltyCatalogButton2.component('text%d' % i).setR(90) self.emblemCatalogButton.component('text%d' % i).setR(90) self.emblemCatalogButton2.component('text%d' % i).setR(90) @@ -609,8 +609,8 @@ class CatalogScreen(DirectFrame): continue if isMaxBankOffered and item in allBankItems and item.furnitureType != CatalogFurnitureItem.MaxBankId: continue - if item.getIsSpecial(): - self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) + if item.loyaltyRequirement() != 0: + self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) elif item.getEmblemPrices(): self.emblemPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly, parentCatalogScreen=self)) else: @@ -627,8 +627,8 @@ class CatalogScreen(DirectFrame): continue if isMaxBankOffered and item in allBankItems and item.furnitureType != CatalogFurnitureItem.MaxBankId: continue - if item.getIsSpecial(): - self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) + if item.loyaltyRequirement() != 0: + self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) elif item.getEmblemPrices(): self.emblemPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder, parentCatalogScreen=self)) else: @@ -638,8 +638,8 @@ class CatalogScreen(DirectFrame): self.setNumNewPages(numPages) numPages = self.packPages(self.backPanelList, self.backPageList, 'back') self.setNumBackPages(numPages) - numPages = self.packPages(self.specialPanelList, self.specialPageList, 'special') - self.setNumSpecialPages(numPages) + numPages = self.packPages(self.loyaltyPanelList, self.loyaltyPageList, 'loyalty') + self.setNumLoyaltyPages(numPages) numPages = self.packPages(self.emblemPanelList, self.emblemPageList, 'emblem') self.setNumEmblemPages(numPages) currentWeek = base.localAvatar.catalogScheduleCurrentWeek - 1 @@ -752,7 +752,7 @@ class CatalogScreen(DirectFrame): self.clarabelleFrame.setPosHprScale(-0.01, 0.0, -0.01, 0.0, 0.0, 0.0, 1.02, 1.0, 1.02) def reload(self): - for panel in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: + for panel in self.panelList + self.backPanelList + self.loyaltyPanelList + self.emblemPanelList: panel.destroy() def priceSort(a, b, type): @@ -764,23 +764,23 @@ class CatalogScreen(DirectFrame): self.maxPageIndex = 0 self.numNewPages = 0 self.numBackPages = 5 - self.numSpecialPages = 0 + self.numLoyaltyPages = 0 self.viewing = 'New' self.panelList = [] self.backPanelList = [] - self.specialList = [] + self.loyaltyList = [] self.pageList = [] self.backPageList = [] - self.specialPanelList = [] - self.specialPageList = [] + self.loyaltyPanelList = [] + self.loyaltyPageList = [] self.panelDict = {} self.visiblePanels = [] itemList = base.localAvatar.monthlyCatalog + base.localAvatar.weeklyCatalog itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeWeekly)) itemList.reverse() for item in itemList: - if item.getIsSpecial(): - self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) + if item.loyaltyRequirement() != 0: + self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) else: self.panelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly)) @@ -788,8 +788,8 @@ class CatalogScreen(DirectFrame): itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeBackorder)) itemList.reverse() for item in itemList: - if item.getIsSpecial(): - self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) + if item.loyaltyRequirement() != 0: + self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) else: self.backPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder)) @@ -797,8 +797,8 @@ class CatalogScreen(DirectFrame): self.setNumNewPages(numPages) numPages = self.packPages(self.backPanelList, self.backPageList, 'back') self.setNumBackPages(numPages) - numPages = self.packPages(self.specialPanelList, self.specialPageList, 'special') - self.setNumSpecialPages(numPages) + numPages = self.packPages(self.loyaltyPanelList, self.loyaltyPageList, 'loyalty') + self.setNumLoyaltyPages(numPages) seriesNumber = (base.localAvatar.catalogScheduleCurrentWeek - 1) / ToontownGlobals.CatalogNumWeeksPerSeries + 1 self.catalogSeries['text'] = Localizer.CatalogSeriesLabel % seriesNumber weekNumber = (base.localAvatar.catalogScheduleCurrentWeek - 1) % ToontownGlobals.CatalogNumWeeksPerSeries + 1 @@ -820,7 +820,7 @@ class CatalogScreen(DirectFrame): self.destroy() del self.base del self.squares - for panel in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: + for panel in self.panelList + self.backPanelList + self.loyaltyPanelList + self.emblemPanelList: panel.destroy() del self.panelList @@ -838,8 +838,8 @@ class CatalogScreen(DirectFrame): del self.newCatalogButton2 del self.backCatalogButton del self.backCatalogButton2 - del self.specialCatalogButton - del self.specialCatalogButton2 + del self.loyaltyCatalogButton + del self.loyaltyCatalogButton2 del self.pageLabel if self.createdGiftGui: del self.giftToggle @@ -878,8 +878,8 @@ class CatalogScreen(DirectFrame): self.newCatalogButton2.hide() self.backCatalogButton.hide() self.backCatalogButton2.hide() - self.specialCatalogButton.hide() - self.specialCatalogButton2.hide() + self.loyaltyCatalogButton.hide() + self.loyaltyCatalogButton2.hide() self.emblemCatalogButton.hide() self.emblemCatalogButton2.hide() self.hangup.hide() @@ -901,7 +901,7 @@ class CatalogScreen(DirectFrame): self.__giftToggle() if hasattr(self, 'beanBank'): self.beanBank['text'] = str(base.localAvatar.getTotalMoney()) - for item in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: + for item in self.panelList + self.backPanelList + self.loyaltyPanelList + self.emblemPanelList: if type(item) != type(''): item.updateButtons(self.gifting) diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 7c91051f..12c6851f 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -151,7 +151,7 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): if isinstance(item, CatalogInvalidItem.CatalogInvalidItem): self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item') self.notify.warning('%d tried purchasing invalid item' % avId) - return ToontownGlobals.P_NotInCatalog + return ToontownGlobals.P_NotInCatalog elif (not item.hasEmblemPrices()) and item not in av.backCatalog and item not in av.weeklyCatalog and item not in av.monthlyCatalog: self.air.writeServerEvent('suspicious', avId, 'tried purchasing non-existing item') self.notify.warning('%d tried purchasing non-existing item' % avId) diff --git a/toontown/toon/LocalToon.py b/toontown/toon/LocalToon.py index 117f19fd..b54d601c 100755 --- a/toontown/toon/LocalToon.py +++ b/toontown/toon/LocalToon.py @@ -1662,6 +1662,9 @@ class LocalToon(DistributedToon.DistributedToon, LocalAvatar.LocalAvatar): def setPinkSlips(self, pinkSlips): DistributedToon.DistributedToon.setPinkSlips(self, pinkSlips) self.inventory.updateTotalPropsText() + + def getAccountDays(self): + return base.cr.accountDateMgr.getAccountDays() def hasActiveBoardingGroup(self): if hasattr(localAvatar, 'boardingParty') and localAvatar.boardingParty: diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index a101d7d0..c924d2f8 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5451,7 +5451,7 @@ CatalogCurrency = 'beans' CatalogHangUp = 'Hang Up' CatalogNew = 'NEW' CatalogBackorder = 'BACKORDER' -CatalogSpecial = 'SPECIAL' +CatalogLoyalty = 'SPECIAL' CatalogEmblem = 'EMBLEM' CatalogPagePrefix = 'Page' CatalogGreeting = "Hello! Thanks for calling Clarabelle's Cattlelog. Can I help you?" @@ -8133,6 +8133,7 @@ ElevatorLawBotCourse0 = 'Office A' ElevatorLawBotCourse1 = 'Office B' ElevatorLawBotCourse2 = 'Office C' ElevatorLawBotCourse3 = 'Office D' +DaysToGo = 'Wait\n%s Days' IceGameTitle = 'Ice Slide' IceGameInstructions = 'Get as close to the center by the end of the second round. Use arrow keys to change direction and force. Press Ctrl to launch your toon. Hit barrels for extra points and avoid the TNT!' IceGameInstructionsNoTnt = 'Get as close to the center by the end of the second round. Use arrow keys to change direction and force. Press Ctrl to launch your toon. Hit barrels for extra points.' diff --git a/toontown/uberdog/ClientServicesManagerUD.py b/toontown/uberdog/ClientServicesManagerUD.py index 6c11f7a7..f2d49683 100755 --- a/toontown/uberdog/ClientServicesManagerUD.py +++ b/toontown/uberdog/ClientServicesManagerUD.py @@ -329,7 +329,7 @@ class LoginAccountFSM(OperationFSM): 'ACCOUNT_AV_SET': [0] * 6, 'ESTATE_ID': 0, 'ACCOUNT_AV_SET_DEL': [], - 'CREATED': time.time(), + 'CREATED': time.ctime(), 'LAST_LOGIN': time.ctime(), 'LAST_LOGIN_TS': time.time(), 'ACCOUNT_ID': str(self.userId), From e1de301f2abf2c2534789e74b91807888161ff33 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 23 Jul 2015 23:00:50 +0300 Subject: [PATCH 084/161] Revert "Loyalty items cum back. ;(. & add ctime so mongo doesn't complain." This reverts commit 881a8007dfb19824bfa339e9ba98dbf417b06440. --- dependencies/astron/dclass/stride.dc | 8 +- toontown/ai/ToontownAIRepository.py | 3 - toontown/catalog/AccountDate.py | 39 ---- toontown/catalog/AccountDateAI.py | 23 -- toontown/catalog/CatalogAccessoryItem.py | 17 +- .../catalog/CatalogAccessoryItemGlobals.py | 1 - toontown/catalog/CatalogClothingItem.py | 37 +-- toontown/catalog/CatalogEmoteItem.py | 20 +- toontown/catalog/CatalogGenerator.py | 211 ++++++------------ toontown/catalog/CatalogItem.py | 20 +- toontown/catalog/CatalogItemPanel.py | 3 - toontown/catalog/CatalogRentalItem.py | 9 +- toontown/catalog/CatalogScreen.py | 160 ++++++------- toontown/estate/DistributedPhoneAI.py | 2 +- toontown/toon/LocalToon.py | 3 - toontown/toonbase/TTLocalizerEnglish.py | 3 +- toontown/uberdog/ClientServicesManagerUD.py | 2 +- 17 files changed, 182 insertions(+), 379 deletions(-) delete mode 100644 toontown/catalog/AccountDate.py delete mode 100644 toontown/catalog/AccountDateAI.py diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index d825cb06..ddf3b618 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -27,7 +27,7 @@ dclass Account { uint32 ACCOUNT_AV_SET[] required db; uint32 ESTATE_ID db; AvatarPendingDel ACCOUNT_AV_SET_DEL[] db; - string CREATED db; + uint64 CREATED db; string LAST_LOGIN db; string ACCOUNT_ID db; uint16 ACCESS_LEVEL db; @@ -234,7 +234,6 @@ from toontown.shtiker import NewbiePurchaseManager/AI from toontown.safezone import SafeZoneManager/AI from toontown.tutorial import TutorialManager/AI from toontown.catalog import CatalogManager/AI -from toontown.catalog import AccountDate/AI from toontown.safezone import DistributedTreasure/AI from toontown.coghq import DistributedCashbotBossTreasure/AI from toontown.building import DistributedTrophyMgr/AI @@ -1520,11 +1519,6 @@ dclass CatalogManager : DistributedObject { startCatalog() airecv clsend; }; -dclass AccountDate : DistributedObject { - requestDate() airecv clsend; - requestDateResult(string); -}; - dclass DistributedTreasure : DistributedObject { setTreasureType(uint16) required broadcast ram; setPosition(int16/10, int16/10, int16/10) required broadcast ram; diff --git a/toontown/ai/ToontownAIRepository.py b/toontown/ai/ToontownAIRepository.py index 2c43d1bc..39a4b4c3 100755 --- a/toontown/ai/ToontownAIRepository.py +++ b/toontown/ai/ToontownAIRepository.py @@ -18,7 +18,6 @@ from toontown.ai.DistributedReportMgrAI import DistributedReportMgrAI from toontown.building.DistributedBuildingQueryMgrAI import DistributedBuildingQueryMgrAI from toontown.building.DistributedTrophyMgrAI import DistributedTrophyMgrAI from toontown.catalog.CatalogManagerAI import CatalogManagerAI -from toontown.catalog.AccountDateAI import AccountDateAI from toontown.coghq import CountryClubManagerAI from toontown.coghq import FactoryManagerAI from toontown.coghq import LawOfficeManagerAI @@ -119,8 +118,6 @@ class ToontownAIRepository(ToontownInternalRepository): self.cogPageManager = CogPageManagerAI.CogPageManagerAI() self.codeRedemptionMgr = TTCodeRedemptionMgrAI(self) self.codeRedemptionMgr.generateWithRequired(2) - self.accountDateMgr = AccountDateAI(self) - self.accountDateMgr.generateWithRequired(2) self.buildingQueryMgr = DistributedBuildingQueryMgrAI(self) self.buildingQueryMgr.generateWithRequired(2) self.groupManager.generateWithRequired(2) diff --git a/toontown/catalog/AccountDate.py b/toontown/catalog/AccountDate.py deleted file mode 100644 index 610227e1..00000000 --- a/toontown/catalog/AccountDate.py +++ /dev/null @@ -1,39 +0,0 @@ -from direct.distributed.DistributedObject import DistributedObject -from direct.directnotify.DirectNotifyGlobal import directNotify -from datetime import datetime - -class AccountDate(DistributedObject): - neverDisable = 1 - notify = directNotify.newCategory('AccountDate') - - def __init__(self, cr): - DistributedObject.__init__(self, cr) - self.accountDays = 0 - - def announceGenerate(self): - DistributedObject.announceGenerate(self) - base.cr.accountDateMgr = self - taskMgr.doMethodLater(10, self.requestDate, 'request-task') - - def delete(self): - if hasattr(base.cr, 'accountDateMgr'): - if base.cr.accountDateMgr is self: - del base.cr.accountDateMgr - DistributedObject.delete(self) - - def getAccountDays(self): - return self.accountDays - - def requestDate(self, task=None): - self.sendUpdate('requestDate') - - if task is not None: - return task.done - - def requestDateResult(self, result): - if result is None: - notify.warning('Invalid response from server.') - self.accountDays = 0 - else: - date = datetime.strptime(result, "%a %b %d %H:%M:%S %Y") - self.accountDays = (datetime.now() - date).days \ No newline at end of file diff --git a/toontown/catalog/AccountDateAI.py b/toontown/catalog/AccountDateAI.py deleted file mode 100644 index 654048ea..00000000 --- a/toontown/catalog/AccountDateAI.py +++ /dev/null @@ -1,23 +0,0 @@ -from direct.directnotify import DirectNotifyGlobal -from direct.distributed.DistributedObjectAI import DistributedObjectAI - -class AccountDateAI(DistributedObjectAI): - notify = DirectNotifyGlobal.directNotify.newCategory("AccountDateAI") - - def announceGenerate(self): - DistributedObjectAI.announceGenerate(self) - - def requestDate(self): - avId = self.air.getAvatarIdFromSender() - av = self.air.doId2do.get(avId) - - if not av: - return - - def callback(dclass, fields): - if dclass is not None and dclass == self.air.dclassesByName['AccountAI'] and fields.has_key('CREATED'): - self.sendUpdateToAvatarId(avId, 'requestDateResult', [fields.get('CREATED')]) - else: - self.sendUpdateToAvatarId(avId, 'requestDateResult', [None]) - - self.air.dbInterface.queryObject(self.air.dbId, av.DISLid, callback) \ No newline at end of file diff --git a/toontown/catalog/CatalogAccessoryItem.py b/toontown/catalog/CatalogAccessoryItem.py index 0b93190f..e71d6544 100755 --- a/toontown/catalog/CatalogAccessoryItem.py +++ b/toontown/catalog/CatalogAccessoryItem.py @@ -10,9 +10,9 @@ from panda3d.core import * class CatalogAccessoryItem(CatalogItem.CatalogItem): - def makeNewItem(self, accessoryType, loyaltyDays = 0): + def makeNewItem(self, accessoryType, isSpecial = False): self.accessoryType = accessoryType - self.loyaltyDays = loyaltyDays + self.isSpecial = isSpecial CatalogItem.CatalogItem.makeNewItem(self) def getPurchaseLimit(self): @@ -328,7 +328,7 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): def decodeDatagram(self, di, versionNumber, store): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) self.accessoryType = di.getUint16() - self.loyaltyDays = di.getUint16() + self.isSpecial = di.getBool() str = AccessoryTypes[self.accessoryType][ATString] if self.isHat(): defn = ToonDNA.HatStyles[str] @@ -343,17 +343,10 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): def encodeDatagram(self, dg, store): CatalogItem.CatalogItem.encodeDatagram(self, dg, store) dg.addUint16(self.accessoryType) - dg.addUint16(self.loyaltyDays) + dg.addBool(self.isSpecial) def isGift(self): - if self.getEmblemPrices(): - return 0 - if self.loyaltyRequirement() > 0: - return 0 - elif self.accessoryType in LoyaltyAccessoryItems: - return 0 - else: - return 1 + return not self.getEmblemPrices() def getAllAccessories(*accessoryTypes): list = [] diff --git a/toontown/catalog/CatalogAccessoryItemGlobals.py b/toontown/catalog/CatalogAccessoryItemGlobals.py index 2ac705e2..f72765a5 100755 --- a/toontown/catalog/CatalogAccessoryItemGlobals.py +++ b/toontown/catalog/CatalogAccessoryItemGlobals.py @@ -735,4 +735,3 @@ AccessoryTypes = {101: (AHat, 'shw2', APriceCool, 7)} -LoyaltyAccessoryItems = [] diff --git a/toontown/catalog/CatalogClothingItem.py b/toontown/catalog/CatalogClothingItem.py index a4b36bfd..c13d5362 100755 --- a/toontown/catalog/CatalogClothingItem.py +++ b/toontown/catalog/CatalogClothingItem.py @@ -17,8 +17,7 @@ ABoysShorts = 3 AGirlsShorts = 4 AGirlsSkirt = 5 AShorts = 6 -ClothingTypes = { - 101: (ABoysShirt, 'bss1', 40), +ClothingTypes = {101: (ABoysShirt, 'bss1', 40), 102: (ABoysShirt, 'bss2', 40), 103: (ABoysShirt, 'bss3', 40), 105: (ABoysShirt, 'bss4', 40), @@ -291,23 +290,15 @@ ClothingTypes = { 1817: (AGirlsSkirt, 'sa_gs19', 5000), 1818: (AGirlsSkirt, 'sa_gs20', 5000), 1819: (AGirlsSkirt, 'sa_gs21', 5000), - 1820: (AShirt, 'sa_ss55', 5000)} -LoyaltyClothingItems = (1600, - 1601, - 1602, - 1603, - 1604, - 1605, - 1606, - 1607, - 1608) + 1820: (AShirt, 'sa_ss55', 5000), + 1821: (AShirt, 'weed', 5000)} class CatalogClothingItem(CatalogItem.CatalogItem): - def makeNewItem(self, clothingType, colorIndex, loyaltyDays = 0): + def makeNewItem(self, clothingType, colorIndex, isSpecial = False): self.clothingType = clothingType self.colorIndex = colorIndex - self.loyaltyDays = loyaltyDays + self.isSpecial = isSpecial CatalogItem.CatalogItem.makeNewItem(self) def storedInCloset(self): @@ -347,8 +338,6 @@ class CatalogClothingItem(CatalogItem.CatalogItem): return 1 if avatar.mailboxContents.count(self) != 0: return 1 - if self in avatar.awardMailboxContents or self in avatar.onAwardOrder: - return 1 str = ClothingTypes[self.clothingType][CTString] dna = avatar.getStyle() if self.isShirt(): @@ -428,7 +417,7 @@ class CatalogClothingItem(CatalogItem.CatalogItem): return ToontownGlobals.P_ItemAvailable def getDeliveryTime(self): - return 60 + return 1 def getPicture(self, avatar): from toontown.toon import Toon @@ -565,7 +554,7 @@ class CatalogClothingItem(CatalogItem.CatalogItem): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) self.clothingType = di.getUint16() self.colorIndex = di.getUint8() - self.loyaltyDays = di.getUint16() + self.isSpecial = di.getBool() str = ClothingTypes[self.clothingType][CTString] if self.isShirt(): color = ToonDNA.ShirtStyles[str][2][self.colorIndex] @@ -576,18 +565,10 @@ class CatalogClothingItem(CatalogItem.CatalogItem): CatalogItem.CatalogItem.encodeDatagram(self, dg, store) dg.addUint16(self.clothingType) dg.addUint8(self.colorIndex) - dg.addUint16(self.loyaltyDays) + dg.addBool(self.isSpecial) def isGift(self): - if self.getEmblemPrices(): - return 0 - if self.loyaltyRequirement() > 0: - return 0 - elif self.clothingType in LoyaltyClothingItems: - return 0 - else: - return 1 - + return not self.getEmblemPrices() def getAllClothes(*clothingTypes): list = [] diff --git a/toontown/catalog/CatalogEmoteItem.py b/toontown/catalog/CatalogEmoteItem.py index 168240b2..2849a58c 100755 --- a/toontown/catalog/CatalogEmoteItem.py +++ b/toontown/catalog/CatalogEmoteItem.py @@ -3,22 +3,21 @@ from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer from otp.otpbase import OTPLocalizer from direct.interval.IntervalGlobal import * -LoyaltyEmoteItems = (20, 21, 22, 23, 24, 25, 26) class CatalogEmoteItem(CatalogItem.CatalogItem): sequenceNumber = 0 pictureToon = None - def makeNewItem(self, emoteIndex, loyaltyDays = 0): + def makeNewItem(self, emoteIndex, isSpecial = False): self.emoteIndex = emoteIndex - self.loyaltyDays = loyaltyDays + self.isSpecial = isSpecial CatalogItem.CatalogItem.makeNewItem(self) def getPurchaseLimit(self): return 1 def reachedPurchaseLimit(self, avatar): - if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder or self in avatar.awardMailboxContents or self in avatar.onAwardOrder: + if self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder: return 1 if self.emoteIndex >= len(avatar.emoteAccess): return 0 @@ -115,21 +114,14 @@ class CatalogEmoteItem(CatalogItem.CatalogItem): def decodeDatagram(self, di, versionNumber, store): CatalogItem.CatalogItem.decodeDatagram(self, di, versionNumber, store) self.emoteIndex = di.getUint8() - self.loyaltyDays = di.getUint16() + self.isSpecial = di.getBool() if self.emoteIndex > len(OTPLocalizer.EmoteList): raise ValueError def encodeDatagram(self, dg, store): CatalogItem.CatalogItem.encodeDatagram(self, dg, store) dg.addUint8(self.emoteIndex) - dg.addUint16(self.loyaltyDays) + dg.addBool(self.isSpecial) def isGift(self): - if self.getEmblemPrices(): - return 0 - if self.loyaltyRequirement() > 0: - return 0 - elif self.emoteIndex in LoyaltyEmoteItems: - return 0 - else: - return 1 + return not self.getEmblemPrices() diff --git a/toontown/catalog/CatalogGenerator.py b/toontown/catalog/CatalogGenerator.py index 3d04a55e..40752063 100755 --- a/toontown/catalog/CatalogGenerator.py +++ b/toontown/catalog/CatalogGenerator.py @@ -12,8 +12,8 @@ from CatalogMouldingItem import CatalogMouldingItem, getAllMouldings from CatalogWainscotingItem import CatalogWainscotingItem, getAllWainscotings from CatalogWindowItem import CatalogWindowItem from CatalogPoleItem import nextAvailablePole, getAllPoles -from CatalogPetTrickItem import CatalogPetTrickItem, getAllPetTricks from CatalogTankItem import nextAvailableTank, getAllTanks +from CatalogPetTrickItem import CatalogPetTrickItem, getAllPetTricks from CatalogGardenItem import CatalogGardenItem from CatalogToonStatueItem import CatalogToonStatueItem from CatalogRentalItem import CatalogRentalItem @@ -26,7 +26,7 @@ from toontown.toonbase import ToontownGlobals import types import random import time -from pandac.PandaModules import * +from panda3d.core import * MetaItems = {100: getAllClothes(101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 111, 115, 201, 202, 203, 204, 205, 206, 207, 208, 209, 209, 211, 215), 300: getAllClothes(301, 302, 303, 304, 305, 308, 401, 403, 404, 405, 407, 451, 452, 453), 2000: getChatRange(0, 1999), @@ -41,20 +41,25 @@ MetaItems = {100: getAllClothes(101, 102, 103, 104, 105, 106, 107, 108, 109, 109 2921: getChatRange(12050, 12099), 2930: getChatRange(13000, 13099), 2940: getChatRange(14000, 14099), + 3000: getWallpapers(1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100), 3010: getWallpapers(2200, 2300, 2400, 2500, 2600, 2700, 2800), 3020: getWallpapers(2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600), 3030: getWallpapers(3700, 3800, 3900), + 3500: getAllWainscotings(1000, 1010), 3510: getAllWainscotings(1020), 3520: getAllWainscotings(1030), 3530: getAllWainscotings(1040), + 4000: getFloorings(1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090, 1100), 4010: getFloorings(1110, 1120, 1130), 4020: getFloorings(1140, 1150, 1160, 1170, 1180, 1190), + 4500: getAllMouldings(1000, 1010), 4510: getAllMouldings(1020, 1030, 1040), 4520: getAllMouldings(1070), + 5000: getAllPetTricks()} MetaItemChatKeysSold = (2000, 2010, @@ -396,29 +401,7 @@ MonthlySchedule = ((7, 15, 8, 15, - 2010, - 2010, ((4, 2940),)), - (9, - 1, - 9, - 30, - (CatalogGardenItem(135, 1),)), - (1, - 1, - 1, - 31, - (CatalogGardenItem(135, 1),)), - (4, - 1, - 4, - 30, - (CatalogGardenItem(135, 1),)), - (6, - 1, - 6, - 30, - (CatalogGardenItem(135, 1),)), (6, 26, 7, @@ -477,22 +460,16 @@ MonthlySchedule = ((7, 9, 7, 15, - 2010, - 2010, (CatalogClothingItem(1751, 0),)), (6, 14, 7, 15, - 2010, - 2010, (CatalogClothingItem(1754, 0), CatalogClothingItem(1755, 0), CatalogClothingItem(1756, 0))), (7, 21, 8, 17, - 2010, - 2010, (CatalogClothingItem(1749, 0), CatalogClothingItem(1750, 0), CatalogClothingItem(1757, 0), @@ -501,8 +478,6 @@ MonthlySchedule = ((7, 25, 9, 21, - 2010, - 2010, (CatalogClothingItem(1763, 0),)), (6, 5, @@ -513,48 +488,43 @@ MonthlySchedule = ((7, 1, 12, 31, - (CatalogGardenItem(100, 1), + ( + CatalogGardenItem(100, 1), CatalogGardenItem(101, 1), CatalogGardenItem(103, 1), CatalogGardenItem(104, 1), CatalogToonStatueItem(105, endPoseIndex=108), CatalogRentalItem(1, 2880, 1000), + CatalogRentalItem(2, 2890, 1000), CatalogGardenStarterItem(), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), - CatalogFurnitureItem(1532), - CatalogNametagItem(15), - CatalogNametagItem(16), - CatalogNametagItem(17), - CatalogClothingItem(1608, 0, 720), - CatalogClothingItem(1605, 0, 720), - CatalogClothingItem(1602, 0, 720), - CatalogClothingItem(1607, 0, 540), - CatalogClothingItem(1604, 0, 540), - CatalogClothingItem(1601, 0, 540), - CatalogClothingItem(1606, 0, 360), - CatalogClothingItem(1603, 0, 360), - CatalogClothingItem(1600, 0, 360), - CatalogEmoteItem(25, 30), - CatalogEmoteItem(26, 60), - CatalogEmoteItem(20, 90), - CatalogEmoteItem(21, 180), - CatalogEmoteItem(22, 360), - CatalogEmoteItem(23, 540), - CatalogEmoteItem(24, 720))), + CatalogFurnitureItem(1532), + CatalogClothingItem(1605, 0, True), + CatalogClothingItem(1602, 0, True), + CatalogClothingItem(1604, 0, True), + CatalogClothingItem(1601, 0, True), + CatalogClothingItem(1603, 0, True), + CatalogClothingItem(1600, 0, True), + CatalogEmoteItem(20, True), + CatalogEmoteItem(21, True), + CatalogEmoteItem(22, True), + CatalogEmoteItem(23, True), + CatalogEmoteItem(24, True), + CatalogEmoteItem(25, True), + CatalogEmoteItem(26, True), + CatalogNametagItem(15, True), + CatalogNametagItem(16, True), + CatalogNametagItem(17, True))), (5, 26, 6, 30, - 2013, - 2013, (CatalogAccessoryItem(175),)), (8, 27, 9, 5, - 2013, - 2013, ((3, 2900), CatalogChatItem(10003), CatalogClothingItem(1001, 0), @@ -604,8 +574,6 @@ MonthlySchedule = ((7, 3, 9, 12, - 2013, - 2013, ((3, 2910), CatalogFurnitureItem(680), CatalogFurnitureItem(681), @@ -640,8 +608,6 @@ MonthlySchedule = ((7, 20, 9, 19, - 2013, - 2013, (CatalogAccessoryItem(101), CatalogAccessoryItem(103), CatalogAccessoryItem(117), @@ -864,7 +830,9 @@ WeeklySchedule = ((100, CatalogFurnitureItem(1000), CatalogClothingItem(117, 0), CatalogClothingItem(217, 0), - nextAvailableCloset), + nextAvailableCloset, + nextAvailableBank, + nextAvailableTank), (100, (5, 2000), CatalogFurnitureItem(1430), @@ -1385,7 +1353,7 @@ WeeklySchedule = ((100, Sale(CatalogClothingItem(116, 0), CatalogClothingItem(216, 0), CatalogClothingItem(408, 0), CatalogClothingItem(117, 0), CatalogClothingItem(217, 0), CatalogClothingItem(409, 0), CatalogClothingItem(118, 0), CatalogClothingItem(218, 0), CatalogClothingItem(410, 0), CatalogClothingItem(119, 0), CatalogClothingItem(219, 0), CatalogClothingItem(120, 0), CatalogClothingItem(220, 0), CatalogClothingItem(121, 0), CatalogClothingItem(221, 0), CatalogClothingItem(222, 0), CatalogClothingItem(123, 0), CatalogClothingItem(224, 0), CatalogClothingItem(411, 0), CatalogClothingItem(311, 0), CatalogClothingItem(310, 0)), Sale(CatalogWindowItem(40), CatalogWindowItem(70), CatalogWindowItem(50), CatalogWindowItem(60), CatalogWindowItem(80), CatalogWindowItem(100), CatalogWindowItem(90), CatalogWindowItem(110)), Sale(CatalogEmoteItem(5), CatalogEmoteItem(9), CatalogEmoteItem(13), CatalogEmoteItem(11), CatalogEmoteItem(6), CatalogEmoteItem(8), CatalogNametagItem(10)), - Sale(CatalogFurnitureItem(600), CatalogFurnitureItem(610), CatalogFurnitureItem(620), CatalogFurnitureItem(630), CatalogFurnitureItem(640), CatalogFurnitureItem(650), CatalogFurnitureItem(660), CatalogFurnitureItem(900), CatalogFurnitureItem(910), CatalogFurnitureItem(920), CatalogFurnitureItem(930), CatalogFurnitureItem(940), CatalogFurnitureItem(1000), CatalogFurnitureItem(1010), CatalogFurnitureItem(1020), CatalogFurnitureItem(1030), CatalogFurnitureItem(1400), CatalogFurnitureItem(1410), CatalogFurnitureItem(1420), CatalogFurnitureItem(1430), CatalogFurnitureItem(1440), CatalogFurnitureItem(1441), CatalogFurnitureItem(1442), CatalogFurnitureItem(1443), CatalogFurnitureItem(1500), CatalogFurnitureItem(1510), CatalogFurnitureItem(1520), CatalogFurnitureItem(1530), CatalogFurnitureItem(1600), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), CatalogFurnitureItem(1610), CatalogFurnitureItem(1620), CatalogFurnitureItem(1630), CatalogFurnitureItem(1640), CatalogFurnitureItem(1650), CatalogFurnitureItem(1660), CatalogFurnitureItem(1661), CatalogFurnitureItem(1710), CatalogFurnitureItem(1800), CatalogFurnitureItem(1810), CatalogFurnitureItem(1900), CatalogFurnitureItem(1910)), + Sale(CatalogFurnitureItem(600), CatalogFurnitureItem(610), CatalogFurnitureItem(620), CatalogFurnitureItem(630), CatalogFurnitureItem(640), CatalogFurnitureItem(650), CatalogFurnitureItem(660), CatalogFurnitureItem(900), CatalogFurnitureItem(910), CatalogFurnitureItem(920), CatalogFurnitureItem(930), CatalogFurnitureItem(940), CatalogFurnitureItem(1000), CatalogFurnitureItem(1010), CatalogFurnitureItem(1020), CatalogFurnitureItem(1030), CatalogFurnitureItem(1400), CatalogFurnitureItem(1410), CatalogFurnitureItem(1420), CatalogFurnitureItem(1430), CatalogFurnitureItem(1440), CatalogFurnitureItem(1441), CatalogFurnitureItem(1442), CatalogFurnitureItem(1443), CatalogFurnitureItem(1500), CatalogFurnitureItem(1510), CatalogFurnitureItem(1520), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), CatalogFurnitureItem(1600), CatalogFurnitureItem(1610), CatalogFurnitureItem(1620), CatalogFurnitureItem(1630), CatalogFurnitureItem(1640), CatalogFurnitureItem(1650), CatalogFurnitureItem(1660), CatalogFurnitureItem(1661), CatalogFurnitureItem(1710), CatalogFurnitureItem(1800), CatalogFurnitureItem(1810), CatalogFurnitureItem(1900), CatalogFurnitureItem(1910)), (300, (1, 2020), (2, 2030), @@ -1512,12 +1480,9 @@ class CatalogGenerator: def __init__(self): self.__itemLists = {} - self.__releasedItemLists = {} - def getReleasedCatalogList(self, weekStart): - dayNumber = int(weekStart / (24 * 60)) - itemLists = self.__getReleasedItemLists(dayNumber, weekStart) - return itemLists + if config.GetBool('save-catalog-schedule', False): + self.outputSchedule('catalog-schedule.txt') def generateMonthlyCatalog(self, avatar, weekStart): dayNumber = int(weekStart / (24 * 60)) @@ -1547,12 +1512,13 @@ class CatalogGenerator: if nextAvailableCloset not in schedule: weeklyCatalog += self.__selectItem(avatar, nextAvailableCloset, monthlyCatalog, saleItem=0) - + if nextAvailableBank not in schedule: - weeklyCatalog += self.__selectItem(avatar, nextAvailableBank, monthlyCatalog, saleItem = 0) + weeklyCatalog += self.__selectItem(avatar, nextAvailableBank, monthlyCatalog, saleItem=0) + if nextAvailableTank not in schedule: - weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem = 0) - if time.time() < 1096617600.0: + weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem=0) + if True: def hasPetTrick(catalog): for item in catalog: @@ -1562,7 +1528,6 @@ class CatalogGenerator: return 0 if not hasPetTrick(weeklyCatalog) and not hasPetTrick(avatar.weeklyCatalog) and not hasPetTrick(avatar.backCatalog): - self.notify.debug('Artificially adding pet trick to catalog') weeklyCatalog += self.__selectItem(avatar, 5000, monthlyCatalog, saleItem=saleItem) self.notify.debug('Generated catalog: %s' % weeklyCatalog) return weeklyCatalog @@ -1592,45 +1557,12 @@ class CatalogGenerator: return backCatalog - def __getReleasedItemLists(self, dayNumber, weekStart): - itemLists = self.__releasedItemLists.get(dayNumber) - if itemLists != None: - return itemLists - else: - self.__releasedItemLists.clear() - testDaysAhead = simbase.config.GetInt('test-server-holiday-days-ahead', 0) - nowtuple = time.localtime(weekStart * 60 + testDaysAhead * 24 * 60 * 60) - year = nowtuple[0] - month = nowtuple[1] - day = nowtuple[2] - itemLists = [] - for monthlyItems in MonthlySchedule: - startMM = monthlyItems[0] - startDD = monthlyItems[1] - endMM = monthlyItems[2] - endDD = monthlyItems[3] - if len(monthlyItems) == 7: - startYYYY = monthlyItems[4] - endYYYY = monthlyItems[5] - list = monthlyItems[6] - else: - startYYYY = 1969 - endYYYY = year - list = monthlyItems[4] - pastStart = year > startYYYY or (year == startYYYY and (month > startMM or (month == startMM and day >= startDD))) - if pastStart: - itemLists.append(list) - - self.__releasedItemLists[dayNumber] = itemLists - return itemLists - def __getMonthlyItemLists(self, dayNumber, weekStart): itemLists = self.__itemLists.get(dayNumber) if itemLists != None: return itemLists - testDaysAhead = simbase.config.GetInt('test-server-holiday-days-ahead', 0) + testDaysAhead = config.GetInt('test-server-holiday-days-ahead', 0) nowtuple = time.localtime(weekStart * 60 + testDaysAhead * 24 * 60 * 60) - year = nowtuple[0] month = nowtuple[1] day = nowtuple[2] self.notify.debug('Generating seasonal itemLists for %s/%s.' % (month, day)) @@ -1640,16 +1572,9 @@ class CatalogGenerator: startDD = monthlyItems[1] endMM = monthlyItems[2] endDD = monthlyItems[3] - if len(monthlyItems) == 7: - startYYYY = monthlyItems[4] - endYYYY = monthlyItems[5] - list = monthlyItems[6] - else: - startYYYY = 1969 - endYYYY = year - list = monthlyItems[4] - pastStart = year >= startYYYY and (month > startMM or (month == startMM and day >= startDD)) - beforeEnd = year <= endYYYY and (month < endMM or (month == endMM and day <= endDD)) + list = monthlyItems[4] + pastStart = month > startMM or (month == startMM and day >= startDD) + beforeEnd = month < endMM or (month == endMM and day <= endDD) if endMM < startMM: if pastStart or beforeEnd: itemLists.append(list) @@ -1780,31 +1705,33 @@ class CatalogGenerator: def __recordSchedule(self, sched, weekCode, schedule): if isinstance(schedule, Sale): schedule = schedule.args - for item in schedule: - if callable(item): - if item == nextAvailablePole: - item = getAllPoles() - elif item == nextAvailableCloset: - item = getAllClosets() - elif item == nextAvailableBank: - item = getAllBanks() - elif item == nextAvailableTank: - item == getAllTanks() - elif item == get50ItemCloset: - item = getMaxClosets() - else: - self.notify.warning("Don't know how to interpret function " % repr(name)) - item = None - elif isinstance(item, types.TupleType): - item = item[1] - if isinstance(item, types.IntType): - item = MetaItems[item] - if isinstance(item, CatalogItem.CatalogItem): - self.__recordScheduleItem(sched, weekCode, None, item) - elif item != None: - for i in item: - self.__recordScheduleItem(sched, None, weekCode, i) - + try: + for item in list(schedule): + if callable(item): + if item == nextAvailablePole: + item = getAllPoles() + elif item == nextAvailableCloset: + item = getAllClosets() + elif item == nextAvailableBank: + item = getAllBanks() + elif item == nextAvailableTank: + item = getAllTanks() + elif item == get50ItemCloset: + item = getMaxClosets() + else: + self.notify.warning("Don't know how to interpret function " % repr(name)) + item = None + elif isinstance(item, types.TupleType): + item = item[1] + if isinstance(item, types.IntType): + item = MetaItems[item] + if isinstance(item, CatalogItem.CatalogItem): + self.__recordScheduleItem(sched, weekCode, None, item) + elif item != None: + for i in item: + self.__recordScheduleItem(sched, None, weekCode, i) + except: + print 'Wrong: %s' % schedule return def __recordScheduleItem(self, sched, weekCode, maybeWeekCode, item): diff --git a/toontown/catalog/CatalogItem.py b/toontown/catalog/CatalogItem.py index fad5e86a..f4633050 100755 --- a/toontown/catalog/CatalogItem.py +++ b/toontown/catalog/CatalogItem.py @@ -20,7 +20,7 @@ CatalogTypeUnspecified = 0 CatalogTypeWeekly = 1 CatalogTypeBackorder = 2 CatalogTypeMonthly = 3 -CatalogTypeLoyalty = 4 +CatalogTypeSpecial = 4 class CatalogItem: notify = DirectNotifyGlobal.directNotify.newCategory('CatalogItem') @@ -32,6 +32,7 @@ class CatalogItem: self.giftTag = None self.giftCode = 0 self.hasPicture = False + self.isSpecial = False self.volume = 0 self.specialEventId = 0 if len(args) >= 1 and isinstance(args[0], DatagramIterator): @@ -124,14 +125,8 @@ class CatalogItem: def forGirlsOnly(self): return 0 - def setLoyaltyRequirement(self, days): - self.loyaltyDays = days - - def loyaltyRequirement(self): - if not hasattr(self, 'loyaltyDays'): - return 0 - else: - return self.loyaltyDays + def getIsSpecial(self): + return self.isSpecial def getPrice(self, catalogType): if catalogType == CatalogTypeBackorder: @@ -380,13 +375,6 @@ class CatalogItem: def getRequestPurchaseErrorTextTimeout(self): return 6 - - def getDaysToGo(self, avatar): - accountDays = avatar.getAccountDays() - daysToGo = self.loyaltyRequirement() - accountDays - if daysToGo < 0: - daysToGo = 0 - return int(daysToGo) def encodeCatalogItem(dg, item, store): import CatalogItemTypes diff --git a/toontown/catalog/CatalogItemPanel.py b/toontown/catalog/CatalogItemPanel.py index 40abaad8..0513e36d 100755 --- a/toontown/catalog/CatalogItemPanel.py +++ b/toontown/catalog/CatalogItemPanel.py @@ -306,9 +306,6 @@ class CatalogItemPanel(DirectFrame): elif hasattr(self['item'], 'isSkillTooLow') and self['item'].isSkillTooLow(base.localAvatar): auxText = TTLocalizer.SkillTooLow self.buyButton['state'] = DGG.DISABLED - elif hasattr(self['item'], 'getDaysToGo') and self['item'].getDaysToGo(base.localAvatar): - auxText = TTLocalizer.DaysToGo % self['item'].getDaysToGo(base.localAvatar) - self.buyButton['state'] = DGG.DISABLED elif self['item'].getEmblemPrices() and not base.localAvatar.isEnoughMoneyAndEmblemsToBuy(self['item'].getPrice(self['type']), self['item'].getEmblemPrices()): self.buyButton['state'] = DGG.DISABLED elif hasattr(self['item'], 'houseId') and self['item'].houseId == localAvatar.houseType: diff --git a/toontown/catalog/CatalogRentalItem.py b/toontown/catalog/CatalogRentalItem.py index 4230154a..40998d83 100755 --- a/toontown/catalog/CatalogRentalItem.py +++ b/toontown/catalog/CatalogRentalItem.py @@ -24,7 +24,7 @@ class CatalogRentalItem(CatalogItem.CatalogItem): return 0 def reachedPurchaseLimit(self, avatar): - return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder #or self in avatar.awardMailboxContents or self in avatar.onAwardOrder + return self in avatar.onOrder or self in avatar.mailboxContents or self in avatar.onGiftOrder def saveHistory(self): return 1 @@ -45,15 +45,14 @@ class CatalogRentalItem(CatalogItem.CatalogItem): return TTLocalizer.RentalTypeName def recordPurchase(self, avatar, optional): - self.notify.debug('rental -- record purchase') if avatar: - self.notify.debug('rental -- has avater') + self.notify.debug('rental -- has avatar') estate = simbase.air.estateManager._lookupEstate(avatar) if estate: self.notify.debug('rental -- has estate') estate.rentItem(self.typeIndex, self.duration) else: - self.notify.debug('rental -- something not there') + self.notify.warning('rental -- something not there') return ToontownGlobals.P_ItemAvailable def getPicture(self, avatar): @@ -126,5 +125,7 @@ def getAllRentalItems(): list = [] for rentalType in (ToontownGlobals.RentalCannon,): list.append(CatalogRentalItem(rentalType, 2880, 1000)) + for rentalType in (ToontownGlobals.RentalGameTable,): + list.append(CatalogRentalItem(rentalType, 2890, 1000)) return list diff --git a/toontown/catalog/CatalogScreen.py b/toontown/catalog/CatalogScreen.py index e5c0bb6c..0278f052 100755 --- a/toontown/catalog/CatalogScreen.py +++ b/toontown/catalog/CatalogScreen.py @@ -101,8 +101,8 @@ class CatalogScreen(DirectFrame): def setNumBackPages(self, numBackPages): self.numBackPages = numBackPages - def setNumLoyaltyPages(self, numLoyaltyPages): - self.numLoyaltyPages = numLoyaltyPages + def setNumSpecialPages(self, numSpecialPages): + self.numSpecialPages = numSpecialPages def setNumEmblemPages(self, numEmblemPages): self.numEmblemPages = numEmblemPages @@ -116,49 +116,49 @@ class CatalogScreen(DirectFrame): def enableBackorderCatalogButton(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.DISABLED - self.loyaltyCatalogButton['state'] = DGG.DISABLED + self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.DISABLED def enableNewCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.NORMAL - self.loyaltyCatalogButton['state'] = DGG.DISABLED + self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.DISABLED - def enableLoyaltyCatalogButton(self): + def enableSpecialCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.DISABLED - self.loyaltyCatalogButton['state'] = DGG.NORMAL + self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.DISABLED def enableEmblemCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.DISABLED - self.loyaltyCatalogButton['state'] = DGG.DISABLED + self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.NORMAL def modeBackorderCatalog(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.NORMAL - self.loyaltyCatalogButton['state'] = DGG.NORMAL + self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.NORMAL def modeNewCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.DISABLED - self.loyaltyCatalogButton['state'] = DGG.NORMAL + self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.NORMAL - def modeLoyaltyCatalog(self): + def modeSpecialCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.NORMAL - self.loyaltyCatalogButton['state'] = DGG.DISABLED + self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.NORMAL def modeEmblemCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.NORMAL - self.loyaltyCatalogButton['state'] = DGG.NORMAL + self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.DISABLED def showNewItems(self, index = None): @@ -195,15 +195,15 @@ class CatalogScreen(DirectFrame): self.showPageItems() return - def showLoyaltyItems(self, index = None): + def showSpecialItems(self, index = None): if config.GetBool('want-qa-regression', 0): - self.notify.info('QA-REGRESSION: CATALOG: Loyalty item') + self.notify.info('QA-REGRESSION: CATALOG: Special item') taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') - self.viewing = 'Loyalty' - self.modeLoyaltyCatalog() - self.setMaxPageIndex(self.numLoyaltyPages) - if self.numLoyaltyPages == 0: + self.viewing = 'Special' + self.modeSpecialCatalog() + self.setMaxPageIndex(self.numSpecialPages) + if self.numSpecialPages == 0: self.setPageIndex(-1) elif index is not None: self.setPageIndex(index) @@ -238,11 +238,11 @@ class CatalogScreen(DirectFrame): self.viewing == 'New' if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numBackPages > 0: self.showBackorderItems() - if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numLoyaltyPages > 0: - self.showLoyaltyItems() - elif self.viewing == 'Backorder' and self.pageIndex > self.maxPageIndex and self.numLoyaltyPages > 0: - self.showLoyaltyItems() - elif self.viewing == 'Loyalty' and self.pageIndex > self.maxPageIndex and self.numEmblemPages > 0: + if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numSpecialPages > 0: + self.showSpecialItems() + elif self.viewing == 'Backorder' and self.pageIndex > self.maxPageIndex and self.numSpecialPages > 0: + self.showSpecialItems() + elif self.viewing == 'Special' and self.pageIndex > self.maxPageIndex and self.numEmblemPages > 0: self.showEmblemItems() else: self.pageIndex = min(self.pageIndex, self.maxPageIndex) @@ -255,10 +255,10 @@ class CatalogScreen(DirectFrame): self.pageIndex = self.pageIndex - 1 if self.viewing == 'Backorder' and self.pageIndex < 0 and self.numNewPages > 0: self.showNewItems(self.numNewPages - 1) - elif self.viewing == 'Loyalty' and self.pageIndex < 0 and self.numBackPages > 0: + elif self.viewing == 'Special' and self.pageIndex < 0 and self.numBackPages > 0: self.showBackorderItems(self.numBackPages - 1) - elif self.viewing == 'Emblem' and self.pageIndex < 0 and self.numLoyaltyPages > 0: - self.showLoyaltyItems(self.numLoyaltyPages - 1) + elif self.viewing == 'Emblem' and self.pageIndex < 0 and self.numSpecialPages > 0: + self.showSpecialItems(self.numSpecialPages - 1) else: self.pageIndex = max(self.pageIndex, -1) self.showPageItems() @@ -274,16 +274,16 @@ class CatalogScreen(DirectFrame): self.openCover() if self.viewing == 'New': page = self.pageList[self.pageIndex] - newOrBackOrLoyalty = 0 + newOrBackOrSpecial = 0 elif self.viewing == 'Backorder': page = self.backPageList[self.pageIndex] - newOrBackOrLoyalty = 1 - elif self.viewing == 'Loyalty': - page = self.loyaltyPageList[self.pageIndex] - newOrBackOrLoyalty = 2 + newOrBackOrSpecial = 1 + elif self.viewing == 'Special': + page = self.specialPageList[self.pageIndex] + newOrBackOrSpecial = 2 elif self.viewing == 'Emblem': page = self.emblemPageList[self.pageIndex] - newOrBackOrLoyalty = 3 + newOrBackOrSpecial = 3 page.show() for panel in self.panelDict[page.get_key()]: panel.load() @@ -293,7 +293,7 @@ class CatalogScreen(DirectFrame): pIndex = 0 randGen = random.Random() - randGen.seed(base.localAvatar.catalogScheduleCurrentWeek + (self.pageIndex << 8) + (newOrBackOrLoyalty << 16)) + randGen.seed(base.localAvatar.catalogScheduleCurrentWeek + (self.pageIndex << 8) + (newOrBackOrSpecial << 16)) for i in xrange(NUM_CATALOG_ROWS): for j in xrange(NUM_CATALOG_COLS): if pIndex < len(self.visiblePanels): @@ -308,8 +308,8 @@ class CatalogScreen(DirectFrame): if self.viewing == 'New': text = TTLocalizer.CatalogNew - elif self.viewing == 'Loyalty': - text = TTLocalizer.CatalogLoyalty + elif self.viewing == 'Special': + text = TTLocalizer.CatalogSpecial elif self.viewing == 'Backorder': text = TTLocalizer.CatalogBackorder elif self.viewing == 'Emblem': @@ -317,13 +317,13 @@ class CatalogScreen(DirectFrame): self.pageLabel['text'] = text + ' - %d' % (self.pageIndex + 1) if self.pageIndex < self.maxPageIndex: self.nextPageButton.show() - elif self.viewing == 'New' and self.numBackPages == 0 and self.numLoyaltyPages == 0: + elif self.viewing == 'New' and self.numBackPages == 0 and self.numSpecialPages == 0: self.nextPageButton.hide() - elif self.viewing == 'Backorder' and self.numLoyaltyPages == 0: + elif self.viewing == 'Backorder' and self.numSpecialPages == 0: self.nextPageButton.hide() - elif self.viewing == 'Loyalty' and self.numEmblemPages == 0: + elif self.viewing == 'Special' and self.numEmblemPages == 0: self.nextPageButton.hide() - elif self.viewing == 'Loyalty' and self.numEmblemPages > 0: + elif self.viewing == 'Special' and self.numEmblemPages > 0: self.nextPageButton.show() elif self.viewing == 'Emblem': self.nextPageButton.hide() @@ -358,7 +358,7 @@ class CatalogScreen(DirectFrame): for page in self.backPageList: page.hide() - for page in self.loyaltyPageList: + for page in self.specialPageList: page.hide() for page in self.emblemPageList: @@ -389,26 +389,26 @@ class CatalogScreen(DirectFrame): self.newCatalogButton2.show() if self.numBackPages > 0: self.backCatalogButton2.show() - if self.numLoyaltyPages > 0: - self.loyaltyCatalogButton2.show() + if self.numSpecialPages > 0: + self.specialCatalogButton2.show() if self.numEmblemPages > 0: self.emblemCatalogButton2.show() self.newCatalogButton.hide() self.backCatalogButton.hide() - self.loyaltyCatalogButton.hide() + self.specialCatalogButton.hide() self.emblemCatalogButton.hide() def hideDummyTabs(self): self.newCatalogButton2.hide() self.backCatalogButton2.hide() - self.loyaltyCatalogButton2.hide() + self.specialCatalogButton2.hide() self.emblemCatalogButton2.hide() if self.numNewPages > 0: self.newCatalogButton.show() if self.numBackPages > 0: self.backCatalogButton.show() - if self.numLoyaltyPages > 0: - self.loyaltyCatalogButton.show() + if self.numSpecialPages > 0: + self.specialCatalogButton.show() if self.numEmblemPages > 0: self.emblemCatalogButton.show() @@ -442,14 +442,14 @@ class CatalogScreen(DirectFrame): self.maxPageIndex = 0 self.numNewPages = 0 self.numBackPages = 5 - self.numLoyaltyPages = 0 + self.numSpecialPages = 0 self.viewing = 'New' self.panelList = [] self.backPanelList = [] self.pageList = [] self.backPageList = [] - self.loyaltyPanelList = [] - self.loyaltyPageList = [] + self.specialPanelList = [] + self.specialPageList = [] self.emblemPanelList = [] self.emblemPageList = [] self.panelDict = {} @@ -505,19 +505,19 @@ class CatalogScreen(DirectFrame): -0.2, 0.4), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, lift), image=backDown, pressEffect=0, command=self.showBackorderItems, text=TTLocalizer.CatalogBackorder, text_font=ToontownGlobals.getSignFont(), text_pos=(0.25 - lift, 0.132), text_scale=TTLocalizer.CSbackCatalogButton, text_fg=(0.392, 0.549, 0.627, 1.0), text2_fg=(0.392, 0.349, 0.427, 1.0)) self.backCatalogButton2.hide() - self.loyaltyCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, + self.specialCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, 0.25, -0.85, -0.3), image=[newDown, newDown, newDown, - newUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), pressEffect=0, command=self.showLoyaltyItems, text=TTLocalizer.CatalogLoyalty, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text3_pos=(1.0 - lift, 0.112), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) - self.loyaltyCatalogButton.hide() - self.loyaltyCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, + newUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), pressEffect=0, command=self.showSpecialItems, text=TTLocalizer.CatalogSpecial, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text3_pos=(1.0 - lift, 0.112), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) + self.specialCatalogButton.hide() + self.specialCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, 0.25, -0.85, - -0.3), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), image=newDown, pressEffect=0, command=self.showLoyaltyItems, text=TTLocalizer.CatalogLoyalty, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) - self.loyaltyCatalogButton2.hide() + -0.3), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), image=newDown, pressEffect=0, command=self.showSpecialItems, text=TTLocalizer.CatalogSpecial, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) + self.specialCatalogButton2.hide() self.emblemCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 1.05), frameSize=(-0.2, 0.25, -2.0, @@ -564,8 +564,8 @@ class CatalogScreen(DirectFrame): self.newCatalogButton2.component('text%d' % i).setR(90) self.backCatalogButton.component('text%d' % i).setR(90) self.backCatalogButton2.component('text%d' % i).setR(90) - self.loyaltyCatalogButton.component('text%d' % i).setR(90) - self.loyaltyCatalogButton2.component('text%d' % i).setR(90) + self.specialCatalogButton.component('text%d' % i).setR(90) + self.specialCatalogButton2.component('text%d' % i).setR(90) self.emblemCatalogButton.component('text%d' % i).setR(90) self.emblemCatalogButton2.component('text%d' % i).setR(90) @@ -609,8 +609,8 @@ class CatalogScreen(DirectFrame): continue if isMaxBankOffered and item in allBankItems and item.furnitureType != CatalogFurnitureItem.MaxBankId: continue - if item.loyaltyRequirement() != 0: - self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) + if item.getIsSpecial(): + self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) elif item.getEmblemPrices(): self.emblemPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly, parentCatalogScreen=self)) else: @@ -627,8 +627,8 @@ class CatalogScreen(DirectFrame): continue if isMaxBankOffered and item in allBankItems and item.furnitureType != CatalogFurnitureItem.MaxBankId: continue - if item.loyaltyRequirement() != 0: - self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) + if item.getIsSpecial(): + self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) elif item.getEmblemPrices(): self.emblemPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder, parentCatalogScreen=self)) else: @@ -638,8 +638,8 @@ class CatalogScreen(DirectFrame): self.setNumNewPages(numPages) numPages = self.packPages(self.backPanelList, self.backPageList, 'back') self.setNumBackPages(numPages) - numPages = self.packPages(self.loyaltyPanelList, self.loyaltyPageList, 'loyalty') - self.setNumLoyaltyPages(numPages) + numPages = self.packPages(self.specialPanelList, self.specialPageList, 'special') + self.setNumSpecialPages(numPages) numPages = self.packPages(self.emblemPanelList, self.emblemPageList, 'emblem') self.setNumEmblemPages(numPages) currentWeek = base.localAvatar.catalogScheduleCurrentWeek - 1 @@ -752,7 +752,7 @@ class CatalogScreen(DirectFrame): self.clarabelleFrame.setPosHprScale(-0.01, 0.0, -0.01, 0.0, 0.0, 0.0, 1.02, 1.0, 1.02) def reload(self): - for panel in self.panelList + self.backPanelList + self.loyaltyPanelList + self.emblemPanelList: + for panel in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: panel.destroy() def priceSort(a, b, type): @@ -764,23 +764,23 @@ class CatalogScreen(DirectFrame): self.maxPageIndex = 0 self.numNewPages = 0 self.numBackPages = 5 - self.numLoyaltyPages = 0 + self.numSpecialPages = 0 self.viewing = 'New' self.panelList = [] self.backPanelList = [] - self.loyaltyList = [] + self.specialList = [] self.pageList = [] self.backPageList = [] - self.loyaltyPanelList = [] - self.loyaltyPageList = [] + self.specialPanelList = [] + self.specialPageList = [] self.panelDict = {} self.visiblePanels = [] itemList = base.localAvatar.monthlyCatalog + base.localAvatar.weeklyCatalog itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeWeekly)) itemList.reverse() for item in itemList: - if item.loyaltyRequirement() != 0: - self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) + if item.getIsSpecial(): + self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) else: self.panelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly)) @@ -788,8 +788,8 @@ class CatalogScreen(DirectFrame): itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeBackorder)) itemList.reverse() for item in itemList: - if item.loyaltyRequirement() != 0: - self.loyaltyPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeLoyalty, parentCatalogScreen=self)) + if item.getIsSpecial(): + self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) else: self.backPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder)) @@ -797,8 +797,8 @@ class CatalogScreen(DirectFrame): self.setNumNewPages(numPages) numPages = self.packPages(self.backPanelList, self.backPageList, 'back') self.setNumBackPages(numPages) - numPages = self.packPages(self.loyaltyPanelList, self.loyaltyPageList, 'loyalty') - self.setNumLoyaltyPages(numPages) + numPages = self.packPages(self.specialPanelList, self.specialPageList, 'special') + self.setNumSpecialPages(numPages) seriesNumber = (base.localAvatar.catalogScheduleCurrentWeek - 1) / ToontownGlobals.CatalogNumWeeksPerSeries + 1 self.catalogSeries['text'] = Localizer.CatalogSeriesLabel % seriesNumber weekNumber = (base.localAvatar.catalogScheduleCurrentWeek - 1) % ToontownGlobals.CatalogNumWeeksPerSeries + 1 @@ -820,7 +820,7 @@ class CatalogScreen(DirectFrame): self.destroy() del self.base del self.squares - for panel in self.panelList + self.backPanelList + self.loyaltyPanelList + self.emblemPanelList: + for panel in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: panel.destroy() del self.panelList @@ -838,8 +838,8 @@ class CatalogScreen(DirectFrame): del self.newCatalogButton2 del self.backCatalogButton del self.backCatalogButton2 - del self.loyaltyCatalogButton - del self.loyaltyCatalogButton2 + del self.specialCatalogButton + del self.specialCatalogButton2 del self.pageLabel if self.createdGiftGui: del self.giftToggle @@ -878,8 +878,8 @@ class CatalogScreen(DirectFrame): self.newCatalogButton2.hide() self.backCatalogButton.hide() self.backCatalogButton2.hide() - self.loyaltyCatalogButton.hide() - self.loyaltyCatalogButton2.hide() + self.specialCatalogButton.hide() + self.specialCatalogButton2.hide() self.emblemCatalogButton.hide() self.emblemCatalogButton2.hide() self.hangup.hide() @@ -901,7 +901,7 @@ class CatalogScreen(DirectFrame): self.__giftToggle() if hasattr(self, 'beanBank'): self.beanBank['text'] = str(base.localAvatar.getTotalMoney()) - for item in self.panelList + self.backPanelList + self.loyaltyPanelList + self.emblemPanelList: + for item in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: if type(item) != type(''): item.updateButtons(self.gifting) diff --git a/toontown/estate/DistributedPhoneAI.py b/toontown/estate/DistributedPhoneAI.py index 12c6851f..7c91051f 100755 --- a/toontown/estate/DistributedPhoneAI.py +++ b/toontown/estate/DistributedPhoneAI.py @@ -151,7 +151,7 @@ class DistributedPhoneAI(DistributedFurnitureItemAI): if isinstance(item, CatalogInvalidItem.CatalogInvalidItem): self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item') self.notify.warning('%d tried purchasing invalid item' % avId) - return ToontownGlobals.P_NotInCatalog + return ToontownGlobals.P_NotInCatalog elif (not item.hasEmblemPrices()) and item not in av.backCatalog and item not in av.weeklyCatalog and item not in av.monthlyCatalog: self.air.writeServerEvent('suspicious', avId, 'tried purchasing non-existing item') self.notify.warning('%d tried purchasing non-existing item' % avId) diff --git a/toontown/toon/LocalToon.py b/toontown/toon/LocalToon.py index b54d601c..117f19fd 100755 --- a/toontown/toon/LocalToon.py +++ b/toontown/toon/LocalToon.py @@ -1662,9 +1662,6 @@ class LocalToon(DistributedToon.DistributedToon, LocalAvatar.LocalAvatar): def setPinkSlips(self, pinkSlips): DistributedToon.DistributedToon.setPinkSlips(self, pinkSlips) self.inventory.updateTotalPropsText() - - def getAccountDays(self): - return base.cr.accountDateMgr.getAccountDays() def hasActiveBoardingGroup(self): if hasattr(localAvatar, 'boardingParty') and localAvatar.boardingParty: diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index c924d2f8..a101d7d0 100755 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5451,7 +5451,7 @@ CatalogCurrency = 'beans' CatalogHangUp = 'Hang Up' CatalogNew = 'NEW' CatalogBackorder = 'BACKORDER' -CatalogLoyalty = 'SPECIAL' +CatalogSpecial = 'SPECIAL' CatalogEmblem = 'EMBLEM' CatalogPagePrefix = 'Page' CatalogGreeting = "Hello! Thanks for calling Clarabelle's Cattlelog. Can I help you?" @@ -8133,7 +8133,6 @@ ElevatorLawBotCourse0 = 'Office A' ElevatorLawBotCourse1 = 'Office B' ElevatorLawBotCourse2 = 'Office C' ElevatorLawBotCourse3 = 'Office D' -DaysToGo = 'Wait\n%s Days' IceGameTitle = 'Ice Slide' IceGameInstructions = 'Get as close to the center by the end of the second round. Use arrow keys to change direction and force. Press Ctrl to launch your toon. Hit barrels for extra points and avoid the TNT!' IceGameInstructionsNoTnt = 'Get as close to the center by the end of the second round. Use arrow keys to change direction and force. Press Ctrl to launch your toon. Hit barrels for extra points.' diff --git a/toontown/uberdog/ClientServicesManagerUD.py b/toontown/uberdog/ClientServicesManagerUD.py index f2d49683..6c11f7a7 100755 --- a/toontown/uberdog/ClientServicesManagerUD.py +++ b/toontown/uberdog/ClientServicesManagerUD.py @@ -329,7 +329,7 @@ class LoginAccountFSM(OperationFSM): 'ACCOUNT_AV_SET': [0] * 6, 'ESTATE_ID': 0, 'ACCOUNT_AV_SET_DEL': [], - 'CREATED': time.ctime(), + 'CREATED': time.time(), 'LAST_LOGIN': time.ctime(), 'LAST_LOGIN_TS': time.time(), 'ACCOUNT_ID': str(self.userId), From 7ef12e079a58bb9c4885e24cb9532ec41fda0538 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 23 Jul 2015 23:03:22 +0300 Subject: [PATCH 085/161] ctime --- dependencies/astron/dclass/stride.dc | 2 +- toontown/uberdog/ClientServicesManagerUD.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index ddf3b618..78b450a7 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -27,7 +27,7 @@ dclass Account { uint32 ACCOUNT_AV_SET[] required db; uint32 ESTATE_ID db; AvatarPendingDel ACCOUNT_AV_SET_DEL[] db; - uint64 CREATED db; + string CREATED db; string LAST_LOGIN db; string ACCOUNT_ID db; uint16 ACCESS_LEVEL db; diff --git a/toontown/uberdog/ClientServicesManagerUD.py b/toontown/uberdog/ClientServicesManagerUD.py index 6c11f7a7..f2d49683 100755 --- a/toontown/uberdog/ClientServicesManagerUD.py +++ b/toontown/uberdog/ClientServicesManagerUD.py @@ -329,7 +329,7 @@ class LoginAccountFSM(OperationFSM): 'ACCOUNT_AV_SET': [0] * 6, 'ESTATE_ID': 0, 'ACCOUNT_AV_SET_DEL': [], - 'CREATED': time.time(), + 'CREATED': time.ctime(), 'LAST_LOGIN': time.ctime(), 'LAST_LOGIN_TS': time.time(), 'ACCOUNT_ID': str(self.userId), From c6db0b82d896cb296a75eb70dd87856924bf6d90 Mon Sep 17 00:00:00 2001 From: Loudrob Date: Thu, 23 Jul 2015 16:17:43 -0400 Subject: [PATCH 086/161] fuck dicks --- toontown/catalog/CatalogGenerator.py | 191 ++++++++++++++++++--------- 1 file changed, 132 insertions(+), 59 deletions(-) diff --git a/toontown/catalog/CatalogGenerator.py b/toontown/catalog/CatalogGenerator.py index 40752063..00ab9751 100755 --- a/toontown/catalog/CatalogGenerator.py +++ b/toontown/catalog/CatalogGenerator.py @@ -12,8 +12,8 @@ from CatalogMouldingItem import CatalogMouldingItem, getAllMouldings from CatalogWainscotingItem import CatalogWainscotingItem, getAllWainscotings from CatalogWindowItem import CatalogWindowItem from CatalogPoleItem import nextAvailablePole, getAllPoles -from CatalogTankItem import nextAvailableTank, getAllTanks from CatalogPetTrickItem import CatalogPetTrickItem, getAllPetTricks +from CatalogTankItem import nextAvailableTank, getAllTanks from CatalogGardenItem import CatalogGardenItem from CatalogToonStatueItem import CatalogToonStatueItem from CatalogRentalItem import CatalogRentalItem @@ -26,7 +26,7 @@ from toontown.toonbase import ToontownGlobals import types import random import time -from panda3d.core import * +from pandac.PandaModules import * MetaItems = {100: getAllClothes(101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 111, 115, 201, 202, 203, 204, 205, 206, 207, 208, 209, 209, 211, 215), 300: getAllClothes(301, 302, 303, 304, 305, 308, 401, 403, 404, 405, 407, 451, 452, 453), 2000: getChatRange(0, 1999), @@ -41,25 +41,20 @@ MetaItems = {100: getAllClothes(101, 102, 103, 104, 105, 106, 107, 108, 109, 109 2921: getChatRange(12050, 12099), 2930: getChatRange(13000, 13099), 2940: getChatRange(14000, 14099), - 3000: getWallpapers(1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100), 3010: getWallpapers(2200, 2300, 2400, 2500, 2600, 2700, 2800), 3020: getWallpapers(2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600), 3030: getWallpapers(3700, 3800, 3900), - 3500: getAllWainscotings(1000, 1010), 3510: getAllWainscotings(1020), 3520: getAllWainscotings(1030), 3530: getAllWainscotings(1040), - 4000: getFloorings(1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090, 1100), 4010: getFloorings(1110, 1120, 1130), 4020: getFloorings(1140, 1150, 1160, 1170, 1180, 1190), - 4500: getAllMouldings(1000, 1010), 4510: getAllMouldings(1020, 1030, 1040), 4520: getAllMouldings(1070), - 5000: getAllPetTricks()} MetaItemChatKeysSold = (2000, 2010, @@ -401,7 +396,29 @@ MonthlySchedule = ((7, 15, 8, 15, + 2010, + 2010, ((4, 2940),)), + (9, + 1, + 9, + 30, + (CatalogGardenItem(135, 1),)), + (1, + 1, + 1, + 31, + (CatalogGardenItem(135, 1),)), + (4, + 1, + 4, + 30, + (CatalogGardenItem(135, 1),)), + (6, + 1, + 6, + 30, + (CatalogGardenItem(135, 1),)), (6, 26, 7, @@ -460,16 +477,22 @@ MonthlySchedule = ((7, 9, 7, 15, + 2010, + 2010, (CatalogClothingItem(1751, 0),)), (6, 14, 7, 15, + 2010, + 2010, (CatalogClothingItem(1754, 0), CatalogClothingItem(1755, 0), CatalogClothingItem(1756, 0))), (7, 21, 8, 17, + 2010, + 2010, (CatalogClothingItem(1749, 0), CatalogClothingItem(1750, 0), CatalogClothingItem(1757, 0), @@ -478,6 +501,8 @@ MonthlySchedule = ((7, 25, 9, 21, + 2010, + 2010, (CatalogClothingItem(1763, 0),)), (6, 5, @@ -488,43 +513,48 @@ MonthlySchedule = ((7, 1, 12, 31, - ( - CatalogGardenItem(100, 1), + (CatalogGardenItem(100, 1), CatalogGardenItem(101, 1), CatalogGardenItem(103, 1), CatalogGardenItem(104, 1), CatalogToonStatueItem(105, endPoseIndex=108), CatalogRentalItem(1, 2880, 1000), - CatalogRentalItem(2, 2890, 1000), CatalogGardenStarterItem(), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), - CatalogFurnitureItem(1532), + CatalogFurnitureItem(1532), + CatalogNametagItem(15), + CatalogNametagItem(16), + CatalogNametagItem(17), + CatalogClothingItem(1608, 0, True), CatalogClothingItem(1605, 0, True), CatalogClothingItem(1602, 0, True), + CatalogClothingItem(1607, 0, True), CatalogClothingItem(1604, 0, True), CatalogClothingItem(1601, 0, True), + CatalogClothingItem(1606, 0, True), CatalogClothingItem(1603, 0, True), CatalogClothingItem(1600, 0, True), + CatalogEmoteItem(25, True), + CatalogEmoteItem(26, True), CatalogEmoteItem(20, True), CatalogEmoteItem(21, True), CatalogEmoteItem(22, True), CatalogEmoteItem(23, True), - CatalogEmoteItem(24, True), - CatalogEmoteItem(25, True), - CatalogEmoteItem(26, True), - CatalogNametagItem(15, True), - CatalogNametagItem(16, True), - CatalogNametagItem(17, True))), + CatalogEmoteItem(24, True))), (5, 26, 6, 30, + 2013, + 2013, (CatalogAccessoryItem(175),)), (8, 27, 9, 5, + 2013, + 2013, ((3, 2900), CatalogChatItem(10003), CatalogClothingItem(1001, 0), @@ -574,6 +604,8 @@ MonthlySchedule = ((7, 3, 9, 12, + 2013, + 2013, ((3, 2910), CatalogFurnitureItem(680), CatalogFurnitureItem(681), @@ -608,6 +640,8 @@ MonthlySchedule = ((7, 20, 9, 19, + 2013, + 2013, (CatalogAccessoryItem(101), CatalogAccessoryItem(103), CatalogAccessoryItem(117), @@ -830,9 +864,7 @@ WeeklySchedule = ((100, CatalogFurnitureItem(1000), CatalogClothingItem(117, 0), CatalogClothingItem(217, 0), - nextAvailableCloset, - nextAvailableBank, - nextAvailableTank), + nextAvailableCloset), (100, (5, 2000), CatalogFurnitureItem(1430), @@ -1353,7 +1385,7 @@ WeeklySchedule = ((100, Sale(CatalogClothingItem(116, 0), CatalogClothingItem(216, 0), CatalogClothingItem(408, 0), CatalogClothingItem(117, 0), CatalogClothingItem(217, 0), CatalogClothingItem(409, 0), CatalogClothingItem(118, 0), CatalogClothingItem(218, 0), CatalogClothingItem(410, 0), CatalogClothingItem(119, 0), CatalogClothingItem(219, 0), CatalogClothingItem(120, 0), CatalogClothingItem(220, 0), CatalogClothingItem(121, 0), CatalogClothingItem(221, 0), CatalogClothingItem(222, 0), CatalogClothingItem(123, 0), CatalogClothingItem(224, 0), CatalogClothingItem(411, 0), CatalogClothingItem(311, 0), CatalogClothingItem(310, 0)), Sale(CatalogWindowItem(40), CatalogWindowItem(70), CatalogWindowItem(50), CatalogWindowItem(60), CatalogWindowItem(80), CatalogWindowItem(100), CatalogWindowItem(90), CatalogWindowItem(110)), Sale(CatalogEmoteItem(5), CatalogEmoteItem(9), CatalogEmoteItem(13), CatalogEmoteItem(11), CatalogEmoteItem(6), CatalogEmoteItem(8), CatalogNametagItem(10)), - Sale(CatalogFurnitureItem(600), CatalogFurnitureItem(610), CatalogFurnitureItem(620), CatalogFurnitureItem(630), CatalogFurnitureItem(640), CatalogFurnitureItem(650), CatalogFurnitureItem(660), CatalogFurnitureItem(900), CatalogFurnitureItem(910), CatalogFurnitureItem(920), CatalogFurnitureItem(930), CatalogFurnitureItem(940), CatalogFurnitureItem(1000), CatalogFurnitureItem(1010), CatalogFurnitureItem(1020), CatalogFurnitureItem(1030), CatalogFurnitureItem(1400), CatalogFurnitureItem(1410), CatalogFurnitureItem(1420), CatalogFurnitureItem(1430), CatalogFurnitureItem(1440), CatalogFurnitureItem(1441), CatalogFurnitureItem(1442), CatalogFurnitureItem(1443), CatalogFurnitureItem(1500), CatalogFurnitureItem(1510), CatalogFurnitureItem(1520), CatalogFurnitureItem(1530), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), CatalogFurnitureItem(1600), CatalogFurnitureItem(1610), CatalogFurnitureItem(1620), CatalogFurnitureItem(1630), CatalogFurnitureItem(1640), CatalogFurnitureItem(1650), CatalogFurnitureItem(1660), CatalogFurnitureItem(1661), CatalogFurnitureItem(1710), CatalogFurnitureItem(1800), CatalogFurnitureItem(1810), CatalogFurnitureItem(1900), CatalogFurnitureItem(1910)), + Sale(CatalogFurnitureItem(600), CatalogFurnitureItem(610), CatalogFurnitureItem(620), CatalogFurnitureItem(630), CatalogFurnitureItem(640), CatalogFurnitureItem(650), CatalogFurnitureItem(660), CatalogFurnitureItem(900), CatalogFurnitureItem(910), CatalogFurnitureItem(920), CatalogFurnitureItem(930), CatalogFurnitureItem(940), CatalogFurnitureItem(1000), CatalogFurnitureItem(1010), CatalogFurnitureItem(1020), CatalogFurnitureItem(1030), CatalogFurnitureItem(1400), CatalogFurnitureItem(1410), CatalogFurnitureItem(1420), CatalogFurnitureItem(1430), CatalogFurnitureItem(1440), CatalogFurnitureItem(1441), CatalogFurnitureItem(1442), CatalogFurnitureItem(1443), CatalogFurnitureItem(1500), CatalogFurnitureItem(1510), CatalogFurnitureItem(1520), CatalogFurnitureItem(1530), CatalogFurnitureItem(1600), CatalogFurnitureItem(1531), CatalogFurnitureItem(1532), CatalogFurnitureItem(1610), CatalogFurnitureItem(1620), CatalogFurnitureItem(1630), CatalogFurnitureItem(1640), CatalogFurnitureItem(1650), CatalogFurnitureItem(1660), CatalogFurnitureItem(1661), CatalogFurnitureItem(1710), CatalogFurnitureItem(1800), CatalogFurnitureItem(1810), CatalogFurnitureItem(1900), CatalogFurnitureItem(1910)), (300, (1, 2020), (2, 2030), @@ -1480,9 +1512,12 @@ class CatalogGenerator: def __init__(self): self.__itemLists = {} + self.__releasedItemLists = {} - if config.GetBool('save-catalog-schedule', False): - self.outputSchedule('catalog-schedule.txt') + def getReleasedCatalogList(self, weekStart): + dayNumber = int(weekStart / (24 * 60)) + itemLists = self.__getReleasedItemLists(dayNumber, weekStart) + return itemLists def generateMonthlyCatalog(self, avatar, weekStart): dayNumber = int(weekStart / (24 * 60)) @@ -1512,13 +1547,12 @@ class CatalogGenerator: if nextAvailableCloset not in schedule: weeklyCatalog += self.__selectItem(avatar, nextAvailableCloset, monthlyCatalog, saleItem=0) - + if nextAvailableBank not in schedule: - weeklyCatalog += self.__selectItem(avatar, nextAvailableBank, monthlyCatalog, saleItem=0) - + weeklyCatalog += self.__selectItem(avatar, nextAvailableBank, monthlyCatalog, saleItem = 0) if nextAvailableTank not in schedule: - weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem=0) - if True: + weeklyCatalog += self.__selectItem(avatar, nextAvailableTank, monthlyCatalog, saleItem = 0) + if time.time() < 1096617600.0: def hasPetTrick(catalog): for item in catalog: @@ -1528,6 +1562,7 @@ class CatalogGenerator: return 0 if not hasPetTrick(weeklyCatalog) and not hasPetTrick(avatar.weeklyCatalog) and not hasPetTrick(avatar.backCatalog): + self.notify.debug('Artificially adding pet trick to catalog') weeklyCatalog += self.__selectItem(avatar, 5000, monthlyCatalog, saleItem=saleItem) self.notify.debug('Generated catalog: %s' % weeklyCatalog) return weeklyCatalog @@ -1557,12 +1592,45 @@ class CatalogGenerator: return backCatalog + def __getReleasedItemLists(self, dayNumber, weekStart): + itemLists = self.__releasedItemLists.get(dayNumber) + if itemLists != None: + return itemLists + else: + self.__releasedItemLists.clear() + testDaysAhead = simbase.config.GetInt('test-server-holiday-days-ahead', 0) + nowtuple = time.localtime(weekStart * 60 + testDaysAhead * 24 * 60 * 60) + year = nowtuple[0] + month = nowtuple[1] + day = nowtuple[2] + itemLists = [] + for monthlyItems in MonthlySchedule: + startMM = monthlyItems[0] + startDD = monthlyItems[1] + endMM = monthlyItems[2] + endDD = monthlyItems[3] + if len(monthlyItems) == 7: + startYYYY = monthlyItems[4] + endYYYY = monthlyItems[5] + list = monthlyItems[6] + else: + startYYYY = 1969 + endYYYY = year + list = monthlyItems[4] + pastStart = year > startYYYY or (year == startYYYY and (month > startMM or (month == startMM and day >= startDD))) + if pastStart: + itemLists.append(list) + + self.__releasedItemLists[dayNumber] = itemLists + return itemLists + def __getMonthlyItemLists(self, dayNumber, weekStart): itemLists = self.__itemLists.get(dayNumber) if itemLists != None: return itemLists - testDaysAhead = config.GetInt('test-server-holiday-days-ahead', 0) + testDaysAhead = simbase.config.GetInt('test-server-holiday-days-ahead', 0) nowtuple = time.localtime(weekStart * 60 + testDaysAhead * 24 * 60 * 60) + year = nowtuple[0] month = nowtuple[1] day = nowtuple[2] self.notify.debug('Generating seasonal itemLists for %s/%s.' % (month, day)) @@ -1572,9 +1640,16 @@ class CatalogGenerator: startDD = monthlyItems[1] endMM = monthlyItems[2] endDD = monthlyItems[3] - list = monthlyItems[4] - pastStart = month > startMM or (month == startMM and day >= startDD) - beforeEnd = month < endMM or (month == endMM and day <= endDD) + if len(monthlyItems) == 7: + startYYYY = monthlyItems[4] + endYYYY = monthlyItems[5] + list = monthlyItems[6] + else: + startYYYY = 1969 + endYYYY = year + list = monthlyItems[4] + pastStart = year >= startYYYY and (month > startMM or (month == startMM and day >= startDD)) + beforeEnd = year <= endYYYY and (month < endMM or (month == endMM and day <= endDD)) if endMM < startMM: if pastStart or beforeEnd: itemLists.append(list) @@ -1705,33 +1780,31 @@ class CatalogGenerator: def __recordSchedule(self, sched, weekCode, schedule): if isinstance(schedule, Sale): schedule = schedule.args - try: - for item in list(schedule): - if callable(item): - if item == nextAvailablePole: - item = getAllPoles() - elif item == nextAvailableCloset: - item = getAllClosets() - elif item == nextAvailableBank: - item = getAllBanks() - elif item == nextAvailableTank: - item = getAllTanks() - elif item == get50ItemCloset: - item = getMaxClosets() - else: - self.notify.warning("Don't know how to interpret function " % repr(name)) - item = None - elif isinstance(item, types.TupleType): - item = item[1] - if isinstance(item, types.IntType): - item = MetaItems[item] - if isinstance(item, CatalogItem.CatalogItem): - self.__recordScheduleItem(sched, weekCode, None, item) - elif item != None: - for i in item: - self.__recordScheduleItem(sched, None, weekCode, i) - except: - print 'Wrong: %s' % schedule + for item in schedule: + if callable(item): + if item == nextAvailablePole: + item = getAllPoles() + elif item == nextAvailableCloset: + item = getAllClosets() + elif item == nextAvailableBank: + item = getAllBanks() + elif item == nextAvailableTank: + item == getAllTanks() + elif item == get50ItemCloset: + item = getMaxClosets() + else: + self.notify.warning("Don't know how to interpret function " % repr(name)) + item = None + elif isinstance(item, types.TupleType): + item = item[1] + if isinstance(item, types.IntType): + item = MetaItems[item] + if isinstance(item, CatalogItem.CatalogItem): + self.__recordScheduleItem(sched, weekCode, None, item) + elif item != None: + for i in item: + self.__recordScheduleItem(sched, None, weekCode, i) + return def __recordScheduleItem(self, sched, weekCode, maybeWeekCode, item): From 14ff72705271469bfde4938bf39a0629bd1d3663 Mon Sep 17 00:00:00 2001 From: John Cote Date: Thu, 23 Jul 2015 16:29:56 -0400 Subject: [PATCH 087/161] correct delivery times --- toontown/catalog/CatalogAccessoryItem.py | 3 +++ toontown/catalog/CatalogClothingItem.py | 2 +- toontown/catalog/CatalogFurnitureItem.py | 2 +- toontown/catalog/CatalogPoleItem.py | 2 +- toontown/catalog/CatalogSurfaceItem.py | 2 +- toontown/catalog/CatalogWindowItem.py | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/toontown/catalog/CatalogAccessoryItem.py b/toontown/catalog/CatalogAccessoryItem.py index e71d6544..d8f371e1 100755 --- a/toontown/catalog/CatalogAccessoryItem.py +++ b/toontown/catalog/CatalogAccessoryItem.py @@ -174,6 +174,9 @@ class CatalogAccessoryItem(CatalogItem.CatalogItem): avatar.d_catalogGenAccessories() return ToontownGlobals.P_ItemAvailable + def getDeliveryTime(self): + return 60 + def getPicture(self, avatar): model = self.loadModel() spin = 1 diff --git a/toontown/catalog/CatalogClothingItem.py b/toontown/catalog/CatalogClothingItem.py index c13d5362..fad58596 100755 --- a/toontown/catalog/CatalogClothingItem.py +++ b/toontown/catalog/CatalogClothingItem.py @@ -417,7 +417,7 @@ class CatalogClothingItem(CatalogItem.CatalogItem): return ToontownGlobals.P_ItemAvailable def getDeliveryTime(self): - return 1 + return 60 def getPicture(self, avatar): from toontown.toon import Toon diff --git a/toontown/catalog/CatalogFurnitureItem.py b/toontown/catalog/CatalogFurnitureItem.py index c76d35fd..268ad292 100755 --- a/toontown/catalog/CatalogFurnitureItem.py +++ b/toontown/catalog/CatalogFurnitureItem.py @@ -1014,7 +1014,7 @@ class CatalogFurnitureItem(CatalogAtticItem.CatalogAtticItem): return retcode def getDeliveryTime(self): - return 1 + return 24 * 60 def getPicture(self, avatar): model = self.loadModel(animate=0) diff --git a/toontown/catalog/CatalogPoleItem.py b/toontown/catalog/CatalogPoleItem.py index 294bb23e..5a41d897 100755 --- a/toontown/catalog/CatalogPoleItem.py +++ b/toontown/catalog/CatalogPoleItem.py @@ -41,7 +41,7 @@ class CatalogPoleItem(CatalogItem.CatalogItem): return 0 def getDeliveryTime(self): - return 1 + return 24 * 60 def getPicture(self, avatar): rodPath = FishGlobals.RodFileDict.get(self.rodId) diff --git a/toontown/catalog/CatalogSurfaceItem.py b/toontown/catalog/CatalogSurfaceItem.py index 97f49aca..83d6ac54 100755 --- a/toontown/catalog/CatalogSurfaceItem.py +++ b/toontown/catalog/CatalogSurfaceItem.py @@ -30,4 +30,4 @@ class CatalogSurfaceItem(CatalogAtticItem.CatalogAtticItem): return retcode def getDeliveryTime(self): - return 1 + return 60 diff --git a/toontown/catalog/CatalogWindowItem.py b/toontown/catalog/CatalogWindowItem.py index 192f97bf..e9d0308d 100755 --- a/toontown/catalog/CatalogWindowItem.py +++ b/toontown/catalog/CatalogWindowItem.py @@ -43,7 +43,7 @@ class CatalogWindowItem(CatalogAtticItem.CatalogAtticItem): return retcode def getDeliveryTime(self): - return 1 + return 4 * 60 def getPicture(self, avatar): frame = self.makeFrame() From 987d828d599d4789139de1481cadc946ac6030ef Mon Sep 17 00:00:00 2001 From: John Cote Date: Fri, 24 Jul 2015 20:02:48 -0400 Subject: [PATCH 088/161] dclass: Change uint64 to uint32 for LAST_LOGIN_TS entry. --- dependencies/astron/dclass/stride.dc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/astron/dclass/stride.dc b/dependencies/astron/dclass/stride.dc index 78b450a7..624b9f57 100644 --- a/dependencies/astron/dclass/stride.dc +++ b/dependencies/astron/dclass/stride.dc @@ -31,7 +31,7 @@ dclass Account { string LAST_LOGIN db; string ACCOUNT_ID db; uint16 ACCESS_LEVEL db; - uint64 LAST_LOGIN_TS db; + uint32 LAST_LOGIN_TS db; }; struct BarrierData { From b1df3556b61adec70e0ba9288fcaf8445e9e0713 Mon Sep 17 00:00:00 2001 From: tts Date: Fri, 24 Jul 2015 19:42:49 -0400 Subject: [PATCH 089/161] adjust permissions so that we may execute the files --- dependencies/astron/astrond | Bin dependencies/astron/prod/start-ai-server.sh | 0 dependencies/astron/prod/start-astron-cluster.sh | 0 dependencies/astron/prod/start-uberdog-server.sh | 0 dependencies/libpandadna.pyd | Bin dependencies/libpandadna.so | Bin 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 dependencies/astron/astrond mode change 100644 => 100755 dependencies/astron/prod/start-ai-server.sh mode change 100644 => 100755 dependencies/astron/prod/start-astron-cluster.sh mode change 100644 => 100755 dependencies/astron/prod/start-uberdog-server.sh mode change 100644 => 100755 dependencies/libpandadna.pyd mode change 100644 => 100755 dependencies/libpandadna.so diff --git a/dependencies/astron/astrond b/dependencies/astron/astrond old mode 100644 new mode 100755 diff --git a/dependencies/astron/prod/start-ai-server.sh b/dependencies/astron/prod/start-ai-server.sh old mode 100644 new mode 100755 diff --git a/dependencies/astron/prod/start-astron-cluster.sh b/dependencies/astron/prod/start-astron-cluster.sh old mode 100644 new mode 100755 diff --git a/dependencies/astron/prod/start-uberdog-server.sh b/dependencies/astron/prod/start-uberdog-server.sh old mode 100644 new mode 100755 diff --git a/dependencies/libpandadna.pyd b/dependencies/libpandadna.pyd old mode 100644 new mode 100755 diff --git a/dependencies/libpandadna.so b/dependencies/libpandadna.so old mode 100644 new mode 100755 From cb422fd46bb69f52d371ea32705b27337de72075 Mon Sep 17 00:00:00 2001 From: tts Date: Fri, 24 Jul 2015 19:45:15 -0400 Subject: [PATCH 090/161] astron: add the centos one --- dependencies/astron/astrond | Bin 1958544 -> 2872026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dependencies/astron/astrond b/dependencies/astron/astrond index 3ea7dc90ce1009524a9b1f6cb7a949cb6acc04c0..a1bf9fab5745b88aae829ec29141f57fdfb33db0 100755 GIT binary patch literal 2872026 zcma&u2{_dK8$bHbjKSDvY$0k0SwkdI8jO-u){;_WNwiQZ?L(AAmMGfn5|y;?jir({ zv}sXVY2WwlyuVK$=kNT^b*}5&*Y$ed@B5yi<;l{z%H3-eo5hkMblAk1u+XDkjrs2) zr1#E=2DA|(Bo0Il|J5h`hzzdMAf%59Y3s>v%qzq6B=_G+m@kk64(xvi2e$CP(v!OX z&ZH;ltNHKi#(a7IXN0u=%d?IK|Lr|Vh~U4Sd3omR+Cm?1aZLK}-jk_1|E)w4|1W!9 zj``{_FBdiP-|LMU`S0a=GM0G)rYC#8eayFw;ZGm;XA7}0yO0SY`tQI0CzX+3LXj z7+@Zs!Oh(|@5obWy#XpEthbTt(v|j4k-{rj$Gif(pbFx&FsVpnGMk&#mp7klO{zG2 zGh%3vC`H^&_*&d7Vv{VeVJC@O1zYwB5+AE_+ugl6$}_B4#6=*&_lkZUKTuUoJj$Cy zFEqKEtazMdZltCq-~{3eP*x?mgnv;S-L4cGLFD|^qACp6$q^QZbxJ4`=8`L68H^IH z5gQV3c_BA^j5iUgaBT?NKp>D8sC#hN@w|)KysUliOyrW=#Jn(`5z&+;Nn^M0lZc3` z&mt@jd^-%iiK|CqKRJ#nugX&r>f&M$!r==@w7S7sv5@T|R?XB%JKk=gDM-#TwNFm+ zkRwGhe0ictgqnOG3n{KdtSP|T3QwBL*;y7HQazl_mRHnP%;B)S1+oI6Uw*8DXgNtv zeaLyI##$pzMre(<7G)a5j{$i7wqE=Bdn)sQG@G+&je;d0WXMV;_Ce7#+^tKO>4=k;GFNW$chncp>JjZSqswy>m&pB*jBS zSS8-XK^fnJIdxP0XE6U;#hu)1Y(ZHvU#i?t_;}p%`qd(V$be*9dx&&}{n$g3iH<3VN9>i=FXaU!TFI)r$~Wlh?zZE~RS4yz4z;=4Tr$Yi7PgAg9Eu2w zZ{tTChYyn`M#Mu;iiB+0MXbfCE+j~x#r8K49xn0m$`#a&G2n{XMcRa=#gH{>c`qOD344G1~+i707t zIA#9cE!JghMKQ-@hPsk~NON6vSnids`ISW4U0+C*d%bhdOKAy-<97dU_)(I_~hOnAm(;ncBfqE!PcxB`LwYB!I;95#!~7P5(Sexe*n zoU~T$$vs|Wjubapu}sC1lh)W*Kh;Ac=qTTfKi$|+UXaI=c71p%KP-pjClR4oUd)#C zQ6$7@D87{$+N%`>PsuAA4{@qc-i@Uya3DfuDGkpg6P7Sr+QXWt3hQO$dDLZs`TIy&Ly{u?CjyPg32=0HN-v3h#0wwl!b(NPTXDOUaDRDzV&bD$??nlV%wzu$#nLimCN7B|;$&@5A^h19TEi2=OMV z0s(i%ez~M3b@HN8YRx`<*)?3%N&{CO-h90Kk+7U1RbE5#aN?3KCo9Jh_-hN2rL`0j z#bpA4h{Lh9=CX)@2vqsIW!U~EKAIY2{V)OX)?O20B_j~H7WW|o5(Oi8Q^hPz3nGml zm<_7FJh6_ni&!XN39Z>;PZNBFvV^yJWa9+R2y>1!OWd+nC{n6mwdcFtl4o-?xGqI$ zsd7nN9!o4C9HB{zI`c(3;{7>WUce?ZSS<#_TUZ<-$kiYMw%CM7jC7B>O4x#nMFKUE zjGZ7t%T!-OBCReC@#ZD-xQ$9uM;+vhpXN;rAtoH5ccUOWHiUSbOqBLaZo+rIpIs_Z zytHQl5vTT&^=Psjl$>F+$bA%=25RO=#9k0cfFY@M!vx?gCi=>E*m^2fT%-cDh zM6-yH=VG12wvZdJPq^PxPL{o8us~_Vt|-1VyHTvSdTGpWQQaf@chnk zvN&Q9kzwPVppdWz8gS}D?KFrYOKfK#;EAjgbH82k2#J>#rg8Yv=}LlR!cr%42GU9D zB#|AS*cd4hkVtXbog9uZJ&ER@P6?J8+k|(u?Idm5wY~Q?9=B76i45eN}SaxW~(L=OJlK1vA%v3;c;9@ zEKz(*_Hj0NC@6DHWMoZKeO$FtCvAaJIlhnk6TYk|yPu z#R_XZZfJ!Ri_?gZOOhkilU19l{9?t|JueAKDZamrI2@ir5Zl(wFgZd(Bpx#U`O;#C zmOEx$WS3iV8G!G61o!hR4<~sP{_JtO-v#Kz1d=+ z21!zOks>6O6K!ZDu;FP(CWZuyxt=`LH9BUh_`tN@RUpjZts@7M2wPhen4HWF5ok#h z0}j_kMqY`_mR1jC%bR=)kc6jh(H1A;t7MHg0CoyVab%aXS@_OKw!{aNB7TyAcoa*9 zS6;%N>yq6VzK}1EPwRw+B+JMpBuTkl%9nV%m{~WtNC`8tN(~L|o`~edpNPPEjT*N| zKzL*|Vd-*Py*YvDUPYZ!f*Z=3ib?p8B+WCBuu`o@B@%0%HCs>>A|`}L1feV0LPUJxEf9EUBni(Ii}o~UF`s#|XBbwIM9~;dv3`-aSW1b@@#-Y<>Ml{tM-oFe zi^DETi5{>!MDceNVG))PANrKoyp$p%F<%@+#AfnZ8rFh@HK~O80fOqovN)fr)8;>X()m$pG5G0P`rfy0W zkeaCmf=xVWk4t^mrS4Ks9N}H;d6*yPI5kk8-*1!$i*21~P3F543G_&+9ZywDevG;& zTaMi+&=>f-iq|}_kY!np5y%O&Hns|t#Eybx8wl?bg*jQo4S#n^tb4ps%Aa zWdH8=oMbH%o;>0DWVML7;zT~tVv#sQmhTM~A-UQjv0;(I&G~{$E-M5?!q*Doc=~!d za^&#CPs*C-D#&6b;vK##o5wR@nTW?G6!~i!>l1F0e4fIXiZ-GuXFx=AjS|^tC zA2h9RqRFLzUBs6ZDY;zd`toyliloxRepj3;pZIwjbgm&DVOmMtq){9#pFoyaURc!6 zpbwiQ$!!-ED0&nNlReb6q!igCKTafRX)4AKI@W#zkyan6X*b99S#F3=1591;KY_c2 zSHu#8Px)od>DwSC{Ml0C`C|1UL@01!5rL;(Pzf2{JTaMY##r|?dM99+bV?DHR4Q?o zs&^FztjYFWH;S#td6;%^>mqLL81CJ~c$htN z8}N4YJMku-K-)xU>urzk?{s!N(UlVT3v>B|JtW-KM69kVFD(oa*^*cuS1UYsaCWB# z$3d%GMqe<|#DvRIHj0#I8_G@QxoGq41U%OaEfbE^s4y*65^nN|H>}wITyw5hzp178 zfnClM^Hjw-Y!i|;v1|_MhLRrH$Dhm0mnMS3`E{lO!qpfHdH2 zvEX^khKv-gMPQVb~Z;*7Vq;EiKcfE`=O9X zh=42SBGzYTd*5c8sidk3Le@1|wCXTsdl3l%?)1mEe)4p;#eKohWn+zelv% zID<-ELQdD=r+~sDo{#DssWAo$MT%a8wJ)By;G>Oemg1ONB5@Ja6IFG#LXoLJCT}Tg z>#;sVl?J;H;Kplct7hpAO*Gp?ICz)Dt|O)bPL*Pz8DG%!o|C3n-=R1V?-8U8ijuif ztga-IWzBaL<7XFv+yr3_kz)-MN^i22vyPPsZAwztOp4Rz`Vtu}a!5>6ssweS{P0kd z;i;wTWW+pMah$cBSWxdWxXf8lH>}0JB95ru7`J<{h!>(O(9+_vxP6sa@r9>?Sd3`}(hCt+(uiDpEy zk0`G(A=&sTYd2fmVrlA*&kXRkw`slqYIasqpIIb`L%8Ki8oSGfnMpj3$R?-d=PnBI zN=m{fG2S}9Lcd~V63xatK{jFi_iF*D>G-0V$)L&fO!O?eZ$#!o9&Dnw&B%NxfUWel z9a#h=PzL2t3A>;QdZrqEFWqa9`=FNY2apG8KZHCAC*TylNs#q$4w~qVdA%3VFTy3b z-0OaY_N&Mi+FNP1A+N!8VBQ@va}(K4JG0+Lzf1QHY7z_yAwwJNy7}c8}hXV8K zki)Gd|1|hi8+rLK$al`K3>oywQqu1_=E6LP17;Q=<6#jb(A&R92w8%C8NDq>u7p(}rZ?t! zN$9J4?f8Wvk^<{`-O|w0A*0ugdD%?tS-o!A=o=vyHbXvaf$hLdAr(%U}hp1To;V z6|x$VfteKK8dwXdkO3PY3vwYJm?=PRg>A4M3ZWQEp#pY7CG?(M*sEYquX_#pzFs@? z{95b>;83so5%d#qve)elx`gfxG#im;;T)WYCb$62z|1A&Ww=83tH@T`+mP33zlppJ zcifCs?L6PnME-S7fl!YgH2*yd@7w=p z|B3w<{O)!CgZ>xT(*ItHgOmj>$bkYVfeP>ezpL^88vGX3f71u4O?yA200w{&7=t-j zz#!-u8}z|o3-;guj^G5$j6@2-1zf=mMBomiVGMYJ7cespIe~U>q#y179>wQM*aPTo zA~LYo+z*Lw9ArJ}?z)UnU2IfL6!~ru4kPBfkEPCszOC1ddG2=XJD`x>i;yKy3T03Z z6|fU3p$c}x9@q;tupgK?fII|8;3%8`W=HW`-b#(f;r9@4rsC z4F_isf(y8T2;5;5j0O+zgmEw)nDM6RgY>6;A~FyrLl8^>W~L&8A%yN>$OwppnGglh zz)TEsHq45_Ulqy)pOQ=rwfTN3#~W z9}dDHdSjk@1pO!+hZDW-C(%!Xq}Qzuy&f8%5zYcL=aCoSB3y#2z)UOhI^3Z9O=LUV zhI`Nf%-pBhiF^c4;2AuJ7w{5Z!&_kH9r8VVhHvm4nE8SH3BTYkuw?Q14@iRy$buXw zf-d2Ais(~y~v1=;kr5t#@1 zbT2?|gYB>b3ZV#?DM6M&IaJWwPMVc8tB}>S??&!{8oK{`E%;mvdoApT18@)y!x1Wvp0%p2tGW|LFYr4Pbb$^Tgj_&VienftP&vgGv^E>h<{GmJZdjF!cxJ<*x zB&0ORfE>s}&nTiR_1cxuRe(ote55*PKp%S3Lh8`2i`1u`d7TF61HhQx1|rSCobJqX zENHhx4x-%}iQo4ob}$5nf+GwEW=0@K0)9`ExYFAwnjXk8w0k1Qf)|W~@h}0r!3TW7 zA0|TYnS?zErodGCSTIfIdDGCR(>)X!4l^MdWi` z6zG{Xw68<1r#-#b{m1vgw|S%%goXvH-Tgc6uwKS%NHsa;SivPzlWJLRLXF z-S;5(LJjPLgTTyTe9{CZzz*qPN%zQ`w zg5PxiOOttwC5N{!U`B?f98wXK=&p?9gF0w}7U+T=^ala-i~;QfkcMCcX7px(v;-@< zTO)12mhN`QA+*~ghtfU_=?G3R0-S-Fkw_tkz#T?|CyWIzm;m0uj1STu0$?J&O+rql zeF}0a?acG1_3F$X@;`eh-Dl7YLq`11b7o?n1<^2vJ~o$T9CALy)1CP;7NIYO1Xu>k zVFj#&Re(Q5hTjHdo{6_VWHRl{z7{ zsYF)O&g^^8YoM0i_9G9%VK@fI;S`*PdT4+~VCEdn^E8`~S7^VAY=Ks~w;`{=Eog_^ za0l+feRu$!@Ccs3Q()#f@+G{2*YF13!w2{XpWrj}%vbd9bpL_;)$1|lIlt-tx95&O z6vzT*q>wTo3-|+aL>`z?Kq`U?;J4!c8#S65G&PZZKnwbUF7yX|7yw3K3?^U-W?&A? zSkPqtfZ`z9t&z60+ac}20UW^zhJ!OOGZN_vZgdwRN7L?s^rU?(asv2(F9ZNHlaN6$ z6@uxFxlcn6>9x=3)tSe`{$~%z9sx697DU5rU}g?-9_?|+1rQI5U@;^BGs}?6VI{1h zwte<~5qvkvHHLv_l8n2WC2vkKhU2 zpVDL=dxqWxFX-(R@-@7L5AYe7`GWik-{1$m{X+f)wgP_c16)u5MNk1%PzMdrgg&4H zeL)xWplABg-XCc|yD@Sgn9$uEX-Rv}%P~0!H!FI#M%sWa3;}x>3Jx#~m~lip!Em}e zBS(TO-QAEP+D9QrgC}@{5BS4G2!tRAhG`H1Q4kF=Fc;!rJ}iKESO|+?F(kkeSPIKw z1*`;SRv{B%H6+s;b5B8E1F5}k%$=Du+}1+|Y@m;4BC{YHa_H^fv+-+b*mEHd@}U5F zW-IzO*gd2!BTH#7Lzcr%sDxcm1=X+{_CO8nhXZgBm^nm~>4(ve!Et&!g**)s zy4NEcX+Mi>f@Zh~m*6t=o~zi~;2KGrGur zAb@+prMVw@5RSqLdOL|cMf+*w8K{Q_I0sF@ z%mtcEzleT`?w65QXm3Tf!A-agcY&D>z7?}jgkOHZY1{uK224ogwLk_+Dd*t7Lb8*`Qo9ScuGz*YhU@PE{qWw49Y3@K4 zLkW~ZIrK~g`c9~XT~GzPp$7IrEgXQu(0fi|KLw|ufj)K)*#sBhB3uGyE+end-imC4 z>u>{ZK|9=oPGIIS@(DbpJ9F#m)w|K3!wYx`ui-7cgZJLB|04441h@x2vdNW zV4BmBA+(1gXV5+q83VIn9>l?X=$Ux*MX(qWUz3q!YW9D)sO;ffSI+(R7it# zdSmVxy?PdUcCS4TeG}x<+g9W@*bY0O5Q?A#%7B@j$X!qc)vz1(z&@yj18@kAz)?5` z%p9lrZ^OqC?5F7M^#43|2D=36p@BYjmgYI+dD@xRb%FMa$V+eqTA>ZD!43G|xrN&u zxC{571DJV$?1abg47#8jUO?}8h5a?Xy+OW(cXae zmCgJ`RSX9y19Eg%Kq}I%jO2kjXn-c@Kwr=WJ?IDhK>!9Y0D8s{eIS_9n;A_DU=Pd;MLK{Z42KcGj5Bg1xYGUK6>neI-RW%<(i6PsJ{~y%e8C?k!X#iO5ILFl zAevK=!4LwW^cIecfJm4HF)$Yvz(QCIOM#hX$mO()kx7sYDX<3C0W)dH4A?;TOk@^h zLk?_&%}@YaVLLFh16e|Q8BOM1j$Q#fp%QihGgZiH*bRGNAJoDDI0(n!1oWPh*iS<} zG(aOTbCxF4&!JzSdo%J9T!B_-gX_S|4dhL@1-Ic2^qzZkzmM#M$M6K6LeD%y?}F#> z0^Y(qcn=@pGxW??+J7K_!Y}v(e*u4XoUj3ZV}Zy57ZgAdlt3AHz>F$QrmLfCf)?n2 zE-=#%DS!cVH$)nN3Ej<*7PMO;2Z0UPf*lM2X6%s;v@`o~bZ2m(Hxbek#)21&gYn=4 z%=jWF!X%hXZ_GUiJ-F9C9X$kQKsZDKGf~J{5Djza?cXE#_(Au$|GCe{z7Q7w&z*U> z1l*Ru(q4}(Ltg=_=uM1Fgk-v>&`d?Hqn&wOX|%6LrqiC)>+x*#9LR%Buo?1!nF8b% z*b3X|Z9C0EWD%4=DU<^<708`X3A>;g_CgKpgId@R2jLJLh9htcPQWQR4a}TD){`4k5>eFt3Gz23shJj!T=D>^v(h>%N6b<0A_W|f0a=g(1yBMNPz80+fIiSO`0Hmx2XyJJU$4h{o+F?)1EgWE$4$}Az`WPZ z5`7R@feqNhP;dZd9FfDpneIZQE4YCOMuR6XEu_)=dSnJ3t0ubVK2SaAZy_O9D>7e1eiIFJOL8A*VAl3 zHqw3;c^;bSeg)YAtN9) zTZc@C4Uh%dz|2OPxyU@&1O@cA6}b(zLm?DF2{2QNEQ4~oS0Jls-%WE5vWE6rn){K5 z;V7Jd({Kiuk$hAY5KE6r=j8*r2E%wxBD^>*5CBk#anxDTDc z%tPcO+Mghw!E<;Cui!1bhY!HaCz_v;U*Q{khhOj;{=$Ew{x9&)O%OJ4Kn7%i89AgP z@IV#RKpixp5A;l5+I4%~^m_IF=mszVjKLJl!2*~WgtVgFnx-uh|D+2ULU()QP;h`@ z-~=PU8AgH&^o$$2JB*^Y(MS*4d!FNoeH@I33E%?(FcAVF2&Ok0~ zb!T2?1NKbFf^66bdC+?{W6y_ez3w~E3!xZFpcHzh47~y>VHZ@xZrB5Rp$7IrEgXQJ zIoPWoLO)FRBgmt)A4i^q(;$HcI19|2L!O5Va1k!S73i6(=&f)KuEPzu1$W>c+=mCy z2@l~BJb^BF4lm#pF!P$`8{|9MzaYQS{tNjBSQ>cS0cJQz8QSHL^0X@=l|Y5=e53~L z_{V~X7HC6X(1U)!i~wmsyCHHQn1Ct0nbWkOX^k8VwlD;S0yD#qj^G5t!5MnbNbD{k z0(Te!W!7RJGNdiO^9(mn|}nf4&$6qpLr>8?&_kfuWn)i{N@DLu++Y{tdcuw~h$d~X6-oQIx<^%F0e4_hT z}*txiGM&#bws|n|dUa)ta_g&y~=uyVQ_8~_4zQ?x32j70EJKGz^Ti?nX*WU}_ktNrb8HhNyEc;aZRLZ83pQn_E|di=ey zE;MeoLB;dZ^Qt*t7gs&z%KREN&{671yL-dXt8Rn-T8*e2J~i}w>9xH#TX=>uEDmT7 zak&zcyfSpzqx7f4YL13~a&I4(X=Ah_dtvILnAE}|<)y{TU9V1cnLcl_MdSK|wJkLZ z59{md{P|G7B6Y0m;)F%%vu?cD9z5IS$;w&#&1z3CNDAkPGy7x*H8z>%ezTORE;cMM znZBgsgl30t!JX$ORUein&8d+cS)#du z!4GEio9ufs>~z#cXEoPoZAWINWPt%c%`EM z0rgECS|0{%STOsG)8S8xhBk*NImJDDwDM!?0jc||+q0rr*H61@B!$i8l1H|&G6NN@ zr#Td?j4pM$QhzEYNlAH0!JC;YCjXU8IL-Flc(9-4_Tcl~>La`cU9xEmVNLcv`nNIX z?AVUcd_}Ln2_YxzKfWK(b^nUp`M%my`+Rd4Q9W&~dS6`@d(EwD8*gPEIm&+d^*4J` zom8;YWWrKo+syz2Xi)F3rXNfXXgrA8sAv#ry|u8hqGU|@u63@n-4-g1;+EL<8~gO@udWYx*^h5#ZU5@I zc^L0y&GDGxeRADXr=;<3T{HZu_{Fw!dZ2NN4)>0ZUT7KL$nn_UZ=R(pH=Qb+-jwL- zHrs2(tW5Y-*=}v%aI~y-eSfvJ%C^?0Th(%2j_asdep|2UO}^T)#j8sDSY5v5UVSk0 zx5}WKO9qPEX7;fJ>z&ED-= zcTZXt53pMG$B;M2Z+gUD_5JVC{ zOFlOn)LA$0;<|U_4ZHl&aP8JtgOV0I%=^n5^#0bxNn5v#cB=>&y+T*-=>1W)=Mx>~ zF1j6bZSAJK>e`06tIWErA3o;Gzl(V@Xl_x{ZtcPFygNkie<+X3@=lA+gpOXuxFX|Zg{n^B0Gfel~+rHqJ zUyI@GVN&y_Our}8x~n~yum0`#r#7pg5!)5UhO3U4k{x6Cv|X{?te@?>fo}%ot~>oP z#??|%Z;-Ywc+Y}eek1+_C(fMQU2m{Pzu>jFrO~nF?RZYW<5`;*A?w>SBPuLDyZfhkrrzEc>Y3$S?e(rxQ@nI_AE#+L!yUVd{H0pr zpWQswZZp_icifD`W7{(4Y{|4r{`%?GJSEwz6=yBtYu?91Fa5G|wB$+Zo(n!LN1C#y z@RVdee$BKme4lv6N6$lQ*yo4aRqGQ9%QZccmha!7x4r+_rG?AJ2FveMUb#EW>s@rl zGC!wZ-00eO1Hb)xzogvATUl<@=GtJDBTfr%%s07iv{?Q4n|T3=ljLeTJ{pFu*?e{5 zteqDWttEL{l3lvmf4}S9k}3W?`lQF$i`~zcefu<9BWLh*-m$eWwjUnU{GK;{VyNh^ zmr{FKv-^SHe$(G?J9@6(M9ed4n4y-pFlq5J-N?rY-+x{hy?yrE36W!d?0B_vvCXk< z+iO;O$S%=eesTOm!*c@~6ckr=k62aVIKo+3=gXEw)vw)Oh6WPPfCjagZ=3QS=5Jc_ zdDDl^jg_NzKOLPq(RQr!5Tk@vWewimp>dlZuddFCowF=b9N-y#YumNJVbcfCxcge@ zJl;+(m95A;m^AI9%D$?p zU6*qPca2bT(=@pG;b-QTy9?{@ZZz3^zWDjD>(+<$mA{x)Sm{4)R*UTOiLGkSiCcKo z=-?^scr8n_0o>L0OZt^sO2%Z26wIBLwf*asv#M%J+9yLV?i@J$Xs1;6%y}hvJ%0>M z7JS^|Xfa`a+o^KCt>>73zb%f)lem8F+$x*o+Z^pDn3SXJpX z=UlTOIL+D5P;vZ%;X738%NKTR>DDWde=sFS5bYNtV7P_u=3jVlD6XHC`9sywM$xh*_GW%M1;XUm z6uaFTt9*2$Mc;R3x#!gZ%wzX_I{=Md&&Y0*E^S{ozQ508KZA0mGjf= ziRrvU{hcR2){B+Oqt?$?DckCbTx5-mqORWK zRG3Vz{wmF4_y2I~$B&;HE#v>>G%f4OF{^h@XIDjOo3g^hCsS5AvThWXo^f<%Ep0v9 z8l*Q^KYV)f*;(xK=XQK&w=dWKx#z9Ao}ocJzo|t_GUAools`YcrhV#Ys&Rercf8?~ zms`)BQ!-qrp>C|Q%T0C69jm)r94yx^xV|@bUdXDnw`beFn_8*+J-S$$8fx~ESHd-U zZaL>|!0g8ym)vN}TKj%l4L7b%TGBT|>qK+yd!rXSwySP&S!nh3ytM7QRs3s2Ry4%< zXze|d4YQQ0Yr7AmoE>l_^NU9 z#duX_50Ji7vMkVY*v72y(hYBqt~Z-xV5p|xvGVQ7vB4uWM!ayj@aMzFhtnO;&n>Zj z@%qQ)4CQx9`v;%&956pJFzaY;{*nEOw>x!TnJkVq{$Y8ibJ*;M9E-bY_f+26tvy;` zS3hLt8k>yQ(-XdZ?_)MBEOn53;rR)FS#K1^ICgDQvKSdq7J|Q z+qwJa#hhIIDYEYb?}Jf}p4Cq?Up?Yzq;6Pe;54N>W2pJ~sBx!WcD?a5P99J{Nh#!) z>FHS}tiS+^jbQ<2ZTF@P9U81=_u0GA;y~<)pSucv1l();Zs*$3zKj>&U++bCWPgM3 zxy4ScA~ijg#Df8!YxfV9Et(*hqh?eVF=VAU^5aa`>sMx7X*b zd>2FvTr57~v@7CCl=|CzNHyM|^geWWp$m2L4}=6UlwcYUuHc@7sE zLi)8FKW}I;q9JZo`_b2XBs0^J>TYEg${l%nxM}*NfH&hlyU*$S`|#{XNgw#%Hx+%d zHwieS@IYzj6%UjA^^Xigt>+x`9d&ukmtW3?gCZBXFaEnbMB(z!Bv1Z9-z%~XIg>25 z1SqZeG-dOQBO^OMoCaGXlUt)8<;q*Q@?^^1EoW;9Wt1ruXwOh7n>ixaxw_`>)+nL=l_}b6c zU+-a`%0*L#i-x?dj?nT}NNQE<{Px*o>uLQrGav5x%wq=$A~wbxf4NMlR;$M2P4sK~ zDLy9y@07P(zB=!ob?slHX@jblPSYCm(C?^owdKVwpS#YVtp|ju1!{?on`k-tHJ`1Q z)>+qlTYKrlsMJ+MU2lp@70m_?-&t;-@h972&-leNIqD7v8jtJ9w5f|1pU*l_5qjhA zkrK)L^uMt$B}?uObBwepmPl&6Z>SCV9(io7*PNHdJ66s}{%fQW#&+OGZ+=|8j%TCt z+jslnv;Ey0XHPIW5MQ9AQs&n7rebn=uH}h^t-m#&kC$4}q?j+7vh~M-;DPruO1+NZ z{jak5w%5MNlP5kt_g-hU{B5^}Fpcj!uJ?axoWA(tr;VBuwrUzC&CWRRa01KtF1tH) zWkuwr#ZRlAZLzhuyg=Q1=lCgkCu(+wie#T2Dabtc)^lcx*y_PYqaC7I_D`=(kvcs7 zM}T{zL$eD{ZV8$4a-JjqOu?fW2W`fzzVp7?x3#VNG;4|F{i>81bAk>F63o0d{rGz3 zi`M$sLx#=sk6YItd)VD-v}kCRiTf36*p-d=xvqV?1EgQKrCEDf#xQW_zpHfcwE=WD~T zep^|I%@39e4lSRcInRXK?_^hmYum#y=Y~JIuDivb-SnbyV)_H6m%oQAx|7JV&2?=* zpKe+e`&Vvr-ZlSWzeWyw5Pr$l{7Q!W*VF8}Imi0WG;ldJ>-(epjFE2>*A;CpvoSk-$=NwFM}jjx26vlz6gA|m>K^Ur5G-0^ zGqJB+YUrHZBRwW+tf@ctZlY(&z^*g4?O9bfMla~|;pv9X#mK+hOv@R>yXjj!`Qw>>{_)@Des((lOsnt6+oPKA+bvF% zJ@)FbaK%WQ)~`)E=N?Vc%v^9`(;{KRe<_G?noKKsPOH`eSduC~^So9L1)wU2LQCf2(kvu@9v+Z(r;oPMs=>VN-f z%c!~iHiXB`o2S=p7~aRO(ANL>&^<|!F<&>DU*A6Tg7Is?@m#HnoG;V2x-4#}db{Q8 zq}=8uORp);8ZL_3yzOU23{uxt#@KwpkL5@JQ%!3M#8spkqxskTCy%=bL*7* zO*y+%He0ODh+glzC1QD|n%B0(io$UttGn%zZV$My@llc75>Zj)fm*%5nj3EX@w0+< zzVgqviaj;!x=Esr|7Y!OYt^!5S5!%rFI?d@m%Y8^wUegk!;(kWepX)I-<=X;(Wp93 z!{xhfQtG441`8LhoTR3c9wzP^vm&;&e7Wd7v$}Km`kdbiEv9X{H4|fPM-PcK`ur?m z@_5-B3wC6)hTmwe`dsyL5O3KbgH^MoH5{sqJ8D1uanatmyt>I?$AP^-ZeN-W+e)lWL_OT+7rL~LHgUU6i8 z=%o51sRi8TydC@7Vlwr=tU0|eworY^_tg`|sS2*_63;p{b=k*q#iIk9-`5_Vqj`6Y zP2-7ng;il;UM)*fr+LQJ9lPaX_@VpUh!-QA3TwI+su|6xI4<>LSQ%;#IJms)!=Y_$;2G6g*H!1&h8J{iU z76ujWoxk+q!!pwoqi!||?e4iJ8txlwy+C8h`U}TAJN4(sw+=VC7Vs%EC?#LM>d(5A zFiqp8mv_~42kTnd4@~4(p}-sU_eziPS4M_(z^d1pe7I*DEJ?<$6`?DEi+*8c0aQoYjH zU(&a0`f3}=fuN4}F@j6OMwf2;eR{v4&iuGEGvl{i%K|&p+FH7#)4P{$eU)Nr@I!_F z%rIraxufKKpT{R_r@BTK)=b%=KHTR#|LmY!8WC1^oFkU*(4V1q<%^ohwPmk-&#L6V z>fU{(c6)f`a-Y@~Uag5-L}K|(8XXst-SJknQl{lI*T(*?j|iP zW$Ao96c<`G`!?tO`n*M&F`08q`o0uj4E41cmJlb%dq4jve`E9csqL@2st?~iY3k56 z{o9LAO-lRKcYRk@{W#d9pXHI$a#zj_`X0ZkWM-CVyvld;qPmw!A105!%bM3LedgGs zhCWHDg$q+|y^Mal_u?EJYjW>*Q8NSJ5HQ? zyUk8^%pzlMQDExp`x|w`KVRPRp{~OGL~^+6n2d)8+kZS>)?Q#Wtz)ITNNK{J;-L0d zFK?C^pVHrRPpRt^evbCdIJm;Z@z@@_MWy5KIG3J(vgBad>FV<5iYeS*dwdE_AD+1& zy!?LI$y&dW-?wbqzFp3#^yh*4RC%L2T~6u)+va||v)+hbyX>)Mou$v&)&u7TOtp1f zdu`3srS^*^9~H-6zj^zBa^7_PtCzp59lN}|>1%yR*sb;Vo!4#M5WY{P&)?MNW4@SQ zeWBkJ5jT70ZhPk}o#$J_tDcvd4!t`6){0l&8!uVPuO9r@N@SP#D#r4mpj%4(ZYg)` zpUg7djV;Q7yFV6u=v;U3R7h*56#q_kyL#6&-9_v?QubK=484n2 zhZyZRr1N6Oqy&dkMqZz5(?=~%uuti`JYap%rFV7SgBD+Jz4{?ZaZcPCo2x%`I((0& zU1C|yb5gKdrPOiv{&SO^6Q6vl8uFyT!pL_9sWBlHa zJ;(6qd7S52bIn?7?|shR+o-~+XvWr|j_)>uujp6_ucP#JcX~pHKMAQ>$L$9?J?dm- zrtdQ$ts{q3fwk)ucL`Xoj{K@GLpG2hr66IkIclW$#zG34-wu0+a_7`QJsB&Y+H8!& zR3cC|?}$Ts&LIlb?pWCndVlb7!G!D^Co4fW?yzgFAfC=O#fL`6Yd&ck`RnUjcPCOBKXv+5 zep;?P6tHNYMW>r-A!an1v!Oy0x#fSPo-Gy{O6*g@oLrhG)AzpnBgpX8;wzr65zg%p zE&(CtQwl3{SRHl+g|S`(W2P(0L8JkC`dpm)cxjaD=H#;dbv@`lgRdNqrYL_Z(~>K5 zI=ddl**^_NupqblsX%+FZsu2x@^D-|_HY~xnJ^0lo5j~kHnDoQPIEIE;FtcF*^;bNBn&)$PJedZ zSap9%7HSSEt-PZ8T+E!KtRbe1Dq|!@b`^BT)JjXtW^+wfAN#9+jt9g0oJ`E;!CKhn zIQ-;N@1~z3r2g@DE3*L`6d7Yy9I6s{6};k^>p6<{H;?arJSWSS(T{hd46XAXawa@p z!YXvUUs~oJ$YeZ-bVyo;WWxq+kT8O^Osu)0#-`Q^yO^dKCiMxGo0-e;v99Z%*5*+@NIctaw>}RyYI*d z*f9l|$ru~oG$TYWVN=R5Uubwh{ji#on&GBO=ZJ@6RlE$NMEHV|(HP&8?7LV9;vIQ^ z8e5=XskP#9zKUGAypBZK*&_jX3w z-K5q^F7j$8Kfkq-Kn#}{+|ROWF_NJn9nN6&w|))G`qwq{c4^^VK0z$dcQ!Duoo;2i z(e6dQ#Ah<)2JADaixO;X)en8Av2vD5IL8_0f*NY~BcR3;LrvjS&X)c3*)LHeEHZY? z!%(vZp)xtXxIG$e_{8GQV3Ts?rwo&8hWqP*(c4kY(|If;%Igj-6FfQ#XPX)2n*HnF zWIRE>eXLbZS|>7gOM8;HMDglzv5(tt<-@85f!-nR`?nf^^oz?w1ReP-d<^s zDRcuZNr5F1X}M;Patyu?Szc#7^*~eL4>B&fwJcuj7mQ1vbJ{0_gJAk#J%$1Da2QDk zkAU!rG6fks1e9`Ld9O_s*c63i3mf+aY8fMswQB_}xz0>ctF30f(%ahPRtJGg>T|eR zZCEt!+3dJJET>eT!&-})Q=J%Ngwn9XlTTY{RnD1hX=yY@vijh<0b;TjxzP0&76~6H z8x#ykziv+X+?}dYR?@xkWf4b}T3ULa#@ySm=qFCHOBGn&-)n;-N%Wp2b4KhE-?p`5atS=n#~(H;c%%IHG5gt;NMU@k+#9QS zW#1+GFzO902TU-go<=dT1<(gfc5rY2~m6$mk+n;ON zt@Hmm563i6fl!PU!ahFx@MZL2)Civ5%RX=uO1{rnsm0(Tw1ge>(+j_g20=Pn7sQiw zVvU*u*%bNHx`!W9lf zY8o%|Cf(f0fr#gZQHZGpx(2Iv+76vPE3b?F8&P#LuVd(6d3?o!(1*=N`(*F6h0hQo zD2vP^XN&mn)_R#+vvwU>4Qk6l|DVM3rk0^cL)BWp;zsFQLF81C1@h3H@>9g#;cw#z zpQ4r04&IM$^vA?FdQb`|+sg6^;@KTq!$!hOuLVVaRKyM|Jr;<6SRyeY&Pg5LCqPCC zLr~YkHsM+$Y+wa(8Tjm>Xg z|zw)mbLD%1!Zc> zuI;K|$}iSnh1p>8VR%lXvLnZ%68yJSSdRL1aJmg6nVlDww(UW0KT6pknz_$jLPwUP zT8@a@_a^4Us_tTG-Qq|1N*dn7nl)j21#ul2>2a_<{J%1NA{+e1SZ zhS*QH`7P>a-bCUxQx4w{ynQFi<=vNsc$Y-@+|8JiF{ncP{RG>TcDnd$?+E2T9|?rO zMk(Fk6wYAnWP(TkoO_X1`!loQJtRs@9UgJdmo~Xl-;geQx7V;@d;?`^7=+=p@D(c&SylDmZ*ylW zJR%O<1e(m>gm~!P-5#Mnj%_^gWB4Fai_f_6qW7v4MP$v(JTwYmXwL2XhB?YVP(z8fPpx6ARzesBVGY+j`N2oofFYA-nmeBbl{ZfrprJcGp5= z;8>>?3k4f`I^QO{b^y}zj>O<3&>k|pxuppFS<;`-x|Yl-tGiKY&{Hgt_M7$%;`{5z z)n@XK*~o#UJ!-D^BmS2~*>$R+%HE!D$s~OL+<`bQA11{-m=?*w2Ra=_rXi$t)e(c$ z;28T-2Ab$6tmD@9zO$w%HsaRU1Z4PbMYzR&Tq&N&iQAFgk@?|nX}990U=xx=0@ENl zQLpQ%n02uSJphe=19r&&{x|?mk0n)37k4}jA#E_@$hmds4D=bAe4UP5N<`oCWm>%3 zOs@2rll&aU+AX#}?YSkQ;i%?G?^D0tg7liBM$80zT`$B8W^u+y`Dq?NSPX>S70aFt z+au`T1gl&kGxx-tuy8Bq1nDD50d#BA`QQ@5KiCqkGxQbhRi+-gO(p`^EUH#0y8ir~wW|8A8FU*n5_2RbI&?}+(`7VwT z@`#ImpsQZTYy5{08Es*?z11qju13|}*)l8A^rx|sg|rx7rD7r3G)}%Q@Mznxzz>sR zTOJZg!OO)AUcA!@R;9{YGML?L}>J2kSTilRiRMczRQ1J^%baIla)X6J5;J z`}H{z1sOt+$3i*-lI&o7LQ7^A1p!=B(_I0DpQ~?!$Hw_H7jM~Mi!@Td*wZQ(mb8*< ze&9qYIh?XEl0#+8*|;}3V}5s@Eh9i$ITfA3v&gY)K)97=ZIGBKLVCCHNB2#VFg%8l zWYC<+mCO&=TC`=+b8ejF>nmFw3z)Of%nk#`i}2#tXPfot#{IP4d|8A)tefsnouG(r zc8p~EysxDg#MFCB%xzU_YJbG9IaJ0a809ihCC zP`K}@tL+b(()G8T*}+zob2(E?#kn`@CUVLwI(+B6??o2C&0u4pcHt-pH7Uo>u53#q zKYXyggL}o4{`H4DBe$cM_{#5xuHhqP88=*3OH-sD}$4k8_5|zBmlC71Ry+0LJyos^|T$G=}^fkAx^& zp<*k1$JmvhB7D~>*alCMxd;!g(hed#1dcowG*HJpfxH2G9;4wM5h|)0={P(+I_ON3 zgoifdx_c#G%qN%q=urFN^rz%z?7zK1&SWla(QcgWt4iEWD{@C#c=-A?-1(0aHP(5VFV_bqMHk2@ywmzH)+b$^& zekU_k8wrb36IQktr*pTF(JwC3&8}4$ZBq(4LBUik|D4%r*zaWluctJQ_w2-dQeosZ zz_(d&-r5wQDTVXCsuu4|c(6gDWl1*Qh@wj9*w$q6?8^0z6@QT8LkbI9_`ydlR9IW` zh(rLf)sgJP%x&vHaiLdl__1BA_u`C^|A@^e*9ErNFH{uFs9x2*_|RX+oc$@luJDs5 zBX+S3=bSm{V&HAusBqMkneKe)6B&x}MZn2(nXPSX8* z2b`-bVz7udP3OGB`0<67r%DW;#PvR(OnabVN_S5p8Kwjv!2#_S67`Kh8@^n!& z$_qEpLoV)`w0|eo82N{m>U1Tm4W4N${*k&n=N0w$jUQdj_qa0l=07K`o(@~^TuCBE zCNWwVZ~Bw_PBXeVaWUllBex5|LlCtL-pst_sVYO;6FO@buTlNAL(PyPg&gjG(&{^v zf|Gj*n?Tm`E*dp78FWuGA_Hm_7APMY=bAAdWPEj+Kd1@=BNJ63ze@yGrT9byk*U{>M;e@H zEamnE68rYHjg-Dhrbmx0KE?gOaRG{paDOB28zu8El7m2aWRaP#utu^AwX#{l+~3Ph zE#3;mPC_(5rQ%Px8I=t2%FK?})3c9N9kZxJrVnOxw)6Ps6Nycrv!1wJ>_r`@V`vu| zz!?kT?7jZ!{B!Q3%WGoBjuOjwj6b9J=`{?5D`}RF_C;L>(0qQ;siaj0=@2NVVtHaw zUuRq|1wxW=9yX52wMsjaVo}+I=Y1D^NO%_aOd~YuK4QR>OMBs%cU+VOtw9`dJ7fo& zepfn93rOv%Bd?B2p@c`1x_g>N7#nxLLLw>@%>bUNeii>mDu?(3u z)P&-tw)`#Kk(w3`L!omea6Fmgp7BInX)%JU_As=1?79A&?yI8ZxpHS8-3XeU`{Uo} zCS-QiU%NoSEez&weMkxzX$PE zB)Y3dw;=cTu2{NXzJ#PSg52@Gh-ipH@{#2{2q+}(D?eV}e*m4UZANwtecKW~AldUJ zB^^IOfRt0V3%WiK2`igqk|_HqgOQv8k(X`zbS%=i?}G?j_V#&!z!i0CGK^As`#qc-I^2lf_1vGi2Umk_vi z$D9G;fjFlK40e>5a3j??>a-1$l{jt#?zvz33li=o@l48`s&D7o(_%Hu8xFLBPhh^- zyc0&kqvoY-83|F(=0KoDb3Hxqk6`t-RoPCb9{Yj6JgXIjY3!979~3m2*mu#0zaeM8 zGXTXJr%0mcipB>i!~jo3K)7XT>HpLbYbNWVr*TMQtT)1zsmJ4(pY1!w&wkIOXwU)cB`km>yZqi1&%Dzq|3k?J6e?m*(QBp3)5idXP{d6&D z%$gOaq6S_yxGj$jjRt;%{F_9JI!c$!kV}ItA@oYNNk}LyiIMkY45}&)RsX1tE z*(#7LFcDFmfvqCM=%chj}`=s>t`+I?nz-GrDw3-kV7n%n1T#6*}K4~qYmJ-wC z4vW^j_$)6|KUIFdF}!a3z@Lnb=3ZD1N6A*d3b3kNzu@{TRC;;0n&LXwQ-?^I%c17) z#jB^0AO^)7#=G_Z>5S6F^y)E~pT!Ws_v&Ea9UgI@7q3s@Ka(&_fuVQwX(nOhJGA<0 z$bzRwE5}7~-I{ay6H%j34V-<4h0?qxVQax$MnPSOpkPeysX~f;x69qCPEPknI@@fu zlUEiNA%`30mgxQT5F5=sNhyCfS&8TlKZVvG0$i+~N65e+7Kuk27<73Oy;<8Hp+3=5 z>-i)e#MsG0{bWgk4b0k2&s7F=LMiy+y6<4(87hfzcT?9m!|=k)BKs2Uqd)JUv7nH+ zHy|?*nQQoC#}go={l_)rc`BNr)zaS92U*^CXkCCy#pGLCXq{i-Uk8)C_a-@(yk*Xp z$oTQC7wvdPMg8c;p-l}x{8()@|FW?6b8}<;r>u|P7(Coj>3NVzeA)YD7H?gb*n5uF zRwP`Y)MK8IWAf*J_t5j%Q|ew)ltlK9ESALfXnvu_C~w%UxjnRjL_Fwh7RM&=Lkj{KT>BFB={>TU4-^cU-8Gx3 z#Y%4xnHdy+q~5>b|Fx^-D;h&3y{HYVkL0X?WMvtL`3?^ef;|$Zumq#CmMG(~i9b|!tvt_+sFBR20 zNy9>$r24jhRRktpDw~Zw`5+zlpY_&D`ANOYl5a>#Ib0gMPR74C_&N-f*TPb3`)6-8P# zypOU*c%PrRqipfY;hO7|$9Rv)xG|gr1DsB`!+tL^PA>)069nl}rHe@5JPj4aL*FBj zD4e5-xMg%KXx_NUxok9^k{q?!TO?~o>g$P}GAn)k=(k3`x*UimS!#&yb}l|M z*HL@aq#rIj;IK4lXNi7f?K8eaRpE^nB$^q2-)>N|vXZnsplA6YQZjDc>XGRGNWifx zG$+lU<>76iW_U@`e=D2LbaqRKxkELfiSofxh*6hyCLTi8FZM^)Y3_`heRP{ArqN=> z5uHz3w?eh2vdE_k&AySmIA0DgmV_8T0)$t76TZZz1$^r5U(po%Tm|s2ozpB-vX&q%exY5Arw#;1tgqrEfy2273M zhWP0^I1+C=i+iI2b;Hj~n_Yy$Vn zvQUx*uVVcM)0<^os$6*Z)-gn`%Rh6Fs!NNk5{caQuW2%Ek@-azYbKDciDK<&;Csqf$kx zF6x+n%Cx7XN#?7F8$Ujzk^#x z@mTaCCH2Ev)spP|LE*NdVkC_`^{~C*`J}cA__)}GUuyWbIc-ROX+P2OEo1Nb2NkD} zRaN_1=*MTgwxg6qA-@fH+q|yZ=BK@CIR{o8aI5bzY%rZbr|n(|DYa=SggqCN8_uJ%{VG#xho?3+hr5`q$It*qEzSr%DHyCt;MX@4K*6F0Df^KS zg-p%+^3n?yV-E6DSGa`faJz0=QUpdFu1%#L`BgKwu4^WegO^OPJp1bHtco71WwAWM zMUpv%3|8UP>?dp7{3*JE!R}5-G74nTwYXep(vG(&1dFbGnFc)ne%gQqw4WoCTcPnEC3>B9Nc2rb6Rxn^{ z1AS;C^L8uvwCo1=&p*bb_}VF4BD-rBtQ~gLHLAsKdJx}NCf>CFN--P&b3L&KcP;C% zQNZOVF+S~0hK8ysT=93qujo&Z=WP2`yiDa!aO3cs<7xwiw2k~@q_3^4PIm;~xIuI^ zXT{X?R<)m1cT%Flf-YIcT&kMAF3t(E-9cX%%0#%Q{YEs?#v>ljHDqby8?Y&{X0}Cg zk>O5<89rndQ%3H+OfAGGM`X-Y^UOv{b-iHY%*zf9g|@MSmB! z_Q>cY^6rDkpYd8czPK;AHGj-RrEzlu96k>r7z<^S`@B_JiVN%2_(mgg)MU>8imka3 z;*;1rZ@U|8a9@Yg)}9NYwdA@k=@bVaHE;6iTpr)hgD03SEI^7#vP>Sb|1Z(^!cFx+#A{Y zesl_bMy*twHV2JkE&Iw?b=Qv`qw3s6iL<=V4he^mpMHSxXS1|#q%8 zgZ?aS-|z1kic`fA+>sVCOeNpH7YEAwFGfSC$zqW#NyK?WminB4+b-4&5OP#&az&FVqFD&LpfeGZu&eiq$_9Xq;5wiCz z>Olv?BN24jhYNcbhkQCtECW*5k@j+(^~(JKlj-f-9I?*ik?FiKx>tNp@JhTM^Gyt` zYJwTa?{s+wzFyW#grU<7?J+U2w%Or*-!!5!J|Qw7chE5Ul@Cqk3cs;5+plfkgd}hO zibmYhpaSwu^}d>;Kv$sOLXRE(Bihnjg(KE!bk0vP$YT^zcb1D;gJw;N)6`pDZ5oKs z!q4{E#weTJdqIzKXsQoNE|if$$z}BhzFshjxPmIIIU6R1yrVT1hm_xQcoxU)+@eon ziS#$NPSqelUslK&q3hK!lMK3U!?&?EPm_~HjjC!Kfrc_Q)ja(B0c4U0~rkkt-InSW80LMv~8&Ix#(~hZ5-Pv=`_P}+}8$1 zDp&T46l9o$Pj~FEKYMrIJHq0>aUqnGyixA3uM4-_yHv<_G2lCAg2j2-|C4krN={26 zaR^62rM`&998EN;_t2LML7{#%yrb?!b@iUqgQ!!SLy>))<1Ea!%R|j}v`Ioh#%J{V z=&zq56JIQ|$-)$~>^rcrEIxcih8)%tsTZ)I`P}XoxuL0|KgykjSav}VUpI`Z>tpS* ztu?zxyQ+sK%I4=9oP%FZUUa8Nwn$5WZ6J}W7w}SdiU_( zGLLfO2B5N|pEQFm4wL)$D9jjVI~`n$n!fQUk=l}tQ55oyEOyBo5NJmgQq#e0ax_bZk9?JYGLhX4%6DvddSw18hCKDVABG8C}B-+ zn?ml*U?e$s+g=)08d2m@VRGnLL!yz1skdX6r!>@w`3L34Bky8)tg7eozEi5z5;Gz# z6blNmFa--YncbIFe>b&ai;s+|7^obUdh$H1W3xrnv^+PuF zPC--uY3gJtQzomw@JWX4mAlYM?BWDP#FdUBId6nRsQVnVPt! zvFMT^X)V({e!Wih3->Ijj!{+G*5;MsC@jM=^56)UZ@~*(YB?&DuXYtjW5?1&Et_X` zH49A1-ceE}DVuRCZ+>XS5!0&w6zy$O{&geK_gf{? zC8OH{ln3elhWYp2A>(e5ulQ*Eozu4$^kowa?x)>B+|6bsLpTD|?OJ_O;dpYUZe{%s ziRx902e*y)c@@7c4(o3J#t-RjLyz1!{d;x*0DQJ z?^m7EZHrwtAXw;2lKCiv$6+Ab(?8EN9?n37A_QgYzTR;%=s}0_shTpw{F5KJW(icE9eq$lMitSMIX!{ zPeThkf49FgS_=$eU!{Ie37cbJBd#>AH}ezYqZe5VtsKcy7X#wcB-G zV2@B5vJ9lZEgts#fM|@zZN}JD0$6xP!It)R*Ra>GQ$-hZ1P1(0iosKkd(Fz^91@-l zvP#U*25|mn5tXywio6x_$ErNxD~$M#B-s4CcW1oiCF)mojUU3N0)`||SP<*=p|lN) z-s`_}iCPob_zW69(%B91ODut}<0$Pga(^tHkJ$Bmm_6;lkvmim!Kw|%!hPSUB3?EL zdn))4yf#89RFVe*pAz41-uhLmor~XR?9L2o^t5#qIDSF96(L+UnF}{>=ywicJxSYrsZ@I7=4i|o zR~8{>_N2lQhkgKS!itDs!4$@xyrkU+BjqB^~${|J>Kxdn>_!KtKf zow%Afd*~!jH7)9KA^Gj<;zA7M};djDFVGH%PcCiK^mESFh050_)ZTL-NZz zd_vw)E3P7RNDcQkiARMii|FncbGtpp;53M-H%|T8o`y!CDIWK`S(8ye_(Ut}Mv$QW zo!x1Em{(ktODg?*p>;|LH#rKeM*K31!19}~_#0IANMZymv>|BhAG^I_g&3p>z2+(S zRgurt6Rn!kn%DO1+*{D?F>LD=krQB81Dt73v8iw9dk2uYGWB9s8nIw#;MXG@$<(Ls z`(|E~#&3x{POm{oD_FzQRfRgY!SF_-THs9JB%lqJe5%~2`Gyz!YSIOF3*tsU(>njF zJV9PBpA!6#u;7kF5NEArQKAohUeXm))gw-u4ivR9}qXeW=;xTUsbnbsMMrdtVlu1a&qrYsWm{&9Nbe6|e%N6WUq0QH_TlyX#3K6l@~XKbIV`ZZh4by*-jy!xXSxEZsPG zx+<|_*j~ekNj(iY1;*fh@x4707V3-Q4#PQ?s_;i5S<=|mx)T#hQ=k5Q#&R?<871=Z zDjcaZ278sraeWu%N5QUUDra;CwDV_1a}JoSfCn+zNxzO}#1$1rS1jfhJSZ1;^hYXw zMJIHDmRg&7KSqxYe9pE9qybVYtMqfJV;>4{yq@3SB#*zLnS^^7l?5+LZ<`4xmNyb5 zS1%9Yg!XYeFX2#`zU$?7@Y>hmVw$w~`wFxpF`Gx1h@ujA+wZkc6heh($EEem3VQO5 zKi(7iER3Ggc#@|CqM!#)NH={1b2Q|&?p23gzzYf%XdUh27T>YabAtGwi>ZkOBUWOJ zhv6W&`jp7{E>zH3D`vs;H7~9cd-dnfA?Bx2P|awTaWqwXxg2b=hADTEsW{>e)78o9 z_v;-S%f@Fly;A-XN!A|1y_}^cCo5%i_9qy`q&Z(;#7t&hPhU8&5##!R&-rs@IW!<3 zwI_pa+GEKubKRl-6ZG{%s9lfFBW#a}6cM-2kqIz|=L66K0zuoPgjR8i`dz^{YWeG8 z$tpL^y9sbUm=RL0UYJ`>L46dVf2M~z;I7|pOYZPz+Frvl`k2N=b)Z^eVE|PtQONHITWr?#N8t_6BC*+WzNb z;?21=9#b>-1dOzQ-UfGM9EC{Jjw87Nli=JsijF+bM~dUF$G(fq!FipEb4J%(u)aU% zb2{}wHoo?y^~;954dp#c>@ZR>uO4kHP`sfLuvDo2HT9(%m_m#$m|@(TqXQ6GjVBc%o5jEHk|0G1;OtmsUMnK zyPj8EzYvHZc)m;vvCXEx*S0fNomB?K|rgMB8mTRM)d(;Klv?{|IgLEi;a3v*U4;zZVC)sy$E+Az$ zCbZ%plZ_MChb@usf4_ZC^DP6?Sv3YsrKezoxlq&rE{D*uWmWqS<*reAjM0cT%jMo6 z6Nxtsab5_6qws?vjejr+gUZ>2e1l3>+biiuV zneoL+P~n=ZG0|a#Fm?YbS2>@CWNKL9sHNKvu*1x6ML`y;46yy&O1m%xc}ihLKVeM1 z^KBjKt0utP-bfE$V!t(L7Mk>khG(tNvdlUDrj!4KXL4P1J?+}Z%6Cy#8RFdChx1|g z)|)Qlf<-1MW+;lIXj(w-vtLts{m9+5Y?>t-g+y+bx20hJBB9JMW>5I4S5DoK_QxR~ z*TeRBGlZb@;>ZeZMSVWYi_la{0l`mbi5tuW*W}Tw4%Rzt)Y34&_!sqUA&fMV_dmJK zt0XZ@jWDzdt?cW2or`NjU-d>0J1lA4L?H7uUJVn{S9m|kppFVSy4Ym$Ua|0tWo&L3 zU}(`NZzY>IjN|P~Y`hg@7oFu>wu&_Rek%wo+Rtg*P%6UYT=ugr zCAScPONG08W7hmCxho8+#t8X+nx-qNGRU%xgv1SNT`lvXM=iQZE`)R28TH3GtLo2C zUIO^mtRwmimT8uyvXFj5VXR!yQq^;%7S(4(Pkj#H7lLCIXs*&l4k!$|dL$e7U4bEk zBV?OpTx>Aq)wWLOrO_z9VzHT)*jZ`eU+>kdDR_!ncQ?_Ovq`>w!d%jP+AcpI!@@R>hrPnH5$97h5E7_N>Rn=yOXM}Lh>Tl!S=E#B5$;Uu;*UPLs}#(E znQ4e^0R6q1QHHDl(5=&20jJ=#!i2uY-yWnf$DQu7GwO-Zgu+dI8 z*BZj{Uft?FTJF3Mw=|9RmWMaYN2ChEr`#y0((L7)LJ0?CPP8iTOWq`0a4uB;p|$Bi zt_ht(D0qY;;+PV!1DZ3YhFf3!_Kkr(S$UY7_Q*^yeQ7z1)#~iEOpLlSTw{W?8(^ zKeVgxd#@B+wm`o%9CTyFjuNR`|FHIJCoevdprz=78)3P{=8CVW4vVbXpphTP*ZmJe zbiUd^!(r2%3NCGswaGH-n;+bs^0_d6Zvq4lPzO9&r7lvCI$3^kNzRj*zMAh}=TY%= z!cL2z_7MS#krRgkA2*eq$tY4QGiLahN9tsX;MIV^=;A(9 zBt%qI28@uqygsr!nFa%wyY-iSWH%;R_;;gINOu>O8*JO7G~0WjSQyimKm8f6TMSu_ zhQ55{L9j;L2H$&+80*x<(!x0nZi%au5v#GR_QZ9YEpv03SO4udhQNg@%c|HQ20#8D z@)tPu%Hs9KCS=fO*e$P0PDs6?P?vBQNhR`kHD1-j5pKttQ|yRGOQtYz+Zv-F7kRUUB{T@=86nzD5eCk%%n4&OxK32 z-OD5OecjEoqBLq~hY8V1-1y!+t0PKAw_*=*Daa*xW)7Rr_!Yw?hyJAxuTDl91dN^zGF2b4gAXfgKSjPg(Fy9(b|IoD_eUvYUcf#;|Hx};Siewy0he3 zbdHdUA#u@QhE8q`DeCJn;7@aT_92OcsW16%Y^riA878HsT zR+?zLzMSP$m&094Tc)eyP8`z3maZtJ11UPhIY$MJk)di<>$W_c{pnW{J<)uzndH?yx!-fkKOo(0zMRev92L~FtE zvJs_E33N}aRfMElyQ$pD9^%Ef^lqBSPoZV#n_xRM$EL%5JOo!mo8|0L~G^VA!O zyR2<69F=3LylnM}D|!>!@tk`_5*?FR35wzkTqSf!1pTY+22^BG+p<(~!4j2g%L92? zo(TDl+HTH~uD4~E(_AV8X0qRI&axbr`F2(NN@Lyk7T4RzbnkOC6{rrH2rWaYztDI7 zxuo9paJ}$UkuyvA0fAdkQPM2rxPiHm7Uo@3@hOxo;L&Z(=Bp}^gj-u%D^}C_khh;r z4gQBp&M|UNBVuVr@PO$#OWu9R+U7KcFAPv3Ki?8rWLc=;;<7Yd{s4E-rW1moa8{+{ zsUl}(9E_p9=-5XY9TmObLcQCXX6kV2c=HJE8*57^A55x2D^Tn)15q|My6|HeEtMpM zcV11%v;SZTv-8J0V_kt$omUE_>PK5;+$b`k9NFT7XHj##$=$q$7#?6D_EcCGk&RPM zoUdoI$gV-(2>4_1hp>mUMIuatacHkE zj$t3_&3eTkd?KwBl`Fixqi1=wyrvmHEG;CWFccb5&I2CRXNFItSK^ClG^eR_5;O9~ zPe$?!%j#SiimI5iJnOI@2KThLB{iP-b1dV@?moQE!AxI9OXS=_T~&d8S|&d&%58U& zQpFX_XGMBdyoxAg;1o7TMMQFyVkH?g{)@^J2K%&^-D-vQsT}j+_k3B`dyJ^6kzBf8 z7!J6Z`8xX)M4Lo(hD7<;oD9b_R6U+1oBDMIuu<#eD77{YUh}E8jR>W|!wTqmkT8&dsJx7GfWA@tl7B=&&j5c3|E2gc&IDjTvi{5ZX{0aX=Kwq< zkT2^?NWP3$3BHWG%e;)A0OY3*z_?2Qco#t2_cdM~_Y|Ox3;^P54&YB@n3wqr_+Q4c z0LEPc$cH%4b5&l-2RHzGz5&z`jO@!i1ps~%1?Ug)0Qw;M7ws$p=nn_VFYD(4=$iqI zyA6<6H2^%F0DdC{$P)}uA9%_C-T*vE0RC?Tu!n;0W&UK%m+=sQ{*VB`KO_Az&m@5U zYk>aDsPr<=TL7L(0R3HndKU)hKe_<87=WEd0Q{-|IOtY6FUHpjAdbucJQDIR^DG1C zhXJhbg8=h|=Y5$U8vw5Wh|3^A|HK364<4#7kNW_?LkUn9vH*UV0_c0`0Cmj+Fm4LK zxL^Q%_(1sOdBp+n69MGgIeGPUd;e??GI2djsX5_0qDbzpmfM^@LvM(WB}}E>H+e~ z7NG8&0sK4%uzpDb#J30_-{JxK-g^K$GXVT!2ax|yAjiM7f1?N3SCatDiyP}@p4R|< z;G5XX`WOKFB5?pe+yeN)79gJsKz)+@f0GULK34c;d(Hs-X$TO2&=0Kv;zbEC zZXm$AybZ7}PXHY63j@SG5MVzH1&|Lx0Q0Q`sEZ4L_zD8d>ssyQIJN`qb9MlZo4x|< zhq(a!%m>g{{Q&%?4S=%(tZQZf_VfVQa|4i{-vRP44xlb10QToq0P9W|s4uAqgBd{I zs{x36JwSis6MlJIT!7<+OaPt?0RJ1lewp7;^ksYr0LKByLwJDocNSoO=nBv`bOGiS z4J!1P`ojYN4hxV!OaOgb6rg`L@Vq?kG=QB40DbZpATHGa`O^Tfj{gR*a~6O<2*6H5 z{Fmny2H;NwfOXRpz@8?6z8VUUKRy8Y(*>Zf0N`hAfW9OE;Gb=gm;EpdP`@Go{u~3~ zcL2Zz0PG|Lm@foC-(CT*6OI4nc})?#jL!qu!vnBhuL0<50PHvH0C>&-`Wqv_dcg|N z&n*D_Ob5WP1aRIS6~O=005~GRI+DWovY({@@@E79Cj!{t3Iq7Z0>I8vfIfz1@Uoqh z0DUq9`el7#fIM6RsOuSlmwB`R`e6`2e8B+xkO^QuD{3{v5z@jRC;%g#-Y<6M#Mq z!203|upWH?=<{m;{ox9rUQ$2@BQNbkRsqgW5(Au%l?Cuy6hOU90r30;=o<|H{dou= zZ;t?Y7y$5XfOwGs;7FjvC;i{#2fb%Oe%YTX0C}qbP>+$XVP53d=YN?$5@0<&1*kh- z06*jad^-U0#|)sajswIIG_4o&@Cl$Fb_3K!2SC5o0$A4&gNSY0b*FK*ip{_GzV(1r&joPY7ku7A!0BZCQxJlmNG zs@s1=MCaMgH4#vw0Lee+mHrW028e%oPU}F82qbI}|NaFwdjs(=59x>JasRW2{qUKG z1|9u4m`;z+XA7TGze?Dg^=vn2UFQEKmk5S>XJr95N5&2-A z`A?tuVgCBzGutx{3liwS79`w%^<~+gc}_E*d7iTi^jzwg=lPztJ>y}2^?e#4K-Vh? z!SXVmHUG;)@vqN$#i9yoI3W2i&#Q8t^PHve+5hkVi_7h^eqh6MK7bCZ{}n~FXL}}` zpW|!v7q2INwtubo**`mfc_hZ4{d{`yf9E@2@*EeV)91XU|I6bn@i#8(&-PgU<>AD5 z=8unkj@NTlf}RmC@;u+#|Cz5*(zBhf4xatf`$*z~ES(>kdru+0Xy=6I-0;J`?}XfgVWyv!`I-xxeM%J^SJ0FOTfebKd6tKeoO* z+{t45dg$#Sp&xqa9YR0!&_P-NK@gRIRHa0UbO=aSAP9mKB_K@{h#(>$7^Qke3`Im~ zp@>uoNKuM@duFZqp69&JZ~ow3_u1LAXYDe5-X6fSKIt*h)8xZ_Kp!6y=wL9S>1X$Mul!>xuZ1?#7gC{{jbBS@7FDTyH((1k0w* zKZWTJp$X96;!{K%+vM%Kz(KlcQwH9J9mBuCj-yEb?IPr>-_Widq)+$XT=M_p0oajb^~&$4Hj#Zs3nv zl=`C`{3q&1yF3&$bP4Kp--rB9NZ2D2{g7{^EaS;8#Jta3{rW z{#7dXpQzXU81%!WS04rWiuGFj&mKkIi_J$ozD54`-H;!B9dgQ%zV#FMd1xZ+yN>kF zMgV8me)QMh(yywtgZy|l#OWf^mwd#$_Y3GRkzQ903TwNl!7^c&f?AaNI%it=NsZL{ zj4TFy0@Yy`YsWIl&?kNuIQONVUYUq$`Qh5|TidSdU!dN^F~oIQ^5@ThIEtME{bSO{ zx*9p_@Qo>=LY0tA-%~vz&XHtF4J~Xy6*?w-5B`GaMYC22OvMt404by zl}cPie5nWU^9tlY`zz$ct3pm@(m(wTbXN-KCrSV8DDd?Ehdi*7`26`4^4%9;$86-k zDb3WFxW>VbB&+TnGa7%0>;j&J_=jbO=;uWcM@ghVsf>O(l#&|fBhN6-@k|7swP=6} zIiZht8|Z^L&iUjv;x{n@b}32ub5EgOZ*lm8wd1jm5Jz!+08)zew^HM1$LG*qtLIZ0 zC+K{r{!7jOqyytO=m!-9UH01bPbTMSg<4+*4u4iloam z9mw}UAGAWL2HyeaxSpU%v34BYmpF`szx_-(HRdwjec-qC9+d>BaftfSt_|d0_$uo4 zoravTq~HFX{?iz8R*+sWJ?AyqK^Is|NxlQWP0T<(&rd+Nm52X(v!wR7u5s8m=N7JL9fSyGDE&`x#Z$Mv^kn%g}JN>BFGYop}A$|Qd(*Hy} z+VRrn7lD7cCOpBmw`m@>>viC>F+BuLs09Cv{SEo^DSum9$PYAy96N3tmlg7Z31prH zg;=^8Y*){LwVf)8^H@ z59o(o;14O}PpS_66Ne!`JL!3)fg0y%6o{=MJ?%6-SIwbq@V1GdR@JNgRq&h z=wHVBAn4PO^ws~szTq{n?`YDW{R_H#CFnNq{WcZ!#4pGL*T|peBIlJYQ|Gth;@Db$ z?`rt-b>@>YU67aj#n9folrwk;{bUaOS<5Luf#z6xi^XzKO< z+tvsuNco*)ylVQRxzH07327UxspS70yOKOXcEpBkul4CSoy0*B}s@Z0&wQmHPN z@FWIV3HZU{A@Dc9-ms982V_<3DB2bH6Lz%zxk=VZ3_ki|ofK>L#geym9*7l%KA%(0 zopYeO-iIbuPAC)fcaKCq{EqyUi?dw~AxG=1%i2|t6THyH{C9EluTq(T$`3tzu!G;79qsZQ1Ah(j|5+aK>lzCA)}L?M@#-Yl z7icThzZLRls1Nk4LOuJ-_(c1OyBWr-OGq#K5Act-27MXZ+e79%CO^CiyUe3L*?;AH zmi@T(!}nzzuH!D=0C8mP^2rRy@nnSj@s!_KHi}F?)erRkq;I~^u^UZ3+auVbBRQ9rD+xrR

Ya(U5!E4_wjUjp(e(Gq4ZtNe|t#pl8^qM3H(V}&7al0Qi#()MbO1P zOqnb&=2F?z!2WGW!T(G@41aSE25yIN`5Whh{(-c> zS-#6V^cao2 zjy{#dQe66dZ*S0T92JZL2X8NU$Qa7WL4AT>LLV3Dxn$o&_si}!pnFK)uodm{G)F(a zmAEbW1Nqb21pK0gDdQi~Pb#3^2>mA}2}JvIv^w%e70P*#1A4}LgTDghd>n;8#Q#QK z{gL#H_Yq$Sj>E^2{$m#8TVLVSIREhu>>l2T{8pX%)T)fU>iz)yDU{Q<8}%vC*-%=O zK5sYlQC~xjUEl7r2>!21!Cp4M4VcF~a1(T!hdmsBy4c?}r~C$C)ax6LJhO`QJ;gvz zbcY|bK_;I{)v&(H#SFEkDLXA|j9|04cem(E4{hz*b* zV_aDOsUzbz9Y^l|@Xzz)|2K=?N0$BQ`N&tcUB$VN8EOc>vhAwg8U2N42Jjp}gXI%g zOdc2lIprunb8XZcY6dxHX~%=IzOBbUp#{L_Pc|TTZ;lgoK)#*#wda0uJU`@DqWs~P z*{^j2o;fJLWPgrhzoH!K`HVQL+o<;)%6a8D;xy0$;{hu_>m%mpyYSfhl#?VEGjw|s zTyIIHoJ^OAa|VnpP>e<9=( z4rkQsN7(N_gMIBj@70e{uX=!XouodalOe}-3UaoSUbrOf^*8){E$N4vf*x;&c(i`< zo;+xxaR_o9)#5PZ8TcdFQ{yl&f_8;lrp^z!dP9!ld^yN^&)!9T@Nhl059u|oqg}yk zz!T^xRk|AZ{r{p}R?p5~BObkTp#R&%dDv&LqbdV^Y+f4uDf}~b6>+zd{M{CE9P$oo zwD!$e9scjL;o^Iw( z8`mfLAYXZSuERzCUt}X&$9w1Uarvg?+7`oahJnff^XE z?j(QoKKvo{2>dp_4m^VXk-cb_xS1)X`qI9yVcccM=auE58LfYq=SFNlQsF1m>vyc@ zlzavL86FJzU(sIuJ3vm1`xKQ}ZwGNOGhc25JZ)YY*$w{Sraz~Uzm4SQRf2=+k9-~= z{cJkOi55e>FEigh=KfbK4vX0F%&98GvkT-{`R?DDH#knF7?s}-`LV3<6Io_ArNAKI zrX1@e`|1(TVZc+q=w(V0$MfE+@P8|RHT&yC0{&zDcH1KKYl*)gXFkNJ12SLKb_qTQ zKe6i)pSR;UVG7#YvNC>9b{+UV+qxSv8B0eqP&lO0&B^Q~D|1?3n_LKfzI{3-JTdDKg)e-P3j~5x{Pv)Pb));rW zCrvdHBpgh+B;#J~KZ$wppOd7&EBR2@>mLA|?R;l)A;#m+sd2vYGy0Jj^SO(1_R6?d z%keyco^O)wk#jf(|Ixs|FX?mBa306;jLpNhn!+x@@8O>UyD6i(1GnHF}-hMXxC!P-d!gA8@cf!2Dodg_qlYX-d@b`6uA08&XaX;YZ5BuO5YIQ}BL8DabQ*uv4)_-$Jzf$mjU0Qp04uLdyxR1`gJanGd4gguXZ=3eT@FmlNIqO!yZ%a$w5bL z_i#4Yt0nm#W(00=$9&|VtS@Q)*hR>(`X7;l<^~@Z{K4uuXgKt7O#yv0=N}?*NX|m~`aAH41mn*7&w}~TGjs{<>P`NV^0151^Uu_HZd%Xr zSP$4ymgP<9AoFg+Up94q=yx0PUAN&sd5C9^CbVNQ$X`l1t@6O`?jC4w3iWw23H}x; z0}r=;GGh(%RV(x_^E2TGg;Ee-E}kbLSrwujRSWetr2IzpbiFb^^&>ODdzETF0rK6S z!OvkGrSjIzXy(6aLTdgH&y{%|K|ZXb)WHZP+T1fhH!=X>25%BCxfF8VwJRf}p`s5@3 zv*%#<0M{`r{^4uLw}Bk6my7(@x$hJ154+g>R!i1lbUgZ-g1sWD^1rV}cmeY5{CDD;jMIN0Cnwm|dYMP)_ImY2ekmT(Ysr90`K+J9W% zB2Inf(XOw^pY=HC@%gB?0qGrTB9218gWs+L50G_29gkt|(^VpW&Yi#~IvVk4^TY2a zL64tK9jEQ(K{qWY(y6w-+lcncGL9(&&qGe23-q!0zkdYwjd1*F+tr-spn~_IkHu~IYL1t>A@8MS zURv=8^uS8Qdm7gJ?NN+RA|22lSwBzn9P>{##QP|=tAm(TP5 zi_f`VDZd8j!^vN2HS|$D=k`148@P|-zk+&YTho-xU*LX3Y!m$1;6N~JtI5NU+-Z29u>H>OxNpes0se(1Lv)N{A!jW4x664UyqE?XPo2n6w>Se2l=tau;Ucc zD{&qXaKzoI4`9dOp49kzUckI5xC%Jfc~jM?kgra{A1pm*f8ZJ8IplX(Z=b=S$M1=w zO0nyNzcs`>-Ou&Ra^!!;{lTyY`Y_y;?;LQBrU1A6h4F)pvfrd}2)969YE3z<_M=|U zV<0TkUQ?(A0?B1{yg(fEyPP+(znXRJniR!s?a|V>7VYzIL*s(NRad#&!JuF z#ngUyh~w(eXUM~LJoda@mn#Chf5Z-EdIb63pAmkwi1G)Hgg&kSBGk5P=0ETg_dwL^ zBLCPr#D6BnKQbIL<+`=DmytsLa!t{HML&kUMv|VN z^MXhduD8>13+;d%UB4h6H`2^yh`}XB!uni^1R2OTfYEGf@VX z8aKs$&5lo2P=4fpkT39>(un@%(+|i34bog2A}2ryL0_^@T<_r)e-HjME}WO4Rp^*=xNWl z+~hiH>`&wwx{un~8vNmH@aGxS=RWhluO;LRBE8kutk-cbqqy~3$9;!p70|!L+e1$q zcQ-}>AGH_#otVj#P8sR9i%@UZB+!q!fO9wjySzqyI%MYhNn7~ytE4|)8F^S8LEL30 zJ|5XH)qd#b`Bo9PRQwMEHjb z{wmBo)138QEAq+gmmV@{j8d>{W~O8{dHL&Vvw>$c4Lo5O>2B#CwI3!N z_oTwp&|YW1>0Ji@@!UWUf-J4nA=y{ea-vyNL(c7({J?p=&65?l zU+L}$-2Butr4r^lky6lKj-#8BBI^~}j#0*auNcv968wP*& zYd~A(%d&B%>A@+;OYf0?@#~P|<2}uKq!;qT?txce_lwkj6VJhhU6>CJB>%5I=&yLM zvoPt`J8)l>=g*syzCy;a8h`IY;9%REhVvBnS@ah&Y%t}cPnjPYV}!GVa$fq5_&DY} zLvO(DF|G$%Kk4!U)`ndAJ537 zzq^8b<>&cH+wbHl1NpwMfu}56nbJw}wwB|c$bOUUt=Am#BXvM;$9mt`4LiENfMxGd zPQ_A?6C}UYzhX}4R!#m8M-Ue(h`QIu?e;bbR#%R*}$~_ltmq9iek0^h^0>^wSCKj4s9hB&qReaB^;P1oygit+79);s4Ua1Qf4 z7-3WGWxYk?p!g2M8{`l1Jdcm(f_9VML+;-h+-gD}M1fN2U6A7&ih6CoeCY-HIo}(x z@l{XuJ++>(UBJ_hud>KNQ$yDuHj*OYX3E%uXs>HO{KwY&I`4mlxql(g6qwSQ>veud zKNy$$HClhy6l5^F-ZlCH^{)bbdO?iZ*b)5B`ODJ0@E>0m=(C9Y7bUS6d^W)!S~8*M zm;v0pe5t7`^*lTS@}oR2VR6VTIO~2SzILjS?56x%Kf}K9%c=D&v=8|BzedE_xXzmd zJk=23*^2dcXMgQ;_}ld&&@)~!wVaQ|aJpSlj)zky=TU9=vpWOws*Tf9IiZh_^XqZc zzuGbSTWR1g(`{3R+{XAnRv&RajQqRuFn-TKe~a^pi;&}955%UEe+t*}&D-vnKM4cQWF)IQhTd0{vZA&`))sph+C} z27So?naMwo>qv>V%qPTQ^gj55oAdO_{-Fcpmsi=Ry7vPRyE?N4?4iee8PItDNUL z_rGS91kNt5pI96kNb0+?-$PbpjLgGTp2{eVCLDri_W^}q<*Hn!E{~^750P(1nBX7LH zdJort{PJ(4mf!ap^pBQ8dto(sKTqbZ2LCdsw+7`G;JFT$va_-z&77S|srks{l3rmT^kjiu6u|0P8y;>sSm=Orv#w?Bl>@bOu)zEm`A*y8FAs_z3CFvXBGEh zyhn?yj58w~Hzt$5dIIEo$HISX zJ{c$X5RF~9?`iGQ{|whHdEYsOat_J)B3-Y4All`o-P6eavi6hsF=T+X?2tmdPZya4 z3%*Y|Re5j7vmA7LKD_v5tQ*YYe3RnUWzxZs;H7zS|ViUpWf?Am3#wNc!NPKo9qTN6Ge(DFK-;8+(;Ne?5@=f62QX zT2D969ocdFM?WI}#G}BuFy-t`M*j5v27j1M`W0~iBc~;BwtkXD#w~ih5q<&rFv5DL zq=lYd{h+;+@|5#|%m+38{!NIl7342o6@C@xIeEKoQ@Mq9Hwa7oTB=Zd4)3D?4 z;qu;smha`el&i`AnB(Wzc+~qL>F=CFdwq`kIK|IEf6qkt^Q^S^LHK`IXD;V>*R=aW z_=Bq-+PjMKKV45h;l5-6(iiSRJO+EiUN*i8$pV7G`7AuGI{Dv{gZ-KwEZNym@UK#B z`jK7~l)~hn_W|Npt%iIX@3}tZ`S$U!S7!2O{0r@MJwd#LN&kEk$?KnX438-$^mArf1)=02er%lH}3$45bx)@DCc+%*d46iL2@$joE3n5BaJ}+ ziE@_6y>e||Kliz47WMn@q)$iQv*#_VXF+>Iqf+D9J3ZyE0euYRCyV15|KWO3W74_%k9S46g(!H7JCtP=8_oybgkLr#L{=)#QmTGS`39|o6ln)2(_ft*AJ z)O&*X6mO2W^YYx9jq7)1yrlJX@g8V|a^_Zqo)O;rC_#Ep&U1ZSZ_h>g?ET>Pe*pWg zB7M&c=L^&^TToRd6e>UHcV7A%GFt)~$1JW4rVMc}t_586AD^pic{hrTJm=LYeqB=>hT zo`Lf4%pb^Kjr*YyuFF{*`fz6(qHNhJUxFwj*Z97(s7%38I6&= z9M?4EOE>7g-yz42D|X6wM)P|d>j~q}U_2k={fPdo_X5uqyT+h@nMiuxBT&F@X3!_N2ji=3)IZB+_-*tw^tbDW9Vdg|&G!tgpB!wd z{V>1sGz6Z>thWo#`FQdGx0RHiW*7W6Iu!cYc}i8TCnvan8YTZ_-lvE(0g{6$zm5cs zvG1SIb1vz9rN1+A-3#)qf1cO{JGxSUXKUtx;nLsf@vY*#*y8rWVdSN9e2*?W@`d=i`p`v1?9$&jNMM~E_|3dq8amLFXY{P8RK{(`hi z`>mV%w&hsw53hhfQX6>6HjOEFb3p$c8M@^8Du^?~9q7)m+vds;KUF^`QT|ARQ} z<>Gnf)uazSNvADE3gXw-Neu89{Hc0#yzYtj&pkwI1K0Qm(t)0z^jS?%Z-VC`ZGQV_5XK4KUXXvD{Lg5YV0N@C zM*7YQw3p*v;qm|AhyFf@_oBqV_fY1gMac6hl(Tpf?2?&&{v7Fpt3rNoBkGmqdQ;rT zLHCq}A3ml0YVv-U$s2267dQDoZw9;gc;AQVO7)TRcp86K9CC8epTFikzTl%aM#3lb z!(3Z{f7G#_R+#h0NL~6Z>rIx8JS{)ScUk`+z0q5+i+2$6iM3?ss5hcNXeGtYBj)hlqM!R{w%!f(G8){vJJt^mABA7} zIi628(v*6V75KaPzJbk?fA0g`*9Q6I3nuQI3VG7GAF)h+sQos=@7-AWIc@+4cUHv3 zt29`AAn=dzenDC4bB6tzU%}6993AJono+(>Jb?T~WgwyB!b{vNz5myYIyQ*JVUdVLrft|vYG80RQL6H@EhsWIm} zyl-XW(f=FqkiJI@q4^UL_=EMU8M4k}CP>i{&uQ`p ziX)#S8UlYCFGZT5U16Sgwf#5%j0BENMzc+2_^u`W^3*O`x9y^CM4ACx52eXs@>d+AGaB z<-1il|KNTTdIm@zeFglUyYO2(Pkiqv&o{PCJ^tCta|ON|@XyQi|ATVgOzY`-1M!lN z@~54EAIA870qf`EW}sj2Ir@dV%Ybv_v+hPh66MsJgmG7R8tm18^y4||{&eiL7sS==LmL%)IJL#YN zZcb;$-Iif!Z*T+fwEgBfS*X#)7QpOCRFP#g068}Q-XY})NoSz2z!BQJZ zKP%_1wf`&Lvui>HNVF(&YwIIbX6bivg4L2x6m(yx*@;)P5Eaf z4`?}IzGG0G^nS@0KSbYvoHL~VE$bcz2Yye-;=fJK-)g^#@ZEdc?@T*L{RaS_d6aWz z72|qGXG5vWAJpW#OkVD93L>WbAoDd-?;r5knxxmW_qJY!9B3==Xx&G>?y88>PQ-eULB5Y&p7Iw?hn@-gTXWJk%Ep9lulF7J$p+GA<17 z2`mN<;(n%Ntq%FYbMSw;W@XB98UO3{hO;0a+VjJgWMNa+8{~ako0mq48an?3cyGwo zyJtP)>nY@?r~D4$NZRhPv_4bcVpOZ%kPA(k9^t+6I;6k%DR2uVqg~Z0=STy#D;YT3 z^Fs008IPMW9ym_^E_|0Gx)u8Dq5LXE*A--GK{py_jWW!GL`+46g5BaCAg`U2Lz`^cM{ZJYCEw&H#`j7nm{)HT0-qiKZ z2m!YM-=na8aw7};(C7GmLB;>j@Aw_xg?WAwaQ2smd>daqb0I$@9OLBndr)tX?|s?% zP6Mt3JJ%uWmVv#z-y)y1AkJr2;C<}yjH#xjVYau|$IvJ62yth}Z#&n)|K0rFkoCjg zn73nmH`wNZmOtYhNSy0Dwjb#?0p|vTQ=!k&tf+Xg+_TVrnBY4eEvV1U0?1?03dqAh zkbbT!_?_PYTv!;mxgGE7Kgk6AH>d3y|aC``gROzv?vfiSu+B#2mb!gk$+Oi zfB!uEIl%9n79{;$8E@!z`FQ?cx^+`7dyc0BOko0u0U&I_zv`lKVC^?+wN%8x4gRW-;NLwc2J9RJ)$9xhEi zpBJDs&asKW|3}ipt@XIKuw0ZzzOr(1E`uK`u1hqc{5yOnE#a7luH!xN$VKQQ>C2Rf zvM{de4HZSbi&^hC`Junt1-nn>c(1>lgVOxIcM(TPl#@0N9AX>c=fBV}&A&qb;^8}5 zZ<2qx9Aq-%3ZBEX__yGD&aOt#b0GOQ=7L?K*MQp`(sg&KeI_&p<4=-RXL;XP`-$f_ z=xO~h&1|$QvIFBoyDo9=eb7UEAF>N^IN$=^>o~U=lY5;eF3v;#udI0Yo3sn(#nx{l z@=k@;C&KSn+Ie*SGVq6RP2d)xoSDVp&z{}DL6#p)8C;qDa(dWB!q$|VUm$)%_kg7B zzy6RsVB(JNdqA2}Gv(l!)+bsB{%_}@qf(gP3IbvHo+d2mLBH#sl^~S7|vXsn`E!ao><;QB|rkPE&xt z%^MqDMSci>1WlUq2PY-&3=Vv6+{S5t_FtaesP`x8IY{D8%k&LP?N^)RJebDK%lCe5 z-tPA${fFle7SUcac+N-t5Aq|_$2Sl-dmR4!eM{&W%APu(dmpjAd`GAl^_;gDa>7MZ z+v_9l&w3r-xw|0uf;A4oEU=3-)071~Zx$h*1xc?e=lV2%l<(Z;AwAnkI-qD|nLjo4p5kvKAW ztQX?Q`omW|&*0{Hfc(^_nGC254*h`h1k!uR_wuxy#B{_(McQl4b=cQ)9_t&&$e$%0 z{2|1C99c!Fjk2(y{UpxsWZ7|YH}2P{X~+y#&z^07n=cI_)Xode$^zyp!OhM4IM&~0 z9YnouM?V-i4nOfEK~4(wZ1D{FIl=v=?4)0j_tvzYzLuR0#kOnsm+%vJIoKE8rPPv! z=#S#P(H~hm7Apz+hKqr}EahJx3I9wCgI#31!Ia+Hi03bei#g<9CVFapJba&_KIt!C z!Z^^^D7C+}oQr%Id>Qh$(q8YT%OLMd6jI@i(34`+FDKzwk;Sm@m;A%O(m?GGfx)Tc zu1k;W&)@72n(vng44-ZC@+`q=(u_~-auMsN}QVFT-(-Ws?Cc;0L% z>2W*m<#!g!lm1o$;~AA3^Y_-z;SW1@(2i^uyjrP&=h-h`>TVci8`qSzuhRb=_l1X~ zft<)0;Qtxe)xgp4b9XP)+mU{_PX?$Ohrn*gx9_fhG63=J<@ew+Q_i#x;fG$nA7%TI zJYOT92TLKoT9N;`5adTn!H(mYZ}0U6{?7MWFFixMd_0F>^V_g4l%Eyxl|uO&7eSxs zY}jiE>DgpmSNHoLaG#N|sVY~1kGmZF2crn3ei=eJj(xE!y}|GNzQA8H&ochQbL`fy z-W|mF{i}`9WEJ%}`W*ZHeZb);>DBDGh4;(+q~HA!TY-EVwrgr0$cb}aIf8mFTL?M+Zjf)|tCXCdG2>@` zXG)e$OsV(`@`H@`6O`i;18IA?@4_zdQu)r&TKHA>4WQ&8f0`qhUnss~R*LiN(*wd;p9j{t{QDde#Z zA(F1{$MNQlUby72|{;zpq`6^cUs8q2_l#4}O~;R$XVFc^UcPDf!1se$ef5(Jq-u&n)ZznjYc4 ze?HPj6#~w&ZjdvKdSf3^d9xCfGkdJ=Uka&+BM)yX3w=UO;r}*IPVb6#xgGbWOUeBUja%#~^tbk1 zQUm(9cwcNJ>m4BPv}pby-xaA(J%|2?ag^WjUPpG~6E6lI$hl1|C)fz%6EEqX%D6@I`&t2qE~Gd8 z33iV=@EKMG{gIpJQ9b0}FZkp=bQU#0rW_l!)v9EaPyUFKKd z6XpB8*5BTj^+wGf9F4e}!1iwDJWI8Jy`YucZ=DV~UY_6hf&2^Cq254K$QecY*1tdx zy@UR-I_YQsgC9oujx@YosS#(HC%LaNfc)7P0#DZkL{@Lo>otV_5yv=rxx8HiH#A1(`Vx?SF_vS2Gko)I=>Of%#q7tfO< zgRGXy_}PpHc;3U}@ZufV#l!tX>xavJhkQ5RJ+}Hpex#qg4^OlEp0(tHp~0E!FgC8& zUc|bk|6}x1e(KZd0qh>Rf$`5~(%(7-yLesTuRwYW-h*@TUA11MKjivMya@c$jyGmX zp49p%$9mm=OQ65=yIn;lfZuf&kvojz@RWAYKlTv%SUhK+KOk>cVo)%wwy0G){%D0xk@c3!1F~^N4@$f>=J3v-TeL&%6WJS@ff)bx;#r_ z%4}IU)p9&9W4)yb{jgn0^p7sbJ;yiXytL+z*MeQjQ-0t%=IZH zIhQEsep}?9=mYSNC%w8Xtm%Hrw*xrLXM1PNLwkcj>m;BGjDVLV&kRMQpoX#Q}^%7c+Nc03--N3Jv(HCo`L%ChZCe%<^0k0 zA8_bGdgqJa58uWJ!RF8TPq<#ecZ@f%U7yMMSZ$ZYRE)>u_^v4xWddl%dlwOR(>SiE zorLy=7ofcs=TS0{(|E?1PwrFxluOXZ{|egmFX^Y`+=z)I$NR27)?z;Ax_Vvmmy-)z zTE0IIEdD+_wwB!Y5AFn>eW-t#s#sUQ#{FoUA0B-K{JosNq)`4Ep1bhn2c9->|MWNe zBgc8p0&*_YwAV3@Sn`D9sL)g++2X(YYubhJJBo2sMiyGNoFM%{BHWZ?Uc^P{JK$D; z^nHbyXR>4cum;A+wmSq&ab&%u?KMq>npXh zB>QWA7qT4XUz)-^@C^7%IGb|oFSIxQ6n;2}^m$&!MRmmW7}75$Ko5U|{wOQ;+$-}x zjgQxHf258qylA?6E!qpTm72?Oez*|))9QIZ?o(@j4sXPWu?X=W#(B4|Fzjx}rO6AB z553%%Nui#{C7YXK>?*KEr)I1N`6-6_n#y@K3#$V2+~3poBM1HanH z!0s#eq)guC`G@l4ufuaSQJy<}m-Ow`unzB?0gKrDu;yRj7C#6-vFFmOZAM;lUqT+X zex8H(Bb@WZSO(-PPX*-Xi1p_ckQ3j9_S$~!P6_l2p&{@Gi%-d4V6QmOFIAxayJf*d z+cCy>kYF{Xz6m4m`MJJr<&2R9Sj`{dciWkk)PkaDubb~M%d&$hgJ;2xF%R^-O8p1b zWB=>8XIFeB$3^=QkHg6Cl6QM_z5W0qG#CB3{wCPb`5nN$^U>Y_@0sSMK5q@dI4a2R zQ`>chUdNzkz;UnSMUDg2+ZeySm<@ssodSQ{+uaZ>4hha5y?)rM59>WB3TXYKj`smR zuM0ihjgTKslK-6jzBc>WAnA9CLXLYB`Y#C|QyNSErPs&QI{2ZR{P%xPZ_byxc@E7_ zdUqN38oTrSMk~@+-GzN!97oxFeycn5bj5(f;;i^VPC0L{&#(HIpkB*Ast@eqe;0YC z1ogb#8TM6YVc&TiC_IvLUs{fr>w78GXM7Rr$?t{?Abso$@XsLMjj{9Mk8gq=od^H7 zaXLue?a}>jl;daX&p&+$eS#eSG^Bjrc+NL>z;8#B{=T$J%kgK2e7l|y6-P38gWn6N zN&W}C|D|rjzVDEpS;hmJ-+u;vvX*$Z@IZd#AIL9A{%g_@ZLc8jN0cDFc4o+NbH6eV z={J{vKaha_?zH$rMHy(BIC7k8Ey4Mk`$gzkiuQWpEaR8ss~VJlTQ)efoOliR{~6Lx z%L5C#U7@GQZ}~}|v>kak!gGd6q<<#|5{w_d4>@++IH~~rC(8TOrO7}42JGeL`$EM@ z?=Fc~%kl6XhBl-x_=R+ScZo2lX)>_a{Lb^D>!pF39w`F-t5czRw?GeZ-Nx$qQ6;o1 z-V(UwB5qlHh!=l-^zX8KXUcPOj@pa^d7s7lq3aU-JUr-m!zahyOzHOl{K3ojC@g;s zzBA_f9eH3U>wT>%<|7`ych?$XR9C*c9%unQU$c5X0{*Hz;`9>vhw{5oZocnSg7kE9 zFWBHy0eQFq=^1|oJ=`4qoqQ(Gl*y7$Ok7Mwy!R!4+tR4lQxN^T?XPuw5EpaE zUr5ejYB@3eAxw4pSztrwK6ctA``ZR_=FNYX)ZV~z&7sprPuBNQ%f_8;_ zLQfgin$pV7TPs5!31?FxKFlKm{Qi;khi_y(N7w5+{-WWNZqAe&kDyO<6>x4wdf|ES zE5+|_Y#@F2a{6t1*l_^c8+iyk74IV#B7a@Jdk`4_|LIG=J^zI9&h=jFC(p9e?puLR zb;_wP7umG_?y>Mso9Cxq`MJD*b`?Vv;DQsqEWoe&;?yE@_vc^Sw&DZd0H4 z)`Nu+M|S8ko0R8fm^IK@a)Gp zI$Rn!JKuBLFY|Go-<;obEZ2Z?wlXd#r{U-5XQKs?|E+!Zwq^dT1O7hL=cydP({_pQ zoTpuP>c1C$9wq+P-+ZeeC+ryK=avQ zP|gDABg0Em`V;{@!FeKT7jt|L9AfW+V)d+?p7%ufewQC&RQ2_gb2&Bs58AOGNsAfQ zSn{WQ3;ABhc)MGD%6E(pb2bHT?lj2fXDR3WLAL7>#(SOF-p$PHL#DyKVcYhoBm*e~7naST)#^)M;*In2bzf!8=6y~c0 z^tnU+5nOjw9g)YnQO|vR|I^b9er4xbulcx6`z6|YlycVGM!dwILH;7r#|oa>Z~c5{ zPtvt1`_?j#rGb5ikp9vM_>X5l?6raV6p(qDmgD00FQAoD?@WSS{0Bj4P5u>ZZ)`Q> z+xz>|S^|fl8~E7x{d6JdZhi-0A@!+vhH=yb^2NKOZ-`M}@y3xNXYFVrh&mmSaikMXYN!0z@vrHof0 zC$Sy$CDf<-1Ks}?QeQdFOAP)DaTNO&@f9FG{p4LZ-7kmNOf?eRl+#PjQE0l~v99>0 zEU;^weasKmZ}WV}aRu+6CR5Gtz)!}(>FVD9mkw0x~+;5F`O^w?Odk!iu^j}H-iP_QKcwX4uj;n{tMuyfW@&hu- zTeQo*o4~=v_g=D6PCCxZ!p{ST;T)G1knTY1AMT!7f7e}%H++A?udKg4k%M!(UQZ$P zvvM58l=HGLsp_;f;iw)+ylDNS^$X?Y{Z~H9`CabC7<|Sd9&NrYdIRwi9{?mR{pW$mx7~e+JDX=d z9gH|~&g*NnWj}Hj_#dS{!xCKg<9nw-NvW)IuUy+D#_!usA^!#WE~=)7;=sYy`^8eq z=Q|9RJ}rrO@|{4Lj+s)eC-C$xLw^1s8|YJHy+z~TX@UGujr<47Lmz)J#LGO=i?(JQ zas9#0*Y-_<-M#$INICNN89_VpdjTA-ss*IG8Up9?Xq)^l*y8xb-$T#ocI2n@5}i!Lb4sdjoS%5UC+b+=TlC*%a{-PHX)<_O!}RB@GH0D zJ*(?8xqi|ob$nI65B!faUvc=O`gBCSUY-xMelp+y=z;sN?_}1yNX`{&JlzrGA4y-P zoRxdiI^Kh8QLpV^KFR`n`T2bfKl$I_x|U}G@}3>%d@b`nEkD6=J8DIcp~iObKLLvVh8X^@Lh|yDCb?dC}(i)gt#u97Jukk6@KWA z!+&a#|MNQR2aiJk9c=JQ8Bm%2m+$R+$^TgVR?GK4fd9+$@W83{s+jn-;qDh1jJWp3+!d} z%puk3aZch5*w^}7zq(j=@^1#+>i;{>pM+~epFWho=PCV`-^;N5(aW>gkK};Al_38B z=Gy?rKXRPOl!G(SE)UmXWEsblmwUo4o<*?B4boSQ1J1sTz(1Mzr~HWc@*njXPCG8T ze;fYe>H-`pQci}Qp!?e*FF~48&9}h5UhWHEH9)BsUxYq>t_xXw?rs2opamqzHi{{K z%0yV(F~a+aV_ENqc@Zzs%CNh|rw!keadG}`1=qbcd-JF#7_px(69^ZvW=H|M;#|7OUKI=(l(P|o@2dc%Bg!Ro*GAJBcg zk5-uVK57m5itDkqU1yrWUJ<^7ZO6U$Zh#)F41dc-Ifpqc1?7Eq$3QnuK=6Ux7bYr#?kag6?#W&R4-L=zoXNAHI14J^f3d{}|Gj76v_37yXVLlQU(PEUXzE z-a({vAwcbA9Hi-C-gm&SWE=V$_;d7M__NI$!L{_mnW)$LL%UC~j->jgUdKyc9_{r_ z0dCe0+uQdf9q;wkm-Q|)E-ivQDZ>L(Hq2(8=er_7(krclK4IPmnL+wNzJn3Y1v#5Z z|6&}*v3|!m_KMuw(l{g>{he3#&CNKU_unNgnDX#F_?e7vlZ&1i#BXkn~xlQLoo=?)Rhhkdxr|$F2MoS(vYO!w>6F zPLV=rm+KKczicM_;iX&fw;<0^S0R74&GgT7h{s-}_y0=!RSq@K@g2;ovR|hCIW!P> z+ViMi(vF^1!0kBYEUbinA;j+#*tlyZ{-fo%roo?OdS!~M0sK=r&WD#BhkO;{y$1YB zsdu?Q>lp%yoo{xN{aNEbeCNvIR!h!fXu7L3a7&_|Ztlyt`P~OU>BT-L{v*)OmLz?% zG*Igw;d!T0q;H*tyb&CcI&T~*MZbCvINR~Y;ZtZ=^jE}-wPU*1=|8JM&&K>V?Q_^G zv=DM+m}g2bg8c8xfOgsS_A9dgqV-H9AjkG=X_7IHQg5WrhcC!*Me~FQv|)?zKlAqj zPap5OTl^>ALB4hKel(&_sRr%Pt_a_28qGkxIRW}dN}~s~?P_Gt_3=EOwaYpgU+H`m zjX=+G)T*s4Xlpx$YrxOt^IoQ`oeSK&+#e)7s-OJav}0{^vX-Zw)hxR(ZUq9p->J4T=|7+)Wn{v=^ zli_KvT0JXMKKE_!k={w%$=G*nYWu#*^#m{Tt>)2XYZ~JJ7xbSCvbrS;Xc|wir?a8- zA^m7~#8+S_kdf^qQ_Az+uJe2M<2jEG^Bkic{|}P&Ni9Ff?NAG-%hW`SORXR7kn;~lzT3}IM zmDI}4bO48Z^14=L#aY?-bVAgi8H)csVVhn_qV|>*SAe^O$R+X z2@yA!e!gxB`%@nz(Cn&WTkwatZp`$fhRAn_biE$#BWIzWpVxt(JHIbqx+MA$AJ=tD zkU!@#-H#Mj10D0?=Vjck@sCwPKRYZ5KN!>z@)ggk6rh~em7$N9?|w8RJ!4_|AOsXN*ra(2ga`v%NeQfmwr6*Ceb=KAelZ zQCs3)mo^^g8JdB-Wb;5_`<@}kfj~*A9@(f5zh`RORdp-I15w94h-=kxPCGhes;SRw z{#7db3a+2DN4>3x+eMy>aPxg98^0TR0%srZA2p$z1NYd!b3LR!=|}g$ADrK9&nV+e zogdVf$Vj%IZMYxpQoQ#)hH}!#0>1Y1a1S6^lX|AR2|o#505Um9KVJuWy0^e@d(bW) zo<)Bh=DmKa|L`w>+y5N6{VeZw7(KcE z^hdmJBK@iWuG{7O?)l6=kcY!O=hlz>yE_A)=o7Tp>i zfB&yg?*RwSUf$P;{ewLJ1Nj>Y{#w32J>qdK6|KG#a$*ks>vDeKVLxv3c~u$zYyG_g z;co*ef4LX!O+--dQ_^QlVO-1w4lUUs^}7XntQ+FR-tYKy3gX?(ygiWqR!aO+>mT5K z7D)@HY?5~aOkP#6OPKUNgP@Pgg>lGxZ10oou%n;zh`Hpy6UY3>R}lGUBl!!-K8}{} zPm6XHA^-K!h&%6G;9&D@HQwWMu7~`y0{-S%fRUA5A84};_nyK-kxy)Yonrvn>pO&Y zp%+uCUV7*m91A^HvHc-&w6feX@T{ z{_nvr+X|*UR}J*|Y0y980HR?-$VuGCd~*QhY-Ydg;y%bx(%+DGc(gvw@4`=$b#kL; z7swIVO_?qCjP$tT1NsS@tM*I6H*y^PV+Tnfn(pGdvGv<|GLR@Pa=fp?-{3{^{X4n0 zrTP8mKzW<>&K-(4b$&0tXA1a3U0*Vs1BgSx1@OaA1H}8BtPs?^GxA1|`_VHgf0(Qv zn*5(ZI&>+?q~AP&dLyS1FAYiW&>Z}6FXFB#=~e$iUX7On9q7q@`aJOG&^pAgEMuCo zC$A`q&)Iu4azUTd+}a=H?TkHt9U+HIo2h983H?c|Aw3?7IJ(%x6qbyIzB|)`S^Y*vWI*(usY^np`V}+ zyjRv?=0Z+zDePXGaw;DL&cRl&i;dH=e9t+^`}p_B-()`G&UFenSE7UF;dsW)@AF#w zz9D64G1FBhHTRBfP+K zP%eJgM#99Dc^!d|^Sk6ex$vmtB6=72_aXmmp z<+$Ex<99*>#AEQq)bV)mCfe(9tOFFT2t9qA-zBl$`+Psy`MvV%c3+0yJ-2us;=9E0 z?dTsR&6<);zN@bFkMiEl7RnDz;W)(cU8+`cpHAB)$a~Fh@^6|0{1xB7T}`@ME<|fQ zo!>DplMKIAyI}Xv$-m($)@j|2^Kui5Lyq&iT z=syd;{gC;=cM1JkxFq7j=JT3knO7e`Pw7@n87=c}c)DC10xzw=#%&QC!PT!Nkj$v^%X;waAV5ZUo$uJMcuFEZgt@^>l@9Ad=5 z>e)-y;dQ;SYh4UyCh~uik9IkP_-a5uS#tq#8XE;1Y`=C!&LL|Y;yjNOrkp0yPZ@l; zo-F@qO1DzLGr)T;HXdIp%6!heAz@-lJ2@Ys{m1!z_F?0pr}s1T7lX(hU_v>tY?Rua1@SPl+w|{B@ zzjc0Z{k`8nkMq1oKh|4I&PQq7++6RqxLuO>kWHK>Fdlm=BO3PMY1Hfa0^{l)Y;U~+ z&@)8(V9LL_3iNPU*caZV)Ulb66WstgL&-n31oVvXUcAk3SC7M9Ud}_ktheDg-s@k5 z{Fa&Y1=3&Wb_H7^UhN%pBV-NSyz`g7Ig&@+(@c1$6E%aPF2=eRH2qaO5(@;rPJ z`KKxH2alq?S=p}HX%R2};XcEeh4gVBW1Ydp?||&4oI>+4uJB!gKGLn5vg$GM;k#Ia z$Um|->vg=#7g`GckGFxPexRH`vy<-ljz-fyz#+)*=D<4g9(NS;xX>W2IGzyu_y?k98OQbSWeIr`iuydeGB?th%+u zcPqRzVfWLdAM202>Yd-+Q2t|kr{1A`y8zGWq`xTd%xHgb4NIL@i-qZ*yjNmz-YnxT zlRq8%_-*9?gU$ni9jJFR^%>Iu?RC#Ud#AGAZq=FR{|EksT;N|yHhmoFJ76h~$KhGzRB>lv0=J{hU7>cN2$}Qd(h&$HJ>by$a zb|NF${IjkmY`hohwL{{V67n~rwbcx;eDe|`=88EN<| z!(gvOKKP;Sr@9ws)^m(Lj_+iRx(xpe)7&v3Fd9izij`qcRKrPzN=vM3`+tx{?B=3 zi1PC`f&Pibh?i`nr)vp%#Bo3FitK}EJtNzpXAbf|+XnoDeE-?zrEMD_C(d_Ta+Ck? zcfdK=3I4W$^d-DM7~=a{HZJN*e$e$MilSa?m$9`tj%^1ztgO`85%Am74u5<5d&Eol zK^s%!D%M+0Cbk-%=w}!|yv23DlhQ7oms~uD-!;S^$=Z_>n zG(FfC{wCeGDP3lxUd8=ZlGUNZjHA=g(~cVt$-0N>FUmoFf(SdYr5>+k z#{9_5dL0$OrdrAS+WuCElSzaJS_3~)8SQQ-{C5e+I?e>Rk7MNTABKK~dVtO@;k7fT?%QIdO z_EUlK+5ZIk3V#nde@gt(vL2}M{d`C18^UMZVct~&?Yan0;5!$dA%Gh>oT$S2!ez)U zKk+-uIUH>#uE+2T<9EewgC8Hy{ThA_Y=quj)xqZ((wWKgke(>yyn_9@dK~?Y<^p^# z?dSd$@E>ZMG7hYKhPovI)-7S!Q=O(Te{k$ieJS%<&3}ydGP0AOOL7lI+k^Td*@jqz z50Z1>TAnWI-K>kQx(;~IQFo#*$Mcs!#DdS-be)^d3O2-%n9>Y%7B;W^$H!!aGSl_-a@$Z%bonQ@&zniGvKAcafrl2q7 z+3oLYdC+$|2Uet1u8U~b`L2CMIlrp)8+(Qk@C5nHFL6f0 zgS;0YW^8}Er$dinw!4h@FQg8$O{Zl`8*+ma?4dr$+0A2Ea^&|f2PjDXZ(m?pH>F=1!kWaiB{LaM5=6fNB0Pla9aXjs0`d2^D-%k4P z@cel^BjC#k?_UD?wcY`rIoNPG0Q;|A2K~xH{CzSmXupVZ+%fTgkJNe7cB1ZpzL=B! z#lMH#obSkw5dYQq&Uz`&s$kp+@LezyS69e@qV2@v#nJdS;(yb~E8eg=Ir-&E}>{}}S>XQY4cRoG8} z?-A4_{Mmi*8F8Ff%-EfL@*T8w#P4~J^SGg~bFB7AU2fT@(EW{aA8H8kLru^xt2pd7 z7vcXjLB0{|4vpidGEFE8`T^b_sZRWayr3U)oU7l@{MoY>6h0>YD`P1i-tS;qq!K=Y ze7qN+-=0R!Y}eBQ{eo1LIxpuFbib_kV4udG?^R)(alC7vAoT(4IO90CT<#y@$6;^A zu8zt(N_ISKgz>8s`R^nLDRsMk$9@U|8_>m_&_!*Z0@S~hhh1{_JIsmI|+t4pB{oU~Y(;J9OF0P+Q zq_e-o0kFe(BHA_U0GVW7tK|^z!~S~^|F1s45A!_RIl{mA0eXov06%L8ej4^jE5P}e>jnJ!$NcD6?Glu;IUEy~w_V>|7@<}^1@nNGRcv=o>1w7&?@u#$)9rC+rj#e?wn!){{4OUSc5q)G;nUz6$${Erq`?C7&%yqg~e( z$R~;L$8tbLw;N~)`!w`t4Thh(Stp!nno1Z0xbIKo)#iL-I-WOEvk>QtGeNl|_02SW z7vIk+&vq-F#JJyNIqcTNtJ;IWXN>z$CyBrI9_mv1cu&?t__*z$AF2z_GV}K$Ml)dj9H&-cOP;H4nx1bCH-?HVJFc&u!kVwpJ(H^&>H+pc(=cgn?gR(hKN6M zOv3&;e+_>R@_w#af4kcp>p9VbuyYxv?XQKLbF=N?SLkaf;cX@X?g@gQuL$3j8F~*o z>Te&H`yh5c!*{f~oThfaq<$|Uo|yc>{Q~&DBH;fC?f-S&yRjVackej|c?KMLOO@-G z?*}-JTjaCAQnaf&fPcB>W`C(GAdW@3&hr}aTl>+k2+vpiNB9(;gL1cn-5#Qx6K>GI zIG-I%{0ZYh$FmR-tOeuz137=CjNoVRMju-!6{4GfMZJB83 zIP7VS@zliO93P;+A?~N36{W7YA!mPU_{+bf({VrS&GR4N`3Rpa_rJ6ro#!+vw}hQX z=Crgi&HQDX3+r;u{SmLA+3OxWe`}F`y(Z{yz=Hjod_MR8V7HMcklRz@uaI-3nxEKJ zj9+h2ZZB7W&(Ls;rwfTcBntidSU;2DLEVx%5?cPjsgURI#Glt)$A>&h)k(G?W?bkl z{nsRX7iFz9YXek?}Ay>~kjRZ|MyAxE<$L z8_2xR_EV0VCeN8J8*>_NorC`xd+7ZG)}vxs5jPCHEYG*c`2Hr%S@mp!{#s`t=PTrY z_btFftp9+YDm7I$WOchC-VYTC+MkE@=z@-S!egbVF2Qx32DS=(n z_mzR&nmF7&6XkOQaxnhhTN={%A;!m+9zQr@zJn2HT)Ex1N(8# z(??tf-2WNmX5^EuFy!Mt0e=aQ&+UJKzK8d-GO*o*)sS0&b&t(>(Z4G2gN0N2QCsnA zTQ8$Q-|%^C1nr#lY?Da8yqxpb>oy@rzIXXU*hAP2xtY8-o)!A?#vwPk?qPr5aXrB| z10&HVr2kP3=+VRZi;?HPO5ii>xIg%8H0;fP4ec8KfBg$~8*|j3|Emt<;2s2f_>J=1 z!}U7%8o=fHfc@=}{SobV7VE<&lF!!LA)heMZJM~WL=sD_cjx-USUJz2;laYlmyEvN zrkzBqgMSlOXH3L+5#0{Ef>kIL&BS~%74R34pKf9Bquv20CjTFF2y`OV(XTuO@C(^w zeOvPrP6FKcX|_q=Kg7DVMxI5lfq(T9?V9;iRw*E$>G-)mZ{lQjx%aB=%FDX(hM&cp z?|4}6j>C>xDS_JNXFYmqyc-V0+uJjq?$?;*}Gbi!W-bDWC+RlT#KVtm%eK{Yc`49eyNOF>N_GZO+6yW^=j3$!C4}qPyDL12Ey}hp6 za=qJ>6!2Gt#jr#Fhme?;{W@3(e5$IjXFuW7V4RW)dF#^DB*SM!=3}Vp>|{(qN%+(@)KMNFnYE_<7IK@V~hj&WlDqO|~hUc8kgZD&1~~ z`{29S?l7(^y1qxhz9PJ*tWRpcjx~l~$TY$JKIHrF;UUmVAL8HW4EkZmx#H5F03P`R z@k*|N*kArS$h#u{Au_;PDu&laYDFS8@(V%OS}195a4>+?IaCdk4n;m%Ro$@v-2)a$4~JbOZZEe>Cx}*dFF5 z%+D84J~br|*YXTxf&Y%sO#vj?{7 z@t(ekZ}WzOzK83RRfu1$3C1I9I^v#*15E{P`=cYzSwz2P9*~BI zxUZcP=<3oy=EK_{XJj2>Ynjk5i|hG@{@349K3`ydXY9Yv1;ojqW4$FS=f&P?kV9F< zhs|=2L-P}H-20yGrCt3E$)ndwwHCj&`x}R)nGw3iO~9=c!2FHXSFoQ>{Ds9i z5%-=s^gfQ~2ZE0E&*zKKujnT9Yar=Vn@fM}1^O!puiKJ&6yMiy5q@X9-hat2@7OX9 zGyXjPoBqY~z$OnV^bqTuuBMQfq0@6U;)ePI<4zXp@#KESv89NUg-Cx*J;=f3=vU+r z_;=tuu`>WFcbixsgYx4;oya;e-o!bd@VQ*G3 z;J-(FmpFp9lkg?zQKs|uH){gmv2O5)L+tNQZ=t`jFJYgLh<|)6@IAjn zF4xkA$hL+3?VU$^X1!&Tr_GV>YhMdG^6HsMu(u%3iPZoZl}ZLm&3};Zfwm`~AMu=+ zcOC3xB*(9PQeV^_FAAW)eaTOOE9~!S@Ne>vz2dMMKg@j6td~wokG$HK0eW$hpTsEW zco#r!J!NRpU-5;E4|@SO=c0e)`Aj$K|CspsWj@gHvmU+~k50?Rx9)G?GWc8q@@k71 zs)jq)@m2^y4Ue&&|4!mxq`$^(*N#D~3GNZ9&dv9DL&-^ser}?;s7ODh+{r zBGn-0?@0f=)QiykE55H9BmGSWU{_wwBTT?hAA@aaAdeaWzHfA_OP&f(u+p9Kg{><@cZQN;P8-PTk7TVS7N{i^$B(DyJ;HuxV% z{SX~jy_{#IGyEjMu0mPRUsLz{qUc@66F2jgb;MuuH}e1Z%#?Oj<_OPoj!$XllW(D2 zi~D!zwNjRxpVa*L9q*E7=|F$X3%@Y&ZOeG#7l3}(ke``c&$RfSX-UFsd<*_ve;{sb zCcNDk&~b$kC%Y3~h53oa{KU}7&GnF2LD0!g{E26vuV5S4kE9v)*JuvpALcokyu@E1 z=lS(~FzCqV-=EGn&v)(LBmVIgu*2|2825V;KA3g(oORJZX$v_=nNOA?erLH4tMwSs z3%v66BYfv9*r%EV50&A-{+`RZP>pX5MEsF$6#KjQ6ZrHy)-&BlAqVRh*r6;p+28$z zkb~b*5B$kp_>nsw#tRddd~)u~wujxYkRc$WR?0bT4Ug>vd>rBPSYIW^I{#>0se^Iw zA2_Y&&j!Ejqfc5IZq}0{0+vL%Ak{l@a{afnDAn}*XeqQJV&;T?5|OC*js2N?9E5~AKIY5!S0}QfbasFVGkk4 z`NLZ+Am=#WF*JU?t`+ee_nLdQL0pQm4!Mbw(`3C%%Q?z;_?YdMlX~ z;g8<_SYH}n7(aOVJN!2~0(wc!I50XB^zKayJ6TCNY+i!?29_Y-kTPQS*KaHMSDk@x z`ZZSWb!vV*j(Srq(t&?(M~p90Hq-u&_ai(N;_w)@yC4WUmgAkW2E#DEdwCu&0c6zd zKS0OFx*RzO@5{P>0mpcnrvdEEVm${#CtQ$udo$?W^vlI{elOp*CHrb#4z7prUd9Br zyX}4C10Jrs8vn{9=jC*Ki`0Z1jNSTV{ZPX_Un4Fd3dz3qdi2X#=X~*L=q0uZ@!Z6# zT;eaps+-KB&- z=Du*8b!E*s+a(!sPrZS5(Q8@X7Jt$G4P=G=6d;{z39x^+V|>Z65ABA_!A=bSyZ!_n z&n)=6$wMxcfZSAh;2Zd?{v0<80e>Rf%{CDBY_a~fnKvDo0{Mi7BhH(7#2@QHC*)W+ zIL3LR$5CHvw&Yj3zpmMk^9~wN!HejZoAvE6`%`Mv*Rb;l_bH5h#-$#q)|aaa;!g$g zpK3bfppJmg;`F1|M`4E{u6tO-|9LO_^$+j|5?)O)koum%Mr%@=*<7|3+W8xlSADj`-Y@bV`>*{I?o2 z&T~N8IE4N+5OjKw|H(f9?&mwOM$Vl!qrZ{per*A6c zZ1(+AT}9l8{scQW{`E-a_1gY@T`-QAaqZhAwCkw^yE5~^JwLEtJTGDL$(N}ipXeIM z&E%y&$Ukhkah_u2`EU{KDjAXI8s$HY>wbRLqfQ_^AJ6lmC`I zPrf*a{#s$!kCbtoFopgiPLk$l!2 z5BY?eqFoc8UmQfeg2Yg=jcMez`YipWJ~UgObn0b9zhY0}5rqgZoF95|v%YI$85kkt{+&x%k-=2RJPk5e%+9C>XfEkU4=YNyQ5`)S=+g_3;AIe z#??Fu_+j4r3zN=g>mZ-_=djy!wEriPSZY2!{b3Ii44(zSf0*~vhmcM>S)a7y!zXC> zP)7W~-4yhr+^_k7_ybnb@7S&xmnZt6_sB2smj%SnP#*X`-lObEc=LhUJ|+0oO|~J% z4hyuW-rFN?n0$4tbMbdtXF570ekj2<^}Ic9YW2guN&yg@hAH`SB>MT<2=Ti zz2MXHE$qa^;Um?V4}XpEbSUX0eaUuLLoe`dr5;|VoNEDM;$-m=&~IP`=#Qk_x^4p8 zcM5jCiR0QeuD_|pklO^}|5O$D-j1MOn(#_rpxtm;#M_1R-xt#fzX$vw#GiEu>lhKo zdFl0|U_Z`#5Zh!t)pj0F4?ayDlIxtO1h~Iu{I{tXfR=xV>$*n2V@7jc#=0DcqDswX zJuy$gl=)bECFNWUaqJ5D_YXpT8yf?8$~KDqHJeGl9*l9;w0og7==fQeEH&wL<2@-q z?Z?bpKiLcValVVxgZPi++_mmkbO8O4_K@Ru(D&wrryKv>wFUaJnCF;r;rV-v{{h5* zF?;(P^FNMXWg&;0YVcX(Jza2+l<`iOkmt=i1EeT+ZymW z_>8d5fbsW9T|hs~dRaZFu#$3+&$cT!ouuTYz+q-+ED)oK-+_x_e2ue-x8b;hWIXX8Nzo6 z!&+|fw&;;;f7{<+nUCwZ8e*ONti-<~?{3)myl*m`aF?uaXnZRh_~}Xbn+1XI9Sgk_ zB%c*O13bw45edZqJRA78SVze4zazjy?FjUt^h)nN}2-k03ScHiKBN0j>=oEE6FvM;asSL?yQ z(c}3Jn7^oDn7=e4{YyqL%@w5I4xTikG*?na6VtvFh z7whd9{%1(OYUfL((5{qOu)ptTV_b+OqrYZ;+K~B4XcyvD7Pk9=C_?k;AB%QR65c`T z=WF`G4B#_8>0eZkTkvP(MQ@VO`kh#x@%4c{7&~cSl;f0RKKR#Rz$3g*T8r&2Di3`{ z`=DK8=i|zOzL)!D1&RMy=Fyse7v~+uZttuB|9;-XGVpBTn7Us++98K=)jx=KL*pO^ z69>-me5Qxz>r8x`FZ=$wT@T~Ka`Lm1?<|CiAkLU}>q;F?8~+9LGM4xSN`Ovq6#TRr z;ZMgS9{LzROA@|$59}eF6aJEm@GDEne=UrIeWGLG2&O$+~hkNBD7{DbBv;Mjjz zy$bf=dI-BU@%g&Ui#5KR_x*n$omUPp-ZBp{{mokfbYhIp;-2>RmMlnWI^pb)!#Kig z%YdT!bZ>%xy+(Ld-fwl*GyhoTp_-1bE#!QL_{p5tdrKjId!2GPD{)504a+f(ES2-R zI=+n@2>F=t@t3y|&*R^LetA0HseFisRxRLHXS>5IlOM-<$Q`=@4|)*i-z9!I58x5j z5zR;V>n|baSOMfwnF#MM7b0|j{q!TFm!U^FPF;sQW&6PX?#a4`mS_BJ`1=^rnZtAV z5$-SaBs~3Y&vGituRIZ7>GCnE22~5=Gr^FbexI{<}iXFKIbM z5)rR{W`F-JM|nE#Yh3#X{^d=B_%nd=tW+9wJgg@pY};R1uJ3t{BW^4sJX-|viSRu; zGv1}S!n`^!;`RvglX@-qQH5Y9O9@{i^Jp!9t25+mThP$bn>WZ9mvzf=j^=a6&ne8_9dM|hd@8Tdfi5zThfAl_&NLwRw`u=#msacEywx) z@);pF_ofau<+o@LZ;`&w3wNi`5pE7U9yj++YN=`FUFoT4=e%yW?V}ij=1OHIA!cJ%SVud#}PlzCL%BL?nhjjO8;8H@hegi zc36k}?7j$oT%Dn>YFY4u@o%GFA;-LaYAVDl&o;z|E2Ohe&WC8dyLc~5+|B+9aeq8k z9`dP3c+`GhK*lfTlg2MfOWjUA?kLB&ll2kw5}W}0{FZc@{tWqqM+5#l;gJoHkID=_ z*K(i@{{lM+l!Tm-MJOf5_iVe0SfKMh>8zD~E^TkIld$j~D9)bjB)!@38erBeUBWAq4pA&XFIp42DQ_TYO4K8?Mt6Nl3Lc)B%3+oc)^H4D{oik0+3RV_6T;^h2{DhyH|r zx*7b36F}eOCmr8_Uc6k-*FLVl*Yi-$eD5F$V728D;NCj$JF~tqMb>Au96Y>VY}$1l z0)1!w9N#>Szr5FD;TNthfKMX- zWw_rL48Yz@oGH^4d{^2OROgy_{Fk`c=K55!t4(zkj8J z+V5Q4Z*`H*z_-!vsS0Q}E8#!%2A|es@DC{|^><6glmEbv$-@JZ4{Q4jIMyYW$i9Y# z`y6>f8L9uH`xSB2eahU9@yC%5bQ=b^pXWeklh1RMeP7k^Ofvy7j7AGtc|mo7`aw7_^__&mycNrA6G zU&4$1-5f^$;`vMi|Ls%2U7w>}!%vMP7{8+9U?;|Y{$>8@t(Ven)9wR5G1gl!c3W#F z#wln1=HfeL?#9R*deM&>Y{I&SpYIi#b_>WnRLj}52ywvJXSuDgXAj@QLa&uNH4St^ zT(4_FIgH8xy9zDBc)gwQdhbIoLEif|a%d!mVcYGekdN_~0n1@0p$FhZhCln8yc76A z))g;Cc(F^g^S8mji8Gtze5_6X0_@P}CFfnpGtdrjGhY0227Jc6h^vwY+h6b590wiu zc00;AtL@6W8+0b827Z5$v)%3rj0>FzFDqy|&PUoO+lVEBuBt8sKS9TMFeJmxI(|+{Rom*v;X5faW?E{3F*h%gHPpwe9U^+-L-fxAi#4VhR)zCkY}VFG@e8{ zxmJNs*C~uIMvu+PKyHymfS;p(`Tqdi;{HNz(%CHgDOx^W-n;h`UN0~FCA=2)@Dbr} zK8HMgKFse%5?e@J-d)xdXWgFH=MI^3+2@EvorUiw_thwc7efIYuWe&)-$H9e0Ga~^H{vD7m2hfXm2lOk)>g?|x>zc+l!##oRlkNxdf%lwV^EWnjgP0rI_xNmFZu$bo( zy&2H1nV+8d7k2K+3V)X}_4fCjd2c8`^e)p<`&%h-#$F%bd@w+Gnq}#ft}A8qYW_aN z^#R`=$RRuNljI$6-7lA;4rI0^v@4#U8B6><&!8_4?+cswcBL`xfprBr{Hl#oxI@#A z-9o=4jN9KE=a~O+U9=?WuPcD@Jsd!P&A!Z!#UM|wx2=tNfOJ~Qevqc`X1$k*q*H+7 zNc<+^)e6FY$q70x)@i4hRq_+GYfS)sBj?X}ZoyX_{1|zj8wNT7o*Oaa^4PTS>lo{w z82MEA6ZqC_=skh_49$*wBh2%kISD_z2l|aP#<*tUM*XeOSNJO8%u3?dZh&@u%tNXW zo;@4wnfDpZI^nf^!1q4|KY3`+C*z>+<~p0=o zUBSPRPukakA86Fk=Fp5IXXKoorW3vbeJvtCUzP#?@lGlAcxwUt&RKVT&<}t+^YBSB zk<|1(x6$rF%4cR#;DxyKolHGo5B@=z37YZiauM+9+6X?;Yo!_o(5@N>ezK6y_9q~p@T;(g&x@jg zT=n3OuAb2EP`3Ma5#+G}?gJXX>-HwrU85745)*&bk##w{zm9rSvzLOO_;27d74`MJ z7WntwgJwD z-Pq(OD|*0gy+ffFQHT9Cm-}({xYiKknp_jGzYplYajw6OBYuu+(0hpQx*h?#>b4Z{ z=oQe}NIN{tb^hpR$R{`9;}$@_zSJ1s3zE(vnXhSk@Yh9rFn-Z20rbO9px^z(FB1lx z$WiDq3*l|KP7-|v{JDgGFdO(PHTW4wc)6U+563}1rwA|h4dmlhmk7CDBhynCiDWnDg*cx(yy}z=VJqobM?z4;A=aNa$U&y%UxOb)^KNC+2?Ye zN5g&0+iQ~kx8pa&d{PY9Ru`0t(<`DkLamI7joiOv1dtv~#zdO#=tgHdQ^CdxUF52@_ITx+v z?`i`3Y0Y@G+T_U=_*_AIh;l!|+X{9#kNAzHV1lL-y97E$?{ir%I>7tXWyt@$>97<3 zGsOQBr2p!C@EPU3zw*Stm!A4+2l-bge8my8YqdtZ#|R%G7gg+jC4+u0#)qxRkdJzX zcwUJ3XL|BMHHzoe}74S|_6UTngr6r6rTxUy9eE%uP$LqMqR9V*XY`xRoW)XkVcJpXR*}xN8CCca4cZbROuq_zqVS z!uv>~V&{{5r`6;wS?d2pGbwIlj1$)jzKHWt@KXMBEoF{zY zGUOGC`wnK^WAA15%dt*7e+=O2FZj`O+Tnu3XxBFYcG8Lc`d!9T+uzqfFMHW;SmuMe zU#_oUC$imafB6EiLth8P0oi`Czp;|{YW(m|pkEPSHHP&!LggU;s%-bPID+KYC-BwTN+WtV?P z$C*fiAN)B5{qk=`JlskA8)pDlRRA|}%+&^Zv6$}#iQhBMc3(sOCTW=c{jmx1RJUNC z<~+F!Gq~TGn|AQ-~el_cdj{V}@ z#bD>IFy<*9#=~E#&>l9x4j-}Ie~W;Aq%QiEi}2jVfN%Llq4Jq|dUe{H;{J>2*Y+up zr~ew{VCod*kpoe7zgX8aiS+;Kio7(^3Vv$hPgl{G?H42A>9dKSS_H1;shVLPVe*RO zpHV(#5i!1^zYIM{IhTOM;Pp!7D~kC@jPoP(TFwO(f*#|%r@xNvp6Lbp?z@Q36DZHa z8-VX)-8^VhsmZKc;^#R8i*(Mt(C4D_E4LSZl!5RH+=o(^VYeo}&0I&h-38^D#P4(w zei7w9i_zES+~6lP2K~)J{El+|N6X)L4fc>ZFMhB@@=^_tJL*M$DUPP${*mZ!68rlK z_e0}6FKYO&BmSuM5|{%$7G}F66#3^mc0T$=@kHbgmLq>CF`Rj3N6;~L^)dHryjS3- zZAs_J0mQM`LTJ{^H}5Y5|GohD|APF~l=BI8e;xUAs@#x6l>6PVcBOWGjd{dJj(J4< zU&O0`qYi2}VMFh~gt-4=vE5^=I~}})$RpP%>~Hc@=*z?U4?1S*@0iqMxAjGPkm-i~ zJ$yoVKX8};u$ulJ`1kNVbTe)aa6vvn)@SQM{M%A*S^Jmo4&)}~0_-oH+&k0lMhd}x zuCm=vUSqz;ch;T~-me1io%?P-&f$Eg2P}CS+x<`0$u)g9^Msy+Z_WYxQC*<-5`=d? zj6A{pJ$iJDetoP0^y@kb&z(>Fhf?QI(+_YRW*On>&jUZq{W25B>f}ei;^UwfBhL;p zp4;+&g7K>$`#WYA=tp>N!HgsQd5$#f$U`1&B%eQlf8&pJkk?p zUJN-TlK&$1Jz5j1{m4&tGQ_{D-pJgMO$v;6B2uJmEN-4tz>Pw!gP`Kt3L>V;DQk_dfi^!+TpF6aSB280UXz zZ9_5&06QaiBc$$9j-&#K))1H}=(sem%8ehcD=N38}!3?uFpsqw7>Ts5zhKN6$ww2cOo=?>;&jnqkV4bgE$jqJw0RRol9X{cGk(9 z_zLtDaK!DgSI}Hbp6$?X=r71&1@UXtg1<-CHMb!$eY3x1 zrNNKldLzNAX>G(Y#q&bO-iGf({vXTxWL{ z`_%qZsYn~f?JmhS#7p>zPbp`fBQ^f=wroJ__~|a3lFk^ZuVTw#KJu&YXjeo2gC2c9 zq{Oc#=XkaMh8*u7_4o#U>d6fK8aa27`>?v*=)K7)MX^WhhxsDSBmK~ML~HwWX6xi9(g1mL^=M86J_&Rd*E1ReDy zZgHL5&;3D@&phCMO0*U9Xy${NTEjjAj(x5d%Q23G_`X0+%DFq=FY^Xq2}{XO*$#*^ zfiK}HvOH*i>p715CqUzQiNEuE^ee=ByAl@cZ^RJFAq@O#3|J=!4^Kn9ElvFA`+@I# z_w6THXVZH0`_W%hXZW9wp%>-YSG~sb*v@+;e@bFt+uJ(Ge-zt2VfJBX!cMYNk28Me z`0LQiv;6R*U?%W?nRM1v20!juu;(_ETh}76L%$dKWLDyrUk!Xu9Q|5D_(7h#4)%jy z%ssx3ivd4O`J3^2z9{eD>}0#83d4V6JYV`M z;YVsRZtxwJYJ`_b1v()GxykTte~Vv$A73@(OR}A3f9pH)d>7BVdH`0ZEckDL?=P4* zQ~hbz0`qxCUA~>1uX)p;r-ezsKKFgp2CNV4rhfbJJYFycJBRe-874Wm zW82$x$lv6jvp8>!RffLIx<{I}kVEt_#*qZJ`>6-^rkKx|b+fl$g*>f(@Cze{%3Lq? z7Dj)2l1^%Qk4f`mwF93c$$z~*(64tI#)WOnOE1)b9|idyR({gCKLGlTC#8&U4_J@U zKNtNb$Lyr3bH`k(Fzr!C>RfC)(JcnlN$Eu2aILh}&@{pfClGxbvd0xxt>#di7 ztCo=eSjze95uk7JeORN%3%j9r^$qwp_CKr$+jSw%1lev=x!*`KOwxm)JN6& zbvJ}OO+IktAHbtm!H?myST*n&c^7tW^21VG7m7K~jfeT}ZQKj`AJdPTmZM$q-cx4s zb3@j#HJ|Z1h*$dvpC~IDHviSpUo&pLo(cF~*3HOC{G0``E~?tX-psiCH`iU=;~|IH z#Lrun_$`n>S10^n35@$O*6lI*Rj1s@S0k6;7srV|O9Z0%^nVHY?<71=UivBTW9}k+ zdR^LiXUNmU;oW69p7I;dINel_Wz(B z+Kuu(#3bU+%0hd-1v!|0E#p1eD9?E&5O{6|?o z%EY(pt1upgYJyK=S7o^m=sgcRH~gIGOFf>1om`{7hDv^`D1Nqq|d9Tfn!)~AL1Aa6H zzt}~5S^ku~x`0wWA#A z#=!Ue3p;;G`5$OT`&*M(Pmkjr!@W{}QuiyyceqZH&oX1E-yWdz5f#%UPJJB! z4$zn`%)MGCg{6YBVS!dhZ&X*_|^f~p&Wy;zi+cZo3g>bAeOD?mR`8Tnxq z!VfV|Rvh<@9EwhWzFdCv_haH8lX#-zfai6{tta8rCc-cL7VNDD^o>FD9!>@fj$A~Dc z)ET*mq}z@2-n|*ePcK4$Lj%#@4Wz%w2R{7{JMStRYPz1!&Be(!hsICuNZkPKzt&p7 zE%M({3`UQ?u5N%EIb5HMIN;|wIzRFEWrRE}*6VN)UiB8noiOi@82DE*kGAb$E+k;! zzsf}$4G*{x--eM+E*a=GJX{}eny1Ps8^kX4;ALwY zO-N~1(^|qWy!&7e2_U07$w3Rvr{a5vbqJpqpxssh|0bS%brtsJp9IJ{;?F9HIAdKx zJlsq8`%(u|(~pk=pJv>*>To{J{e|4be{v7!2X?Q3oQ?gI`2zb3fhMq6lcy~h2l>Pr zcCsl*xUj!sN71h!^U{W-|4~!OKkSHON9RLd-X7@hSmO6`1FoifZ3v==Qj_Koo;PKj z*=*j)b-dg4QYPS94nfCy)Ou-1`*oxb{A&=~y%m9+BX`iQiDTa#106Tthcfo|+bZ~r zZx-|-X!h6oGWr{PwT1ov9|;ffyla4U0}TBoy+L0Uf;`*N-sVjMpHbFzuTMHxGXvkl z`rC$|<*8r~@q&<8gVgwi&t-p8%OS7@@%BT*&lb>et%2XkcEA1QdWZ3i`<@kv|9K+f zq2hQ7?@+493eb0Per?9PRHqo9tHUpjb;9j=_FT z5k5TxxdnJ%cnIO2OFbE_U(Zy?)6n^X=ZCE_pp!&?>Wcm7@xs?GrN5_c3HtuLu%9cW zze+Y(HGS(m?DKEZNgNCN33LMdI_+)l0LI%Rki%D`Q(D$hH60)Co0zzF`##zYb6#NV zZEYInrM$l;X`B5mPlUZi88>zjesCuEj9rBs%y?=|p&imr3KM^vtdnbgR3_NTY{Czf zhaI|~Kn_O!jfaBIU}5-?iIbN*K>o2tXjg`N``d7p`S6FZ=WV3_eJ$n{n?PqT;cx$q z@$~Lo*h4nLbIZMBJ&uRog}&T`pSwqWIr5x84?qslI-d z_)&4v&noLh+Am^``;s16AJcH3F4QAmW3eawEnh}?rh=c!_LKdc=>Ylrnu5OJ|L3XT z-}NKp=BEA3TEKnGVc;LuCFk0D!rrW8#H;d56xzssy{$){vod4=R;z{X7kbnGh=vS60 z>@S<#uh;E*xPDR|U{z-+`0;YxUdu#(Tdu)Abr!m%Zzs2l)n*k zNY?l4IP+n$jai-e9d;rPgjjdl%?0I}n+WBtmKgJhb2Unl7O0qOMNd@7g(eKjI{ zr5rHUaWz7FGkMGIaw3BDD!kp-#-`Q#T^Ew*I5_W!+kgWmgMG*p%-5-*hwMkvF{f8?*U*Y zP|*GV0)C_y{OC2}uagZ0+upLm9?ZOH(P!vavK1v{*7NR3V}|T zb&r#Xe|-Yz_#JY1LoRsgxV_$yS5J|+r1=j!&h;gTy=ghC@{n6e(tj%TA~e3mcdJdi z+hzW%?aFtrjg2{!_AqY<@IAZ-^giiStw*^HgFMandtUrq(~q&Psj>5ua!yjiy_pa{ z*N{#R$~nq;R$jvMEr)%o(y()x4%pv5S#Z#FBCMY?fcR}?y;}D-wg&ypPxyrQ(5{c? z3JgDg%SNikw`Kz0#Jy{Og8%S)t!xTLZokMqP2H}abx}-w$TS7`an@BZ@#m(S^MV-c za3J{^SR8tZaC|iR)py2USTD=ic@v(?4R3;<79yR=+=o@!=)Z)2BLdNUTCXC$9iZIm z4uZYK@_?U?)bDnlp9$nao?!Z$_E+dPNWUi(~|SBj=Gvp|3FWs652qnHBtd3L*}Jno{?c0q$Rqe$^uXm1aQx&UL4T<b2j7M*#5Aq z0O#*Uo;8Z1zrGgW2VSF8(H!7EvJrYj>r$^N#yH>tpXjyJOOgAATFzcae0bananE=mz;CR58)<%UbPtf_#OKf@5p%!-7obeEJTho+26p7pySR6 z`l*@M6+Djk=Dme+xgzbS+F9`L<~=5YRlg&M+g4WOEx9@V-v0^nEY$|~T%GcKw+HC> zA0z&MNO&r)%eh%M5?QY3_jTH{7kar){3rjT9WDd>Bf^i!c{6Rdu~e{}uL(~x7j_lk zeU?PRJvRXNW=W~98I_=ya0GIjPyCBb0rylze^(Ix%V&(Yj(ZawWdBIZ-zo+=?-BpV zLdZX|4;K5FdZ{Ay6ZH61a$>TLNwAzpr~g)f{hNGpp#%_3KUfU*nIi)lm|Gw7m&j(& z@vz-%qF>w2k3jw>*g#$C-8Bj0_^ZVKis#eZiD>t*fs4V|@gWTS;e=PI!+Gvtv}@iS z%O&SYG`_z!#*6&KU%U_Uaq}H6LuWD1&AM5)#Q4_}o>PiG0RQ(%=l5pROFru~gFWmgeugE8Z}FC}Gzq8nw}6*ds!i~}H0Mhw< z8rqF;KkgOc-S?z>f?9{8z$&&sKAt;TPxzQ@=$GQU<)?(t{}=Y`qdnIoyaMTaBk=cwg#Z2}_z(L4A4~Y4NANFq zUyM6OZV6lmaITLv<$cL$YS@Xft6$vcS9~DoS0w$^eBU$7_fzH)-tQUu6)X-v%})5s zT*%)P_t#8+*Z+uhtqOx+haBEj_1D?%Y|Jl=eGVLp_!Bw@eoVajr!2^w|5&83cwwr7u{Zs9h`t96|5 zy_0ghPTLv$L{5OdkxwC6;IjR~@eb5F$uqURxp|MzjB8!bKtAsKu=54v=hH%nKR(XW zU4&Vb<@G6XJ!N>3m85Zqt@HD_(Ej!u&e=9ZMKB>>3>3ce3T)qRa8r2W&23sR9 zdO-MRvf-uio$CxGf5JX&BIA#VZ>JxEj%ytH+c`4`y(#O%nvUP`-t-scA-B+8$XUv2 z*HQOo zV?$ui6^Z|K1=g?xgJa~f?6!2SbQkPpi-82g(qb@jDh_=^ILUMTgR1Q5+nG#mIarm~Fs|_fvs22y7}uFyj&;k!eLyGrJM66#`5z+hC24+q*AR!h6JC1|`W4F!y_^1) zx&ZmaxSukf3X2t>{2l9)ZQlnSe@(2zpw~)mmvau9f5m$%#!lW@#CBQ7bsYJrm54mn zcNqR__{qV2z$ohs4t*Ja|Ay;D-WibRx1>`_^rihP%KDLU1^v9}-I0iWSq zz%=o8K}X0Td>``6#&+9DJp{X7s{l9gF!(>@W07^qc8@IfE5ix2>v@EB-y)sCVU901 z5NTHsf9_!5hmQb%GT|lCK@P4mh?8|mCo13Cokp~_M(BGZ!J#E1}*W!J~lB8ey zCi)xado(6~UJ(1ycI$K8LqFRYamjMj|M|Nx@FUzeG4ziXrkvNHU&ilF9EHA|=Up$z z1rROgSYgH-|8=KNWFbP^v->s3?I`2?&|i<^ z9o`bNAvZVg>42J2Z>#`3!t-@T&ZYlFe-+;|HSzGa{KMW~dx!qcUpOFj`?VZgj=B)m zGT5iZcM9GmpFO5Bp3KC^_&4EQPs2~c?a?nYURT`@`cb|smrS`?cVQ=bjoeCn1v#kBfE#-l_a^ie;{1`~S4~T^T}M5lo7=hW z*An)#p8SLp&|k~(UR8}AkhA{=G_r;G&(1&&F30gg=yv7@AHbE#iiebDtULSB&$i>co$3h8%pXBLwNm zJC(BVrTGkR!1(eoHGW}ZW$>>!?wI(~T*h~e?|d)5yUcSn-2X8&7-zf3WkW&31ET?t z(jMy0hQEZjz)x#u#V=HTL;Jg&Kj{v;4Uo>7EF4esK|UsKZMES9n%K4i@P&5QepU0__1$B>bp_`GuMccm~2x z-e$aFeGHSge9ra2DBsUD?T(xbKCLgnr-_HHpFqE%ju`KzQjcX z7tigu-onT$%aZoD{~r83t}m*{XXKgbFvrvSfFC0LT;m~!IM?~d+P|e#O%b5huX`jc zEs5|}x1h)HZTMF)!pnY-etCa_UIK)-?+JW2?};0^Et83ZmUDCr_%ZrAy^DI`I#@Q+ zne`^^hwClIU$XH1DaCuB27XQs#@pkyBQL#S>Md|z$@o{C_4ES&A;r^=dBlivTD--P`^DxLc$T}4!j{U=Pl`*bA=OdjJ z(va>~MxeAII4Wga>?}<64OEq95)2h}7-T{D)Xi)yQ*TQOLnNu(eIW@c&s5 z@{Iooy2D5IYx`Y18wAB92 zZ^n2O&`EL8$_b2)1`nH*$mYNCq$K9~=F2tWNg)FpwBW}<)epgY%uJesphh&?s z1@fv=ZP=~)4tDaG@EV0NUkhYKzEpznOWo-&51ZPMyM!N?f!J<$0QkXAl{(CIJojyk zYep~Mh{0=o-*&X?prRuW$N5aL*odrlksbMm%>GdU_BTrt?41T9rpUT+t9N9Owq>f*x73`VKstdOuw+Qo0Gk$H) z3%d_%ESBe z?-Kv*!Jrd$LjsKnfA+av56Q2Zc+oF2zRdj^bX<=Sht2%%!~5i)^{Y)jwu9%>yjkFP zvW#PY*Ck%r<0;Q0`PlBP7SLCmb(q%@{!ewpfk=1Ev*f?_H=rTyp%?6-9O0kKKCd2U z10&IH9m0Pt13EF*jZ7pw`8ePnKj^O~y!(FkcRb?!1ICAlVLx+;|E`Riy1!Nf z*!e1sM~8Ppo)O1A!G3oD5ApmJ%|v}B6KcC(tasFd?G`Hxc#!Xl!77wm^(yr4pO`Z5 zYS{?myPM;}4$}Ef_R%zb?@-t$r^RZstaoX6=q2p%BJs2FJYkgYtZgQ|tq4Tp$M{au z2zH>8+&k8G72|nequ++I5US-9{|9n@hX%dxB=i!=gYnnsrMWbu z&jz0fwmzc#L&Ux)XoSKK8duM;o$<@GoS&)b@+gu;&2b$Mex1 zx+6cVPWppi1HPjDmnD7|zQ^R8Kc3;eRK@j*{=`3c2J_8e2>fp%{W;7_qvv5)wF$46 z8~g-vVmtH?maZ0xTo_m$Le^q20d8Z$pp zf2Fjy+C^#qjykc57qt{V7(W^e=kXBwLM#(LjGnQKrI5DXnF9dWv;)1NzkLeAnd9l zz$%T@@74C;&4_&9Kf;?c&y2G!khqEcU8w?og0I1^FB5*V1=a8RO<%>b;QEsnhatIrdo|Y=PVY z??G-wNWY-?ogLrO18(NO%Vk2OdykLFM_jN*EVep@}hy1;KcfKU?(?ns8yZyZ%<)07yEGM1+Nu1Pj_KX9*@#|?5p%=9U^v!l zJ>GwhZbE-SO{w51v>WGpB1xq4>k#Ul=Ld|v<(K|W7ArJ&7anc_q=MA)+1CH}uUrPe1>4cBNzpB!%y1s|J z*Rvh*%EX^uQa4r8QR`F6XZn1|IaCRGg^_2@*Wnjl$9_%P^N=cpH+aE(p64j&rfOqN z@b9d5da^b29_If3SkgJO4s!7CL1ZpKd+YrW@Yw#2Hs)61&t44r(e&W6H{mg!zjbYd z-M&gXlYd0JzV(QcrD-RvJ_8*$>wK;uonMk5=jeRk*CYHs_d^xyml}Cykc3D3W26S` zZ9VY|v}Bwwg*?r~^KQ*ypMe4??ekr61Z~gm4`EmR$mbKzPvh^wJ|PXcFI=4V$@yAQ zw!1*`7EQ<19++Xm*U7r2e)l$52lj9Hul5-7ab1Eu&AwGSF{kYEyKzUp5j+Wd3v(YN ziS+jrfuHtw_-XDa`Wx(n{6pIZX?s`?iFHU8e>2>6eG2zh=(`uhgKPC~3RWAe|grY`q# z_{&@Lmu2r#Zmj21o^+;5T{Uf2!PbzZEKk|roCB6_rCN09q*QWTzdB-vi{OX3x9r_e*RrA5dJyc7WznZ zfODDgnlFGoy7S2E_{sl%G$3pw~J7pV|3W|ip(j-j__EHo>F3+XU(kJS{iW#PPgVZ>rw{~M=dJgO zeKh&LH)vnstvAT^Kcv@x$nOZBT>Wa%KL%&Mj0N!ewa>`#p@;qj+V@SZ3pM=qT`!RJ zJeA0Ae%|+J9QRM<4qvVG`N(e;J@Ayy9WwX%jIU99`jaAeKd6D+_Mynd-KXMu<1Z0V z(EHxj{L4=&eL6oP_qp>IFiiL{^<9tR96frk+d41E#CQMYnR1_}O@3MF^8z@)bp0L8 zcN;pqNAtg>*5iEtAJywW_CL#hmDXh+&HgT*m-P(BLjP<0EzF%mJVoojqj?Ptk4jg+ zMdp*-)jooc*6V9%*yDZCxoXCaf2`(Bu6}{Yk$8`opQ8EArxJGU170M2dq?}-$ad4u z>Guf#JpG@9&+$+GdD&R>b1BhZ^SR$I^eO$J&;e?nfBtMJ?|b*xg>Mc1_u7k<+0xv zK3_`IQNQt(`gx-M=R@Bi&wcXa^->wE|BD3-4`=)UXcZ~X(I+ts%V-M&XZ|J$eJ zKDRH6KH1UF->&`IcS>^oPwVGz(7f=eZxB8a^aHr+d*nXJd7;nh2|qlk=X%`I_kI1d zM7~bx{DD(?|4;l8x&8s2EBjsg`QZie-yYbH<3$f$68(Sm+vR3&pOVPV|%TAa7I7;@0g=PpI_B{ zqOs%WG>*IT4$&vSuIpd=8GxYO+_8$5C^jE~+>nFcK=zr@=WIcO&{YO1p_wm_r`TYpg z9nroFZi#*QEWN&gIw<;l^RCF<})_GgwQ@y-&_oL+gx8Ei2`)*z5FF=1XzH#t6{^XhZ`BgaB zM7OJo=NtdwhjE?}+iUgHj2-!2oSRJV^~9$N9p0(|(m%XJ;OB+^e@#Dsr~1REzDVfvUj6)EY5l{U#C(`{ zf2+{vl;V(PJuiK}Joolb$^O1Y?^FFbd9Md_&Hy-xe;#4WCkbDPmM)e4`-@e-XA8tASP`eY$Y~oz|&wQTj%V|AtcSG<0F~2P9+j8QB=ZF46K0p0IB1bANrQl6sH&6eLcw#@I_y6_pko7#Rb6P%6@AJPQeBgeH9pV4i z>xO;mSI9c=o|pBQeZ2d*qOY$0xV*2?hg;_q_tU<6qxat2m32Oun799RcZB{A{DrI& zW&;Nt^9O9oPtyeMp_FEdC zUVWXc|FmBJ{O=XIJ+UwM|3D?^mAA_}pZ-9(!$rOR$KN3PwN#P&>?oa|^=aZ)m$YB+ zGxhUVy+rxyKWyp8Le7iykxQ6#r}ZIrRAhuM&D1`uqWaL|*4# z%f6U74^*x|ymxn0)0N17Uhu1;&tLQfuj3Dt%%vA15TpB?{$sh1@ejWi`E>ex^X2ls zAEIA)@kgti{!3ZU7wc2L0r^m(^WeO!U%0na`sSC2AN$mg3ZLB2>pw*6*h{aG>pxoW z|5@rkoYM1Fo~zftaoP! zwvQXh^-q7Ctn-Z;7r&?>_doqo@z74|b8kLJ^>zX;`U~|Ro_>z#+gIrI59;T)67#IC zXy4Y|#CaL7dy72xNu3K}_T~TlGI{P@J&)f>TeK*7>1MMd=>-iS=WAyn0A13r!*Y|yf#_4zU+{q(d z=Vz-w|D^hpKdaY&6z0UzeNKP5?4zfjcm7WJZS#+1{lBaC@%};f@u|Mh`5X26*IX7k zO4_e~2Yi_Bzohk4C_mtz*Z()sOQ#=c%A`<8ZO{j%Cp>BoS>&~tCEh#&QkuK#hJyMF2|VnGf+OdkB} zpDg*22VO4pd6}-~AOBGH{kGN{yhJ~L{FTC=xAhzigQGr#_>uT+p!E_j*6ZK$pM>8^ zzbtw{-VWzt{I%@wZN*7cd`q9C=arn&I(g$Ke2w}ugFhDfxAncAJ}dXRrS+Vo^Xcb@ zzd-0v(!P?n$;YL)ezLsRsjm>a89x7jpAfw?P#oY(^!k4s$$d_}Q25il@5j7T_4&s< z&Q}^g`HN6jL-fDrtPn_y6kKYBv+}kU#e$ zT`GGb0epZe2?&9N$1HQ>3x0z`$hbD z=P}u@uhjM5KBIiAbGnQieg1FD{ZIc7@gF{1@AFnY4>y_5`dSor()~{*>TLVptMvRk zp%35!{&`|u{E(&BzK;KG_T|rhQLk@`okg24|Gf1V<^B(7{c~A9F8y=Fr^G*ZeoW}_ zllu8-J#X~t|0-|vm_GMazpno3&xmJoTj}`{(1G^rwDyC`YJuab|8`aT#f)D4zy6Kr ztHJk6T=`>q|Hiv@{fYB!ANxR!XP+zUF*xDxA%8@4yQOiciSJ(fTFF=5PSm%*=~sjg zPyG|2kHMLrfxbePJDtA)^Ta=w{!!NR)JIC3^eJ*tr@u%j12e=wZ$v*DJ-4Lu4Bw^q|E*uqefe40m%rA}e-(vQ^uC*V{+iKmpR0Xj zPbd83H~$N{&*m?Q9rQrFSMT98c%(!KKILiU+mEXuNV3o ze*Vs{l>03GhVTQ%=<&~~2UY(si=JH4`#j#%eQ(No{!!`hC7Or5lj!6Ar6+`MpDc^N zv9I^>&G}Y|{?_L|rT1SKeJi_MD!uXlmd~%Yg`OB=!as-bdzlWWWj&@I=2Lcsub%#H z*>{7_lwP57`s=cukJtPBiLU4LcguZNb)BF0TG8iET#)Fw-w~JhpLv_g%O?t7{heO_*kkfux4vDTYy7(RzD4=rPsI*?sILDn zUZHfT%lhA>pFgE|^4)id-ZON2&zq%geCbW`^;}Ur^JzW5&**_CzeVnU=M#m0lnqP2 z`H8|mw-fcfAMme4pPy3P-t7A=%~L;+n8Wakzb*T9^?9w;49*vJDMkYr(S=c_3*cUPUv4& zJ^Y*p#a|leT#k>?>p$tIMZTW;O*s%m{v(pdr@vCx|3Rv6-}5W-zR9^FfBRSB zPnNWv_Cq zMf9Pu3%>>ZPxOD_wL<@2)$2b8b-8q((|VrEN9pI!{~W;$PTz{-248s&rV&#!@C(t55wN93`u*PpwobpBhRkMXzrOQKJ1 zC*s8ajQR8YUT+uvH0vLKyU_oX&Jq1!z5m(Y7rRq>r>y@+R6l&0%F*pF6?%TSUjGS! z@Mr0pWIe`@`WfIM^xV7uQ?7rOUVlpc{HGKC{8h*`zi&hK_e=Hq+nS$!;F7H85u>kw z8xuVr*cARW{QQc4CiE%2SDyPqz5e%pR_ODj*6o9x_~#E!$$mYRu%~~E1Q6}}-Jx*u zr|9*ce@^MCeRIOSrP6=s==JXs`}jwC{d>Pj?my7;yoBp85B8JAZ@+Uv_~GaD`fo=d zK<{-b(I@-*pOW`It@VdyJ%`^V^uN0$`rOd}g}*1CpZ0|gH}(Gi=HIFweyhCKho~JN z9?IvZeq26(wbJcX-y!ey^jqZfKhyiX^LfHQr+-2AxRQvCVZdi}HXJh-Lj2!#!Oz8Hn^#3xI?FaG4;=sJV9$vW>;L|&e+ z_j&C@s(*e$;+>&hfBnbxbG7?Fqt}18*5O}OdBK<+{@MKldEciK{beuuVd1wsfAlb4 z_cpyxsngyWjz4|W|8%e9`+MDf&mWB&!?Ev|{D%(xtzfS`8VAF3oyKSsjOgmosKb{p zmFo3N{$4QlgW<40ENx$^A9{YX(++xLzZ;DA`z`$}`6+$x-1g)C?l1`WCc~i7;$P^~ z5$@Oub{hwsu|L35Z?yd8PWad6c-Ya~mT~FuFc_ML;kJj%>CgC42cy8>9JUV|uQNG8!DyYlrxEFtXx86D*5XZM1_fUa+r2&BLA+;rX|#c({ey9+<)*klhDgGenwXnDneZbOC z-P*Eb>*3An6}n%e)$&0U{Qq7boUq>=`Mo}Pc(-)!;VT#XZohTV2}b@wk6xQ^CJa-3 zbQ3QeG&%)}7=OJkAVd>n~D>k?B*+G~1{radxi@<6|Pzp8)OVuk6)~-~; zJL>oJ0lYx-!sZ3_R^9$#;E(s|4N1*_mFW@m#i42uy%!OU)&QFLAsf)OwDNE#t&7{x z5{6wsW$3ZJzHBi_UGiUfWo4(|AB|T>M^I;7Z$4zGihV=t26MiHquE zZ)K-3!so(JI|sY9CO-7Q{X>5|Y_!LtTC-Yj;D4&;J-PG66<(3&ovlB7rP>L)P?D8V z`!zxA&ujG8hj*^6>_F}ITx%-px_LX!dDX3pbq|{Ql~?NHl~(ZTg8)n62YYM&W!k$A zYp%fWHU`!14qfS5%5ro6dbKV0@yh*!vESeIhmGD|pf9lf=oRw@=g(Gel0Jeqtm-#r zphsEWsy<%#w{}3SAgI+x^>Kw5uyzr@j;f&Ll3x!x(97OvT&tITd{hBnk8ml`l|HHB zn#)kYkh!s6-Mok|g?EHZv;rS{6x7f9pir48v|U#g@Kyt}e%P6Dquuc~guC0l-9B!4 z4G-=QYgg+2#@>*)quuCj?0{pjh2#BdmEM}@5o4&>#xPwjPPm|QW4|$GN`yCZENiLR z>G$MC%{MR zUiZi_%IY~WlGt$E5fZtkR zk64#SoEf=j>fGDy{hqh#7bSbTy6xJGH-zLY4-b0db~g}1!&00}c%XA8NsnyB@`KxY z$1D<0=O|mpm|dukR}V!UK{Z12VJ#u!XFbW@Off$N@4*C{wsA;`Co*gkbl|x%v9wq( zH$Ov6*e1FEn$7LdFh2hvI1kW%oc%Kht;xoz1kg&kKp`(-8YB*aesU?2(Y$L)Hg!2&6{ehldaX)h5N=s zQDLr2;5NX&-3f-Zo*3W^#l76$xh4jBf~v73jSb4NRh?y2jHWY=hGTc9v#+;GR;txF zB7e?uUnV&(*!3%5L~lu)q9%MP_*Y^-m`yegA{#A#*seJ|lNl`=T)1WCbJwn|oEZ)q z#!2TzgxteggiUG4DaOf9`DDlQ0j4}<2;I&ymqOvgK&1Z!vAG9bGtNNSy^!l z0LhVc;RI)6syjIS#hlEbI>SWGnK~7INf>xjD34%%!>_e~Z?wlp9I(e@cX+UqWmV)* z36zRGR|btCgdAKqLi9-z=du^e@FVOn##oCuv7GM&wKUoMP1+0baE@nYT)QExP_Vem zVx9E!JoS<;0Y_6p^3$Cp3oSy-GRH$-&$DnNW8@5TC0x4%N6iBc5&EUz5S(q`VuT?9 zqE*aE^n0kh*+77$7$}Kg3xKkKo4_T5sk#QyfUn;Qnkip@CN@exT;evd+aje#y1eCa<9hJ$4WOo@{q~@` z$xfrnr@3eyVERNTXab)p$Et3Kaa8yoc z9Wi?`JWYLd6Hp|C&TWyh7k87rotbzk%bFT>0PCEVE1TET+p60RF7^ELgnx5L8w0_k zP+LIoESs?^n54+4AyQr$jlG%;P^N#tSh5oZkWpKAS_;wUkHWghFYnzSzT zeA{@;#Wt3I8K<~cmV{_Z!DrAo#aCfuJlDEX?0jr}IKlH+M%X0|hf8SMH`((mQ1wI# zWQHV`1WJ?KyaY1j0`H&zLLa4Za5E+W;P765*llzo7lq(KWC6_kPs$rPJ^r*C27+@^XmwrTYx!{J!TJuv>b3z&tK^tjDwpHNMN0-l**fx z5}XHNQmjfkM0^I#=B;XinJO{Z9F$jjebgu%N$PxT641fT_E>=0jFp;&M(nmKk0>uw zML_dlIHXz^>v0L=u@X^$!8EaDvRL_685vHhw$Xd^`T}x_1Qn=Xa6Pkova(1B$M1Ye?~Ure#nZ5 zAkQooFx;8^6ADs?~_m8CfnVkdv!;x{RNN1JQnf631fHtQXW3*tALZ|mdt zIOcvY@@555TW%A|To#8ye}>n@-YQb8o>AJNlB494L@dUhq%T2!aLOeKJ(ape=xB)| zN-FHc*HeFv={hg<=NOsQc6ep79pll6D+Lj)Ta`yMXqnW*j>r7TrJJILS@pAPSwf_F z)!xb6F}733+=hfyn0+_A7rG^ujxpDisqW3@4VWiyX@s~3dE&vCijtQ6@)BKPs_k|U zdQGmyg4cFv!4>*AzH@V59Fq|KURR%>-9!3fcrc)P8%r4BG9cWNYrOUFBJ$)0ef-mQ zPt4L&ug9{33MRM=;CQOMAU$A~koh%QM|jmFjbdQ5N!OUCrPT{R#@r&~&(XI-tu(D- zENd}RG!{Ltpc{rOv`lII&60lzzcH_gjo-eQyJWCq$OdU0Kui)+Go`$27CN3V&;7Qk zHA#6;6fUV%+ZYChrz*n$A;pNKj4BaX*1hF!W8Bm*+m>0fZL){ouI{i@4bsqmPrtLmjky_LAilX<(_x|#hYk12>odV_!D@wEozC1vo zYd7fnJEWzcKEXG}+3=*q7xkaP&03SxaG8G(3w-IL)#hM;t-&SX$4ujmR^LaBM0>Bt zX#5(Z@mErzcHWoaXnZwS_IW0IO<-B4zlTa@iB6RzB3~`1bSLjaLSyJS=Pe@NdG_ML zjRD^Sj z3Bb?|RFU^aC^6_V|5WC`leZS$${!5dU39HPw?sxPRgBi`4}g=@42To0+dCokRP{+c zN&VY{e*J>K1&u}ZucXxHsftOl!(6^z)?Ly}b*~h93Pr205J#RT8ZuUPp4o^>>Cw_f zsd}v^4I$9vA7ar>#0ljJMKGpCORB_x+M+NVQs8?lq7b=)23g6GDI{Z@KGF=){k#qI zOrVn}UY`pIO4jT;zsyivq{J;9Zatx*9YuX^TNqWZITwnSDmJ#eoyMM4AtZ#?D-Qy6 z>+oeLA9#kh+de z#U_43o0R#e-)lzyfEbPjL6f@g!V41DHyijuC;ThH*UkO#pNKY7H@JoXkG27;bim@? zl0xZWHN!StX!k=w6`<=RyQe{KzAWF_&Az-^>7$*26CR`r{91qHKa5Y%qZ8D7z{cMAn25?>2|wZ-Vj>^UOb~6thzP|g6sX= z-D(HlDD%tI@ky(V^rqwG>ivx{JydH!f7knAw@&oZ6P~w<&Ba=f%IPS@W359{eJKT0 z^-*QFjlL0JX)J+Q&`djOoV7>sMcbj|=Z-39A|7l|O(nB32nX?_v=aUdR}%%AlqSY`~(_ojQ0CCx{cmZQ@1ha_f~I?AX{+W ziFR0B!{0lgV$UI}_)ucXORAvpb*O)(&O;RS2R9*&fKvGH<&Ch|NDGk~J-WkAqeC*e zLuIOABHHR$TY|$whMH@t6V%)$3dj3ca3v)dsmreu$fl~9S3ssh0v*174ylXrebgpU zsln)kuC&da-H1D5@6_&L$EndV<5ihV77b9Vq}OM3^U1q<<{eP&lqGEOcgQ8~pdI+1 z=$leB_%ISVxH%b5Wu~sOo&krGXz_mK(KY7U=rI$xn(4MdP1L(kM)2guXvhQc4#%|{ zO)8$~?r?9dKPI zOaYC*ck?FNo`+~IMjy=h$Uj`-)nNnFGECTCu?!RTtAd`I;clmYL(`S&^Vj3=&YWxB zotbVHLl(0rGbv0}zFEw+N+o?AbTl`Hdj}*yma@ioP>(^~$8h4gpM8qC4MjGzdi_aO zFT8w&RZu5pwHum+J^?0GvU;M3rtg#Ns9A6yebHEdqEWh9VRx34goFJh@FQ=;@yGPN zpt-R|hF!$$jmV6m-T3J#*SqLiZtMlr5MJGh3nD9c@Olf=0kof*DI2qhWmv~i+hr7cH{@kT0&%G&AFnhi z&cfrM$1eLf+9<@9aKRW(hf@dkQZI+fW?|y4^S`Oh0p(TuLr9U`c1|^A%mBKt{d|l_ z--52+G*;U=#H0{BK`9PABH}8%MZ}KmMzH2;1$bcph#W(8Bd)}}CDv%6w={+M zU@54F7yKnY8JtX>OF(9|zrxcK$SxQkDvvT>L+*q^k=!a3YhWOvPwCE+OdcjrV=>GALn0^>Y$X)kmg85HF&1jyn-j(#tHASI{;N zdT28z4J*6@g9j_rMRh)keCRR!a?#de4Popx+k*x)0%RAp%{rhUyi@o#k@rIs#~Va` zRpe8|J`M*2=sE`nKy41&!|_3bc6z&xt5aH7NjIye$F0&X1<2)<$?5jt?$WdccD_}j zA&=dr&E4ZEOuSBk9IH4yEXl{MjsV;ACwsDkz3IwIXg~D>YQv;R2jeaJL+CE@z^~NX zMiQ~|l_7@<8Z3+|qZ=45VY)H!V$1wuyX|4}&2lR7bz{7F$63|PM0DL$9-=|RI}q{O zUa}}m_OZ#IR*{})70uR1^<1W+P051$L`)Ysz7rf-`cqQd#WaVlemf%DjI{~d+kdrp z)d+@Mv|5i=?sQxKa#vwtU0w zw`|c@B3}$1y9{fnqNou!?=_U}p~aIs+FHN)>Vx(W@g#p1&T6s!0rGtGZFAaLBdAcw zFeMout|iVmbZ+;&?k zVqsg%J9I^AwwO!^2v^!bodWWQVsYLyDbXMf(v*lLI~{n-8_qL6+QUlNvdsy``hSgxJk`aP~gHWJcMS{cZgBUPz58I;w0e3M2>LrBVil}VQ z1>Z5wi4DC(S0{)SdfN_Ck+U1AM!YP)og)Ae+`#dUJo=@IL?V`j?uLqw7uHM|gP(EM zi`eW+y%nnPQ1m7ReRw}r_^^#aQWmlV(P+a!pw-a<0EQvLDc-?+7E~+=X#y9#k|X5T zH9{yOLmQ%LK60hf{+)p}Z5dS(8ab2fCVor3Co?sV8nbnAs}Xuqjwq^f1Czg4*?HP> zNL2;6y_UN(u|~@@pht+EQ@R;A21g@CsqEsvwK&A%CTW|}VrEl~`>%jCb+}8I=Oa!q zs~H*XN(70t>jbrf7h*1PJIW&!8s!rDCpar1lxjVv@Fq#6`!y{A3n8hTt6w>Yf|vSe za7p=|7~ETpJaeQw$U8T{__}YZb>O>ELOt*)n@T=1%e%!cV&{=54L_p_J{1{TyTlB( zfN5O=x?sx0kVUkrLft_3fv)j(dy!Cwt^-~gDaBa@s?x%jF=l2QdSuf4!;keky3fe_m$T{ z2tZWf_YukP?}K6g<`LZp3-l^dB4S2umeG_h(|z@G({Fi>-ihOg8`V1>#=f{Uko7v7(ZoZwBp7iT-D|1S5jk$N1A;69Ykc ztZT`Cq<4d$oh=k?qUsrc)bu_5c`3}k6PUo*Z1@TH#lgTpDfN#^gdwh0!at4zJkHbs zG{)m0l~qeZUm#2KH@ORe>fz=5DDqF@pO`0sRffY}Kb&$LUM068KPLQ$Z$+hzK+4P$ z`7^5UZt*jAo4s+TglmvrLN#mrvYjDD(=z^RzAX=-nYDOKuhHv|Izccfjo>Mvf4zjN z*hBg+$k-I}2ZKKHty<|Y!ncBP2_$O{j!Ju79`QHCw=gRgGi?Wr@jjNfTN=Sy_r|-W zasLKD%V1dACHj`=^5HJ*8z-kr?NOsM*l&~uZ44hHvL5b^um@ZUK(~`e%Uh0vPN&rF z!NT{(eXMsp?9meNBJJLFEEj`jd!;UA_-QpXh?O3GfEkTLT#RwQC6p~S_lNjYR)jn3 za-BTi6jOqGrRF}W9UxTzPifF8!Jzb@F+Sw~;9t#s^adQ!aLv-_sLRhr1Vk@e!UUrp zi5=bmS3`X8em7g~J@A1-4(P+gKd@B{`vFEQfvG?_e0{f1>!Xi|C{Wg=VVB-z2drJ% zrD_JOjy|Bb=nn7}@@l~$#B{esH=?~k$yMoa)Kluy&e6-0PqPbU-Q;hBYP(EgY_`!F$fVw+PLAT&T;KwA{3^N!~v0ly)5cHForjyq4j zOmr=vHkuo~UEEYo*F(cKC-}(?YiUz-;t9llllCjkp)^C9rbt5xAbmy_tcnp1-5sli z%DUq^WQ^yqV(7n4d^1k^lpQ$H8d0SR>M1aluEQc^MAD7vvM`xw}=s!|C4;dbq>rS_~IA~=_l)k@{--4;olh21Y@4=JxfOiIE6{oLIoIT z%UJ6MW!gb67|Q8dl4T{WM>6=5N_c0f4PH7BkCVV9Hv=d33^fi8tya)#lnW^kgDRJ; z(rM@s7nPTYzmTgw*g@SKG85GJG{VgNvERnNUnz z>t_J160KuZ)PPvGNjuOVQpN1kYsAa;%?Ox;RRhaNJJ$wmGZGd)rRgI(VffSdJ3n=?Lb8eVdK_`z-5mkE!gGq2-cr^AjpNMHq)Xzsf zz;evo8D>C{`^jje-7a@ollFlTb2q^6xy|5oJ$&#}?pP@CRz<5i5}) zv-F53hF~;+c|_P>ULplW_KqT}NEp)-*Q;4c8)CQ_)O59rVoVz8&jbBQ$2hc4z3Oih z|L0(4hP3V@PAZqx4B^;{J+4WTt;lDRPLNx?bz?872v*xa@4ekz6CS>SgMDy}(v7~! z&Bzvu`V;I`Dio(|eQ|*q{1yt#5Rg+eNh;EotEAbQS>1~(9@i>G8AIv+X-sMZj%%&L zs8(K9CKDmRIb{;K4p|(gy48iPgZ#YY?p3|YNSoab#|rv}v9_aQUdNeH#I1ge;2H4~ za{#Z#gH)Js=--*UtVs2#vgXIgZKmN6CmDxq2uTxxNMs3RK$yX~H9Y19NJ__~_rAPD zey_P+T435ON{k@P#wa!b4HcRj5?Qn8S@*IhQCSNO5rCF3v{94E>g+p1PSm(@iE_0` zBWmx%O@&*>>TUZFM@3AW)RkK*QW>krw@p(Z4}>Kp^M}=yZexUV+Cn-SkIfB}mBBPL ztHAg=$;R`15;SwH6^@!PY>_k=b6S2;?WlvX5^5oMC9dZD|eHj3Oxe+Q6xi)KGqep}|U z3X>8~9olh!Zx7%(l71N+bCPr^S0J+(gn{EqyTGj3pB2xHP7W!rV)90--{mt`N25qp zn&Ukt4+JQTbh>$P9qlbER-xS2h^7f8siCB22apm5dCPT}=@2(0$cE#$bW$hG3alaV z3GjEHyedlGP>>D7%sp$lS1e7o@b}H8s%hme!i;7A;b9IIxsa*ynR%F{e5S zu2e>*=2|Sso->Y0@0}}oq}6Le&V?JNRScv;gdzOvhK(GHte~Sk2BC@Uty~URNMlVB!s+%A~;d;Y1I|wqw!d0#@To` zkwoN(B+0~~B^7F{zz`=)Q#*S+H&nu{KkmV8OY@ZA#@aVni0@R-yC~WtL#-kygSx<^bZI zudgkO5_0pYRl}LnMH~D*g3@iai`XGa<2fVgc``08SP^tUEqDu+Z#3e>j2g9;3lo|w zq(L1H&M?xN3NuC#%{|^qt4*j`wKZS3|Q7=J2vOnPo zrjEuk(evS|KgtfMLAr1#1 zZp>>m1-HnXbAepaa3|Pzp$dH>z-H{*2|_y2CR*ZLgoX!E=|DqGT5C_8Mg=yDYtg^c z7->yAD@h(-5FHE>+J4ivl*P0Tzrgv<@nqRaDhBB~A^>Z;zFK5>jIMdA?#JO%ltfd% z!z9rRYbGFWr>d8<=LU>BlpJOyNd2Lc>VFQKfT@oEw;Od(q5{Ml1d0kT8Hnz)$H+8 zFsNaNe<%S&bkuuD_vW zMCd@EnUI2sNCUp==6NGPN8Ogohl>R6BwY>@(A$Ziv?BM04Gbxifo0*CBWI{km_*I1 z2^UkI@6abzZ}rld`nJD$W~+L|zkFu<+{+^0)Q}Y!kXa9wi9tMK$h|cg;ct!ly8o;R zilwLy5>pD%!ipvgdxdk?JUXG7EUO*&hO<4*8Iea%b4fSaop=GBLfVh*!#~#n5aIBg zG&(z>3qa!MC za0Q->Ru4>tf(uSco6fRWht5WS8>&fY+Rt)0XPc%v@)Z%A-y@x6Vh^NVn=p zg|u>86x(Qd4mY!Cr9QcU4?a3E^qrw+Fr{SX1Y@P>-Q8oGv_&VF0tx#as64`tT2C^z zyb#X-q(Fx)+yU*1qpDy`uOacd=UkuJNEAt7x6M5-&hA5=v73r?;>^EL(Ak@0A?)-Z zX0@#zayxLX3#EiH;?U(zXg1w07=1M*=0<$(z~KbMifRGB^NQLIrZXLDO+zvqUv_9hmv^8+-@<`>b#(+b5Kkk z9j{4qlc}v3XVLMraHk*_qCIesA_hj_Nr)?kVJEC2GIUT3G-wLC6k())oML92rR^f3#Y1 zk^nkW_YQ$}x(|h@G0h-59JNS?fsMJuD_(;Y{oNV)#ymCa+7opC-5nRvTFPsf^mqMW z5Orx{lo`2F?4E;TsG!#2Qzl;F1dVH+LWSu45^;24YQ;1GCA-?wq$*6IIM>bzsKN__ zU9ju==2kUPo}>s|4tn&t!W7u@-$bUlw$@=;FM1OAE~_%iAEo zP#%l-l_Y0)#ApVG!igE#<$O+CzQiMJXij3Qm^n7pW=BWSBr~gXnyUu^M~d5@0=W`) zW}ynOtbkqw&H5-#$4Jtb(?4)ty+870TSB)Jr?er?fjf2;EM4K=w`2qs_1% zDFcik5A)P|x&W>!N4XDlpyRZqC?kU}!6)GD{^ zKEQBUgo%lHZIS5=V*>H>(+p`2=Q&>0#6%Y2?1C+XDb4gglmEov z9TfsSnw_43DHfugy(LqS#9hP_G8&s#Dm0gw5(gc>c4@~GKj5BF?;sM75X0fVzUcF8 zs#2JND>K zh(HSkc^o}z65Adr5wVoJVSp#w+LM-9T&I;iJ25|}x0%&$o$$8{3l7bc2xqalX)Cci zm{zz%EJI1fVSvIHnH)&T*%#XxnB60vT!aMon;1grAj)UuGE!Xe(TO&FG6B;C(Z*Ce zXewBX{8`>-hcx?3S0fp0@tTS%!E0t!n*|OWT&>FO;Tqs58tB zo!1ISKj!OORxPd^=B-Jd$M_ok5!&8ds(rESE(kAkJIy2KOnVz1pFK8UvhP&T$n@;! z=H6|XX1EATa91A`fv3=DWgSaGSqGc|1z><4_x`IER`Mo$3Uh0`v|1O-H$!qE-gj&% zu?prR;z+F)5}j0(79W+E4?U+7NfJJJWUdyK92{Z@dg>CsZj;9Nn`A6rX{_S zC@E!LA;y`xf*H;aP1S)JxA9JEKjQqbSRvDlQrzjuiOWozzYHdt51L#kOdCrNOm?24 zJ;`S$46-|6UdgdaYc27MmIl8yfiG+Ik*cleN_RcJ=ixNcMn}Yihly%))Kur28ltqC zKkOgCxoD(Br8=d4jwX&_qS}K5?1zB2Lv`dPOTHS{^yy}yX=dIkqAuB$1Be$U$Iue{ zq}D|{kW+UqW4_hNwQ^4IF$=K(TG{7lvc=iYoKJyq=rm}kTg)fRKF=x_3`{(c{{WpP z+X0Bjc^^mU)T_=JFJ&L+cU7x6Lx*lY{rs*15!jffjMT`Y5LncYP&+1S0O(B<*aQ8A zl!{{vPLo}>9Mr)*poUOpfV1vVbbtee+l>wY37nSO9~}9On%nH_1jg)sedDoZIhAL9 zS|Od1L|YA|xCIqSyGoHlN=uvMvVHiwMnf@pRkeHyB3z-_xSjqER5~BSD`$u69n#$e zS%`eH>OB*WFG5~*E@T+WXF%DQ%7vWJ7ve1z&8<8o)B*3luC0YS!}IWG&%180ZrFBzlF zTuIk>hpFd4&ZdQY`QC7js4x?OOHg>B#ju%8os+}J!Z7$OhpY$_T-j})c++X->;m2n zU<)3#Zsu(`iGsN35nnUMC~^9dTsv>iE6MuDWvWGSo{T@dr+>D;uXRkv#od$st-5|jh(wB=-2 z0td5>IdbQ1i^*tJw8GP1KvrHZFR$f9eI*hHu24zh3K+-P@q0G15assBBezJGA~J-u zi$p*EuX@O*yW?03PoM*-#wrRWckyf{FK|9+Fl--kds2w1o|qk)uS&ydRpxQ_z06bS z5XTa#oGFL-^oL8#Gxs8{trr{Nne)r&6!Ph#q2enmj`|Q18hOVhevxy=f>6XX2}nW$ zpokq}rh05{9qtObAm#C-K?=`HDF$d?x87V3)x)u1$*NNd?x#8t`65C9ZD4)7@?pN1 zciyuQ<=~KMTI?j>#j9|4Z3^_;8_<$lo<*t;jkA^L6AyfJfX#%aTT;sg%~Cx zB>jMah1}>HANe$A1pw3pS=w3B`&1r=obMS<@1HFsz3-@ioGGNFj3!NuPYpPkCRh}T zlF{xa%FkU{f@t##212t7apO!@oSn-!vLPcuop<`dQZ)TQa@6501bfMAj3Q-_-RW_r>=X5(UPSen^Xm9kPUFiW&+0QhfYyAC}q;%&|uca324D^h?5eaGKx~La%2+epi~u*ouSD?(?w><%2TJ{M(SZvr9_G2 zkdtF;tOXR|ot9na-M1JhQCK&ds)=Ab5*CNZ0av-@e zm&|(GxM&roC8uwB%74vOPM1anq*6c2S1c@Komc5Bq=2$q)kK6n);Drzj9W{3E0pl&!^}ECZ*RO`-CXx;5BnEtm)w|E zT(O-b1KH(2CP+)vuFkt0QFdrUcFynPuALDM_jVfmBJA31qu;TN-lj399_Zh5pLM588c~a`xY52(xOl0+)j1VVOVJ6>Ok2ROE`pl4JoL}X)M_d(% zPL-WtSlgVnFX$S_(QDK=r6@RFo$pASQro6BNvaG_oFhUd*Hk=jRUzINMyI@{aHbwP z8Xw_lt#$^!N}y?3)!{|xg}kL=q!Ef}g-VKy2A@XTrZN0ufpF=nifo=)q}nmyesl^} z3fy;0a7{Jv==XJM~AEE9>Wp|1MJj#q%*3Rvl>nMh`||g&#mD2B_^GY z4RUIHCukgZsSVPboY%Y7LSl5-&o{xvNv(O3L=HHG$_HetqBaYIpv;A1>iZW0$;VY_ z4C2aG0doejbHyrfovHl69)C?vh$BENLd|Pa4juV(IH7qugf7u4V;ZPYBYbUAs}42t z0Ei|L^j0G*R3^a^G$^oV2FjYZ4Jg-0D^aSb``EdL6R>1LW4tMF!W_-~M*>!;eLk*J z?hl?)v@V%K&YmM!nJ}9%?rbhJstp78sM#b#7K*{jE7aAp(`cE_78#F_EXJrV_j{DE zGdeBG(H66c+=%@G*RbAfbeaczRs@}#F&ZNVbyFi+gfUDfIO8-{*=y==1-@UsB%p$x zA!=s-r#8)=he-O0jNr`U9^41kB^?T<(G?fPn*NgJtM^aH({mN_Y-~PU-%iXX(sT^Z z-Lc}PNVOJ5ALj-wq>9NL*|R>STX`z1Wcb;3tjd$?Mlb>=YJasyIcy^NOZi{vV!puL z>JSOj#heOFPSO%+!%nD-EMO*Lge2m6l73re(XiQ}$V?>Yc9N^qQ83fyXC_v-$Pjq? zJlq-7s6BtM>}Ms`<8S8_`nf`(sgr#jQQ+~ybb;Rsfn;+HU5Qg}s&dL0K{8idlz|4M zlv1S??D}1t58p;zP^V)d%VJ03!E~nXD2yvqFSNUZ4CpjY)1sftkzM4YnIo71N)F-? z&m@zILDu)7ExgY^RqA(*;JCypZ5*Itd5gOY~@lyC%GkA zXYEaOn-=Mmm=3grpEL*btf_5^LYdo^i#aVh!EN#OqR72Z6A@s>v1c72N~QstGe^m1 zXf6^DMYJdLoDeJ*hvO5;1E^%n6G)XZW|rD#4WzYhcJGv326~p}3GVl#AwlOl)Fo{V z1r3`(EjP+~w-liS#*muNhzkv3jHWh1SSVXNGw*mbG>myCqoOo1rI!!Bjr<;K(TNRN zq#6mk>Zrmr)lr$DP3GmrRa@1V$sN{vPdhHty~PP?on)+PN}6OOx)b^Fyd6TS1<}9n zULfCb4@IPLyb7K35_B8Q5u%<}kgFP^uuvoCxfXE=y^r%GVKzRTel`W#Ub35Y{2N1> zO2B2|Gjx(rqWWIzD`PSEfRah&K5?y37$a3^2(|5@&H()=KRJdi=4l!%FPWx64D=pR z%b-sYJG~h?X@HuIu3N{NSz6Uqo{`)3oTN6L(#&}rXvz_C$Lc~I_s$y_E5KzcjEo#6 zYag7FV~S8K{Xx((eJjUIHy`Ir)3oEYP8G1gs~Ui-{LvB4q`X;m&*U#8vxtrs@$FP! zQMwu@XHy9(g(p*nTjbrcB^Kax7OR-^GQDM#8P1xboq~F?yxx1%%P{u|=1)COIFJs_ z7*b8fc!TDT@fh657)@DNLDnz3Ke`ZnJFTRc=?|CuUO{6;(oeWwK%gmu-3pS-vK+KV zlUv3?wZoMm8=}>G9Lv%TdSjos%Wi?PENR@QSa4klpLSu6J)@DpRz5MzH(Q@s>zo!x zt&M`S66!M9{U6VPf$Y`&?G*BHVYG+b78_t_s2<9u93Ux zD50>F=e*LlkoI0@t=szMRy9%TW~sw_$eH=uzNYy?aUa85;=X1aayb@sESZIwlgqV2 zuNsFG4fZw)8pGy(yx4(&t^v26wh{O=#{FSdif87qaEFJ%IFC2s88OnthQ2MgRe$3RxH%y1zdf+vTw@hjS{^?kwL;Q*mYCmCd~bdg4OVmD2))M?N$ z{g7#H=J9D-mST61O6!>Wq!W9<2z~#-N7L##50+Y?Q+KGH#OobkG_Fhzh*-Cm84u+m% zkgL&f+=>&n-6WZ5VNqX&S1~+5-wpGHqed+E;Z9(pqEJc&mQ9{?GQ<_JY@uOV$Oxu6 zp^Nl*clP9Xms9Fn7p>7Uf?-s87<=x-#tU<^oMO0;l6h}gE6Zdi$$e*568J^}REk)r zAhZqjus08AOrVzYj3)HwXjBocA;&3^?tv5uHL*~XE<91dX*=T9U|w&3o>Js;Sx^82 zA40*6+r0xhUO<5zZ`Cow(W?;J-aQy&up{)gfR2+aj5FopY!P+}d1AAiqB@Vo^h}{U z4JaaD!uSabFXdXLLpso_3NyCschT6*6Y7aSOyE4PnFdv7#P17nl-FIS7)SiBP;`c` zUS3NwnY0ae8b>HUXjat`i*7gB%1t}>3H&p2G?a+RCNIF!PpejRM45O=A2jF$m)h)$ zn3Cq2R2iNnf{8xzh{n-NEK2+)>&5gWmVCN#MykrR7Myx{_PEnpgvVFw9Hvv6o;>E% z^uw%Hfyo>-jinbt8n|`YxlCgplF-MT1*qPd45IAx_W&mFILdsE(ITVRP|<0#Z9p+1g0<&`xX^3j zLeuCDa|{^JcT9<^h!4q=bnw@x(k)HUsd;SvMy3|gd zrOf$+VQ!`sk?=!;{QOJpScA*w0)yk;- znwa{ZBDGWY9Zv1+o0?<9V-^zUa6Vkl=KE=smvz8(D8zY7L`WLq$5xoG5KM10UjH%B z^<*%v30SJXuPiO@0V(BhlJHKsqBWCYmJZbreLggq(k5Z*XR^RWHY=aSww%rE36JC& zu|r0o2%tmGN^vp=jNk>YK4^6OVWYPf)TSzz6p7v0#R?z9XLW_I_@oC#2ho3wZbkvs zdHm}<{RihEOH98I)0%h4b$w*j(?r{GlB|UNIzboGddDJMn6lP`@wqvz05!y;W&@2N z?goo{m)Z5!`8?M6sP?W*qbHI`BvQqUJcf=^X?4?axNJ^tF?v(Op7*m-M3;kO;gaDIRfU1?DT`fI{5>@PlTFLC{McN+9NQn24N2~;Z}vxR z%H2v)iIJNK0-tJQc#>Ro8MTDA(r}$iSXfYbxVddr+D00&Fh|mf{w}0+YU1fq$Ht7w zVX*U$?$geldj+aa3L)oXKeKU>tI>g@(V4xjuA_Bz_uTk{c2vqarHC>oRz!~Heyv`@+-Ou|H2sn;T$4P#)8mI>#s8tW{>%{Mpc97|KV6p44jsdEbHJVjGh4=$!3 zjesSim+Elb*y#k39Tj!Ca+$i!W+;V-IDH44zJn7lFvOz0*Q0}6xp7QsQJ}R=w>Hm^ z+{#_GP?)aGXJFC@$%%CXIeD?XWDkgF(r6OD-J(PI+LZ64(IgmcKvCL=4htm7rg(a} zm>F{pV5J%Z3a5$rV8Hgiz>I#DzKH}Ny{1YOe7AeMeZlt<0Gg5VrC45GLQ^1)6sOX} zI|IemjbER}L$Xk+l&2O6{o-|xCf^$!?Q^%$)43WibDg?Dh$qn1nu+TT(NfrIM1Y(C z2SsGd{sfqpcZ_BY##_QBJHyd33eF9fnivgv?Dq!*v#`gWE7x$A8Zc?MADb|A^J>U> z(vPOi$qXemfps1{z=�Qs*(qVHGopMXvVhlT3cE>0xD@l`nHJ^?C3e3RJ8 z;wa>vxm~1uHaTKMt_@Suz8Q@!?uX7kGx z9JJO3l>@)qxGCdqFm(|pHzWNwF0aBNYxTQ+quE5hFRaq?$Bn(Jcb$B+qN1;~@Tj@N zD$2f(o4v5j)OY{;{d16WAJ;E7+t2e4vHy8*eQKw!L_vpX4Dk@Iv zW)9kj)_HQ92y##i1iyb23=eb8ZaP6jsoS2`2!(}?&W&9NOy`^u5jzp7Fx8P#>IOG9 zq0MAhc^Yn<&zYRPOn^*JVKhhulUn3yM@MZFyj*POJ&`b9Q3tf4IRWv0N?541HI8`< zY){0@vCt*UHpIMisq^>HK6$hg_zF>h3{vG>A7NTr9jaQ9&Z&uK$q7(el%WvZ2-7T) zMJ_L)QTRq<*oxWSlZ>~`Y@Zkz9V#jZyi-T+_iP8nqfXCq#4|Jr3S# za+on;$v{kqe==clv=#EHp8|}hJq$-lw~=CsjfX=aE>ON~qfm?~^w<;b3vL2?b4dPDM+0_S0D6 zgz7cwE=Df#fHMoO%UX5LV3M))$(<`Ku$_0$7m^d@192%MpLRUrN@Lzt&%>!+St=F@ z;{y`3z?r(46_QnNz1;(Rg$WphH-h~edse|fq_m0|D@0Wa3>dP<$fpzER~w>2M!?)K z*qs=j&Iv+^Ln7_B8_oi-r0R5g!D(H|!p}9=_Hi*X&crn?h+tGNUP0Jt_p+*H<2}K$ z{*xV~=b1rz(Sc228KT9fxxBcf(o4|Xsa)rBsx@cQ>YH%Rr?a{wdt!#eIZ)~%)BFn! z**&$k1h)i3uE8wCo1Z5kpjfgRw!(0{ly%OsoCzj6NlRji(o%d~M8zA*)*Hi7fMZc; zqU^-l`XU~;Ay3215?lXT5*|0$#mTDars?&2J`OMrT1N(gvC{YM$!p~%y0B5C%7{@S zrIR--$P-9HV{cH+7LtKD>7s?hedK7BJQ&eJ^+0(|TalD-@g4_@e%3yw#SfSxC1r6z??bD07&s+fiy>ZaW zHTSbHou0X|MTowd#g|v@-HQ)ipAoCBuC%*5nDhxO6j*t~Rk|Gv_X0LB0A6;;+n+wl zF7%R*BejVZjC(G!(n?3Qb<#iQp$=EixFbg;xaSM>q{bsYT?B>IGQS0@9Rw)x8A1oZ znDg*#T5=&8Hko;*8>fMf_fMe5S>#ZzTsl)n7Wa{}d?1FuRjogAY1=<@X`4tM=3dg} z*7=MYiJ?8PiVKvSSW`O51ywhrl8}Vfx{oPr%KCV=I3NAqUX2fWpkXfo_2`jfy3C`7wo6Wh4%=jdG^-_p&AxD7&B^^?D zLz&It7>A)vIzA+|gw$kJ5|0@w01S>8$(oUzNFE?`(s)S?1sK$J86DH8_>=RFs?(GQ z$_cqP0S(ajHR5+;^pgk38?~8w)wo%4YVx`APRk0%&UXgcoVm?;a^PXvnd^8gvu$CI z{YeV38Dh!7Jr`&jMtrq)Q7#Qth0eel&bwAK?IdH9~J7We}1RKC+qh1lK%eE}=;bi1$brp{mje3<+WDHW64JO|TcO$`*&;?)UJbd!7CcMn?vNJ|@`EHcp_vy|hT3 zJE)OToeA<(t5WYI9S*vz(a~rebiE26ih~j7<6y5pJTeI<-DQ0>Z-tWf`kFK)#Aed) z1xEu(1|Y9bM^gC%nI+;NPY%|b{!UCjn&(nP6)SlgOVr;Hv7$p-bMSnM^l`&cUg`D6 z?On7Q!&z^HG!1UzNLY50)+32OYz*5p|A<{7PmeIAHBy!FicBPxA+(d2sEIBs9EO1n zk?nBeB*eM6cu8UrLK#-f{dHu0+2Yy-XBR zsIbT|w1RP?-ATA(Wk`o@$%Hd>AH6KzG;wSJCL<}Faq=1dKmJ>$7&rE&djIk=!R9zv zbQttP5$1C&BsrSac$WIMEq-~a)gF+Dzf5$P_pqQx*0K&y#>V&4HKe6}9k%pZ%P}cBP*Zzp!kQZ3;4bqpB^ zMuWiWikL`Ux2I+to=j3qcSMZ5>MdL*$xAx&OfxY?Gfkn1Yhkj^6RNONOP|GbsB$+R z;BpUh&<_KDAJbdllEivFa32?Vc#PYv7-kNvCw8l(!p!ikZC`M< zU^|ObU3$Pwg$<2ahQVilZpv0#Z>jHiEMB&52Zc4={3lG0)49-*H zAgqC69yESzS~ix~Vt&_T&n>oXUSPjz-1~I;2C+Pr!8lg_*2Q^K*zJ$S}^uEU6*!Erqs=>mXjP*D$8-BIw9LF7chRDT(Jb) zmv^JGY3yRsiQ5`evXUKGCq2oawQbSWlbgZpO~8Ciz-w5-dDnS8F-sH|a)09t6#?M8=&axk)~mOnj>4$TKxS2FhXbRQFhCfnTGrwt_;Qb{)F`Efj_S>zXw=wDj zs8zu%LN}I|)6yZqt_neUBm~4O^EX~YHR+(5T zWdHe@vqDhp6c9EFq4l*h;*J=f=Ku*3v0s{bJWsd>t!IQ3&x{4*T@@v&e5ycFw7Gqz-Pg?vT3Zsm}mr>qq)JGWIN=@dPYL&)#JZ$eAjAfE&gi_A# z)LB$_(Z}*kV+zA?c%hD-=gHYYGJgVP(BlmnNr5!kZa-3MiF9XzijycXkA{gQ3`2xt zGO38B6E8iMXU2CgOlP=Er%_B3^g}8DPAUv3Q<-&{arv-Z(AjX2++J4>NZ{CerRrgA zpaQ<4zsUK;{s?X=serNOcyG-b@w%cE)HBs{j!OmPgV zhLLF;^f5GpJg{Tt@8f!Add|}jdw%aE{={lN&!q6j8e~d6M0d`_0J*aZW@^_GVwdy{ z0E3uH_ap{f7^N*6l38dJm8V8AbvlH}>7o$XW(2tA&=r;jjiUy1%q&h-HTiT*p0Oep z!%!)uVK!=VHZ4|;*w%W)6;qFBGHaF@P7yIjZB1NKT(XG=%mX84QP~-aWz*NmneM!9 zPAOMEZWX0*Hh}y0|&okD-WJl#y0tFE6rk1c~d8ymDu8nzC zX$;LhS*5@Gc8jsrCDAhaH|W5jfa>*1zP|&clrhHAOAbcEmjHNZbY9YFTQj^W7|Po> z@3AxjGJ(E?{$NzDjB&Kns6#^-z`H}j<+L}e4QW<_WPRJ)pdq+B1awdhI-NB+7+2f- zo9pxhy5DA(>dQ?*)sk^kS{P24b^m4LS5Ws3IccJzzU;LE3@XP7&Pc$tFjaWi9^m6@ zdkYeUei^)z`HZXe0()|q!yY*KGu7@4w-`~jH1b8z!#-gC{c5#Qr$5U45^wE1mL|Y$ z>tSx|@Rl0AUVFbyG_A^^HNqJ&DwgRW!!}wKX$m2Cf|T0>4};%E{mvm?RsW2?Ec?sj z=D@07#A;Xk3%x@WiI4XEog+ZTa51}G?AI%=R99{iNwaG9Sj*51E6>r9yz9nxHhKY7LxYBgaOR&d8=sExo@GF8J z+Hi#~?JVj4d!Po!^=`=|tb)>@9+BEes7E| z$Bz&(9>CPc+8=1=V2sc#x0@Yrm2$A-_V~!h2<9$+#X02E)>PZ{*3O~GzZZ1s2Rp>U zJHarluLZ?TMya}j-XqNVJglzz{98gQmq(+H%Jpi{!|80n8d8-=_jaq7!8#Y(n}^*h zwklH&H;He+9+g3(J;bS_-D)C4oq!}Tvze!NgDyH-kpmMTV!O`gzdjZ;u2Tat6#xqI zPc4%5@tS`*==!_8+GVeDuHV~j?>(x0nE2!BA=;z*v>GA<4nnP7*b&aIT;by6a64>{ zyk=hF;x(^wK4^B}ORG#WIWZxHdAN?PXpWJTsewTFDB|2}A?IELA4U?B!NO;=d6@q+ zm5D19D1wbem#A%HH9^W?i4-Uu-g{Wt826#wpq=+5An?j(@XvnlT&E45DlbdB2quu+Z6uAxh}S>G$fvI2miiw7Ex3QbQlD zvj?QiJ-@uJr$3Ti1ZLL0>C+{ME|KmhhNg}2){M>#9~26YZFwcWH`aSCw9}@WoNl%a zu_21^p_Y_$vt+I&>U)C7U7J!5CCh8EXVY?+szy5Shczf)?K)l2*?T9+pOD zmN0Ln51|YiUH`_gF#zjOrDC1aoEKMHP)DQD>g8a(-*0)#djUk0oGvnOQvR__w)H{z z91adKhYBpfQ>Cx=K^bX)l$#fWIIZu@BgTwy8U>ydf4Hpuv@B9Ly zT&$Go~ywaln@ESOrG&2o~HTwRFzM>a@k9ds<3yrtbhBg!TXHEYb52yID zIM-Kt!ML>(4N%Z>9dB7=`2stON9Jh>S#BG_vXW@X>g9NVP)EAavU1%`;-PcF%T&1C-8_`&$7+z13t040FJts!g2 zITPW!k?-MioZBvu#xB$(wY9Qqxa{w=S8*gdV&)nZfxu1KZ7+9s%e6yq`ARUxNZ9ML zzg#Qf3M0Do)T+PIfg8Sz72{WSlWLpw8n|=w0&ct981B_BwaIHdLBz^Or4e)%;$A58Z(4!W!Au;YNE`$O&q< zjEWE%FPn$>3Cc3nu>%J!4gkbztSDv9aJbbUR)~Tm?jtt$>8(eavoX5vM^Z;;)v(fW zQ4~wBk9$F_i5K>Gs+kxqI@OqtHm>gAQ9HG5e_KXHZ<;_U<;Y#DuCpb=hNLvi3Owt* z{>sY_f+0yQ@9)~#`omWcMDc4Hb>dw)fN5%N$HF+|W3pqtTvC*#_wLKnre-k{n}(m>3K-pVC{ zBwLsIdk-Is2M6QMsCH&~-G{Z=s-xgVyzKJQ`Lkz()L=;;-xeXmUW3x5RYaeqK&agyTm>Z6Wv7ohzsKxEmIt04daiE#{s6QiB% zTV1KckE&mCdReOVJP#RFb8aZv9r%GsJ1HL{H4^txEc034^eJvfRgSp6XB#bIf7Ws0 zN0hPU^g!dQjmnm<%oIa3*4=k$39kB0G=8J?RX`fbv!9}CubkQIqP2` zn72-LvIXXW28G5(LZnyggpD7LsOl^wHV|IHbqX=F6~7+M-vg^5&IsX3+ebv)R7QG} zjzRex@2^A zdCX>p*^w%B3{akj7Hl-ilD2bZ#_e z3ti|Mtr;C|g4cM6C9qD~KQg3T)U^_UD^UCm`F!o-qfs8=gkyAA~ z=n@R5@i2jrkR%FN`B(4&^D~l(yX_&c8;Cp~c?=(;OxYY`*offPi<%{sTL|pwNM1%5 z?aUE^aRw$8btLcDTZ+I)R4oINBux#dd34lk@>r-zKD1XmT-(NX`Um5QHe*8^o?K>QBFQeLY)L=c7l z?^5V|h@gq+2PUfc7qpp#`QKaiNhxAbZVzW#Bj+$)@y{Zlu3ebulXp|@*(QZ#n49cx z64EHFtf&J~82+U`0xk_q%$eR1JJHzf2kCprlF14p!-oZ1t_mFd&S1Zx;joq13$rC* z4u^EL!gF3(p-;RlMp`~3nB8F9i6W zI73}Qs**#vhIJYWR3UFY1b0<%Xnn*PaL<7fAko?k$XhUK0mdy0-VwgBK*PgLTMpUL zQ+J9*UXMnQk5t`&O_3A`u{8Xig{A4-bMWjrFN+yHiTlm~MIK)`go6N30Fh@V_hC>R zIDbQHncKUy$9v-u(v9$xfix(%U8}#`H`&H3_4EF^|HufLvJtWs3|jHtUqr$?N{c)) z0Qmw0N^}>46`-yFj@QK)aGX$GnCwXIJ^~YkunZgwGNC_O$rPGq+8TFs35QJBf-kWE zTX4!Tat>#*9XI|{w&Nzwn}~ZX=fF_8I30lVa`|zIoCP746bw@)R}CIC z7giBslkCjJ(;;QxHDNM@BvaGvIrD#U1u{XMEyE^@Kb2Hx%b}c-Lz}722o=*GBJ5-i ztdJ#+Fs=KS31>u$@Y-dZ&#?nXEa389*gFI8LdQ$##YG&`XfP6HJ7_RtXtnaFS{)38 z{p?zSIAPAtMuW-pZ<_a>RPb5;~F8g9McoD5d%613JF6`<;#sT!(roy zGcjesR#vR?H%`lNT;P?}OWmTPFLoSky{jv=ecKi0j#}>_WPmPo`Zq%N*0OS;Yj5>e zvR{RRs=2}f2?HSc(u5hV9a@wF=R|o&ESUB@+R7`z4GN<~z#PvtPK&tqF%R}-fJLM% z&Vs(Zi_o zG$ahQ<<=3H-0n&35LT!vcLhSiRg8%C2`j+au7q0W z>^@>kF8g)|rX7SDFladm_1y=lim>v8wwY0}@RL+30+(zNKtA^I>l46f zhqoq$gDwrBxE}YHcx9NvaN-DA>axEfuy%)Zrq16w$5rnv9s9j?Ga%UEL*=Wg zhVcsP(bO?&?XX3mUxtP*vUP@1=B+yQKXZA$U+;RInH?X^$s<7GKh?R9UG5H|_-I`%Nj{^(rspq%J-{ zQ4AeOLA-@}Yy2*Mk;InJ)RpgOhoA~Zv4qq^DZWE@qEzKFM)lkTHg|n2m9xTlT-h#t zNf00QBatt!5LU!?hWf;DuqWbk!j^`(rbg#plb$p7(d6=+Nf`=Dh&AFR4b&jX8EsSL z%;-LsIERt)+`I}pMioGacw33e|CqaI=U&$RbNw#wMaax+RPb;HDR((S%qt%qQ9%Xy zmc72@>XBf;mer}YW@!9&?8n3iBlKv6IYP{K8JI0HMvV@;(9o|qJtPgq^Su4TZNGlIKZ|0F7@h2K5kt^ zM8s)|WXbR~itMDoJj^*-1kZv{BB+yLPlMbgY5>`4+WB42KTp{wLCl*_Sg4XnIOSBk zg6=~$ZvKD^|EW%dj1HVRvPY@7O(7?2OghDBdm1*@xP}t99wAZuG=jj^kTRryOz~wP zE9i6eDj=j$@`*Av#^xl2$k?19BCHi`@X9kv0jq$WvxvSRSe{m3J;lVNOMEy7tS%oL z=Bjew1i)Id$U*x-`LH*@?8wQA=3BK;cGO57Q0Zf`W~+Sc5P5mF`pxQD^t|cfkX(CE}C(3|UDv2_nIKaU=#Q+=^ z1$r`tq-)3kkJ_)%kUpVv#$$*M^{QFr9`w&BM4^8PIzqXy$XsTG;zg8uJS^27VN09g zFIQ(WZ-id3&P91t^1`Mw9AIPD0iXgK1rV{?V;7_94UW@J0t23^tS7-Su=*-sz=J02 zU91QU`!gFl1%H(w3y&ru0bVs{Y{xQB-ZDx(=p;baB{*L^0$IZfSnbGzVqEeC@yB)} zd0u9vvpF8Z#1A+~Lmz;8&)mdkyq+4W!yEXYPz^KQdw+(J=gPGjvU}i@`UPLoBBPOy zqF0K4Ig7A>061QuH&^(}tBVTlAI7%s0w^T5T1D9)QuoUpc>11)f7Aoo^zjjY$EB{* zk^ozrVSm{+o0O!Amtu+&y;oz{%G8XBGbq^@6aP8QFD$e63PB8F7QQR21!jL3tWK|_ zPhUgK6xP9!|4kJo3PT~bL!?Ct4D}A2Uk~#Q*ARPhqd*j1icU{flp(Gl>c(7OZyny| z`ThY=%}qcHz&HCn=`wV6LT_+Vo^y4$&WFp322ni9XM=t}8dF$cdA}adQsg z%t%Y+^r=ji-H=V>o$Z_{-vQaVIucETTiaBFs=%GARJF2}uu*37mvr;@1GFoLdmJl4 zT{8iMY1I}2P&sGV)dIc5?1Q%9B$h-jY1yx3ma^;L$@sauSHRM+!2qLBbp*vgTb`)d z#-CBf9V>UfcI{ePlSa~6L)b@cFnHxzl{!D)N#msija{C{8Gtcy-^0$7p|Zf(ON3qn z%+N>fjcQhy(TPM>nL#`|Zv0fW4{Qy9pz?PtFrPn)JO~&<<3ixq96rSPY>1QpcmXI|BTUsD%KnFN6{O`k&&rB(y?2nIW9}&|0!v4 zjR6L(0m$n84Ql`_4WsN(_QE1ftqbJn3OW}tER>Dav1rh!Zr|bTkJV*2n9Jm>!gSNAJB~s3(>L$3|#RA820gafGm@nuAUp4zWTfOg)eij2(|GvT}MQySZM8+-{)9 zsHO&K7o5J>!rmFO#}vfl1)ApS^dxN z2tFG-F2V1-v*@O+o1R&;@! zpebP_$z5CDsolBy`j7O6hv-HckL7|1Ojg|Wp1e*z1_1n@|ceJQjh4D(VbRNrCx1XfQg^$_~LU`XqKa2ldtmHu5a(x z#^am$#ohF7Ik>>eeEMwtCNxBPhb$D{1c~lOL8<_q6TuA}Ow=RoOyDmgurLxV=g3?) zfea*AblH#`IH`Op21w$IS|+vEqcHPW7%|Ki_v{iJ0aQL@4M7yoqpYN+*sk@+64G5z zQLOEPj-fteNjB>;Jj5C`gq7R-K3->JJ3E2}T4P-KYs9WRe_?yb zMpX<9!2|r${_)_~!M{fzwd*AVK*GD&&tIhcv^dlwab5LhPLC01K|v9SRc=;bTU&a! z?ZfKUeOUN2AV?B?G^sAQ6WF;g)319d{kk7YE_aKH5_Vy4Gzte%5{(VSdO+Gq>CY@g zrDjQ61qVtkj#Po<&gad?5}Rqn34xuAgwc67pZ|Gx8+tB<@Y-YSA^=}FrCQf}EKjTm zlha9%C1#dW4rxs|btyQWamNDDD?}P&0n2+LkZ~3`a?b|N4!)ksyL`Up!g3AUJd-R6n=ug$?=m-(P>)TJTeJDEu#yq-#5pFqQ zJApbZEN&ddD)C&kEzqTxBIo{aY2g4rw6LcQxHefiZ%^bSCf|my4hT!a;Fy*{?RD11 zKza9G7W}kDT2-IiZ)|_+z)@*N1T9*e8-CUcjzO#g;*>^X+ZTD%8mW^)WbShP6n1%TP?bC@mL#{$+fi0{cC|eaZpF3~v1|OW1iLO@Tm}JdsWs@L%U~Xx zvKFB&T` zkwim@PqldP5|q`~_|wPgjlHcYr1;bP>PHyrreEbF|0z&NU(DH_sIzqoyd6cy($oYB zsQ|11DICWXNX}e{ybJ8QM|RV2@53cg%xZXa#rTUNVk4xsSU^07%2OiyR_z7O9~p(A zv3FzpQKkpesUR~m`7#?_ppAjFzWHiCo1Bv^BpPH@=k=lXoU!{%PN%z<7E2Tu_|^}y zzKOMVDlqv^3k&j+U#OqQz#!mXNlKdbD7RHhx9mxlJQaSoy(77KiKr&xI6wglQAxQc ze#@?8FthcDAtrxS?n-W=r`X(#lgingF#Q#hN_w~iGkkcM%w#7fG&4Zo!ad!hUA&Y- z$K*AMI(LO?sTy)pZ!#ZQ*ncT%Y%h#k>M<*WV3IM@VDLMZ6p1AfL#=JwfjDu3ITqb8 zdu|GdC)EqIeT5GE!>hm#Cv<7)c0OrC|D!RBP7=;?%c)Tj=h~L z!&s#Z!0B^?8i3QhS^6G2UFmz!gz2AmbNUfgtp-lj-UQ(;Ho_V~pODw$QH=uH*R09( zzFtASLTdUZmsYo5Esv8r0awc~t%85suG0ZO&Prcd`>5^*{J`V@I4}mpiob(CUe7C) zLwT^N0->9(?Pq52%ufn9J)!x}@Hp5sY*jQa_~{S^HH9N6eG|pz2yLD~f*7cX1!Nt@ zQl*LUH4--)Zsl@S=oH8`KrfHGpK?r)IB}RaDM(zX^+{OM2&FmLD6!dNX|IBK9ribMj7^I@pe3KoM=Ep-i~l zW<#nD#WP;bE?#4R)|KoqC+bPQ(;f&FS*`OBa z)+VAb>?oY?y;>&EDpGG!P$8vc159rL1GfYjjFOF0RII4^d_0Pty=jLRlr(dXnF#7M zqT(K~!0;RYrc}lP2Ue6(SCT3ryKkR=W9*=U*;K8_#|*JKSboJIv8yqOH#AI-qa3B{ znH2EacG8xbQ*kG8nKMKYA>meEwdJN&WK6!t4@&9mpxpsOz2I>srx+};L<7h7svek^%m++fwDDNBZJP)$MY?ap1WN@>-i3`+4k^$;kIt6LOtkAE@V&P9QT6k z2`HnOPx)ZTf5Dg~T!xy3XXa0B8r33JAheLy`Gu`@4Yi0t_ZI5jik^C3fNdh8GFtBP zq5h9-RSUo7)38THVQ%Sl3OW#Mkkiyu0LF1@_R{gSxaFP5K2i|jh3j_Fdadsh0;`Fc zCUl{!Uv~vW{^S-i(wO-WDqENiL`PGXaB%s}&ZIg&@p0d}Vn96TyadKm>#r4u|Gi8a z*#y%N0!3Ho7b>QlPOF`3^x%yalP^~*aYj|GD#Ks^+|13xQgL;5k>Xo-!TQDMkLl?2 zY&li{`>H0v~SI{=(GE6 zbc{)3+&P*O2T{n*4i4JUe7OqUol0>J13BH{WibZ>;TiK;OCs)sm2#5qM1z_GVW`?m zj`AUFuG|QgOB94w%}Bj0xE3V!D-1k9@N$lT1{M#8Uv(UgWylY^9O$q)@aU6SPCgabqG8nZv6?5xi-CFzuN8FEu z$ND{zjaqHbMuoTe9(sc>5H!R4{ElP*HzUeKsB_HDFa}0jrY0!qnsx{1V??qw?y3i0 zh_{Ba4-|?F75mwHtqU4aQaESsgiXV=(XssdLE=4`Op_!H0DNmfaWWc5VA+Yewd0VJ z4eW@foogM}xi*?yjwHhUK0R#5_^Hvxmao$MMz#NOdht38=?Y`KEH(|qlRae%1i@%D zHcTZz-Tkzf+{2?oQ;o9k7<6M9DYeyD9a3$z`+t0?g$38fh1iPmsw69+5=^eK_U?pMJ$Z?8r2p`i$IuoS{NSZ?wob&GkBe4mlg^e&7KvIbsYNW3Ra z=TRbxF779orp$23;Hd#s@;O9CZ$${_G_nb37F@TyqvgkGI~4uOBSx78ifEvFO8i!Y zp&2%y7>oZT?lHQC?^Gr~lr8HL&U$0u_QW|x`WsK=#a$#Ved1e@xKl+|Jc!i5yruCQMd zN>sCXYRf(QNHvnD?O4~lf`sX@YT*bBUSj@Kvz_6)%%A!odRkw`=$%EzZXkHQ1w+ew zy*D)tplK;{Z<(sI;4g>)L}HUEF2V$0nR-VxtHcEG<*{s)O2R^y1zMAc45G$gp^g5A z@aI;B>{)Q4yarLOAT^<&Y{2Inv06;;F9G+* zSFpWNyJQTJ$<^iRE8dv5SR=#wahNe*cl*?L7j?V zBK+TfbF(@@kI;JbaI+9g1Sa4?lIjxwjkSo71G*7}Ghl8^uf5UuyZf6oflv(;a+&xc ztoN4m*Rd;~=H;7#kF#Ivhe)pD$c6n9n2Ov=1n;7Dq}stKDBb}D?A<8_kuDZUwVg$j zP31Hh+h`hfQn*FBhgA^aN=e<)0jgXh=4^b*a^<{9(5W+`8JO!)O6}@{;g7O?=6;An z>|jsEP)FNV+Dd!Kwnr|eWCNb_f^1bZ_zuVeDzv)$%If{JEn9;K8xdZI4;;WC=mgp7 zz@TcjCqbKw^i+*_c9UloV>W>%qVV1B&18z@9G|oKc=AoO=E6q=Xoe|x)dPSIl_PL7 z`5nC5>;saixBBx{haowS5ux9ubr0PoZa8!B+Kvop>)Q+ZVoa`9sQhfZwpH^uvR1x= za?C9}0D|J6qx#4yhE`|#;$Z4vSDbT62TH_+#d+nkPcMX^8IE#^qZ022`{3-ZIO>3BP|jL+@aZPp2X^?ecUoy<3bes&1DuYVRw|Ik0RRk?7`#I037aVtpb}KsWPw31SH8p)jh-5$)hOX)0+d1gPND+cvjcg$A6q^ic+3Na1 zJFIC46tHA0cZUdwRpel3mH5VE<-$cX!ktXqrqtUnF+dT%l|Uk5Zfl5;I&YM7r7GDC zKq0`E0HFn!`3P9KTPp}~y7F4g_;rmL<4?nkv4!!S$Dq?eO0A#^KtG88@)XzIxo3t~ z0;WI+L_m2VoGs@!irJUN9ZD;LxR_nnQCmT}x?MaLpWvkT-GIVNFpXD!z~0Bu0T{sL zC1$_?*&WGH@pbEv_W!rucNB0woV>&&F9|NKbOERVY==;~P+I~+4I0A`06jS8MGhj*7)5Ak)yljQe%+U5cKTOZcrio&|OCDh1SLQ=ij*u1L<`v~NcxUn4Be^S?lA6bQ)(m?J+G=eB+sK>6 zZ=Y~v`$Zdp)@~;~6}P%0T2>(cT_S`GhPJgBb=}eR*(9Flpw_w?v)%` z(Q)Q7MYQf59_Bn|E>i@_wVzO?=usZ>pG^c6)Z;1#E+~ z3Nt0y**Q2qy2oeg?l-?%Gm3QP4{aX7;IhKS@7R5OwuWM3pezU&DVv-0H&_8MqMAb_ zn!$CSy2Ef^*t*geBVx5`JKW~?0|@qlbCR$;+?J=N6>yI=7cRBY=8xYd-JuBjFKPI zws??gdjho@Om!X=64oU(D^RPMA8=IGGpN@0pO*dE9p@Nm_QSRq_P z7)%M;wnj-eli3|KFO=DHe~h=_@E(AYUGBuTn4BNY_r#4_>uDAsfe^^k5yVhF6u#yD zNQ|Bq&g3D-rD4Uv$TawSi*V)H!>(Cma)aG_aj?6@-{El8LJRu@HfP8VG$;%1_~6xI zar!`-uVJyR7N=MoO$?0FBhWIN*4VNRO)NMJ%g72;LQ^UyO)YY)!;RQvK|uuUD1j#so2TTczEI#lZ(nAwQV&Mw7?};hld_*I~K3Kxfh2 zax60PsP)pfo<5w7rA}PWq9@eV7GQSE->$$c zAx}~BZO>Y%cF{#xQ8>!go^QPo{;4Vth(A3(8)2V<;DY_(T2F-&D3T~LPz5c4p0}?n z0GcTtH+-cWJX{aXOol&Lw#s+J*fC1CE2FQMY;y`gm%4C0mWJEdOv*0CLSl*xy1fKF z;_4fl-6HBzpTV|fS7N4@)B~vYr801F2UAM=63*=TAT*?H2aLp^3~eL`SJ8)GKuV}H zSw>2rF3#!A!?WQ>Dyt3O-GJeF!!`{VvyV8IsB=um!y!b*IWRyzhVcZd+xo=6m$%>^ z;N^5RSu{iLp$A#hQ}tq^Dg0(!n1|6^_9GjgIjy|Jq09169i~2#KKrVDSfM;s9#-h+ zvss9WF@85UAtu+D8wt`SFGK=5uRZNp+dv`;kc%h-o%rXwf+{SIh4O;jz652Fu` zPrt&~Tu#2=f3fLhZdq$2-RU5joLs!RxIp~1tlwd-)1_fs3U4rt6#O9{(1}(M)bB7j z4=lZ^2d~0;2wp_(6FP-|($-5F3U@2$F-(52vjguqxX- zNt#ntd~&1{h{F*zL^Qw`;8B05$812n4$^cORy~b0mEqC3_)~a7_(s?<6^ces?gHk# zQqk;9Nc2NZcO8OBu@XWz`Sx6Fq`RK(Z2XmFW9|A2%(%X!_JaXvYTR;|Baes@o$3T_ zY0%c`L11_Y?=BAF)A*VBFTE}V8fY|Y2{hIdIDh5)kb9oaPBF|Jlm+IN2#EB8)gR_; zWji^A;oD?+R({mnmI>Ecw*7*0X#ygDr)d$-;(}ylnpRE%LDFAqFa>`am_i1~hm$|R z1%a4-0ajtCDgPx%3O1^Q8?EKT7`2qfW%sjTBG~kH`0H{=4aF1qkZz`+XvtZ7S|l0V zZ!!@$cv2xVo`L#_8dCjxc6TR|*WMso7L^VY%BDm|9{kA?S;q;vH?lU@sM9i>=KNO`uTmdF+ zyT}-Ct%&V+8|PLuC&r_O%f*H$TYDg~fTR%n&Tp619-o*3jdFjS-xlTNR{QMNpN&@+XO5IxUxlS9Ns5L`)hI7$VUdK$w-{i9RM#^*w*Wn3 zQu!TG*#^sHO~_Oq`F0FLf+$26yHedw3a-@wG`sGm3<{aCTu#Q*3-H{VaO&!e{ynW{ z>%y2->t$=B_c?>;t)mHf990@5+^oy6W`HUvF(F(PFNpAt$bPO_C#mtV#2m@cQVVQc z9BdbuO+pEXn7*)7%*N&kxmh||2=lc=@(oQ2Tt_hRwgG*f%&kla6}IK1R_Ktr_Ih0` zzR$q7)HYa6TRw!FyNy*4mAG091c3XV z2iZ~y%VNLOp5Q>dA72)yQ`Sm{0F#fgrc#tDg$_TQ4DDD)2viEBC}l%0banTdPFi8!9OY+R82QTyKwG;My>J*;RQ6 zWFBMeVDEN3{!_h$NhwSVKME>FK1~P@QYCQR-ePwP%%=h_;w!uZFzT94z zOA4XTkZT>o?DLlBx1|1EFIsm%)zF+$f4co7&Spz~QW1H{nyR~HZWC8c>S}BPv)CX} z%7ydsNDFUMp_A%yBHxilP{Dga>g9qsYNtYB9uzHzgEO`UpvPyVA2I-KK^d!Jm3^RH z{(EPW88v|h#}d8EVxbg?pg7d*EqIdCx)H8zZ7<|;wVLY2F%v%RiZxY?7&h0BYblIA zU)42LzvsgEf~s;o4p=Cp4D7HYI|%7CKxe;y>lqMs1}a1*kX~mMH0}9hxYg&AXvJ-> zjL=*e!avM-0N<&KhY5?V!WLLT_)phq_qyC^r-#b!>gL+9y)xBq ztPYs?-Oboe6IC$f^nLndM(8_GW5mX(aTbvW8Icu{usYcqfNd;kLNLur>)&D702&hW z1wdwQ6=Xa7yI~Q2f!SYCB>o66Nzk}EF}|8y%X-ls8 z{h2Rz<=#?sF15GKqF;}!06$wmNf@sIa#Xa&F@$i6xtgL}6^8~Bsl7Rjp zRt0`Ig#OMsRDI-KklY1xW-j9xBw2cXo0CYDAsWF|nh_Se7ITHp3HXWQ|7n-M(3PzX zZ+j;&M{GHo3o|PiTOqp0-$=ViN+6r9b^Z@u!EcPtDd)K1xS+KeQDp{C-l4bARTiSE;{b#^`3rwMCdtkc!_{7>**QI?$|W`$6@Y>?=F zgh&vOfVC&*HQe%Iat3w83$WnO=KsIyK z%n-W)8=!)T_f)-yhtU!o32+0+)d(sa?VCY{wHUhb&%5#6_$MVWNZm%M-k4GF4Mci2 zX#_k%D-Wl$)$mNZ*m(B}XU)JKXC#40b-HRN0rbqLV3fsL1J=eg%6BzL8yxM^XHji| zMF#W~$~Sp4fUsJQe^7O2i>#O{i9pd=yQ_|1@KK;+LlJYx5Wft2LI)%;2|-->FPM3p zeUU1ccHJZ;{(<>NV(f!ui*hX`a8j)AHq2X)+JswFrrZ86*u-lifwtZkZZZCL*B=l^ zFjDppJ29PnrVU(Ms`iFY{|n|R1VA&zj#Hc-N;}K*x`d+F>f(k*zm;LI_2VD^l z{VP&&=}3k6Xtki|m6$)a%@{0Y5;n=#`a~{HNQ!wNpI|)C8@mO_$rXThe3s~&k5+U3D=9XR)DV}d4;4b^jCyX9^NTUuYl#;D#0isKTIrmq(uS) zt60E(_>#z|fAr$C7rhcevQXlZbxKNMsG?$T;JAO+lbij6WS2C;F@4R!>_QRmkQ!F+=3k;>rBM0;;RIlOp9!HW z+R4)N?=_=X={>T;eM-L+;R) z)NF0TJ>Ye>^o*i5Ns;`Gg_76p)O&eqBlUi5t1-q`XeWV8D(1xsq%lxRhbkWSB;%Iw z-~(|hWOdaJHUly%0jFho^Lc^Rt8$VxgXPi7cU8|RkeZ9}qt=pCdPSy<8B`IxpWcB8 zW~QlgfUsd;LT_U5nYJG{!>H|@j~q~iDt?e}OL!9p=MU%L{7&a#wow5p!FVKqB=B}v zDLr4#z=g~EKep%T%@DolNV-JdOhqsu(LhO5M4cC7EbOz{p0IBuZnG`3+Vgzmkj3rvK^_rMeHl>H)|=rDTbyb_|tDbAfi- zB6+vTrJ`RE9&b@!+St4aOV=4bHzZawXQ9*QWrl>y8%u}c9bNjE^_5}gTELD!w{UMy z>ntM&K)C=(i>G6OVp^3P+*c40$>%e5O7odI9b+iHo=-?Qg56}33r<)QXT07JDg5Mp zP?puJ$1|#g+rL%c6p|k>tPtr^XXi%RsWW}uHAPi)==(X@JU}(|F>dXC#!D~m=cY_g zIQ){(`$*mVcHx^Idx(CQ16C^o73__fi%ytLA$Dg&q4|YnWUVORbBdArFv@G!l>S^VKWU*ztQcku?!(jLkU`9iHvS zUdx&X=&K|mfK9?B$)gDg2}Tc)+JP5f4GqpPK=I*N@?D*ssIviX6QtcHw*tBn`=!Yx=Lr>gs4Qz66s@iU!4oWEcnDodT1WVCJsQ#JX9b zZ45WS0dreqxWbqITpchG1Sj@p7(}lJAK&mRoB0M1e6R8Kh~(UCyZg*GCbbo;s@>() z-Rffg6_voCAQoT-i?OZ|Nl_=F=yy~r!npw4p3dmC@`G7_6ZP)_+86_8nBzb-XRdym zFITT-7f0lfATvZqk3#5;lI8V4`XnH}^fjlV#d?zXxs64E#(2Q$0K|7{@gjv>1+}rI zruG`kYDf;b8`9GLnCa|#O0SKoz;6UwdvP+qTOc|eFojW`b5$Y+^mAfBb{hYFE?_Nk z(neVk@8iQML=SFc&`(Sq}EG)@spq;+#gUQX! z_+r8al55*3^MCZe%O^_qVSe(N2;Fy}2Ktuis1`_DbnP;r_4d z8ticdU`-v88(ZU^M^&-izK&{f=aB&dB@oX=)xHcFMGFge?{+dsn|qxZKTxd)Vm}O4>tqCY@*3&D=>PjJ}MTkmDc2b*@ z@?C{g9bEi;z?JAe61?lzQoI5o(bl;(nO-et{|n7+_ixevl6QO-V=#-EEY{9Qf95=J zTv`OmLR}`U1+gadnQC#0SQU_GAX`A5fw}=f!63Zwy8OhH?AacJeXxG?Egm?NnG;oq zup8nn=&f*6C4%yz}FlR$moe%RBvU14x1GRECDCxS{|2TsQ zBu!dsMo6C!%dz}@6Oud$=j!IU|20CxYngk$6-vpJ*27tIO#Ni*1F-2|u=)|foT|gF zS|rY|F~8_a)?SK5yP${Ng3%>yL6Um^E?fwgoU0k?gc;h9240P;eVE$U^E<31K$7!` z$Rti+JW6vXgO5}=De@C^@LB^rPJ_4)`NpbtgJnQOrrJJ~=y`qk(f&yT)EY^*=_^~q zdZL&>3JEu#U_9CG<~;d>6-_Kx7rilV6!|7OLLuVt&q44r5gz zIs#}TVf4DfB;Q*&(VZQf=p(>cV5zdCt7_ka>y|U!=?#@a-cTJd(~r%Hp(XPXmfP5) zdr5qDhz!dGWL1gWBo}IGE8xZ;K7Ktv2W3i+QKT^;Itln=9AN|Cu`sT=StH44v`G0? z%{Z&FpzH%+fNK7z2Bmz-$fIQN1h`<10G$Eoi1bP_MDRGOQ?JLDrx=Z;&t1rq;h8d8 z?L9xFN4*2RkUdrj6MZhH2DF9K?$^?0|ZIvE_gyU`R7eM_0%$a12Il0zJc8@G7=xB$Q_NF4DX z9Vp8V)4+DWEpP8uGZGUhy!$v!(A-2fQw7O1j8b9YT!{cBCnmh0W<+STP&)TjSG4}e z7a{QCF_JnbI8I-n&nt8t{?wBtT+AjeNsI6nKziIpmEGcJ@xHd`?B)e*i&Etsjvm32 z*m?}VKld*!^tYe@t>a{qoFxy9L#w4<$V!_4;^0$)Q}85^r{$i6j$_Tl5i{7Rg-k*% zg!#Y6rnngLMbg+i`8IrobvXxAvxDW*EnYvZWIk=G$Gx|6QJ4T)IE#`yHd`U&NHPXZ zS`<(plEb=z{fsx4*w39xeXdnd1AHYn3@*8QcfnDX>k4G@Eu`bnEXLesiWUcnFss~gUH6e!p;rUrHj!_4MjZwa z2uD~@pkG#jZ-yvnb0*$a?Z~HrQ-`;li8hrkDaP@BIrs!mw4|sNA_uyso!1k13VydV z^o3l#VJ~{i$$ukl>gkBD#RAQHus^>YAw6M&Ld;NP-f;bf&mf?x_gA=u+l=Znj1{Df z6=tBUh9&MemPX0La0zV15m)IucV4q|hq~h9Z|BpyB^QcKc91PToehx>XmJ3q%Df35 zY4Ij_s@0nu1#f~_Qx01ZKRc6rkNP!FFF&BJk#h|NJ+GXpJJ$ zN_A}5;~r%Q>*zf9E{qCFvYjYN?=Gn9p}s3H9RVhmFW$O{U)JOMpLzk ziyJvIWZ%^uI;GxB=cfQuEboqyuPKc*VUfof}H@tBH_h2B2w<1b6*41<*XeR{aHVAXZ2oK z%TV|o+=UtfVL-GM##?`ST}aH297#wxacvVP%f#8|_FgnCaFvPxB7_Lxxn@%9<*A#Z z&8a+fsXIEr(-tf3i?ZQD156|!kTsESE^jQE7(BVKaRBPeTgp@7+ryx1tfK6t!tZbJ zWw!e`^J!|T6I5&;iRt))393e6709lT*b#j_WI70Hmd7WOH^`fJRnn^3{|%G)renD4 z=$zGC2bpf11+n_<-$ZG0g3j�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