diff --git a/toontown/catalog/CatalogRentalItem.py b/toontown/catalog/CatalogRentalItem.py index 41a3abac..3d27d55d 100644 --- a/toontown/catalog/CatalogRentalItem.py +++ b/toontown/catalog/CatalogRentalItem.py @@ -47,15 +47,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') - estate = simbase.air.estateManager._lookupEstate(avatar.doId) + 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): @@ -106,6 +105,9 @@ class CatalogRentalItem(CatalogItem.CatalogItem): dg.addUint16(self.duration) dg.addUint16(self.typeIndex) + def getDeliveryTime(self): + return 1 + def isRental(self): return 1 @@ -130,3 +132,4 @@ def getAllRentalItems(): list.append(CatalogRentalItem(rentalType, 2880, 1000)) return list + diff --git a/toontown/estate/DistributedCannonAI.py b/toontown/estate/DistributedCannonAI.py index b98eda66..22f7d734 100644 --- a/toontown/estate/DistributedCannonAI.py +++ b/toontown/estate/DistributedCannonAI.py @@ -1,57 +1,102 @@ 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 +import CannonGlobals class DistributedCannonAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCannonAI") - def setEstateId(self, todo0): - pass + 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 + self.avId = 0 + + def setEstateId(self, estateId): + self.estateId = estateId + + def getEstateId(self): + return self.estateId - def setTargetId(self, todo0): - pass + def setTargetId(self, targetId): + self.targetId = targetId + + def getTargetId(self): + return self.targetId - def setPosHpr(self, todo0, todo1, todo2, todo3, todo4, todo5): - pass + def setPosHpr(self, x, y, z, h, p, r): + self.posHpr = (x, y, z, h, p, r) + + def getPosHpr(self): + return self.posHpr - def setActive(self, todo0): - pass - - def setActiveState(self, todo0): - pass + def setActive(self, active): + self.active = active + self.sendUpdate("setActiveState", [active]) def requestEnter(self): - pass + avId = self.air.getAvatarIdFromSender() + av = self.air.doId2do.get(avId) + if not av: + return + + 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 setMovie(self, mode, avId, extraInfo): + self.avId = avId + self.sendUpdate('setMovie', [mode, avId, extraInfo]) + + 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 requestExit(self): pass - def setMovie(self, todo0, todo1): - pass + def d_setMovie(self, movie): + self.sendUpdate("setMovie", [movie, self.avId]) - def setCannonPosition(self, todo0, todo1): - pass + def setCannonPosition(self, zRot, angle): + self.sendUpdate("updateCannonPosition", [self.avId, zRot, angle]) - def setCannonLit(self, todo0, todo1): - pass + 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): - pass - - def updateCannonPosition(self, todo0, todo1, todo2): - pass - - def setCannonWillFire(self, todo0, todo1, todo2, todo3, todo4): - pass + self.__doExit(CannonGlobals.CANNON_MOVIE_CLEAR) + self.sendUpdate('setCannonExit', [self.avId]) def setCannonExit(self, todo0): pass - def requestBumperMove(self, todo0, todo1, todo2): - pass - - def setCannonBumperPos(self, todo0, todo1, todo2): - pass + def requestBumperMove(self, x, y, z): + self.bumperPos = (x, y, z) + self.sendUpdate('setCannonBumperPos', self.getCannonBumperPos()) + def getCannonBumperPos(self): + return self.bumperPos diff --git a/toontown/estate/DistributedEstateAI.py b/toontown/estate/DistributedEstateAI.py index 280ca6bd..18231b32 100644 --- a/toontown/estate/DistributedEstateAI.py +++ b/toontown/estate/DistributedEstateAI.py @@ -147,6 +147,82 @@ class GardenManager: return packGardenData(NULL_FLOWERS + NULL_TREES, NULL_STATUARY, False) return packGardenData(g.flowersData + g.treesData, g.statuaryIndex) +class Rental: + def __init__(self, estate): + self.estate = estate + self.objects = set() + + def destroy(self): + del self.estate + for object in self.objects: + if not object.isDeleted(): + object.requestDelete() + taskMgr.remove(object.uniqueName('delete')) + self.objects = set() + +class CannonRental(Rental): + 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) + cannon.setTargetId(target.doId) + 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, 9, x, y, z) + treasure.generateWithRequired(self.estate.zoneId) + self.objects.add(treasure) + doIds.append(treasure.doId) + + 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() + + def deleteTreasureSoon(self, treasure): + taskName = treasure.uniqueName('delete') + taskMgr.doMethodLater(5, self.__deleteTreasureNow, taskName, extraArgs=(treasure, taskName)) + + def __deleteTreasureNow(self, treasure, taskName): + treasure.requestDelete() + + def validAvatar(self, av): + if av.getMaxHp() == av.getHp(): + return 0 + + av.toonUp(3) + return 1 + class DistributedEstateAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedEstateAI") def __init__(self, air): @@ -217,6 +293,7 @@ class DistributedEstateAI(DistributedObjectAI): if started: self.gardenManager.handleSingleGarden(self.toons[index], garden[1:]) self.__pendingGardens = {} + self.placeStarterGarden(100000001) #temporary def destroy(self): for house in self.houses: @@ -320,17 +397,56 @@ class DistributedEstateAI(DistributedObjectAI): self.sendUpdate('setRentalTimeStamp', [rental]) def b_setRentalTimeStamp(self, rental): - self.setRentalTimeStamp(self, rental) - self.b_setRentalTimeStamp(self, rental) + self.b_setRentalTimeStamp(rental) def getRentalTimeStamp(self): return self.rentalTimestamp - def setRentalType(self, todo0): - pass + def b_setRentalType(self, type): + self.d_setRentalType(type) + self.setRentalType(type) + + def d_setRentalType(self, 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) + + else: + self.notify.warning('Unknown rental %s' % self.rentalType) + return + + self.rentalHandle.generateObjects() def getRentalType(self): - return 0 + 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 diff --git a/toontown/estate/DistributedTargetAI.py b/toontown/estate/DistributedTargetAI.py index 4d9a3a37..1e73dd4b 100644 --- a/toontown/estate/DistributedTargetAI.py +++ b/toontown/estate/DistributedTargetAI.py @@ -1,30 +1,88 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectAI import DistributedObjectAI +import CannonGlobals class DistributedTargetAI(DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory("DistributedTargetAI") - def setPosition(self, todo0, todo1, todo2): + def __init__(self, air): + DistributedObjectAI.__init__(self, air) + self.enabled = 0 + self.highscore = 0 + self.scoreDict = {} + + self.__newGame() + + def announceGenerate(self): + DistributedObjectAI.announceGenerate(self) + taskMgr.doMethodLater(10, self.__startNewGame, self.taskName('newGame')) + + def __newGame(self): + self.power = 1 + self.time = CannonGlobals.CANNON_TIMEOUT + + def getPosition(self): + return (0, 0, 40) + + def getState(self): + return self.enabled, 2**self.power, self.time + + def d_updateState(self): + self.sendUpdate("setState", self.getState()) + + def d_setReward(self, reward): + self.sendUpdate("setReward", [reward]) + + def setResult(self, avId): + if avId and self.enabled: + self.power += 1 + self.time = int(CannonGlobals.CANNON_TIMEOUT / self.power) + taskMgr.remove(self.taskName('gameover')) + taskMgr.doMethodLater(self.time, self.__gameOver, self.taskName('gameover')) + self.d_updateState() + + def __gameOver(self, task): + self.enabled = 0 + self.time = 0 + self.d_updateState() + taskMgr.doMethodLater(10, self.__startNewGame, self.taskName('newGame')) + + for avId in self.scoreDict: + av = self.air.doId2do.get(avId) + if av: + if av.zoneId == self.zoneId: + av.toonUp(2 ** self.power) + + return task.done + + def __startNewGame(self, task): + self.enabled = 1 + self.__newGame() + self.d_updateState() + taskMgr.doMethodLater(self.time, self.__gameOver, self.taskName('gameover')) + return task.done + + def setBonus(self, bonus): pass - def setState(self, todo0, todo1, todo2): - pass + def setCurPinballScore(self, avId, score, bonus): + av = self.air.doId2do.get(avId) + if not av: + return + + S = score * bonus + self.scoreDict[avId] = S + if S > self.highscore: + self.highscore = S + self.d_updateHighscore(av, S) - def setReward(self, todo0): - pass + def d_updateHighscore(self, av, score): + self.sendUpdate("setPinballHiScorer", [av.getName()]) + self.sendUpdate("setPinballHiScore", [score]) - def setResult(self, todo0): - pass + def delete(self): + taskMgr.remove(self.taskName('newGame')) + taskMgr.remove(self.taskName('gameover')) + - def setBonus(self, todo0): - pass - - def setCurPinballScore(self, todo0, todo1, todo2): - pass - - def setPinballHiScorer(self, todo0): - pass - - def setPinballHiScore(self, todo0): - pass diff --git a/toontown/estate/EstateManagerAI.py b/toontown/estate/EstateManagerAI.py index da5a4a01..c6ce87ae 100644 --- a/toontown/estate/EstateManagerAI.py +++ b/toontown/estate/EstateManagerAI.py @@ -74,6 +74,10 @@ class LoadHouseFSM(FSM): self.demand('LoadHouse') def enterLoadHouse(self): + # Load the garden if they have one. + if self.toon['setGardenStarted'][0]: + self.estate.spawnGarden(self.houseIndex) + # Activate the house: self.mgr.air.sendActivate(self.houseId, self.mgr.air.districtId, self.estate.zoneId, self.mgr.air.dclassesByName['DistributedHouseAI'], diff --git a/toontown/shtiker/PhotoAlbumPage.py b/toontown/shtiker/PhotoAlbumPage.py index 074e4539..bdb93d32 100644 --- a/toontown/shtiker/PhotoAlbumPage.py +++ b/toontown/shtiker/PhotoAlbumPage.py @@ -121,7 +121,7 @@ class PhotoAlbumPage(ShtikerPage.ShtikerPage): oldName = self.selectedFileName numUnders = oldName.count(separator) if numUnders == 0: - newName = oldName[0:21] + separator + str + separator + oldName[20:] + newName = oldName[0:18] + separator + str + separator + oldName[17:] elif numUnders == 2: sp = oldName.split(separator) newName = sp[0] + separator + str + separator + sp[2] @@ -232,7 +232,7 @@ class PhotoAlbumPage(ShtikerPage.ShtikerPage): files = os.listdir(self.photoPath) photos = [] for fileName in files: - if fileName[0:20] == 'united-screenshot' and fileName[-4:] == '.jpg': + if fileName[0:17] == 'united-screenshot' and fileName[-4:] == '.jpg': photos.append(fileName) return photos diff --git a/toontown/toonbase/TTLocalizerEnglish.py b/toontown/toonbase/TTLocalizerEnglish.py index 02f67c58..cae95a0b 100644 --- a/toontown/toonbase/TTLocalizerEnglish.py +++ b/toontown/toonbase/TTLocalizerEnglish.py @@ -5446,9 +5446,9 @@ NumToColor = ['White', 'Gray', 'Neon Orange', 'Sapphire', - 'Pure Red', - 'Pure Blue', - 'Pure Green', + 'Hacker Red', + 'Hacker Blue', + 'Hacker Green', 'Crimson', 'Emerald', 'Bronze']