parent
b2e13f231c
commit
b81908ad53
|
|
@ -13,6 +13,7 @@ from direct.fsm import ClassicFSM, State
|
||||||
from direct.fsm import State
|
from direct.fsm import State
|
||||||
from toontown.toontowngui import TTDialog
|
from toontown.toontowngui import TTDialog
|
||||||
import re
|
import re
|
||||||
|
import string
|
||||||
from toontown.toonbase import TTLocalizer
|
from toontown.toonbase import TTLocalizer
|
||||||
from . import NameGenerator
|
from . import NameGenerator
|
||||||
import random
|
import random
|
||||||
|
|
@ -536,10 +537,10 @@ class NameShop(StateData.StateData):
|
||||||
|
|
||||||
def match(npcName, name = name):
|
def match(npcName, name = name):
|
||||||
name = TextEncoder().encodeWtext(name)
|
name = TextEncoder().encodeWtext(name)
|
||||||
name = name.strip()
|
name = string.strip(name)
|
||||||
return TextEncoder.upper(npcName) == TextEncoder.upper(name.decode('utf-8'))
|
return TextEncoder.upper(npcName) == TextEncoder.upper(name)
|
||||||
|
|
||||||
for npcId in list(NPCToons.NPCToonDict.keys()):
|
for npcId in NPCToons.NPCToonDict.keys():
|
||||||
npcName = NPCToons.NPCToonDict[npcId][1]
|
npcName = NPCToons.NPCToonDict[npcId][1]
|
||||||
if match(npcName):
|
if match(npcName):
|
||||||
self.notify.info('name matches NPC name "%s"' % npcName)
|
self.notify.info('name matches NPC name "%s"' % npcName)
|
||||||
|
|
@ -773,10 +774,10 @@ class NameShop(StateData.StateData):
|
||||||
self.notify.debug('__typedAName')
|
self.notify.debug('__typedAName')
|
||||||
self.nameEntry['focus'] = 0
|
self.nameEntry['focus'] = 0
|
||||||
name = self.nameEntry.get()
|
name = self.nameEntry.get()
|
||||||
name = TextEncoder().decodeText(name.encode('utf-8'))
|
name = TextEncoder().decodeText(name)
|
||||||
name = name.strip()
|
name = name.strip()
|
||||||
name = TextEncoder().encodeWtext(name)
|
name = TextEncoder().encodeWtext(name)
|
||||||
self.nameEntry.enterText(name.decode('utf-8'))
|
self.nameEntry.enterText(name)
|
||||||
problem = self.nameIsValid(self.nameEntry.get())
|
problem = self.nameIsValid(self.nameEntry.get())
|
||||||
if problem:
|
if problem:
|
||||||
self.rejectName(problem)
|
self.rejectName(problem)
|
||||||
|
|
@ -865,70 +866,41 @@ class NameShop(StateData.StateData):
|
||||||
|
|
||||||
def checkNamePattern(self):
|
def checkNamePattern(self):
|
||||||
self.notify.debug('checkNamePattern')
|
self.notify.debug('checkNamePattern')
|
||||||
if __astron__:
|
datagram = PyDatagram()
|
||||||
base.cr.astronLoginManager.sendSetNamePattern(self.avId,
|
datagram.addUint16(CLIENT_SET_NAME_PATTERN)
|
||||||
self.nameIndices[0], self.nameFlags[0],
|
datagram.addUint32(self.avId)
|
||||||
self.nameIndices[1], self.nameFlags[1],
|
datagram.addInt16(self.nameIndices[0])
|
||||||
self.nameIndices[2], self.nameFlags[2],
|
datagram.addInt16(self.nameFlags[0])
|
||||||
self.nameIndices[3], self.nameFlags[3],
|
datagram.addInt16(self.nameIndices[1])
|
||||||
self.handleSetNamePatternAnswerMsg)
|
datagram.addInt16(self.nameFlags[1])
|
||||||
else:
|
datagram.addInt16(self.nameIndices[2])
|
||||||
datagram = PyDatagram()
|
datagram.addInt16(self.nameFlags[2])
|
||||||
datagram.addUint16(CLIENT_SET_NAME_PATTERN)
|
datagram.addInt16(self.nameIndices[3])
|
||||||
datagram.addUint32(self.avId)
|
datagram.addInt16(self.nameFlags[3])
|
||||||
datagram.addInt16(self.nameIndices[0])
|
messenger.send('nameShopPost', [datagram])
|
||||||
datagram.addInt16(self.nameFlags[0])
|
|
||||||
datagram.addInt16(self.nameIndices[1])
|
|
||||||
datagram.addInt16(self.nameFlags[1])
|
|
||||||
datagram.addInt16(self.nameIndices[2])
|
|
||||||
datagram.addInt16(self.nameFlags[2])
|
|
||||||
datagram.addInt16(self.nameIndices[3])
|
|
||||||
datagram.addInt16(self.nameFlags[3])
|
|
||||||
messenger.send('nameShopPost', [datagram])
|
|
||||||
self.waitForServer()
|
self.waitForServer()
|
||||||
|
|
||||||
if not __astron__:
|
def handleSetNamePatternAnswerMsg(self, di):
|
||||||
def handleSetNamePatternAnswerMsg(self, di):
|
self.notify.debug('handleSetNamePatternAnswerMsg')
|
||||||
self.notify.debug('handleSetNamePatternAnswerMsg')
|
self.cleanupWaitForServer()
|
||||||
self.cleanupWaitForServer()
|
newavId = di.getUint32()
|
||||||
newavId = di.getUint32()
|
if newavId != self.avId:
|
||||||
if newavId != self.avId:
|
self.notify.debug("doid's don't match up!")
|
||||||
self.notify.debug("doid's don't match up!")
|
self.rejectName(TTLocalizer.NameError)
|
||||||
self.rejectName(TTLocalizer.NameError)
|
returnCode = di.getUint8()
|
||||||
returnCode = di.getUint8()
|
if returnCode == 0:
|
||||||
if returnCode == 0:
|
style = self.toon.getStyle()
|
||||||
style = self.toon.getStyle()
|
avDNA = style.makeNetString()
|
||||||
avDNA = style.makeNetString()
|
self.notify.debug('pattern name accepted')
|
||||||
self.notify.debug('pattern name accepted')
|
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 0)
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 0)
|
self.avList.append(newPotAv)
|
||||||
self.avList.append(newPotAv)
|
self.doneStatus = 'done'
|
||||||
self.doneStatus = 'done'
|
self.storeSkipTutorialRequest()
|
||||||
self.storeSkipTutorialRequest()
|
messenger.send(self.doneEvent)
|
||||||
messenger.send(self.doneEvent)
|
else:
|
||||||
else:
|
self.notify.debug('name pattern rejected')
|
||||||
self.notify.debug('name pattern rejected')
|
self.rejectName(TTLocalizer.NameError)
|
||||||
self.rejectName(TTLocalizer.NameError)
|
return None
|
||||||
return None
|
|
||||||
else:
|
|
||||||
def handleSetNamePatternAnswerMsg(self, newavId, returnCode):
|
|
||||||
self.notify.debug('handleSetNamePatternAnswerMsg')
|
|
||||||
self.cleanupWaitForServer()
|
|
||||||
if newavId != self.avId:
|
|
||||||
self.notify.debug("doid's don't match up!")
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
if returnCode == 1:
|
|
||||||
style = self.toon.getStyle()
|
|
||||||
avDNA = style.makeNetString()
|
|
||||||
self.notify.debug('pattern name accepted')
|
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 0)
|
|
||||||
self.avList.append(newPotAv)
|
|
||||||
self.doneStatus = 'done'
|
|
||||||
self.storeSkipTutorialRequest()
|
|
||||||
messenger.send(self.doneEvent)
|
|
||||||
else:
|
|
||||||
self.notify.debug('name pattern rejected')
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
return None
|
|
||||||
|
|
||||||
def _submitTypeANameAsPickAName(self):
|
def _submitTypeANameAsPickAName(self):
|
||||||
pnp = TTPickANamePattern(self.nameEntry.get(), self.toon.style.gender)
|
pnp = TTPickANamePattern(self.nameEntry.get(), self.toon.style.gender)
|
||||||
|
|
@ -937,7 +909,7 @@ class NameShop(StateData.StateData):
|
||||||
self.fsm.request('PickAName')
|
self.fsm.request('PickAName')
|
||||||
flags = [pattern[0] != -1, pattern[1] != -1, pattern[2] != -1]
|
flags = [pattern[0] != -1, pattern[1] != -1, pattern[2] != -1]
|
||||||
names = []
|
names = []
|
||||||
for i in range(len(pattern)):
|
for i in xrange(len(pattern)):
|
||||||
if pattern[i] != -1:
|
if pattern[i] != -1:
|
||||||
names.append(pnp.getNamePartString(self.toon.style.gender, i, pattern[i]))
|
names.append(pnp.getNamePartString(self.toon.style.gender, i, pattern[i]))
|
||||||
else:
|
else:
|
||||||
|
|
@ -953,124 +925,74 @@ class NameShop(StateData.StateData):
|
||||||
self.notify.debug('checkNameTyped')
|
self.notify.debug('checkNameTyped')
|
||||||
if self._submitTypeANameAsPickAName():
|
if self._submitTypeANameAsPickAName():
|
||||||
return
|
return
|
||||||
if not __astron__:
|
datagram = PyDatagram()
|
||||||
datagram = PyDatagram()
|
datagram.addUint16(CLIENT_SET_WISHNAME)
|
||||||
datagram.addUint16(CLIENT_SET_WISHNAME)
|
|
||||||
if justCheck:
|
if justCheck:
|
||||||
avId = 0
|
avId = 0
|
||||||
else:
|
else:
|
||||||
avId = self.avId
|
avId = self.avId
|
||||||
if not __astron__:
|
datagram.addUint32(avId)
|
||||||
datagram.addUint32(avId)
|
datagram.addString(self.nameEntry.get())
|
||||||
datagram.addString(self.nameEntry.get())
|
messenger.send('nameShopPost', [datagram])
|
||||||
messenger.send('nameShopPost', [datagram])
|
|
||||||
else:
|
|
||||||
base.cr.astronLoginManager.sendSetNameTyped(avId, self.nameEntry.get(), self.handleSetNameTypedAnswerMsg)
|
|
||||||
self.waitForServer()
|
self.waitForServer()
|
||||||
|
|
||||||
if not __astron__:
|
def handleSetNameTypedAnswerMsg(self, di):
|
||||||
def handleSetNameTypedAnswerMsg(self, di):
|
self.notify.debug('handleSetNameTypedAnswerMsg')
|
||||||
self.notify.debug('handleSetNameTypedAnswerMsg')
|
self.cleanupWaitForServer()
|
||||||
self.cleanupWaitForServer()
|
newavId = di.getUint32()
|
||||||
newavId = di.getUint32()
|
if newavId and newavId != self.avId:
|
||||||
if newavId and newavId != self.avId:
|
self.notify.debug("doid's don't match up!")
|
||||||
self.notify.debug("doid's don't match up!")
|
self.rejectName(TTLocalizer.NameError)
|
||||||
self.rejectName(TTLocalizer.NameError)
|
returnCode = di.getUint16()
|
||||||
returnCode = di.getUint16()
|
if newavId == 0:
|
||||||
if newavId == 0:
|
if returnCode == 0:
|
||||||
if returnCode == 0:
|
pendingname = di.getString()
|
||||||
pendingname = di.getString()
|
|
||||||
approvedname = di.getString()
|
|
||||||
rejectedname = di.getString()
|
|
||||||
if pendingname != '':
|
|
||||||
self.notify.debug('name check pending')
|
|
||||||
self.fsm.request('Approval')
|
|
||||||
elif approvedname != '':
|
|
||||||
self.notify.debug('name check accepted')
|
|
||||||
self.nameAction = 2
|
|
||||||
self.serverCreateAvatar()
|
|
||||||
elif rejectedname != '':
|
|
||||||
self.notify.debug('name check rejected')
|
|
||||||
self.fsm.request('TypeAName')
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
else:
|
|
||||||
self.notify.debug('typed name response did not contain any return fields')
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
elif returnCode == 0:
|
|
||||||
wishname = di.getString()
|
|
||||||
approvedname = di.getString()
|
approvedname = di.getString()
|
||||||
rejectedname = di.getString()
|
rejectedname = di.getString()
|
||||||
if approvedname != '':
|
if pendingname != '':
|
||||||
style = self.toon.getStyle()
|
|
||||||
avDNA = style.makeNetString()
|
|
||||||
self.names[0] = self.nameEntry.get()
|
|
||||||
self.notify.debug('typed name accepted')
|
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 0)
|
|
||||||
self.avList.append(newPotAv)
|
|
||||||
self.fsm.request('Accepted')
|
|
||||||
elif wishname != '':
|
|
||||||
style = self.toon.getStyle()
|
|
||||||
avDNA = style.makeNetString()
|
|
||||||
self.names[1] = self.nameEntry.get()
|
|
||||||
self.notify.debug('typed name needs approval')
|
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 1)
|
|
||||||
if not self.newwarp:
|
|
||||||
self.avList.append(newPotAv)
|
|
||||||
self.fsm.request('ApprovalAccepted')
|
|
||||||
elif rejectedname != '':
|
|
||||||
self.fsm.request('Rejected')
|
|
||||||
else:
|
|
||||||
self.notify.debug("name typed accepted but didn't fill any return fields")
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
else:
|
|
||||||
self.notify.debug('name typed rejected')
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
def handleSetNameTypedAnswerMsg(self, newavId, returnCode):
|
|
||||||
self.notify.debug('handleSetNameTypedAnswerMsg')
|
|
||||||
self.cleanupWaitForServer()
|
|
||||||
if newavId and newavId != self.avId:
|
|
||||||
self.notify.debug("doid's don't match up!")
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
if newavId == 0:
|
|
||||||
if returnCode == 1:
|
|
||||||
self.notify.debug('name check pending')
|
self.notify.debug('name check pending')
|
||||||
self.fsm.request('Approval')
|
self.fsm.request('Approval')
|
||||||
elif returnCode == 2:
|
elif approvedname != '':
|
||||||
self.notify.debug('name check accepted')
|
self.notify.debug('name check accepted')
|
||||||
self.nameAction = 2
|
self.nameAction = 2
|
||||||
self.serverCreateAvatar()
|
self.serverCreateAvatar()
|
||||||
elif returnCode == 0:
|
elif rejectedname != '':
|
||||||
self.notify.debug('name check rejected')
|
self.notify.debug('name check rejected')
|
||||||
self.fsm.request('TypeAName')
|
self.fsm.request('TypeAName')
|
||||||
self.rejectName(TTLocalizer.NameError)
|
self.rejectName(TTLocalizer.NameError)
|
||||||
else:
|
else:
|
||||||
self.notify.debug('typed name response did not contain any return fields')
|
self.notify.debug('typed name response did not contain any return fields')
|
||||||
self.rejectName(TTLocalizer.NameError)
|
self.rejectName(TTLocalizer.NameError)
|
||||||
else:
|
elif returnCode == 0:
|
||||||
if returnCode == 2:
|
wishname = di.getString()
|
||||||
style = self.toon.getStyle()
|
approvedname = di.getString()
|
||||||
avDNA = style.makeNetString()
|
rejectedname = di.getString()
|
||||||
self.names[0] = self.nameEntry.get()
|
if approvedname != '':
|
||||||
self.notify.debug('typed name accepted')
|
style = self.toon.getStyle()
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 0)
|
avDNA = style.makeNetString()
|
||||||
|
self.names[0] = self.nameEntry.get()
|
||||||
|
self.notify.debug('typed name accepted')
|
||||||
|
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 0)
|
||||||
|
self.avList.append(newPotAv)
|
||||||
|
self.fsm.request('Accepted')
|
||||||
|
elif wishname != '':
|
||||||
|
style = self.toon.getStyle()
|
||||||
|
avDNA = style.makeNetString()
|
||||||
|
self.names[1] = self.nameEntry.get()
|
||||||
|
self.notify.debug('typed name needs approval')
|
||||||
|
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 1)
|
||||||
|
if not self.newwarp:
|
||||||
self.avList.append(newPotAv)
|
self.avList.append(newPotAv)
|
||||||
self.fsm.request('Accepted')
|
self.fsm.request('ApprovalAccepted')
|
||||||
elif returnCode == 1:
|
elif rejectedname != '':
|
||||||
style = self.toon.getStyle()
|
self.fsm.request('Rejected')
|
||||||
avDNA = style.makeNetString()
|
else:
|
||||||
self.names[1] = self.nameEntry.get()
|
self.notify.debug("name typed accepted but didn't fill any return fields")
|
||||||
self.notify.debug('typed name needs approval')
|
self.rejectName(TTLocalizer.NameError)
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(newavId, self.names, avDNA, self.index, 1)
|
else:
|
||||||
if not self.newwarp:
|
self.notify.debug('name typed rejected')
|
||||||
self.avList.append(newPotAv)
|
self.rejectName(TTLocalizer.NameError)
|
||||||
self.fsm.request('ApprovalAccepted')
|
return None
|
||||||
elif returnCode == 0:
|
|
||||||
self.fsm.request('Rejected')
|
|
||||||
else:
|
|
||||||
self.notify.debug("name typed accepted but didn't fill any return fields")
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
|
|
||||||
def serverCreateAvatar(self, skipTutorial = False):
|
def serverCreateAvatar(self, skipTutorial = False):
|
||||||
self.notify.debug('serverCreateAvatar')
|
self.notify.debug('serverCreateAvatar')
|
||||||
|
|
@ -1082,46 +1004,18 @@ class NameShop(StateData.StateData):
|
||||||
self.requestingSkipTutorial = False
|
self.requestingSkipTutorial = False
|
||||||
if not self.avExists or self.avExists and self.avId == 'deleteMe':
|
if not self.avExists or self.avExists and self.avId == 'deleteMe':
|
||||||
messenger.send('nameShopCreateAvatar', [style, '', self.index])
|
messenger.send('nameShopCreateAvatar', [style, '', self.index])
|
||||||
if __astron__:
|
|
||||||
self.accept('nameShopCreateAvatarDone', self.handleCreateAvatarResponseMsg)
|
|
||||||
else:
|
else:
|
||||||
self.checkNameTyped()
|
self.checkNameTyped()
|
||||||
self.notify.debug('Ending Make A Toon: %s' % self.toon.style)
|
self.notify.debug('Ending Make A Toon: %s' % self.toon.style)
|
||||||
base.cr.centralLogger.writeClientEvent('MAT - endingMakeAToon: %s' % self.toon.style)
|
base.cr.centralLogger.writeClientEvent('MAT - endingMakeAToon: %s' % self.toon.style)
|
||||||
|
|
||||||
if not __astron__:
|
def handleCreateAvatarResponseMsg(self, di):
|
||||||
def handleCreateAvatarResponseMsg(self, di):
|
self.notify.debug('handleCreateAvatarResponseMsg')
|
||||||
self.notify.debug('handleCreateAvatarResponseMsg')
|
echoContext = di.getUint16()
|
||||||
echoContext = di.getUint16()
|
returnCode = di.getUint8()
|
||||||
returnCode = di.getUint8()
|
if returnCode == 0:
|
||||||
if returnCode == 0:
|
|
||||||
self.notify.debug('avatar with default name accepted')
|
|
||||||
self.avId = di.getUint32()
|
|
||||||
self.avExists = 1
|
|
||||||
self.logAvatarCreation()
|
|
||||||
if self.nameAction == 0:
|
|
||||||
self.toon.setName(self.names[0])
|
|
||||||
newPotAv = PotentialAvatar.PotentialAvatar(self.avId, self.names, self.newDNA, self.index, 1)
|
|
||||||
self.avList.append(newPotAv)
|
|
||||||
self.doneStatus = 'done'
|
|
||||||
self.storeSkipTutorialRequest()
|
|
||||||
messenger.send(self.doneEvent)
|
|
||||||
elif self.nameAction == 1:
|
|
||||||
self.checkNamePattern()
|
|
||||||
elif self.nameAction == 2:
|
|
||||||
self.checkNameTyped()
|
|
||||||
else:
|
|
||||||
self.notify.debug('avatar invalid nameAction')
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
else:
|
|
||||||
self.notify.debug('avatar rejected')
|
|
||||||
self.rejectName(TTLocalizer.NameError)
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
def handleCreateAvatarResponseMsg(self, avId):
|
|
||||||
self.notify.debug('handleCreateAvatarResponseMsg')
|
|
||||||
self.notify.debug('avatar with default name accepted')
|
self.notify.debug('avatar with default name accepted')
|
||||||
self.avId = avId
|
self.avId = di.getUint32()
|
||||||
self.avExists = 1
|
self.avExists = 1
|
||||||
self.logAvatarCreation()
|
self.logAvatarCreation()
|
||||||
if self.nameAction == 0:
|
if self.nameAction == 0:
|
||||||
|
|
@ -1138,6 +1032,10 @@ class NameShop(StateData.StateData):
|
||||||
else:
|
else:
|
||||||
self.notify.debug('avatar invalid nameAction')
|
self.notify.debug('avatar invalid nameAction')
|
||||||
self.rejectName(TTLocalizer.NameError)
|
self.rejectName(TTLocalizer.NameError)
|
||||||
|
else:
|
||||||
|
self.notify.debug('avatar rejected')
|
||||||
|
self.rejectName(TTLocalizer.NameError)
|
||||||
|
return None
|
||||||
|
|
||||||
def waitForServer(self):
|
def waitForServer(self):
|
||||||
self.waitForServerDialog = TTDialog.TTDialog(text=TTLocalizer.WaitingForNameSubmission, style=TTDialog.NoButtons)
|
self.waitForServerDialog = TTDialog.TTDialog(text=TTLocalizer.WaitingForNameSubmission, style=TTDialog.NoButtons)
|
||||||
|
|
@ -1170,7 +1068,7 @@ class NameShop(StateData.StateData):
|
||||||
self.promptTutorial()
|
self.promptTutorial()
|
||||||
|
|
||||||
def promptTutorial(self):
|
def promptTutorial(self):
|
||||||
self.promptTutorialDialog = TTDialog.TTDialog(parent=aspect2dp, text=TTLocalizer.PromptTutorial, text_scale=0.06, text_align=TextNode.ACenter, text_wordwrap=22, command=self.__openTutorialDialog, fadeScreen=0.5, style=TTDialog.TwoChoice, buttonTextList=[TTLocalizer.MakeAToonEnterTutorial, TTLocalizer.MakeAToonSkipTutorial], button_text_scale=0.06, buttonPadSF=5.5, sortOrder=DGG.NO_FADE_SORT_INDEX)
|
self.promptTutorialDialog = TTDialog.TTDialog(parent=aspect2dp, text=TTLocalizer.PromptTutorial, text_scale=0.06, text_align=TextNode.ACenter, text_wordwrap=22, command=self.__openTutorialDialog, fadeScreen=0.5, style=TTDialog.TwoChoice, buttonTextList=[TTLocalizer.MakeAToonEnterTutorial, TTLocalizer.MakeAToonSkipTutorial], button_text_scale=0.06, buttonPadSF=5.5, sortOrder=NO_FADE_SORT_INDEX)
|
||||||
self.promptTutorialDialog.show()
|
self.promptTutorialDialog.show()
|
||||||
|
|
||||||
def __openTutorialDialog(self, choice = 0):
|
def __openTutorialDialog(self, choice = 0):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue