Poodletooth-iLand/toontown/suit/Suit.py

776 lines
28 KiB
Python
Raw Normal View History

from panda3d.core import *
2015-03-03 16:10:12 -06:00
from direct.actor import Actor
2015-05-13 06:00:52 -05:00
from direct.task.Task import Task
2015-03-03 16:10:12 -06:00
from otp.avatar import Avatar
2015-05-13 06:00:52 -05:00
from toontown.battle import BattleProps, SuitBattleGlobals
2015-06-24 12:19:10 -05:00
from otp.nametag.NametagGroup import NametagGroup
2015-05-13 06:00:52 -05:00
from toontown.toonbase import TTLocalizer, ToontownGlobals
2015-03-03 16:10:12 -06:00
from toontown.suit import SuitGlobals
2015-05-13 06:00:52 -05:00
import SuitDNA, string
2015-03-03 16:10:12 -06:00
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),
('magic3', 'magic3', 5),
2015-03-03 16:10:12 -06:00
('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),
('magic3', 'magic3', 5),
2015-03-03 16:10:12 -06:00
('glower', 'glower', 5))
m = (('speak', 'speak', 5),
('magic2', 'magic2', 5),
('magic1', 'magic1', 5),
2015-05-11 21:50:12 -05:00
('golf-club-swing', 'golf-club-swing', 5),
('cigar-smoke', 'cigar-smoke', 8))
2015-03-03 16:10:12 -06:00
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))
2015-05-11 21:50:12 -05:00
rb = (('glower', 'glower', 5), ('cigar-smoke', 'cigar-smoke', 8), ('magic1', 'magic1', 5), ('golf-club-swing', 'golf-club-swing', 5))
2015-03-03 16:10:12 -06:00
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))
2015-05-11 21:50:12 -05:00
bs = (('magic1', 'magic1', 5), ('cigar-smoke', 'cigar-smoke', 8), ('throw-paper', 'throw-paper', 5), ('finger-wag', 'fingerwag', 5))
2015-03-03 16:10:12 -06:00
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 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
2015-07-05 18:59:25 -05:00
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
2015-07-05 18:59:25 -05:00
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
2015-03-03 16:10:12 -06:00
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())
2015-07-17 18:28:36 -05:00
self.nametag.setSpeechFont(ToontownGlobals.getSuitFont())
2015-06-24 12:19:10 -05:00
self.setPlayerType(NametagGroup.CCSuit)
2015-03-03 16:10:12 -06:00
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:
2015-05-24 17:26:08 -05:00
properties = SuitGlobals.suitProperties[dna.name]
self.scale = properties[SuitGlobals.SCALE_INDEX]
self.handColor = properties[SuitGlobals.HAND_COLOR_INDEX]
2015-03-03 16:10:12 -06:00
if dna.name == 'cc':
self.headColor = SuitGlobals.ColdCallerHead
self.generateBody()
2015-05-24 17:26:08 -05:00
if properties[SuitGlobals.HEAD_TEXTURE_INDEX]:
self.headTexture = properties[SuitGlobals.HEAD_TEXTURE_INDEX]
2015-03-03 16:10:12 -06:00
2015-05-24 17:26:08 -05:00
for head in properties[SuitGlobals.HEADS_INDEX]:
2015-03-03 16:10:12 -06:00
self.generateHead(head)
2015-05-24 17:26:08 -05:00
self.setHeight(properties[SuitGlobals.HEIGHT_INDEX])
2015-03-03 16:10:12 -06:00
self.setName(SuitBattleGlobals.SuitAttributes[dna.name]['name'])
self.getGeomNode().setScale(self.scale)
self.generateHealthBar()
self.generateCorporateMedallion()
def generateBody(self):
2015-05-28 13:57:11 -05:00
global Preloaded
2015-03-03 16:10:12 -06:00
animDict = self.generateAnimDict()
filePrefix, bodyPhase = ModelDict[self.style.body]
2015-05-28 13:57:11 -05:00
filepath = 'phase_3.5' + filePrefix + 'mod'
self.loadModel(Preloaded[filepath], copy = True)
2015-03-03 16:10:12 -06:00
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)
2015-05-28 13:57:11 -05:00
modelRoot.find('**/hands').setColorScale(self.handColor)
2015-03-03 16:10:12 -06:00
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 in SuitDNA.suitDeptModelPaths:
self.corpMedallion = icons.find(SuitDNA.suitDeptModelPaths[dept]).copyTo(chestNull)
2015-03-03 16:10:12 -06:00
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:
2015-03-03 16:10:12 -06:00
condition = 1
elif health > 0.8:
2015-03-03 16:10:12 -06:00
condition = 2
elif health > 0.7:
condition = 3#Yellow
elif health > 0.6:
2015-07-05 18:59:25 -05:00
condition = 4
elif health > 0.5:
2015-07-05 18:59:25 -05:00
condition = 5
elif health > 0.3:
condition = 6#Orange
elif health > 0.15:
condition = 7
2015-03-03 16:10:12 -06:00
elif health > 0.05:
2015-07-05 18:59:25 -05:00
condition = 8#Red
2015-03-03 16:10:12 -06:00
elif health > 0.0:
condition = 9#Blinking Red
2015-03-03 16:10:12 -06:00
else:
condition = 10
2015-03-03 16:10:12 -06:00
if self.healthCondition != condition or forceUpdate:
if condition == 9:
2015-03-03 16:10:12 -06:00
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:
2015-03-03 16:10:12 -06:00
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:
2015-07-05 18:59:25 -05:00
return Task.done
self.healthBar.setColor(self.healthColors[8], 1)
self.healthBarGlow.setColor(self.healthGlowColors[8], 1)
if self.healthCondition == 7:
2015-03-03 16:10:12 -06:00
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:
2015-03-03 16:10:12 -06:00
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:
2015-03-03 16:10:12 -06:00
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