from direct.actor import Actor from otp.avatar import Avatar from . import SuitDNA from toontown.toonbase import ToontownGlobals from pandac.PandaModules import * from panda3d.otp import * from toontown.battle import SuitBattleGlobals 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 import os 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')) 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)} def loadTutorialSuit(): loader.loadModel('phase_3.5/models/char/suitC-mod').node() loadDialog(1) def loadSuits(level): loadSuitModelsAndAnims(level, flag=1) loadDialog(level) def unloadSuits(level): loadSuitModelsAndAnims(level, flag=0) unloadDialog(level) def loadSuitModelsAndAnims(level, flag = 0): for key in list(ModelDict.keys()): model, phase = ModelDict[key] if base.config.GetBool('want-new-cogs', 0): headModel, headPhase = HeadModelDict[key] else: headModel, headPhase = ModelDict[key] if flag: if base.config.GetBool('want-new-cogs', 0): filepath = 'phase_3.5' + model + 'zero' if cogExists(model + 'zero.bam'): loader.loadModel(filepath).node() else: loader.loadModel('phase_3.5' + model + 'mod').node() loader.loadModel('phase_' + str(headPhase) + headModel + 'heads').node() else: if base.config.GetBool('want-new-cogs', 0): filepath = 'phase_3.5' + model + 'zero' if cogExists(model + 'zero.bam'): loader.unloadModel(filepath) else: loader.unloadModel('phase_3.5' + model + 'mod') loader.unloadModel('phase_' + str(headPhase) + headModel + 'heads') 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).node() 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.loader.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): healthColors = (Vec4(0, 1, 0, 1), Vec4(1, 1, 0, 1), Vec4(1, 0.5, 0, 1), Vec4(1, 0, 0, 1), Vec4(0.3, 0.3, 0.3, 1)) healthGlowColors = (Vec4(0.25, 1, 0.25, 0.5), Vec4(1, 1, 0.25, 0.5), Vec4(1, 0.5, 0.25, 0.5), Vec4(1, 0.25, 0.25, 0.5), Vec4(0.3, 0.3, 0.3, 0)) 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(NametagGroup.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 return 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) return 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: pass else: 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 == 'f': self.scale = 4.0 / cSize self.handColor = SuitDNA.corpPolyColor self.generateBody() self.generateHead('flunky') self.generateHead('glasses') self.setHeight(4.88) elif dna.name == 'p': self.scale = 3.35 / bSize self.handColor = SuitDNA.corpPolyColor self.generateBody() self.generateHead('pencilpusher') self.setHeight(5.0) elif dna.name == 'ym': self.scale = 4.125 / aSize self.handColor = SuitDNA.corpPolyColor self.generateBody() self.generateHead('yesman') self.setHeight(5.28) elif dna.name == 'mm': self.scale = 2.5 / cSize self.handColor = SuitDNA.corpPolyColor self.generateBody() self.generateHead('micromanager') self.setHeight(3.25) elif dna.name == 'ds': self.scale = 4.5 / bSize self.handColor = SuitDNA.corpPolyColor self.generateBody() self.generateHead('beancounter') self.setHeight(6.08) elif dna.name == 'hh': self.scale = 6.5 / aSize self.handColor = SuitDNA.corpPolyColor self.generateBody() self.generateHead('headhunter') self.setHeight(7.45) elif dna.name == 'cr': self.scale = 6.75 / cSize self.handColor = VBase4(0.85, 0.55, 0.55, 1.0) self.generateBody() self.headTexture = 'corporate-raider.jpg' self.generateHead('flunky') self.setHeight(8.23) elif dna.name == 'tbc': self.scale = 7.0 / aSize self.handColor = VBase4(0.75, 0.95, 0.75, 1.0) self.generateBody() self.generateHead('bigcheese') self.setHeight(9.34) elif dna.name == 'bf': self.scale = 4.0 / cSize self.handColor = SuitDNA.legalPolyColor self.generateBody() self.headTexture = 'bottom-feeder.jpg' self.generateHead('tightwad') self.setHeight(4.81) elif dna.name == 'b': self.scale = 4.375 / bSize self.handColor = VBase4(0.95, 0.95, 1.0, 1.0) self.generateBody() self.headTexture = 'blood-sucker.jpg' self.generateHead('movershaker') self.setHeight(6.17) elif dna.name == 'dt': self.scale = 4.25 / aSize self.handColor = SuitDNA.legalPolyColor self.generateBody() self.headTexture = 'double-talker.jpg' self.generateHead('twoface') self.setHeight(5.63) elif dna.name == 'ac': self.scale = 4.35 / bSize self.handColor = SuitDNA.legalPolyColor self.generateBody() self.generateHead('ambulancechaser') self.setHeight(6.39) elif dna.name == 'bs': self.scale = 4.5 / aSize self.handColor = SuitDNA.legalPolyColor self.generateBody() self.generateHead('backstabber') self.setHeight(6.71) elif dna.name == 'sd': self.scale = 5.65 / bSize self.handColor = VBase4(0.5, 0.8, 0.75, 1.0) self.generateBody() self.headTexture = 'spin-doctor.jpg' self.generateHead('telemarketer') self.setHeight(7.9) elif dna.name == 'le': self.scale = 7.125 / aSize self.handColor = VBase4(0.25, 0.25, 0.5, 1.0) self.generateBody() self.generateHead('legaleagle') self.setHeight(8.27) elif dna.name == 'bw': self.scale = 7.0 / aSize self.handColor = SuitDNA.legalPolyColor self.generateBody() self.generateHead('bigwig') self.setHeight(8.69) elif dna.name == 'sc': self.scale = 3.6 / cSize self.handColor = SuitDNA.moneyPolyColor self.generateBody() self.generateHead('coldcaller') self.setHeight(4.77) elif dna.name == 'pp': self.scale = 3.55 / aSize self.handColor = VBase4(1.0, 0.5, 0.6, 1.0) self.generateBody() self.generateHead('pennypincher') self.setHeight(5.26) elif dna.name == 'tw': self.scale = 4.5 / cSize self.handColor = SuitDNA.moneyPolyColor self.generateBody() self.generateHead('tightwad') self.setHeight(5.41) elif dna.name == 'bc': self.scale = 4.4 / bSize self.handColor = SuitDNA.moneyPolyColor self.generateBody() self.generateHead('beancounter') self.setHeight(5.95) elif dna.name == 'nc': self.scale = 5.25 / aSize self.handColor = SuitDNA.moneyPolyColor self.generateBody() self.generateHead('numbercruncher') self.setHeight(7.22) elif dna.name == 'mb': self.scale = 5.3 / cSize self.handColor = SuitDNA.moneyPolyColor self.generateBody() self.generateHead('moneybags') self.setHeight(6.97) elif dna.name == 'ls': self.scale = 6.5 / bSize self.handColor = VBase4(0.5, 0.85, 0.75, 1.0) self.generateBody() self.generateHead('loanshark') self.setHeight(8.58) elif dna.name == 'rb': self.scale = 7.0 / aSize self.handColor = SuitDNA.moneyPolyColor self.generateBody() self.headTexture = 'robber-baron.jpg' self.generateHead('yesman') self.setHeight(8.95) elif dna.name == 'cc': self.scale = 3.5 / cSize self.handColor = VBase4(0.55, 0.65, 1.0, 1.0) self.headColor = VBase4(0.25, 0.35, 1.0, 1.0) self.generateBody() self.generateHead('coldcaller') self.setHeight(4.63) elif dna.name == 'tm': self.scale = 3.75 / bSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.generateHead('telemarketer') self.setHeight(5.24) elif dna.name == 'nd': self.scale = 4.35 / aSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.headTexture = 'name-dropper.jpg' self.generateHead('numbercruncher') self.setHeight(5.98) elif dna.name == 'gh': self.scale = 4.75 / cSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.generateHead('gladhander') self.setHeight(6.4) elif dna.name == 'ms': self.scale = 4.75 / bSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.generateHead('movershaker') self.setHeight(6.7) elif dna.name == 'tf': self.scale = 5.25 / aSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.generateHead('twoface') self.setHeight(6.95) elif dna.name == 'm': self.scale = 5.75 / aSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.headTexture = 'mingler.jpg' self.generateHead('twoface') self.setHeight(7.61) elif dna.name == 'mh': self.scale = 7.0 / aSize self.handColor = SuitDNA.salesPolyColor self.generateBody() self.generateHead('yesman') self.setHeight(8.95) self.setName(SuitBattleGlobals.SuitAttributes[dna.name]['name']) self.getGeomNode().setScale(self.scale) self.generateHealthBar() self.generateCorporateMedallion() return def generateBody(self): animDict = self.generateAnimDict() filePrefix, bodyPhase = ModelDict[self.style.body] if base.config.GetBool('want-new-cogs', 0): if cogExists(filePrefix + 'zero.bam'): self.loadModel('phase_3.5' + filePrefix + 'zero') else: self.loadModel('phase_3.5' + filePrefix + 'mod') else: self.loadModel('phase_3.5' + filePrefix + 'mod') 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 not base.config.GetBool('want-new-cogs', 0): 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 def __doItTheOldWay__(): 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') if base.config.GetBool('want-new-cogs', 0): if dept == 'c': texType = 'bossbot' elif dept == 'm': texType = 'cashbot' elif dept == 'l': texType = 'lawbot' elif dept == 's': texType = 'sellbot' if self.find('**/body').isEmpty(): __doItTheOldWay__() else: filepath = 'phase_3.5/maps/tt_t_ene_' + texType + '.jpg' if cogExists('/maps/tt_t_ene_' + texType + '.jpg'): bodyTex = loader.loadTexture(filepath) self.find('**/body').setTexture(bodyTex, 1) self.leftHand = self.find('**/def_joint_left_hold') self.rightHand = self.find('**/def_joint_right_hold') self.shadowJoint = self.find('**/def_shadow') self.nametagJoint = self.find('**/def_nameTag') else: __doItTheOldWay__() 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): if base.config.GetBool('want-new-cogs', 0): filePrefix, phase = HeadModelDict[self.style.body] else: filePrefix, phase = ModelDict[self.style.body] headModel = loader.loadModel('phase_' + str(phase) + filePrefix + 'heads') headReferences = headModel.findAllMatches('**/' + headType) for i in range(0, headReferences.getNumPaths()): if base.config.GetBool('want-new-cogs', 0): headPart = self.instance(headReferences.getPath(i), 'modelRoot', 'to_head') if not headPart: headPart = self.instance(headReferences.getPath(i), 'modelRoot', 'joint_head') else: 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) 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 if base.config.GetBool('want-new-cogs', 0): chestNull = self.find('**/def_joint_attachMeter') if chestNull.isEmpty(): chestNull = self.find('**/joint_attachMeter') else: 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') button.setScale(3.0) button.setH(180.0) button.setColor(self.healthColors[0]) if base.config.GetBool('want-new-cogs', 0): chestNull = self.find('**/def_joint_attachMeter') if chestNull.isEmpty(): chestNull = self.find('**/joint_attachMeter') else: 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 reseatHealthBarForSkele(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.7: condition = 1 elif health > 0.3: condition = 2 elif health > 0.05: condition = 3 elif health > 0.0: condition = 4 else: condition = 5 if self.healthCondition != condition or forceUpdate: if condition == 4: 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 == 5: if self.healthCondition == 4: 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): self.healthBar.setColor(self.healthColors[3], 1) self.healthBarGlow.setColor(self.healthGlowColors[3], 1) if self.healthCondition == 5: self.healthBar.setScale(1.17) return Task.done def __blinkGray(self, task): if not self.healthBar: return self.healthBar.setColor(self.healthColors[4], 1) self.healthBarGlow.setColor(self.healthGlowColors[4], 1) if self.healthCondition == 5: self.healthBar.setScale(1.0) return Task.done def removeHealthBar(self): if self.healthBar: self.healthBar.removeNode() self.healthBar = None if self.healthCondition == 4 or self.healthCondition == 5: taskMgr.remove(self.uniqueName('blink-task')) self.healthCondition = 0 return def getLoseActor(self): if base.config.GetBool('want-new-cogs', 0): if self.find('**/body'): return 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' + self.style.body.upper() + '_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' + self.style.body.upper() + '_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 range(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