Files
airship-autopilot/build.sh
Sterister 3e27b3f52b Auto-resume flight across chunk unload/reload
When the ship's chunk unloads the CC computer powers off and its redstone
outputs reset to 0, so on return the ship dropped and the pilot had to
re-ENGAGE every time. Flight state now survives the reboot:

- engaged.txt flag written while flying, cleared on pilot STOP.
- On boot, if engaged + profile present: drive the hover baseline
  immediately (closes the fall gap), then runStandby(true) re-enters the
  flight loop automatically with the persisted target -- no manual ENGAGE.
- runFly drives hover before its first sleep so no entry path leaves a
  0-output gap.
- Cleanup no longer lifts a PARKED ship: Ctrl+T out of standby holds hover
  only when engaged, else valves off.
- engaged.txt registered as per-ship state (gitignore, installer keep/reset,
  menu reset, build excludes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-25 17:55:15 +02:00

81 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# build.sh -- regenerer per-rolle-manifester fra files/ (REPOET er kilden installeren serverer).
# Vanlig flyt etter kodeendring: ./build.sh && git commit -am "sync" && git push
#
# Valgfri synk mot singleplayer-verdenen (dev-miljoeet):
# ./build.sh --from-world [computer-dir] # verden -> files/ (kun kode; state/legacy filtreres)
# ./build.sh --to-world [computer-dir] # files/ -> verden (kun kode; roerer aldri state)
set -euo pipefail
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WORLD_DEFAULT="/home/stian/.local/share/ModrinthApp/profiles/Modda wii/saves/New World/computercraft/computer"
# rolle -> computer-id i verdenen
declare -A ROLE_SRC=(
[autopilot]=0 # maskinrom: startup -> ap boot -> wizard/standby
[cockpit]=4 # pilot-hus: startup -> cockpit
)
# per-skip tilstand + utdaterte verktoey: shippes ALDRI (installeren rydder dem ogsaa)
EXCLUDES=(calib.txt sides.txt target.txt settings.txt engaged.txt scan.txt pid_gains.txt
stabilize.lua diag.lua probe.lua scan.lua manifest)
# rolle-spesifikt: cockpit-koden hoerer ikke hjemme paa autopilot-PCen
declare -A ROLE_EXCLUDES=(
[autopilot]="cockpit.lua pilot_startup.lua"
[cockpit]=""
)
is_excluded() { # $1=rolle $2=relativ sti
local base x; base="$(basename "$2")"
case "$base" in *.log|*.old|.installed_*) return 0;; esac
for x in "${EXCLUDES[@]}"; do [ "$base" = "$x" ] && return 0; done
for x in ${ROLE_EXCLUDES[$1]}; do [ "$base" = "$x" ] && return 0; done
return 1
}
mode="${1:-manifests}"
world="${2:-$WORLD_DEFAULT}"
case "$mode" in
manifests) ;;
--from-world|--to-world)
if [ ! -d "$world" ]; then
echo "error: world computer dir not found: $world" >&2
echo "pass the path as arg 2 if the world moved." >&2
exit 1
fi
for role in "${!ROLE_SRC[@]}"; do
id="${ROLE_SRC[$role]}"
src="$world/$id"; dst="$REPO/files/$role"
if [ "$mode" = "--from-world" ]; then from="$src"; to="$dst"; else from="$dst"; to="$src"; fi
if [ ! -d "$from" ]; then
echo "warn: source dir missing for role '$role' ($from), skipping" >&2
continue
fi
while IFS= read -r rel; do
if ! is_excluded "$role" "$rel"; then
mkdir -p "$to/$(dirname "$rel")"
cp "$from/$rel" "$to/$rel"
fi
done < <(cd "$from" && find . -type f | sed 's|^\./||')
echo "synced role '$role' ($mode)"
done
;;
*)
echo "usage: ./build.sh [--from-world|--to-world] [computer-dir]" >&2
exit 1
;;
esac
# manifester: nylinje-separerte relative stier. LC_ALL=C sort er VIKTIG: locale-avhengig
# (case-insensitiv) sortering kan stokke om case-varianter og gi udefinert install-rekkefoelge.
for role in "${!ROLE_SRC[@]}"; do
dst="$REPO/files/$role"
[ -d "$dst" ] || continue
while IFS= read -r rel; do
is_excluded "$role" "$rel" || printf '%s\n' "$rel"
done < <(cd "$dst" && find . -type f ! -name manifest | sed 's|^\./||' | LC_ALL=C sort) > "$dst/manifest"
echo "role '$role': $(wc -l < "$dst/manifest") files"
done
echo "done. manifests regenerated."