2019-11-02 17:27:54 -05:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
|
|
|
|
ltime = 1 and time.localtime()
|
|
|
|
logSuffix = '%02d%02d%02d_%02d%02d%02d' % (ltime[0] - 2000, ltime[1], ltime[2],
|
|
|
|
ltime[3], ltime[4], ltime[5])
|
|
|
|
|
|
|
|
logfile = 'toontownD-' + logSuffix + '.log'
|
|
|
|
|
|
|
|
class LogAndOutput:
|
|
|
|
def __init__(self, orig, log):
|
|
|
|
self.orig = orig
|
|
|
|
self.log = log
|
|
|
|
|
|
|
|
def write(self, str):
|
|
|
|
self.log.write(str)
|
|
|
|
self.log.flush()
|
|
|
|
self.orig.write(str)
|
|
|
|
self.orig.flush()
|
|
|
|
|
|
|
|
def flush(self):
|
|
|
|
self.log.flush()
|
|
|
|
self.orig.flush()
|
|
|
|
|
|
|
|
log = open(logfile, 'a')
|
|
|
|
logOut = LogAndOutput(sys.__stdout__, log)
|
|
|
|
logErr = LogAndOutput(sys.__stderr__, log)
|
|
|
|
sys.stdout = logOut
|
|
|
|
sys.stderr = logErr
|
|
|
|
|
|
|
|
print('\n\nStarting Toontown...')
|
|
|
|
|
|
|
|
if 1:
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Current time: ' + time.asctime(time.localtime(time.time())) + ' ' + time.tzname[0])
|
|
|
|
print('sys.path = ', sys.path)
|
|
|
|
print('sys.argv = ', sys.argv)
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
from otp.launcher.LauncherBase import LauncherBase
|
|
|
|
from otp.otpbase import OTPLauncherGlobals
|
2019-11-02 18:49:34 -05:00
|
|
|
from panda3d.core import *
|
2019-11-02 17:27:54 -05:00
|
|
|
from toontown.toonbase import TTLocalizer
|
|
|
|
|
|
|
|
class ToontownLauncher(LauncherBase):
|
|
|
|
GameName = 'Toontown'
|
|
|
|
LauncherPhases = [3, 3.5, 4, 5, 5.5, 6, 7, 8, 9, 10, 11, 12, 13]
|
|
|
|
TmpOverallMap = [0.25, 0.15, 0.12, 0.17, 0.08, 0.07, 0.05, 0.05, 0.017,
|
|
|
|
0.011, 0.01, 0.012, 0.01]
|
|
|
|
RegistryKey = 'Software\\Disney\\Disney Online\\Toontown'
|
|
|
|
ForegroundSleepTime = 0.01
|
|
|
|
Localizer = TTLocalizer
|
|
|
|
VerifyFiles = 1
|
|
|
|
DecompressMultifiles = True
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
if sys.argv[2] == 'Phase2.py':
|
|
|
|
sys.argv = sys.argv[:1] + sys.argv[3:]
|
|
|
|
if len(sys.argv) == 5 or len(sys.argv) == 6:
|
|
|
|
self.gameServer = sys.argv[2]
|
|
|
|
self.accountServer = sys.argv[3]
|
|
|
|
self.testServerFlag = int(sys.argv[4])
|
|
|
|
else:
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Error: Launcher: incorrect number of parameters')
|
2019-11-02 17:27:54 -05:00
|
|
|
sys.exit()
|
|
|
|
|
|
|
|
self.toontownBlueKey = 'TOONTOWN_BLUE'
|
|
|
|
self.toontownPlayTokenKey = 'TOONTOWN_PLAYTOKEN'
|
|
|
|
self.launcherMessageKey = 'LAUNCHER_MESSAGE'
|
|
|
|
self.game1DoneKey = 'GAME1_DONE'
|
|
|
|
self.game2DoneKey = 'GAME2_DONE'
|
|
|
|
self.tutorialCompleteKey = 'TUTORIAL_DONE'
|
|
|
|
self.toontownRegistryKey = 'Software\\Disney\\Disney Online\\Toontown'
|
|
|
|
if self.testServerFlag:
|
|
|
|
self.toontownRegistryKey = '%s%s' % (self.toontownRegistryKey, 'Test')
|
|
|
|
self.toontownRegistryKey = '%s%s' % (self.toontownRegistryKey, self.getProductName())
|
|
|
|
LauncherBase.__init__(self)
|
|
|
|
self.webAcctParams = 'WEB_ACCT_PARAMS'
|
|
|
|
self.parseWebAcctParams()
|
|
|
|
self.mainLoop()
|
|
|
|
|
|
|
|
def getValue(self, key, default=None):
|
|
|
|
try:
|
|
|
|
return self.getRegistry(key, default)
|
|
|
|
except:
|
|
|
|
return self.getRegistry(key)
|
|
|
|
|
|
|
|
def setValue(self, key, value):
|
|
|
|
self.setRegistry(key, value)
|
|
|
|
|
|
|
|
def getVerifyFiles(self):
|
|
|
|
return 1
|
|
|
|
|
|
|
|
def getTestServerFlag(self):
|
|
|
|
return self.testServerFlag
|
|
|
|
|
|
|
|
def getGameServer(self):
|
|
|
|
return self.gameServer
|
|
|
|
|
|
|
|
def getLogFileName(self):
|
|
|
|
return 'toontown'
|
|
|
|
|
|
|
|
def parseWebAcctParams(self):
|
|
|
|
s = config.GetString('fake-web-acct-params', '')
|
|
|
|
if not s:
|
|
|
|
s = self.getRegistry(self.webAcctParams)
|
|
|
|
self.setRegistry(self.webAcctParams, '')
|
|
|
|
l = s.split('&')
|
|
|
|
length = len(l)
|
|
|
|
dict = {}
|
|
|
|
for index in range(0, len(l)):
|
|
|
|
args = l[index].split('=')
|
|
|
|
if len(args) == 3:
|
|
|
|
[name, value] = args[-2:]
|
|
|
|
dict[name] = int(value)
|
|
|
|
elif len(args) == 2:
|
|
|
|
[name, value] = args
|
|
|
|
dict[name] = int(value)
|
|
|
|
|
|
|
|
self.secretNeedsParentPasswordKey = 1
|
2019-12-30 00:07:56 -06:00
|
|
|
if 'secretsNeedsParentPassword' in dict:
|
2019-11-02 17:27:54 -05:00
|
|
|
self.secretNeedsParentPasswordKey = dict['secretsNeedsParentPassword']
|
|
|
|
else:
|
|
|
|
self.notify.warning('no secretNeedsParentPassword token in webAcctParams')
|
|
|
|
self.notify.info('secretNeedsParentPassword = %d' % self.secretNeedsParentPasswordKey)
|
|
|
|
|
|
|
|
self.chatEligibleKey = 0
|
2019-12-30 00:07:56 -06:00
|
|
|
if 'chatEligible' in dict:
|
2019-11-02 17:27:54 -05:00
|
|
|
self.chatEligibleKey = dict['chatEligible']
|
|
|
|
else:
|
|
|
|
self.notify.warning('no chatEligible token in webAcctParams')
|
|
|
|
self.notify.info('chatEligibleKey = %d' % self.chatEligibleKey)
|
|
|
|
|
|
|
|
def getBlue(self):
|
|
|
|
blue = self.getValue(self.toontownBlueKey)
|
|
|
|
self.setValue(self.toontownBlueKey, '')
|
|
|
|
if blue == 'NO BLUE':
|
|
|
|
blue = None
|
|
|
|
return blue
|
|
|
|
|
|
|
|
def getPlayToken(self):
|
|
|
|
playToken = self.getValue(self.toontownPlayTokenKey)
|
|
|
|
self.setValue(self.toontownPlayTokenKey, '')
|
|
|
|
if playToken == 'NO PLAYTOKEN':
|
|
|
|
playToken = None
|
|
|
|
return playToken
|
|
|
|
|
|
|
|
def setRegistry(self, name, value):
|
|
|
|
if not self.WIN32:
|
|
|
|
return
|
|
|
|
|
|
|
|
t = type(value)
|
2019-12-30 00:07:56 -06:00
|
|
|
if t == int:
|
2019-11-02 17:27:54 -05:00
|
|
|
WindowsRegistry.setIntValue(self.toontownRegistryKey, name, value)
|
2020-01-08 20:22:39 -06:00
|
|
|
elif t == str:
|
2019-11-02 17:27:54 -05:00
|
|
|
WindowsRegistry.setStringValue(self.toontownRegistryKey, name, value)
|
|
|
|
else:
|
2019-12-30 00:07:56 -06:00
|
|
|
self.notify.warning('setRegistry: Invalid type for registry value: ' + repr(value))
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
def getRegistry(self, name, missingValue=None):
|
|
|
|
self.notify.info('getRegistry%s' % ((name, missingValue),))
|
|
|
|
if not self.WIN32:
|
|
|
|
if missingValue == None:
|
|
|
|
missingValue = ''
|
|
|
|
value = os.environ.get(name, missingValue)
|
|
|
|
try:
|
|
|
|
value = int(value)
|
|
|
|
except: pass
|
|
|
|
return value
|
|
|
|
|
|
|
|
t = WindowsRegistry.getKeyType(self.toontownRegistryKey, name)
|
|
|
|
if t == WindowsRegistry.TInt:
|
|
|
|
if missingValue == None:
|
|
|
|
missingValue = 0
|
|
|
|
return WindowsRegistry.getIntValue(self.toontownRegistryKey,
|
|
|
|
name, missingValue)
|
|
|
|
elif t == WindowsRegistry.TString:
|
|
|
|
if missingValue == None:
|
|
|
|
missingValue = ''
|
|
|
|
return WindowsRegistry.getStringValue(self.toontownRegistryKey,
|
|
|
|
name, missingValue)
|
|
|
|
else:
|
|
|
|
return missingValue
|
|
|
|
|
|
|
|
def getCDDownloadPath(self, origPath, serverFilePath):
|
|
|
|
return '%s/%s%s/CD_%d/%s' % (origPath, self.ServerVersion, self.ServerVersionSuffix, self.fromCD, serverFilePath)
|
|
|
|
|
|
|
|
def getDownloadPath(self, origPath, serverFilePath):
|
|
|
|
return '%s/%s%s/%s' % (origPath, self.ServerVersion, self.ServerVersionSuffix, serverFilePath)
|
|
|
|
|
|
|
|
def getPercentPatchComplete(self, bytesWritten):
|
|
|
|
if self.totalPatchDownload:
|
|
|
|
return LauncherBase.getPercentPatchComplete(self, bytesWritten)
|
|
|
|
else:
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def hashIsValid(self, serverHash, hashStr):
|
|
|
|
return serverHash.setFromDec(hashStr) or serverHash.setFromHex(hashStr)
|
|
|
|
|
|
|
|
def launcherMessage(self, msg):
|
|
|
|
LauncherBase.launcherMessage(self, msg)
|
|
|
|
self.setRegistry(self.launcherMessageKey, msg)
|
|
|
|
|
|
|
|
def getAccountServer(self):
|
|
|
|
return self.accountServer
|
|
|
|
|
|
|
|
def setTutorialComplete(self):
|
|
|
|
self.setRegistry(self.tutorialCompleteKey, 0)
|
|
|
|
|
|
|
|
def getTutorialComplete(self):
|
|
|
|
return self.getRegistry(self.tutorialCompleteKey, 0)
|
|
|
|
|
|
|
|
def getGame2Done(self):
|
|
|
|
return self.getRegistry(self.game2DoneKey, 0)
|
|
|
|
|
|
|
|
def setPandaErrorCode(self, code):
|
|
|
|
self.pandaErrorCode = code
|
|
|
|
if self.WIN32:
|
|
|
|
self.notify.info('setting panda error code to %s' % code)
|
|
|
|
exitCode2exitPage = {
|
|
|
|
OTPLauncherGlobals.ExitEnableChat: 'chat',
|
|
|
|
OTPLauncherGlobals.ExitSetParentPassword: 'setparentpassword',
|
|
|
|
OTPLauncherGlobals.ExitPurchase: 'purchase'}
|
|
|
|
if code in exitCode2exitPage:
|
|
|
|
self.setRegistry('EXIT_PAGE', exitCode2exitPage[code])
|
|
|
|
self.setRegistry(self.PandaErrorCodeKey, 0)
|
|
|
|
else:
|
|
|
|
self.setRegistry(self.PandaErrorCodeKey, code)
|
|
|
|
else:
|
|
|
|
LauncherBase.setPandaErrorCode(self, code)
|
|
|
|
|
|
|
|
def getNeedPwForSecretKey(self):
|
|
|
|
return self.secretNeedsParentPasswordKey
|
|
|
|
|
|
|
|
def getParentPasswordSet(self):
|
|
|
|
return self.chatEligibleKey
|
|
|
|
|
|
|
|
def MakeNTFSFilesGlobalWriteable(self, pathToSet=None):
|
|
|
|
if not self.WIN32:
|
|
|
|
return
|
|
|
|
LauncherBase.MakeNTFSFilesGlobalWriteable(self, pathToSet)
|
|
|
|
|
|
|
|
def startGame(self):
|
|
|
|
try:
|
|
|
|
os.remove('Phase3.py')
|
|
|
|
except: pass
|
|
|
|
|
|
|
|
import Phase3
|
|
|
|
|
|
|
|
self.newTaskManager()
|
|
|
|
|
|
|
|
from direct.showbase.EventManagerGlobal import eventMgr
|
|
|
|
eventMgr.restart()
|
|
|
|
|
|
|
|
from toontown.toonbase import ToontownStart
|