.SECONDARY: # PROJECT_DIR?=C:\\hammer\ttt_terrorcon PYTHON_BIN?=./env/scripts/python SHLEX_BIN?=./contrib/shlex SHLEX_FLAGS?=--low EPOLL_THEN_BIN?=$(PYTHON_BIN) ./contrib/epoll-then EPOLL_THEN_FLAGS?= #SHELL=C:\\Program\ Files\\Git\\bin\\bash.exe #.SHELLFLAGS=-c GAME?=hl2.exe CONSOLE_LOG?=garrysmod/console.log GAME_TTT_FLAGS?=+ttt_preptime_seconds 3 +ttt_firstpreptime 3 +gamemode terrortown +ttt_debug_preventwin 1 GAME_PLAY_FLAGS?=+mat_specular 1 +mat_hdr_level 1 $(GAME_TTT_FLAGS) GAME_FLAGS?=-condebug # gmod desktop ignores rcon listening # -usercon +rcon_password runme GAME_DIR?=C:\\Program Files (x86)\\Steam\\steamapps\\common\\GarrysMod\\ VBIN_DIR?=$(GAME_DIR)bin\\ MOD_DIR?=$(GAME_DIR)garrysmod\\ MOUNT_DIR?=.\\ VBIN_FLAGS?=-game "'$(MOD_DIR)'" # windows is insufferable # ALL bins have a space in the name and NO WINDOWS SHELL # can handle bins with spaces in the name, WTF SHLEX_HL2LOG_FLAGS?=--tail-bin CPROGRAMFILES/Git/usr/bin/tail.exe --tail CPROGRAMFILESOLD\\steam\\steamapps\\common\\garrysmod\\$(CONSOLE_LOG) SUPERVISE_V_BIN?=./contrib/supervise-v SUPERVISE_V_FLAGS?=--shlex BSP_BIN?=$(SUPERVISE_V_BIN) $(SUPERVISE_V_FLAGS) "'$(VBIN_DIR)vbsp.exe'" BSP_FLAGS?=$(VBIN_FLAGS) VIS_BIN?=$(SUPERVISE_V_BIN) $(SUPERVISE_V_FLAGS) "'$(VBIN_DIR)vvis.exe'" VIS_FLAGS?=$(VBIN_FLAGS) -fast RAD_BIN?=$(SUPERVISE_V_BIN) $(SUPERVISE_V_FLAGS) "'$(VBIN_DIR)vrad.exe'" RAD_FLAGS?=$(VBIN_FLAGS) -StaticPropLighting -bounce 2 -noextra # -StaticPropSampleScale 0.25 BSPZIP_BIN?=$(SUPERVISE_V_BIN) $(SUPERVISE_V_FLAGS) "'$(VBIN_DIR)bspzip.exe'" BSPZIP_FLAGS?=$(VBIN_FLAGS) GMAD_BIN?="$(VBIN_DIR)gmad.exe" GMAD_FLAGS?= GMPUBLISH_BIN?="'$(VBIN_DIR)gmpublish.exe'" GMPUBLISH_FLAGS?="update -id 2600874638" # or "create" GEN_BSPZIP_ADDLIST_BIN?=$(PYTHON_BIN) ./contrib/gen-bspzip-addlist GEN_BSPZIP_ADDLIST_FLAGS?=--pack-used-local GMA_INSTALL_BSPZIP_ADDLIST_BIN?=$(PYTHON_BIN) ./contrib/gma-install-bspzip-addlist GMA_INSTALL_BSPZIP_ADDLIST_FLAGS?= J2_BIN?=$(PYTHON_BIN) ./contrib/j2 J2_FLAGS?= GMAD_TAR_BIN?=$(PYTHON_BIN) ./contrib/gmad-tar GMAD_TAR_FLAGS?= MOUNT_BIN?=$(PYTHON_BIN) ./contrib/mount MOUNT_FLAGS?=--mod-dir "'$(MOD_DIR)'" WINPGREP_BIN?=./contrib/winpgrep WINPGREP_FLAGS?= %_p.bsp: %.bsp $(BSPZIP_BIN) -addlist $^ $(^:.bsp=.bspzip-addlist) $@ $(BSPZIP_FLAGS) cp $@ $(MOUNT_DIR)maps\\$(notdir $@) # ? %.bspzip-addlist: %.vmf $(GEN_BSPZIP_ADDLIST_BIN) $(GEN_BSPZIP_ADDLIST_FLAGS) $^ > $@ game: $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_PLAY_FLAGS) %.game: %.bsp ifeq ($(GAME),0) echo "user disabled run game via GAME=0" else $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_PLAY_FLAGS) +map $(notdir $(basename $^)) endif %.game-mount: addons/%/.mount ifeq ($(GAME),0) echo "user disabled run game via GAME=0" else $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_PLAY_FLAGS) +map $(notdir $(^:/.mount=)) endif %.game-only: $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_PLAY_FLAGS) +map $(notdir $(basename $@)) maps/%.bsp: %.bsp ln -f $^ $@ # hammer default flags %.bsp: %.vmf # default $(BSP_BIN) $(VBIN_FLAGS) $(basename $^) $(VIS_BIN) $(VBIN_FLAGS) $(basename $^) $(RAD_BIN) $(VBIN_FLAGS) $(basename $^) $(GEN_BSPZIP_ADDLIST_BIN) $(GEN_BSPZIP_ADDLIST_FLAGS) $^ > $(@:.bsp=.bspzip-addlist) %_fast.bsp: %.vmf # fast $(BSP_BIN) $(VBIN_FLAGS) $(basename $^) $(VIS_BIN) -fast $(VBIN_FLAGS) $(basename $^) $(RAD_BIN) -bounce 2 -noextra $(VBIN_FLAGS) $(basename $^) ln -f $(@:_fast.bsp=.vmf) $(@:_fast.bsp=_fast.vmf) mv $(@:_fast.bsp=.bsp) $@ $(GEN_BSPZIP_ADDLIST_BIN) $(GEN_BSPZIP_ADDLIST_FLAGS) $^ > $(@:.bsp=.bspzip-addlist) %_hdr.bsp: %.vmf # hdr $(BSP_BIN) $(VBIN_FLAGS) $(basename $^) $(VIS_BIN) $(VBIN_FLAGS) $(basename $^) $(RAD_BIN) -both $(VBIN_FLAGS) $(basename $^) ln -f $(@:_hdr.bsp=.vmf) $(@:_hdr.bsp=_hdr.vmf) mv $(@:_hdr.bsp=.bsp) $@ $(GEN_BSPZIP_ADDLIST_BIN) $(GEN_BSPZIP_ADDLIST_FLAGS) $^ > $(@:.bsp=.bspzip-addlist) %_hdr_final.bsp: %.vmf # hdr-final $(BSP_BIN) $(VBIN_FLAGS) $(basename $^) $(VIS_BIN) $(VBIN_FLAGS) $(basename $^) $(RAD_BIN) -both -final $(VBIN_FLAGS) $(basename $^) ln -f $(@:_hdr_final.bsp=.vmf) $(@:_hdr_final.bsp=_hdr_final.vmf) mv $(@:_hdr_final.bsp=.bsp) $@ $(GEN_BSPZIP_ADDLIST_BIN) $(GEN_BSPZIP_ADDLIST_FLAGS) $^ > $(@:.bsp=.bspzip-addlist) # note, most of the console is blocked # https://wiki.facepunch.com/gmod/Blocked_ConCommands # see workarounds/ # note, lua scripts do not use cfg/mount.cfg like other hl2 engine mod content # example run lua on bsp # ln -f lua/cubeldr.lua "$(MOD_DIR)/lua/autorun/runme.lua" # $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ # "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_TTT_FLAGS) +sv_cheats 1 \ # +map $(notdir $(basename $^)) # rm "$(MOD_DIR)/lua/autorun/runme.lua" %.cubeldr: %.bsp ln -f "$^" "$(MOD_DIR)/maps/cubeldr.bsp" ./workarounds/buildcubemaps.exe & $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_TTT_FLAGS) +sv_cheats 1 \ +mat_specular 0 +map cubeldr rm -v "$(MOD_DIR)/maps/cubeldr.bsp" %.cubehdr: %.bsp %.cubeldr ln -f "$(word 1, $^)" "$(MOD_DIR)/maps/cubehdr.bsp" ./workarounds/buildcubemaps.exe & $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_TTT_FLAGS) \ +sv_cheats 0 +mat_hdr_level 2 +sv_cheats 1 +map cubehdr rm -v "$(MOD_DIR)/maps/cubehdr.bsp" # settle physics %.setphys: %.bsp # precompile map from vmf mkdir -p "$(MOD_DIR)/mapsrc" ln -f "$^" "$(MOD_DIR)/maps/setphys.bsp" ln -f "$(^:.bsp=.vmf)" "$(MOD_DIR)/mapsrc/setphys.vmf" # open vmf in hammer "$(VBIN_DIR)/hammer.exe" "$(MOD_DIR)/mapsrc/setphys.vmf" & sleep 2 ./workarounds/setphys.exe & # open bsp in game via map_edit $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_TTT_FLAGS) \ +sv_cheats 1 +map_edit setphys rm -v "$(MOD_DIR)/maps/setphys.bsp" rm -i "$(MOD_DIR)/mapsrc/setphys.vmf" %.nav: %.bsp ln -f "$^" "$(MOD_DIR)/maps/navgen.bsp" cp -v lua/nav_generate.txt "$(MOD_DIR)/data/runme.txt" ln -f lua/nav_generate.lua "$(MOD_DIR)/lua/autorun/runme.lua" $(SHLEX_BIN) $(SHLEX_FLAGS) $(SHLEX_HL2LOG_FLAGS) \ "'$(GAME_DIR)$(GAME)'" -allowdebug $(VBIN_FLAGS) $(GAME_FLAGS) $(GAME_TTT_FLAGS) \ +sv_cheats 1 +nav_edit 1 +map navgen & $(SHLEX_BIN) $(SHLEX_FLAGS) $(EPOLL_THEN_BIN) $(EPOLL_THEN_FLAGS) \ --literal ng_f --file "'$(MOD_DIR)/data/runme.txt'" --timeout-sec 900 -- \ taskkill -f -pid "`$(WINPGREP_BIN) $(WINPGREP_FLAGS) hl2.exe`" # ^ watch "$(MOD_DIR)/data/runme.txt" for content "ng_f", when match: kill hl2.exe # timeout: 15min cp -v "$(MOD_DIR)/maps/navgen.nav" $@ rm -v \ "$(MOD_DIR)/lua/autorun/runme.lua" \ "$(MOD_DIR)/maps/navgen.bsp" mkdir -p maps/graphs cp -v "$(MOD_DIR)/maps/graphs/navgen.ain" $(basename $@).ain rm -v "$(MOD_DIR)/maps/graphs/navgen.ain" _comments: true # only ents works on an existing bsp, # which are not typically left "in place" for this operation #%_ents.bsp: %.vmf # # only-ents # $(BSP_BIN) -onlyents $(VBIN_FLAGS) $(basename $^) # mv $(@:_ents.bsp=.bsp) $@ # create gma files for publishing # testing requirest then extracting the gma and mounting it via # Garrysmod/garrysmod/cfg/mount.cfg # # todo: pack bsp-zip list with gma instead (non _p variants? only) # #$(J2_BIN) $(J2_FLAGS) addons-src/materials/vgui/maps/menu_thumb_$(basename $^).vmt #$(J2_BIN) $(J2_FLAGS) addons-src/maps/$(basename $(word 1, $^)).res #cp addons-src/512x512.vtf addons-src/materials/vgui/maps/menu_thumb_$(basename $^).vtf #cp addons-src/128x128.png addons-src/maps/thumb/$(basename $^).png # addons-src/materials/vgui/maps/*.vmt # addons-src/materials/vgui/maps/*.vtf # addons-src/maps/*.res # $(GMAD_BIN) $(GMAD_FLAGS) create -folder "addons-src" -out "$@" addons/%.gma: %.bsp %.nav %.cubehdr addons-src/addon.json rm -rv \ addons-src/maps/*.bsp \ addons-src/maps/thumb/*.png \ || true cp $(word 1, $^) addons-src/maps/ # bsp cp $(word 2, $^) addons-src/maps/ # nav mkdir -p addons-src/maps/graphs/ cp $(basename $(word 2, $^)).ain addons-src/maps/graphs/ # nav2 cp thumbnail_map_128.png addons-src/maps/thumb/$(basename $(word 1, $^)).png # in-game thumb $(GMA_INSTALL_BSPZIP_ADDLIST_BIN) $(GMA_INSTALL_BSPZIP_ADDLIST_FLAGS) --bspzip-addlist $(basename $(word 1, $^)).bspzip-addlist --dst-prefix addons-src $(GMAD_TAR_BIN) addons-src/ --output-tar $(@:.gma=.tar) --tar-prefix $(basename $(word 1, $^)) --gmad-bin $(GMAD_BIN) --output-gma $@ --output-index $(@:.gma=.tar-index) --output-digest $(@:.gma=.tar-sha1sums) addons/%/.d: addons/%.gma tar -C addons -xvf $(^:.gma=.tar) touch $@ addons/%: addons/%/.d true mount: $(SHLEX_BIN) $(SHLEX_FLAGS) $(MOUNT_BIN) $(MOUNT_FLAGS) mount-dev: $(SHLEX_BIN) $(SHLEX_FLAGS) $(MOUNT_BIN) $(MOUNT_FLAGS) --set-mount ttt_terrorcon "'$(PROJECT_DIR)'" --normpath addons/%/.mount: addons/%/.d $(SHLEX_BIN) $(SHLEX_FLAGS) $(MOUNT_BIN) $(MOUNT_FLAGS) --set-mount ttt_terrorcon "'$(PROJECT_DIR)\\$(basename $@)'" --normpath # garrysmod refuses to load gma files untill after thier published and live # so no use trying to test them #.PHONY: install-addons # #install-addons: # cp -var addons/*.gma $(MOD_DIR)/addons/ publish: addons/ttt_terrorcon_v2_hdr_final.gma $(SHLEX_BIN) $(SHLEX_FLAGS) $(GMPUBLISH_BIN) $(GMPUBLISH_FLAGS) -icon "'C:\\hammer\\ttt_terrorcon\\addons\\512x512.jpg'" -addon "$^" # custom rules .DEFAULT: all all: lint addons/ttt_terrorcon_v2_hdr_final.gma fast: lint mount-dev maps/ttt_terrorcon_v2_fast.bsp ttt_terrorcon_v2_fast.game # use mount-dev instead #install-bsp: maps/ttt_terrorcon_v2_hdr_final.bsp maps/thumb/ttt_terrorcon_v2_hdr_final.png # cp -v $(word 1, $^) $(MOD_DIR)maps\\ # cp -v $(word 2, $^) $(MOD_DIR)maps\\thumb\\ # gmod dosn't allow mounting gma files # so instead, i've got a parallel artifact being built that can be installed to garrysmod # tar files are produced, these can be extracted and added as a garrysmod mount to test #install-gma: addons/ttt_terrocon_v2_hdr_final_p.gma # cp -v $^ $(MOD_DIR)addons\\ lint: ttt_terrorcon_v2.bspzip-addlist $(PYTHON_BIN) ./contrib/bspzip-lint $^ 2>&1 | tee $^.lint hl2pid: $(WINPGREP_BIN) $(WINPGREP_FLAGS) hl2.exe killhl2: taskkill -f -pid `$(WINPGREP_BIN) $(WINPGREP_FLAGS) hl2.exe`