#155, #152: shots reach further and sooner, and the other explosions catch up

#155 - the projectile flew at 850, which took 1.1 seconds to cross the gun's
own range: long enough that a shot read as leaving the ship rather than as
hitting something. 1400 now, and the interceptor's range goes 950 to 1200,
so it crosses in 0.86s and comfortably outranges the 620 the standoff
enemies hold at. A projectile's lifetime is derived from its range and
speed, so faster does not mean falling short - the test pins that
arithmetic rather than trusting it.

#152 asked for VFX on three events, and the finding is worth recording: all
three already existed and were already wired. What had happened is that #130
gave a lost VESSEL thirty particles and a shockwave, which left everything
else in the game visibly smaller than it - an enemy kill, the thing the
player is being rewarded for, and a broken rock, the thing they do more than
anything else, were both still on or near the base class's twelve-particle
default with no shockwave at all.

So this is about PROPORTION rather than about adding anything, and
proportion is what the test checks: a lost vessel outweighs a kill,
a kill outweighs a rock, and nothing sits on the base defaults. Numbers get
rebalanced; an ordering that says a rock outweighs a battleship is a bug.
Particles now run 38 > 32 > 24 against a default of 12.
This commit is contained in:
Loïc Wisniewski 2026-08-29 14:39:35 +02:00
commit 7489528e60
7 changed files with 194 additions and 14 deletions

View file

@ -7,6 +7,20 @@ extends ExplosionVFXBase
const COLOR: Color = Color(0.65, 0.5, 0.35)
func _init() -> void:
# #152: this took the base class's defaults - 12 chunks over half a
# second, no shockwave - which is why breaking a rock, the thing the
# player does more than anything else in the game, barely registered.
# Matter rather than light, so it throws more and slower than an energy
# burst does, and its shockwave is dust rather than a flash.
particle_count = 24
lifetime = 0.7
min_speed = 70.0
max_speed = 330.0
shockwave_radius = 72.0
shockwave_color = Color(0.72, 0.6, 0.44)
static func spawn(parent: Node, world_position: Vector2) -> void:
var vfx: AsteroidExplosionVFX = AsteroidExplosionVFX.new()
vfx.position = world_position
@ -14,7 +28,7 @@ static func spawn(parent: Node, world_position: Vector2) -> void:
func _random_particle_size() -> float:
return randf_range(3.0, 7.0)
return randf_range(4.0, 11.0)
# Debris tumbles independently of its flight path, unlike the light-burst

View file

@ -7,13 +7,17 @@ func _init() -> void:
# as a small red puff that was easy to miss in a fight - the moment the
# player is being rewarded for should be the loudest thing on screen for
# an instant.
# #152: and again. #130 gave a lost VESSEL 30 particles and a 120-unit
# shockwave, which left a kill - the thing the player is being rewarded
# for - visibly the smaller event of the two. Back in proportion: still
# below a vessel's own death, but no longer a puff beside it.
color = Color(1.0, 0.25, 0.18)
particle_count = 22
lifetime = 0.62
min_speed = 120.0
max_speed = 460.0
shockwave_radius = 86.0
shockwave_color = Color(1.0, 0.55, 0.3)
particle_count = 32
lifetime = 0.75
min_speed = 170.0
max_speed = 620.0
shockwave_radius = 130.0
shockwave_color = Color(1.0, 0.6, 0.32)
static func spawn(parent: Node, world_position: Vector2) -> void:

View file

@ -10,12 +10,16 @@ func _init() -> void:
# had already been told to be the loudest thing in the frame. Now it is
# the louder of the two, which is the right way round: the enemy's is a
# reward, this one is a loss.
#
# #152 lifted the enemy's and the asteroid's to match; this goes up with
# them, because the ORDER is the point rather than the numbers. Losing a
# vessel must stay the bigger event than killing something.
color = Color(0.25, 0.85, 1.0)
particle_count = 30
lifetime = 0.8
min_speed = 150.0
max_speed = 540.0
shockwave_radius = 120.0
particle_count = 38
lifetime = 0.95
min_speed = 190.0
max_speed = 640.0
shockwave_radius = 150.0
shockwave_color = Color(0.6, 0.95, 1.0)