Jump to content
  • Medical technical data and guide





    The guide is meant for people who want more information on how the current medical system works.
    Credit: johnb43 (original info), FloofyFloof (updates)



    • This guide will be gradually updated with new knowledge.
    • If you have additional/different findings, please let the medical trainers know.



    • Limping: Controls whether open or bandaged wounds cause a person to limp.
    • Fractures: Controls the effect of using splints to treat fractures. When disabled, injuries will not cause fractures.
    • Fracture Chance: The probability of a fracture causing wound resulting in a fracture.
    • Unconscious Wake Up Chance: The probability that a person with stable vitals will wake up from unconsciousness (checked every 15 seconds).
    • Epinephrine Wake Up Chance Boost: Increases how often spontaneous wake up check happen when the patient has Epinephrine in their system.
    • Fatal Damage Source: Determines what damage can be fatal. (see "Damage")
    • Player/AI Critical Damage Threshold: Sets the amount of damage a player/AI can receive before going unconscious (and dying if "Sum of Trauma" is enabled)
    • Pain Unconscious Chance: Sets the probability of someone falling unconscious when their pain is above the threshold (0.5 pain) upon receiving damage.
    • Medic AI: AI will respond to injury and unconsciousness.
    • [...]
    • Player/AI Fatal Injuries: Controls when players/AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or torso.
      • Always: If the unit takes a fatal amount of damage, it dies.
      • In Cardiac Arrest: If the unit takes a fatal amount of damage, it will go into cardiac arrest. Once in cardiac arrest, it can be killed.
      • Never: If the unit takes a fatal amount of damage, it will go into cardiac arrest. Once in cardiac arrest, it can't be killed.






    Since FK has its bleeding rate cut in half, multiply these values by 0.5.


    • Check - 2.5s
    • Apply Tourniquet - 5s
    • Remove Tourniquet - 5s
    • Splint - 7s
    • Giving drugs - 2s
    • Giving IVs - 9s
    • Doing CPR - 15s
      • Has from 40% to 60% chance of succeeding
    • Using a bodybag - 15s
    • PAK - 10s - 108s (see "Using the PAK")
    • Surgical kit - 4s * (the amount of type of wounds that can be stitched)
      • If you have 4x Large Avulsion and 2x Medium Avulsion on a limb, it will take 8s to stitch the limb
      • If you have 3x Large Avulsion on the left leg and 2x Large Avulsion on the right leg, it will also take 8s to stitch those two limbs


    • Small wounds:
      • 2s for medics
      • 4s for non-medics
      • 6s for self for medics
      • 8s for self for non-medics
    • Medium wounds:
      • 4s for medics
      • 6s for non-medics
      • 8s for self for medics
      • 10s for self for non-medics
    • Large wounds:
      • 6s for medics
      • 8s for non-medics
      • 10s for self for medics
      • 12s for self for non-medics
    #define BANDAGE_TIME_S 4
    #define BANDAGE_TIME_M 6
    #define BANDAGE_TIME_L 8





    You need to fulfill all these conditions to be considered stable and be able to use the PAK:

    • Not bleeding (Tourniquets count as not bleeding)
    • Conscious (which means you need stable vitals, which are):
      • Less than 15% blood volume lost ("Lost some blood")
      • BP 60+ Systolic, 50+ Diastolic (60/50 minimum)
      • HR 40+
      • Not in cardiac arrest (otherwise BP/HR would be 0)
      • Blood loss is not beyond knockout threshold (don't worry about this)


    if (GET_BLOOD_VOLUME(_unit) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE) exitWith { false };
    if IN_CRDC_ARRST(_unit) exitWith { false };
    private _cardiacOutput = [_unit] call FUNC(getCardiacOutput);
    private _bloodLoss = GET_BLOOD_LOSS(_unit);
    if (_bloodLoss > (BLOOD_LOSS_KNOCK_OUT_THRESHOLD * _cardiacOutput) / 2) exitWith { false };
    private _bloodPressure = GET_BLOOD_PRESSURE(_unit);
    _bloodPressure params ["_bloodPressureL", "_bloodPressureH"];
    if (_bloodPressureL < 50 || {_bloodPressureH < 60}) exitWith { false };
    private _heartRate = GET_HEART_RATE(_unit);
    if (_heartRate < 40) exitWith { false };
    10 max (((_bodyPartDamage * DAMAGE_SCALING_FACTOR) min 180) * GVAR(timeCoefficientPAK))  

    _bodyPartDamage is the total sum of damage the patient has. timeCoefficientPAK is set to 0.7 on FK, default is 1.0



    params ["", "_patient"];
    count (_patient call FUNC(getStitchableWounds)) * GVAR(woundStitchTime)
    Default time it takes to stitch one wound is 5 seconds.





    • Pain now isn't going to keep knocking you down. However, pain makes adrenaline production kick in and raises your heart rate (HR). This effect causes you to bleed faster. There are 2 ways of reducing HR: Morphine or Adenosine. Morphine stays in your system much longer and has side effects, so go with Adenosine if you have to reduce the patient's HR.
    • The wakeup chance in the setting is checked every 15 seconds but is applied only if the patient has stable vitals. Epinephrine reduces that interval with a factor.
    _return = _return + (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem;
    Function (runs only if the patient has stable vitals):
    private _wakeUpCheckInterval = SPONTANEOUS_WAKE_UP_INTERVAL;
    private _epiEffectiveness = [_unit, "Epinephrine", false] call EFUNC(medical_status,getMedicationCount);
    _wakeUpCheckInterval = _wakeUpCheckInterval * linearConversion [0, 1, _epiEffectiveness, 1, 1 / EGVAR(medical,spontaneousWakeUpEpinephrineBoost), true];

    Multiple Epinephrines will not decrease the interval.

    • Medics can now stitch without all bleeding stopped. However, if you want to stitch a body part, it needs to be fully bandaged. This allows a medic to stitch in several steps, making sure that the other bandaged parts don't reopen.
    • Medics can now stitch and give themselves IVs.
    • Tourniquets cause pain after having been on for more than 2 minutes.
    • IV's are administered with a base flow rate of 4.1667 ml/s, which is 250ml/min. We have quadrupled the flow rate on the FK servers, so it's 1000 ml/min.
    • Only crushes and velocity wounds can cause fractures.
    • If you are a co-pilot and your pilot goes unconscious, it automatically unlocks the controls (you will still need to take them through the scroll wheel menu though).
    • If your HR is below 60 or above 160, it will play the heart beating sound (it is much quieter than it was before).


    Cardiac arrest is when your heart stops, therefore you will have no blood pressure and no pulse. Make sure you are not checking them on a tourniqueted limb, since that also returns 0.
    You can check the response on the head of the patient and it will tell you the correct status of the patient even if someone is doing CPR at the same time.
    Cardiac arrest occurs in following cases:

    • You lose a fatal amount of blood but you don't die. If you have been conscious until then, you will ragdoll and fall unconscious. If unconscious, you will stay so (no ragdolling).
    • You overdose on medication. It depends on your state, but a fully healed patient can go into cardiac arrest to a minimum of 3 morphine, 5 epinephrine or 3 adenosine back to back. If you take a little pause inbetween, it will take a lot more epinephrine to overdose (doesn't matter for the others). It takes only 2 morphine if you pause 30s - 60s between the administering of the morphine.
    • If your HR is between 20 and 30, there is a chance of going into cardiac arrest. The lower the HR, the more likely.
    • If your HR is below 20 or above 220, you are guaranteed to go into cardiac arrest.


    Some things to know about cardiac arrest:

    • There is a timer that defines how long a patient can be in cardiac arrest before he dies. This can be changed in the ace medical settings.
    • There is a up to 10% variance on the timer. With the settings we use, it spans from 4.5 minutes to 5.5 minutes.
    // 10% possible variance in cardiac arrest time
    private _time = GVAR(cardiacArrestTime);
    _time = _time + _time * random [-0.1, 0, 0.1];
    • While performing CPR, the timer runs 50% slower. Theoretically, if you were to keep CPRing a patient and he was kept in cardiac arrest, he could survive twice as long as the timer (9 - 11minutes in our case).
    if (_recieveingCPR) then { _timeDiff = _timeDiff * 0.5; }; // if being cpr'ed, then time decrease is reduced
    _timeLeft = _timeLeft - _timeDiff; // negative values are fine

    How to deal with cardiac arrest:

    • If it happened due to blood loss: Administer 1l of blood first, then perform CPR. If not successful, try until you see a HR and a BP.
    • If it happens due to a morphine overdose: Stitch the patient fully and top him off with blood if he needs it. Give the patient as many epinephrines as he has had morphines (look at triage card), add an extra epinephrine and then perform CPR. If they do not have a HR and a BP, do it again. Once they have a HR and a BP, give them the same amount of epinephrines again, then PAK them as soon as possible.
    • If it happens due to an adenosine overdose: Give the patient as many epinephrines as he has had adenosines(look at triage card), add an extra epinephrine and then perform CPR. If they do not have a HR and a BP, do it again. PAK as soon as possible.
    • If it happens due to a epinephrine overdose: Perform CPR. If that doesn't work, give them an adenosine first, the perform CPR. If you do not adenosine on yourself, keep doing CPR until they wake up, since adenosine only stays 2 minutes in the system. They wake up on their own, so PAK as soon as possible.

    CPR Chances depends on the blood volume of the patient.

    private _bloodVolume = GET_BLOOD_VOLUME(_patient);
    private _successChance = linearConversion [BLOOD_VOLUME_FATAL, DEFAULT_BLOOD_VOLUME, _bloodVolume, GVAR(cprSuccessChanceMin), GVAR(cprSuccessChanceMax), true];
    if ((random 1) < _successChance) then {
        TRACE_2("CPR random success",_bloodVolume,_successChance);
        [QEGVAR(medical,CPRSucceeded), _patient] call CBA_fnc_localEvent;
    } else {
        TRACE_2("CPR random fail",_bloodVolume,_successChance);


    Blood pressure is writte as systolic over diastolic pressure. Normal Blood pressure in ACE3 (and IRL) is 120 systolic over 80 diastolic, which would be 120/80.

    _unit setVariable [VAR_BLOOD_PRESS, [80, 120], true];

    Here are the values for what Low, Normal and High means for blood pressure.

    if (_bloodPressureHigh > 20) then {
     _logOutput = LSTRING(Check_Bloodpressure_Low);
    if (_bloodPressureHigh > 100) then {
     _logOutput = LSTRING(Check_Bloodpressure_Normal);
    if (_bloodPressureHigh > 160) then {
     _logOutput = LSTRING(Check_Bloodpressure_High);

    Here are the values for what Weak, Normal and Strong means for heartrate.

    if (_heartRate > 1) then {
     _logOutput = LSTRING(Check_Pulse_Weak);
    if (_heartRate > 60) then {
     _logOutput = LSTRING(Check_Pulse_Normal);        
    if (_heartRate > 100) then {
     _logOutput = LSTRING(Check_Pulse_Strong);


    Setting with "Sum of Trauma": The sum of the damage that is applied to the limbs is ignored. It does not matter if you take 1 or 200 wounds to the limbs, these wounds can't kill you directly (they can knock you unconscious, you can also die of bleedout, but not from the hits themselves).

    if (_part > 1) exitWith { false }; //part 0 being the head, part 1 being the torso

    You can take more torso shot than headshots. In our case, 1.25 * 3 = 3.75 for the head and 1.5 * 3 = 4.5 for the torso.

    private _headThreshhold = 1.25 * _damageThreshold;
    private _bodyThreshhold = 1.5 * _damageThreshold;
    private _vitalDamage = ((_headDamage - _headThreshhold) max 0) + ((_bodyDamage - _bodyThreshhold) max 0);

    If the sum of the damage to the head is smaller than the threshold, the first term will be 0, since max of a negative number and 0 is 0. Same goes for the torso.
    So if both are 0 as a result of the calculation, _vitalDamage is 0. If you put 0 into _chanceFatal, it will also result in 1 - e^0 = 0, meaning you have no chance of dying if the sum of the damage you have taken is below the threshold.

    private _x1 = 0.5;
    private _y1 = 0.1;
    private _x2 = 0.8;
    private _y2 = 0.9;
    private _b1 = -ln (1-_y1);
    private _b2 = -ln (1-_y2); 
    FATAL_SUM_DAMAGE_WEIBULL_K = ln(_b1/_b2) / ln(_x1/_x2);

    With each additional hit to either the head or the torso, the chance of you dying goes up exponentially.

    private _chanceFatal = 1 - exp -((_vitalDamage/FATAL_SUM_DAMAGE_WEIBULL_L)^FATAL_SUM_DAMAGE_WEIBULL_K);

    Math: lim 1 - e^(-((v / 0.705)^6.563)), v --> infinity = 1 --> _chanceFatal goes toward 100%, the more damage you have received:


    if (_chanceFatal > random 1) exitWith {
    	TRACE_1("determineIfFatal: lethal trauma",_woundDamage);
    	true breakOut "main";

    Once you have exceeded the damage threshold, there is a random chance of you dying, since random 1 returns a value between 0 (inclusive) and 1 (exclusive).
    You are very unlikely to die if you exceed the threshold by a minor amount, since the curve is very flat at the start. However, multiple minor wounds will stack up and will eventually guarantee you die.

    Stitching will not reset the damage - you need to PAK. Stitching only stops the wounds from reopening.

    If we compare these settings to the "only hits to vital organs":
    Only head and torso shot can be lethal, as it was with "Sum of Trauma".



    // Emulate damage to vital organs - Original rewrite logic, only powerfull headshots or random torso shots
    if (_part == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}) exitWith {...};

    If the body part is the head and if the wound damage is greater or equal 1, then the damage will be lethal.

    // Fatal damage to torso has various results based on organ hit - Heart shot is lethal
    if (_part == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD} && {random 1 < HEART_HIT_CHANCE}) exitWith {...};

    If the body part is the torso and if the wound damage is greater or equal to 0.6 and a 5% chance, then the damage will be lethal.
    Basically: You are more likely to die from a shot to the face than one to the torso.
    Player and AI Critical Thresholds do NOT affect this setting at all.



    It is important to PAK people, as weapon sway is linked to being in pain, having been hit in the arms and having broken arms.

    private _aimFracture = 0;
    if ((_fractures select 2) == 1) then { _aimFracture = _aimFracture + 4; };		//if 1 arm is hit, then _aimFracture is only 4; if both arms are hit, _aimFracture is 8
    if ((_fractures select 3) == 1) then { _aimFracture = _aimFracture + 4; };
    [missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), {
    (linearConversion [0, 1, GET_PAIN_PERCEIVED(ACE_player), 1, 5, true]) + (ACE_player getVariable [QEGVAR(medical_engine,aimFracture), 0])
    }] call EFUNC(common,arithmeticSetSource);
    #define GET_PAIN_PERCEIVED(unit)    (0 max (GET_PAIN(unit) - GET_PAIN_SUPPRESS(unit)) min 1) //pain is between 0 and 1
    // Engine damage to these hitpoints controls blood visuals, limping, weapon sway
    // Handled in fnc_damageBodyPart, persist here
    if (_hitPoint in ["hithead", "hitbody", "hithands", "hitlegs"]) exitWith {_oldDamage}
    * Notes:
    * Head: Blood visuals @ 0.45
    * Body: Blood visuals @ 0.45
    * Arms: Blood visuals @ 0.35, increases weapon sway linearly
    * Legs: Blood visuals @ 0.35, limping @ 0.5 




    _desiredPainLevel = _desiredPainLevel * EGVAR(medical,painCoefficient);
    private _pain = GET_PAIN(_unit);
    _pain = 0 max (_pain max _desiredPainLevel) min 1;
    _unit setVariable [VAR_PAIN, _pain];

    Pain can only go up with this module. _desiredPainLevel is a value given by another module. painCoefficient is set to 0.7 on FK, default is 1.0

    private _bleedModifier = linearConversion [0.1, _worstDamage, _woundDamage * _countModifier, 0.25, 1, true];
    private _painModifier = (_bleedModifier * random [0.7, 1, 1.3]) min 1; // Pain isn't directly scaled to bleeding
    // wound category (minor [0.25-0.5], medium [0.5-0.75], large [0.75+])
    private _category = floor linearConversion [0.25, 0.75, _bleedModifier, 0, 2, true];
    * Handle incapacitation due to damage and pain
    // Exclude non penetrating body damage (torso)
    if (_bodyPartN == 1 && {_damage < PENETRATION_THRESHOLD}) then {...};
    // Minimum amount of damage required for penetrating wounds (also minDamage for velocity wounds)

    If the damage doesn't penetrate the torso, it will be ignored.

    if ((_headDamage > _damageThreshold / 2) || {_bodyDamage > _damageThreshold} || {(_painLevel >= PAIN_UNCONSCIOUS) && {random 1 < EGVAR(medical,painUnconsciousChance)}}) then {
        [QEGVAR(medical,CriticalInjury), _unit] call CBA_fnc_localEvent;

    _damageThreshold comes directly from the settings. Theoretically speaking, the head is twice as weak as the torso when it comes to you going unconscious. If the pain level you are currently at is more than 0.5, you will have a 10% chance of falling unconscious.
    CriticalInjury, CriticalVitals (caused by too much blood volume lost, low BP, low HR) and knockout (cardiac output: too much bleeding) will also call the unconscious state.
    FatalInjury will put you into a cardiac arrest.

    // Stop AI firing at unconscious units in most situations (global effect)
    [_unit, "setHidden", "ace_unconscious", _active] call EFUNC(common,statusEffect_set);





  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy