toontown-just-works/toontown/coghq/GameSprite3D.py
2024-07-07 18:08:39 -05:00

364 lines
13 KiB
Python

from panda3d.core import *
from direct.interval.IntervalGlobal import *
import math
import random
class GameSprite:
colorRed = Vec4(1, 0.2, 0.2, 1)
colorBlue = Vec4(0.7, 0.8, 1, 1)
colorGreen = Vec4(0, 1, 0, 1)
colorGhostRed = Vec4(1, 0.2, 0.2, 0.5)
colorGhostBlue = Vec4(0.7, 0.8, 1, 0.5)
colorGhostGreen = Vec4(0, 1, 0, 0.5)
colorDisolveRed = Vec4(1, 0.2, 0.2, 0.0)
colorDisolveBlue = Vec4(0.7, 0.8, 1, 0.0)
colorDisolveGreen = Vec4(0, 1, 0, 0.0)
colorWhite = Vec4(1, 1, 1, 1)
colorBlack = Vec4(0, 0, 0, 1.0)
colorDisolveWhite = Vec4(1, 1, 1, 0.0)
colorDisolveBlack = Vec4(0, 0, 0, 0.0)
colorShadow = Vec4(0, 0, 0, 0.5)
colorPurple = Vec4(1.0, 0, 1.0, 1.0)
colorDisolvePurple = Vec4(1.0, 0, 1.0, 0.0)
colorYellow = Vec4(1.0, 1.0, 0.0, 1.0)
colorDisolveYellow = Vec4(1.0, 1.0, 0.0, 0.0)
colorOrange = Vec4(1.0, 0.5, 0.0, 1.0)
colorDisolveOrange = Vec4(1.0, 0.5, 0.0, 0.0)
colorAqua = Vec4(0.0, 1.0, 1.0, 1.0)
colorDisolveAqua = Vec4(0.0, 1.0, 1.0, 0.0)
colorSteel = Vec4(0.5, 0.5, 0.5, 1.0)
colorSteelDissolve = Vec4(0.5, 0.5, 0.5, 0.0)
colorList = (colorRed,
colorBlue,
colorGreen,
colorWhite,
colorBlack,
colorPurple,
colorYellow,
colorOrange,
colorAqua,
colorSteel)
disolveList = (colorDisolveRed,
colorDisolveBlue,
colorDisolveGreen,
colorDisolveWhite,
colorDisolveBlack,
colorDisolvePurple,
colorDisolveYellow,
colorDisolveOrange,
colorDisolveAqua,
colorSteelDissolve)
def __init__(self, spriteBase, size, colorType = 0, foundation = 0, facing = 0):
self.colorType = colorType
self.spriteBase = spriteBase
self.frame = self.spriteBase.getParent()
self.foundation = foundation
self.sizeMult = 1.4
self.velX = 0
self.velZ = 0
self.prevX = 0
self.prevZ = 0
self.isActive = 0
self.canCollide = 1
self.accX = None
self.accZ = None
self.delayRemove = 0
self.giftId = None
self.holdType = None
self.multiColor = 0
self.multiColorList = [0,
1,
2,
6]
self.multiColorIndex = 0
self.multiColorNext = 1
self.multiColorLevel = 0.0
self.multiColorStep = 0.025
self.facing = facing
self.breakable = 1
self.deleteFlag = 0
self.nodeObj = None
self.inputSize = size
myColor = GameSprite.colorWhite
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_white'
self.setBallType(colorType)
self.size = 0.4 * self.sizeMult
self.isQue = 0
self.nodeObj.setTransparency(TransparencyAttrib.MAlpha)
self.markedForDeath = 0
self.gridPosX = None
self.gridPosZ = None
return
def setBallType(self, type, solidOverride = 0):
if not self.nodeObj or self.nodeObj.isEmpty():
self.nodeObj = None
else:
self.nodeObj.removeNode()
colorType = type
self.multiColor = 0
self.breakable = 1
solid = self.foundation
if solidOverride:
solid = 1
myColor = GameSprite.colorWhite
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_white'
if not solid or colorType > 9:
if colorType == 0:
myColor = GameSprite.colorGhostRed
elif colorType == 1:
myColor = GameSprite.colorGhostBlue
elif colorType == 2:
myColor = GameSprite.colorGhostGreen
elif colorType == 3:
myColor = GameSprite.colorWhite
elif colorType == 4:
myColor = GameSprite.colorBlack
elif colorType == 5:
myColor = GameSprite.colorPurple
elif colorType == 6:
myColor = GameSprite.colorYellow
elif colorType == 7:
myColor = GameSprite.colorOrange
self.multiColor = 1
self.multiColorList = [7, 4]
self.multiColorIndex = 0
self.multiColorNext = 1
self.multiColorLevel = 0.0
self.multiColorStep = 0.1
elif colorType == 8:
myColor = GameSprite.colorAqua
self.multiColor = 1
self.multiColorList = [0,
1,
2,
6]
self.multiColorIndex = 0
self.multiColorNext = 1
self.multiColorLevel = 0.0
self.multiColorStep = 0.025
elif colorType == 9:
myColor = GameSprite.colorSteel
self.breakable = 0
elif colorType == 10:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_fire'
self.giftId = 7
self.colorType = 0
elif colorType == 11:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_unknown'
self.giftId = 8
self.colorType = 1
elif colorType == 0:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_red'
elif colorType == 1:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_blue'
elif colorType == 2:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_green'
elif colorType == 3:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_cog'
elif colorType == 4:
myColor = GameSprite.colorBlack
elif colorType == 5:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_purple'
elif colorType == 6:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_yello'
elif colorType == 7:
myColor = GameSprite.colorOrange
self.multiColor = 1
self.multiColorList = [7, 4]
self.multiColorIndex = 0
self.multiColorNext = 1
self.multiColorLevel = 0.0
self.multiColorStep = 0.15
elif colorType == 8:
myColor = GameSprite.colorAqua
self.multiColor = 1
self.multiColorList = [0,
1,
2,
6]
self.multiColorIndex = 0
self.multiColorNext = 1
self.multiColorLevel = 0.0
self.multiColorStep = 0.1
elif colorType == 9:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_steel'
self.breakable = 0
elif colorType == 10:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_fire'
self.giftId = 7
self.colorType = 0
elif colorType == 11:
myModel = 'phase_12/models/bossbotHQ/bust_a_cog_ball_unknown'
self.giftId = 8
self.colorType = 1
self.nodeObj = loader.loadModel(myModel)
self.nodeObj.setScale(self.inputSize)
self.nodeObj.reparentTo(self.spriteBase)
self.setColor(myColor)
return
def removeDelay(self):
self.delayRemove = 0
def delete(self):
if not self.delayRemove:
self.spriteBase.removeNode()
self.deleteFlag = 1
def face(self):
frameZ = self.frame.getZ()
tilt = -95.0 + (self.getZ() + frameZ) * 2.0
self.nodeObj.setP(-tilt)
def runColor(self):
if self.multiColor:
c1 = GameSprite.colorList[self.multiColorList[self.multiColorIndex]]
c2 = GameSprite.colorList[self.multiColorList[self.multiColorNext]]
iLevel = 1.0 - self.multiColorLevel
mixColor = c1 * iLevel + c2 * self.multiColorLevel
self.nodeObj.setColorScale(mixColor)
self.multiColorLevel += self.multiColorStep
if self.multiColorLevel > 1.0:
self.multiColorLevel = 0.0
self.multiColorIndex += 1
if self.multiColorIndex >= len(self.multiColorList):
self.multiColorIndex = 0
self.multiColorNext = self.multiColorIndex + 1
if self.multiColorNext >= len(self.multiColorList):
self.multiColorNext = 0
def run(self, timeDelta):
if self.facing:
self.face()
self.runColor()
if self.isActive and not self.isQue:
self.prevX = self.spriteBase.getX()
self.prevZ = self.spriteBase.getZ()
self.setX(self.getX() + self.velX * timeDelta)
self.setZ(self.getZ() + self.velZ * timeDelta)
self.velX = self.velX * (1 - timeDelta * 4)
self.velZ = self.velZ * (1 - timeDelta * 4)
if self.accX != None:
self.velX = self.accX
self.velZ = self.accZ
if self.nodeObj.isEmpty():
self.markedForDeath = 1
return
def reflectX(self):
self.velX = -self.velX
if self.accX != None:
self.accX = -self.accX
return
def reflectZ(self):
self.velZ = -self.velZ
if self.accZ != None:
self.accZ = -self.accZ
return
def warningBump(self):
num1 = random.random() * 2.0
num2 = random.random() * 2.0
num3 = random.random() * 2.0
curr = self.nodeObj.getPos()
dest = Point3(0 + curr[0], 0 + curr[1], 1.0 + curr[2])
track = Sequence(Wait(num1 * 0.1), LerpPosInterval(self.nodeObj, num2 * 0.1, Point3(0.0, 0.0, 0.5)), LerpPosInterval(self.nodeObj, num3 * 0.1, Point3(0.0, 0.0, 0.0)), LerpPosInterval(self.nodeObj, num2 * 0.1, Point3(0.0, 0.0, 0.5)), LerpPosInterval(self.nodeObj, num1 * 0.1, Point3(0.0, 0.0, 0.0)))
track.start()
def shake(self):
num1 = random.random() * 1.0
num2 = random.random() * 1.0
curr = self.nodeObj.getPos()
dest = Point3(0 + curr[0], 0 + curr[1], 1.0 + curr[2])
track = Sequence(LerpPosInterval(self.nodeObj, num2 * 0.1, Point3(0.0, 0.0, 0.25)), LerpPosInterval(self.nodeObj, num1 * 0.1, Point3(0.0, 0.0, 0.0)))
track.start()
def deathEffect(self):
if self.spriteBase.isEmpty():
return
self.spriteBase.wrtReparentTo(render)
num1 = (random.random() - 0.5) * 1.0
num2 = random.random() * 1.0
num3 = random.random() * 1.0
notNum3 = 1.0 - num3
curr = self.spriteBase.getPos()
self.delayRemove = 1
self.canCollide = 0
track = Sequence(Parallel(ProjectileInterval(self.spriteBase, startVel=Vec3(-20.0 + notNum3 * 40.0, -20.0 + num3 * 40.0, 30), duration=0.5 + num2 * 1.0, gravityMult=2.0), LerpColorScaleInterval(self.spriteBase, duration=0.5 + num2 * 1.0, startColorScale=GameSprite.colorList[self.colorType], colorScale=GameSprite.disolveList[self.colorType])), Func(self.removeDelay), Func(self.delete))
track.start()
def wildEffect(self):
if self.spriteBase.isEmpty():
return
num1 = (random.random() - 0.5) * 1.0
num2 = random.random() * 1.0
num3 = random.random() * 1.0
notNum3 = 1.0 - num3
curr = self.spriteBase.getPos()
self.delayRemove = 1
self.canCollide = 0
track = Sequence(Parallel(LerpScaleInterval(self.spriteBase, 1.0, 1.5, startScale=1.0), LerpColorScaleInterval(self.spriteBase, duration=1.0, startColorScale=GameSprite.colorList[self.colorType], colorScale=Vec4(0, 0, 0, 0.0))), Func(self.removeDelay), Func(self.delete))
track.start()
def setActive(self, active):
if active:
self.isActive = 1
else:
self.isActive = 0
self.velX = 0
self.velZ = 0
self.accX = None
self.accZ = None
return
def getX(self):
if self.nodeObj.isEmpty():
return None
return self.spriteBase.getX()
def getZ(self):
if self.nodeObj.isEmpty():
return None
return self.spriteBase.getZ()
def setX(self, x):
if self.nodeObj.isEmpty():
return None
self.prevX = self.spriteBase.getX()
self.spriteBase.setX(x)
return None
def setZ(self, z):
if self.nodeObj.isEmpty():
return None
self.prevZ = self.spriteBase.getZ()
self.spriteBase.setZ(z)
return None
def addForce(self, force, direction):
if self.isActive:
forceX = math.cos(direction) * force
forceZ = math.sin(direction) * force
self.velX += forceX
self.velZ += forceZ
def setAccel(self, accel, direction):
accelX = math.cos(direction) * accel
accelZ = math.sin(direction) * accel
self.accX = accelX
self.accZ = accelZ
def setColorType(self, typeIndex):
self.colorType = typeIndex
self.setColor(GameSprite.colorList[typeIndex])
def setColor(self, trip):
self.nodeObj.setColorScale(trip[0], trip[1], trip[2], trip[3])
def collide(self):
if self.isActive:
self.setX(self.prevX)
self.setZ(self.prevZ)