mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-11-01 09:17:54 +00:00
798 lines
29 KiB
Python
798 lines
29 KiB
Python
from direct.actor import Actor
|
|
from otp.avatar import Avatar
|
|
import SuitDNA
|
|
from toontown.toonbase import ToontownGlobals
|
|
from pandac.PandaModules import *
|
|
from toontown.battle import SuitBattleGlobals
|
|
from toontown.nametag import NametagGlobals
|
|
from direct.task.Task import Task
|
|
from toontown.battle import BattleProps
|
|
from toontown.toonbase import TTLocalizer
|
|
from pandac.PandaModules import VirtualFileMountHTTP, VirtualFileSystem, Filename, DSearchPath
|
|
from direct.showbase import AppRunnerGlobal
|
|
from toontown.nametag import NametagGroup
|
|
import string
|
|
import os
|
|
from toontown.suit import SuitGlobals
|
|
|
|
aSize = 6.06
|
|
bSize = 5.29
|
|
cSize = 4.14
|
|
SuitDialogArray = []
|
|
SkelSuitDialogArray = []
|
|
AllSuits = (('walk', 'walk'), ('run', 'walk'), ('neutral', 'neutral'))
|
|
AllSuitsMinigame = (('victory', 'victory'),
|
|
('flail', 'flailing'),
|
|
('tug-o-war', 'tug-o-war'),
|
|
('slip-backward', 'slip-backward'),
|
|
('slip-forward', 'slip-forward'))
|
|
AllSuitsTutorialBattle = (('lose', 'lose'), ('pie-small-react', 'pie-small'), ('squirt-small-react', 'squirt-small'))
|
|
AllSuitsBattle = (('drop-react', 'anvil-drop'),
|
|
('flatten', 'drop'),
|
|
('sidestep-left', 'sidestep-left'),
|
|
('sidestep-right', 'sidestep-right'),
|
|
('squirt-large-react', 'squirt-large'),
|
|
('landing', 'landing'),
|
|
('reach', 'walknreach'),
|
|
('rake-react', 'rake'),
|
|
('hypnotized', 'hypnotize'),
|
|
('soak', 'soak'),
|
|
('lured', 'lured'))
|
|
SuitsCEOBattle = (('sit', 'sit'),
|
|
('sit-eat-in', 'sit-eat-in'),
|
|
('sit-eat-loop', 'sit-eat-loop'),
|
|
('sit-eat-out', 'sit-eat-out'),
|
|
('sit-angry', 'sit-angry'),
|
|
('sit-hungry-left', 'leftsit-hungry'),
|
|
('sit-hungry-right', 'rightsit-hungry'),
|
|
('sit-lose', 'sit-lose'),
|
|
('tray-walk', 'tray-walk'),
|
|
('tray-neutral', 'tray-neutral'),
|
|
('sit-lose', 'sit-lose'))
|
|
f = (('throw-paper', 'throw-paper', 3.5), ('phone', 'phone', 3.5), ('shredder', 'shredder', 3.5))
|
|
p = (('pencil-sharpener', 'pencil-sharpener', 5),
|
|
('pen-squirt', 'pen-squirt', 5),
|
|
('hold-eraser', 'hold-eraser', 5),
|
|
('finger-wag', 'finger-wag', 5),
|
|
('hold-pencil', 'hold-pencil', 5))
|
|
ym = (('throw-paper', 'throw-paper', 5),
|
|
('golf-club-swing', 'golf-club-swing', 5),
|
|
('magic3', 'magic3', 5),
|
|
('rubber-stamp', 'rubber-stamp', 5),
|
|
('smile', 'smile', 5))
|
|
mm = (('speak', 'speak', 5),
|
|
('effort', 'effort', 5),
|
|
('magic1', 'magic1', 5),
|
|
('pen-squirt', 'fountain-pen', 5),
|
|
('finger-wag', 'finger-wag', 5))
|
|
ds = (('magic1', 'magic1', 5),
|
|
('magic2', 'magic2', 5),
|
|
('throw-paper', 'throw-paper', 5),
|
|
('magic3', 'magic3', 5))
|
|
hh = (('pen-squirt', 'fountain-pen', 7),
|
|
('glower', 'glower', 5),
|
|
('throw-paper', 'throw-paper', 5),
|
|
('magic1', 'magic1', 5),
|
|
('roll-o-dex', 'roll-o-dex', 5))
|
|
cr = (('pickpocket', 'pickpocket', 5), ('throw-paper', 'throw-paper', 3.5), ('glower', 'glower', 5))
|
|
tbc = (('cigar-smoke', 'cigar-smoke', 8),
|
|
('glower', 'glower', 5),
|
|
('song-and-dance', 'song-and-dance', 8),
|
|
('golf-club-swing', 'golf-club-swing', 5))
|
|
cc = (('speak', 'speak', 5),
|
|
('glower', 'glower', 5),
|
|
('phone', 'phone', 3.5),
|
|
('finger-wag', 'finger-wag', 5))
|
|
tm = (('speak', 'speak', 5),
|
|
('throw-paper', 'throw-paper', 5),
|
|
('pickpocket', 'pickpocket', 5),
|
|
('roll-o-dex', 'roll-o-dex', 5),
|
|
('finger-wag', 'finger-wag', 5))
|
|
nd = (('pickpocket', 'pickpocket', 5),
|
|
('roll-o-dex', 'roll-o-dex', 5),
|
|
('magic3', 'magic3', 5),
|
|
('smile', 'smile', 5))
|
|
gh = (('speak', 'speak', 5), ('pen-squirt', 'fountain-pen', 5), ('rubber-stamp', 'rubber-stamp', 5))
|
|
ms = (('effort', 'effort', 5),
|
|
('throw-paper', 'throw-paper', 5),
|
|
('stomp', 'stomp', 5),
|
|
('quick-jump', 'jump', 6))
|
|
tf = (('phone', 'phone', 5),
|
|
('smile', 'smile', 5),
|
|
('throw-object', 'throw-object', 5),
|
|
('glower', 'glower', 5))
|
|
m = (('speak', 'speak', 5),
|
|
('magic2', 'magic2', 5),
|
|
('magic1', 'magic1', 5),
|
|
('golf-club-swing', 'golf-club-swing', 5))
|
|
mh = (('magic1', 'magic1', 5),
|
|
('smile', 'smile', 5),
|
|
('golf-club-swing', 'golf-club-swing', 5),
|
|
('song-and-dance', 'song-and-dance', 5))
|
|
sc = (('throw-paper', 'throw-paper', 3.5), ('watercooler', 'watercooler', 5), ('pickpocket', 'pickpocket', 5))
|
|
pp = (('throw-paper', 'throw-paper', 5), ('glower', 'glower', 5), ('finger-wag', 'fingerwag', 5))
|
|
tw = (('throw-paper', 'throw-paper', 3.5),
|
|
('glower', 'glower', 5),
|
|
('magic2', 'magic2', 5),
|
|
('finger-wag', 'finger-wag', 5))
|
|
bc = (('phone', 'phone', 5), ('hold-pencil', 'hold-pencil', 5))
|
|
nc = (('phone', 'phone', 5), ('throw-object', 'throw-object', 5))
|
|
mb = (('magic1', 'magic1', 5), ('throw-paper', 'throw-paper', 3.5))
|
|
ls = (('throw-paper', 'throw-paper', 5), ('throw-object', 'throw-object', 5), ('hold-pencil', 'hold-pencil', 5))
|
|
rb = (('glower', 'glower', 5), ('magic1', 'magic1', 5), ('golf-club-swing', 'golf-club-swing', 5))
|
|
bf = (('pickpocket', 'pickpocket', 5),
|
|
('rubber-stamp', 'rubber-stamp', 5),
|
|
('shredder', 'shredder', 3.5),
|
|
('watercooler', 'watercooler', 5))
|
|
b = (('effort', 'effort', 5),
|
|
('throw-paper', 'throw-paper', 5),
|
|
('throw-object', 'throw-object', 5),
|
|
('magic1', 'magic1', 5))
|
|
dt = (('rubber-stamp', 'rubber-stamp', 5),
|
|
('throw-paper', 'throw-paper', 5),
|
|
('speak', 'speak', 5),
|
|
('finger-wag', 'fingerwag', 5),
|
|
('throw-paper', 'throw-paper', 5))
|
|
ac = (('throw-object', 'throw-object', 5),
|
|
('roll-o-dex', 'roll-o-dex', 5),
|
|
('stomp', 'stomp', 5),
|
|
('phone', 'phone', 5),
|
|
('throw-paper', 'throw-paper', 5))
|
|
bs = (('magic1', 'magic1', 5), ('throw-paper', 'throw-paper', 5), ('finger-wag', 'fingerwag', 5))
|
|
sd = (('magic2', 'magic2', 5),
|
|
('quick-jump', 'jump', 6),
|
|
('stomp', 'stomp', 5),
|
|
('magic3', 'magic3', 5),
|
|
('hold-pencil', 'hold-pencil', 5),
|
|
('throw-paper', 'throw-paper', 5))
|
|
le = (('speak', 'speak', 5),
|
|
('throw-object', 'throw-object', 5),
|
|
('glower', 'glower', 5),
|
|
('throw-paper', 'throw-paper', 5))
|
|
bw = (('finger-wag', 'fingerwag', 5),
|
|
('cigar-smoke', 'cigar-smoke', 8),
|
|
('gavel', 'gavel', 8),
|
|
('magic1', 'magic1', 5),
|
|
('throw-object', 'throw-object', 5),
|
|
('throw-paper', 'throw-paper', 5))
|
|
if not base.config.GetBool('want-new-cogs', 0):
|
|
ModelDict = {'a': ('/models/char/suitA-', 4),
|
|
'b': ('/models/char/suitB-', 4),
|
|
'c': ('/models/char/suitC-', 3.5)}
|
|
TutorialModelDict = {'a': ('/models/char/suitA-', 4),
|
|
'b': ('/models/char/suitB-', 4),
|
|
'c': ('/models/char/suitC-', 3.5)}
|
|
else:
|
|
ModelDict = {'a': ('/models/char/tt_a_ene_cga_', 4),
|
|
'b': ('/models/char/tt_a_ene_cgb_', 4),
|
|
'c': ('/models/char/tt_a_ene_cgc_', 3.5)}
|
|
TutorialModelDict = {'a': ('/models/char/tt_a_ene_cga_', 4),
|
|
'b': ('/models/char/tt_a_ene_cgb_', 4),
|
|
'c': ('/models/char/tt_a_ene_cgc_', 3.5)}
|
|
HeadModelDict = {'a': ('/models/char/suitA-', 4),
|
|
'b': ('/models/char/suitB-', 4),
|
|
'c': ('/models/char/suitC-', 3.5)}
|
|
|
|
SuitParts = ['phase_3.5/models/char/suitA-mod',
|
|
'phase_3.5/models/char/suitB-mod',
|
|
'phase_3.5/models/char/suitC-mod',
|
|
'phase_4/models/char/suitA-heads',
|
|
'phase_4/models/char/suitB-heads',
|
|
'phase_3.5/models/char/suitC-heads']
|
|
|
|
Preloaded = {}
|
|
|
|
def loadModels():
|
|
global Preloaded
|
|
if not Preloaded:
|
|
print 'Preloading suits...'
|
|
for filepath in SuitParts:
|
|
Preloaded[filepath] = loader.loadModel(filepath)
|
|
Preloaded[filepath].flattenMedium()
|
|
|
|
def loadTutorialSuit():
|
|
loader.loadModel('phase_3.5/models/char/suitC-mod')
|
|
loadDialog(1)
|
|
|
|
def loadSuits(level):
|
|
loadDialog(level)
|
|
|
|
def unloadSuits(level):
|
|
#loadSuitModelsAndAnims(level, flag=0)
|
|
unloadDialog(level)
|
|
|
|
def loadSuitModelsAndAnims(level, flag = 0):
|
|
for key in ModelDict.keys():
|
|
model, phase = ModelDict[key]
|
|
if flag:
|
|
filepath = 'phase_3.5' + model + 'mod'
|
|
Preloaded[filepath] = loader.loadModel(filepath)
|
|
filepath = 'phase_' + str(phase) + model + 'heads'
|
|
Preloaded[filepath] = loader.loadModel(filepath)
|
|
|
|
def cogExists(filePrefix):
|
|
searchPath = DSearchPath()
|
|
if AppRunnerGlobal.appRunner:
|
|
searchPath.appendDirectory(Filename.expandFrom('$TT_3_5_ROOT/phase_3.5'))
|
|
else:
|
|
basePath = os.path.expandvars('$TTMODELS') or './ttmodels'
|
|
searchPath.appendDirectory(Filename.fromOsSpecific(basePath + '/built/phase_3.5'))
|
|
filePrefix = filePrefix.strip('/')
|
|
pfile = Filename(filePrefix)
|
|
found = vfs.resolveFilename(pfile, searchPath)
|
|
if not found:
|
|
return False
|
|
return True
|
|
|
|
|
|
def loadSuitAnims(suit, flag = 1):
|
|
if suit in SuitDNA.suitHeadTypes:
|
|
try:
|
|
animList = eval(suit)
|
|
except NameError:
|
|
animList = ()
|
|
|
|
else:
|
|
print 'Invalid suit name: ', suit
|
|
return -1
|
|
for anim in animList:
|
|
phase = 'phase_' + str(anim[2])
|
|
filePrefix = ModelDict[bodyType][0]
|
|
animName = filePrefix + anim[1]
|
|
if flag:
|
|
loader.loadModel(animName)
|
|
else:
|
|
loader.unloadModel(animName)
|
|
|
|
|
|
def loadDialog(level):
|
|
global SuitDialogArray
|
|
if len(SuitDialogArray) > 0:
|
|
return
|
|
else:
|
|
loadPath = 'phase_3.5/audio/dial/'
|
|
SuitDialogFiles = ['COG_VO_grunt',
|
|
'COG_VO_murmur',
|
|
'COG_VO_statement',
|
|
'COG_VO_question']
|
|
for file in SuitDialogFiles:
|
|
SuitDialogArray.append(base.loadSfx(loadPath + file + '.ogg'))
|
|
|
|
SuitDialogArray.append(SuitDialogArray[2])
|
|
SuitDialogArray.append(SuitDialogArray[2])
|
|
|
|
|
|
def loadSkelDialog():
|
|
global SkelSuitDialogArray
|
|
if len(SkelSuitDialogArray) > 0:
|
|
return
|
|
else:
|
|
grunt = loader.loadSfx('phase_5/audio/sfx/Skel_COG_VO_grunt.ogg')
|
|
murmur = loader.loadSfx('phase_5/audio/sfx/Skel_COG_VO_murmur.ogg')
|
|
statement = loader.loadSfx('phase_5/audio/sfx/Skel_COG_VO_statement.ogg')
|
|
question = loader.loadSfx('phase_5/audio/sfx/Skel_COG_VO_question.ogg')
|
|
SkelSuitDialogArray = [grunt,
|
|
murmur,
|
|
statement,
|
|
question,
|
|
statement,
|
|
statement]
|
|
|
|
|
|
def unloadDialog(level):
|
|
global SuitDialogArray
|
|
SuitDialogArray = []
|
|
|
|
|
|
def unloadSkelDialog():
|
|
global SkelSuitDialogArray
|
|
SkelSuitDialogArray = []
|
|
|
|
|
|
def attachSuitHead(node, suitName):
|
|
suitIndex = SuitDNA.suitHeadTypes.index(suitName)
|
|
suitDNA = SuitDNA.SuitDNA()
|
|
suitDNA.newSuit(suitName)
|
|
suit = Suit()
|
|
suit.setDNA(suitDNA)
|
|
headParts = suit.getHeadParts()
|
|
head = node.attachNewNode('head')
|
|
for part in headParts:
|
|
copyPart = part.copyTo(head)
|
|
copyPart.setDepthTest(1)
|
|
copyPart.setDepthWrite(1)
|
|
|
|
suit.delete()
|
|
suit = None
|
|
p1 = Point3()
|
|
p2 = Point3()
|
|
head.calcTightBounds(p1, p2)
|
|
d = p2 - p1
|
|
biggest = max(d[0], d[2])
|
|
column = suitIndex % SuitDNA.suitsPerDept
|
|
s = (0.2 + column / 100.0) / biggest
|
|
pos = -0.14 + (SuitDNA.suitsPerDept - column - 1) / 135.0
|
|
head.setPosHprScale(0, 0, pos, 180, 0, 0, s, s, s)
|
|
return head
|
|
|
|
|
|
class Suit(Avatar.Avatar):
|
|
__module__ = __name__
|
|
healthColors = (Vec4(0, 1, 0, 1),# 0 Green
|
|
Vec4(0.5, 1, 0, 1),#1 Green-Yellow
|
|
Vec4(0.75, 1, 0, 1),#2 Yellow-Green
|
|
Vec4(1, 1, 0, 1),#3 Yellow
|
|
Vec4(1, 0.866, 0, 1),#4 Yellow-Orange
|
|
Vec4(1, 0.6, 0, 1),#5 Orange-Yellow
|
|
Vec4(1, 0.5, 0, 1),#6 Orange
|
|
Vec4(1, 0.25, 0, 1.0),#7 Red-Orange
|
|
Vec4(1, 0, 0, 1),#8 Red
|
|
Vec4(0.3, 0.3, 0.3, 1))#9 Grey
|
|
healthGlowColors = (Vec4(0.25, 1, 0.25, 0.5),#Green
|
|
Vec4(0.5, 1, 0.25, .5),#1 Green-Yellow
|
|
Vec4(0.75, 1, 0.25, .5),#2 Yellow-Green
|
|
Vec4(1, 1, 0.25, 0.5),#Yellow
|
|
Vec4(1, 0.866, 0.25, .5),#4 Yellow-Orange
|
|
Vec4(1, 0.6, 0.25, .5),#5 Orange-Yellow
|
|
Vec4(1, 0.5, 0.25, 0.5),#6 Orange
|
|
Vec4(1, 0.25, 0.25, 0.5),#7 Red-Orange
|
|
Vec4(1, 0.25, 0.25, 0.5),#8 Red
|
|
Vec4(0.3, 0.3, 0.3, 0))#9 Grey
|
|
medallionColors = {'c': Vec4(0.863, 0.776, 0.769, 1.0),
|
|
's': Vec4(0.843, 0.745, 0.745, 1.0),
|
|
'l': Vec4(0.749, 0.776, 0.824, 1.0),
|
|
'm': Vec4(0.749, 0.769, 0.749, 1.0)}
|
|
|
|
def __init__(self):
|
|
try:
|
|
self.Suit_initialized
|
|
return
|
|
except:
|
|
self.Suit_initialized = 1
|
|
|
|
Avatar.Avatar.__init__(self)
|
|
self.setFont(ToontownGlobals.getSuitFont())
|
|
self.setPlayerType(NametagGlobals.CCSuit)
|
|
self.setPickable(1)
|
|
self.leftHand = None
|
|
self.rightHand = None
|
|
self.shadowJoint = None
|
|
self.nametagJoint = None
|
|
self.headParts = []
|
|
self.healthBar = None
|
|
self.healthCondition = 0
|
|
self.isDisguised = 0
|
|
self.isWaiter = 0
|
|
self.isRental = 0
|
|
|
|
def delete(self):
|
|
try:
|
|
self.Suit_deleted
|
|
except:
|
|
self.Suit_deleted = 1
|
|
if self.leftHand:
|
|
self.leftHand.removeNode()
|
|
self.leftHand = None
|
|
if self.rightHand:
|
|
self.rightHand.removeNode()
|
|
self.rightHand = None
|
|
if self.shadowJoint:
|
|
self.shadowJoint.removeNode()
|
|
self.shadowJoint = None
|
|
if self.nametagJoint:
|
|
self.nametagJoint.removeNode()
|
|
self.nametagJoint = None
|
|
for part in self.headParts:
|
|
part.removeNode()
|
|
|
|
self.headParts = []
|
|
self.removeHealthBar()
|
|
Avatar.Avatar.delete(self)
|
|
|
|
def setHeight(self, height):
|
|
Avatar.Avatar.setHeight(self, height)
|
|
self.nametag3d.setPos(0, 0, height + 1.0)
|
|
|
|
def getRadius(self):
|
|
return 2
|
|
|
|
def setDNAString(self, dnaString):
|
|
self.dna = SuitDNA.SuitDNA()
|
|
self.dna.makeFromNetString(dnaString)
|
|
self.setDNA(self.dna)
|
|
|
|
def setDNA(self, dna):
|
|
if self.style:
|
|
return
|
|
|
|
self.style = dna
|
|
self.generateSuit()
|
|
self.initializeDropShadow()
|
|
self.initializeNametag3d()
|
|
|
|
def generateSuit(self):
|
|
dna = self.style
|
|
self.headParts = []
|
|
self.headColor = None
|
|
self.headTexture = None
|
|
self.loseActor = None
|
|
self.isSkeleton = 0
|
|
|
|
if dna.name in SuitGlobals.suitProperties:
|
|
self.scale = SuitGlobals.suitProperties[dna.name][SuitGlobals.SCALE_INDEX]
|
|
self.handColor = SuitGlobals.suitProperties[dna.name][SuitGlobals.HAND_COLOR_INDEX]
|
|
|
|
if dna.name == 'cc':
|
|
self.headColor = SuitGlobals.ColdCallerHead
|
|
|
|
self.generateBody()
|
|
|
|
if SuitGlobals.suitProperties[dna.name][SuitGlobals.HEAD_TEXTURE_INDEX]:
|
|
self.headTexture = SuitGlobals.suitProperties[dna.name][SuitGlobals.HEAD_TEXTURE_INDEX]
|
|
|
|
for head in SuitGlobals.suitProperties[dna.name][SuitGlobals.HEADS_INDEX]:
|
|
self.generateHead(head)
|
|
|
|
self.setHeight(SuitGlobals.suitProperties[dna.name][SuitGlobals.HEIGHT_INDEX])
|
|
|
|
self.setName(SuitBattleGlobals.SuitAttributes[dna.name]['name'])
|
|
self.getGeomNode().setScale(self.scale)
|
|
self.generateHealthBar()
|
|
self.generateCorporateMedallion()
|
|
|
|
def generateBody(self):
|
|
global Preloaded
|
|
animDict = self.generateAnimDict()
|
|
filePrefix, bodyPhase = ModelDict[self.style.body]
|
|
filepath = 'phase_3.5' + filePrefix + 'mod'
|
|
self.loadModel(Preloaded[filepath], copy = True)
|
|
self.loadAnims(animDict)
|
|
self.setSuitClothes()
|
|
|
|
def generateAnimDict(self):
|
|
animDict = {}
|
|
filePrefix, bodyPhase = ModelDict[self.style.body]
|
|
for anim in AllSuits:
|
|
animDict[anim[0]] = 'phase_' + str(bodyPhase) + filePrefix + anim[1]
|
|
|
|
for anim in AllSuitsMinigame:
|
|
animDict[anim[0]] = 'phase_4' + filePrefix + anim[1]
|
|
|
|
for anim in AllSuitsTutorialBattle:
|
|
filePrefix, bodyPhase = TutorialModelDict[self.style.body]
|
|
animDict[anim[0]] = 'phase_' + str(bodyPhase) + filePrefix + anim[1]
|
|
|
|
for anim in AllSuitsBattle:
|
|
animDict[anim[0]] = 'phase_5' + filePrefix + anim[1]
|
|
|
|
if self.style.body == 'a':
|
|
animDict['neutral'] = 'phase_4/models/char/suitA-neutral'
|
|
for anim in SuitsCEOBattle:
|
|
animDict[anim[0]] = 'phase_12/models/char/suitA-' + anim[1]
|
|
elif self.style.body == 'b':
|
|
animDict['neutral'] = 'phase_4/models/char/suitB-neutral'
|
|
for anim in SuitsCEOBattle:
|
|
animDict[anim[0]] = 'phase_12/models/char/suitB-' + anim[1]
|
|
elif self.style.body == 'c':
|
|
animDict['neutral'] = 'phase_3.5/models/char/suitC-neutral'
|
|
for anim in SuitsCEOBattle:
|
|
animDict[anim[0]] = 'phase_12/models/char/suitC-' + anim[1]
|
|
|
|
try:
|
|
animList = eval(self.style.name)
|
|
except NameError:
|
|
animList = ()
|
|
|
|
for anim in animList:
|
|
phase = 'phase_' + str(anim[2])
|
|
animDict[anim[0]] = phase + filePrefix + anim[1]
|
|
|
|
return animDict
|
|
|
|
def initializeBodyCollisions(self, collIdStr):
|
|
Avatar.Avatar.initializeBodyCollisions(self, collIdStr)
|
|
if not self.ghostMode:
|
|
self.collNode.setCollideMask(self.collNode.getIntoCollideMask() | ToontownGlobals.PieBitmask)
|
|
|
|
def setSuitClothes(self, modelRoot = None):
|
|
if not modelRoot:
|
|
modelRoot = self
|
|
dept = self.style.dept
|
|
phase = 3.5
|
|
|
|
torsoTex = loader.loadTexture('phase_%s/maps/%s_blazer.jpg' % (phase, dept))
|
|
torsoTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
torsoTex.setMagfilter(Texture.FTLinear)
|
|
legTex = loader.loadTexture('phase_%s/maps/%s_leg.jpg' % (phase, dept))
|
|
legTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
legTex.setMagfilter(Texture.FTLinear)
|
|
armTex = loader.loadTexture('phase_%s/maps/%s_sleeve.jpg' % (phase, dept))
|
|
armTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
armTex.setMagfilter(Texture.FTLinear)
|
|
modelRoot.find('**/torso').setTexture(torsoTex, 1)
|
|
modelRoot.find('**/arms').setTexture(armTex, 1)
|
|
modelRoot.find('**/legs').setTexture(legTex, 1)
|
|
modelRoot.find('**/hands').setColor(self.handColor)
|
|
self.leftHand = self.find('**/joint_Lhold')
|
|
self.rightHand = self.find('**/joint_Rhold')
|
|
self.shadowJoint = self.find('**/joint_shadow')
|
|
self.nametagJoint = self.find('**/joint_nameTag')
|
|
|
|
def makeWaiter(self, modelRoot = None):
|
|
if not modelRoot:
|
|
modelRoot = self
|
|
self.isWaiter = 1
|
|
torsoTex = loader.loadTexture('phase_3.5/maps/waiter_m_blazer.jpg')
|
|
torsoTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
torsoTex.setMagfilter(Texture.FTLinear)
|
|
legTex = loader.loadTexture('phase_3.5/maps/waiter_m_leg.jpg')
|
|
legTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
legTex.setMagfilter(Texture.FTLinear)
|
|
armTex = loader.loadTexture('phase_3.5/maps/waiter_m_sleeve.jpg')
|
|
armTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
armTex.setMagfilter(Texture.FTLinear)
|
|
modelRoot.find('**/torso').setTexture(torsoTex, 1)
|
|
modelRoot.find('**/arms').setTexture(armTex, 1)
|
|
modelRoot.find('**/legs').setTexture(legTex, 1)
|
|
|
|
def makeRentalSuit(self, suitType, modelRoot = None):
|
|
if not modelRoot:
|
|
modelRoot = self.getGeomNode()
|
|
if suitType == 's':
|
|
torsoTex = loader.loadTexture('phase_3.5/maps/tt_t_ene_sellbotRental_blazer.jpg')
|
|
legTex = loader.loadTexture('phase_3.5/maps/tt_t_ene_sellbotRental_leg.jpg')
|
|
armTex = loader.loadTexture('phase_3.5/maps/tt_t_ene_sellbotRental_sleeve.jpg')
|
|
handTex = loader.loadTexture('phase_3.5/maps/tt_t_ene_sellbotRental_hand.jpg')
|
|
else:
|
|
self.notify.warning('No rental suit for cog type %s' % suitType)
|
|
return
|
|
self.isRental = 1
|
|
modelRoot.find('**/torso').setTexture(torsoTex, 1)
|
|
modelRoot.find('**/arms').setTexture(armTex, 1)
|
|
modelRoot.find('**/legs').setTexture(legTex, 1)
|
|
modelRoot.find('**/hands').setTexture(handTex, 1)
|
|
|
|
def generateHead(self, headType):
|
|
filePrefix, phase = ModelDict[self.style.body]
|
|
filepath = 'phase_' + str(phase) + filePrefix + 'heads'
|
|
headModel = NodePath('cog_head')
|
|
Preloaded[filepath].copyTo(headModel)
|
|
headReferences = headModel.findAllMatches('**/' + headType)
|
|
for i in xrange(0, headReferences.getNumPaths()):
|
|
headPart = self.instance(headReferences.getPath(i), 'modelRoot', 'joint_head')
|
|
if self.headTexture:
|
|
headTex = loader.loadTexture('phase_' + str(phase) + '/maps/' + self.headTexture)
|
|
headTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
headTex.setMagfilter(Texture.FTLinear)
|
|
headPart.setTexture(headTex, 1)
|
|
if self.headColor:
|
|
headPart.setColor(self.headColor)
|
|
headPart.flattenStrong()
|
|
self.headParts.append(headPart)
|
|
headModel.removeNode()
|
|
|
|
def generateCorporateTie(self, modelPath = None):
|
|
if not modelPath:
|
|
modelPath = self
|
|
dept = self.style.dept
|
|
tie = modelPath.find('**/tie')
|
|
if tie.isEmpty():
|
|
self.notify.warning('skelecog has no tie model!!!')
|
|
return
|
|
if dept == 'c':
|
|
tieTex = loader.loadTexture('phase_5/maps/cog_robot_tie_boss.jpg')
|
|
elif dept == 's':
|
|
tieTex = loader.loadTexture('phase_5/maps/cog_robot_tie_sales.jpg')
|
|
elif dept == 'l':
|
|
tieTex = loader.loadTexture('phase_5/maps/cog_robot_tie_legal.jpg')
|
|
elif dept == 'm':
|
|
tieTex = loader.loadTexture('phase_5/maps/cog_robot_tie_money.jpg')
|
|
tieTex.setMinfilter(Texture.FTLinearMipmapLinear)
|
|
tieTex.setMagfilter(Texture.FTLinear)
|
|
tie.setTexture(tieTex, 1)
|
|
|
|
def generateCorporateMedallion(self):
|
|
icons = loader.loadModel('phase_3/models/gui/cog_icons')
|
|
dept = self.style.dept
|
|
chestNull = self.find('**/joint_attachMeter')
|
|
if dept == 'c':
|
|
self.corpMedallion = icons.find('**/CorpIcon').copyTo(chestNull)
|
|
elif dept == 's':
|
|
self.corpMedallion = icons.find('**/SalesIcon').copyTo(chestNull)
|
|
elif dept == 'l':
|
|
self.corpMedallion = icons.find('**/LegalIcon').copyTo(chestNull)
|
|
elif dept == 'm':
|
|
self.corpMedallion = icons.find('**/MoneyIcon').copyTo(chestNull)
|
|
self.corpMedallion.setPosHprScale(0.02, 0.05, 0.04, 180.0, 0.0, 0.0, 0.51, 0.51, 0.51)
|
|
self.corpMedallion.setColor(self.medallionColors[dept])
|
|
icons.removeNode()
|
|
|
|
def generateHealthBar(self):
|
|
self.removeHealthBar()
|
|
model = loader.loadModel('phase_3.5/models/gui/matching_game_gui')
|
|
button = model.find('**/minnieCircle')
|
|
model.removeNode()
|
|
|
|
button.setScale(3.0)
|
|
button.setH(180.0)
|
|
button.setColor(self.healthColors[0])
|
|
chestNull = self.find('**/joint_attachMeter')
|
|
button.reparentTo(chestNull)
|
|
self.healthBar = button
|
|
glow = BattleProps.globalPropPool.getProp('glow')
|
|
glow.reparentTo(self.healthBar)
|
|
glow.setScale(0.28)
|
|
glow.setPos(-0.005, 0.01, 0.015)
|
|
glow.setColor(self.healthGlowColors[0])
|
|
button.flattenLight()
|
|
self.healthBarGlow = glow
|
|
self.healthBar.hide()
|
|
self.healthCondition = 0
|
|
|
|
def resetHealthBarForSkele(self):
|
|
self.healthBar.setPos(0.0, 0.1, 0.0)
|
|
|
|
def updateHealthBar(self, hp, forceUpdate = 0):
|
|
if hp > self.currHP:
|
|
hp = self.currHP
|
|
self.currHP -= hp
|
|
health = float(self.currHP) / float(self.maxHP)
|
|
if health > 0.95:
|
|
condition = 0
|
|
elif health > 0.9:
|
|
condition = 1
|
|
elif health > 0.8:
|
|
condition = 2
|
|
elif health > 0.7:
|
|
condition = 3#Yellow
|
|
elif health > 0.6:
|
|
condition = 4
|
|
elif health > 0.5:
|
|
condition = 5
|
|
elif health > 0.3:
|
|
condition = 6#Orange
|
|
elif health > 0.15:
|
|
condition = 7
|
|
elif health > 0.05:
|
|
condition = 8#Red
|
|
elif health > 0.0:
|
|
condition = 9#Blinking Red
|
|
else:
|
|
condition = 10
|
|
if self.healthCondition != condition or forceUpdate:
|
|
if condition == 9:
|
|
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75), Task(self.__blinkGray), Task.pause(0.1))
|
|
taskMgr.add(blinkTask, self.uniqueName('blink-task'))
|
|
elif condition == 10:
|
|
if self.healthCondition == 9:
|
|
taskMgr.remove(self.uniqueName('blink-task'))
|
|
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.25), Task(self.__blinkGray), Task.pause(0.1))
|
|
taskMgr.add(blinkTask, self.uniqueName('blink-task'))
|
|
else:
|
|
self.healthBar.setColor(self.healthColors[condition], 1)
|
|
self.healthBarGlow.setColor(self.healthGlowColors[condition], 1)
|
|
self.healthCondition = condition
|
|
|
|
def __blinkRed(self, task):
|
|
if not self.healthBar:
|
|
return Task.done
|
|
self.healthBar.setColor(self.healthColors[8], 1)
|
|
self.healthBarGlow.setColor(self.healthGlowColors[8], 1)
|
|
if self.healthCondition == 7:
|
|
self.healthBar.setScale(1.17)
|
|
return Task.done
|
|
|
|
def __blinkGray(self, task):
|
|
if not self.healthBar:
|
|
return Task.done
|
|
self.healthBar.setColor(self.healthColors[9], 1)
|
|
self.healthBarGlow.setColor(self.healthGlowColors[9], 1)
|
|
if self.healthCondition == 10:
|
|
self.healthBar.setScale(1.0)
|
|
return Task.done
|
|
|
|
def removeHealthBar(self):
|
|
if self.healthBar:
|
|
self.healthBar.removeNode()
|
|
self.healthBar = None
|
|
if self.healthCondition == 9 or self.healthCondition == 10:
|
|
taskMgr.remove(self.uniqueName('blink-task'))
|
|
self.healthCondition = 0
|
|
return
|
|
|
|
def getLoseActor(self):
|
|
if self.loseActor == None:
|
|
if not self.isSkeleton:
|
|
filePrefix, phase = TutorialModelDict[self.style.body]
|
|
loseModel = 'phase_' + str(phase) + filePrefix + 'lose-mod'
|
|
loseAnim = 'phase_' + str(phase) + filePrefix + 'lose'
|
|
self.loseActor = Actor.Actor(loseModel, {'lose': loseAnim})
|
|
loseNeck = self.loseActor.find('**/joint_head')
|
|
for part in self.headParts:
|
|
part.instanceTo(loseNeck)
|
|
|
|
if self.isWaiter:
|
|
self.makeWaiter(self.loseActor)
|
|
else:
|
|
self.setSuitClothes(self.loseActor)
|
|
else:
|
|
loseModel = 'phase_5/models/char/cog' + string.upper(self.style.body) + '_robot-lose-mod'
|
|
filePrefix, phase = TutorialModelDict[self.style.body]
|
|
loseAnim = 'phase_' + str(phase) + filePrefix + 'lose'
|
|
self.loseActor = Actor.Actor(loseModel, {'lose': loseAnim})
|
|
self.generateCorporateTie(self.loseActor)
|
|
self.loseActor.setScale(self.scale)
|
|
self.loseActor.setPos(self.getPos())
|
|
self.loseActor.setHpr(self.getHpr())
|
|
shadowJoint = self.loseActor.find('**/joint_shadow')
|
|
dropShadow = loader.loadModel('phase_3/models/props/drop_shadow')
|
|
dropShadow.setScale(0.45)
|
|
dropShadow.setColor(0.0, 0.0, 0.0, 0.5)
|
|
dropShadow.reparentTo(shadowJoint)
|
|
return self.loseActor
|
|
|
|
def cleanupLoseActor(self):
|
|
self.notify.debug('cleanupLoseActor()')
|
|
if self.loseActor != None:
|
|
self.notify.debug('cleanupLoseActor() - got one')
|
|
self.loseActor.cleanup()
|
|
self.loseActor = None
|
|
return
|
|
|
|
def makeSkeleton(self):
|
|
model = 'phase_5/models/char/cog' + string.upper(self.style.body) + '_robot-zero'
|
|
anims = self.generateAnimDict()
|
|
anim = self.getCurrentAnim()
|
|
dropShadow = self.dropShadow
|
|
if not dropShadow.isEmpty():
|
|
dropShadow.reparentTo(hidden)
|
|
self.removePart('modelRoot')
|
|
self.loadModel(model)
|
|
self.loadAnims(anims)
|
|
self.getGeomNode().setScale(self.scale * 1.0173)
|
|
self.generateHealthBar()
|
|
self.generateCorporateMedallion()
|
|
self.generateCorporateTie()
|
|
self.setHeight(self.height)
|
|
parts = self.findAllMatches('**/pPlane*')
|
|
for partNum in xrange(0, parts.getNumPaths()):
|
|
bb = parts.getPath(partNum)
|
|
bb.setTwoSided(1)
|
|
|
|
self.setName(TTLocalizer.Skeleton)
|
|
nameInfo = TTLocalizer.SuitBaseNameWithLevel % {'name': self.name,
|
|
'dept': self.getStyleDept(),
|
|
'level': self.getActualLevel()}
|
|
self.setDisplayName(nameInfo)
|
|
self.leftHand = self.find('**/joint_Lhold')
|
|
self.rightHand = self.find('**/joint_Rhold')
|
|
self.shadowJoint = self.find('**/joint_shadow')
|
|
self.nametagNull = self.find('**/joint_nameTag')
|
|
if not dropShadow.isEmpty():
|
|
dropShadow.setScale(0.75)
|
|
if not self.shadowJoint.isEmpty():
|
|
dropShadow.reparentTo(self.shadowJoint)
|
|
self.loop(anim)
|
|
self.isSkeleton = 1
|
|
|
|
def getHeadParts(self):
|
|
return self.headParts
|
|
|
|
def getRightHand(self):
|
|
return self.rightHand
|
|
|
|
def getLeftHand(self):
|
|
return self.leftHand
|
|
|
|
def getShadowJoint(self):
|
|
return self.shadowJoint
|
|
|
|
def getNametagJoints(self):
|
|
return []
|
|
|
|
def getDialogueArray(self):
|
|
if self.isSkeleton:
|
|
loadSkelDialog()
|
|
return SkelSuitDialogArray
|
|
else:
|
|
return SuitDialogArray
|