From 0223b55de87adb6cd049116543fdb68acdbbfbd5 Mon Sep 17 00:00:00 2001 From: Josh Creek <8179928+jcreek@users.noreply.github.com> Date: Sat, 8 Aug 2026 08:47:48 +0100 Subject: [PATCH] fix(vfx): remove ball contact sparks --- Game/scripts/ship.gd | 44 -------------------------------------------- TODO.md | 2 +- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/Game/scripts/ship.gd b/Game/scripts/ship.gd index 098d7f31..81950c62 100644 --- a/Game/scripts/ship.gd +++ b/Game/scripts/ship.gd @@ -119,7 +119,6 @@ const THRUST_THRESHOLD = 1.0 # percent var _engine_cores: Array[MeshInstance3D] = [] var _engine_flames: Array[MeshInstance3D] = [] var _engine_lights: Array[OmniLight3D] = [] -var _impact_sparks: GPUParticles3D func _ready(): @@ -264,17 +263,6 @@ func _build_movement_vfx() -> void: add_child(light) _engine_lights.append(light) - _impact_sparks = _make_particles( - "ImpactSparks", Color(1.0, 0.72, 0.22, 1.0), Vector2(0.09, 0.3), - 28, 0.32, Vector3.UP, 180.0, 5.0, 12.0 - ) - _impact_sparks.one_shot = true - _impact_sparks.explosiveness = 1.0 - _impact_sparks.local_coords = false - _impact_sparks.emitting = false - add_child(_impact_sparks) - - func _vfx_material(color: Color, energy: float) -> StandardMaterial3D: var mat := StandardMaterial3D.new() mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA @@ -287,34 +275,6 @@ func _vfx_material(color: Color, energy: float) -> StandardMaterial3D: return mat -func _make_particles( - particle_name: String, color: Color, size: Vector2, amount: int, - lifetime: float, direction: Vector3, spread: float, - velocity_min: float, velocity_max: float -) -> GPUParticles3D: - var quad := QuadMesh.new() - quad.size = size - quad.material = _vfx_material(color, 2.2) - var process := ParticleProcessMaterial.new() - process.direction = direction - process.spread = spread - process.initial_velocity_min = velocity_min - process.initial_velocity_max = velocity_max - process.gravity = Vector3.ZERO - process.scale_min = 0.35 - process.scale_max = 1.0 - var particles := GPUParticles3D.new() - particles.name = particle_name - particles.amount = amount - particles.lifetime = lifetime - particles.local_coords = true - particles.process_material = process - particles.draw_pass_1 = quad - particles.visibility_aabb = AABB(Vector3(-3, -3, -1), Vector3(6, 6, 12)) - particles.emitting = false - return particles - - func _update_movement_vfx() -> void: if _engine_flames.is_empty(): return @@ -354,10 +314,6 @@ func _on_body_entered(body: Node) -> void: var relative_speed := (linear_velocity - (body as Ball).linear_velocity).length() var intensity := clampf(inverse_lerp(3.0, 24.0, relative_speed), 0.12, 1.0) var contact_pos := (global_position + (body as Ball).global_position) * 0.5 - if _impact_sparks: - _impact_sparks.position = to_local(contact_pos) - _impact_sparks.amount_ratio = lerpf(0.25, 1.0, intensity) - _impact_sparks.restart() ball_contact.emit(intensity, contact_pos) diff --git a/TODO.md b/TODO.md index e8520dbe..6dce1af9 100644 --- a/TODO.md +++ b/TODO.md @@ -16,7 +16,7 @@ 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 simple rear 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 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.