text: from pandac.PandaModules import BitMask32
  from pandac.PandaModules import Point3, VBase4
  from direct.showbase import PythonUtil
  from toontown.toonbase import TTLocalizer
  KICK_TO_PLAYGROUND_EVENT = 'parties_kickToPlayground'
  MaxSetInvites = 1000
  MaxSetPartiesInvitedTo = 100
  MaxSetHostedParties = 50
  MaxPlannedYear = 2030
  MinPlannedYear = 1975
  JellybeanMultiplier = 1.5
  JellyBeanDayMultiplier = 2
  PARTY_DURATION = 1800.0
  EventsPageGuestNameMaxWidth = 0.42
  EventsPageGuestNameMaxLetters = 18
  EventsPageHostNameMaxWidth = 0.37
  PartyRefundPercentage = 0.95
  PartyPlannerAsapMinuteRounding = 5
  UberdogCheckPartyStartFrequency = 5.0
  UberdogPurgePartyPeriod = 24.0
  UberdogPartiesSanityCheckFrequency = 60
  JarLabelTextColor = (0.95,
   0.95,
   0.0,
   1.0)
  JarLabelMaxedTextColor = (1.0,
   0.0,
   0.0,
   1.0)
  TuftsOfGrass = 75
  MaxToonsAtAParty = 20
  DefaultPartyDuration = 0.5
  DelayBeforeAutoKick = 30.0
  MaxHostedPartiesPerToon = 1
  PartyEditorGridBounds = ((-0.11, 0.289), (0.55, -0.447))
  PartyEditorGridCenter = (PartyEditorGridBounds[0][0] + (PartyEditorGridBounds[1][0] - PartyEditorGridBounds[0][0]) / 2.0, PartyEditorGridBounds[1][1] + (PartyEditorGridBounds[0][1] - PartyEditorGridBounds[1][1]) / 2.0)
  PartyEditorGridSize = (18, 15)
  PartyEditorGridSquareSize = ((PartyEditorGridBounds[1][0] - PartyEditorGridBounds[0][0]) / float(PartyEditorGridSize[0]), (PartyEditorGridBounds[0][1] - PartyEditorGridBounds[1][1]) / float(PartyEditorGridSize[1]))
  PartyEditorGridRotateThreshold = 0.08
  AvailableGridSquares = 202
  TrashCanPosition = (-0.24, 0.0, -0.65)
  TrashCanScale = 0.7
  PartyEditorTrashBounds = ((-0.16, -0.38), (-0.05, -0.56))
  ActivityRequestStatus = PythonUtil.Enum(('Joining', 'Exiting'))
  InviteStatus = PythonUtil.Enum(('NotRead',
   'ReadButNotReplied',
   'Accepted',
   'Rejected'))
  InviteTheme = PythonUtil.Enum(('Birthday',
   'GenericMale',
   'GenericFemale',
   'Racing',
   'Valentoons',
   'VictoryParty',
   'Winter'))
  PartyStatus = PythonUtil.Enum(('Pending',
   'Cancelled',
   'Finished',
   'CanStart',
   'Started',
   'NeverStarted'))
  AddPartyErrorCode = PythonUtil.Enum(('AllOk',
   'ValidationError',
   'DatabaseError',
   'TooManyHostedParties'))
  ChangePartyFieldErrorCode = PythonUtil.Enum(('AllOk',
   'ValidationError',
   'DatabaseError',
   'AlreadyStarted',
   'AlreadyRefunded'))
  ActivityTypes = PythonUtil.Enum(('HostInitiated', 'GuestInitiated', 'Continuous'))
  PartyGateDenialReasons = PythonUtil.Enum(('Unavailable', 'Full'))
  ActivityIds = PythonUtil.Enum(('PartyJukebox',
   'PartyCannon',
   'PartyTrampoline',
   'PartyCatch',
   'PartyDance',
   'PartyTugOfWar',
   'PartyFireworks',
   'PartyClock',
   'PartyJukebox40',
   'PartyDance20',
   'PartyCog',
   'PartyVictoryTrampoline',
   'PartyWinterCatch',
   'PartyWinterTrampoline',
   'PartyWinterCog',
   'PartyValentineDance',
   'PartyValentineDance20',
   'PartyValentineJukebox',
   'PartyValentineJukebox40',
   'PartyValentineTrampoline'))
  PartyEditorActivityOrder = [ActivityIds.PartyCog,
   ActivityIds.PartyWinterCog,
   ActivityIds.PartyJukebox,
   ActivityIds.PartyJukebox40,
   ActivityIds.PartyValentineJukebox,
   ActivityIds.PartyValentineJukebox40,
   ActivityIds.PartyCannon,
   ActivityIds.PartyTrampoline,
   ActivityIds.PartyValentineTrampoline,
   ActivityIds.PartyVictoryTrampoline,
   ActivityIds.PartyWinterTrampoline,
   ActivityIds.PartyCatch,
   ActivityIds.PartyWinterCatch,
   ActivityIds.PartyDance,
   ActivityIds.PartyDance20,
   ActivityIds.PartyValentineDance,
   ActivityIds.PartyValentineDance20,
   ActivityIds.PartyTugOfWar,
   ActivityIds.PartyFireworks,
   ActivityIds.PartyClock]
  UnreleasedActivityIds = ()
  MutuallyExclusiveActivities = ((ActivityIds.PartyJukebox, ActivityIds.PartyJukebox40),
   (ActivityIds.PartyValentineJukebox, ActivityIds.PartyValentineJukebox40),
   (ActivityIds.PartyDance, ActivityIds.PartyDance20),
   (ActivityIds.PartyValentineDance, ActivityIds.PartyValentineDance20))
  VictoryPartyActivityIds = frozenset([ActivityIds.PartyVictoryTrampoline])
  VictoryPartyReplacementActivityIds = frozenset([ActivityIds.PartyTrampoline])
  WinterPartyActivityIds = frozenset([ActivityIds.PartyWinterCatch, ActivityIds.PartyWinterTrampoline, ActivityIds.PartyWinterCog])
  WinterPartyReplacementActivityIds = frozenset([ActivityIds.PartyCatch, ActivityIds.PartyTrampoline, ActivityIds.PartyCog])
  ValentinePartyActivityIds = frozenset([ActivityIds.PartyValentineDance,
   ActivityIds.PartyValentineDance20,
   ActivityIds.PartyValentineJukebox,
   ActivityIds.PartyValentineJukebox40,
   ActivityIds.PartyValentineTrampoline])
  ValentinePartyReplacementActivityIds = frozenset([ActivityIds.PartyDance,
   ActivityIds.PartyDance20,
   ActivityIds.PartyJukebox,
   ActivityIds.PartyJukebox40,
   ActivityIds.PartyTrampoline])
  DecorationIds = PythonUtil.Enum(('BalloonAnvil',
   'BalloonStage',
   'Bow',
   'Cake',
   'Castle',
   'GiftPile',
   'Horn',
   'MardiGras',
   'NoiseMakers',
   'Pinwheel',
   'GagGlobe',
   'BannerJellyBean',
   'CakeTower',
   'HeartTarget',
   'HeartBanner',
   'FlyingHeart',
   'Hydra',
   'BannerVictory',
   'CannonVictory',
   'CogStatueVictory',
   'TubeCogVictory',
   'CogIceCreamVictory',
   'cogIceCreamWinter',
   'StageWinter',
   'CogStatueWinter',
   'snowman',
   'snowDoodle',
   'BalloonAnvilValentine'))
  DECORATION_VOLUME = 1.0
  DECORATION_CUTOFF = 45
  VictoryPartyDecorationIds = frozenset([DecorationIds.Hydra,
   DecorationIds.BannerVictory,
   DecorationIds.CannonVictory,
   DecorationIds.CogStatueVictory,
   DecorationIds.TubeCogVictory,
   DecorationIds.CogIceCreamVictory])
  WinterPartyDecorationIds = frozenset([DecorationIds.cogIceCreamWinter,
   DecorationIds.StageWinter,
   DecorationIds.CogStatueWinter,
   DecorationIds.snowman,
   DecorationIds.snowDoodle])
  VictoryPartyReplacementDecorationIds = frozenset([DecorationIds.BannerJellyBean])
  ValentinePartyDecorationIds = frozenset([DecorationIds.BalloonAnvilValentine,
   DecorationIds.HeartBanner,
   DecorationIds.HeartTarget,
   DecorationIds.FlyingHeart])
  ValentinePartyReplacementDecorationIds = frozenset([DecorationIds.BalloonAnvil, DecorationIds.BannerJellyBean])
  UnreleasedDecorationIds = ()
  GoToPartyStatus = PythonUtil.Enum(('AllowedToGo',
   'PartyFull',
   'PrivateParty',
   'PartyOver',
   'PartyNotActive'))
  PlayGroundToPartyClockColors = {'the_burrrgh': (53.0 / 255.0,
                   116.0 / 255.0,
                   148.0 / 255.0,
                   1.0),
   'daisys_garden': (52.0 / 255.0,
                     153.0 / 255.0,
                     95.0 / 255.0,
                     1.0),
   'donalds_dock': (60.0 / 255.0,
                    98.0 / 255.0,
                    142.0 / 255.0,
                    1.0),
   'donalds_dreamland': (79.0 / 255.0,
                         92.0 / 255.0,
                         120.0 / 255.0,
                         1.0),
   'minnies_melody_land': (128.0 / 255.0,
                           62.0 / 255.0,
                           142.0 / 255.0,
                           1.0),
   'toontown_central': (77.0 / 255.0,
                        137.0 / 255.0,
                        52.0 / 255.0,
                        1.0)}
  PartyGridUnitLength = [14.4, 14.6]
  PartyGridHeadingConverter = 15.0
  PartyGridToPandaOffset = (-PartyGridUnitLength[0] * PartyEditorGridSize[0] / 2.0, -PartyGridUnitLength[1] * PartyEditorGridSize[1] / 2.0)
  PartyCostMultiplier = 1
  MinimumPartyCost = 100 * PartyCostMultiplier
  ActivityInformationDict = {ActivityIds.PartyJukebox: {'cost': int(50 * PartyCostMultiplier),
                              'gridsize': (1, 1),
                              'numberPerPurchase': 1,
                              'limitPerParty': 1,
                              'paidOnly': False,
                              'gridAsset': 'PartyJukebox_activity_1x1'},
   ActivityIds.PartyJukebox40: {'cost': int(100 * PartyCostMultiplier),
                                'gridsize': (1, 1),
                                'numberPerPurchase': 1,
                                'limitPerParty': 1,
                                'paidOnly': False,
                                'gridAsset': 'PartyJukebox_activity_1x1'},
   ActivityIds.PartyValentineJukebox: {'cost': int(50 * PartyCostMultiplier),
                                       'gridsize': (1, 1),
                                       'numberPerPurchase': 1,
                                       'limitPerParty': 1,
                                       'paidOnly': False,
                                       'gridAsset': 'PartyJukebox_activity_1x1'},
   ActivityIds.PartyValentineJukebox40: {'cost': int(100 * PartyCostMultiplier),
                                         'gridsize': (1, 1),
                                         'numberPerPurchase': 1,
                                         'limitPerParty': 1,
                                         'paidOnly': False,
                                         'gridAsset': 'PartyJukebox_activity_1x1'},
   ActivityIds.PartyCannon: {'cost': int(50 * PartyCostMultiplier),
                             'gridsize': (1, 1),
                             'numberPerPurchase': 5,
                             'limitPerParty': 10,
                             'paidOnly': False,
                             'gridAsset': 'PartyCannon_activity_1x1'},
   ActivityIds.PartyTrampoline: {'cost': int(50 * PartyCostMultiplier),
                                 'gridsize': (2, 2),
                                 'numberPerPurchase': 1,
                                 'limitPerParty': 8,
                                 'paidOnly': False,
                                 'gridAsset': 'PartyTrampoline_activity_2x2'},
   ActivityIds.PartyValentineTrampoline: {'cost': int(50 * PartyCostMultiplier),
                                          'gridsize': (2, 2),
                                          'numberPerPurchase': 1,
                                          'limitPerParty': 8,
                                          'paidOnly': False,
                                          'gridAsset': 'PartyTrampoline_activity_2x2'},
   ActivityIds.PartyVictoryTrampoline: {'cost': int(50 * PartyCostMultiplier),
                                        'gridsize': (2, 2),
                                        'numberPerPurchase': 1,
                                        'limitPerParty': 8,
                                        'paidOnly': False,
                                        'gridAsset': 'PartyTrampoline_activity_2x2'},
   ActivityIds.PartyWinterTrampoline: {'cost': int(50 * PartyCostMultiplier),
                                       'gridsize': (2, 2),
                                       'numberPerPurchase': 1,
                                       'limitPerParty': 8,
                                       'paidOnly': False,
                                       'gridAsset': 'PartyTrampoline_activity_2x2'},
   ActivityIds.PartyCatch: {'cost': int(300 * PartyCostMultiplier),
                            'gridsize': (5, 5),
                            'numberPerPurchase': 1,
                            'limitPerParty': 1,
                            'paidOnly': True,
                            'gridAsset': 'PartyCatch_activity_5x5'},
   ActivityIds.PartyWinterCatch: {'cost': int(300 * PartyCostMultiplier),
                                  'gridsize': (5, 5),
                                  'numberPerPurchase': 1,
                                  'limitPerParty': 1,
                                  'paidOnly': True,
                                  'gridAsset': 'PartyCatch_activity_5x5'},
   ActivityIds.PartyCog: {'cost': int(300 * PartyCostMultiplier),
                          'gridsize': (5, 5),
                          'numberPerPurchase': 1,
                          'limitPerParty': 1,
                          'paidOnly': True,
                          'gridAsset': 'PartyCog_activity_5x5'},
   ActivityIds.PartyWinterCog: {'cost': int(300 * PartyCostMultiplier),
                                'gridsize': (5, 5),
                                'numberPerPurchase': 1,
                                'limitPerParty': 1,
                                'paidOnly': True,
                                'gridAsset': 'PartyCog_activity_5x5'},
   ActivityIds.PartyDance: {'cost': int(100 * PartyCostMultiplier),
                            'gridsize': (3, 3),
                            'numberPerPurchase': 1,
                            'limitPerParty': 1,
                            'paidOnly': True,
                            'gridAsset': 'PartyDance_activity_3x3'},
   ActivityIds.PartyDance20: {'cost': int(200 * PartyCostMultiplier),
                              'gridsize': (3, 3),
                              'numberPerPurchase': 1,
                              'limitPerParty': 1,
                              'paidOnly': True,
                              'gridAsset': 'PartyDance_activity_3x3'},
   ActivityIds.PartyValentineDance: {'cost': int(100 * PartyCostMultiplier),
                                     'gridsize': (3, 3),
                                     'numberPerPurchase': 1,
                                     'limitPerParty': 1,
                                     'paidOnly': True,
                                     'gridAsset': 'PartyDance_activity_3x3'},
   ActivityIds.PartyValentineDance20: {'cost': int(200 * PartyCostMultiplier),
                                       'gridsize': (3, 3),
                                       'numberPerPurchase': 1,
                                       'limitPerParty': 1,
                                       'paidOnly': True,
                                       'gridAsset': 'PartyDance_activity_3x3'},
   ActivityIds.PartyTugOfWar: {'cost': int(200 * PartyCostMultiplier),
                               'gridsize': (4, 4),
                               'numberPerPurchase': 1,
                               'limitPerParty': 1,
                               'paidOnly': False,
                               'gridAsset': 'PartyTufOfWar_activity_4x4'},
   ActivityIds.PartyFireworks: {'cost': int(200 * PartyCostMultiplier),
                                'gridsize': (4, 2),
                                'numberPerPurchase': 1,
                                'limitPerParty': 1,
                                'paidOnly': False,
                                'gridAsset': 'PartyFireworks_activity_2x4'},
   ActivityIds.PartyClock: {'cost': MinimumPartyCost,
                            'gridsize': (1, 1),
                            'numberPerPurchase': 1,
                            'limitPerParty': 1,
                            'paidOnly': False,
                            'gridAsset': 'PartyClock_activity_1x1'}}
  DecorationInformationDict = {DecorationIds.BalloonAnvil: {'cost': int(10 * PartyCostMultiplier),
                                'gridsize': (1, 1),
                                'numberPerPurchase': 1,
                                'limitPerParty': 5,
                                'paidOnly': False,
                                'gridAsset': 'decoration_1x1'},
   DecorationIds.BalloonAnvilValentine: {'cost': int(10 * PartyCostMultiplier),
                                         'gridsize': (1, 1),
                                         'numberPerPurchase': 1,
                                         'limitPerParty': 5,
                                         'paidOnly': False,
                                         'gridAsset': 'decoration_1x1'},
   DecorationIds.BalloonStage: {'cost': int(25 * PartyCostMultiplier),
                                'gridsize': (1, 1),
                                'numberPerPurchase': 1,
                                'limitPerParty': 5,
                                'paidOnly': False,
                                'gridAsset': 'decoration_1x1'},
   DecorationIds.Bow: {'cost': int(10 * PartyCostMultiplier),
                       'gridsize': (1, 1),
                       'numberPerPurchase': 1,
                       'limitPerParty': 5,
                       'paidOnly': False,
                       'gridAsset': 'decoration_1x1'},
   DecorationIds.Cake: {'cost': int(10 * PartyCostMultiplier),
                        'gridsize': (1, 1),
                        'numberPerPurchase': 1,
                        'limitPerParty': 5,
                        'paidOnly': False,
                        'gridAsset': 'decoration_1x1'},
   DecorationIds.Castle: {'cost': int(25 * PartyCostMultiplier),
                          'gridsize': (1, 1),
                          'numberPerPurchase': 1,
                          'limitPerParty': 5,
                          'paidOnly': False,
                          'gridAsset': 'decoration_1x1'},
   DecorationIds.GiftPile: {'cost': int(10 * PartyCostMultiplier),
                            'gridsize': (1, 1),
                            'numberPerPurchase': 1,
                            'limitPerParty': 5,
                            'paidOnly': False,
                            'gridAsset': 'decoration_1x1'},
   DecorationIds.Horn: {'cost': int(10 * PartyCostMultiplier),
                        'gridsize': (1, 1),
                        'numberPerPurchase': 1,
                        'limitPerParty': 5,
                        'paidOnly': False,
                        'gridAsset': 'decoration_1x1'},
   DecorationIds.MardiGras: {'cost': int(25 * PartyCostMultiplier),
                             'gridsize': (1, 1),
                             'numberPerPurchase': 1,
                             'limitPerParty': 5,
                             'paidOnly': False,
                             'gridAsset': 'decoration_1x1'},
   DecorationIds.NoiseMakers: {'cost': int(10 * PartyCostMultiplier),
                               'gridsize': (1, 1),
                               'numberPerPurchase': 1,
                               'limitPerParty': 5,
                               'paidOnly': False,
                               'gridAsset': 'decoration_1x1'},
   DecorationIds.Pinwheel: {'cost': int(10 * PartyCostMultiplier),
                            'gridsize': (1, 1),
                            'numberPerPurchase': 1,
                            'limitPerParty': 5,
                            'paidOnly': False,
                            'gridAsset': 'decoration_1x1'},
   DecorationIds.GagGlobe: {'cost': int(25 * PartyCostMultiplier),
                            'gridsize': (1, 1),
                            'numberPerPurchase': 1,
                            'limitPerParty': 5,
                            'paidOnly': False,
                            'gridAsset': 'decoration_1x1'},
   DecorationIds.BannerJellyBean: {'cost': int(25 * PartyCostMultiplier),
                                   'gridsize': (1, 1),
                                   'numberPerPurchase': 1,
                                   'limitPerParty': 5,
                                   'paidOnly': False,
                                   'gridAsset': 'decoration_1x1'},
   DecorationIds.CakeTower: {'cost': int(25 * PartyCostMultiplier),
                             'gridsize': (1, 1),
                             'numberPerPurchase': 1,
                             'limitPerParty': 5,
                             'paidOnly': False,
                             'gridAsset': 'decoration_1x1'},
   DecorationIds.HeartTarget: {'cost': int(25 * PartyCostMultiplier),
                               'gridsize': (1, 1),
                               'numberPerPurchase': 1,
                               'limitPerParty': 5,
                               'paidOnly': False,
                               'gridAsset': 'decoration_1x1'},
   DecorationIds.HeartBanner: {'cost': int(25 * PartyCostMultiplier),
                               'gridsize': (1, 1),
                               'numberPerPurchase': 1,
                               'limitPerParty': 5,
                               'paidOnly': False,
                               'gridAsset': 'decoration_1x1'},
   DecorationIds.FlyingHeart: {'cost': int(25 * PartyCostMultiplier),
                               'gridsize': (1, 1),
                               'numberPerPurchase': 1,
                               'limitPerParty': 5,
                               'paidOnly': False,
                               'gridAsset': 'decoration_1x1'},
   DecorationIds.Hydra: {'cost': int(25 * PartyCostMultiplier),
                         'gridsize': (2, 2),
                         'numberPerPurchase': 1,
                         'limitPerParty': 5,
                         'paidOnly': False,
                         'gridAsset': 'decoration_propStage_2x2'},
   DecorationIds.BannerVictory: {'cost': int(25 * PartyCostMultiplier),
                                 'gridsize': (1, 1),
                                 'numberPerPurchase': 1,
                                 'limitPerParty': 5,
                                 'paidOnly': False,
                                 'gridAsset': 'decoration_1x1'},
   DecorationIds.CannonVictory: {'cost': int(25 * PartyCostMultiplier),
                                 'gridsize': (1, 1),
                                 'numberPerPurchase': 1,
                                 'limitPerParty': 5,
                                 'paidOnly': False,
                                 'gridAsset': 'decoration_1x1'},
   DecorationIds.CogStatueVictory: {'cost': int(25 * PartyCostMultiplier),
                                    'gridsize': (1, 1),
                                    'numberPerPurchase': 1,
                                    'limitPerParty': 5,
                                    'paidOnly': False,
                                    'gridAsset': 'decoration_1x1'},
   DecorationIds.TubeCogVictory: {'cost': int(25 * PartyCostMultiplier),
                                  'gridsize': (1, 1),
                                  'numberPerPurchase': 1,
                                  'limitPerParty': 5,
                                  'paidOnly': False,
                                  'gridAsset': 'decoration_1x1'},
   DecorationIds.CogIceCreamVictory: {'cost': int(25 * PartyCostMultiplier),
                                      'gridsize': (1, 1),
                                      'numberPerPurchase': 1,
                                      'limitPerParty': 5,
                                      'paidOnly': False,
                                      'gridAsset': 'decoration_1x1'},
   DecorationIds.cogIceCreamWinter: {'cost': int(25 * PartyCostMultiplier),
                                     'gridsize': (1, 1),
                                     'numberPerPurchase': 1,
                                     'limitPerParty': 5,
                                     'paidOnly': False,
                                     'gridAsset': 'decoration_1x1'},
   DecorationIds.StageWinter: {'cost': int(25 * PartyCostMultiplier),
                               'gridsize': (2, 2),
                               'numberPerPurchase': 1,
                               'limitPerParty': 5,
                               'paidOnly': False,
                               'gridAsset': 'decoration_propStage_2x2'},
   DecorationIds.CogStatueWinter: {'cost': int(25 * PartyCostMultiplier),
                                   'gridsize': (1, 1),
                                   'numberPerPurchase': 1,
                                   'limitPerParty': 5,
                                   'paidOnly': False,
                                   'gridAsset': 'decoration_1x1'},
   DecorationIds.snowman: {'cost': int(25 * PartyCostMultiplier),
                           'gridsize': (1, 1),
                           'numberPerPurchase': 1,
                           'limitPerParty': 5,
                           'paidOnly': False,
                           'gridAsset': 'decoration_1x1'},
   DecorationIds.snowDoodle: {'cost': int(25 * PartyCostMultiplier),
                              'gridsize': (1, 1),
                              'numberPerPurchase': 1,
                              'limitPerParty': 5,
                              'paidOnly': False,
                              'gridAsset': 'decoration_1x1'}}
  DefaultRulesTimeout = 10.0
  DenialReasons = PythonUtil.Enum(('Default', 'Full', 'SilentFail'), start=0)
  FireworkShows = PythonUtil.Enum(('Summer',), start=200)
  FireworksGlobalXOffset = 160.0
  FireworksGlobalYOffset = -20.0
  FireworksPostLaunchDelay = 5.0
  RocketSoundDelay = 2.0
  RocketDirectionDelay = 2.0
  FireworksStartedEvent = 'PartyFireworksStarted'
  FireworksFinishedEvent = 'PartyFireworksFinished'
  FireworksTransitionToDisabledDelay = 3.0
  TeamActivityTeams = PythonUtil.Enum(('LeftTeam', 'RightTeam'), start=0)
  TeamActivityNeitherTeam = 3
  TeamActivityTextScale = 0.135
  TeamActivityStartDelay = 8.0
  TeamActivityClientWaitDelay = 30.0
  TeamActivityDefaultMinPlayersPerTeam = 1
  TeamActivityDefaultMaxPlayersPerTeam = 4
  TeamActivityDefaultDuration = 60.0
  TeamActivityDefaultConclusionDuration = 4.0
  TeamActivityStatusColor = VBase4(1.0, 1.0, 0.65, 1.0)
  CogActivityBalanceTeams = True
  CogActivityStartDelay = 15.0
  CogActivityConclusionDuration = 12
  CogActivityDuration = 90
  CogActivityMinPlayersPerTeam = 1
  CogActivityMaxPlayersPerTeam = 4
  CogActivityColors = (VBase4(0.22, 0.4, 0.98, 1.0), VBase4(1.0, 0.43, 0.04, 1.0))
  CogActivitySplatColorBase = VBase4(0.98, 0.9, 0.094, 1.0)
  CogActivitySplatColors = (VBase4(CogActivityColors[0][0] / CogActivitySplatColorBase[0], CogActivityColors[0][1] / CogActivitySplatColorBase[1], CogActivityColors[0][2] / CogActivitySplatColorBase[2], 1.0), VBase4(CogActivityColors[1][0] / CogActivitySplatColorBase[0], CogActivityColors[1][1] / CogActivitySplatColorBase[1], CogActivityColors[1][2] / CogActivitySplatColorBase[2], 1.0))
  CogPinataHeadZ = 4.7
  CogActivityHitPoints = 1
  CogActivityHitPointsForHead = 3
  CogPinataPushBodyFactor = 0.05
  CogPinataPushHeadFactor = CogPinataPushBodyFactor * abs(CogActivityHitPointsForHead - CogActivityHitPoints)
  CogActivityAvgBeansPerSecond = 0.15
  CogActivityBeansToAward = round(CogActivityAvgBeansPerSecond * CogActivityDuration * 2.0)
  CogActivityWinBeans = int(round(CogActivityBeansToAward * 0.6))
  CogActivityLossBeans = int(round(CogActivityBeansToAward * 0.4))
  CogActivityTieBeans = int(round(CogActivityBeansToAward * 0.4))
  CogActivityPerfectWinBeans = int(round(CogActivityBeansToAward * 0.75))
  CogActivityPerfectLossBeans = int(round(CogActivityBeansToAward * 0.25))
  CogActivityArenaLength = 50.0
  CogActivityPieMinDist = 0.0
  CogActivityPieMaxDist = 110.0
  CogActivityPowerMeterHeight = 0.4
  CogActivityPowerMeterWidth = 0.1
  CogActivityPowerMeterPos = (0.33, 0.0, 0.0)
  CogActivityPowerMeterTextPos = (0.33, -0.26)
  CogActivityVictoryBarPos = (-0.55, 0.0, 0.825)
  CogActivityVictoryBarOrangePos = (0.1725, 0.0, -0.0325)
  CogActivityVictoryBarPiePos = (0.47, 0.0, -0.015)
  CogActivityVictoryBarArrow = (0.0, 0.0, 0.1)
  CogActivityBarUnitScale = 1.1
  CogActivityBarStartScale = CogActivityBarUnitScale * 5
  CogActivityBarPieUnitMove = 0.07
  CogActivityBarPieScale = 1.5
  CogActivityScorePos = (1.25, -0.45)
  CogActivityScoreTitle = (1.24, -0.5)
  CogActivityPowerMeterTime = 1.0
  CogActivityShortThrowTime = 0.1
  ToonAttackIdleThreshold = 5.0
  ToonMoveIdleThreshold = 5.0
  CogActivityShortThrowSpam = 3
  CogActivitySpamWarningShowTime = 5.0
  CogActivityControlsShowTime = 2.0
  PARTY_COG_CUTOFF = 60
  TugOfWarStartDelay = 8.0
  TugOfWarReadyDuration = 1.5
  TugOfWarGoDuration = 0.75
  TugOfWarDuration = 40.0
  TugOfWarMinimumPlayersPerTeam = 1
  TugOfWarMaximumPlayersPerTeam = 4
  TugOfWarStartGameTimeout = 8
  TugOfWarJoinCollisionEndPoints = [Point3(6.0, 0.0, 0.0), Point3(-6.0, 0.0, 0.0)]
  TugOfWarJoinCollisionRadius = 1.75
  TugOfWarJoinCollisionPositions = [Point3(-10.5, 0.25, 4.5), Point3(10.5, -0.25, 4.5)]
  TugOfWarInitialToonPositionsXOffset = 8.0
  TugOfWarToonPositionXSeparation = 2.0
  TugOfWarToonPositionZ = 2.55
  TugOfWarTextWordScale = 0.135
  TugOfWarTextCountdownScale = 4.0
  TugOfWarCameraPos = Point3(0.0, -33.0, 10.0)
  TugOfWarCameraInitialHpr = Point3(0.0, -6.91123, 0.0)
  TugOfWarCameraLookAtHeightOffset = 6.0
  TugOfWarPowerMeterSize = 17
  TugOfWarPowerMeterRulesTarget = 8
  TugOfWarDisabledArrowColor = VBase4(1.0, 0.0, 0.0, 0.3)
  TugOfWarEnabledArrowColor = VBase4(1.0, 0.0, 0.0, 1.0)
  TugOfWarHilightedArrowColor = VBase4(1.0, 0.7, 0.0, 1.0)
  TugOfWarTargetRateList = [(8.0, 6),
   (5.0, 7),
   (6.0, 8),
   (6.0, 10),
   (7.0, 11),
   (8.0, 12)]
  TugOfWarKeyPressTimeToLive = 1.0
  TugOfWarKeyPressUpdateRate = 0.1
  TugOfWarKeyPressReportRate = 0.2
  TugOfWarMovementFactor = 0.03
  TugOfWarSplashZOffset = 1.0
  TugOfWarHeadings = [240.0, 120.0]
  TugOfWarConclusionDuration = 4.0
  TugOfWarFallInWinReward = 15
  TugOfWarFallInLossReward = 4
  TugOfWarWinReward = 12
  TugOfWarLossReward = 8
  TugOfWarTieReward = 5
  TugOfWarTieThreshold = 0.75
  TrampolineDuration = 60.0
  TrampolineSignOffset = Point3(-6.0, -6.0, 0.0)
  TrampolineLeverOffset = Point3(-5.0, -9.0, 0.0)
  TrampolineNumJellyBeans = 12
  TrampolineJellyBeanBonus = 10
  CatchActivityDuration = 80
  CatchActivityBitmask = BitMask32(16)
  CatchLeverOffset = Point3(-3.0, -2.0, 0.0)
  CatchDropShadowHeight = 0.5
  CatchConclusionDuration = 3.0
  
  class DropObject:
  
      def __init__(self, name, good, onscreenDurMult, modelPath):
          self.name = name
          self.good = good
          self.onscreenDurMult = onscreenDurMult
          self.modelPath = modelPath
  
      def isBaseline(self):
          return self.onscreenDurMult == 1.0
  
  
  DropObjectTypes = [DropObject('apple', 1, 1.0, 'phase_4/models/minigames/apple'),
   DropObject('orange', 1, 1.0, 'phase_4/models/minigames/orange'),
   DropObject('pear', 1, 1.0, 'phase_4/models/minigames/pear'),
   DropObject('coconut', 1, 1.0, 'phase_4/models/minigames/coconut'),
   DropObject('watermelon', 1, 1.0, 'phase_4/models/minigames/watermelon'),
   DropObject('pineapple', 1, 1.0, 'phase_4/models/minigames/pineapple'),
   DropObject('anvil', 0, 0.4, 'phase_4/models/props/anvil-mod')]
  Name2DropObjectType = {}
  for type in DropObjectTypes:
      Name2DropObjectType[type.name] = type
  
  Name2DOTypeId = {}
  names = Name2DropObjectType.keys()
  names.sort()
  for i in range(len(names)):
      Name2DOTypeId[names[i]] = i
  
  DOTypeId2Name = names
  NumFruits = [{2000: 18,
    1000: 19,
    5000: 22,
    4000: 24,
    3000: 27,
    9000: 28},
   {2000: 30,
    1000: 33,
    5000: 38,
    4000: 42,
    3000: 46,
    9000: 50},
   {2000: 42,
    1000: 48,
    5000: 54,
    4000: 60,
    3000: 66,
    9000: 71},
   {2000: 56,
    1000: 63,
    5000: 70,
    4000: 78,
    3000: 85,
    9000: 92}]
  DancePatternToAnims = {'dduu': 'slip-backward',
   'ldddud': 'happy-dance',
   'lll': 'left',
   'rdu': 'struggle',
   'rrr': 'right',
   'rulu': 'running-jump',
   'udlr': 'good-putt',
   'udllrr': 'victory',
   'ulu': 'jump',
   'uudd': 'slip-forward'}
  DancePatternToAnims20 = {'ddd': 'down',
   'dduu': 'slip-backward',
   'drul': 'sad-walk',
   'ldr': 'push',
   'ldddud': 'happy-dance',
   'ldu': 'sprinkle-dust',
   'lll': 'left',
   'llrr': 'firehose',
   'lrlr': 'wave',
   'rdu': 'struggle',
   'rlrl': 'confused',
   'rrr': 'right',
   'rulu': 'running-jump',
   'uddd': 'reel-neutral',
   'udlr': 'good-putt',
   'udud': 'angry',
   'udllrr': 'victory',
   'ulu': 'jump',
   'uudd': 'slip-forward',
   'uuu': 'up'}
  DanceAnimToName = {'right': TTLocalizer.DanceAnimRight,
   'reel-neutral': TTLocalizer.DanceAnimReelNeutral,
   'conked': TTLocalizer.DanceAnimConked,
   'happy-dance': TTLocalizer.DanceAnimHappyDance,
   'confused': TTLocalizer.DanceAnimConfused,
   'walk': TTLocalizer.DanceAnimWalk,
   'jump': TTLocalizer.DanceAnimJump,
   'firehose': TTLocalizer.DanceAnimFirehose,
   'shrug': TTLocalizer.DanceAnimShrug,
   'slip-forward': TTLocalizer.DanceAnimSlipForward,
   'sad-walk': TTLocalizer.DanceAnimSadWalk,
   'wave': TTLocalizer.DanceAnimWave,
   'struggle': TTLocalizer.DanceAnimStruggle,
   'running-jump': TTLocalizer.DanceAnimRunningJump,
   'slip-backward': TTLocalizer.DanceAnimSlipBackward,
   'down': TTLocalizer.DanceAnimDown,
   'up': TTLocalizer.DanceAnimUp,
   'good-putt': TTLocalizer.DanceAnimGoodPutt,
   'victory': TTLocalizer.DanceAnimVictory,
   'push': TTLocalizer.DanceAnimPush,
   'angry': TTLocalizer.DanceAnimAngry,
   'left': TTLocalizer.DanceAnimLeft}
  DanceReverseLoopAnims = ['left',
   'right',
   'up',
   'down',
   'good-putt']
  ToonDancingStates = PythonUtil.Enum(('Init',
   'DanceMove',
   'Run',
   'Cleanup'))
  JUKEBOX_TIMEOUT = 30.0
  MUSIC_PATH = 'phase_%s/audio/bgm/'
  MUSIC_MIN_LENGTH_SECONDS = 50.0
  MUSIC_GAP = 2.5
  PhaseToMusicData = {3.5: {'TC_SZ.mid': [TTLocalizer.MusicTcSz, 57]},
   3: {'create_a_toon.mid': [TTLocalizer.MusicCreateAToon, 175],
       'tt_theme.mid': [TTLocalizer.MusicTtTheme, 51]},
   4: {'TC_nbrhood.mid': [TTLocalizer.MusicTcNbrhood, 59],
       'MG_TwoDGame.mid': [TTLocalizer.MusicMgTwodgame, 60],
       'MG_Vine.mid': [TTLocalizer.MusicMgVine, 32],
       'FF_safezone.mid': [TTLocalizer.MusicFfSafezone, 47]},
   6: {'DD_SZ.mid': [TTLocalizer.MusicDdSz, 33],
       'GS_SZ.mid': [TTLocalizer.MusicGsSz, 60],
       'OZ_SZ.mid': [TTLocalizer.MusicOzSz, 31],
       'GZ_SZ.mid': [TTLocalizer.MusicGzSz, 59],
       'MM_SZ.mid': [TTLocalizer.MusicMmSz, 76]},
   8: {'DG_SZ.mid': [TTLocalizer.MusicDgSz, 48],
       'DL_SZ.mid': [TTLocalizer.MusicDlSz, 33],
       'TB_SZ.mid': [TTLocalizer.MusicTbSz, 54]},
   9: {'encntr_hall_of_fame.mid': [TTLocalizer.MusicEncntrHallOfFame, 51],
       'encntr_head_suit_theme.mid': [TTLocalizer.MusicEncntrHeadSuitTheme, 29]},
   11: {'LB_juryBG.mid': [TTLocalizer.MusicLbJurybg, 30]},
   13: {'party_original_theme.mid': [TTLocalizer.MusicPartyOriginalTheme, 56],
        'party_generic_theme_jazzy.mid': [TTLocalizer.MusicPartyGenericThemeJazzy, 64]}}
  PhaseToMusicData40 = {3.5: {'encntr_general_bg.mid': [TTLocalizer.MusicEncntrGeneralBg, 30],
         'TC_SZ.mid': [TTLocalizer.MusicTcSz, 57]},
   3: {'create_a_toon.mid': [TTLocalizer.MusicCreateAToon, 175],
       'tt_theme.mid': [TTLocalizer.MusicTtTheme, 51]},
   4: {'minigame_race.mid': [TTLocalizer.MusicMinigameRace, 77],
       'TC_nbrhood.mid': [TTLocalizer.MusicTcNbrhood, 59],
       'MG_TwoDGame.mid': [TTLocalizer.MusicMgTwodgame, 60],
       'MG_CogThief.mid': [TTLocalizer.MusicMgCogthief, 61],
       'MG_Vine.mid': [TTLocalizer.MusicMgVine, 32],
       'MG_IceGame.mid': [TTLocalizer.MusicMgIcegame, 56],
       'FF_safezone.mid': [TTLocalizer.MusicFfSafezone, 47]},
   6: {'DD_SZ.mid': [TTLocalizer.MusicDdSz, 33],
       'GZ_PlayGolf.mid': [TTLocalizer.MusicGzPlaygolf, 61],
       'GS_SZ.mid': [TTLocalizer.MusicGsSz, 60],
       'OZ_SZ.mid': [TTLocalizer.MusicOzSz, 31],
       'GS_Race_CC.mid': [TTLocalizer.MusicGsRaceCc, 58],
       'GS_Race_SS.mid': [TTLocalizer.MusicGsRaceSs, 61],
       'GS_Race_RR.mid': [TTLocalizer.MusicGsRaceRr, 60],
       'GZ_SZ.mid': [TTLocalizer.MusicGzSz, 59],
       'MM_SZ.mid': [TTLocalizer.MusicMmSz, 76],
       'DD_nbrhood.mid': [TTLocalizer.MusicDdNbrhood, 67],
       'GS_KartShop.mid': [TTLocalizer.MusicGsKartshop, 32]},
   7: {'encntr_general_bg_indoor.mid': [TTLocalizer.MusicEncntrGeneralBgIndoor, 31],
       'encntr_suit_winning_indoor.mid': [TTLocalizer.MusicEncntrGeneralSuitWinningIndoor, 36]},
   8: {'DL_nbrhood.mid': [TTLocalizer.MusicDlNbrhood, 30],
       'DG_SZ.mid': [TTLocalizer.MusicDgSz, 48],
       'DL_SZ.mid': [TTLocalizer.MusicDlSz, 33],
       'TB_SZ.mid': [TTLocalizer.MusicTbSz, 54]},
   9: {'encntr_hall_of_fame.mid': [TTLocalizer.MusicEncntrHallOfFame, 51],
       'CHQ_FACT_bg.mid': [TTLocalizer.MusicChqFactBg, 50],
       'encntr_suit_winning.mid': [TTLocalizer.MusicEncntrSuitWinning, 31],
       'encntr_head_suit_theme.mid': [TTLocalizer.MusicEncntrHeadSuitTheme, 29]},
   11: {'LB_juryBG.mid': [TTLocalizer.MusicLbJurybg, 30],
        'LB_courtyard.mid': [TTLocalizer.MusicLbCourtyard, 32]},
   12: {'Bossbot_Factory_v1.mid': [TTLocalizer.MusicBossbotFactoryV1, 30],
        'BossBot_CEO_v1.mid': [TTLocalizer.MusicBossbotCeoV1, 31]},
   13: {'party_original_theme.mid': [TTLocalizer.MusicPartyOriginalTheme, 56],
        'party_polka_dance.mid': [TTLocalizer.MusicPartyPolkaDance, 63],
        'party_waltz_dance.mid': [TTLocalizer.MusicPartyWaltzDance, 63],
        'party_generic_theme_jazzy.mid': [TTLocalizer.MusicPartyGenericThemeJazzy, 64]}}
  
  def countMusic():
      numMusic = 0
      for key in PhaseToMusicData:
          numMusic += len(PhaseToMusicData[key])
  
      print 'PhaseToMusicData %d' % numMusic
      numMusic = 0
      for key in PhaseToMusicData40:
          numMusic += len(PhaseToMusicData40[key])
  
      print 'PhaseToMusicData40 %d' % numMusic
  
  
  def getMusicRepeatTimes(length, minLength = MUSIC_MIN_LENGTH_SECONDS):
      times = round(float(minLength) / length)
      if minLength <= 0 or times < 1.0:
          times = 1.0
      return times
  
  
  def sanitizePhase(phase):
      if phase == int(phase):
          phase = int(phase)
      return phase
  
  
  CANNON_TIMEOUT = 30
  CANNON_MOVIE_LOAD = 1
  CANNON_MOVIE_CLEAR = 2
  CANNON_MOVIE_FORCE_EXIT = 3
  CANNON_MOVIE_LANDED = 4
  CannonJellyBeanReward = 2
  CannonMaxTotalReward = 200
  CatchMaxTotalReward = 1000
  PartyCannonCollisions = {'clouds': ['cloudSphere-0'],
   'bounce': ['wall_collision',
              'discoBall_collision',
              'platform_left_collision',
              'platform_right_collision'],
   'trampoline_bounce': 'TrampolineCollision',
   'ground': ['floor_collision',
              'danceFloor_collision',
              'danceFloorRamp_collision',
              'hill_collision',
              'fence_floor'],
   'fence': ['dockTube1_collision',
             'dockTube2_collision',
             'dockTube2_collision',
             'dockTube2_collision',
             'palm_collision_01',
             'palm_collision_02',
             'palm_collision_03',
             'wall_1_collision',
             'wall_2_collision',
             'wall_3_collision',
             'wall_4_collision',
             'wall_5_collision',
             'wall_6_collision',
             'tree_collision',
             'partyDecoration_collision',
             'launchPad_railing_collision',
             'launchPad_floor_collision',
             'launchPad_collision',
             'launchPad_railing2_collision',
             'launchPad__rocket_collision',
             'launchPad_lever_collision',
             'launchPad_bridge_collision',
             'launchPad_sphere2_collision',
             'launchPad_sphere1_collision',
             'partyClock_collision',
             'sign_collision']}
  
  def getCostOfParty(partyInfo):
      newCost = 0
      for activityBase in partyInfo.activityList:
          newCost += ActivityInformationDict[activityBase.activityId]['cost']
  
      for decorBase in partyInfo.decors:
          newCost += DecorationInformationDict[decorBase.decorId]['cost']
  
      return newCost
  