Merge branch 'atys' into fixes

fixes
Nuno 3 years ago
commit 1a49c4cd0b

2
.gitignore vendored

@ -90,6 +90,7 @@ ylwrap
*.mk *.mk
# Visual Studio garbage # Visual Studio garbage
.vscode/
*.opensdf *.opensdf
UpgradeLog*.XML UpgradeLog*.XML
_UpgradeReport_Files _UpgradeReport_Files
@ -162,6 +163,7 @@ build/*
build-2010/* build-2010/*
build/* build/*
install/* install/*
win-build/
build_* build_*
nel/tools/build_gamedata/configuration/buildsite.py nel/tools/build_gamedata/configuration/buildsite.py

@ -0,0 +1,594 @@
#!/usr/bin/python
#
# \file 0_setup.py
# \brief Run all setup processes
# \date 2009-02-18 15:28GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Run all setup processes
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util, argparse
sys.path.append("configuration")
parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Setup')
parser.add_argument('--noconf', '-nc', action='store_true')
parser.add_argument('--noverify', '-nv', action='store_true')
parser.add_argument('--preset', '-p', action='store_true')
# parser.add_argument('--haltonerror', '-eh', action='store_true')
parser.add_argument('--includeproject', '-ipj', nargs='+')
parser.add_argument('--excludeproject', '-epj', nargs='+')
parser.add_argument('--includeprocess', '-ipc', nargs='+')
parser.add_argument('--excludeprocess', '-epc', nargs='+')
args = parser.parse_args()
if not args.includeproject == None and not args.excludeproject == None:
print "ERROR --includeproject cannot be combined with --excludeproject, exit."
exit()
if not args.includeprocess == None and not args.excludeprocess == None:
print "ERROR --includeprocess cannot be combined with --excludeprocess, exit."
exit()
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
try:
from buildsite import *
except ImportError:
printLog(log, "*** FIRST RUN ***")
if args.noconf:
printLog(log, "ERROR --noconf is invalid on first run, exit.")
exit()
from tools import *
if not args.noconf:
try:
BuildQuality
except NameError:
BuildQuality = 1
try:
if args.preset:
DummyUnknownName
RemapLocalFrom
except NameError:
RemapLocalFrom = 'R:'
try:
if args.preset:
DummyUnknownName
RemapLocalTo
except NameError:
RemapLocalTo = os.getenv('RC_ROOT').replace('\\', '/')
if (not RemapLocalTo) or (not ':' in RemapLocalTo):
RemapLocalTo = 'R:'
try:
if args.preset:
DummyUnknownName
ToolDirectories
except NameError:
ToolDirectories = [ 'R:/distribution/nel_tools_win_x64', 'R:/distribution/ryzom_tools_win_x64' ]
try:
ToolSuffix
except NameError:
ToolSuffix = ".exe"
try:
if args.preset:
DummyUnknownName
ScriptDirectory
except NameError:
ScriptDirectory = "R:/code/nel/tools/build_gamedata"
try:
if args.preset:
DummyUnknownName
WorkspaceDirectory
except NameError:
WorkspaceDirectory = "R:/leveldesign/workspace"
try:
if args.preset:
DummyUnknownName
DatabaseDirectory
except NameError:
DatabaseDirectory = "R:/graphics"
try:
if args.preset:
DummyUnknownName
SoundDirectory
except NameError:
SoundDirectory = "R:/sound"
try:
if args.preset:
DummyUnknownName
SoundDfnDirectory
except NameError:
SoundDfnDirectory = "R:/sound/DFN"
try:
if args.preset:
DummyUnknownName
ExportBuildDirectory
except NameError:
ExportBuildDirectory = "R:/pipeline/export"
try:
if args.preset:
DummyUnknownName
InstallDirectory
except NameError:
InstallDirectory = "R:/pipeline/install"
try:
if args.preset:
DummyUnknownName
ClientDevDirectory
except NameError:
ClientDevDirectory = "R:/pipeline/client_dev"
try:
if args.preset:
DummyUnknownName
ClientDevLiveDirectory
except NameError:
ClientDevLiveDirectory = "R:/pipeline/client_dev_live"
try:
if args.preset:
DummyUnknownName
ClientPatchDirectory
except NameError:
ClientPatchDirectory = "R:/pipeline/client_patch"
try:
if args.preset:
DummyUnknownName
ClientInstallDirectory
except NameError:
ClientInstallDirectory = "R:/pipeline/client_install"
try:
if args.preset:
DummyUnknownName
ShardInstallDirectory
except NameError:
ShardInstallDirectory = "R:/pipeline/shard"
try:
if args.preset:
DummyUnknownName
ShardDevDirectory
except NameError:
ShardDevDirectory = "R:/pipeline/shard_dev"
try:
if args.preset:
DummyUnknownName
WorldEditInstallDirectory
except NameError:
WorldEditInstallDirectory = "R:/pipeline/worldedit"
try:
if args.preset:
DummyUnknownName
WorldEditorFilesDirectory
except NameError:
WorldEditorFilesDirectory = "R:/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files"
try:
if args.preset:
DummyUnknownName
LeveldesignDirectory
except NameError:
LeveldesignDirectory = "R:/leveldesign"
try:
if args.preset:
DummyUnknownName
LeveldesignDfnDirectory
except NameError:
LeveldesignDfnDirectory = "R:/leveldesign/DFN"
try:
if args.preset:
DummyUnknownName
LeveldesignWorldDirectory
except NameError:
LeveldesignWorldDirectory = "R:/leveldesign/world"
try:
if args.preset:
DummyUnknownName
PrimitivesDirectory
except NameError:
PrimitivesDirectory = "R:/leveldesign/primitives"
try:
if args.preset:
DummyUnknownName
LeveldesignDataCommonDirectory
except NameError:
LeveldesignDataCommonDirectory = "R:/leveldesign/common"
try:
if args.preset:
DummyUnknownName
LeveldesignDataShardDirectory
except NameError:
LeveldesignDataShardDirectory = "R:/leveldesign/shard"
try:
if args.preset:
DummyUnknownName
TranslationDirectory
except NameError:
TranslationDirectory = "R:/leveldesign/translation"
try:
if args.preset:
DummyUnknownName
GamedevDirectory
except NameError:
GamedevDirectory = "R:/code/ryzom/client/data/gamedev"
try:
if args.preset:
DummyUnknownName
DataCommonDirectory
except NameError:
DataCommonDirectory = "R:/code/ryzom/common/data_common"
try:
if args.preset:
DummyUnknownName
DataShardDirectory
except NameError:
DataShardDirectory = "R:/code/ryzom/server/data_shard"
try:
if args.preset:
DummyUnknownName
WindowsExeDllCfgDirectories
except NameError:
# TODO: Separate 64bit and 32bit
WindowsExeDllCfgDirectories = [ '', 'R:/build/fv_x64/bin/Release', 'R:/distribution/external_x64', 'R:/code/ryzom/client', '', '', '' ]
try:
if args.preset:
DummyUnknownName
LinuxServiceExecutableDirectory
except NameError:
LinuxServiceExecutableDirectory = "R:/build/server_gcc/bin"
try:
if args.preset:
DummyUnknownName
LinuxClientExecutableDirectory
except NameError:
LinuxClientExecutableDirectory = "R:/build/client_gcc/bin"
try:
if args.preset:
DummyUnknownName
PatchmanDevDirectory
except NameError:
PatchmanDevDirectory = "R:/patchman/terminal_dev"
try:
if args.preset:
DummyUnknownName
PatchmanCfgAdminDirectory
except NameError:
PatchmanCfgAdminDirectory = "R:/patchman/admin_install"
try:
if args.preset:
DummyUnknownName
PatchmanCfgDefaultDirectory
except NameError:
PatchmanCfgDefaultDirectory = "R:/patchman/default"
try:
if args.preset:
DummyUnknownName
PatchmanBridgeServerDirectory
except NameError:
PatchmanBridgeServerDirectory = "R:/pipeline/bridge_server"
try:
SignToolExecutable
except NameError:
SignToolExecutable = "C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bin/signtool.exe"
try:
SignToolSha1
except NameError:
SignToolSha1 = ""
try:
SignToolTimestamp
except NameError:
SignToolTimestamp = "http://timestamp.comodoca.com/authenticode"
try:
MaxAvailable
except NameError:
MaxAvailable = 1
try:
MaxDirectory
except NameError:
MaxDirectory = "C:/Program Files (x86)/Autodesk/3ds Max 2010"
try:
MaxUserDirectory
except NameError:
import os
try:
MaxUserDirectory = os.path.normpath(os.environ["LOCALAPPDATA"] + "/Autodesk/3dsMax/2010 - 32bit/enu")
except KeyError:
MaxAvailable = 0
MaxUserDirectory = "C:/Users/Kaetemi/AppData/Local/Autodesk/3dsMax/2010 - 32bit/enu"
try:
MaxExecutable
except NameError:
MaxExecutable = "3dsmax.exe"
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Setup build site")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
printLog(log, "This script will set up the buildsite configuration, and create needed directories.")
printLog(log, "To use the defaults, simply hit ENTER, else type in the new value.")
printLog(log, "Use -- if you need to insert an empty value.")
printLog(log, "")
BuildQuality = int(askVar(log, "Build Quality", str(BuildQuality)))
if not args.preset:
ToolDirectories[0] = askVar(log, "[IN] Primary Tool Directory", ToolDirectories[0]).replace("\\", "/")
ToolDirectories[1] = askVar(log, "[IN] Secondary Tool Directory", ToolDirectories[1]).replace("\\", "/")
ToolSuffix = askVar(log, "Tool Suffix", ToolSuffix)
ScriptDirectory = askVar(log, "[IN] Script Directory", os.getcwd().replace("\\", "/")).replace("\\", "/")
WorkspaceDirectory = askVar(log, "[IN] Workspace Directory", WorkspaceDirectory).replace("\\", "/")
DatabaseDirectory = askVar(log, "[IN] Database Directory", DatabaseDirectory).replace("\\", "/")
SoundDirectory = askVar(log, "[IN] Sound Directory", SoundDirectory).replace("\\", "/")
SoundDfnDirectory = askVar(log, "[IN] Sound DFN Directory", SoundDfnDirectory).replace("\\", "/")
ExportBuildDirectory = askVar(log, "[OUT] Export Build Directory", ExportBuildDirectory).replace("\\", "/")
InstallDirectory = askVar(log, "[OUT] Install Directory", InstallDirectory).replace("\\", "/")
ClientDevDirectory = askVar(log, "[OUT] Client Dev Directory", ClientDevDirectory).replace("\\", "/")
ClientDevLiveDirectory = askVar(log, "[OUT] Client Dev Live Directory", ClientDevLiveDirectory).replace("\\", "/")
ClientPatchDirectory = askVar(log, "[OUT] Client Patch Directory", ClientPatchDirectory).replace("\\", "/")
ClientInstallDirectory = askVar(log, "[OUT] Client Install Directory", ClientInstallDirectory).replace("\\", "/")
ShardInstallDirectory = askVar(log, "[OUT] Shard Data Install Directory", ShardInstallDirectory).replace("\\", "/")
ShardDevDirectory = askVar(log, "[OUT] Shard Dev Directory", ShardDevDirectory).replace("\\", "/")
WorldEditInstallDirectory = askVar(log, "[OUT] World Edit Data Install Directory", WorldEditInstallDirectory).replace("\\", "/")
LeveldesignDirectory = askVar(log, "[IN] Leveldesign Directory", LeveldesignDirectory).replace("\\", "/")
LeveldesignDfnDirectory = askVar(log, "[IN] Leveldesign DFN Directory", LeveldesignDfnDirectory).replace("\\", "/")
LeveldesignWorldDirectory = askVar(log, "[IN] Leveldesign World Directory", LeveldesignWorldDirectory).replace("\\", "/")
PrimitivesDirectory = askVar(log, "[IN] Primitives Directory", PrimitivesDirectory).replace("\\", "/")
GamedevDirectory = askVar(log, "[IN] Gamedev Directory", GamedevDirectory).replace("\\", "/")
DataShardDirectory = askVar(log, "[IN] Data Shard Directory", DataShardDirectory).replace("\\", "/")
DataCommonDirectory = askVar(log, "[IN] Data Common Directory", DataCommonDirectory).replace("\\", "/")
TranslationDirectory = askVar(log, "[IN] Translation Directory", TranslationDirectory).replace("\\", "/")
LeveldesignDataShardDirectory = askVar(log, "[IN] Leveldesign Data Shard Directory", LeveldesignDataShardDirectory).replace("\\", "/")
LeveldesignDataCommonDirectory = askVar(log, "[IN] Leveldesign Data Common Directory", LeveldesignDataCommonDirectory).replace("\\", "/")
WorldEditorFilesDirectory = askVar(log, "[IN] World Editor Files Directory", WorldEditorFilesDirectory).replace("\\", "/")
WindowsExeDllCfgDirectories[0] = askVar(log, "[IN] Primary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[0]).replace("\\", "/")
WindowsExeDllCfgDirectories[1] = askVar(log, "[IN] Secondary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[1]).replace("\\", "/")
WindowsExeDllCfgDirectories[2] = askVar(log, "[IN] Tertiary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[2]).replace("\\", "/")
WindowsExeDllCfgDirectories[3] = askVar(log, "[IN] Quaternary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[3]).replace("\\", "/")
WindowsExeDllCfgDirectories[4] = askVar(log, "[IN] Quinary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[4]).replace("\\", "/")
WindowsExeDllCfgDirectories[5] = askVar(log, "[IN] Senary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[5]).replace("\\", "/")
WindowsExeDllCfgDirectories[6] = askVar(log, "[IN] Septenary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[6]).replace("\\", "/")
LinuxServiceExecutableDirectory = askVar(log, "[IN] Linux Service Executable Directory", LinuxServiceExecutableDirectory).replace("\\", "/")
LinuxClientExecutableDirectory = askVar(log, "[IN] Linux Client Executable Directory", LinuxClientExecutableDirectory).replace("\\", "/")
PatchmanDevDirectory = askVar(log, "[IN] Patchman Directory", PatchmanDevDirectory).replace("\\", "/")
PatchmanCfgAdminDirectory = askVar(log, "[IN] Patchman Cfg Admin Directory", PatchmanCfgAdminDirectory).replace("\\", "/")
PatchmanCfgDefaultDirectory = askVar(log, "[IN] Patchman Cfg Default Directory", PatchmanCfgDefaultDirectory).replace("\\", "/")
PatchmanBridgeServerDirectory = askVar(log, "[OUT] Patchman Bridge Server Patch Directory", PatchmanBridgeServerDirectory).replace("\\", "/")
SignToolExecutable = askVar(log, "Sign Tool Executable", SignToolExecutable).replace("\\", "/")
SignToolSha1 = askVar(log, "Sign Tool Signature SHA1", SignToolSha1)
SignToolTimestamp = askVar(log, "Sign Tool Timestamp Authority", SignToolTimestamp)
MaxAvailable = int(askVar(log, "3dsMax Available", str(MaxAvailable)))
if MaxAvailable:
MaxDirectory = askVar(log, "3dsMax Directory", MaxDirectory).replace("\\", "/")
MaxUserDirectory = askVar(log, "3dsMax User Directory", MaxUserDirectory).replace("\\", "/")
MaxExecutable = askVar(log, "3dsMax Executable", MaxExecutable)
if os.path.isfile("configuration/buildsite.py"):
os.remove("configuration/buildsite.py")
sf = open("configuration/buildsite.py", "w")
sf.write("#!/usr/bin/python\n")
sf.write("# \n")
sf.write("# \\file site.py\n")
sf.write("# \\brief Site configuration\n")
sf.write("# \\date " + time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "\n")
sf.write("# \\author Jan Boon (Kaetemi)\n")
sf.write("# Python port of game data build pipeline.\n")
sf.write("# Site configuration.\n")
sf.write("# \n")
sf.write("# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>\n")
sf.write("# Copyright (C) 2009-2014 by authors\n")
sf.write("# \n")
sf.write("# This program is free software: you can redistribute it and/or modify\n")
sf.write("# it under the terms of the GNU Affero General Public License as\n")
sf.write("# published by the Free Software Foundation, either version 3 of the\n")
sf.write("# License, or (at your option) any later version.\n")
sf.write("# \n")
sf.write("# This program is distributed in the hope that it will be useful,\n")
sf.write("# but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
sf.write("# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n")
sf.write("# GNU Affero General Public License for more details.\n")
sf.write("# \n")
sf.write("# You should have received a copy of the GNU Affero General Public License\n")
sf.write("# along with this program. If not, see <http://www.gnu.org/licenses/>.\n")
sf.write("# \n")
sf.write("\n")
sf.write("\n")
sf.write("# *** SITE INSTALLATION ***\n")
sf.write("\n")
sf.write("# Use '/' in path name, not '\'\n")
sf.write("# Don't put '/' at the end of a directory name\n")
sf.write("\n")
sf.write("\n")
sf.write("# Quality option for this site (1 for BEST, 0 for DRAFT)\n")
sf.write("BuildQuality = " + str(BuildQuality) + "\n")
sf.write("\n")
sf.write("RemapLocalFrom = \"" + str(RemapLocalFrom) + "\"\n")
sf.write("RemapLocalTo = \"" + str(RemapLocalTo) + "\"\n")
sf.write("\n")
sf.write("ToolDirectories = " + str(ToolDirectories) + "\n")
sf.write("ToolSuffix = \"" + str(ToolSuffix) + "\"\n")
sf.write("\n")
sf.write("# Build script directory\n")
sf.write("ScriptDirectory = \"" + str(ScriptDirectory) + "\"\n")
sf.write("WorkspaceDirectory = \"" + str(WorkspaceDirectory) + "\"\n")
sf.write("\n")
sf.write("# Data build directories\n")
sf.write("DatabaseDirectory = \"" + str(DatabaseDirectory) + "\"\n")
sf.write("SoundDirectory = \"" + str(SoundDirectory) + "\"\n")
sf.write("SoundDfnDirectory = \"" + str(SoundDfnDirectory) + "\"\n")
sf.write("ExportBuildDirectory = \"" + str(ExportBuildDirectory) + "\"\n")
sf.write("\n")
sf.write("# Install directories\n")
sf.write("InstallDirectory = \"" + str(InstallDirectory) + "\"\n")
sf.write("ClientDevDirectory = \"" + str(ClientDevDirectory) + "\"\n")
sf.write("ClientDevLiveDirectory = \"" + str(ClientDevLiveDirectory) + "\"\n")
sf.write("ClientPatchDirectory = \"" + str(ClientPatchDirectory) + "\"\n")
sf.write("ClientInstallDirectory = \"" + str(ClientInstallDirectory) + "\"\n")
sf.write("ShardInstallDirectory = \"" + str(ShardInstallDirectory) + "\"\n")
sf.write("ShardDevDirectory = \"" + str(ShardDevDirectory) + "\"\n")
sf.write("WorldEditInstallDirectory = \"" + str(WorldEditInstallDirectory) + "\"\n")
sf.write("\n")
sf.write("# Utility directories\n")
sf.write("WorldEditorFilesDirectory = \"" + str(WorldEditorFilesDirectory) + "\"\n")
sf.write("\n")
sf.write("# Leveldesign directories\n")
sf.write("LeveldesignDirectory = \"" + str(LeveldesignDirectory) + "\"\n")
sf.write("LeveldesignDfnDirectory = \"" + str(LeveldesignDfnDirectory) + "\"\n")
sf.write("LeveldesignWorldDirectory = \"" + str(LeveldesignWorldDirectory) + "\"\n")
sf.write("PrimitivesDirectory = \"" + str(PrimitivesDirectory) + "\"\n")
sf.write("LeveldesignDataCommonDirectory = \"" + str(LeveldesignDataCommonDirectory) + "\"\n")
sf.write("LeveldesignDataShardDirectory = \"" + str(LeveldesignDataShardDirectory) + "\"\n")
sf.write("TranslationDirectory = \"" + str(TranslationDirectory) + "\"\n")
sf.write("\n")
sf.write("# Misc data directories\n")
sf.write("GamedevDirectory = \"" + str(GamedevDirectory) + "\"\n")
sf.write("DataCommonDirectory = \"" + str(DataCommonDirectory) + "\"\n")
sf.write("DataShardDirectory = \"" + str(DataShardDirectory) + "\"\n")
sf.write("WindowsExeDllCfgDirectories = " + str(WindowsExeDllCfgDirectories) + "\n")
sf.write("LinuxServiceExecutableDirectory = \"" + str(LinuxServiceExecutableDirectory) + "\"\n")
sf.write("LinuxClientExecutableDirectory = \"" + str(LinuxClientExecutableDirectory) + "\"\n")
sf.write("PatchmanDevDirectory = \"" + str(PatchmanDevDirectory) + "\"\n")
sf.write("PatchmanCfgAdminDirectory = \"" + str(PatchmanCfgAdminDirectory) + "\"\n")
sf.write("PatchmanCfgDefaultDirectory = \"" + str(PatchmanCfgDefaultDirectory) + "\"\n")
sf.write("PatchmanBridgeServerDirectory = \"" + str(PatchmanBridgeServerDirectory) + "\"\n")
sf.write("\n")
sf.write("# Sign tool\n")
sf.write("SignToolExecutable = \"" + str(SignToolExecutable) + "\"\n")
sf.write("SignToolSha1 = \"" + str(SignToolSha1) + "\"\n")
sf.write("SignToolTimestamp = \"" + str(SignToolTimestamp) + "\"\n")
sf.write("\n")
sf.write("# 3dsMax directives\n")
sf.write("MaxAvailable = " + str(MaxAvailable) + "\n")
sf.write("MaxDirectory = \"" + str(MaxDirectory) + "\"\n")
sf.write("MaxUserDirectory = \"" + str(MaxUserDirectory) + "\"\n")
sf.write("MaxExecutable = \"" + str(MaxExecutable) + "\"\n")
sf.write("\n")
sf.write("\n")
sf.write("# end of file\n")
sf.flush()
sf.close()
sf = open("configuration/buildsite_local.py", "w")
sfr = open("configuration/buildsite.py", "r")
for l in sfr:
sf.write(l.replace(RemapLocalFrom + '/', RemapLocalTo + '/'))
sf.flush()
sfr.close()
sf.close()
from buildsite_local import *
sys.path.append(WorkspaceDirectory)
from projects import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Run the setup projects")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# For each project
for projectName in ProjectsToProcess:
if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)):
printLog(log, "PROJECT " + projectName)
os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName))
os.chdir("processes")
try:
if not args.includeprocess == None:
subprocess.call([ "python", "0_setup.py", "--includeprocess" ] + args.includeprocess)
elif not args.excludeprocess == None:
subprocess.call([ "python", "0_setup.py", "--excludeprocess" ] + args.excludeprocess)
else:
subprocess.call([ "python", "0_setup.py" ])
except Exception, e:
printLog(log, "<" + projectName + "> " + str(e))
os.chdir("..")
try:
projectLog = open("processes/log.log", "r")
projectLogData = projectLog.read()
projectLog.close()
log.write(projectLogData)
except Exception, e:
printLog(log, "<" + projectName + "> " + str(e))
else:
printLog(log, "IGNORE PROJECT " + projectName)
printLog(log, "")
# Additional directories
printLog(log, ">>> Setup additional directories <<<")
mkPath(log, ClientDevDirectory)
mkPath(log, ClientDevLiveDirectory)
mkPath(log, ClientPatchDirectory)
mkPath(log, ClientInstallDirectory)
if not args.noverify:
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Verify tool paths")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
if MaxAvailable:
findMax(log, MaxDirectory, MaxExecutable)
findTool(log, ToolDirectories, TgaToDdsTool, ToolSuffix)
findTool(log, ToolDirectories, BuildInterfaceTool, ToolSuffix)
findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
findTool(log, ToolDirectories, BuildSmallbankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildFarbankTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneElevationTool, ToolSuffix)
findTool(log, ToolDirectories, BuildRbankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildIndoorRbankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildIgBoxesTool, ToolSuffix)
findTool(log, ToolDirectories, GetNeighborsTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneLighterTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneIgLighterTool, ToolSuffix)
findTool(log, ToolDirectories, IgLighterTool, ToolSuffix)
findTool(log, ToolDirectories, AnimBuilderTool, ToolSuffix)
findTool(log, ToolDirectories, TileEditTool, ToolSuffix)
# findTool(log, ToolDirectories, BuildImagesetTool, ToolSuffix) # kaetemi stuff, ignore this
findTool(log, ToolDirectories, MakeSheetIdTool, ToolSuffix)
# findTool(log, ToolDirectories, BuildSheetsTool, ToolSuffix) # kaetemi stuff, ignore this
# findTool(log, ToolDirectories, BuildSoundTool, ToolSuffix) # kaetemi stuff, ignore this
# findTool(log, ToolDirectories, BuildSoundTool, ToolSuffix)
findTool(log, ToolDirectories, BuildSoundbankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildSamplebankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildCoarseMeshTool, ToolSuffix)
findTool(log, ToolDirectories, LightmapOptimizerTool, ToolSuffix)
findTool(log, ToolDirectories, BuildClodtexTool, ToolSuffix)
findTool(log, ToolDirectories, BuildShadowSkinTool, ToolSuffix)
findTool(log, ToolDirectories, PanoplyMakerTool, ToolSuffix)
findTool(log, ToolDirectories, HlsBankMakerTool, ToolSuffix)
findTool(log, ToolDirectories, LandExportTool, ToolSuffix)
findTool(log, ToolDirectories, PrimExportTool, ToolSuffix)
findTool(log, ToolDirectories, IgElevationTool, ToolSuffix)
findTool(log, ToolDirectories, IgAddTool, ToolSuffix)
findTool(log, ToolDirectories, BuildClodBankTool, ToolSuffix)
findTool(log, ToolDirectories, SheetsPackerTool, ToolSuffix)
findTool(log, ToolDirectories, BnpMakeTool, ToolSuffix)
findTool(log, ToolDirectories, AiBuildWmapTool, ToolSuffix)
findTool(log, ToolDirectories, TgaCutTool, ToolSuffix)
findTool(log, ToolDirectories, PatchGenTool, ToolSuffix)
findTool(log, ToolDirectories, TranslationToolsTool, ToolSuffix)
findTool(log, ToolDirectories, BuildWorldPackedColTool, ToolSuffix)
findTool(log, ToolDirectories, R2IslandsTexturesTool, ToolSuffix)
findTool(log, ToolDirectories, PatchmanServiceTool, ToolSuffix)
log.close()
if os.path.isfile("0_setup.log"):
os.remove("0_setup.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_setup.log")
shutil.move("log.log", "0_setup.log")

@ -0,0 +1,108 @@
#!/usr/bin/python
#
# \file b1_client_dev.py
# \brief Install to client dev
# \date 2009-02-18 16:19GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Install to client dev
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util, socket
sys.path.append("configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite_local import *
from tools import *
sys.path.append(WorkspaceDirectory)
from projects import *
# Log error
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Install to client dev")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
mkPath(log, ClientDevLiveDirectory)
if not os.path.isfile(ClientDevLiveDirectory + "/client.cfg"):
printLog(log, ">>> Generate live dev client.cfg <<<")
cfg = open(ClientDevLiveDirectory + "/client.cfg", "w")
cfg.write("RootConfigFilename = \"client_default.cfg\";\n")
cfg.write("PreDataPath = {\n")
cfg.write("\t\"user\", \"patch\", \"" + DataCommonDirectory + "\", \"" + GamedevDirectory + "\", \"" + LeveldesignDirectory + "/translation/translated\", \"" + InstallDirectory + "\", \"data\", \"examples\" \n")
cfg.write("};\n")
cfg.write("PreLoadPath = \"" + InstallDirectory + "\";\n")
cfg.write("PatchWanted = 0;\n")
cfg.write("DisplayLuaDebugInfo = 1;\n")
cfg.write("AllowDebugLua = 1;\n")
cfg.write("FullScreen = 0;\n")
cfg.flush()
cfg.close()
printLog(log, "")
mkPath(log, ClientDevDirectory)
if not os.path.isfile(ClientDevDirectory + "/client.cfg"):
printLog(log, ">>> Generate local dev client.cfg <<<")
cfg = open(ClientDevDirectory + "/client.cfg", "w")
cfgr = open(ClientDevLiveDirectory + "/client.cfg", "r")
for l in cfgr:
cfg.write(l)
cfgr.close()
cfg.write("StartupHost = \"http://" + socket.gethostname() + ":9042\";\n")
cfg.write("Application = {\n")
cfg.write(" \"dev\", \"./client_ryzom_r.exe\", \"./\" \n")
cfg.write("};\n")
cfg.flush()
cfg.close()
printLog(log, "")
printLog(log, ">>> Install data <<<")
for category in InstallClientData:
if (category["UnpackTo"] != None):
printLog(log, "CATEGORY " + category["Name"])
targetPath = ClientDevDirectory
targetPathLive = ClientDevLiveDirectory
if (category["UnpackTo"] != ""):
targetPath += "/" + category["UnpackTo"]
targetPathLive += "/" + category["UnpackTo"]
mkPath(log, targetPath)
mkPath(log, targetPathLive)
for package in category["Packages"]:
printLog(log, "PACKAGE " + package[0])
mkPath(log, InstallDirectory + "/" + package[0])
if "exedll" in package[0]:
if package[0] == "exedll": # or package[0] == platformExeDll # TODO: 64-bit and Linux separation of exedll, only include one
copyFileIfNeeded(log, InstallDirectory + "/" + package[0] + "/client_default.cfg", targetPath)
copyFileIfNeeded(log, InstallDirectory + "/" + package[0] + "/client_default.cfg", targetPathLive)
else:
copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPath)
copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPathLive)
printLog(log, "")
log.close()
if os.path.isfile("b1_client_dev.log"):
os.remove("b1_client_dev.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_client_dev.log")
shutil.move("log.log", "b1_client_dev.log")

@ -0,0 +1,123 @@
#!/usr/bin/python
#
# \file c1_shard_patch.py
# \brief Create a new patch for the patchman bridge
# \date 2014-02-20 00:27GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Create a new patch for the patchman bridge
#
# NeL - MMORPG Framework <http://www.ryzomcore.org/>
# Copyright (C) 2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util, tarfile, argparse
sys.path.append("configuration")
parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Shard Patch')
parser.add_argument('--admininstall', '-ai', action='store_true')
args = parser.parse_args()
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite_local import *
from tools import *
sys.path.append(WorkspaceDirectory)
from projects import *
# Log error
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Create a new patch for the patchman bridge")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
SevenZip = findTool(log, ToolDirectories, SevenZipTool, ToolSuffix)
# List the directories that will be used
archiveDirectories = [ ]
for dir in InstallShardDataDirectories:
if not dir in archiveDirectories:
archiveDirectories += [ dir ]
for package in InstallShardDataFiles:
dstDir = package[0]
if not dstDir in archiveDirectories:
archiveDirectories += [ dstDir ]
for multiDir in InstallShardDataMultiDirectories:
dstDir = multiDir[0]
if not dstDir in archiveDirectories:
archiveDirectories += [ dstDir ]
for multiDir in InstallShardDataPrimitivesDirectories:
dstDir = multiDir[0]
if not dstDir in archiveDirectories:
archiveDirectories += [ dstDir ]
for execDir in InstallShardDataExecutables:
dstDir = execDir[0]
if not dstDir in archiveDirectories:
archiveDirectories += [ dstDir ]
printLog(log, ">>> Archive new admin_install.tgz <<<")
mkPath(log, PatchmanBridgeServerDirectory)
adminInstallTgz = PatchmanBridgeServerDirectory + "/admin_install.tgz"
patchmanExecutable = LinuxServiceExecutableDirectory + "/ryzom_patchman_service"
if needUpdateDirNoSubdirFile(log, PatchmanCfgAdminDirectory + "/bin", adminInstallTgz) or needUpdateDirNoSubdirFile(log, PatchmanCfgAdminDirectory + "/patchman", adminInstallTgz) or needUpdate(log, patchmanExecutable, adminInstallTgz):
printLog(log, "WRITE " + adminInstallTgz)
if os.path.isfile(adminInstallTgz):
os.remove(adminInstallTgz)
tar = tarfile.open(adminInstallTgz, "w:gz")
tar.add(PatchmanCfgAdminDirectory + "/bin", arcname = "bin")
tar.add(PatchmanCfgAdminDirectory + "/patchman", arcname = "patchman")
tar.add(patchmanExecutable, arcname = "patchman/ryzom_patchman_service")
tar.close()
else:
printLog(log, "SKIP " + adminInstallTgz)
printLog(log, "")
if not args.admininstall:
if SevenZip == "":
toolLogFail(log, SevenZipTool, ToolSuffix)
else:
printLog(log, ">>> Create new version <<<")
newVersion = 1
vstr = str(newVersion).zfill(6)
vpath = PatchmanBridgeServerDirectory + "/" + vstr
while os.path.exists(vpath):
newVersion = newVersion + 1
vstr = str(newVersion).zfill(6)
vpath = PatchmanBridgeServerDirectory + "/" + vstr
mkPath(log, vpath)
for dir in archiveDirectories:
mkPath(log, ShardInstallDirectory + "/" + dir)
# tgzPath = vpath + "/" + dir + ".tgz"
# printLog(log, "WRITE " + tgzPath)
# tar = tarfile.open(tgzPath, "w:gz")
# tar.add(ShardInstallDirectory + "/" + dir, arcname = dir)
# tar.close()
sevenZipPath = vpath + "/" + dir + ".7z"
printLog(log, "WRITE " + sevenZipPath)
subprocess.call([ SevenZip, "a", sevenZipPath, ShardInstallDirectory + "/" + dir ])
printLog(log, "")
log.close()
if os.path.isfile("c1_shard_patch.log"):
os.remove("c1_shard_patch.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_shard_patch.log")
shutil.move("log.log", "c1_shard_patch.log")

@ -0,0 +1,610 @@
#!/usr/bin/python
#
# \file export.py
# \brief Useful scripts
# \date 2009-02-18 09:22GMT
# \author Jan Boon (Kaetemi)
# Useful scripts
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util, multiprocessing, math
ActiveProjectDirectory = os.getenv("NELBUILDACTIVEPROJECT", "configuration/project")
sys.path.append(ActiveProjectDirectory)
def printLog(log, text):
log.write(text + "\n")
print text
pendingProcesses = []
processLimit = math.ceil(multiprocessing.cpu_count() * 0.75)
def callParallelProcess(command):
res = 0
if len(pendingProcesses) >= processLimit:
waitingProc = pendingProcesses.pop(0)
res = waitingProc.wait()
proc = subprocess.Popen(command)
pendingProcesses.append(proc)
return res
def flushParallelProcesses():
res = 0
while (len(pendingProcesses) > 0):
waitingProc = pendingProcesses.pop(0)
procRes = waitingProc.wait()
if procRes != 0:
res = procRes
return res
def mkPath(log, path):
printLog(log, "DIR " + path)
distutils.dir_util.mkpath(path)
def needUpdate(log, source, dest):
if (os.path.isfile(source)):
if (os.path.isfile(dest)):
if (os.stat(source).st_mtime > os.stat(dest).st_mtime):
return 1
else:
return 0
return 1
printLog(log, "MISSING " + source)
return 0
def needUpdateRemoveDest(log, source, dest):
if (os.path.isfile(source)):
if (os.path.isfile(dest)):
if (os.stat(source).st_mtime > os.stat(dest).st_mtime):
os.remove(dest)
return 1
else:
return 0
return 1
printLog(log, "MISSING " + source)
return 0
def needUpdateLogRemoveDest(log, source, dest):
if (os.path.isfile(source)):
if (os.path.isfile(dest)):
if (os.stat(source).st_mtime > os.stat(dest).st_mtime):
os.remove(dest)
printLog(log, source + " -> " + dest)
return 1
else:
printLog(log, "SKIP " + dest)
return 0
printLog(log, source + " -> " + dest)
return 1
printLog(log, "MISSING " + source)
printLog(log, "SKIP " + dest)
return 0
def copyFileList(log, dir_source, dir_target, files):
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
if (os.path.isfile(dir_source + "/" + fileName)):
if needUpdateLogRemoveDest(log, dir_source + "/" + fileName, dir_target + "/" + fileName):
shutil.copy(dir_source + "/" + fileName, dir_target + "/" + fileName)
def copyFileListLogless(log, dir_source, dir_target, files):
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
if (os.path.isfile(dir_source + "/" + fileName)):
if needUpdateRemoveDest(log, dir_source + "/" + fileName, dir_target + "/" + fileName):
shutil.copy(dir_source + "/" + fileName, dir_target + "/" + fileName)
def copyFileListNoTree(log, dir_source, dir_target, files):
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
if (os.path.isfile(dir_source + "/" + fileName)):
printLog(log, dir_source + "/" + fileName + " -> " + dir_target + "/" + os.path.basename(fileName))
shutil.copy(dir_source + "/" + fileName, dir_target + "/" + os.path.basename(fileName))
def copyFileListNoTreeIfNeeded(log, dir_source, dir_target, files):
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
if (os.path.isfile(dir_source + "/" + fileName)):
srcFile = dir_source + "/" + fileName
destFile = dir_target + "/" + os.path.basename(fileName)
if needUpdateLogRemoveDest(log, srcFile, destFile):
shutil.copy(srcFile, destFile)
def removeFilesRecursive(log, dir_files):
files = os.listdir(dir_files)
for fileName in files:
if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"):
if os.path.isdir(dir_files + "/" + fileName):
removeFilesRecursive(log, dir_files + "/" + fileName)
else:
printLog(log, "RM " + dir_files + "/" + fileName)
os.remove(dir_files + "/" + fileName)
def removeFilesDirsRecursive(log, dir_files):
files = os.listdir(dir_files)
for fileName in files:
if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"):
if os.path.isdir(dir_files + "/" + fileName):
removeFilesRecursive(log, dir_files + "/" + fileName)
else:
printLog(log, "RM " + dir_files + "/" + fileName)
os.remove(dir_files + "/" + fileName)
printLog(log, "RMDIR " + dir_files)
os.rmdir(dir_files)
def removeFilesRecursiveExt(log, dir_files, file_ext):
files = os.listdir(dir_files)
len_file_ext = len(file_ext)
for fileName in files:
if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"):
if os.path.isdir(dir_files + "/" + fileName):
removeFilesRecursiveExt(log, dir_files + "/" + fileName, file_ext)
elif (fileName[-len_file_ext:].lower() == file_ext.lower()):
printLog(log, "RM " + dir_files + "/" + fileName)
os.remove(dir_files + "/" + fileName)
def copyFilesRecursive(log, dir_source, dir_target):
files = os.listdir(dir_source)
mkPath(log, dir_target)
for fileName in files:
if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"):
if os.path.isdir(dir_source + "/" + fileName):
copyFilesRecursive(log, dir_source + "/" + fileName, dir_target + "/" + fileName)
else:
printLog(log, dir_source + "/" + fileName + " -> " + dir_target + "/" + fileName)
shutil.copy(dir_source + "/" + fileName, dir_target + "/" + fileName)
def copyFiles(log, dir_source, dir_target):
copyFileList(log, dir_source, dir_target, os.listdir(dir_source))
def copyFilesLogless(log, dir_source, dir_target):
copyFileListLogless(log, dir_source, dir_target, os.listdir(dir_source))
def copyFilesExt(log, dir_source, dir_target, file_ext):
files = os.listdir(dir_source)
len_file_ext = len(file_ext)
for fileName in files:
if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*") and (fileName[-len_file_ext:].lower() == file_ext.lower()):
if (os.path.isfile(dir_source + "/" + fileName)):
printLog(log, dir_source + "/" + fileName + " -> " + dir_target + "/" + fileName)
shutil.copy(dir_source + "/" + fileName, dir_target + "/" + fileName)
def copyFilesRenamePrefixExt(log, dir_source, dir_target, old_prefix, new_prefix, file_ext):
files = os.listdir(dir_source)
len_file_ext = len(file_ext)
len_prefix = len(old_prefix)
for fileName in files:
if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*") and (fileName[-len_file_ext:].lower() == file_ext.lower()) and ((fileName[:len_prefix].lower() == old_prefix.lower())):
if (os.path.isfile(dir_source + "/" + fileName)):
printLog(log, dir_source + "/" + fileName + " -> " + dir_target + "/" + new_prefix + fileName[-(len(fileName) - len_prefix):])
shutil.copy(dir_source + "/" + fileName, dir_target + "/" + new_prefix + fileName[-(len(fileName) - len_prefix):])
def copyFilesExtNoSubdir(log, dir_source, dir_target, file_ext):
files = findFilesNoSubdir(log, dir_source, file_ext)
copyFileListNoTree(log, dir_source, dir_target, files)
def copyFilesExtNoTree(log, dir_source, dir_target, file_ext):
files = findFiles(log, dir_source, "", file_ext)
copyFileListNoTree(log, dir_source, dir_target, files)
def copyFilesExtNoTreeIfNeeded(log, dir_source, dir_target, file_ext):
files = findFiles(log, dir_source, "", file_ext)
copyFileListNoTreeIfNeeded(log, dir_source, dir_target, files)
def copyFilesExtNoSubdirIfNeeded(log, dir_source, dir_target, file_ext):
files = findFilesNoSubdir(log, dir_source, file_ext)
copyFileListNoTreeIfNeeded(log, dir_source, dir_target, files)
def copyFilesNoTreeIfNeeded(log, dir_source, dir_target):
copyFileListNoTreeIfNeeded(log, dir_source, dir_target, os.listdir(dir_source))
def copyFilesRecursiveNoTreeIfNeeded(log, dir_source, dir_target):
files = findFilesRecursive(log, dir_source, "")
copyFileListNoTreeIfNeeded(log, dir_source, dir_target, files)
def copyFileListExtReplaceNoTreeIfNeeded(log, dir_source, dir_target, files, file_ext, target_ext):
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
if (os.path.isfile(dir_source + "/" + fileName)):
srcFile = dir_source + "/" + fileName
destFile = dir_target + "/" + os.path.basename(fileName)[0:-len(file_ext)] + target_ext
if needUpdateLogRemoveDest(log, srcFile, destFile):
shutil.copy(srcFile, destFile)
def copyFilesExtReplaceNoTreeIfNeeded(log, dir_source, dir_target, file_ext, target_ext):
files = findFiles(log, dir_source, "", file_ext)
copyFileListExtReplaceNoTreeIfNeeded(log, dir_source, dir_target, files, file_ext, target_ext)
def copyFileIfNeeded(log, srcFile, destFile):
if needUpdateLogRemoveDest(log, srcFile, destFile):
shutil.copy(srcFile, destFile)
def moveFileListNoTree(log, dir_source, dir_target, files):
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
if (os.path.isfile(dir_source + "/" + fileName)):
printLog(log, "MOVE " + dir_source + "/" + fileName + " -> " + dir_target + "/" + os.path.basename(fileName))
shutil.move(dir_source + "/" + fileName, dir_target + "/" + os.path.basename(fileName))
def moveFilesExtNoTree(log, dir_source, dir_target, file_ext):
files = findFiles(log, dir_source, "", file_ext)
moveFileListNoTree(log, dir_source, dir_target, files)
def moveFilesNoSubdir(log, dir_source, dir_target):
files = os.listdir(dir_source)
moveFileListNoTree(log, dir_source, dir_target, files)
def moveDir(log, dir_source, dir_target):
printLog(log, "MOVE " + dir_source + " -> " + dir_target)
shutil.move(dir_source, dir_target)
def findFilesRecursive(log, dir_where, dir_sub):
result = [ ]
files = os.listdir(dir_where + "/" + dir_sub)
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
filePath = dir_sub + fileName
fileFull = dir_where + "/" + dir_sub + fileName
if os.path.isfile(fileFull):
result += [ filePath ]
elif os.path.isdir(fileFull):
result += findFilesRecursive(log, dir_where, filePath + "/")
else:
printLog(log, "findFilesRecursive: file not dir or file?!" + filePath)
return result
def findFiles(log, dir_where, dir_sub, file_ext):
result = [ ]
files = os.listdir(dir_where + "/" + dir_sub)
len_file_ext = len(file_ext)
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
filePath = dir_sub + fileName
fileFull = dir_where + "/" + dir_sub + fileName
if os.path.isfile(fileFull):
if fileName[-len_file_ext:].lower() == file_ext.lower():
result += [ filePath ]
elif os.path.isdir(fileFull):
result += findFiles(log, dir_where, filePath + "/", file_ext)
else:
printLog(log, "findFiles: file not dir or file?!" + filePath)
return result
def isLegalFileName(fileName):
return fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"
def findFilesNoSubdir(log, dir_where, file_ext):
result = [ ]
files = os.listdir(dir_where)
len_file_ext = len(file_ext)
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
fileFull = dir_where + "/" + fileName
if os.path.isfile(fileFull):
if fileName[-len_file_ext:].lower() == file_ext.lower():
result += [ fileName ]
elif not os.path.isdir(fileFull):
printLog(log, "findFilesNoSubdir: file not dir or file?!" + fileFull)
return result
def findFilesNoSubdirFiltered(log, dir_where, file_ext, filter):
if len(filter) == 0:
return findFilesNoSubdir(log, dir_where, file_ext)
result = [ ]
files = os.listdir(dir_where)
len_file_ext = len(file_ext)
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
fileFull = dir_where + "/" + fileName
if os.path.isfile(fileFull):
if fileName[-len_file_ext:].lower() == file_ext.lower():
fileNameLower = fileName.lower()
for filterWord in filter:
if filterWord in fileNameLower:
result += [ fileName ]
break
elif not os.path.isdir(fileFull):
printLog(log, "findFilesNoSubdir: file not dir or file?!" + fileFull)
return result
def findFile(log, dir_where, file_name):
files = os.listdir(dir_where)
for fileName in files:
if fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*":
filePath = dir_where + "/" + fileName
if os.path.isfile(filePath):
if fileName == file_name:
return filePath
elif os.path.isdir(filePath):
result = findFile(log, filePath, file_name)
if result != "":
return result
else:
printLog(log, "findFile: file not dir or file?! " + filePath)
return ""
def needUpdateDirByLowercaseTagLog(log, dir_source, ext_source, dir_dest, ext_dest):
updateCount = 0
skipCount = 0
lenSrcExt = len(ext_source)
sourceFiles = findFilesNoSubdir(log, dir_source, ext_source)
destFiles = findFilesNoSubdir(log, dir_dest, ext_dest)
for file in sourceFiles:
sourceFile = dir_source + "/" + file
tagFile = dir_dest + "/" + file[0:-lenSrcExt].lower() + ext_dest
if os.path.isfile(tagFile):
sourceTime = os.stat(sourceFile).st_mtime
tagTime = os.stat(tagFile).st_mtime
if (sourceTime > tagTime):
updateCount = updateCount + 1
else:
skipCount = skipCount + 1
else:
updateCount = updateCount + 1
if updateCount > 0:
printLog(log, "UPDATE " + str(updateCount) + " / " + str(len(sourceFiles)) + "; SKIP " + str(skipCount) + " / " + str(len(sourceFiles)) + "; DEST " + str(len(destFiles)))
return 1
else:
printLog(log, "SKIP " + str(skipCount) + " / " + str(len(sourceFiles)) + "; DEST " + str(len(destFiles)))
return 0
def needUpdateDirByTagLogFiltered(log, dir_source, ext_source, dir_dest, ext_dest, filter):
updateCount = 0
skipCount = 0
lenSrcExt = len(ext_source)
sourceFiles = findFilesNoSubdirFiltered(log, dir_source, ext_source, filter)
destFiles = findFilesNoSubdir(log, dir_dest, ext_dest)
for file in sourceFiles:
sourceFile = dir_source + "/" + file
tagFile = dir_dest + "/" + file[0:-lenSrcExt] + ext_dest
if os.path.isfile(tagFile):
sourceTime = os.stat(sourceFile).st_mtime
tagTime = os.stat(tagFile).st_mtime
if (sourceTime > tagTime):
updateCount = updateCount + 1
else:
skipCount = skipCount + 1
else:
updateCount = updateCount + 1
if updateCount > 0:
printLog(log, "UPDATE " + str(updateCount) + " / " + str(len(sourceFiles)) + "; SKIP " + str(skipCount) + " / " + str(len(sourceFiles)) + "; DEST " + str(len(destFiles)))
return 1
else:
printLog(log, "SKIP " + str(skipCount) + " / " + str(len(sourceFiles)) + "; DEST " + str(len(destFiles)))
return 0
def needUpdateDirByTagLog(log, dir_source, ext_source, dir_dest, ext_dest):
updateCount = 0
skipCount = 0
lenSrcExt = len(ext_source)
sourceFiles = findFilesNoSubdir(log, dir_source, ext_source)
destFiles = findFilesNoSubdir(log, dir_dest, ext_dest)
for file in sourceFiles:
sourceFile = dir_source + "/" + file
tagFile = dir_dest + "/" + file[0:-lenSrcExt] + ext_dest
if os.path.isfile(tagFile):
sourceTime = os.stat(sourceFile).st_mtime
tagTime = os.stat(tagFile).st_mtime
if (sourceTime > tagTime):
updateCount = updateCount + 1
else:
skipCount = skipCount + 1
else:
updateCount = updateCount + 1
if updateCount > 0:
printLog(log, "UPDATE " + str(updateCount) + " / " + str(len(sourceFiles)) + "; SKIP " + str(skipCount) + " / " + str(len(sourceFiles)) + "; DEST " + str(len(destFiles)))
return 1
else:
printLog(log, "SKIP " + str(skipCount) + " / " + str(len(sourceFiles)) + "; DEST " + str(len(destFiles)))
return 0
def needUpdateDirNoSubdirFile(log, dir_source, file_dest):
if not os.path.isfile(file_dest):
return 1
destTime = os.stat(file_dest).st_mtime
sourceFiles = os.listdir(dir_source)
for file in sourceFiles:
filePath = dir_source + "/" + file
if os.path.isfile(filePath):
fileTime = os.stat(filePath).st_mtime
if fileTime > destTime:
return 1
else:
return 0
def needUpdateFileDirNoSubdir(log, file_source, dir_dest):
if not os.path.isfile(file_source):
printLog(log, "WARNING MISSING " + file_source)
return 0
sourceTime = os.stat(file_source).st_mtime
destFiles = os.listdir(dir_dest)
for file in destFiles:
filePath = dir_dest + "/" + file
if os.path.isfile(filePath):
fileTime = os.stat(filePath).st_mtime
if sourceTime > fileTime:
return 1
else:
return 0
def needUpdateDirNoSubdirMultiFile(log, dir_source, root_file, files_dest):
for file_dest in files_dest:
if needUpdateDirNoSubdirFile(log, dir_source, root_file + "/" + file_dest):
return 1
return 0
def needUpdateDirNoSubdirMultiFileExt(log, dir_source, root_file, files_dest, file_ext):
for file_dest in files_dest:
if needUpdateDirNoSubdirFile(log, dir_source, root_file + "/" + file_dest + file_ext):
return 1
return 0
def needUpdateMultiDirNoSubdirFile(log, root_dir, dirs_source, file_dest):
for dir_source in dirs_source:
if needUpdateDirNoSubdirFile(log, root_dir + "/" + dir_source, file_dest):
return 1
return 0
def needUpdateMultiDirNoSubdirMultiFileExt(log, root_dir, dirs_source, root_file, files_dest, file_ext):
for file_dest in files_dest:
if needUpdateMultiDirNoSubdirFile(log, root_dir, dirs_source, root_file + "/" + file_dest + file_ext):
return 1
return 0
def needUpdateMultiDirNoSubdir(log, root_dir, dirs_source, dir_dest):
for dir_source in dirs_source:
if needUpdateDirNoSubdir(log, root_dir + "/" + dir_source, dir_dest):
return 1
return 0
def needUpdateDirNoSubdirExtFile(log, dir_source, dir_ext, file_dest):
if not os.path.isfile(file_dest):
return 1
destTime = os.stat(file_dest).st_mtime
sourceFiles = os.listdir(dir_source)
for file in sourceFiles:
if file.endswith(dir_ext):
filePath = dir_source + "/" + file
if os.path.isfile(filePath):
fileTime = os.stat(filePath).st_mtime
if fileTime > destTime:
return 1
else:
return 0
def needUpdateDirNoSubdirExtMultiFileExt(log, dir_source, dir_ext, root_file, files_dest, file_ext):
for file_dest in files_dest:
if needUpdateDirNoSubdirExtFile(log, dir_source, dir_ext, root_file + "/" + file_dest + file_ext):
return 1
return 0
def needUpdateDirNoSubdir(log, dir_source, dir_dest):
latestSourceFile = 0
oldestDestFile = 0
sourceFiles = os.listdir(dir_source)
destFiles = os.listdir(dir_dest)
for file in sourceFiles:
filePath = dir_source + "/" + file
if os.path.isfile(filePath):
fileTime = os.stat(filePath).st_mtime
if fileTime > latestSourceFile:
latestSourceFile = fileTime
for file in destFiles:
filePath = dir_dest + "/" + file
if os.path.isfile(filePath):
fileTime = os.stat(filePath).st_mtime
if oldestDestFile == 0 or fileTime < oldestDestFile:
oldestDestFile = fileTime
if latestSourceFile > oldestDestFile:
return 1
else:
return 0
def needUpdateDirNoSubdirLogExt(log, dir_source, ext_source, dir_dest, ext_dest):
latestSourceFile = 0
latestDestFile = 0
sourceFiles = findFilesNoSubdir(log, dir_source, ext_source)
destFiles = findFilesNoSubdir(log, dir_dest, ext_dest)
for file in sourceFiles:
fileTime = os.stat(dir_source + "/" + file).st_mtime
if (fileTime > latestSourceFile):
latestSourceFile = fileTime
for file in destFiles:
fileTime = os.stat(dir_dest + "/" + file).st_mtime
if (fileTime > latestDestFile):
latestDestFile = fileTime
if latestSourceFile > latestDestFile or len(sourceFiles) > len(destFiles):
printLog(log, "UPDATE; Source: " + str(latestSourceFile) + ", " + str(len(sourceFiles)) + " files; Dest: " + str(latestDestFile) + ", " + str(len(destFiles)) + " files")
return 1
else:
printLog(log, "SKIP *")
return 0
def needUpdateDirNoSubdirLogExtMultidir(log, all_dir_base, all_dir_source, dir_source, ext_source, dir_dest, ext_dest):
latestSourceFile = 0
latestDestFile = 0
sourceFilesAll = [ ]
for dir in all_dir_source:
sourceFilesAll += findFilesNoSubdir(log, all_dir_base + "/" + dir, ext_source)
sourceFiles = findFilesNoSubdir(log, dir_source, ext_source)
destFiles = findFilesNoSubdir(log, dir_dest, ext_dest)
for file in sourceFiles:
fileTime = os.stat(dir_source + "/" + file).st_mtime
if (fileTime > latestSourceFile):
latestSourceFile = fileTime
for file in destFiles:
fileTime = os.stat(dir_dest + "/" + file).st_mtime
if (fileTime > latestDestFile):
latestDestFile = fileTime
if latestSourceFile > latestDestFile or len(sourceFilesAll) > len(destFiles):
printLog(log, "UPDATE; Source: " + str(latestSourceFile) + ", " + str(len(sourceFilesAll)) + " files; Dest: " + str(latestDestFile) + ", " + str(len(destFiles)) + " files")
return 1
else:
printLog(log, "SKIP *")
return 0
def findFileMultiDir(log, dirs_where, file_name):
try:
for dir in dirs_where:
if dir != "":
file = findFile(log, dir, file_name)
if file != "":
return file
except Exception, e:
printLog(log, "EXCEPTION " + str(e))
printLog(log, "FILE NOT FOUND " + file_name)
return ""
def findTool(log, dirs_where, file_name, suffix):
try:
for dir in dirs_where:
if dir != "":
tool = findFile(log, dir, file_name + suffix)
if tool != "":
printLog(log, "TOOL " + tool)
return tool
except Exception, e:
printLog(log, "EXCEPTION " + str(e))
printLog(log, "TOOL NOT FOUND " + file_name + suffix)
return ""
def findMax(log, dir, file):
tool = dir + "/" + file
if os.path.isfile(tool):
printLog(log, "3DSMAX " + tool)
return tool
printLog(log, "3DSMAX NOT FOUND " + file)
return ""
def toolLogFail(log, tool, suffix):
printLog(log, "FAIL " + tool + suffix + " is not found")
def askVar(log, name, default):
sys.stdout.write(name + " (" + default + "): ")
line = sys.stdin.readline()
linestrip = line.strip()
if linestrip == "--":
log.write(name + " (" + default + "): ''\n")
return ""
elif linestrip == "":
log.write(name + " (" + default + "): '" + default + "'\n")
return default
else:
log.write(name + " (" + default + "): '" + linestrip + "'\n")
return linestrip

@ -0,0 +1,102 @@
#!/usr/bin/python
#
# \file process.py
# \brief Tools configuration
# \date 2009-03-10 11:33GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Tools configuration.
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# *** PROCESS TIMEOUT ***
SkelExportTimeout = 600000
SwtExportTimeout = 600000
ShapeExportTimeout = 3600000
ZoneExportTimeout = 1800000
ZoneBuildDependTimeout = 1800000
ZoneBuildWeldTimeout = 60000
ZoneLightBuildTimeout = 600000
ZoneIgLightBuildTimeout = 600000
SmallbankBuildTimeout = 60000
FarbankBuildTimeout = 180000
AnimExportTimeout = 1800000
IgExportTimeout = 600000
CmbExportTimeout = 60000
RbankBuildTesselTimeout = 6000000
RbankBuildSmoothTimeout = 6000000
RbankBuildProclocalTimeout = 6000000
RbankBuildProcglobalTimeout = 18000000
RbankBuildIndoorTimeout = 18000000
# WmapBuildTimeout = 60000
LigoExportTimeout = 3600000
LigoBuildTimeout = 1800000
PacsPrimExportTimeout = 600000
MapsBuildTimeout = 60000 # 1min
MaxShapeExportTimeout = 600000 # 10min
# *** TOOLS CONFIGURATION ***
TgaToDdsTool = "tga2dds"
BuildInterfaceTool = "build_interface"
ExecTimeoutTool = "exec_timeout"
BuildSmallbankTool = "build_smallbank"
BuildFarbankTool = "build_far_bank"
ZoneDependenciesTool = "zone_dependencies"
ZoneWelderTool = "zone_welder"
ZoneElevationTool = "zone_elevation"
BuildRbankTool = "build_rbank"
BuildIndoorRbankTool = "build_indoor_rbank"
BuildIgBoxesTool = "build_ig_boxes"
GetNeighborsTool = "get_neighbors"
ZoneLighterTool = "zone_lighter"
ZoneIgLighterTool = "zone_ig_lighter"
IgLighterTool = "ig_lighter"
AnimBuilderTool = "anim_builder"
TileEditTool = "tile_edit"
# BuildImagesetTool = "th_build_imageset" # kaetemi stuff, ignore this
MakeSheetIdTool = "make_sheet_id"
# BuildSheetsTool = "th_build_sheets" # kaetemi stuff, ignore this
# BuildSoundTool = "th_build_sound" # kaetemi stuff, ignore this
# BuildSoundTool = "build_sound"
BuildSoundbankTool = "build_soundbank"
BuildSamplebankTool = "build_samplebank"
BuildCoarseMeshTool = "build_coarse_mesh"
LightmapOptimizerTool = "lightmap_optimizer"
BuildClodtexTool = "build_clodtex"
BuildShadowSkinTool = "build_shadow_skin"
PanoplyMakerTool = "panoply_maker"
HlsBankMakerTool = "hls_bank_maker"
LandExportTool = "land_export"
PrimExportTool = "prim_export"
IgElevationTool = "ig_elevation"
IgAddTool = "ig_add"
BuildClodBankTool = "build_clod_bank"
SheetsPackerTool = "sheets_packer"
SheetsPackerShardTool = "sheets_packer_shard"
BnpMakeTool = "bnp_make"
SnpMakeTool = "snp_make"
AiBuildWmapTool = "ai_build_wmap"
TgaCutTool = "tga_cut"
PatchGenTool = "patch_gen"
TranslationToolsTool = "translation_tools"
BuildWorldPackedColTool = "build_world_packed_col"
R2IslandsTexturesTool = "r2_islands_textures"
PatchmanServiceTool = "ryzom_patchman_service"
SevenZipTool = "7za"

@ -0,0 +1,181 @@
#!/usr/bin/python
#
# \file d1_client_patch.py
# \brief Install to client patch
# \date 2009-02-18 16:19GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Install to client patch
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util, argparse
sys.path.append("configuration")
parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Client Patch')
parser.add_argument('--bnponly', '-bo', action='store_true')
args = parser.parse_args()
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite_local import *
from tools import *
sys.path.append(WorkspaceDirectory)
from projects import *
# Log error
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Install to client patch")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
BnpMake = findTool(log, ToolDirectories, BnpMakeTool, ToolSuffix)
SnpMake = findTool(log, ToolDirectories, SnpMakeTool, ToolSuffix);
PatchGen = findTool(log, ToolDirectories, PatchGenTool, ToolSuffix)
printLog(log, "")
# Find **** HARDCODED **** WINDOWS **** tools ... TODO: fix patch_gen tool !!!
Lzma = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, "lzma.exe")
printLog(log, "LZMA " + Lzma)
XDelta = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, "xdelta.exe")
printLog(log, "XDELTA " + XDelta)
printLog(log, "")
if BnpMake == "":
toolLogFail(log, BnpMakeTool, ToolSuffix)
elif PatchGen == "" and not args.bnponly:
toolLogFail(log, PatchGenTool, ToolSuffix)
elif Lzma == "" and not args.bnponly:
toolLogFail(log, "LZMA", ToolSuffix)
elif XDelta == "" and not args.bnponly:
toolLogFail(log, "XDELTA", ToolSuffix)
elif os.path.dirname(Lzma) != os.path.dirname(XDelta):
printLog(log, "FAIL lzma.exe and xdelta.exe must be in the same directory")
else:
mkPath(log, ClientPatchDirectory)
if not args.bnponly:
productXml = ClientPatchDirectory + "/" + ProductName + ".xml"
if not os.path.isfile(productXml):
printLog(log, ">>> Create new product <<<")
subprocess.call([ PatchGen, "createNewProduct", productXml ])
printLog(log, "")
printLog(log, ">>> Rewrite " + ProductName + ".xml <<<") # because we know better.
shutil.move(productXml, productXml + ".old")
oldCfg = open(productXml + ".old", "r")
cfg = open(productXml, "w")
inCategories = 0
for line in oldCfg:
if not inCategories:
if line.strip() == "<_Categories>":
inCategories = 1
cfg.write("\t<_Categories>\n")
for category in InstallClientData:
packExt = ".bnp"
if (category["StreamedPackages"]):
packExt = ".snp"
cfg.write("\t\t<_Category>\n")
cfg.write("\t\t\t<_Name type=\"STRING\" value=\"" + category["Name"] + "\"/>\n")
if category["UnpackTo"] != None:
if category["UnpackTo"] != "":
cfg.write("\t\t\t<_UnpackTo type=\"STRING\" value=\"./" + category["UnpackTo"] + "/\"/>\n")
else:
cfg.write("\t\t\t<_UnpackTo type=\"STRING\" value=\"./\"/>\n")
cfg.write("\t\t\t<_IsOptional type=\"SINT32\" value=\"" + str(category["IsOptional"]) + "\"/>\n")
cfg.write("\t\t\t<_IsIncremental type=\"SINT32\" value=\"" + str(category["IsIncremental"]) + "\"/>\n")
for package in category["Packages"]:
if (len(package[1]) > 0):
cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + package[1][0] + "\"/>\n")
else:
cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + package[0] + packExt + "\"/>\n")
for ref in category["Refs"]:
cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + ref + "_.ref\"/>\n")
cfg.write("\t\t</_Category>\n")
cfg.write("\t</_Categories>\n")
else:
cfg.write(line)
else:
if line.strip() == "</_Categories>":
inCategories = 0
oldCfg.close()
cfg.close()
os.remove(productXml + ".old")
printLog(log, "")
printLog(log, ">>> Make bnp <<<")
targetPath = ClientPatchDirectory + "/bnp"
tagPath = ClientPatchDirectory + "/bnp_tag"
mkPath(log, targetPath)
mkPath(log, tagPath)
for category in InstallClientData:
packExt = ".bnp"
if (category["StreamedPackages"]):
packExt = ".snp"
for package in category["Packages"]:
printLog(log, "PACKAGE " + package[0])
sourcePath = InstallDirectory + "/" + package[0]
mkPath(log, sourcePath)
targetBnp = targetPath + "/" + package[0] + packExt
tagBnp = tagPath + "/" + package[0] + packExt + ".tag"
if (len(package[1]) > 0):
targetBnp = targetPath + "/" + package[1][0]
tagBnp = tagPath + "/" + package[1][0] + ".tag"
printLog(log, "TARGET " + package[1][0])
needUpdateBnp = 1
if (len(package) > 2):
needUpdateBnp = needUpdate(log, sourcePath + "/" + package[2], tagBnp)
else:
needUpdateBnp = needUpdateDirNoSubdirFile(log, sourcePath, tagBnp)
if (needUpdateBnp):
subRet = 0
open(tagBnp, 'a').close()
os.utime(tagBnp, None)
if (category["StreamedPackages"]):
printLog(log, "SNP " + targetBnp)
# cwDir = os.getcwd().replace("\\", "/")
# toolDir = os.path.dirname(Lzma).replace("\\", "/")
# os.chdir(toolDir)
subRet = subprocess.call([ SnpMake, "-p", sourcePath, targetBnp, ClientPatchDirectory + "/stream" ] + package[1][1:])
# os.chdir(cwDir)
else:
printLog(log, "BNP " + targetBnp)
subRet = subprocess.call([ BnpMake, "-p", sourcePath, "-o", targetBnp ] + package[1][1:])
if (subRet != 0):
os.remove(tagBnp)
else:
printLog(log, "SKIP " + targetBnp)
printLog(log, "")
if not args.bnponly:
printLog(log, ">>> Update product <<<")
cwDir = os.getcwd().replace("\\", "/")
toolDir = os.path.dirname(Lzma).replace("\\", "/")
os.chdir(toolDir)
subprocess.call([ PatchGen, "updateProduct", productXml ])
os.chdir(cwDir)
printLog(log, "")
log.close()
if os.path.isfile("d1_client_patch.log"):
os.remove("d1_client_patch.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_client_patch.log")
shutil.move("log.log", "d1_client_patch.log")

@ -0,0 +1,97 @@
#!/usr/bin/python
#
# \file 2_build.py
# \brief Build ai_wmap
# \date 2010-05-24 13:42GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Build ai_wmap
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Build ai_wmap")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
AiBuildWmap = findTool(log, ToolDirectories, AiBuildWmapTool, ToolSuffix)
TgaCut = findTool(log, ToolDirectories, TgaCutTool, ToolSuffix)
if AiBuildWmap == "":
toolLogFail(log, AiBuildWmapTool, ToolSuffix)
if TgaCut == "":
toolLogFail(log, TgaCutTool, ToolSuffix)
else:
printLog(log, ">>> Copy ai_build_wmap.cfg <<<")
cfgPath = ActiveProjectDirectory + "/generated/ai_build_wmap.cfg"
tagPath = ExportBuildDirectory + "/" + AiWmapBuildTagDirectory + "/ai_wmap_build.tag"
shutil.copy(cfgPath, "ai_build_wmap.cfg")
printLog(log, ">>> Check up packed sheets <<<")
subprocess.call([ AiBuildWmap, "checkPackedSheets" ])
printLog(log, ">>> Build ai_wmap <<<")
mkPath(log, ExportBuildDirectory + "/" + RbankOutputBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + AiWmapBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + AiWmapBuildTagDirectory)
if (needUpdate(log, "continents.packed_sheets", tagPath) or needUpdateMultiDirNoSubdirFile(log, ExportBuildDirectory, [ RbankOutputBuildDirectory ] + IgLookupDirectories + PacsPrimLookupDirectories, tagPath)):
printLog(log, ">>> Generate wmap <<<")
subprocess.call([ AiBuildWmap, "pacsCrunch " + AiWmapContinentName ])
printLog(log, ">>> Generate sized wmap <<<")
subprocess.call([ AiBuildWmap, "pacsBuildGabarit " + AiWmapContinentName ])
printLog(log, ">>> Generate cwmaps for each size <<<")
callParallelProcess([ AiBuildWmap, "pacsBuildWmap " + AiWmapContinentName + "_0" ])
callParallelProcess([ AiBuildWmap, "pacsBuildWmap " + AiWmapContinentName + "_1" ])
callParallelProcess([ AiBuildWmap, "pacsBuildWmap " + AiWmapContinentName + "_2" ])
flushParallelProcesses()
printLog(log, ">>> Generate bitmap for each size <<<")
callParallelProcess([ AiBuildWmap, "pacsBuildBitmap " + AiWmapContinentName + "_0" ])
callParallelProcess([ AiBuildWmap, "pacsBuildBitmap " + AiWmapContinentName + "_1" ])
callParallelProcess([ AiBuildWmap, "pacsBuildBitmap " + AiWmapContinentName + "_2" ])
flushParallelProcesses()
printLog(log, ">>> Clear height maps for size 1 and 2 <<<")
subprocess.call([ AiBuildWmap, "pacsClearHeightmap " + AiWmapContinentName ])
printLog(log, ">>> Cut tga for world editor <<<")
subprocess.call([ TgaCut, ExportBuildDirectory + "/" + AiWmapBuildDirectory + "/" + AiWmapContinentName + "_0.tga" ])
moveFilesExtNoTree(log, ".", ExportBuildDirectory + "/" + AiWmapBuildDirectory, ".tga")
printLog(log, ">>> Remove wmap <<<")
removeFilesRecursiveExt(log, ExportBuildDirectory + "/" + AiWmapBuildDirectory, ".wmap")
tagFile = open(tagPath, "w")
tagFile.write(time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())) + "\n")
tagFile.close()
else:
printLog(log, "SKIP *")
printLog(log, "")
log.close()
# end of file

@ -0,0 +1,120 @@
#!/usr/bin/python
#
# \file 0_setup.py
# \brief setup cartographer
# \date 2014-09-13 13:32GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Setup cartographer
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2014 Jan BOON
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Setup cartographer")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Setup build directories
printLog(log, ">>> Setup build directories <<<")
mkPath(log, ExportBuildDirectory + "/" + CartographerBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + CartographerMapBuildDirectory)
# Setup lookup directories
printLog(log, ">>> Setup lookup directories <<<")
mkPath(log, ExportBuildDirectory + "/" + AiWmapBuildDirectory) # IN
mkPath(log, ExportBuildDirectory + "/" + ZoneLightBuildDirectory) # IN (.zonel)
mkPath(log, ExportBuildDirectory + "/" + ZoneLightIgLandBuildDirectory) # IN (.ig)
mkPath(log, ExportBuildDirectory + "/" + SmallbankExportDirectory) # IN
mkPath(log, ExportBuildDirectory + "/" + FarbankBuildDirectory) # IN
mkPath(log, ExportBuildDirectory + "/" + DisplaceExportDirectory) # IN
mkPath(log, ExportBuildDirectory + "/" + TilesExportDirectory) # IN
mkPath(log, LeveldesignDataCommonDirectory) # IN
mkPath(log, LeveldesignDfnDirectory) # IN
mkPath(log, LeveldesignDirectory) # IN
for dir in PropertiesExportBuildSearchPaths:
mkPath(log, ExportBuildDirectory + "/" + dir)
# Setup client directories
printLog(log, ">>> Setup install directories <<<")
mkPath(log, InstallDirectory + "/" + CartographerInstallDirectory)
mkPath(log, InstallDirectory + "/" + IslandsInstallDirectory)
# Setup client directories
printLog(log, ">>> Setup configuration <<<")
mkPath(log, ActiveProjectDirectory + "/generated")
cfg = open(ActiveProjectDirectory + "/generated/island_screenshots.cfg", "w")
cfg.write("\n")
cfg.write("// BUILD CARTOGRAPHER CONFIGURATION\n")
cfg.write("\n")
cfg.write("SearchPaths = {\n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + AiWmapBuildDirectory + "\", \n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + ZoneLightBuildDirectory + "\", \n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + ZoneLightIgLandBuildDirectory + "\", \n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + SmallbankExportDirectory + "\", \n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + FarbankBuildDirectory + "\", \n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + DisplaceExportDirectory + "\", \n")
cfg.write("\t\"" + ExportBuildDirectory + "/" + TilesExportDirectory + "\", \n")
cfg.write("\t\"" + LeveldesignDataCommonDirectory + "\", \n")
cfg.write("\t\"" + LeveldesignDfnDirectory + "\", \n")
cfg.write("\t\"" + LeveldesignDirectory + "\", \n")
for dir in PropertiesExportBuildSearchPaths:
cfg.write("\t\"" + ExportBuildDirectory + "/" + dir + "\", \n")
cfg.write("};\n")
cfg.write("\n")
cfg.write("OutDir = \"" + ExportBuildDirectory + "/" + CartographerBuildDirectory + "\";\n")
cfg.write("\n")
cfg.write("Continents = {\n")
cfg.write("\t\"" + CartographerContinent + "\", \n")
cfg.write("};\n")
cfg.write("\n")
cfg.write("SeasonSuffixes = {\n")
if CartographerSeasonSuffixes:
for suffix in CartographerSeasonSuffixes:
cfg.write("\t\"" + suffix + "\", \n")
else:
for suffix in MultipleTilesPostfix:
cfg.write("\t\"" + suffix + "\", \n")
cfg.write("};\n")
cfg.write("\n")
cfg.write("InverseZTest = true;\n")
cfg.write("Vegetation = true;\n")
cfg.write("MeterPixelSize = 2;\n")
cfg.write("\n")
cfg.write("CompleteIslandsFile = \"" + ExportBuildDirectory + "/" + CartographerBuildDirectory + "/" + IslandsXmlFile + "\";\n")
cfg.write("EntryPointsFile = \"r2_entry_points.txt\";\n")
cfg.write("\n")
cfg.close()
log.close()
# end of file

@ -0,0 +1,63 @@
#!/usr/bin/python
#
# \file 1_export.py
# \brief Export font
# \date 2009-03-10-19-43-GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Export font
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Export font")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
printLog(log, ">>> Export font <<<")
fontExportDir = ExportBuildDirectory + "/" + FontExportDirectory
mkPath(log, fontExportDir)
for dir in FontSourceDirectories:
mkPath(log, DatabaseDirectory + "/" + dir)
copyFilesExtNoTreeIfNeeded(log, DatabaseDirectory + "/" + dir, fontExportDir, ".ttf")
copyFilesExtNoTreeIfNeeded(log, DatabaseDirectory + "/" + dir, fontExportDir, ".otf")
copyFilesExtNoTreeIfNeeded(log, DatabaseDirectory + "/" + dir, fontExportDir, ".afm")
copyFilesExtNoTreeIfNeeded(log, DatabaseDirectory + "/" + dir, fontExportDir, ".pfb")
copyFilesExtNoTreeIfNeeded(log, DatabaseDirectory + "/" + dir, fontExportDir, ".pfm")
printLog(log, "")
log.close()
# end of file

@ -0,0 +1,62 @@
#!/usr/bin/python
#
# \file 3_install.py
# \brief Install font
# \date 2009-03-10-19-43-GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Install font
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite_local import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Install font")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
installPath = InstallDirectory + "/" + FontInstallDirectory
mkPath(log, installPath)
fontExportDir = ExportBuildDirectory + "/" + FontExportDirectory
mkPath(log, fontExportDir)
printLog(log, ">>> Install font <<<")
copyFilesExtNoTreeIfNeeded(log, fontExportDir, installPath, ".ttf")
copyFilesExtNoTreeIfNeeded(log, fontExportDir, installPath, ".otf")
copyFilesExtNoTreeIfNeeded(log, fontExportDir, installPath, ".afm")
copyFilesExtNoTreeIfNeeded(log, fontExportDir, installPath, ".pfb")
copyFilesExtNoTreeIfNeeded(log, fontExportDir, installPath, ".pfm")
printLog(log, "")
log.close()
# end of file

@ -0,0 +1,275 @@
#!/usr/bin/python
#
# \file 2_build.py
# \brief Build ig
# \date 2010-05-24 13:42GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Build ig
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Build ig")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
PrimExport = findTool(log, ToolDirectories, PrimExportTool , ToolSuffix)
IgElevation = findTool(log, ToolDirectories, IgElevationTool, ToolSuffix)
IgAdd = findTool(log, ToolDirectories, IgAddTool, ToolSuffix)
configDir = ActiveProjectDirectory + "/generated"
mkPath(log, configDir)
def igElevation(inputIgDir, outputIgDir):
printLog(log, ">>> IG Elevation <<<")
mkPath(log, inputIgDir)
mkPath(log, outputIgDir)
needUpdateIg = needUpdateDirByTagLog(log, inputIgDir, ".ig", outputIgDir, ".ig")
if needUpdateIg:
printLog(log, "DETECT UPDATE IG->Elevated")
else:
printLog(log, "DETECT SKIP IG->Elevated")
needUpdateHeightMap = needUpdateFileDirNoSubdir(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap1, outputIgDir) or needUpdateFileDirNoSubdir(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap2, outputIgDir)
if needUpdateHeightMap:
printLog(log, "DETECT UPDATE HeightMap->Elevated")
else:
printLog(log, "DETECT SKIP HeightMap->Elevated")
needUpdateLand = needUpdateFileDirNoSubdir(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportLand, outputIgDir)
if needUpdateLand:
printLog(log, "DETECT UPDATE Land->Elevated")
else:
printLog(log, "DETECT SKIP Land->Elevated")
if needUpdateIg or needUpdateHeightMap or needUpdateLand:
printLog(log, "DETECT DECIDE UPDATE")
mkPath(log, inputIgDir)
mkPath(log, outputIgDir)
mkPath(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory)
configFile = configDir + "/ig_elevation.cfg"
if os.path.isfile(configFile):
os.remove(configFile)
printLog(log, "CONFIG " + configFile)
cf = open(configFile, "w")
cf.write("// ig_elevation.cfg\n")
cf.write("\n")
cf.write("InputIGDir = \"" + inputIgDir + "\";\n")
cf.write("OutputIGDir = \"" + outputIgDir + "\";\n")
cf.write("\n")
cf.write("CellSize = 160.0;")
cf.write("\n")
cf.write("HeightMapFile1 = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap1 + "\";\n")
cf.write("ZFactor1 = " + LigoExportZFactor1 + ";\n")
cf.write("HeightMapFile2 = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap2 + "\";\n")
cf.write("ZFactor2 = " + LigoExportZFactor2 + ";\n")
cf.write("ExtendCoords = " + str(LigoExportExtendCoords) + ";\n")
cf.write("\n")
cf.write("LandFile = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportLand + "\";\n")
cf.write("\n")
cf.close()
subprocess.call([ IgElevation, configFile ])
os.remove(configFile)
# Copy remaining IG files
#BUG:copyFilesLogless(log, inputIgDir, outputIgDir)
else:
printLog(log, "DETECT DECIDE SKIP")
printLog(log, "SKIP *")
# Build process
if (ContinentLeveldesignWorldDirectory != "") or (len(IgOtherSourceDirectories) > 0):
printLog(log, ">>> Prim IG: ON <<<")
configFile = configDir + "/prim_export.cfg"
if os.path.isfile(configFile):
os.remove(configFile)
outIgDir = ExportBuildDirectory + "/" + IgElevLandPrimBuildDirectory
mkPath(log, outIgDir)
zoneWDir = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory
mkPath(log, zoneWDir)
smallBank = DatabaseDirectory + "/" + TileRootSourceDirectory + "/" + BankTileBankName + ".bank"
farBank = ExportBuildDirectory + "/" + FarbankBuildDirectory + "/" + BankTileBankName + MultipleTilesPostfix[0] + ".farbank"
displaceDir = DatabaseDirectory + "/" + DisplaceSourceDirectory
continentDir = LeveldesignWorldDirectory + "/" + ContinentLeveldesignWorldDirectory
mkPath(log, continentDir)
formDir = LeveldesignDirectory
mkPath(log, LeveldesignDirectory)
worldEditorFiles = WorldEditorFilesDirectory
mkPath(log, WorldEditorFilesDirectory)
printLog(log, "CONFIG " + configFile)
cf = open(configFile, "w")
cf.write("// prim_export.cfg\n")
cf.write("\n")
cf.write("OutIGDir = \"" + outIgDir + "\";\n")
cf.write("ZoneWDir = \"" + zoneWDir + "\";\n")
cf.write("\n")
cf.write("SmallBank = \"" + smallBank + "\";\n")
cf.write("FarBank = \"" + farBank + "\";\n")
cf.write("DisplaceDir = \"" + displaceDir + "\";\n")
cf.write("\n")
cf.write("CellSize = 160.0;")
cf.write("\n")
cf.write("PrimDirs = {\n")
cf.write("\t\"" + continentDir + "\", \n")
for dir in IgPrimitiveSourceDirectories:
mkPath(log, DatabaseDirectory + "/" + dir)
cf.write("\t\"" + DatabaseDirectory + "/" + dir + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.write("FormDir = \"" + formDir + "\";\n")
cf.write("WorldEditorFiles = \"" + worldEditorFiles + "\";\n")
cf.write("\n")
cf.close()
subprocess.call([ PrimExport, configFile ])
os.remove(configFile)
igElevation(ExportBuildDirectory + "/" + LigoIgLandBuildDirectory, ExportBuildDirectory + "/" + IgElevLandLigoBuildDirectory)
igElevation(ExportBuildDirectory + "/" + IgStaticLandExportDirectory, ExportBuildDirectory + "/" + IgElevLandStaticBuildDirectory)
printLog(log, ">>> Merge land IGs <<<")
mkPath(log, ExportBuildDirectory + "/" + IgTempLandMergeBuildDirectory)
removeFilesRecursive(log, ExportBuildDirectory + "/" + IgTempLandMergeBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + IgLandBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + IgElevLandPrimBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + IgElevLandLigoBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + IgElevLandStaticBuildDirectory)
igFilesPrim = findFiles(log, ExportBuildDirectory + "/" + IgElevLandPrimBuildDirectory, "", ".ig")
igFilesLigo = findFiles(log, ExportBuildDirectory + "/" + IgElevLandLigoBuildDirectory, "", ".ig")
igFilesStatic = findFiles(log, ExportBuildDirectory + "/" + IgElevLandStaticBuildDirectory, "", ".ig")
igFilesAll = [ ]
for igFile in igFilesPrim:
if not igFile in igFilesAll:
igFilesAll += [ igFile ]
for igFile in igFilesLigo:
if not igFile in igFilesAll:
igFilesAll += [ igFile ]
for igFile in igFilesStatic:
if not igFile in igFilesAll:
igFilesAll += [ igFile ]
igFilesAll.sort()
for igFile in igFilesAll:
primIgFile = ExportBuildDirectory + "/" + IgElevLandPrimBuildDirectory + "/" + igFile
ligoIgFile = ExportBuildDirectory + "/" + IgElevLandLigoBuildDirectory + "/" + igFile
staticIgFile = ExportBuildDirectory + "/" + IgElevLandStaticBuildDirectory + "/" + igFile
tempIgFile = ExportBuildDirectory + "/" + IgTempLandMergeBuildDirectory + "/" + igFile
outIgFile = ExportBuildDirectory + "/" + IgLandBuildDirectory + "/" + igFile
activeFile = ""
needsUpdate = 0
sourceTools = ""
if igFile in igFilesPrim:
if needUpdate(log, primIgFile, outIgFile):
needsUpdate = 1
if not needsUpdate == 1 and igFile in igFilesLigo:
if needUpdate(log, ligoIgFile, outIgFile):
needsUpdate = 1
if not needsUpdate == 1 and igFile in igFilesStatic:
if needUpdate(log, staticIgFile, outIgFile):
needsUpdate = 1
if needsUpdate == 1:
if os.path.isfile(outIgFile):
os.remove(outIgFile)
if igFile in igFilesPrim:
sourceTools += " [Prim]"
activeFile = primIgFile
if igFile in igFilesLigo:
if activeFile == "":
activeFile = ligoIgFile
else:
sourceTools += " [Ligo]"
subprocess.call([ IgAdd, tempIgFile, ligoIgFile, activeFile ])
activeFile = tempIgFile
if igFile in igFilesStatic:
if activeFile == "":
activeFile = staticIgFile
else:
sourceTools += " [Static]"
subprocess.call([ IgAdd, outIgFile, staticIgFile, activeFile ])
activeFile = outIgFile
else:
shutil.copy(activeFile, outIgFile)
printLog(log, "MERGE " + igFile + sourceTools)
else:
printLog(log, "SKIP " + igFile)
# Remove temporary land IGs
printLog(log, ">>> Remove temporary land IGs <<<")
mkPath(log, ExportBuildDirectory + "/" + IgTempLandMergeBuildDirectory)
removeFilesRecursive(log, ExportBuildDirectory + "/" + IgTempLandMergeBuildDirectory)
# Remove outdated land IGs
printLog(log, ">>> Remove outdated land IGs <<<")
igFilesOut = findFiles(log, ExportBuildDirectory + "/" + IgLandBuildDirectory, "", ".ig")
for igFile in igFilesOut:
if not igFile in igFilesAll:
printLog(log, "RM " + ExportBuildDirectory + "/" + IgLandBuildDirectory + "/" + igFile)
os.remove(ExportBuildDirectory + "/" + IgLandBuildDirectory + "/" + igFile)
# Verify land IGs
printLog(log, ">>> Verify land IGs <<<")
for igFile in igFilesAll:
if not igFile in igFilesOut:
printLog(log, "MISSING " + igFile)
# Write land IGs TXT
printLog(log, ">>> Write land IGs TXT <<<")
igTxtFile = ExportBuildDirectory + "/" + IgLandBuildDirectory + "/" + LandscapeName + "_ig.txt"
if needUpdateDirNoSubdirFile(log, ExportBuildDirectory + "/" + IgLandBuildDirectory, igTxtFile):
printLog(log, "WRITE " + ExportBuildDirectory + "/" + IgLandBuildDirectory + "/" + LandscapeName + "_ig.txt")
if os.path.isfile(igTxtFile):
os.remove(igTxtFile)
igTxt = open(igTxtFile, "w")
for igFile in igFilesAll:
igTxt.write(igFile + "\n")
igTxt.close()
else:
printLog(log, "SKIP *")
# Merge other IGs
printLog(log, ">>> Merge other IGs <<<") # (not true merge, since not necesserary)
mkPath(log, ExportBuildDirectory + "/" + IgStaticOtherExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoIgOtherBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + IgOtherBuildDirectory)
# copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + IgStaticOtherExportDirectory, ExportBuildDirectory + "/" + IgOtherBuildDirectory, ".ig")
igElevation(ExportBuildDirectory + "/" + IgStaticOtherExportDirectory, ExportBuildDirectory + "/" + IgOtherBuildDirectory)
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + LigoIgOtherBuildDirectory, ExportBuildDirectory + "/" + IgOtherBuildDirectory, ".ig")
log.close()
# end of file

@ -0,0 +1,121 @@
#!/usr/bin/python
#
# \file 0_setup.py
# \brief setup ligo
# \date 2010-05-24 08:13GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Setup ligo
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Setup ligo")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Setup source directories
printLog(log, ">>> Setup source directories <<<")
mkPath(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory)
mkPath(log, DatabaseDirectory + "/" + LigoMaxSourceDirectory)
mkPath(log, DatabaseDirectory + "/" + ZoneSourceDirectory[0])
# Setup export directories
printLog(log, ">>> Setup export directories <<<")
mkPath(log, ExportBuildDirectory + "/" + SmallbankExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoEcosystemExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoEcosystemIgExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoEcosystemZoneExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoEcosystemZoneLigoExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoEcosystemCmbExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoEcosystemTagExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
# Setup build directories
printLog(log, ">>> Setup build directories <<<")
if LigoExportLand != "":
mkPath(log, ExportBuildDirectory + "/" + LigoZoneBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoIgLandBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + LigoIgOtherBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + RBankCmbExportDirectory)
# Setup client directories
printLog(log, ">>> Setup client directories <<<")
# Setup land exporter cfg
if LigoExportLand != "":
printLog(log, ">>> Setup land exporter cfg <<<")
mkPath(log, ActiveProjectDirectory + "/generated")
cf = open(ActiveProjectDirectory + "/generated/land_exporter.cfg", "w")
cf.write("\n")
cf.write("// Ligo settings\n")
cf.write("\n")
cf.write("OutZoneDir = \"" + ExportBuildDirectory + "/" + LigoZoneBuildDirectory + "\";\n")
cf.write("OutIGDir = \"" + ExportBuildDirectory + "/" + LigoIgLandBuildDirectory + "\";\n")
cf.write("AdditionnalIGOutDir = \"" + ExportBuildDirectory + "/" + LigoIgOtherBuildDirectory + "\";\n")
cf.write("\n")
cf.write("RefZoneDir = \"" + ExportBuildDirectory + "/" + LigoEcosystemZoneExportDirectory+ "\";\n") # FIXME
cf.write("RefIGDir = \"" + ExportBuildDirectory + "/" + LigoEcosystemIgExportDirectory + "\";\n")
cf.write("AdditionnalIGInDir = \"" + ExportBuildDirectory + "/" + LigoEcosystemIgExportDirectory + "\";\n") # FIXME
cf.write("ContinentsDir = \"" + LeveldesignWorldDirectory + "\";\n")
cf.write("LigoBankDir = \"" + ExportBuildDirectory + "/" + LigoEcosystemZoneLigoExportDirectory + "\";\n") # FIXME
cf.write("\n")
cf.write("TileBankFile = \"" + DatabaseDirectory + "/" + LigoTileBankFile + "\";\n")
cf.write("\n")
cf.write("ColorMapFile = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportColormap + "\";\n")
cf.write("HeightMapFile1 = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap1 + "\";\n")
cf.write("ZFactor1 = " + LigoExportZFactor1 + ";\n")
cf.write("HeightMapFile2 = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap2 + "\";\n")
cf.write("ZFactor2 = " + LigoExportZFactor2 + ";\n")
cf.write("ExtendCoords = " + str(LigoExportExtendCoords) + ";\n")
cf.write("\n")
cf.write("ZoneLight = 0;\n")
cf.write("CellSize = 160;\n")
cf.write("Threshold = 1;\n")
cf.write("\n")
cf.write("DFNDir = \"" + LeveldesignDfnDirectory + "\";\n")
cf.write("RefCMBDir = \"" + ExportBuildDirectory + "/" + LigoEcosystemCmbExportDirectory + "\";\n") # FIXME
cf.write("OutCMBDir = \"" + ExportBuildDirectory + "/" + RBankCmbExportDirectory + "\";\n")
cf.write("\n")
cf.write("ContinentFile = \"" + LeveldesignWorldDirectory + "/" + ContinentFile + "\";\n")
cf.write("\n")
cf.write("ExportCollisions = 1;\n")
cf.write("ExportAdditionnalIGs = 1;\n")
cf.write("\n")
cf.write("ZoneRegionFile = \"" + DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportLand + "\";\n")
cf.write("\n")
cf.close()
log.close()
# end of file

@ -0,0 +1,339 @@
#!/usr/bin/python
#
# \file 2_build.py
# \brief Build rbank
# \date 2009-03-10-22-43-GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Build rbank
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Build rbank")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
BuildIgBoxes = findTool(log, ToolDirectories, BuildIgBoxesTool, ToolSuffix)
ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
BuildRbank = findTool(log, ToolDirectories, BuildRbankTool, ToolSuffix)
GetNeighbors = findTool(log, ToolDirectories, GetNeighborsTool, ToolSuffix)
BuildIndoorRbank = findTool(log, ToolDirectories, BuildIndoorRbankTool, ToolSuffix)
# AiBuildWmap = findTool(log, ToolDirectories, AiBuildWmapTool, ToolSuffix)
printLog(log, "")
# Build rbank bbox
printLog(log, ">>> Build rbank bbox <<<")
tempBbox = ExportBuildDirectory + "/" + RbankBboxBuildDirectory + "/temp.bbox"
rebuiltBbox = False
if BuildIgBoxes == "":
toolLogFail(log, BuildIgBoxesTool, ToolSuffix)
else:
mkPath(log, ExportBuildDirectory + "/" + RbankBboxBuildDirectory)
needUpdateIg = needUpdateMultiDirNoSubdirFile(log, ExportBuildDirectory, IgLookupDirectories, tempBbox)
if needUpdateIg:
printLog(log, "DETECT UPDATE IG->Bbox")
else:
printLog(log, "DETECT SKIP IG->Bbox")
needUpdateShape = needUpdateMultiDirNoSubdirFile(log, ExportBuildDirectory, ShapeLookupDirectories, tempBbox)
if needUpdateShape:
printLog(log, "DETECT UPDATE Shape->Bbox")
else:
printLog(log, "DETECT SKIP Shape->Bbox")
if needUpdateIg or needUpdateShape:
rebuiltBbox = True
printLog(log, "DETECT DECIDE UPDATE")
cf = open("build_ig_boxes.cfg", "w")
cf.write("\n")
cf.write("Pathes = {\n")
for dir in IgLookupDirectories:
mkPath(log, ExportBuildDirectory + "/" + dir)
cf.write("\t\"" + ExportBuildDirectory + "/" + dir + "\", \n")
for dir in ShapeLookupDirectories:
mkPath(log, ExportBuildDirectory + "/" + dir)
cf.write("\t\"" + ExportBuildDirectory + "/" + dir + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.write("IGs = {\n")
for dir in IgLookupDirectories:
files = findFiles(log, ExportBuildDirectory + "/" + dir, "", ".ig")
for file in files:
cf.write("\t\"" + os.path.basename(file)[0:-len(".ig")] + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.write("Output = \"" + tempBbox + "\";\n")
cf.write("\n")
cf.close()
subprocess.call([ BuildIgBoxes ])
os.remove("build_ig_boxes.cfg")
else:
printLog(log, "DETECT DECIDE SKIP")
printLog(log, "SKIP *")
printLog(log, "")
printLog(log, ">>> Build rbank build config <<<")
cf = open("build_rbank.cfg", "w")
cf.write("\n")
cf.write("// Rbank settings\n")
cf.write("\n")
cf.write("Verbose = " + str(RBankVerbose) + ";\n")
cf.write("CheckConsistency = " + str(RBankConsistencyCheck) + ";\n")
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
cf.write("ZonePath = \"" + ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/\";\n")
mkPath(log, ExportBuildDirectory + "/" + SmallbankExportDirectory)
cf.write("BanksPath = \"" + ExportBuildDirectory + "/" + SmallbankExportDirectory + "/\";\n")
cf.write("Bank = \"" + ExportBuildDirectory + "/" + SmallbankExportDirectory + "/" + BankTileBankName + ".smallbank\";\n")
cf.write("ZoneExt = \".zonew\";\n")
cf.write("ZoneNHExt = \".zonenhw\";\n")
cf.write("IGBoxes = \"" + tempBbox + "\";\n")
mkPath(log, LeveldesignWorldDirectory)
cf.write("LevelDesignWorldPath = \"" + LeveldesignWorldDirectory + "\";\n")
mkPath(log, ExportBuildDirectory + "/" + IgLandBuildDirectory)
cf.write("IgLandPath = \"" + ExportBuildDirectory + "/" + IgLandBuildDirectory + "\";\n")
mkPath(log, ExportBuildDirectory + "/" + IgOtherBuildDirectory)
cf.write("IgVillagePath = \"" + ExportBuildDirectory + "/" + IgOtherBuildDirectory + "\";\n")
cf.write("\n")
mkPath(log, ExportBuildDirectory + "/" + RbankTessellationBuildDirectory)
cf.write("TessellationPath = \"" + ExportBuildDirectory + "/" + RbankTessellationBuildDirectory + "/\";\n")
cf.write("TessellateLevel = " + str(BuildQuality) + ";\n") # BuildQuality
cf.write("\n")
cf.write("WaterThreshold = 1.0;\n")
cf.write("\n")
cf.write("OutputRootPath = \"" + ExportBuildDirectory + "/\";\n")
mkPath(log, ExportBuildDirectory + "/" + RbankSmoothBuildDirectory)
cf.write("SmoothDirectory = \"" + RbankSmoothBuildDirectory + "/\";\n")
mkPath(log, ExportBuildDirectory + "/" + RbankRawBuildDirectory)
cf.write("RawDirectory = \"" + RbankRawBuildDirectory + "/\";\n")
cf.write("\n")
cf.write("ReduceSurfaces = " + str(RbankReduceSurfaces) + ";\n")
cf.write("SmoothBorders = " + str(RbankSmoothBorders) + ";\n")
cf.write("\n")
cf.write("ComputeElevation = " + str(RbankComputeElevation) + ";\n")
cf.write("ComputeLevels = " + str(RbankComputeLevels) + ";\n")
cf.write("\n")
cf.write("LinkElements = " + str(RbankLinkElements) + ";\n")
cf.write("\n")
cf.write("CutEdges = " + str(RbankCutEdges) + ";\n")
cf.write("\n")
cf.write("UseZoneSquare = " + str(RbankUseZoneSquare) + ";\n")
cf.write("\n")
cf.write("// The whole landscape\n")
cf.write("ZoneUL = \"" + RbankZoneUl + "\";\n")
cf.write("ZoneDR = \"" + RbankZoneDr + "\";\n")
cf.write("\n")
mkPath(log, ExportBuildDirectory + "/" + RbankPreprocBuildDirectory)
cf.write("PreprocessDirectory = \"" + ExportBuildDirectory + "/" + RbankPreprocBuildDirectory + "/\";\n")
cf.write("\n")
cf.write("// The global retriever processing settings\n")
cf.write("GlobalRetriever = \"temp.gr\";\n")
cf.write("RetrieverBank = \"temp.rbank\";\n")
cf.write("\n")
cf.write("GlobalUL = \"" + RbankZoneUl + "\";\n")
cf.write("GlobalDR = \"" + RbankZoneDr + "\";\n")
cf.write("\n")
cf.write("// Which kind of stuff to do\n")
cf.write("TessellateZones = 0;\n")
cf.write("MoulineZones = 0;\n")
cf.write("ProcessRetrievers = 0;\n")
cf.write("ProcessGlobal = 0;\n")
cf.write("\n")
cf.write("Zones = {\n")
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
files = findFiles(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory, "", ".zonew")
for file in files:
cf.write("\t\"" + os.path.basename(file) + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.write("Pathes = {\n")
mkPath(log, WorldEditorFilesDirectory);
cf.write("\t\"" + WorldEditorFilesDirectory + "\", \n");
for dir in IgLookupDirectories:
mkPath(log, ExportBuildDirectory + "/" + dir)
cf.write("\t\"" + ExportBuildDirectory + "/" + dir + "\", \n")
for dir in ShapeLookupDirectories:
mkPath(log, ExportBuildDirectory + "/" + dir)
cf.write("\t\"" + ExportBuildDirectory + "/" + dir + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.close()
printLog(log, "")
printLog(log, ">>> Build rbank check prims <<<")
if BuildRbank == "":
toolLogFail(log, BuildRbankTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
subprocess.call([ ExecTimeout, str(RbankBuildTesselTimeout), BuildRbank, "-C", "-p", "-g" ])
printLog(log, "")
printLog(log, ">>> Build rbank process all passes <<<")
if BuildRbank == "":
toolLogFail(log, BuildRbankTool, ToolSuffix)
if GetNeighbors == "":
toolLogFail(log, GetNeighborsTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
zonefiles = findFiles(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory, "", ".zonew")
zonesToBuild = []
for zonefile in zonefiles:
zone = os.path.basename(zonefile)[0:-len(".zonew")]
lr1 = ExportBuildDirectory + "/" + RbankSmoothBuildDirectory + "/" + zone + ".lr"
nearzones = subprocess.Popen([ GetNeighbors, zone ], stdout = subprocess.PIPE).communicate()[0].strip().split(" ")
printLog(log, "ZONE " + zone + ": " + str(nearzones))
zoneToBuild = 0
for nearzone in nearzones:
sourcePath = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + nearzone + ".zonew"
if (os.path.isfile(sourcePath)):
if (rebuiltBbox or needUpdate(log, sourcePath, lr1)):
zoneToBuild = 1
zonesToBuild.append(os.path.basename(zonefile))
sourcePath = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + zone + ".zonew"
if zoneToBuild:
printLog(log, sourcePath + " -> " + lr1)
# subprocess.call([ ExecTimeout, str(RbankBuildTesselTimeout), BuildRbank, "-c", "-P", "-g", os.path.basename(zonefile) ])
else:
printLog(log, "SKIP " + lr1)
while len(zonesToBuild) > 0:
processCommand = [ ExecTimeout, str(RbankBuildTesselTimeout), BuildRbank, "-c", "-P", "-g" ]
processCommand.extend(zonesToBuild[:min(len(zonesToBuild), 64)])
if len(zonesToBuild) > 64:
zonesToBuild = zonesToBuild[64:]
else:
zonesToBuild = []
print processCommand
callParallelProcess(processCommand)
flushParallelProcesses()
printLog(log, "")
printLog(log, ">>> Detect modifications to rebuild lr <<<")
needUpdateCmbLr = needUpdateDirByTagLog(log, ExportBuildDirectory + "/" + RBankCmbExportDirectory, ".cmb", ExportBuildDirectory + "/" + RbankRetrieversBuildDirectory, ".lr")
if needUpdateCmbLr:
printLog(log, "DETECT UPDATE Cmb->Lr")
else:
printLog(log, "DETECT SKIP Cmb->Lr")
needUpdateCmbRbank = needUpdateDirNoSubdirFile(log, ExportBuildDirectory + "/" + RBankCmbExportDirectory, ExportBuildDirectory + "/" + RbankOutputBuildDirectory + "/" + RbankRbankName + ".rbank")
if needUpdateCmbRbank:
printLog(log, "DETECT UPDATE Cmb->Rbank")
else:
printLog(log, "DETECT SKIP Cmb->Rbank")
needUpdateLrRbank = needUpdateDirNoSubdirFile(log, ExportBuildDirectory + "/" + RbankSmoothBuildDirectory, ExportBuildDirectory + "/" + RbankOutputBuildDirectory + "/" + RbankRbankName + ".rbank")
if needUpdateLrRbank:
printLog(log, "DETECT UPDATE Lr->Rbank")
else:
printLog(log, "DETECT SKIP Lr->Rbank")
needUpdateBboxRbank = needUpdate(log, tempBbox, ExportBuildDirectory + "/" + RbankOutputBuildDirectory + "/" + RbankRbankName + ".rbank")
if needUpdateBboxRbank:
printLog(log, "DETECT UPDATE Lr->Rbank")
else:
printLog(log, "DETECT SKIP Lr->Rbank")
if rebuiltBbox or needUpdateCmbLr or needUpdateCmbRbank or needUpdateLrRbank or needUpdateBboxRbank:
printLog(log, "DETECT DECIDE UPDATE")
printLog(log, ">>> Build rbank process global <<<") # This generates temp lr files. TODO: Check if the LR changed?
if BuildRbank == "":
toolLogFail(log, BuildRbankTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
subprocess.call([ ExecTimeout, str(RbankBuildProcglobalTimeout), BuildRbank, "-c", "-P", "-G" ])
printLog(log, "")
os.remove("build_rbank.cfg")
printLog(log, ">>> Build rbank indoor <<<") # This generates the retrievers for the ig that have the cmb export
if BuildIndoorRbank == "":
toolLogFail(log, BuildIndoorRbankTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
retrieversDir = ExportBuildDirectory + "/" + RbankRetrieversBuildDirectory
mkPath(log, retrieversDir)
removeFilesRecursiveExt(log, retrieversDir, ".rbank")
removeFilesRecursiveExt(log, retrieversDir, ".gr")
removeFilesRecursiveExt(log, retrieversDir, ".lr")
cf = open("build_indoor_rbank.cfg", "w")
cf.write("\n")
mkPath(log, ExportBuildDirectory + "/" + RBankCmbExportDirectory)
cf.write("MeshPath = \"" + ExportBuildDirectory + "/" + RBankCmbExportDirectory + "/\";\n")
# cf.write("Meshes = { };\n")
cf.write("Meshes = \n")
cf.write("{\n")
meshFiles = findFilesNoSubdir(log, ExportBuildDirectory + "/" + RBankCmbExportDirectory, ".cmb")
lenCmbExt = len(".cmb")
for file in meshFiles:
cf.write("\t\"" + file[0:-lenCmbExt] + "\", \n")
cf.write("};\n")
cf.write("OutputPath = \"" + retrieversDir + "/\";\n")
# mkPath(log, ExportBuildDirectory + "/" + RbankOutputBuildDirectory)
# cf.write("OutputPath = \"" + ExportBuildDirectory + "/" + RbankOutputBuildDirectory + "/\";\n")
cf.write("OutputPrefix = \"unused\";\n")
cf.write("Merge = 1;\n")
mkPath(log, ExportBuildDirectory + "/" + RbankSmoothBuildDirectory)
cf.write("MergePath = \"" + ExportBuildDirectory + "/" + RbankSmoothBuildDirectory + "/\";\n")
cf.write("MergeInputPrefix = \"temp\";\n")
cf.write("MergeOutputPrefix = \"tempMerged\";\n")
# cf.write("MergeOutputPrefix = \"" + RbankRbankName + "\";\n")
cf.write("AddToRetriever = 1;\n")
cf.write("\n")
cf.close()
subprocess.call([ ExecTimeout, str(RbankBuildIndoorTimeout), BuildIndoorRbank ])
os.remove("build_indoor_rbank.cfg")
printLog(log, "")
retrieversDir = ExportBuildDirectory + "/" + RbankRetrieversBuildDirectory
mkPath(log, retrieversDir)
outputDir = ExportBuildDirectory + "/" + RbankOutputBuildDirectory
mkPath(log, outputDir)
printLog(log, ">>> Move gr, rbank and lr <<<") # This simply renames everything
if needUpdateDirNoSubdir(log, retrieversDir, outputDir):
removeFilesRecursiveExt(log, outputDir, ".rbank")
removeFilesRecursiveExt(log, outputDir, ".gr")
removeFilesRecursiveExt(log, outputDir, ".lr")
copyFilesRenamePrefixExt(log, retrieversDir, outputDir, "tempMerged", RbankRbankName, ".rbank")
copyFilesRenamePrefixExt(log, retrieversDir, outputDir, "tempMerged", RbankRbankName, ".gr")
copyFilesRenamePrefixExt(log, retrieversDir, outputDir, "tempMerged_", RbankRbankName + "_", ".lr")
else:
printLog(log, "SKIP *")
else:
printLog(log, "DETECT DECIDE SKIP")
printLog(log, "SKIP *")
# Remove pacs.packed_prims when done
if os.path.isfile("pacs.packed_prims"):
os.remove("pacs.packed_prims")
log.close()
# end of file

@ -0,0 +1,198 @@
#!/usr/bin/python
#
# \file 2_build.py
# \brief Build shape
# \date 2010-05-24 13:42GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Build shape
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Build shape")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
BuildShadowSkin = findTool(log, ToolDirectories, BuildShadowSkinTool, ToolSuffix)
BuildClodtex = findTool(log, ToolDirectories, BuildClodtexTool, ToolSuffix)
LightmapOptimizer = findTool(log, ToolDirectories, LightmapOptimizerTool, ToolSuffix)
TgaToDds = findTool(log, ToolDirectories, TgaToDdsTool, ToolSuffix)
BuildCoarseMesh = findTool(log, ToolDirectories, BuildCoarseMeshTool, ToolSuffix)
shapeDirectory = ExportBuildDirectory + "/" + ShapeNotOptimizedExportDirectory
if BuildShadowSkinEnabled:
mkPath(log, shapeDirectory)
shadowSkinBuildDirectory = ExportBuildDirectory + "/" + ShapeShadowSkinBuildDirectory
printLog(log, ">>> BuildShadowSkin <<<")
shadowSkinShapes = findFilesNoSubdir(log, shapeDirectory, ".shape")
for shadowSkinShape in shadowSkinShapes:
srcShape = shapeDirectory + "/" + shadowSkinShape
dstShape = shadowSkinBuildDirectory + "/" + shadowSkinShape
if needUpdateLogRemoveDest(log, srcShape, dstShape):
subprocess.call([ BuildShadowSkin, srcShape, dstShape, str(BuildShadowSkinRatio), str(BuildShadowSkinMaxface) ])
shapeDirectory = shadowSkinBuildDirectory
mkPath(log, shapeDirectory)
mkPath(log, ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory)
if ClodConfigFile != "":
mkPath(log, ExportBuildDirectory + "/" + ClodExportDirectory)
printLog(log, ">>> Build CLodTex <<<")
subprocess.call([ BuildClodtex, "-d", DatabaseDirectory + "/" + ClodConfigFile, ExportBuildDirectory + "/" + ClodExportDirectory, shapeDirectory, ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory ])
else:
printLog(log, ">>> Copy Shape <<<")
copyFilesExtNoTreeIfNeeded(log, shapeDirectory, ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory, ".shape")
printLog(log, ">>> Copy non-ShadowSkin non-CLodTex Shape <<<")
shapeDirectory = ExportBuildDirectory + "/" + ShapeNotOptimizedExportDirectory
mkPath(log, shapeDirectory)
mkPath(log, ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory)
copyFilesExtNoTreeIfNeeded(log, shapeDirectory, ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory, ".shape")
shapeDirectory = ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory
# copy lightmap_not_optimized to lightmap
printLog(log, ">>> Optimize lightmaps <<<")
loPathLightmapsOriginal = ExportBuildDirectory + "/" + ShapeLightmapNotOptimizedExportDirectory
loPathShapesOriginal = ExportBuildDirectory + "/" + ShapeClodtexBuildDirectory
mkPath(log, loPathLightmapsOriginal)
loPathLightmaps = ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory
loPathShapes = ExportBuildDirectory + "/" + ShapeOptimizedBuildDirectory
loPathTags = ExportBuildDirectory + "/" + ShapeTagExportDirectory
mkPath(log, loPathLightmaps)
mkPath(log, loPathShapes)
mkPath(log, loPathTags)
if needUpdateDirByTagLog(log, loPathLightmapsOriginal, ".txt", loPathLightmaps, ".txt") or needUpdateDirNoSubdir(log, loPathLightmapsOriginal, loPathLightmaps) or needUpdateDirNoSubdir(log, loPathShapesOriginal, loPathShapes) or needUpdateDirNoSubdir(log, loPathShapes, loPathLightmaps) or needUpdateDirNoSubdir(log, loPathTags, loPathLightmaps):
removeFilesRecursive(log, loPathLightmaps)
copyFiles(log, loPathLightmapsOriginal, loPathLightmaps)
removeFilesRecursive(log, loPathShapes)
copyFiles(log, loPathShapesOriginal, loPathShapes)
# Optimize lightmaps if any. Additionnaly, output a file indicating which lightmaps are 8 bits
# lightmap_optimizer <path_lightmaps> <path_shapes> [path_tags] [path_flag8bit]
subprocess.call([ LightmapOptimizer, loPathLightmaps, loPathShapes, loPathTags, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory + "/list_lm_8bit.txt" ])
else:
printLog(log, "SKIP *")
# Convert lightmap in 16 bits mode if they are not 8 bits lightmap
printLog(log, ">>> Convert lightmaps in 16 or 8 bits <<<")
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory)
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmap16BitsBuildDirectory)
lightMapTgas = findFilesNoSubdir(log, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory, ".tga")
listLm8Bit = [ ]
listLm8BitFile = open(ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory + "/list_lm_8bit.txt", "r")
for line in listLm8BitFile:
lineStrip = line.strip()
if (len(lineStrip) > 0):
listLm8Bit += [ lineStrip ]
for lightMapTga in lightMapTgas:
srcTga = ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory + "/" + lightMapTga
dstTga = ExportBuildDirectory + "/" + ShapeLightmap16BitsBuildDirectory + "/" + lightMapTga
if needUpdateLogRemoveDest(log, srcTga, dstTga):
if lightMapTga in listLm8Bit: # THIS MAY NOT WORK, PLEASE VERIFY CONTENTS OF list_lm_8bit.txt!!!
subprocess.call([ TgaToDds, srcTga, "-o", dstTga, "-a", "tga8" ])
else:
subprocess.call([ TgaToDds, srcTga, "-o", dstTga, "-a", "tga16" ])
# Corse meshes for this process ?
if len(CoarseMeshTextureNames) > 0:
printLog(log, ">>> Build coarse meshes <<<")
shapeWithCoarseMesh = ExportBuildDirectory + "/" + ShapeWithCoarseMeshExportDirectory
mkPath(log, shapeWithCoarseMesh)
shapeWithCoarseMeshBuilded = ExportBuildDirectory + "/" + ShapeWithCoarseMeshBuildDirectory
mkPath(log, shapeWithCoarseMeshBuilded)
# This builds from shapeWithCoarseMesh .shape to shapeWithCoarseMesh .tga
# And from shapeWithCoarseMesh .shape to shapeWithCoarseMeshBuilded .shape
# Then builds from shapeWithCoarseMesh .tga to shapeWithCoarseMeshBuilded .tga
# Depends on MapLookupDirectories
needUpdateMaps = needUpdateMultiDirNoSubdirMultiFileExt(log, ExportBuildDirectory, MapLookupDirectories, shapeWithCoarseMesh, CoarseMeshTextureNames, ".tga") or needUpdateMultiDirNoSubdir(log, ExportBuildDirectory, MapLookupDirectories, shapeWithCoarseMeshBuilded)
if needUpdateMaps:
printLog(log, "DETECT UPDATE Maps->*")
else:
printLog(log, "DETECT SKIP Maps->*")
needUpdateShapeShape = needUpdateDirByTagLog(log, shapeWithCoarseMesh, ".shape", shapeWithCoarseMeshBuilded, ".shape")
if needUpdateShapeShape:
printLog(log, "DETECT UPDATE Shape->Shape")
else:
printLog(log, "DETECT SKIP Shape->Shape")
needUpdateShapeCoarse = needUpdateDirNoSubdirExtMultiFileExt(log, shapeWithCoarseMesh, ".shape", shapeWithCoarseMesh, CoarseMeshTextureNames, ".tga")
if needUpdateShapeCoarse:
printLog(log, "DETECT UPDATE Shape->Coarse")
else:
printLog(log, "DETECT SKIP Shape->Coarse")
if needUpdateMaps or needUpdateShapeShape or needUpdateShapeCoarse:
cf = open("config_generated.cfg", "w")
cf.write("texture_mul_size = " + TextureMulSizeValue + ";\n")
cf.write("\n")
cf.write("search_path = \n")
cf.write("{\n")
cf.write("\t\"" + shapeWithCoarseMesh + "\", \n")
for dir in MapLookupDirectories:
cf.write("\t\"" + ExportBuildDirectory + "/" + dir + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.write("list_mesh = \n")
cf.write("{\n")
# For each shape with coarse mesh
files = findFiles(log, shapeWithCoarseMesh, "", ".shape")
for file in files:
sourceFile = shapeWithCoarseMesh + "/" + file
if os.path.isfile(sourceFile):
destFile = shapeWithCoarseMeshBuilded + "/" + file
cf.write("\t\"" + file + "\", \"" + destFile + "\", \n")
cf.write("};\n")
cf.write("\n")
cf.write("output_textures = \n")
cf.write("{\n")
# For each shape with coarse mesh
for tn in CoarseMeshTextureNames:
cf.write("\t\"" + shapeWithCoarseMesh + "/" + tn + ".tga\", \n")
cf.write("};\n")
cf.close()
subprocess.call([ BuildCoarseMesh, "config_generated.cfg" ])
os.remove("config_generated.cfg")
needUpdateCoarse = needUpdateDirNoSubdirExtMultiFileExt(log, shapeWithCoarseMesh, ".tga", shapeWithCoarseMeshBuilded, CoarseMeshTextureNames, ".dds")
if needUpdateCoarse:
printLog(log, "DETECT UPDATE Coarse->DDS")
else:
printLog(log, "DETECT SKIP Coarse->DDS")
# Convert the coarse texture to dds
if needUpdateCoarse:
for tn in CoarseMeshTextureNames:
subprocess.call([ TgaToDds, shapeWithCoarseMesh + "/" + tn + ".tga", "-o", shapeWithCoarseMeshBuilded + "/" + tn + ".dds", "-a", "5" ])
else:
printLog(log, ">>> No coarse meshes <<<")
log.close()
# end of file

@ -0,0 +1,175 @@
#!/usr/bin/python
#
# \file 2_build.py
# \brief Build zone
# \date 2009-03-10-22-23-GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Build zone
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Build zone")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
ZoneDependencies = findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix)
ZoneWelder = findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix)
ZoneElevation = findTool(log, ToolDirectories, ZoneElevationTool, ToolSuffix)
ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
printLog(log, "")
# We are in BEST mode
if BuildQuality == 1:
printLog(log, ">>> Build zone dependencies <<<")
if ZoneDependencies == "":
toolLogFail(log, ZoneDependenciesTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + ZoneDependBuildDirectory)
needUpdateZoneDepend = needUpdateDirByLowercaseTagLog(log, ExportBuildDirectory + "/" + ZoneExportDirectory, ".zone", ExportBuildDirectory + "/" + ZoneDependBuildDirectory, ".depend")
if needUpdateZoneDepend:
printLog(log, "DETECT UPDATE Zone->Depend")
else:
printLog(log, "DETECT SKIP Zone->Depend")
needUpdateContinentDepend = needUpdateFileDirNoSubdir(log, LeveldesignWorldDirectory + "/" + ContinentFile, ExportBuildDirectory + "/" + ZoneDependBuildDirectory)
if needUpdateContinentDepend:
printLog(log, "DETECT UPDATE Continent->Depend")
else:
printLog(log, "DETECT SKIP Continent->Depend")
needUpdateSearchPaths = needUpdateMultiDirNoSubdir(log, ExportBuildDirectory, PropertiesExportBuildSearchPaths, ExportBuildDirectory + "/" + ZoneDependBuildDirectory)
if needUpdateSearchPaths:
printLog(log, "DETECT UPDATE SearchPaths->Depend")
else:
printLog(log, "DETECT SKIP SearchPaths->Depend")
if needUpdateZoneDepend or needUpdateContinentDepend or needUpdateSearchPaths:
printLog(log, "DETECT DECIDE UPDATE")
mkPath(log, ActiveProjectDirectory + "/generated")
configFile = ActiveProjectDirectory + "/generated/zone_dependencies.cfg"
templateCf = open(ActiveProjectDirectory + "/generated/properties.cfg", "r")
cf = open(configFile, "w")
for line in templateCf:
cf.write(line)
cf.write("\n");
cf.write("level_design_directory = \"" + LeveldesignDirectory + "\";\n");
cf.write("level_design_world_directory = \"" + LeveldesignWorldDirectory + "\";\n");
cf.write("level_design_dfn_directory = \"" + LeveldesignDfnDirectory + "\";\n");
cf.write("continent_name = \"" + ContinentName + "\";\n");
cf.write("\n");
cf.close()
for zoneRegion in ZoneRegions:
# zone_dependencies [properties.cfg] [firstZone.zone] [lastzone.zone] [output_dependencies.cfg]
subprocess.call([ ExecTimeout, str(ZoneBuildDependTimeout), ZoneDependencies, configFile, ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + zoneRegion[0] + ".zone", ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + zoneRegion[1] + ".zone", ExportBuildDirectory + "/" + ZoneDependBuildDirectory + "/doomy.depend" ])
else:
printLog(log, "DETECT DECIDE SKIP")
printLog(log, "SKIP *")
printLog(log, "")
# For each zone directory
#printLog(log, ">>> Build zone weld <<<")
#if ZoneWelder == "":
# toolLogFail(log, ZoneWelderTool, ToolSuffix)
#elif ExecTimeout == "":
# toolLogFail(log, ExecTimeoutTool, ToolSuffix)
#else:
# mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
# mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
# files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zone")
# for file in files:
# sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file
# destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zone")] + ".zonew"
# if needUpdateLogRemoveDest(log, sourceFile, destFile):
# subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ])
#printLog(log, "")
# For each zone directory
printLog(log, ">>> Weld zone without heightmap <<<")
if ZoneWelder == "":
toolLogFail(log, ZoneWelderTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zonenh")
for file in files:
sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file
destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenh")] + ".zonenhw"
if needUpdateLogRemoveDest(log, sourceFile, destFile):
subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ])
printLog(log, "")
printLog(log, ">>> Apply zone heightmap to welded zone <<<")
if ZoneElevation == "":
toolLogFail(log, ZoneElevationTool, ToolSuffix)
else:
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
mkPath(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory);
land = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportLand
heightMap1 = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap1
heightMap2 = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap2
files = findFiles(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory, "", ".zonenhw")
for file in files:
sourceFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + file
destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenhw")] + ".zone"
if needUpdateLogRemoveDest(log, sourceFile, destFile):
command = [ ZoneElevation, sourceFile, destFile, "--land", land, "--heightmap", heightMap1, "--zfactor", LigoExportZFactor1, "--heightmap2", heightMap2, "--zfactor2", LigoExportZFactor2 ]
if LigoExportExtendCoords != 0:
command.append("--extendcoords")
callParallelProcess(command)
flushParallelProcesses()
printLog(log, "")
printLog(log, ">>> Re-weld zone with heightmap <<<")
if ZoneWelder == "":
toolLogFail(log, ZoneWelderTool, ToolSuffix)
elif ExecTimeout == "":
toolLogFail(log, ExecTimeoutTool, ToolSuffix)
else:
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
files = findFiles(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory, "", ".zone")
for file in files:
sourceFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + file
destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zone")] + ".zonew"
if needUpdateLogRemoveDest(log, sourceFile, destFile):
subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ])
printLog(log, "")
log.close()
# end of file

@ -0,0 +1,105 @@
#!/usr/bin/python
#
# \file 2_build.py
# \brief Build zone_light
# \date 2009-03-11-13-45-GMT
# \author Jan Boon (Kaetemi)
# Python port of game data build pipeline.
# Build zone_light
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../../configuration")
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
from scripts import *
from buildsite import *
from process import *
from tools import *
from directories import *
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Build zone_light")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
# Find tools
ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
ZoneLighter = findTool(log, ToolDirectories, ZoneLighterTool, ToolSuffix)
ZoneIgLighter = findTool(log, ToolDirectories, ZoneIgLighterTool, ToolSuffix)
printLog(log, "")
# For each zone_light directory
printLog(log, ">>> Build zone_light <<<")
if ZoneLighter == "":
toolLogFail(log, ZoneLighterTool, ToolSuffix)
elif ExecTimeout == "":
toolLogfail(log, ExecTimeoutTool, ToolSuffix)
else:
srcDir = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory
mkPath(log, srcDir)
destDir = ExportBuildDirectory + "/" + ZoneLightBuildDirectory
mkPath(log, destDir)
dependDir = ExportBuildDirectory + "/" + ZoneDependBuildDirectory
mkPath(log, dependDir)
files = findFiles(log, srcDir, "", ".zonew")
for file in files:
srcFile = srcDir + "/" + file
destFile = destDir + "/" + file[0:-len(".zonew")] + ".zonel"
if (needUpdateLogRemoveDest(log, srcFile, destFile)):
dependFile = dependDir + "/" + file[0:-len(".zonew")] + ".depend"
callParallelProcess([ ExecTimeout, str(ZoneLightBuildTimeout), ZoneLighter, srcFile, destFile, ActiveProjectDirectory + "/generated/properties.cfg", dependFile ])
flushParallelProcesses()
printLog(log, "")
# For each zone_light ig
printLog(log, ">>> Build zone_light ig <<<")
if ZoneIgLighter == "":
toolLogFail(log, ZoneIgLighterTool, ToolSuffix)
elif ExecTimeout == "":
toolLogfail(log, ExecTimeoutTool, ToolSuffix)
else:
srcDir = ExportBuildDirectory + "/" + ZoneLightBuildDirectory
mkPath(log, srcDir)
igsrcDir = ExportBuildDirectory + "/" + IgLandBuildDirectory
mkPath(log, igsrcDir)
destDir = ExportBuildDirectory + "/" + ZoneLightIgLandBuildDirectory
mkPath(log, destDir)
dependDir = ExportBuildDirectory + "/" + ZoneDependBuildDirectory
mkPath(log, dependDir)
files = findFiles(log, srcDir, "", ".zonel")
for file in files:
igsrcFile = igsrcDir + "/" + os.path.basename(file)[0:-len(".zonel")] + ".ig"
destFile = destDir + "/" + os.path.basename(file)[0:-len(".zonel")] + ".ig"
if (os.path.isfile(igsrcFile)):
if (needUpdateLogRemoveDest(log, igsrcFile, destFile)):
srcFile = srcDir + "/" + file
dependFile = dependDir + "/" + file[0:-len(".zonel")] + ".depend"
callParallelProcess([ ExecTimeout, str(ZoneIgLightBuildTimeout), ZoneIgLighter, srcFile, destFile, ActiveProjectDirectory + "/generated/properties.cfg", dependFile ])
flushParallelProcesses()
printLog(log, "")
log.close()
# end of file

@ -0,0 +1,70 @@
#!/usr/bin/python
#
# \author Jan Boon (Kaetemi)
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../configuration")
from scripts import *
from buildsite import *
from tools import *
os.chdir(TranslationDirectory)
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Make and merge all translations")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
TranslationTools = findTool(log, ToolDirectories, TranslationToolsTool, ToolSuffix)
try:
subprocess.call([ TranslationTools, "make_phrase_diff" ])
subprocess.call([ TranslationTools, "merge_phrase_diff" ])
subprocess.call([ TranslationTools, "make_clause_diff" ])
subprocess.call([ TranslationTools, "merge_clause_diff" ])
subprocess.call([ TranslationTools, "make_words_diff" ])
subprocess.call([ TranslationTools, "merge_words_diff" ])
subprocess.call([ TranslationTools, "make_string_diff" ])
subprocess.call([ TranslationTools, "merge_string_diff" ])
subprocess.call([ TranslationTools, "clean_string_diff" ])
subprocess.call([ TranslationTools, "make_r2_string_diff" ])
subprocess.call([ TranslationTools, "merge_r2_string_diff" ])
subprocess.call([ TranslationTools, "clean_r2_string_diff" ])
subprocess.call([ TranslationTools, "clean_words_diff" ])
subprocess.call([ TranslationTools, "clean_clause_diff" ])
subprocess.call([ TranslationTools, "clean_phrase_diff" ])
subprocess.call([ TranslationTools, "make_worksheet_diff", "bot_names.txt" ])
subprocess.call([ TranslationTools, "merge_worksheet_diff", "bot_names.txt" ])
except Exception, e:
printLog(log, "<" + processName + "> " + str(e))
printLog(log, "")
log.close()
if os.path.isfile("make_merge_all.log"):
os.remove("make_merge_all.log")
shutil.copy("log.log", "make_merge_all_" + time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + ".log")
shutil.move("log.log", "make_merge_all.log")
raw_input("PRESS ANY KEY TO EXIT")

@ -0,0 +1,115 @@
#!/usr/bin/python
#
# \author Jan Boon (Kaetemi)
#
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2014 by authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("../configuration")
from scripts import *
from buildsite import *
from tools import *
os.chdir(TranslationDirectory)
if os.path.isfile("log.log"):
os.remove("log.log")
log = open("log.log", "w")
printLog(log, "")
printLog(log, "-------")
printLog(log, "--- Make, merge and clean work")
printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "")
TranslationTools = findTool(log, ToolDirectories, TranslationToolsTool, ToolSuffix)
printLog(log, ">>> Override languages.txt <<<")
if not os.path.isfile("make_merge_wk_languages.txt"):
shutil.move("languages.txt", "make_merge_wk_languages.txt")
languagesTxt = open("languages.txt", "w")
languagesTxt.write("wk\n")
languagesTxt.close()
printLog(log, ">>> Merge diff <<<") # This is necessary, because when we crop lines, we should only do this from untranslated files
try:
subprocess.call([ TranslationTools, "merge_phrase_diff" ])
subprocess.call([ TranslationTools, "merge_clause_diff" ])
subprocess.call([ TranslationTools, "merge_words_diff" ])
subprocess.call([ TranslationTools, "merge_string_diff" ])
subprocess.call([ TranslationTools, "merge_r2_string_diff" ])
subprocess.call([ TranslationTools, "merge_worksheet_diff", "bot_names.txt" ])
except Exception, e:
printLog(log, "<" + processName + "> " + str(e))
printLog(log, "")
printLog(log, ">>> Make diff <<<")
try:
subprocess.call([ TranslationTools, "make_phrase_diff" ])
subprocess.call([ TranslationTools, "make_clause_diff" ])
subprocess.call([ TranslationTools, "make_words_diff" ])
subprocess.call([ TranslationTools, "make_string_diff" ])
subprocess.call([ TranslationTools, "make_r2_string_diff" ])
subprocess.call([ TranslationTools, "make_worksheet_diff", "bot_names.txt" ])
except Exception, e:
printLog(log, "<" + processName + "> " + str(e))
printLog(log, ">>> Mark diffs as translated <<<")
diffFiles = os.listdir("diff")
for diffFile in diffFiles:
if "wk_diff_" in diffFile:
printLog(log, "DIFF " + "diff/" + diffFile)
subprocess.call([ TranslationTools, "crop_lines", "diff/" + diffFile, "3" ])
#printLog(log, ">>> Clean diff <<<")
#try:
# subprocess.call([ TranslationTools, "clean_string_diff" ])
# subprocess.call([ TranslationTools, "clean_phrase_diff" ])
# subprocess.call([ TranslationTools, "clean_clause_diff" ])
# subprocess.call([ TranslationTools, "clean_words_diff" ])
#except Exception, e:
# printLog(log, "<" + processName + "> " + str(e))
#printLog(log, "")
printLog(log, ">>> Merge diff <<<")
try:
subprocess.call([ TranslationTools, "merge_phrase_diff" ])
subprocess.call([ TranslationTools, "merge_clause_diff" ])
subprocess.call([ TranslationTools, "merge_words_diff" ])
subprocess.call([ TranslationTools, "merge_string_diff" ])
subprocess.call([ TranslationTools, "merge_r2_string_diff" ])
subprocess.call([ TranslationTools, "merge_worksheet_diff", "bot_names.txt" ])
except Exception, e:
printLog(log, "<" + processName + "> " + str(e))
printLog(log, "")
printLog(log, ">>> Restore languages.txt <<<")
os.remove("languages.txt")
shutil.move("make_merge_wk_languages.txt", "languages.txt")
log.close()
if os.path.isfile("make_merge_wk.log"):
os.remove("make_merge_wk.log")
shutil.copy("log.log", "make_merge_wk_" + time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + ".log")
shutil.move("log.log", "make_merge_wk.log")
raw_input("PRESS ANY KEY TO EXIT")

File diff suppressed because it is too large Load Diff

@ -47,7 +47,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -47,7 +47,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -47,7 +47,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
try: try:

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *

@ -45,6 +45,7 @@ printLog(log, "")
# Find tools # Find tools
R2IslandsTextures = findTool(log, ToolDirectories, R2IslandsTexturesTool, ToolSuffix) R2IslandsTextures = findTool(log, ToolDirectories, R2IslandsTexturesTool, ToolSuffix)
TgaToDds = findTool(log, ToolDirectories, TgaToDdsTool, ToolSuffix)
if R2IslandsTextures == "": if R2IslandsTextures == "":
toolLogFail(log, R2IslandsTexturesTool, ToolSuffix) toolLogFail(log, R2IslandsTexturesTool, ToolSuffix)
@ -53,9 +54,33 @@ else:
cfgPath = ActiveProjectDirectory + "/generated/island_screenshots.cfg" cfgPath = ActiveProjectDirectory + "/generated/island_screenshots.cfg"
shutil.copy(cfgPath, "island_screenshots.cfg") shutil.copy(cfgPath, "island_screenshots.cfg")
printLog(log, ">>> Build cartographer <<<") printLog(log, ">>> Build cartographer <<<")
mkPath(log, ExportBuildDirectory + "/" + CartographerBuildDirectory)
subprocess.call([ R2IslandsTextures ]) subprocess.call([ R2IslandsTextures ])
printLog(log, "") printLog(log, "")
printLog(log, ">>> Compress cartographer maps to DDS <<<")
if TgaToDds == "":
toolLogFail(log, TgaToDdsTool, ToolSuffix)
else:
destPath = ExportBuildDirectory + "/" + CartographerMapBuildDirectory
mkPath(log, destPath)
sourcePath = ExportBuildDirectory + "/" + CartographerBuildDirectory
mkPath(log, sourcePath)
files = os.listdir(sourcePath)
len_tga_png = len(".tga")
len_dds = len(".dds")
for fileName in files:
if isLegalFileName(fileName):
sourceFile = sourcePath + "/" + fileName
if os.path.isfile(sourceFile):
if (fileName[-len_tga_png:].lower() == ".tga") or (fileName[-len_tga_png:].lower() == ".png"):
destFile = destPath + "/" + os.path.basename(fileName)[0:-len_tga_png] + ".dds"
if needUpdateLogRemoveDest(log, sourceFile, destFile):
subprocess.call([ TgaToDds, sourceFile, "-o", destFile, "-m" ])
elif not os.path.isdir(sourceFile):
printLog(log, "FAIL ?! file not dir or file ?! " + sourceFile)
printLog(log, "")
log.close() log.close()

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *
@ -43,12 +43,21 @@ printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
installPath = InstallDirectory + "/" + CartographerInstallDirectory installPath = InstallDirectory + "/" + CartographerInstallDirectory
mkPath(log, installPath) islandsInstallPath = InstallDirectory + "/" + IslandsInstallDirectory
printLog(log, ">>> Install cartographer <<<") printLog(log, ">>> Install cartographer <<<")
mkPath(log, ExportBuildDirectory + "/" + CartographerMapBuildDirectory)
mkPath(log, installPath)
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + CartographerMapBuildDirectory, installPath, ".dds")
mkPath(log, ExportBuildDirectory + "/" + CartographerBuildDirectory) mkPath(log, ExportBuildDirectory + "/" + CartographerBuildDirectory)
copyFilesNoTreeIfNeeded(log, ExportBuildDirectory + "/" + CartographerBuildDirectory, installPath) mkPath(log, islandsInstallPath)
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + CartographerBuildDirectory, islandsInstallPath, ".xml")
printLog(log, "") printLog(log, "")
log.close() log.close()

@ -30,7 +30,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *

@ -31,7 +31,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite import * from buildsite_local import *
from process import * from process import *
from tools import * from tools import *
from directories import * from directories import *

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save