#!/bin/bash # Requirements: git-bash # https://git-scm.com/download/win set -Eeuo pipefail # set -o xtrace trap cleanup SIGINT SIGTERM ERR EXIT ScriptFullname=$(readlink -e "$0") ScriptName=$(basename "$0") ScriptDir=$(dirname "$ScriptFullname") # Useful things source "$ScriptDir/common.lib" # Common SteamPath=$(reg_readkey "HKCU\Software\Valve\Steam" "SteamPath") DocumentsPath=$(reg_readkey "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Personal") ThirdPartyBin="$ScriptDir/3rd-party-bin" # Usefull KF2 executables / Paths / Configs KFDoc="$DocumentsPath/My Games/KillingFloor2" KFPath="$SteamPath/steamapps/common/killingfloor2" KFWin64="$KFPath/Binaries/Win64" KFEditor="$KFWin64/KFEditor.exe" KFEditorPatcher="$KFWin64/kfeditor_patcher.exe" KFEditorMergePackages="$KFWin64/KFEditor_mergepackages.exe" KFGame="$KFWin64/KFGame.exe" KFWorkshop="$KFPath/Binaries/WorkshopUserTool.exe" KFUnpublish="$KFDoc/KFGame/Unpublished" KFPublish="$KFDoc/KFGame/Published" KFEditorConf="$KFDoc/KFGame/Config/KFEditor.ini" # Source filesystem MutSource="$ScriptDir/.." MutPubContent="$MutSource/PublicationContent" MutConfig="$MutSource/Config" MutLocalization="$MutSource/Localization" MutBuildConfig="$MutSource/build.cfg" MutTestConfig="$MutSource/test.cfg" # Steam workshop upload filesystem KFUnpublishBrewedPC="$KFUnpublish/BrewedPC" KFUnpublishPackages="$KFUnpublishBrewedPC/Packages" KFUnpublishScript="$KFUnpublishBrewedPC/Script" KFUnpublishConfig="$KFUnpublish/Config" KFUnpublishLocalization="$KFUnpublish/Localization" KFPublishBrewedPC="$KFPublish/BrewedPC" KFPublishPackages="$KFPublishBrewedPC/Packages" KFPublishScript="$KFPublishBrewedPC/Script" KFPublishConfig="$KFPublish/Config" KFPublishLocalization="$KFPublish/Localization" # Tmp files MutWsInfo="$KFDoc/wsinfo.txt" KFEditorConfBackup="$KFEditorConf.backup" function show_help () { cat < /dev/null) EOF } function cleanup() { trap - SIGINT SIGTERM ERR EXIT restore_kfeditorconf } function backup_kfeditorconf () { cp -f "$KFEditorConf" "$KFEditorConfBackup" } function restore_kfeditorconf () { if [[ -f "$KFEditorConfBackup" ]]; then mv -f "$KFEditorConfBackup" "$KFEditorConf" fi } function init_build () { local PackageList="" :> "$MutBuildConfig" while read -r Package do if [[ -z "$PackageList" ]]; then PackageList="$Package" else PackageList="$PackageList $Package" fi done < <(find "$MutSource" -mindepth 2 -maxdepth 2 -type d -ipath '*/Classes' | sed -r 's|.+/([^/]+)/[^/]+|\1|' | sort) echo "PackageBuildOrder=\"$PackageList\"" >> "$MutBuildConfig" echo "PackageUpload=\"$PackageList\"" >> "$MutBuildConfig" } function read_build_settings () { if ! [[ -f "$MutBuildConfig" ]]; then init_build; fi if bash -n "$MutBuildConfig"; then # shellcheck source=./.shellcheck/build.cfg source "$MutBuildConfig" else echo "$MutBuildConfig broken! Check this file before continue or create new one using $0 --init-build" return 1 fi } function read_test_settings () { if ! [[ -f "$MutTestConfig" ]]; then init_test; fi if bash -n "$MutTestConfig"; then # shellcheck source=./.shellcheck/test.cfg source "$MutTestConfig" else echo "$MutTestConfig broken! Check this file before continue or create new one using $0 --init-test" return 1 fi } function merge_packages () # $1: Mutator name { local ModificationTime="" local UpkList="" local PID="" cp -f "$KFUnpublishScript/$1.u" "$KFWin64" while read -r Upk do cp -f "$MutSource/$1/$Upk" "$KFWin64" UpkList="$UpkList $Upk" done < <(find "$MutSource/$1" -type f -name '*.upk' -printf "%f\n") if [[ -n "$UpkList" ]]; then ModificationTime=$(stat -c %y "$KFWin64/$1.u") CMD //C "cd \"$(cygpath -w "$KFWin64")\" && $(basename \""$KFEditorMergePackages"\") make $UpkList $1.u" & PID="$!" while ps -p "$PID" &> /dev/null do if [[ "$ModificationTime" != "$(stat -c %y "$KFWin64/$1.u")" ]]; then # file changed sleep 2 # wait a bit in case the file hasn't been written to the end yet kill "$PID"; break fi sleep 2 done fi for Upk in $UpkList; do rm -f "$KFWin64/$Upk"; done # cleanup } function compiled () { for Package in $PackageBuildOrder do if ! test -f "$KFUnpublishScript/$Package.u"; then return 1 fi done } function compile () { local PID="" read_build_settings if ! command -v multini &> /dev/null; then get_latest_multini "$ThirdPartyBin" fi backup_kfeditorconf multini --del "$KFEditorConf" 'ModPackages' 'ModPackages' for Package in $PackageBuildOrder do multini --add "$KFEditorConf" 'ModPackages' 'ModPackages' "$Package" done multini --set "$KFEditorConf" 'ModPackages' 'ModPackagesInPath' "$(cygpath -w "$MutSource")" rm -rf "$KFUnpublish" "$KFPublish" mkdir -p "$KFUnpublishPackages" "$KFUnpublishScript" for Package in $PackageBuildOrder do find "$MutSource/$Package" -type f -name '*.upk' -exec cp -f {} "$KFUnpublishPackages" \; done if [[ -d "$MutLocalization" ]]; then mkdir -p "$KFUnpublishLocalization" cp -rf "$MutLocalization"/* "$KFUnpublishLocalization" fi if [[ -d "$MutConfig" ]]; then mkdir -p "$KFUnpublishConfig" cp -rf "$MutConfig"/* "$KFUnpublishConfig" fi CMD //C "$(cygpath -w "$KFEditor")" make -stripsource -useunpublished & PID="$!" while ps -p "$PID" &> /dev/null do if compiled; then kill "$PID"; break; fi sleep 2 done restore_kfeditorconf } function publish_common () { if [[ -d "$MutLocalization" ]]; then mkdir -p "$KFPublishLocalization" cp -rf "$MutLocalization"/* "$KFPublishLocalization" fi if [[ -d "$MutConfig" ]]; then mkdir -p "$KFPublishConfig" cp -rf "$MutConfig"/* "$KFPublishConfig" fi } function brewed () { for Package in $PackageUpload do if ! test -f "$KFPublishBrewedPC/$Package.u"; then return 1 fi done } function brew () { local PID="" read_build_settings if ! compiled ; then echo "You must compile packages before brewing. Use $0 --compile for this." exit 1 fi rm -rf "$KFPublish" mkdir -p "$KFPublishBrewedPC" CMD //C "cd \"$(cygpath -w "$KFWin64")\" && \"$(basename "$KFEditor")\" brewcontent -platform=PC $PackageUpload -useunpublished" & PID="$!" while ps -p "$PID" &> /dev/null do if brewed; then kill "$PID"; break; fi sleep 2 done publish_common rm -f "$KFPublishBrewedPC"/*.tmp # cleanup } function brew_manual () { read_build_settings if ! compiled ; then echo "You must compile packages before brewing. Use $0 --compile for this." exit 1 fi rm -rf "$KFPublish" mkdir -p "$KFPublishBrewedPC" "$KFPublishScript" if ! [[ -x "$KFEditorPatcher" ]]; then get_latest_kfeditor_patcher "$KFEditorPatcher" fi pushd "$KFWin64" && "$KFEditorPatcher"; popd for Package in $PackageUpload do merge_packages "$Package" mv "$KFWin64/$Package.u" "$KFPublishScript" done publish_common } function upload () { local PreparedWsDir="" read_build_settings if ! compiled ; then echo "You must compile packages before uploading. Use $0 --compile for this." exit 1 fi if ! [[ -d "$KFPublish" ]]; then echo "Warn: uploading without brewing" mkdir -p "$KFPublishBrewedPC" "$KFPublishScript" for Package in $PackageUpload do cp -f "$KFUnpublishScript/$Package.u" "$KFPublishScript" done if [[ -d "$KFUnpublishPackages" ]]; then cp -rf "$KFUnpublishPackages" "$KFPublishPackages" fi publish_common fi PreparedWsDir=$(mktemp -d -u -p "$KFDoc") cat > "$MutWsInfo" < "$MutTestConfig" <