Fix party bugs

but def not all
This commit is contained in:
John Cote 2015-05-25 13:27:32 -04:00
parent 9c013c70cd
commit 913f29b745
7 changed files with 140 additions and 35 deletions

View file

@ -1,4 +1,4 @@
# src # # Toontown Stride - src #
The source code for Toontown Stride. The source code for Toontown Stride.

View file

@ -123,6 +123,26 @@ class Decoration(NodePath):
balloonRight.reparentTo(balloonRightLocator) balloonRight.reparentTo(balloonRightLocator)
self.heartBanner.loop('idle') self.heartBanner.loop('idle')
self.heartBanner.reparentTo(self) self.heartBanner.reparentTo(self)
elif self.name == 'Hydra' or self.name == 'StageWinter':
if self.name == 'StageWinter':
self.hydra = Actor.Actor('phase_13/models/parties/tt_r_ara_pty_winterProps', {'dance': 'phase_13/models/parties/tt_a_ara_pty_hydra_dance'})
else:
self.hydra = Actor.Actor('phase_13/models/parties/tt_a_ara_pty_hydra_default', {'dance': 'phase_13/models/parties/tt_a_ara_pty_hydra_dance'})
st = random.randint(0, 10)
animIval = ActorInterval(self.hydra, 'dance')
animIvalDur = animIval.getDuration()
self.decSfx = loader.loadSfx('phase_13/audio/sfx/tt_s_ara_pty_propsShow_dance.ogg')
soundIval = SoundInterval(self.decSfx, node=self.hydra, listenerNode=base.localAvatar, volume=PartyGlobals.DECORATION_VOLUME, cutOff=PartyGlobals.DECORATION_CUTOFF, duration=animIvalDur)
self.animSeq = Parallel(animIval, soundIval)
self.animSeq.loop(st)
collisions = self.hydra.find('**/*collision*')
collisions.setPos(0, 0, -5)
self.hydra.flattenStrong()
self.hydra.reparentTo(self)
if self.name == 'StageWinter':
stageBounds = self.hydra.find('**/stage').node().getBounds()
self.hydra.node().setBounds(stageBounds)
self.hydra.node().setFinal(1)
elif self.name == 'TubeCogVictory': elif self.name == 'TubeCogVictory':
self.tubeCog = Actor.Actor('phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_default', {'wave': 'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_wave'}) self.tubeCog = Actor.Actor('phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_default', {'wave': 'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_wave'})
st = random.randint(0, 10) st = random.randint(0, 10)
@ -159,6 +179,10 @@ class Decoration(NodePath):
self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogDoodleVictory') self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogDoodleVictory')
self.decorationModel.reparentTo(self) self.decorationModel.reparentTo(self)
self.decorationShadow = self.setupAnimSeq() self.decorationShadow = self.setupAnimSeq()
elif self.name == 'CogIceCreamVictory':
self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogIceCreamVictory')
self.decorationModel.reparentTo(self)
self.decorationShadow = self.setupAnimSeq()
elif self.name == 'cogIceCreamWinter': elif self.name == 'cogIceCreamWinter':
self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogIceCreamWinter') self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogIceCreamWinter')
self.decorationModel.reparentTo(self) self.decorationModel.reparentTo(self)
@ -223,6 +247,12 @@ class Decoration(NodePath):
del self.globeSphere del self.globeSphere
self.partyGlobe.removeNode() self.partyGlobe.removeNode()
del self.partyGlobe del self.partyGlobe
elif self.name == 'Hydra' or self.name == 'StageWinter':
self.cleanUpAnimSequences()
self.hydra.removeNode()
del self.hydra
if hasattr(self, 'decSfx'):
del self.decSfx
elif self.name == 'TubeCogVictory': elif self.name == 'TubeCogVictory':
self.cleanUpAnimSequences() self.cleanUpAnimSequences()
self.tubeCog.removeNode() self.tubeCog.removeNode()
@ -244,7 +274,7 @@ class Decoration(NodePath):
elif self.name == 'CannonVictory': elif self.name == 'CannonVictory':
self.cannonVictory.removeNode() self.cannonVictory.removeNode()
del self.cannonVictory del self.cannonVictory
elif self.name == 'CogStatueVictory' or self.name == 'cogIceCreamWinter' or self.name == 'CogStatueWinter': elif self.name == 'CogIceCreamVictory' or self.name == 'CogStatueVictory' or self.name == 'cogIceCreamWinter' or self.name == 'CogStatueWinter':
self.cleanUpAnimSequences() self.cleanUpAnimSequences()
self.decorationModel.removeNode() self.decorationModel.removeNode()
self.decorationShadow.removeNode() self.decorationShadow.removeNode()

