def __doGroupDrops(groupDrops): toonTracks = Parallel() delay = 0.0 alreadyDodged = 0 alreadyTeased = 0 for drop in groupDrops: battle = drop['battle'] level = drop['level'] centerPos = calcAvgSuitPos(drop) targets = drop['target'] numTargets = len(targets) closestTarget = -1 nearestDistance = 100000.0 for i in xrange(numTargets): suit = drop['target'][i]['suit'] suitPos = suit.getPos(battle) displacement = Vec3(centerPos) displacement -= suitPos distance = displacement.lengthSquared() if distance < nearestDistance: closestTarget = i nearestDistance = distance track = __dropGroupObject(drop, delay, closestTarget, alreadyDodged, alreadyTeased) if track: toonTracks.append(track) delay = delay + TOON_DROP_SUIT_DELAY hp = drop['target'][closestTarget]['hp'] if hp <= 0: if level >= 3: alreadyTeased = 1 else: alreadyDodged = 1 return toonTracks
def __doGroupDrops(groupDrops): toonTracks = Parallel() delay = 0.0 alreadyDodged = 0 alreadyTeased = 0 for drop in groupDrops: battle = drop['battle'] level = drop['level'] centerPos = calcAvgSuitPos(drop) targets = drop['target'] numTargets = len(targets) closestTarget = -1 nearestDistance = 100000.0 for i in range(numTargets): suit = drop['target'][i]['suit'] suitPos = suit.getPos(battle) displacement = Vec3(centerPos) displacement -= suitPos distance = displacement.lengthSquared() if distance < nearestDistance: closestTarget = i nearestDistance = distance continue track = __dropGroupObject(drop, delay, closestTarget, alreadyDodged, alreadyTeased) if track: toonTracks.append(track) delay = delay + TOON_DROP_SUIT_DELAY hp = drop['target'][closestTarget]['hp'] if hp <= 0: if level >= 3: alreadyTeased = 1 else: alreadyDodged = 1 level >= 3 return toonTracks
def __throwGroupPie(throw, delay, groupHitDict): toon = throw['toon'] battle = throw['battle'] level = throw['level'] sidestep = throw['sidestep'] hpbonus = throw['hpbonus'] numTargets = len(throw['target']) avgSuitPos = calcAvgSuitPos(throw) origHpr = toon.getHpr(battle) toonTrack = Sequence() toonFace = Func(toon.headsUp, battle, avgSuitPos) 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)) suits = [] for i in range(numTargets): suits.append(throw['target'][i]['suit']) pieName = pieNames[level] pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() pieShow = Func(MovieUtil.showProps, pies, hands) pieAnim = Func(__animProp, pies, pieName, pieType) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale() * 1.5, startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale() * 1.5, startScale=MovieUtil.PNT3_NEARZERO) pieScale = Parallel(pieScale1, pieScale2) piePreflight = Func(__propPreflightGroup, pies, suits, toon, battle) pieTrack = Sequence(Wait(delay), pieShow, pieAnim, pieScale, Func(battle.movie.needRestoreRenderProp, pies[0]), Wait(tPieLeavesHand - 1.0), piePreflight) if level == UBER_GAG_LEVEL_INDEX: groupPieTracks = __createWeddingCakeFlight(throw, groupHitDict, pie, pies) else: notify.error('unhandled throw level %d' % level) pieTrack.append(groupPieTracks) didThrowHitAnyone = False for i in range(numTargets): target = throw['target'][i] hitSuit = target['hp'] > 0 if hitSuit: didThrowHitAnyone = True soundTrack = __getSoundTrack(level, didThrowHitAnyone, toon) groupSuitResponseTrack = Parallel() for i in range(numTargets): target = throw['target'][i] suit = target['suit'] hitSuit = target['hp'] > 0 leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] hp = target['hp'] kbbonus = target['kbbonus'] died = target['died'] revived = target['revived'] if hitSuit: singleSuitResponseTrack = 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 groupHitDict[suit.doId] == 1: sival = Parallel( ActorInterval(suit, 'pie-small-react'), MovieUtil.createSuitStunInterval(suit, 0.3, 1.3)) else: sival = ActorInterval(suit, 'pie-small-react') singleSuitResponseTrack.append(Wait(delay + tPieHitsSuit)) singleSuitResponseTrack.append(showDamage) singleSuitResponseTrack.append(updateHealthBar) singleSuitResponseTrack.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: singleSuitResponseTrack.append( MovieUtil.createSuitReviveTrack(suit, toon, battle)) elif died != 0: singleSuitResponseTrack.append( MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: singleSuitResponseTrack.append(Func(suit.loop, 'neutral')) singleSuitResponseTrack = Parallel(singleSuitResponseTrack, bonusTrack) else: groupHitValues = groupHitDict.values() if groupHitValues.count(0) == len(groupHitValues): singleSuitResponseTrack = MovieUtil.createSuitDodgeMultitrack( delay + tSuitDodges, suit, leftSuits, rightSuits) else: singleSuitResponseTrack = Sequence( Wait(tPieHitsSuit - 0.1), Func(MovieUtil.indicateMissed, suit, 1.0)) groupSuitResponseTrack.append(singleSuitResponseTrack) return [toonTrack, pieTrack, soundTrack, groupSuitResponseTrack]
def __doGroupDrops(groupDrops): """ __doSuitDrops(drops) 1 or more toons drop at the same target suit Note: attacks are sorted by increasing level (as are toons) Returns a track with toon drops in the following order: 1) level 1 drops, right to left, (TOON_DROP_DELAY later) 2) level 2 drops, right to left, (TOON_DROP_DELAY later) etc. """ #import pdb; pdb.set_trace() toonTracks = Parallel() delay = 0.0 alreadyDodged = 0 alreadyTeased = 0 for drop in groupDrops: battle = drop['battle'] level = drop['level'] #calculate center position, then figure out which suit is closest to it centerPos = calcAvgSuitPos(drop) targets = drop['target'] numTargets = len(targets) closestTarget = -1 nearestDistance = 100000.0 for i in range(numTargets): suit = drop['target'][i]['suit'] suitPos = suit.getPos(battle) displacement = Vec3(centerPos) displacement -= suitPos distance = displacement.lengthSquared() if distance < nearestDistance: closestTarget = i nearestDistance = distance #we have the suit to drop on track = __dropGroupObject(drop, delay, closestTarget, alreadyDodged, alreadyTeased) if (track): toonTracks.append(track) #delay += TOON_DROP_DELAY delay = delay + TOON_DROP_SUIT_DELAY hp = drop['target'][closestTarget]['hp'] if (hp <= 0): if (level >= 3): alreadyTeased = 1 else: alreadyDodged = 1 pass #for dropTargetPair in dropTargetPairs: # drop = dropTargetPair[0] # level = drop['level'] # objName = objects[level] # target = dropTargetPair[1] # track = __dropObject(drop, delay, objName, level, alreadyDodged, # alreadyTeased, npcs, target, npcDrops) # if (track): # toonTracks.append(track) # delay += TOON_DROP_DELAY # hp = target['hp'] # if (hp <= 0): # if (level >= 3): # alreadyTeased = 1 # else: # alreadyDodged = 1 return toonTracks
def __throwGroupPie(throw, delay, groupHitDict): toon = throw['toon'] battle = throw['battle'] level = throw['level'] sidestep = throw['sidestep'] hpbonus = throw['hpbonus'] numTargets = len(throw['target']) avgSuitPos = calcAvgSuitPos(throw) origHpr = toon.getHpr(battle) toonTrack = Sequence() toonFace = Func(toon.headsUp, battle, avgSuitPos) 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)) suits = [] for i in xrange(numTargets): suits.append(throw['target'][i]['suit']) pieName = pieNames[level] pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() pieShow = Func(MovieUtil.showProps, pies, hands) pieAnim = Func(__animProp, pies, pieName, pieType) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale() * 1.5, startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale() * 1.5, startScale=MovieUtil.PNT3_NEARZERO) pieScale = Parallel(pieScale1, pieScale2) piePreflight = Func(__propPreflightGroup, pies, suits, toon, battle) pieTrack = Sequence(Wait(delay), pieShow, pieAnim, pieScale, Func(battle.movie.needRestoreRenderProp, pies[0]), Wait(tPieLeavesHand - 1.0), piePreflight) if level == UBER_GAG_LEVEL_INDEX: groupPieTracks = __createWeddingCakeFlight(throw, groupHitDict, pie, pies) else: notify.error('unhandled throw level %d' % level) pieTrack.append(groupPieTracks) didThrowHitAnyone = False for i in xrange(numTargets): target = throw['target'][i] hitSuit = target['hp'] > 0 if hitSuit: didThrowHitAnyone = True soundTrack = __getSoundTrack(level, didThrowHitAnyone, toon) groupSuitResponseTrack = Parallel() for i in xrange(numTargets): target = throw['target'][i] suit = target['suit'] hitSuit = target['hp'] > 0 leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] hp = target['hp'] kbbonus = target['kbbonus'] died = target['died'] revived = target['revived'] if hitSuit: singleSuitResponseTrack = 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 groupHitDict[suit.doId] == 1: sival = Parallel(ActorInterval(suit, 'pie-small-react'), MovieUtil.createSuitStunInterval(suit, 0.3, 1.3)) else: sival = ActorInterval(suit, 'pie-small-react') singleSuitResponseTrack.append(Wait(delay + tPieHitsSuit)) singleSuitResponseTrack.append(showDamage) singleSuitResponseTrack.append(updateHealthBar) singleSuitResponseTrack.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: singleSuitResponseTrack.append(MovieUtil.createSuitReviveTrack(suit, toon, battle)) elif died != 0: singleSuitResponseTrack.append(MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: singleSuitResponseTrack.append(Func(suit.loop, 'neutral')) singleSuitResponseTrack = Parallel(singleSuitResponseTrack, bonusTrack) else: groupHitValues = groupHitDict.values() if groupHitValues.count(0) == len(groupHitValues): singleSuitResponseTrack = MovieUtil.createSuitDodgeMultitrack(delay + tSuitDodges, suit, leftSuits, rightSuits) else: singleSuitResponseTrack = Sequence(Wait(tPieHitsSuit - 0.1), Func(MovieUtil.indicateMissed, suit, 1.0)) groupSuitResponseTrack.append(singleSuitResponseTrack) return [toonTrack, pieTrack, soundTrack, groupSuitResponseTrack]
def __throwGroupPie(throw, delay, groupHitDict): """ TODO this can be made to __throwGroupPie and wedding cake stuff is called in a diff function """ toon = throw['toon'] battle = throw['battle'] level = throw['level'] sidestep = throw['sidestep'] hpbonus = throw['hpbonus'] numTargets = len(throw['target']) avgSuitPos = calcAvgSuitPos(throw) # make the toon throw the wedding cake origHpr = toon.getHpr(battle) toonTrack = Sequence() toonFace = Func(toon.headsUp, battle, avgSuitPos) 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 suits = [] for i in range(numTargets): suits.append(throw['target'][i]['suit']) pieName = pieNames[level] pie = globalPropPool.getProp(pieName) pieType = globalPropPool.getPropType(pieName) pie2 = MovieUtil.copyProp(pie) pies = [pie, pie2] hands = toon.getRightHands() pieShow = Func(MovieUtil.showProps, pies, hands) pieAnim = Func(__animProp, pies, pieName, pieType) pieScale1 = LerpScaleInterval(pie, 1.0, pie.getScale() * 1.5, startScale=MovieUtil.PNT3_NEARZERO) pieScale2 = LerpScaleInterval(pie2, 1.0, pie2.getScale() * 1.5, startScale=MovieUtil.PNT3_NEARZERO) pieScale = Parallel(pieScale1, pieScale2) piePreflight = Func(__propPreflightGroup, pies, suits, toon, battle) pieTrack = Sequence( Wait(delay), pieShow, pieAnim, pieScale, Func(battle.movie.needRestoreRenderProp, pies[0]), Wait(tPieLeavesHand - 1.0), piePreflight, ) #create the pie flight interval if level == UBER_GAG_LEVEL_INDEX: groupPieTracks = __createWeddingCakeFlight(throw, groupHitDict, pie, pies) else: notify.error('unhandled throw level %d' % level) pieTrack.append(groupPieTracks) didThrowHitAnyone = False for i in range(numTargets): target = throw['target'][i] hitSuit = (target['hp'] > 0) if hitSuit: didThrowHitAnyone = True soundTrack = __getSoundTrack(level, didThrowHitAnyone, toon) groupSuitResponseTrack = Parallel() #handle the suit response for i in range(numTargets): target = throw['target'][i] suit = target['suit'] hitSuit = (target['hp'] > 0) leftSuits = target['leftSuits'] rightSuits = target['rightSuits'] hp = target['hp'] kbbonus = target['kbbonus'] died = target['died'] revived = target['revived'] if hitSuit: singleSuitResponseTrack = 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 (groupHitDict[suit.doId] == 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') singleSuitResponseTrack.append(Wait(delay + tPieHitsSuit)) singleSuitResponseTrack.append(showDamage) singleSuitResponseTrack.append(updateHealthBar) singleSuitResponseTrack.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): singleSuitResponseTrack.append( MovieUtil.createSuitReviveTrack(suit, toon, battle)) elif (died != 0): singleSuitResponseTrack.append( MovieUtil.createSuitDeathTrack(suit, toon, battle)) else: singleSuitResponseTrack.append(Func(suit.loop, 'neutral')) singleSuitResponseTrack = Parallel(singleSuitResponseTrack, bonusTrack) else: #if none of the group throws hit at all, we can do a dodge groupHitValues = groupHitDict.values() if groupHitValues.count(0) == len(groupHitValues): singleSuitResponseTrack = MovieUtil.createSuitDodgeMultitrack( delay + tSuitDodges, suit, leftSuits, rightSuits) else: #because all the group pies fire at the same time, do not dodge at all #in case one toon hits and another toon misses singleSuitResponseTrack = Sequence( Wait(tPieHitsSuit - 0.1), Func(MovieUtil.indicateMissed, suit, 1.0)) groupSuitResponseTrack.append(singleSuitResponseTrack) return [toonTrack, pieTrack, soundTrack, groupSuitResponseTrack]