def reset(self, finish = 0): if self.hasBeenReset == 1: return self.hasBeenReset = 1 self.stop() self._deleteTrack() if finish == 1: self.restore() self.toonAttackDicts = [] self.suitAttackDicts = [] self.restoreColor = 0 self.restoreHips = 0 self.restoreHeadScale = 0 self.restoreToonScale = 0 self.specialParticleEffects = [] for prop in self.renderProps: MovieUtil.removeProp(prop) self.renderProps = []
def reset(self, finish=0): if self.hasBeenReset == 1: return self.hasBeenReset = 1 self.stop() self._deleteTrack() if finish == 1: self.restore() self.toonAttackDicts = [] self.suitAttackDicts = [] self.restoreColor = 0 self.restoreHips = 0 self.restoreHeadScale = 0 self.restoreToonScale = 0 self.specialParticleEffects = [] for prop in self.renderProps: MovieUtil.removeProp(prop) self.renderProps = []
def reset(self, finish=0): if (self.hasBeenReset == 1): assert(self.notify.debug('reset() - movie was previously reset')) return self.hasBeenReset = 1 self.stop() self._deleteTrack() if (finish == 1): self.restore() self.toonAttackDicts = [] self.suitAttackDicts = [] self.restoreColor = 0 self.restoreHips = 0 self.restoreHeadScale = 0 self.restoreToonScale = 0 self.specialParticleEffects = [] for prop in self.renderProps: MovieUtil.removeProp(prop) self.renderProps = []
def restore(self): return for toon in self.battle.activeToons: toon.loop('neutral') origPos, origHpr = self.battle.getActorPosHpr(toon) toon.setPosHpr(self.battle, origPos, origHpr) hands = toon.getRightHands()[:] hands += toon.getLeftHands() for hand in hands: props = hand.getChildren() for prop in props: if prop.getName() != 'book': MovieUtil.removeProp(prop) if self.restoreColor == 1: headParts = toon.getHeadParts() torsoParts = toon.getTorsoParts() legsParts = toon.getLegsParts() partsList = [headParts, torsoParts, legsParts] for parts in partsList: for partNum in xrange(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) nextPart.clearColorScale() nextPart.clearTransparency() if self.restoreHips == 1: parts = toon.getHipsParts() for partNum in xrange(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) props = nextPart.getChildren() for prop in props: if prop.getName() == 'redtape-tube.egg': MovieUtil.removeProp(prop) if self.restoreHeadScale == 1: headScale = ToontownGlobals.toonHeadScales[ toon.style.getAnimal()] for lod in toon.getLODNames(): toon.getPart('head', lod).setScale(headScale) if self.restoreToonScale == 1: toon.setScale(1) headParts = toon.getHeadParts() for partNum in xrange(0, headParts.getNumPaths()): part = headParts.getPath(partNum) part.setHpr(0, 0, 0) part.setPos(0, 0, 0) arms = toon.findAllMatches('**/arms') sleeves = toon.findAllMatches('**/sleeves') hands = toon.findAllMatches('**/hands') for partNum in xrange(0, arms.getNumPaths()): armPart = arms.getPath(partNum) sleevePart = sleeves.getPath(partNum) handsPart = hands.getPath(partNum) armPart.setHpr(0, 0, 0) sleevePart.setHpr(0, 0, 0) handsPart.setHpr(0, 0, 0) for suit in self.battle.activeSuits: if suit._Actor__animControlDict != None: suit.loop('neutral') suit.battleTrapIsFresh = 0 origPos, origHpr = self.battle.getActorPosHpr(suit) suit.setPosHpr(self.battle, origPos, origHpr) hands = [suit.getRightHand(), suit.getLeftHand()] for hand in hands: props = hand.getChildren() for prop in props: MovieUtil.removeProp(prop) for effect in self.specialParticleEffects: if effect != None: effect.cleanup() self.specialParticleEffects = [] for prop in self.renderProps: MovieUtil.removeProp(prop) self.renderProps = [] return
def __dropObject(drop, delay, objName, level, alreadyDodged, alreadyTeased, npcs, target, npcDrops): toon = drop['toon'] repeatNPC = 0 battle = drop['battle'] if (drop.has_key('npc')): toon = drop['npc'] if (npcDrops.has_key(toon)): repeatNPC = 1 else: npcDrops[toon] = 1 origHpr = Vec3(0, 0, 0) else: origHpr = toon.getHpr(battle) hpbonus = drop['hpbonus'] suit = target['suit'] hp = target['hp'] hitSuit = (hp > 0) died = target['died'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] kbbonus = target['kbbonus'] suitPos = suit.getPos(battle) majorObject = (level >= 3) if (repeatNPC == 0): button = globalPropPool.getProp('button') buttonType = globalPropPool.getPropType('button') button2 = MovieUtil.copyProp(button) buttons = [button, button2] hands = toon.getLeftHands() object = globalPropPool.getProp(objName) objectType = globalPropPool.getPropType(objName) # The safe and weight are a bit too big if (objName == 'weight'): object.setScale(object.getScale() * 0.75) elif (objName == 'safe'): object.setScale(object.getScale() * 0.85) # The object will likely animate far from its initial bounding # volume while it drops. To work around this bug, we artificially # change the object's bounding volume to be really big. In fact, # we make it infinite, so it will never be culled while it's # onscreen. node = object.node() node.setBounds(OmniBoundingVolume()) node.setFinal(1) # create the soundTrack soundTrack = __getSoundTrack(level, hitSuit, toon) # toon pulls the button out, presses it, and puts it away toonTrack = Sequence() if (repeatNPC == 0): toonFace = Func(toon.headsUp, battle, suitPos) toonTrack.append(Wait(delay)) toonTrack.append(toonFace) toonTrack.append(ActorInterval(toon, 'pushbutton')) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, battle, origHpr)) # button scales up in toon's hand as he takes it out, and # scales down to nothing as it is put away buttonTrack = Sequence() if (repeatNPC == 0): buttonShow = Func(MovieUtil.showProps, buttons, hands) buttonScaleUp = LerpScaleInterval(button, 1.0, button.getScale(), startScale=Point3(0.01, 0.01, 0.01)) buttonScaleDown = LerpScaleInterval(button, 1.0, Point3(0.01, 0.01, 0.01), startScale=button.getScale()) buttonHide = Func(MovieUtil.removeProps, buttons) buttonTrack.append(Wait(delay)) buttonTrack.append(buttonShow) buttonTrack.append(buttonScaleUp) buttonTrack.append(Wait(2.5)) buttonTrack.append(buttonScaleDown) buttonTrack.append(buttonHide) # object appears above suit objectTrack = Sequence() def posObject(object, suit, level, majorObject, miss, battle=battle): object.reparentTo(battle) # Options for positioning a drop: # 1) Any successful drop on an unlured suit - strikes at suit battle pos # 2) Unsuccessful drops on an unlured suit that are of the largest three - # these strike behind the suit (who shouldn't dodge) # 3) The first three (smallest drops) on a lured suit strike the battle pos, # where the larger ones get bumped back a bit. if (battle.isSuitLured(suit)): # suit is lured, strike at battle position suitPos, suitHpr = battle.getActorPosHpr(suit) object.setPos(suitPos) object.setHpr(suitHpr) if (level >= 3): # bump back larger drops object.setY(object.getY() + 2) else: object.setPos(suit.getPos(battle)) object.setHpr(suit.getHpr(battle)) if (miss and level >= 3): object.setY(object.getY(battle) + 5) if not majorObject: if not miss: shoulderHeight = shoulderHeights[suit.style.body] * suit.scale object.setZ(object.getPos(battle)[2] + shoulderHeight) # fix up the Z offset of the prop object.setZ(object.getPos(battle)[2] + objZOffsets[level]) # the object will need to scale down to nothing at some point # and then it will immediately get deleted # since we already have an animation interval playing, # we need to put the scale on a separate track. # to avoid cases where the object has been deleted, # and the scale interval is still trying to scale the # object, we'll put the animation and scale intervals into # separate tracks, combine them into a track, and # put the hide interval after the track. objectTrack.append(Func(battle.movie.needRestoreRenderProp, object)) objInit = Func(posObject, object, suit, level, majorObject, (hp <= 0)) objectTrack.append(Wait(delay + tObjectAppears)) objectTrack.append(objInit) # we can assume that all drop props are animated if hp > 0 or (level == 1 or level == 2): # prop hits the suit #import pdb; pdb.set_trace() if hasattr(object, 'getAnimControls'): animProp = ActorInterval(object, objName) shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=object.getScale()) objAnimShrink = ParallelEndTogether(animProp, shrinkProp) objectTrack.append(objAnimShrink) else: # donald boat currently does not have animation startingScale = objStartingScales[level] object2 = MovieUtil.copyProp(object) posObject(object2, suit, level, majorObject, (hp <= 0)) endingPos = object2.getPos() startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5) startHpr = object2.getHpr() endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2]) animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos) shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=startingScale) bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5) #objAnimShrink = ParallelEndTogether(animProp, shrinkProp) objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp) objectTrack.append(objAnimShrink) MovieUtil.removeProp(object2) else: # prop misses the suit # only play the animation up to the point where it lands if hasattr(object, 'getAnimControls'): animProp = ActorInterval(object, objName, duration=landFrames[level] / 24.) def poseProp(prop, animName, level): prop.pose(animName, landFrames[level]) poseProp = Func(poseProp, object, objName, level) wait = Wait(1.0) shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=object.getScale()) objectTrack.append(animProp) objectTrack.append(poseProp) objectTrack.append(wait) objectTrack.append(shrinkProp) else: #donald boat currently does not have animation startingScale = objStartingScales[level] object2 = MovieUtil.copyProp(object) posObject(object2, suit, level, majorObject, (hp <= 0)) endingPos = object2.getPos() startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5) startHpr = object2.getHpr() endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2]) animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos) shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=startingScale) bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5) #objAnimShrink = ParallelEndTogether(animProp, shrinkProp) objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp) objectTrack.append(objAnimShrink) MovieUtil.removeProp(object2) objectTrack.append(Func(MovieUtil.removeProp, object)) objectTrack.append(Func(battle.movie.clearRenderProp, object)) # we will see a shadow scale up before the object drops dropShadow = MovieUtil.copyProp(suit.getShadowJoint()) if (level == 0): dropShadow.setScale(0.5) elif (level <= 2): dropShadow.setScale(0.8) elif (level == 3): dropShadow.setScale(2.0) elif (level == 4): dropShadow.setScale(2.3) else: dropShadow.setScale(3.6) def posShadow(dropShadow=dropShadow, suit=suit, battle=battle, hp=hp, level=level): dropShadow.reparentTo(battle) if (battle.isSuitLured(suit)): # suit is lured, shadow at battle position suitPos, suitHpr = battle.getActorPosHpr(suit) dropShadow.setPos(suitPos) dropShadow.setHpr(suitHpr) if (level >= 3): # bump back larger drops dropShadow.setY(dropShadow.getY() + 2) else: dropShadow.setPos(suit.getPos(battle)) dropShadow.setHpr(suit.getHpr(battle)) if (hp <= 0 and level >= 3): dropShadow.setY(dropShadow.getY(battle) + 5) # Raise the drop shadow to curb level dropShadow.setZ(dropShadow.getZ() + 0.5) shadowTrack = Sequence( Wait(delay + tButtonPressed), Func(battle.movie.needRestoreRenderProp, dropShadow), Func(posShadow), LerpScaleInterval(dropShadow, tObjectAppears - tButtonPressed, dropShadow.getScale(), startScale=Point3(0.01, 0.01, 0.01)), Wait(0.3), Func(MovieUtil.removeProp, dropShadow), Func(battle.movie.clearRenderProp, dropShadow), ) return Parallel(toonTrack, soundTrack, buttonTrack, objectTrack, shadowTrack)
def __dropObject(drop, delay, objName, level, alreadyDodged, alreadyTeased, npcs, target, npcDrops): toon = drop['toon'] repeatNPC = 0 battle = drop['battle'] if drop.has_key('npc'): toon = drop['npc'] if npcDrops.has_key(toon): repeatNPC = 1 else: npcDrops[toon] = 1 origHpr = Vec3(0, 0, 0) else: origHpr = toon.getHpr(battle) hpbonus = drop['hpbonus'] suit = target['suit'] hp = target['hp'] hitSuit = hp > 0 died = target['died'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] kbbonus = target['kbbonus'] suitPos = suit.getPos(battle) majorObject = level >= 3 if repeatNPC == 0: button = globalPropPool.getProp('button') buttonType = globalPropPool.getPropType('button') button2 = MovieUtil.copyProp(button) buttons = [button, button2] hands = toon.getLeftHands() object = globalPropPool.getProp(objName) objectType = globalPropPool.getPropType(objName) if objName == 'weight': object.setScale(object.getScale() * 0.75) elif objName == 'safe': object.setScale(object.getScale() * 0.85) node = object.node() node.setBounds(OmniBoundingVolume()) node.setFinal(1) soundTrack = __getSoundTrack(level, hitSuit, toon) toonTrack = Sequence() if repeatNPC == 0: toonFace = Func(toon.headsUp, battle, suitPos) toonTrack.append(Wait(delay)) toonTrack.append(toonFace) toonTrack.append(ActorInterval(toon, 'pushbutton')) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, battle, origHpr)) buttonTrack = Sequence() if repeatNPC == 0: buttonShow = Func(MovieUtil.showProps, buttons, hands) buttonScaleUp = LerpScaleInterval(button, 1.0, button.getScale(), startScale=Point3(0.01, 0.01, 0.01)) buttonScaleDown = LerpScaleInterval(button, 1.0, Point3(0.01, 0.01, 0.01), startScale=button.getScale()) buttonHide = Func(MovieUtil.removeProps, buttons) buttonTrack.append(Wait(delay)) buttonTrack.append(buttonShow) buttonTrack.append(buttonScaleUp) buttonTrack.append(Wait(2.5)) buttonTrack.append(buttonScaleDown) buttonTrack.append(buttonHide) objectTrack = Sequence() def posObject(object, suit, level, majorObject, miss, battle=battle): object.reparentTo(battle) if battle.isSuitLured(suit): suitPos, suitHpr = battle.getActorPosHpr(suit) object.setPos(suitPos) object.setHpr(suitHpr) if level >= 3: object.setY(object.getY() + 2) else: object.setPos(suit.getPos(battle)) object.setHpr(suit.getHpr(battle)) if miss and level >= 3: object.setY(object.getY(battle) + 5) if not majorObject: if not miss: shoulderHeight = shoulderHeights[suit.style.body] * suit.scale object.setZ(object.getPos(battle)[2] + shoulderHeight) object.setZ(object.getPos(battle)[2] + objZOffsets[level]) objectTrack.append(Func(battle.movie.needRestoreRenderProp, object)) objInit = Func(posObject, object, suit, level, majorObject, hp <= 0) objectTrack.append(Wait(delay + tObjectAppears)) objectTrack.append(objInit) if hp > 0 or level == 1 or level == 2: if hasattr(object, 'getAnimControls'): animProp = ActorInterval(object, objName) shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=object.getScale()) objAnimShrink = ParallelEndTogether(animProp, shrinkProp) objectTrack.append(objAnimShrink) else: startingScale = objStartingScales[level] object2 = MovieUtil.copyProp(object) posObject(object2, suit, level, majorObject, hp <= 0) endingPos = object2.getPos() startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5) startHpr = object2.getHpr() endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2]) animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos) shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=startingScale) bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5) objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp) objectTrack.append(objAnimShrink) MovieUtil.removeProp(object2) elif hasattr(object, 'getAnimControls'): animProp = ActorInterval(object, objName, duration=landFrames[level] / 24.0) def poseProp(prop, animName, level): prop.pose(animName, landFrames[level]) poseProp = Func(poseProp, object, objName, level) wait = Wait(1.0) shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=object.getScale()) objectTrack.append(animProp) objectTrack.append(poseProp) objectTrack.append(wait) objectTrack.append(shrinkProp) else: startingScale = objStartingScales[level] object2 = MovieUtil.copyProp(object) posObject(object2, suit, level, majorObject, hp <= 0) endingPos = object2.getPos() startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5) startHpr = object2.getHpr() endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2]) animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos) shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=startingScale) bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5) objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp) objectTrack.append(objAnimShrink) MovieUtil.removeProp(object2) objectTrack.append(Func(MovieUtil.removeProp, object)) objectTrack.append(Func(battle.movie.clearRenderProp, object)) dropShadow = MovieUtil.copyProp(suit.getShadowJoint()) if level == 0: dropShadow.setScale(0.5) elif level <= 2: dropShadow.setScale(0.8) elif level == 3: dropShadow.setScale(2.0) elif level == 4: dropShadow.setScale(2.3) else: dropShadow.setScale(3.6) def posShadow(dropShadow=dropShadow, suit=suit, battle=battle, hp=hp, level=level): dropShadow.reparentTo(battle) if battle.isSuitLured(suit): suitPos, suitHpr = battle.getActorPosHpr(suit) dropShadow.setPos(suitPos) dropShadow.setHpr(suitHpr) if level >= 3: dropShadow.setY(dropShadow.getY() + 2) else: dropShadow.setPos(suit.getPos(battle)) dropShadow.setHpr(suit.getHpr(battle)) if hp <= 0 and level >= 3: dropShadow.setY(dropShadow.getY(battle) + 5) dropShadow.setZ(dropShadow.getZ() + 0.5) shadowTrack = Sequence( Wait(delay + tButtonPressed), Func(battle.movie.needRestoreRenderProp, dropShadow), Func(posShadow), LerpScaleInterval(dropShadow, tObjectAppears - tButtonPressed, dropShadow.getScale(), startScale=Point3(0.01, 0.01, 0.01)), Wait(0.3), Func(MovieUtil.removeProp, dropShadow), Func(battle.movie.clearRenderProp, dropShadow)) return Parallel(toonTrack, soundTrack, buttonTrack, objectTrack, shadowTrack)
def restore(self): return for toon in self.battle.activeToons: toon.loop('neutral') origPos, origHpr = self.battle.getActorPosHpr(toon) toon.setPosHpr(self.battle, origPos, origHpr) hands = toon.getRightHands()[:] hands += toon.getLeftHands() for hand in hands: props = hand.getChildren() for prop in props: if prop.getName() != 'book': MovieUtil.removeProp(prop) if self.restoreColor == 1: headParts = toon.getHeadParts() torsoParts = toon.getTorsoParts() legsParts = toon.getLegsParts() partsList = [headParts, torsoParts, legsParts] for parts in partsList: for partNum in xrange(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) nextPart.clearColorScale() nextPart.clearTransparency() if self.restoreHips == 1: parts = toon.getHipsParts() for partNum in xrange(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) props = nextPart.getChildren() for prop in props: if prop.getName() == 'redtape-tube.egg': MovieUtil.removeProp(prop) if self.restoreHeadScale == 1: headScale = ToontownGlobals.toonHeadScales[toon.style.getAnimal()] for lod in toon.getLODNames(): toon.getPart('head', lod).setScale(headScale) if self.restoreToonScale == 1: toon.setScale(1) headParts = toon.getHeadParts() for partNum in xrange(0, headParts.getNumPaths()): part = headParts.getPath(partNum) part.setHpr(0, 0, 0) part.setPos(0, 0, 0) arms = toon.findAllMatches('**/arms') sleeves = toon.findAllMatches('**/sleeves') hands = toon.findAllMatches('**/hands') for partNum in xrange(0, arms.getNumPaths()): armPart = arms.getPath(partNum) sleevePart = sleeves.getPath(partNum) handsPart = hands.getPath(partNum) armPart.setHpr(0, 0, 0) sleevePart.setHpr(0, 0, 0) handsPart.setHpr(0, 0, 0) for suit in self.battle.activeSuits: if suit._Actor__animControlDict != None: suit.loop('neutral') suit.battleTrapIsFresh = 0 origPos, origHpr = self.battle.getActorPosHpr(suit) suit.setPosHpr(self.battle, origPos, origHpr) hands = [suit.getRightHand(), suit.getLeftHand()] for hand in hands: props = hand.getChildren() for prop in props: MovieUtil.removeProp(prop) for effect in self.specialParticleEffects: if effect != None: effect.cleanup() self.specialParticleEffects = [] for prop in self.renderProps: MovieUtil.removeProp(prop) self.renderProps = [] return
def __dropObject(drop, delay, objName, level, alreadyDodged, alreadyTeased, npcs, target, npcDrops): toon = drop['toon'] repeatNPC = 0 battle = drop['battle'] if 'npc' in drop: toon = drop['npc'] if toon in npcDrops: repeatNPC = 1 else: npcDrops[toon] = 1 origHpr = Vec3(0, 0, 0) else: origHpr = toon.getHpr(battle) hpbonus = drop['hpbonus'] suit = target['suit'] hp = target['hp'] hitSuit = hp > 0 died = target['died'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] kbbonus = target['kbbonus'] suitPos = suit.getPos(battle) majorObject = level >= 3 if repeatNPC == 0: button = globalPropPool.getProp('button') buttonType = globalPropPool.getPropType('button') button2 = MovieUtil.copyProp(button) buttons = [button, button2] hands = toon.getLeftHands() object = globalPropPool.getProp(objName) objectType = globalPropPool.getPropType(objName) if objName == 'weight': object.setScale(object.getScale() * 0.75) elif objName == 'safe': object.setScale(object.getScale() * 0.85) node = object.node() node.setBounds(OmniBoundingVolume()) node.setFinal(1) soundTrack = __getSoundTrack(level, hitSuit, toon) toonTrack = Sequence() if repeatNPC == 0: toonFace = Func(toon.headsUp, battle, suitPos) toonTrack.append(Wait(delay)) toonTrack.append(toonFace) toonTrack.append(ActorInterval(toon, 'pushbutton')) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, battle, origHpr)) buttonTrack = Sequence() if repeatNPC == 0: buttonShow = Func(MovieUtil.showProps, buttons, hands) buttonScaleUp = LerpScaleInterval(button, 1.0, button.getScale(), startScale=Point3(0.01, 0.01, 0.01)) buttonScaleDown = LerpScaleInterval(button, 1.0, Point3(0.01, 0.01, 0.01), startScale=button.getScale()) buttonHide = Func(MovieUtil.removeProps, buttons) buttonTrack.append(Wait(delay)) buttonTrack.append(buttonShow) buttonTrack.append(buttonScaleUp) buttonTrack.append(Wait(2.5)) buttonTrack.append(buttonScaleDown) buttonTrack.append(buttonHide) objectTrack = Sequence() def posObject(object, suit, level, majorObject, miss, battle = battle): object.reparentTo(battle) if battle.isSuitLured(suit): suitPos, suitHpr = battle.getActorPosHpr(suit) object.setPos(suitPos) object.setHpr(suitHpr) if level >= 3: object.setY(object.getY() + 2) else: object.setPos(suit.getPos(battle)) object.setHpr(suit.getHpr(battle)) if miss and level >= 3: object.setY(object.getY(battle) + 5) if not majorObject: if not miss: shoulderHeight = shoulderHeights[suit.style.body] * suit.scale object.setZ(object.getPos(battle)[2] + shoulderHeight) object.setZ(object.getPos(battle)[2] + objZOffsets[level]) objectTrack.append(Func(battle.movie.needRestoreRenderProp, object)) objInit = Func(posObject, object, suit, level, majorObject, hp <= 0) objectTrack.append(Wait(delay + tObjectAppears)) objectTrack.append(objInit) if hp > 0 or level == 1 or level == 2: if hasattr(object, 'getAnimControls'): animProp = ActorInterval(object, objName) shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=object.getScale()) objAnimShrink = ParallelEndTogether(animProp, shrinkProp) objectTrack.append(objAnimShrink) else: startingScale = objStartingScales[level] object2 = MovieUtil.copyProp(object) posObject(object2, suit, level, majorObject, hp <= 0) endingPos = object2.getPos() startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5) startHpr = object2.getHpr() endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2]) animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos) shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=startingScale) bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5) objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp) objectTrack.append(objAnimShrink) MovieUtil.removeProp(object2) elif hasattr(object, 'getAnimControls'): animProp = ActorInterval(object, objName, duration=landFrames[level] / 24.0) def poseProp(prop, animName, level): prop.pose(animName, landFrames[level]) poseProp = Func(poseProp, object, objName, level) wait = Wait(1.0) shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=object.getScale()) objectTrack.append(animProp) objectTrack.append(poseProp) objectTrack.append(wait) objectTrack.append(shrinkProp) else: startingScale = objStartingScales[level] object2 = MovieUtil.copyProp(object) posObject(object2, suit, level, majorObject, hp <= 0) endingPos = object2.getPos() startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5) startHpr = object2.getHpr() endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2]) animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos) shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=startingScale) bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5) objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp) objectTrack.append(objAnimShrink) MovieUtil.removeProp(object2) objectTrack.append(Func(MovieUtil.removeProp, object)) objectTrack.append(Func(battle.movie.clearRenderProp, object)) dropShadow = MovieUtil.copyProp(suit.getShadowJoint()) if level == 0: dropShadow.setScale(0.5) elif level <= 2: dropShadow.setScale(0.8) elif level == 3: dropShadow.setScale(2.0) elif level == 4: dropShadow.setScale(2.3) else: dropShadow.setScale(3.6) def posShadow(dropShadow = dropShadow, suit = suit, battle = battle, hp = hp, level = level): dropShadow.reparentTo(battle) if battle.isSuitLured(suit): suitPos, suitHpr = battle.getActorPosHpr(suit) dropShadow.setPos(suitPos) dropShadow.setHpr(suitHpr) if level >= 3: dropShadow.setY(dropShadow.getY() + 2) else: dropShadow.setPos(suit.getPos(battle)) dropShadow.setHpr(suit.getHpr(battle)) if hp <= 0 and level >= 3: dropShadow.setY(dropShadow.getY(battle) + 5) dropShadow.setZ(dropShadow.getZ() + 0.5) shadowTrack = Sequence(Wait(delay + tButtonPressed), Func(battle.movie.needRestoreRenderProp, dropShadow), Func(posShadow), LerpScaleInterval(dropShadow, tObjectAppears - tButtonPressed, dropShadow.getScale(), startScale=Point3(0.01, 0.01, 0.01)), Wait(0.3), Func(MovieUtil.removeProp, dropShadow), Func(battle.movie.clearRenderProp, dropShadow)) return Parallel(toonTrack, soundTrack, buttonTrack, objectTrack, shadowTrack)
def restore(self): """ This method should be called when the movie needs to be terminated early and we need to restore any toons to the state that they would be in if the movie had continued """ # Speculation: all this work is no longer needed now that # interval.finish() guarantees completion. return assert(self.notify.debug('restore()')) for toon in self.battle.activeToons: # Undo any change in animation toon.loop('neutral') # Undo any change in position origPos, origHpr = self.battle.getActorPosHpr(toon) toon.setPosHpr(self.battle, origPos, origHpr) # Remove any props from the toon's hands hands = toon.getRightHands()[:] hands += toon.getLeftHands() for hand in hands: props = hand.getChildren() for prop in props: # Don't remove the sticker book! if (prop.getName() != 'book'): MovieUtil.removeProp(prop) # Undo FillWithLead, HotAir, Fired, Withdrawal, RubOut, # FountainPen if (self.restoreColor == 1): assert(self.notify.debug('restore color for toon: %d' % \ toon.doId)) headParts = toon.getHeadParts() torsoParts = toon.getTorsoParts() legsParts = toon.getLegsParts() partsList = [headParts, torsoParts, legsParts] for parts in partsList: for partNum in range(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) nextPart.clearColorScale() nextPart.clearTransparency() # Undo RedTape if (self.restoreHips == 1): assert(self.notify.debug('restore hips for toon: %d' % \ toon.doId)) parts = toon.getHipsParts() for partNum in range(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) props = nextPart.getChildren() for prop in props: if (prop.getName() == 'redtape-tube.egg'): MovieUtil.removeProp(prop) # Unshrink HeadShrink if (self.restoreHeadScale == 1): assert(self.notify.debug('restore head scale for toon: %d' % \ toon.doId)) headScale = ToontownGlobals.toonHeadScales[toon.style.getAnimal()] for lod in toon.getLODNames(): toon.getPart('head', lod).setScale(headScale) # Unshrink Downsize, restore toon back to proportion (1) if (self.restoreToonScale == 1): assert(self.notify.debug('restore toon scale for toon: %d' % \ toon.doId)) toon.setScale(1) # In case the toon's head or arm parts have been altered, as with ReOrg, # we restore those values # Undo ReOrg of head parts, restore toon head parts back to correct places assert(self.notify.debug('restore toon head parts for toon: %d' % toon.doId)) # Restore the position and hpr of the parts of the head, which # were originally pos = 0, 0, 0 and hpr = -18.435, 0, 0 headParts = toon.getHeadParts() for partNum in range(0, headParts.getNumPaths()): part = headParts.getPath(partNum) part.setHpr(0, 0, 0)#, startHpr = part.getHpr()) part.setPos(0, 0, 0) assert(self.notify.debug('restore toon arm parts for toon: %d' % toon.doId)) # Now restore the hpr on the arm, sleeve, and hand parts, # which were all originally hpr = 0, 0, 0 arms = toon.findAllMatches('**/arms') sleeves = toon.findAllMatches('**/sleeves') hands = toon.findAllMatches('**/hands') for partNum in range(0, arms.getNumPaths()): armPart = arms.getPath(partNum) sleevePart = sleeves.getPath(partNum) handsPart = hands.getPath(partNum) armPart.setHpr(0, 0, 0) sleevePart.setHpr(0, 0, 0) handsPart.setHpr(0, 0, 0) for suit in self.battle.activeSuits: # Kludgey hack around mystery crash. Why are we cleaning up # suits in this case anyway? if suit._Actor__animControlDict != None: # Undo any change in animation suit.loop('neutral') # A trap prop is no longer fresh suit.battleTrapIsFresh = 0 # Undo any change in position origPos, origHpr = self.battle.getActorPosHpr(suit) suit.setPosHpr(self.battle, origPos, origHpr) # Remove any props from the suit's hands hands = [suit.getRightHand(), suit.getLeftHand()] for hand in hands: props = hand.getChildren() for prop in props: MovieUtil.removeProp(prop) # Clean up any special particle effects # RazzleDazzle, Rolodex for effect in self.specialParticleEffects: if (effect != None): assert(self.notify.debug('restore particle effect: %s' % \ effect.getName())) effect.cleanup() self.specialParticleEffects = [] # Remove any props that are parented to render for prop in self.renderProps: MovieUtil.removeProp(prop) self.renderProps = []