Advertisement
Guest User

Toontown Panda3d Make a toon (tth)

a guest
Jan 25th, 2014
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 45.63 KB | None | 0 0
  1. from direct.gui.DirectGui import *
  2. from direct.actor.Actor import *
  3. from pandac.PandaModules import *
  4. import sys, os
  5. from direct.stdpy import glob
  6. from random import *
  7.  
  8.  
  9.  
  10. def hex2p(h):
  11. r,g,b = map(lambda x:int(x,16)*256/15.,[h[i:i+1] for i in range(0,len(h),2)])
  12. return map(lambda x: min(x,1.00),rgb2p(r,g,b))
  13.  
  14. class CreateAToon:
  15. def __init__(self,args,tp=None):
  16. self.slot=args[0]
  17.  
  18. gamebase.curArea = self
  19.  
  20. self.CAT_music = loader.loadMusic("data/sounds/create-a-toon")
  21. self.CAT_music.setLoop(1)
  22. self.CAT_music.play()
  23.  
  24. self.frame = DirectFrame(parent=base.a2dBackground)
  25. self.textframe = DirectFrame(parent=base.a2dBackground)
  26.  
  27. environ = loader.loadModel('phase_3/models/makeatoon/tt_m_ara_mat_room.bam')
  28. self.floor = environ.find('**/floor')
  29.  
  30. self.data = {
  31. "gender":"",
  32. "color1":(1, 0.8, 0.0),
  33. "color2":(1, 0.8, 0.0),
  34. "color3":(1, 0.8, 0.0),
  35. "color4":(1, 1, 1), #gloves
  36. "top":8,
  37. "bot":10,
  38. "name":grtn("M"),
  39. "spc":0,
  40. "head":0,
  41. "body":"l",
  42. "legs":.5,
  43. "head":0,
  44. }
  45.  
  46. self.np = render.attachNewNode('CreateAToonSet')
  47.  
  48. self.environ = self.np.attachNewNode('parte-que-interessa') #what is it?
  49. self.floor.reparentTo(self.np)
  50.  
  51. self.env_room_zones = ['genderAll','bodyAll','colorAll','cothAll','nameAll']
  52. self.env_room_titles = map(L10N,["CAT_TITLE_GENDER","CAT_TITLE_SPECIES","CAT_TITLE_COLOR","CAT_TITLE_CLOTHES","CAT_TITLE_NAME"])
  53.  
  54. self.curzone = 0
  55.  
  56. self.titleText = TextNode('titleText')
  57. self.titleText.setTextColor(1,.8,0,1)
  58. self.titleText.setFont(loader.loadFont('phase_3/models/fonts/MickeyFont.bam'))
  59. self.titleText.setAlign(TextNode.ACenter)
  60. self.titleTextNp = self.textframe.attachNewNode(self.titleText)
  61. self.titleTextNp.setPos(0,0,.675)
  62. self.titleTextNp.setScale(.2,1,.25)
  63.  
  64. loader.loadModel('phase_3.5/models/props/TT_sky.bam').reparentTo(self.np)
  65.  
  66. self.nextZone()
  67.  
  68. base.accept('x',lambda:self.toon.reColor((random(),)*3,(random(),)*3,(random(),)*3))
  69. self.toon = None
  70.  
  71. self.toonTypes = map(L10N,["SPC_CAT","SPC_PIG","SPC_DOG","SPC_HORSE","SPC_BEAR","SPC_MOUSE","SPC_DUCK","SPC_RABBIT","SPC_MONKEY"])
  72. self._hModels = ["cat","pig","dog","horse","bear","mouse","duck","rabbit","monkey"]
  73.  
  74. self._colors = map(hex2p,["FFCC00","00FFFF","0000FF","FF00FF","808080","00FF00",
  75. "800000","800080","FF0000","FF8C00","FFFF00"])
  76.  
  77. self._clrNames = map(L10N,["COLOR_GOLDEN","COLOR_LIGHTBLUE","COLOR_DARKBLUE","COLOR_PINK","COLOR_DARKGREEN",
  78. "COLOR_LIGHTGREEN","COLOR_BROWN","COLOR_PURPLE","COLOR_RED","COLOR_ORANGE","COLOR_YELLOW"])
  79.  
  80. self.cColor = 0
  81.  
  82. self.maxTop = 122
  83. self.maxBotM = 54
  84. self.maxBotF = 38
  85.  
  86. self.names = [sorted(fetchAll(self.data['gender'],['t','f','l1','l2'][i])) for i in xrange(4)]
  87.  
  88. if tp: tp.done()
  89.  
  90. def reloadToon(self):
  91. if self.toon: self.toon._toon.removeNode()
  92. self.toon = Toon(self.np,self._hModels[self.data["spc"]],self.data["color1"],self.data["color2"],self.data["color3"], self.data["color4"],
  93. self.data["body"],{"M":"shorts","F":"skirt"}[self.data["gender"]],self.data["legs"],
  94. self.data['head'],False,(self.data['top'],self.data['bot'],None))
  95.  
  96. self.toon.setH(135)
  97. self.toon.anim('neutral')
  98. taskMgr.doMethodLater(0,lambda *a:self.toon._toon.show(),'showToon')
  99.  
  100. def cleanUpEnviron(self):
  101. self.environ.removeNode()
  102. self.environ = self.np.attachNewNode('parte-que-interessa') #tuw
  103.  
  104. def getGuiItem(self,name):
  105. self.gui_items = {m.getName().split('_')[-1]:m for m in loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui.bam').findAllMatches('**') if m.getName()}
  106. if name == 'ALL':
  107. return self.gui_items.keys()
  108. return self.gui_items[filter(lambda x: name in x,self.gui_items.keys())[0]]
  109.  
  110. def getNameGuiItem(self,name):
  111. self.gui_items = {m.getName().split('_')[-1]:m for m in loader.loadModel('phase_3/models/gui/tt_m_gui_mat_nameShop.bam').findAllMatches('**') if m.getName()}
  112. if name == 'ALL':
  113. return self.gui_items.keys()
  114. return self.gui_items[filter(lambda x: name in x,self.gui_items.keys())[0]]
  115.  
  116. def nextZone(self):
  117. self.cleanUpEnviron()
  118. print 'Showing',self.env_room_zones[self.curzone%len(self.env_room_zones)]
  119. self.loadZone(self.env_room_zones[self.curzone%len(self.env_room_zones)]).reparentTo(self.environ)
  120. self.loadZoneGui()
  121. self.loadZoneTitle()
  122. self.curzone+=1
  123.  
  124. def previousZone(self):
  125. self.curzone-=2
  126. self.cleanUpEnviron()
  127. print 'Showing',self.env_room_zones[self.curzone%len(self.env_room_zones)]
  128. self.loadZone(self.env_room_zones[self.curzone%len(self.env_room_zones)]).reparentTo(self.environ)
  129. self.loadZoneGui()
  130. self.loadZoneTitle()
  131. self.curzone+=1
  132.  
  133. def loadZone(self,zone):
  134. base.cam.setPos((-14.7046, -16.793, 4))
  135. base.cam.setH(-39)
  136. if hasattr(self,"toon"):
  137. self.toon.setH(135)
  138. self.toon.setPos(0,0,0)
  139. environ = loader.loadModel('phase_3/models/makeatoon/tt_m_ara_mat_room.bam')
  140. return environ.find('**/'+zone)
  141.  
  142. def loadZoneTitle(self):
  143. self.titleText.setWtext(L10N('CAT_CHOOSE')+ " " +self.env_room_titles[self.curzone%len(self.env_room_titles)])
  144.  
  145. def setGender(self,gender):
  146. self.data['gender']=gender
  147. if gender == 'M':
  148. self.gui_boyButton['state'] = DGG.DISABLED
  149. self.gui_girlButton['state'] = DGG.NORMAL
  150. if gender == 'F':
  151. self.gui_girlButton['state'] = DGG.DISABLED
  152. self.gui_boyButton['state'] = DGG.NORMAL
  153.  
  154. self.nextButton['state'] = DGG.NORMAL
  155.  
  156. self.names = [sorted(fetchAll(self.data['gender'],['t','f','l1','l2'][i])) for i in xrange(4)]
  157.  
  158. try: self.gui_boyText.destroy()
  159. except: pass
  160. try: self.gui_girlText.destroy()
  161. except: pass
  162.  
  163. if gender == 'F' and self.data['bot'] > self.maxBotF: self.data['bot'] = 3
  164.  
  165. self.data['name'] = grtn(gender)
  166.  
  167. self.reloadToon()
  168.  
  169. def nextToonType(self):
  170. self.data["spc"] += 1
  171. if self.data["spc"] >= 9: self.data["spc"] = 0
  172. self.gui_tFt.setText(self.toonTypes[self.data["spc"]])
  173. self.gui_tFt.setSx(3./len(self.toonTypes[self.data["spc"]]))
  174.  
  175. self.reloadToon()
  176.  
  177. def prevToonType(self):
  178. self.data["spc"] -= 1
  179. if self.data["spc"] == -1: self.data["spc"] = 8
  180. self.gui_tFt.setText(self.toonTypes[self.data["spc"]])
  181. self.gui_tFt.setSx(3./len(self.toonTypes[self.data["spc"]]))
  182.  
  183. self.reloadToon()
  184.  
  185. def nextToonHead(self):
  186. self.data["head"] += 1
  187. if self.data["head"] >= 4: self.data["head"] = 0
  188.  
  189. self.reloadToon()
  190.  
  191. def prevToonHead(self):
  192. self.data["head"] -= 1
  193. if self.data["head"] == -1: self.data["head"] = 3
  194.  
  195. self.reloadToon()
  196.  
  197. def nextToonTorso(self):
  198. self.data["body"] = ["l","s","m"][(["l","s","m"].index(self.data["body"])+1)%3]
  199.  
  200. self.reloadToon()
  201.  
  202. def prevToonTorso(self):
  203. self.data["body"] = ["l","s","m"][["l","s","m"].index(self.data["body"])-1]
  204.  
  205. self.reloadToon()
  206.  
  207. def nextToonLegs(self):
  208. self.data["legs"] = [.5,.75,1][([.5,.75,1].index(self.data["legs"])+1)%3]
  209.  
  210. self.reloadToon()
  211.  
  212. def prevToonLegs(self):
  213. self.data["legs"] = [.5,.75,1][[.5,.75,1].index(self.data["legs"])-1]
  214.  
  215. self.reloadToon()
  216.  
  217. def nextToonColor(self,id=None):
  218. self.cColor = (self.cColor+1)%len(self._colors)
  219. if id is None:
  220. _c = self._colors[self.cColor]
  221. self.data["color1"] = tuple(_c)
  222. self.data["color2"] = tuple(_c)
  223. self.data["color3"] = tuple(_c)
  224.  
  225. else:
  226. self.data["color"+id] = tuple(self._colors[self.cColor])
  227.  
  228. self.toon.reColor(self.data['color1'],self.data['color2'],self.data['color3'], self.data['color4'])
  229.  
  230. def prevToonColor(self,id=None):
  231. self.cColor -= 1
  232. if id is None:
  233. _c = self._colors[self.cColor]
  234. self.data["color1"] = tuple(_c)
  235. self.data["color2"] = tuple(_c)
  236. self.data["color3"] = tuple(_c)
  237.  
  238. else:
  239. self.data["color"+id] = tuple(self._colors[self.cColor])
  240.  
  241. self.toon.reColor(self.data['color1'],self.data['color2'],self.data['color3'])
  242.  
  243. def changeTop(self,isPrev=False):
  244. if isPrev:
  245. self.data["top"] -= 1
  246. if self.data["top"] < 0: self.data["top"] = self.maxTop
  247.  
  248. else:
  249. self.data["top"] += 1
  250. if self.data["top"] > self.maxTop: self.data["top"] = 0
  251.  
  252. self.toon.reTexture(self.data['top'],str(self.data['bot'])+('s'*(self.data['gender']=='F')),None)
  253.  
  254. def changeBot(self,isPrev=False):
  255. _max = eval('self.maxBot'+self.data['gender'])
  256. if isPrev:
  257. self.data["bot"] -= 1
  258. if self.data["bot"] < 0: self.data["bot"] = _max
  259.  
  260. else:
  261. self.data["bot"] += 1
  262. if self.data["bot"] > _max: self.data["bot"] = 0
  263.  
  264. self.toon.reTexture(self.data['top'],str(self.data['bot'])+('s'*(self.data['gender']=='F')),None)
  265.  
  266. def shuffle(self,zone):
  267.  
  268. #print ':CAT:Shuffle:sDict'
  269. _d = [0,0,0,0]
  270. _d[1] = {'head':range(4),'body':['l','m','s'],'legs':[.5,.75,1],'spc':range(8)}
  271.  
  272. _d[2] = {'color1':map(tuple,self._colors),'color2':map(tuple,self._colors),'color3':map(tuple,self._colors)}
  273.  
  274. _d[3] = {'top':range(100),'bot':range(20)}
  275.  
  276. #print ':CAT:Shuffle:apply'
  277.  
  278. for a,v in _d[zone].items(): self.data[a]=choice(v)
  279.  
  280. #print ':CAT:Shuffle:reload'
  281.  
  282. if zone == 1: self.reloadToon()
  283. if zone == 2: self.toon.reColor(self.data['color1'],self.data['color2'],self.data['color3'])
  284. if zone == 3: self.toon.reTexture(self.data['top'],str(self.data['bot'])+('s'*(self.data['gender']=='F')),None)
  285.  
  286. def typeName(self):
  287.  
  288. self.gui_tanf = self.getNameGuiItem('typeName')
  289. self.gui_tanf.reparentTo(self.frame)
  290.  
  291. def exit_gaveup(self): #xD
  292. gamebase.curArea = None
  293. gamebase.themeMusic = loader.loadMusic("data/sounds/tt_theme")
  294. gamebase.themeMusic.setLoop(1)
  295. gamebase.themeMusic.play()
  296. messenger.send('load-chooseatoon-screen')
  297. self.dismiss()
  298.  
  299. def exit_fnAA(self):
  300. saveNewToon(*map(str,[self.slot,self.buildName(),self.data['body'],self.data['legs'],self.data['head'],
  301. self.data['top'],self.data['bot'],self.data['color1'],self.data['color2'],
  302. self.data['color3'],self.data['spc'],self.data['gender'],'','']))
  303. messenger.send('end-createatoon')
  304. self.dismiss()
  305.  
  306. def gui_n_updateButt(self):
  307. g_circle = self.getNameGuiItem('ircle')
  308. g_circle.setColor(Vec4(.2,1,.2,1),1)
  309. _b = self.data['name'][:-1]
  310. bts = (self.gui_tnb,self.gui_fnb,self.gui_lnb)
  311. for i,b in enumerate(bts):
  312. b['geom'] = (g_circle,None,None,None)
  313. if not _b[i]: b['geom'] = (None,g_circle,g_circle,None)
  314.  
  315. _b = self.data['name'][-1]
  316. for i in xrange(4):
  317. eval('self.sl'+str(i+1)).show()
  318. if not _b[i]: eval('self.sl'+str(i+1)).hide()
  319. self.buildName()
  320.  
  321. def recompileName(self,old,new):
  322. _name = self.data['name'][-1]
  323. changes = [0,0,0,0]
  324. for i,(n,o) in enumerate(zip(new,old)):
  325. if n == o: changes[i]=0
  326. elif not n and o: changes[i]=1
  327. elif n and not o: changes[i]=2
  328.  
  329. changes[-1] = changes[-2]
  330.  
  331. for i,change in enumerate(changes):
  332. if change > 0:
  333. _name[i] = (7,None)[change==1]
  334.  
  335. return _name
  336.  
  337. def gui_n_butt_click(self,i):
  338. _now = self.data['name'][:3]
  339. _new = list(_now[:])
  340. _new[i] = not _now[i]
  341.  
  342. _nname = self.recompileName(_now,_new)
  343.  
  344. #print _new
  345. if _new in ([True,False,True],[True,True,True],[True,True,False],[False,True,True],[False,True,False]):
  346. self.data['name'] = tuple(_new+[_nname])
  347.  
  348. for i in xrange(4):
  349. if _nname[i]: self.gui_n_frameClick(i+1,_nname[i])
  350.  
  351. self.gui_n_updateButt()
  352.  
  353. def gui_n_frameClick(self,_frameId,_item):
  354. for i in self.gui_li[_frameId]:
  355. i['frameColor'] = (0.0,0.0,0.0,0.0)
  356. self.gui_li[_frameId][_item]['frameColor'] = (1,230./255,196./255,1)
  357.  
  358. eval('self.sl'+str(_frameId)).scrollTo(_item,True)
  359. self.buildName()
  360.  
  361. def gui_n_selectFI(self,f,i,event):
  362. self.data['name'][-1][f] = i
  363. self.gui_n_frameClick(f+1,i)
  364. self.buildName()
  365.  
  366. def buildName(self):
  367. _n = []
  368. _nms = self.data['name'][-1]
  369. for i,n in enumerate(_nms):
  370. if n is not None:
  371. _n.append(self.names[i][n])
  372. if i == 3:
  373. _n.pop()
  374. _n[-1]+=self.names[i][n]
  375.  
  376.  
  377. _text = unicode(' '.join(_n).decode('latin-1'))
  378. #print ':CAT:Name built:',_text
  379. self.gui_nameText.setText(_text)
  380.  
  381. return ' '.join(_n)
  382.  
  383. def loadZoneGui(self):
  384. self.frame.removeNode()
  385. self.frame = DirectFrame(parent=base.a2dBackground)
  386. _zone = self.curzone%len(self.env_room_titles)
  387.  
  388. self.gui_nextUp = self.getGuiItem("nextUp")
  389. self.gui_nextDown = self.getGuiItem("nextDown")
  390. self.gui_nextDis = self.getGuiItem("nextDisabled")
  391.  
  392. self.gui_ok = self.getGuiItem("okUp")
  393.  
  394. self.nextButton = DirectButton(parent=self.frame,pos=Vec3(1.1,0,-.85),scale=.3,text="",relief=None,
  395. geom=(self.gui_nextUp,self.gui_nextDown,self.gui_nextUp,self.gui_nextDis),
  396. command=self.nextZone,clickSound=gamebase.sounds['GUI_click'],
  397. rolloverSound=gamebase.sounds['GUI_rollover'])
  398.  
  399. self.backButton = DirectButton(parent=self.frame,pos=Vec3(.8,0,-.85),scale=.3,text="",relief=None,
  400. geom=(self.gui_nextUp,self.gui_nextDown,self.gui_nextUp,self.gui_nextDis),
  401. command=self.previousZone,clickSound=gamebase.sounds['GUI_click'],
  402. rolloverSound=gamebase.sounds['GUI_rollover'])
  403.  
  404. self.closeButton = DirectButton(parent=self.frame,pos=Vec3(-1.2,0,-.85),scale=.5,text="",relief=None,
  405. geom=self.getGuiItem('closeUp'),
  406. command=self.exit_gaveup,clickSound=gamebase.sounds['GUI_click'],
  407. rolloverSound=gamebase.sounds['GUI_rollover'])
  408.  
  409. self.backButton.setH(180)
  410.  
  411. if 0 < _zone <= 3:
  412. self.gui_tFs = DirectButton(parent=self.frame,pos=Vec3(1,0,-.55),text="",scale=.694105,
  413. relief=None,geom=self.getGuiItem('shuffleUp'),command=self.shuffle,extraArgs=[_zone])
  414.  
  415. shuffleText = TextNode('shuffletext')
  416. shuffleText.setFont(loader.loadFont("data/fonts/ImpressBT.ttf"))
  417. shuffleText.setAlign(TextNode.ACenter)
  418. shuffleText.setWtext(L10N('CAT_SHUFFLE'))
  419. shuffleTextNp = self.gui_tFs.attachNewNode(shuffleText)
  420. shuffleTextNp.setColor((1,1,1,1))
  421. shuffleTextNp.setPos(0,0,-.04)
  422. shuffleTextNp.setScale(.075)
  423.  
  424. if _zone == 0:
  425. self.backButton['state'] = DGG.DISABLED
  426. self.gui_boyUp = self.getGuiItem("boyUp")
  427. self.gui_boyDown = self.getGuiItem("boyDown")
  428. self.gui_girlUp = self.getGuiItem("girlUp")
  429. self.gui_girlDown = self.getGuiItem("girlDown")
  430.  
  431. self.gui_boyButton = DirectButton(parent=self.frame,pos=Vec3(-.4,0,-.8),scale=.5,text="",relief=None,
  432. geom=(self.gui_boyUp,self.gui_boyDown,self.gui_boyUp,self.gui_boyDown),
  433. command=self.setGender,extraArgs=["M"],clickSound=gamebase.sounds['GUI_click'],
  434. rolloverSound=gamebase.sounds['GUI_rollover'])
  435.  
  436. self.gui_girlButton = DirectButton(parent=self.frame,pos=Vec3(.4,0,-.8),scale=.5,text="",relief=None,
  437. geom=(self.gui_girlUp,self.gui_girlDown,self.gui_girlUp,self.gui_girlDown),
  438. command=self.setGender,extraArgs=["F"],clickSound=gamebase.sounds['GUI_click'],
  439. rolloverSound=gamebase.sounds['GUI_rollover'])
  440.  
  441. self.backButton.destroy()
  442. self.nextButton['state'] = DGG.DISABLED
  443.  
  444. def _boyIn(e):
  445. self.gui_boyButton.setScale(.53)
  446. self.gui_boyText = OnscreenText(text=L10N('CAT_BOY'),parent=self.gui_boyButton,pos=(0,.3),fg=(1,1,1,1),scale=.15)
  447.  
  448. def _boyOut(e):
  449. self.gui_boyButton.setScale(.5)
  450. self.gui_boyText.destroy()
  451.  
  452. def _girlIn(e):
  453. self.gui_girlButton.setScale(.53)
  454. self.gui_girlText = OnscreenText(text=L10N('CAT_GIRL'),parent=self.gui_girlButton,pos=(0,.3),fg=(1,1,1,1),scale=.15)
  455.  
  456. def _girlOut(e):
  457. self.gui_girlButton.setScale(.5)
  458. self.gui_girlText.destroy()
  459.  
  460. self.gui_boyButton.bind(DGG.WITHIN, _boyIn)
  461. self.gui_boyButton.bind(DGG.WITHOUT, _boyOut)
  462.  
  463. self.gui_girlButton.bind(DGG.WITHIN, _girlIn)
  464. self.gui_girlButton.bind(DGG.WITHOUT, _girlOut)
  465.  
  466. if self.data['gender']: self.setGender(self.data['gender'])
  467.  
  468. elif _zone == 1:
  469. self.gui_arUp = self.getGuiItem("arrowRotateUp")
  470. self.gui_arDown = self.getGuiItem("arrowRotateDown")
  471. self.gui_sframe = self.getGuiItem("Frame")
  472. self.gui_sUp = self.getGuiItem("shuffleArrowUp")
  473. self.gui_sDown = self.getGuiItem("shuffleArrowDown")
  474.  
  475. #type
  476.  
  477. self.gui_arRightButton = DirectButton(parent=self.frame,pos=Vec3(.4,0,-.65),scale=.5,text="",relief=None,
  478. geom=(self.gui_arUp,self.gui_arDown,self.gui_arUp,self.gui_arUp),
  479. command=lambda:self.toon.setH(self.toon._toon,25),clickSound=gamebase.sounds['GUI_click'],
  480. rolloverSound=gamebase.sounds['GUI_rollover'])
  481.  
  482. self.gui_arLeftButton = DirectButton(parent=self.frame,pos=Vec3(-.15,0,-.65),scale=.5,text="",relief=None,
  483. geom=(self.gui_arUp,self.gui_arDown,self.gui_arUp,self.gui_arUp),
  484. command=lambda:self.toon.setH(self.toon._toon,-25),clickSound=gamebase.sounds['GUI_click'],
  485. rolloverSound=gamebase.sounds['GUI_rollover'])
  486.  
  487. self.gui_tFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,.3),scale=.8,text="",relief=None,
  488. geom=self.gui_sframe,command=self.nextToonType,clickSound=gamebase.sounds['GUI_click'],
  489. rolloverSound=gamebase.sounds['GUI_rollover'])
  490.  
  491. self.gui_tFlb = DirectButton(parent=self.gui_tFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  492. self.gui_sDown,self.gui_sDown),command=self.prevToonType)
  493.  
  494. self.gui_tFrb = DirectButton(parent=self.gui_tFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  495. self.gui_sDown,self.gui_sDown),command=self.nextToonType)
  496.  
  497. self.gui_tFt = OnscreenText(text=L10N('SPC_CAT'),scale=.2,parent=self.gui_tFrame,pos=(0,-.07),font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1),mayChange=1)
  498. self.gui_tFrb.setH(180)
  499. self.gui_arLeftButton.setH(180)
  500.  
  501. #head
  502.  
  503. self.gui_tHeadFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,.1),scale=.5235,text="",relief=None,
  504. geom=self.gui_sframe,command=self.nextToonHead,clickSound=gamebase.sounds['GUI_click'],
  505. rolloverSound=gamebase.sounds['GUI_rollover'])
  506.  
  507.  
  508. DirectButton(parent=self.gui_tHeadFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  509. self.gui_sDown,self.gui_sDown),command=self.prevToonHead)
  510.  
  511. DirectButton(parent=self.gui_tHeadFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  512. self.gui_sDown,self.gui_sDown),command=self.nextToonHead).setH(180)
  513.  
  514. headText = TextNode('head text')
  515. headText.setFont(loader.loadFont("data/fonts/ImpressBT.ttf"))
  516. headText.setAlign(TextNode.ACenter)
  517. headText.setWtext(L10N('CAT_HEAD'))
  518. headTextNp = self.gui_tHeadFrame.attachNewNode(headText)
  519. headTextNp.setPos(0,0,0)
  520. headTextNp.setColor((1,1,1,1))
  521. headTextNp.setScale(.12)
  522.  
  523. #torso
  524.  
  525. self.gui_tTorsoFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,-.1),scale=.5235,text="",relief=None,
  526. geom=self.gui_sframe,command=self.nextToonTorso,clickSound=gamebase.sounds['GUI_click'],
  527. rolloverSound=gamebase.sounds['GUI_rollover'])
  528.  
  529.  
  530. DirectButton(parent=self.gui_tTorsoFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  531. self.gui_sDown,self.gui_sDown),command=self.prevToonTorso)
  532.  
  533. DirectButton(parent=self.gui_tTorsoFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  534. self.gui_sDown,self.gui_sDown),command=self.nextToonTorso).setH(180)
  535.  
  536. OnscreenText(text=L10N('CAT_TORSO'),scale=.12,parent=self.gui_tTorsoFrame,pos=(0,-.04),font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  537.  
  538. #legs
  539.  
  540. self.gui_tLegsFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,-.3),scale=.5235,text="",relief=None,
  541. geom=self.gui_sframe,command=self.nextToonLegs,clickSound=gamebase.sounds['GUI_click'],
  542. rolloverSound=gamebase.sounds['GUI_rollover'])
  543.  
  544.  
  545. DirectButton(parent=self.gui_tLegsFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  546. self.gui_sDown,self.gui_sDown),command=self.prevToonLegs)
  547.  
  548. DirectButton(parent=self.gui_tLegsFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  549. self.gui_sDown,self.gui_sDown),command=self.nextToonLegs).setH(180)
  550.  
  551. OnscreenText(text=L10N('CAT_LEGS'),scale=.12,parent=self.gui_tLegsFrame,pos=(0,-.04),font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  552.  
  553. elif _zone == 2:
  554. self.gui_arUp = self.getGuiItem("arrowRotateUp")
  555. self.gui_arDown = self.getGuiItem("arrowRotateDown")
  556. self.gui_sframe = self.getGuiItem("Frame")
  557. self.gui_sUp = self.getGuiItem("shuffleArrowUp")
  558. self.gui_sDown = self.getGuiItem("shuffleArrowDown")
  559.  
  560. #type
  561.  
  562. self.gui_arRightButton = DirectButton(parent=self.frame,pos=Vec3(.4,0,-.65),scale=.5,text="",relief=None,
  563. geom=(self.gui_arUp,self.gui_arDown,self.gui_arUp,self.gui_arUp),
  564. command=lambda:self.toon.setH(self.toon._toon,25),clickSound=gamebase.sounds['GUI_click'],
  565. rolloverSound=gamebase.sounds['GUI_rollover'])
  566.  
  567. self.gui_arLeftButton = DirectButton(parent=self.frame,pos=Vec3(-.15,0,-.65),scale=.5,text="",relief=None,
  568. geom=(self.gui_arUp,self.gui_arDown,self.gui_arUp,self.gui_arUp),
  569. command=lambda:self.toon.setH(self.toon._toon,-25),clickSound=gamebase.sounds['GUI_click'],
  570. rolloverSound=gamebase.sounds['GUI_rollover'])
  571.  
  572. self.gui_tFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,.3),scale=.8,text="",relief=None,
  573. geom=self.gui_sframe,command=self.nextToonColor,clickSound=gamebase.sounds['GUI_click'],
  574. rolloverSound=gamebase.sounds['GUI_rollover'])
  575.  
  576. self.gui_tFlb = DirectButton(parent=self.gui_tFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  577. self.gui_sDown,self.gui_sDown),command=self.prevToonColor)
  578.  
  579. self.gui_tFrb = DirectButton(parent=self.gui_tFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  580. self.gui_sDown,self.gui_sDown),command=self.nextToonColor)
  581.  
  582. self.gui_tFt = OnscreenText(text="Toon",scale=.115,parent=self.gui_tFrame,pos=(0,-.04), #the word 'Toon' is equal for all langs
  583. font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  584. self.gui_tFt.setSx(.75)
  585. self.gui_tFrb.setH(180)
  586. self.gui_arLeftButton.setH(180)
  587.  
  588. #head
  589.  
  590. self.gui_tHeadFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,.1),scale=.5235,text="",relief=None,
  591. geom=self.gui_sframe,command=self.nextToonColor,clickSound=gamebase.sounds['GUI_click'],
  592. rolloverSound=gamebase.sounds['GUI_rollover'],extraArgs=['1'])
  593.  
  594.  
  595. DirectButton(parent=self.gui_tHeadFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  596. self.gui_sDown,self.gui_sDown),command=self.prevToonColor,extraArgs=['1'])
  597.  
  598. DirectButton(parent=self.gui_tHeadFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  599. self.gui_sDown,self.gui_sDown),command=self.nextToonColor,extraArgs=['1']).setH(180)
  600.  
  601. headText = TextNode('head text')
  602. headText.setFont(loader.loadFont("data/fonts/ImpressBT.ttf"))
  603. headText.setAlign(TextNode.ACenter)
  604. headText.setWtext(L10N('CAT_HEAD'))
  605. headTextNp = self.gui_tHeadFrame.attachNewNode(headText)
  606. headTextNp.setPos(0,0,0)
  607. headTextNp.setColor((1,1,1,1))
  608. headTextNp.setScale(.12)
  609.  
  610. #torso
  611.  
  612. self.gui_tTorsoFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,-.1),scale=.5235,text="",relief=None,
  613. geom=self.gui_sframe,command=self.nextToonColor,clickSound=gamebase.sounds['GUI_click'],
  614. rolloverSound=gamebase.sounds['GUI_rollover'],extraArgs=['2'])
  615.  
  616.  
  617. DirectButton(parent=self.gui_tTorsoFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  618. self.gui_sDown,self.gui_sDown),command=self.prevToonColor,extraArgs=['2'])
  619.  
  620. DirectButton(parent=self.gui_tTorsoFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  621. self.gui_sDown,self.gui_sDown),command=self.nextToonColor,extraArgs=['2']).setH(180)
  622.  
  623. OnscreenText(text=L10N('CAT_TORSO'),scale=.12,parent=self.gui_tTorsoFrame,pos=(0,-.04),
  624. font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  625.  
  626. #legs
  627.  
  628. self.gui_tLegsFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,-.3),scale=.5235,text="",relief=None,
  629. geom=self.gui_sframe,command=self.nextToonColor,clickSound=gamebase.sounds['GUI_click'],
  630. rolloverSound=gamebase.sounds['GUI_rollover'],extraArgs=['3'])
  631.  
  632.  
  633. DirectButton(parent=self.gui_tLegsFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  634. self.gui_sDown,self.gui_sDown),command=self.prevToonColor,extraArgs=['3'])
  635.  
  636. DirectButton(parent=self.gui_tLegsFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  637. self.gui_sDown,self.gui_sDown),command=self.nextToonColor,extraArgs=['3']).setH(180)
  638.  
  639. OnscreenText(text=L10N('CAT_LEGS'),scale=.12,parent=self.gui_tLegsFrame,pos=(0,-.04),font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  640.  
  641. elif _zone == 3:
  642. self.gui_arUp = self.getGuiItem("arrowRotateUp")
  643. self.gui_arDown = self.getGuiItem("arrowRotateDown")
  644. self.gui_sframe = self.getGuiItem("Frame")
  645. self.gui_sUp = self.getGuiItem("shuffleArrowUp")
  646. self.gui_sDown = self.getGuiItem("shuffleArrowDown")
  647.  
  648. #type
  649.  
  650. self.gui_arRightButton = DirectButton(parent=self.frame,pos=Vec3(.4,0,-.65),scale=.5,text="",relief=None,
  651. geom=(self.gui_arUp,self.gui_arDown,self.gui_arUp,self.gui_arUp),
  652. command=lambda:self.toon.setH(self.toon._toon,25),clickSound=gamebase.sounds['GUI_click'],
  653. rolloverSound=gamebase.sounds['GUI_rollover'])
  654.  
  655. self.gui_arLeftButton = DirectButton(parent=self.frame,pos=Vec3(-.15,0,-.65),scale=.5,text="",relief=None,
  656. geom=(self.gui_arUp,self.gui_arDown,self.gui_arUp,self.gui_arUp),
  657. command=lambda:self.toon.setH(self.toon._toon,-25),clickSound=gamebase.sounds['GUI_click'],
  658. rolloverSound=gamebase.sounds['GUI_rollover'])
  659.  
  660. self.gui_tFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,.3),scale=.8,text="",relief=None,
  661. geom=self.gui_sframe,command=self.nextToonColor,clickSound=gamebase.sounds['GUI_click'],
  662. rolloverSound=gamebase.sounds['GUI_rollover'],state=DGG.DISABLED)
  663.  
  664. self.gui_tFrame.hide()
  665.  
  666. self.gui_tFlb = DirectButton(parent=self.gui_tFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  667. self.gui_sDown,self.gui_sDown),command=self.prevToonColor)
  668.  
  669. self.gui_tFrb = DirectButton(parent=self.gui_tFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  670. self.gui_sDown,self.gui_sDown),command=self.nextToonColor)
  671.  
  672. self.gui_tFt = OnscreenText(text="Toon",scale=.115,parent=self.gui_tFrame,pos=(0,-.04),
  673. font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  674. self.gui_tFt.setSx(.75)
  675. self.gui_tFrb.setH(180)
  676. self.gui_arLeftButton.setH(180)
  677.  
  678. #head
  679.  
  680. self.gui_tHeadFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,.1),scale=.5235,text="",relief=None,
  681. geom=self.gui_sframe,command=self.changeTop,clickSound=gamebase.sounds['GUI_click'],
  682. rolloverSound=gamebase.sounds['GUI_rollover'],extraArgs=['1'])
  683.  
  684.  
  685. DirectButton(parent=self.gui_tHeadFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  686. self.gui_sDown,self.gui_sDown),command=self.changeTop)
  687.  
  688. DirectButton(parent=self.gui_tHeadFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  689. self.gui_sDown,self.gui_sDown),command=self.changeTop).setH(180)
  690.  
  691. OnscreenText(text=L10N("CAT_SHIRT"),scale=.12,parent=self.gui_tHeadFrame,pos=(0,-.04),
  692. font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  693.  
  694. #torso
  695.  
  696. self.gui_tTorsoFrame = DirectButton(parent=self.frame,pos=Vec3(1,0,-.1),scale=.5235,text="",relief=None,
  697. geom=self.gui_sframe,command=self.changeBot,clickSound=gamebase.sounds['GUI_click'],
  698. rolloverSound=gamebase.sounds['GUI_rollover'])
  699.  
  700.  
  701. DirectButton(parent=self.gui_tTorsoFrame,pos=Vec3(-.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  702. self.gui_sDown,self.gui_sDown),command=self.changeBot,extraArgs=[True])
  703.  
  704. DirectButton(parent=self.gui_tTorsoFrame,pos=Vec3(.338,0,0),text="",relief=None,geom=(self.gui_sUp,self.gui_sDown,
  705. self.gui_sDown,self.gui_sDown),command=self.changeBot).setH(180)
  706.  
  707. botText = L10N("CAT_SHORTS")
  708. if self.data['gender']=='F': botText=L10N("CAT_SKIRT")
  709.  
  710. OnscreenText(text=botText,scale=.12,parent=self.gui_tTorsoFrame,pos=(0,-.04),
  711. font=loader.loadFont("data/fonts/ImpressBT.ttf"),fg=(1,1,1,1))
  712.  
  713. elif _zone == 4:
  714. self.nextButton['geom'] = self.gui_ok
  715. self.nextButton['command'] = self.exit_fnAA
  716. self.nextButton.setScale(.8)
  717. base.cam.setPos(1, -21.1231, 4)
  718. base.cam.setH(-2)
  719. self.toon._toon.setPos(5, -1, 0)
  720. self.toon._toon.setH(138)
  721.  
  722. g_up = (self.getNameGuiItem('ArrowUp'),self.getNameGuiItem('ArrowUp'),
  723. self.getNameGuiItem('ArrowDown'),self.getNameGuiItem('ArrowDown'))
  724.  
  725. g_down = (self.getNameGuiItem('ArrowUp'),self.getNameGuiItem('ArrowUp'),
  726. self.getNameGuiItem('ArrowDown'),self.getNameGuiItem('ArrowDown'))
  727.  
  728. g_circle = self.getNameGuiItem('ircle')
  729. g_circle.setColor(Vec4(.2,1,.2,1),1)
  730.  
  731. for g in g_down: g.setP(180)
  732.  
  733. DirectFrame(parent=self.frame,frameSize=(-.15,.16,-.19,.19),frameColor=(230./255,190./255,207./255,1),pos=(-1.075,0,-.03))
  734. DirectFrame(parent=self.frame,frameSize=(-.15,.16,-.19,.19),frameColor=(190./255,230./255,196./255,1),pos=(-.675,0,-.03))
  735. DirectFrame(parent=self.frame,frameSize=(-.16,.16,-.19,.19),frameColor=(237./255,185./255,236./255,1),pos=(-.27,0,-.03))
  736. DirectFrame(parent=self.frame,frameSize=(-.15,.18,-.19,.19),frameColor=(237./255,185./255,236./255,1),pos=(.07,0,-.03))
  737.  
  738. self.gui_nPanel = self.getNameGuiItem('namePanel')
  739. self.gui_nPanel.reparentTo(self.frame)
  740. self.gui_nPanel.setScale(.75)
  741. self.gui_nPanel.setX(-.5)
  742.  
  743. self.gui_nameText = OnscreenText(align=TextNode.ACenter,text=unicode('\x135\x135'),parent=self.gui_nPanel,
  744. pos=(.025,.675),wordwrap=1/.075,scale=(.07,.1))
  745. self.buildName()
  746.  
  747. _dPos,_iPos = ((0,0,.13),(0,0,-.33))
  748. _lz = .08
  749.  
  750. self.sl1=DirectScrolledList(parent=self.frame,pos=(-1.075,0,_lz),
  751. numItemsVisible=5,itemFrame_frameColor=(1,0.0,0.0,1),itemFrame_pos = (0, 0, 0),
  752. decButton_geom = g_up,incButton_geom = g_down,
  753. decButton_relief = None,incButton_relief = None,
  754. decButton_pos = _dPos,incButton_pos = _iPos,
  755. decButton_scale = .695,incButton_scale = .695,
  756. decButton_clickSound=gamebase.sounds['GUI_click'],
  757. decButton_rolloverSound=gamebase.sounds['GUI_rollover'],
  758. incButton_clickSound=gamebase.sounds['GUI_click'],
  759. incButton_rolloverSound=gamebase.sounds['GUI_rollover'])
  760.  
  761. self.sl2=DirectScrolledList(parent=self.frame,pos=(-.675,0,_lz),
  762. numItemsVisible=5,itemFrame_frameColor=(1,0.0,0.0,1),
  763. decButton_geom = g_up,incButton_geom = g_down,
  764. decButton_relief = None,incButton_relief = None,
  765. decButton_pos = _dPos,incButton_pos = _iPos,
  766. decButton_scale = .695,incButton_scale = .695,
  767. decButton_clickSound=gamebase.sounds['GUI_click'],
  768. decButton_rolloverSound=gamebase.sounds['GUI_rollover'],
  769. incButton_clickSound=gamebase.sounds['GUI_click'],
  770. incButton_rolloverSound=gamebase.sounds['GUI_rollover'])
  771.  
  772.  
  773. self.sl3=DirectScrolledList(parent=self.frame,pos=(-.27,0,_lz),
  774. numItemsVisible=5,itemFrame_frameColor=(1,0.0,0.0,1),
  775. decButton_geom = g_up,incButton_geom = g_down,
  776. decButton_relief = None,incButton_relief = None,
  777. decButton_pos = _dPos,incButton_pos = _iPos,
  778. decButton_scale = .695,incButton_scale = .695,
  779. decButton_clickSound=gamebase.sounds['GUI_click'],
  780. decButton_rolloverSound=gamebase.sounds['GUI_rollover'],
  781. incButton_clickSound=gamebase.sounds['GUI_click'],
  782. incButton_rolloverSound=gamebase.sounds['GUI_rollover'])
  783.  
  784.  
  785. self.sl4=DirectScrolledList(parent=self.frame,pos=(.07,0,_lz),
  786. numItemsVisible=5,itemFrame_frameColor=(1,0.0,0.0,1),
  787. decButton_geom = g_up,incButton_geom = g_down,
  788. decButton_relief = None,incButton_relief = None,
  789. decButton_pos = _dPos,incButton_pos = _iPos,
  790. decButton_scale = .695,incButton_scale = .695,
  791. decButton_clickSound=gamebase.sounds['GUI_click'],
  792. decButton_rolloverSound=gamebase.sounds['GUI_rollover'],
  793. incButton_clickSound=gamebase.sounds['GUI_click'],
  794. incButton_rolloverSound=gamebase.sounds['GUI_rollover'])
  795.  
  796. self.gui_li = [0,[],[],[],[]]
  797.  
  798. for i in xrange(4):
  799. _sl = eval('self.sl'+str(i+1))
  800. for b,name in enumerate(self.names[i]):
  801. l = DirectLabel(text = unicode(name.decode('latin-1')),text_scale=(.045,.055),
  802. frameColor = (0,0,0,0), state=DGG.NORMAL)
  803. l.bind(DGG.B1PRESS,self.gui_n_selectFI,[i,b])
  804. _sl.addItem(l)
  805. self.gui_li[i+1].append(l)
  806. if self.data['name'][-1][i] == b:
  807. print i,b,self.data['name'][-1][i]
  808. _sl.selectListItem(l)
  809. self.gui_n_frameClick(i+1,b)
  810.  
  811. self.gui_tnb = DirectButton(pos=Vec3(-1.185, 0, 0.275),scale=.6,geom=g_circle,relief=None,parent=self.frame,clickSound=gamebase.sounds['GUI_click'],
  812. rolloverSound=gamebase.sounds['GUI_rollover'],command=self.gui_n_butt_click,extraArgs=[0])
  813. self.gui_tnb.setColor(.2,1,.2,1)
  814. self.gui_tnt = UnicodeText("Título",self.gui_tnb.getParent(),pos=(-1.085,0,.245),align = TextNode.ALeft, fg=Vec4(0,0,1,1), scale=.06)
  815.  
  816. self.gui_lnb = DirectButton(pos=Vec3(-.178, 0, 0.275),scale=.6,geom=g_circle,relief=None,parent=self.frame,clickSound=gamebase.sounds['GUI_click'],
  817. rolloverSound=gamebase.sounds['GUI_rollover'],command=self.gui_n_butt_click,extraArgs=[2])
  818. self.gui_lnb.setColor(.2,1,.2,1)
  819. self.gui_lnt = UnicodeText("Último",self.gui_lnb.getParent(),pos=(-.078,0,.245),align = TextNode.ALeft, fg=Vec4(0,0,1,1), scale=.06)
  820.  
  821. self.gui_fnb = DirectButton(pos=Vec3(-.787, 0, 0.275),scale=.6,geom=g_circle,relief=None,parent=self.frame,clickSound=gamebase.sounds['GUI_click'],
  822. rolloverSound=gamebase.sounds['GUI_rollover'],command=self.gui_n_butt_click,extraArgs=[1])
  823. self.gui_fnb.setColor(.2,1,.2,1)
  824. self.gui_fnt = UnicodeText("Primeiro",self.gui_fnb.getParent(),pos=(-.687,0,.245),align = TextNode.ALeft, fg=Vec4(0,0,1,1), scale=.06)
  825.  
  826. self.gui_n_updateButt()
  827.  
  828. ######################################
  829.  
  830. self.typeNameBt = DirectButton(parent = self.gui_nPanel,geom=self.getNameGuiItem('quareUp'),relief=None,clickSound=gamebase.sounds['GUI_click'],
  831. rolloverSound=gamebase.sounds['GUI_rollover'],pos=Vec3(0,0,-.529),text="Escreva um nome",
  832. command=self.typeName,scale=.07,geom_scale=1.8/.07).hide() #dont implement this right now
  833.  
  834.  
  835.  
  836. def dismiss(self):
  837. self.np.removeNode()
  838. self.frame.removeNode()
  839. self.textframe.removeNode()
  840. self.CAT_music.stop()
  841.  
  842. def __tth_area__(self): pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement