PRC8/nwn/nwnprc/trunk/SConstruct
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

207 lines
6.4 KiB
Python

# python
"""
Notes:
- TODO:
-- Database?
-- Install?
-- Debug compile
- Dependencies
-- Doable using just Scons?
-- If not fast enough, can probably be made fast by explicitly declaring
them with the Java dependecy builder.
--- env.Depends()
-- Only directly build haks/erfs, make .ncs files their dependencies
and let Scons derive from there?
"""
from os.path import basename, exists, join
import re
## Specific files and directories we need to muck about with
includedir = Dir("include")
othersdir = Dir("others")
_2dasdir = Dir("2das")
scrollmerch = othersdir.File("prc_scrolls.utm")
## Builders
# NWScript
nwscript = Builder(
action = "wine tools/nwnnsscomp.exe -cq -i include $SOURCE $TARGET",
suffix = ".ncs",
src_suffix = ".nss")
# Haks / Erf
erf = Builder(
action = ["-@rm -f $TARGET",
Action("wine tools/erf.exe --create $TARGET $SOURCES",
"Packaging $TARGET")]
)
erffromdir = Builder(
action = ["-@rm -f $TARGET",
Action("wine tools/erf.exe --create $TARGET $SOURCE/*",
"Packaging $TARGET from files in directory $SOURCE")],
source_factory=Dir
)
# TLK
tlk = Builder(
action = ["-@rm -f $TARGET",
Action("tools/linux/xml2tlk $SOURCE $TARGET",
"Building TLK from XML")]
)
# Other stuff
scrollmerchbuild = Builder(
action = ["-@mkdir scrolltemp",
Action("java -Xmx200m -jar tools/prc.jar buildscrhack 2das tlk scrolltemp",
"Creating scrolls and updating 2das"),
Action("java -cp ./tools/modpacker/nwn-tools.jar org.progeeks.nwn.XmlToGff scrolltemp scrolltemp/*.uti.xml",
"Converting scroll XML to UTI"),
Action("java -cp ./tools/modpacker/nwn-tools.jar org.progeeks.nwn.XmlToGff . prc_scrolls.utm.xml",
"Converting scroll merchant XML to UTM"),
"@mv scrolltemp/*.uti others/",
"@mv prc_scrolls.utm others/",
"@rm -rf scrolltemp",
"@rm -f prc_scrolls.utm.xml",
"@rm -f System.out"] # Bug in nwn-tools, produces this file
)
## Include scanner
include_regex = re.compile("^#include\s+\"(\w+)\"", re.MULTILINE)
def scan_nwscript(node, env, path):
contents = node.get_contents()
return ["../include/%s.nss" % (name,)
for name in include_regex.findall(contents)
if exists(includedir.File("%s.nss" % (name,)).abspath)]
nss_scan = Scanner(function = scan_nwscript,
skeys = [".nss"],
recursive = True)
## File lists
def mkobjectlist(scripts, objectdir):
return [join(objectdir, basename(script).replace(".nss", ".ncs"))
for script in scripts]
# Scripts
scripts = Glob("#/scripts/*.nss", strings=True)
spells = Glob("#/spells/*.nss", strings=True)
epicspellscripts = Glob("#/epicspellscripts/*.nss", strings=True)
racescripts = Glob("#/racescripts/*.nss", strings=True)
psionics = Glob("#/psionics/*.nss", strings=True)
newspellbooks = Glob("#/newspellbook/*.nss", strings=True)
includes = Glob("#/include/*.nss", strings=True)
# Object files
objects = mkobjectlist(scripts, "objs")
spellobjs = mkobjectlist(spells, "spellobjs")
epicspellobjs = mkobjectlist(epicspellscripts, "epicspellobjs")
raceobjs = mkobjectlist(racescripts, "raceobjs")
psionicsobjs = mkobjectlist(psionics, "psionicsobjs")
newspellbookobjs = mkobjectlist(newspellbooks, "newspellbookobjs")
# 2das
_2das = Glob("#/2das/*.2da", strings=True)
race2das = Glob("#/race2das/*.2da", strings=True)
craft2das = Glob("#/Craft2das/*.2da", strings=True)
# Misc
gfx = Glob("#/gfx/*.*", strings=True)
others = Glob("#/others/*.*", strings=True)
# Erfs
erffiles = Glob("#/erf/*.*", strings=True)
ocfixscripts = Glob("#/ocfixerf/*.nss", strings=True)
ocfixobjs = mkobjectlist(ocfixscripts, "ocfixerfobjs")
## Building
env = Environment(BUILDERS = {'NWScript' : nwscript,
'Erf' : erf,
'ErfFromDir' : erffromdir,
'Tlk' : tlk,
'ScrollMerch' : scrollmerchbuild})
env.Append(SCANNERS = nss_scan)
def buildscripts(scriptlist, objectlist):
# Note: Assumes objectlist was directly derived from scriptlist
# and is therefore in the same order.
for (script, object) in zip(scriptlist, objectlist):
env.NWScript(object, script)
def buildhak(name, filelist):
env.Erf("#/CompiledResources/%s.hak" % (name,), filelist)
def builderf(name, filelist):
env.Erf("#/CompiledResources/%s.erf" % (name,), filelist)
# Compiling scripts
buildscripts(scripts, objects)
buildscripts(spells, spellobjs)
buildscripts(epicspellscripts, epicspellobjs)
buildscripts(racescripts, raceobjs)
buildscripts(psionics, psionicsobjs)
buildscripts(newspellbooks, newspellbookobjs)
buildscripts(ocfixscripts, ocfixobjs)
# Convert TLK
env.Tlk("#/tlk/prc8_consortium.tlk", "#/tlk/prc8_consortium.tlk.xml")
# Building haks
buildhak("prc8_scripts", scripts + objects)
buildhak("prc8_spells", spells + spellobjs)
buildhak("prc8_epicspells", epicspellscripts + epicspellobjs)
buildhak("prc8_psionics", psionics + psionicsobjs)
buildhak("prc8_newspellbook", newspellbooks + newspellbookobjs)
buildhak("prc8_include", includes)
buildhak("prc8_race", racescripts + raceobjs + race2das)
buildhak("prc8_2das", _2das)
buildhak("prc8_textures", gfx)
buildhak("prc8_craft2das", craft2das)
# Building erfs
builderf("prc8_consortium", erffiles)
builderf("prc8_ocfix", ocfixscripts + ocfixobjs)
# Special handling for misc hak:
# Depends on the scroll merchant file, which may need to be generated / updated
env.ScrollMerch(scrollmerch,
[_2dasdir.File("spells.2da"),
_2dasdir.File("des_crft_scroll.2da"),
_2dasdir.File("des_crft_spells.2da"),
_2dasdir.File("iprp_spells.2da")
] +
Glob("#/2das/cls_spcr_*.2da"))
# Can't use Erf rule, since something crashes with it
# So instead declared the dependencies explicitly and then use dir build rule
env.Depends("#/CompiledResources/prc8_misc.hak",
others + [scrollmerch])
env.ErfFromDir("#/CompiledResources/prc8_misc.hak", "others")