- Ники: профиль 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
20 lines
1.6 KiB
Python
Executable File
20 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Забег Parkour по существу на локальном сервере: tools/test/parkour_run_test.py [рабочая_папка=/tmp/parkour_run]"""
|
|
import os, shutil, subprocess, sys, time
|
|
SRC = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
|
|
W = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else "/tmp/parkour_run")
|
|
shutil.rmtree(W, ignore_errors=True); os.makedirs(W)
|
|
subprocess.run([f"{SRC}/tools/test/make_test_server.sh", f"{W}/server"], check=True, stdout=subprocess.DEVNULL)
|
|
subprocess.run([f"{SRC}/tools/test/make_test_project.sh", f"{W}/project"], check=True, stdout=subprocess.DEVNULL)
|
|
subprocess.run(["godot", "--headless", "--import", "--path", f"{W}/project"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
open(f"{W}/prof.cfg", "w").write('[profile]\nclient_id="%s"\nnick="Бегун"\nasked=true\n' % ("c" * 32))
|
|
slog = open(f"{W}/server.log", "w")
|
|
server = subprocess.Popen(["godot", "--headless", "--path", f"{W}/server"], stdout=slog, stderr=subprocess.STDOUT, env=dict(os.environ, XDG_DATA_HOME=f"{W}/xdg"))
|
|
time.sleep(2.5)
|
|
r = subprocess.run(["godot", "--headless", "--path", f"{W}/project", "res://tools/test/parkour_run_test.tscn", "--", "--client", f"--profile={W}/prof.cfg"],
|
|
capture_output=True, text=True, timeout=240)
|
|
server.terminate(); server.wait(); slog.close()
|
|
print("\n".join(l for l in r.stdout.splitlines() if l.startswith((" ДА", " НЕТ", "ПАРКУР", "SCRIPT", "Parse"))))
|
|
print("сервер:", [l for l in open(f"{W}/server.log").read().splitlines() if "рекорд" in l])
|
|
sys.exit(0 if "ПАРКУР ПРОЙДЕН" in r.stdout else 1)
|