from toontown.toonbase import TTLocalizer from direct.directnotify import DirectNotifyGlobal import random FLOWERS_PER_BONUS = 10 ACCELERATOR_USED_FROM_SHTIKER_BOOK = True COLLECT_NO_UPDATE = 0 COLLECT_NEW_ENTRY = 1 gardenNotify = DirectNotifyGlobal.directNotify.newCategory('GardenGlobals') FlowerItem = 2 FlowerItemNewEntry = 9 INVALID_TYPE = -1 GAG_TREE_TYPE = 0 FLOWER_TYPE = 1 STATUARY_TYPE = 2 WATERING_CAN_SMALL = 0 WATERING_CAN_MEDIUM = 1 WATERING_CAN_LARGE = 2 WATERING_CAN_HUGE = 3 MAX_WATERING_CANS = 4 WateringCanAttributes = {0: {'numBoxes': 2, 'skillPts': 100, 'name': TTLocalizer.WateringCanSmall}, 1: {'numBoxes': 2, 'skillPts': 200, 'name': TTLocalizer.WateringCanMedium}, 2: {'numBoxes': 2, 'skillPts': 400, 'name': TTLocalizer.WateringCanLarge}, 3: {'numBoxes': 2, 'skillPts': 1000, 'name': TTLocalizer.WateringCanHuge}} WateringMult = 2 def getWateringCanPower(wateringCan, wateringCanSkill): numBoxes = 0 for curWateringCan in range(wateringCan + 1): wateringCanAttrib = WateringCanAttributes[curWateringCan] curBoxes = wateringCanAttrib['numBoxes'] skill = wateringCanAttrib['skillPts'] if wateringCanSkill >= skill: if curWateringCan == wateringCan: gardenNotify.warning("this shouldn't happen wateringCanSkill %d >= skill %d" % (wateringCanSkill, skill)) wateringCanSkill = skill - 1 if curWateringCan == wateringCan: skillPtPerBox = skill / curBoxes numBoxes += 1 + int(wateringCanSkill) / int(skillPtPerBox) else: numBoxes += curBoxes return numBoxes * WateringMult def getMaxWateringCanPower(): retval = 0 for wateringCanAttrib in list(WateringCanAttributes.values()): retval += wateringCanAttrib['numBoxes'] return retval * WateringMult FlowerColors = [(0.804, 0.2, 0.2), (0.922, 0.463, 0.0), (0.5, 0.2, 1.0), (0.4, 0.4, 1.0), (0.953, 0.545, 0.757), (0.992, 0.843, 0.392), (1.0, 1.0, 1.0), (0.5, 0.8, 0.5)] FLOWER_RED = 0 FLOWER_ORANGE = 1 FLOWER_VIOLET = 2 FLOWER_BLUE = 3 FLOWER_PINK = 4 FLOWER_YELLOW = 5 FLOWER_WHITE = 6 FLOWER_GREEN = 7 ToonStatuaryTypeIndices = range(205, 209) ChangingStatuaryTypeIndices = range(230, 232) AnimatedStatuaryTypeIndices = range(234, 238) PlantAttributes = {49: {'name': TTLocalizer.FlowerSpeciesNames[49], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/daisy.bam', 'fullGrownModel': 'phase_5.5/models/estate/daisy.bam', 'photoPos': (0.0, -0.35, -0.361882), 'photoScale': 1, 'photoHeading': 0, 'photoPitch': 35, 'varieties': ((10, FLOWER_YELLOW, 1), (11, FLOWER_PINK, 2), (12, FLOWER_WHITE, 3), (13, FLOWER_RED, 4), (14, FLOWER_ORANGE, 5), (15, FLOWER_BLUE, 6), (16, FLOWER_GREEN, 7), (17, FLOWER_VIOLET, 8))}, 50: {'name': TTLocalizer.FlowerSpeciesNames[50], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/tulip.bam', 'fullGrownModel': 'phase_5.5/models/estate/tulip.bam', 'photoPos': (0.0, -0.35, -0.35), 'photoScale': 1, 'photoHeading': 0, 'photoPitch': 35, 'varieties': ((20, FLOWER_VIOLET, 5), (21, FLOWER_RED, 6), (22, FLOWER_YELLOW, 8))}, 51: {'name': TTLocalizer.FlowerSpeciesNames[51], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/carnation.bam', 'fullGrownModel': 'phase_5.5/models/estate/carnation.bam', 'photoPos': (0.0, -0.35, -0.4), 'photoScale': 1, 'photoHeading': 0, 'photoPitch': 35, 'varieties': ((30, FLOWER_PINK, 1), (31, FLOWER_YELLOW, 2), (32, FLOWER_RED, 3), (33, FLOWER_WHITE, 5), (34, FLOWER_GREEN, 7))}, 52: {'name': TTLocalizer.FlowerSpeciesNames[52], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/lily.bam', 'fullGrownModel': 'phase_5.5/models/estate/lily.bam', 'photoPos': (0.0174745, -0.05, -0.670513), 'photoScale': 1, 'photoHeading': 0, 'photoPitch': 35, 'varieties': ((40, FLOWER_WHITE, 1), (41, FLOWER_GREEN, 2), (42, FLOWER_ORANGE, 3), (43, FLOWER_PINK, 4), (44, FLOWER_RED, 5), (45, FLOWER_VIOLET, 6), (46, FLOWER_BLUE, 7), (47, FLOWER_YELLOW, 8))}, 53: {'name': TTLocalizer.FlowerSpeciesNames[53], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/narcissi.bam', 'fullGrownModel': 'phase_5.5/models/estate/narcissi.bam', 'photoPos': (-0.0403175, 0.060933, -0.548368), 'photoScale': 1, 'photoHeading': 20, 'photoPitch': 0, 'varieties': ((50, FLOWER_GREEN, 1), (51, FLOWER_WHITE, 2), (52, FLOWER_YELLOW, 4), (53, FLOWER_PINK, 5))}, 54: {'name': TTLocalizer.FlowerSpeciesNames[54], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/pansy.bam', 'fullGrownModel': 'phase_5.5/models/estate/pansy.bam', 'photoScale': 2.5, 'photoHeading': 0, 'photoPitch': 0, 'varieties': ((60, FLOWER_ORANGE, 1), (61, FLOWER_WHITE, 2), (62, FLOWER_RED, 3), (63, FLOWER_YELLOW, 4), (64, FLOWER_PINK, 6))}, 55: {'name': TTLocalizer.FlowerSpeciesNames[55], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -2, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/petunia.bam', 'fullGrownModel': 'phase_5.5/models/estate/petunia.bam', 'photoPos': (0.02, -0.0324585, -0.167735), 'photoScale': 1.5, 'photoHeading': -20, 'photoPitch': 35, 'varieties': ((70, FLOWER_BLUE, 7), (71, FLOWER_PINK, 8))}, 56: {'name': TTLocalizer.FlowerSpeciesNames[56], 'plantType': FLOWER_TYPE, 'growthThresholds': (1, 1, 1), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -1, 'seedlingModel': 'phase_5.5/models/estate/seedling.bam', 'establishedModel': 'phase_5.5/models/estate/rose.bam', 'fullGrownModel': 'phase_5.5/models/estate/rose.bam', 'photoPos': (0.04396, 0.124797, -0.877291), 'photoScale': 1, 'photoHeading': 0, 'photoPitch': 35, 'varieties': ((0, FLOWER_RED, 3), (1, FLOWER_YELLOW, 4), (2, FLOWER_PINK, 6), (3, FLOWER_WHITE, 7), (4, FLOWER_BLUE, 8))}, 200: {'name': TTLocalizer.StatuaryDonald, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_donald.bam', 'worldScale': 0.05, 'varieties': ((1000, 1, 0),), 'pinballScore': (10, 1)}, 201: {'name': TTLocalizer.StatuaryMickey1, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_mickey_flute', 'worldScale': 0.05, 'varieties': ((1001, 1, 0),), 'pinballScore': (50, 1)}, 202: {'name': TTLocalizer.StatuaryGardenAccelerator, 'plantType': STATUARY_TYPE, 'model': 'phase_4/models/props/goofy_statue', 'varieties': ((1002, 1, 0),)}, 203: {'name': TTLocalizer.StatuaryMinnie, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_minnie', 'worldScale': 0.05, 'varieties': ((1003, 1, 0),), 'pinballScore': (150, 1)}, 204: {'name': TTLocalizer.StatuaryMickey2, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_mickey_shovel', 'worldScale': 0.05, 'varieties': ((1004, 1, 0),), 'pinballScore': (250, 1)}, 205: {'name': TTLocalizer.StatuaryToonWave, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_pedestal', 'worldScale': 0.05, 'varieties': ((1005, 1, 0),), 'pinballScore': (500, 1)}, 206: {'name': TTLocalizer.StatuaryToonVictory, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_pedestal', 'worldScale': 0.05, 'varieties': ((1006, 1, 0),), 'pinballScore': (500, 1)}, 207: {'name': TTLocalizer.StatuaryToonCrossedArms, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_pedestal', 'worldScale': 0.05, 'varieties': ((1007, 1, 0),), 'pinballScore': (500, 1)}, 208: {'name': TTLocalizer.StatuaryToonThinking, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_pedestal', 'worldScale': 0.05, 'varieties': ((1008, 1, 0),), 'pinballScore': (500, 1)}, 230: {'name': TTLocalizer.StatuaryMeltingSnowman, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/tt_m_prp_ext_snowman', 'worldScale': 1.0, 'varieties': ((1030, 1, 0),), 'pinballScore': (500, 1), 'growthThresholds': (1, 2)}, 231: {'name': TTLocalizer.StatuaryMeltingSnowDoodle, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/tt_m_prp_ext_snowDoodle', 'worldScale': 1.0, 'varieties': ((1031, 1, 0),), 'pinballScore': (500, 1), 'growthThresholds': (1, 2)}, 234: {'name': TTLocalizer.AnimatedStatuaryFlappyCog, 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_', 'anims': ['default', 'wave'], 'worldScale': 0.5, 'varieties': ((1035, 1, 0),), 'pinballScore': (500, 1)}, 254: {'name': 'reserved tag', 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_minnie', 'worldScale': 0.05, 'varieties': ((2001, 1, 0),), 'pinballScore': (15, 1)}, 255: {'name': 'reserved tag', 'plantType': STATUARY_TYPE, 'model': 'phase_5.5/models/estate/garden_minnie', 'worldScale': 0.05, 'varieties': ((2002, 1, 0),), 'pinballScore': (15, 1)}} if ACCELERATOR_USED_FROM_SHTIKER_BOOK: del PlantAttributes[202] def getTreeTrackAndLevel(typeIndex): track = typeIndex / 7 level = typeIndex % 7 return (track, level) def getTreeTypeIndex(track, level): return track * 7 + level NUM_GAGS = 7 * 7 for i in range(NUM_GAGS): track, level = getTreeTrackAndLevel(i) if level <= 6: name = TTLocalizer.BattleGlobalAvPropStrings[track][level] + TTLocalizer.GardenGagTree else: name = TTLocalizer.GardenUberGag attr = {'name': name, 'plantType': GAG_TREE_TYPE, 'growthThresholds': (level + 1, (level + 1) * 2, (level + 1) * 3), 'maxWaterLevel': getMaxWateringCanPower(), 'minWaterLevel': -1, 'maxFruit': 9, 'filename': 'phase_5.5/models/estate/gag_tree_stages.bam', 'seedlingModel': 'gag_tree_small', 'establishedModel': 'gag_tree_med', 'fullGrownModel': 'gag_tree_large', 'varieties': ((),)} PlantAttributes[i] = attr BeanColors = [(255, 0, 0), (0, 255, 0), (255, 165, 0), (148, 0, 211), (0, 0, 255), (255, 192, 203), (255, 255, 0), (0, 255, 255), (192, 192, 192)] BeanColorLetters = ['R', 'G', 'O', 'V', 'B', 'P', 'Y', 'C', 'S'] Recipes = {0: {'beans': 'RRR', 'special': -1}, 1: {'beans': 'RYOY', 'special': -1}, 2: {'beans': 'RPOROP', 'special': -1}, 3: {'beans': 'RCOPVCC', 'special': -1}, 4: {'beans': 'RBVVBBPB', 'special': -1}, 10: {'beans': 'Y', 'special': -1}, 11: {'beans': 'YR', 'special': -1}, 12: {'beans': 'YRG', 'special': -1}, 13: {'beans': 'YRCO', 'special': -1}, 14: {'beans': 'YROOO', 'special': -1}, 15: {'beans': 'YBCVBB', 'special': -1}, 16: {'beans': 'YGROGGG', 'special': -1}, 17: {'beans': 'YBVCVROV', 'special': -1}, 20: {'beans': 'VRBVV', 'special': -1}, 21: {'beans': 'VRRRVV', 'special': -1}, 22: {'beans': 'VYYVYOVY', 'special': -1}, 30: {'beans': 'P', 'special': -1}, 31: {'beans': 'PY', 'special': -1}, 32: {'beans': 'PRR', 'special': -1}, 33: {'beans': 'PRGBR', 'special': -1}, 34: {'beans': 'PGGGGYG', 'special': -1}, 40: {'beans': 'C', 'special': -1}, 41: {'beans': 'CG', 'special': -1}, 42: {'beans': 'COO', 'special': -1}, 43: {'beans': 'COOP', 'special': -1}, 44: {'beans': 'CRRRR', 'special': -1}, 45: {'beans': 'CRVVVV', 'special': -1}, 46: {'beans': 'CVCBCBB', 'special': -1}, 47: {'beans': 'CBYYCBYY', 'special': -1}, 50: {'beans': 'G', 'special': -1}, 51: {'beans': 'GC', 'special': -1}, 52: {'beans': 'GPYY', 'special': -1}, 53: {'beans': 'GPBPP', 'special': -1}, 60: {'beans': 'O', 'special': -1}, 61: {'beans': 'OC', 'special': -1}, 62: {'beans': 'ORR', 'special': -1}, 63: {'beans': 'OYYR', 'special': -1}, 64: {'beans': 'OPPOBP', 'special': -1}, 70: {'beans': 'BVBVCBB', 'special': -1}, 71: {'beans': 'BPPBROYY', 'special': -1}, 1000: {'beans': 'GG', 'special': 100}, 1001: {'beans': 'SSSS', 'special': 101}, 1002: {'beans': 'S', 'special': 102}, 1003: {'beans': 'VVVVVV', 'special': 103}, 1004: {'beans': 'OOOOOOOO', 'special': 104}, 1005: {'beans': 'RRRRRRRR', 'special': 105}, 1006: {'beans': 'GGGGGGGG', 'special': 106}, 1007: {'beans': 'BBBBBBBB', 'special': 107}, 1008: {'beans': 'SSSSSSSS', 'special': 108}, 1030: {'beans': 'S', 'special': 130}, 1031: {'beans': 'S', 'special': 131}, 1035: {'beans': 'S', 'special': 135}, 2001: {'beans': 'ZVOVOVO', 'special': -1}, 2002: {'beans': 'ZOVOVOV', 'special': -1}} def getRecipeKey(beans, special): testDict = {'beans': beans, 'special': special} for key in list(Recipes.keys()): recipe = Recipes[key] if testDict == recipe: return key return -1 def getRecipeKeyUsingSpecial(special): for key in list(Recipes.keys()): recipe = Recipes[key] if recipe['special'] == special: return key return -1 SHOVEL_TIN = 0 SHOVEL_STEEL = 1 SHOVEL_SILVER = 2 SHOVEL_GOLD = 3 MAX_SHOVELS = 4 ShovelAttributes = {0: {'numBoxes': 2, 'skillPts': 80, 'name': TTLocalizer.ShovelTin}, 1: {'numBoxes': 2, 'skillPts': 160, 'name': TTLocalizer.ShovelSteel}, 2: {'numBoxes': 2, 'skillPts': 320, 'name': TTLocalizer.ShovelSilver}, 3: {'numBoxes': 2, 'skillPts': 640, 'name': TTLocalizer.ShovelGold}} def getShovelPower(shovel, shovelSkill): numBoxes = 0 for curShovel in range(shovel + 1): shovelAttrib = ShovelAttributes[curShovel] curBoxes = shovelAttrib['numBoxes'] skill = shovelAttrib['skillPts'] if curShovel == shovel: if shovelSkill >= skill: gardenNotify.warning("this shouldn't happen shovelSkill %d >= skill %d" % (shovelSkill, skill)) shovelSkill = skill - 1 skillPtPerBox = skill / curBoxes numBoxes += 1 + int(shovelSkill) / int(skillPtPerBox) else: numBoxes += curBoxes return numBoxes def getMaxShovelSkill(): retVal = 0 retVal += ShovelAttributes[MAX_SHOVELS - 1]['skillPts'] - 1 return retVal def getNumberOfShovelBoxes(): retVal = 0 for attrib in list(ShovelAttributes.values()): retVal += attrib['numBoxes'] return retVal def getNumberOfWateringCanBoxes(): retVal = 0 for attrib in list(WateringCanAttributes.values()): retVal += attrib['numBoxes'] return retVal def getNumberOfFlowerVarieties(): retVal = 0 for attrib in list(PlantAttributes.values()): if attrib['plantType'] == FLOWER_TYPE: retVal += len(attrib['varieties']) return retVal def getNumberOfFlowerSpecies(): retVal = 0 for attrib in list(PlantAttributes.values()): if attrib['plantType'] == FLOWER_TYPE: retVal += 1 return retVal def getFlowerVarieties(species): retval = () if species in list(PlantAttributes.keys()): attrib = PlantAttributes[species] if attrib['plantType'] == FLOWER_TYPE: retval = attrib['varieties'] return retval def getFlowerSpecies(): retVal = [] for key in list(PlantAttributes.keys()): attrib = PlantAttributes[key] if attrib['plantType'] == FLOWER_TYPE: retVal.append(key) return retVal def getRandomFlower(): species = random.choice(getFlowerSpecies()) variety = random.randint(0, len(PlantAttributes[species]['varieties']) - 1) return (species, variety) def getFlowerVarietyName(species, variety): retVal = TTLocalizer.FlowerUnknown if species in list(PlantAttributes.keys()): attrib = PlantAttributes[species] if variety < len(attrib['varieties']): funnySpeciesNameList = TTLocalizer.FlowerFunnyNames.get(species) if funnySpeciesNameList: if variety < len(funnySpeciesNameList): retVal = TTLocalizer.FlowerFunnyNames[species][variety] else: gardenNotify.warning('warning unknown species=%d variety= %d' % (species, variety)) else: gardenNotify.warning('warning unknown species %d' % species) return retVal def getSpeciesVarietyGivenRecipe(recipeKey): for species in list(PlantAttributes.keys()): attrib = PlantAttributes[species] if attrib['plantType'] == GAG_TREE_TYPE: continue if 'varieties' in attrib: for variety in range(len(attrib['varieties'])): if attrib['varieties'][variety][0] == recipeKey: return (species, variety) return (-1, -1) def getNumBeansRequired(species, variety): retval = -1 if not PlantAttributes.get(species): return retval 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 'beans' in recipe: retval = len(recipe['beans']) return retval def validateRecipes(notify): uniqueRecipes = [] uniqueBeans = [] numBoxes = getNumberOfShovelBoxes() uniqueSpecials = [] for key in list(Recipes.keys()): recipe = Recipes[key] beans = recipe['beans'] if len(beans) > numBoxes: notify.warning('numBoxes=%d beans=%s, truncating to %s' % (numBoxes, beans, beans[:numBoxes])) beans = beans[:numBoxes] for letter in beans: if key not in (2001, 2002): pass testTuple = (beans, recipe['special']) uniqueRecipes.append(testTuple) if beans: if beans in uniqueBeans: notify.warning('duplicate beans=%s in key=%d' % (beans, key)) else: uniqueBeans.append(beans) special = recipe['special'] if special != -1: uniqueSpecials.append(special) notify.debug('recipes are ok') def validatePlantAttributes(notify): uniqueRecipes = [] flowerRecipeDistribution = [] for i in range(getNumberOfShovelBoxes() + 1): flowerRecipeDistribution.append([]) for key in list(PlantAttributes.keys()): plant = PlantAttributes[key] notify.debug('now validating %s' % plant['name']) if plant['plantType'] in (GAG_TREE_TYPE, FLOWER_TYPE): growthThresholds = plant['growthThresholds'] lastValue = 0 for testValue in growthThresholds: lastValue = testValue if plant['plantType'] in (STATUARY_TYPE, FLOWER_TYPE): varieties = plant['varieties'] for variety in varieties: recipeNum = variety[0] uniqueRecipes.append(recipeNum) if plant['plantType'] == FLOWER_TYPE: recipeLength = len(Recipes[recipeNum]['beans']) newInfo = (getFlowerVarietyName(key, list(varieties).index(variety)), Recipes[recipeNum]['beans'], TTLocalizer.FlowerColorStrings[variety[1]]) flowerRecipeDistribution[recipeLength].append(newInfo) 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])) notify.debug('plant attributes are ok') plots0 = ((0, 0, 0.0, FLOWER_TYPE), (1, 0, 0.0, FLOWER_TYPE), (2, 0, 0.0, FLOWER_TYPE), (2, 1, 0.0, FLOWER_TYPE), (2, 2, 0.0, FLOWER_TYPE), (3, 0, 0.0, FLOWER_TYPE), (3, 1, 0.0, FLOWER_TYPE), (3, 2, 0.0, FLOWER_TYPE), (4, 0, 0.0, FLOWER_TYPE), (4, 1, 0.0, FLOWER_TYPE), (-54, -13.5, 276.0, GAG_TREE_TYPE), (-7, -48, 343.0, GAG_TREE_TYPE), (-40, -75, 27.0, GAG_TREE_TYPE), (-78, -44, 309.0, GAG_TREE_TYPE), (-72, -15, 260.0, GAG_TREE_TYPE), (-24, -19, 294.0, GAG_TREE_TYPE), (11, -26, 0.0, GAG_TREE_TYPE), (-92, -4, 0.0, GAG_TREE_TYPE), (-100, -43, -90.0, STATUARY_TYPE)) plots1 = ((0, 0, 0.0, FLOWER_TYPE), (1, 0, 0.0, FLOWER_TYPE), (2, 0, 0.0, FLOWER_TYPE), (2, 1, 0.0, FLOWER_TYPE), (2, 2, 0.0, FLOWER_TYPE), (3, 0, 0.0, FLOWER_TYPE), (3, 1, 0.0, FLOWER_TYPE), (3, 2, 0.0, FLOWER_TYPE), (4, 0, 0.0, FLOWER_TYPE), (4, 1, 0.0, FLOWER_TYPE), (62, -81, 194.0, GAG_TREE_TYPE), (101, -52, 250.0, GAG_TREE_TYPE), (93, -104, 214.0, GAG_TREE_TYPE), (69, -122, 188.0, GAG_TREE_TYPE), (92, -120, 184.0, GAG_TREE_TYPE), (113, -29, 250.0, GAG_TREE_TYPE), (125, -57, 0.0, GAG_TREE_TYPE), (114, -40, 0.0, GAG_TREE_TYPE), (47, -82, -30.0, STATUARY_TYPE)) plots2 = ((0, 0, 0.0, FLOWER_TYPE), (1, 0, 0.0, FLOWER_TYPE), (2, 0, 0.0, FLOWER_TYPE), (2, 1, 0.0, FLOWER_TYPE), (2, 2, 0.0, FLOWER_TYPE), (3, 0, 0.0, FLOWER_TYPE), (3, 1, 0.0, FLOWER_TYPE), (3, 2, 0.0, FLOWER_TYPE), (4, 0, 0.0, FLOWER_TYPE), (4, 1, 0.0, FLOWER_TYPE), (-40, -114, 176.0, GAG_TREE_TYPE), (-44, -148, 162.0, GAG_TREE_TYPE), (-97, -99, 138.0, GAG_TREE_TYPE), (-82, -94, 134.0, GAG_TREE_TYPE), (-27, -106, 195.0, GAG_TREE_TYPE), (-76, -147, 110.0, GAG_TREE_TYPE), (-29, -164, 0.0, GAG_TREE_TYPE), (-107, -94, 0.0, GAG_TREE_TYPE), (-97, -114, -60.0, STATUARY_TYPE)) plots3 = ((0, 0, 0.0, FLOWER_TYPE), (1, 0, 0.0, FLOWER_TYPE), (2, 0, 0.0, FLOWER_TYPE), (2, 1, 0.0, FLOWER_TYPE), (2, 2, 0.0, FLOWER_TYPE), (3, 0, 0.0, FLOWER_TYPE), (3, 1, 0.0, FLOWER_TYPE), (3, 2, 0.0, FLOWER_TYPE), (4, 0, 0.0, FLOWER_TYPE), (4, 1, 0.0, FLOWER_TYPE), (59, 35, 187.0, GAG_TREE_TYPE), (87, 28, 114.0, GAG_TREE_TYPE), (67, -16, 78.0, GAG_TREE_TYPE), (24, 19, 155.0, GAG_TREE_TYPE), (18, 31, 172.0, GAG_TREE_TYPE), (74, 36, 133.0, GAG_TREE_TYPE), (35, -34, 0.0, GAG_TREE_TYPE), (116, 17, 0.0, GAG_TREE_TYPE), (117, 27, 102.0, STATUARY_TYPE)) plots4 = ((0, 0, 0.0, FLOWER_TYPE), (1, 0, 0.0, FLOWER_TYPE), (2, 0, 0.0, FLOWER_TYPE), (2, 1, 0.0, FLOWER_TYPE), (2, 2, 0.0, FLOWER_TYPE), (3, 0, 0.0, FLOWER_TYPE), (3, 1, 0.0, FLOWER_TYPE), (3, 2, 0.0, FLOWER_TYPE), (4, 0, 0.0, FLOWER_TYPE), (4, 1, 0.0, FLOWER_TYPE), (37, 101, 350.0, GAG_TREE_TYPE), (15, 100, 342.0, GAG_TREE_TYPE), (73, 92, 0.0, GAG_TREE_TYPE), (74, 69, 347.0, GAG_TREE_TYPE), (102, 62, 334.0, GAG_TREE_TYPE), (86, 76, 350.0, GAG_TREE_TYPE), (100, 78, 327.0, GAG_TREE_TYPE), (15, 73, 50.0, GAG_TREE_TYPE), (16, 87, -140.0, STATUARY_TYPE)) plots5 = ((0, 0, 0.0, FLOWER_TYPE), (1, 0, 0.0, FLOWER_TYPE), (2, 0, 0.0, FLOWER_TYPE), (2, 1, 0.0, FLOWER_TYPE), (2, 2, 0.0, FLOWER_TYPE), (3, 0, 0.0, FLOWER_TYPE), (3, 1, 0.0, FLOWER_TYPE), (3, 2, 0.0, FLOWER_TYPE), (4, 0, 0.0, FLOWER_TYPE), (4, 1, 0.0, FLOWER_TYPE), (-26, 92, 41.0, GAG_TREE_TYPE), (-71, 58, 37.0, GAG_TREE_TYPE), (-67, 21, 243.0, GAG_TREE_TYPE), (-10, -2.6, 178.0, GAG_TREE_TYPE), (-60, 13.7, 250.0, GAG_TREE_TYPE), (-13, 84, 2.0, GAG_TREE_TYPE), (-62, 65, 0.0, GAG_TREE_TYPE), (-16.6, 52.7, 0.0, GAG_TREE_TYPE), (-55, 70, 213.0, STATUARY_TYPE)) estatePlots = (plots0, plots1, plots2, plots3, plots4, plots5) BOX_ONE = 1 BOX_TWO = 2 BOX_THREE = 3 flowerBoxes0 = ((-62.5, -52.5, 182.0, BOX_ONE), (-52, -52, 182, BOX_ONE), (-64.5, -42, 92.0, BOX_THREE), (-49, -43, 266.0, BOX_THREE), (-57, -33, 0.0, BOX_TWO)) flowerBoxes1 = ((85.0, -67.0, 26.0, BOX_ONE), (75, -72, 26.0, BOX_ONE), (91.0, -74.0, -63.0, BOX_THREE), (77, -81, 117.0, BOX_THREE), (88, -86, 206.0, BOX_TWO)) flowerBoxes2 = ((-62, -112, 350.0, BOX_ONE), (-72, -110, 350.0, BOX_ONE), (-62, -122, 257.0, BOX_THREE), (-76, -118, 79.0, BOX_THREE), (-71, -129, 169.0, BOX_TWO)) flowerBoxes3 = ((72, 5, 265.0, BOX_ONE), (72.5, 16, 265.0, BOX_ONE), (63, 3, 178.0, BOX_THREE), (64, 19, 355.0, BOX_THREE), (54, 12, 86.0, BOX_TWO)) flowerBoxes4 = ((35.5, 70, 152.0, BOX_ONE), (46, 66, 152.0, BOX_ONE), (36.5, 79.5, 71.0, BOX_THREE), (51.5, 74, 247.0, BOX_THREE), (47, 86, -19.0, BOX_TWO)) flowerBoxes5 = ((-26.5, 37.5, 318.0, BOX_ONE), (-33, 46, 318.0, BOX_ONE), (-32, 30, 217.0, BOX_THREE), (-42, 42, 37.0, BOX_THREE), (-45, 31, 124.0, BOX_TWO)) estateBoxes = (flowerBoxes0, flowerBoxes1, flowerBoxes2, flowerBoxes3, flowerBoxes4, flowerBoxes5) def whatCanBePlanted(plotIndex, hardPointIndex): retval = INVALID_TYPE if plotIndex < len(estatePlots) and plotIndex >= 0: if hardPointIndex < len(estatePlots[plotIndex]) and hardPointIndex >= 0: if len(estatePlots[plotIndex][hardPointIndex]) >= 4: retval = estatePlots[plotIndex][hardPointIndex][3] return retval MAGIC_BEAN_SUBTYPE = 0 GARDEN_ITEM_SUBTYPE = 1 Specials = {0: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 1, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeans, 'description': TTLocalizer.GardenSpecialDiscription, 'beanCost': 125}, 1: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 2, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeansB, 'description': TTLocalizer.GardenSpecialDiscriptionB, 'beanCost': 125}, 2: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 1, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeans, 'description': TTLocalizer.GardenSpecialDiscription, 'beanCost': 125}, 3: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 2, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeansB, 'description': TTLocalizer.GardenSpecialDiscriptionB, 'beanCost': 125}, 4: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 1, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeans, 'description': TTLocalizer.GardenSpecialDiscription, 'beanCost': 125}, 5: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 2, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeansB, 'description': TTLocalizer.GardenSpecialDiscriptionB, 'beanCost': 125}, 6: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 2, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeansB, 'description': TTLocalizer.GardenSpecialDiscription, 'beanCost': 125}, 7: {'subtype': MAGIC_BEAN_SUBTYPE, 'gagbonus': 2, 'photoModel': 'phase_4/models/props/goofy_statue', 'photoScale': 0.1, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.GardenTextMagicBeansB, 'description': TTLocalizer.GardenSpecialDiscriptionB, 'beanCost': 125}, 100: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_donald', 'photoScale': 0.04, 'photoPos': (0, 0, -1), 'photoName': TTLocalizer.StatuaryDonald, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 125}, 101: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_mickey_flute', 'photoScale': 0.025, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryMickey1, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 250}, 102: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/sack', 'photoScale': 1.0, 'photoPos': (0, 0, -1.0), 'photoName': TTLocalizer.StatuaryGardenAccelerator, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 7500, 'useFromShtiker': False}, 103: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_minnie', 'photoScale': 0.02, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryMinnie, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 500}, 104: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_mickey_shovel', 'photoScale': 0.02, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryMickey2, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 1000}, 105: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_pedestal', 'photoScale': 0.02, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryToonWave, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 5000, 'minSkill': 639}, 106: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_pedestal', 'photoScale': 0.02, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryToonVictory, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 5000, 'minSkill': 639}, 107: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_pedestal', 'photoScale': 0.02, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryToonCrossedArms, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 5000, 'minSkill': 639}, 108: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/garden_pedestal', 'photoScale': 0.02, 'photoPos': (0, 0, -1.05), 'photoName': TTLocalizer.StatuaryToonThinking, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 5000, 'minSkill': 639}, 130: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/tt_m_prp_ext_snowman_icon', 'photoScale': 90.0, 'photoPos': (0, 0, 0.0), 'photoName': TTLocalizer.StatuaryMeltingSnowman, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 25, 'minSkill': 0}, 131: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/tt_m_prp_ext_snowDoodle_icon', 'photoScale': 90.0, 'photoPos': (0, 0, 0.0), 'photoName': TTLocalizer.StatuaryMeltingSnowDoodle, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 50, 'minSkill': 0}, 135: {'subtype': GARDEN_ITEM_SUBTYPE, 'photoModel': 'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_', 'photoAnimation': ['default', 'wave'], 'photoScale': 1.25, 'photoPos': (0, 0, -0.04), 'photoName': TTLocalizer.AnimatedStatuaryFlappyCog, 'description': TTLocalizer.GardenSpecialDiscription, 'isCatalog': True, 'beanCost': 50, 'minSkill': 1}} GardenAcceleratorSpecial = 102 GardenAcceleratorSpecies = 202 if ACCELERATOR_USED_FROM_SHTIKER_BOOK: Specials[GardenAcceleratorSpecial]['useFromShtiker'] = True def getPlantItWithString(special): retval = '' recipeKey = getRecipeKeyUsingSpecial(special) if not recipeKey == -1: beanTuple = [] beanStr = Recipes[recipeKey]['beans'] for letter in beanStr: index = BeanColorLetters.index(letter) beanTuple.append(index) beanText = TTLocalizer.getRecipeBeanText(beanTuple) retval += TTLocalizer.PlantItWith % beanText return retval for specialKey in list(Specials.keys()): recipeKey = getRecipeKeyUsingSpecial(specialKey) if not recipeKey == -1: Specials[specialKey]['description'] = getPlantItWithString(specialKey) if specialKey == GardenAcceleratorSpecial: if ACCELERATOR_USED_FROM_SHTIKER_BOOK: Specials[specialKey]['description'] = TTLocalizer.UseFromSpecialsTab Specials[specialKey]['description'] += TTLocalizer.MakeSureWatered TIME_OF_DAY_FOR_EPOCH = 3 MOVIE_HARVEST = 0 MOVIE_PLANT = 1 MOVIE_REMOVE = 2 MOVIE_WATER = 3 MOVIE_FINISHPLANTING = 4 MOVIE_FINISHREMOVING = 5 MOVIE_CLEAR = 6 MOVIE_PLANT_REJECTED = 7 TrophyDict = {0: (TTLocalizer.GardenTrophyNameDict[0],), 1: (TTLocalizer.GardenTrophyNameDict[1],), 2: (TTLocalizer.GardenTrophyNameDict[2],), 3: (TTLocalizer.GardenTrophyNameDict[3],)}