2019-12-30 00:07:56 -06:00
|
|
|
from . import DistributedNPCToonBaseAI
|
2019-11-02 17:27:54 -05:00
|
|
|
from toontown.toonbase import TTLocalizer, ToontownGlobals
|
|
|
|
from direct.fsm import ClassicFSM, State
|
|
|
|
from direct.task.Task import Task
|
|
|
|
|
|
|
|
class DistributedNPCScientistAI(DistributedNPCToonBaseAI.DistributedNPCToonBaseAI):
|
|
|
|
|
|
|
|
def __init__(self, air, npcId, questCallback = None, hq = 0):
|
|
|
|
DistributedNPCToonBaseAI.DistributedNPCToonBaseAI.__init__(self, air, npcId, questCallback)
|
|
|
|
self.scientistFSM = ClassicFSM.ClassicFSM('Scientist', [
|
|
|
|
State.State('Neutral',
|
|
|
|
self.enterNeutral,
|
|
|
|
self.exitNeutral, [
|
|
|
|
'Phase0',
|
|
|
|
'Phase1',
|
|
|
|
'Phase2',
|
|
|
|
'Phase2_5',
|
|
|
|
'Phase3',
|
|
|
|
'Phase4',
|
|
|
|
'Phase5',
|
|
|
|
'Off']),
|
|
|
|
State.State('Phase0',
|
|
|
|
self.enterPhase0,
|
|
|
|
self.exitPhase0, [
|
|
|
|
'Phase1',
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Phase1',
|
|
|
|
self.enterPhase1,
|
|
|
|
self.exitPhase1, [
|
|
|
|
'Phase2',
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Phase2',
|
|
|
|
self.enterPhase2,
|
|
|
|
self.exitPhase2, [
|
|
|
|
'Phase2_5',
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Phase2_5',
|
|
|
|
self.enterPhase2_5,
|
|
|
|
self.exitPhase2_5, [
|
|
|
|
'Phase3',
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Phase3',
|
|
|
|
self.enterPhase3,
|
|
|
|
self.exitPhase3, [
|
|
|
|
'Phase4',
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Phase4',
|
|
|
|
self.enterPhase4,
|
|
|
|
self.exitPhase4, [
|
|
|
|
'Phase5',
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Phase5',
|
|
|
|
self.enterPhase5,
|
|
|
|
self.exitPhase5, [
|
|
|
|
'Neutral']),
|
|
|
|
State.State('Off',
|
|
|
|
self.enterOff,
|
|
|
|
self.exitOff, [])],
|
|
|
|
'Neutral', 'Off')
|
|
|
|
|
|
|
|
if self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.startAnimState = 'ScientistJealous'
|
|
|
|
elif self.npcId == 2020:
|
|
|
|
self.startAnimState = 'ScientistEmcee'
|
|
|
|
self.scientistFSM.enterInitialState()
|
|
|
|
|
|
|
|
def selectPhase(self, newPhase):
|
|
|
|
try:
|
|
|
|
if newPhase <= 4:
|
|
|
|
gotoPhase = '0'
|
|
|
|
elif newPhase <= 6:
|
|
|
|
gotoPhase = '1'
|
|
|
|
elif newPhase <= 11:
|
|
|
|
gotoPhase = '2'
|
|
|
|
elif newPhase <= 12:
|
|
|
|
gotoPhase = '2_5'
|
|
|
|
elif newPhase <= 13:
|
|
|
|
gotoPhase = '3'
|
|
|
|
elif newPhase <= 14:
|
|
|
|
gotoPhase = '4'
|
|
|
|
elif newPhase <= 15:
|
|
|
|
gotoPhase = '5'
|
|
|
|
else:
|
|
|
|
if not self.scientistFSM.getCurrentState() == self.scientistFSM.getStateNamed('Neutral'):
|
|
|
|
self.scientistFSM.request('Neutral')
|
|
|
|
return
|
|
|
|
gotoPhase = 'Phase' + gotoPhase
|
|
|
|
if not self.scientistFSM.getCurrentState() == self.scientistFSM.getStateNamed(gotoPhase):
|
|
|
|
self.scientistFSM.request(gotoPhase)
|
|
|
|
except:
|
|
|
|
self.notify.warning('Illegal phase transition requested')
|
|
|
|
|
|
|
|
def startIfNeeded(self):
|
|
|
|
if hasattr(simbase.air, 'holidayManager') and simbase.air.holidayManager:
|
|
|
|
self.curPhase = self.getPhaseToRun()
|
|
|
|
if self.curPhase != -1:
|
|
|
|
self.selectPhase(self.curPhase)
|
|
|
|
|
|
|
|
def getPhaseToRun(self):
|
|
|
|
result = -1
|
|
|
|
enoughInfoToRun = False
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_HOLIDAY) or simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
if hasattr(simbase.air, 'SillyMeterMgr'):
|
|
|
|
enoughInfoToRun = True
|
|
|
|
else:
|
|
|
|
self.notify.debug('simbase.air does not have SillyMeterMgr')
|
|
|
|
else:
|
|
|
|
self.notify.debug('holiday is not running')
|
|
|
|
self.notify.debug('enoughInfoToRun = %s' % enoughInfoToRun)
|
|
|
|
if enoughInfoToRun and simbase.air.SillyMeterMgr.getIsRunning():
|
|
|
|
result = simbase.air.SillyMeterMgr.getCurPhase()
|
|
|
|
return result
|
|
|
|
|
|
|
|
def enterNeutral(self):
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
self.startIfNeeded()
|
|
|
|
|
|
|
|
def exitNeutral(self):
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase0(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhasePreTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistJealous', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase0(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhasePreTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase1(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhasePreTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistJealous', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase1(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhasePreTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase2(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhasePreTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistWork', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase2(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhasePreTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase2_5(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic, endPause=30)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhaseTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistLessWork', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase2_5(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhaseTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase3(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic, endPause=30)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhasePostTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistPlay', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase3(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhasePostTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase4(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic, endPause=30)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhasePostTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistPlay', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase4(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhasePostTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterPhase5(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic, endPause=30)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.requestDialogue(self, TTLocalizer.AprilToonsPhasePostTopTopic, endPause=30)
|
|
|
|
elif self.npcId == 2018 or self.npcId == 2019:
|
|
|
|
self.d_setAnimState('ScientistPlay', 1.0)
|
|
|
|
self.accept('SillyMeterPhase', self.selectPhase)
|
|
|
|
|
|
|
|
def exitPhase5(self):
|
|
|
|
if self.npcId == 2020:
|
|
|
|
if simbase.air.holidayManager.isHolidayRunning(ToontownGlobals.SILLYMETER_EXT_HOLIDAY):
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsExtPhaseTopTopic)
|
|
|
|
else:
|
|
|
|
self.air.dialogueManager.leaveDialogue(self, TTLocalizer.AprilToonsPhasePostTopTopic)
|
|
|
|
self.ignore('SillyMeterPhase')
|
|
|
|
|
|
|
|
def enterOff(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def exitOff(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def delete(self):
|
|
|
|
self.scientistFSM.requestFinalState()
|
|
|
|
if hasattr(self, 'scientistFSM'):
|
|
|
|
del self.scientistFSM
|
|
|
|
DistributedNPCToonBaseAI.DistributedNPCToonBaseAI.delete(self)
|