From e0a1cbaf6df568fd8a58eff3596f672c97273129 Mon Sep 17 00:00:00 2001 From: Josh Creek <8179928+jcreek@users.noreply.github.com> Date: Sat, 8 Aug 2026 08:44:26 +0100 Subject: [PATCH] fix(presentation): simplify camera and engine effects --- Game/assets/fonts/OFL-Orbitron.txt | 93 ------------------- Game/assets/fonts/Orbitron-Medium.ttf | Bin 38336 -> 0 bytes Game/assets/fonts/Orbitron-Medium.ttf.import | 36 ------- Game/scenes/HUD.tscn | 4 +- Game/scenes/ship_camera_rig.tscn | 12 +-- Game/scripts/hud_attitude_indicator.gd | 2 +- Game/scripts/hud_gauge.gd | 2 +- Game/scripts/hud_heading_tape.gd | 2 +- Game/scripts/hud_instrument.gd | 8 -- Game/scripts/ship.gd | 70 ++++++++------ Game/scripts/ship_camera.gd | 7 +- Game/shaders/post_process.gdshader | 26 +----- Game/themes/hud_theme.tres | 29 ------ TODO.md | 6 +- 14 files changed, 56 insertions(+), 241 deletions(-) delete mode 100644 Game/assets/fonts/OFL-Orbitron.txt delete mode 100644 Game/assets/fonts/Orbitron-Medium.ttf delete mode 100644 Game/assets/fonts/Orbitron-Medium.ttf.import delete mode 100644 Game/themes/hud_theme.tres diff --git a/Game/assets/fonts/OFL-Orbitron.txt b/Game/assets/fonts/OFL-Orbitron.txt deleted file mode 100644 index 91ede459..00000000 --- a/Game/assets/fonts/OFL-Orbitron.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2018 The Orbitron Project Authors (https://github.com/theleagueof/orbitron), with Reserved Font Name: "Orbitron" - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Game/assets/fonts/Orbitron-Medium.ttf b/Game/assets/fonts/Orbitron-Medium.ttf deleted file mode 100644 index 91287a30faaea632170e662ce3a272a877e25998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38336 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 LMha*X^|Jp1V6xK= diff --git a/Game/assets/fonts/Orbitron-Medium.ttf.import b/Game/assets/fonts/Orbitron-Medium.ttf.import deleted file mode 100644 index 7095b685..00000000 --- a/Game/assets/fonts/Orbitron-Medium.ttf.import +++ /dev/null @@ -1,36 +0,0 @@ -[remap] - -importer="font_data_dynamic" -type="FontFile" -uid="uid://bhbpb712ouagv" -path="res://.godot/imported/Orbitron-Medium.ttf-0d3cd88166f12a3096066c2eef570744.fontdata" - -[deps] - -source_file="res://assets/fonts/Orbitron-Medium.ttf" -dest_files=["res://.godot/imported/Orbitron-Medium.ttf-0d3cd88166f12a3096066c2eef570744.fontdata"] - -[params] - -Rendering=null -antialiasing=1 -generate_mipmaps=false -disable_embedded_bitmaps=true -multichannel_signed_distance_field=false -msdf_pixel_range=8 -msdf_size=48 -allow_system_fallback=true -force_autohinter=false -modulate_color_glyphs=false -hinting=3 -subpixel_positioning=4 -keep_rounding_remainders=true -oversampling=0.0 -Fallbacks=null -fallbacks=[] -Compress=null -compress=true -preload=[] -language_support={} -script_support={} -opentype_features={} diff --git a/Game/scenes/HUD.tscn b/Game/scenes/HUD.tscn index 70104c34..8624f321 100644 --- a/Game/scenes/HUD.tscn +++ b/Game/scenes/HUD.tscn @@ -1,10 +1,9 @@ -[gd_scene load_steps=10 format=3 uid="uid://c8kak2l3m4n5"] +[gd_scene load_steps=9 format=3 uid="uid://c8kak2l3m4n5"] [ext_resource type="Script" uid="uid://du7y176h5aaq4" path="res://scripts/HUDController.gd" id="1_hud_controller"] [ext_resource type="Script" path="res://scripts/hud_attitude_indicator.gd" id="2_adi"] [ext_resource type="Script" path="res://scripts/hud_heading_tape.gd" id="3_tape"] [ext_resource type="Script" path="res://scripts/hud_gauge.gd" id="4_gauge"] -[ext_resource type="Theme" path="res://themes/hud_theme.tres" id="5_theme"] [sub_resource type="LabelSettings" id="LabelSettings_hud"] font_size = 32 @@ -51,7 +50,6 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -theme = ExtResource("5_theme") [node name="ScoreboardPanel" type="PanelContainer" parent="Control"] layout_mode = 1 diff --git a/Game/scenes/ship_camera_rig.tscn b/Game/scenes/ship_camera_rig.tscn index 4f4d401d..44cb7c07 100644 --- a/Game/scenes/ship_camera_rig.tscn +++ b/Game/scenes/ship_camera_rig.tscn @@ -1,17 +1,8 @@ -[gd_scene load_steps=5 format=3] +[gd_scene load_steps=4 format=3] [ext_resource type="Script" path="res://scripts/ship_camera.gd" id="1_rig"] [ext_resource type="Shader" path="res://shaders/post_process.gdshader" id="2_post"] -[sub_resource type="CameraAttributesPractical" id="CameraAttributes_gameplay"] -dof_blur_far_enabled = true -dof_blur_far_distance = 24.0 -dof_blur_far_transition = 14.0 -dof_blur_near_enabled = true -dof_blur_near_distance = 1.25 -dof_blur_near_transition = 0.75 -dof_blur_amount = 0.08 - [sub_resource type="ShaderMaterial" id="ShaderMaterial_post"] shader = ExtResource("2_post") @@ -20,7 +11,6 @@ script = ExtResource("1_rig") [node name="Camera3D" type="Camera3D" parent="."] current = true -attributes = SubResource("CameraAttributes_gameplay") [node name="PostProcess" type="CanvasLayer" parent="."] layer = 0 diff --git a/Game/scripts/hud_attitude_indicator.gd b/Game/scripts/hud_attitude_indicator.gd index 66a40b3e..b19dfba3 100644 --- a/Game/scripts/hud_attitude_indicator.gd +++ b/Game/scripts/hud_attitude_indicator.gd @@ -73,7 +73,7 @@ func _draw() -> void: draw_line(Vector2(-half_chord, horizon_y), Vector2(half_chord, horizon_y), LINE_COLOR, 2.0) # Pitch ladder: rungs every 10 degrees, labelled, scrolling with pitch. - var font := hud_font() + var font := ThemeDB.fallback_font for ladder_deg: int in [-30, -20, -10, 10, 20, 30]: var y := horizon_y - ladder_deg * px_per_deg if absf(y) > radius - 12.0: diff --git a/Game/scripts/hud_gauge.gd b/Game/scripts/hud_gauge.gd index c0e1811c..55cc9290 100644 --- a/Game/scripts/hud_gauge.gd +++ b/Game/scripts/hud_gauge.gd @@ -37,7 +37,7 @@ func _process(delta: float) -> void: func _draw() -> void: - var font := hud_font() + var font := ThemeDB.fallback_font var fraction := clampf(_value / max_value, 0.0, 1.0) var reading := value_format % _value diff --git a/Game/scripts/hud_heading_tape.gd b/Game/scripts/hud_heading_tape.gd index 61178739..858b6151 100644 --- a/Game/scripts/hud_heading_tape.gd +++ b/Game/scripts/hud_heading_tape.gd @@ -39,7 +39,7 @@ func _process(delta: float) -> void: func _draw() -> void: - var font := hud_font() + var font := ThemeDB.fallback_font var center_x := size.x / 2.0 var px_per_deg := size.x / VISIBLE_RANGE diff --git a/Game/scripts/hud_instrument.gd b/Game/scripts/hud_instrument.gd index 1b572b4a..4817c976 100644 --- a/Game/scripts/hud_instrument.gd +++ b/Game/scripts/hud_instrument.gd @@ -23,11 +23,3 @@ static func angle_delta_deg(from: float, to: float) -> float: func _smoothing_weight(delta: float) -> float: return 1.0 - exp(-SMOOTHING * delta) # frame-rate independent - - -# Procedural draw calls do not automatically consume a Control's theme font; -# resolve it explicitly so every instrument uses the same packaged typeface -# as ordinary Labels instead of ThemeDB's debug-looking fallback. -func hud_font() -> Font: - var font := get_theme_default_font() - return font if font else ThemeDB.fallback_font diff --git a/Game/scripts/ship.gd b/Game/scripts/ship.gd index cb6a226d..098d7f31 100644 --- a/Game/scripts/ship.gd +++ b/Game/scripts/ship.gd @@ -117,8 +117,7 @@ const ATTITUDE_THRESHOLD = 1.0 # degrees const THRUST_THRESHOLD = 1.0 # percent var _engine_cores: Array[MeshInstance3D] = [] -var _engine_plumes: Array[GPUParticles3D] = [] -var _turbo_flames: Array[GPUParticles3D] = [] +var _engine_flames: Array[MeshInstance3D] = [] var _engine_lights: Array[OmniLight3D] = [] var _impact_sparks: GPUParticles3D @@ -215,7 +214,7 @@ func _build_movement_vfx() -> void: for x in [-0.42, 0.42]: var engine_pos := Vector3(x, -0.05, 1.42) - var core_mat := _vfx_material(Color(0.35, 0.85, 1.0, 1.0), 1.0) + var core_mat := _vfx_material(Color(1.0, 0.48, 0.1, 1.0), 1.0) var core_mesh := SphereMesh.new() core_mesh.radius = 0.11 core_mesh.height = 0.22 @@ -228,28 +227,37 @@ func _build_movement_vfx() -> void: add_child(core) _engine_cores.append(core) - var plume := _make_particles( - "EnginePlumeL" if x < 0.0 else "EnginePlumeR", - Color(0.3, 0.82, 1.0, 0.72), Vector2(0.16, 0.42), 36, 0.24, - Vector3(0, 0, 1), 12.0, 2.0, 5.0 - ) - plume.position = engine_pos + Vector3(0, 0, 0.08) - add_child(plume) - _engine_plumes.append(plume) - - var turbo := _make_particles( - "TurboFlameL" if x < 0.0 else "TurboFlameR", - Color(0.78, 0.34, 1.0, 0.9), Vector2(0.22, 0.72), 48, 0.18, - Vector3(0, 0, 1), 7.0, 6.0, 10.0 - ) - turbo.position = engine_pos + Vector3(0, 0, 0.12) - add_child(turbo) - _turbo_flames.append(turbo) + # A single conventional orange flame replaces the layered particle plume + # and separate purple turbo effect. Turbo only lengthens and brightens the + # same flame, keeping the engine silhouette simple and readable. + var flame_mat := StandardMaterial3D.new() + flame_mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + flame_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + flame_mat.cull_mode = BaseMaterial3D.CULL_DISABLED + flame_mat.albedo_color = Color(1.0, 0.34, 0.04, 0.92) + flame_mat.emission_enabled = true + flame_mat.emission = Color(1.0, 0.16, 0.015) + flame_mat.emission_energy_multiplier = 2.0 + var flame_mesh := CylinderMesh.new() + flame_mesh.top_radius = 0.015 + flame_mesh.bottom_radius = 0.14 + flame_mesh.height = 1.0 + flame_mesh.radial_segments = 12 + flame_mesh.material = flame_mat + var flame := MeshInstance3D.new() + flame.name = "EngineFlameL" if x < 0.0 else "EngineFlameR" + flame.position = engine_pos + Vector3(0, 0, 0.3) + flame.rotation_degrees.x = 90.0 + flame.mesh = flame_mesh + flame.visible = false + flame.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + add_child(flame) + _engine_flames.append(flame) var light := OmniLight3D.new() light.name = "EngineLightL" if x < 0.0 else "EngineLightR" light.position = engine_pos - light.light_color = Color(0.3, 0.75, 1.0) + light.light_color = Color(1.0, 0.32, 0.08) light.omni_range = 3.5 light.omni_attenuation = 2.0 light.shadow_enabled = false @@ -308,18 +316,24 @@ func _make_particles( func _update_movement_vfx() -> void: - if _engine_plumes.is_empty(): + if _engine_flames.is_empty(): return # These are the two rear main engines, so lateral/vertical maneuvering jets # must not make them flare. Reverse thrust also comes from separate attitude - # jets conceptually; only positive Z drives this rear-facing plume. + # jets conceptually; only positive Z drives this rear-facing flame. var thrust := clampf(maxf(_current_action.thrust.z, 0.0), 0.0, 1.0) var turbo := _current_action.turbo and thrust > 0.05 - for i in _engine_plumes.size(): - _engine_plumes[i].emitting = thrust > 0.02 - _engine_plumes[i].amount_ratio = 0.25 + thrust * 0.75 - _engine_plumes[i].speed_scale = 0.65 + thrust * 0.75 - _turbo_flames[i].emitting = turbo + for i in _engine_flames.size(): + var flame := _engine_flames[i] + var flame_length := 0.28 + thrust * 0.82 + (0.62 if turbo else 0.0) + var flame_width := 0.72 + thrust * 0.32 + (0.12 if turbo else 0.0) + flame.visible = thrust > 0.02 + flame.scale = Vector3(flame_width, flame_length, flame_width) + # CylinderMesh is centred on local Y (rotated to ship +Z), so moving its + # centre by half the length keeps the flame root fixed at the engine bell. + flame.position.z = 1.48 + flame_length * 0.5 + var flame_mat := flame.mesh.material as StandardMaterial3D + flame_mat.emission_energy_multiplier = 1.8 + thrust * 2.2 + (1.8 if turbo else 0.0) _engine_lights[i].light_energy = 0.35 + thrust * 2.1 + (2.3 if turbo else 0.0) var core_mat := _engine_cores[i].mesh.material as StandardMaterial3D core_mat.emission_energy_multiplier = 0.65 + thrust * 2.0 + (2.0 if turbo else 0.0) diff --git a/Game/scripts/ship_camera.gd b/Game/scripts/ship_camera.gd index 09495f15..0d63c75a 100644 --- a/Game/scripts/ship_camera.gd +++ b/Game/scripts/ship_camera.gd @@ -183,9 +183,6 @@ func _update_speed_feel(delta: float) -> void: _effective_distance = lerpf( _effective_distance, camera_distance + _turbo_blend * turbo_distance_kick, feel_t ) - post_material.set_shader_parameter( - "motion_blur_amount", _speed_blend * _speed_blend * 0.006 + _turbo_blend * 0.006 - ) post_material.set_shader_parameter("chromatic_aberration", _turbo_blend * 0.007) post_material.set_shader_parameter("vignette_strength", 0.22 + _turbo_blend * 0.16) @@ -233,8 +230,7 @@ func begin_goal_cut(goal_position: Vector3) -> void: camera.fov = 58.0 camera.look_at(_goal_cut_look_at, Vector3.UP) # A hard, stationary cinematic camera must not inherit the scoring frame's - # ship-speed smear or turbo chroma. Keep only a deliberate cinematic edge. - post_material.set_shader_parameter("motion_blur_amount", 0.0) + # turbo chroma; keep only a deliberate cinematic edge. post_material.set_shader_parameter("chromatic_aberration", 0.0) post_material.set_shader_parameter("vignette_strength", 0.3) @@ -243,6 +239,5 @@ func end_goal_cut() -> void: _goal_cut_active = false _speed_blend = 0.0 _turbo_blend = 0.0 - post_material.set_shader_parameter("motion_blur_amount", 0.0) post_material.set_shader_parameter("chromatic_aberration", 0.0) post_material.set_shader_parameter("vignette_strength", 0.22) diff --git a/Game/shaders/post_process.gdshader b/Game/shaders/post_process.gdshader index 8d19ea6c..844dba4c 100644 --- a/Game/shaders/post_process.gdshader +++ b/Game/shaders/post_process.gdshader @@ -1,37 +1,21 @@ shader_type canvas_item; render_mode unshaded; -uniform sampler2D screen_texture : hint_screen_texture, filter_linear_mipmap; -uniform float motion_blur_amount : hint_range(0.0, 0.03) = 0.0; +uniform sampler2D screen_texture : hint_screen_texture, filter_linear; uniform float chromatic_aberration : hint_range(0.0, 0.02) = 0.0; uniform float vignette_strength : hint_range(0.0, 1.0) = 0.22; -vec4 motion_sample(vec2 uv) { - // A restrained centre-directed velocity smear. The camera script scales it - // with ship speed/turbo; mipmapped screen reads soften the outer samples. - if (motion_blur_amount < 0.0001) { - return textureLod(screen_texture, uv, 0.0); - } - vec2 step_uv = (uv - vec2(0.5)) * motion_blur_amount; - vec4 color = textureLod(screen_texture, uv, 0.0) * 0.36; - color += textureLod(screen_texture, uv - step_uv * 0.35, 0.5) * 0.25; - color += textureLod(screen_texture, uv - step_uv * 0.7, 1.0) * 0.21; - color += textureLod(screen_texture, uv - step_uv, 1.5) * 0.18; - return color; -} - - void fragment() { vec2 radial = UV - vec2(0.5); vec2 chroma = radial * chromatic_aberration; - vec4 center = motion_sample(UV); + vec4 center = texture(screen_texture, UV); vec3 color = center.rgb; // The branch is driven by one uniform for the whole draw, so non-turbo - // frames avoid eight redundant screen taps without causing warp divergence. + // frames avoid two redundant screen taps without causing warp divergence. if (chromatic_aberration > 0.0001) { - color.r = motion_sample(UV + chroma).r; - color.b = motion_sample(UV - chroma).b; + color.r = texture(screen_texture, UV + chroma).r; + color.b = texture(screen_texture, UV - chroma).b; } // Aspect-correct vignette, always subtle and tightened slightly on turbo. diff --git a/Game/themes/hud_theme.tres b/Game/themes/hud_theme.tres deleted file mode 100644 index 0c4f0e4d..00000000 --- a/Game/themes/hud_theme.tres +++ /dev/null @@ -1,29 +0,0 @@ -[gd_resource type="Theme" load_steps=3 format=3] - -[ext_resource type="FontFile" path="res://assets/fonts/Orbitron-Medium.ttf" id="1_font"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_panel"] -bg_color = Color(0.035, 0.05, 0.085, 0.76) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0.3, 0.7, 1, 0.38) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 -content_margin_left = 12.0 -content_margin_top = 8.0 -content_margin_right = 12.0 -content_margin_bottom = 8.0 - -[resource] -default_font = ExtResource("1_font") -default_font_size = 14 -Label/colors/font_color = Color(0.86, 0.94, 1, 1) -Label/colors/font_shadow_color = Color(0, 0, 0, 0.72) -Label/constants/outline_size = 1 -Label/constants/shadow_offset_x = 2 -Label/constants/shadow_offset_y = 2 -PanelContainer/styles/panel = SubResource("StyleBoxFlat_panel") diff --git a/TODO.md b/TODO.md index 46a1dc21..e8520dbe 100644 --- a/TODO.md +++ b/TODO.md @@ -16,14 +16,14 @@ The largest gap between this and a AAA-feeling product is presentation, not code - [ ] **Audio — there is none.** Zero sound files, zero `AudioStreamPlayer` nodes, no bus layout. Needs: engine hum pitched to throttle, turbo whoosh, ball impacts scaled by collision impulse, wall scrapes, goal explosion, crowd bed, UI clicks, countdown beeps, music. Can be driven off `Ship`'s existing telemetry signals. - [x] SSAO/SSIL in the arena Environments — cheapest single perceived-quality win available; grounds the ships against the deck and gives the fillets and goal recesses real depth. -- [x] VFX on anything that moves: throttle-reactive engine cores and plumes, distinct turbo flames, a speed-scaled ball trail, contact sparks and team-tinted goal bursts. +- [x] VFX on anything that moves: throttle-reactive engine cores and simple rear flames, a speed-scaled ball trail, contact sparks and team-tinted goal bursts. - [x] Impact feedback — intensity-scaled screen shake, unscaled hit-stop, HUD flash and controller rumble on ball contact. - [x] Camera feel in `ship_camera.gd` — speed-based FOV widening, turbo kick-back and decaying impact shake. - [x] Goal celebration sequence: goal burst, team-tinted flash/title card, dedicated camera cut and slow-motion beat after authoritative score registration and before reset/kickoff. - [x] Local lighting / dynamic GI — four local pitch lights plus SDFGI provide bounce and contact lighting for the runtime-generated arena shell; the shader's `hull_fill` stand-in is retired. (The shell is generated in `_ready`, so it cannot participate in an editor LightmapGI bake.) - [x] Dress `arena_03` — its asteroid field now has mining stations, debris clusters and a distant planet. -- [x] Custom font + a real `Theme` resource for the HUD. Packaged Orbitron typography, shared label styling and themed procedural-instrument text replace `ThemeDB.fallback_font`. -- [x] Post-processing beyond glow: camera DoF plus speed-scaled motion blur, a cinematic vignette and turbo-driven chromatic aberration. +- [ ] Custom font + a real `Theme` resource for the HUD. `ThemeDB.fallback_font` at 10-13 px reads as a debug overlay. +- [x] Post-processing beyond glow: a cinematic vignette and turbo-driven chromatic aberration. DoF and motion blur were intentionally omitted after playtesting. ## Multiplayer (long term)