Race 2 «Верхние ярусы», фаза 1: карта, вентиляторы, ускоряющие полосы, правила общие с Race

- maps/race2/: сцена, race2.gd (ворота со световыми столбами, лазеры, вентиляторы, полосы, срыв, дождь, гул), данные и модель из Blender models/race_02
  (раскладка layout.py -> build_race.py -> bake.py; свет пока запечён грубо, небо и музыка — копии Race)
- objects/vent.gd, objects/boost_strip.gd + хуки apply_vent()/apply_boost() в player/player.gd (MAX_SPEED и остальная физика не тронуты)
- race_rules.gd берёт данные у карты (общий код правил для Race и Race 2)
- портал RACE 2 в хабе, пресет экспорта Race2 + export_all.sh, Net.TIMED_MAPS/MAP_TITLES для race2 (RPC не менялись; серверу нужен deploy_server.sh)
- тесты: race_game_test.sh с MAP=race2 (бот проводит игроков телепортами), race2_check.txt
- README: раздел «Карта Race 2», результаты ботов по веткам

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-29 17:21:07 +05:00
co-authored by Claude Sonnet 5.5
parent b58c30a525
commit c3e0ae40b2
27 changed files with 1017 additions and 11 deletions
+32
View File
@@ -116,6 +116,16 @@ void fragment() {
"""
# Настройки чувствительности мыши
# --- Внешние эффекты карт (objects/vent.gd, objects/boost_strip.gd): локально, в сеть не уходят ---
const VENT_ACCEL = 60.0 # Подъёмное ускорение в вентиляционном потоке
const VENT_MAX_RISE = 11.0 # Поток разгоняет вертикальную скорость не выше этой
const BOOST_ACCEL = 60.0 # Разгон на ускоряющей полосе (потолок — MAX_SPEED)
const EFFECT_HOLD = 0.12 # Сколько секунд эффект держится после последнего вызова (область зовёт каждый кадр)
var vent_timer: float = 0.0
var boost_timer: float = 0.0
var boost_dir: Vector3 = Vector3.ZERO
var boost_speed: float = MAX_SPEED
@export var MOUSE_SENSITIVITY: float = 0.003
# --- Настройки тряски камеры (Head Bobbing) ---
@@ -418,17 +428,39 @@ func _physics_process(delta: float) -> void:
if horizontal.length() > speed_cap:
horizontal = horizontal.normalized() * speed_cap
# Полоса: разгоняет вдоль своего направления, но не выше потолка MAX_SPEED
if boost_timer > 0.0:
boost_timer -= delta
var hs := horizontal.length()
if hs > 3.0 and horizontal.normalized().dot(boost_dir) > 0.5:
horizontal = horizontal.normalized() * maxf(hs, minf(hs + BOOST_ACCEL * delta, boost_speed)) # только добирает: быстрее полосы не тормозит
if horizontal.length() > MAX_SPEED:
horizontal = horizontal.normalized() * MAX_SPEED
velocity.x = horizontal.x
velocity.z = horizontal.z
# Вентиляционный поток: тянет вверх (горизонтальная скорость не трогается), возвращает двойной прыжок
if vent_timer > 0.0:
vent_timer -= delta
velocity.y = minf(velocity.y + VENT_ACCEL * delta, maxf(velocity.y, VENT_MAX_RISE))
air_jumps_left = AIR_JUMPS
# 6. Камера
_update_camera(delta, input_dir)
_move_and_track(delta)
# Вызывает область-вентилятор каждый физический кадр, пока игрок в потоке
func apply_vent() -> void:
vent_timer = EFFECT_HOLD
# Вызывает ускоряющая полоса каждый кадр: dir — куда она разгоняет (горизонтально), speed — до какой скорости
func apply_boost(dir: Vector3, speed: float) -> void:
boost_timer = EFFECT_HOLD
boost_dir = Vector3(dir.x, 0.0, dir.z).normalized()
boost_speed = minf(speed, MAX_SPEED)
# Двигаемся и отслеживаем приземление
func _move_and_track(delta: float) -> void:
var pre_vy := velocity.y