toontown-just-works/toontown/suit/RoguesGallery.py
2024-07-07 18:08:39 -05:00

183 lines
6.5 KiB
Python

from panda3d.core import *
from direct.fsm import StateData
import Suit
import SuitDNA
from toontown.toonbase import ToontownGlobals
import random
class RoguesGallery(StateData.StateData):
def __init__(self, rognamestr = None):
StateData.StateData.__init__(self, 'roguesDone')
self.rognamestr = rognamestr
self.left = -1.333
self.right = 1.333
self.bottom = -1.0
self.top = 1.0
self.sideMargins = 0.1
self.topMargins = 0.1
self.xSpaceBetweenDifferentSuits = 0.01
self.xSpaceBetweenSameSuits = 0.0
self.ySpaceBetweenSuits = 0.05
self.labelScale = 1.0
def load(self):
if StateData.StateData.load(self):
self.width = self.right - self.left - self.sideMargins * 2.0
self.height = self.top - self.bottom - self.topMargins * 2.0
if self.rognamestr == None:
self.numSuitTypes = SuitDNA.suitsPerDept
self.numSuitDepts = len(SuitDNA.suitDepts)
else:
self.numSuitTypes = 1
self.numSuitDepts = 1
self.xSpaceBetweenDifferentSuits = 0.0
self.xSpaceBetweenSameSuits = 0.0
self.ySpaceBetweenSuits = 0.0
self.ySuitInc = (self.height + self.ySpaceBetweenSuits) / self.numSuitDepts
self.ySuitMaxAllowed = self.ySuitInc - self.ySpaceBetweenSuits
self.xRowSpace = self.width - (self.numSuitTypes - 1) * self.xSpaceBetweenDifferentSuits - self.numSuitTypes * self.xSpaceBetweenSameSuits
self.__makeGallery()
return
def unload(self):
if StateData.StateData.unload(self):
self.gallery.removeNode()
del self.suits
del self.actors
def enter(self):
if StateData.StateData.enter(self):
render.hide()
aspect2d.hide()
self.gallery.reparentTo(render2d)
self.gallery.setMat(base.aspect2d.getMat())
self.gallery.setPos(0.0, 10.0, 0.0)
base.setBackgroundColor(0.6, 0.6, 0.6)
def exit(self):
if StateData.StateData.exit(self):
self.stop()
render.show()
aspect2d.show()
self.gallery.reparentTo(hidden)
self.gallery.clearMat()
base.setBackgroundColor(ToontownGlobals.DefaultBackgroundColor)
self.ignoreAll()
def animate(self):
self.load()
for suit in self.actors:
suit.pose('neutral', random.randint(0, suit.getNumFrames('neutral') - 1))
suit.loop('neutral', 0)
def stop(self):
self.load()
for suit in self.actors:
suit.pose('neutral', 30)
def autoExit(self):
self.acceptOnce('mouse1', self.exit)
def __makeGallery(self):
self.gallery = hidden.attachNewNode('gallery')
self.gallery.setDepthWrite(1)
self.gallery.setDepthTest(1)
self.suits = []
self.actors = []
self.text = TextNode('rogues')
self.text.setFont(ToontownGlobals.getInterfaceFont())
self.text.setAlign(TextNode.ACenter)
self.text.setTextColor(0.0, 0.0, 0.0, 1.0)
self.rowHeight = 0.0
self.minXScale = None
print "rognamestr='", self.rognamestr, "'\n"
if self.rognamestr == None or len(self.rognamestr) == 0:
for dept in SuitDNA.suitDepts:
self.__makeDept(dept)
else:
self.suitRow = []
self.rowWidth = 0.0
self.__makeSuit(None, None, self.rognamestr)
self.minXScale = self.xRowSpace / self.rowWidth
self.suits.append((self.rowWidth, self.suitRow))
del self.suitRow
self.__rescaleSuits()
return
def __makeDept(self, dept):
self.suitRow = []
self.rowWidth = 0.0
for type in xrange(self.numSuitTypes):
self.__makeSuit(dept, type)
xScale = self.xRowSpace / self.rowWidth
if self.minXScale == None or self.minXScale > xScale:
self.minXScale = xScale
self.suits.append((self.rowWidth, self.suitRow))
del self.suitRow
return
def __makeSuit(self, dept, type, name = None):
dna = SuitDNA.SuitDNA()
if name != None:
dna.newSuit(name)
else:
dna.newSuitRandom(type + 1, dept)
suit = Suit.Suit()
suit.setStyle(dna)
suit.generateSuit()
suit.pose('neutral', 30)
ll = Point3()
ur = Point3()
suit.update()
suit.calcTightBounds(ll, ur)
suitWidth = ur[0] - ll[0]
suitDepth = ur[1] - ll[1]
suitHeight = ur[2] - ll[2]
self.rowWidth += suitWidth + suitDepth
self.rowHeight = max(self.rowHeight, suitHeight)
suit.reparentTo(self.gallery)
suit.setHpr(180.0, 0.0, 0.0)
profile = Suit.Suit()
profile.setStyle(dna)
profile.generateSuit()
profile.pose('neutral', 30)
profile.reparentTo(self.gallery)
profile.setHpr(90.0, 0.0, 0.0)
self.suitRow.append((type,
suitWidth,
suit,
suitDepth,
profile))
self.actors.append(suit)
self.actors.append(profile)
return
def __rescaleSuits(self):
yScale = self.ySuitMaxAllowed / self.rowHeight
scale = min(self.minXScale, yScale)
y = self.top - self.topMargins + self.ySpaceBetweenSuits
for rowWidth, suitRow in self.suits:
rowWidth *= scale
extraSpace = self.xRowSpace - rowWidth
extraSpacePerSuit = extraSpace / (self.numSuitTypes * 2 - 1)
x = self.left + self.sideMargins
y -= self.ySuitInc
for type, width, suit, depth, profile in suitRow:
left = x
width *= scale
suit.setScale(scale)
suit.setPos(x + width / 2.0, 0.0, y)
x += width + self.xSpaceBetweenSameSuits + extraSpacePerSuit
depth *= scale
profile.setScale(scale)
profile.setPos(x + depth / 2.0, 0.0, y)
x += depth
right = x
x += self.xSpaceBetweenDifferentSuits + extraSpacePerSuit
self.text.setText(suit.getName())
name = self.gallery.attachNewNode(self.text.generate())
name.setPos((right + left) / 2.0, 0.0, y + (suit.height + self.labelScale * 0.5) * scale)
name.setScale(self.labelScale * scale)