From 8d7a56c3a82242bf24f8c39d264d1407a003fcd5 Mon Sep 17 00:00:00 2001 From: Goober5000 Date: Wed, 12 Nov 2025 01:59:29 -0500 Subject: [PATCH] add Zero_radius_explosions_skip_fireballs Addresses a behavior idiosyncrasy encountered by Solaris. If this flag is enabled, explosions with a visual radius of 0 do not have fireballs created, and do not have the fireball lifetime added to the explosion lifetime. --- code/asteroid/asteroid.cpp | 7 ++++++- code/mod_table/mod_table.cpp | 9 +++++++++ code/mod_table/mod_table.h | 1 + code/ship/ship.cpp | 7 ++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/code/asteroid/asteroid.cpp b/code/asteroid/asteroid.cpp index e24d6770d83..f7b3b6d9ae8 100644 --- a/code/asteroid/asteroid.cpp +++ b/code/asteroid/asteroid.cpp @@ -1607,8 +1607,13 @@ static float asteroid_create_explosion(object *objp) } fireball_scale_multiplier = asteroid_get_fireball_scale_multiplier(objp->instance); + auto fireball_radius = objp->radius * fireball_scale_multiplier; + + if (Zero_radius_explosions_skip_fireballs && fl_near_zero(fireball_radius)) + fireball_objnum = -1; + else + fireball_objnum = fireball_create( &objp->pos, fireball_type, FIREBALL_LARGE_EXPLOSION, OBJ_INDEX(objp), fireball_radius, false, &objp->phys_info.vel ); - fireball_objnum = fireball_create( &objp->pos, fireball_type, FIREBALL_LARGE_EXPLOSION, OBJ_INDEX(objp), objp->radius*fireball_scale_multiplier, false, &objp->phys_info.vel ); if ( fireball_objnum > -1 ) { explosion_life = fireball_lifeleft(&Objects[fireball_objnum]); } else { diff --git a/code/mod_table/mod_table.cpp b/code/mod_table/mod_table.cpp index 3789b6309d0..a03f640c568 100644 --- a/code/mod_table/mod_table.cpp +++ b/code/mod_table/mod_table.cpp @@ -182,6 +182,7 @@ bool Show_locked_status_scramble_missions; bool Disable_expensive_turret_target_check; float Shield_percent_skips_damage; float Min_radius_for_persistent_debris; +bool Zero_radius_explosions_skip_fireballs; #ifdef WITH_DISCORD @@ -1638,6 +1639,10 @@ void parse_mod_table(const char *filename) stuff_float(&Min_radius_for_persistent_debris); } + if (optional_string("$Zero-radius explosions skip fireballs:")) { + stuff_boolean(&Zero_radius_explosions_skip_fireballs); + } + // end of options ---------------------------------------- // if we've been through once already and are at the same place, force a move @@ -1884,6 +1889,7 @@ void mod_table_reset() Disable_expensive_turret_target_check = false; Shield_percent_skips_damage = 0.1f; Min_radius_for_persistent_debris = 50.0f; + Zero_radius_explosions_skip_fireballs = false; } void mod_table_set_version_flags() @@ -1912,4 +1918,7 @@ void mod_table_set_version_flags() Disable_expensive_turret_target_check = true; Skybox_internal_depth_consistency = true; } + if (mod_supports_version(26, 0, 0)) { + Zero_radius_explosions_skip_fireballs = true; + } } diff --git a/code/mod_table/mod_table.h b/code/mod_table/mod_table.h index 658286003b4..a715083c95a 100644 --- a/code/mod_table/mod_table.h +++ b/code/mod_table/mod_table.h @@ -204,6 +204,7 @@ extern bool Show_locked_status_scramble_missions; extern bool Disable_expensive_turret_target_check; extern float Shield_percent_skips_damage; extern float Min_radius_for_persistent_debris; +extern bool Zero_radius_explosions_skip_fireballs; void mod_table_init(); void mod_table_post_process(); diff --git a/code/ship/ship.cpp b/code/ship/ship.cpp index 2d48626c1a8..c47d0c90abb 100644 --- a/code/ship/ship.cpp +++ b/code/ship/ship.cpp @@ -9802,7 +9802,12 @@ static void ship_dying_frame(object *objp, int ship_num) if(fireball_type < 0) { fireball_type = default_fireball_type; } - fireball_objnum = fireball_create( &objp->pos, fireball_type, FIREBALL_LARGE_EXPLOSION, OBJ_INDEX(objp), big_rad, false, &objp->phys_info.vel ); + + if (Zero_radius_explosions_skip_fireballs && fl_near_zero(big_rad)) + fireball_objnum = -1; + else + fireball_objnum = fireball_create( &objp->pos, fireball_type, FIREBALL_LARGE_EXPLOSION, OBJ_INDEX(objp), big_rad, false, &objp->phys_info.vel ); + if ( fireball_objnum >= 0 ) { explosion_life = fireball_lifeleft(&Objects[fireball_objnum]); } else {