ACE3/addons/medical_damage/ACE_Medical_Injuries.hpp

319 lines
12 KiB
C++
Raw Normal View History

Medical - Fix severity of wound bleeding and adjust cardiac output calculations (#7010) * Fix severity of wound bleeding I'm simplifying the nastiness calculations so that the wound config specifies the worst wound and we scale it between 25% to 100% based on the wound damage and number of wounds recieved. Similarly I've updated the wound configs to more reasonable maximum bleeding values based on the fact that they're percentages of cardiac output being bled. * Limit variance of pain modifier This is to avoid unexpectedly high pain for small wounds or unexpectedly small pain for large wounds * Make more wounds increase chance for nastiness Rather than guarantee * Adjust worst damage scaling This handles torso wounds better as they're typically around 0.3-0.6 for 6.5mm shots which makes them roughly medium sized. * Fix cardiac output calculation Previously the calculation didn't make sense as it wasn't outputting a value in l/s. This method of calculation makes more logical sense and provides a point of reference for what the bleeding values actually represent (percentage of the blood being pumped that is lost - which now has an actual volumetric value). * Fix blood pressure after change to cardiac output * Fix heartrate skyrocketing between 5l and 4l blood Pretty sure someone accidnentally got these conditions the wrong way around. This way blood pressure will first drop and then heart rate will later go up to compensate. * Fix comment typo Co-Authored-By: PabstMirror <pabstmirror@gmail.com>
2019-06-10 16:23:21 +00:00
// bleeding - maximum possible percentage of cardiac output bled for a given wound type (0 .. 1)
2016-12-05 20:34:20 +00:00
// pain - maximum possible pain level for a given wound type (0 .. 1)
class ACE_Medical_Injuries {
2016-12-05 20:34:20 +00:00
// Defines all the possible injury types
class wounds {
// Source: Scarle
// Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees).
class Abrasion {
2016-12-05 20:34:20 +00:00
bleeding = 0.001;
pain = 0.4;
};
// Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions.
class Avulsion {
Medical - Fix severity of wound bleeding and adjust cardiac output calculations (#7010) * Fix severity of wound bleeding I'm simplifying the nastiness calculations so that the wound config specifies the worst wound and we scale it between 25% to 100% based on the wound damage and number of wounds recieved. Similarly I've updated the wound configs to more reasonable maximum bleeding values based on the fact that they're percentages of cardiac output being bled. * Limit variance of pain modifier This is to avoid unexpectedly high pain for small wounds or unexpectedly small pain for large wounds * Make more wounds increase chance for nastiness Rather than guarantee * Adjust worst damage scaling This handles torso wounds better as they're typically around 0.3-0.6 for 6.5mm shots which makes them roughly medium sized. * Fix cardiac output calculation Previously the calculation didn't make sense as it wasn't outputting a value in l/s. This method of calculation makes more logical sense and provides a point of reference for what the bleeding values actually represent (percentage of the blood being pumped that is lost - which now has an actual volumetric value). * Fix blood pressure after change to cardiac output * Fix heartrate skyrocketing between 5l and 4l blood Pretty sure someone accidnentally got these conditions the wrong way around. This way blood pressure will first drop and then heart rate will later go up to compensate. * Fix comment typo Co-Authored-By: PabstMirror <pabstmirror@gmail.com>
2019-06-10 16:23:21 +00:00
bleeding = 0.1;
2016-12-05 20:34:20 +00:00
pain = 1.0;
causeLimping = 1;
};
// Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions.
class Contusion {
Medical - Fix severity of wound bleeding and adjust cardiac output calculations (#7010) * Fix severity of wound bleeding I'm simplifying the nastiness calculations so that the wound config specifies the worst wound and we scale it between 25% to 100% based on the wound damage and number of wounds recieved. Similarly I've updated the wound configs to more reasonable maximum bleeding values based on the fact that they're percentages of cardiac output being bled. * Limit variance of pain modifier This is to avoid unexpectedly high pain for small wounds or unexpectedly small pain for large wounds * Make more wounds increase chance for nastiness Rather than guarantee * Adjust worst damage scaling This handles torso wounds better as they're typically around 0.3-0.6 for 6.5mm shots which makes them roughly medium sized. * Fix cardiac output calculation Previously the calculation didn't make sense as it wasn't outputting a value in l/s. This method of calculation makes more logical sense and provides a point of reference for what the bleeding values actually represent (percentage of the blood being pumped that is lost - which now has an actual volumetric value). * Fix blood pressure after change to cardiac output * Fix heartrate skyrocketing between 5l and 4l blood Pretty sure someone accidnentally got these conditions the wrong way around. This way blood pressure will first drop and then heart rate will later go up to compensate. * Fix comment typo Co-Authored-By: PabstMirror <pabstmirror@gmail.com>
2019-06-10 16:23:21 +00:00
bleeding = 0;
2016-12-05 20:34:20 +00:00
pain = 0.3;
};
// Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures.
class Crush {
bleeding = 0.05;
2016-12-05 20:34:20 +00:00
pain = 0.8;
causeLimping = 1;
causeFracture = 1;
};
// Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision.
class Cut {
Medical - Fix severity of wound bleeding and adjust cardiac output calculations (#7010) * Fix severity of wound bleeding I'm simplifying the nastiness calculations so that the wound config specifies the worst wound and we scale it between 25% to 100% based on the wound damage and number of wounds recieved. Similarly I've updated the wound configs to more reasonable maximum bleeding values based on the fact that they're percentages of cardiac output being bled. * Limit variance of pain modifier This is to avoid unexpectedly high pain for small wounds or unexpectedly small pain for large wounds * Make more wounds increase chance for nastiness Rather than guarantee * Adjust worst damage scaling This handles torso wounds better as they're typically around 0.3-0.6 for 6.5mm shots which makes them roughly medium sized. * Fix cardiac output calculation Previously the calculation didn't make sense as it wasn't outputting a value in l/s. This method of calculation makes more logical sense and provides a point of reference for what the bleeding values actually represent (percentage of the blood being pumped that is lost - which now has an actual volumetric value). * Fix blood pressure after change to cardiac output * Fix heartrate skyrocketing between 5l and 4l blood Pretty sure someone accidnentally got these conditions the wrong way around. This way blood pressure will first drop and then heart rate will later go up to compensate. * Fix comment typo Co-Authored-By: PabstMirror <pabstmirror@gmail.com>
2019-06-10 16:23:21 +00:00
bleeding = 0.01;
2016-12-05 20:34:20 +00:00
pain = 0.1;
};
// Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch.
class Laceration {
2016-12-05 20:34:20 +00:00
bleeding = 0.05;
pain = 0.2;
};
// Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel.
class VelocityWound {
Medical - Fix severity of wound bleeding and adjust cardiac output calculations (#7010) * Fix severity of wound bleeding I'm simplifying the nastiness calculations so that the wound config specifies the worst wound and we scale it between 25% to 100% based on the wound damage and number of wounds recieved. Similarly I've updated the wound configs to more reasonable maximum bleeding values based on the fact that they're percentages of cardiac output being bled. * Limit variance of pain modifier This is to avoid unexpectedly high pain for small wounds or unexpectedly small pain for large wounds * Make more wounds increase chance for nastiness Rather than guarantee * Adjust worst damage scaling This handles torso wounds better as they're typically around 0.3-0.6 for 6.5mm shots which makes them roughly medium sized. * Fix cardiac output calculation Previously the calculation didn't make sense as it wasn't outputting a value in l/s. This method of calculation makes more logical sense and provides a point of reference for what the bleeding values actually represent (percentage of the blood being pumped that is lost - which now has an actual volumetric value). * Fix blood pressure after change to cardiac output * Fix heartrate skyrocketing between 5l and 4l blood Pretty sure someone accidnentally got these conditions the wrong way around. This way blood pressure will first drop and then heart rate will later go up to compensate. * Fix comment typo Co-Authored-By: PabstMirror <pabstmirror@gmail.com>
2019-06-10 16:23:21 +00:00
bleeding = 0.2;
2016-12-05 20:34:20 +00:00
pain = 0.9;
causeLimping = 1;
causeFracture = 1;
};
// Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass.
class PunctureWound {
bleeding = 0.05;
2016-12-05 20:34:20 +00:00
pain = 0.4;
causeLimping = 1;
};
Add Vehicle Damage (ACE2 port) & Enhance Cook-Off (#7565) * Initital port of ACE2 Vehicle Damage * Add fire damage and burning people * Migrate vehicle damge stuff from cookoff. Change cookoff function to enhance effect. * Minor tweaks * Add incendiary values to all applicable ammunition. Add engine fire/smoke if hit enough * Handle car damage more elegantly. * Added ability to create fire sources arbitrarily * tweaks * Add chance to detonate after cookoff * disable compile cache * Move blown-off turret config to vehicle damage. Add settings inititalized EH for initializing off settings * tabs->spaces * Various code improvements * Change to count loop for deleting effects * update addon requirements * remove vanilla config requirements * Add RHS compatability * RHS compat. Various QOL fixes/changes * Various tweaks to compats and code. * High-Explosive damage tweak * Change how penetration is calculated for parts * Fix RHS compat * Create setting for flare effect * increase burning scream sounds * swap out file name for snake_case * move incendiary values out of vehicle damage. remove medical dependency * vehicle_dammage - update all refs to snake * sqf fixes * fix fire string package caps * fix pboprefix * Default setting to on * Add variables to enable/disable ring fire to avoid goofy looking vehicles. Enhance how particles are cleaned up. Remove advanced penetration simulation. Change how fire intensity is calculated. Add setting to "disable" vehicle after cookoff * Fix bug where event handler wasn't giving the damage last. * change to snake * fix build errors * Fix UBC * Fix Order of Operations * avoid O^2 events * Make sure that no damage processing happens on dead units * Change some if statements * Keep track of player's death to stop various things * add quotes to right middle wheen * Add VD documentation * fire docs * Code quality fixes * Clarify documentation * define IDD * switch global -> server * Add newline between header and first code statement * stop the dead from suffering Its hard to tell when a unit is dead or in spectator, so check the config of the unit to determine it. * Add settings to disable cook-off effects * Delete effects if vehicle is deleted before cookoff occurs. Don't cookoff player ammo. Throw weapon better * Move fire into own PR * fix tabs and macro * Shuffle crew indices so that a random person is first on the list to be injured each time * fix effects not clearing Co-authored-by: PabstMirror <pabstmirror@gmail.com>
2021-10-14 15:49:27 +00:00
// Pain wound that is caused by making or being in contact with heat
class ThermalBurn {
bleeding = 0;
pain = 0.7;
minDamage = 0;
};
};
class damageTypes {
// thresholds[] {{<damage>, <number of wounds>}, {...}}
// if damage is between two points, number is interpolated and then rounded by chance based on the decimal part
// e.g. a value of 2.7 has 70% chance to give 3 and 30% to give 2
// put damage values in descending order; uses the first value found that is below the wound damage, and the point immediately before that
thresholds[] = {{0.1, 1}};
// if 1, wounds are only applied to the hitpoint that took the most damage. othewrise, wounds are applied to all damaged hitpoints
selectionSpecific = 1;
// list of damage handlers, which will be called in reverse order
// each entry should be a SQF expression that returns a function
// this can also be overridden for each damage type
class woundHandlers {
ADDON = QFUNC(woundsHandlerBase);
};
class bullet {
// bullets only create multiple wounds when the damage is very high
thresholds[] = {{20, 10}, {4.5, 2}, {3, 1}, {0, 1}};
selectionSpecific = 1;
class Avulsion {
// at damage, weight. between points, weight is interpolated then wound is chosen by weighted random.
// as with thresholds, but result is not rounded (decimal values used as-is)
weighting[] = {{1, 1}, {0.35, 0}};
/*
damageMultiplier = 1;
sizeMultiplier = 1;
bleedingMultiplier = 1;
painMultiplier = 1;
fractureMultiplier = 1;
*/
};
class Contusion {
weighting[] = {{0.35, 0}, {0.35, 1}};
// bruises caused by bullets hitting the plate are big
sizeMultiplier = 3.2;
// tone down the pain a tiny bit to compensate
painMultiplier = 0.8;
};
class VelocityWound {
// velocity wounds are only in the 0.35-1.5 range
weighting[] = {{1.5, 0}, {1.5, 1}, {0.35, 1}, {0.35, 0}};
// velocity wounds will tend to be medium or large
sizeMultiplier = 0.9;
};
};
class grenade {
// at low damage numbers, chance to create no wounds - makes it a bit more random instead of consistently covering people in bruises
thresholds[] = {{20, 10}, {10, 5}, {4, 3}, {1.5, 2}, {0.8, 2}, {0.3, 1}, {0, 0}};
selectionSpecific = 0;
class Avulsion {
weighting[] = {{1.5, 1}, {1.1, 0}};
};
class VelocityWound {
weighting[] = {{1.5, 0}, {1.1, 1}, {0.7, 0}};
};
class PunctureWound {
weighting[] = {{0.9, 0}, {0.7, 1}, {0.35, 0}};
};
class Cut {
weighting[] = {{0.7, 0}, {0.35, 1}, {0.35, 0}};
};
class Contusion {
weighting[] = {{0.5, 0}, {0.35, 1}};
sizeMultiplier = 2;
painMultiplier = 0.9;
};
};
class explosive {
// explosives create more and smaller wounds than grenades
thresholds[] = {{20, 15}, {8, 7}, {2, 3}, {1.2, 2}, {0.4, 1}, {0,0}};
selectionSpecific = 0;
class Avulsion {
weighting[] = {{1, 1}, {0.8, 0}};
};
class Cut {
weighting[] = {{1.5, 0}, {0.35, 1}, {0, 0}};
};
class Contusion {
weighting[] = {{0.5, 0}, {0.35, 1}};
sizeMultiplier = 2;
painMultiplier = 0.9;
};
};
class shell {
// shells tend to involve big pieces of shrapnel, so create fewer and larger wounds
thresholds[] = {{20, 10}, {10, 5}, {4.5, 2}, {2, 2}, {0.8, 1}, {0.2, 1}, {0, 0}};
selectionSpecific = 0;
class Avulsion {
weighting[] = {{1.5, 1}, {1.1, 0}};
};
class VelocityWound {
weighting[] = {{1.5, 0}, {1.1, 1}, {0.7, 0}};
};
class PunctureWound {
weighting[] = {{0.9, 0}, {0.7, 1}, {0.35, 0}};
};
class Cut {
weighting[] = {{0.7, 0}, {0.35, 1}, {0.35, 0}};
};
class Contusion {
weighting[] = {{0.5, 0}, {0.35, 1}};
sizeMultiplier = 2;
painMultiplier = 0.9;
};
};
class vehiclehit: explosive {
// vehicle explosions are usually caused by explosive damage and should behave similarly
thresholds[] = {{6, 3}, {4.5, 2}, {2, 2}, {0.8, 1}, {0.2, 1}, {0, 0}};
class woundHandlers: woundHandlers {
GVAR(vehiclehit) = QFUNC(woundsHandlerVehiclehit);
};
};
class vehiclecrash {
thresholds[] = {{1.5, 3}, {1.5, 2}, {1, 2}, {1, 1}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered
selectionSpecific = 0;
class woundHandlers: woundHandlers {
GVAR(vehiclecrash) = QFUNC(woundsHandlerVehiclecrash);
};
class Abrasion {
weighting[] = {{0.30, 0}, {0.30, 1}};
};
class Avulsion {
weighting[] = {{0.01, 1}, {0.01, 0}};
};
class Contusion {
weighting[] = {{0.35, 0}, {0.35, 1}};
};
class Crush {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
class Cut {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
class Laceration {
};
};
class collision {
thresholds[] = {{8, 4}, {1, 1}, {0.3, 1}, {0.15, 0.5}, {0, 0.3}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered
selectionSpecific = 0;
class Avulsion {
weighting[] = {{1, 2}, {0.5, 0.5}, {0.5, 0}};
};
class Abrasion {
weighting[] = {{0.4, 0}, {0.2, 1}, {0, 0}};
};
class Contusion {
weighting[] = {{0.4, 0}, {0.2, 1}};
};
class Crush {
weighting[] = {{0.4, 1}, {0.2, 0}};
};
class Cut {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
class Laceration {
};
};
class falling {
thresholds[] = {{8, 4}, {1, 1}, {0.2, 1}, {0.1, 0.7}, {0, 0.5}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered
selectionSpecific = 0;
class Abrasion {
weighting[] = {{0.4, 0}, {0.2, 1}, {0, 0}};
sizeMultiplier = 3;
};
class Contusion {
weighting[] = {{0.4, 0}, {0.2, 1}};
sizeMultiplier = 3;
};
class Crush {
weighting[] = {{0.4, 1}, {0.2, 0}};
sizeMultiplier = 1.5;
};
};
class backblast {
thresholds[] = {{1, 6}, {1, 5}, {0.55, 5}, {0.55, 2}, {0, 2}};
selectionSpecific = 0;
class Avulsion {
weighting[] = {{0.30, 0}, {0.30, 1}};
};
class Contusion {
weighting[] = {{0.35, 0}, {0.35, 1}};
};
class Cut {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
};
class stab {
thresholds[] = {{0.1, 1}, {0.1, 0}};
selectionSpecific = 1;
class Cut {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
class PunctureWound {
weighting[] = {{0.02, 1}, {0.02, 0}};
};
};
class punch {
thresholds[] = {{0.1, 1}, {0.1, 0}};
selectionSpecific = 1;
class Contusion {
weighting[] = {{0.35, 0}, {0.35, 1}};
};
class Crush {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
class Laceration {
};
};
class ropeburn {
thresholds[] = {{0.1, 1}, {0.1, 0}};
selectionSpecific = 1;
noBlood = 1;
class Abrasion {
weighting[] = {{0.30, 1}};
};
};
class drowning {
//No related wounds as drowning should not cause wounds/bleeding. Can be extended for internal injuries if they are added.
thresholds[] = {{0, 0}};
noBlood = 1;
class woundHandlers {};
};
class fire {
noBlood = 1;
// custom handling for environmental fire sources
// passes damage to "burn" so doesn't need its own wound stats
class woundHandlers {
ADDON = QFUNC(woundsHandlerBurning);
};
};
Add Vehicle Damage (ACE2 port) & Enhance Cook-Off (#7565) * Initital port of ACE2 Vehicle Damage * Add fire damage and burning people * Migrate vehicle damge stuff from cookoff. Change cookoff function to enhance effect. * Minor tweaks * Add incendiary values to all applicable ammunition. Add engine fire/smoke if hit enough * Handle car damage more elegantly. * Added ability to create fire sources arbitrarily * tweaks * Add chance to detonate after cookoff * disable compile cache * Move blown-off turret config to vehicle damage. Add settings inititalized EH for initializing off settings * tabs->spaces * Various code improvements * Change to count loop for deleting effects * update addon requirements * remove vanilla config requirements * Add RHS compatability * RHS compat. Various QOL fixes/changes * Various tweaks to compats and code. * High-Explosive damage tweak * Change how penetration is calculated for parts * Fix RHS compat * Create setting for flare effect * increase burning scream sounds * swap out file name for snake_case * move incendiary values out of vehicle damage. remove medical dependency * vehicle_dammage - update all refs to snake * sqf fixes * fix fire string package caps * fix pboprefix * Default setting to on * Add variables to enable/disable ring fire to avoid goofy looking vehicles. Enhance how particles are cleaned up. Remove advanced penetration simulation. Change how fire intensity is calculated. Add setting to "disable" vehicle after cookoff * Fix bug where event handler wasn't giving the damage last. * change to snake * fix build errors * Fix UBC * Fix Order of Operations * avoid O^2 events * Make sure that no damage processing happens on dead units * Change some if statements * Keep track of player's death to stop various things * add quotes to right middle wheen * Add VD documentation * fire docs * Code quality fixes * Clarify documentation * define IDD * switch global -> server * Add newline between header and first code statement * stop the dead from suffering Its hard to tell when a unit is dead or in spectator, so check the config of the unit to determine it. * Add settings to disable cook-off effects * Delete effects if vehicle is deleted before cookoff occurs. Don't cookoff player ammo. Throw weapon better * Move fire into own PR * fix tabs and macro * Shuffle crew indices so that a random person is first on the list to be injured each time * fix effects not clearing Co-authored-by: PabstMirror <pabstmirror@gmail.com>
2021-10-14 15:49:27 +00:00
class burn {
thresholds[] = {{0, 1}};
selectionSpecific = 0;
noBlood = 1;
class ThermalBurn {
weighting[] = {{0, 1}};
};
};
class unknown {
thresholds[] = {{0.1, 1}, {0.1, 0}};
class Abrasion {
weighting[] = {{0.30, 0}, {0.30, 1}};
};
class Cut {
weighting[] = {{0.1, 1}, {0.1, 0}};
};
class VelocityWound {
weighting[] = {{0.35, 1}, {0.35, 0}};
};
};
};
};