- Ники: профиль user://profile.cfg (client_id + ник), панель при первом запуске и по N; Net.nick_of(id); ники над призраками, в HUD/итогах гонки и таблицах - Рейтинг на сервере: лучшее время каждого игрока по картам race/parkour/metro, топ-10, user://leaderboard.json (атомарная запись, лимиты, проверка карты/комнаты/времени) - Таблица лидеров по Tab, доски топ-3 над порталами в хабе, итоги гонки с общим рейтингом - Гонка: сдача (G, удержание 1,5 с), RACE_GIVEUP; Parkour: таймер, финиш на вершине, R — перезапуск - Новые RPC (submit_profile, recv_nick, submit_record, recv_record_result, request_leaderboard, recv_leaderboard): клиент и сервер выкладываются вместе - Тесты: nicks_lb_test, race_giveup_test, parkour_run_test, nick_ui_test, ui_tour; README обновлён Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WxZo3ekR5m1af437Qzqwc1
36 lines
2.2 KiB
Bash
Executable File
36 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Игровая проверка режима «Гонка» на локальном сервере: 2 клиента-бота (+ третий, который заходит в разгар круга 1,
|
|
# наблюдает, участвует в круге 2 и выходит посреди него). Окно не открывается.
|
|
# tools/test/race_game_test.sh [рабочая_папка=/tmp/race_game]
|
|
# Печатает факты и итог «ПРОВЕРКА ПРОЙДЕНА / ПРОВАЛЕНА». Порт сервера 9080 должен быть свободен.
|
|
# Настоящий рекорд (user://race_best.cfg) не трогается: рекорд ботов идёт в файлы в рабочей папке.
|
|
set -uo pipefail
|
|
SRC="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
W="${1:-/tmp/race_game}"
|
|
rm -rf "$W"; mkdir -p "$W"
|
|
"$SRC/tools/test/make_test_server.sh" "$W/server" >/dev/null
|
|
"$SRC/tools/test/make_test_project.sh" "$W/project" >/dev/null
|
|
sed -i 's#^Bot="\*res://tools/test/bot.gd"#Bot="*res://tools/test/bot.gd"\nRaceBot="*res://tools/test/race_bot.gd"#' "$W/project/project.godot"
|
|
sed -i 's#^config/name="world2"#config/name="world2-racetest"#' "$W/project/project.godot"
|
|
(cd "$W/project" && godot --headless --import --path . >/dev/null 2>&1)
|
|
|
|
XDG_DATA_HOME="$W/xdg" godot --headless --path "$W/server" > "$W/server.log" 2>&1 & # рейтинг сервера — в рабочую папку
|
|
SERVER=$!
|
|
sleep 2
|
|
run() { # имя, остальные аргументы бота
|
|
local n="$1"; shift
|
|
timeout 420 godot --headless --path "$W/project" res://maps/race/race.tscn -- --client --race-log --race-best="$W/best_$n.cfg" --profile="$W/prof_$n.cfg" --name="$n" "$@" > "$W/$n.log" 2>&1 &
|
|
}
|
|
run A --expect=2 --rounds=2 --die-at-gate=3
|
|
PA=$!
|
|
run B --expect=2 --rounds=2 --delay=2.0 --fall-at-gate=2
|
|
PB=$!
|
|
sleep 40 # круг 1 в разгаре (отсчёт 6 с + бег)
|
|
run C --expect=2 --rounds=1 --quit-race-time=12
|
|
PC=$!
|
|
sleep 5; ps -eo pid,args | grep '[g]odot' | cut -c1-200 > "$W/ps_after_C.txt"
|
|
wait $PA $PB $PC
|
|
kill $SERVER 2>/dev/null
|
|
echo "логи: $W/{A,B,C,server}.log"
|
|
python3 "$SRC/tools/test/race_game_check.py" "$W"
|