toontown-just-works/toontown/minigame/TwoDStomper.py
2024-07-07 18:08:39 -05:00

160 lines
6.5 KiB
Python

from direct.showbase.DirectObject import DirectObject
from toontown.toonbase.ToontownGlobals import *
from direct.directnotify import DirectNotifyGlobal
from direct.interval.IntervalGlobal import *
from toontown.minigame import ToonBlitzGlobals
GOING_UP = 1
GOING_DOWN = 2
STUCK_DOWN = 3
class TwoDStomper(DirectObject):
notify = DirectNotifyGlobal.directNotify.newCategory('TwoDStomper')
def __init__(self, stomperMgr, index, stomperAttribs, model):
self.game = stomperMgr.section.sectionMgr.game
self.index = index
stomperName = 'stomper-' + str(self.index)
self.model = NodePath(stomperName)
self.nodePath = model.copyTo(self.model)
self.ival = None
self.stashCollisionsIval = None
self.removeHeadFloor = 0
self.stomperState = STUCK_DOWN
self.setupStomper(stomperAttribs)
return
def destroy(self):
self.game = None
self.ignoreAll()
if self.ival:
self.ival.pause()
del self.ival
self.ival = None
if self.smoke:
self.smoke.removeNode()
del self.smoke
self.smoke = None
if self.stashCollisionsIval:
self.stashCollisionsIval.finish()
del self.stashCollisionsIval
self.stashCollisionsIval = None
for collSolid in self.collSolids:
collSolid.stash()
self.nodePath.removeNode()
del self.nodePath
self.model.removeNode()
if self.model:
self.model.removeNode()
del self.model
self.model = None
return
def setupStomper(self, stomperAttribs):
stomperType = stomperAttribs[0]
self.pos = Point3(stomperAttribs[1][0], stomperAttribs[1][1], stomperAttribs[1][2])
self.period = stomperAttribs[2]
typeAttribs = ToonBlitzGlobals.StomperTypes[stomperType]
self.motionType = typeAttribs[0]
self.scale = typeAttribs[1]
self.headStartZ, self.headEndZ = typeAttribs[2]
self.shaftStartScaleZ, self.shaftEndScaleZ = typeAttribs[3]
self.numCollSolids = typeAttribs[4]
self.stompSound = loader.loadSfx('phase_4/audio/sfx/CHQ_FACT_stomper_small.ogg')
self.model.setPos(self.pos)
self.model.setScale(self.scale)
self.model.find('**/block').setScale(1.0 / self.scale)
self.head = self.model.find('**/head')
self.shaft = self.model.find('**/shaft')
self.collisions = self.model.find('**/stomper_collision')
originalColl = self.model.find('**/stomper_collision')
self.range = self.headEndZ - self.headStartZ
self.collSolids = []
self.collSolids.append(originalColl)
for i in xrange(self.numCollSolids - 1):
newColl = originalColl.copyTo(self.model)
self.collSolids.append(newColl)
self.collSolids[-1].reparentTo(self.head)
self.smoke = loader.loadModel('phase_4/models/props/test_clouds')
self.smoke.setZ(self.headEndZ - 1)
self.smoke.setColor(0.8, 0.7, 0.5, 1)
self.smoke.setBillboardPointEye()
self.smoke.setScale(1.0 / self.scale)
self.smoke.setDepthWrite(False)
def getMotionIval(self):
def motionFunc(t, self = self):
stickTime = 0.2
turnaround = 0.95
t = t % 1
if t < stickTime:
self.head.setFluidZ(0 + self.headEndZ)
if self.stomperState != STUCK_DOWN:
self.stomperState = STUCK_DOWN
elif t < turnaround:
self.head.setFluidZ((t - stickTime) * -self.range / (turnaround - stickTime) + self.headEndZ)
if self.stomperState != GOING_UP:
self.stomperState = GOING_UP
elif t > turnaround:
self.head.setFluidZ(-self.range + (t - turnaround) * self.range / (1 - turnaround) + self.headEndZ)
if self.stomperState != GOING_DOWN:
self.stomperState = GOING_DOWN
self.checkSquashedToon()
motionIval = Sequence(LerpFunctionInterval(motionFunc, duration=self.period))
return motionIval
def getSmokeTrack(self):
smokeTrack = Sequence(Parallel(LerpScaleInterval(self.smoke, 0.2, Point3(1, 1, 1.5)), LerpColorScaleInterval(self.smoke, 0.4, VBase4(1, 1, 1, 0), VBase4(1, 1, 1, 0.5))), Func(self.smoke.reparentTo, hidden), Func(self.smoke.clearColorScale))
return smokeTrack
def adjustShaftScale(self, t):
heightDiff = self.head.getZ() - self.headStartZ
self.shaft.setScale(1, 1, self.shaftStartScaleZ + heightDiff * (self.shaftEndScaleZ - self.shaftStartScaleZ) / self.range)
def adjustCollSolidHeight(self, t):
heightDiff = self.head.getZ() - self.headStartZ
for i in xrange(1, len(self.collSolids) - 1):
self.collSolids[i].setZ(heightDiff * i / (self.numCollSolids - 1))
def start(self, elapsedTime):
if self.ival:
self.ival.pause()
del self.ival
self.ival = None
self.ival = Parallel()
self.ival.append(Sequence(self.getMotionIval(), Func(base.playSfx, self.stompSound, node=self.model, volume=0.3), Func(self.smoke.reparentTo, self.model), self.getSmokeTrack()))
self.ival.append(LerpFunctionInterval(self.adjustShaftScale, duration=self.period))
self.ival.append(LerpFunctionInterval(self.adjustCollSolidHeight, duration=self.period))
self.ival.loop()
self.ival.setT(elapsedTime)
return
def enterPause(self):
if self.ival:
self.ival.pause()
def exitPause(self):
if self.ival:
self.ival.loop()
def checkSquashedToon(self):
toonXDiff = (base.localAvatar.getX(render) - self.model.getX(render)) / self.scale
toonZ = base.localAvatar.getZ(render)
headEndZAbs = self.model.getZ(render) + self.headEndZ * self.scale
if toonXDiff > -1.0 and toonXDiff < 1.0 and toonZ > headEndZAbs and toonZ < self.head.getZ(render):
if not base.localAvatar.isStunned:
def stashCollisions(self = self):
for collSolid in self.collSolids:
collSolid.stash()
def unstashCollisions(self = self):
for collSolid in self.collSolids:
collSolid.unstash()
self.stashCollisionsIval = Sequence(Func(stashCollisions), Wait(2.5), Func(unstashCollisions))
self.stashCollisionsIval.start()
self.game.localToonSquished()