Blog/jokoak_euskaraz/stray/sortu_scripta.py
(Deskargatu)
#!/usr/bin/env python3
"""
stray_euskaraz.sh (instalatzaile bakarra) sortzen du.
build/Game_eu.locres-etik abiatuta, 16 hizkuntzetako pak-a eraiki
eta base64 bezala txertatzen du script bakarrean.
"""
import base64
import os
import shutil
import subprocess
import textwrap
BASE = os.path.dirname(os.path.abspath(__file__))
REPAK = "/tmp/opencode/repak/repak_cli-x86_64-unknown-linux-gnu/repak"
CULTURES = "de en es es-419 fr it ja ko nl pl pt-BR pt-PT ru tr zh-Hans zh-Hant".split()
LOCRES = os.path.join(BASE, "build", "Game_eu.locres")
MODCONTENT = os.path.join(BASE, "modcontent16")
PAK16 = os.path.join(BASE, "build16", "Hk_project-WindowsNoEditor_Override.pak")
SCRIPT = os.path.join(BASE, "stray_euskaraz.sh")
HEADER = r'''#!/usr/bin/env bash
# ============================================================
# STRAY EUSKARAZ — instalatzaile bakarra
# Kopiatu, exekutatu eta jolastu euskaraz.
#
# Erabilera:
# bash stray_euskaraz.sh -> instalatu eta jokoa piztu
# bash stray_euskaraz.sh --instalatu -> soilik instalatu
# bash stray_euskaraz.sh --kendu -> desinstalatu
# bash stray_euskaraz.sh --info -> diagnostikoa (non bilatzen duen)
# bash stray_euskaraz.sh --bidea <bidea> -> jokoaren karpeta eskuz zehaztu
# <bidea> jokoaren erroa edo Paks karpeta izan daiteke.
# Beste aukerekin ere konbina daiteke (adib.: --bidea ... --kendu).
# bash stray_euskaraz.sh --help -> laguntza
# ============================================================
set -e
APPID=1332010
PAK_NAME="Hk_project-WindowsNoEditor_Override.pak"
MAIN_PAK="Hk_project-WindowsNoEditor.pak"
# ---------- Argumentuak ----------
AK=""
BIdea=""
while [ $# -gt 0 ]; do
case "$1" in
--info) AK="info" ;;
--instalatu|-i) AK="instalatu" ;;
--kendu|-k) AK="kendu" ;;
--help|-h) AK="laguntza" ;;
--bidea|--path|-p)
[ $# -ge 2 ] || { echo "ERRORE: --bidea <bidea> adierazi behar da."; exit 1; }
BIdea="$2"; shift ;;
*) echo "Aukera ezezaguna: $1"; exit 1 ;;
esac
shift
done
# ---------- Laguntza ----------
if [ "$AK" = "laguntza" ]; then
cat << 'LAGUNTZA'
Erabilera: bash stray_euskaraz.sh [AUKERAK]
(aukera gabe) instalatu eta jokoa piztu
--instalatu, -i soilik instalatu (jokoa ez piztu)
--kendu, -k desinstalatu
--info diagnostikoa: non bilatzen duen eta zer aurkitu duen
--bidea <bidea>,
--path <bidea>, -p <bidea> jokoaren karpeta eskuz zehaztu (erroa edo Paks)
--help, -h laguntza hau erakutsi
Adibideak:
bash stray_euskaraz.sh
bash stray_euskaraz.sh --bidea /media/gehiago/steamapps/common/STRAY --kendu
bash stray_euskaraz.sh --info
LAGUNTZA
exit 0
fi
# ---------- Steam liburutegien erroak aurkitu ----------
LIBRARIES=()
VDF=""
for b in "$HOME/.local/share/Steam/steamapps" "$HOME/.steam/steam/steamapps"; do
if [ -f "$b/libraryfolders.vdf" ]; then VDF="$b/libraryfolders.vdf"; break; fi
done
if [ -n "$VDF" ]; then
# formatu zaharra: "0" "/ruta"
while IFS= read -r p; do [ -n "$p" ] && LIBRARIES+=("$p"); done \
< <(grep -oP '^\s*"\d+"\s+"\K[^"]+' "$VDF")
# formatu berria: "path" "/ruta"
while IFS= read -r p; do [ -n "$p" ] && LIBRARIES+=("$p"); done \
< <(grep -oP '^\s*"path"\s+"\K[^"]+' "$VDF")
fi
LIBRARIES+=("$HOME/.local/share/Steam")
LIBRARIES+=("$HOME/.steam/steam")
# ---------- Stray-ren Paks karpeta aurkitu ----------
GAME_PAKS=""
search_common() {
local base="$1"
[ -d "$base" ] || return 0
local dir p
for dir in "$base"/STRAY "$base"/Stray "$base"/stray; do
[ -d "$dir" ] || continue
p=$(find "$dir" -name "$MAIN_PAK" 2>/dev/null | head -1)
if [ -n "$p" ]; then GAME_PAKS="$(dirname "$p")"; return 1; fi
done
return 0
}
# ---------- Bidea eskuz emanda badago, hori lehenetsi ----------
if [ -n "$BIdea" ]; then
[ -d "$BIdea" ] || { echo "ERRORE: bidea ez da existitzen: $BIdea"; exit 1; }
local_pak=$(find "$BIdea" -name "$MAIN_PAK" 2>/dev/null | head -1)
if [ -n "$local_pak" ]; then
GAME_PAKS="$(dirname "$local_pak")"
else
echo "ERRORE: ez da Stray pak-a aurkitu bide honetan: $BIdea"
exit 1
fi
else
for lib in "${LIBRARIES[@]}"; do
search_common "${lib%/}/steamapps/common" && continue || break
done
if [ -z "$GAME_PAKS" ]; then
for m in /run/media/* /media/*; do
[ -d "$m" ] || continue
search_common "$m/steamapps/common" && continue || break
done
fi
fi
# ---------- Diagnostikoa ----------
if [ "$AK" = "info" ]; then
echo "HOME=$HOME"
echo "VDF=$VDF"
if [ -n "$BIdea" ]; then echo "Bidea eskuz: $BIdea"; fi
echo "Liburutegiak:"
for lib in "${LIBRARIES[@]}"; do echo " - $lib"; done
if [ -n "$GAME_PAKS" ]; then
echo "Stray aurkitua: $GAME_PAKS"
else
echo "Stray EZ da aurkitu."
for lib in "${LIBRARIES[@]}"; do
echo " Begiratua: ${lib%/}/steamapps/common/{STRAY,Stray,stray}"
done
echo " Aukera: bash stray_euskaraz.sh --bidea <jokoaren karpeta>"
fi
exit 0
fi
if [ -z "$GAME_PAKS" ]; then
echo "ERRORE: ez da Stray instalazioa aurkitu."
echo " Laguntzarako: bash stray_euskaraz.sh --info"
echo " Edo bidea eskuz: bash stray_euskaraz.sh --bidea <jokoaren karpeta>"
exit 1
fi
DEST="$GAME_PAKS/$PAK_NAME"
# ---------- Desinstalatu ----------
if [ "$AK" = "kendu" ]; then
if [ -f "$DEST" ]; then rm -f "$DEST"; echo "==> Mod-a kendu da."; else echo "==> Ez zegoen instalatuta."; fi
exit 0
fi
# ---------- Instalatu (pak-a base64-tik deskodetu) ----------
TMP="$(mktemp)"
cat > "$TMP" << 'PAK_EOF'
'''
FOOTER = r'''
PAK_EOF
base64 -d "$TMP" > "$DEST"
rm -f "$TMP"
echo "==> EUSKARAZ MOD-A INSTALATUTA"
echo " Kokapena: $DEST"
echo " Hizkuntza: edozein dela ere (16 hizkuntza euskaraz) euskaraz ikusiko duzu."
echo ""
if [ "$AK" = "instalatu" ]; then
echo "Piztu jokoa Steam-etik normalean."
exit 0
fi
# ---------- Jokoa piztu ----------
if command -v steam >/dev/null 2>&1 || [ -x "$HOME/.local/share/Steam/steam.sh" ]; then
echo "==> Jokoa Steam bidez pizten..."
( nohup steam "steam://rungameid/$APPID" >/dev/null 2>&1 & )
echo "Stray abiarazten ari da. Gozatu euskaraz!"
else
echo "Steam ez da aurkitu; piztu Stray Steam-etik eskuz."
fi
'''
def build_16_pak():
if os.path.exists(MODCONTENT):
shutil.rmtree(MODCONTENT)
os.makedirs(MODCONTENT)
for c in CULTURES:
d = os.path.join(MODCONTENT, "Hk_project/Content/Localization/Game", c)
os.makedirs(d, exist_ok=True)
shutil.copy(LOCRES, os.path.join(d, "Game.locres"))
os.makedirs(os.path.dirname(PAK16), exist_ok=True)
subprocess.run([REPAK, "pack", MODCONTENT, PAK16, "-m", "../../../",
"--version", "V11", "-p", "397643129", "--compression", "Zlib"],
check=True, capture_output=True)
def generate_script():
data = open(PAK16, "rb").read()
b64 = base64.b64encode(data).decode()
with open(SCRIPT, "w", encoding="utf-8") as f:
f.write(HEADER)
for line in textwrap.wrap(b64, 76):
f.write(line + "\n")
f.write(FOOTER)
os.chmod(SCRIPT, 0o755)
print("Sortuta:", SCRIPT, f"({os.path.getsize(SCRIPT)} bytes, pak {len(data)} bytes)")
if __name__ == "__main__":
if not os.path.exists(LOCRES):
raise SystemExit("Ez da aurkitu " + LOCRES + " — lehenik itzulpenak berreraiki (build.sh).")
build_16_pak()
generate_script()