ccc3e20902
Smoke: one rule by engine, no heat on trails, no trail on P1-SUN. Searchlights: two lamps a target, off with an empty sky. Halos fade before their reach and their sum is limited. Launch sites load chunks through the server thread, go off-map as a last resort, and reach 4000 blocks. Air defence: ranges x1.5, shots grow with urgency, claims released, /airdef lastchance, long shots on a big radar's tracks. Build: rust-toolchain.toml, airdef.py check, generator manifest and --check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
3.9 KiB
YAML
81 lines
3.9 KiB
YAML
# Сборка игры-форка для macOS: запускается вручную (Actions → desktop → Run workflow) с тегом готового
|
||
# релиза (build-N) и дописывает свой архив в него. Нужен раннер с меткой macos-latest (например, act_runner
|
||
# в режиме host на своём Маке). Windows собирается на сервере по тегу версии: release.yml.
|
||
name: desktop
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
tag:
|
||
description: Тег релиза, например build-3
|
||
required: true
|
||
|
||
env:
|
||
CARGO_TERM_COLOR: never
|
||
|
||
jobs:
|
||
game-macos:
|
||
runs-on: macos-latest
|
||
steps:
|
||
- name: Проверка релиза
|
||
env:
|
||
TOKEN: ${{ secrets.RELEASE_TOKEN || gitea.token }}
|
||
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
|
||
TAG: ${{ inputs.tag }}
|
||
run: |
|
||
set -e
|
||
if ! [[ "$TAG" =~ ^build-[0-9]+$ ]]; then echo "::error::тег '$TAG' не похож на build-N"; exit 1; fi
|
||
REL_JSON=$(mktemp)
|
||
CODE=$(curl -s -o "$REL_JSON" -w '%{http_code}' -H "Authorization: token $TOKEN" "$API/releases/tags/$TAG")
|
||
if [ "$CODE" != "200" ]; then echo "::error::релиза с тегом $TAG нет (HTTP $CODE): сначала дождись сборки build.yml на main"; exit 1; fi
|
||
python3 - "$TAG" "$REL_JSON" <<'PY'
|
||
import json, os, sys
|
||
tag, path = sys.argv[1], sys.argv[2]
|
||
r = json.load(open(path))
|
||
assets = [a.get('name') for a in (r.get('assets') or [])]
|
||
if r.get('tag_name') != tag or r.get('name') != tag or 'airdef.hmod' not in assets:
|
||
print('::error::релиз %s не создан build.yml (нужны имя = тег и вложение airdef.hmod): чужой релиз не трогаем' % tag)
|
||
sys.exit(1)
|
||
with open(os.environ['GITHUB_ENV'], 'a') as f:
|
||
f.write('RELEASE_ID=%s\nRELEASE_SHA=%s\n' % (r['id'], r.get('target_commitish', '')))
|
||
PY
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
ref: refs/tags/${{ inputs.tag }}
|
||
- name: Проверка коммита
|
||
env:
|
||
TAG: ${{ inputs.tag }}
|
||
run: |
|
||
set -e
|
||
HEAD_SHA=$(git rev-parse HEAD)
|
||
if [[ "$RELEASE_SHA" =~ ^[0-9a-f]{40}$ ]] && [ "$HEAD_SHA" != "$RELEASE_SHA" ]; then echo "::error::тег $TAG указывает на $HEAD_SHA, а релиз создан из $RELEASE_SHA"; exit 1; fi
|
||
echo "собираю $TAG = $HEAD_SHA"
|
||
- name: Rust
|
||
run: |
|
||
command -v cargo || curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
|
||
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
||
- name: Форк Horizon
|
||
run: python3 tools/airdef.py fork
|
||
- name: Игра
|
||
run: python3 tools/airdef.py game
|
||
- name: Мод
|
||
run: |
|
||
rustup target add wasm32-unknown-unknown
|
||
python3 tools/airdef.py mod
|
||
mkdir -p out
|
||
cp airdef-mod/target/horizon-mod/airdef.hmod out/
|
||
- name: Архив
|
||
run: |
|
||
D=airdef-macos-arm64
|
||
mkdir -p "$D"
|
||
cp horizon/target/fast/horizon-client horizon/target/fast/horizon-ctl out/airdef.hmod dist/play.sh docs/INSTALL.md "$D/"
|
||
tar czf "out/$D.tar.gz" "$D"
|
||
- name: В релиз
|
||
env:
|
||
TOKEN: ${{ secrets.RELEASE_TOKEN || gitea.token }}
|
||
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
|
||
run: |
|
||
set -e
|
||
# RELEASE_ID взят в шаге «Проверка релиза» (релиз build-N, созданный build.yml)
|
||
curl -sf -X POST -H "Authorization: token $TOKEN" -F "attachment=@out/airdef-macos-arm64.tar.gz" "$API/releases/$RELEASE_ID/assets?name=airdef-macos-arm64.tar.gz" > /dev/null
|