View file

@ -258,10 +258,6 @@ class DistributedPartyActivity(DistributedObject.DistributedObject):
self.signFlatWithNote.stash() self.signFlatWithNote.stash()
self.signTextLocator.stash() self.signTextLocator.stash()
def unloadSign(self):
self.sign.removeNode()
del self.sign
def loadLever(self): def loadLever(self):
self.lever = self.root.attachNewNode('%sLever' % self.activityName) self.lever = self.root.attachNewNode('%sLever' % self.activityName)
self.leverModel = self.party.defaultLeverModel.copyTo(self.lever) self.leverModel = self.party.defaultLeverModel.copyTo(self.lever)
@ -413,9 +409,8 @@ class DistributedPartyActivity(DistributedObject.DistributedObject):
self._disableCollisions() self._disableCollisions()
self.signModel.removeNode() self.signModel.removeNode()
del self.signModel del self.signModel
if hasattr(self, 'sign'): self.sign.removeNode()
self.sign.removeNode() del self.sign
del self.sign
self.ignoreAll() self.ignoreAll()
if self.wantLever: if self.wantLever:
self.unloadLever() self.unloadLever()

View file

@ -47,15 +47,30 @@ class PartyEditor(DirectObject, FSM):
self.partyPlanner.gui.find('**/activitiesButtonDown_rollover'), self.partyPlanner.gui.find('**/activitiesButtonDown_rollover'),
self.partyPlanner.gui.find('**/activitiesButtonDown_inactive')), incButton_relief=None, incButton_pos=(-0.05, 0.0, -0.94), itemFrame_pos=(pos[0], pos[1], pos[2] + 0.04), itemFrame_relief=None, numItemsVisible=1, items=[]) self.partyPlanner.gui.find('**/activitiesButtonDown_inactive')), incButton_relief=None, incButton_pos=(-0.05, 0.0, -0.94), itemFrame_pos=(pos[0], pos[1], pos[2] + 0.04), itemFrame_relief=None, numItemsVisible=1, items=[])
holidayIds = base.cr.newsManager.getHolidayIdList() holidayIds = base.cr.newsManager.getHolidayIdList()
isWinter = ToontownGlobals.WINTER_DECORATIONS in holidayIds or ToontownGlobals.WACKY_WINTER_DECORATIONS in holidayIds
isVictory = ToontownGlobals.VICTORY_PARTY_HOLIDAY in holidayIds
isValentine = ToontownGlobals.VALENTINES_DAY in holidayIds
for activityId in PartyGlobals.PartyEditorActivityOrder: for activityId in PartyGlobals.PartyEditorActivityOrder:
pele = PartyEditorListElement(self, activityId) if not isVictory and activityId in PartyGlobals.VictoryPartyActivityIds or not isWinter and activityId in PartyGlobals.WinterPartyActivityIds or not isValentine and activityId in PartyGlobals.ValentinePartyActivityIds:
self.elementList.addItem(pele) pass
if activityId == PartyGlobals.ActivityIds.PartyClock: elif isVictory and activityId in PartyGlobals.VictoryPartyReplacementActivityIds or isWinter and activityId in PartyGlobals.WinterPartyReplacementActivityIds or isValentine and activityId in PartyGlobals.ValentinePartyReplacementActivityIds:
self.partyClockElement = pele pass
else:
pele = PartyEditorListElement(self, activityId)
self.elementList.addItem(pele)
if activityId == PartyGlobals.ActivityIds.PartyClock:
self.partyClockElement = pele
for decorationId in PartyGlobals.DecorationIds: for decorationId in PartyGlobals.DecorationIds:
pele = PartyEditorListElement(self, decorationId, isDecoration=True) if not isVictory and decorationId in PartyGlobals.VictoryPartyDecorationIds or not isWinter and decorationId in PartyGlobals.WinterPartyDecorationIds or not isValentine and decorationId in PartyGlobals.ValentinePartyDecorationIds:
self.elementList.addItem(pele) pass
elif isVictory and decorationId in PartyGlobals.VictoryPartyReplacementDecorationIds or isValentine and decorationId in PartyGlobals.ValentinePartyReplacementDecorationIds:
pass
elif decorationId in PartyGlobals.TTSUnreleasedDecor:
pass
else:
pele = PartyEditorListElement(self, decorationId, isDecoration=True)
self.elementList.addItem(pele)
self.elementList.refresh() self.elementList.refresh()
self.elementList['command'] = self.scrollItemChanged self.elementList['command'] = self.scrollItemChanged
@ -105,7 +120,7 @@ class PartyEditor(DirectObject, FSM):
self.initPartyClock() self.initPartyClock()
if self.currentElement: if self.currentElement:
self.currentElement.checkSoldOutAndAffordability() self.currentElement.checkSoldOutAndPaidStatusAndAffordability()
def buyCurrentElement(self): def buyCurrentElement(self):
if self.currentElement: if self.currentElement:
@ -136,7 +151,7 @@ class PartyEditor(DirectObject, FSM):
self.elementList.scrollTo(0) self.elementList.scrollTo(0)
self.elementList['items'][0].elementSelectedFromList() self.elementList['items'][0].elementSelectedFromList()
self.currentElement = self.elementList['items'][self.elementList.getSelectedIndex()] self.currentElement = self.elementList['items'][self.elementList.getSelectedIndex()]
self.currentElement.checkSoldOutAndAffordability() self.currentElement.checkSoldOutAndPaidStatusAndAffordability()
self.partyPlanner.instructionLabel['text'] = TTLocalizer.PartyPlannerEditorInstructionsIdle self.partyPlanner.instructionLabel['text'] = TTLocalizer.PartyPlannerEditorInstructionsIdle
self.updateCostsAndBank() self.updateCostsAndBank()
self.handleMutuallyExclusiveActivities() self.handleMutuallyExclusiveActivities()

