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];