diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp
index 614cd3e0e06..744d7a13b13 100644
--- a/addons/interaction/CfgVehicles.hpp
+++ b/addons/interaction/CfgVehicles.hpp
@@ -172,8 +172,16 @@ class CfgVehicles {
class ACE_Torso {
displayName = CSTRING(Torso);
+ selection = "spine1";
+ distance = 1.5;
+ condition = "";
+ statement = "";
+ exceptions[] = {"isNotSwimming"};
+ };
+ class ACE_Chest {
+ displayName = CSTRING(Chest);
selection = "spine3";
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
@@ -181,39 +189,71 @@ class CfgVehicles {
class ACE_Head {
displayName = CSTRING(Head);
selection = "pilot";
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
};
class ACE_ArmLeft {
displayName = CSTRING(ArmLeft);
+ selection = "LWrist";
+ distance = 1.5;
+ condition = "";
+ statement = "";
+ exceptions[] = {"isNotSwimming"};
+ };
+ class ACE_ArmUpperLeft {
+ displayName = CSTRING(ArmUpperLeft);
selection = "LeftForeArm";
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
};
class ACE_ArmRight {
displayName = CSTRING(ArmRight);
+ selection = "RWrist";
+ distance = 1.5;
+ condition = "";
+ statement = "";
+ exceptions[] = {"isNotSwimming"};
+ };
+ class ACE_ArmUpperRight {
+ displayName = CSTRING(ArmUpperRight);
selection = "RightForeArm";
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
};
class ACE_LegLeft {
displayName = CSTRING(LegLeft);
+ selection = "LeftFoot";
+ distance = 1.5;
+ condition = "";
+ statement = "";
+ exceptions[] = {"isNotSwimming"};
+ };
+ class ACE_LegUpperLeft {
+ displayName = CSTRING(LegUpperLeft);
selection = "LKnee";
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
};
class ACE_LegRight {
displayName = CSTRING(LegRight);
+ selection = "RightFoot";
+ distance = 1.5;
+ condition = "";
+ statement = "";
+ exceptions[] = {"isNotSwimming"};
+ };
+ class ACE_LegUpperRight {
+ displayName = CSTRING(LegUpperRight);
selection = "RKnee";
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
@@ -221,7 +261,7 @@ class CfgVehicles {
class ACE_Weapon {
displayName = CSTRING(Weapon);
position = QUOTE(call DFUNC(getWeaponPos));
- distance = 1.50;
+ distance = 1.5;
condition = "";
statement = "";
exceptions[] = {"isNotSwimming"};
diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml
index 35633463593..50dda2b058b 100644
--- a/addons/interaction/stringtable.xml
+++ b/addons/interaction/stringtable.xml
@@ -51,6 +51,9 @@
身體
Gövde
+
+ Chest
+
Head
Tête
@@ -85,6 +88,9 @@
左手
Sol Kol
+
+ Upper Left Arm
+
Right Arm
Rechter Arm
@@ -102,6 +108,9 @@
右手
Sağ Kol
+
+ Upper Right Arm
+
Left Leg
Linkes Bein
@@ -119,6 +128,9 @@
左腳
Sol Bacak
+
+ Upper Left Leg
+
Right Leg
Rechtes Bein
@@ -136,6 +148,9 @@
右腳
Sağ Bacak
+
+ Upper Right Leg
+
Weapon
Arme
diff --git a/addons/medical/dev/test_hitpointConfigs.sqf b/addons/medical/dev/test_hitpointConfigs.sqf
index ff1c3a95b7d..9b61549c963 100644
--- a/addons/medical/dev/test_hitpointConfigs.sqf
+++ b/addons/medical/dev/test_hitpointConfigs.sqf
@@ -27,7 +27,7 @@ private _testPass = true;
private _typeOf = configName _x;
if (_typeOf == "") then { continue };
private _hitpoints = (configProperties [_x >> "HitPoints", "isClass _x", true]) apply {toLowerANSI configName _x};
- private _expectedHitPoints = ["hitleftarm","hitrightarm","hitleftleg","hitrightleg","hithead","hitbody"];
+ private _expectedHitPoints = ["hitleftarm","hitrightarm","hitleftleg","hitrightleg","hitbody","hithead","hitneck","hitabdomen"];
private _missingHitPoints = _expectedHitPoints select {!(_x in _hitpoints)};
if (_missingHitPoints isNotEqualTo []) then {
WARNING_3("%1 missing ace hitpoints: %2 - class hitpoints: %3",_typeOf,_missingHitPoints,_hitpoints);
diff --git a/addons/medical/dev/watchVariable.sqf b/addons/medical/dev/watchVariable.sqf
index a0e064595ab..cbc62b20d42 100644
--- a/addons/medical/dev/watchVariable.sqf
+++ b/addons/medical/dev/watchVariable.sqf
@@ -59,7 +59,7 @@ GVAR(dev_watchVariableRunning) = true;
_return pushBack format [" - [Pain: %1] [Suppress: %2]", _pain toFixed 3, _painSuppress toFixed 3];
// Damage:
- private _damage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+ private _damage = GET_BODYPART_DAMAGE(unit);
private _limping = ["", "[ Limping ]"] select (_unit getVariable [QEGVAR(medical,isLimping), false]);
_return pushBack format ["BodyPartDamage: [H: %1] [B: %2]", (_damage select 0) toFixed 2, (_damage select 1) toFixed 2];
_return pushBack format ["[LA:%1] [RA: %2] [LL:%3] [RL: %4]", (_damage select 2) toFixed 2, (_damage select 3) toFixed 2, (_damage select 4) toFixed 2, (_damage select 5) toFixed 2];
diff --git a/addons/medical/functions/fnc_addDamageToUnit.sqf b/addons/medical/functions/fnc_addDamageToUnit.sqf
index 2ffe8d77322..6518e9bb6f2 100644
--- a/addons/medical/functions/fnc_addDamageToUnit.sqf
+++ b/addons/medical/functions/fnc_addDamageToUnit.sqf
@@ -46,7 +46,7 @@ if (!_overrideInvuln && {!((isDamageAllowed _unit) && {_unit getVariable [QEGVAR
};
// Extension is case sensitive and expects this format (different from ALL_BODY_PARTS)
-_bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex;
+_bodyPart = ["_Head", "_Neck", "_Chest", "_Body", "_LeftArm", "_LeftUpperArm", "_RightArm", "_RightUpperArm", "_LeftLeg", "_LeftUpperLeg", "_RightLeg", "_RightUpperLeg"] select _bodyPartIndex;
if (!isNull _instigator) then {
_unit setVariable [QEGVAR(medical,lastDamageSource), _instigator];
@@ -54,14 +54,14 @@ if (!isNull _instigator) then {
};
#ifdef DEBUG_TESTRESULTS
-private _startDmg = +(_unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]);
+private _startDmg = +(GET_BODYPART_DAMAGE(unit) ;);
private _startPain = GET_PAIN(_unit);
#endif
[QEGVAR(medical,woundReceived), [_unit, [[_damageToAdd, _bodyPart, _damageToAdd]], _instigator, _typeOfDamage]] call CBA_fnc_localEvent;
#ifdef DEBUG_TESTRESULTS
-private _endDmg = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+private _endDmg = GET_BODYPART_DAMAGE(unit);
private _endPain = GET_PAIN(_unit);
private _typeOfDamageAdj = _typeOfDamage call EFUNC(medical_damage,getTypeOfDamage);
private _config = configFile >> "ACE_Medical_Injuries" >> "damageTypes" >> _typeOfDamageAdj;
diff --git a/addons/medical/functions/fnc_deserializeState.sqf b/addons/medical/functions/fnc_deserializeState.sqf
index 6fbb00985db..763329e6fb4 100644
--- a/addons/medical/functions/fnc_deserializeState.sqf
+++ b/addons/medical/functions/fnc_deserializeState.sqf
@@ -97,7 +97,7 @@ private _state = [_json] call CBA_fnc_parseJSON;
[QEGVAR(medical,ivBags), nil],
[QEGVAR(medical,triageLevel), 0],
[QEGVAR(medical,triageCard), []],
- [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]
+ [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0,0,0,0,0,0,0]]
// Offset needs to be converted
// [VAR_MEDICATIONS, []]
];
diff --git a/addons/medical/functions/fnc_serializeState.sqf b/addons/medical/functions/fnc_serializeState.sqf
index 67783e85d94..2d6616c439b 100644
--- a/addons/medical/functions/fnc_serializeState.sqf
+++ b/addons/medical/functions/fnc_serializeState.sqf
@@ -44,7 +44,7 @@ private _state = [] call CBA_fnc_createNamespace;
[QEGVAR(medical,ivBags), nil],
[QEGVAR(medical,triageLevel), 0],
[QEGVAR(medical,triageCard), []],
- [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]
+ [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0,0,0,0,0,0,0]]
// Time needs to be converted
// [VAR_MEDICATIONS, []]
];
diff --git a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf
index 391d69c08bf..f986f815075 100644
--- a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf
+++ b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf
@@ -18,9 +18,9 @@
params ["_unit"];
private _painLevel = GET_PAIN_PERCEIVED(_unit);
-private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+private _bodyPartDamage = GET_BODYPART_DAMAGE(unit);
-_bodyPartDamage params ["_headDamage", "_bodyDamage"];
+_bodyPartDamage params ["_headDamage", "_neckDamage", "_chestDamage","_bodyDamage"];
// Exclude non penetrating body damage
{
diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
index 92effda9bd5..4c1f16c4e83 100644
--- a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
+++ b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
@@ -35,14 +35,26 @@ private _createdWounds = false;
private _updateDamageEffects = false;
private _painLevel = 0;
private _criticalDamage = false;
-private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+private _bodyPartDamage = GET_BODYPART_DAMAGE(unit);
private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals);
// process wounds separately for each body part hit
{ // forEach _allDamages
_x params ["_damage", "_bodyPart"];
_bodyPart = toLowerANSI _bodyPart;
-
+ if (_bodyPart == "head") then {
+ private _isNeck = (random 1) < 0.1; // 10% chance for neck damage
+ _bodyPart = ["head", "neck"] select (_isNeck);
+ };
+ if (_bodyPart in ["leftarm", "rightarm", "leftleg", "rightleg"]) then {
+ private _isUpper = (random 1) < 0.5;
+ switch (_bodyPart) do {
+ case "leftarm": { _bodyPart = ["leftarm", "upperleftarm"] select (_isUpper);};
+ case "rightarm": { _bodyPart = ["rightarm", "upperrightarm"] select (_isUpper);};
+ case "leftleg": { _bodyPart = ["leftleg", "upperleftleg"] select (_isUpper);};
+ case "rightleg": { _bodyPart = ["rightleg", "upperrightleg"] select (_isUpper); };
+ };
+ };
// silently ignore structural damage
if (_bodyPart == "#structural") then {continue};
@@ -90,7 +102,7 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra
private _woundDamage = _dmgPerWound * _dmgMultiplier * random [0.9, 1, 1.1];
_bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage];
- _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating
+ _bodyPartVisParams set [[1,1,1,2,2,2,3,3,3,4,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating
// Anything above this value is guaranteed worst wound possible
private _worstDamage = 2;
@@ -116,7 +128,7 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra
// Create a new injury. Format [0:classComplex, 1:amountOf, 2:bleedingRate, 3:woundDamage]
private _injury = [_classComplex, 1, _bleeding, _woundDamage];
- if (_bodyPart isEqualTo "head" || {_bodyPart isEqualTo "body" && {_woundDamage > PENETRATION_THRESHOLD}}) then {
+ if (_bodyPart in ["head", "body", "neck", "chest"] && {_woundDamage > PENETRATION_THRESHOLD}) then {
_criticalDamage = true;
};
if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then {
@@ -134,7 +146,7 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra
case (
_causeFracture
&& {EGVAR(medical,fractures) > 0}
- && {_bodyPartNToAdd > 1}
+ && {_bodyPartNToAdd > 3}
&& {_woundDamage > FRACTURE_DAMAGE_THRESHOLD}
&& {random 1 < (_fractureMultiplier * EGVAR(medical,fractureChance))}
): {
diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf
index cf891f5e532..8230a3ec003 100644
--- a/addons/medical_engine/functions/fnc_handleDamage.sqf
+++ b/addons/medical_engine/functions/fnc_handleDamage.sqf
@@ -28,7 +28,6 @@ if (_structuralDamage) then {
} else {
_oldDamage = _unit getHitIndex _hitPointIndex;
};
-
// Damage can be disabled with old variable or via sqf command allowDamage
if !(isDamageAllowed _unit && {_unit getVariable [QEGVAR(medical,allowDamage), true]}) exitWith {_oldDamage};
@@ -84,7 +83,7 @@ if (
// todo: no way to detect if stationary and another vehicle hits you
) exitWith {
TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage);
- [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, _hitPoint, _newDamage]], _unit, "vehiclecrash"]] call CBA_fnc_localEvent;
+ [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, _hitpoint, _newDamage]], _unit, "vehiclecrash"]] call CBA_fnc_localEvent;
0
};
@@ -104,13 +103,13 @@ if (
_unit setVariable [QEGVAR(medical,lastDamageSource), _shooter];
_unit setVariable [QEGVAR(medical,lastInstigator), _instigator];
- [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, _hitPoint, _newDamage]], _shooter, "vehiclehit"]] call CBA_fnc_localEvent;
+ [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, _hitpoint, _newDamage]], _shooter, "vehiclehit"]] call CBA_fnc_localEvent;
0
};
// Damages are stored for last iteration of the HandleDamage event (_context == 2)
-_unit setVariable [format [QGVAR($%1), _hitPoint], [_realDamage, _newDamage]];
+_unit setVariable [format [QGVAR($%1), _hitpoint], [_realDamage, _newDamage]];
// Ref https://community.bistudio.com/wiki/Arma_3:_Event_Handlers#HandleDamage
// Context 2 means this is the last iteration of HandleDamage, so figure out which hitpoint took the most real damage and send wound event
@@ -124,23 +123,29 @@ if (_context == 2) then {
// --- Head
private _damageHead = [
_unit getVariable [QGVAR($HitFace), [0,0]],
- _unit getVariable [QGVAR($HitNeck), [0,0]],
_unit getVariable [QGVAR($HitHead), [0,0]]
];
_damageHead sort false;
_damageHead = _damageHead select 0;
+ // --- Neck
+ private _damageNeck = _unit getVariable [QGVAR($HitNeck), [0,0]];
+
// --- Body
private _damageBody = [
_unit getVariable [QGVAR($HitPelvis), [0,0]],
- _unit getVariable [QGVAR($HitAbdomen), [0,0]],
- _unit getVariable [QGVAR($HitDiaphragm), [0,0]],
- _unit getVariable [QGVAR($HitChest), [0,0]]
- // HitBody removed as it's a placeholder hitpoint and the high armor value (1000) throws the calculations off
+ _unit getVariable [QGVAR($HitAbdomen), [0,0]]
];
_damageBody sort false;
_damageBody = _damageBody select 0;
+ private _damageChest = [
+ _unit getVariable [QGVAR($HitDiaphragm), [0,0]],
+ _unit getVariable [QGVAR($HitChest), [0,0]]
+ ];
+ _damageChest sort false;
+ _damageChest = _damageChest select 0;
+
// --- Arms and Legs
private _damageLeftArm = _unit getVariable [QGVAR($HitLeftArm), [0,0]];
private _damageRightArm = _unit getVariable [QGVAR($HitRightArm), [0,0]];
@@ -152,6 +157,8 @@ if (_context == 2) then {
// _realDamage, priority, _newDamage, body part name
private _allDamages = [
[_damageHead select 0, PRIORITY_HEAD, _damageHead select 1, "Head"],
+ [_damageNeck select 0, PRIORITY_NECK, _damageNeck select 1, "Neck"],
+ [_damageChest select 0, PRIORITY_CHEST, _damageChest select 1, "Chest"],
[_damageBody select 0, PRIORITY_BODY, _damageBody select 1, "Body"],
[_damageLeftArm select 0, PRIORITY_LEFT_ARM, _damageLeftArm select 1, "LeftArm"],
[_damageRightArm select 0, PRIORITY_RIGHT_ARM, _damageRightArm select 1, "RightArm"],
diff --git a/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf
index a4403ffa7d5..780373e6475 100644
--- a/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf
+++ b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf
@@ -22,17 +22,17 @@
params ["_unit", "_updateHead", "_updateBody", "_updateArms", "_updateLegs"];
TRACE_5("updateBodyPartVisuals",_unit,_updateHead,_updateBody,_updateArms,_updateLegs);
-private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+private _bodyPartDamage = GET_BODYPART_DAMAGE(unit);
if (_updateHead) then {
- [_unit, "head", (_bodyPartDamage select 0) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
+ [_unit, "head", ((_bodyPartDamage select 0) max (_bodyPartDamage select 1)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
};
if (_updateBody) then {
- [_unit, "body", (_bodyPartDamage select 1) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
+ [_unit, "body", ((_bodyPartDamage select 2) max (_bodyPartDamage select 3)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
};
if (_updateArms) then {
- [_unit, "arms", ((_bodyPartDamage select 2) max (_bodyPartDamage select 3)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
+ [_unit, "arms", (((_bodyPartDamage select 4) max (_bodyPartDamage select 5)) max ((_bodyPartDamage select 6) max (_bodyPartDamage select 7))) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
};
if (_updateLegs) then {
- [_unit, "legs", ((_bodyPartDamage select 4) max (_bodyPartDamage select 5)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
+ [_unit, "legs", (((_bodyPartDamage select 8) max (_bodyPartDamage select 9)) max ((_bodyPartDamage select 10) max (_bodyPartDamage select 11))) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart);
};
diff --git a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf
index f4a18094a60..2982bd8c140 100644
--- a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf
+++ b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf
@@ -24,25 +24,29 @@ private _isLimping = false;
if (EGVAR(medical,fractures) > 0) then {
private _fractures = GET_FRACTURES(_unit);
TRACE_1("",_fractures);
- if (((_fractures select 4) == 1) || {(_fractures select 5) == 1}) then {
+ if ((_fractures select 8) == 1 || (_fractures select 9) == 1 || (_fractures select 10) == 1 || (_fractures select 11) == 1) then {
TRACE_1("limping because of fracture",_fractures);
_isLimping = true;
};
private _aimFracture = 0;
- if ((_fractures select 2) == 1) then { _aimFracture = _aimFracture + 4; };
- if ((_fractures select 3) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 4) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 5) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 6) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 7) == 1) then { _aimFracture = _aimFracture + 4; };
- if (EGVAR(medical,fractures) in [2, 3]) then { // the limp with a splint will still cause effects
+ if (EGVAR(medical,fractures) in [4, 5, 6, 7]) then { // the limp with a splint will still cause effects
// Block sprint / force walking based on fracture setting and leg splint status
- private _hasLegSplint = (_fractures select 4) == -1 || {(_fractures select 5) == -1};
+ private _hasLegSplint = (_fractures select 8) == -1 || (_fractures select 9) == -1 || (_fractures select 10) == -1 || (_fractures select 11) == -1;
if (EGVAR(medical,fractures) == 2) then {
[_unit, "blockSprint", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set);
} else {
[_unit, "forceWalk", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set);
};
- if ((_fractures select 2) == -1) then { _aimFracture = _aimFracture + 2; };
- if ((_fractures select 3) == -1) then { _aimFracture = _aimFracture + 2; };
+ if ((_fractures select 4) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 5) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 6) == 1) then { _aimFracture = _aimFracture + 4; };
+ if ((_fractures select 7) == 1) then { _aimFracture = _aimFracture + 4; };
};
_unit setVariable [QGVAR(aimFracture), _aimFracture, false]; // local only var, used in ace_medical's postInit to set ACE_setCustomAimCoef
};
diff --git a/addons/medical_engine/script_component.hpp b/addons/medical_engine/script_component.hpp
index 59cd015080e..2419df0d3cf 100644
--- a/addons/medical_engine/script_component.hpp
+++ b/addons/medical_engine/script_component.hpp
@@ -27,7 +27,9 @@
}, class] call CBA_fnc_waitUntilAndExecute
#define PRIORITY_HEAD 3
+#define PRIORITY_NECK 3
#define PRIORITY_BODY 4
+#define PRIORITY_CHEST 4
#define PRIORITY_LEFT_ARM (1 + random 1)
#define PRIORITY_RIGHT_ARM (1 + random 1)
#define PRIORITY_LEFT_LEG (1 + random 1)
diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp
index 167765c5767..69d867918eb 100644
--- a/addons/medical_engine/script_macros_medical.hpp
+++ b/addons/medical_engine/script_macros_medical.hpp
@@ -2,16 +2,22 @@
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
-#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"]
-#define ALL_SELECTIONS ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]
-#define ALL_HITPOINTS ["HitHead", "HitChest", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]
+#define ALL_BODY_PARTS ["head", "neck", "chest", "body", "leftarm", "upperleftarm", "rightarm", "upperrightarm", "leftleg", "upperleftleg", "rightleg", "upperrightleg"]
+#define ALL_SELECTIONS ["head", "neck", "chest", "body", "hand_l", "uhand_l", "hand_r", "uhand_r", "leg_l", "uleg_l", "leg_r", "uleg_r"]
+#define ALL_HITPOINTS ["HitHead", "HitNeck", "HitChest", "HitAbdomen", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]
#define HITPOINT_INDEX_HEAD 0
-#define HITPOINT_INDEX_BODY 1
-#define HITPOINT_INDEX_LARM 2
-#define HITPOINT_INDEX_RARM 3
-#define HITPOINT_INDEX_LLEG 4
-#define HITPOINT_INDEX_RLEG 5
+#define HITPOINT_INDEX_NECK 1
+#define HITPOINT_INDEX_CHEST 2
+#define HITPOINT_INDEX_BODY 3
+#define HITPOINT_INDEX_LARM 4
+#define HITPOINT_INDEX_ULARM 5
+#define HITPOINT_INDEX_RARM 6
+#define HITPOINT_INDEX_URARM 7
+#define HITPOINT_INDEX_LLEG 8
+#define HITPOINT_INDEX_ULLEG 9
+#define HITPOINT_INDEX_RLEG 10
+#define HITPOINT_INDEX_URLEG 11
// Damage threshold above which fatal organ damage can occur
#define HEAD_DAMAGE_THRESHOLD EGVAR(medical,const_headDamageThreshold)
@@ -130,9 +136,11 @@
#define DEFAULT_BANDAGE_REOPENING_MIN_DELAY 120
#define DEFAULT_BANDAGE_REOPENING_MAX_DELAY 200
-#define DEFAULT_TOURNIQUET_VALUES [0,0,0,0,0,0]
+#define DEFAULT_TOURNIQUET_VALUES [0,0,0,0,0,0,0,0,0,0,0,0]
-#define DEFAULT_FRACTURE_VALUES [0,0,0,0,0,0]
+#define DEFAULT_FRACTURE_VALUES [0,0,0,0,0,0,0,0,0,0,0,0]
+
+#define DEFAULT_DAMAGE_VALUES [0,0,0,0,0,0,0,0,0,0,0,0]
// Triage colors, for consistency across UIs and functions
#define TRIAGE_COLOR_NONE 0, 0, 0, 0.9
@@ -175,6 +183,7 @@
#define VAR_IN_PAIN QEGVAR(medical,inPain)
#define VAR_TOURNIQUET QEGVAR(medical,tourniquets)
#define VAR_FRACTURES QEGVAR(medical,fractures)
+#define VAR_BODYPART_DAMAGE QEGVAR(medical,bodyPartDamage)
// - Unit Functions ---------------------------------------------------
// Retrieval macros for common unit values
@@ -197,6 +206,7 @@
#define GET_BANDAGED_WOUNDS(unit) (unit getVariable [VAR_BANDAGED_WOUNDS, createHashMap])
#define GET_STITCHED_WOUNDS(unit) (unit getVariable [VAR_STITCHED_WOUNDS, createHashMap])
#define GET_DAMAGE_THRESHOLD(unit) (unit getVariable [QEGVAR(medical,damageThreshold), [EGVAR(medical,AIDamageThreshold),EGVAR(medical,playerDamageThreshold)] select (isPlayer unit)])
+#define GET_BODYPART_DAMAGE(unit) (unit getVariable [VAR_BODYPART_DAMAGE, DEFAULT_DAMAGE_VALUES])
// The following function calls are defined here just for consistency
#define GET_BLOOD_LOSS(unit) ([unit] call EFUNC(medical_status,getBloodLoss))
diff --git a/addons/medical_gui/InteractionBodyParts.hpp b/addons/medical_gui/InteractionBodyParts.hpp
index 928ec330ed7..a47673ec254 100644
--- a/addons/medical_gui/InteractionBodyParts.hpp
+++ b/addons/medical_gui/InteractionBodyParts.hpp
@@ -8,13 +8,30 @@ class ACE_Head {
modifierFunction = QUOTE([ARR_3(_target,""head"",_this select 3)] call FUNC(modifyAction));
runOnHover = 1;
};
+class ACE_Chest {
+ displayName = ECSTRING(interaction,Chest);
+ distance = MEDICAL_ACTION_DISTANCE;
+ icon = QPATHTOF(ui\cross.paa);
+ exceptions[] = {"isNotInside", "isNotSitting"};
+ ACTION_CONDITION
+ statement = QUOTE([ARR_2(_target,2)] call FUNC(displayPatientInformation));
+ modifierFunction = QUOTE([ARR_3(_target,""chest"",_this select 3)] call FUNC(modifyAction));
+ runOnHover = 1;
+ class TriageCard {
+ displayName = CSTRING(Actions_TriageCard);
+ exceptions[] = {"isNotInside", "isNotSitting"};
+ condition = "true";
+ statement = QUOTE(_target call FUNC(displayTriageCard));
+ icon = QPATHTOF(ui\triage_card.paa);
+ };
+};
class ACE_Torso {
displayName = ECSTRING(interaction,Torso);
distance = MEDICAL_ACTION_DISTANCE;
icon = QPATHTOF(ui\cross.paa);
exceptions[] = {"isNotInside", "isNotSitting"};
ACTION_CONDITION
- statement = QUOTE([ARR_2(_target,1)] call FUNC(displayPatientInformation));
+ statement = QUOTE([ARR_2(_target,3)] call FUNC(displayPatientInformation));
modifierFunction = QUOTE([ARR_3(_target,""body"",_this select 3)] call FUNC(modifyAction));
runOnHover = 1;
class TriageCard {
@@ -25,43 +42,83 @@ class ACE_Torso {
icon = QPATHTOF(ui\triage_card.paa);
};
};
+class ACE_ArmUpperLeft {
+ displayName = ECSTRING(interaction,ArmUpperLeft);
+ distance = MEDICAL_ACTION_DISTANCE;
+ icon = QPATHTOF(ui\cross.paa);
+ exceptions[] = {"isNotInside", "isNotSitting"};
+ ACTION_CONDITION
+ statement = QUOTE([ARR_2(_target,5)] call FUNC(displayPatientInformation));
+ modifierFunction = QUOTE([ARR_3(_target,""leftupperarm"",_this select 3)] call FUNC(modifyAction));
+ runOnHover = 1;
+};
class ACE_ArmLeft {
displayName = ECSTRING(interaction,ArmLeft);
distance = MEDICAL_ACTION_DISTANCE;
icon = QPATHTOF(ui\cross.paa);
exceptions[] = {"isNotInside", "isNotSitting"};
ACTION_CONDITION
- statement = QUOTE([ARR_2(_target,2)] call FUNC(displayPatientInformation));
+ statement = QUOTE([ARR_2(_target,4)] call FUNC(displayPatientInformation));
modifierFunction = QUOTE([ARR_3(_target,""leftarm"",_this select 3)] call FUNC(modifyAction));
runOnHover = 1;
};
+class ACE_ArmUpperRight {
+ displayName = ECSTRING(interaction,ArmUpperRight);
+ distance = MEDICAL_ACTION_DISTANCE;
+ icon = QPATHTOF(ui\cross.paa);
+ exceptions[] = {"isNotInside", "isNotSitting"};
+ ACTION_CONDITION
+ statement = QUOTE([ARR_2(_target,7)] call FUNC(displayPatientInformation));
+ modifierFunction = QUOTE([ARR_3(_target,""rightupperarm"",_this select 3)] call FUNC(modifyAction));
+ runOnHover = 1;
+};
class ACE_ArmRight {
displayName = ECSTRING(interaction,ArmRight);
distance = MEDICAL_ACTION_DISTANCE;
icon = QPATHTOF(ui\cross.paa);
exceptions[] = {"isNotInside", "isNotSitting"};
ACTION_CONDITION
- statement = QUOTE([ARR_2(_target,3)] call FUNC(displayPatientInformation));
+ statement = QUOTE([ARR_2(_target,6)] call FUNC(displayPatientInformation));
modifierFunction = QUOTE([ARR_3(_target,""rightarm"",_this select 3)] call FUNC(modifyAction));
runOnHover = 1;
};
+class ACE_LegUpperLeft {
+ displayName = ECSTRING(interaction,LegUpperLeft);
+ distance = MEDICAL_ACTION_DISTANCE;
+ icon = QPATHTOF(ui\cross.paa);
+ exceptions[] = {"isNotInside", "isNotSitting"};
+ ACTION_CONDITION
+ statement = QUOTE([ARR_2(_target,9)] call FUNC(displayPatientInformation));
+ modifierFunction = QUOTE([ARR_3(_target,""leftupperleg"",_this select 3)] call FUNC(modifyAction));
+ runOnHover = 1;
+};
class ACE_LegLeft {
displayName = ECSTRING(interaction,LegLeft);
distance = MEDICAL_ACTION_DISTANCE;
icon = QPATHTOF(ui\cross.paa);
exceptions[] = {"isNotInside", "isNotSitting"};
ACTION_CONDITION
- statement = QUOTE([ARR_2(_target,4)] call FUNC(displayPatientInformation));
+ statement = QUOTE([ARR_2(_target,8)] call FUNC(displayPatientInformation));
modifierFunction = QUOTE([ARR_3(_target,""leftleg"",_this select 3)] call FUNC(modifyAction));
runOnHover = 1;
};
+class ACE_LegUpperRight {
+ displayName = ECSTRING(interaction,LegUpperRight);
+ distance = MEDICAL_ACTION_DISTANCE;
+ icon = QPATHTOF(ui\cross.paa);
+ exceptions[] = {"isNotInside", "isNotSitting"};
+ ACTION_CONDITION
+ statement = QUOTE([ARR_2(_target,11)] call FUNC(displayPatientInformation));
+ modifierFunction = QUOTE([ARR_3(_target,""rightupperleg"",_this select 3)] call FUNC(modifyAction));
+ runOnHover = 1;
+};
class ACE_LegRight {
displayName = ECSTRING(interaction,LegRight);
distance = MEDICAL_ACTION_DISTANCE;
icon = QPATHTOF(ui\cross.paa);
exceptions[] = {"isNotInside", "isNotSitting"};
ACTION_CONDITION
- statement = QUOTE([ARR_2(_target,5)] call FUNC(displayPatientInformation));
+ statement = QUOTE([ARR_2(_target,10)] call FUNC(displayPatientInformation));
modifierFunction = QUOTE([ARR_3(_target,""rightleg"",_this select 3)] call FUNC(modifyAction));
runOnHover = 1;
};
diff --git a/addons/medical_gui/data/body_image/arm_left.paa b/addons/medical_gui/data/body_image/arm_left.paa
index 245cc4ba316..42802c8ae5a 100644
Binary files a/addons/medical_gui/data/body_image/arm_left.paa and b/addons/medical_gui/data/body_image/arm_left.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_left_b.paa b/addons/medical_gui/data/body_image/arm_left_b.paa
index 9d4cefd89b5..232cf38e7d8 100644
Binary files a/addons/medical_gui/data/body_image/arm_left_b.paa and b/addons/medical_gui/data/body_image/arm_left_b.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_left_s.paa b/addons/medical_gui/data/body_image/arm_left_s.paa
index 4c55e6143ea..f7e4d01b48d 100644
Binary files a/addons/medical_gui/data/body_image/arm_left_s.paa and b/addons/medical_gui/data/body_image/arm_left_s.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_left_t.paa b/addons/medical_gui/data/body_image/arm_left_t.paa
index 0f8ac03f2e8..6ff23f9f524 100644
Binary files a/addons/medical_gui/data/body_image/arm_left_t.paa and b/addons/medical_gui/data/body_image/arm_left_t.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_lower_left_t.paa b/addons/medical_gui/data/body_image/arm_lower_left_t.paa
new file mode 100644
index 00000000000..f2918488a1a
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_lower_left_t.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_lower_right_t.paa b/addons/medical_gui/data/body_image/arm_lower_right_t.paa
new file mode 100644
index 00000000000..8455562548f
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_lower_right_t.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_right.paa b/addons/medical_gui/data/body_image/arm_right.paa
index 2023d1e0b4c..deeb20ecc9b 100644
Binary files a/addons/medical_gui/data/body_image/arm_right.paa and b/addons/medical_gui/data/body_image/arm_right.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_right_b.paa b/addons/medical_gui/data/body_image/arm_right_b.paa
index c5ae90dcbf5..2535aa2a9f2 100644
Binary files a/addons/medical_gui/data/body_image/arm_right_b.paa and b/addons/medical_gui/data/body_image/arm_right_b.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_right_s.paa b/addons/medical_gui/data/body_image/arm_right_s.paa
index daff9d099e1..fb7861926f4 100644
Binary files a/addons/medical_gui/data/body_image/arm_right_s.paa and b/addons/medical_gui/data/body_image/arm_right_s.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_right_t.paa b/addons/medical_gui/data/body_image/arm_right_t.paa
index 5e64adf0f24..ef1d4233571 100644
Binary files a/addons/medical_gui/data/body_image/arm_right_t.paa and b/addons/medical_gui/data/body_image/arm_right_t.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_upper_left.paa b/addons/medical_gui/data/body_image/arm_upper_left.paa
new file mode 100644
index 00000000000..6c4f147b2b3
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_upper_left.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_upper_left_b.paa b/addons/medical_gui/data/body_image/arm_upper_left_b.paa
new file mode 100644
index 00000000000..dfa8516f70d
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_upper_left_b.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_upper_left_s.paa b/addons/medical_gui/data/body_image/arm_upper_left_s.paa
new file mode 100644
index 00000000000..95e3eb56006
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_upper_left_s.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_upper_right.paa b/addons/medical_gui/data/body_image/arm_upper_right.paa
new file mode 100644
index 00000000000..36e713b033c
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_upper_right.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_upper_right_b.paa b/addons/medical_gui/data/body_image/arm_upper_right_b.paa
new file mode 100644
index 00000000000..a7d1284e69f
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_upper_right_b.paa differ
diff --git a/addons/medical_gui/data/body_image/arm_upper_right_s.paa b/addons/medical_gui/data/body_image/arm_upper_right_s.paa
new file mode 100644
index 00000000000..59c751826c1
Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_upper_right_s.paa differ
diff --git a/addons/medical_gui/data/body_image/chest.paa b/addons/medical_gui/data/body_image/chest.paa
new file mode 100644
index 00000000000..ac92274361e
Binary files /dev/null and b/addons/medical_gui/data/body_image/chest.paa differ
diff --git a/addons/medical_gui/data/body_image/chest_s.paa b/addons/medical_gui/data/body_image/chest_s.paa
new file mode 100644
index 00000000000..d168af58d28
Binary files /dev/null and b/addons/medical_gui/data/body_image/chest_s.paa differ
diff --git a/addons/medical_gui/data/body_image/head.paa b/addons/medical_gui/data/body_image/head.paa
index 77ddd995bc7..f3056bc21dc 100644
Binary files a/addons/medical_gui/data/body_image/head.paa and b/addons/medical_gui/data/body_image/head.paa differ
diff --git a/addons/medical_gui/data/body_image/head_s.paa b/addons/medical_gui/data/body_image/head_s.paa
index 9acf69a1558..69ac9547f18 100644
Binary files a/addons/medical_gui/data/body_image/head_s.paa and b/addons/medical_gui/data/body_image/head_s.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_left.paa b/addons/medical_gui/data/body_image/leg_left.paa
index a1163052589..f27d8aeff7c 100644
Binary files a/addons/medical_gui/data/body_image/leg_left.paa and b/addons/medical_gui/data/body_image/leg_left.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_left_b.paa b/addons/medical_gui/data/body_image/leg_left_b.paa
index f8780749959..65b5d68fdb4 100644
Binary files a/addons/medical_gui/data/body_image/leg_left_b.paa and b/addons/medical_gui/data/body_image/leg_left_b.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_left_s.paa b/addons/medical_gui/data/body_image/leg_left_s.paa
index 1f25d44b819..9350ef48937 100644
Binary files a/addons/medical_gui/data/body_image/leg_left_s.paa and b/addons/medical_gui/data/body_image/leg_left_s.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_left_t.paa b/addons/medical_gui/data/body_image/leg_left_t.paa
index 035586906d1..111426a0042 100644
Binary files a/addons/medical_gui/data/body_image/leg_left_t.paa and b/addons/medical_gui/data/body_image/leg_left_t.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_lower_left_t.paa b/addons/medical_gui/data/body_image/leg_lower_left_t.paa
new file mode 100644
index 00000000000..aa274f284ec
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_lower_left_t.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_lower_right_t.paa b/addons/medical_gui/data/body_image/leg_lower_right_t.paa
new file mode 100644
index 00000000000..2894ddf80d3
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_lower_right_t.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_right.paa b/addons/medical_gui/data/body_image/leg_right.paa
index 02ce66ba706..8764e2999ee 100644
Binary files a/addons/medical_gui/data/body_image/leg_right.paa and b/addons/medical_gui/data/body_image/leg_right.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_right_b.paa b/addons/medical_gui/data/body_image/leg_right_b.paa
index 3b0dc02605e..00cc8c4585b 100644
Binary files a/addons/medical_gui/data/body_image/leg_right_b.paa and b/addons/medical_gui/data/body_image/leg_right_b.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_right_s.paa b/addons/medical_gui/data/body_image/leg_right_s.paa
index 4fcace26ed1..47000de784e 100644
Binary files a/addons/medical_gui/data/body_image/leg_right_s.paa and b/addons/medical_gui/data/body_image/leg_right_s.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_right_t.paa b/addons/medical_gui/data/body_image/leg_right_t.paa
index 3a1f397e39b..18d5bdcbd32 100644
Binary files a/addons/medical_gui/data/body_image/leg_right_t.paa and b/addons/medical_gui/data/body_image/leg_right_t.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_upper_left.paa b/addons/medical_gui/data/body_image/leg_upper_left.paa
new file mode 100644
index 00000000000..bc513a1b4ad
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_upper_left.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_upper_left_b.paa b/addons/medical_gui/data/body_image/leg_upper_left_b.paa
new file mode 100644
index 00000000000..3a8cd9e1a1a
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_upper_left_b.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_upper_left_s.paa b/addons/medical_gui/data/body_image/leg_upper_left_s.paa
new file mode 100644
index 00000000000..86930c689fc
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_upper_left_s.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_upper_right.paa b/addons/medical_gui/data/body_image/leg_upper_right.paa
new file mode 100644
index 00000000000..d0555068448
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_upper_right.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_upper_right_b.paa b/addons/medical_gui/data/body_image/leg_upper_right_b.paa
new file mode 100644
index 00000000000..eb1bc61a6df
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_upper_right_b.paa differ
diff --git a/addons/medical_gui/data/body_image/leg_upper_right_s.paa b/addons/medical_gui/data/body_image/leg_upper_right_s.paa
new file mode 100644
index 00000000000..0b6ba7c013b
Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_upper_right_s.paa differ
diff --git a/addons/medical_gui/data/body_image/neck.paa b/addons/medical_gui/data/body_image/neck.paa
new file mode 100644
index 00000000000..09b0be46ef1
Binary files /dev/null and b/addons/medical_gui/data/body_image/neck.paa differ
diff --git a/addons/medical_gui/data/body_image/neck_s.paa b/addons/medical_gui/data/body_image/neck_s.paa
new file mode 100644
index 00000000000..46b758c2c29
Binary files /dev/null and b/addons/medical_gui/data/body_image/neck_s.paa differ
diff --git a/addons/medical_gui/data/body_image/torso.paa b/addons/medical_gui/data/body_image/torso.paa
index 0a7212ac957..666d0cc2180 100644
Binary files a/addons/medical_gui/data/body_image/torso.paa and b/addons/medical_gui/data/body_image/torso.paa differ
diff --git a/addons/medical_gui/data/body_image/torso_s.paa b/addons/medical_gui/data/body_image/torso_s.paa
index 58614f277fe..dac7145289c 100644
Binary files a/addons/medical_gui/data/body_image/torso_s.paa and b/addons/medical_gui/data/body_image/torso_s.paa differ
diff --git a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf
index b27801766bc..1810c6d2a86 100644
--- a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf
+++ b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf
@@ -16,7 +16,7 @@
*/
private _actionsConfig = configFile >> QEGVAR(medical_treatment,actions);
-private _actionPaths = ["ACE_Head", "ACE_Torso", "ACE_ArmLeft", "ACE_ArmRight", "ACE_LegLeft", "ACE_LegRight"];
+private _actionPaths = ["ACE_Head", "ACE_Neck", "ACE_Torso", "ACE_Chest", "ACE_ArmLeft", "ACE_ArmUpperLeft", "ACE_ArmRight", "ACE_ArmUpperRight", "ACE_LegLeft", "ACE_LegUpperLeft", "ACE_LegRight", "ACE_LegUpperRight"];
private _fnc_statement = {
params ["_target", "_player", "_args"];
diff --git a/addons/medical_gui/functions/fnc_onKeyDown.sqf b/addons/medical_gui/functions/fnc_onKeyDown.sqf
index 6b9013f8bef..b0367c68af0 100644
--- a/addons/medical_gui/functions/fnc_onKeyDown.sqf
+++ b/addons/medical_gui/functions/fnc_onKeyDown.sqf
@@ -72,21 +72,39 @@ switch (true) do {
case (_keyPressed == DIK_W && {GVAR(selectedBodyPart) != 0}): {
GVAR(selectedBodyPart) = 0;
};
- case (_keyPressed == DIK_S && {GVAR(selectedBodyPart != 1)}): {
+ case (_keyPressed == DIK_W && {GVAR(selectedBodyPart) != 1}): {
GVAR(selectedBodyPart) = 1;
};
- case (_keyPressed == DIK_D && {GVAR(selectedBodyPart) != 2}): {
+ case (_keyPressed == DIK_S && {GVAR(selectedBodyPart != 2)}): {
GVAR(selectedBodyPart) = 2;
};
- case (_keyPressed == DIK_A && {GVAR(selectedBodyPart) != 3}): {
+ case (_keyPressed == DIK_S && {GVAR(selectedBodyPart != 3)}): {
GVAR(selectedBodyPart) = 3;
};
- case (_keyPressed == DIK_X && {GVAR(selectedBodyPart) != 4}): {
+ case (_keyPressed == DIK_D && {GVAR(selectedBodyPart) != 4}): {
GVAR(selectedBodyPart) = 4;
};
- case (_keyPressed == DIK_Z && {GVAR(selectedBodyPart) != 5}): {
+ case (_keyPressed == DIK_D && {GVAR(selectedBodyPart) != 5}): {
GVAR(selectedBodyPart) = 5;
};
+ case (_keyPressed == DIK_A && {GVAR(selectedBodyPart) != 6}): {
+ GVAR(selectedBodyPart) = 6;
+ };
+ case (_keyPressed == DIK_A && {GVAR(selectedBodyPart) != 7}): {
+ GVAR(selectedBodyPart) = 7;
+ };
+ case (_keyPressed == DIK_X && {GVAR(selectedBodyPart) != 8}): {
+ GVAR(selectedBodyPart) = 8;
+ };
+ case (_keyPressed == DIK_X && {GVAR(selectedBodyPart) != 9}): {
+ GVAR(selectedBodyPart) = 9;
+ };
+ case (_keyPressed == DIK_Z && {GVAR(selectedBodyPart) != 10}): {
+ GVAR(selectedBodyPart) = 10;
+ };
+ case (_keyPressed == DIK_Z && {GVAR(selectedBodyPart) != 11}): {
+ GVAR(selectedBodyPart) = 11;
+ };
default {
_return = false; // Do not override existing keybinds for keys not used here
diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf
index 25204e4b6ac..8c4c447775b 100644
--- a/addons/medical_gui/functions/fnc_updateBodyImage.sqf
+++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf
@@ -22,9 +22,9 @@ params ["_ctrlGroup", "_target", "_selectionN"];
// Get tourniquets, damage, and blood loss for target
private _tourniquets = GET_TOURNIQUETS(_target);
private _fractures = GET_FRACTURES(_target);
-private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0]];
+private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
private _damageThreshold = GET_DAMAGE_THRESHOLD(_target);
-private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0];
+private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
{
private _partIndex = ALL_BODY_PARTS find _x;
@@ -61,7 +61,7 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0];
_ctrlBone ctrlSetTextColor [1, 0, 0, 1];
};
case -1: {
- if (EGVAR(medical,fractures) in [2, 3]) then {
+ if (EGVAR(medical,fractures) in [4, 5, 6, 7]) then {
_ctrlBone ctrlShow true;
_ctrlBone ctrlSetTextColor [0, 0, 1, 1];
} else {
@@ -80,24 +80,24 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0];
// _damageThreshold here indicates how close unit is to guaranteed death via sum of trauma, so use the same multipliers used in medical_damage/functions/fnc_determineIfFatal.sqf
// TODO: make multipliers for head and torso a macro in medical_engine/script_macros_medical.hpp
switch (true) do { // torso damage threshold doesn't need scaling
- case (_forEachIndex > 3): { // legs: index 4 & 5
+ case (_forEachIndex > 7): { // legs: index 8,9,10,11
if (EGVAR(medical,limbDamageThreshold) != 0 && {[false, !isPlayer _target, true] select EGVAR(medical,useLimbDamage)}) then { // Just indicate how close to the limping threshold we are
_damageThreshold = _damageThreshold * EGVAR(medical,limbDamageThreshold);
} else {
_damageThreshold = LIMPING_DAMAGE_THRESHOLD * 4;
};
};
- case (_forEachIndex > 1): { // arms: index 2 & 3
+ case (_forEachIndex > 3): { // arms: index 4,5,6,7
if (EGVAR(medical,limbDamageThreshold) != 0 && {[false, !isPlayer _target, true] select EGVAR(medical,useLimbDamage)}) then { // Just indicate how close to the fracture threshold we are
_damageThreshold = _damageThreshold * EGVAR(medical,limbDamageThreshold);
} else {
_damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4;
};
};
- case (_forEachIndex == 0): { // head: index 0
- _damageThreshold = _damageThreshold * 1.25;
+ case (_forEachIndex > 1): { // body
+ _damageThreshold = _damageThreshold * 1.5;
};
- default { // torso: index 1
+ default { //head and neck
_damageThreshold = _damageThreshold * 1.5
};
};
@@ -109,11 +109,17 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0];
_ctrlBodyPart ctrlSetTextColor _bodyPartColor;
} forEach [
[IDC_BODY_HEAD, IDC_BODY_HEAD_S],
+ [IDC_BODY_NECK, IDC_BODY_NECK_S],
+ [IDC_BODY_CHEST, IDC_BODY_CHEST_S],
[IDC_BODY_TORSO, IDC_BODY_TORSO_S],
[IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_S, IDC_BODY_ARMLEFT_T, IDC_BODY_ARMLEFT_B],
+ [IDC_BODY_ARMUPPERLEFT, IDC_BODY_ARMUPPERLEFT_S, IDC_BODY_ARMUPPERLEFT_T, IDC_BODY_ARMUPPERLEFT_B],
[IDC_BODY_ARMRIGHT, IDC_BODY_ARMRIGHT_S, IDC_BODY_ARMRIGHT_T, IDC_BODY_ARMRIGHT_B],
+ [IDC_BODY_ARMUPPERRIGHT, IDC_BODY_ARMUPPERRIGHT_S, IDC_BODY_ARMUPPERRIGHT_T, IDC_BODY_ARMUPPERRIGHT_B],
[IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_S, IDC_BODY_LEGLEFT_T, IDC_BODY_LEGLEFT_B],
- [IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_S, IDC_BODY_LEGRIGHT_T, IDC_BODY_LEGRIGHT_B]
+ [IDC_BODY_LEGUPPERLEFT, IDC_BODY_LEGUPPERLEFT_S, IDC_BODY_LEGUPPERLEFT_T, IDC_BODY_LEGUPPERLEFT_B],
+ [IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_S, IDC_BODY_LEGRIGHT_T, IDC_BODY_LEGRIGHT_B],
+ [IDC_BODY_LEGUPPERRIGHT, IDC_BODY_LEGUPPERRIGHT_S, IDC_BODY_LEGUPPERRIGHT_T, IDC_BODY_LEGUPPERRIGHT_B]
];
[QGVAR(updateBodyImage), [_ctrlGroup, _target, _selectionN]] call CBA_fnc_localEvent;
diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf
index f7a9eec1122..b045dab2f85 100644
--- a/addons/medical_gui/functions/fnc_updateInjuryList.sqf
+++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf
@@ -152,41 +152,47 @@ _entries pushBack ["", [1, 1, 1, 1]];
// Add selected body part name
private _bodyPartName = [
LSTRING(Head),
+ LSTRING(Neck),
+ LSTRING(Chest),
LSTRING(Torso),
LSTRING(LeftArm),
+ LSTRING(LeftUpperArm),
LSTRING(RightArm),
+ LSTRING(RightUpperArm),
LSTRING(LeftLeg),
- LSTRING(RightLeg)
+ LSTRING(LeftUpperLeg),
+ LSTRING(RightLeg),
+ LSTRING(RightUpperLeg)
] select _selectionN;
_entries pushBack [localize _bodyPartName, [1, 1, 1, 1]];
// Damage taken tooltip
if (GVAR(showDamageEntry)) then {
- private _bodyPartDamage = (_target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0]]) select _selectionN;
+ private _bodyPartDamage = (_target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) select _selectionN;
if (_bodyPartDamage > 0) then {
private _damageThreshold = GET_DAMAGE_THRESHOLD(_target);
switch (true) do {
- case (_selectionN > 3): { // legs: index 4 & 5
+ case (_selectionN > 7): { // legs: index 8-11
if (!EGVAR(medical,useLimbDamage) || EGVAR(medical,limbDamageThreshold) == 0) then { // Just indicate how close to the limping threshold we are
_damageThreshold = LIMPING_DAMAGE_THRESHOLD * 4;
} else {
_damageThreshold = _damageThreshold * EGVAR(medical,limbDamageThreshold);
};
};
- case (_selectionN > 1): { // arms: index 2 & 3
+ case (_selectionN > 3): { // arms: index 4-7
if (!EGVAR(medical,useLimbDamage) || EGVAR(medical,limbDamageThreshold) == 0) then { // Just indicate how close to the fracture threshold we are
_damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4;
} else {
_damageThreshold = _damageThreshold * EGVAR(medical,limbDamageThreshold);
};
};
- case (_selectionN == 0): { // head: index 0
- _damageThreshold = _damageThreshold * 1.25;
- };
- default { // torso: index 1
+ case (_selectionN > 1): { // chest and torso index 2-3
_damageThreshold = _damageThreshold * 1.5;
};
+ default { // Head and neck index 0-1
+ _damageThreshold = _damageThreshold * 1.25;
+ };
};
// _bodyPartDamage here should indicate how close unit is to guaranteed death via sum of trauma, so use the same multipliers used in medical_damage/functions/fnc_determineIfFatal.sqf
_bodyPartDamage = (_bodyPartDamage / _damageThreshold) min 1;
diff --git a/addons/medical_gui/gui.hpp b/addons/medical_gui/gui.hpp
index f9cb0b40a3f..d787218f132 100644
--- a/addons/medical_gui/gui.hpp
+++ b/addons/medical_gui/gui.hpp
@@ -26,6 +26,14 @@ class GVAR(BodyImage): RscControlsGroupNoScrollbars {
idc = IDC_BODY_HEAD;
text = QPATHTOF(data\body_image\head.paa);
};
+ class Neck: Background {
+ idc = IDC_BODY_NECK;
+ text = QPATHTOF(data\body_image\neck.paa);
+ };
+ class Chest: Background {
+ idc = IDC_BODY_CHEST;
+ text = QPATHTOF(data\body_image\chest.paa);
+ };
class Torso: Background {
idc = IDC_BODY_TORSO;
text = QPATHTOF(data\body_image\torso.paa);
@@ -34,52 +42,100 @@ class GVAR(BodyImage): RscControlsGroupNoScrollbars {
idc = IDC_BODY_ARMLEFT;
text = QPATHTOF(data\body_image\arm_left.paa);
};
+ class ArmUpperLeft: Background {
+ idc = IDC_BODY_ARMUPPERLEFT;
+ text = QPATHTOF(data\body_image\arm_upper_left.paa);
+ };
class ArmRight: Background {
idc = IDC_BODY_ARMRIGHT;
text = QPATHTOF(data\body_image\arm_right.paa);
};
+ class ArmUpperRight: Background {
+ idc = IDC_BODY_ARMUPPERRIGHT;
+ text = QPATHTOF(data\body_image\arm_upper_right.paa);
+ };
class LegLeft: Background {
idc = IDC_BODY_LEGLEFT;
text = QPATHTOF(data\body_image\leg_left.paa);
};
+ class LegUpperLeft: Background {
+ idc = IDC_BODY_LEGUPPERLEFT;
+ text = QPATHTOF(data\body_image\leg_upper_left.paa);
+ };
class LegRight: Background {
idc = IDC_BODY_LEGRIGHT;
text = QPATHTOF(data\body_image\leg_right.paa);
};
+ class LegUpperRight: Background {
+ idc = IDC_BODY_LEGUPPERRIGHT;
+ text = QPATHTOF(data\body_image\leg_upper_right.paa);
+ };
class ArmLeftB: Background {
idc = IDC_BODY_ARMLEFT_B;
text = QPATHTOF(data\body_image\arm_left_b.paa);
colorText[] = {0, 0, 0.8, 1};
show = 0;
};
+ class ArmUpperLeftB: ArmLeftB {
+ idc = IDC_BODY_ARMUPPERLEFT_B;
+ text = QPATHTOF(data\body_image\arm_upper_left_b.paa);
+ };
class ArmRightB: ArmLeftB {
idc = IDC_BODY_ARMRIGHT_B;
text = QPATHTOF(data\body_image\arm_right_b.paa);
};
+ class ArmUpperRightB: ArmLeftB {
+ idc = IDC_BODY_ARMUPPERRIGHT_B;
+ text = QPATHTOF(data\body_image\arm_upper_right_b.paa);
+ };
class LegLeftB: ArmLeftB {
idc = IDC_BODY_LEGLEFT_B;
text = QPATHTOF(data\body_image\leg_left_b.paa);
};
+ class LegUpperLeftB: ArmLeftB {
+ idc = IDC_BODY_LEGUPPERLEFT_B;
+ text = QPATHTOF(data\body_image\leg_upper_left_b.paa);
+ };
class LegRightB: ArmLeftB {
idc = IDC_BODY_LEGRIGHT_B;
text = QPATHTOF(data\body_image\leg_right_b.paa);
};
+ class LegUpperRightB: ArmLeftB {
+ idc = IDC_BODY_LEGUPPERRIGHT_B;
+ text = QPATHTOF(data\body_image\leg_upper_right_b.paa);
+ };
class ArmLeftT: Background {
idc = IDC_BODY_ARMLEFT_T;
- text = QPATHTOF(data\body_image\arm_left_t.paa);
+ text = QPATHTOF(data\body_image\arm_lower_left_t.paa);
colorText[] = {0, 0, 0.8, 1};
show = 0;
};
class ArmRightT: ArmLeftT {
idc = IDC_BODY_ARMRIGHT_T;
- text = QPATHTOF(data\body_image\arm_right_t.paa);
+ text = QPATHTOF(data\body_image\arm_lower_right_t.paa);
};
class LegLeftT: ArmLeftT {
idc = IDC_BODY_LEGLEFT_T;
- text = QPATHTOF(data\body_image\leg_left_t.paa);
+ text = QPATHTOF(data\body_image\leg_lower_left_t.paa);
};
class LegRightT: ArmLeftT {
idc = IDC_BODY_LEGRIGHT_T;
+ text = QPATHTOF(data\body_image\leg_lower_right_t.paa);
+ };
+ class ArmUpperLeftT: ArmLeftT {
+ idc = IDC_BODY_ARMUPPERLEFT_T;
+ text = QPATHTOF(data\body_image\arm_left_t.paa);
+ };
+ class ArmUpperRightT: ArmLeftT {
+ idc = IDC_BODY_ARMUPPERRIGHT_T;
+ text = QPATHTOF(data\body_image\arm_right_t.paa);
+ };
+ class LegUpperLeftT: ArmLeftT {
+ idc = IDC_BODY_LEGUPPERLEFT_T;
+ text = QPATHTOF(data\body_image\leg_left_t.paa);
+ };
+ class LegUpperRightT: ArmLeftT {
+ idc = IDC_BODY_LEGUPPERRIGHT_T;
text = QPATHTOF(data\body_image\leg_right_t.paa);
};
class HeadS: Background {
@@ -88,6 +144,16 @@ class GVAR(BodyImage): RscControlsGroupNoScrollbars {
colorText[] = {1.0, 1.0, 1.0, 1.0};
show = 0;
};
+ class NeckS: Background {
+ idc = IDC_BODY_NECK_S;
+ text = QPATHTOF(data\body_image\neck_s.paa);
+ colorText[] = {1.0, 1.0, 1.0, 1.0};
+ show = 0;
+ };
+ class ChestS: HeadS {
+ idc = IDC_BODY_CHEST_S;
+ text = QPATHTOF(data\body_image\chest_s.paa);
+ };
class TorsoS: HeadS {
idc = IDC_BODY_TORSO_S;
text = QPATHTOF(data\body_image\torso_s.paa);
@@ -108,6 +174,22 @@ class GVAR(BodyImage): RscControlsGroupNoScrollbars {
idc = IDC_BODY_LEGRIGHT_S;
text = QPATHTOF(data\body_image\leg_right_s.paa);
};
+ class ArmUpperLeftS: HeadS {
+ idc = IDC_BODY_ARMUPPERLEFT_S;
+ text = QPATHTOF(data\body_image\arm_upper_left_s.paa);
+ };
+ class ArmUpperRightS: HeadS {
+ idc = IDC_BODY_ARMUPPERRIGHT_S;
+ text = QPATHTOF(data\body_image\arm_upper_right_s.paa);
+ };
+ class LegUpperLeftS: HeadS {
+ idc = IDC_BODY_LEGUPPERLEFT_S;
+ text = QPATHTOF(data\body_image\leg_upper_left_s.paa);
+ };
+ class LegUpperRightS: HeadS {
+ idc = IDC_BODY_LEGUPPERRIGHT_S;
+ text = QPATHTOF(data\body_image\leg_upper_right_s.paa);
+ };
};
};
@@ -364,44 +446,102 @@ class ACE_Medical_Menu {
x = QUOTE(POS_X(19.3));
y = QUOTE(POS_Y(3.2));
w = QUOTE(POS_W(1.4));
- h = QUOTE(POS_H(1.8));
+ h = QUOTE(POS_H(1.2));
colorFocused[] = {0, 0, 0, 0};
colorBackground[] = {0, 0, 0, 0};
colorBackgroundActive[] = {0, 0, 0, 0};
};
- class SelectTorso: SelectHead {
+ class SelectNeck: RscButton {
+ idc = -1;
onButtonClick = QUOTE(GVAR(selectedBodyPart) = 1);
- tooltip = CSTRING(SelectTorso);
+ tooltip = CSTRING(SelectNeck);
+ x = QUOTE(POS_X(19.3));
+ y = QUOTE(POS_Y(4.4));
+ w = QUOTE(POS_W(1.4));
+ h = QUOTE(POS_H(0.6));
+ colorFocused[] = {0, 0, 0, 0};
+ colorBackground[] = {0, 0, 0, 0};
+ colorBackgroundActive[] = {0, 0, 0, 0};
+ };
+ class SelectChest: SelectHead {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 2);
+ tooltip = CSTRING(SelectChest);
x = QUOTE(POS_X(18.9));
y = QUOTE(POS_Y(5));
w = QUOTE(POS_W(2.2));
- h = QUOTE(POS_H(3.8));
+ h = QUOTE(POS_H(1.9));
};
- class SelectArmLeft: SelectHead {
- onButtonClick = QUOTE(GVAR(selectedBodyPart) = 2);
+ class SelectTorso: SelectHead {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 3);
+ tooltip = CSTRING(SelectTorso);
+ x = QUOTE(POS_X(18.9));
+ y = QUOTE(POS_Y(6.9));
+ w = QUOTE(POS_W(2.2));
+ h = QUOTE(POS_H(1.9));
+ };
+ class SelectUpperArmLeft: SelectHead {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 4);
tooltip = CSTRING(SelectLeftArm);
x = QUOTE(POS_X(21.1));
+ y = QUOTE(POS_Y(7.4));
+ w = QUOTE(POS_W(1.1));
+ h = QUOTE(POS_H(2.3));
+ };
+ class SelectArmLeft: SelectUpperArmLeft {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 5);
+ tooltip = CSTRING(SelectUpperLeftArm);
+ x = QUOTE(POS_X(21.1));
y = QUOTE(POS_Y(5.1));
w = QUOTE(POS_W(1.1));
- h = QUOTE(POS_H(4.6));
+ h = QUOTE(POS_H(2.3));
};
- class SelectArmRight: SelectArmLeft {
- onButtonClick = QUOTE(GVAR(selectedBodyPart) = 3);
+ class SelectUpperArmRight: SelectUpperArmLeft {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 6);
tooltip = CSTRING(SelectRightArm);
x = QUOTE(POS_X(17.8));
+ y = QUOTE(POS_Y(7.4));
+ w = QUOTE(POS_W(1.1));
+ h = QUOTE(POS_H(2.3));
};
- class SelectLegLeft: SelectHead {
- onButtonClick = QUOTE(GVAR(selectedBodyPart) = 4);
+ class SelectArmRight: SelectUpperArmRight {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 7);
+ tooltip = CSTRING(SelectRightUpperArm);
+ x = QUOTE(POS_X(17.8));
+ y = QUOTE(POS_Y(5.1));
+ w = QUOTE(POS_W(1.1));
+ h = QUOTE(POS_H(2.3));
+ };
+ class SelectUpperLegLeft: SelectHead {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 8);
tooltip = CSTRING(SelectLeftLeg);
x = QUOTE(POS_X(20.0));
- y = QUOTE(POS_Y(8.8));
+ y = QUOTE(POS_Y(11.7));
w = QUOTE(POS_W(1.1));
- h = QUOTE(POS_H(5.8));
+ h = QUOTE(POS_H(2.4));
};
- class SelectLegRight: SelectLegLeft {
- onButtonClick = QUOTE(GVAR(selectedBodyPart) = 5);
+ class SelectLegLeft: SelectUpperLegLeft {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 9);
+ tooltip = CSTRING(SelectLeftUpperLeg);
+ x = QUOTE(POS_X(20.0));
+ y = QUOTE(POS_Y(8.4));
+ w = QUOTE(POS_W(1.1));
+ h = QUOTE(POS_H(3.3));
+ };
+ class SelectUpperLegRight: SelectHead {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 10);
tooltip = CSTRING(SelectRightLeg);
x = QUOTE(POS_X(18.9));
+ y = QUOTE(POS_Y(11.7));
+ w = QUOTE(POS_W(1.1));
+ h = QUOTE(POS_H(2.4));
+ };
+ class SelectLegRight: SelectUpperLegRight {
+ onButtonClick = QUOTE(GVAR(selectedBodyPart) = 11);
+ tooltip = CSTRING(SelectRightUpperLeg);
+ x = QUOTE(POS_X(18.9));
+ y = QUOTE(POS_Y(8.8));
+ w = QUOTE(POS_W(1.1));
+ h = QUOTE(POS_H(3.3));
};
class Injuries: TriageCard {
idc = IDC_INJURIES;
diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp
index d69fb654344..5849e57f730 100644
--- a/addons/medical_gui/script_component.hpp
+++ b/addons/medical_gui/script_component.hpp
@@ -58,26 +58,46 @@
#define IDC_BODY_GROUP 6000
#define IDC_BODY_HEAD 6005
+#define IDC_BODY_NECK 6006
#define IDC_BODY_TORSO 6010
+#define IDC_BODY_CHEST 6011
#define IDC_BODY_ARMLEFT 6015
+#define IDC_BODY_ARMUPPERLEFT 6016
#define IDC_BODY_ARMRIGHT 6020
+#define IDC_BODY_ARMUPPERRIGHT 6021
#define IDC_BODY_LEGLEFT 6025
+#define IDC_BODY_LEGUPPERLEFT 6026
#define IDC_BODY_LEGRIGHT 6030
+#define IDC_BODY_LEGUPPERRIGHT 6031
#define IDC_BODY_ARMLEFT_T 6035
+#define IDC_BODY_ARMUPPERLEFT_T 6035
#define IDC_BODY_ARMRIGHT_T 6040
+#define IDC_BODY_ARMUPPERRIGHT_T 6040
#define IDC_BODY_LEGLEFT_T 6045
+#define IDC_BODY_LEGUPPERLEFT_T 6046
#define IDC_BODY_LEGRIGHT_T 6050
+#define IDC_BODY_LEGUPPERRIGHT_T 6051
#define IDC_BODY_ARMLEFT_B 6055
+#define IDC_BODY_ARMUPPERLEFT_B 6056
#define IDC_BODY_ARMRIGHT_B 6060
+#define IDC_BODY_ARMUPPERRIGHT_B 6061
#define IDC_BODY_LEGLEFT_B 6065
+#define IDC_BODY_LEGUPPERLEFT_B 6066
#define IDC_BODY_LEGRIGHT_B 6070
+#define IDC_BODY_LEGUPPERRIGHT_B 6071
#define IDC_BODY_GROUP_S 6075
#define IDC_BODY_HEAD_S 6080
+#define IDC_BODY_NECK_S 6081
#define IDC_BODY_TORSO_S 6085
+#define IDC_BODY_CHEST_S 6086
#define IDC_BODY_ARMLEFT_S 6090
+#define IDC_BODY_ARMUPPERLEFT_S 6091
#define IDC_BODY_ARMRIGHT_S 6095
+#define IDC_BODY_ARMUPPERRIGHT_S 6096
#define IDC_BODY_LEGLEFT_S 6100
+#define IDC_BODY_LEGUPPERLEFT_S 6101
#define IDC_BODY_LEGRIGHT_S 6105
+#define IDC_BODY_LEGUPPERRIGHT_S 6106
#define IDC_TRIAGE_STATUS 7000
#define IDC_TRIAGE_SELECT 7100
diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml
index 6dfc16f9b95..b796c1cffac 100644
--- a/addons/medical_gui/stringtable.xml
+++ b/addons/medical_gui/stringtable.xml
@@ -605,6 +605,12 @@
頭部
Kafa
+
+ Neck
+
+
+ Chest
+
Torso
Torso
@@ -622,68 +628,28 @@
Gövde
- Left Arm
- Linker Arm
- Левая рука
- Brazo Izquierdo
- Bras gauche
- Lewa ręka
- Braço Esquerdo
- Levá Ruka
- Braccio Sinistro
- 左腕
- 왼팔
- 左臂
- 左手
- Sol Kol
+ Lower Left Arm
+
+
+ Upper Left Arm
- Right Arm
- Rechter Arm
- Правая рука
- Brazo Derecho
- Bras droit
- Prawa ręka
- Braço Direito
- Pravá Ruka
- Braccio Destro
- 右腕
- 오른팔
- 右臂
- 右手
- Sağ Kol
+ Lower Right Arm
+
+
+ Upper Right Arm
- Left Leg
- Linkes Bein
- Левая нога
- Pierna Izquierda
- Jambe gauche
- Lewa noga
- Perna Esquerda
- Levá Noha
- Gamba Sinistra
- 左足
- 왼다리
- 左腿
- 左腳
- Sol Bacak
+ Lower Left Leg
+
+
+ Upper Left Leg
- Right Leg
- Rechtes Bein
- Правая нога
- Pierna Derecha
- Jambe droite
- Prawa noga
- Perna Direita
- Pravá Noha
- Gamba Destra
- 右足
- 오른다리
- 右腿
- 右腳
- Sağ Bacak
+ Lower Right Leg
+
+
+ Upper Right Leg
Select Head
@@ -701,6 +667,9 @@
選擇頭部
Kafayı Seç
+
+ Select Neck
+
Select Torso
Wähle Torso
@@ -717,69 +686,32 @@
選擇身體
Gövdeyi Seç
+
+ Select Chest
+
- Select Left Arm
- Wähle linken Arm
- Выбрать левую руку
- Seleccionar Brazo Izquierdo
- Sélectionner le bras gauche
- Wybierz lewą rękę
- Selecionar Braço Esquerdo
- Vybrat Levou ruku
- Seleziona Braccio Sinistro
- 左腕を選択
- 왼팔 선택
- 选择左臂
- 選擇左手
- Sol Kolu Seç
+ Select Lower Left Arm
+
+
+ Select Upper Left Arm
- Select Right Arm
- Wähle rechten Arm
- Выбрать правую руку
- Seleccionar Brazo Derecho
- Sélectionner le bras droit
- Wybierz prawą rękę
- Selecionar Braço Direito
- Vybrat Pravou ruku
- Seleziona Braccio Destro
- 右腕を選択
- 오른팔 선택
- 选择右臂
- 選擇右手
- Sağ Kolu Seç
+ Select Lower Right Arm
+
+
+ Select Upper Right Arm
- Select Left Leg
- Wähle linkes Bein
- Выбрать левую ногу
- Seleccionar Pierna Izquierda
- Sélectionner la jambe gauche
- Wybierz lewą nogę
- Selecionar Perna Esquerda
- Vybrat Levou nohu
- Seleziona Gamba Sinistra
- 左足を選択
- 왼다리 선택
- 选择左腿
- 選擇左腳
- Sol Bacağı Seç
+ Select Lower Left Leg
+
+
+ Select Upper Left Leg
- Select Right Leg
- Wähle rechtes Bein
- Выбрать правую ногу
- Seleccionar Pierna Derecha
- Sélectionner la jambe droite
- Wybierz prawą nogę
- Selecionar Perna Direita
- Vybrat Pravou nohu
- Seleziona Gamba Destra
- 右足を選択
- 오른다리 선택
- 选择右腿
- 選擇右腳
- Sağ Bacağı Seç
+ Select Lower Right Leg
+
+
+ Select Upper Right Leg
Small
diff --git a/addons/medical_status/functions/fnc_initUnit.sqf b/addons/medical_status/functions/fnc_initUnit.sqf
index 278163d90b9..76dad9de4c3 100644
--- a/addons/medical_status/functions/fnc_initUnit.sqf
+++ b/addons/medical_status/functions/fnc_initUnit.sqf
@@ -70,7 +70,7 @@ if (_isRespawn) then {
_unit setVariable [QEGVAR(medical,triageCard), [], true];
// Damage storage
- _unit setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true];
+ _unit setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0,0,0,0,0,0,0], true];
// Medication
_unit setVariable [VAR_MEDICATIONS, [], true];
diff --git a/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf b/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf
index 86963496422..f0d5c4f7bc2 100644
--- a/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf
+++ b/addons/medical_status/functions/fnc_updateWoundBloodLoss.sqf
@@ -19,7 +19,7 @@
params ["_unit"];
private _tourniquets = GET_TOURNIQUETS(_unit);
-private _bodyPartBleeding = [0,0,0,0,0,0];
+private _bodyPartBleeding = [0,0,0,0,0,0,0,0,0,0,0,0];
{
private _partIndex = ALL_BODY_PARTS find _x;
if (_tourniquets select _partIndex == 0) then {
@@ -30,13 +30,13 @@ private _bodyPartBleeding = [0,0,0,0,0,0];
};
} forEach GET_OPEN_WOUNDS(_unit);
-if (_bodyPartBleeding isEqualTo [0,0,0,0,0,0]) then {
+if (_bodyPartBleeding isEqualTo [0,0,0,0,0,0,0,0,0,0,0,0]) then {
TRACE_1("updateWoundBloodLoss-none",_unit);
_unit setVariable [VAR_WOUND_BLEEDING, 0, true];
} else {
- _bodyPartBleeding params ["_headBleeding", "_bodyBleeding", "_leftArmBleeding", "_rightArmBleeding", "_leftLegBleeding", "_rightLegBleeding"];
- private _bodyBleedingRate = ((_headBleeding min 0.9) + (_bodyBleeding min 1.0)) min 1.0;
- private _limbBleedingRate = ((_leftArmBleeding min 0.3) + (_rightArmBleeding min 0.3) + (_leftLegBleeding min 0.5) + (_rightLegBleeding min 0.5)) min 1.0;
+ _bodyPartBleeding params ["_headBleeding","_neckBleeding", "_chestBleeding", "_bodyBleeding", "_leftArmBleeding","_leftUpperArmBleeding", "_rightArmBleeding","_rightUpperArmBleeding", "_leftLegBleeding","_leftUpperLegBleeding", "_rightLegBleeding", "_rightUpperLegBleeding"];
+ private _bodyBleedingRate = ((_headBleeding min 0.9) + (_neckBleeding min 0.9) + (_chestBleeding min 1.0) + (_bodyBleeding min 1.0)) min 1.0;
+ private _limbBleedingRate = ((_leftArmBleeding min 0.3) + (_leftUpperArmBleeding min 0.3) + (_rightArmBleeding min 0.3) + (_rightUpperArmBleeding min 0.3) + (_leftLegBleeding min 0.5) + (_leftUpperLegBleeding min 0.5) + (_rightLegBleeding min 0.5) + (_rightUpperLegBleeding min 0.5)) min 1.0;
// limb bleeding is scaled down based on the amount of body bleeding
_limbBleedingRate = _limbBleedingRate * (1 - _bodyBleedingRate);
diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp
index 582e3b6db53..d7e7e69e638 100644
--- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp
+++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp
@@ -77,7 +77,7 @@ class GVAR(actions) {
displayName = CSTRING(Apply_Tourniquet);
displayNameProgress = CSTRING(Applying_Tourniquet);
icon = QPATHTOEF(medical_gui,ui\tourniquet.paa);
- allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
+ allowedSelections[] = {"LeftArm", "UpperLeftArm", "RightArm", "UpperRightArm", "LeftLeg", "UpperLeftLeg", "RightLeg", "UpperRightLeg"};
items[] = {"ACE_tourniquet"};
treatmentTime = QGVAR(treatmentTimeTourniquet);
condition = QUOTE(!([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo)));
@@ -101,7 +101,7 @@ class GVAR(actions) {
category = "bandage";
icon = QPATHTOEF(medical_gui,ui\splint.paa);
medicRequired = QGVAR(medicSplint);
- allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
+ allowedSelections[] = {"LeftArm", "UpperLeftArm", "RightArm", "UpperRightArm", "LeftLeg", "UpperLeftLeg", "RightLeg", "UpperRightLeg"};
items[] = {"ACE_splint"};
treatmentLocations = QGVAR(locationSplint);
treatmentTime = QGVAR(treatmentTimeSplint);
@@ -118,7 +118,7 @@ class GVAR(actions) {
displayNameProgress = CSTRING(Injecting_Morphine);
icon = QPATHTOEF(medical_gui,ui\auto_injector.paa);
medicRequired = QGVAR(medicMorphine);
- allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
+ allowedSelections[] = {"LeftArm", "UpperLeftArm", "RightArm", "UpperRightArm", "LeftLeg", "UpperLeftLeg", "RightLeg", "UpperRightLeg"};
category = "medication";
items[] = {"ACE_morphine"};
treatmentLocations = QGVAR(locationMorphine);
@@ -165,7 +165,7 @@ class GVAR(actions) {
displayName = CSTRING(Actions_Blood4_1000);
displayNameProgress = CSTRING(Transfusing_Blood);
icon = QPATHTOEF(medical_gui,ui\iv.paa);
- allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
+ allowedSelections[] = {"LeftArm", "UpperLeftArm", "RightArm", "UpperRightArm", "LeftLeg", "UpperLeftLeg", "RightLeg", "UpperRightLeg"};
allowSelfTreatment = QGVAR(allowSelfIV);
category = "advanced";
medicRequired = QGVAR(medicIV);
@@ -221,7 +221,7 @@ class GVAR(actions) {
icon = "";
category = "examine";
treatmentLocations = TREATMENT_LOCATIONS_ALL;
- allowedSelections[] = {"Head", "Body"};
+ allowedSelections[] = {"Head", "Neck", "Chest", "Body"};
medicRequired = 0;
treatmentTime = 2.5;
items[] = {};
@@ -245,7 +245,7 @@ class GVAR(actions) {
class CheckBloodPressure: CheckPulse {
displayName = CSTRING(Actions_CheckBloodPressure);
displayNameProgress = CSTRING(Check_Bloodpressure_Content);
- allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
+ allowedSelections[] = {"LeftUpperArm", "RightUpperArm", "LeftUpperLeg", "RightUpperLeg"};
callbackSuccess = QFUNC(checkBloodPressure);
};
class CheckResponse: CheckPulse {
@@ -296,7 +296,7 @@ class GVAR(actions) {
icon = "";
category = "advanced";
treatmentLocations = TREATMENT_LOCATIONS_ALL;
- allowedSelections[] = {"Body"};
+ allowedSelections[] = {"Chest"};
allowSelfTreatment = 0;
medicRequired = 0;
treatmentTime = QGVAR(treatmentTimeCPR);
diff --git a/addons/medical_treatment/functions/fnc_bandageLocal.sqf b/addons/medical_treatment/functions/fnc_bandageLocal.sqf
index 2c59540fd12..ab0d4354260 100644
--- a/addons/medical_treatment/functions/fnc_bandageLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_bandageLocal.sqf
@@ -74,7 +74,7 @@ if (
if (GVAR(clearTrauma) == 2) then {
TRACE_2("clearTrauma - clearing trauma after bandage",_bodyPart,_openWounds);
private _partIndex = ALL_BODY_PARTS find _bodyPart;
- private _bodyPartDamage = _patient getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+ private _bodyPartDamage = _patient getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0,0,0,0,0,0,0]];
private _newDam = (_bodyPartDamage select _partIndex) - _treatedDamage;
// Prevent obscenely small damage from lack of floating precision
diff --git a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf
index 42c5866a9af..436e1a9fd01 100644
--- a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf
@@ -73,7 +73,7 @@ _patient setVariable [VAR_OXYGEN_DEMAND, 0, true];
_patient setVariable [QEGVAR(medical,ivBags), nil, true];
// Damage storage
-_patient setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true];
+_patient setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0,0,0,0,0,0,0], true];
// wakeup needs to be done after achieving stable vitals, but before manually reseting unconc var
if IS_UNCONSCIOUS(_patient) then {
diff --git a/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf
index b90198f0eb6..cda30af5137 100644
--- a/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf
+++ b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf
@@ -124,7 +124,7 @@ if (random 1 <= _reopeningChance * GVAR(woundReopenChance)) then {
// Re-add trauma and damage visuals
if (GVAR(clearTrauma) == 2) then {
private _injuryDamage = (_selectedInjury select 4) * _impact;
- private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
+ private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0,0,0,0,0,0,0]];
private _newDam = (_bodyPartDamage select _partIndex) + _injuryDamage;
_bodyPartDamage set [_partIndex, _newDam];