View file

@ -13,11 +13,11 @@ from toontown.parties import PartyUtils
class PartyEditorGridElement(DirectButton): class PartyEditorGridElement(DirectButton):
notify = directNotify.newCategory('PartyEditorGridElement') notify = directNotify.newCategory('PartyEditorGridElement')
def __init__(self, partyEditor, id, isDecoration, checkSoldOutAndAffordability, **kw): def __init__(self, partyEditor, id, isDecoration, checkSoldOutAndPaidStatusAndAffordability, **kw):
self.partyEditor = partyEditor self.partyEditor = partyEditor
self.id = id self.id = id
self.isDecoration = isDecoration self.isDecoration = isDecoration
self.checkSoldOutAndAffordability = checkSoldOutAndAffordability self.checkSoldOutAndPaidStatusAndAffordability = checkSoldOutAndPaidStatusAndAffordability
if self.isDecoration: if self.isDecoration:
self.name = TTLocalizer.PartyDecorationNameDict[self.id]['editor'] self.name = TTLocalizer.PartyDecorationNameDict[self.id]['editor']
colorList = ((1.0, 1.0, 1.0, 1.0), colorList = ((1.0, 1.0, 1.0, 1.0),
@ -218,7 +218,7 @@ class PartyEditorGridElement(DirectButton):
self.partyEditor.handleMutuallyExclusiveActivities() self.partyEditor.handleMutuallyExclusiveActivities()
else: else:
self.stash() self.stash()
self.checkSoldOutAndAffordability() self.checkSoldOutAndPaidStatusAndAffordability()
return return
def placeInPartyGrounds(self, desiredXY = None): def placeInPartyGrounds(self, desiredXY = None):
@ -230,7 +230,7 @@ class PartyEditorGridElement(DirectButton):
self.partyEditor.partyEditorGrid.registerNewElement(self, self.centerGridSquare, self.getGridSize()) self.partyEditor.partyEditorGrid.registerNewElement(self, self.centerGridSquare, self.getGridSize())
self.partyEditor.updateCostsAndBank() self.partyEditor.updateCostsAndBank()
self.partyEditor.partyPlanner.instructionLabel['text'] = TTLocalizer.PartyPlannerEditorInstructionsPartyGrounds self.partyEditor.partyPlanner.instructionLabel['text'] = TTLocalizer.PartyPlannerEditorInstructionsPartyGrounds
self.checkSoldOutAndAffordability() self.checkSoldOutAndPaidStatusAndAffordability()
return True return True
else: else:
return False return False

View file

@ -13,6 +13,8 @@ class PartyEditorListElement(DirectButton):
self.partyEditor = partyEditor self.partyEditor = partyEditor
self.id = id self.id = id
self.isDecoration = isDecoration self.isDecoration = isDecoration
self.unreleased = self.calcUnreleased(id)
self.comingSoonTextScale = 1.0
if self.isDecoration: if self.isDecoration:
self.name = TTLocalizer.PartyDecorationNameDict[self.id]['editor'] self.name = TTLocalizer.PartyDecorationNameDict[self.id]['editor']
colorList = ((1.0, 0.0, 1.0, 1.0), colorList = ((1.0, 0.0, 1.0, 1.0),
@ -20,8 +22,10 @@ class PartyEditorListElement(DirectButton):
(0.0, 1.0, 1.0, 1.0), (0.0, 1.0, 1.0, 1.0),
(0.5, 0.5, 0.5, 1.0)) (0.5, 0.5, 0.5, 1.0))
assetName = PartyGlobals.DecorationIds.getString(self.id) assetName = PartyGlobals.DecorationIds.getString(self.id)
if assetName == 'Hydra':
assetName = 'StageSummer'
geom = self.partyEditor.decorationModels.find('**/partyDecoration_%s' % assetName) geom = self.partyEditor.decorationModels.find('**/partyDecoration_%s' % assetName)
if geom.isEmpty(): if geom.isEmpty() or self.unreleased:
helpGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_brd_help') helpGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_brd_help')
helpImageList = (helpGui.find('**/tt_t_gui_brd_helpUp'), helpImageList = (helpGui.find('**/tt_t_gui_brd_helpUp'),
helpGui.find('**/tt_t_gui_brd_helpDown'), helpGui.find('**/tt_t_gui_brd_helpDown'),
@ -31,11 +35,12 @@ class PartyEditorListElement(DirectButton):
geom3_color = (0.5, 0.5, 0.5, 1.0) geom3_color = (0.5, 0.5, 0.5, 1.0)
scale = Vec3(2.5, 2.5, 2.5) scale = Vec3(2.5, 2.5, 2.5)
geom_pos = (0.0, 0.0, 0.0) geom_pos = (0.0, 0.0, 0.0)
self.comingSoonTextScale = 0.035
else: else:
geom_pos = (0.0, 0.0, -3.0) geom_pos = (0.0, 0.0, -3.0)
geom3_color = (0.5, 0.5, 0.5, 1.0) geom3_color = (0.5, 0.5, 0.5, 1.0)
scale = Vec3(0.06, 0.0001, 0.06) scale = Vec3(0.06, 0.0001, 0.06)
if self.id in [PartyGlobals.DecorationIds.CogStatueVictory, PartyGlobals.DecorationIds.TubeCogVictory]: if self.id in [PartyGlobals.DecorationIds.CogStatueVictory, PartyGlobals.DecorationIds.TubeCogVictory, PartyGlobals.DecorationIds.CogIceCreamVictory]:
geom_pos = (0.0, 0.0, -3.9) geom_pos = (0.0, 0.0, -3.9)
scale = Vec3(0.05, 0.0001, 0.05) scale = Vec3(0.05, 0.0001, 0.05)
else: else:
@ -53,6 +58,7 @@ class PartyEditorListElement(DirectButton):
scale = 0.35 scale = 0.35
geom3_color = (0.5, 0.5, 0.5, 1.0) geom3_color = (0.5, 0.5, 0.5, 1.0)
geom_pos = (0.0, 0.0, 0.0) geom_pos = (0.0, 0.0, 0.0)
self.comingSoonTextScale = 0.25
optiondefs = (('geom', geom, None), optiondefs = (('geom', geom, None),
('geom3_color', geom3_color, None), ('geom3_color', geom3_color, None),
('geom_pos', geom_pos, None), ('geom_pos', geom_pos, None),
@ -67,13 +73,30 @@ class PartyEditorListElement(DirectButton):
self.partyEditorGridElements = [] self.partyEditorGridElements = []
if self.isDecoration: if self.isDecoration:
for i in xrange(PartyGlobals.DecorationInformationDict[self.id]['limitPerParty']): for i in xrange(PartyGlobals.DecorationInformationDict[self.id]['limitPerParty']):
self.partyEditorGridElements.append(PartyEditorGridElement(self.partyEditor, self.id, self.isDecoration, self.checkSoldOutAndAffordability)) self.partyEditorGridElements.append(PartyEditorGridElement(self.partyEditor, self.id, self.isDecoration, self.checkSoldOutAndPaidStatusAndAffordability))
else: else:
for i in xrange(PartyGlobals.ActivityInformationDict[self.id]['limitPerParty']): for i in xrange(PartyGlobals.ActivityInformationDict[self.id]['limitPerParty']):
self.partyEditorGridElements.append(PartyEditorGridElement(self.partyEditor, self.id, self.isDecoration, self.checkSoldOutAndAffordability)) self.partyEditorGridElements.append(PartyEditorGridElement(self.partyEditor, self.id, self.isDecoration, self.checkSoldOutAndPaidStatusAndAffordability))
self.activeGridElementIndex = -1 self.activeGridElementIndex = -1
self.adjustForUnreleased()
return
def calcUnreleased(self, id):
if base.cr.partyManager.allowUnreleasedClient():
self.unreleased = False
elif self.isDecoration:
self.unreleased = id in PartyGlobals.UnreleasedDecorationIds
else:
self.unreleased = id in PartyGlobals.UnreleasedActivityIds
return self.unreleased
def adjustForUnreleased(self):
if self.unreleased:
textScale = self.comingSoonTextScale
comingSoon = DirectLabel(parent=self, text=TTLocalizer.PartyPlannerComingSoon, text_scale=textScale, text_fg=(1.0, 0, 0, 1.0), text_shadow=(0, 0, 0, 1), relief=None)
self['state'] = DirectGuiGlobals.DISABLED
return return
def clearPartyGrounds(self): def clearPartyGrounds(self):
@ -90,12 +113,12 @@ class PartyEditorListElement(DirectButton):
self.partyEditor.partyPlanner.elementDescriptionNode.setText(TTLocalizer.PartyActivityNameDict[self.id]['description']) self.partyEditor.partyPlanner.elementDescriptionNode.setText(TTLocalizer.PartyActivityNameDict[self.id]['description'])
self.partyEditor.partyPlanner.elementPriceNode.setText('%d %s' % (PartyGlobals.ActivityInformationDict[self.id]['cost'], TTLocalizer.PartyPlannerBeans)) self.partyEditor.partyPlanner.elementPriceNode.setText('%d %s' % (PartyGlobals.ActivityInformationDict[self.id]['cost'], TTLocalizer.PartyPlannerBeans))
self.partyEditor.partyPlanner.elementTitleLabel['text'] = self.name self.partyEditor.partyPlanner.elementTitleLabel['text'] = self.name
self.checkSoldOutAndAffordability() self.checkSoldOutAndPaidStatusAndAffordability()
def checkSoldOutAndAffordability(self): def checkSoldOutAndPaidStatusAndAffordability(self):
if self.partyEditor.currentElement != self: if self.partyEditor.currentElement != self:
if self.partyEditor.currentElement is not None: if self.partyEditor.currentElement is not None:
self.partyEditor.currentElement.checkSoldOutAndAffordability() self.partyEditor.currentElement.checkSoldOutAndPaidStatusAndAffordability()
return return
if self.isDecoration: if self.isDecoration:
infoDict = PartyGlobals.DecorationInformationDict infoDict = PartyGlobals.DecorationInformationDict
@ -134,6 +157,10 @@ class PartyEditorListElement(DirectButton):
self['state'] = DirectGuiGlobals.NORMAL self['state'] = DirectGuiGlobals.NORMAL
self.partyEditor.partyPlanner.elementBuyButton['text'] = TTLocalizer.PartyPlannerBuy self.partyEditor.partyPlanner.elementBuyButton['text'] = TTLocalizer.PartyPlannerBuy
self.partyEditor.partyPlanner.elementBuyButton['state'] = DirectGuiGlobals.NORMAL self.partyEditor.partyPlanner.elementBuyButton['state'] = DirectGuiGlobals.NORMAL
if self.unreleased:
self['state'] = DirectGuiGlobals.DISABLED
self.partyEditor.partyPlanner.elementBuyButton['text'] = TTLocalizer.PartyPlannerCantBuy
self.partyEditor.partyPlanner.elementBuyButton['state'] = DirectGuiGlobals.DISABLED
def clicked(self, mouseEvent): def clicked(self, mouseEvent):
PartyEditorListElement.notify.debug("Element %s's icon was clicked" % self.name) PartyEditorListElement.notify.debug("Element %s's icon was clicked" % self.name)
@ -151,7 +178,7 @@ class PartyEditorListElement(DirectButton):
self.activeGridElementIndex = i self.activeGridElementIndex = i
return True return True
else: else:
self.checkSoldOutAndAffordability() self.checkSoldOutAndPaidStatusAndAffordability()
return False return False
def released(self, mouseEvent): def released(self, mouseEvent):

View file

@ -70,10 +70,10 @@ ChangePartyFieldErrorCode = PythonUtil.Enum(('AllOk',
'AlreadyRefunded')) 'AlreadyRefunded'))
ActivityTypes = PythonUtil.Enum(('HostInitiated', 'GuestInitiated', 'Continuous')) ActivityTypes = PythonUtil.Enum(('HostInitiated', 'GuestInitiated', 'Continuous'))
PartyGateDenialReasons = PythonUtil.Enum(('Unavailable', 'Full')) PartyGateDenialReasons = PythonUtil.Enum(('Unavailable', 'Full'))
ActivityIds = PythonUtil.Enum(('PartyCatch', ActivityIds = PythonUtil.Enum(('PartyJukebox',
'PartyJukebox',
'PartyCannon', 'PartyCannon',
'PartyTrampoline', 'PartyTrampoline',
'PartyCatch',
'PartyDance', 'PartyDance',
'PartyTugOfWar', 'PartyTugOfWar',
'PartyFireworks', 'PartyFireworks',
@ -110,6 +110,14 @@ PartyEditorActivityOrder = [ ActivityIds.PartyClock,
ActivityIds.PartyCog, ActivityIds.PartyCog,
ActivityIds.PartyWinterCog, ActivityIds.PartyWinterCog,
ActivityIds.PartyFireworks] ActivityIds.PartyFireworks]
UnreleasedActivityIds = (ActivityIds.PartyWinterCog,
ActivityIds.PartyValentineJukebox,
ActivityIds.PartyValentineJukebox40,
ActivityIds.PartyValentineTrampoline,
ActivityIds.PartyWinterTrampoline,
ActivityIds.PartyWinterCatch,
ActivityIds.PartyValentineDance,
ActivityIds.PartyValentineDance20)
MutuallyExclusiveActivities = ((ActivityIds.PartyJukebox, ActivityIds.PartyJukebox40), MutuallyExclusiveActivities = ((ActivityIds.PartyJukebox, ActivityIds.PartyJukebox40),
(ActivityIds.PartyValentineJukebox, ActivityIds.PartyValentineJukebox40), (ActivityIds.PartyValentineJukebox, ActivityIds.PartyValentineJukebox40),
(ActivityIds.PartyDance, ActivityIds.PartyDance20), (ActivityIds.PartyDance, ActivityIds.PartyDance20),
@ -144,22 +152,41 @@ DecorationIds = PythonUtil.Enum(('BalloonAnvil',
'HeartTarget', 'HeartTarget',
'HeartBanner', 'HeartBanner',
'FlyingHeart', 'FlyingHeart',
'Hydra',
'BannerVictory', 'BannerVictory',
'CannonVictory', 'CannonVictory',
'CogStatueVictory', 'CogStatueVictory',
'TubeCogVictory', 'TubeCogVictory',
'CogIceCreamVictory',
'cogIceCreamWinter', 'cogIceCreamWinter',
'StageWinter', 'StageWinter',
'CogStatueWinter', 'CogStatueWinter',
'snowman', 'snowman',
'snowDoodle', 'snowDoodle',
'BalloonAnvilValentine')) 'BalloonAnvilValentine'))
DECORATION_VOLUME = 1.0 TTSUnreleasedDecor = [DecorationIds.HeartTarget,
DECORATION_CUTOFF = 45 DecorationIds.HeartBanner,
VictoryPartyDecorationIds = frozenset([DecorationIds.BannerVictory, DecorationIds.FlyingHeart,
DecorationIds.Hydra,
DecorationIds.BannerVictory,
DecorationIds.CannonVictory, DecorationIds.CannonVictory,
DecorationIds.CogStatueVictory, DecorationIds.CogStatueVictory,
DecorationIds.TubeCogVictory]) DecorationIds.TubeCogVictory,
DecorationIds.CogIceCreamVictory,
DecorationIds.cogIceCreamWinter,
DecorationIds.StageWinter,
DecorationIds.CogStatueWinter,
DecorationIds.snowman,
DecorationIds.snowDoodle,
DecorationIds.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, WinterPartyDecorationIds = frozenset([DecorationIds.cogIceCreamWinter,
DecorationIds.StageWinter, DecorationIds.StageWinter,
DecorationIds.CogStatueWinter, DecorationIds.CogStatueWinter,
@ -171,6 +198,7 @@ ValentinePartyDecorationIds = frozenset([DecorationIds.BalloonAnvilValentine,
DecorationIds.HeartTarget, DecorationIds.HeartTarget,
DecorationIds.FlyingHeart]) DecorationIds.FlyingHeart])
ValentinePartyReplacementDecorationIds = frozenset([DecorationIds.BalloonAnvil, DecorationIds.BannerJellyBean]) ValentinePartyReplacementDecorationIds = frozenset([DecorationIds.BalloonAnvil, DecorationIds.BannerJellyBean])
UnreleasedDecorationIds = ()
GoToPartyStatus = PythonUtil.Enum(('AllowedToGo', GoToPartyStatus = PythonUtil.Enum(('AllowedToGo',
'PartyFull', 'PartyFull',
'PrivateParty', 'PrivateParty',
@ -390,6 +418,11 @@ DecorationInformationDict = {DecorationIds.BalloonAnvil: {'cost': int(10 * Party
'numberPerPurchase': 1, 'numberPerPurchase': 1,
'limitPerParty': 5, 'limitPerParty': 5,
'gridAsset': 'decoration_1x1'}, 'gridAsset': 'decoration_1x1'},
DecorationIds.Hydra: {'cost': int(25 * PartyCostMultiplier),
'gridsize': (2, 2),
'numberPerPurchase': 1,
'limitPerParty': 5,
'gridAsset': 'decoration_propStage_2x2'},
DecorationIds.BannerVictory: {'cost': int(25 * PartyCostMultiplier), DecorationIds.BannerVictory: {'cost': int(25 * PartyCostMultiplier),
'gridsize': (1, 1), 'gridsize': (1, 1),
'numberPerPurchase': 1, 'numberPerPurchase': 1,
@ -410,6 +443,11 @@ DecorationInformationDict = {DecorationIds.BalloonAnvil: {'cost': int(10 * Party
'numberPerPurchase': 1, 'numberPerPurchase': 1,
'limitPerParty': 5, 'limitPerParty': 5,
'gridAsset': 'decoration_1x1'}, 'gridAsset': 'decoration_1x1'},
DecorationIds.CogIceCreamVictory: {'cost': int(25 * PartyCostMultiplier),
'gridsize': (1, 1),
'numberPerPurchase': 1,
'limitPerParty': 5,
'gridAsset': 'decoration_1x1'},
DecorationIds.cogIceCreamWinter: {'cost': int(25 * PartyCostMultiplier), DecorationIds.cogIceCreamWinter: {'cost': int(25 * PartyCostMultiplier),
'gridsize': (1, 1), 'gridsize': (1, 1),
'numberPerPurchase': 1, 'numberPerPurchase': 1,