oldschool-toontown/toontown/coghq/DinerStatusIndicator.py

114 lines
3.8 KiB
Python
Raw Normal View History

from panda3d.core import NodePath, BillboardEffect, Vec3, Point3, TextureStage, TransparencyAttrib, DecalEffect, VBase4
2019-11-02 17:27:54 -05:00
from direct.fsm import FSM
from direct.gui.DirectGui import DirectFrame, DGG
from direct.interval.IntervalGlobal import LerpScaleInterval, LerpColorScaleInterval, Parallel, Sequence, Wait
2019-11-02 20:22:48 -05:00
class DinerStatusIndicator(NodePath, FSM.FSM):
2019-11-02 17:27:54 -05:00
def __init__(self, parent, pos = None, scale = None):
2019-11-02 20:22:48 -05:00
NodePath.__init__(self, 'DinerStatusIndicator')
2019-11-02 17:27:54 -05:00
if parent:
self.reparentTo(parent)
if pos:
self.setPos(pos)
if scale:
self.setScale(scale)
self.loadAssets()
FSM.FSM.__init__(self, 'DinerStatusIndicator')
self.activeIval = None
return
def delete(self):
if self.activeIval:
self.activeIval.pause()
self.activeIval = None
self.angryIcon.removeNode()
self.hungryIcon.removeNode()
self.eatingIcon.removeNode()
self.removeNode()
return
def loadAssets(self):
iconsFile = loader.loadModel('phase_12/models/bossbotHQ/BanquetIcons')
self.angryIcon, self.angryMeter = self.loadIcon(iconsFile, '**/Anger')
self.hungryIcon, self.hungryMeter = self.loadIcon(iconsFile, '**/Hunger')
self.eatingIcon, self.eatingMeter = self.loadIcon(iconsFile, '**/Food')
self.angryMeter.hide()
iconsFile.removeNode()
def loadIcon(self, iconsFile, name):
retVal = iconsFile.find(name)
retVal.setBillboardAxis()
retVal.reparentTo(self)
dark = retVal.copyTo(NodePath())
dark.reparentTo(retVal)
dark.setColor(0.5, 0.5, 0.5, 1)
retVal.setEffect(DecalEffect.make())
retVal.setTransparency(TransparencyAttrib.MAlpha, 1)
ll, ur = dark.getTightBounds()
center = retVal.attachNewNode('center')
center.setPos(0, 0, ll[2])
dark.wrtReparentTo(center)
dark.setTexProjector(TextureStage.getDefault(), center, retVal)
retVal.hide()
return (retVal, center)
def enterEating(self, timeToFinishFood):
self.eatingIcon.show()
self.activeIval = self.createMeterInterval(self.eatingIcon, self.eatingMeter, timeToFinishFood)
self.activeIval.start()
def exitEating(self):
if self.activeIval:
self.activeIval.finish()
self.activeIval = None
self.eatingIcon.hide()
return
def enterHungry(self, timeToFinishFood):
self.hungryIcon.show()
self.activeIval = self.createMeterInterval(self.hungryIcon, self.hungryMeter, timeToFinishFood)
self.activeIval.start()
def exitHungry(self):
if self.activeIval:
self.activeIval.finish()
self.activeIval = None
self.hungryIcon.hide()
return
def enterAngry(self):
self.angryIcon.show()
def exitAngry(self):
self.angryIcon.hide()
if self.activeIval:
self.activeIval.finish()
self.activeIval = None
return
def enterDead(self):
pass
def exitDead(self):
pass
def enterInactive(self):
pass
def exitInactive(self):
pass
def createMeterInterval(self, icon, meter, time):
ivalDarkness = LerpScaleInterval(meter, time, scale=Vec3(1, 1, 1), startScale=Vec3(1, 0.001, 0.001))
flashingTrack = Sequence()
flashDuration = 10
if time > flashDuration:
flashingTrack.append(Wait(time - flashDuration))
for i in range(10):
2019-11-02 17:27:54 -05:00
flashingTrack.append(Parallel(LerpColorScaleInterval(icon, 0.5, VBase4(1, 0, 0, 1)), icon.scaleInterval(0.5, 1.25)))
flashingTrack.append(Parallel(LerpColorScaleInterval(icon, 0.5, VBase4(1, 1, 1, 1)), icon.scaleInterval(0.5, 1)))
retIval = Parallel(ivalDarkness, flashingTrack)
return retIval