diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8364e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +3rd-party-bin diff --git a/builder b/builder new file mode 100644 index 0000000..504652d --- /dev/null +++ b/builder @@ -0,0 +1,438 @@ +#!/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") + +source "$ScriptDir/helper.lib" + +# Common +SteamPath=$(reg_readkey "HKCU\Software\Valve\Steam" "SteamPath") +DocumentsPath=$(reg_readkey "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Personal") +WorkDir="$(dirname "$(readlink -e "$0")")" +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.ini" # not ini at all but who cares? :D +MutTestConfig="$MutSource/test.ini" + +# 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 +MutWsInfoName="wsinfo.txt" +MutWsInfo="$KFDoc/$MutWsInfoName" +KFEditorConfBackup="$KFEditorConf.backup" + +function show_help () +{ + cat < "$MutBuildConfig" + + while read 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 + 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 + 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 UpkList="" + + cp -f "$KFUnpublishScript/$1.u" "$KFWin64" + + while read 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 + local ModificationTime=$(stat -c %y "$KFWin64/$1.u") + CMD //C "cd "$(cygpath -w "$KFWin64")" && $(basename "$KFEditorMergePackages") make $UpkList $1.u" & + local 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 () +{ + 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" + find $PackageBuildOrder -type f -name '*.upk' -exec cp -f {} "$KFUnpublishPackages" \; + + 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 -useunpublished & + local 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 () +{ + 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" & + local 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 () +{ + 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 + + local PreparedWsDir=$(mktemp -d -u -p "$KFDoc") + + cat > "$MutWsInfo" < "$MutTestConfig" <