183 lines
6.5 KiB
Python
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)
|