M1: rörelse, kollision, kamera, scener, tileset, skärmdumpar, CI
Some checks failed
release / build-release (push) Failing after 27s

- internal/sim: rutbaserad Mover (4 riktningar, riktningsbyte vid rutgräns,
  bildrute-exakt ankomst) och Camera (följer, klampar, centrerar små kartor),
  med tester
- internal/game: scener meny -> bana -> resultat, tangentbord + gamepad,
  tileset och spelaranimation, HUD, skriptläge (-script) för deterministiska
  skärmdumpar och tester
- tools/genart genererar placeholder-grafik (tiles.png, player.png);
  tools/shots tar doc/img/*.png som README och wiki visar
- bana 002-shinjuku (33x21) för kamerascroll; level.List/LoadFile/TrainAt
- .gitea/workflows/release.yaml: vet + test + linux/windows-zippar till
  rullande latest på brasse-linux01-runnern (linux-amd64)
- docs: roadmap M1 klar, tester, plan, README med bilder och styrning

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 19:16:53 +02:00
parent ae50d444a4
commit 4ae7dba291
34 changed files with 1730 additions and 124 deletions

View File

@@ -0,0 +1,121 @@
name: release
# Kör tester och bygger release-zippar för linux-amd64 och windows-amd64.
# Varje push till master uppdaterar den rullande releasen "latest"; en tagg
# vX.Y.Z ger dessutom en versionerad release.
#
# Körs ALLTID på brasse-linux01-runnern (label linux-amd64): Linux-bygget
# behöver cgo + X11/GL-headers för amd64, vilket Pi5:n (arm64) inte kan ge
# utan korskompilator – och Pi5:n ska inte belastas med spelbyggen.
# Är datorn av köas jobbet tills runnern är tillbaka (ofarligt: pushar görs
# ändå därifrån). Första steget vägrar köra på arm64 som skydd om labels ändras.
on:
push:
branches: [master]
tags: ["v*"]
workflow_dispatch:
inputs:
tag:
description: "Release-tag (lämna tom för 'latest')"
required: false
jobs:
build-release:
runs-on: linux-amd64
container:
image: golang:1.27-bookworm
steps:
- name: Vägra bygga på arm64/Pi5
run: |
if [ "$(uname -m)" != "x86_64" ]; then
echo "::error::Fel runner ($(uname -m)). Spelbygget ska köras på brasse-linux01 (label linux-amd64)."
exit 1
fi
echo "Runner OK: $(uname -m) på $(hostname)"
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0 # taggar behövs för versionsstämpeln (git describe)
- name: Byggberoenden (X11/GL/ALSA-headers för Ebitengine på Linux)
run: |
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
gcc libc6-dev pkg-config libgl1-mesa-dev libx11-dev libxrandr-dev libxcursor-dev \
libxinerama-dev libxi-dev libxxf86vm-dev libasound2-dev zip jq curl git >/dev/null
git config --global --add safe.directory '*'
go version
- name: Cache Go-moduler
uses: actions/cache@v4
with:
path: /go/pkg/mod
key: gomod-${{ hashFiles('go.sum') }}
restore-keys: gomod-
- name: Bestäm release-tag
id: t
run: |
case "$GITHUB_REF" in
refs/tags/*) T="$GITHUB_REF_NAME" ;;
*) T="${{ inputs.tag }}"; [ -z "$T" ] && T="latest" ;;
esac
echo "tag=$T" >> "$GITHUB_OUTPUT"
echo "bygger release: $T"
- name: Vet + test
run: |
go vet ./...
go test ./...
- name: Bygg release (linux-amd64 + windows-amd64)
run: |
go run ./tools/build -mode release -os linux -arch amd64
go run ./tools/build -mode release -os windows -arch amd64
mkdir -p out
(cd build/release && zip -qr ../../out/metro-puzzle-jp-linux-amd64.zip linux-amd64)
(cd build/release && zip -qr ../../out/metro-puzzle-jp-windows-amd64.zip windows-amd64)
(cd out && sha256sum *.zip > checksums.txt && ls -la && cat checksums.txt)
- name: Skapa/uppdatera Gitea-release + ladda upp assets
env:
REPO: ${{ github.repository }}
TAG: ${{ steps.t.outputs.tag }}
TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# gitea-d finns bara på Pi5:ns dockernät; härifrån används publika adressen
API=http://gitea-d:3000/api/v1
curl -sf -m 5 "$API/version" >/dev/null 2>&1 || API=https://gitea.brasse-pc.eu/api/v1
echo "API: $API"
auth() { curl -s -H "Authorization: token $TOKEN" "$@"; }
VER=$(./build/release/linux-amd64/metro-puzzle-jp -version 2>/dev/null | awk '{print $2}' || echo "$TAG")
BODY="Metro Puzzle JP $TAG ($VER, commit ${GITHUB_SHA:0:10}).
Packa upp zippen för din plattform och kör binären i mappen – resources/ måste ligga bredvid.
- Linux: kräver ett skrivbord med OpenGL (mesa) och X11/XWayland. Ljud via ALSA/PipeWire.
- Windows 10+: inga extra beroenden."
if [ "$TAG" = "latest" ]; then
# rullande release: ta bort den gamla så att taggen följer master
rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty')
[ -n "$rid" ] && auth -X DELETE "$API/repos/$REPO/releases/$rid" -o /dev/null
auth -X DELETE "$API/repos/$REPO/tags/$TAG" -o /dev/null || true
JSON=$(jq -n --arg t "$TAG" --arg c "$GITHUB_SHA" --arg n "latest ($VER)" --arg b "$BODY" \
'{tag_name:$t, target_commitish:$c, name:$n, body:$b, prerelease:true}')
else
JSON=$(jq -n --arg t "$TAG" --arg b "$BODY" '{tag_name:$t, name:$t, body:$b}')
fi
RESP=$(auth -X POST "$API/repos/$REPO/releases" -H 'Content-Type: application/json' -d "$JSON")
rid=$(echo "$RESP" | jq -r '.id // empty')
[ -z "$rid" ] && rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty')
[ -n "$rid" ] && [ "$rid" != "null" ] || { echo "kunde inte skapa release: $RESP"; exit 1; }
echo "release id: $rid"
for f in metro-puzzle-jp-linux-amd64.zip metro-puzzle-jp-windows-amd64.zip checksums.txt; do
aid=$(auth "$API/repos/$REPO/releases/$rid/assets" | jq -r ".[] | select(.name==\"$f\") | .id")
if [ -n "$aid" ] && [ "$aid" != "null" ]; then
auth -X DELETE "$API/repos/$REPO/releases/$rid/assets/$aid" -o /dev/null
fi
echo "laddar upp $f ..."
auth -X POST "$API/repos/$REPO/releases/$rid/assets?name=$f" -F "attachment=@out/$f" -o /dev/null -w " -> HTTP %{http_code}\n"
done
echo "klart: https://gitea.brasse-pc.eu/$REPO/releases/tag/$TAG"