jak-project/goal_src/jak2/game.gp
Hat Kid 62ef9fe49d
[wip] build actor tool (#3266)
This does a couple of things:

- The `custom_levels` folder was renamed to `custom_assets` and contains
`levels`, `models` and `texture_replacements` folders for Jak 1, 2 and 3
in order to keep everything regarding custom stuff in one place.
- With this, texture replacements now use separate folders for all games
- A build actor tool was added that generates art groups for custom
actors
- Custom levels can now specify what custom models from the `models`
folder they want to import, this will add them to the level's FR3.
- A `test-zone-obs.gc` file was added, containing a `test-actor` process
that uses a custom model as an example.

The build actor tool is still very WIP, the joints and the default
animation are hardcoded, but it allows for importing any GLB file as a
merc model.
2024-05-18 18:18:25 +02:00

452 lines
14 KiB
Scheme

;;-*-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Jak 2 Project File
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; see goal_src/jak1/game.gp for more detailed explanation
;;;;;;;;;;;;;;;;;;;;;;;
;; Inputs from ISO
;;;;;;;;;;;;;;;;;;;;;;;
(cond
;; extractor can override everything by providing *use-iso-data-path*
(*use-iso-data-path*
(map-path! "$ISO" (string-append *iso-data* "/")))
;; if the user's repl-config has a game version folder, use that
((> (string-length (get-game-version-folder)) 0)
(map-path! "$ISO" (string-append "iso_data/" (get-game-version-folder) "/")))
;; otherwise, default to jak2
(#t
(map-path! "$ISO" "iso_data/jak2/")))
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Inputs from decompiler
;;;;;;;;;;;;;;;;;;;;;;;;;;
(cond
;; if the user's repl-config has a game version folder, use that
((> (string-length (get-game-version-folder)) 0)
(map-path! "$DECOMP" (string-append "decompiler_out/" (get-game-version-folder) "/")))
;; otherwise, default to jak2
(#t
(map-path! "$DECOMP" "decompiler_out/jak2/")))
;;;;;;;;;;;;;;;;;;;;;;;
;; Output
;;;;;;;;;;;;;;;;;;;;;;;
;; NOTE: the game itself will load from out/jak2/iso and out/jak2/fr3.
(map-path! "$OUT" "out/jak2/")
;; tell the compiler to put its outputs in out/jak2/
(set-output-prefix "jak2/")
;; use defmacro to define goos macros.
(define defmacro defsmacro)
(define defun desfun)
;;;;;;;;;;;;;;;;;;;;;;;
;; Build Groups
;;;;;;;;;;;;;;;;;;;;;;;
(define *all-cgos* '())
(define *all-str* '())
(define *all-vis* '())
(define *all-mus* '())
(define *all-sbk* '())
(define *all-vag* '())
(define *all-gc* '())
(define *file-entry-map* (make-string-hash-table))
;; Load required macros
(load-file "goal_src/jak2/lib/project-lib.gp")
(set-gsrc-folder! "goal_src/jak2")
;;;;;;;;;;;;;;;;;
;; GOAL Kernel
;;;;;;;;;;;;;;;;;
(cgo-file "kernel.gd" '())
;;;;;;;;;;;;;;;;;;;;;
;; misc files
;;;;;;;;;;;;;;;;;;;;;
;; the VAGDIR file
(defstep :in "$ISO/VAG/VAGDIR.AYB"
:tool 'copy
:out '("$OUT/iso/VAGDIR.AYB"))
;;;;;;;;;;;;;;;;;;;;;
;; DGOs
;;;;;;;;;;;;;;;;;;;;;
(defstep :in "$DECOMP/textures/tpage-dir.txt"
:tool 'tpage-dir
:out '("$OUT/obj/dir-tpages.go")
)
(hash-table-set! *file-entry-map* "dir-tpages.go" #f)
(cgo-file "game.gd" '("$OUT/obj/gcommon.o" "$OUT/obj/gstate.o" "$OUT/obj/gstring.o" "$OUT/obj/gkernel.o"))
;; note: some of these dependencies are slightly wrong because cgo-file doesn't really handle
;; the case of a .o appearing in multiple dgos. But, if we depend on the last item in both lists, it
;; works out.
(define common-dep '("$OUT/obj/cty-guard-turret-button.o" "$OUT/obj/default-menu-pc.o"))
;; city
(cgo-file "cwi.gd" common-dep)
(cgo-file "lwidea.gd" common-dep)
(cgo-file "lwideb.gd" common-dep)
(cgo-file "lwidec.gd" common-dep)
(cgo-file "ctykora.gd" common-dep)
(cgo-file "cta.gd" common-dep)
(cgo-file "ctb.gd" common-dep)
(cgo-file "ctc.gd" common-dep)
(cgo-file "cia.gd" common-dep)
(cgo-file "cib.gd" common-dep)
(cgo-file "cpo.gd" common-dep)
(cgo-file "ljakdax.gd" common-dep)
(cgo-file "cpa.gd" common-dep)
(cgo-file "cga.gd" common-dep)
(cgo-file "cgb.gd" common-dep)
(cgo-file "cgc.gd" common-dep)
(cgo-file "sta.gd" common-dep)
(cgo-file "cma.gd" common-dep)
(cgo-file "cmb.gd" common-dep)
(cgo-file "ctyasha.gd" common-dep)
(cgo-file "cfa.gd" common-dep)
(cgo-file "cfb.gd" common-dep)
(cgo-file "hiphog.gd" common-dep)
(cgo-file "hideout.gd" common-dep)
(cgo-file "gga.gd" common-dep)
(cgo-file "onintent.gd" common-dep)
(cgo-file "vin.gd" common-dep)
(cgo-file "garage.gd" common-dep)
(cgo-file "kiosk.gd" common-dep)
(cgo-file "oracle.gd" common-dep)
(cgo-file "stadblmp.gd" common-dep)
;; city borrow
(cgo-file "lbbush.gd" common-dep)
(cgo-file "lmeetbrt.gd" common-dep)
(cgo-file "lpower.gd" common-dep)
(cgo-file "lshuttle.gd" common-dep)
(cgo-file "lkiddoge.gd" common-dep)
(cgo-file "lbombbot.gd" common-dep)
(cgo-file "lerlchal.gd" common-dep)
(cgo-file "lprotect.gd" common-dep)
(cgo-file "lpackage.gd" common-dep)
(cgo-file "lportrun.gd" common-dep)
(cgo-file "lhelldog.gd" common-dep)
(cgo-file "lsack.gd" common-dep)
(cgo-file "lprtrace.gd" common-dep)
;; other borrow
(cgo-file "ltentout.gd" common-dep)
(cgo-file "ltentob.gd" common-dep)
(cgo-file "lkeirift.gd" common-dep)
(cgo-file "lgarcsta.gd" common-dep)
(cgo-file "lwhack.gd" common-dep)
;; title
(cgo-file "title.gd" common-dep)
;; intro
(cgo-file "vi1.gd" common-dep)
(cgo-file "introcst.gd" common-dep)
(cgo-file "lintcstb.gd" common-dep)
(cgo-file "lcitylow.gd" common-dep)
;; stadium
(cgo-file "ska.gd" common-dep)
(cgo-file "stb.gd" common-dep)
(cgo-file "stc.gd" common-dep)
(cgo-file "std.gd" common-dep)
(cgo-file "lracelit.gd" common-dep)
(cgo-file "lracebf.gd" common-dep)
(cgo-file "lracecf.gd" common-dep)
(cgo-file "lracedf.gd" common-dep)
(cgo-file "lracebb.gd" common-dep)
(cgo-file "lracecb.gd" common-dep)
(cgo-file "lracedb.gd" common-dep)
(cgo-file "lwidesta.gd" common-dep)
;; fortress
(cgo-file "pri.gd" common-dep)
(cgo-file "ldjakbrn.gd" common-dep)
(cgo-file "lprsncst.gd" common-dep)
(cgo-file "fea.gd" common-dep)
(cgo-file "feb.gd" common-dep)
(cgo-file "fda.gd" common-dep)
(cgo-file "fdb.gd" common-dep)
(cgo-file "fordumpc.gd" common-dep)
(cgo-file "fordumpd.gd" common-dep)
(cgo-file "fra.gd" common-dep)
(cgo-file "frb.gd" common-dep)
;; ruins
(cgo-file "rui.gd" common-dep)
(cgo-file "sag.gd" common-dep)
;; atoll
(cgo-file "ato.gd" common-dep)
(cgo-file "ate.gd" common-dep)
;; sewer
(cgo-file "sew.gd" common-dep)
(cgo-file "seb.gd" common-dep)
(cgo-file "swe.gd" common-dep)
(cgo-file "swb.gd" common-dep)
;; mountain
(cgo-file "mtn.gd" common-dep)
(cgo-file "mtx.gd" common-dep)
(cgo-file "mcn.gd" common-dep)
;; tomb
(cgo-file "toa.gd" common-dep)
(cgo-file "tob.gd" common-dep)
(cgo-file "toc.gd" common-dep)
(cgo-file "tod.gd" common-dep)
(cgo-file "toe.gd" common-dep)
(cgo-file "tbo.gd" common-dep)
(cgo-file "tombext.gd" common-dep)
;; drill
(cgo-file "dri.gd" common-dep)
(cgo-file "drb.gd" common-dep)
(cgo-file "dmi.gd" common-dep)
(cgo-file "drillmtn.gd" common-dep)
;; palace
(cgo-file "pas.gd" common-dep)
(cgo-file "pac.gd" common-dep)
(cgo-file "par.gd" common-dep)
(cgo-file "thr.gd" common-dep)
(cgo-file "palboss.gd" common-dep)
(cgo-file "pae.gd" common-dep)
(cgo-file "palout.gd" common-dep)
(cgo-file "lbrnermk.gd" common-dep)
;; strip
(cgo-file "str.gd" common-dep)
;; castle
(cgo-file "cap.gd" common-dep)
(cgo-file "cas.gd" common-dep)
(cgo-file "cab.gd" common-dep)
(cgo-file "casext.gd" common-dep)
(cgo-file "cascity.gd" common-dep)
;; dig
(cgo-file "dg1.gd" common-dep)
(cgo-file "d3a.gd" common-dep)
(cgo-file "d3b.gd" common-dep)
;; forest
(cgo-file "for.gd" common-dep)
(cgo-file "fob.gd" common-dep)
;; under
(cgo-file "und.gd" common-dep)
(cgo-file "unb.gd" common-dep)
;; consite
(cgo-file "coa.gd" common-dep)
(cgo-file "cob.gd" common-dep)
;; nest
(cgo-file "nes.gd" common-dep)
(cgo-file "neb.gd" common-dep)
(cgo-file "nestt.gd" common-dep)
;; outro
(cgo-file "outrocst.gd" common-dep)
(cgo-file "loutcstb.gd" common-dep)
(cgo-file "lthrnout.gd" common-dep)
(cgo-file "lhipout.gd" common-dep)
(cgo-file "portwall.gd" common-dep)
;; demo
(cgo-file "demo.gd" common-dep)
;; test
(cgo-file "halfpipe.gd" common-dep)
;; scene borrow packages
(cgo-file "lerltess.gd" common-dep)
(cgo-file "lsamergd.gd" common-dep)
(cgo-file "lysamsam.gd" common-dep)
(cgo-file "lsmysbrt.gd" common-dep)
(cgo-file "ltrnysam.gd" common-dep)
(cgo-file "lashthrn.gd" common-dep)
(cgo-file "lcguard.gd" common-dep)
(cgo-file "ljkdxash.gd" common-dep)
(cgo-file "lerrol.gd" common-dep)
(cgo-file "lashgrd.gd" common-dep)
(cgo-file "ltess.gd" common-dep)
(cgo-file "ltrnkrkd.gd" common-dep)
(cgo-file "ltrntess.gd" common-dep)
(cgo-file "lguard.gd" common-dep)
(cgo-file "lerbrngd.gd" common-dep)
(cgo-file "lyskdcd.gd" common-dep)
;; test levels from the ps3 version
(when USE_PS3_LEVELS
(cgo-file "skatepar.gd" common-dep)
(cgo-file "4aaron.gd" common-dep)
(cgo-file "4pal01.gd" common-dep)
(cgo-file "bsbs.gd" common-dep)
(cgo-file "chartest.gd" common-dep)
(cgo-file "ctyfence.gd" common-dep)
(cgo-file "dptest.gd" common-dep)
(cgo-file "eitest.gd" common-dep)
(cgo-file "island1.gd" common-dep)
(cgo-file "miketest.gd" common-dep)
(cgo-file "stadocc.gd" common-dep)
(cgo-file "tatetest.gd" common-dep)
(cgo-file "teststdc.gd" common-dep)
(cgo-file "teststdd.gd" common-dep)
(cgo-file "tobytest.gd" common-dep)
(cgo-file "wasall.gd" common-dep)
)
;;;;;;;;;;;;;;;;;;;;;;;;;
;; Example Custom Level
;;;;;;;;;;;;;;;;;;;;;;;;;
;; Set up the build system to build the level geometry
;; this path is relative to the custom_assets/jak2/levels folder
;; it should point to the .jsonc file that specifies the level.
(build-custom-level "test-zone")
;; the DGO file
(custom-level-cgo "TSZ.DGO" "test-zone/testzone.gd")
;;;;;;;;;;;;;;;;;;;;;
;; ANIMATIONS
;;;;;;;;;;;;;;;;;;;;;
(copy-strs "AT1INT" "AT1RES" "AT2INTRO" "AT3INTRO" "ATSA"
"ATSARA" "ATSARB" "ATSB" "ATSC" "ATSD" "ATSE" "ATSINTRO"
"ATSTANK" "BACONSIT" "BASQUID" "BAWIDOW" "CAATIN" "CAATOUT"
"CAIIINTR" "CAIIRES" "CAKBFINT" "CAKBFRES" "CASEXPLO" "CIADOFF"
"CIATICAS" "CIATINES" "CIATOUT" "CIC1RIA" "CIC1RIB" "CIC1RRES"
"CIC2RINT" "CIC2RRES" "CIC3RINT" "CIC3RRES" "CIDGVINT" "CIDSINTR"
"CIDSRES" "CIECINTR" "CIECRES" "CIEKINTR" "CIGDGUN" "CIGHOVER"
"CIGYGUN" "CIHKINTR" "CIHKRESO" "CIIDINTR" "CIIHCINT" "CIIHCRES"
"CIITINTR" "CIITRES" "CIKCINTR" "CIKCRES" "CIKDINTR" "CIMBINTR"
"CIMBRES" "CIOINTRO" "CIOL0" "CIOL1" "CIOL2" "CIOL3" "CIPHOVER"
"CIPOGINT" "CIPOGRES" "CIPSINTR" "CISBBINT" "CISLINTR" "CISOPINT"
"CISUINTR" "CIWAMINT" "CIWAMRES" "COFBRES" "CRINTRO" "CRVICTOR"
"DAMOLE" "DEDINTRO" "DESCREEN" "DIDEXPLO" "DIFTINTR" "DIFTRES"
"DIKDSINT" "DRBSBREA" "DRCBREAK" "DRDCTINT" "DRDSINTR" "DRKMHINT"
"DRTEXPLO" "DRW1" "DRW2" "ECINTRO" "ECVICTOR" "FO2INTRO" "FOBUARA"
"FOBUARB" "FOCMHINT" "FOFA" "FOFB" "FOHCMHIN" "FOPSIA" "FOPSIB"
"FOPSRES" "FOSFIA" "FOSFRES" "GRMANIMS" "INCSQUAR" "INPRISON"
"INSHUT" "INVORTEX" "JAA1" "JAA2" "JAA3" "JAA4" "JAA5" "JAA6"
"JAA7" "JABOARD" "JACARRY" "JAD1" "JAD2" "JAD3" "JAD4" "JAD5"
"JADARK" "JADON" "JADUMMY" "JAFLUT" "JAGUN" "JAICE" "JAINDAX"
"JAMECH" "JAPEGASU" "JAPIDAX" "JAPILOT" "JAPOLE" "JARACER" "JASWIM"
"JATUBE" "JATURRET" "KEANIM" "KEGARAGE" "KILTRNKR" "KILYSKDC"
"KINESTB" "KITOMBD" "KRDRES" "MOFINTRO" "MOGRES" "MOLRES" "MOSRES"
"MTAR1" "MTPBRA" "MTSPRA" "MTSPRB" "MTSPRC" "NEATIN" "NEATOUT"
"NEBBRES" "NEKBFIB" "NEKBFMID" "ONGAME" "OUHIPHOG" "OUNEST"
"OUPALACE" "OUPORT" "PABRES" "PAOWRB" "PAOWRES" "PASIRES"
"PRMINIMA" "RHW1" "RHW2" "RUB1" "RUBW1" "RUBW2" "RUBW3"
"RUBW4" "RUBW5" "RUBW6" "RUDPA1" "RUDPB1" "RUDPC1" "RUGTHRES"
"RUPC1" "RUPC2" "RUPC3" "RUSINTRO" "RUSVICTO" "RUTINTRO"
"RUTVICTO" "SALSAMER" "SCBOOK" "SE1INTRO" "SE1RES" "SE2INTRO"
"SEBUSINT" "SEBUSRES" "SEC1" "SEDRES" "SEHOSEHE" "SESGRUNT"
"SEW1" "SEW2" "TELHIPHO" "TELTRNTE" "TELWHACK" "TESCENE" "TIDINTRO"
"TOBBA" "TOBBB" "TOBINTRO" "TOBOPEN" "TOBRES" "TOBSTART" "TOFTINTR"
"TOSC0" "TOSC1" "TOSC2" "TOSSCARE" "TOTURRET" "TOUPOLES" "TOUSTART"
"TOUWATER" "UNBD1" "UNBD2" "UNBD3" "UNBD4" "UNCONE" "UNCTHREE" "UNCTWO"
"UNFSRES" "UNGSORES" "VIRESCUE" "VIRINTRO" "WOMAP" "YOFOREST" "YOLTRNYS"
"YOLYSAMS" "YOLYSKDC" "YOONINTE" "YOTOMBD")
;;;;;;;;;;;;;;;;;;;;;
;; MUSIC
;;;;;;;;;;;;;;;;;;;;;
(copy-vag-files "ENG" "FRE" "GER" "ITA" "JAP" "KOR" "SPA")
(copy-sbk-files
"ASHTAN1" "ASHTAN2" "ATOLL1" "ATOLL2" "ATOLL3" "ATOLL4"
"BBUSH1" "BOARD" "BOMBBOT1" "CASBOSS1" "CASBOSS2" "CASBOSS3"
"CASTLE1" "CASTLE2" "CASTLE3" "COMMON" "COMMONJ" "CONSITE1"
"CONSITE2" "CONSITE3" "CTYFARM1" "CTYWIDE1" "CTYWIDE2" "CTYWIDE3"
"CTYWIDE4" "CTYWIDE5" "DEMO1" "DIG1" "DIG2" "DIG3" "DIG4" "DIG5"
"DIG6" "DIG7" "DIG8" "DRILL1" "DRILL2" "DRILL3" "DRILL4" "DRILL5"
"DRILL6" "DRILL7" "DRILL8" "EMPTY0" "EMPTY1" "EMPTY2" "ERLCHAL1"
"ESCKID1" "FORDUMP1" "FORDUMP2" "FOREST1" "FOREST2" "FOREST3"
"FOREST4" "FOREST5" "FOREXIT1" "FOREXIT2" "FORRESC1" "FORRESC2"
"GUN" "GUNGAME1" "HELLDOG1" "HIDEOUT1" "HIPHOG1" "INTRO1" "INTRO2"
"INTRO3" "MECH" "MECHWAT" "MEETBRT1" "MENU1" "MOUNT1" "MOUNT2"
"MOUNT3" "NEST1" "NEST2" "NEST3" "NEST4" "NEST5" "NEST6" "ONIN1"
"ONIN2" "ORACLE1" "OUTRO1" "PALCAB1" "PALCAB2" "PALCAB3" "PALENT1"
"PALENT2" "PALENT3" "PALROOF1" "PALROOF2" "PALROOF3" "PORTRUN1"
"PROTECT1" "RUINS1" "RUINS2" "RUINS3" "SACK1" "SEWER1" "SEWER2"
"SEWER3" "SEWER4" "SEWER5" "SEWER6" "SKATE1" "STADIUM1" "STRIP1"
"STRIP2" "STRIP3" "TOMB1" "TOMB2" "TOMB3" "TOMB4" "TOMB5" "TOMB6"
"TOMB7" "TOMB8" "TOMB9" "UNDER1" "UNDER2" "UNDER3" "UNDER4" "UNDER5" "VINROOM1")
(copy-mus-files
"ATOLL" "BATTLE" "CITY1" "CREDITS" "DANGER" "DANGER1" "DANGER2"
"DANGER3" "DANGER4" "DANGER6" "DANGER7" "DANGER9" "DANGER10"
"DANGER11" "DIG" "FOREST" "FORTRESS" "MOUNTAIN" "PALCAB" "RACE"
"RUINS" "SEWER" "STRIP" "TOMB" "TWEAKVAL")
;;;;;;;;;;;;;;;;;;;;;
;; Text
;;;;;;;;;;;;;;;;;;;;;
(defstep :in "game/assets/jak2/game_text.gp"
:tool 'text
:out '("$OUT/iso/0COMMON.TXT"
"$OUT/iso/1COMMON.TXT"
"$OUT/iso/2COMMON.TXT"
"$OUT/iso/3COMMON.TXT"
"$OUT/iso/4COMMON.TXT"
"$OUT/iso/5COMMON.TXT"
"$OUT/iso/6COMMON.TXT"
"$OUT/iso/7COMMON.TXT")
)
(defstep :in "game/assets/jak2/game_subtitle.gp"
:tool 'subtitle-v2
:out '("$OUT/iso/0SUBTI2.TXT")
)
;;;;;;;;;;;;;;;;;;;;;
;; ISO Group
;;;;;;;;;;;;;;;;;;;;;
;; the iso group is a group of files built by the "(mi)" command.
(group-list "iso"
`("$OUT/iso/0COMMON.TXT"
"$OUT/iso/1COMMON.TXT"
"$OUT/iso/2COMMON.TXT"
"$OUT/iso/3COMMON.TXT"
"$OUT/iso/4COMMON.TXT"
"$OUT/iso/5COMMON.TXT"
"$OUT/iso/6COMMON.TXT"
"$OUT/iso/7COMMON.TXT"
"$OUT/iso/0SUBTI2.TXT"
"$OUT/iso/TWEAKVAL.MUS"
"$OUT/iso/VAGDIR.AYB"
,@(reverse *all-vis*)
,@(reverse *all-str*)
,@(reverse *all-sbk*)
,@(reverse *all-mus*)
,@(reverse *all-vag*)
,@(reverse *all-cgos*))
)
(group-list "text"
`("$OUT/iso/0COMMON.TXT"
"$OUT/iso/1COMMON.TXT"
"$OUT/iso/2COMMON.TXT"
"$OUT/iso/3COMMON.TXT"
"$OUT/iso/4COMMON.TXT"
"$OUT/iso/5COMMON.TXT"
"$OUT/iso/6COMMON.TXT"
"$OUT/iso/7COMMON.TXT"
"$OUT/iso/0SUBTI2.TXT"
)
)
;; used for the type consistency test.
(group-list "all-code"
`(,@(reverse *all-gc*))
)
(group "engine"
"$OUT/iso/0COMMON.TXT"
"$OUT/iso/0SUBTI2.TXT"
"$OUT/iso/KERNEL.CGO"
"$OUT/iso/GAME.CGO"
"$OUT/iso/VAGDIR.AYB"
"$OUT/iso/VAGWAD.ENG"
)