def __calcFlightResults(self, avId, launchTime): head = self.toonHeadDict[avId] startPos = head.getPos(render) startHpr = head.getHpr(render) hpr = self.cannonDict[avId][1].getHpr(render) towerPos = self.tower.getPos(render) rotation = self.__toRadians(hpr[0]) angle = self.__toRadians(hpr[1]) horizVel = INITIAL_VELOCITY * math.cos(angle) xVel = horizVel * -math.sin(rotation) yVel = horizVel * math.cos(rotation) zVel = INITIAL_VELOCITY * math.sin(angle) startVel = Vec3(xVel, yVel, zVel) trajectory = Trajectory.Trajectory(launchTime, startPos, startVel) towerList = [ towerPos + Point3(0, 0, BUCKET_HEIGHT), TOWER_RADIUS, TOWER_HEIGHT - BUCKET_HEIGHT ] self.notify.debug( 'calcFlightResults(%s): rotation(%s), angle(%s), horizVel(%s), xVel(%s), yVel(%s), zVel(%s), startVel(%s), trajectory(%s), towerList(%s)' % (avId, rotation, angle, horizVel, xVel, yVel, zVel, startVel, trajectory, towerList)) timeOfImpact, hitWhat = self.__calcToonImpact(trajectory, towerList) return (startPos, startHpr, startVel, trajectory, timeOfImpact, hitWhat)
def setToonTrajectory(self, avId, launchTime, x, y, z, h, p, r, vx, vy, vz): if avId == localAvatar.doId: return startPos = Vec3(x, y, z) startHpr = Vec3(h, p, r) startVel = Vec3(vx, vy, vz) startT = globalClockDelta.networkToLocalTime(launchTime, bits=31) + 0.2 trajectory = Trajectory.Trajectory(0.0, startPos, startVel) self._avId2trajectoryInfo[avId] = ScratchPad(startPos=startPos, startHpr=startHpr, startVel=startVel, startT=startT, trajectory=trajectory)
def defineConstants(self): self.notify.debug('defineConstants') self.DropPlacerType = RegionDropPlacer fruits = { ToontownGlobals.ToontownCentral: 'apple', ToontownGlobals.DonaldsDock: 'orange', ToontownGlobals.DaisyGardens: 'pear', ToontownGlobals.MinniesMelodyland: 'coconut', ToontownGlobals.TheBrrrgh: 'watermelon', ToontownGlobals.DonaldsDreamland: 'pineapple', ToontownGlobals.OutdoorZone: 'acorn' } self.fruitName = fruits[self.getSafezoneId()] self.ShowObjSpheres = 0 self.ShowToonSpheres = 0 self.ShowSuitSpheres = 0 self.PredictiveSmoothing = 1 self.UseGravity = 1 self.TrickShadows = 1 self.WantSuits = 1 self.FirstDropDelay = 0.5 self.FasterDropDelay = int(2.0 / 3 * CatchGameGlobals.GameDuration) self.notify.debug('will start dropping fast after %s seconds' % self.FasterDropDelay) self.FasterDropPeriodMult = 0.5 self.calcDifficultyConstants(self.getDifficulty(), self.getNumPlayers()) self.notify.debug('ToonSpeed: %s' % self.ToonSpeed) self.notify.debug('total drops: %s' % self.totalDrops) self.notify.debug('numFruits: %s' % self.numFruits) self.notify.debug('numAnvils: %s' % self.numAnvils) self.ObjRadius = 1.0 dropGridDimensions = [[5, 5], [5, 5], [6, 6], [7, 7]] self.DropRows, self.DropColumns = dropGridDimensions[ self.getNumPlayers() - 1] self.cameraPosTable = [[0, -29.36, 28.17]] * 2 + [[0, -32.87, 30.43], [0, -35.59, 32.1]] self.cameraHpr = [0, -35, 0] self.CameraPosHpr = self.cameraPosTable[self.getNumPlayers() - 1] + self.cameraHpr for objType in DropObjectTypes: self.notify.debug('*** Object Type: %s' % objType.name) objType.onscreenDuration = objType.onscreenDurMult * self.BaselineOnscreenDropDuration self.notify.debug('onscreenDuration=%s' % objType.onscreenDuration) v_0 = 0.0 t = objType.onscreenDuration x_0 = self.MinOffscreenHeight x = 0.0 g = 2.0 * (x - x_0 - v_0 * t) / (t * t) self.notify.debug('gravity=%s' % g) objType.trajectory = Trajectory.Trajectory( 0, Vec3(0, 0, x_0), Vec3(0, 0, v_0), gravMult=abs(g / Trajectory.Trajectory.gravity)) objType.fallDuration = objType.onscreenDuration + self.OffscreenTime
def __calcFlightResults(self, cannon, toonId, launchTime): startPos = cannon.getToonFirePos() startHpr = cannon.getToonFireHpr() startVel = cannon.getToonFireVel() quantizeVec(startPos, self.NetDivisor) quantizeVec(startHpr, self.NetDivisor) quantizeVec(startVel, self.NetDivisor) trajectory = Trajectory.Trajectory(launchTime, startPos, startVel) self.trajectory = trajectory return { 'startPos': startPos, 'startHpr': startHpr, 'startVel': startVel, 'trajectory': trajectory }
def __calcFlightResults(self, avId, launchTime): head = self.toonHead startPos = head.getPos(render) startHpr = head.getHpr(render) hpr = self.barrel.getHpr(render) rotation = self.__toRadians(hpr[0]) angle = self.__toRadians(hpr[1]) horizVel = INITIAL_VELOCITY * math.cos(angle) xVel = horizVel * -math.sin(rotation) yVel = horizVel * math.cos(rotation) zVel = INITIAL_VELOCITY * math.sin(angle) startVel = Vec3(xVel, yVel, zVel) trajectory = Trajectory.Trajectory(launchTime, startPos, startVel) self.trajectory = trajectory timeOfImpact, hitWhat = self.__calcToonImpact(trajectory) return startPos, startHpr, startVel, trajectory, 3 * timeOfImpact, hitWhat
def __calcFlightResults(self, cannon, toonId, launchTime): def quantizeVec(vec, divisor): quantize = lambda value, divisor: float(int(value * int(divisor))) / int(divisor) vec[0] = quantize(vec[0], divisor) vec[1] = quantize(vec[1], divisor) vec[2] = quantize(vec[2], divisor) startPos = cannon.getToonFirePos() startHpr = cannon.getToonFireHpr() startVel = cannon.getToonFireVel() quantizeVec(startPos, self.NetDivisor) quantizeVec(startHpr, self.NetDivisor) quantizeVec(startVel, self.NetDivisor) trajectory = Trajectory.Trajectory(launchTime, startPos, startVel) self.trajectory = trajectory return startPos, startHpr, startVel, trajectory
def __calcFlightResults(self, cannon, toonId, launchTime): """ returns dict with keys: startPos, startHpr, startVel, trajectory, timeOfImpact, hitWhat """ startPos = cannon.getToonFirePos() startHpr = cannon.getToonFireHpr() startVel = cannon.getToonFireVel() trajectory = Trajectory.Trajectory(launchTime, startPos, startVel) self.trajectory = trajectory return { 'startPos': startPos, 'startHpr': startHpr, 'startVel': startVel, 'trajectory': trajectory, }
def _DistributedLawbotCannon__calcFlightResults(self, avId, launchTime): head = self.toonHead startPos = head.getPos(render) startHpr = head.getHpr(render) hpr = self.barrel.getHpr(render) rotation = self._DistributedLawbotCannon__toRadians(hpr[0]) angle = self._DistributedLawbotCannon__toRadians(hpr[1]) horizVel = INITIAL_VELOCITY * math.cos(angle) xVel = horizVel * -math.sin(rotation) yVel = horizVel * math.cos(rotation) zVel = INITIAL_VELOCITY * math.sin(angle) startVel = Vec3(xVel, yVel, zVel) trajectory = Trajectory.Trajectory(launchTime, startPos, startVel) self.trajectory = trajectory (timeOfImpact, hitWhat) = self._DistributedLawbotCannon__calcToonImpact(trajectory) return { 'startPos': startPos, 'startHpr': startHpr, 'startVel': startVel, 'trajectory': trajectory, 'timeOfImpact': 3 * timeOfImpact, 'hitWhat': hitWhat }
def showToonHitBySuit(self, avId, timestamp): toon = self.getAvatar(avId) if toon == None: return rng = self.toonRNGs[self.avIdList.index(avId)] curPos = toon.getPos(render) oldTrack = self.toonHitTracks[avId] if oldTrack.isPlaying(): oldTrack.finish() toon.setPos(curPos) toon.setZ(self.TOON_Z) parentNode = render.attachNewNode('mazeFlyToonParent-' + ` avId `) parentNode.setPos(toon.getPos()) toon.reparentTo(parentNode) toon.setPos(0, 0, 0) startPos = parentNode.getPos() dropShadow = toon.dropShadow.copyTo(parentNode) dropShadow.setScale(toon.dropShadow.getScale(render)) trajectory = Trajectory.Trajectory(0, Point3(0, 0, 0), Point3(0, 0, 50), gravMult=1.0) oldFlyDur = trajectory.calcTimeOfImpactOnPlane(0.0) trajectory = Trajectory.Trajectory(0, Point3(0, 0, 0), Point3(0, 0, 40), gravMult=1.0) flyDur = trajectory.calcTimeOfImpactOnPlane(0.0) avIndex = self.avIdList.index(avId) endPos = CTGG.ToonStartingPositions[avIndex] def flyFunc(t, trajectory, startPos=startPos, endPos=endPos, dur=flyDur, moveNode=parentNode, flyNode=toon): u = t / dur moveNode.setX(startPos[0] + u * (endPos[0] - startPos[0])) moveNode.setY(startPos[1] + u * (endPos[1] - startPos[1])) flyNode.setPos(trajectory.getPos(t)) flyTrack = Sequence(LerpFunctionInterval(flyFunc, fromData=0.0, toData=flyDur, duration=flyDur, extraArgs=[trajectory]), name=toon.uniqueName('hitBySuit-fly')) geomNode = toon.getGeomNode() startHpr = geomNode.getHpr() destHpr = Point3(startHpr) hRot = rng.randrange(1, 8) if rng.choice([0, 1]): hRot = -hRot destHpr.setX(destHpr[0] + hRot * 360) spinHTrack = Sequence(LerpHprInterval(geomNode, flyDur, destHpr, startHpr=startHpr), Func(geomNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinH')) parent = geomNode.getParent() rotNode = parent.attachNewNode('rotNode') geomNode.reparentTo(rotNode) rotNode.setZ(toon.getHeight() / 2.0) oldGeomNodeZ = geomNode.getZ() geomNode.setZ(-toon.getHeight() / 2.0) startHpr = rotNode.getHpr() destHpr = Point3(startHpr) pRot = rng.randrange(1, 3) if rng.choice([0, 1]): pRot = -pRot destHpr.setY(destHpr[1] + pRot * 360) spinPTrack = Sequence(LerpHprInterval(rotNode, flyDur, destHpr, startHpr=startHpr), Func(rotNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinP')) i = self.avIdList.index(avId) soundTrack = Sequence(Func(base.playSfx, self.sndTable['hitBySuit'][i]), Wait(flyDur * (2.0 / 3.0)), SoundInterval(self.sndTable['falling'][i], duration=flyDur * (1.0 / 3.0)), name=toon.uniqueName('hitBySuit-soundTrack')) def preFunc(self=self, avId=avId, toon=toon, dropShadow=dropShadow): forwardSpeed = toon.forwardSpeed rotateSpeed = toon.rotateSpeed if avId == self.localAvId: self.stopGameWalk() else: toon.stopSmooth() if forwardSpeed or rotateSpeed: toon.setSpeed(forwardSpeed, rotateSpeed) toon.dropShadow.hide() def postFunc(self=self, avId=avId, oldGeomNodeZ=oldGeomNodeZ, dropShadow=dropShadow, parentNode=parentNode): if avId == self.localAvId: base.localAvatar.setPos(endPos) if hasattr(self, 'gameWalk'): toon = base.localAvatar toon.setSpeed(0, 0) self.startGameWalk() dropShadow.removeNode() del dropShadow toon = self.getAvatar(avId) if toon: toon.dropShadow.show() geomNode = toon.getGeomNode() rotNode = geomNode.getParent() baseNode = rotNode.getParent() geomNode.reparentTo(baseNode) rotNode.removeNode() del rotNode geomNode.setZ(oldGeomNodeZ) if toon: toon.reparentTo(render) toon.setPos(endPos) parentNode.removeNode() del parentNode if avId != self.localAvId: if toon: toon.startSmooth() preFunc() slipBack = Parallel( Sequence(ActorInterval(toon, 'slip-backward', endFrame=24), ActorInterval(toon, 'slip-backward', startFrame=24))) if toon.doId == self.localAvId: slipBack.append(SoundInterval(self.sndOof)) hitTrack = Sequence(Parallel(flyTrack, spinHTrack, spinPTrack, soundTrack), slipBack, Func(postFunc), name=toon.uniqueName('hitBySuit')) self.notify.debug('hitTrack duration = %s' % hitTrack.getDuration()) self.toonHitTracks[avId] = hitTrack hitTrack.start(globalClockDelta.localElapsedTime(timestamp)) return
def __showToonHitByBomb(self, avId, moleIndex, timestamp = 0): toon = base.cr.doId2do.get(avId) moleHill = self.moleHills[moleIndex] if toon == None: return rng = random.Random(timestamp) curPos = toon.getPos(render) oldTrack = self.toonHitTracks.get(avId) if oldTrack: if oldTrack.isPlaying(): oldTrack.finish() toon.setPos(curPos) toon.setZ(self.getZ()) parentNode = render.attachNewNode('mazeFlyToonParent-' + `avId`) parentNode.setPos(toon.getPos(render)) toon.reparentTo(parentNode) toon.setPos(0, 0, 0) startPos = parentNode.getPos() dropShadow = toon.dropShadow.copyTo(parentNode) dropShadow.setScale(toon.dropShadow.getScale(render)) trajectory = Trajectory.Trajectory(0, Point3(0, 0, 0), Point3(0, 0, 50), gravMult=1.0) flyDur = trajectory.calcTimeOfImpactOnPlane(0.0) endTile = [rng.randint(0, self.numSquaresX - 1), rng.randint(0, self.numSquaresY - 1)] endWorldCoords = (self.getX(render) + endTile[0] * self.spacingX, self.getY(render) + endTile[1] * self.spacingY) endPos = Point3(endWorldCoords[0], endWorldCoords[1], startPos[2]) def flyFunc(t, trajectory, startPos = startPos, endPos = endPos, dur = flyDur, moveNode = parentNode, flyNode = toon): u = t / dur moveNode.setX(startPos[0] + u * (endPos[0] - startPos[0])) moveNode.setY(startPos[1] + u * (endPos[1] - startPos[1])) if flyNode and not flyNode.isEmpty(): flyNode.setPos(trajectory.getPos(t)) def safeSetHpr(node, hpr): if node and not node.isEmpty(): node.setHpr(hpr) flyTrack = Sequence(LerpFunctionInterval(flyFunc, fromData=0.0, toData=flyDur, duration=flyDur, extraArgs=[trajectory]), name=toon.uniqueName('hitBySuit-fly')) if avId != localAvatar.doId: cameraTrack = Sequence() else: base.localAvatar.stopUpdateSmartCamera() self.camParentHold = camera.getParent() self.camParent = base.localAvatar.attachNewNode('iCamParent') self.camParent.setPos(self.camParentHold.getPos()) self.camParent.setHpr(self.camParentHold.getHpr()) camera.reparentTo(self.camParent) self.camParent.reparentTo(parentNode) startCamPos = camera.getPos() destCamPos = camera.getPos() zenith = trajectory.getPos(flyDur / 2.0)[2] destCamPos.setZ(zenith * 1.3) destCamPos.setY(destCamPos[1] * 0.3) def camTask(task, zenith = zenith, flyNode = toon, startCamPos = startCamPos, camOffset = destCamPos - startCamPos): u = flyNode.getZ() / zenith camera.lookAt(toon) return Task.cont camTaskName = 'mazeToonFlyCam-' + `avId` taskMgr.add(camTask, camTaskName, priority=20) def cleanupCamTask(self = self, toon = toon, camTaskName = camTaskName, startCamPos = startCamPos): taskMgr.remove(camTaskName) self.camParent.reparentTo(toon) camera.setPos(startCamPos) camera.lookAt(toon) camera.reparentTo(self.camParentHold) base.localAvatar.startUpdateSmartCamera() self.setUpCamera() cameraTrack = Sequence(Wait(flyDur), Func(cleanupCamTask), name='hitBySuit-cameraLerp') geomNode = toon.getGeomNode() startHpr = geomNode.getHpr() destHpr = Point3(startHpr) hRot = rng.randrange(1, 8) if rng.choice([0, 1]): hRot = -hRot destHpr.setX(destHpr[0] + hRot * 360) spinHTrack = Sequence(LerpHprInterval(geomNode, flyDur, destHpr, startHpr=startHpr), Func(safeSetHpr, geomNode, startHpr), name=toon.uniqueName('hitBySuit-spinH')) parent = geomNode.getParent() rotNode = parent.attachNewNode('rotNode') geomNode.reparentTo(rotNode) rotNode.setZ(toon.getHeight() / 2.0) oldGeomNodeZ = geomNode.getZ() geomNode.setZ(-toon.getHeight() / 2.0) startHpr = rotNode.getHpr() destHpr = Point3(startHpr) pRot = rng.randrange(1, 3) if rng.choice([0, 1]): pRot = -pRot destHpr.setY(destHpr[1] + pRot * 360) spinPTrack = Sequence(LerpHprInterval(rotNode, flyDur, destHpr, startHpr=startHpr), Func(safeSetHpr, rotNode, startHpr), name=toon.uniqueName('hitBySuit-spinP')) soundTrack = Sequence() def preFunc(self = self, avId = avId, toon = toon, dropShadow = dropShadow): forwardSpeed = toon.forwardSpeed rotateSpeed = toon.rotateSpeed if avId == localAvatar.doId: toon.stopSmooth() base.cr.playGame.getPlace().fsm.request('stopped') else: toon.stopSmooth() if forwardSpeed or rotateSpeed: toon.setSpeed(forwardSpeed, rotateSpeed) toon.dropShadow.hide() def postFunc(self = self, avId = avId, oldGeomNodeZ = oldGeomNodeZ, dropShadow = dropShadow, parentNode = parentNode): if avId == localAvatar.doId: base.localAvatar.setPos(endPos) if hasattr(self, 'orthoWalk'): self.orthoWalk.start() dropShadow.removeNode() del dropShadow if toon and toon.dropShadow: toon.dropShadow.show() geomNode = toon.getGeomNode() rotNode = geomNode.getParent() baseNode = rotNode.getParent() geomNode.reparentTo(baseNode) rotNode.removeNode() del rotNode geomNode.setZ(oldGeomNodeZ) toon.reparentTo(render) toon.setPos(endPos) parentNode.removeNode() del parentNode if avId == localAvatar.doId: toon.startSmooth() place = base.cr.playGame.getPlace() if place and hasattr(place, 'fsm'): place.fsm.request('walk') else: toon.startSmooth() preFunc() hitTrack = Sequence(Func(toon.setPos, Point3(0.0, 0.0, 0.0)), Wait(0.25), Parallel(flyTrack, cameraTrack, self.soundIUpDown, spinHTrack, spinPTrack, soundTrack), Func(postFunc), name=toon.uniqueName('hitBySuit')) self.toonHitTracks[avId] = hitTrack hitTrack.start() posM = moleHill.getPos(render) posN = Point3(posM[0], posM[1], posM[2] + 4.0) self.soundBomb.play() self.soundBomb2.play() return
def __showToonHitByBomb(self, avId, moleIndex, timestamp=0): toon = base.cr.doId2do.get(avId) moleHill = self.moleHills[moleIndex] if toon == None: return #print("Toon info") #print("Pos %s" % (toon.getPos())) #print("Parent %s" % (toon.getParent())) rng = random.Random(timestamp) # make sure this toon's old track is done curPos = toon.getPos(render) oldTrack = self.toonHitTracks.get(avId) if oldTrack: if oldTrack.isPlaying(): oldTrack.finish() # preserve the toon's current position, in case he gets hit # by two suits at a time toon.setPos(curPos) toon.setZ(self.getZ()) # put the toon under a new node assert (toon.getParent() == render) parentNode = render.attachNewNode('mazeFlyToonParent-' + repr(avId)) parentNode.setPos(toon.getPos(render)) toon.reparentTo(parentNode) toon.setPos(0, 0, 0) # shoot the toon up into the air startPos = parentNode.getPos() # make a copy of the toon's dropshadow dropShadow = toon.dropShadow.copyTo(parentNode) dropShadow.setScale(toon.dropShadow.getScale(render)) trajectory = Trajectory.Trajectory(0, Point3(0, 0, 0), Point3(0, 0, 50), gravMult=1.) flyDur = trajectory.calcTimeOfImpactOnPlane(0.) assert (flyDur > 0) # choose a random landing point endTile = [ rng.randint(0, self.numSquaresX - 1), rng.randint(0, self.numSquaresY - 1) ] endWorldCoords = (self.getX(render) + (endTile[0] * self.spacingX), self.getY(render) + (endTile[1] * self.spacingY)) endPos = Point3(endWorldCoords[0], endWorldCoords[1], startPos[2]) def flyFunc(t, trajectory, startPos=startPos, endPos=endPos, dur=flyDur, moveNode=parentNode, flyNode=toon): u = (t / dur) moveNode.setX(startPos[0] + (u * (endPos[0] - startPos[0]))) moveNode.setY(startPos[1] + (u * (endPos[1] - startPos[1]))) # set the full position, since the toon might get banged # by telemetry if flyNode and not flyNode.isEmpty(): # flyNode could be empty if we teleported out and another toon was flying flyNode.setPos(trajectory.getPos(t)) def safeSetHpr(node, hpr): if node and not node.isEmpty(): node.setHpr(hpr) flyTrack = Sequence(LerpFunctionInterval(flyFunc, fromData=0., toData=flyDur, duration=flyDur, extraArgs=[trajectory]), name=toon.uniqueName("hitBySuit-fly")) # if localtoon, move the camera to get a better view if avId != localAvatar.doId: cameraTrack = Sequence() else: # keep the camera parent node on the ground # with the toon parent node base.localAvatar.stopUpdateSmartCamera() self.camParentHold = camera.getParent() self.camParent = base.localAvatar.attachNewNode('iCamParent') self.camParent.setPos(self.camParentHold.getPos()) self.camParent.setHpr(self.camParentHold.getHpr()) camera.reparentTo(self.camParent) self.camParent.reparentTo(parentNode) startCamPos = camera.getPos() destCamPos = camera.getPos() # trajectory starts at Z==0, ends at Z==0 zenith = trajectory.getPos(flyDur / 2.)[2] # make the camera go up above the toon's zenith... destCamPos.setZ(zenith * 1.3) # and pull in fairly far towards the toon destCamPos.setY(destCamPos[1] * .3) # make sure the camera keeps looking at the toon def camTask(task, zenith=zenith, flyNode=toon, startCamPos=startCamPos, camOffset=destCamPos - startCamPos): # move the camera proportional to the current height # of the toon wrt the height of its total trajectory u = flyNode.getZ() / zenith #camera.setPos(startCamPos + (camOffset * u)) camera.lookAt(toon) return Task.cont camTaskName = "mazeToonFlyCam-" + repr(avId) taskMgr.add(camTask, camTaskName, priority=20) def cleanupCamTask(self=self, toon=toon, camTaskName=camTaskName, startCamPos=startCamPos): taskMgr.remove(camTaskName) self.camParent.reparentTo(toon) camera.setPos(startCamPos) camera.lookAt(toon) camera.reparentTo(self.camParentHold) base.localAvatar.startUpdateSmartCamera() self.setUpCamera() cameraTrack = Sequence(Wait(flyDur), Func(cleanupCamTask), name="hitBySuit-cameraLerp") # make the toon spin in H and P # it seems like we need to put the rotations on two different # nodes in order to avoid interactions between the rotations geomNode = toon.getGeomNode() # apply the H rotation around the geomNode, since it's OK # to spin the toon in H at a node at his feet startHpr = geomNode.getHpr() destHpr = Point3(startHpr) # make the toon rotate in h 1..7 times hRot = rng.randrange(1, 8) if rng.choice([0, 1]): hRot = -hRot destHpr.setX(destHpr[0] + (hRot * 360)) spinHTrack = Sequence(LerpHprInterval(geomNode, flyDur, destHpr, startHpr=startHpr), Func(safeSetHpr, geomNode, startHpr), name=toon.uniqueName("hitBySuit-spinH")) # put an extra node above the geomNode, so we can spin the # toon in P around his waist parent = geomNode.getParent() rotNode = parent.attachNewNode('rotNode') geomNode.reparentTo(rotNode) rotNode.setZ(toon.getHeight() / 2.) oldGeomNodeZ = geomNode.getZ() geomNode.setZ(-toon.getHeight() / 2.) # spin the toon in P around his waist startHpr = rotNode.getHpr() destHpr = Point3(startHpr) # make the toon rotate in P 1..2 times pRot = rng.randrange(1, 3) if rng.choice([0, 1]): pRot = -pRot destHpr.setY(destHpr[1] + (pRot * 360)) spinPTrack = Sequence(LerpHprInterval(rotNode, flyDur, destHpr, startHpr=startHpr), Func(safeSetHpr, rotNode, startHpr), name=toon.uniqueName("hitBySuit-spinP")) # play some sounds #i = self.avIdList.index(avId) soundTrack = Sequence() # Func(base.playSfx, self.sndTable['hitBySuit'][i]), # Wait(flyDur * (2./3.)), # SoundInterval(self.sndTable['falling'][i], # duration=(flyDur*(1./3.))), # name=toon.uniqueName("hitBySuit-soundTrack")) def preFunc(self=self, avId=avId, toon=toon, dropShadow=dropShadow): forwardSpeed = toon.forwardSpeed rotateSpeed = toon.rotateSpeed if avId == localAvatar.doId: # disable control of local toon #self.orthoWalk.stop() toon.stopSmooth() base.cr.playGame.getPlace().fsm.request('stopped') else: toon.stopSmooth() # preserve old bug/feature where toon would be running in the air # if toon was moving, make him continue to run if forwardSpeed or rotateSpeed: toon.setSpeed(forwardSpeed, rotateSpeed) # set toon's speed to zero to stop any walk animations # leave it, it's funny to see toon running in mid-air #toon.setSpeed(0,0) # hide the toon's dropshadow toon.dropShadow.hide() def postFunc(self=self, avId=avId, oldGeomNodeZ=oldGeomNodeZ, dropShadow=dropShadow, parentNode=parentNode): if avId == localAvatar.doId: base.localAvatar.setPos(endPos) # game may have ended by now, check if hasattr(self, 'orthoWalk'): # re-enable control of local toon self.orthoWalk.start() # get rid of the dropshadow dropShadow.removeNode() del dropShadow # show the toon's dropshadow if toon and toon.dropShadow: toon.dropShadow.show() # get rid of the extra nodes geomNode = toon.getGeomNode() rotNode = geomNode.getParent() baseNode = rotNode.getParent() geomNode.reparentTo(baseNode) rotNode.removeNode() del rotNode geomNode.setZ(oldGeomNodeZ) toon.reparentTo(render) toon.setPos(endPos) parentNode.removeNode() del parentNode if avId == localAvatar.doId: toon.startSmooth() place = base.cr.playGame.getPlace() if place and hasattr(place, 'fsm'): place.fsm.request('walk') else: toon.startSmooth() # call the preFunc _this_frame_ to ensure that the local toon # update task does not run this frame preFunc() hitTrack = Sequence( Func(toon.setPos, Point3(0.0, 0.0, 0.0)), Wait(0.25), Parallel( flyTrack, cameraTrack, self.soundIUpDown, #Parallel(flyTrack, self.soundIUpDown, spinHTrack, spinPTrack, soundTrack), Func(postFunc), name=toon.uniqueName("hitBySuit")) self.toonHitTracks[avId] = hitTrack hitTrack.start() #globalClockDelta.localElapsedTime(timestamp)) posM = moleHill.getPos(render) posN = Point3(posM[0], posM[1], posM[2] + 4.0) #kapow = MovieUtil.createKapowExplosionTrack(render, posN, 3.0) #kapow.start() self.soundBomb.play() self.soundBomb2.play()
def setIt(self, avId): if not self.hasLocalToon: return if self.gameFSM.getCurrentState().getName() != 'play': self.notify.debug('Ignoring setIt after done playing') return self.itText.show() self.notify.debug(str(avId) + ' is now it') if avId == self.localAvId: self.itText.setText(TTLocalizer.TagGameYouAreIt) base.localAvatar.isIt = 1 base.localAvatar.controlManager.setSpeeds( OTPGlobals.ToonForwardSpeed * self.IT_SPEED_INCREASE, OTPGlobals.ToonJumpForce, OTPGlobals.ToonReverseSpeed * self.IT_SPEED_INCREASE, OTPGlobals.ToonRotateSpeed * self.IT_ROT_INCREASE) else: self.itText.setText(TTLocalizer.TagGameSomeoneElseIsIt % self.getAvatarName(avId)) base.localAvatar.isIt = 0 base.localAvatar.setWalkSpeedNormal() avatar = self.getAvatar(avId) if avatar: self.itPointer.reparentTo(avatar) self.itPointer.setZ(avatar.getHeight()) base.playSfx(self.tagSfx) toon = self.getAvatar(avId) duration = 0.6 if not toon: return spinTrack = LerpHprInterval(toon.getGeomNode(), duration, Point3(0, 0, 0), startHpr=Point3(-1800.0, 0, 0), blendType='easeOut') growTrack = Parallel() gs = 2.5 for hi in xrange(toon.headParts.getNumPaths()): head = toon.headParts[hi] growTrack.append( LerpScaleInterval(head, duration, Point3(gs, gs, gs))) def bounceFunc(t, trajectory, node=toon.getGeomNode()): node.setZ(trajectory.calcZ(t)) def bounceCleanupFunc(node=toon.getGeomNode(), z=toon.getGeomNode().getZ()): node.setZ(z) bounceTrack = Sequence() startZ = toon.getGeomNode().getZ() tLen = 0 zVel = 30 decay = 0.6 while tLen < duration: trajectory = Trajectory.Trajectory(0, Point3(0, 0, startZ), Point3(0, 0, zVel), gravMult=5.0) dur = trajectory.calcTimeOfImpactOnPlane(startZ) if dur <= 0: break bounceTrack.append( LerpFunctionInterval(bounceFunc, fromData=0.0, toData=dur, duration=dur, extraArgs=[trajectory])) tLen += dur zVel *= decay bounceTrack.append(Func(bounceCleanupFunc)) tagTrack = Sequence(Func(toon.animFSM.request, 'off'), Parallel(spinTrack, growTrack, bounceTrack), Func(toon.animFSM.request, 'Happy')) self.tracks.append(tagTrack) tagTrack.start() if self.IT: it = self.getAvatar(self.IT) shrinkTrack = Parallel() for hi in xrange(it.headParts.getNumPaths()): head = it.headParts[hi] scale = ToontownGlobals.toonHeadScales[it.style.getAnimal()] shrinkTrack.append(LerpScaleInterval(head, duration, scale)) self.tracks.append(shrinkTrack) shrinkTrack.start() self.IT = avId
def __showToonHitBySuit(self, avId, timestamp): toon = self.getAvatar(avId) if toon == None: return rng = self.toonRNGs[self.avIdList.index(avId)] curPos = toon.getPos(render) oldTrack = self.toonHitTracks[avId] if oldTrack.isPlaying(): oldTrack.finish() toon.setPos(curPos) toon.setZ(self.TOON_Z) parentNode = render.attachNewNode('mazeFlyToonParent-' + `avId`) parentNode.setPos(toon.getPos()) toon.reparentTo(parentNode) toon.setPos(0,0,0) startPos = parentNode.getPos() dropShadow = toon.dropShadow.copyTo(parentNode) dropShadow.setScale(toon.dropShadow.getScale(render)) trajectory = Trajectory.Trajectory( 0, Point3(0,0,0), Point3(0,0,50), gravMult=1.0) flyDur = trajectory.calcTimeOfImpactOnPlane(0.0) while 1: endTile = [rng.randint(2, self.maze.width-1), rng.randint(2, self.maze.height-1)] if self.maze.isWalkable(endTile[0], endTile[1]): break endWorldCoords = self.maze.tile2world(endTile[0], endTile[1]) endPos = Point3(endWorldCoords[0], endWorldCoords[1], startPos[2]) def flyFunc(t, trajectory, startPos = startPos, endPos = endPos, dur = flyDur, moveNode = parentNode, flyNode = toon): u = t/dur moveNode.setX(startPos[0] + u * (endPos[0]-startPos[0])) moveNode.setY(startPos[1] + u * (endPos[1]-startPos[1])) flyNode.setPos(trajectory.getPos(t)) flyTrack = Sequence( LerpFunctionInterval(flyFunc, fromData=0.0, toData=flyDur, duration=flyDur, extraArgs=[trajectory]), name=toon.uniqueName('hitBySuit-fly')) if avId != self.localAvId: cameraTrack = Sequence() else: self.camParent.reparentTo(parentNode) startCamPos = camera.getPos() destCamPos = camera.getPos() zenith = trajectory.getPos(flyDur/2.0)[2] destCamPos.setZ(zenith*1.3) destCamPos.setY(destCamPos[1]*0.3) def camTask(task, zenith = zenith, flyNode = toon, startCamPos = startCamPos, camOffset = destCamPos - startCamPos): u = flyNode.getZ()/zenith camera.setPos(startCamPos + camOffset*u) camera.lookAt(toon) return Task.cont camTaskName = 'mazeToonFlyCam-' + `avId` taskMgr.add(camTask, camTaskName, priority=20) def cleanupCamTask(self = self, toon = toon, camTaskName = camTaskName, startCamPos = startCamPos): taskMgr.remove(camTaskName) self.camParent.reparentTo(toon) camera.setPos(startCamPos) camera.lookAt(toon) cameraTrack = Sequence( Wait(flyDur), Func(cleanupCamTask), name='hitBySuit-cameraLerp') geomNode = toon.getGeomNode() startHpr = geomNode.getHpr() destHpr = Point3(startHpr) hRot = rng.randrange(1, 8) if rng.choice([0, 1]): hRot = -hRot destHpr.setX(destHpr[0] + hRot*360) spinHTrack = Sequence( LerpHprInterval(geomNode, flyDur, destHpr, startHpr=startHpr), Func(geomNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinH')) parent = geomNode.getParent() rotNode = parent.attachNewNode('rotNode') geomNode.reparentTo(rotNode) rotNode.setZ(toon.getHeight()/2.0) oldGeomNodeZ = geomNode.getZ() geomNode.setZ(-toon.getHeight()/2.0) startHpr = rotNode.getHpr() destHpr = Point3(startHpr) pRot = rng.randrange(1,3) if rng.choice([0, 1]): pRot = -pRot destHpr.setY(destHpr[1] + pRot*360) spinPTrack = Sequence( LerpHprInterval(rotNode, flyDur, destHpr, startHpr=startHpr), Func(rotNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinP')) i = self.avIdList.index(avId) soundTrack = Sequence( Func(base.playSfx, self.sndTable['hitBySuit'][i]), Wait(flyDur * (2.0/3.0)), SoundInterval(self.sndTable['falling'][i], duration=flyDur * (1.0/3.0)), name=toon.uniqueName('hitBySuit-soundTrack')) def preFunc(self = self, avId = avId, toon = toon, dropShadow = dropShadow): forwardSpeed = toon.forwardSpeed rotateSpeed = toon.rotateSpeed if avId == self.localAvId: self.orthoWalk.stop() else: toon.stopSmooth() if forwardSpeed or rotateSpeed: toon.setSpeed(forwardSpeed, rotateSpeed) toon.dropShadow.hide() def postFunc(self = self, avId = avId, oldGeomNodeZ = oldGeomNodeZ, dropShadow = dropShadow, parentNode = parentNode): if avId == self.localAvId: base.localAvatar.setPos(endPos) if hasattr(self, 'orthoWalk'): if self.gameFSM.getCurrentState().getName() == 'play': self.orthoWalk.start() dropShadow.removeNode() del dropShadow toon.dropShadow.show() geomNode = toon.getGeomNode() rotNode = geomNode.getParent() baseNode = rotNode.getParent() geomNode.reparentTo(baseNode) rotNode.removeNode() del rotNode geomNode.setZ(oldGeomNodeZ) toon.reparentTo(render) toon.setPos(endPos) parentNode.removeNode() del parentNode if avId != self.localAvId: toon.startSmooth() preFunc() hitTrack = Sequence(Parallel(flyTrack, cameraTrack, spinHTrack, spinPTrack, soundTrack), Func(postFunc), name=toon.uniqueName('hitBySuit')) self.toonHitTracks[avId] = hitTrack hitTrack.start(globalClockDelta.localElapsedTime(timestamp))