from toontown.toonbase.ToonBaseGlobal import * from pandac.PandaModules import * from libtoontown import * from direct.interval.IntervalGlobal import * from direct.distributed.ClockDelta import * from toontown.toonbase import ToontownGlobals import cPickle import ToonInterior from direct.directnotify import DirectNotifyGlobal from direct.fsm import ClassicFSM, State from direct.distributed import DistributedObject from direct.fsm import State import random import ToonInteriorColors from toontown.hood import ZoneUtil from toontown.toon import ToonDNA from toontown.toon import ToonHead SIGN_LEFT = -4 SIGN_RIGHT = 4 SIGN_BOTTOM = -3.5 SIGN_TOP = 1.5 FrameScale = 1.4 class DistributedToonInterior(DistributedObject.DistributedObject): def __init__(self, cr): DistributedObject.DistributedObject.__init__(self, cr) self.fsm = ClassicFSM.ClassicFSM('DistributedToonInterior', [State.State('toon', self.enterToon, self.exitToon, ['beingTakenOver']), State.State('beingTakenOver', self.enterBeingTakenOver, self.exitBeingTakenOver, []), State.State('off', self.enterOff, self.exitOff, [])], 'toon', 'off') self.fsm.enterInitialState() def generate(self): DistributedObject.DistributedObject.generate(self) def announceGenerate(self): DistributedObject.DistributedObject.announceGenerate(self) self.setup() def disable(self): self.interior.removeNode() del self.interior DistributedObject.DistributedObject.disable(self) def delete(self): del self.fsm DistributedObject.DistributedObject.delete(self) def randomDNAItem(self, category, findFunc): codeCount = self.dnaStore.getNumCatalogCodes(category) index = self.randomGenerator.randint(0, codeCount - 1) code = self.dnaStore.getCatalogCode(category, index) return findFunc(code) def replaceRandomInModel(self, model): baseTag = 'random_' npc = model.findAllMatches('**/' + baseTag + '???_*') for i in range(npc.getNumPaths()): np = npc.getPath(i) name = np.getName() b = len(baseTag) category = name[b + 4:] key1 = name[b] key2 = name[b + 1] if key1 == 'm': model = self.randomDNAItem(category, self.dnaStore.findNode) newNP = model.copyTo(np) c = render.findAllMatches('**/collision') c.stash() if key2 == 'r': self.replaceRandomInModel(newNP) elif key1 == 't': texture = self.randomDNAItem(category, self.dnaStore.findTexture) np.setTexture(texture, 100) newNP = np if key2 == 'c': if category == 'TI_wallpaper' or category == 'TI_wallpaper_border': self.randomGenerator.seed(self.zoneId) newNP.setColorScale(self.randomGenerator.choice(self.colors[category])) else: newNP.setColorScale(self.randomGenerator.choice(self.colors[category])) def setup(self): self.dnaStore = base.cr.playGame.dnaStore self.randomGenerator = random.Random() self.randomGenerator.seed(self.zoneId) interior = self.randomDNAItem('TI_room', self.dnaStore.findNode) self.interior = interior.copyTo(render) hoodId = ZoneUtil.getCanonicalHoodId(self.zoneId) self.colors = ToonInteriorColors.colors[hoodId] self.replaceRandomInModel(self.interior) doorModelName = 'door_double_round_ul' if doorModelName[-1:] == 'r': doorModelName = doorModelName[:-1] + 'l' else: doorModelName = doorModelName[:-1] + 'r' door = self.dnaStore.findNode(doorModelName) door_origin = render.find('**/door_origin;+s') doorNP = door.copyTo(door_origin) door_origin.setScale(0.8, 0.8, 0.8) door_origin.setPos(door_origin, 0, -0.025, 0) color = self.randomGenerator.choice(self.colors['TI_door']) DNADoor.setupDoor(doorNP, self.interior, door_origin, self.dnaStore, str(self.block), color) doorFrame = doorNP.find('door_*_flat') doorFrame.wrtReparentTo(self.interior) doorFrame.setColor(color) sign = hidden.find('**/tb%s:*_landmark_*_DNARoot/**/sign;+s' % (self.block,)) if not sign.isEmpty(): signOrigin = self.interior.find('**/sign_origin;+s') newSignNP = sign.copyTo(signOrigin) newSignNP.setDepthWrite(1, 1) mat = self.dnaStore.getSignTransformFromBlockNumber(int(self.block)) inv = Mat4(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) inv.invertFrom(mat) newSignNP.setMat(inv) newSignNP.flattenLight() ll = Point3() ur = Point3() newSignNP.calcTightBounds(ll, ur) width = ur[0] - ll[0] height = ur[2] - ll[2] if width != 0 and height != 0: xScale = (SIGN_RIGHT - SIGN_LEFT) / width zScale = (SIGN_TOP - SIGN_BOTTOM) / height scale = min(xScale, zScale) xCenter = (ur[0] + ll[0]) / 2.0 zCenter = (ur[2] + ll[2]) / 2.0 newSignNP.setPosHprScale((SIGN_RIGHT + SIGN_LEFT) / 2.0 - xCenter * scale, -0.1, (SIGN_TOP + SIGN_BOTTOM) / 2.0 - zCenter * scale, 0.0, 0.0, 0.0, scale, scale, scale) trophyOrigin = self.interior.find('**/trophy_origin') trophy = self.buildTrophy() if trophy: trophy.reparentTo(trophyOrigin) del self.colors del self.dnaStore del self.randomGenerator self.interior.flattenMedium() def setZoneIdAndBlock(self, zoneId, block): self.zoneId = zoneId self.block = block def setToonData(self, toonData): savedBy = cPickle.loads(toonData) self.savedBy = savedBy def buildTrophy(self): if self.savedBy == None: return numToons = len(self.savedBy) pos = 1.25 - 1.25 * numToons trophy = hidden.attachNewNode('trophy') for avId, name, dnaTuple, isGM in self.savedBy: frame = self.buildFrame(name, dnaTuple) frame.reparentTo(trophy) frame.setPos(pos, 0, 0) pos += 2.5 return trophy def buildFrame(self, name, dnaTuple): frame = loader.loadModel('phase_3.5/models/modules/trophy_frame') dna = ToonDNA.ToonDNA() apply(dna.newToonFromProperties, dnaTuple) head = ToonHead.ToonHead() head.setupHead(dna) head.setPosHprScale(0, -0.05, -0.05, 180, 0, 0, 0.55, 0.02, 0.55) if dna.head[0] == 'r': head.setZ(-0.15) elif dna.head[0] == 'h': head.setZ(0.05) elif dna.head[0] == 'm': head.setScale(0.45, 0.02, 0.45) head.reparentTo(frame) nameText = TextNode('trophy') nameText.setFont(ToontownGlobals.getToonFont()) nameText.setAlign(TextNode.ACenter) nameText.setTextColor(0, 0, 0, 1) nameText.setWordwrap(5.36 * FrameScale) nameText.setText(name) namePath = frame.attachNewNode(nameText.generate()) namePath.setPos(0, -0.03, -.6) namePath.setScale(0.186 / FrameScale) frame.setScale(FrameScale, 1.0, FrameScale) return frame def setState(self, state, timestamp): self.fsm.request(state, [globalClockDelta.localElapsedTime(timestamp)]) def enterOff(self): pass def exitOff(self): pass def enterToon(self): pass def exitToon(self): pass def enterBeingTakenOver(self, ts): messenger.send('clearOutToonInterior') def exitBeingTakenOver(self): pass