Added: #929 Added the objects build project and updated the max file batch convert script.
This commit is contained in:
parent
ddfcd45c37
commit
dd8dc5171f
16 changed files with 665 additions and 95 deletions
|
@ -41,22 +41,32 @@ fn getAbsoluteDestination t =
|
|||
|
||||
fn getFixedTexturePath t =
|
||||
(
|
||||
if (doesFileExist (getAbsoluteSource t)) then
|
||||
absoluteDestination = (getAbsoluteDestination t)
|
||||
if (not (doesFileExist absoluteDestination)) and (((findString t "\\Stuff\\Fyros\\Decors\\_textures\\Batiments") != undefined) or ((findString t "\\Stuff\\Fyros\\Decors\\_textures\\Accessories\\Vv2\\") != undefined)) then
|
||||
(
|
||||
if not (doesFileExist (getAbsoluteDestination t)) then
|
||||
testDestination = ("W:\\database\\stuff\\Fyros\\Agents\\_textures\\Accessories\\" + (getFilenameFile (filenameFromPath t)) + ".png")
|
||||
if (doesFileExist testDestination) then
|
||||
(
|
||||
makeDir (getFilenamePath (getAbsoluteDestination t)) all:true
|
||||
renameFile (getAbsoluteSource t) (getAbsoluteDestination t)
|
||||
)
|
||||
if (doesFileExist (getAbsoluteDestination t)) then
|
||||
(
|
||||
if (getAbsoluteDestination t) != (getAbsoluteSource t) then
|
||||
(
|
||||
deleteFile (getAbsoluteSource t)
|
||||
absoluteDestination = testDestination
|
||||
)
|
||||
)
|
||||
if (not (doesFileExist absoluteDestination)) and (((findString t "\\Stuff\\Fyros\\Decors\\_textures\\Batiments") != undefined) or ((findString t "\\Stuff\\Fyros\\Decors\\_textures\\Accessories\\") != undefined)) then
|
||||
(
|
||||
testDestination = ("W:\\database\\stuff\\Fyros\\Agents\\_textures\\Accessories\\Vv2\\" + (getFilenameFile (filenameFromPath t)) + ".png")
|
||||
if (doesFileExist testDestination) then
|
||||
(
|
||||
absoluteDestination = testDestination
|
||||
)
|
||||
return (getAbsoluteDestination t)
|
||||
)
|
||||
if (not (doesFileExist absoluteDestination)) and ((findString t "\\Stuff\\Fyros\\Decors\\_textures\\Accessories\\") != undefined) then
|
||||
(
|
||||
testDestination = ("W:\\database\\stuff\\Fyros\\Agents\\_textures\\Batiments\\" + (getFilenameFile (filenameFromPath t)) + ".png")
|
||||
if (doesFileExist testDestination) then
|
||||
(
|
||||
absoluteDestination = testDestination
|
||||
)
|
||||
)
|
||||
return absoluteDestination
|
||||
)
|
||||
|
||||
fn renameTexture t =
|
||||
|
@ -175,6 +185,8 @@ rollout assets_png_rollout "Properties"
|
|||
actionMan.executeAction 0 "63508" -- Views: Standard Display with Maps
|
||||
actionMan.executeAction 0 "40043" -- Selection: Select None
|
||||
|
||||
max views redraw
|
||||
|
||||
return 1
|
||||
)
|
||||
|
||||
|
|
|
@ -135,6 +135,10 @@ 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))
|
||||
|
||||
|
@ -192,7 +196,7 @@ def findFilesNoSubdir(log, dir_where, file_ext):
|
|||
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?!" + filePath)
|
||||
printLog(log, "findFilesNoSubdir: file not dir or file?!" + fileFull)
|
||||
return result
|
||||
|
||||
def findFile(log, dir_where, file_name):
|
||||
|
|
|
@ -0,0 +1,185 @@
|
|||
NEL3D_APPDATA_EXPORT_NODE_ANIMATION = 1423062800
|
||||
|
||||
|
||||
-- Allocate 20 Me for the script
|
||||
heapSize += 15000000
|
||||
|
||||
nlErrorFilename = "output_logfile"
|
||||
nlErrorStream = openFile nlErrorFilename mode:"a"
|
||||
if nlErrorStream == undefined then
|
||||
nlErrorStream = createFile nlErrorFilename
|
||||
|
||||
-- Unhide category
|
||||
fn unhidecategory =
|
||||
(
|
||||
if (geometry.count > 0) then
|
||||
(
|
||||
unhide geometry[1]
|
||||
if (geometry[1].ishidden == true) then
|
||||
max hide object toggle
|
||||
)
|
||||
if (shapes.count > 0) then
|
||||
(
|
||||
unhide shapes[1]
|
||||
if (shapes[1].ishidden == true) then
|
||||
max hide shape toggle
|
||||
)
|
||||
if (lights.count > 0) then
|
||||
(
|
||||
unhide lights[1]
|
||||
if (lights[1].ishidden == true) then
|
||||
max hide light toggle
|
||||
)
|
||||
if (cameras.count > 0) then
|
||||
(
|
||||
unhide cameras[1]
|
||||
if (cameras[1].ishidden == true) then
|
||||
max hide camera toggle
|
||||
)
|
||||
if (helpers.count > 0) then
|
||||
(
|
||||
unhide helpers[1]
|
||||
if (helpers[1].ishidden == true) then
|
||||
max hide helper toggle
|
||||
)
|
||||
)
|
||||
|
||||
-- Log a message
|
||||
fn nlerror message =
|
||||
(
|
||||
if nlErrorStream != undefined then
|
||||
(
|
||||
format "%\n" message to:nlErrorStream
|
||||
flush nlErrorStream
|
||||
)
|
||||
|
||||
-- To the console
|
||||
print message
|
||||
)
|
||||
|
||||
try
|
||||
(
|
||||
-- Get files in the anim_source_directory
|
||||
files = getFiles "anim_source_directory/*.max"
|
||||
gc ()
|
||||
|
||||
-- Sort files
|
||||
sort files
|
||||
gc ()
|
||||
|
||||
-- No file ?
|
||||
if files.count != 0 then
|
||||
(
|
||||
-- For each files
|
||||
for i = 1 to files.count do
|
||||
(
|
||||
nlerror ("Scanning file "+files[i]+" ...")
|
||||
|
||||
try
|
||||
(
|
||||
-- Output file
|
||||
output = ("output_directory/"+(getFilenameFile files[i])+".anim")
|
||||
|
||||
-- Compare file date
|
||||
if (NeLTestFileDate output files[i]) == true then
|
||||
(
|
||||
-- Free memory and file handles
|
||||
gc ()
|
||||
heapfree
|
||||
|
||||
-- Reset 3dsmax
|
||||
resetMAXFile #noprompt
|
||||
|
||||
-- Open the max project
|
||||
if (loadMaxFile files[i] quiet:true) == true then
|
||||
(
|
||||
-- Unhide category
|
||||
unhidecategory()
|
||||
|
||||
-- Select Bip01, not very smart
|
||||
if $Bip01 != undefined then
|
||||
(
|
||||
select $Bip01
|
||||
|
||||
-- Always uncheck triangle pelvis
|
||||
if (classof $Bip01) == Biped_Object then
|
||||
(
|
||||
$Bip01.controller.figureMode = true
|
||||
$Bip01.controller.trianglepelvis = false
|
||||
$Bip01.controller.figureMode = false
|
||||
)
|
||||
)
|
||||
|
||||
-- For each node
|
||||
for node in objects do
|
||||
(
|
||||
exportNodeAnmation = getappdata node NEL3D_APPDATA_EXPORT_NODE_ANIMATION
|
||||
if (exportNodeAnmation != undefined) then
|
||||
(
|
||||
if (exportNodeAnmation == "1") then
|
||||
(
|
||||
selectmore node
|
||||
|
||||
-- Is it a biped ?
|
||||
if (classof node.controller) == Vertical_Horizontal_Turn then
|
||||
(
|
||||
-- Always uncheck triangle pelvis
|
||||
node.controller.trianglepelvis = false
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
if ((selection as array).count != 0) then
|
||||
(
|
||||
-- Export the animation
|
||||
if (NelExportAnimation (selection as array) output false) == false then
|
||||
(
|
||||
nlerror ("ERROR exporting animation "+files[i])
|
||||
)
|
||||
else
|
||||
(
|
||||
nlerror ("OK "+output)
|
||||
)
|
||||
)
|
||||
else
|
||||
(
|
||||
-- Error
|
||||
nlerror ("ERROR exporting animation: no node animated to export in file "+files[i])
|
||||
)
|
||||
)
|
||||
else
|
||||
(
|
||||
-- Error
|
||||
nlerror ("ERROR exporting animation: can't open the file "+files[i])
|
||||
)
|
||||
)
|
||||
else
|
||||
(
|
||||
nlerror ("SKIPPED "+files[i])
|
||||
)
|
||||
)
|
||||
catch
|
||||
(
|
||||
-- Error
|
||||
nlerror ("ERROR error exporting animation in files " + files[i])
|
||||
)
|
||||
)
|
||||
)
|
||||
else
|
||||
(
|
||||
nlerror ("WARNING no animation file in folder anim_source_directory")
|
||||
)
|
||||
)
|
||||
catch
|
||||
(
|
||||
-- Error
|
||||
nlerror ("ERROR fatal error exporting animation in folder anim_source_directory")
|
||||
)
|
||||
|
||||
-- Bye
|
||||
|
||||
resetMAXFile #noprompt
|
||||
quitMAX #noPrompt
|
||||
quitMAX () #noPrompt
|
||||
|
|
@ -63,13 +63,13 @@ else:
|
|||
mkPath(log, sourcePath)
|
||||
destPath = ExportBuildDirectory + "/" + MapBuildDirectory
|
||||
mkPath(log, destPath)
|
||||
files = findFiles(log, sourcePath, "", ".tga")
|
||||
files = findFilesNoSubdir(log, sourcePath, ".tga")
|
||||
for file in files:
|
||||
sourceFile = sourcePath + "/" + file
|
||||
destFile = destPath + "/" + os.path.basename(file)[0:-len(".tga")] + ".dds"
|
||||
if needUpdateLogRemoveDest(log, sourceFile, destFile):
|
||||
subprocess.call([ ExecTimeout, str(MapsBuildTimeout), TgaToDds, sourceFile, "-o", destFile, "-m", "-r" + str(ReduceBitmapFactor) ])
|
||||
files = findFiles(log, sourcePath, "", ".png")
|
||||
files = findFilesNoSubdir(log, sourcePath, ".png")
|
||||
for file in files:
|
||||
sourceFile = sourcePath + "/" + file
|
||||
destFile = destPath + "/" + os.path.basename(file)[0:-len(".png")] + ".dds"
|
||||
|
@ -78,14 +78,14 @@ else:
|
|||
printLog(log, "")
|
||||
|
||||
printLog(log, ">>> Build map uncompressed: copy tga, png, dds <<<")
|
||||
for dir in MapSourceDirectories:
|
||||
for dir in MapUncompressedSourceDirectories:
|
||||
sourcePath = DatabaseDirectory + "/" + dir
|
||||
mkPath(log, sourcePath)
|
||||
destPath = ExportBuildDirectory + "/" + MapBuildDirectory
|
||||
mkPath(log, destPath)
|
||||
copyFilesExtNoTreeIfNeeded(log, sourcePath, destPath, ".dds")
|
||||
copyFilesExtNoTreeIfNeeded(log, sourcePath, destPath, ".png")
|
||||
copyFilesExtNoTreeIfNeeded(log, sourcePath, destPath, ".tga")
|
||||
copyFilesExtNoSubdirIfNeeded(log, sourcePath, destPath, ".dds")
|
||||
copyFilesExtNoSubdirIfNeeded(log, sourcePath, destPath, ".png")
|
||||
copyFilesExtNoSubdirIfNeeded(log, sourcePath, destPath, ".tga")
|
||||
|
||||
printLog(log, ">>> Build panoply <<<")
|
||||
printLog(log, "********************************")
|
||||
|
|
|
@ -61,10 +61,13 @@ mkPath(log, ExportBuildDirectory + "/" + ShapeAnimExportDirectory)
|
|||
# Setup build directories
|
||||
printLog(log, ">>> Setup build directories <<<")
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeWithCoarseMeshBuildDirectory)
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory)
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmap16BitsBuildDirectory)
|
||||
|
||||
# Setup client directories
|
||||
printLog(log, ">>> Setup client directories <<<")
|
||||
mkPath(log, ClientDataDirectory + "/" + ShapeClientDirectory)
|
||||
mkPath(log, ClientDataDirectory + "/" + LightmapClientDirectory)
|
||||
|
||||
log.close()
|
||||
|
||||
|
|
|
@ -36,38 +36,9 @@ from process import *
|
|||
from tools import *
|
||||
from directories import *
|
||||
|
||||
# Todo: make a tool to verify the files :)
|
||||
|
||||
def getTagFileName(filePath):
|
||||
return os.path.split(filePath)[1] + ".tag"
|
||||
|
||||
def hackBigTree():
|
||||
return 0
|
||||
if EcosystemName == "jungle":
|
||||
# FO_S2_big_tree is corrupt on first export...
|
||||
outDirTag = ExportBuildDirectory + "/" + ShapeTagExportDirectory
|
||||
outDirWithCoarse = ExportBuildDirectory + "/" + ShapeWithCoarseMeshExportDirectory
|
||||
shapeName = "FO_S2_big_tree.shape"
|
||||
tagName = "FO_S2_big_tree.max.tag"
|
||||
hackName = "FO_S2_big_tree_hack.tag"
|
||||
if os.path.exists(outDirWithCoarse + "/" + shapeName) and os.path.exists(outDirTag + "/" + tagName) and not os.path.exists(outDirTag + "/" + hackName):
|
||||
printLog(log, "Removing bad export of FO_S2_big_tree")
|
||||
printLog(log, "RM " + outDirWithCoarse + "/" + shapeName)
|
||||
os.remove(outDirWithCoarse + "/" + shapeName)
|
||||
printLog(log, "RM " + outDirTag + "/" + tagName)
|
||||
os.remove(outDirTag + "/" + tagName)
|
||||
printLog(log, "TAG " + outDirTag + "/" + hackName)
|
||||
hackTagFile = open(outDirTag + "/" + hackName, "w")
|
||||
hackTagFile.write("FO_S2_big_tree")
|
||||
hackTagFile.close()
|
||||
return 1
|
||||
elif os.path.exists(outDirTag + "/" + hackName) and not os.path.exists(outDirWithCoarse + "/" + shapeName) and not os.path.exists(outDirTag + "/" + tagName):
|
||||
printLog(log, "Missing export of FO_S2_big_tree")
|
||||
return 0
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
printLog(log, "")
|
||||
printLog(log, "-------")
|
||||
printLog(log, "--- Export shape")
|
||||
|
@ -150,8 +121,9 @@ if MaxAvailable:
|
|||
subprocess.call([ ExecTimeout, str(MaxShapeExportTimeout), Max, "-U", "MAXScript", "shape_export.ms", "-q", "-mi", "-vn" ])
|
||||
lSrc = open(logFile, "r")
|
||||
for line in lSrc:
|
||||
if (len(line) > 0):
|
||||
printLog(log, line.strip())
|
||||
lineStrip = line.strip()
|
||||
if (len(lineStrip) > 0):
|
||||
printLog(log, lineStrip)
|
||||
lSrc.close()
|
||||
os.remove(logFile)
|
||||
if (os.path.exists(tagFilePath)):
|
||||
|
@ -163,19 +135,6 @@ if MaxAvailable:
|
|||
os.remove(scriptDst)
|
||||
else:
|
||||
printLog(log, "SKIP " + maxFilePath)
|
||||
#while tagDiff > 0:
|
||||
# printLog(log, "MAXSCRIPT " + scriptDst)
|
||||
# subprocess.call([ Max, "-U", "MAXScript", "shape_export.ms", "-q", "-mi", "-vn" ])
|
||||
# tagList = findFiles(log, outDirTag, "", ".tag")
|
||||
# newTagLen = len(tagList)
|
||||
# tagDiff = newTagLen - tagLen
|
||||
# tagLen = newTagLen
|
||||
# printLog(log, "Exported " + str(tagDiff) + " .max files!")
|
||||
# if not tagDiff > 0:
|
||||
# tagDiff += hackBigTree() # force rerun also when big tree deleted
|
||||
# if not tagDiff > 0:
|
||||
# tagDiff += secondTry
|
||||
# secondTry = 0
|
||||
|
||||
# Export clod 3dsmax
|
||||
printLog(log, ">>> Export character lod shape files (.clod) from Max <<<")
|
||||
|
@ -193,6 +152,8 @@ if MaxAvailable:
|
|||
printLog(log, "")
|
||||
|
||||
log.close()
|
||||
if os.path.isfile("log.log"):
|
||||
os.remove("log.log")
|
||||
shutil.move("temp_log.log", "log.log")
|
||||
|
||||
# end of file
|
||||
|
|
|
@ -63,17 +63,35 @@ if ClodConfigFile != "":
|
|||
printLog(log, "******** TODO ********")
|
||||
printLog(log, "********************************")
|
||||
|
||||
printLog(log, ">>> LightmapOptimizer <<<")
|
||||
printLog(log, "********************************")
|
||||
printLog(log, "******** TODO ********")
|
||||
printLog(log, "********************************")
|
||||
printLog(log, ">>> Optimize lightmaps <<<")
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmapNotOptimizedExportDirectory)
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory)
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeTagExportDirectory)
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeExportDirectory)
|
||||
removeFilesRecursive(log, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory)
|
||||
copyFiles(log, ExportBuildDirectory + "/" + ShapeLightmapNotOptimizedExportDirectory, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory)
|
||||
subprocess.call([ LightmapOptimizer, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory, ExportBuildDirectory + "/" + ShapeExportDirectory, ExportBuildDirectory + "/" + ShapeTagExportDirectory, ExportBuildDirectory + "/" + ShapeLightmapBuildDirectory + "/list_lm_8bit.txt" ])
|
||||
|
||||
printLog(log, ">>> TgaToDds <<<")
|
||||
printLog(log, "********************************")
|
||||
printLog(log, "******** TODO ********")
|
||||
printLog(log, "********************************")
|
||||
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" ])
|
||||
|
||||
if 1: # todo: CoarseMeshTextureNames length > 0 ...
|
||||
if len(CoarseMeshTextureNames) > 0:
|
||||
printLog(log, ">>> Build coarse meshes <<<")
|
||||
shapeWithCoarseMesh = ExportBuildDirectory + "/" + ShapeWithCoarseMeshExportDirectory
|
||||
mkPath(log, shapeWithCoarseMesh)
|
||||
|
@ -111,6 +129,8 @@ if 1: # todo: CoarseMeshTextureNames length > 0 ...
|
|||
os.remove("config_generated.cfg")
|
||||
for tn in CoarseMeshTextureNames:
|
||||
subprocess.call([ TgaToDds, shapeWithCoarseMesh + "/" + tn + ".tga", "-o", shapeWithCoarseMeshBuilded + "/" + tn + ".dds", "-a", "5" ])
|
||||
else:
|
||||
printLog(log, ">>> No coarse meshes <<<")
|
||||
|
||||
log.close()
|
||||
|
||||
|
|
|
@ -43,26 +43,26 @@ printLog(log, "-------")
|
|||
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
|
||||
printLog(log, "")
|
||||
|
||||
printLog(log, ">>> Install shape <<<")
|
||||
clientPath = ClientDataDirectory + "/" + ShapeClientDirectory
|
||||
mkPath(log, clientPath)
|
||||
|
||||
printLog(log, ">>> Install shape <<<")
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeExportDirectory)
|
||||
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + ShapeExportDirectory, clientPath, ".shape")
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeWithCoarseMeshBuildDirectory)
|
||||
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + ShapeWithCoarseMeshBuildDirectory, clientPath, ".shape")
|
||||
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + ShapeWithCoarseMeshBuildDirectory, clientPath, ".dds")
|
||||
|
||||
#if test "$lightmap_install_directory"; then
|
||||
# mkdir $client_directory/$lightmap_install_directory 2>> log.log 2> /dev/null
|
||||
# cp -u -p -R lightmap_16_bits/. $client_directory/$lightmap_install_directory 2>> log.log
|
||||
#fi
|
||||
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeAnimExportDirectory)
|
||||
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + ShapeAnimExportDirectory, clientPath, ".anim")
|
||||
|
||||
# ls anim | grep ".anim" >> $client_directory/auto_animations_list.txt
|
||||
|
||||
printLog(log, ">>> Install shape lightmaps <<<")
|
||||
clientPath = ClientDataDirectory + "/" + LightmapClientDirectory
|
||||
mkPath(log, clientPath)
|
||||
mkPath(log, ExportBuildDirectory + "/" + ShapeLightmap16BitsBuildDirectory)
|
||||
copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + ShapeLightmap16BitsBuildDirectory, clientPath, ".tga")
|
||||
|
||||
printLog(log, "")
|
||||
log.close()
|
||||
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# \file directories.py
|
||||
# \brief Directories configuration
|
||||
# \date 2010-08-27 17:13GMT
|
||||
# \author Jan Boon (Kaetemi)
|
||||
# \date 2001-2005
|
||||
# \author Nevrax
|
||||
# Python port of game data build pipeline.
|
||||
# Directories configuration.
|
||||
#
|
||||
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
# Copyright (C) 2010 Winch Gate Property Limited
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
|
||||
# *** COMMON PATH ***
|
||||
|
||||
CommonPath = "common/objects"
|
||||
|
||||
|
||||
# *** SOURCE DIRECTORIES IN THE DATABASE ***
|
||||
|
||||
# Shape directories
|
||||
ShapeSourceDirectories = [ ]
|
||||
ShapeSourceDirectories += [ "stuff/fyros/agents/accessories" ]
|
||||
ShapeSourceDirectories += [ "stuff/tryker/agents/accessories" ]
|
||||
ShapeSourceDirectories += [ "stuff/matis/agents/accessories" ]
|
||||
ShapeSourceDirectories += [ "stuff/zorai/agents/accessories" ]
|
||||
ShapeSourceDirectories += [ "stuff/generique/agents/accessories" ]
|
||||
ShapeSourceDirectories += [ "stuff/caravan/agents/accessories" ]
|
||||
ShapeSourceDirectories += [ "stuff/animated_light" ]
|
||||
|
||||
# Maps directories
|
||||
MapSourceDirectories = [ ]
|
||||
MapSourceDirectories += [ "stuff/fyros/agents/_textures/accessories" ]
|
||||
MapSourceDirectories += [ "stuff/tryker/agents/_textures/accessories" ]
|
||||
MapSourceDirectories += [ "stuff/matis/agents/_textures/accessories" ]
|
||||
MapSourceDirectories += [ "stuff/zorai/agents/_textures/accessories" ]
|
||||
MapSourceDirectories += [ "stuff/generique/agents/_textures/accessories" ]
|
||||
MapSourceDirectories += [ "stuff/caravan/agents/_textures/accessories" ]
|
||||
|
||||
MapUncompressedSourceDirectories = [ ]
|
||||
|
||||
|
||||
# *** EXPORT DIRECTORIES FOR THE BUILD PIPELINE ***
|
||||
|
||||
# Shape directories
|
||||
ShapeTagExportDirectory = CommonPath + "/shape_tag"
|
||||
ShapeExportDirectory = CommonPath + "/shape"
|
||||
ShapeWithCoarseMeshExportDirectory = CommonPath + "/shape_with_coarse_mesh"
|
||||
ShapeLightmapNotOptimizedExportDirectory = CommonPath + "/shape_lightmap_not_optimized"
|
||||
ShapeAnimExportDirectory = CommonPath + "/shape_anim"
|
||||
|
||||
|
||||
# *** BUILD DIRECTORIES FOR THE BUILD PIPELINE ***
|
||||
|
||||
# Map directories
|
||||
MapBuildDirectory = CommonPath + "/map"
|
||||
MapPanoplyBuildDirectory = CommonPath + "/map_panoply"
|
||||
|
||||
# Shape directories
|
||||
ShapeWithCoarseMeshBuildDirectory = CommonPath + "/shape_with_coarse_mesh_builded"
|
||||
ShapeLightmapBuildDirectory = CommonPath + "/shape_lightmap"
|
||||
ShapeLightmap16BitsBuildDirectory = CommonPath + "/shape_lightmap_16_bits"
|
||||
|
||||
|
||||
# *** INSTALL DIRECTORIES IN THE CLIENT DATA ***
|
||||
|
||||
# Map directory
|
||||
MapClientDirectory = "objects"
|
||||
|
||||
# Map directory
|
||||
BitmapClientDirectory = MapClientDirectory
|
||||
|
||||
# Shape directory
|
||||
ShapeClientDirectory = "objects"
|
||||
|
||||
# Lightmap directory
|
||||
LightmapClientDirectory = "objects"
|
|
@ -0,0 +1,77 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# \file config.py
|
||||
# \brief Process configuration
|
||||
# \date 2010-08-27 17:02GMT
|
||||
# \author Jan Boon (Kaetemi)
|
||||
# Python port of game data build pipeline.
|
||||
# Process configuration.
|
||||
#
|
||||
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
# Copyright (C) 2010 Winch Gate Property Limited
|
||||
#
|
||||
# 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 CONFIGURATION ***
|
||||
|
||||
# *** PROCESS CONFIG ***
|
||||
ProcessToComplete = [ ]
|
||||
ProcessToComplete += [ "shape" ] # not fully implemented, but works for this process
|
||||
ProcessToComplete += [ "map" ] # not fully implemented, but works for this process
|
||||
|
||||
|
||||
# *** SHAPE EXPORT OPTIONS ***
|
||||
|
||||
# Compute lightmaps ?
|
||||
ShapeExportOptExportLighting = "true"
|
||||
|
||||
# Cast shadow in lightmap ?
|
||||
ShapeExportOptShadow = "true"
|
||||
|
||||
# Lighting limits. 0 : normal, 1 : soft shadows
|
||||
ShapeExportOptLightingLimit = 0
|
||||
|
||||
# Lightmap lumel size
|
||||
ShapeExportOptLumelSize = "0.25"
|
||||
|
||||
# Oversampling value. Can be 1, 2, 4 or 8
|
||||
ShapeExportOptOversampling = 1
|
||||
|
||||
# Does the lightmap must be generated in 8 bits format ?
|
||||
ShapeExportOpt8BitsLightmap = "false"
|
||||
|
||||
# Does the lightmaps export must generate logs ?
|
||||
ShapeExportOptLightmapLog = "true"
|
||||
|
||||
# Coarse mesh texture mul size
|
||||
TextureMulSizeValue = "1.5"
|
||||
|
||||
DoBuildShadowSkin = 0
|
||||
|
||||
ClodConfigFile = ""
|
||||
|
||||
# *** COARSE MESH TEXTURE NAME ***
|
||||
CoarseMeshTextureNames = [ ]
|
||||
|
||||
# *** POSTFIX USED BY THE MULTIPLE TILES SYSTEM ***
|
||||
MultipleTilesPostfix = [ ]
|
||||
MultipleTilesPostfix += [ "_sp" ]
|
||||
MultipleTilesPostfix += [ "_su" ]
|
||||
MultipleTilesPostfix += [ "_au" ]
|
||||
MultipleTilesPostfix += [ "_wi" ]
|
||||
|
||||
# *** MAPS OPTIONS ***
|
||||
|
||||
ReduceBitmapFactor = 0
|
|
@ -0,0 +1,123 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# \file directories.py
|
||||
# \brief Directories configuration
|
||||
# \date 2010-08-27 17:13GMT
|
||||
# \author Jan Boon (Kaetemi)
|
||||
# \date 2001-2005
|
||||
# \author Nevrax
|
||||
# Python port of game data build pipeline.
|
||||
# Directories configuration.
|
||||
#
|
||||
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
# Copyright (C) 2010 Winch Gate Property Limited
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
|
||||
# *** COMMON PATH ***
|
||||
|
||||
CommonName = "sky"
|
||||
CommonPath = "common/" + CommonName
|
||||
|
||||
|
||||
# *** SOURCE DIRECTORIES IN THE DATABASE ***
|
||||
|
||||
# Shape directories
|
||||
ShapeSourceDirectories = [ ]
|
||||
ShapeSourceDirectories += [ "sky_v2/max" ]
|
||||
|
||||
# Maps directories
|
||||
MapSourceDirectories = [ ]
|
||||
MapSourceDirectories += [ "sky_v2/textures/textures" ]
|
||||
|
||||
MapUncompressedSourceDirectories = [ ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/textures/desert" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/textures/forest" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/textures/jungle" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/textures/lacustre" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/setup/desert" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/setup/forest" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/setup/jungle" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/setup/lacustre" ]
|
||||
MapUncompressedSourceDirectories += [ "sky_v2/textures/textures/nodds" ]
|
||||
|
||||
# Ig directories
|
||||
IgLandSourceDirectories = [ ]
|
||||
IgOtherSourceDirectories = [ ]
|
||||
IgOtherSourceDirectories += [ "sky_v2/max" ]
|
||||
IgPrimitiveSourceDirectories = [ ]
|
||||
|
||||
# Animation directories
|
||||
AnimSourceDirectories = [ ]
|
||||
AnimSourceDirectories += [ "sky_v2/max" ]
|
||||
|
||||
|
||||
# *** EXPORT DIRECTORIES FOR THE BUILD PIPELINE ***
|
||||
|
||||
# Shape directories
|
||||
ShapeTagExportDirectory = CommonPath + "/shape_tag"
|
||||
ShapeExportDirectory = CommonPath + "/shape"
|
||||
ShapeWithCoarseMeshExportDirectory = CommonPath + "/shape_with_coarse_mesh"
|
||||
ShapeLightmapNotOptimizedExportDirectory = CommonPath + "/shape_lightmap_not_optimized"
|
||||
ShapeAnimExportDirectory = CommonPath + "/shape_anim"
|
||||
|
||||
# Ig directories
|
||||
IgStaticLandExportDirectory = CommonPath + "/ig_static_land" # Landscape IG eported from 3dsmax not elevated by the heightmap
|
||||
IgStaticOtherExportDirectory = CommonPath + "/ig_static_other" # Village or construction IGs exported from 3dsmax
|
||||
IgStaticTagExportDirectory = CommonPath + "/ig_static_tag" # Tag for exported 3dsmax files
|
||||
|
||||
|
||||
# *** BUILD DIRECTORIES FOR THE BUILD PIPELINE ***
|
||||
|
||||
# Map directories
|
||||
MapBuildDirectory = CommonPath + "/map"
|
||||
MapPanoplyBuildDirectory = CommonPath + "/map_panoply"
|
||||
|
||||
# Shape directories
|
||||
ShapeWithCoarseMeshBuildDirectory = CommonPath + "/shape_with_coarse_mesh_builded"
|
||||
ShapeLightmapBuildDirectory = CommonPath + "/shape_lightmap"
|
||||
ShapeLightmap16BitsBuildDirectory = CommonPath + "/shape_lightmap_16_bits"
|
||||
|
||||
# Ig directories
|
||||
IgElevLandPrimBuildDirectory = CommonPath + "/ig_elev_land_prim" # landscape IG generated by the prim exporter (already elevated by the land exporter)
|
||||
IgElevLandLigoBuildDirectory = CommonPath + "/ig_elev_land_ligo" # Landscape IG found in ligo bricks from 3dsmax elevated by the heightmap
|
||||
IgElevLandStaticBuildDirectory = CommonPath + "/ig_elev_land_static" # Landscape IG eported from 3dsmax elevated by the heightmap
|
||||
IgTempLandMergeBuildDirectory = CommonPath + "/ig_temp_land_merge"
|
||||
IgTempLandCompareBuildDirectory = CommonPath + "/ig_temp_land_compare" # Tmp final IG directory for landscape IGs before comparison
|
||||
IgLandBuildDirectory = CommonPath + "/ig_land" # Final IG directory for landscape IGs
|
||||
IgOtherBuildDirectory = CommonPath + "/ig_other" # Final IG directory for village or construction IGs
|
||||
IgOtherLightedBuildDirectory = CommonPath + "/ig_other_lighted"
|
||||
|
||||
|
||||
# *** INSTALL DIRECTORIES IN THE CLIENT DATA ***
|
||||
|
||||
# Map directory
|
||||
MapClientDirectory = CommonName
|
||||
|
||||
# Map directory
|
||||
BitmapClientDirectory = MapClientDirectory
|
||||
|
||||
# Shape directory
|
||||
ShapeClientDirectory = CommonName
|
||||
|
||||
# Lightmap directory
|
||||
LightmapClientDirectory = CommonName
|
||||
|
||||
# Animation directory
|
||||
AnimClientDirectory = CommonName
|
||||
|
||||
# Ig directory
|
||||
IgClientDirectory = CommonName
|
|
@ -0,0 +1,80 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# \file config.py
|
||||
# \brief Process configuration
|
||||
# \date 2010-08-27 17:02GMT
|
||||
# \author Jan Boon (Kaetemi)
|
||||
# Python port of game data build pipeline.
|
||||
# Process configuration.
|
||||
#
|
||||
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
# Copyright (C) 2010 Winch Gate Property Limited
|
||||
#
|
||||
# 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 CONFIGURATION ***
|
||||
|
||||
# *** PROCESS CONFIG ***
|
||||
ProcessToComplete = [ ]
|
||||
ProcessToComplete += [ "shape" ]
|
||||
ProcessToComplete += [ "map" ]
|
||||
#ProcessToComplete += [ "anim" ]
|
||||
#ProcessToComplete += [ "ig" ]
|
||||
#ProcessToComplete += [ "ig_light" ]
|
||||
|
||||
|
||||
# *** SHAPE EXPORT OPTIONS ***
|
||||
|
||||
# Compute lightmaps ?
|
||||
ShapeExportOptExportLighting = "true"
|
||||
|
||||
# Cast shadow in lightmap ?
|
||||
ShapeExportOptShadow = "true"
|
||||
|
||||
# Lighting limits. 0 : normal, 1 : soft shadows
|
||||
ShapeExportOptLightingLimit = 0
|
||||
|
||||
# Lightmap lumel size
|
||||
ShapeExportOptLumelSize = "0.25"
|
||||
|
||||
# Oversampling value. Can be 1, 2, 4 or 8
|
||||
ShapeExportOptOversampling = 1
|
||||
|
||||
# Does the lightmap must be generated in 8 bits format ?
|
||||
ShapeExportOpt8BitsLightmap = "false"
|
||||
|
||||
# Does the lightmaps export must generate logs ?
|
||||
ShapeExportOptLightmapLog = "true"
|
||||
|
||||
# Coarse mesh texture mul size
|
||||
TextureMulSizeValue = "1.5"
|
||||
|
||||
DoBuildShadowSkin = 0
|
||||
|
||||
ClodConfigFile = ""
|
||||
|
||||
# *** COARSE MESH TEXTURE NAME ***
|
||||
CoarseMeshTextureNames = [ ]
|
||||
|
||||
# *** POSTFIX USED BY THE MULTIPLE TILES SYSTEM ***
|
||||
MultipleTilesPostfix = [ ]
|
||||
MultipleTilesPostfix += [ "_sp" ]
|
||||
MultipleTilesPostfix += [ "_su" ]
|
||||
MultipleTilesPostfix += [ "_au" ]
|
||||
MultipleTilesPostfix += [ "_wi" ]
|
||||
|
||||
# *** MAPS OPTIONS ***
|
||||
|
||||
ReduceBitmapFactor = 0
|
|
@ -33,6 +33,8 @@ EcosystemName = "jungle"
|
|||
EcosystemPath = "ecosystems/" + EcosystemName
|
||||
ContinentName = "newbieland"
|
||||
ContinentPath = "continents/" + ContinentName
|
||||
CommonName = ContinentName
|
||||
CommonPath = ContinentPath
|
||||
|
||||
# *** SOURCE DIRECTORIES LEVELDESIGN/WORLD ***
|
||||
ContinentLeveldesignWorldDirectory = ContinentName
|
||||
|
|
|
@ -26,12 +26,14 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# *** SOURCE DIRECTORIES IN THE DATABASE ***
|
||||
|
||||
|
||||
# *** ECOSYSTEM NAME ***
|
||||
EcosystemName = "jungle"
|
||||
EcosystemPath = "ecosystems/" + EcosystemName
|
||||
CommonPath = EcosystemPath
|
||||
|
||||
|
||||
# *** SOURCE DIRECTORIES IN THE DATABASE ***
|
||||
|
||||
# Shape directories
|
||||
ShapeSourceDirectories = [ ]
|
||||
|
@ -147,11 +149,11 @@ PacsPrimSourceDirectories += [ "stuff/" + EcosystemName + "/decors/vegetations"
|
|||
# *** EXPORT DIRECTORIES FOR THE BUILD PIPELINE ***
|
||||
|
||||
# Shape directories
|
||||
ShapeTagExportDirectory = "ecosystems/" + EcosystemName + "/shape_tag"
|
||||
ShapeExportDirectory = "ecosystems/" + EcosystemName + "/shape"
|
||||
ShapeWithCoarseMeshExportDirectory = "ecosystems/" + EcosystemName + "/shape_with_coarse_mesh"
|
||||
ShapeLightmapNotOptimizedExportDirectory = "ecosystems/" + EcosystemName + "/shape_lightmap_not_optimized"
|
||||
ShapeAnimExportDirectory = "ecosystems/" + EcosystemName + "/shape_anim"
|
||||
ShapeTagExportDirectory = CommonPath + "/shape_tag"
|
||||
ShapeExportDirectory = CommonPath + "/shape"
|
||||
ShapeWithCoarseMeshExportDirectory = CommonPath + "/shape_with_coarse_mesh"
|
||||
ShapeLightmapNotOptimizedExportDirectory = CommonPath + "/shape_lightmap_not_optimized"
|
||||
ShapeAnimExportDirectory = CommonPath + "/shape_anim"
|
||||
|
||||
# Smallbank directories
|
||||
SmallbankExportDirectory = "ecosystems/" + EcosystemName + "/smallbank"
|
||||
|
@ -184,11 +186,13 @@ ZoneExportDirectory = "ecosystems/" + EcosystemName + "/zone"
|
|||
# *** BUILD DIRECTORIES FOR THE BUILD PIPELINE ***
|
||||
|
||||
# Map directories
|
||||
MapBuildDirectory = "ecosystems/" + EcosystemName + "/map"
|
||||
MapPanoplyBuildDirectory = "ecosystems/" + EcosystemName + "/map_panoply"
|
||||
MapBuildDirectory = CommonPath + "/map"
|
||||
MapPanoplyBuildDirectory = CommonPath + "/map_panoply"
|
||||
|
||||
# Shape directories
|
||||
ShapeWithCoarseMeshBuildDirectory = "ecosystems/" + EcosystemName + "/shape_with_coarse_mesh_builded"
|
||||
ShapeWithCoarseMeshBuildDirectory = CommonPath + "/shape_with_coarse_mesh_builded"
|
||||
ShapeLightmapBuildDirectory = CommonPath + "/shape_lightmap"
|
||||
ShapeLightmap16BitsBuildDirectory = CommonPath + "/shape_lightmap_16_bits"
|
||||
|
||||
# Farbank directories
|
||||
FarbankBuildDirectory = "ecosystems/" + EcosystemName + "/farbank"
|
||||
|
@ -218,15 +222,15 @@ ClientSetupDirectories += [ "jungle_vegetable_sets" ]
|
|||
ClientSetupDirectories += [ "jungle_pacs_prim" ]
|
||||
ClientSetupDirectories += [ "jungle_lightmaps" ]
|
||||
|
||||
# Shape directory
|
||||
# Map directory
|
||||
MapClientDirectory = "jungle_maps"
|
||||
|
||||
# Map directory
|
||||
BitmapClientDirectory = MapClientDirectory
|
||||
|
||||
# Shape directory
|
||||
ShapeClientDirectory = "jungle_shapes"
|
||||
|
||||
# Map directory
|
||||
BitmapClientDirectory = "jungle_maps"
|
||||
|
||||
# Lightmap directory
|
||||
LightmapClientDirectory = "jungle_lightmaps"
|
||||
|
||||
|
|
|
@ -69,6 +69,10 @@ ShapeExportOptLightmapLog = "false"
|
|||
# Coarse mesh texture mul size
|
||||
TextureMulSizeValue = "1.5"
|
||||
|
||||
DoBuildShadowSkin = 0
|
||||
|
||||
ClodConfigFile = ""
|
||||
|
||||
# *** COARSE MESH TEXTURE NAME ***
|
||||
CoarseMeshTextureNames = [ ]
|
||||
CoarseMeshTextureNames += [ "nel_coarse_mesh_jungle_sp" ]
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
ProjectsToProcess = [ ]
|
||||
ProjectsToProcess += [ "common/interface" ]
|
||||
ProjectsToProcess += [ "common/objects" ]
|
||||
ProjectsToProcess += [ "common/sky" ]
|
||||
ProjectsToProcess += [ "ecosystems/jungle" ]
|
||||
ProjectsToProcess += [ "continents/newbieland" ]
|
||||
|
||||
|
|
Loading…
Reference in a new issue