1111#include " utils/modular_curves.h"
1212#include " graphics/2d.h"
1313
14+ #include " object/objectshield.h"
15+ #include " ship/ship.h"
16+ #include " object/object_instance.h"
17+ #include " hud/hudets.h"
18+
1419#include < optional>
1520
1621class EffectHost ;
@@ -261,7 +266,6 @@ class ParticleEffect {
261266 std::pair {" Trigger Velocity" , modular_curves_submember_input<&ParticleSource::m_triggerVelocity>{}},
262267 std::pair {" Host Radius" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getHostRadius>{}},
263268 std::pair {" Host Velocity" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getVelocityMagnitude>{}},
264- // TODO Long term, this should have access to a lot of interesting host properties, especially also those that change during gameplay like current hitpoints
265269 std::pair {" Effects Running" , modular_curves_math_input<
266270 modular_curves_submember_input<&ParticleSource::m_effect_is_running, &decltype (ParticleSource::m_effect_is_running)::count>,
267271 modular_curves_submember_input<&ParticleSource::getEffect, &SCP_vector<ParticleEffect>::size>,
@@ -274,7 +278,25 @@ class ParticleEffect {
274278 std::pair {" Nebula Usage Score" , modular_curves_math_input<
275279 modular_curves_global_submember_input<get_particle_count>,
276280 modular_curves_global_submember_input<Detail, &detail_levels::nebula_detail>,
277- ModularCurvesMathOperators::division>{}})
281+ ModularCurvesMathOperators::division>{}},
282+ std::pair {" Host Object Hitpoints" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &object::hull_strength>{}},
283+ std::pair {" Host Ship Hitpoints Fraction" , modular_curves_math_input<
284+ modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &object::hull_strength>,
285+ modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::ship_max_hull_strength>,
286+ ModularCurvesMathOperators::division>{}},
287+ std::pair {" Host Object Shield" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &shield_get_strength>{}},
288+ std::pair {" Host Ship Shield Fraction" , modular_curves_math_input<
289+ modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &shield_get_strength>,
290+ modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::ship_max_shield_strength>,
291+ ModularCurvesMathOperators::division>{}},
292+ std::pair {" Host Ship AB Fuel Left" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::afterburner_fuel>{}},
293+ std::pair {" Host Ship Countermeasures Left" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::cmeasure_count>{}},
294+ std::pair {" Host Ship Weapon Energy Left" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::weapon_energy>{}},
295+ std::pair {" Host Ship ETS Engines" , modular_curves_math_input<modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::engine_recharge_index>, modular_curves_global_submember_input<MAX_ENERGY_INDEX>, ModularCurvesMathOperators::division>{}},
296+ std::pair {" Host Ship ETS Shields" , modular_curves_math_input<modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::shield_recharge_index>, modular_curves_global_submember_input<MAX_ENERGY_INDEX>, ModularCurvesMathOperators::division>{}},
297+ std::pair {" Host Ship ETS Weapons" , modular_curves_math_input<modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::weapon_recharge_index>, modular_curves_global_submember_input<MAX_ENERGY_INDEX>, ModularCurvesMathOperators::division>{}},
298+ std::pair {" Host Ship EMP Intensity" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::emp_intensity>{}},
299+ std::pair {" Host Ship Time Until Explosion" , modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0 , &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::final_death_time, static_cast <int (*)(int )>(×tamp_until)>{}})
278300 .derive_modular_curves_input_only_subset<size_t >( // Effect Number
279301 std::pair {" Spawntime Left" , modular_curves_functional_full_input<&ParticleSource::getEffectRemainingTime>{}},
280302 std::pair {" Time Running" , modular_curves_functional_full_input<&ParticleSource::getEffectRunningTime>{}})
@@ -293,7 +315,7 @@ class ParticleEffect {
293315 std::pair {" Radius Mult" , ParticleLifetimeCurvesOutput::RADIUS_MULT}, // Modern Naming Alias
294316 std::pair {" Velocity Mult" , ParticleLifetimeCurvesOutput::VELOCITY_MULT}, // Modern Naming Alias
295317 std::pair {" Length Mult" , ParticleLifetimeCurvesOutput::LENGTH_MULT},
296- std::pair {" Anim State Mult " , ParticleLifetimeCurvesOutput::ANIM_STATE},
318+ std::pair {" Anim State" , ParticleLifetimeCurvesOutput::ANIM_STATE},
297319 std::pair {" Light Radius Mult" , ParticleLifetimeCurvesOutput::LIGHT_RADIUS_MULT},
298320 std::pair {" Light Source Radius Mult" , ParticleLifetimeCurvesOutput::LIGHT_SOURCE_RADIUS_MULT},
299321 std::pair {" Light Intensity Mult" , ParticleLifetimeCurvesOutput::LIGHT_INTENSITY_MULT},
@@ -311,7 +333,25 @@ class ParticleEffect {
311333 modular_curves_submember_input<&particle::max_life>,
312334 ModularCurvesMathOperators::division>{}},
313335 std::pair {" Radius" , modular_curves_submember_input<&particle::radius>{}},
314- std::pair {" Velocity" , modular_curves_submember_input<&particle::velocity, &vm_vec_mag_quick>{}})
336+ std::pair {" Velocity" , modular_curves_submember_input<&particle::velocity, &vm_vec_mag_quick>{}},
337+ std::pair {" Parent Object Hitpoints" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &object::hull_strength>{}},
338+ std::pair {" Parent Ship Hitpoints Fraction" , modular_curves_math_input<
339+ modular_curves_submember_input<&particle::attached_objnum, &Objects, &object::hull_strength>,
340+ modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::ship_max_hull_strength>,
341+ ModularCurvesMathOperators::division>{}},
342+ std::pair {" Parent Object Shield" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &shield_get_strength>{}},
343+ std::pair {" Parent Ship Shield Fraction" , modular_curves_math_input<
344+ modular_curves_submember_input<&particle::attached_objnum, &Objects, &shield_get_strength>,
345+ modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::ship_max_shield_strength>,
346+ ModularCurvesMathOperators::division>{}},
347+ std::pair {" Parent Ship AB Fuel Left" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::afterburner_fuel>{}},
348+ std::pair {" Parent Ship Countermeasures Left" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::cmeasure_count>{}},
349+ std::pair {" Parent Ship Weapon Energy Left" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::weapon_energy>{}},
350+ std::pair {" Parent Ship ETS Engines" , modular_curves_math_input<modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::engine_recharge_index>, modular_curves_global_submember_input<MAX_ENERGY_INDEX>, ModularCurvesMathOperators::division>{}},
351+ std::pair {" Parent Ship ETS Shields" , modular_curves_math_input<modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::shield_recharge_index>, modular_curves_global_submember_input<MAX_ENERGY_INDEX>, ModularCurvesMathOperators::division>{}},
352+ std::pair {" Parent Ship ETS Weapons" , modular_curves_math_input<modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::weapon_recharge_index>, modular_curves_global_submember_input<MAX_ENERGY_INDEX>, ModularCurvesMathOperators::division>{}},
353+ std::pair {" Parent Ship EMP Intensity" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::emp_intensity>{}},
354+ std::pair {" Parent Ship Time Until Explosion" , modular_curves_submember_input<&particle::attached_objnum, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::final_death_time, static_cast <int (*)(int )>(×tamp_until)>{}})
315355 .derive_modular_curves_input_only_subset<float >(
316356 std::pair {" Post-Curves Velocity" , modular_curves_self_input{}}
317357 );
0 commit comments