Карта Race: гонка на ногах по киберпанк-антиутопии, 8 игроков

- maps/race: трасса 633 м из Blender (три развилки: срез по контейнерам, каньон со стенами
  против нижней дороги, труба с лазерами против коридора), запечённый свет, небо, дождь, гул;
  фоновая песня (Ogg Vorbis, ~0,6 МБ) включается на «СТАРТ!»
- Правила (race_rules.gd): R — готов; когда готовы все — отсчёт 6 с, заморозка в слотах,
  ворота строго по порядку, сплиты, место, итоги, личный рекорд (user://race_best.cfg)
- Сеть: Net.submit_race / recv_race / race_event (RACE_READY, START, CP, FINISH, STATE).
  ВНИМАНИЕ: набор RPC изменён — клиент и сервер выкладываются вместе, старый клиент
  с новым сервером не работает (rpc node checksum failed)
- player.gd: input_frozen и place() для режимов карт; project.godot: действие ready (R)
- Портал RACE в хабе, пресет экспорта Race (include_filter для ресурсов, грузимых строкой)
- tools/test: двухклиентный тест гонки на локальном сервере, бот, облёт, проверка пакета
- README: правила гонки, события, проверки, заметки

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxZo3ekR5m1af437Qzqwc1
This commit is contained in:
2026-10-28 17:28:05 +05:00
co-authored by Claude Sonnet 5.5
parent 2a6397da79
commit 9130202a51
31 changed files with 1775 additions and 4 deletions
+34
View File
@@ -182,6 +182,9 @@ var spawn_transform: Transform3D
var death_overlay: ColorRect = null
var death_label: Label = null
# Заморозка ввода (режим «Гонка»: отсчёт до старта). Обзор мышью работает, движение и способности — нет.
var input_frozen: bool = false
# Коллайдер (опционально, ищется по имени CollisionShape3D)
var collision_shape: CollisionShape3D = null
var capsule: CapsuleShape3D = null
@@ -247,6 +250,9 @@ func _unhandled_input(event: InputEvent) -> void:
head.rotate_x(-event.relative.y * MOUSE_SENSITIVITY * zoom_factor)
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-80), deg_to_rad(80))
if input_frozen:
return
if event.is_action_pressed("crouch"):
_try_start_slide() # Подкат: бег (sprint) + crouch
elif event.is_action_pressed("dash"):
@@ -273,6 +279,17 @@ func _physics_process(delta: float) -> void:
_process_death(delta)
return
if input_frozen:
# Стоим на месте (только падаем, если под ногами пусто)
velocity.x = 0.0
velocity.z = 0.0
if not is_on_floor():
velocity += get_gravity() * delta
else:
velocity.y = 0.0
move_and_slide()
return
slide_cooldown_timer = maxf(slide_cooldown_timer - delta, 0.0)
dash_cooldown_timer = maxf(dash_cooldown_timer - delta, 0.0)
wallrun_cooldown_timer = maxf(wallrun_cooldown_timer - delta, 0.0)
@@ -940,6 +957,23 @@ func _process_death(delta: float) -> void:
if death_timer <= 0.0:
_respawn()
# Поставить игрока в точку t (лицом по её повороту), сбросив скорость и способности. Для карт-режимов (Гонка).
func place(t: Transform3D, pitch := 0.0) -> void:
spawn_transform = t
if is_dead:
_respawn()
else:
if is_sliding:
_end_slide()
if is_crouching:
_end_crouch()
is_dashing = false
is_wallrunning = false
is_mantling = false
global_transform = t
velocity = Vector3.ZERO
head.rotation.x = pitch
func _respawn() -> void:
global_transform = spawn_transform
velocity = Vector3.ZERO