def __propPreflight(props, suit, toon, battle): prop = props[0] toon.update(0) prop.wrtReparentTo(battle) props[1].reparentTo(hidden) for ci in range(prop.getNumChildren()): prop.getChild(ci).setHpr(0, -90, 0) targetPnt = MovieUtil.avatarFacePoint(suit, other=battle) prop.lookAt(targetPnt)
def __propPreflight(props, suit, toon, battle): prop = props[0] toon.update(0) prop.wrtReparentTo(battle) props[1].reparentTo(hidden) for ci in xrange(prop.getNumChildren()): prop.getChild(ci).setHpr(0, -90, 0) targetPnt = MovieUtil.avatarFacePoint(suit, other=battle) prop.lookAt(targetPnt)
def __propPreflightGroup(props, suits, toon, battle): prop = props[0] toon.update(0) prop.wrtReparentTo(battle) props[1].reparentTo(hidden) for ci in range(prop.getNumChildren()): prop.getChild(ci).setHpr(0, -90, 0) avgTargetPt = Point3(0, 0, 0) for suit in suits: avgTargetPt += MovieUtil.avatarFacePoint(suit, other=battle) avgTargetPt /= len(suits) prop.lookAt(avgTargetPt)
def __propPreflightGroup(props, suits, toon, battle): prop = props[0] toon.update(0) prop.wrtReparentTo(battle) props[1].reparentTo(hidden) for ci in xrange(prop.getNumChildren()): prop.getChild(ci).setHpr(0, -90, 0) avgTargetPt = Point3(0, 0, 0) for suit in suits: avgTargetPt += MovieUtil.avatarFacePoint(suit, other=battle) avgTargetPt /= len(suits) prop.lookAt(avgTargetPt)
def __propPreflight(props, suit, toon, battle): assert (len(props) >= 2) prop = props[0] # make sure the 0 lod toon is in the right pose of the animation toon.update(0) # take the prop from the toon prop.wrtReparentTo(battle) props[1].reparentTo(hidden) # make the top of the pie point along +Y for ci in range(prop.getNumChildren()): prop.getChild(ci).setHpr(0, -90, 0) # figure out where it's going to end up targetPnt = MovieUtil.avatarFacePoint(suit, other=battle) # make the pie point towards the suit's face prop.lookAt(targetPnt)
def __propPreflightGroup(props, suits, toon, battle): """ same as __propPreflight, but face the avg suit pt """ assert (len(props) >= 2) prop = props[0] # make sure the 0 lod toon is in the right pose of the animation toon.update(0) # take the prop from the toon prop.wrtReparentTo(battle) props[1].reparentTo(hidden) # make the top of the pie point along +Y for ci in range(prop.getNumChildren()): prop.getChild(ci).setHpr(0, -90, 0) # figure out where it's going to end up avgTargetPt = Point3(0, 0, 0) for suit in suits: avgTargetPt += MovieUtil.avatarFacePoint(suit, other=battle) avgTargetPt /= len(suits) # make the pie point towards the suit's face prop.lookAt(avgTargetPt)
def __createWeddingCakeFlight(throw, groupHitDict, pie, pies): toon = throw['toon'] battle = throw['battle'] level = throw['level'] sidestep = throw['sidestep'] hpbonus = throw['hpbonus'] numTargets = len(throw['target']) pieName = pieNames[level] splatName = 'splat-' + pieName if pieName == 'wedding-cake': splatName = 'splat-birthday-cake' splat = globalPropPool.getProp(splatName) splats = [splat] for i in range(numTargets - 1): splats.append(MovieUtil.copyProp(splat)) splatType = globalPropPool.getPropType(splatName) cakePartStrs = ['cake1', 'cake2', 'cake3', 'caketop'] cakeParts = [] for part in cakePartStrs: cakeParts.append(pie.find('**/%s' % part)) cakePartDivisions = { 1: [[cakeParts[0], cakeParts[1], cakeParts[2], cakeParts[3]]], 2: [[cakeParts[0], cakeParts[1]], [cakeParts[2], cakeParts[3]]], 3: [[cakeParts[0], cakeParts[1]], [cakeParts[2]], [cakeParts[3]]], 4: [[cakeParts[0]], [cakeParts[1]], [cakeParts[2]], [cakeParts[3]]] } cakePartDivToUse = cakePartDivisions[len(throw['target'])] groupPieTracks = Parallel() for i in range(numTargets): target = throw['target'][i] suit = target['suit'] hitSuit = target['hp'] > 0 singlePieTrack = Sequence() if hitSuit: piePartReparent = Func(reparentCakePart, pie, cakePartDivToUse[i]) singlePieTrack.append(piePartReparent) cakePartTrack = Parallel() for cakePart in cakePartDivToUse[i]: pieFly = LerpPosInterval(cakePart, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint( suit, other=battle), name=pieFlyTaskName, other=battle) cakePartTrack.append(pieFly) singlePieTrack.append(cakePartTrack) pieRemoveCakeParts = Func(MovieUtil.removeProps, cakePartDivToUse[i]) pieHide = Func(MovieUtil.removeProps, pies) splatShow = Func(__showProp, splats[i], suit, Point3(0, 0, suit.getHeight())) splatBillboard = Func(__billboardProp, splats[i]) splatAnim = ActorInterval(splats[i], splatName) splatHide = Func(MovieUtil.removeProp, splats[i]) singlePieTrack.append(pieRemoveCakeParts) singlePieTrack.append(pieHide) singlePieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) singlePieTrack.append(splatShow) singlePieTrack.append(splatBillboard) singlePieTrack.append(splatAnim) singlePieTrack.append(splatHide) else: missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePartReparent = Func(reparentCakePart, pie, cakePartDivToUse[i]) piePreMiss = Func(__piePreMissGroup, missDict, cakePartDivToUse[i], suitPoint, battle) pieMiss = LerpFunctionInterval( __pieMissGroupLerpCallback, extraArgs=[missDict], duration=(tPieHitsSuit - tPieLeavesHand) * ratioMissToHit) pieHide = Func(MovieUtil.removeProps, pies) pieRemoveCakeParts = Func(MovieUtil.removeProps, cakePartDivToUse[i]) singlePieTrack.append(piePartReparent) singlePieTrack.append(piePreMiss) singlePieTrack.append(pieMiss) singlePieTrack.append(pieRemoveCakeParts) singlePieTrack.append(pieHide) singlePieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) groupPieTracks.append(singlePieTrack) return groupPieTracks
def __throwPie(throw, delay, hitCount): toon = throw['toon'] hpbonus = throw['hpbonus'] target = throw['target'] suit = target['suit'] hp = target['hp'] kbbonus = target['kbbonus'] sidestep = throw['sidestep'] died = target['died'] revived = target['revived'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] level = throw['level'] battle = throw['battle'] suitPos = suit.getPos(battle) origHpr = toon.getHpr(battle) notify.debug('toon: %s throws tart at suit: %d for hp: %d died: %d' % (toon.getName(), suit.doId, hp, died)) pieName = pieNames[level] hitSuit = hp > 0 pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() splatName = 'splat-' + pieName if pieName == 'wedding-cake': splatName = 'splat-birthday-cake' splat = globalPropPool.getProp(splatName) splatType = globalPropPool.getPropType(splatName) toonTrack = Sequence() toonFace = Func(toon.headsUp, battle, suitPos) toonTrack.append(Wait(delay)) toonTrack.append(toonFace) toonTrack.append(ActorInterval(toon, 'throw')) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, battle, origHpr)) pieShow = Func(MovieUtil.showProps, pies, hands) pieAnim = Func(__animProp, pies, pieName, pieType) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale = Parallel(pieScale1, pieScale2) piePreflight = Func(__propPreflight, pies, suit, toon, battle) pieTrack = Sequence(Wait(delay), pieShow, pieAnim, pieScale, Func(battle.movie.needRestoreRenderProp, pies[0]), Wait(tPieLeavesHand - 1.0), piePreflight) soundTrack = __getSoundTrack(level, hitSuit, toon) if hitSuit: pieFly = LerpPosInterval(pie, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint(suit, other=battle), name=pieFlyTaskName, other=battle) pieHide = Func(MovieUtil.removeProps, pies) splatShow = Func(__showProp, splat, suit, Point3(0, 0, suit.getHeight())) splatBillboard = Func(__billboardProp, splat) splatAnim = ActorInterval(splat, splatName) splatHide = Func(MovieUtil.removeProp, splat) pieTrack.append(pieFly) pieTrack.append(pieHide) pieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) pieTrack.append(splatShow) pieTrack.append(splatBillboard) pieTrack.append(splatAnim) pieTrack.append(splatHide) else: missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePreMiss = Func(__piePreMiss, missDict, pie, suitPoint, battle) pieMiss = LerpFunctionInterval( __pieMissLerpCallback, extraArgs=[missDict], duration=(tPieHitsSuit - tPieLeavesHand) * ratioMissToHit) pieHide = Func(MovieUtil.removeProps, pies) pieTrack.append(piePreMiss) pieTrack.append(pieMiss) pieTrack.append(pieHide) pieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) if hitSuit: suitResponseTrack = Sequence() showDamage = Func(suit.showHpText, -hp, openEnded=0, attackTrack=THROW_TRACK) updateHealthBar = Func(suit.updateHealthBar, hp) sival = [] if kbbonus > 0: suitPos, suitHpr = battle.getActorPosHpr(suit) suitType = getSuitBodyType(suit.getStyleName()) animTrack = Sequence() animTrack.append( ActorInterval(suit, 'pie-small-react', duration=0.2)) if suitType == 'a': animTrack.append( ActorInterval(suit, 'slip-forward', startTime=2.43)) elif suitType == 'b': animTrack.append( ActorInterval(suit, 'slip-forward', startTime=1.94)) elif suitType == 'c': animTrack.append( ActorInterval(suit, 'slip-forward', startTime=2.58)) animTrack.append(Func(battle.unlureSuit, suit)) moveTrack = Sequence( Wait(0.2), LerpPosInterval(suit, 0.6, pos=suitPos, other=battle)) sival = Parallel(animTrack, moveTrack) elif hitCount == 1: sival = Parallel(ActorInterval(suit, 'pie-small-react'), MovieUtil.createSuitStunInterval(suit, 0.3, 1.3)) else: sival = ActorInterval(suit, 'pie-small-react') suitResponseTrack.append(Wait(delay + tPieHitsSuit)) suitResponseTrack.append(showDamage) suitResponseTrack.append(updateHealthBar) notify.warning('Current HP:' + str(hp)) suitResponseTrack.append(sival) bonusTrack = Sequence(Wait(delay + tPieHitsSuit)) if kbbonus > 0: bonusTrack.append(Wait(0.75)) bonusTrack.append( Func(suit.showHpText, -kbbonus, 2, openEnded=0, attackTrack=THROW_TRACK)) bonusTrack.append(Func(suit.updateHealthBar, kbbonus)) if hpbonus > 0: bonusTrack.append(Wait(0.75)) bonusTrack.append( Func(suit.showHpText, -hpbonus, 1, openEnded=0, attackTrack=THROW_TRACK)) bonusTrack.append(Func(suit.updateHealthBar, kbbonus)) if revived != 0: suitResponseTrack.append( MovieUtil.createSuitReviveTrack(suit, toon, battle)) elif died != 0: suitResponseTrack.append( MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: suitResponseTrack.append(Func(suit.loop, 'neutral')) suitResponseTrack = Parallel(suitResponseTrack, bonusTrack) else: suitResponseTrack = MovieUtil.createSuitDodgeMultitrack( delay + tSuitDodges, suit, leftSuits, rightSuits) if not hitSuit and delay > 0: return [toonTrack, soundTrack, pieTrack] else: return [toonTrack, soundTrack, pieTrack, suitResponseTrack]
def __createWeddingCakeFlight(throw, groupHitDict, pie, pies): toon = throw['toon'] battle = throw['battle'] level = throw['level'] sidestep = throw['sidestep'] hpbonus = throw['hpbonus'] numTargets = len(throw['target']) pieName = pieNames[level] splatName = 'splat-' + pieName if pieName == 'wedding-cake': splatName = 'splat-birthday-cake' splat = globalPropPool.getProp(splatName) splats = [splat] for i in xrange(numTargets - 1): splats.append(MovieUtil.copyProp(splat)) splatType = globalPropPool.getPropType(splatName) cakePartStrs = ['cake1', 'cake2', 'cake3', 'caketop'] cakeParts = [] for part in cakePartStrs: cakeParts.append(pie.find('**/%s' % part)) cakePartDivisions = {} cakePartDivisions[1] = [[cakeParts[0], cakeParts[1], cakeParts[2], cakeParts[3]]] cakePartDivisions[2] = [[cakeParts[0], cakeParts[1]], [cakeParts[2], cakeParts[3]]] cakePartDivisions[3] = [[cakeParts[0], cakeParts[1]], [cakeParts[2]], [cakeParts[3]]] cakePartDivisions[4] = [[cakeParts[0]], [cakeParts[1]], [cakeParts[2]], [cakeParts[3]]] cakePartDivToUse = cakePartDivisions[len(throw['target'])] groupPieTracks = Parallel() for i in xrange(numTargets): target = throw['target'][i] suit = target['suit'] hitSuit = target['hp'] > 0 singlePieTrack = Sequence() if hitSuit: piePartReparent = Func(reparentCakePart, pie, cakePartDivToUse[i]) singlePieTrack.append(piePartReparent) cakePartTrack = Parallel() for cakePart in cakePartDivToUse[i]: pieFly = LerpPosInterval(cakePart, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint(suit, other=battle), name=pieFlyTaskName, other=battle) cakePartTrack.append(pieFly) singlePieTrack.append(cakePartTrack) pieRemoveCakeParts = Func(MovieUtil.removeProps, cakePartDivToUse[i]) pieHide = Func(MovieUtil.removeProps, pies) splatShow = Func(__showProp, splats[i], suit, Point3(0, 0, suit.getHeight())) splatBillboard = Func(__billboardProp, splats[i]) splatAnim = ActorInterval(splats[i], splatName) splatHide = Func(MovieUtil.removeProp, splats[i]) singlePieTrack.append(pieRemoveCakeParts) singlePieTrack.append(pieHide) singlePieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) singlePieTrack.append(splatShow) singlePieTrack.append(splatBillboard) singlePieTrack.append(splatAnim) singlePieTrack.append(splatHide) else: missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePartReparent = Func(reparentCakePart, pie, cakePartDivToUse[i]) piePreMiss = Func(__piePreMissGroup, missDict, cakePartDivToUse[i], suitPoint, battle) pieMiss = LerpFunctionInterval(__pieMissGroupLerpCallback, extraArgs=[missDict], duration=(tPieHitsSuit - tPieLeavesHand) * ratioMissToHit) pieHide = Func(MovieUtil.removeProps, pies) pieRemoveCakeParts = Func(MovieUtil.removeProps, cakePartDivToUse[i]) singlePieTrack.append(piePartReparent) singlePieTrack.append(piePreMiss) singlePieTrack.append(pieMiss) singlePieTrack.append(pieRemoveCakeParts) singlePieTrack.append(pieHide) singlePieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) groupPieTracks.append(singlePieTrack) return groupPieTracks
def __throwPie(throw, delay, hitCount): toon = throw['toon'] hpbonus = throw['hpbonus'] target = throw['target'] suit = target['suit'] hp = target['hp'] kbbonus = target['kbbonus'] sidestep = throw['sidestep'] died = target['died'] revived = target['revived'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] level = throw['level'] battle = throw['battle'] suitPos = suit.getPos(battle) origHpr = toon.getHpr(battle) notify.debug('toon: %s throws tart at suit: %d for hp: %d died: %d' % (toon.getName(), suit.doId, hp, died)) pieName = pieNames[level] hitSuit = hp > 0 pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() splatName = 'splat-' + pieName if pieName == 'wedding-cake': splatName = 'splat-birthday-cake' splat = globalPropPool.getProp(splatName) splatType = globalPropPool.getPropType(splatName) toonTrack = Sequence() toonFace = Func(toon.headsUp, battle, suitPos) toonTrack.append(Wait(delay)) toonTrack.append(toonFace) toonTrack.append(ActorInterval(toon, 'throw')) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, battle, origHpr)) pieShow = Func(MovieUtil.showProps, pies, hands) pieAnim = Func(__animProp, pies, pieName, pieType) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale = Parallel(pieScale1, pieScale2) piePreflight = Func(__propPreflight, pies, suit, toon, battle) pieTrack = Sequence(Wait(delay), pieShow, pieAnim, pieScale, Func(battle.movie.needRestoreRenderProp, pies[0]), Wait(tPieLeavesHand - 1.0), piePreflight) soundTrack = __getSoundTrack(level, hitSuit, toon) if hitSuit: pieFly = LerpPosInterval(pie, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint(suit, other=battle), name=pieFlyTaskName, other=battle) pieHide = Func(MovieUtil.removeProps, pies) splatShow = Func(__showProp, splat, suit, Point3(0, 0, suit.getHeight())) splatBillboard = Func(__billboardProp, splat) splatAnim = ActorInterval(splat, splatName) splatHide = Func(MovieUtil.removeProp, splat) pieTrack.append(pieFly) pieTrack.append(pieHide) pieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) pieTrack.append(splatShow) pieTrack.append(splatBillboard) pieTrack.append(splatAnim) pieTrack.append(splatHide) else: missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePreMiss = Func(__piePreMiss, missDict, pie, suitPoint, battle) pieMiss = LerpFunctionInterval(__pieMissLerpCallback, extraArgs=[missDict], duration=(tPieHitsSuit - tPieLeavesHand) * ratioMissToHit) pieHide = Func(MovieUtil.removeProps, pies) pieTrack.append(piePreMiss) pieTrack.append(pieMiss) pieTrack.append(pieHide) pieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) if hitSuit: suitResponseTrack = Sequence() showDamage = Func(suit.showHpText, -hp, openEnded=0, attackTrack=THROW_TRACK) updateHealthBar = Func(suit.updateHealthBar, hp) sival = [] if kbbonus > 0: suitPos, suitHpr = battle.getActorPosHpr(suit) suitType = getSuitBodyType(suit.getStyleName()) animTrack = Sequence() animTrack.append(ActorInterval(suit, 'pie-small-react', duration=0.2)) if suitType == 'a': animTrack.append(ActorInterval(suit, 'slip-forward', startTime=2.43)) elif suitType == 'b': animTrack.append(ActorInterval(suit, 'slip-forward', startTime=1.94)) elif suitType == 'c': animTrack.append(ActorInterval(suit, 'slip-forward', startTime=2.58)) animTrack.append(Func(battle.unlureSuit, suit)) moveTrack = Sequence(Wait(0.2), LerpPosInterval(suit, 0.6, pos=suitPos, other=battle)) sival = Parallel(animTrack, moveTrack) elif hitCount == 1: sival = Parallel(ActorInterval(suit, 'pie-small-react'), MovieUtil.createSuitStunInterval(suit, 0.3, 1.3)) else: sival = ActorInterval(suit, 'pie-small-react') suitResponseTrack.append(Wait(delay + tPieHitsSuit)) suitResponseTrack.append(showDamage) suitResponseTrack.append(updateHealthBar) suitResponseTrack.append(sival) bonusTrack = Sequence(Wait(delay + tPieHitsSuit)) if kbbonus > 0: bonusTrack.append(Wait(0.75)) bonusTrack.append(Func(suit.showHpText, -kbbonus, 2, openEnded=0, attackTrack=THROW_TRACK)) if hpbonus > 0: bonusTrack.append(Wait(0.75)) bonusTrack.append(Func(suit.showHpText, -hpbonus, 1, openEnded=0, attackTrack=THROW_TRACK)) if revived != 0: suitResponseTrack.append(MovieUtil.createSuitReviveTrack(suit, toon, battle)) elif died != 0: suitResponseTrack.append(MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: suitResponseTrack.append(Func(suit.loop, 'neutral')) suitResponseTrack = Parallel(suitResponseTrack, bonusTrack) else: suitResponseTrack = MovieUtil.createSuitDodgeMultitrack(delay + tSuitDodges, suit, leftSuits, rightSuits) if not hitSuit and delay > 0: return [toonTrack, soundTrack, pieTrack] else: return [toonTrack, soundTrack, pieTrack, suitResponseTrack]
def __createWeddingCakeFlight(throw, groupHitDict, pie, pies): toon = throw['toon'] battle = throw['battle'] level = throw['level'] sidestep = throw['sidestep'] hpbonus = throw['hpbonus'] numTargets = len(throw['target']) pieName = pieNames[level] #so loop through our targets, and throw 1 layer of the wedding cake at each one splatName = 'splat-' + pieName if pieName == 'wedding-cake': splatName = 'splat-birthday-cake' splat = globalPropPool.getProp(splatName) splats = [splat] for i in range(numTargets - 1): splats.append(MovieUtil.copyProp(splat)) splatType = globalPropPool.getPropType(splatName) cakePartStrs = ['cake1', 'cake2', 'cake3', 'caketop'] cakeParts = [] for part in cakePartStrs: cakeParts.append(pie.find('**/%s' % part)) #figure out which cake part goes to which suit cakePartDivisions = {} cakePartDivisions[1] = [ [cakeParts[0], cakeParts[1], cakeParts[2], cakeParts[3]], ] cakePartDivisions[2] = [[cakeParts[0], cakeParts[1]], [cakeParts[2], cakeParts[3]]] cakePartDivisions[3] = [[cakeParts[0], cakeParts[1]], [ cakeParts[2], ], [ cakeParts[3], ]] cakePartDivisions[4] = [[ cakeParts[0], ], [ cakeParts[1], ], [ cakeParts[2], ], [ cakeParts[3], ]] cakePartDivToUse = cakePartDivisions[len(throw['target'])] groupPieTracks = Parallel() for i in range(numTargets): target = throw['target'][i] suit = target['suit'] hitSuit = (target['hp'] > 0) singlePieTrack = Sequence() if hitSuit: # make the pie fly up to the suit's face and disappear piePartReparent = Func(reparentCakePart, pie, cakePartDivToUse[i]) singlePieTrack.append(piePartReparent) cakePartTrack = Parallel() for cakePart in cakePartDivToUse[i]: pieFly = LerpPosInterval(cakePart, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint( suit, other=battle), name=pieFlyTaskName, other=battle) cakePartTrack.append(pieFly) singlePieTrack.append(cakePartTrack) pieRemoveCakeParts = Func(MovieUtil.removeProps, cakePartDivToUse[i]) pieHide = Func(MovieUtil.removeProps, pies) # play the splat animation splatShow = Func(__showProp, splats[i], suit, Point3(0, 0, suit.getHeight())) splatBillboard = Func(__billboardProp, splats[i]) splatAnim = ActorInterval(splats[i], splatName) splatHide = Func(MovieUtil.removeProp, splats[i]) singlePieTrack.append(pieRemoveCakeParts) singlePieTrack.append(pieHide) singlePieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) singlePieTrack.append(splatShow) singlePieTrack.append(splatBillboard) singlePieTrack.append(splatAnim) singlePieTrack.append(splatHide) else: # the suit is going to dodge, or we missed # make the pie fly past the suit's face, and shrink to nothing #untested for now missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePartReparent = Func(reparentCakePart, pie, cakePartDivToUse[i]) piePreMiss = Func(__piePreMissGroup, missDict, cakePartDivToUse[i], suitPoint, battle) pieMiss = LerpFunctionInterval( __pieMissGroupLerpCallback, extraArgs=[missDict], duration=((tPieHitsSuit - tPieLeavesHand) * ratioMissToHit)) pieHide = Func(MovieUtil.removeProps, pies) pieRemoveCakeParts = Func(MovieUtil.removeProps, cakePartDivToUse[i]) singlePieTrack.append(piePartReparent) singlePieTrack.append(piePreMiss) singlePieTrack.append(pieMiss) singlePieTrack.append(pieRemoveCakeParts) singlePieTrack.append(pieHide) singlePieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) groupPieTracks.append(singlePieTrack) return groupPieTracks
def __throwPie(throw, delay, hitCount): toon = throw['toon'] hpbonus = throw['hpbonus'] target = throw['target'] suit = target['suit'] hp = target['hp'] kbbonus = target['kbbonus'] sidestep = throw['sidestep'] died = target['died'] revived = target['revived'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] level = throw['level'] battle = throw['battle'] suitPos = suit.getPos(battle) origHpr = toon.getHpr(battle) notify.debug('toon: %s throws tart at suit: %d for hp: %d died: %d' % \ (toon.getName(), suit.doId, hp, died)) pieName = pieNames[level] hitSuit = (hp > 0) pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() splatName = 'splat-' + pieName if pieName == 'wedding-cake': splatName = 'splat-birthday-cake' splat = globalPropPool.getProp(splatName) splatType = globalPropPool.getPropType(splatName) # make the toon throw the pie toonTrack = Sequence() toonFace = Func(toon.headsUp, battle, suitPos) toonTrack.append(Wait(delay)) toonTrack.append(toonFace) toonTrack.append(ActorInterval(toon, 'throw')) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, battle, origHpr)) # take the pie from the toon and make it fly pieShow = Func(MovieUtil.showProps, pies, hands) pieAnim = Func(__animProp, pies, pieName, pieType) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale = Parallel(pieScale1, pieScale2) piePreflight = Func(__propPreflight, pies, suit, toon, battle) pieTrack = Sequence( Wait(delay), pieShow, pieAnim, pieScale, Func(battle.movie.needRestoreRenderProp, pies[0]), Wait(tPieLeavesHand - 1.0), piePreflight, ) soundTrack = __getSoundTrack(level, hitSuit, toon) if hitSuit: # make the pie fly up to the suit's face and disappear pieFly = LerpPosInterval(pie, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint(suit, other=battle), name=pieFlyTaskName, other=battle) pieHide = Func(MovieUtil.removeProps, pies) # play the splat animation splatShow = Func(__showProp, splat, suit, Point3(0, 0, suit.getHeight())) splatBillboard = Func(__billboardProp, splat) splatAnim = ActorInterval(splat, splatName) splatHide = Func(MovieUtil.removeProp, splat) pieTrack.append(pieFly) pieTrack.append(pieHide) pieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) pieTrack.append(splatShow) pieTrack.append(splatBillboard) pieTrack.append(splatAnim) pieTrack.append(splatHide) else: # the suit is going to dodge, or we missed # make the pie fly past the suit's face, and shrink to nothing missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePreMiss = Func(__piePreMiss, missDict, pie, suitPoint, battle) pieMiss = LerpFunctionInterval( __pieMissLerpCallback, extraArgs=[missDict], duration=((tPieHitsSuit - tPieLeavesHand) * ratioMissToHit)) pieHide = Func(MovieUtil.removeProps, pies) pieTrack.append(piePreMiss) pieTrack.append(pieMiss) pieTrack.append(pieHide) pieTrack.append(Func(battle.movie.clearRenderProp, pies[0])) if hitSuit: suitResponseTrack = Sequence() showDamage = Func(suit.showHpText, -hp, openEnded=0, attackTrack=THROW_TRACK) updateHealthBar = Func(suit.updateHealthBar, hp) # If the suit gets knocked back, animate it # No stun animation shown here sival = [] # Suit interval of its animation if (kbbonus > 0): suitPos, suitHpr = battle.getActorPosHpr(suit) suitType = getSuitBodyType(suit.getStyleName()) animTrack = Sequence() animTrack.append( ActorInterval(suit, 'pie-small-react', duration=0.2)) if (suitType == 'a'): animTrack.append( ActorInterval(suit, 'slip-forward', startTime=2.43)) elif (suitType == 'b'): animTrack.append( ActorInterval(suit, 'slip-forward', startTime=1.94)) elif (suitType == 'c'): animTrack.append( ActorInterval(suit, 'slip-forward', startTime=2.58)) # Be sure to unlure the suit so it doesn't walk back (already knocked back) animTrack.append(Func(battle.unlureSuit, suit)) moveTrack = Sequence( Wait(0.2), LerpPosInterval(suit, 0.6, pos=suitPos, other=battle), ) sival = Parallel(animTrack, moveTrack) else: if (hitCount == 1): sival = Parallel( ActorInterval(suit, 'pie-small-react'), MovieUtil.createSuitStunInterval(suit, 0.3, 1.3), ) else: sival = ActorInterval(suit, 'pie-small-react') #sival = ActorInterval(suit, 'pie-small-react') suitResponseTrack.append(Wait(delay + tPieHitsSuit)) suitResponseTrack.append(showDamage) suitResponseTrack.append(updateHealthBar) suitResponseTrack.append(sival) # Make a bonus track for any hp bonus bonusTrack = Sequence(Wait(delay + tPieHitsSuit)) if (kbbonus > 0): bonusTrack.append(Wait(0.75)) bonusTrack.append( Func(suit.showHpText, -kbbonus, 2, openEnded=0, attackTrack=THROW_TRACK)) if (hpbonus > 0): bonusTrack.append(Wait(0.75)) bonusTrack.append( Func(suit.showHpText, -hpbonus, 1, openEnded=0, attackTrack=THROW_TRACK)) if (revived != 0): suitResponseTrack.append( MovieUtil.createSuitReviveTrack(suit, toon, battle)) elif (died != 0): suitResponseTrack.append( MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: suitResponseTrack.append(Func(suit.loop, 'neutral')) suitResponseTrack = Parallel(suitResponseTrack, bonusTrack) else: # suit dodges # other suits may need to dodge as well suitResponseTrack = MovieUtil.createSuitDodgeMultitrack( delay + tSuitDodges, suit, leftSuits, rightSuits) # Since it's possible for there to be simultaneous throws, we only # want the suit to dodge one time at most. Thus if the suit is # not hit (dodges) and that dodge is not from the first dodge # (which has delay=0) then we don't add another suit reaction. # Otherwise, we add the suit track as normal if (not hitSuit and delay > 0): return [toonTrack, soundTrack, pieTrack] else: return [toonTrack, soundTrack, pieTrack, suitResponseTrack]
def __throwPie(throw, delay, hitCount): toon = throw['toon'] hpbonus = throw['hpbonus'] target = throw['target'] suit = target['suit'] hp = target['hp'] kbbonus = target['kbbonus'] sidestep = throw['sidestep'] died = target['died'] leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] level = throw['level'] battle = throw['battle'] suitPos = suit.getPos(battle) origHpr = toon.getHpr(battle) notify.debug('toon: %s throws tart at suit: %d for hp: %d died: %d' % (toon.getName(), suit.doId, hp, died)) pieName = pieNames[level] hitSuit = hp > 0 pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() splatName = 'splat-' + pieName splat = globalPropPool.getProp(splatName) splatType = globalPropPool.getPropType(splatName) toonIvals = [] toonFace = FunctionInterval(toon.headsUp, extraArgs=[battle, suitPos]) toonIvals.append((delay, toonFace)) toonIvals.append(ActorInterval(toon, 'throw')) toonIvals.append(FunctionInterval(toon.loop, extraArgs=['neutral'])) toonIvals.append(FunctionInterval(toon.setHpr, extraArgs=[battle, origHpr])) toonTrack = Track(toonIvals) pieIntervals = [] pieShow = FunctionInterval(MovieUtil.showProps, extraArgs=[pies, hands]) pieAnim = FunctionInterval(__animProp, extraArgs=[pies, pieName, pieType]) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale(), startScale=MovieUtil.PNT3_NEARZERO) pieScale = MultiTrack([Track([pieScale1]), Track([pieScale2])]) piePreflight = FunctionInterval(__propPreflight, extraArgs=[pies, suit, toon, battle]) pieIntervals.append((delay, pieShow)) pieIntervals.append(pieAnim) pieIntervals.append(pieScale) pieIntervals.append(FunctionInterval(battle.movie.needRestoreRenderProp, extraArgs=[pies[0]])) pieIntervals.append((delay + tPieLeavesHand, piePreflight)) soundTrack = __getSoundTrack(level, hitSuit, toon) if hitSuit: pieFly = LerpPosInterval(pie, tPieHitsSuit - tPieLeavesHand, pos=MovieUtil.avatarFacePoint(suit, other=battle), name=pieFlyTaskName, other=battle) pieHide = FunctionInterval(MovieUtil.removeProps, extraArgs=[pies]) splatShow = FunctionInterval(__showProp, extraArgs=[splat, suit, Point3(0, 0, suit.getHeight())]) splatBillboard = FunctionInterval(__billboardProp, extraArgs=[splat]) splatAnim = ActorInterval(splat, splatName) splatHide = FunctionInterval(MovieUtil.removeProp, extraArgs=[splat]) pieIntervals.append((delay + tPieLeavesHand, pieFly)) pieIntervals.append(pieHide) pieIntervals.append(FunctionInterval(battle.movie.clearRenderProp, extraArgs=[pies[0]])) pieIntervals.append(splatShow) pieIntervals.append(splatBillboard) pieIntervals.append(splatAnim) pieIntervals.append(splatHide) else: missDict = {} if sidestep: suitPoint = MovieUtil.avatarFacePoint(suit, other=battle) else: suitPoint = __suitMissPoint(suit, other=battle) piePreMiss = FunctionInterval(__piePreMiss, extraArgs=[missDict, pie, suitPoint, battle]) pieMiss = LerpFunctionInterval(__pieMissLerpCallback, extraArgs=[missDict], duration=(tPieHitsSuit - tPieLeavesHand) * ratioMissToHit) pieHide = FunctionInterval(MovieUtil.removeProps, extraArgs=[pies]) pieIntervals.append((delay + tPieLeavesHand, piePreMiss)) pieIntervals.append(pieMiss) pieIntervals.append(pieHide) pieIntervals.append(FunctionInterval(battle.movie.clearRenderProp, extraArgs=[pies[0]])) pieTrack = Track(pieIntervals) if hitSuit: suitIntervals = [] showDamage = FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]) updateHealthBar = FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) sival = [] if kbbonus > 0: suitPos, suitHpr = battle.getActorPosHpr(suit) suitType = getSuitBodyType(suit.getStyleName()) animIvals = [] animIvals.append(ActorInterval(suit, 'pie-small-react', duration=0.2)) if suitType == 'a': animIvals.append(ActorInterval(suit, 'slip-forward', startTime=2.43)) else: if suitType == 'b': animIvals.append(ActorInterval(suit, 'slip-forward', startTime=1.94, duration=1.03)) else: if suitType == 'c': animIvals.append(ActorInterval(suit, 'slip-forward', startTime=2.58)) animIvals.append(Func(battle.unlureSuit, suit)) animTrack = Track(animIvals) moveTrack = Track([WaitInterval(0.2), LerpPosInterval(suit, 0.6, pos=suitPos, other=battle)]) sival = MultiTrack([animTrack, moveTrack]) else: if hitCount == 1: sival = Parallel(ActorInterval(suit, 'pie-small-react'), MovieUtil.createSuitStunInterval(suit, 0.3, 1.3)) else: sival = ActorInterval(suit, 'pie-small-react') suitIntervals.append((delay + tPieHitsSuit, showDamage)) suitIntervals.append(updateHealthBar) suitIntervals.append(sival) bonusTrack = None bonusIvals = [] if kbbonus > 0: bonusIvals.append((delay + tPieHitsSuit + 0.75, FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-kbbonus, 2]))) if hpbonus > 0: if kbbonus > 0: bonusIvals.append((0.75, FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hpbonus, 1]), PREVIOUS_END)) else: bonusIvals.append((delay + tPieHitsSuit + 0.75, FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hpbonus, 1]))) if len(bonusIvals) > 0: bonusTrack = Track(bonusIvals) if died != 0: suitIntervals.append(MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: suitIntervals.append(FunctionInterval(suit.loop, extraArgs=['neutral'])) if bonusTrack == None: suitResponseTrack = Track(suitIntervals) else: suitResponseTrack = MultiTrack([Track(suitIntervals), bonusTrack]) else: suitResponseTrack = MovieUtil.createSuitDodgeMultitrack(delay + tSuitDodges, suit, leftSuits, rightSuits) if not hitSuit and delay > 0: return [toonTrack, soundTrack, pieTrack] else: return [ toonTrack, soundTrack, pieTrack, suitResponseTrack] return