diff --git a/AUTHORS.txt b/AUTHORS.txt index 1b978a3915..29861f1e50 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -40,7 +40,9 @@ Aleksey EpMAK Yermakov Alganthe Andrea "AtixNeon" Verano Anthariel +Arcanum417 Anton +Arcanum417 Arkhir Asgar Serran BaerMitUmlaut @@ -127,6 +129,7 @@ Raspu86 Riccardo Petricca Robert Boklahánics ruPaladin +Rutger "RedBery" Meijering simon84 Skengman2 Sniperwolf572 @@ -144,4 +147,5 @@ voiper VyMajoris(W-Cephei) Winter xrufix +Zakant zGuba diff --git a/ace_medical.dll b/ace_medical.dll index f85f1bc974..ede53b861d 100644 Binary files a/ace_medical.dll and b/ace_medical.dll differ diff --git a/ace_medical_x64.dll b/ace_medical_x64.dll index a903cddfe9..d046ad1d7f 100644 Binary files a/ace_medical_x64.dll and b/ace_medical_x64.dll differ diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index fba0de9052..2227cd6540 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -1,6 +1,24 @@ #include "script_component.hpp" + if (!hasInterface) exitWith {}; +[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { + private _unit = ACE_player; + private _fatigue = _unit getVariable [QGVAR(aimFatigue), 0]; + + switch (stance _unit) do { + case ("CROUCH"): { + 1.0 + _fatigue ^ 2 * 0.1 + }; + case ("PRONE"): { + 1.0 + _fatigue ^ 2 * 2.0 + }; + default { + 1.5 + _fatigue ^ 2 * 3.0 + }; + }; +}] call EFUNC(common,arithmeticSetSource); + ["ace_settingsInitialized", { if (!GVAR(enabled)) exitWith {}; @@ -30,7 +48,7 @@ if (!hasInterface) exitWith {}; linearConversion [0, 1, (_this getVariable [QEGVAR(medical,pain), 0]), 1, 1.1, true]; }] call FUNC(addDutyFactor); [QEGVAR(medical,bloodVolume), { // 100->1.0, 90->1.1, 80->1.2 - linearConversion [100, 0, (_this getVariable [QEGVAR(medical,bloodVolume), 100]), 1, 2, true]; + linearConversion [6, 0, (_this getVariable [QEGVAR(medical,bloodVolume), 100]), 1, 2, true]; }] call FUNC(addDutyFactor); }; if (["ACE_Dragging"] call EFUNC(common,isModLoaded)) then { diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index 3733517f36..1283d86555 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -88,14 +88,7 @@ if (_overexhausted) then { }; }; -switch (stance _unit) do { - case ("CROUCH"): { - [_unit, QUOTE(ADDON), (1.0 + _fatigue ^ 2 * 0.1) * GVAR(swayFactor)] call EFUNC(common,setAimCoef); - }; - case ("PRONE"): { - [_unit, QUOTE(ADDON), (1.0 + _fatigue ^ 2 * 2.0) * GVAR(swayFactor)] call EFUNC(common,setAimCoef); - }; - default { - [_unit, QUOTE(ADDON), (1.5 + _fatigue ^ 2 * 3.0) * GVAR(swayFactor)] call EFUNC(common,setAimCoef); - }; -}; +_unit setVariable [QGVAR(aimFatigue), _fatigue]; + +private _aimCoef = [missionNamespace, "ACE_setCustomAimCoef", "max"] call EFUNC(common,arithmeticGetResult); +_unit setCustomAimCoef _aimCoef; diff --git a/addons/arsenal/Display3DEN.hpp b/addons/arsenal/Display3DEN.hpp index 0a693a2189..b1b78b9f92 100644 --- a/addons/arsenal/Display3DEN.hpp +++ b/addons/arsenal/Display3DEN.hpp @@ -13,7 +13,7 @@ class Display3DEN { }; class aceArsenal: virtualArsenal { text = "ACE Arsenal"; - action = QUOTE(call FUNC(open3DEN)); + action = QUOTE(call DFUNC(open3DEN)); }; }; }; @@ -21,12 +21,12 @@ class Display3DEN { class MenuStrip: ctrlMenuStrip { class Items { class Tools { - items[] += {"ACE_arsenal_portVALoadouts"}; + items[] += {QGVAR(portVALoadouts)}; }; - class ACE_arsenal_portVALoadouts { + class GVAR(portVALoadouts) { text = CSTRING(portLoadoutsText); picture = QPATHTOEF(common,data\logo_ace3_ca.paa); - action = "call ace_arsenal_fnc_portVALoadouts;"; + action = QUOTE(call DFUNC(portVALoadouts);); }; }; }; diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 41f5f4cf88..04d8cbb124 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -60,4 +60,13 @@ GVAR(modList) = ["","curator","kart","heli","mark","expansion","expansionpremium call FUNC(compileStats); +// compatibility with CBA scripted 2d optics framework +[QGVAR(displayOpened), { + "cba_2doptics_arsenalOpened" call CBA_fnc_localEvent; +}] call CBA_fnc_addEventHandler; + +[QGVAR(displayClosed), { + "cba_2doptics_arsenalClosed" call CBA_fnc_localEvent; +}] call CBA_fnc_addEventHandler; + ADDON = true; diff --git a/addons/arsenal/functions/fnc_onKeyDown.sqf b/addons/arsenal/functions/fnc_onKeyDown.sqf index a66ab3784d..0c265873eb 100644 --- a/addons/arsenal/functions/fnc_onKeyDown.sqf +++ b/addons/arsenal/functions/fnc_onKeyDown.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" #include "..\defines.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Alganthe * Handles keyboard inputs in arsenal. diff --git a/addons/arsenal/functions/fnc_verifyLoadout.sqf b/addons/arsenal/functions/fnc_verifyLoadout.sqf index e7ce4fe0a6..12509333bb 100644 --- a/addons/arsenal/functions/fnc_verifyLoadout.sqf +++ b/addons/arsenal/functions/fnc_verifyLoadout.sqf @@ -211,7 +211,7 @@ for "_dataIndex" from 0 to 9 do { }; case 9: { - for "_subIndex" from 0 to 4 do { + for "_subIndex" from 0 to 5 do { private _item = (_loadout select _dataIndex) select _subIndex; if (_item != "") then { diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index b6ad5d8832..0fe41a517a 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -290,7 +290,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball { - airFriction=-0.00055262; + airFriction=-0.00053638; caliber=2.0; hit=19; typicalSpeed=853; diff --git a/addons/ballistics/CfgMagazineWells.hpp b/addons/ballistics/CfgMagazineWells.hpp index 39098f4c28..71d553b4ba 100644 --- a/addons/ballistics/CfgMagazineWells.hpp +++ b/addons/ballistics/CfgMagazineWells.hpp @@ -107,14 +107,14 @@ class CfgMagazineWells { "ACE_30Rnd_65x47_Scenar_mag", "ACE_20Rnd_65x47_Scenar_mag" }; - }; + }; class CBA_338LM_AI { //338 Lapua Magnum Accuracy International ADDON[] = { "ACE_10Rnd_338_300gr_HPBT_Mag", "ACE_10Rnd_338_API526_Mag" }; - }; + }; class CBA_408CT_Inter { ADDON[] = { @@ -122,13 +122,13 @@ class CfgMagazineWells { }; }; - class CBA_50BMG_M107 { + class CBA_50BMG_M107 { ADDON[] = { "ACE_5Rnd_127x99_Mag", "ACE_5Rnd_127x99_API_Mag", "ACE_5Rnd_127x99_AMAX_Mag" }; - }; + }; class CBA_9x19_P226 { // SIG P226 ADDON[] = { @@ -161,30 +161,5 @@ class CfgMagazineWells { "ACE_10Rnd_762x54_Tracer_mag" }; }; - class CBA_762x54R_Mosin { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_SVT { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_DPM { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_DT { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_Maxim { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; }; diff --git a/addons/captives/XEH_PREP.hpp b/addons/captives/XEH_PREP.hpp index bf0b06a1db..6157a1e33e 100644 --- a/addons/captives/XEH_PREP.hpp +++ b/addons/captives/XEH_PREP.hpp @@ -1,7 +1,6 @@ PREP(addLoadCaptiveActions); PREP(canApplyHandcuffs); PREP(canEscortCaptive); -PREP(canFriskPerson); PREP(canLoadCaptive); PREP(canRemoveHandcuffs); PREP(canStopEscorting); @@ -9,7 +8,6 @@ PREP(canSurrender); PREP(canUnloadCaptive); PREP(doApplyHandcuffs); PREP(doEscortCaptive); -PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 5e62bce35d..6adfef9dea 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\a3\editor_f\Data\Scripts\dikCodes.h" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" ["ace_settingsInitialized", { // Hold on a little bit longer to ensure anims will work diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index e9055e896a..0b8dae014a 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {QGVAR(ModuleSettings), QGVAR(ModuleSurrender), QGVAR(ModuleHandcuffed)}; weapons[] = {"ACE_CableTie"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_Interaction"}; + requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); authors[] = {"commy2", "KoffeinFlummi"}; url = ECSTRING(main,URL); diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf deleted file mode 100644 index c086afa0c7..0000000000 --- a/addons/captives/functions/fnc_canFriskPerson.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: bux578 - * Checks the conditions for being able to frisk a unit - * - * Arguments: - * 0: caller (player) - * 1: target - * - * Return Value: - * The return value - * - * Example: - * [player, bob] call ACE_captives_fnc_canFriskPerson - * - * Public: No - */ - -params ["_unit", "_target"]; - -_target getVariable [QGVAR(isHandcuffed), false] -|| {_target getVariable [QGVAR(isSurrendering), false]} -|| {_target getVariable ["ACE_isSearchable", false]} -|| {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf deleted file mode 100644 index 58e7131e72..0000000000 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ /dev/null @@ -1,67 +0,0 @@ -#include "script_component.hpp" -/* - * Author: bux578 - * Open the select menu with the "personal" items of a frisked unit. It only shows "handgunWeapon", "uniformItems", "vestItems", "backpackItems" and "assignedItems" because every other item is visible on the character - * - * Arguments: - * 0: player unit - * 1: unit - * - * Return Value: - * None - * - * Example: - * [player, bob] call ACE_captives_fnc_doFristPerson; - * - * Public: No - */ - -params ["_player", "_unit"]; - -private _weapon = currentWeapon _player; -if (_weapon == primaryWeapon _player && {_weapon != ""}) then { - [_player, "AmovPercMstpSlowWrflDnon", 0] call EFUNC(common,doAnimation); -}; - -private _listedItemClasses = []; - -private _actions = [localize LSTRING(FriskMenuHeader), ""] call ACE_Interaction_fnc_prepareSelectMenu; - -private _allGear = []; - -if ((handgunWeapon _unit) != "") then { - _allGear pushBack (handgunWeapon _unit); -}; -if (count (uniformItems _unit) > 0) then { - _allGear = _allGear + (uniformItems _unit); -}; -if (count (vestItems _unit) > 0) then { - _allGear = _allGear + (vestItems _unit); -}; -if (count (backpackItems _unit) > 0) then { - _allGear = _allGear + (backpackItems _unit); -}; -if (count (assignedItems _unit) > 0) then { - _allGear = _allGear + (assignedItems _unit); -}; - -// Handgun -// Uniform Items -// Vest Items -// Backpack Items -// Assigned Items -{ - if (!(_x in _listedItemClasses)) then { - private _item = configFile >> "CfgMagazines" >> _x; - if (isNil "_item" || str _item == "") then { //str _item ? - _item = configFile >> "CfgWeapons" >> _x; - }; - _actions = [_actions, getText(_item >> "displayName"), getText(_item >> "picture"), _x] call ACE_Interaction_fnc_addSelectableItem; - _listedItemClasses pushBack _x; - }; -} forEach (_allGear); - -[_actions, {call ACE_Interaction_fnc_hideMenu;}, {call ACE_Interaction_fnc_hideMenu;}] call ACE_Interaction_fnc_openSelectMenu; - -// don't need an "Ok" Button -ctrlShow [8860, false]; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 3b517654a7..5683d9b5f4 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -155,38 +155,6 @@ 束線帶可以綁住俘虜 束线带可以绑住俘虏 - - Inventory of frisked person - Inventar der durchsuchten Person - Inventaire de la personne fouillé - Inventario de la persona cacheada - Motozott személy felszerelése - Inventář prohledávané osoby - Ekwipunek rewidowanej osoby - Инвентарь обысканного человека - Inventário da pessoa revistada - Inventario della persona perquisita - 捕虜の持ち物を確認する - 검문당한 사람의 소지품 - 搜身選單 - 搜身选单 - - - Frisk person - Person durchsuchen - Fouiller la personne - Cachear - Prohledávaná osoba - Rewiduj osobę - Motozás - Обыскать человека - Revistar - Perquisisci la persona - 捕虜の持ち物 - 검문당한사람 - 搜身 - 搜身 - Surrender Se rendre diff --git a/addons/common/ACE_Settings.hpp b/addons/common/ACE_Settings.hpp index eeee9c2f37..f7ab86e227 100644 --- a/addons/common/ACE_Settings.hpp +++ b/addons/common/ACE_Settings.hpp @@ -1,4 +1,6 @@ class ACE_Settings { + //IGNORE_STRING_WARNING(STR_ACE_Common_SettingName); + //IGNORE_STRING_WARNING(STR_ACE_Common_SettingDescription); /* * class GVAR(sampleSetting) { * value = 1; // Value diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index 70efaf5e6c..a331837fb2 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -56,6 +56,8 @@ PREP(fixFloating); PREP(fixLoweredRifleAnimation); PREP(fixPosition); PREP(getAllDefinedSetVariables); +PREP(getAwakeAnim); +PREP(getCountOfItem); PREP(getDeathAnim); PREP(getDefaultAnim); PREP(getDefinedVariable); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 2ced174f30..5efc75b8df 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -39,6 +39,11 @@ _object allowSprint (_set == 0); }] call CBA_fnc_addEventHandler; +[QGVAR(setAnimSpeedCoef), { + params ["_object", "_set"]; + _object setAnimSpeedCoef _set; +}] call CBA_fnc_addEventHandler; + [QGVAR(setCaptive), { params ["_object", "_set"]; TRACE_2("setCaptive EH",_object,_set); @@ -83,6 +88,11 @@ _vehicle engineOn false; }] call CBA_fnc_addEventHandler; +[QGVAR(setMass), { + params ["_object", "_mass"]; + _object setMass _mass; +}] call CBA_fnc_addEventHandler; + //Add a fix for BIS's zeus remoteControl module not reseting variables on DC when RC a unit //This variable is used for isPlayer checks if (isServer) then { diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index 4c64da8f0f..8c892bcf13 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -113,7 +113,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x _output pushBack ""; _output pushBack format ["["]; _output pushBack format [" QGVAR(%1), ""%2"",", _gvarName, _cbaSettingType]; - _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; + _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; //IGNORE_STRING_WARNING(str_ace_common_); _output pushBack format [" ""%1"", // %2", ["localize LSTRING()", _category] select _uncat, _category]; _output pushBack format [" %1, // %2", _cbaValueInfo, _cbaValueInfoHint]; _output pushBack format [" %1, // isGlobal", _cbaIsGlobal]; diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 0cbca7d3ac..dee144c40e 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -70,7 +70,7 @@ if (!(_oldCompats isEqualTo [])) then { // check dlls /////////////// if (toLower (productVersion select 6) in ["linux", "osx"]) then { - INFO_2("Operating system does not support DLL file format"); + INFO("Operating system does not support DLL file format"); } else { { private _versionEx = _x callExtension "version"; diff --git a/addons/common/functions/fnc_doAnimation.sqf b/addons/common/functions/fnc_doAnimation.sqf index 678f4d4ef7..b71e4c6cb0 100644 --- a/addons/common/functions/fnc_doAnimation.sqf +++ b/addons/common/functions/fnc_doAnimation.sqf @@ -10,7 +10,6 @@ * 0 = PlayMove * 1 = PlayMoveNow * 2 = SwitchMove (no transitional animation, doesn't overwrite priority 1) - * 3: Force overwritting unconscious (default: false) * * Return Value: * None @@ -21,14 +20,8 @@ * Public: Yes */ -params ["_unit", "_animation", ["_priority", 0], ["_force", false]]; -TRACE_4("params",_unit,_animation,_priority,_force); - -// don't overwrite more important animations -if (_unit getVariable ["ACE_isUnconscious", false] && {(_animation != "Unconscious")} && {!_force}) exitWith {}; - -// don't go unconscious if the unit isn't unconscious -if (_animation == "Unconscious" && {!((_unit getVariable ["ACE_isUnconscious", false]) || (_unit getVariable ["ACE_isDead", false]))}) exitWith {}; +params ["_unit", "_animation", ["_priority", 0]]; +TRACE_4("params",_unit,_animation,_priority); // switchMove "" no longer works in dev 1.37 if (_animation == "") then { @@ -43,7 +36,7 @@ switch (_priority) do { if (_unit == vehicle _unit) then { [QGVAR(playMove), [_unit, _animation], _unit] call CBA_fnc_targetEvent; } else { - // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles. + // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles. [QGVAR(playMove), [_unit, _animation]] call CBA_fnc_globalEvent; }; }; @@ -51,7 +44,7 @@ switch (_priority) do { if (_unit == vehicle _unit) then { [QGVAR(playMoveNow), [_unit, _animation], _unit] call CBA_fnc_targetEvent; } else { - // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles. + // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles. [QGVAR(playMoveNow), [_unit, _animation]] call CBA_fnc_globalEvent; }; }; @@ -60,7 +53,7 @@ switch (_priority) do { if (_unit == vehicle _unit) then { [QGVAR(playMoveNow), [_unit, _animation], _unit] call CBA_fnc_targetEvent; } else { - // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles. + // Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles. [QGVAR(playMoveNow), [_unit, _animation]] call CBA_fnc_globalEvent; }; diff --git a/addons/common/functions/fnc_getAwakeAnim.sqf b/addons/common/functions/fnc_getAwakeAnim.sqf new file mode 100644 index 0000000000..7da2837759 --- /dev/null +++ b/addons/common/functions/fnc_getAwakeAnim.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Report awake animation of unit inside vehicle. + * + * Arguments: + * 0: The unit + * + * ReturnValue: + * The animtaion + * + * Example: + * player call ace_common_fnc_getAwakeAnim + * + * Public: no + */ + +params ["_unit"]; + +private _vehicle = vehicle _unit; + +// --- on foot +if (_vehicle isEqualTo _unit) exitWith {""}; + +// --- driver +private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; + +if (_unit == driver _vehicle) exitWith { + getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_config >> "driverAction")) // return +}; + +// --- turret +private _turret = _unit call CBA_fnc_turretPath; + +if !(_turret isEqualTo []) exitWith { + private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret; + + getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_turretConfig >> "gunnerAction")) // return +}; + +// --- cargo +private _cargoIndex = _vehicle getCargoIndex _unit; + +if (_cargoIndex != -1) exitWith { + getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getArray (_config >> "cargoAction") select _cargoIndex) // return +}; + +// --- default +"" diff --git a/addons/common/functions/fnc_getCountOfItem.sqf b/addons/common/functions/fnc_getCountOfItem.sqf new file mode 100644 index 0000000000..a6cf3b9233 --- /dev/null +++ b/addons/common/functions/fnc_getCountOfItem.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Dedmen + * Return how many items of type _itemType the player has in his containers (Uniform, Vest, Backpack) + * Doesn't count assignedItems, weapons, weapon attachments, magazines in weapons + * + * Arguments: + * 0: Unit + * 1: Classname of item (Case-Sensitive) + * + * Return Value: + * Item Count + * + * Example: + * [bob, "FirstAidKit"] call ace_common_fnc_getCountOfItem + * + * Public: Yes + */ + +params ["_unit", "_itemType"]; + +private _countItemsInContainer = { + (getItemCargo _this) params ["_itemTypes", "_itemCounts"]; + + private _index = _itemTypes find _itemType; + _itemCounts param [_index, 0] +}; + +((uniformContainer _unit) call _countItemsInContainer) + +((vestContainer _unit) call _countItemsInContainer) + +((backpackContainer _unit) call _countItemsInContainer) diff --git a/addons/common/functions/fnc_isAwake.sqf b/addons/common/functions/fnc_isAwake.sqf index 916f545685..5a59a3cb69 100644 --- a/addons/common/functions/fnc_isAwake.sqf +++ b/addons/common/functions/fnc_isAwake.sqf @@ -17,4 +17,4 @@ params ["_unit"]; -!(_unit getVariable ["ACE_isUnconscious", false]) && alive _unit && !(_unit getVariable ["ACE_isDead", false]) // return +alive _unit && {!(_unit getVariable ["ACE_isUnconscious", false])} diff --git a/addons/common/functions/fnc_player.sqf b/addons/common/functions/fnc_player.sqf index d691741e53..382db0bced 100644 --- a/addons/common/functions/fnc_player.sqf +++ b/addons/common/functions/fnc_player.sqf @@ -5,7 +5,7 @@ * Use this in INIT and RESPAWN eh scripts, because ACE_player isn't reset yet. * * Arguments: - * NONE. + * None * * Return Value: * Player controlled unit diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index 74b8b8c39e..bf33ffab89 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -38,32 +38,51 @@ if (count _emptyPos != 3) exitwith { unassignVehicle _unit; [_unit] orderGetIn false; -TRACE_1("Ejecting", alive _unit); +private _resetUncon = false; +if (lifeState _unit == "INCAPACITATED") then { + _resetUncon = true; + _unit setUnconscious false; + TRACE_1("pausing setUnconscious",_unit); +}; +TRACE_1("Ejecting", alive _unit); _unit action ["Eject", vehicle _unit]; [{ - params ["_unit", "_emptyPos"]; + params ["_unit", "_emptyPos", "_resetUncon"]; + + if ((vehicle _unit) != _unit) then { + WARNING_2("Failed to unload in time [%1 - %2]",_unit, vehicle _unit); + }; _unit setPosASL AGLToASL _emptyPos; - if !([_unit] call FUNC(isAwake)) then { - TRACE_1("Check if isAwake", [_unit] call FUNC(isAwake)); - - if (driver _unit == _unit) then { - private _anim = [_unit] call FUNC(getDeathAnim); - - [_unit, _anim, 1, true] call FUNC(doAnimation); - - [{ - params ["_unit", "_anim"]; - if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { - [_unit, _anim, 2, true] call FUNC(doAnimation); - }; - }, [_unit, _anim], 0.5] call CBA_fnc_waitAndExecute; - }; + if (_resetUncon) then { + TRACE_1("resuming setUnconscious",_unit); + // This should reset the unit to an Unconscious animation + // Also has the hilarious effect of violently ragdolling the guy + _unit setUnconscious true; }; -}, [_unit, _emptyPos], 0.5] call CBA_fnc_waitAndExecute; + + // ToDo [medical-rewrite]: verify we can remove the following commented code + + // if !([_unit] call FUNC(isAwake)) then { + // TRACE_1("Check if isAwake", [_unit] call FUNC(isAwake)); + + // if (driver _unit == _unit) then { + // private _anim = [_unit] call FUNC(getDeathAnim); + + // [_unit, _anim, 1, true] call FUNC(doAnimation); + + // [{ + // params ["_unit", "_anim"]; + // if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { + // [_unit, _anim, 2, true] call FUNC(doAnimation); + // }; + // }, [_unit, _anim], 0.5] call CBA_fnc_waitAndExecute; + // }; + // }; +}, [_unit, _emptyPos, _resetUncon], 0.5] call CBA_fnc_waitAndExecute; [_unit, false, GROUP_SWITCH_ID, side group _unit] call FUNC(switchToGroupSide); diff --git a/addons/common/scripts/checkVersionNumber.sqf b/addons/common/scripts/checkVersionNumber.sqf index 77af9572f2..5d4b1734e4 100644 --- a/addons/common/scripts/checkVersionNumber.sqf +++ b/addons/common/scripts/checkVersionNumber.sqf @@ -4,13 +4,14 @@ private _aceWhitelist = missionNamespace getVariable ["ACE_Version_Whitelist", []]; private _files = CBA_common_addons select { (_x select [0,3] != "a3_") && - {_x select [0,4] != "ace_"} && + {_x select [0,4] != "ace_"} && {!((toLower _x) in _aceWhitelist)} }; private _versions = []; { - private _version = parseNumber getText (configFile >> "CfgPatches" >> _x >> "version"); + getText (configFile >> "CfgPatches" >> _x >> "version") splitString "." params [["_major", "0"], ["_minor", "0"]]; + private _version = parseNumber _major + parseNumber _minor/100; _versions set [_forEachIndex, _version]; } forEach _files; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 4206a6adad..5e354ab8e2 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -26,6 +26,20 @@ ACE-Team ACE-製作團隊 ACE-制作团队 + + + Advanced + Усложненный + Zaawansowany + Avanzado + Erweitert + Pokročilé + Avançada + Avancée + Fejlett + Avanzato + アドバンスド + 고급 Save @@ -395,6 +409,20 @@ 알 수 없음 未知的 未知的 + + + Normal + Normal + Normale + Нормальное + Normale + Normalne + Normal + Normális + Normální + Normal + 通常 + 보통 No Voice @@ -969,6 +997,51 @@ 활성화 啟用 启用 + + + Always + + + Anywhere + Где угодно + Wszędzie + Donde sea + Überall + Kdekoliv + Qualquer lugar + PArtout + Akárhol + Ovunque + どこでも + 어디서나 + + + Basic + Базовый + Podstawowy + Básico + Standard + Základní + Básica + Basique + Alap + Basico + ベーシック + 기본 + + + Medical vehicles + В медицинском транспорте + Pojazdy medyczne + Vehiculos médicos + Sanitätsfahrzeuge + Zdravotnická vozidla + Veículos médcos + Dans les véhicules médicals + Orvosi járművek + Veicoli medici + 医療車両のみ + 의료차량 Yes @@ -1002,6 +1075,12 @@ + + Confirm + + + Never + Vehicles only Nur Fahrzeuge diff --git a/addons/cookoff/ACE_Settings.hpp b/addons/cookoff/ACE_Settings.hpp index 304aaf48e0..ba4447dba9 100644 --- a/addons/cookoff/ACE_Settings.hpp +++ b/addons/cookoff/ACE_Settings.hpp @@ -1,40 +1,18 @@ class ACE_Settings { class GVAR(enable) { - category = CSTRING(displayName); - displayName = CSTRING(enable_name); - description = CSTRING(enable_tooltip); - value = 0; - typeName = "BOOL"; + movedToSqf = 1; }; class GVAR(enableAmmobox) { - category = CSTRING(displayName); - displayName = CSTRING(enableBoxCookoff_name); - description = CSTRING(enableBoxCookoff_tooltip); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(enableAmmoCookoff) { // For CBA Setting Switch: we can eliminate and just use (ammoCookoffDuration == 0) - category = CSTRING(displayName); - displayName = CSTRING(enableAmmoCookoff_name); - description = CSTRING(enableAmmoCookoff_tooltip); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(ammoCookoffDuration) { - category = CSTRING(displayName); - displayName = CSTRING(ammoCookoffDuration_name); - description = CSTRING(ammoCookoffDuration_tooltip); - value = 1; - typeName = "SCALAR"; - sliderSettings[] = {0, 5, 1, 1}; + movedToSQF = 1; }; class GVAR(probabilityCoef) { - category = CSTRING(displayName); - displayName = CSTRING(probabilityCoef_name); - description = CSTRING(probabilityCoef_tooltip); - value = 1; - typeName = "SCALAR"; - sliderSettings[] = {0, 5, 1, 1}; + movedToSQF = 1; }; }; diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 04e7762a41..caffc6b90b 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -7,8 +7,8 @@ class Cfg3DEN { class GVAR(enable) { property = QGVAR(enable); control = "Checkbox"; - displayName = CSTRING(enable_name); - tooltip = CSTRING(enable_tooltip); + displayName = CSTRING(enable_hd_name); + tooltip = CSTRING(enable_hd_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; condition = "objectVehicle"; diff --git a/addons/cookoff/XEH_preInit.sqf b/addons/cookoff/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/cookoff/XEH_preInit.sqf +++ b/addons/cookoff/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/cookoff/initSettings.sqf b/addons/cookoff/initSettings.sqf new file mode 100644 index 0000000000..b29d213427 --- /dev/null +++ b/addons/cookoff/initSettings.sqf @@ -0,0 +1,51 @@ +// CBA Settings [ADDON: ace_cookoff]: + +[ + QGVAR(enable), "CHECKBOX", + [LSTRING(enable_hd_name), LSTRING(enable_hd_tooltip)], + LSTRING(category_displayName), + false, // default value + true, // isGlobal + {[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(enableAmmobox), "CHECKBOX", + [LSTRING(enableBoxCookoff_name), LSTRING(enableBoxCookoff_tooltip)], + LSTRING(category_displayName), + true, // default value + true, // isGlobal + {[QGVAR(enableAmmobox), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(enableAmmoCookoff), "CHECKBOX", + [LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)], + LSTRING(category_displayName), + true, // default value + true, // isGlobal + {[QGVAR(enableAmmoCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(ammoCookoffDuration), "SLIDER", + [LSTRING(ammoCookoffDuration_name), LSTRING(ammoCookoffDuration_tooltip)], + LSTRING(category_displayName), + [0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(ammoCookoffDuration), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(probabilityCoef), "SLIDER", + [LSTRING(probabilityCoef_name), LSTRING(probabilityCoef_tooltip)], + LSTRING(category_displayName), + [0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(probabilityCoef), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index b561d0b89b..536700cc87 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -1,42 +1,22 @@ - - Cook off - Esplosione - 殉爆效果 - 殉爆效果 - 誘爆 - 쿡오프 - Durchzündung - Cook off - Samozapłon + + ACE Cook off + ACE Esplosione + ACE 殉爆效果 + ACE 殉爆效果 + ACE 誘爆 + ACE 쿡오프 + ACE Durchzündung + ACE Cook off + ACE Samozapłon - - Enable cook off - Durchzündung ermöglichen - Povolit explozi munice - Включить воспламенение - 誘爆を有効化 - 쿡오프 현상 활성화 - Aktywuj efekty samozapłonu amunicji - Activer le cook off - Abilita Esplosione - 開啟殉爆效果 - 开启殉爆效果 + + Damage handling and turret effects - - Enables cook off and related vehicle destruction effects. - Ermöglicht Durchzündung und zugehörige Fahrzeug-Zerstörungseffekte. - Povolí explozi munice a její následné ničivé efekty. - Включает воспламенение и сопутствующие эффекты повреждения техники. - 誘爆を有効化し、車両が誘爆によって破壊されていきます。 - 쿡오프 현상을 활성화 하고 관련된 차량에 폭발 이펙트를 적용합니다. - Aktywuje efekt samozapłonu amunicji na zniszczonych pojazdach. - Active le cook-off (autocombustion des munitions) et les effets de destruction liés. - Abilita l'esplosione e i relativi effetti di distruzione del veicolo. - 開啟此功能後,將使有關載具在損毀時有殉爆的效果 - 开启此功能后,将使有关载具在损毁时有殉爆的效果。 + + Changes damage handling for cook off and turret explosion effects Wreck (Turret) diff --git a/addons/disarming/config.cpp b/addons/disarming/config.cpp index e38f4346ab..5b81e5faf5 100644 --- a/addons/disarming/config.cpp +++ b/addons/disarming/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {"ACE_DebugPotato"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_Interaction"}; + requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); authors[] = {"PabstMirror"}; url = ECSTRING(main,URL); diff --git a/addons/dragging/CfgVehicles.hpp b/addons/dragging/CfgVehicles.hpp index 9d5389efd8..4c43dd814e 100644 --- a/addons/dragging/CfgVehicles.hpp +++ b/addons/dragging/CfgVehicles.hpp @@ -171,7 +171,7 @@ class CfgVehicles { GVAR(canDrag) = 1; GVAR(dragPosition[]) = {0,1.2,0}; - GVAR(dragDirection) = 0; + GVAR(dragDirection) = 270; }; class MetalCase_01_base_F: Items_base_F { class EventHandlers { @@ -213,7 +213,7 @@ class CfgVehicles { }; GVAR(canCarry) = 1; GVAR(carryPosition[]) = {0,1,1}; - GVAR(carryDirection) = 270; + GVAR(carryDirection) = 0; GVAR(canDrag) = 1; GVAR(dragPosition[]) = {0,1.4,0}; diff --git a/addons/dragging/XEH_postInit.sqf b/addons/dragging/XEH_postInit.sqf index 2dbf47f3cc..f2cb60c646 100644 --- a/addons/dragging/XEH_postInit.sqf +++ b/addons/dragging/XEH_postInit.sqf @@ -30,8 +30,7 @@ if (isNil "ACE_maxWeightCarry") then { //@todo Captivity? //Add Keybind: -["ACE3 Common", QGVAR(drag), (localize LSTRING(DragKeybind)), -{ +["ACE3 Common", QGVAR(drag), (localize LSTRING(DragKeybind)), { if (!alive ACE_player) exitWith {false}; if !([ACE_player, objNull, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -51,7 +50,6 @@ if (isNil "ACE_maxWeightCarry") then { [ACE_player, _cursor] call FUNC(startDrag); false -}, -{false}, -[-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND - +}, { + false +}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index 6361dcc66d..6204bbae62 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -24,7 +24,7 @@ #endif params ["_args", "_idPFH"]; -_args params ["_unit","_target", "_startTime"]; +_args params ["_unit", "_target", "_startTime"]; if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { TRACE_2("carry false",_unit,_target); @@ -35,7 +35,7 @@ if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { if (!alive _target || {_unit distance _target > 10}) then { TRACE_2("dead/distance",_unit,_target); if ((_unit distance _target > 10) && {(CBA_missionTime - _startTime) < 1}) exitWith { - //attachTo seems to have some kind of network delay and target can return an odd position durring the first few frames, + //attachTo seems to have some kind of network delay and target can return an odd position during the first few frames, //so wait a full second to exit if out of range (this is critical as we would otherwise detach and set it's pos to weird pos) TRACE_3("ignoring bad distance at start",_unit distance _target,_startTime,CBA_missionTime); }; diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index dd18e0c825..a45a26ae89 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -24,7 +24,7 @@ #endif params ["_args", "_idPFH"]; -_args params ["_unit","_target", "_startTime"]; +_args params ["_unit", "_target", "_startTime"]; if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { TRACE_2("drag false",_unit,_target); @@ -35,7 +35,7 @@ if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { if (!alive _target || {_unit distance _target > 10}) then { TRACE_2("dead/distance",_unit,_target); if ((_unit distance _target > 10) && {(CBA_missionTime - _startTime) < 1}) exitWith { - //attachTo seems to have some kind of network delay and target can return an odd position durring the first few frames, + //attachTo seems to have some kind of network delay and target can return an odd position during the first few frames, //so wait a full second to exit if out of range (this is critical as we would otherwise detach and set it's pos to weird pos) TRACE_3("ignoring bad distance at start",_unit distance _target,_startTime,CBA_missionTime); }; diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index fde2a7f6d7..84bbd90342 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -76,3 +76,10 @@ if (_unit getVariable ["ACE_isUnconscious", false]) then { if (_target getVariable [QGVAR(isUAV), false]) then { createVehicleCrew _target; }; + +// reset mass +private _mass = _target getVariable [QGVAR(originalMass), 0]; + +if (_mass != 0) then { + [QEGVAR(common,setMass), [_target, _mass], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf index ae7bd3598e..b6507898ca 100644 --- a/addons/dragging/functions/fnc_dropObject_carry.sqf +++ b/addons/dragging/functions/fnc_dropObject_carry.sqf @@ -17,7 +17,7 @@ */ params ["_unit", "_target"]; -TRACE_2("params",_unit,_target); +TRACE_1("params",_this); // remove drop action [_unit, "DefaultAction", _unit getVariable [QGVAR(ReleaseActionID), -1]] call EFUNC(common,removeActionEventHandler); @@ -76,3 +76,10 @@ if !(_target isKindOf "CAManBase") then { if (_target getVariable [QGVAR(isUAV), false]) then { createVehicleCrew _target; }; + +// reset mass +private _mass = _target getVariable [QGVAR(originalMass), 0]; + +if (_mass != 0) then { + [QEGVAR(common,setMass), [_target, _mass], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/dragging/functions/fnc_handleUnconscious.sqf b/addons/dragging/functions/fnc_handleUnconscious.sqf index ba399aee49..fd3f95f95d 100644 --- a/addons/dragging/functions/fnc_handleUnconscious.sqf +++ b/addons/dragging/functions/fnc_handleUnconscious.sqf @@ -29,10 +29,9 @@ if (_player getVariable [QGVAR(isDragging), false]) then { }; // handle waking up dragged unit - //if (_unit == _draggedObject) then { - // [_player, _draggedObject] call FUNC(dropObject); - //}; - + if (_unit == _draggedObject) then { + [_player, _draggedObject] call FUNC(dropObject); + }; }; if (_player getVariable [QGVAR(isCarrying), false]) then { @@ -45,8 +44,7 @@ if (_player getVariable [QGVAR(isCarrying), false]) then { }; // handle waking up dragged unit - //if (_unit == _carriedObject) then { - // [_player, _carriedObject] call FUNC(dropObject_carry); - //}; - + if (_unit == _carriedObject) then { + [_player, _carriedObject] call FUNC(dropObject_carry); + }; }; diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf index 0366879d2b..729fec2a4e 100644 --- a/addons/dragging/functions/fnc_startCarry.sqf +++ b/addons/dragging/functions/fnc_startCarry.sqf @@ -73,3 +73,11 @@ _unit setVariable [QGVAR(isCarrying), true, true]; _unit setVariable [QGVAR(carriedObject), _target, true]; [FUNC(startCarryPFH), 0.2, [_unit, _target, _timer]] call CBA_fnc_addPerFrameHandler; + +// disable collisions by setting the physx mass to almost zero +private _mass = getMass _target; + +if (_mass > 1) then { + _target setVariable [QGVAR(originalMass), _mass, true]; + [QEGVAR(common,setMass), [_target, 1e-12], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index da8a99edf3..7a4c8908d3 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -61,3 +61,11 @@ if (_target isKindOf "CAManBase") then { _unit setVariable [QGVAR(isDragging), true, true]; [FUNC(startDragPFH), 0.2, [_unit, _target, CBA_missionTime + 5]] call CBA_fnc_addPerFrameHandler; + +// disable collisions by setting the physx mass to almost zero +private _mass = getMass _target; + +if (_mass > 1) then { + _target setVariable [QGVAR(originalMass), _mass, true]; + [QEGVAR(common,setMass), [_target, 1e-12], _target] call CBA_fnc_targetEvent; +}; diff --git a/addons/explosives/functions/fnc_openTimerUI.sqf b/addons/explosives/functions/fnc_openTimerUI.sqf index 05d340e8dd..b7715d08a2 100644 --- a/addons/explosives/functions/fnc_openTimerUI.sqf +++ b/addons/explosives/functions/fnc_openTimerUI.sqf @@ -15,6 +15,9 @@ * Public: No */ +#define TIMER_VALUE_MIN_CUSTOM (missionNamespace getVariable [QGVAR(customTimerMin), TIMER_VALUE_MIN]) +#define TIMER_VALUE_MAX_CUSTOM (missionNamespace getVariable [QGVAR(customTimerMax), TIMER_VALUE_MAX]) + params ["_explosive"]; TRACE_1("Opening timer UI",_explosive); @@ -23,6 +26,9 @@ private _display = uiNamespace getVariable [QGVAR(timerDisplay), displayNull]; // Update slider speed to 1s (_display displayCtrl IDC_TIMER_SLIDER) sliderSetSpeed [1, 1]; +(_display displayCtrl IDC_TIMER_SLIDER) sliderSetRange [TIMER_VALUE_MIN_CUSTOM, TIMER_VALUE_MAX_CUSTOM]; +(_display displayCtrl IDC_TIMER_SLIDER) sliderSetPosition (TIMER_VALUE_DEFAULT max TIMER_VALUE_MIN_CUSTOM min TIMER_VALUE_MAX_CUSTOM); + // Add confirm button action GVAR(explosive) = _explosive; @@ -52,7 +58,7 @@ _display displayAddEventHandler ["MouseZChanged", { if (cba_events_control) then {_change = _change * 10}; private _slider = _display displayCtrl IDC_TIMER_SLIDER; - private _value = (sliderPosition _slider + _change) max TIMER_VALUE_MIN min TIMER_VALUE_MAX; + private _value = (sliderPosition _slider + _change) max TIMER_VALUE_MIN_CUSTOM min TIMER_VALUE_MAX_CUSTOM; _slider sliderSetPosition _value; }]; diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp index 6dfd06ff72..2d03ddcee0 100644 --- a/addons/fastroping/CfgVehicles.hpp +++ b/addons/fastroping/CfgVehicles.hpp @@ -75,8 +75,13 @@ class CfgVehicles { }; class ACE_cutRopes { displayName = CSTRING(Interaction_cutRopes); - condition = [_target] call FUNC(canCutRopes); - statement = [_target] call FUNC(cutRopes); + condition = QUOTE(true); + statement = ""; + class confirmCutRopes { + displayName = ECSTRING(common,confirm); + condition = QUOTE([_target] call FUNC(canCutRopes)); + statement = QUOTE([_target] call FUNC(cutRopes)); + }; }; class ACE_fastRope { displayName = CSTRING(Interaction_fastRope); diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index 4921bd42d9..ccaedff0d4 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -72,7 +72,7 @@ private _gBlackOut = MAXVIRTUALG / _classCoef + MAXVIRTUALG / _suitCoef - MAXVIR // Unconsciousness if ((_average > _gBlackOut) and {isClass (configFile >> "CfgPatches" >> "ACE_Medical") and {!(ACE_player getVariable ["ACE_isUnconscious", false])}}) then { - [ACE_player, true, (10 + floor(random 5))] call EFUNC(medical,setUnconscious); + [ACE_player, true, (10 + floor(random 5)), true] call EFUNC(medical,setUnconscious); }; GVAR(GForces_CC) ppEffectAdjust [1,1,0,[0,0,0,1],[0,0,0,0],[1,1,1,1],[10,10,0,0,0,0.1,0.5]]; diff --git a/addons/hellfire/CfgMagazineWells.hpp b/addons/hellfire/CfgMagazineWells.hpp new file mode 100644 index 0000000000..5077d2faa6 --- /dev/null +++ b/addons/hellfire/CfgMagazineWells.hpp @@ -0,0 +1,4 @@ +class CfgMagazineWells { + class GVAR(K) {}; + class GVAR(N) {}; +}; diff --git a/addons/hellfire/CfgWeapons.hpp b/addons/hellfire/CfgWeapons.hpp index 1d7f167aad..b040f67d1d 100644 --- a/addons/hellfire/CfgWeapons.hpp +++ b/addons/hellfire/CfgWeapons.hpp @@ -6,7 +6,7 @@ class CfgWeapons { EGVAR(laser,canSelect) = 1; // can ace_laser lock (allows switching laser code) EGVAR(laser,showHud) = 1; // show attack profile / lock on hud magazines[] = {"6Rnd_ACE_Hellfire_AGM114K", "PylonMissile_1Rnd_ACE_Hellfire_AGM114K", "PylonRack_1Rnd_ACE_Hellfire_AGM114K", "PylonRack_3Rnd_ACE_Hellfire_AGM114K", "PylonRack_4Rnd_ACE_Hellfire_AGM114K"}; - + magazineWell[] = {QGVAR(K)}; autoFire = 0; canLock = 0; weaponLockSystem = 0; @@ -14,7 +14,7 @@ class CfgWeapons { lockedTargetSound[] = {"",0,1}; soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1",1,1.1,700}; nameSound = "MissileLauncher"; - sounds[] = {"StandardSound"}; + sounds[] = {"StandardSound"}; class StandardSound { begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_1",1.12202,1.3,1000}; soundBegin[] = {"begin1",1}; @@ -27,5 +27,6 @@ class CfgWeapons { class GVAR(launcher_N): GVAR(launcher) { displayName = "AGM-114N Hellfire II"; magazines[] = {"6Rnd_ACE_Hellfire_AGM114N", "PylonMissile_1Rnd_ACE_Hellfire_AGM114N", "PylonRack_1Rnd_ACE_Hellfire_AGM114N", "PylonRack_3Rnd_ACE_Hellfire_AGM114N", "PylonRack_4Rnd_ACE_Hellfire_AGM114N"}; + magazineWell[] = {QGVAR(N)}; }; }; diff --git a/addons/hellfire/config.cpp b/addons/hellfire/config.cpp index 8df1594612..911e016d7f 100644 --- a/addons/hellfire/config.cpp +++ b/addons/hellfire/config.cpp @@ -18,5 +18,6 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" +#include "CfgMagazineWells.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/hitreactions/functions/fnc_fallDown.sqf b/addons/hitreactions/functions/fnc_fallDown.sqf index 08c7282ab7..4b305700e0 100644 --- a/addons/hitreactions/functions/fnc_fallDown.sqf +++ b/addons/hitreactions/functions/fnc_fallDown.sqf @@ -36,11 +36,6 @@ if (_unit == ACE_player) then { addCamShake [3, 5, _damage + random 10]; }; -// play scream sound -if (!isNil QEFUNC(medical,playInjuredSound)) then { - [_unit,_damage] call EFUNC(medical,playInjuredSound); -}; - private _vehicle = vehicle _unit; // handle static weapons diff --git a/addons/interaction/RscTitles.hpp b/addons/interaction/RscTitles.hpp index b619ed594c..e157fd696c 100644 --- a/addons/interaction/RscTitles.hpp +++ b/addons/interaction/RscTitles.hpp @@ -67,7 +67,7 @@ class RscACE_SelectAnItem { text = ""; }; class itemList: RscListBox { - onMouseButtonDblClick = "_this call ACE_Interaction_fnc_onSelectMenuDblClick"; + onMouseButtonDblClick = QUOTE(_this call DFUNC(onSelectMenuDblClick)); idc = 8866; x = X_OFFSET + 0.005; w = 0.59; @@ -106,7 +106,7 @@ class RscACE_SelectAnItem { y = 0.605; style = 2; text = CSTRING(Back); - action = "call ACE_Interaction_fnc_hideMenu;"; //'Default' call ACE_Interaction_fnc_openMenu; 'Default' call ACE_Interaction_fnc_openMenuSelf; + action = QUOTE(call DFUNC(hideMenu);); //'Default' call DFUNC(openMenu); 'Default' call DFUNC(openMenuSelf); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; colorBackgroundActive[] = {1,1,1,0.2}; @@ -120,7 +120,7 @@ class RscACE_SelectAnItem { w = 0.15; style = 2; text = CSTRING(MakeSelection); - action = "call ACE_Interaction_fnc_hideMenu;"; + action = QUOTE(call DFUNC(hideMenu);); colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; colorBackgroundActive[] = {1,1,1,0.2}; diff --git a/addons/interaction/functions/fnc_canPassMagazine.sqf b/addons/interaction/functions/fnc_canPassMagazine.sqf index f25e5da164..5cc1ed96e2 100644 --- a/addons/interaction/functions/fnc_canPassMagazine.sqf +++ b/addons/interaction/functions/fnc_canPassMagazine.sqf @@ -19,11 +19,12 @@ params ["_player", "_target", "_weapon"]; if (!GVAR(enableMagazinePassing)) exitWith {false}; +if (_weapon isEqualTo "") exitWith {false}; if (((vehicle _target) != _target) && {(vehicle _target) != (vehicle _player)}) exitWith {false}; -private _compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines"); -{ +private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; + +(magazinesAmmoFull _player) findIf { _x params ["_className", "", "_loaded"]; - if ((_className in _compatibleMags) && {!_loaded} && {_target canAdd _className}) exitWith {true}; - false -} foreach (magazinesAmmoFull _player); + (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} +} > -1 diff --git a/addons/interaction/functions/fnc_getVehiclePos.sqf b/addons/interaction/functions/fnc_getVehiclePos.sqf index 2da5a31820..bd25fc710b 100644 --- a/addons/interaction/functions/fnc_getVehiclePos.sqf +++ b/addons/interaction/functions/fnc_getVehiclePos.sqf @@ -56,7 +56,7 @@ if (_cameraPosASL select 2 >= 0) then { _pos set [2, (_pos select 2) min _dz]; }; -TRACE_4("",_bb,_bbX,_relPos,_pos,_cameraPosASL); +TRACE_5("",_bb,_bbX,_relPos,_pos,_cameraPosASL); _pos /////////////////// diff --git a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf index 186d424956..17f77922b9 100644 --- a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf +++ b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf @@ -59,5 +59,5 @@ if (_cameraPosASL select 2 >= 0) then { _pos set [2, (_pos select 2) min _dz]; }; -TRACE_4("",_bb,_bbX,_relPos,_pos,_cameraPosASL); +TRACE_5("",_bb,_bbX,_relPos,_pos,_cameraPosASL); _pos diff --git a/addons/interaction/functions/fnc_passMagazine.sqf b/addons/interaction/functions/fnc_passMagazine.sqf index c52e40e88f..07db3dba3c 100644 --- a/addons/interaction/functions/fnc_passMagazine.sqf +++ b/addons/interaction/functions/fnc_passMagazine.sqf @@ -12,21 +12,24 @@ * None * * Example: - * [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_magToPassazine + * [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_passMagazine * * Public: No */ params ["_player", "_target", "_weapon"]; -private _compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines"); -private _filteredMags = magazinesAmmoFull _player select {(_x select 0) in _compatibleMags && {!(_x select 2)}}; +private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; +private _filteredMags = magazinesAmmoFull _player select { + _x params ["_className", "", "_loaded"]; + (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} +}; //select magazine with most ammo private _magToPass = _filteredMags select 0; private _magToPassIndex = 0; { _x params ["_className", "_ammoCount"]; - if ((_ammoCount > (_magToPass select 1)) && (_target canAdd _className)) then { + if (_ammoCount > (_magToPass select 1)) then { _magToPass = _x; _magToPassIndex = _forEachIndex; }; diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index 36639a02d7..7c2946abae 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -25,7 +25,7 @@ if ((_button == 0) && {GVAR(freedrawing) || _ctrlKey}) exitWith { if (GVAR(freedrawing) && {_dir == 0}) then { GVAR(freedrawing) = false; GVAR(drawPosEnd) = _control ctrlMapScreenToWorld [_screenPosX, _screenPosY]; - TRACE_1("Ending Line",GVAR(freedrawing),GVAR(drawPosEnd)); + TRACE_2("Ending Line",GVAR(freedrawing),GVAR(drawPosEnd)); [{ if (allMapMarkers isEqualTo []) exitWith {}; private _markerName = allMapMarkers select (count allMapMarkers - 1); diff --git a/addons/markers/functions/fnc_setMarkerJIP.sqf b/addons/markers/functions/fnc_setMarkerJIP.sqf index ba7dc68a5b..9c9aea9fd7 100644 --- a/addons/markers/functions/fnc_setMarkerJIP.sqf +++ b/addons/markers/functions/fnc_setMarkerJIP.sqf @@ -18,7 +18,7 @@ */ params ["_allMapMarkers", "_allMapMarkersProperties"]; -TRACE_3("params",_allMapMarkers,_allMapMarkersProperties); +TRACE_2("params",_allMapMarkers,_allMapMarkersProperties); { private _index = _allMapMarkers find _x; diff --git a/addons/medical/$PBOPREFIX$ b/addons/medical/$PBOPREFIX$ index 72c25436dd..15ed1394ed 100644 --- a/addons/medical/$PBOPREFIX$ +++ b/addons/medical/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\medical +z\ace\addons\medical \ No newline at end of file diff --git a/addons/medical/ACE_Medical_Actions.hpp b/addons/medical/ACE_Medical_Actions.hpp deleted file mode 100644 index 64fc82dbec..0000000000 --- a/addons/medical/ACE_Medical_Actions.hpp +++ /dev/null @@ -1,789 +0,0 @@ - -class ACE_Head { - displayName = CSTRING(Head); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(treatment)); - EXCEPTIONS - }; - class CheckResponse: CheckPulse { - displayName = CSTRING(Check_Response); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Diagnose: CheckPulse { - displayName = CSTRING(Actions_Diagnose); - condition = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; -class ACE_Torso { - displayName = CSTRING(Torso); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - enableInside = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PlaceInBodyBag { - displayName = CSTRING(PlaceInBodyBag); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'BodyBag')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'BodyBag')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - enableInside = 1; - }; - class TriageCard { - displayName = CSTRING(Actions_TriageCard); - distance = 2.0; - condition = "true"; - statement = QUOTE([ARR_2(_target, true)] call DFUNC(displayTriageCard)); - EXCEPTIONS - showDisabled = 1; - enableInside = 1; - icon = QPATHTOF(UI\icons\triageCard.paa); - }; - class Diagnose { - displayName = CSTRING(Actions_Diagnose); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'Diagnose')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'Diagnose')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = ""; - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - enableInside = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class SurgicalKit: fieldDressing { - displayName = CSTRING(Use_SurgicalKit); - condition = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\surgicalKit.paa); - }; - class PersonalAidKit: fieldDressing { - displayName = CSTRING(Use_Aid_Kit); - condition = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CPR: fieldDressing { - displayName = CSTRING(Actions_CPR); - condition = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; -}; -class ACE_ArmLeft { - displayName = ECSTRING(interaction,ArmLeft); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; -class ACE_ArmRight { - displayName = ECSTRING(interaction,ArmRight); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(treatment)); - EXCEPTIONS - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; - -}; -class ACE_LegLeft { - displayName = ECSTRING(interaction,LegLeft); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; -class ACE_LegRight { - displayName = ECSTRING(interaction,LegRight); - runOnHover = 1; - statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); - ACTION_CONDITION - modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\medical_cross.paa); - distance = MEDICAL_ACTION_DISTANCE; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(treatment)); - EXCEPTIONS - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(treatment)); - EXCEPTIONS - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(treatment)); - EXCEPTIONS - icon = QPATHTOF(UI\icons\iv.paa); - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_500')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_500')] call DFUNC(treatment)); - EXCEPTIONS - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_250')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_250')] call DFUNC(treatment)); - EXCEPTIONS - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(treatment)); - EXCEPTIONS - }; -}; diff --git a/addons/medical/ACE_Medical_SelfActions.hpp b/addons/medical/ACE_Medical_SelfActions.hpp deleted file mode 100644 index b63fd8fb42..0000000000 --- a/addons/medical/ACE_Medical_SelfActions.hpp +++ /dev/null @@ -1,520 +0,0 @@ -class Medical { - displayName = CSTRING(Actions_Medical); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - condition = QUOTE(GVAR(menuTypeStyleSelf)); - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class ACE_Head { - displayName = CSTRING(Head); - icon = QPATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - runOnHover = 1; - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(treatment)); - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(treatment)); - }; - }; - class ACE_Torso { - displayName = CSTRING(Torso); - distance = 5.0; - condition = "true"; - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - class TriageCard { - displayName = CSTRING(Actions_TriageCard); - distance = 2.0; - condition = "true"; - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_2(_target, true)] call DFUNC(displayTriageCard)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\triageCard.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - }; - class ACE_ArmLeft { - displayName = ECSTRING(interaction,ArmLeft); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(treatment)); - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; - class ACE_ArmRight { - displayName = ECSTRING(interaction,ArmRight); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(treatment)); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(treatment)); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment)); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment)); - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(treatment)); - icon = ""; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; - class ACE_LegLeft { - displayName = ECSTRING(interaction,LegLeft); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(treatment)); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(treatment)); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; - class ACE_LegRight { - displayName = ECSTRING(interaction,LegRight); - runOnHover = 1; - exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; - statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); - modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); - condition = "true"; - icon = QPATHTOF(UI\icons\medical_cross.paa); - - class Bandage { - displayName = CSTRING(Bandage); - distance = 2.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(treatment)); - showDisabled = 1; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - - - // Advanced medical - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - distance = 5.0; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(treatment)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\bandage.paa); - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\packingBandage.paa); - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(treatment)); - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(treatment)); - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Actions_Tourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\tourniquet.paa); - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Adenosine')] call DFUNC(treatment)); - icon = QPATHTOF(UI\icons\autoInjector.paa); - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment)); - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment)); - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); - exceptions[] = {"isNotInside", "isNotSwimming"}; - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(treatment)); - }; - }; -}; diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp deleted file mode 100644 index 84d22070f2..0000000000 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ /dev/null @@ -1,1346 +0,0 @@ - -class ACE_Medical_Actions { - class Basic { - class Bandage { - displayName = CSTRING(Bandage); - displayNameProgress = CSTRING(Bandaging); - category = "bandage"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"All"}; - allowSelfTreatment = 1; - requiredMedic = 0; - treatmentTime = 5; - treatmentTimeSelfCoef = 1; - items[] = {{"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}}; - condition = ""; - patientStateCondition = 0; - itemConsumed = 1; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_bandage)); - callbackFailure = ""; - callbackProgress = ""; - - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"}; - animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - litter[] = { - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class Morphine: Bandage { - displayName = CSTRING(Inject_Morphine); - displayNameProgress = CSTRING(Injecting_Morphine); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 1; - category = "medication"; - treatmentTime = 2; - items[] = {"ACE_morphine"}; - callbackSuccess = QUOTE(DFUNC(treatmentBasic_morphine)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; - }; - class Epinephrine: Bandage { - displayName = CSTRING(Inject_Epinephrine); - displayNameProgress = CSTRING(Injecting_Epinephrine); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 1; - category = "medication"; - requiredMedic = QGVAR(medicSetting_basicEpi); - treatmentTime = 3; - items[] = {"ACE_epinephrine"}; - callbackSuccess = QUOTE(DFUNC(treatmentBasic_epipen)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; - treatmentLocations[] = {QGVAR(useLocation_basicEpi)}; - }; - class BloodIV: Bandage { - displayName = CSTRING(Transfuse_Blood); - displayNameProgress = CSTRING(Transfusing_Blood); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 0; - category = "advanced"; - requiredMedic = 1; - treatmentTime = 7; - items[] = {"ACE_bloodIV"}; - // callbackSuccess = QUOTE(DFUNC(treatmentBasic_bloodbag)); - callbackSuccess = QUOTE(DFUNC(treatmentIV)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = {}; - }; - class BloodIV_500: BloodIV { - category = "advanced"; - items[] = {"ACE_bloodIV_500"}; - }; - class BloodIV_250: BloodIV { - category = "advanced"; - items[] = {"ACE_bloodIV_250"}; - }; - class BodyBag: Bandage { - displayName = CSTRING(PlaceInBodyBag); - displayNameProgress = CSTRING(PlacingInBodyBag); - category = "advanced"; - treatmentLocations[] = {"All"}; - requiredMedic = 0; - treatmentTime = 4; - items[] = {"ACE_bodyBag"}; - condition = "!alive (_this select 1);"; - callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationPatientUnconscious = ""; - itemConsumed = 1; - litter[] = {}; - }; - class Diagnose: Bandage { - displayName = CSTRING(Actions_Diagnose); - displayNameProgress = CSTRING(Actions_Diagnosing); - category = "examine"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"head", "body"}; - requiredMedic = 0; - treatmentTime = 1; - items[] = {}; - callbackSuccess = QUOTE(DFUNC(actionDiagnose)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationCaller = ""; // TODO - itemConsumed = 0; - litter[] = {}; - }; - class CPR: Bandage { - displayName = CSTRING(Actions_CPR); - displayNameProgress = CSTRING(Actions_PerformingCPR); - category = "advanced"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"body"}; - allowSelfTreatment = 0; - requiredMedic = 0; - treatmentTime = 15; - items[] = {}; - condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && GVAR(enableRevive)>0); - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); - callbackFailure = ""; - callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)"; - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - animationCallerSelf = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; - litter[] = {}; - }; - }; - - class Advanced { - class FieldDressing { - displayName = CSTRING(Actions_FieldDressing); - displayNameProgress = CSTRING(Bandaging); - category = "bandage"; - // Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All. - treatmentLocations[] = {"All"}; - allowedSelections[] = {"All"}; - allowSelfTreatment = 1; - // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor - requiredMedic = 0; - // The time it takes for a treatment action to complete. Time is in seconds. - treatmentTime = 8; - // Item required for the action. Leave empty for no item required. - items[] = {"ACE_fieldDressing"}; - condition = ""; - patientStateCondition = 0; - // Callbacks - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_bandage)); - callbackFailure = ""; - callbackProgress = ""; - itemConsumed = 1; - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"}; - animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - litter[] = { - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class PackingBandage: fieldDressing { - displayName = CSTRING(Actions_PackingBandage); - items[] = {"ACE_packingBandage"}; - litter[] = { - {"All", "", {"ACE_MedicalLitter_packingBandage"}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class ElasticBandage: fieldDressing { - displayName = CSTRING(Actions_ElasticBandage); - items[] = {"ACE_elasticBandage"}; - }; - class QuikClot: fieldDressing { - displayName = CSTRING(Actions_QuikClot); - items[] = {"ACE_quikclot"}; - litter[] = { - {"All", "", {"ACE_MedicalLitter_QuickClot"}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class Tourniquet: fieldDressing { - displayName = CSTRING(Apply_Tourniquet); - displayNameProgress = CSTRING(Applying_Tourniquet); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - items[] = {"ACE_tourniquet"}; - treatmentTime = 4; - callbackSuccess = QUOTE(DFUNC(treatmentTourniquet)); - condition = QUOTE(!([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo))); - litter[] = {}; - }; - class Morphine: fieldDressing { - displayName = CSTRING(Inject_Morphine); - displayNameProgress = CSTRING(Injecting_Morphine); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - category = "medication"; - items[] = {"ACE_morphine"}; - treatmentTime = 3; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_medication)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; - }; - class Adenosine: Morphine { - displayName = CSTRING(Inject_Adenosine); - displayNameProgress = CSTRING(Injecting_Adenosine); - items[] = {"ACE_adenosine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_adenosine"}} }; - }; - class Atropine: Morphine { - displayName = CSTRING(Inject_Atropine); - displayNameProgress = CSTRING(Injecting_Atropine); - items[] = {"ACE_atropine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_atropine"}} }; - }; - class Epinephrine: Morphine { - displayName = CSTRING(Inject_Epinephrine); - displayNameProgress = CSTRING(Injecting_Epinephrine); - items[] = {"ACE_epinephrine"}; - litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; - }; - class BloodIV: fieldDressing { - displayName = CSTRING(Actions_Blood4_1000); - displayNameProgress = CSTRING(Transfusing_Blood); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; - allowSelfTreatment = 0; - category = "advanced"; - items[] = {"ACE_bloodIV"}; - requiredMedic = 1; - treatmentTime = 7; - callbackSuccess = QUOTE(DFUNC(treatmentIV)); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = {}; - }; - class BloodIV_500: BloodIV { - displayName = CSTRING(Actions_Blood4_500); - items[] = {"ACE_bloodIV_500"}; - }; - class BloodIV_250: BloodIV { - displayName = CSTRING(Actions_Blood4_250); - items[] = {"ACE_bloodIV_250"}; - }; - class PlasmaIV: BloodIV { - displayName = CSTRING(Actions_Plasma4_1000); - displayNameProgress = CSTRING(Transfusing_Plasma); - items[] = {"ACE_plasmaIV"}; - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - }; - class PlasmaIV_500: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_500); - items[] = {"ACE_plasmaIV_500"}; - }; - class PlasmaIV_250: PlasmaIV { - displayName = CSTRING(Actions_Plasma4_250); - items[] = {"ACE_plasmaIV_250"}; - }; - class SalineIV: BloodIV { - displayName = CSTRING(Actions_Saline4_1000); - displayNameProgress = CSTRING(Transfusing_Saline); - items[] = {"ACE_salineIV"}; - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - }; - class SalineIV_500: SalineIV { - displayName = CSTRING(Actions_Saline4_500); - items[] = {"ACE_salineIV_500"}; - }; - class SalineIV_250: SalineIV { - displayName = CSTRING(Actions_Saline4_250); - items[] = {"ACE_salineIV_250"}; - }; - class SurgicalKit: fieldDressing { - displayName = CSTRING(Use_SurgicalKit); - displayNameProgress = CSTRING(Stitching); - category = "advanced"; - items[] = {"ACE_surgicalKit"}; - treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; - allowSelfTreatment = 0; - requiredMedic = QGVAR(medicSetting_SurgicalKit); - patientStateCondition = QGVAR(useCondition_SurgicalKit); - treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; - callbackSuccess = ""; - callbackProgress = QUOTE(DFUNC(treatmentAdvanced_surgicalKit_onProgress)); - itemConsumed = QGVAR(consumeItem_SurgicalKit); - animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; - litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"} }}; - }; - class PersonalAidKit: fieldDressing { - displayName = CSTRING(Use_Aid_Kit); - displayNameProgress = CSTRING(TreatmentAction); - category = "advanced"; - items[] = {"ACE_personalAidKit"}; - treatmentLocations[] = {QGVAR(useLocation_PAK)}; - allowSelfTreatment = 0; - requiredMedic = QGVAR(medicSetting_PAK); - patientStateCondition = QGVAR(useCondition_PAK); - treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_fullHeal)); - itemConsumed = QGVAR(consumeItem_PAK); - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"}; - animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; - animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; - animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, - {"All", "_bloodLossOnSelection <= 0", {"ACE_MedicalLitter_clean"}} - }; - }; - class CheckPulse: fieldDressing { - displayName = CSTRING(Actions_CheckPulse); - displayNameProgress = CSTRING(Check_Pulse_Content); - category = "examine"; - treatmentLocations[] = {"All"}; - requiredMedic = 0; - treatmentTime = 2; - items[] = {}; - callbackSuccess = QUOTE(DFUNC(actionCheckPulse)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationCaller = ""; // TODO - animationCallerProne = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; - litter[] = {}; - }; - class CheckBloodPressure: CheckPulse { - displayName = CSTRING(Actions_CheckBloodPressure); - callbackSuccess = QUOTE(DFUNC(actionCheckBloodPressure)); - displayNameProgress = CSTRING(Check_Bloodpressure_Content); - }; - class CheckResponse: CheckPulse { - displayName = CSTRING(Check_Response); - callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); - displayNameProgress = CSTRING(Check_Response_Content); - allowSelfTreatment = 0; - }; - class RemoveTourniquet: Tourniquet { - displayName = CSTRING(Actions_RemoveTourniquet); - items[] = {}; - treatmentTime = 2.5; - callbackSuccess = QUOTE(DFUNC(actionRemoveTourniquet)); - condition = QUOTE([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo)); - displayNameProgress = CSTRING(RemovingTourniquet); - litter[] = {}; - }; - class CPR: fieldDressing { - displayName = CSTRING(Actions_CPR); - displayNameProgress = CSTRING(Actions_PerformingCPR); - category = "advanced"; - treatmentLocations[] = {"All"}; - allowedSelections[] = {"body"}; - allowSelfTreatment = 0; - requiredMedic = 0; - treatmentTime = 15; - items[] = {}; - condition = "!([(_this select 1)] call ace_common_fnc_isAwake)"; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); - callbackFailure = ""; - callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)"; - animationPatient = ""; - animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; - animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; - animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; - animationCallerSelf = ""; - animationCallerSelfProne = ""; - itemConsumed = 0; - litter[] = {}; - }; - class BodyBag: fieldDressing { - displayName = CSTRING(PlaceInBodyBag); - displayNameProgress = CSTRING(PlacingInBodyBag); - category = "advanced"; - treatmentLocations[] = {"All"}; - allowSelfTreatment = 0; - requiredMedic = 0; - treatmentTime = 15; - items[] = {"ACE_bodyBag"}; - condition = "!alive (_this select 1);"; - callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag)); - callbackFailure = ""; - callbackProgress = ""; - animationPatient = ""; - animationPatientUnconscious = ""; - itemConsumed = 1; - litter[] = {}; - }; - }; -}; - -class ACE_Medical_Advanced { - // Defines all the possible injury types for advanced medical - class Injuries { - // All the possible wounds - class wounds { - - // Source: Scarle - // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). - class Abrasion { - name = CSTRING(Wounds_Abrasion); - selections[] = {"All"}; - bleedingRate = 0.0001; - pain = 0.01; - causes[] = {"falling", "ropeburn", "vehiclecrash", "unknown"}; - minDamage = 0.01; - class Minor { - name = CSTRING(Wounds_Abrasion_Minor); - minDamage = 0.01; - maxDamage = 0.2; - bleedingRate = 0.0001; - }; - class Medium { - name = CSTRING(Wounds_Abrasion_Medium); - minDamage = 0.2; - maxDamage = 0.3; - bleedingRate = 0.00015; - }; - class Large { - name = CSTRING(Wounds_Abrasion_Large); - minDamage = 0.3; - maxDamage = 0.5; - bleedingRate = 0.0002; - }; - }; - // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. - class Avulsions { - name = CSTRING(Wounds_Avulsion); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.3; - causes[] = {"explosive", "vehiclecrash", "grenade", "shell", "bullet", "backblast", "bite"}; - minDamage = 0.2; - class Minor { - name = CSTRING(Wounds_Avulsion_Minor); - minDamage = 0.2; - maxDamage = 0.3; - bleedingRate = 0.01; - }; - class Medium { - name = CSTRING(Wounds_Avulsion_Medium); - minDamage = 0.3; - maxDamage = 0.6; - bleedingRate = 0.02; - }; - class Large { - name = CSTRING(Wounds_Avulsion_Large); - minDamage = 0.5; - bleedingRate = 0.05; - }; - }; - // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. - class Contusion { - name = CSTRING(Wounds_Contusion); - selections[] = {"All"}; - bleedingRate = 0.0; - pain = 0.05; - causes[] = {"bullet", "backblast", "punch", "vehiclecrash", "falling"}; - minDamage = 0.01; - maxDamage = 0.1; - class Minor { - name = CSTRING(Wounds_Contusion_Minor); - minDamage = 0.01; - maxDamage = 0.1; - }; - class Medium { - name = CSTRING(Wounds_Contusion_Medium); - minDamage = 0.1; - maxDamage = 0.15; - }; - class Large { - name = CSTRING(Wounds_Contusion_Large); - minDamage = 0.15; - maxDamage = 0.2; - }; - }; - // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. - class CrushWound { - name = CSTRING(Wounds_Crush); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.1; - causes[] = {"falling", "vehiclecrash", "punch", "unknown"}; - minDamage = 0.1; - class Minor { - name = CSTRING(Wounds_Crush_Minor); - minDamage = 0.1; - maxDamage = 0.45; - bleedingRate = 0.005; - }; - class Medium { - name = CSTRING(Wounds_Crush_Medium); - minDamage = 0.4; - maxDamage = 0.7; - bleedingRate = 0.007; - }; - class Large { - name = CSTRING(Wounds_Crush_Large); - minDamage = 0.6; - bleedingRate = 0.0095; - }; - }; - // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. - class Cut { - name = CSTRING(Wounds_Cut); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.075; - causes[] = {"vehiclecrash", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; - minDamage = 0.1; - class Minor { - name = CSTRING(Wounds_Cut_Minor); - minDamage = 0.1; - maxDamage = 0.3; - bleedingRate = 0.005; - }; - class Medium { - name = CSTRING(Wounds_Cut_Medium); - minDamage = 0.3; - maxDamage = 0.65; - bleedingRate = 0.02; - }; - class Large { - name = CSTRING(Wounds_Cut_Large); - minDamage = 0.65; - bleedingRate = 0.05; - }; - }; - // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. - class Laceration { - name = CSTRING(Wounds_Laceration); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.075; - causes[] = {"vehiclecrash", "punch"}; - minDamage = 0.01; - class Minor { - name = CSTRING(Wounds_Laceration_Minor); - minDamage = 0.1; - maxDamage = 0.5; - bleedingRate = 0.005; - }; - class Medium { - name = CSTRING(Wounds_Laceration_Medium); - minDamage = 0.5; - maxDamage = 0.7; - bleedingRate = 0.01; - }; - class Large { - name = CSTRING(Wounds_Laceration_Large); - minDamage = 0.7; - bleedingRate = 0.03; - }; - }; - // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. - class velocityWound { - name = CSTRING(Wounds_VelocityWound); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.2; - causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; - minDamage = 0.15; - class Minor { - name = CSTRING(Wounds_VelocityWound_Minor); - minDamage = 0.15; - maxDamage = 0.3; - bleedingRate = 0.025; - }; - class Medium { - name = CSTRING(Wounds_VelocityWound_Medium); - minDamage = 0.3; - maxDamage = 0.75; - bleedingRate = 0.05; - }; - class Large { - name = CSTRING(Wounds_VelocityWound_Large); - minDamage = 0.75; - bleedingRate = 0.1; - }; - }; - // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. - class punctureWound { - name = CSTRING(Wounds_PunctureWound); - selections[] = {"All"}; - bleedingRate = 0.01; - pain = 0.075; - causes[] = {"stab", "grenade"}; - minDamage = 0.01; - class Minor { - name = CSTRING(Wounds_PunctureWound_Minor); - minDamage = 0.01; - maxDamage = 0.5; - bleedingRate = 0.01; - }; - class Medium { - name = CSTRING(Wounds_PunctureWound_Medium); - minDamage = 0.5; - maxDamage = 0.75; - bleedingRate = 0.03; - }; - class Large { - name = CSTRING(Wounds_PunctureWound_Large); - minDamage = 0.65; - bleedingRate = 0.08; - }; - }; - }; - class fractures { - class Femur { - name = CSTRING(Wounds_Femur); - selections[] = {"Head", "Torso"}; - pain = 0.2; - causes[] = {"Bullet", "VehicleCrash", "Backblast", "Explosive", "Shell", "Grenade"}; - minDamage = 0.5; - }; - }; - class damageTypes { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - lethalDamage = 0.01; - - class bullet { - // above damage, amount. Put the highest threshold to the left and lower the threshold with the elements to the right of it. - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class grenade { - thresholds[] = {{0.1, 3}, {0, 1}}; - selectionSpecific = 0; - }; - class explosive { - thresholds[] = {{1, 6}, {0.1, 4}, {0, 1}}; - selectionSpecific = 0; - }; - class shell { - thresholds[] = {{1, 7}, {0.1, 5}, {0, 1}}; - selectionSpecific = 0; - }; - class vehiclecrash { - thresholds[] = {{0.25, 5}, {0.05, 1}}; - selectionSpecific = 0; - lethalDamage = 0.2; - }; - class backblast { - thresholds[] = {{1, 6}, {0.55, 5}, {0, 2}}; - selectionSpecific = 0; - lethalDamage = 1; - }; - class stab { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class punch { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class falling { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - lethalDamage = 0.4; - }; - class ropeburn { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class unknown { - thresholds[] = {{0.1, 1}}; - }; - }; - }; - class Treatment { - class Bandaging { - // Field dressing is normal average treatment - // packing bandage is average treatment, higher reopen chance, longer reopening delay - // elastic bandage is higher treatment, higher reopen chance, shorter reopen delay - // quickclot is lower treatment, lower reopen chance, longer reopening delay - class Bandage { // basic bandage - effectiveness = 5; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - - class FieldDressing { - // How effect is the bandage for treating one wounds type injury - effectiveness = 1; - // What is the chance and delays (in seconds) of the treated default injury reopening - reopeningChance = 0.1; - reopeningMinDelay = 120; - reopeningMaxDelay = 200; - - class Abrasion { - effectiveness = 3; - reopeningChance = 0.3; - reopeningMinDelay = 200; - reopeningMaxDelay = 1000; - }; - class AbrasionMinor: Abrasion { - effectiveness = 3; - }; - class AbrasionMedium: Abrasion { - effectiveness = 2.5; - reopeningChance = 0.7; - }; - class AbrasionLarge: Abrasion { - effectiveness = 2; - reopeningChance = 0.9; - }; - - class Avulsions: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 120; - reopeningMaxDelay = 200; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 1; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 0.9; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 0.75; - }; - - class Contusion: Abrasion { - effectiveness = 1; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.2; - reopeningMinDelay = 20; - reopeningMaxDelay = 1000; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 1; - reopeningChance = 0.2; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 0.7; - reopeningChance = 0.3; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 0.6; - reopeningChance = 0.4; - }; - - class Cut: Abrasion { - effectiveness = 4; - reopeningChance = 0.1; - reopeningMinDelay = 300; - reopeningMaxDelay = 1000; - }; - class CutMinor: Cut { - effectiveness = 4; - reopeningChance = 0.1; - }; - class CutMedium: Cut { - effectiveness = 3; - reopeningChance = 0.3; - }; - class CutLarge: Cut { - effectiveness = 1; - reopeningChance = 0.5; - }; - - class Laceration: Abrasion { - effectiveness = 0.95; - reopeningChance = 0.3; - reopeningMinDelay = 100; - reopeningMaxDelay = 800; - }; - class LacerationMinor: Laceration { - effectiveness = 0.95; - reopeningChance = 0.3; - }; - class LacerationMedium: Laceration { - effectiveness = 0.7; - reopeningChance = 0.5; - }; - class LacerationLarge: Laceration { - effectiveness = 0.5; - reopeningChance = 0.6; - }; - - class velocityWound: Abrasion { - effectiveness = 2; - reopeningChance = 0.7; - reopeningMinDelay = 100; - reopeningMaxDelay = 500; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 2; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 1.5; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 1; - }; - - class punctureWound: Abrasion { - effectiveness = 2; - reopeningChance = 0.5; - reopeningMinDelay = 200; - reopeningMaxDelay = 850; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 2; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 1.3; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 0.9; - }; - }; - - class PackingBandage: fieldDressing { - class Abrasion { - effectiveness = 3; - reopeningChance = 0.6; - reopeningMinDelay = 800; - reopeningMaxDelay = 1500; - }; - class AbrasionMinor: Abrasion { - effectiveness = 3; - }; - class AbrasionMedium: Abrasion { - effectiveness = 2.5; - reopeningChance = 0.9; - }; - class AbrasionLarge: Abrasion { - effectiveness = 2; - reopeningChance = 1; - }; - - class Avulsions: Abrasion { - effectiveness = 1; - reopeningChance = 0.7; - reopeningMinDelay = 1000; - reopeningMaxDelay = 1600; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 1; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 0.9; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 0.75; - }; - - class Contusion: Abrasion { - effectiveness = 1; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 600; - reopeningMaxDelay = 1000; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 1; - reopeningChance = 0.6; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 0.7; - reopeningChance = 0.7; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 0.6; - reopeningChance = 0.8; - }; - - class Cut: Abrasion { - effectiveness = 4; - reopeningChance = 0.4; - reopeningMinDelay = 700; - reopeningMaxDelay = 1000; - }; - class CutMinor: Cut { - effectiveness = 4; - reopeningChance = 0.6; - }; - class CutMedium: Cut { - effectiveness = 3; - reopeningChance = 0.7; - }; - class CutLarge: Cut { - effectiveness = 1; - reopeningChance = 0.8; - }; - - class Laceration: Abrasion { - effectiveness = 0.95; - reopeningChance = 0.65; - reopeningMinDelay = 500; - reopeningMaxDelay = 2000; - }; - class LacerationMinor: Laceration { - effectiveness = 0.95; - reopeningChance = 0.65; - }; - class LacerationMedium: Laceration { - effectiveness = 0.7; - reopeningChance = 0.8; - }; - class LacerationLarge: Laceration { - effectiveness = 0.5; - reopeningChance = 0.9; - }; - - class velocityWound: Abrasion { - effectiveness = 2; - reopeningChance = 1; - reopeningMinDelay = 800; - reopeningMaxDelay = 2000; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 2; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 1.5; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 1; - }; - - class punctureWound: Abrasion { - effectiveness = 2; - reopeningChance = 1; - reopeningMinDelay = 1000; - reopeningMaxDelay = 3000; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 2; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 1.3; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 0.9; - }; - }; - - class ElasticBandage: fieldDressing { - class Abrasion { - effectiveness = 4; - reopeningChance = 0.6; - reopeningMinDelay = 80; - reopeningMaxDelay = 150; - }; - class AbrasionMinor: Abrasion { - effectiveness = 4; - }; - class AbrasionMedium: Abrasion { - effectiveness = 3; - reopeningChance = 0.9; - }; - class AbrasionLarge: Abrasion { - effectiveness = 2.5; - reopeningChance = 1; - }; - - class Avulsions: Abrasion { - effectiveness = 2; - reopeningChance = 0.7; - reopeningMinDelay = 100; - reopeningMaxDelay = 160; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 2; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 1.4; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 1; - }; - - class Contusion: Abrasion { - effectiveness = 2; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 2; - reopeningChance = 0.5; - reopeningMinDelay = 60; - reopeningMaxDelay = 100; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 2; - reopeningChance = 0.6; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 1.7; - reopeningChance = 0.7; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 1.6; - reopeningChance = 0.8; - }; - - class Cut: Abrasion { - effectiveness = 5; - reopeningChance = 0.4; - reopeningMinDelay = 70; - reopeningMaxDelay = 100; - }; - class CutMinor: Cut { - effectiveness = 5; - reopeningChance = 0.6; - }; - class CutMedium: Cut { - effectiveness = 3.5; - reopeningChance = 0.7; - }; - class CutLarge: Cut { - effectiveness = 2; - reopeningChance = 0.8; - }; - - class Laceration: Abrasion { - effectiveness = 2; - reopeningChance = 0.65; - reopeningMinDelay = 50; - reopeningMaxDelay = 200; - }; - class LacerationMinor: Laceration { - effectiveness = 2; - reopeningChance = 0.65; - }; - class LacerationMedium: Laceration { - effectiveness = 1.5; - reopeningChance = 0.8; - }; - class LacerationLarge: Laceration { - effectiveness = 1; - reopeningChance = 0.9; - }; - - class velocityWound: Abrasion { - effectiveness = 2.2; - reopeningChance = 1; - reopeningMinDelay = 80; - reopeningMaxDelay = 200; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 2.2; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 1.75; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 1.5; - }; - - class punctureWound: Abrasion { - effectiveness = 2.5; - reopeningChance = 1; - reopeningMinDelay = 100; - reopeningMaxDelay = 300; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 2.5; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 2; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 1.5; - }; - }; - - class QuikClot: fieldDressing { - class Abrasion { - effectiveness = 2; - reopeningChance = 0.3; - reopeningMinDelay = 800; - reopeningMaxDelay = 1500; - }; - class AbrasionMinor: Abrasion { - effectiveness = 2; - }; - class AbrasionMedium: Abrasion { - effectiveness = 1; - reopeningChance = 0.4; - }; - class AbrasionLarge: Abrasion { - effectiveness = 0.7; - reopeningChance = 0.5; - }; - - class Avulsions: Abrasion { - effectiveness = 0.7; - reopeningChance = 0.2; - reopeningMinDelay = 1000; - reopeningMaxDelay = 1600; - }; - class AvulsionsMinor: Avulsions { - effectiveness = 0.7; - }; - class AvulsionsMedium: Avulsions { - effectiveness = 0.65; - }; - class AvulsionsLarge: Avulsions { - effectiveness = 0.5; - }; - - class Contusion: Abrasion { - effectiveness = 1; - reopeningChance = 0; - reopeningMinDelay = 0; - reopeningMaxDelay = 0; - }; - class ContusionMinor: Contusion {}; - class ContusionMedium: Contusion {}; - class ContusionLarge: Contusion {}; - - class CrushWound: Abrasion { - effectiveness = 0.6; - reopeningChance = 0.5; - reopeningMinDelay = 600; - reopeningMaxDelay = 1000; - }; - class CrushWoundMinor: CrushWound { - effectiveness = 0.6; - reopeningChance = 0.3; - }; - class CrushWoundMedium: CrushWound { - effectiveness = 0.5; - }; - class CrushWoundLarge: CrushWound { - effectiveness = 0.4; - }; - - class Cut: Abrasion { - effectiveness = 2; - reopeningChance = 0.2; - reopeningMinDelay = 700; - reopeningMaxDelay = 1000; - }; - class CutMinor: Cut { - effectiveness = 2; - reopeningChance = 0.3; - }; - class CutMedium: Cut { - effectiveness = 1; - }; - class CutLarge: Cut { - effectiveness = 0.6; - }; - - class Laceration: Abrasion { - effectiveness = 0.7; - reopeningChance = 0.4; - reopeningMinDelay = 500; - reopeningMaxDelay = 2000; - }; - class LacerationMinor: Laceration { - effectiveness = 0.7; - reopeningChance = 0.4; - }; - class LacerationMedium: Laceration { - effectiveness = 0.7; - }; - class LacerationLarge: Laceration { - effectiveness = 0.5; - }; - - class velocityWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 800; - reopeningMaxDelay = 2000; - }; - class velocityWoundMinor: velocityWound { - effectiveness = 1; - }; - class velocityWoundMedium: velocityWound { - effectiveness = 0.75; - }; - class velocityWoundLarge: velocityWound { - effectiveness = 0.5; - }; - - class punctureWound: Abrasion { - effectiveness = 1; - reopeningChance = 0.5; - reopeningMinDelay = 1000; - reopeningMaxDelay = 3000; - }; - class punctureWoundMinor: punctureWound { - effectiveness = 1; - }; - class punctureWoundMedium: punctureWound { - effectiveness = 0.7; - }; - class punctureWoundLarge: punctureWound { - effectiveness = 0.4; - }; - }; - }; - - class Medication { - // How much does the pain get reduced? - painReduce = 0; - // How much will the heart rate be increased when the HR is low (below 55)? {minIncrease, maxIncrease, seconds} - hrIncreaseLow[] = {0, 0, 0}; - hrIncreaseNormal[] = {0, 0, 0}; - hrIncreaseHigh[] = {0, 0, 0}; - // Callback once the heart rate values have been added. - hrCallback = ""; - - // How long until this medication has disappeared - timeInSystem = 120; - // How many of this type of medication can be in the system before the patient overdoses? - maxDose = 4; - // Function to execute upon overdose. Arguments passed to call back are 0: unit , 1: medicationClassName - onOverDose = ""; - // The viscosity of a fluid is a measure of its resistance to gradual deformation by shear stress or tensile stress. For liquids, it corresponds to the informal concept of "thickness". This value will increase/decrease the viscoty of the blood with the percentage given. Where 100 = max. Using the minus will decrease viscosity - viscosityChange = 0; - - // specific details for the ACE_Morphine treatment action - class Morphine { - painReduce = 15; - hrIncreaseLow[] = {-10, -20, 35}; - hrIncreaseNormal[] = {-10, -30, 35}; - hrIncreaseHigh[] = {-10, -35, 50}; - timeInSystem = 900; - maxDose = 4; - inCompatableMedication[] = {}; - viscosityChange = -10; - }; - class Epinephrine { - painReduce = 0; - hrIncreaseLow[] = {10, 20, 15}; - hrIncreaseNormal[] = {10, 50, 10}; - hrIncreaseHigh[] = {10, 40, 5}; - timeInSystem = 120; - maxDose = 10; - inCompatableMedication[] = {}; - }; - class Adenosine { - painReduce = 0; - hrIncreaseLow[] = {-7, -10, 15}; - hrIncreaseNormal[] = {-15, -30, 20}; - hrIncreaseHigh[] = {-15, -35, 10}; - timeInSystem = 120; - maxDose = 6; - inCompatableMedication[] = {}; - }; - class Atropine { - painReduce = 0; - hrIncreaseLow[] = {-2, -5, 15}; - hrIncreaseNormal[] = {-10, -15, 20}; - hrIncreaseHigh[] = {-5, -20, 10}; - timeInSystem = 120; - maxDose = 6; - inCompatableMedication[] = {}; - }; - class PainKillers { - painReduce = 0.7; - timeInSystem = 120; - maxDose = 10; - inCompatableMedication[] = {}; - viscosityChange = 5; - }; - }; - class IV { - // volume is in millileters - volume = 1000; - ratio[] = {}; - type = "Blood"; - class BloodIV { - volume = 1000; - ratio[] = {"Plasma", 1}; - }; - class BloodIV_500: BloodIV { - volume = 500; - }; - class BloodIV_250: BloodIV { - volume = 250; - }; - class PlasmaIV: BloodIV { - volume = 1000; - ratio[] = {"Blood", 1}; - type = "Plasma"; - }; - class PlasmaIV_500: PlasmaIV { - volume = 500; - }; - class PlasmaIV_250: PlasmaIV { - volume = 250; - }; - class SalineIV: BloodIV { - volume = 1000; - type = "Saline"; - ratio[] = {}; - }; - class SalineIV_500: SalineIV { - volume = 500; - }; - class SalineIV_250: SalineIV { - volume = 250; - }; - }; - }; -}; diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 737e634ec8..eb84ee7f10 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -1,329 +1,24 @@ class ACE_Settings { - class GVAR(level) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_level_DisplayName); - description = CSTRING(MedicalSettings_level_Description); - value = 1; - typeName = "SCALAR"; - values[] = {"Disabled", "Basic", "Advanced"}; - }; - class GVAR(medicSetting) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_medicSetting_DisplayName); - description = CSTRING(MedicalSettings_medicSetting_Description); - value = 1; - typeName = "SCALAR"; - values[] = {"Disabled", "Normal", "Advanced"}; - }; - class GVAR(increaseTrainingInLocations) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_increaseTrainingInLocations_DisplayName); - description = CSTRING(MedicalSettings_increaseTrainingInLocations_Description); - value = 0; - typeName = "BOOL"; - }; + /* @todo class GVAR(enableFor) { category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableFor_Description); - value = 0; + displayName = CSTRING(MedicalSettings_enableFor_DisplayName); + description = CSTRING(MedicalSettings_enableFor_Description); + value = 1; typeName = "SCALAR"; values[] = {"Players only", "Players and AI"}; }; - class GVAR(enableOverdosing) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_enableOverdosing_DisplayName); - description = CSTRING(MedicalSettings_enableOverdosing_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(bleedingCoefficient) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_bleedingCoefficient_DisplayName); - description = CSTRING(MedicalSettings_bleedingCoefficient_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(painCoefficient) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_painCoefficient_DisplayName); - description = CSTRING(MedicalSettings_painCoefficient_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(enableAdvancedWounds) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_Description); - typeName = "BOOL"; - value = 0; - }; + */ + /* @todo class GVAR(enableVehicleCrashes) { category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_Description); + displayName = CSTRING(MedicalSettings_enableVehicleCrashes_DisplayName); + description = CSTRING(MedicalSettings_enableVehicleCrashes_Description); typeName = "BOOL"; value = 1; }; - class GVAR(enableScreams) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_enableScreams_DisplayName); - description = CSTRING(MedicalSettings_enableScreams_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(playerDamageThreshold) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_playerDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_playerDamageThreshold_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(AIDamageThreshold) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_AIDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_AIDamageThreshold_Description); - typeName = "SCALAR"; - value = 1; - sliderSettings[] = {0, 25, 1, 1}; - }; - class GVAR(enableUnconsciousnessAI) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_enableUnconsciousnessAI_DisplayName); - description = CSTRING(MedicalSettings_enableUnconsciousnessAI_Description); - value = 1; - typeName = "SCALAR"; - values[] = {"Disabled", "50/50", "Enabled"}; - }; - class GVAR(remoteControlledAI) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_remoteControlledAI_DisplayName); - description = CSTRING(MedicalSettings_remoteControlledAI_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(preventInstaDeath) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_preventInstaDeath_DisplayName); - description = CSTRING(MedicalSettings_preventInstaDeath_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(enableRevive) { - category = CSTRING(Category_Medical); - displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); - description = CSTRING(ReviveSettings_enableRevive_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"Disabled", "Players only", "Players and AI"}; - }; - class GVAR(maxReviveTime) { - category = CSTRING(Category_Medical); - displayName = CSTRING(ReviveSettings_maxReviveTime_DisplayName); - description = CSTRING(ReviveSettings_maxReviveTime_Description); - typeName = "SCALAR"; - value = 120; - sliderSettings[] = {0, 3600, 120, 0}; - }; - class GVAR(amountOfReviveLives) { - category = CSTRING(Category_Medical); - displayName = CSTRING(ReviveSettings_amountOfReviveLives_DisplayName); - description = CSTRING(ReviveSettings_amountOfReviveLives_Description); - typeName = "SCALAR"; - value = -1; - sliderSettings[] = {-1, 25, -1, -1}; - }; - - /* - class GVAR(allowDeadBodyMovement) { - category = CSTRING(Category_Medical); - typeName = "BOOL"; - value = 0; - }; */ - - class GVAR(allowLitterCreation) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_allowLitterCreation_DisplayName); - description = CSTRING(MedicalSettings_allowLitterCreation_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(litterSimulationDetail) { - category = CSTRING(Category_Medical); - displayName = CSTRING(litterSimulationDetail); - description = CSTRING(litterSimulationDetail_Desc); - typeName = "SCALAR"; - - value = 3; - values[] = {"Off", "Low", "Medium", "High", "Ultra"}; - _values[] = { 0, 50, 100, 1000, 5000 }; - }; - class GVAR(litterCleanUpDelay) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_litterCleanUpDelay_DisplayName); - description = CSTRING(MedicalSettings_litterCleanUpDelay_Description); - typeName = "SCALAR"; - value = 0; - sliderSettings[] = {-1, 3600, 0, 0}; - }; - class GVAR(medicSetting_basicEpi) { - category = CSTRING(Category_Medical); - displayName = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_Description); - typeName = "SCALAR"; - value = 1; - values[] = {"Anyone", "Medics only", "Doctors only"}; - }; - class GVAR(medicSetting_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_Description); - typeName = "SCALAR"; - value = 1; - values[] = {"Anyone", "Medics only", "Doctors only"}; - }; - class GVAR(medicSetting_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_Description); - typeName = "SCALAR"; - value = 1; - values[] = {"Anyone", "Medics only", "Doctors only"}; - }; - class GVAR(consumeItem_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"No", "Yes"}; - }; - class GVAR(consumeItem_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"No", "Yes"}; - }; - class GVAR(useLocation_basicEpi) { - category = CSTRING(Category_Medical); - displayName = CSTRING(BasicMedicalSettings_useLocation_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_useLocation_basicEpi_Description); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(AdvancedMedicalSettings_anywhere), CSTRING(AdvancedMedicalSettings_vehicle), CSTRING(AdvancedMedicalSettings_facility), CSTRING(AdvancedMedicalSettings_vehicleAndFacility), ECSTRING(common,Disabled)}; - }; - class GVAR(useLocation_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); - typeName = "SCALAR"; - value = 3; - values[] = {CSTRING(AdvancedMedicalSettings_anywhere), CSTRING(AdvancedMedicalSettings_vehicle), CSTRING(AdvancedMedicalSettings_facility), CSTRING(AdvancedMedicalSettings_vehicleAndFacility), ECSTRING(common,Disabled)}; - }; - class GVAR(useLocation_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); - typeName = "SCALAR"; - value = 2; - values[] = {CSTRING(AdvancedMedicalSettings_anywhere), CSTRING(AdvancedMedicalSettings_vehicle), CSTRING(AdvancedMedicalSettings_facility), CSTRING(AdvancedMedicalSettings_vehicleAndFacility), ECSTRING(common,Disabled)}; - }; - class GVAR(useCondition_PAK) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"Anytime", "Stable"}; - }; - class GVAR(useCondition_SurgicalKit) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); - typeName = "SCALAR"; - value = 0; - values[] = {"Anytime", "Stable"}; - }; - class GVAR(keepLocalSettingsSynced) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_keepLocalSettingsSynced_DisplayName); - description = CSTRING(MedicalSettings_keepLocalSettingsSynced_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(healHitPointAfterAdvBandage) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); - description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(painIsOnlySuppressed) { - category = CSTRING(Category_Medical); - displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); - description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); - typeName = "BOOL"; - value = 1; - }; - class GVAR(painEffectType) { - category = CSTRING(Category_Medical); - displayName = CSTRING(painEffectType); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(painEffect_Flash), CSTRING(painEffect_Chroma)}; - isClientSettable = 1; - }; - class GVAR(allowUnconsciousAnimationOnTreatment) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_allowUnconsciousAnimationOnTreatment_DisplayName); - description = CSTRING(MedicalSettings_allowUnconsciousAnimationOnTreatment_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(moveUnitsFromGroupOnUnconscious) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_moveUnitsFromGroupOnUnconscious_DisplayName); - description = CSTRING(MedicalSettings_moveUnitsFromGroupOnUnconscious_Description); - typeName = "BOOL"; - value = 0; - }; - class GVAR(menuTypeStyle) { - category = CSTRING(Category_Medical); - displayName = CSTRING(menuTypeDisplay); - description = CSTRING(menuTypeDescription); - typeName = "SCALAR"; - value = 0; - values[] = {CSTRING(useSelection), CSTRING(useRadial), ECSTRING(common,Disabled)}; - isClientSettable = 1; - }; - class GVAR(menuTypeStyleSelf) { - category = CSTRING(Category_Medical); - displayName = CSTRING(menuTypeStyleSelf_displayName); - description = CSTRING(menuTypeStyleSelf_description); - typeName = "BOOL"; - value = 1; - isClientSettable = 1; - }; - class GVAR(delayUnconCaptive) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_delayUnconCaptive_DisplayName); - description = CSTRING(MedicalSettings_delayUnconCaptive_Description); - typeName = "SCALAR"; - value = 3; - sliderSettings[] = {0, 30, 3, 0}; - }; - class GVAR(convertItems) { - category = CSTRING(Category_Medical); - displayName = CSTRING(MedicalSettings_convertItems_DisplayName); - description = CSTRING(MedicalSettings_convertItems_Description); - typeName = "SCALAR"; - value = 0; - values[] = {ECSTRING(common,Enabled), CSTRING(MedicalSettings_convertItems_remove), ECSTRING(common,Disabled)}; + class GVAR(spontaneousWakeUpChance) { + movedToSQF = 1; }; }; diff --git a/addons/medical/CfgActions.hpp b/addons/medical/CfgActions.hpp deleted file mode 100644 index 387c3b8de2..0000000000 --- a/addons/medical/CfgActions.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgActions { - class None; - class Heal: None { - show = 0; - }; -}; diff --git a/addons/medical/CfgEventHandlers.hpp b/addons/medical/CfgEventHandlers.hpp index becf395052..0d3301d6e0 100644 --- a/addons/medical/CfgEventHandlers.hpp +++ b/addons/medical/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); diff --git a/addons/medical/CfgFactionClasses.hpp b/addons/medical/CfgFactionClasses.hpp deleted file mode 100644 index 0ca922c8a6..0000000000 --- a/addons/medical/CfgFactionClasses.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgFactionClasses { - class NO_CATEGORY; - class ADDON: NO_CATEGORY { - displayName = CSTRING(Category_DisplayName); - }; -}; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 5db82ce1e5..424059c8e1 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -1,956 +1,7 @@ - -#define MEDICAL_ACTION_DISTANCE 1.75 - -class CBA_Extended_EventHandlers; - class CfgVehicles { class Logic; - class Module_F: Logic { - class ArgumentsBaseUnits { - }; - }; - - class ACE_Module; - class ACE_moduleMedicalSettings: ACE_Module { + // Left as dumb logic so that old missions don't error about missing vehicle + class ACE_moduleMedicalSettings: Logic { scope = 1; - displayName = CSTRING(MedicalSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QUOTE(DFUNC(moduleMedicalSettings)); - functionPriority = 1; - isGlobal = 1; - isSingular = 1; - isTriggerActivated = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class level { - displayName = CSTRING(MedicalSettings_level_DisplayName); - description = CSTRING(MedicalSettings_level_Description); - typeName = "NUMBER"; - class values { - class normal { - name = CSTRING(MedicalSettings_basic); - value = 1; - default = 1; - }; - class full { - name = CSTRING(MedicalSettings_advanced); - value = 2; - }; - }; - }; - class medicSetting { - displayName = CSTRING(MedicalSettings_medicSetting_DisplayName); - description = CSTRING(MedicalSettings_medicSetting_Description); - typeName = "NUMBER"; - class values { - class disable { - name = CSTRING(MedicalSettings_medicSetting_disable); - value = 0; - }; - class normal { - name = CSTRING(MedicalSettings_basic); - value = 1; - default = 1; - }; - class full { - name = CSTRING(MedicalSettings_advanced); - value = 2; - }; - }; - }; - class increaseTrainingInLocations { - displayName = CSTRING(MedicalSettings_increaseTrainingInLocations_DisplayName); - description = CSTRING(MedicalSettings_increaseTrainingInLocations_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class allowLitterCreation { - displayName = CSTRING(MedicalSettings_allowLitterCreation_DisplayName); - description = CSTRING(MedicalSettings_allowLitterCreation_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class litterCleanUpDelay { - displayName = CSTRING(MedicalSettings_litterCleanUpDelay_DisplayName); - description = CSTRING(MedicalSettings_litterCleanUpDelay_Description); - typeName = "NUMBER"; - defaultValue = 1800; - }; - class enableScreams { - displayName = CSTRING(MedicalSettings_enableScreams_DisplayName); - description = CSTRING(MedicalSettings_enableScreams_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class playerDamageThreshold { - displayName = CSTRING(MedicalSettings_playerDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_playerDamageThreshold_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class AIDamageThreshold { - displayName = CSTRING(MedicalSettings_AIDamageThreshold_DisplayName); - description = CSTRING(MedicalSettings_AIDamageThreshold_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class enableUnconsciousnessAI { - displayName = CSTRING(MedicalSettings_enableUnconsciousnessAI_DisplayName); - description = CSTRING(MedicalSettings_enableUnconsciousnessAI_Description); - typeName = "NUMBER"; - class values { - class disable { - name = ECSTRING(common,Disabled); - value = 0; - }; - class normal { - name = "50/50"; - value = 1; - default = 1; - }; - class full { - name = ECSTRING(common,Enabled); - value = 2; - }; - }; - }; - class remoteControlledAI { - displayName = CSTRING(MedicalSettings_remoteControlledAI_DisplayName); - description = CSTRING(MedicalSettings_remoteControlledAI_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class preventInstaDeath { - displayName = CSTRING(MedicalSettings_preventInstaDeath_DisplayName); - description = CSTRING(MedicalSettings_preventInstaDeath_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class bleedingCoefficient { - displayName = CSTRING(MedicalSettings_bleedingCoefficient_DisplayName); - description = CSTRING(MedicalSettings_bleedingCoefficient_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class painCoefficient { - displayName = CSTRING(MedicalSettings_painCoefficient_DisplayName); - description = CSTRING(MedicalSettings_painCoefficient_Description); - typeName = "NUMBER"; - defaultValue = 1; - }; - class keepLocalSettingsSynced { - displayName = CSTRING(MedicalSettings_keepLocalSettingsSynced_DisplayName); - description = CSTRING(MedicalSettings_keepLocalSettingsSynced_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - }; - - class ModuleDescription { - description = CSTRING(MedicalSettings_Module_Description); - sync[] = {}; - }; - }; - class ACE_moduleBasicMedicalSettings: ACE_Module { - scope = 1; - displayName = CSTRING(BasicMedicalSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleBasicMedicalSettings); - functionPriority = 10; - isGlobal = 2; - isSingular = 1; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class medicSetting_basicEpi { - displayName = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_medicSetting_basicEpi_Description); - typeName = "NUMBER"; - class values { - class anyone { name = CSTRING(AdvancedMedicalSettings_anyone); value = 0; }; - class Medic { name = CSTRING(AdvancedMedicalSettings_Medic); value = 1; default = 1; }; - class Special { name = CSTRING(AdvancedMedicalSettings_Special); value = 2; }; - }; - }; - class useLocation_basicEpi { - displayName = CSTRING(BasicMedicalSettings_useLocation_basicEpi_DisplayName); - description = CSTRING(BasicMedicalSettings_useLocation_basicEpi_Description); - typeName = "NUMBER"; - class values { - class anywhere { name = CSTRING(AdvancedMedicalSettings_anywhere); value = 0; default = 1; }; - class vehicle { name = CSTRING(AdvancedMedicalSettings_vehicle); value = 1; }; - class facility { name = CSTRING(AdvancedMedicalSettings_facility); value = 2; }; - class vehicleAndFacility { name = CSTRING(AdvancedMedicalSettings_vehicleAndFacility); value = 3; }; - class disabled { name = ECSTRING(common,Disabled); value = 4;}; - }; - }; - }; - class ModuleDescription { - description = CSTRING(BasicMedicalSettings_Module_Description); - sync[] = {}; - }; - }; - class ACE_moduleAdvancedMedicalSettings: ACE_Module { - scope = 1; - displayName = CSTRING(AdvancedMedicalSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAdvancedMedicalSettings); - functionPriority = 10; - isGlobal = 2; - isSingular = 1; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class enableFor { - displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableFor_Description); - typeName = "NUMBER"; - class values { - class playableUnits { - name = CSTRING(playeronly); - value = 0; - default = 1; - }; - class playableUnitsAndAI { - name = CSTRING(playersandai); - value = 1; - }; - }; - }; - class enableAdvancedWounds { - displayName = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class enableVehicleCrashes { - displayName = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_DisplayName); - description = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - class medicSetting_PAK { - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_Description); - typeName = "NUMBER"; - class values { - class anyone { name = CSTRING(AdvancedMedicalSettings_anyone); value = 0; }; - class Medic { name = CSTRING(AdvancedMedicalSettings_Medic); value = 1; default = 1; }; - class Special { name = CSTRING(AdvancedMedicalSettings_Special); value = 2; }; - }; - }; - class consumeItem_PAK { - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); - typeName = "NUMBER"; - class values { - class keep { name = ECSTRING(common,No); value = 0; }; - class remove { name = ECSTRING(common,Yes); value = 1; default = 1; }; - }; - }; - class useCondition_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); - typeName = "NUMBER"; - class values { - class AnyTime { name = CSTRING(AnyTime); value = 0; }; - class Stable { name = CSTRING(Stable); value = 1; default = 1; }; - }; - }; - class useLocation_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); - typeName = "NUMBER"; - class values { - class anywhere { name = CSTRING(AdvancedMedicalSettings_anywhere); value = 0; }; - class vehicle { name = CSTRING(AdvancedMedicalSettings_vehicle); value = 1; }; - class facility { name = CSTRING(AdvancedMedicalSettings_facility); value = 2; }; - class vehicleAndFacility { name = CSTRING(AdvancedMedicalSettings_vehicleAndFacility); value = 3; default = 1; }; - class disabled { name = ECSTRING(common,Disabled); value = 4;}; - }; - }; - class medicSetting_SurgicalKit: medicSetting_PAK { - displayName = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_Description); - }; - class consumeItem_SurgicalKit: consumeItem_PAK { - displayName = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_Description); - }; - class useLocation_SurgicalKit: useLocation_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); - }; - class useCondition_SurgicalKit: useCondition_PAK { - displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); - description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); - class values { - class AnyTime { name = CSTRING(AnyTime); value = 0; default = 1; }; - class Stable { name = CSTRING(Stable); value = 1; }; - }; - }; - class healHitPointAfterAdvBandage { - displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); - description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); - typeName = "BOOL"; - defaultValue = 0; - }; - class painIsOnlySuppressed { - displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); - description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); - typeName = "BOOL"; - defaultValue = 1; - }; - }; - - class ModuleDescription { - description = CSTRING(AdvancedMedicalSettings_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleReviveSettings: ACE_Module { - scope = 1; - displayName = CSTRING(ReviveSettings_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QUOTE(DFUNC(moduleReviveSettings)); - functionPriority = 1; - isGlobal = 1; - isSingular = 1; - isTriggerActivated = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class enableRevive { - displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); - description = CSTRING(ReviveSettings_enableRevive_Description); - typeName = "NUMBER"; - defaultValue = 0; - class values { - class disable { name = ECSTRING(common,Disabled); value = 0; default = 1;}; - class playerOnly { name = CSTRING(playeronly); value = 1; }; - class playerAndAI { name = CSTRING(playersandai); value = 2; }; - }; - }; - class maxReviveTime { - displayName = CSTRING(ReviveSettings_maxReviveTime_DisplayName); - description = CSTRING(ReviveSettings_maxReviveTime_Description); - typeName = "NUMBER"; - defaultValue = 120; - }; - class amountOfReviveLives { - displayName = CSTRING(ReviveSettings_amountOfReviveLives_DisplayName); - description = CSTRING(ReviveSettings_amountOfReviveLives_Description); - typeName = "NUMBER"; - defaultValue = -1; - }; - }; - - class ModuleDescription { - description = CSTRING(ReviveSettings_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleAssignMedicRoles: Module_F { - scope = 1; - displayName = CSTRING(AssignMedicRoles_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAssignMedicRoles); - functionPriority = 10; - isGlobal = 2; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class EnableList { - displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName); - description = CSTRING(AssignMedicRoles_EnableList_Description); - defaultValue = ""; - typeName = "STRING"; - }; - class role { - displayName = CSTRING(AssignMedicRoles_role_DisplayName); - description = CSTRING(AssignMedicRoles_role_Description); - typeName = "NUMBER"; - class values { - class none { - name = CSTRING(AssignMedicRoles_role_none); - value = 0; - }; - class medic { - name = CSTRING(AssignMedicRoles_role_medic); - value = 1; - default = 1; - }; - class doctor { - name = CSTRING(AssignMedicRoles_role_doctor); - value = 2; - }; - }; - }; - }; - - class ModuleDescription { - description = CSTRING(AssignMedicRoles_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleAssignMedicVehicle: Module_F { - scope = 1; - displayName = CSTRING(AssignMedicVehicle_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAssignMedicalVehicle); - functionPriority = 10; - isGlobal = 2; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class EnableList { - displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName); - description = CSTRING(AssignMedicVehicle_EnableList_Description); - defaultValue = ""; - typeName = "STRING"; - }; - class enabled { - displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); - description = CSTRING(AssignMedicVehicle_enabled_Description); - - typeName = "NUMBER"; - class values { - class none { - name = ECSTRING(common,No); - value = 0; - }; - class medic { - name = ECSTRING(common,Yes); - value = 1; - default = 1; - }; - }; - }; - }; - - class ModuleDescription { - description = CSTRING(AssignMedicVehicle_Module_Description); - sync[] = {}; - }; - }; - - class ACE_moduleAssignMedicalFacility: Module_F { - scope = 1; - displayName = CSTRING(AssignMedicalFacility_Module_DisplayName); - icon = QPATHTOF(UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QFUNC(moduleAssignMedicalFacility); - functionPriority = 10; - isGlobal = 2; - isTriggerActivated = 0; - isDisposable = 0; - author = ECSTRING(common,ACETeam); - - class Arguments { - class enabled { - displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); - description = CSTRING(AssignMedicalFacility_enabled_Description); - typeName = "BOOL"; - }; - }; - - class ModuleDescription { - description = CSTRING(AssignMedicalFacility_Module_Description); - sync[] = {}; - }; - }; - - #define ARM_LEG_ARMOR_DEFAULT 1 - #define ARM_LEG_ARMOR_BETTER 1 - #define ARM_LEG_ARMOR_CSAT 1 - - #define ADD_ACE_HITPOINTS(ARM_ARMOR,LEG_ARMOR) \ - class HitLeftArm { \ - armor = ARM_ARMOR; \ - material = -1; \ - name = "hand_l"; \ - passThrough = 1; \ - radius = 0.08; \ - explosionShielding = 1; \ - visual = "injury_hands"; \ - minimalHit = 0.01; \ - }; \ - class HitRightArm: HitLeftArm { \ - name = "hand_r"; \ - }; \ - class HitLeftLeg { \ - armor = LEG_ARMOR; \ - material = -1; \ - name = "leg_l"; \ - passThrough = 1; \ - radius = 0.1; \ - explosionShielding = 1; \ - visual = "injury_legs"; \ - minimalHit = 0.01; \ - }; \ - class HitRightLeg: HitLeftLeg { \ - name = "leg_r"; \ - }; - - class Man; - class CAManBase: Man { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_DEFAULT,ARM_LEG_ARMOR_DEFAULT) - }; - - class ACE_SelfActions { - #include "ACE_Medical_SelfActions.hpp" - }; - - class ACE_Actions { - // Include actions in body parts for treatment while in the open - #define EXCEPTIONS exceptions[] = {"isNotSwimming"}; - #define ACTION_CONDITION condition = QUOTE(GVAR(menuTypeStyle) == 0); - #include "ACE_Medical_Actions.hpp" - - // Create a consolidates medical menu for treatment while boarded - class ACE_MainActions { - class Medical { - displayName = CSTRING(Actions_Medical); - runOnHover = 1; - exceptions[] = {"isNotInside"}; - condition = QUOTE((vehicle _target != _target && vehicle _target == vehicle _player) || GVAR(menuTypeStyle) == 1); - statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); - icon = QPATHTOF(UI\icons\medical_cross.paa); - - #undef EXCEPTIONS - #undef ACTION_CONDITION - #define EXCEPTIONS exceptions[] = {"isNotInside", "isNotSwimming"}; - #define ACTION_CONDITION condition = "true"; - #include "ACE_Medical_Actions.hpp" - }; - class GVAR(loadPatient) { - displayName = CSTRING(LoadPatient); - distance = 5; - condition = QUOTE(_target getVariable [ARR_2(QUOTE(QUOTE(ACE_isUnconscious)), false)] && {alive _target} && {vehicle _target == _target}); - statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionLoadUnit)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotDragging", "isNotCarrying", "isNotSwimming"}; - insertChildren = QUOTE(call DFUNC(addLoadPatientActions)); - }; - class GVAR(UnLoadPatient) { - displayName = CSTRING(UnloadPatient); - distance = 5; - condition = QUOTE(_target getVariable [ARR_2(QUOTE(QUOTE(ACE_isUnconscious)), false)] && {alive _target} && {vehicle _target != _target} && {vehicle _player == _player}); - statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionUnloadUnit)); - showDisabled = 0; - icon = QPATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotDragging", "isNotCarrying", "isNotInside", "isNotSwimming"}; - }; - }; - }; - }; - - class SoldierWB: CAManBase {}; - class SoldierEB: CAManBase {}; - class SoldierGB: CAManBase {}; - - class B_Soldier_base_F: SoldierWB {}; - - class B_Soldier_04_f: B_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class B_Soldier_05_f: B_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class I_Soldier_base_F: SoldierGB {}; - - class I_Soldier_03_F: I_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class I_Soldier_04_F: I_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_BETTER,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_Soldier_base_F: SoldierEB { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_Soldier_diver_base_F: O_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_Soldier_02_F: O_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - class O_officer_F: O_Soldier_base_F { - class HitPoints { - ADD_ACE_HITPOINTS(ARM_LEG_ARMOR_CSAT,ARM_LEG_ARMOR_BETTER) - }; - }; - - //These VR guys already have limb hitpoints that we should be able to use - //Note: the selections are a little weird, eg: class leg_l {name = "leg_l";}; - // class B_Soldier_VR_F: B_Soldier_base_F { { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class O_Soldier_VR_F: O_Soldier_base_F { { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class I_Soldier_VR_F: I_Soldier_base_F { { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class C_Soldier_VR_F: C_man_1 { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - // class O_Protagonist_VR_F: O_Soldier_base_F { - // class HitPoints { - //Has class hand_l, hand_r, leg_l, leg_r Hitpoints already - // }; - // }; - - class MapBoard_altis_F; - class ACE_bodyBagObject: MapBoard_altis_F { - class EventHandlers { - class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; - }; - - scope = 1; - scopeCurator = 2; - side = -1; - model = QPATHTOEF(apl,ace_bodybag.p3d); - icon = ""; - displayName = CSTRING(Bodybag_Display); - EGVAR(dragging,canDrag) = 1; - EGVAR(dragging,dragPosition)[] = {0,1.2,0}; - EGVAR(dragging,dragDirection) = 0; - EGVAR(cargo,size) = 1; - EGVAR(cargo,canLoad) = 1; - hiddenSelections[] = {"camo"}; - hiddenSelectionsTextures[] = {QPATHTOEF(apl,data\bodybag_co.paa)}; - class ACE_Actions { - class ACE_MainActions { - displayName = ECSTRING(interaction,MainAction); - distance = 5; - condition = QUOTE(true); - statement = ""; - icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; - selection = ""; - }; - }; - }; - - // Medical litter classes - class Thing; - class ACE_MedicalLitterBase: Thing { - scope = 1; - scopeCurator = 0; - displayName = " "; - destrType = "DestructNo"; - model = QPATHTOF(data\littergeneric.p3d); - }; - class ACE_MedicalLitter_clean: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_clean.p3d); - }; - class ACE_MedicalLitter_bandage1: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_bandages1.p3d); - }; - class ACE_MedicalLitter_bandage2: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_bandages2.p3d); - }; - class ACE_MedicalLitter_bandage3: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_bandages3.p3d); - }; - class ACE_MedicalLitter_packingBandage: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_packingBandage.p3d); - }; - class ACE_MedicalLitter_gloves: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_gloves.p3d); - }; - class ACE_MedicalLitter_adenosine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_adenosine.p3d); - }; - class ACE_MedicalLitter_atropine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_atropine.p3d); - }; - class ACE_MedicalLitter_epinephrine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_epinephrine.p3d); - }; - class ACE_MedicalLitter_morphine: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_morphine.p3d); - }; - class ACE_MedicalLitter_QuickClot: ACE_MedicalLitterBase { - model = QPATHTOF(data\littergeneric_Quikclot.p3d); - }; - class Item_Base_F; - class ACE_fieldDressingItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Bandage_Basic_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_fieldDressing,1); - }; - }; - class ACE_packingBandageItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Packing_Bandage_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_packingBandage,1); - }; - }; - class ACE_elasticBandageItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Bandage_Elastic_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_elasticBandage,1); - }; - }; - class ACE_tourniquetItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Tourniquet_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_tourniquet,1); - }; - }; - class ACE_morphineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Morphine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_morphine,1); - }; - }; - class ACE_adenosineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Adenosine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_adenosine,1); - }; - }; - class ACE_atropineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Atropine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_atropine,1); - }; - }; - class ACE_epinephrineItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Epinephrine_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_epinephrine,1); - }; - }; - class ACE_plasmaIVItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Plasma_IV); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_plasmaIV,1); - }; - }; - - class ACE_bloodIVItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Blood_IV); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_bloodIV,1); - }; - }; - class ACE_salineIVItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Saline_IV); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_salineIV,1); - }; - }; - class ACE_quikClotItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(QuikClot_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_quikclot,1); - }; - }; - class ACE_personalAidKitItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Aid_Kit_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_personalAidKit,1); - }; - }; - class ACE_surgicalKitItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(SurgicalKit_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_surgicalKit,1); - }; - }; - class ACE_bodyBagItem: Item_Base_F { - scope = 2; - scopeCurator = 2; - displayName = CSTRING(Bodybag_Display); - author = ECSTRING(common,ACETeam); - vehicleClass = "Items"; - class TransportItems { - MACRO_ADDITEM(ACE_bodyBag,1); - }; - }; - - class ThingX; - class ReammoBox_F: ThingX { - class ACE_Actions; - }; - class NATO_Box_Base: ReammoBox_F { - class ACE_Actions: ACE_Actions { - class ACE_MainActions; - }; - }; - class ACE_medicalSupplyCrate: NATO_Box_Base { - scope = 2; - scopeCurator = 2; - accuracy = 1000; - displayName = CSTRING(medicalSupplyCrate); - model = QPATHTOF(data\ace_medcrate.p3d); - author = "ElTyranos"; - class TransportItems { - MACRO_ADDITEM(ACE_fieldDressing,50); - MACRO_ADDITEM(ACE_morphine,25); - MACRO_ADDITEM(ACE_epinephrine,25); - MACRO_ADDITEM(ACE_bloodIV,15); - MACRO_ADDITEM(ACE_bloodIV_500,15); - MACRO_ADDITEM(ACE_bloodIV_250,15); - MACRO_ADDITEM(ACE_bodyBag,10); - }; - class AnimationSources { - class Cover { - source = "user"; - animPeriod = 1.5; - initPhase = 0; - minValue = 0; - maxValue = 1; - }; - }; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - selection = "cover_action"; - class ACE_OpenLid { - displayName = CSTRING(openLid); - condition = QUOTE(alive _target && {_target animationPhase 'Cover' < 0.5}); - statement = QUOTE(_target animate ARR_2(['Cover',1])); - showDisabled = 0; - }; - class ACE_CloseLid { - displayName = CSTRING(closeLid); - condition = QUOTE(alive _target && {_target animationPhase 'Cover' >= 0.5}); - statement = QUOTE(_target animate ARR_2(['Cover',0])); - showDisabled = 0; - }; - }; - }; - }; - class ACE_medicalSupplyCrate_advanced: ACE_medicalSupplyCrate { - displayName = CSTRING(medicalSupplyCrate_advanced); - class TransportItems { - MACRO_ADDITEM(ACE_fieldDressing,25); - MACRO_ADDITEM(ACE_packingBandage,25); - MACRO_ADDITEM(ACE_elasticBandage,25); - MACRO_ADDITEM(ACE_tourniquet,15); - MACRO_ADDITEM(ACE_morphine,15); - MACRO_ADDITEM(ACE_adenosine,15); - MACRO_ADDITEM(ACE_atropine,15); - MACRO_ADDITEM(ACE_epinephrine,15); - MACRO_ADDITEM(ACE_plasmaIV,7); - MACRO_ADDITEM(ACE_plasmaIV_500,7); - MACRO_ADDITEM(ACE_plasmaIV_250,7); - MACRO_ADDITEM(ACE_salineIV,7); - MACRO_ADDITEM(ACE_salineIV_500,7); - MACRO_ADDITEM(ACE_salineIV_250,7); - MACRO_ADDITEM(ACE_bloodIV,7); - MACRO_ADDITEM(ACE_bloodIV_500,7); - MACRO_ADDITEM(ACE_bloodIV_250,7); - MACRO_ADDITEM(ACE_quikClot,20); - MACRO_ADDITEM(ACE_personalAidKit,3); - MACRO_ADDITEM(ACE_surgicalKit,2); - MACRO_ADDITEM(ACE_bodyBag,5); - }; }; }; diff --git a/addons/medical/XEH_PREP.hpp b/addons/medical/XEH_PREP.hpp index 8f5a39e107..8cdc7feecf 100644 --- a/addons/medical/XEH_PREP.hpp +++ b/addons/medical/XEH_PREP.hpp @@ -1,119 +1,3 @@ - -PREP(actionCheckBloodPressure); -PREP(actionCheckBloodPressureLocal); -PREP(actionCheckPulse); -PREP(actionCheckPulseLocal); -PREP(actionCheckResponse); -PREP(actionDiagnose); -PREP(actionPlaceInBodyBag); -PREP(actionRemoveTourniquet); -PREP(actionLoadUnit); -PREP(actionUnloadUnit); PREP(addDamageToUnit); -PREP(addHeartRateAdjustment); -PREP(addLoadPatientActions); -PREP(addToLog); -PREP(addToTriageCard); -PREP(addUnconsciousCondition); -PREP(addUnloadPatientActions); -PREP(addVitalLoop); PREP(adjustPainLevel); -PREP(bodyCleanupLoop); -PREP(canAccessMedicalEquipment); -PREP(canTreat); -PREP(canTreatCached); -PREP(determineIfFatal); -PREP(getBloodLoss); -PREP(getBloodPressure); -PREP(getBloodVolumeChange); -PREP(getCardiacOutput); -PREP(getTypeOfDamage); -PREP(getHeartRateChange); -PREP(getTriageStatus); -PREP(getUnconsciousCondition); -PREP(handleDamage); -PREP(handleDamage_advanced); -PREP(handleDamage_advancedSetDamage); -PREP(handleDamage_airway); -PREP(handleDamage_caching); -PREP(handleDamage_fractures); -PREP(handleDamage_internalInjuries); -PREP(handleDamage_wounds); -PREP(handleDamage_woundsOld); -PREP(handleInit); -PREP(handleKilled); -PREP(handleLocal); -PREP(handleRespawn); -PREP(handleUnitVitals); -PREP(handleBandageOpening); -PREP(hasItem); -PREP(hasItems); -PREP(hasMedicalEnabled); -PREP(hasTourniquetAppliedTo); -PREP(init); -PREP(isBeingCarried); -PREP(isBeingDragged); -PREP(isInMedicalFacility); -PREP(isInMedicalVehicle); -PREP(isMedic); -PREP(isMedicalVehicle); -PREP(isInStableCondition); -PREP(itemCheck); -PREP(medicationEffectLoop); -PREP(modifyMedicalAction); -PREP(onMedicationUsage); -PREP(parseConfigForInjuries); -PREP(playInjuredSound); -PREP(reviveStateLoop); -PREP(selectionNameToNumber); -PREP(serverRemoveBody); -PREP(setCardiacArrest); -PREP(setDead); -PREP(setHitPointDamage); -PREP(setStructuralDamage); PREP(setUnconscious); -PREP(showBloodEffect); -PREP(translateSelections); -PREP(treatment); -PREP(treatment_failure); -PREP(treatment_success); -PREP(treatmentAdvanced_bandage); -PREP(treatmentAdvanced_bandageLocal); -PREP(treatmentAdvanced_CPR); -PREP(treatmentAdvanced_CPRLocal); -PREP(treatmentAdvanced_fullHeal); -PREP(treatmentAdvanced_fullHealLocal); -PREP(treatmentAdvanced_fullHealTreatmentTime); -PREP(treatmentAdvanced_medication); -PREP(treatmentAdvanced_medicationLocal); -PREP(treatmentAdvanced_surgicalKit_onProgress); -PREP(treatmentBasic_bloodbag); -PREP(treatmentBasic_bloodbagLocal); -PREP(treatmentBasic_epipen); -PREP(treatmentBasic_morphine); -PREP(treatmentBasic_morphineLocal); -PREP(treatmentIV); -PREP(treatmentIVLocal); -PREP(treatmentTourniquet); -PREP(treatmentTourniquetLocal); -PREP(useItem); -PREP(useItems); -PREP(vitalLoop); -PREP(displayPatientInformation); -PREP(displayTriageCard); -PREP(dropDownTriageCard); -PREP(moduleMedicalSettings); -PREP(moduleBasicMedicalSettings); -PREP(moduleAdvancedMedicalSettings); -PREP(moduleReviveSettings); -PREP(moduleAssignMedicRoles); -PREP(moduleAssignMedicalVehicle); -PREP(moduleAssignMedicalFacility); -PREP(copyDeadBody); -PREP(unconsciousPFH); -PREP(updateTourniquets); - -// Networked litter -PREP(createLitter); -PREP(handleCreateLitter); -PREP(litterCleanupLoop); diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 991124fcb1..5dd19195e8 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -1,313 +1,17 @@ -// ACE Medical System Visual Loop - +// #define DEBUG_MODE_FULL #include "script_component.hpp" -GVAR(heartBeatSounds_Fast) = ["ACE_heartbeat_fast_1", "ACE_heartbeat_fast_2", "ACE_heartbeat_fast_3"]; -GVAR(heartBeatSounds_Normal) = ["ACE_heartbeat_norm_1", "ACE_heartbeat_norm_2"]; -GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; +[QEGVAR(medical,setUnconscious), LINKFUNC(setUnconscious)] call CBA_fnc_addEventHandler; -["ace_interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call CBA_fnc_addEventHandler; +if (!hasInterface) exitWith {}; -//Treatment EventHandlers: -[QGVAR(actionCheckBloodPressureLocal), DFUNC(actionCheckBloodPressureLocal)] call CBA_fnc_addEventHandler; -[QGVAR(actionCheckPulseLocal), DFUNC(actionCheckPulseLocal)] call CBA_fnc_addEventHandler; -[QGVAR(addVitalLoop), DFUNC(addVitalLoop)] call CBA_fnc_addEventHandler; -[QGVAR(addToMedicalLog), DFUNC(addToLog)] call CBA_fnc_addEventHandler; -[QGVAR(addToTriageCard), DFUNC(addToTriageCard)] call CBA_fnc_addEventHandler; -[QGVAR(setDead), DFUNC(setDead)] call CBA_fnc_addEventHandler; -[QGVAR(setHitPointDamage), DFUNC(setHitPointDamage)] call CBA_fnc_addEventHandler; -[QGVAR(setUnconscious), DFUNC(setUnconscious)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_bandageLocal), DFUNC(treatmentAdvanced_bandageLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_CPRLocal), DFUNC(treatmentAdvanced_CPRLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_fullHealLocal), DFUNC(treatmentAdvanced_fullHealLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentAdvanced_medicationLocal), DFUNC(treatmentAdvanced_medicationLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentBasic_bloodbagLocal), DFUNC(treatmentBasic_bloodbagLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentBasic_morphineLocal), DFUNC(treatmentBasic_morphineLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentIVLocal), DFUNC(treatmentIVLocal)] call CBA_fnc_addEventHandler; -[QGVAR(treatmentTourniquetLocal), DFUNC(treatmentTourniquetLocal)] call CBA_fnc_addEventHandler; -[QGVAR(actionPlaceInBodyBag), FUNC(actionPlaceInBodyBag)] call CBA_fnc_addEventHandler; +[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { + private _pain = GET_PAIN_PERCEIVED(ACE_player); -//Handle Deleting Bodies and creating litter on Server: -if (isServer) then { - ["ace_placedInBodyBag", FUNC(serverRemoveBody)] call CBA_fnc_addEventHandler; - [QGVAR(createLitterServer), FUNC(handleCreateLitter)] call CBA_fnc_addEventHandler; - addMissionEventHandler ["BuildingChanged", { - if (isNil QGVAR(allCreatedLitter)) exitWith {}; - params ["_buildingOld", "_buildingNew", "_isRuin"]; - TRACE_3("BuildingChanged",_buildingOld,_buildingNew,_isRuin); - private _radius = sizeOf typeOf _buildingOld / 2; - TRACE_1("",_radius); - { - _x params ["", "_objects"]; - if (({(_x distance2d _buildingOld) < _radius && {getPos _x select 2 > 0.1}} count _objects) > 0) then { - GVAR(allCreatedLitter) deleteAt (GVAR(allCreatedLitter) find _x); - { TRACE_1("deleting",_x); deleteVehicle _x } forEach _objects; - }; - } forEach (+GVAR(allCreatedLitter)); - }]; -}; + linearConversion [0, 1, _pain, 1, 5, true]; +}] call EFUNC(common,arithmeticSetSource); -["ace_unconscious", { - params ["_unit", "_status"]; - if (local _unit) then { - if (_status) then { - _unit setVariable ["tf_voiceVolume", 0, true]; - _unit setVariable ["tf_unable_to_use_radio", true, true]; - - _unit setVariable ["acre_sys_core_isDisabled", true, true]; - } else { - _unit setVariable ["tf_voiceVolume", 1, true]; - _unit setVariable ["tf_unable_to_use_radio", false, true]; - - _unit setVariable ["acre_sys_core_isDisabled", false, true]; - }; - }; -}] call CBA_fnc_addEventHandler; - - -// Initialize all effects -if (hasInterface) then { - -_fnc_createEffect = { - params ["_type", "_layer", "_default"]; - - private _effect = ppEffectCreate [_type, _layer]; - _effect ppEffectForceInNVG true; - _effect ppEffectAdjust _default; - _effect ppEffectCommit 0; - - _effect -}; - -GVAR(effectUnconsciousCC) = [ - "ColorCorrections", - 4201, - [1,1,0, [0,0,0,1], [0,0,0,0], [1,1,1,1], [0.4,0.4,0,0,0,0.1,0.3]] -] call _fnc_createEffect; - -GVAR(effectUnconsciousRB) = [ - "RadialBlur", - 4202, - [0.01,0.01,0,0] -] call _fnc_createEffect; - -GVAR(effectBlindingCC) = [ - "ColorCorrections", - 4203, - [1,1,0, [1,1,1,0], [0,0,0,1], [0,0,0,0]] -] call _fnc_createEffect; - -GVAR(effectBloodVolumeCC) = [ - "ColorCorrections", - 4204, - [1,1,0, [0,0,0,0], [1,1,1,1], [0.2,0.2,0.2,0]] -] call _fnc_createEffect; - -GVAR(effectPainCA) = [ - "chromAberration", - 4205, - [0, 0, false] -] call _fnc_createEffect; - -GVAR(effectPainCC) = [ - "ColorCorrections", - 4206, - [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1.3,1.3,0,0,0,0.2,2]] -] call _fnc_createEffect; - -// Initialize Other Variables -GVAR(effectBlind) = false; -GVAR(effectTimeBlood) = CBA_missionTime; - -// MAIN EFFECTS LOOP -[{ - // Zeus interface is open or player is dead; disable everything - if (!(isNull curatorCamera) or !(alive ACE_player)) exitWith { - GVAR(effectUnconsciousCC) ppEffectEnable false; - GVAR(effectUnconsciousRB) ppEffectEnable false; - GVAR(effectBlindingCC) ppEffectEnable false; - GVAR(effectBloodVolumeCC) ppEffectEnable false; - GVAR(effectPainCA) ppEffectEnable false; - GVAR(effectPainCC) ppEffectEnable false; - ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); - }; - - // Unconsciousness effect - if (ACE_player getVariable ["ACE_isUnconscious", false]) then { - GVAR(effectUnconsciousCC) ppEffectEnable true; - GVAR(effectUnconsciousRB) ppEffectEnable true; - GVAR(effectBlind) = true; - ["unconscious", true] call EFUNC(common,setDisableUserInputStatus); - } else { - GVAR(effectUnconsciousCC) ppEffectEnable false; - GVAR(effectUnconsciousRB) ppEffectEnable false; - ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); - if (GVAR(effectBlind)) then { - _strength = 0.78 * (call EFUNC(common,ambientBrightness)); - GVAR(effectBlindingCC) ppEffectEnable true; - GVAR(effectBlindingCC) ppEffectAdjust [1,1,_strength, [1,1,1,0], [0,0,0,1], [0,0,0,0]]; - GVAR(effectBlindingCC) ppEffectCommit 0; - - [{ - GVAR(effectBlindingCC) ppEffectAdjust [1,1,0, [1,1,1,0], [0,0,0,1], [0,0,0,0]]; - GVAR(effectBlindingCC) ppEffectCommit ((_this select 0) * 2); - }, [_strength], 0.01, 0] call CBA_fnc_waitAndExecute; - - [{ - GVAR(effectBlindingCC) ppEffectEnable false; - }, [], (_strength * 2) + 0.5, 0] call CBA_fnc_waitAndExecute; - - GVAR(effectBlind) = false; - }; - }; - - private _bleeding = [ACE_player] call FUNC(getBloodLoss); - // Bleeding Indicator - if (_bleeding > 0 and GVAR(effectTimeBlood) + 3.5 < CBA_missionTime) then { - GVAR(effectTimeBlood) = CBA_missionTime; - [600 * _bleeding] call FUNC(showBloodEffect); - }; - - // Blood Volume Effect - private _blood = if (GVAR(level) < 2) then { - (ACE_player getVariable [QGVAR(bloodVolume), 100]) / 100; - } else { - (((ACE_player getVariable [QGVAR(bloodVolume), 100]) - 60) max 0) / 40; - }; - - if (_blood > 0.99) then { - GVAR(effectBloodVolumeCC) ppEffectEnable false; - } else { - GVAR(effectBloodVolumeCC) ppEffectEnable true; - GVAR(effectBloodVolumeCC) ppEffectAdjust [1,1,0, [0,0,0,0], [1,1,1,_blood], [0.2,0.2,0.2,0]]; - GVAR(effectBloodVolumeCC) ppEffectCommit 0; - }; -}, 0.5, []] call CBA_fnc_addPerFrameHandler; - - -GVAR(lastHeartBeat) = CBA_missionTime; -GVAR(lastHeartBeatSound) = CBA_missionTime; - -// HEARTRATE BASED EFFECTS -[{ - private _heartRate = ACE_player getVariable [QGVAR(heartRate), 70]; - private _pain = ACE_player getVariable [QGVAR(pain), 0]; - if (GVAR(level) == 1) then { - _heartRate = 60 + 40 * _pain; - }; - if (_heartRate <= 0) exitWith {}; - private _interval = 60 / (_heartRate min 40); - - if ((ACE_player getVariable ["ACE_isUnconscious", false])) then { - if (GVAR(painEffectType) == 1) then { - GVAR(effectPainCA) ppEffectEnable false; - } else { - GVAR(effectPainCC) ppEffectEnable false; - }; - } else { - if ((CBA_missionTime > GVAR(lastHeartBeat) + _interval)) then { - GVAR(lastHeartBeat) = CBA_missionTime; - - // Pain effect, no pain effect in zeus camera - if (isNull curatorCamera) then { - private _strength = ((_pain - (ACE_player getVariable [QGVAR(painSuppress), 0])) max 0) min 1; - _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); - if (GVAR(painEffectType) == 1) then { - GVAR(effectPainCC) ppEffectEnable false; - if (_pain > (ACE_player getVariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.15; - GVAR(effectPainCA) ppEffectEnable true; - GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call CBA_fnc_waitAndExecute; - } else { - GVAR(effectPainCA) ppEffectEnable false; - }; - } else { - GVAR(effectPainCA) ppEffectEnable false; - if (_pain > (ACE_player getVariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.9; - GVAR(effectPainCC) ppEffectEnable true; - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call CBA_fnc_waitAndExecute; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call CBA_fnc_waitAndExecute; - } else { - GVAR(effectPainCC) ppEffectEnable false; - }; - }; - }; - }; - }; - - if (GVAR(level) >= 2 && {_heartRate > 0}) then { - private _minTime = 60 / _heartRate; - if (CBA_missionTime - GVAR(lastHeartBeatSound) > _minTime) then { - GVAR(lastHeartBeatSound) = CBA_missionTime; - // Heart rate sound effect - if (_heartRate < 60) then { - private _sound = GVAR(heartBeatSounds_Normal) select (random((count GVAR(heartBeatSounds_Normal)) -1)); - playSound _sound; - } else { - if (_heartRate > 150) then { - playSound "ACE_heartbeat_fast_2"; - }; - }; - }; - }; - -}, 0, []] call CBA_fnc_addPerFrameHandler; -}; - -["ace_settingsInitialized", { - [ - {(((_this select 0) getVariable [QGVAR(bloodVolume), 100]) < 65)}, - {(((_this select 0) getVariable [QGVAR(pain), 0]) - ((_this select 0) getVariable [QGVAR(painSuppress), 0])) > 0.9}, - {(([_this select 0] call FUNC(getBloodLoss)) > 0.25)}, - {((_this select 0) getVariable [QGVAR(inReviveState), false])}, - {((_this select 0) getVariable [QGVAR(inCardiacArrest), false])}, - {((_this select 0) getVariable ["ACE_isDead", false])} - ] call FUNC(addUnconsciousCondition); - -}] call CBA_fnc_addEventHandler; - -// Prevent all types of interaction while unconscious -// @todo: probably remove this when CBA keybind hold key works properly -["isNotUnconscious", {!((_this select 0) getVariable ["ACE_isUnconscious", false])}] call EFUNC(common,addCanInteractWithCondition); - -// Item Event Handler -["loadout", FUNC(itemCheck)] call CBA_fnc_addPlayerEventHandler; - -if (hasInterface) then { - ["ace_playerJIP", { - INFO("JIP Medical init for player."); - [player] call FUNC(init); - }] call CBA_fnc_addEventHandler; -}; - -if (["ACE_Arsenal"] call EFUNC(common,isModLoaded)) then { - [QEGVAR(arsenal,displayOpened), { - EGVAR(arsenal,virtualItems) set [17, (EGVAR(arsenal,virtualItems) select 17) - ["FirstAidKit", "Medikit"]]; - }] call CBA_fnc_addEventHandler; -}; +#ifdef DEBUG_MODE_FULL + call compile preprocessFileLineNumbers QPATHTOF(dev\watchVariable.sqf); + call compile preprocessFileLineNumbers QPATHTOF(dev\debugDisplay.sqf); +#endif diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 51c2c16688..aac77adab9 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -6,57 +6,12 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -GVAR(injuredUnitCollection) = []; - -private _versionEx = "ace_medical" callExtension "version"; -DFUNC(handleDamage_assignWounds) = if (_versionEx == "") then { - DFUNC(handleDamage_woundsOld) -} else { - DFUNC(handleDamage_wounds) -}; - -call FUNC(parseConfigForInjuries); - -GVAR(HITPOINTS) = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; -GVAR(SELECTIONS) = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; - -//Hack for #3168 (units in static weapons do not take any damage): -//doing a manual pre-load with a small distance seems to fix the LOD problems with handle damage not returning full results -GVAR(fixedStatics) = []; -private _fixStatic = { - params ["_vehicle"]; - private _vehType = typeOf _vehicle; - TRACE_2("",_vehicle,_vehType); - if (!(_vehType in GVAR(fixedStatics))) then { - GVAR(fixedStatics) pushBack _vehType; - TRACE_1("starting preload",_vehType); - [{ - 1 preloadObject (_this select 0); - }, { - TRACE_1("preload done",_this); - }, [_vehType]] call CBA_fnc_waitUntilAndExecute; - }; -}; -["StaticWeapon", "init", _fixStatic] call CBA_fnc_addClassEventHandler; -["Car", "init", _fixStatic] call CBA_fnc_addClassEventHandler; -["CAManBase", "Init", FUNC(handleInit)] call CBA_fnc_addClassEventHandler; -["CAManBase", "Respawn", FUNC(handleRespawn)] call CBA_fnc_addClassEventHandler; -["CAManBase", "Killed", FUNC(handleKilled)] call CBA_fnc_addClassEventHandler; -["CAManBase", "Local", FUNC(handleLocal)] call CBA_fnc_addClassEventHandler; - -addMissionEventHandler ["Loaded",{ - { - TRACE_1("starting preload (save load)",_x); - [{ - 1 preloadObject (_this select 0); - }, { - TRACE_1("preload done",_this); - }, [_x]] call CBA_fnc_waitUntilAndExecute; - } forEach GVAR(fixedStatics); - - // Reload configs into extension (handle full game restart) - call FUNC(parseConfigForInjuries); -}]; +#include "initSettings.sqf" +// Add warning for old functions that were technically public, Remove at 3.14.0 +{ + missionNamespace setVariable [_x, compileFinal format ['diag_log text "ACE Medical WARNING: Formerly public function [%1] has no effect in medical rewrite."; nil', _x]]; +} forEach ["ace_medical_fnc_actionPlaceInBodyBag","ace_medical_fnc_actionRemoveTourniquet","ace_medical_fnc_addHeartRateAdjustment","ace_medical_fnc_addToLog","ace_medical_fnc_addToTriageCard +","ace_medical_fnc_addUnconsciousCondition","ace_medical_fnc_addVitalLoop","ace_medical_fnc_canAccessMedicalEquipment","ace_medical_fnc_canTreat","ace_medical_fnc_displayTriageCard","ace_medical_fnc_dropDownTriageCard","ace_medical_fnc_getTriageStatus","ace_medical_fnc_getUnconsciousCondition","ace_medical_fnc_hasItem","ace_medical_fnc_hasItems","ace_medical_fnc_hasTourniquetAppliedTo","ace_medical_fnc_isInMedicalFacility","ace_medical_fnc_isInMedicalVehicle","ace_medical_fnc_isMedic","ace_medical_fnc_isMedicalVehicle","ace_medical_fnc_itemCheck","ace_medical_fnc_selectionNameToNumber","ace_medical_fnc_setCardiacArrest","ace_medical_fnc_setDead","ace_medical_fnc_setHitPointDamage","ace_medical_fnc_showBloodEffect","ace_medical_fnc_treatment","ace_medical_fnc_treatmentAdvanced_bandage","ace_medical_fnc_treatmentAdvanced_CPR","ace_medical_fnc_treatmentAdvanced_CPRLocal","ace_medical_fnc_treatmentAdvanced_medication","ace_medical_fnc_treatmentAdvanced_medicationLocal","ace_medical_fnc_treatmentIV","ace_medical_fnc_treatmentIVLocal","ace_medical_fnc_unconsciousPFH","ace_medical_fnc_useItem","ace_medical_fnc_useItems"]; ADDON = true; diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 002c9e2cf4..0ba99d21f1 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -3,58 +3,17 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {"ACE_medicalSupplyCrate", "ACE_medicalSupplyCrate_advanced", "ACE_fieldDressingItem", "ACE_packingBandageItem", "ACE_elasticBandageItem", "ACE_tourniquetItem", "ACE_morphineItem", "ACE_atropineItem", "ACE_epinephrineItem", "ACE_plasmaIVItem", "ACE_bloodIVItem", "ACE_salineIVItem", "ACE_quikclotItem", "ACE_personalAidKitItem", "ACE_surgicalKitItem", "ACE_bodyBagItem", "ACE_bodyBagObject"}; - weapons[] = {"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_tourniquet", "ACE_morphine", "ACE_atropine", "ACE_epinephrine", "ACE_plasmaIV", "ACE_plasmaIV_500", "ACE_plasmaIV_250", "ACE_bloodIV", "ACE_bloodIV_500", "ACE_bloodIV_250", "ACE_salineIV", "ACE_salineIV_500", "ACE_salineIV_250", "ACE_quikclot", "ACE_personalAidKit", "ACE_surgicalKit", "ACE_bodyBag"}; + units[] = {}; + weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interaction", "ace_apl"}; + requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); - authors[] = {"Glowbal", "KoffeinFlummi"}; + authors[] = {"Glowbal", "KoffeinFlummi","Arcanum417"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; }; -#include "CfgActions.hpp" -#include "CfgEventHandlers.hpp" -#include "CfgFactionClasses.hpp" -#include "CfgVehicles.hpp" -#include "CfgWeapons.hpp" -#include "CfgSounds.hpp" -#include "CfgEden.hpp" -#include "ACE_Medical_Treatments.hpp" #include "ACE_Settings.hpp" -#include "ui\CfgInGameUI.hpp" -#include "ui\RscTitles.hpp" -#include "ui\triagecard.hpp" - -class ACE_newEvents { - medical_onUnconscious = "ace_unconscious"; - medical_treatmentSuccess = "ace_treatmentSucceded"; - medical_onSetDead = "ace_killed"; - Medical_onEnteredCardiacArrest = "ace_cardiacArrestEntered"; - Medical_onItemAddedToTriageCard = "ace_triageCardItemAdded"; - medical_onLogEntryAdded = "ace_medicalLogEntryAdded"; - Medical_onHeartRateAdjustmentAdded = "ace_heartRateAdjustmentAdded"; - placedInBodyBag = "ace_placedInBodyBag"; - actionPlaceInBodyBag = QGVAR(actionPlaceInBodyBag); - treatmentTourniquetLocal = QGVAR(treatmentTourniquetLocal); - treatmentIVLocal = QGVAR(treatmentIVLocal); - treatmentBasic_morphineLocal = QGVAR(treatmentBasic_morphineLocal); - treatmentBasic_bloodbagLocal = QGVAR(treatmentBasic_bloodbagLocal); - treatmentAdvanced_medicationLocal = QGVAR(treatmentAdvanced_medicationLocal); - treatmentAdvanced_fullHealLocal = QGVAR(treatmentAdvanced_fullHealLocal); - treatmentAdvanced_CPRLocal = QGVAR(treatmentAdvanced_CPRLocal); - treatmentAdvanced_bandageLocal = QGVAR(treatmentAdvanced_bandageLocal); - setUnconscious = QGVAR(setUnconscious); - setHitPointDamage = QGVAR(setHitPointDamage); - setDead = QGVAR(setDead); - addToTriageCard = QGVAR(addToTriageCard); - addToMedicalLog = QGVAR(addToMedicalLog); - actionCheckPulseLocal = QGVAR(actionCheckPulseLocal); - actionCheckBloodPressureLocal = QGVAR(actionCheckBloodPressureLocal); - addVitalLoop = QGVAR(addVitalLoop); -}; - -class ACE_Extensions { - extensions[] += {"ace_medical"}; -}; +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/medical/data/IVBag_1000ml.p3d b/addons/medical/data/IVBag_1000ml.p3d deleted file mode 100644 index e76108b4ff..0000000000 Binary files a/addons/medical/data/IVBag_1000ml.p3d and /dev/null differ diff --git a/addons/medical/data/IVBag_250ml.p3d b/addons/medical/data/IVBag_250ml.p3d deleted file mode 100644 index 1e727c45d8..0000000000 Binary files a/addons/medical/data/IVBag_250ml.p3d and /dev/null differ diff --git a/addons/medical/data/IVBag_500ml.p3d b/addons/medical/data/IVBag_500ml.p3d deleted file mode 100644 index 569244fe88..0000000000 Binary files a/addons/medical/data/IVBag_500ml.p3d and /dev/null differ diff --git a/addons/medical/data/QuikClot.p3d b/addons/medical/data/QuikClot.p3d deleted file mode 100644 index 9fe747cb54..0000000000 Binary files a/addons/medical/data/QuikClot.p3d and /dev/null differ diff --git a/addons/medical/data/ace_medcrate.p3d b/addons/medical/data/ace_medcrate.p3d deleted file mode 100644 index 6158b3c972..0000000000 Binary files a/addons/medical/data/ace_medcrate.p3d and /dev/null differ diff --git a/addons/medical/data/adenosine.p3d b/addons/medical/data/adenosine.p3d deleted file mode 100644 index fa9fb72c84..0000000000 Binary files a/addons/medical/data/adenosine.p3d and /dev/null differ diff --git a/addons/medical/data/atropine.p3d b/addons/medical/data/atropine.p3d deleted file mode 100644 index fa9fb72c84..0000000000 Binary files a/addons/medical/data/atropine.p3d and /dev/null differ diff --git a/addons/medical/data/bandage.p3d b/addons/medical/data/bandage.p3d deleted file mode 100644 index 23540f10d9..0000000000 Binary files a/addons/medical/data/bandage.p3d and /dev/null differ diff --git a/addons/medical/data/bodybagItem.p3d b/addons/medical/data/bodybagItem.p3d deleted file mode 100644 index 73b3bfe404..0000000000 Binary files a/addons/medical/data/bodybagItem.p3d and /dev/null differ diff --git a/addons/medical/data/epinephrine.p3d b/addons/medical/data/epinephrine.p3d deleted file mode 100644 index 45f0aee1f7..0000000000 Binary files a/addons/medical/data/epinephrine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric.p3d b/addons/medical/data/littergeneric.p3d deleted file mode 100644 index 801a6f5a4f..0000000000 Binary files a/addons/medical/data/littergeneric.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_Quikclot.p3d b/addons/medical/data/littergeneric_Quikclot.p3d deleted file mode 100644 index e54e331721..0000000000 Binary files a/addons/medical/data/littergeneric_Quikclot.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_adenosine.p3d b/addons/medical/data/littergeneric_adenosine.p3d deleted file mode 100644 index 4490a11c0e..0000000000 Binary files a/addons/medical/data/littergeneric_adenosine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_atropine.p3d b/addons/medical/data/littergeneric_atropine.p3d deleted file mode 100644 index 4490a11c0e..0000000000 Binary files a/addons/medical/data/littergeneric_atropine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_bandages1.p3d b/addons/medical/data/littergeneric_bandages1.p3d deleted file mode 100644 index bdbc447178..0000000000 Binary files a/addons/medical/data/littergeneric_bandages1.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_bandages2.p3d b/addons/medical/data/littergeneric_bandages2.p3d deleted file mode 100644 index 7b48675370..0000000000 Binary files a/addons/medical/data/littergeneric_bandages2.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_bandages3.p3d b/addons/medical/data/littergeneric_bandages3.p3d deleted file mode 100644 index 7b48675370..0000000000 Binary files a/addons/medical/data/littergeneric_bandages3.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_clean.p3d b/addons/medical/data/littergeneric_clean.p3d deleted file mode 100644 index 0ebddf30ca..0000000000 Binary files a/addons/medical/data/littergeneric_clean.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_epinephrine.p3d b/addons/medical/data/littergeneric_epinephrine.p3d deleted file mode 100644 index 8246ef607e..0000000000 Binary files a/addons/medical/data/littergeneric_epinephrine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_gloves.p3d b/addons/medical/data/littergeneric_gloves.p3d deleted file mode 100644 index ca92017688..0000000000 Binary files a/addons/medical/data/littergeneric_gloves.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_morphine.p3d b/addons/medical/data/littergeneric_morphine.p3d deleted file mode 100644 index 906280227c..0000000000 Binary files a/addons/medical/data/littergeneric_morphine.p3d and /dev/null differ diff --git a/addons/medical/data/littergeneric_packingbandage.p3d b/addons/medical/data/littergeneric_packingbandage.p3d deleted file mode 100644 index 185b8a73ff..0000000000 Binary files a/addons/medical/data/littergeneric_packingbandage.p3d and /dev/null differ diff --git a/addons/medical/data/morphine.p3d b/addons/medical/data/morphine.p3d deleted file mode 100644 index 3328630ac9..0000000000 Binary files a/addons/medical/data/morphine.p3d and /dev/null differ diff --git a/addons/medical/data/packingbandage.p3d b/addons/medical/data/packingbandage.p3d deleted file mode 100644 index 0e083c4766..0000000000 Binary files a/addons/medical/data/packingbandage.p3d and /dev/null differ diff --git a/addons/medical/data/packingbandage.rvmat b/addons/medical/data/packingbandage.rvmat deleted file mode 100644 index ba2fdfb2e6..0000000000 --- a/addons/medical/data/packingbandage.rvmat +++ /dev/null @@ -1,32 +0,0 @@ -ambient[]={1,1,1,1}; -diffuse[]={0.5,0.5,0.5,1}; -forcedDiffuse[]={0.5,0.5,0.5,0}; -emmisive[]={0,0,0,0}; -specular[]={0,0,0,0}; -specularPower=0; -PixelShaderID="NormalMapSpecularDIMap"; -VertexShaderID="NormalMap"; -class Stage1 -{ - texture="z\ace\addons\medical\data\packingbandage_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,1}; - pos[]={0,0,0}; - }; -}; -class Stage2 -{ - texture= "#(argb,8,8,3)color(0,0,0,1,SMDI)"; - uvSource="tex"; - class uvTransform - { - aside[]={0,0,0}; - up[]={0,0,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; diff --git a/addons/medical/data/quikclot.rvmat b/addons/medical/data/quikclot.rvmat deleted file mode 100644 index 778e9812e1..0000000000 --- a/addons/medical/data/quikclot.rvmat +++ /dev/null @@ -1,82 +0,0 @@ -class StageTI -{ - texture="a3\data_f\default_ti_ca.paa"; -}; -ambient[]={1,1,1,1}; -diffuse[]={1,1,1,1}; -forcedDiffuse[]={0,0,0,0}; -emmisive[]={0,0,0,1}; -specular[]={0.050000008,0.050000008,0.050000008,1}; -specularPower=50; -PixelShaderID="Super"; -VertexShaderID="Super"; -class Stage1 -{ - texture="z\ace\addons\medical\data\quikclot_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage2 -{ - texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; - uvSource="tex"; - class uvTransform - { - aside[]={0,9,0}; - up[]={4.5,0,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage3 -{ - texture="#(argb,8,8,3)color(0,0,0,0)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage4 -{ - texture="#(argb,8,8,3)color(1,1,1,1,AS)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage5 -{ - texture="#(argb,8,8,3)color(1,1,1,1,SMDI)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage6 -{ - texture="#(ai,64,64,1)fresnel(1.5,1.22)"; - uvSource="none"; -}; -class Stage7 -{ - texture="a3\data_f\env_land_co.paa"; - uvSource="none"; -}; diff --git a/addons/medical/data/surgical_kit.p3d b/addons/medical/data/surgical_kit.p3d deleted file mode 100644 index f820ea6078..0000000000 Binary files a/addons/medical/data/surgical_kit.p3d and /dev/null differ diff --git a/addons/medical/data/surgical_kit.rvmat b/addons/medical/data/surgical_kit.rvmat deleted file mode 100644 index 71d266f668..0000000000 --- a/addons/medical/data/surgical_kit.rvmat +++ /dev/null @@ -1,92 +0,0 @@ -ambient[]={1,1,1,1}; -diffuse[]={1,1,1,1}; -forcedDiffuse[]={0,0,0,0}; -emmisive[]={0,0,0,1}; -specular[]={0.70399898,0.70399898,0.70399898,0}; -specularPower=70; -PixelShaderID="Super"; -VertexShaderID="Super"; -class Stage1 -{ - texture="z\ace\addons\medical\data\surgical_kit_nohq.paa"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage2 -{ - texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage3 -{ - texture="#(argb,8,8,3)color(0,0,0,0,MC)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage4 -{ - texture="#(argb,8,8,3)color(1,1,1,1,AS)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage5 -{ - texture="#(argb,8,8,3)color(0,0.05,1,1,SMDI)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage6 -{ - texture="#(ai,32,128,1)fresnel(0.98,1.02)"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; -class Stage7 -{ - texture="z\ace\addons\apl\data\env_co.tga"; - uvSource="tex"; - class uvTransform - { - aside[]={1,0,0}; - up[]={0,1,0}; - dir[]={0,0,0}; - pos[]={0,0,0}; - }; -}; diff --git a/addons/medical/data/tourniquet.p3d b/addons/medical/data/tourniquet.p3d deleted file mode 100644 index 94a7e4c830..0000000000 Binary files a/addons/medical/data/tourniquet.p3d and /dev/null differ diff --git a/addons/medical/dev/debugDisplay.sqf b/addons/medical/dev/debugDisplay.sqf new file mode 100644 index 0000000000..3d8323f46b --- /dev/null +++ b/addons/medical/dev/debugDisplay.sqf @@ -0,0 +1,29 @@ +#include "\z\ace\addons\medical\script_component.hpp" + +[{!isNull findDisplay 46}, { + INFO("Creating Debug Display"); + if (!isNull (uiNamespace getVariable [QGVAR(debugControl), controlNull])) then { + ctrlDelete (uiNamespace getVariable [QGVAR(debugControl), controlNull]); // cleanup on SP Restart + }; + private _ctrl = findDisplay 46 ctrlCreate ["RscText", -1]; + _ctrl ctrlSetPosition [ + safeZoneX, + safeZoneY, + safeZoneW, + 40 * pixelH + ]; + _ctrl ctrlSetFontHeight (40 * pixelH); + _ctrl ctrlSetTextColor [0.6, 0, 0, 1]; + _ctrl ctrlCommit 0; + uiNamespace setVariable [QGVAR(debugControl), _ctrl]; + + [{ + private _playerState = [ACE_player, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + (uiNamespace getVariable [QGVAR(debugControl), controlNull]) ctrlSetText format ["Player state: %1", _playerState]; + + if (!isNull cursorTarget && {cursorTarget isKindOf "CAManBase"}) then { + private _targetState = [cursorTarget, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + drawIcon3D ["", [0.6, 0, 0, 1], cursorTarget modelToWorldVisual (cursorTarget selectionPosition "pelvis"), 0, 0, 0, format ["State: %1", _targetState], 2, 40 * pixelH, "RobotoCondensed"]; + }; + }, 0 ,[]] call CBA_fnc_addPerFrameHandler; +}, []] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/medical/dev/watchVariable.sqf b/addons/medical/dev/watchVariable.sqf new file mode 100644 index 0000000000..1c2e5eba71 --- /dev/null +++ b/addons/medical/dev/watchVariable.sqf @@ -0,0 +1,97 @@ +#include "\z\ace\addons\medical\script_component.hpp" + +["medical", { + + // Hide when patient display is up because they might overlap + if (!isNull EGVAR(medical_gui,displayPatientInformationTarget)) exitWith {""}; + + private _unit = cursorTarget; + if (!(_unit isKindOf "CAManBase")) then {_unit = cursorObject}; + if (!(_unit isKindOf "CAManBase")) then {_unit = ACE_player}; + if ((_unit != ACE_player) && {IS_UNCONSCIOUS(ACE_player)}) then {_unit = ACE_player}; + if (!(_unit isKindOf "CAManBase")) exitWith {"No Unit?"}; + + private _return = []; + + // Header: + _return pushBack format ["%2 [%3]", (["00FF00", "0000FF"] select (_unit == ACE_player)), [_unit] call EFUNC(common,getName), typeOf _unit]; + _return pushBack ""; + + // State: + private _hasStableVitals = [_unit] call EFUNC(medical_status,hasStableVitals); + private _targetState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + if (!local _unit) then {_targetState = "NotLocal";}; + private _color = switch (_targetState) do {case "Default": {"33FF33"}; case "Injured": {"FF3333"}; case "Unconscious": {"FF8833"}; case "CardiacArrest": {"FF33AA"}; default {"555555"}}; + private _unconcFlag = if IS_UNCONSCIOUS(_unit) then {"[U]"} else {""}; + _return pushBack format ["State: %2 [StableVitals: %3] %4", _color, _targetState, _hasStableVitals, _unconcFlag]; + + // Blood: + private _bloodVolume = GET_BLOOD_VOLUME(_unit); + private _bloodLoss = GET_BLOOD_LOSS(_unit); + private _secondsToHeartstop = if (_bloodLoss != 0) then {format ["[Time Left: %1 sec]", (((_bloodVolume - BLOOD_VOLUME_CLASS_4_HEMORRHAGE) max 0) / _bloodLoss) toFixed 1]} else {""}; + _return pushBack format ["Blood: %1", _bloodVolume toFixed 3]; + _return pushBack format [" - [Loss: %1] %2", _bloodLoss toFixed 5, _secondsToHeartstop]; + + // Heart: + private _cardiacOutput = [_unit] call EFUNC(medical_status,getCardiacOutput); + private _heartRate = GET_HEART_RATE(_unit); + GET_BLOOD_PRESSURE(_unit) params ["_bpLow", "_bpHigh"]; + _return pushBack format ["CardiacOutput %1", _cardiacOutput toFixed 5]; + _return pushBack format [" - [HR: %1] [BP: %2 / %3]", _heartRate toFixed 1, _bpLow toFixed 1, _bpHigh toFixed 1]; + + // Pain: + private _pain = GET_PAIN(_unit); + private _painSuppress = GET_PAIN_SUPPRESS(_unit); + private _painLevel = GET_PAIN_PERCEIVED(_unit); + _return pushBack format ["Effective Pain: %1", _painLevel toFixed 3]; + _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 _limping = if (_unit getVariable [QEGVAR(medical,isLimping), false]) then {"[ Limping ]"} else {""}; + _return pushBack format ["Damage: [H: %1] [B: %2] %3", (_damage select 0) toFixed 2, (_damage select 1) toFixed 2, _limping]; + _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]; + + + // Tourniquets: + _return pushBack "------- Tourniquets: -------"; + private _tourniquets = GET_TOURNIQUETS(_unit); + private _occludedMedications = _unit getVariable [QEGVAR(medical,occludedMedications), []]; + { + private _tPartNum = _forEachIndex; + if (_x != 0) then { + _return pushBack format ["%1 [Time On: %2]", ALL_SELECTIONS select _tPartNum, (CBA_missionTime - _x) toFixed 1]; + }; + { + _x params ["", "_medClassname", "_medPartNum"]; + if (_medPartNum == _tPartNum) then { + _return pushBack format [" - Occluded Med: %1", _medClassname]; + }; + } forEach _occludedMedications; + } forEach _tourniquets; + + + // Wounds: + _return pushBack "------- Wounds: -------"; + private _wounds = _unit getVariable [QEGVAR(medical,openWounds), []]; + { + _x params ["", "_xClassID", "_xBodyPartN", "_xAmountOf", "_xBleeding", "_xDamage", "_xCategory"]; + _return pushBack format ["%1: [%2-%3] [x%4] [Bld: %5] [Dmg: %6]", ALL_SELECTIONS select _xBodyPartN, _xClassID, _xCategory, _xAmountOf toFixed 1, _xBleeding toFixed 4, _xDamage toFixed 2]; + } forEach _wounds; + + + // IVs: + _return pushBack "------- IVs: -------"; + private _ivBags = _unit getVariable [QEGVAR(medical,ivBags), []]; + { + _x params ["_xVolumeAdded", "_xType", "_xBodyPartN"]; + _return pushBack format ["%1: %2 [%3 ml]", ALL_SELECTIONS select _xBodyPartN, _xType, _xVolumeAdded]; + } forEach _ivBags; + + // Footer: + _return pushBack ""; + + // Return: + _return joinString "
" +}, [30]] call EFUNC(common,watchVariable); + diff --git a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf deleted file mode 100644 index dfd930451f..0000000000 --- a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the blood pressure of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckBloodPressure - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName"]; -if (local _target) then { - [QGVAR(actionCheckBloodPressureLocal), [_caller, _target, _selectionName]] call CBA_fnc_localEvent; -} else { - [QGVAR(actionCheckBloodPressureLocal), [_caller, _target, _selectionName], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf deleted file mode 100644 index aa87f4889d..0000000000 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ /dev/null @@ -1,66 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Local callback for checking the blood pressure of a patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckBloodPressureLocal - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName"]; - -private _bloodPressure = if (!alive _target) then { - [0,0] -} else { - [_target] call FUNC(getBloodPressure) -}; -_bloodPressure params [ "_bloodPressureLow", "_bloodPressureHigh"]; -private _output = ""; -private _logOutPut = ""; -if ([_caller] call FUNC(isMedic)) then { - _output = LSTRING(Check_Bloodpressure_Output_1); - _logOutPut = format["%1/%2",round(_bloodPressureHigh),round(_bloodPressureLow)]; -} else { - if (_bloodPressureHigh > 20) then { - _output = LSTRING(Check_Bloodpressure_Output_2); - _logOutPut = LSTRING(Check_Bloodpressure_Low); - if (_bloodPressureHigh > 100) then { - _output = LSTRING(Check_Bloodpressure_Output_3); - _logOutPut = LSTRING(Check_Bloodpressure_Normal); - if (_bloodPressureHigh > 160) then { - _output = LSTRING(Check_Bloodpressure_Output_4); - _logOutPut = LSTRING(Check_Bloodpressure_High); - }; - - }; - } else { - if (random(10) > 3) then { - _output = LSTRING(Check_Bloodpressure_Output_5); - _logOutPut = LSTRING(Check_Bloodpressure_NoBloodpressure); - } else { - _output = LSTRING(Check_Bloodpressure_Output_6); - //Fail to find pressure, no logoutput - }; - }; -}; - -if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { - _output = LSTRING(Check_Bloodpressure_Output_6); - _logOutPut = ""; -}; - -[QEGVAR(common,displayTextStructured), [[_output, [_target] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)], 1.75, _caller], [_caller]] call CBA_fnc_targetEvent; - -if (_logOutPut != "") then { - [_target,"activity", LSTRING(Check_Bloodpressure_Log), [[_caller, false, true] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); - [_target,"quick_view", LSTRING(Check_Bloodpressure_Log), [[_caller, false, true] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); -}; diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf deleted file mode 100644 index da0711d280..0000000000 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for checking the pulse or heart rate of the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckPulse - * - * Public: No - */ - -params ["_caller","_target", "_selectionName"]; -if (local _target) then { - [QGVAR(actionCheckPulseLocal), [_caller, _target, _selectionName]] call CBA_fnc_localEvent; -} else { - [QGVAR(actionCheckPulseLocal), [_caller, _target, _selectionName], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf deleted file mode 100644 index 6e8989acc3..0000000000 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ /dev/null @@ -1,58 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Local callback for checking the pulse of a patient - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckPulseLocal - * - * Public: No - */ - -params ["_caller", "_unit", "_selectionName"]; - -private _heartRate = _unit getVariable [QGVAR(heartRate), 80]; -if (!alive _unit) then { - _heartRate = 0; -}; -private _heartRateOutput = LSTRING(Check_Pulse_Output_5); -private _logOutPut = LSTRING(Check_Pulse_None); - -if (_heartRate > 1.0) then { - if ([_caller] call FUNC(isMedic)) then { - _heartRateOutput = LSTRING(Check_Pulse_Output_1); - _logOutPut = format["%1",round(_heartRate)]; - } else { - // non medical personel will only find a pulse/HR - _heartRateOutput = LSTRING(Check_Pulse_Output_2); - _logOutPut = LSTRING(Check_Pulse_Weak); - if (_heartRate > 60) then { - if (_heartRate > 100) then { - _heartRateOutput = LSTRING(Check_Pulse_Output_3); - _logOutPut = LSTRING(Check_Pulse_Strong); - } else { - _heartRateOutput = LSTRING(Check_Pulse_Output_4); - _logOutPut = LSTRING(Check_Pulse_Normal); - }; - }; - }; -}; - -if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { - _heartRateOutput = LSTRING(Check_Pulse_Output_5); - _logOutPut = LSTRING(Check_Pulse_None); -}; - -[QEGVAR(common,displayTextStructured), [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; - -if (_logOutPut != "") then { - [_unit,"activity", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); - [_unit,"quick_view", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); -}; diff --git a/addons/medical/functions/fnc_actionDiagnose.sqf b/addons/medical/functions/fnc_actionDiagnose.sqf deleted file mode 100644 index bd51233ddd..0000000000 --- a/addons/medical/functions/fnc_actionDiagnose.sqf +++ /dev/null @@ -1,47 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for diagnosing in basic medical - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_actionDiagnose - * - * Public: No - */ - -params ["_caller", "_target"]; - -private _genericMessages = [LSTRING(diagnoseMessage), [_target] call EFUNC(common,getName)]; - -if (alive _target) then { - _genericMessages pushBack LSTRING(diagnoseAlive); -} else { - _genericMessages pushBack LSTRING(diagnoseDead); -}; - -if (_target getVariable[QGVAR(hasLostBlood), 0] > 0) then { - if (_target getVariable[QGVAR(hasLostBlood), 0] > 1) then { - _genericMessages pushBack LSTRING(lostBloodALot); - } else { - _genericMessages pushBack LSTRING(lostBlood); - }; -} else { - _genericMessages pushBack LSTRING(noBloodloss); -}; - -if (alive _target) then { - if (_target getVariable[QGVAR(hasPain), false]) then { - _genericMessages pushBack LSTRING(inPain); - } else { - _genericMessages pushBack LSTRING(noPain); - }; -}; - -[QEGVAR(common,displayTextStructured), [_genericMessages, 3.0, _caller], [_caller]] call CBA_fnc_targetEvent; diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf deleted file mode 100644 index 0e7d668b3a..0000000000 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ /dev/null @@ -1,56 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Action for removing the tourniquet on specified selection - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection"] call ace_medical_fnc_actionRemoveTourniquet - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName"]; -TRACE_3("params",_caller,_target,_selectionName); - -// grab the required data -private _part = [_selectionName] call FUNC(selectionNameToNumber); -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; - -// Check if there is a tourniquet on this bodypart -if ((_tourniquets select _part) == 0) exitWith { - [QEGVAR(common,displayTextStructured), [LSTRING(noTourniquetOnBodyPart), 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; -}; - -// Removing the tourniquet -_tourniquets set [_part, 0]; -_target setVariable [QGVAR(tourniquets), _tourniquets, true]; - -// Adding the tourniquet item to the caller -_caller addItem "ACE_tourniquet"; - -//Handle all injected medications now that blood is flowing: -private _delayedMedications = _target getVariable [QGVAR(occludedMedications), []]; -private _updatedArray = false; -TRACE_2("meds",_part,_delayedMedications); -{ - _x params ["", "", "_medPartNum"]; - if (_part == _medPartNum) then { - TRACE_1("delayed medication call after tourniquet removeal",_x); - [QGVAR(treatmentAdvanced_medicationLocal), _x, [_target]] call CBA_fnc_targetEvent; - _delayedMedications set [_forEachIndex, -1]; - _updatedArray = true; - }; -} forEach _delayedMedications; - -if (_updatedArray) then { - _delayedMedications = _delayedMedications - [-1]; - _target setVariable [QGVAR(occludedMedications), _delayedMedications, true]; -}; diff --git a/addons/medical/functions/fnc_addDamageToUnit.sqf b/addons/medical/functions/fnc_addDamageToUnit.sqf index 609c636bfa..a8df1f7b8c 100644 --- a/addons/medical/functions/fnc_addDamageToUnit.sqf +++ b/addons/medical/functions/fnc_addDamageToUnit.sqf @@ -7,56 +7,57 @@ * Arguments: * 0: The Unit * 1: Damage to Add - * 2: Selection ("head", "body", "hand_l", "hand_r", "leg_l", "leg_r") + * 2: Body part ("Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg") * 3: Projectile Type + * 4: Source * * Return Value: - * HandleDamage's return + * Successful * * Example: - * [player, 0.8, "leg_r", "bullet"] call ace_medical_fnc_addDamageToUnit - * [cursorTarget, 1, "body", "stab"] call ace_medical_fnc_addDamageToUnit + * [player, 0.8, "rightleg", "bullet"] call ace_medical_fnc_addDamageToUnit + * [cursorTarget, 1, "body", "stab", player] call ace_medical_fnc_addDamageToUnit * * Public: Yes */ // #define DEBUG_TESTRESULTS -params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_selection", "", [""]], ["_typeOfDamage", "", [""]]]; -TRACE_4("params",_unit,_damageToAdd,_selection,_typeOfDamage); +params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]], ["_instigator", objNull, [objNull]]]; +TRACE_5("params",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator); -_selection = toLower _selection; -if ((isNull _unit) || {!local _unit} || {!alive _unit}) exitWith {ERROR_1("addDamageToUnit - badUnit %1", _this); -1}; -if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); -1}; -if (!(_selection in GVAR(SELECTIONS))) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); -1}; +private _bodyPartIndex = ALL_BODY_PARTS find (toLower _bodyPart); +if (isNull _unit || {!local _unit} || {!alive _unit}) exitWith {ERROR_1("addDamageToUnit - badUnit %1", _this); false}; +if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); false}; +if (_bodyPartIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); false}; -//Get the hitpoint and the index -private _hitpoint = [_unit, _selection, true] call ace_medical_fnc_translateSelections; -(getAllHitPointsDamage _unit) params [["_allHitPoints", []]]; -private _hitpointIndex = -1; -{ //case insensitive find - if (_x == _hitpoint) exitWith {_hitpointIndex = _forEachIndex;}; -} forEach _allHitPoints; -if (_hitpointIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad hitpointIndex %1", _this); -1}; +// Extension is case sensitive and expects this format (different from ALL_BODY_PARTS) +_bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex; -private _currentDamage = _unit getHitIndex _hitpointIndex; +if (!isNull _instigator) then { + _unit setVariable [QEGVAR(medical_engine,lastShooter), _instigator]; + _unit setVariable [QEGVAR(medical_engine,lastInstigator), _instigator]; +}; #ifdef DEBUG_TESTRESULTS -private _checkAtFrame = diag_frameno + 5; -private _partNumber = [_selection] call FUNC(selectionNameToNumber); -private _startDmg = (_unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _partNumber; -private _debugCode = { - params ["", "_unit", "_startDmg", "_damageToAdd", "_partNumber"]; - private _endDmg = (_unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _partNumber; - if ((!alive _unit) || {_endDmg > _startDmg}) then { - INFO_6("addDamageToUnit - PASSED - [unit:%1, partNo:%2, addDmg:%3] results:[alive:%4 old:%5 new:%6]", _unit, _partNumber, _damageToAdd, alive _unit, _startDmg, _endDmg); - } else { - ERROR_6("addDamageToUnit - FAILED - [unit:%1, partNo:%2, addDmg:%3] results:[alive:%4 old:%5 new:%6]", _unit, _partNumber, _damageToAdd, alive _unit, _startDmg, _endDmg); - }; -}; -[{diag_frameno > (_this select 0)}, _debugCode, [_checkAtFrame, _unit, _startDmg, _damageToAdd, _partNumber]] call CBA_fnc_waitUntilAndExecute; +private _startDmg = +(_unit getVariable [QEGVAR(medical,bodyPartDamage), [-1]]); +private _startPain = GET_PAIN(_unit); #endif -private _return = [_unit, _selection, (_currentDamage + _damageToAdd), _unit, _typeOfDamage, _hitpointIndex, objNull] call FUNC(handleDamage); -TRACE_1("handleDamage called",_return); +[QEGVAR(medical,woundReceived), [_unit, _bodyPart, _damageToAdd, _instigator, _typeOfDamage]] call CBA_fnc_localEvent; -_return +#ifdef DEBUG_TESTRESULTS +private _endDmg = _unit getVariable [QEGVAR(medical,bodyPartDamage), [-1]]; +private _endPain = GET_PAIN(_unit); +private _typeOfDamageAdj = _typeOfDamage call EFUNC(medical_damage,getTypeOfDamage); +private _config = configFile >> "ACE_Medical_Injuries" >> "damageTypes" >> _typeOfDamageAdj; +private _selectionSpecific = true; +if (isClass _config) then { + _selectionSpecific = (getNumber (_config >> "selectionSpecific")) == 1; +} else { + WARNING_2("Damage type not in config [%1:%2]", _typeOfDamage, _config); +}; +INFO_4("Debug AddDamageToUnit: Type [%1] - Selection Specific [%2] - HitPoint [%3 -> %4]",_typeOfDamage,_selectionSpecific,_startDmg select _bodyPartIndex,_endDmg select _bodyPartIndex); +INFO_4("Pain Change [%1 -> %2] - BodyPartDamage Change [%3 -> %4]",_startPain,_endPain,_startDmg,_endDmg); +#endif + +true diff --git a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf b/addons/medical/functions/fnc_addHeartRateAdjustment.sqf deleted file mode 100644 index 6c932bb2ef..0000000000 --- a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, KoffeinFlummi - * Increase the Heart Rate of a local unit by given number within given amount of seconds. - * - * Arguments: - * 0: The unit - * 1: value - * 2: time in seconds - * 3: callback - * - * Return Value: - * None - * - * Example: - * [bob, 1, 5, {callback}] call ace_medical_fnc_addHeartRateAdjustment - * - * Public: Yes - */ - -params [["_unit", objNull, [objNull]], ["_value", 0, [0]], ["_time", 1, [0]], ["_callBack", {}, [{}]]]; - -private _adjustment = _unit getVariable [QGVAR(heartRateAdjustments), []]; -_adjustment pushBack [_value, _time, _callBack]; -_unit setVariable [QGVAR(heartRateAdjustments), _adjustment]; - -["ace_heartRateAdjustmentAdded", [_unit, _value, _time]] call CBA_fnc_localEvent; diff --git a/addons/medical/functions/fnc_addUnconsciousCondition.sqf b/addons/medical/functions/fnc_addUnconsciousCondition.sqf deleted file mode 100644 index f31e5045fd..0000000000 --- a/addons/medical/functions/fnc_addUnconsciousCondition.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state. - * - * Arguments: - * 0-N: Code, should return a boolean - * - * Return Value: - * None - * - * Example: - * [[{bob}]] call ace_medical_fnc_addUnconsciousCondition - * - * Public: Yes - */ - -if (isnil QGVAR(unconsciousConditions)) then { - GVAR(unconsciousConditions) = []; -}; -if (_this isEqualType []) then { - { - if (_x isEqualType {}) then { - GVAR(unconsciousConditions) pushback _x; - }; - } foreach _this; -}; diff --git a/addons/medical/functions/fnc_addUnloadPatientActions.sqf b/addons/medical/functions/fnc_addUnloadPatientActions.sqf deleted file mode 100644 index bb73dab4e8..0000000000 --- a/addons/medical/functions/fnc_addUnloadPatientActions.sqf +++ /dev/null @@ -1,43 +0,0 @@ -#include "script_component.hpp" -/* - * Author: esteldunedain - * Create one unload action per unconscious passenger - * - * Arguments: - * 0: Vehicle - * 1: Player - * 3: Parameters - * - * Return Value: - * Children actions - * - * Example: - * [car, kevin, [params]] call ACE_medical_fnc_addUnloadPatientActions - * - * Public: No - */ -params ["_vehicle", "_player", "_parameters"]; - -private _actions = []; - -{ - private _unit = _x; - if (_unit != _player && {(alive _unit) && {_unit getVariable ["ACE_isUnconscious", false]}}) then { - _actions pushBack - [ - [ - str(_unit), - [_unit, true] call EFUNC(common,getName), - "", - {[_player, (_this select 2) select 0] call FUNC(actionUnloadUnit);}, - {true}, - {}, - [_unit] - ] call EFUNC(interact_menu,createAction), - [], - _unit - ]; - }; -} forEach crew _vehicle; - -_actions diff --git a/addons/medical/functions/fnc_addVitalLoop.sqf b/addons/medical/functions/fnc_addVitalLoop.sqf deleted file mode 100644 index a1a01a5a61..0000000000 --- a/addons/medical/functions/fnc_addVitalLoop.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Enabled the vitals loop for a unit. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ace_medical_fnc_addVitalLoop - * - * Public: Yes - */ - -params ["_unit", ["_force", false]]; - -if !([_unit] call FUNC(hasMedicalEnabled) || _force) exitWith {}; - -if !(local _unit) exitWith { - [QGVAR(addVitalLoop), [_unit, _force], _unit] call CBA_fnc_targetEvent; -}; - -// Quit if the unit already has a vital loop, or is dead, unless it's forced -if ((_unit getVariable[QGVAR(addedToUnitLoop),false] || !alive _unit) && !_force) exitWith{}; - -// Schedule the loop to be executed again 1 sec later -// @todo: should the loop be started righ away instead? -_unit setVariable [QGVAR(addedToUnitLoop), true, true]; -[DFUNC(vitalLoop), [_unit, CBA_missionTime], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_adjustPainLevel.sqf b/addons/medical/functions/fnc_adjustPainLevel.sqf index 97bc9389a0..40370bf99d 100644 --- a/addons/medical/functions/fnc_adjustPainLevel.sqf +++ b/addons/medical/functions/fnc_adjustPainLevel.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Interface to allow external modules to safely adjust pain levels. + * Public interface to allow external modules to safely adjust pain levels. * * Arguments: * 0: The patient @@ -17,18 +17,11 @@ */ params ["_unit", "_addedPain"]; -//Only run on local units: -if (!local _unit) exitWith {ERROR("unit is not local");}; -TRACE_3("ACE_DEBUG: adjustPainLevel Called",_unit, _pain, _addedPain); -//Ignore if medical system disabled: -if (GVAR(level) == 0) exitWith {}; +if (!local _unit) exitWith { ERROR_1("unit [%1] is not local",_unit); }; -private _pain = ((_unit getVariable [QGVAR(pain), 0]) + _addedPain) max 0; +private _pain = GET_PAIN(_unit); -_unit setVariable [QGVAR(pain), _pain]; +_pain = 0 max (_pain + _addedPain) min 1; -//Start up the vital watching (if not already running) -[_unit] call FUNC(addVitalLoop); - -_pain; +_unit setVariable [VAR_PAIN, _pain]; diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf deleted file mode 100644 index 913cc4c30e..0000000000 --- a/addons/medical/functions/fnc_canTreat.sqf +++ /dev/null @@ -1,96 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if the treatment action can be performed. - * - * Arguments: - * 0: The caller - * 1: The target - * 2: Selection name - * 3: ACE_Medical_Treatments Classname - * - * Return Value: - * Can Treat - * - * Example: - * [player, cursorTarget, "Head", "SurgicalKit"] call ace_medical_fnc_canTreat - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className"]; - -if !(_target isKindOf "CAManBase") exitWith { false }; - -private _config = (ConfigFile >> "ACE_Medical_Actions" >> (["Basic", "Advanced"] select (GVAR(level)>=2)) >> _className); - -if !(isClass _config) exitwith {false}; - -// Allow self treatment check -if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false}; - -private _medicRequired = if (isNumber (_config >> "requiredMedic")) then { - getNumber (_config >> "requiredMedic"); -} else { - // Check for required class - if (isText (_config >> "requiredMedic")) exitwith { - missionNamespace getVariable [(getText (_config >> "requiredMedic")), 0] - }; - 0; -}; -if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith { false }; - -private _items = getArray (_config >> "items"); -if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith { false }; - -private _allowedSelections = getArray (_config >> "allowedSelections"); -if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith { false }; - -private _return = true; -if (getText (_config >> "condition") != "") then { - private _condition = getText (_config >> "condition"); - if (isnil _condition) then { - _condition = compile _condition; - } else { - _condition = missionNamespace getVariable _condition; - }; - if (_condition isEqualType false) then { - _return = _condition; - } else { - _return = [_caller, _target, _selectionName, _className] call _condition; - }; -}; -if (!_return) exitwith { false }; - -private _patientStateCondition = if (isText(_config >> "patientStateCondition")) then { - missionNamespace getVariable [getText(_config >> "patientStateCondition"), 0] -} else { - getNumber(_config >> "patientStateCondition") -}; -if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; - -private _locations = getArray (_config >> "treatmentLocations"); -if ("All" in _locations) exitwith { true }; - -private _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; -private _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isInMedicalVehicle))}; - -{ - if (_x == "field") exitwith {_return = true;}; - if (_x == "MedicalFacility" && _medFacility) exitwith {_return = true;}; - if (_x == "MedicalVehicle" && _medVeh) exitwith {_return = true;}; - if !(isnil _x) exitwith { - private _val = missionNamespace getVariable _x; - if (_val isEqualType 0) then { - _return = switch (_val) do { - case 0: {true}; //AdvancedMedicalSettings_anywhere - case 1: {call _medVeh}; //AdvancedMedicalSettings_vehicle - case 2: {call _medFacility}; //AdvancedMedicalSettings_facility - case 3: {(call _medFacility) || {call _medVeh}}; //AdvancedMedicalSettings_vehicleAndFacility - default {false}; //Disabled - }; - }; - }; -} foreach _locations; - -_return; diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf deleted file mode 100644 index 56687988e4..0000000000 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ /dev/null @@ -1,83 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Makes a copy of a dead body. For handling dead bodies for actions such as load and carry. - * - * Arguments: - * 0: The oldbody - * 1: The caller - * - * Return Value: - * Returns the copy of the unit. If no copy could be made, returns the oldBody - * - * Example: - * [bob, kevin] call ACE_medical_fnc_copyDeadBody - * - * Public: No - */ - -params ["_oldBody", "_caller"]; - -if (alive _oldBody) exitWith {_oldBody}; // we only want to do this for dead bodies - -private _name = _oldBody getVariable ["ACE_name", "unknown"]; -private _class = typeOf _oldBody; -private _side = side _caller; -private _group = createGroup _side; -private _position = getPos _oldBody; - -private _newUnit = _group createUnit [typeOf _oldBody, _position, [], 0, "NONE"]; -_newUnit setVariable ["ACE_name", _name, true]; - -_newUnit disableAI "TARGET"; -_newUnit disableAI "AUTOTARGET"; -_newUnit disableAI "MOVE"; -_newUnit disableAI "ANIM"; -_newUnit disableAI "FSM"; - -removeallweapons _newUnit; -removeallassigneditems _newUnit; -removeUniform _newUnit; -removeHeadgear _newUnit; -removeBackpack _newUnit; -removeVest _newUnit; - -_newUnit addHeadgear (headgear _oldBody); -_newUnit addBackpack (backpack _oldBody); -clearItemCargoGlobal (backpackContainer _newUnit); -clearMagazineCargoGlobal (backpackContainer _newUnit); -clearWeaponCargoGlobal (backpackContainer _newUnit); - -_newUnit addVest (vest _oldBody); -clearItemCargoGlobal (backpackContainer _newUnit); -clearMagazineCargoGlobal (backpackContainer _newUnit); -clearWeaponCargoGlobal (backpackContainer _newUnit); - -_newUnit addUniform (uniform _oldBody); -clearItemCargoGlobal (backpackContainer _newUnit); -clearMagazineCargoGlobal (backpackContainer _newUnit); -clearWeaponCargoGlobal (backpackContainer _newUnit); - -{_newUnit addMagazine _x} count (magazines _oldBody); -{_newUnit addWeapon _x} count (weapons _oldBody); -{_newUnit addItem _x} count (items _oldBody); - -_newUnit selectWeapon (primaryWeapon _newUnit); - -// We are attaching the old unit and hiding it, so we can keep the original unit until later. -_oldBody attachTo [_newUnit, [0,0,0]]; -if (isMultiplayer) then { - hideObjectGlobal _oldBody; -} else { - hideObject _oldBody; -}; - -_newUnit setVariable [QGVAR(copyOfUnit), _oldBody, true]; -_oldBody setVariable [QGVAR(hasCopy), _newUnit, true]; -_newUnit setVariable ["ACE_isDead", true, true]; -_newUnit setVariable ["ACE_isUnconscious", true, true]; -_newUnit setVariable [QGVAR(disableInteraction), true, true]; -_oldBody setVariable [QGVAR(disableInteraction), true, true]; - -[_newUnit, 0.89] call FUNC(setStructuralDamage); -_newUnit; diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf deleted file mode 100644 index 349f6252d9..0000000000 --- a/addons/medical/functions/fnc_createLitter.sqf +++ /dev/null @@ -1,95 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Spawns litter for the treatment action on the ground around the target - * - * Arguments: - * 0: The Caller - * 1: The target - * 2: The treatment Selection Name - * 3: The treatment classname - * 4: ? - * 5: Users of Items - * 6: Blood Loss on selection (previously called _previousDamage) - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname", , , 5] call ACE_medical_fnc_createLitter - * - * Public: No - */ - -#define MIN_ENTRIES_LITTER_CONFIG 3 - -params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_bloodLossOnSelection"]; -TRACE_6("params",_caller,_target,_selectionName,_className,_usersOfItems,_bloodLossOnSelection); - -//Ensures comptibilty with other possible medical treatment configs -private _previousDamage = _bloodLossOnSelection; - -if !(GVAR(allowLitterCreation)) exitwith {}; -if (vehicle _caller != _caller || {vehicle _target != _target}) exitwith {}; - -private _config = if (GVAR(level) >= 2) then { - (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -} else { - (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className) -}; -if !(isClass _config) exitwith {TRACE_1("No action config", _className);}; - -if !(isArray (_config >> "litter")) exitwith {TRACE_1("No litter config", _className);}; -private _litter = getArray (_config >> "litter"); - -private _createLitter = { - params ["_unit", "_litterClass"]; - // @TODO: handle carriers over water - // For now, don't spawn litter if we are over water to avoid floating litter - if (surfaceIsWater (getPos _unit)) exitWith { false }; - - private _position = getPosATL _unit; - _position params ["_posX", "_posY", "_posZ"]; - _position = [_posX + (random 2) - 1, _posY + (random 2) - 1, _posZ]; - - private _direction = (random 360); - - // Create the litter, and timeout the event based on the cleanup delay - // The cleanup delay for events in MP is handled by the server side - TRACE_3("Creating Litter on server",_litterClass,_position,_direction); - [QGVAR(createLitterServer), [_litterClass, _position, _direction]] call CBA_fnc_serverEvent; - - true -}; - -private _createdLitter = []; -{ - if (_x isEqualType []) then { - if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; - - _x params ["_selection", "_litterCondition", "_litterOptions"]; - - if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. - - if (isnil _litterCondition) then { - _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; - } else { - _litterCondition = missionNamespace getVariable _litterCondition; - if (!(_litterCondition isEqualType {})) then {_litterCondition = {false}}; - }; - if !([_caller, _target, _selectionName, _className, _usersOfItems, _bloodLossOnSelection] call _litterCondition) exitwith {}; - - if (_litterOptions isEqualType []) then { - // Loop through through the litter options and place the litter - { - if (_x isEqualType [] && {(count _x > 0)}) then { - [_target, selectRandom _x] call _createLitter; - }; - if (_x isEqualType "") then { - [_target, _x] call _createLitter; - }; - } foreach _litterOptions; - }; - }; - }; -} foreach _litter; diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf deleted file mode 100644 index 1cf30acc75..0000000000 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ /dev/null @@ -1,59 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Determine If Fatal - * - * Arguments: - * 0: Unit - * 1: Part - * 2: with Damage (default: 0) - * - * Return Value: - * None - * - * Example: - * [bob, 2, 5] call ACE_medical_fnc_determineIfFatal - * - * Public: No - */ - -#define INCREASE_CHANCE_HEAD 0.05 -#define INCREASE_CHANCE_TORSO 0.03 -#define INCREASE_CHANGE_LIMB 0.01 - -#define CHANGE_FATAL_HEAD 0.7 -#define CHANGE_FATAL_TORSO 0.6 -#define CHANGE_FATAL_LIMB 0.1 - -params ["_unit", "_part", ["_withDamage", 0]]; - -if (!alive _unit) exitWith {true}; -if ((vehicle _unit != _unit) && {!alive (vehicle _unit)}) exitWith { true }; -if (_part < 0 || _part > 5) exitWith {false}; - -// Find the correct Damage threshold for unit. -private _damageThreshold = [1,1,1]; -if ([_unit, GVAR(remoteControlledAI)] call EFUNC(common,isPlayer)) then { - _damageThreshold =_unit getVariable[QGVAR(unitDamageThreshold), [GVAR(playerDamageThreshold), GVAR(playerDamageThreshold), GVAR(playerDamageThreshold) * 1.7]]; -} else { - _damageThreshold =_unit getVariable[QGVAR(unitDamageThreshold), [GVAR(AIDamageThreshold), GVAR(AIDamageThreshold), GVAR(AIDamageThreshold) * 1.7]]; -}; -_damageThreshold params ["_thresholdHead", "_thresholdTorso", "_thresholdLimbs"]; - -private _damageBodyPart = ((_unit getVariable [QGVAR(bodyPartStatus),[0, 0, 0, 0, 0, 0]]) select _part) + _withDamage; - -// Check if damage to body part is higher as damage head -if (_part == 0) exitWith { - private _chanceFatal = CHANGE_FATAL_HEAD + ((INCREASE_CHANCE_HEAD * (_damageBodyPart - _thresholdHead)) * 10); - (_damageBodyPart >= _thresholdHead && {(_chanceFatal >= random(1))}); -}; - -// Check if damage to body part is higher as damage torso -if (_part == 1) exitWith { - private _chanceFatal = CHANGE_FATAL_TORSO + ((INCREASE_CHANCE_TORSO * (_damageBodyPart - _thresholdTorso)) * 10); - (_damageBodyPart >= _thresholdTorso && {(_chanceFatal >= random(1))}); -}; -// Check if damage to body part is higher as damage limbs -// We use a slightly lower decrease for limbs, as we want any injuries done to those to be less likely to be fatal compared to head shots or torso. -private _chanceFatal = CHANGE_FATAL_LIMB + ((INCREASE_CHANGE_LIMB * (_damageBodyPart - _thresholdLimbs)) * 10); -(_damageBodyPart >= _thresholdLimbs && {(_chanceFatal >= random(1))}); diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf deleted file mode 100644 index d99d97d707..0000000000 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ /dev/null @@ -1,196 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Displays the patient information for given unit. - * - * Arguments: - * 0: The Unit - * 1: Show (default: true) - * 2: Selection (default: 0) - * - * Return Value: - * None - * - * Example: - * [bob, true, 2] call ACE_medical_fnc_displayPatientInformation - * - * Public: No - */ -#define MAX_DISTANCE 10 - -// Exit for basic medical -if (GVAR(level) < 2) exitWith {}; - -params ["_target", ["_show", true], ["_selectionN", 0]]; - -GVAR(currentSelectedSelectionN) = [0, _selectionN] select (IS_SCALAR(_selectionN)); -GVAR(displayPatientInformationTarget) = [ObjNull, _target] select _show; - -if (_show) then { - ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutRsc [QGVAR(DisplayInformation),"PLAIN"]; - - [{ - params ["_args", "_idPFH"]; - _args params ["_target", "_selectionN"]; - - if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - if ((ACE_player distance _target > MAX_DISTANCE) && {vehicle _target != vehicle ACE_player}) exitWith { - ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; - [_idPFH] call CBA_fnc_removePerFrameHandler; - [QEGVAR(common,displayTextStructured), [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player], [ACE_player]] call CBA_fnc_targetEvent; - }; - - disableSerialization; - private _display = uiNamespace getVariable QGVAR(DisplayInformation); - if (isnil "_display") exitwith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - - private _allInjuryTexts = []; - private _genericMessages = []; - - private _partText = [LSTRING(Head), LSTRING(Torso), LSTRING(LeftArm) ,LSTRING(RightArm) ,LSTRING(LeftLeg), LSTRING(RightLeg)] select _selectionN; - _genericMessages pushback [localize _partText, [1, 1, 1, 1]]; - - if (_target getVariable[QGVAR(isBleeding), false]) then { - _genericMessages pushback [localize LSTRING(Status_Bleeding), [1, 0.1, 0.1, 1]]; - }; - if (_target getVariable[QGVAR(hasLostBlood), 0] > 1) then { - _genericMessages pushback [localize LSTRING(Status_Lost_Blood), [1, 0.1, 0.1, 1]]; - }; - - if (((_target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select _selectionN) > 0) then { - _genericMessages pushback [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; - }; - if (_target getVariable[QGVAR(hasPain), false]) then { - _genericMessages pushback [localize LSTRING(Status_Pain), [1, 1, 1, 1]]; - }; - - private _totalIvVolume = 0; - private _bloodBags = _target getVariable [QGVAR(ivBags), []]; - { - _x params ["_bagVolumeRemaining"]; - _totalIvVolume = _totalIvVolume + _bagVolumeRemaining; - } foreach _bloodBags; - - if (_totalIvVolume >= 1) then { - _genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; - }; - - private _damaged = [false, false, false, false, false, false]; - private _selectionBloodLoss = [0,0,0,0,0,0]; - - private _openWounds = _target getVariable [QGVAR(openWounds), []]; - { - _x params ["", "_x1", "_selectionX", "_amountOf", "_x4"]; - // Find how much this bodypart is bleeding - if (_amountOf > 0) then { - _damaged set [_selectionX, true]; - _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))]; - - if (_selectionN == _selectionX) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6, ceil _amountOf], [1,1,1,1]]; - } else { - // TODO localization - _allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6], [1,1,1,1]]; - }; - }; - }; - } foreach _openWounds; - - private _bandagedwounds = _target getVariable [QGVAR(bandagedWounds), []]; - { - _x params ["", "", "_selectionX", "_amountOf", "_x4"]; - // Find how much this bodypart is bleeding - if !(_damaged select _selectionX) then { - _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))]; - }; - if (_selectionN == _selectionX) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf > 0) then { - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushback [format["[B] %2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, ceil _amountOf], [0.88,0.7,0.65,1]]; - } else { - // TODO localization - _allInjuryTexts pushback [format["[B] Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [0.88,0.7,0.65,1]]; - }; - }; - }; - } foreach _bandagedwounds; - - // Handle the body image coloring - private _availableSelections = [50,51,52,53,54,55]; - { - private _total = _x; - private _red = 1; - private _green = 1; - private _blue = 1; - - if (_total > 0) then { - if (_damaged select _forEachIndex) then { - _green = (0.9 - _total) max 0; - _blue = _green; - } else { - _green = (0.9 - _total) max 0; - _red = _green; - //_blue = _green; - }; - }; - (_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; - } foreach _selectionBloodLoss; - - // update tourniquet information - [_display, _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]] call FUNC(updateTourniquets); - - private _lbCtrl = (_display displayCtrl 200); - lbClear _lbCtrl; - { - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_foreachIndex, _color]; - } foreach _genericMessages; - - private _amountOfGeneric = count _genericMessages; - { - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _color]; - } foreach _allInjuryTexts; - if (count _allInjuryTexts == 0) then { - _lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart)); - }; - - private _logCtrl = (_display displayCtrl 302); - lbClear _logCtrl; - - private _logs = _target getVariable [QGVAR(logFile_Activity), []]; - { - _x params ["_message", "_moment", "_type", "_arguments"]; - if (isLocalized _message) then { - _message = localize _message; - }; - - { - if (_x isEqualType "" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; - }; - } foreach _arguments; - _message = format([_message] + _arguments); - _logCtrl lbAdd format["%1 %2", _moment, _message]; - } foreach _logs; - - private _triageStatus = [_target] call FUNC(getTriageStatus); - (_display displayCtrl 303) ctrlSetText (_triageStatus select 0); - (_display displayCtrl 303) ctrlSetBackgroundColor (_triageStatus select 2); - - }, 0, [_target, GVAR(currentSelectedSelectionN)]] call CBA_fnc_addPerFrameHandler; - -} else { - ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; -}; diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf deleted file mode 100644 index 1a84b98e87..0000000000 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ /dev/null @@ -1,78 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Display triage card for a unit - * - * Arguments: - * 0: The unit - * 1: Show (default: true) - * - * Return Value: - * None - * - * Example: - * [bob, true] call ace_medical_fnc_displayTriageCard - * - * Public: Yes - */ - -params ["_target", ["_show", true]]; - -GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull}; - -if (_show) then { - //("ACE_MedicalTriageCard" call BIS_fnc_rscLayer) cutRsc [QGVAR(triageCard),"PLAIN"]; - createDialog QGVAR(triageCard); - - [{ - params ["_args", "_idPFH"]; - _args params ["_target"]; - if (GVAR(TriageCardTarget) != _target) exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - - disableSerialization; - private _display = uiNamespace getVariable QGVAR(triageCard); - if (isNil "_display") exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - - private _triageCardTexts = []; - - // TODO fill the lb with the appropiate information for the patient - private _lbCtrl = (_display displayCtrl 200); - lbClear _lbCtrl; - - private _log = _target getVariable [QGVAR(triageCard), []]; - { - _x params ["_item", "_amount"]; - private _message = _item; - if (isClass(configFile >> "CfgWeapons" >> _item)) then { - _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); - } else { - if (isLocalized _message) then { - _message = localize _message; - }; - }; - _triageCardTexts pushBack format["%1x - %2", _amount, _message]; - } forEach _log; - - if (count _triageCardTexts == 0) then { - _lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry)); - }; - { - _lbCtrl lbAdd _x; - } forEach _triageCardTexts; - - private _triageStatus = [_target] call FUNC(getTriageStatus); - _triageStatus params ["_text", "", "_color"]; - - (_display displayCtrl 2000) ctrlSetText _text; - (_display displayCtrl 2000) ctrlSetBackgroundColor _color; - - }, 0, [_target]] call CBA_fnc_addPerFrameHandler; - -} else { - //("ACE_MedicalTriageCard" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; - closeDialog 7010; -}; diff --git a/addons/medical/functions/fnc_dropDownTriageCard.sqf b/addons/medical/functions/fnc_dropDownTriageCard.sqf deleted file mode 100644 index c409e39ac0..0000000000 --- a/addons/medical/functions/fnc_dropDownTriageCard.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Display triage card for a unit - * - * Arguments: - * 0: Show - * - * Return Value: - * None - * - * Example: - * [true] call ace_medical_fnc_dropDownTriageCard - * - * Public: Yes - */ - -params ["_show"]; - -disableSerialization; -private _display = uiNamespace getVariable QGVAR(triageCard); -if (isNil "_display") exitWith {}; - -private _pos = [0,0,0,0]; -if (_show) then { - _pos = ctrlPosition (_display displayCtrl 2001); -}; -for "_idc" from 2002 to 2006 step 1 do { - _pos set [1, (_pos select 1) + (_pos select 3)]; - private _ctrl = (_display displayCtrl _idc); - _ctrl ctrlSetPosition _pos; - _ctrl ctrlCommit 0; -}; diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf deleted file mode 100644 index 1caff24527..0000000000 --- a/addons/medical/functions/fnc_getBloodLoss.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Calculate the total blood loss of a unit. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Total blood loss of unit - * - * Example: - * [bob] call ACE_medical_fnc_getBloodLoss - * - * Public: No - */ - -#define BLOODLOSSRATE_BASIC 0.2 - -// TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical). -params ["_unit"]; - -private _totalBloodLoss = 0; -private _tourniquets = _unit getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -{ - if ((_tourniquets select (_x select 2)) == 0) then { - // total bleeding ratio * percentage of injury left - _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); - // (((BLOODLOSS_SMALL_WOUNDS * (_x select 0))) + ((BLOODLOSS_MEDIUM_WOUNDS * (_x select 1))) + ((BLOODLOSS_LARGE_WOUNDS * (_x select 2))) * (_cardiacOutput / DEFAULT_CARDIAC_OUTPUT)); - }; -} forEach (_unit getVariable [QGVAR(openWounds), []]); - -{ - _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); -} forEach (_unit getVariable [QGVAR(internalWounds), []]); - -_totalBloodLoss * ((_unit getVariable [QGVAR(bleedingCoefficient), GVAR(bleedingCoefficient)]) max 0); diff --git a/addons/medical/functions/fnc_getBloodVolumeChange.sqf b/addons/medical/functions/fnc_getBloodVolumeChange.sqf deleted file mode 100644 index 32bcfb23ed..0000000000 --- a/addons/medical/functions/fnc_getBloodVolumeChange.sqf +++ /dev/null @@ -1,56 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Calculates the blood volume change and decreases the IVs given to the unit. - * - * Arguments: - * 0: The Unit - * 1: Global Sync Values (bloodbags) - * - * Return Value: - * Blood volume change (in % total) - * - * Example: - * [bob, true] call ACE_medical_fnc_getBloodVolumeChange - * - * Public: No - */ - -/* - IV Change per second calculation: - 250ml should take 60 seconds to fill. 250/60 = 4.166. - Basic medical is 10x (will take 6 seconds for 250ml) - */ -#define IV_CHANGE_PER_SECOND ([41.66, 4.166] select (GVAR(level) >= 2)) - -params ["_unit", "_syncValues"]; - -private _bloodVolume = _unit getVariable [QGVAR(bloodVolume), 100]; -private _bloodVolumeChange = -([_unit] call FUNC(getBloodLoss)); - -if (!isNil {_unit getVariable QGVAR(ivBags)}) then { - if (_bloodVolume < 100) then { - private _bloodBags = _unit getVariable [QGVAR(ivBags), []]; - _bloodBags = _bloodBags apply { - _x params ["_bagVolumeRemaining"]; - private _bagChange = IV_CHANGE_PER_SECOND min _bagVolumeRemaining; // absolute value of the change in miliLiters - _bagVolumeRemaining = _bagVolumeRemaining - _bagChange; - _bloodVolumeChange = _bloodVolumeChange + (_bagChange / 70); // ((bag change in ml) / (body total:7000ml)) out of 100 percent - if (_bagVolumeRemaining < 0.01) then { - [] - } else { - [_bagVolumeRemaining]; - }; - }; - _bloodBags = _bloodBags - [[]]; // remove empty bags - if (_bloodBags isEqualTo []) then { - _unit setVariable [QGVAR(ivBags), nil, true]; // no bags left - clear variable (always globaly sync this) - } else { - _unit setVariable [QGVAR(ivBags), _bloodBags, _syncValues]; - }; - } else { - _unit setVariable [QGVAR(ivBags), nil, true]; // blood volume = 100% - clear variable (always globaly sync this) - }; -}; - -_bloodVolumeChange; diff --git a/addons/medical/functions/fnc_getHeartRateChange.sqf b/addons/medical/functions/fnc_getHeartRateChange.sqf deleted file mode 100644 index dcd35ed476..0000000000 --- a/addons/medical/functions/fnc_getHeartRateChange.sqf +++ /dev/null @@ -1,86 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the change in the heart rate. Used for the vitals calculations. Calculated in one seconds. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Change in heart Rate - * - * Example: - * [bob] call ACE_medical_fnc_getHeartRateChange - * - * Public: No - */ - -#define HEART_RATE_MODIFIER 0.02 - -params ["_unit"]; - -private _hrIncrease = 0; -if (!(_unit getVariable [QGVAR(inCardiacArrest),false])) then { - private _heartRate = _unit getVariable [QGVAR(heartRate), 80]; - private _bloodLoss = [_unit] call FUNC(getBloodLoss); - - private _adjustment = _unit getVariable [QGVAR(heartRateAdjustments), []]; - { - _x params ["_values", "_time", "_callBack"]; - if (abs _values > 0) then { - if (_time <= 0) then { - _time = 1; - }; - private _change = (_values / _time); - _hrIncrease = _hrIncrease + _change; - - if ( (_time - 1) <= 0) then { - _time = 0; - _adjustment set [_forEachIndex, ObjNull]; - [_unit] call _callBack; - } else { - _time = _time - 1; - _adjustment set [_forEachIndex, [_values - _change, _time]]; - }; - } else { - _adjustment set [_forEachIndex, ObjNull]; - [_unit] call _callBack; - }; - } forEach _adjustment; - - _adjustment = _adjustment - [ObjNull]; - _unit setVariable [QGVAR(heartRateAdjustments), _adjustment]; - - private _bloodVolume = _unit getVariable [QGVAR(bloodVolume), 100]; - if (_bloodVolume > 75) then { - if (_bloodLoss > 0.0) then { - if (_bloodLoss < 0.5) then { - if (_heartRate < 126) then { - _hrIncrease = _hrIncrease + 0.05; - }; - } else { - if (_bloodLoss < 1) then { - if (_heartRate < 161) then { - _hrIncrease = _hrIncrease + 0.1; - }; - } else { - if (_heartRate < 220) then { - _hrIncrease = _hrIncrease + 0.15; - }; - }; - }; - } else { - // Stabalize it - if (_heartRate < (60 + round(random(10)))) then { - _hrIncrease = _hrIncrease + HEART_RATE_MODIFIER; - } else { - if (_heartRate > (77 + round(random(10)))) then { - _hrIncrease = _hrIncrease - HEART_RATE_MODIFIER; - }; - }; - }; - } else { - _hrIncrease = _hrIncrease - HEART_RATE_MODIFIER; - }; -}; -_hrIncrease diff --git a/addons/medical/functions/fnc_getTriageStatus.sqf b/addons/medical/functions/fnc_getTriageStatus.sqf deleted file mode 100644 index 2b502b563b..0000000000 --- a/addons/medical/functions/fnc_getTriageStatus.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the triage status and information from a unit - * - * Arguments: - * 0: The unit - * - * Return Value: - * 0: Name - * 1: Status ID - * 2: Color > - * - * Example: - * [bob] call ace_medical_fnc_getTriageStatus - * - * Public: Yes - */ - -params ["_unit"]; - -private _status = _unit getVariable [QGVAR(triageLevel), -1]; -private _return = switch (_status) do { - case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]}; - case 2: {[localize LSTRING(Triage_Status_Delayed), 2, [0.7, 0.5, 0, 0.9]]}; - case 3: {[localize LSTRING(Triage_Status_Immediate), 3, [0.4, 0.07, 0.07, 0.9]]}; - case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]}; - default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]}; -}; -_return diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf deleted file mode 100644 index 436365cc91..0000000000 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get whatever or not a unit should be or stay unconscious. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * Should the unit stay unconscious? - * - * Example: - * [bob] call ace_medical_fnc_getUnconsciousCondition - * - * Public: Yes - */ - -params ["_unit"]; - -if (isnil QGVAR(unconsciousConditions)) then { - GVAR(unconsciousConditions) = []; -}; - -private _return = false; -{ - if ((_x isEqualType {}) && {([_unit] call _x)}) exitwith { - _return = true; - }; -} foreach GVAR(unconsciousConditions); - -_return diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf deleted file mode 100644 index 1e80a727df..0000000000 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ /dev/null @@ -1,121 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the bandage of a patient. - * - * Arguments: - * 0: The target - * 1: The impact - * 2: Selection part number - * 3: Injury index - * 4: Injury - * 5: Used Bandage type - * - * Return Value: - * None - * - * Example: - * [bob, 5, 5, 1, [injury], "bandage"] call ACE_medical_fnc_handleBandageOpening - * - * Public: No - */ - -params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; - -private _classID = _injury select 1; -private _className = GVAR(woundClassNames) select _classID; - -// default, just in case.. -private _reopeningChance = 0.1; -private _reopeningMinDelay = 120; -private _reopeningMaxDelay = 200; - -// Get the default values for the used bandage -private _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); -if (isClass (_config >> _bandage)) then { - _config = (_config >> _bandage); - _reopeningChance = getNumber (_config >> "reopeningChance"); - _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); - _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; -} else { - WARNING_2("No config for bandage [%1] config base [%2]", _bandage, _config); -}; - -if (isClass (_config >> _className)) then { - private _woundTreatmentConfig = (_config >> _className); - if (isNumber (_woundTreatmentConfig >> "reopeningChance")) then { - _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); - }; - if (isNumber (_woundTreatmentConfig >> "reopeningMinDelay")) then { - _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); - }; - if (isNumber (_woundTreatmentConfig >> "reopeningMaxDelay")) then { - _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; - }; -} else { - WARNING_2("No config for wound type [%1] config base [%2]", _className, _config); -}; -TRACE_5("configs",_bandage,_className,_reopeningChance,_reopeningMinDelay,_reopeningMaxDelay); - -private _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; -private _injuryType = _injury select 1; -private _exist = false; -private _bandagedInjury = []; -{ - if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { - _exist = true; - private _existingInjury = _x; - _existingInjury set [3, (_existingInjury select 3) + _impact]; - _bandagedWounds set [_foreachIndex, _existingInjury]; - - _bandagedInjury = _existingInjury; - }; -} foreach _bandagedWounds; - -if !(_exist) then { - // [ID, classID, bodypart, percentage treated, bloodloss rate] - _bandagedInjury = [_injury select 0, _injury select 1, _injury select 2, _impact, _injury select 4]; - _bandagedWounds pushback _bandagedInjury; -}; - -_target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; - -TRACE_1("",_reopeningChance); -// Check if we are ever going to reopen this -if (random(1) <= _reopeningChance) then { - private _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); - TRACE_1("Will open",_delay); - [{ - params ["_target", "_impact", "_part", "_injuryIndex", "_injury"]; - TRACE_5("params",_target,_impact,_part,_injuryIndex,_injury); - - //if (alive _target) then { - private _openWounds = _target getVariable [QGVAR(openWounds), []]; - if ((count _openWounds) - 1 < _injuryIndex) exitwith {}; - private _selectedInjury = _openWounds select _injuryIndex; - if (_selectedInjury select 1 == _injury select 1 && (_selectedInjury select 2) == (_injury select 2)) then { // matching the IDs - - private _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; - private _exist = false; - private _injuryId = _injury select 1; - { - if ((_x select 1) == _injuryId && (_x select 2) == (_injury select 2)) exitwith { - _exist = true; - private _existingInjury = _x; - _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; - _bandagedWounds set [_foreachIndex, _existingInjury]; - }; - } foreach _bandagedWounds; - - if (_exist) then { - TRACE_2("Reopening Wound",_bandagedWounds,_openWounds); - _selectedInjury set [3, (_selectedInjury select 3) + _impact]; - _openWounds set [_injuryIndex, _selectedInjury]; - _target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; - _target setVariable [QGVAR(openWounds), _openWounds, true]; - }; - }; - // Otherwise something went wrong, we we don't reopen them.. - //}; - }, [_target, _impact, _part, _injuryIndex, +_injury], _delay] call CBA_fnc_waitAndExecute; -}; diff --git a/addons/medical/functions/fnc_handleCollisionDamage.sqf b/addons/medical/functions/fnc_handleCollisionDamage.sqf deleted file mode 100644 index aaaa3f894b..0000000000 --- a/addons/medical/functions/fnc_handleCollisionDamage.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * - * - * Arguments: - * 0: Unit - * 1: New Damage - * - * Return Value: - * None - * - * Example: - * [bob, 2] call ACE_medical_fnc_handleCollisionDamage - * - * Public: No - */ - -params ["_unit", "_newDamage"]; - -private _selection = "body"; - -private _totalDamage = (_unit getHit _selection) + _newDamage; - -_unit setHit [_selection, _totalDamage]; - -systemChat format ["collision: %1", _this]; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf deleted file mode 100644 index ea4c5d9611..0000000000 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ /dev/null @@ -1,147 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal, commy2 - * Main HandleDamage EH function. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: HitPointIndex (-1 for structural) - * 6: Shooter - * - * Return Value: - * Damage To Be Inflicted - * - * Example: - * [bob, "leg", 2, kevin, "bullet", -1, kevin] call ACE_medical_fnc_handleDamage - * - * Public: No - */ - -_this = _this select [0, 7]; -params ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_hitPointIndex"]; -TRACE_5("ACE_DEBUG: HandleDamage Called",_unit, _selection, _damage, _shooter, _projectile); - -// bug, apparently can fire for remote units in special cases -if !(local _unit) exitWith { - TRACE_2("ACE_DEBUG: HandleDamage on remote unit!",_unit, isServer); - nil -}; - -// bug, assumed fixed, @todo excessive testing, if nothing happens remove -if (_projectile isEqualType objNull) then { - _projectile = typeOf _projectile; - _this set [4, _projectile]; -}; - -TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage,_unit); - -// If damage is in dummy hitpoints, "hands" and "legs", don't change anything -if (_selection == "hands") exitWith {_unit getHit "hands"}; -if (_selection == "legs") exitWith {_unit getHit "legs"}; -if (_selection == "arms") exitWith {_unit getHit "arms"}; - -// Deal with the new hitpoint and selection names introduced with Arma v1.50 and later. -// This will convert new selection names into selection names that the medical system understands -// TODO This should be cleaned up when we revisit the medical system at a later stage -// and instead we should deal with the new hitpoints directly -_selection = [_unit, _selection, _hitPointIndex] call FUNC(translateSelections); -_this set [1, _selection]; // ensure that the parameters are set correctly - -// If the damage is being weird, we just tell it to fuck off. Ignore: "hands", "legs", "arms" -if (_selection != "" && {!(_selection in GVAR(SELECTIONS))}) exitWith {0}; - -// Exit if we disable damage temporarily -if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { - TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit,_unit); - if (_selection == "") then { - damage _unit - } else { - _unit getHit _selection - }; -}; - -// Get return damage -private _damageReturn = _damage; - -private _newDamage = _this call FUNC(handleDamage_caching); -// handleDamage_caching may have modified the projectile string -private _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); - -TRACE_3("ACE_DEBUG: HandleDamage caching new damage",_selection,_newDamage,_unit); - -private _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); -private _minLethalDamage = if (_typeIndex >= 0) then { - GVAR(minLethalDamages) select _typeIndex -} else { - 0.01 -}; - -if (!isNull _shooter) then { - _unit setvariable [QGVAR(lastDamageSource), _shooter, false]; -}; - -private _vehicle = vehicle _unit; -private _effectiveSelectionName = _selection; -if ((_vehicle != _unit) && {!(_vehicle isKindOf "StaticWeapon")} && {_shooter in [objNull, driver _vehicle, _vehicle]} && {_projectile == ""} && {_selection == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _effectiveSelectionName = _this select 1; //pull random selection from HDC - }; -}; - -if ((_minLethalDamage <= _newDamage) && {[_unit, [_effectiveSelectionName] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { - if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith { - _damageReturn = 0.9; - }; - if ([_unit, false, true] call FUNC(setDead)) then { - _damageReturn = 1; - } else { - _damageReturn = _damageReturn min 0.89; - }; -} else { - _damageReturn = _damageReturn min 0.89; -}; - -// Start the loop that tracks the unit vitals -[_unit] call FUNC(addVitalLoop); - -if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { - private _delayedUnconsicous = false; - if (_vehicle != _unit and {damage _vehicle >= 1}) then { - [_unit] call EFUNC(common,unloadPerson); - _delayedUnconsicous = true; - }; - - if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { - if (_unit getVariable ["ACE_isUnconscious", false]) exitwith { - [_unit, false, true] call FUNC(setDead); - 0.89; - }; - if (_delayedUnconsicous) then { - [{ - [_this select 0, true] call FUNC(setUnconscious); - }, [_unit], 0.7] call CBA_fnc_waitAndExecute; - } else { - [{ - [_this select 0, true] call FUNC(setUnconscious); - }, [_unit]] call CBA_fnc_execNextFrame; - }; - 0.89; - }; - _damageReturn min 0.89; -}; - -if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { - if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { - [_unit] call EFUNC(common,unloadPerson); - }; - [_unit, false, true] call FUNC(setDead); - 0.89; -}; - -TRACE_3("ACE_DEBUG: HandleDamage damage return",_selection,_damageReturn,_unit); - -_damageReturn diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf deleted file mode 100644 index 049b6a004c..0000000000 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ /dev/null @@ -1,73 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Advanced HandleDamage EH function. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: Hit part index of the hit point - * 6: Shooter? - * 7: Current damage to be returned - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "bullet", 2, kevin, 2] call ACE_medical_fnc_handleDamage_advanced - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfProjectile", "_hitPointNumber", "", "_newDamage"]; - -// For burning damage we will get a ton of very small hits of damage; they are too small to create any wounds -// Save them up in a variable and run when it is over a noticable amount - -if ((_typeOfProjectile == "") && {_newDamage < 0.15} && { - _newDamage = _newDamage + (_unit getVariable [QGVAR(trivialDamage), 0]); - if (_newDamage > 0.15) then { - // if the new sum is large enough, reset variable and continue with it added in - _unit setVariable [QGVAR(trivialDamage), 0]; - false - } else { - // otherwise just save the new sum into the variable and exit - _unit setVariable [QGVAR(trivialDamage), _newDamage]; - true // exit - }; -}) exitWith {}; - -private _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part < 0) exitWith {}; - -private _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; -// Sorting out the damage -private _damageBodyParts = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - -_damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; -_unit setVariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; - -private _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); - -[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); - -// TODO Disabled until implemented fully -//if (GVAR(enableAirway)) then { -// [_unit,_selectionName,_newDamage,_sourceOfDamage, _typeOfDamage] call FUNC(handleDamage_airway); -//}; -//if (GVAR(enableFractures)) then { -// [_unit,_selectionName,_newDamage,_sourceOfDamage, _typeOfDamage] call FUNC(handleDamage_fractures); -//}; -//if (GVAR(enableInternalBleeding)) then { -// [_unit,_selectionName,_newDamage,_sourceOfDamage, _typeOfDamage] call FUNC(handleDamage_internalInjuries); -//}; - -if (alive _unit && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { - // If it reaches this, we can assume that the hit did not kill this unit, as this function is called 3 frames after the damage has been passed. - if ([_unit, _part, if (_part > 1) then {_newDamage * 1.3} else {_newDamage * 2}] call FUNC(determineIfFatal)) then { - [_unit] call FUNC(setUnconscious); - }; -}; diff --git a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf deleted file mode 100644 index 8bf6d8f8e0..0000000000 --- a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Sets the hitpoint damage for au nit to the correct values - * - * Arguments: - * 0: Unit for which the hitpoint damage will be sorted out - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleDamage_advancedSetDamage - * - * Public: No - */ - -params ["_unit"]; - -if (!local _unit) exitWith {}; - -// ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] -private _bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - -_bodyStatus params ["_headDamage", "_torsoDamage", "_handsDamageR", "_handsDamageL", "_legsDamageR", "_legsDamageL"]; - -_unit setHitPointDamage ["hitHead", _headDamage min 0.95]; -_unit setHitPointDamage ["hitBody", _torsoDamage min 0.95]; -_unit setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; -_unit setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; - -if (_bodyStatus isEqualTo [0,0,0,0,0,0]) then { - _unit setDamage 0; -}; diff --git a/addons/medical/functions/fnc_handleDamage_airway.sqf b/addons/medical/functions/fnc_handleDamage_airway.sqf deleted file mode 100644 index 6b033dee36..0000000000 --- a/addons/medical/functions/fnc_handleDamage_airway.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the airway injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_airway - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); - -if (_bodyPartn > 1) exitWith {}; - -if (_amountOfDamage > 0.5) then { - if (random(1) >= 0.8) then { - if !(_unit getVariable[QGVAR(airwayCollapsed), false]) then { - _unit setVariable [QGVAR(airwayCollapsed), true, true]; - }; - }; -}; diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf deleted file mode 100644 index 42cb8c3e05..0000000000 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ /dev/null @@ -1,152 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Cache a handleDamage call to execute it 3 frames later - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: HitPointIndex (-1 for structural) - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "bullet", -1] call ACE_medical_fnc_handleDamage_caching - * - * Public: No - */ - -params ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitPointIndex"]; - -private _hitSelections = GVAR(SELECTIONS); - -// Calculate change in damage - use getHitIndex because selection is translated (hitdiaphragm->body) -private _newDamage = _damage - (damage _unit); -if (_hitPointIndex >= 0) then {_newDamage = _damage - (_unit getHitIndex _hitPointIndex)}; - -TRACE_7("ACE_DEBUG: HandleDamage_Caching Called",_unit, _selectionName, _damage, _source, _projectile,_hitPointIndex,_newDamage); - -// Check for vehicle crash -private _vehicle = vehicle _unit; -if ((_vehicle != _unit) && {!(_vehicle isKindOf "StaticWeapon")} && {_source in [objNull, driver _vehicle, _vehicle]} && {_projectile == ""} && {_selectionName == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _selectionName = selectRandom _hitSelections; - _projectile = "vehiclecrash"; - _this set [1, _selectionName]; - _this set [4, _projectile]; - }; -}; - -// Handle falling damage -private _impactVelocity = (velocity _unit) select 2; -if (_impactVelocity < -5 && {_vehicle == _unit}) then { - TRACE_1("Starting isFalling", time); - _unit setVariable [QGVAR(isFalling), true]; - _unit setVariable [QGVAR(impactVelocity), _impactVelocity]; -} else { - if ((_unit getVariable [QGVAR(isFalling), false]) && {diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2}) then { - TRACE_1("Ending isFalling", time); - _unit setVariable [QGVAR(isFalling), false]; - }; -}; - -if (_unit getVariable [QGVAR(isFalling), false]) then { - if !(_selectionName in ["", "leg_l", "leg_r"]) then { - if (_selectionName == "body") then { - _newDamage = _newDamage * abs(_unit getVariable [QGVAR(impactVelocity), _impactVelocity]) / 50; - } else { - _newDamage = _newDamage * 0.5; - }; - if (_newDamage < 0.075) then {_newDamage = 0;}; //Filter minor falling damage to non-leg hitpoints - } else { - if (_selectionName == "") then { - _selectionName = selectRandom ["leg_l", "leg_r"]; - _this set [1, _selectionName]; - }; - _newDamage = _newDamage * 0.7; - }; - _projectile = "falling"; - _this set [4, "falling"]; -}; - -// Finished with the current frame, reset variables -// Note: sometimes handleDamage spans over 2 or even 3 frames. -if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) then { - _unit setVariable [QGVAR(frameNo_damageCaching), diag_frameno]; - - // handle the cached damages 2 frames later - [{ - [{ - params ["_unit"]; - _unit setDamage 0; - private _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; - private _cache_damages = _unit getVariable QGVAR(cachedDamages); - { - (_x + [_cache_damages select _forEachIndex]) call FUNC(handleDamage_advanced); - } forEach _cache_params; - [_unit] call FUNC(handleDamage_advancedSetDamage); - }, _this] call CBA_fnc_execNextFrame; - }, _unit] call CBA_fnc_execNextFrame; - - _unit setVariable [QGVAR(cachedProjectiles), []]; - _unit setVariable [QGVAR(cachedHitPoints), []]; - _unit setVariable [QGVAR(cachedDamages), []]; - _unit setVariable [QGVAR(cachedHandleDamageParams), []]; -}; - -// Caching of the damage events -if (_selectionName != "") then { - private _cache_projectiles = _unit getVariable QGVAR(cachedProjectiles); - private _index = _cache_projectiles find _projectile; - - // Check if the current projectile has already been handled once - if (_index >= 0 && {_projectile != "falling"}) exitWith { - - private _cache_damages = _unit getVariable QGVAR(cachedDamages); - private _otherDamage = (_cache_damages select _index); // Find the previous damage this projectile has done - - // Take the highest damage of the two - if (_newDamage > _otherDamage) then { - private _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - private _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); - - // Restore the damage before the previous damage was processed - private _hitPoint = _cache_hitpoints select _index; - private _restore = ((_unit getHitIndex _hitPoint) - _otherDamage) max 0; - _unit setHitIndex [_hitPoint, _restore]; - - _cache_hitpoints set [_index, _hitPointIndex]; - _cache_damages set [_index, _newDamage]; - _cache_params set[_index, _this]; - - _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; - _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(cachedDamages), _cache_damages]; - _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; - }; - }; - - private _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); - private _cache_damages = _unit getVariable QGVAR(cachedDamages); - private _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - - // This is an unhandled projectile - _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack _hitPointIndex; - _cache_damages pushBack _newDamage; - _cache_params pushBack _this; - - // Store the new cached values - _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; - _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(cachedDamages), _cache_damages]; - _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; -}; - -TRACE_8("ACE_DEBUG: HandleDamage_Caching",_unit, _newDamage, _cache_params, _cache_damages, _unit getVariable QGVAR(cachedProjectiles), _unit getVariable QGVAR(cachedHitPoints), _unit getVariable QGVAR(cachedDamages), _unit getVariable QGVAR(cachedHandleDamageParams)); - -_newDamage diff --git a/addons/medical/functions/fnc_handleDamage_fractures.sqf b/addons/medical/functions/fnc_handleDamage_fractures.sqf deleted file mode 100644 index cc36b698c2..0000000000 --- a/addons/medical/functions/fnc_handleDamage_fractures.sqf +++ /dev/null @@ -1,70 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the fracture injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_handleDamage_fractures - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); - -private _fractureType = 1; -if (_amountOfDamage > 0.05) then { - - // TODO specify fractures based off typeOfInjury details better. - switch (_typeOfDamage) do { - case "Bullet": { - _fractureType = round(random(2)); - }; - case "Grenade": { - _fractureType = round(random(2)); - if (_fractureType < 1) then { - _fractureType = 1; - }; - }; - case "Explosive": { - _fractureType = round(random(2)); - if (_fractureType < 1) then { - _fractureType = 1; - }; - }; - case "Shell": { - _fractureType = round(random(2)); - if (_fractureType < 1) then { - _fractureType = 1; - }; - }; - case "Unknown": { - _fractureType = round(random(1)); - }; - case "VehicleCrash": { - _fractureType = round(random(0)); - }; - default { - _fractureType = round(random(1)); - }; - }; - - private _fractures = _unit getVariable[QGVAR(fractures), []]; - private _fractureID = 1; - private _amountOf = count _fractures; - if (_amountOf > 0) then { - _fractureID = (_fractures select (_amountOf - 1) select 0) + 1; - }; - _fractures pushBack [_fractureID, _fractureType, _bodyPartn, 1 /* percentage treated */]; - _unit setVariable [QGVAR(fractures), _fractures, true]; -}; diff --git a/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf b/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf deleted file mode 100644 index 6f96b138c2..0000000000 --- a/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the internal injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_handleDamage_internalInjuries - * - * Public: No - */ - -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); - -// TODO implement internal injuries diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf deleted file mode 100644 index fdc06621c5..0000000000 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ /dev/null @@ -1,67 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 2, kevin, "shot"] call ACE_medical_fnc_handleDamage_wounds - * - * Public: No - */ - -params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; -TRACE_6("ACE_DEBUG: HandleDamage Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage); - -if (_typeOfDamage == "") then {_typeOfDamage = "unknown";}; - -// Administration for open wounds and ids -private _openWounds = _unit getVariable[QGVAR(openWounds), []]; -private _woundID = _unit getVariable[QGVAR(lastUniqueWoundID), 1]; - -private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID]; - -private _painToAdd = 0; -private _woundsCreated = []; - -call compile _extensionOutput; -{ - _x params ["", "_toAddClassID", "_bodyPartNToAdd"]; - _foundIndex = -1; - { - _x params ["", "_compareId", "_comparyBodyPartN"]; - // Check if we have an id of the given class on the given bodypart already - if (_compareId == _toAddClassID && {_comparyBodyPartN == _bodyPartNToAdd}) exitWith { - _foundIndex = _forEachIndex; - }; - } forEach _openWounds; - - if (_foundIndex < 0) then { - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushBack _x; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - private _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; -} forEach _woundsCreated; - -_unit setVariable [QGVAR(openWounds), _openWounds, true]; - -// Only update if new wounds have been created -if (count _woundsCreated > 0) then { - _unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true]; -}; - -private _painLevel = _unit getVariable [QGVAR(pain), 0]; -_unit setVariable [QGVAR(pain), _painLevel + _painToAdd]; -TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated); diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf deleted file mode 100644 index 4cc51ce38f..0000000000 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ /dev/null @@ -1,134 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 1, kevin, "shot"] call ACE_medical_fnc_handleDamage_woundsOld - * - * Public: No - */ - -params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; -TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage); - -// Convert the selectionName to a number and ensure it is a valid selection. -private _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); -if (_bodyPartn < 0) exitWith {}; - -// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] -private _injuryTypeInfo = missionNamespace getVariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; - -// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] -private _allInjuriesForDamageType = _injuryTypeInfo select 2; -// It appears we are dealing with an unknown type of damage. - -if (count _allInjuriesForDamageType == 0) then { - // grabbing the configuration for unknown damage type - _injuryTypeInfo = missionNamespace getVariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; - _allInjuriesForDamageType = _injuryTypeInfo select 2; -}; - -// find the available injuries for this damage type and damage amount -private _highestPossibleSpot = -1; -private _highestPossibleDamage = -1; -private _allPossibleInjuries = []; -{ - private _damageLevels = _x select 4; - _damageLevels params ["_minDamage","_maxDamage"]; - - // Check if the damage is higher as the min damage for the specific injury - if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - //private _classType = _x select 0; - private _selections = _x select 1; - //private _bloodLoss = _x select 2; - //private _pain = _x select 3; - - // Check if the injury can be applied to the given selection name - if ("All" in _selections || _selectionName in _selections) then { - - // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries - if (_minDamage > _highestPossibleDamage) then { - _highestPossibleSpot = _forEachIndex; - _highestPossibleDamage = _minDamage; - }; - - // Store the valid possible injury for the damage type, damage amount and selection - _allPossibleInjuries pushBack _x; - }; - }; -} forEach _allInjuriesForDamageType; - -// No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitWith {}; - -// Administration for open wounds and ids -private _openWounds = _unit getVariable[QGVAR(openWounds), []]; -private _woundID = _unit getVariable[QGVAR(lastUniqueWoundID), 1]; - -private _painToAdd = 0; -private _woundsCreated = []; -{ - if (_x select 0 <= _damage) exitWith { - for "_i" from 0 to ((_x select 1)-1) do { - - // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] - private _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {selectRandom _allPossibleInjuries}; - private _toAddClassID = _toAddInjury select 0; - private _foundIndex = -1; - - private _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; - // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. - if ((_injuryTypeInfo select 1)) then { - { - // Check if we have an id of the given class on the given bodypart already - if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitWith { - _foundIndex = _forEachIndex; - }; - } forEach _openWounds; - }; - - private _injury = []; - if (_foundIndex < 0) then { - // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] - _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; - - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushBack _injury; - - // New injuries will also increase the wound ID - _woundID = _woundID + 1; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; - // Store the injury so we can process it later correctly. - _woundsCreated pushBack _injury; - - // Collect the pain that is caused by this injury - _painToAdd = _painToAdd + (_toAddInjury select 3); - }; - }; -} forEach (_injuryTypeInfo select 0); // forEach damage thresholds - -_unit setVariable [QGVAR(openWounds), _openWounds, true]; - -// Only update if new wounds have been created -if (count _woundsCreated > 0) then { - _unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true]; -}; - -private _painLevel = _unit getVariable [QGVAR(pain), 0]; -_unit setVariable [QGVAR(pain), _painLevel + _painToAdd]; -TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated); diff --git a/addons/medical/functions/fnc_handleInit.sqf b/addons/medical/functions/fnc_handleInit.sqf deleted file mode 100644 index 3431713d5d..0000000000 --- a/addons/medical/functions/fnc_handleInit.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Called when a unit is initialized via XEH_init - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleInit - * - * Public: No - */ - -params ["_unit"]; - -_unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; - -if (local _unit) then { - if (!EGVAR(common,settingsInitFinished)) exitWith { - EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(init), [_unit]]; - }; - [_unit] call FUNC(init); -}; diff --git a/addons/medical/functions/fnc_handleKilled.sqf b/addons/medical/functions/fnc_handleKilled.sqf deleted file mode 100644 index 9a2e8d2f63..0000000000 --- a/addons/medical/functions/fnc_handleKilled.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Called when a unit is killed - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleKilled - * - * Public: No - */ - -params ["_unit"]; -if (!local _unit) exitWith {}; - -_unit setVariable [QGVAR(pain), 0]; -if (GVAR(level) >= 2) then { - _unit setVariable [QGVAR(heartRate), 0]; - _unit setVariable [QGVAR(bloodPressure), [0, 0]]; - _unit setVariable [QGVAR(airwayStatus), 0]; -}; diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf deleted file mode 100644 index 06047f5545..0000000000 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Called when a unit switched locality - * - * Arguments: - * 0: The Unit - * 1: Is local - * - * Return Value: - * None - * - * Example: - * [bob, true] call ACE_medical_fnc_handleLocal - * - * Public: No - */ - -params ["_unit", "_local"]; -if (_local) then { - // If the unit had a loop tracking its vitals, restart it locally - if (_unit getVariable[QGVAR(addedToUnitLoop),false]) then { - [_unit, true] call FUNC(addVitalLoop); - }; - - if ((_unit getVariable ["ACE_isUnconscious",false]) && {count (_unit getVariable [QGVAR(unconsciousArguments), []]) >= 6}) then { - private _arguments = (_unit getVariable [QGVAR(unconsciousArguments), []]); - _arguments set [2, CBA_missionTime]; - - [DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler; - - _unit setVariable [QGVAR(unconsciousArguments), nil, true]; - }; -}; diff --git a/addons/medical/functions/fnc_handleRespawn.sqf b/addons/medical/functions/fnc_handleRespawn.sqf deleted file mode 100644 index be8f5f4f29..0000000000 --- a/addons/medical/functions/fnc_handleRespawn.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Called when a unit is Respawned - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleRespawn - * - * Public: No - */ - -params ["_unit"]; - -// reset all variables. @todo GROUP respawn? -[_unit] call FUNC(init); - -// Reset captive status for respawning unit -if (!(_unit getVariable ["ACE_isUnconscious", false])) then { - [_unit, "setHidden", "ace_unconscious", false] call EFUNC(common,statusEffect_set); -}; - -// Remove maximum unconsciousness time handler -_maxUnconHandle = _unit getVariable [QGVAR(maxUnconTimeHandle), -1]; -if (_maxUnconHandle > 0) then { - [_maxUnconHandle] call CBA_fnc_removePerFrameHandler; -}; diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf deleted file mode 100644 index a593c8e579..0000000000 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ /dev/null @@ -1,146 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Updates the vitals. Is expected to be called every second. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_handleUnitVitals - * - * Public: No - */ - -params ["_unit", "_interval"]; -TRACE_3("ACE_DEBUG",_unit,_interval,_unit); -if (_interval == 0) exitWith {}; - -private _lastTimeValuesSynced = _unit getVariable [QGVAR(lastMomentValuesSynced), 0]; -private _syncValues = (CBA_missionTime - _lastTimeValuesSynced >= (10 + floor(random(10))) && GVAR(keepLocalSettingsSynced)); -if (_syncValues) then { - _unit setVariable [QGVAR(lastMomentValuesSynced), CBA_missionTime]; -}; - -private _bloodVolume = (_unit getVariable [QGVAR(bloodVolume), 100]) + ([_unit, _syncValues] call FUNC(getBloodVolumeChange)); -_bloodVolume = _bloodVolume max 0; - -_unit setVariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; - -TRACE_3("ACE_DEBUG",_bloodVolume,_syncValues,_unit); -// Set variables for synchronizing information across the net -if (_bloodVolume < 100) then { - if (_bloodVolume < 90) then { - TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); - if (_unit getVariable [QGVAR(hasLostBlood), 0] != 2) then { - _unit setVariable [QGVAR(hasLostBlood), 2, true]; - }; - } else { - TRACE_4("ACE_DEBUG", _bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); - if (_unit getVariable [QGVAR(hasLostBlood), 0] != 1) then { - _unit setVariable [QGVAR(hasLostBlood), 1, true]; - }; - }; -} else { - TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); - if (_unit getVariable [QGVAR(hasLostBlood), 0] != 0) then { - _unit setVariable [QGVAR(hasLostBlood), 0, true]; - }; -}; - -TRACE_3("ACE_DEBUG",[_unit] call FUNC(getBloodLoss),_unit getVariable QGVAR(isBleeding),_unit); -if (([_unit] call FUNC(getBloodLoss)) > 0) then { - if !(_unit getVariable [QGVAR(isBleeding), false]) then { - _unit setVariable [QGVAR(isBleeding), true, true]; - }; -} else { - if (_unit getVariable [QGVAR(isBleeding), false]) then { - _unit setVariable [QGVAR(isBleeding), false, true]; - }; -}; - -private _painStatus = _unit getVariable [QGVAR(pain), 0]; -TRACE_4("ACE_DEBUG",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(painSuppress),_unit); -if (_painStatus > (_unit getVariable [QGVAR(painSuppress), 0])) then { - if !(_unit getVariable [QGVAR(hasPain), false]) then { - _unit setVariable [QGVAR(hasPain), true, true]; - }; -} else { - if (_unit getVariable [QGVAR(hasPain), false]) then { - _unit setVariable [QGVAR(hasPain), false, true]; - }; -}; - -if (_bloodVolume < 30) exitWith { - [_unit] call FUNC(setDead); -}; - -if ([_unit] call EFUNC(common,isAwake)) then { - if (_bloodVolume < 60) then { - if (random(1) > 0.9) then { - [_unit, true, 15 + random(20)] call FUNC(setUnconscious); - }; - }; -}; - -if (GVAR(level) == 1) then { - TRACE_5("ACE_DEBUG_BASIC_VITALS",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); - // reduce pain - if (_painStatus > 0) then { - _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; - }; - - // reduce painkillers - if (_unit getVariable [QGVAR(morphine), 0] > 0) then { - _unit setVariable [QGVAR(morphine), ((_unit getVariable [QGVAR(morphine), 0]) - 0.0015 * _interval) max 0, _syncValues]; - }; -}; - -// handle advanced medical, with vitals -if (GVAR(level) >= 2) then { - TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, _unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); - - // Handle pain due tourniquets, that have been applied more than 120 s ago - private _oldTourniquets = (_unit getVariable [QGVAR(tourniquets), []]) select {_x > 0 && {CBA_missionTime - _x > 120}}; - // Increase pain at a rate of 0.001 units/s per old tourniquet - _painStatus = _painStatus + (count _oldTourniquets) * 0.001 * _interval; - - // Set the vitals - private _heartRate = (_unit getVariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval); - _unit setVariable [QGVAR(heartRate), _heartRate max 0, _syncValues]; - - private _bloodPressure = [_unit] call FUNC(getBloodPressure); - _unit setVariable [QGVAR(bloodPressure), _bloodPressure, _syncValues]; - - _painReduce = [0.001, 0.002] select (_painStatus > 5); - - // @todo: replace this and the rest of the setVariable with EFUNC(common,setApproximateVariablePublic) - _unit setVariable [QGVAR(pain), (_painStatus - _painReduce * _interval) max 0, _syncValues]; - - TRACE_8("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_painReduce,_heartRate,_bloodVolume,_bloodPressure,_interval,_syncValues,_unit); - - // Check vitals for medical status - // TODO check for in revive state instead of variable - _bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; - - if (!(_unit getVariable [QGVAR(inCardiacArrest),false])) then { - if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then { - [_unit, true, 10+ random(20)] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already. - }; - - if ((_bloodPressureH > 260) - || {_bloodPressureL < 40 && ({_heartRate > 190})} - || {(_bloodPressureH > 145 && {_heartRate > 150})}) then { - - if (random(1) > 0.7) then { - [_unit] call FUNC(setCardiacArrest); - }; - }; - if (_heartRate > 200 || (_heartRate < 20)) then { - [_unit] call FUNC(setCardiacArrest); - }; - }; -}; diff --git a/addons/medical/functions/fnc_hasItem.sqf b/addons/medical/functions/fnc_hasItem.sqf deleted file mode 100644 index 1174563dfc..0000000000 --- a/addons/medical/functions/fnc_hasItem.sqf +++ /dev/null @@ -1,43 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if the item is present between the patient and the medic - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Item - * - * Return Value: - * None - * - * Example: - * [bob, patient, "bandage"] call ace_medical_fnc_hasItem - * - * Public: Yes - */ - -params ["_medic", "_patient", "_item"]; - -if (isNil QGVAR(setting_allowSharedEquipment)) then { - GVAR(setting_allowSharedEquipment) = true; -}; -if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { - true -}; - -if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { - true -}; - -private _return = false; -if ((vehicle _medic != _medic) && {[vehicle _medic] call FUNC(isMedicalVehicle)}) then { - private _crew = crew vehicle _medic; - { - if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitWith { - _return = true; - }; - } forEach _crew; -}; - -_return diff --git a/addons/medical/functions/fnc_hasMedicalEnabled.sqf b/addons/medical/functions/fnc_hasMedicalEnabled.sqf deleted file mode 100644 index c034648c33..0000000000 --- a/addons/medical/functions/fnc_hasMedicalEnabled.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if unit has CMS enabled - * - * Arguments: - * 0: unit - * - * Return Value: - * enabled - * - * Example: - * [Unit] call ace_medical_fnc_hasMedicalEnabled - * - * Public: No - */ - -params ["_unit"]; - -private _medicalEnabled = _unit getVariable QGVAR(enableMedical); -if (isNil "_medicalEnabled") exitWith { - (((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getVariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1) -}; - -_medicalEnabled diff --git a/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf deleted file mode 100644 index 852bddfa12..0000000000 --- a/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if unit has a tourniquet applied to the specified bodypart - * - * Arguments: - * 0: The Unit - * 1: SelectionName - * - * Return Value: - * Has tourniquet applied - * - * Example: - * [bob, "leg"] call ace_medical_fnc_hasTourniquetAppliedTo - * - * Public: Yes - */ - -params ["_target", "_selectionName"]; - -(((_target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0); diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf deleted file mode 100644 index a9f164eb0f..0000000000 --- a/addons/medical/functions/fnc_init.sqf +++ /dev/null @@ -1,88 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, commy2 - * Initializes unit variables. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_init - * - * Public: No - */ - -params ["_unit"]; - -// basic -_unit setVariable [QGVAR(pain), 0, true]; -_unit setVariable [QGVAR(morphine), 0, true]; -_unit setVariable [QGVAR(bloodVolume), 100, true]; -_unit setVariable ["ACE_isUnconscious", false, true]; - -// advanced -// tourniquets -_unit setVariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; - -//Delayed Medications (from tourniquets) -_unit setVariable [QGVAR(occludedMedications), nil, true]; - -// wounds and injuries -_unit setVariable [QGVAR(openWounds), [], true]; -_unit setVariable [QGVAR(bandagedWounds), [], true]; -_unit setVariable [QGVAR(internalWounds), [], true]; -_unit setVariable [QGVAR(lastUniqueWoundID), 1, true]; - -// vitals -_unit setVariable [QGVAR(heartRate), 80]; -_unit setVariable [QGVAR(heartRateAdjustments), []]; -_unit setVariable [QGVAR(bloodPressure), [80, 120]]; -_unit setVariable [QGVAR(peripheralResistance), 100]; - -// fractures -_unit setVariable [QGVAR(fractures), [], true]; - -// triage card and logs -_unit setVariable [QGVAR(triageLevel), 0, true]; -_unit setVariable [QGVAR(triageCard), [], true]; - -// IVs -_unit setVariable [QGVAR(ivBags), nil, true]; - -// damage storage -_unit setVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; - -// airway -_unit setVariable [QGVAR(airwayStatus), 100]; -_unit setVariable [QGVAR(airwayOccluded), false]; -_unit setVariable [QGVAR(airwayCollapsed), false]; - -// generic medical admin -_unit setVariable [QGVAR(addedToUnitLoop), false, true]; -_unit setVariable [QGVAR(inCardiacArrest), false, true]; -_unit setVariable [QGVAR(hasLostBlood), 0, true]; -_unit setVariable [QGVAR(isBleeding), false, true]; -_unit setVariable [QGVAR(hasPain), false, true]; -_unit setVariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; -_unit setVariable [QGVAR(painSuppress), 0, true]; - -// medication -private _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; -{ - _unit setVariable [_x select 0, nil]; -} forEach _allUsedMedication; -_unit setVariable [QGVAR(allUsedMedication), [], true]; - -private _logs = _unit getVariable [QGVAR(allLogs), []]; -{ - _unit setVariable [_x, nil]; -} forEach _logs; -_unit setVariable [QGVAR(allLogs), [], true]; - -// items -[{ - _this call FUNC(itemCheck); -}, [_unit], 0.5, 0.1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_isInStableCondition.sqf b/addons/medical/functions/fnc_isInStableCondition.sqf deleted file mode 100644 index da56ea402e..0000000000 --- a/addons/medical/functions/fnc_isInStableCondition.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if a unit is in a stable condition - * - * Arguments: - * 0: The patient - * - * Return Value: - * Is in stable condition - * - * Example: - * [bob] call ACE_medical_fnc_isInStableCondition - * - * Public: No - */ - -params ["_unit"]; - -private _totalBloodLoss = 0; -{ - // total bleeding ratio * percentage of injury left - _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); -} forEach (_unit getVariable [QGVAR(openWounds), []]); - -(_totalBloodLoss == 0); diff --git a/addons/medical/functions/fnc_itemCheck.sqf b/addons/medical/functions/fnc_itemCheck.sqf deleted file mode 100644 index 29a9efef74..0000000000 --- a/addons/medical/functions/fnc_itemCheck.sqf +++ /dev/null @@ -1,58 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Replaces vanilla items with ACE ones. - * - * Arguments: - * 0: The unit - * - * Return Value: - * None - * - * Example: - * [bob] call ace_medical_fnc_itemCheck - * - * Public: Yes - */ - -if (GVAR(convertItems) == 2) exitWith {}; - -params ["_unit"]; - -while {({_x == "FirstAidKit"} count items _unit) > 0} do { - _unit removeItem "FirstAidKit"; - if (GVAR(convertItems) == 0) then { - if (GVAR(level) >= 2) then { - _unit addItem "ACE_fieldDressing"; - _unit addItem "ACE_packingBandage"; - _unit addItem "ACE_morphine"; - _unit addItem "ACE_tourniquet"; - } else { - _unit addItem "ACE_fieldDressing"; - _unit addItem "ACE_fieldDressing"; - _unit addItem "ACE_morphine"; - }; - }; -}; - -while {({_x == "Medikit"} count items _unit) > 0} do { - _unit removeItem "Medikit"; - if (GVAR(convertItems) == 0) then { - if (GVAR(level) >= 2) then { - _unit addItemToBackpack "ACE_fieldDressing"; - _unit addItemToBackpack "ACE_packingBandage"; - _unit addItemToBackpack "ACE_packingBandage"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_morphine"; - _unit addItemToBackpack "ACE_salineIV_250"; - _unit addItemToBackpack "ACE_tourniquet"; - } else { - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_epinephrine"; - _unit addItemToBackpack "ACE_bloodIV"; - _unit addItemToBackpack "ACE_bloodIV"; - }; - }; -}; diff --git a/addons/medical/functions/fnc_medicationEffectLoop.sqf b/addons/medical/functions/fnc_medicationEffectLoop.sqf deleted file mode 100644 index efef65ece9..0000000000 --- a/addons/medical/functions/fnc_medicationEffectLoop.sqf +++ /dev/null @@ -1,44 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Medication effect loop for an injection. - * - * Arguments: - * 0: Unit - * 1: Name of the Variable that is affected - * 2: Proportion of the effect applied - * 3: Rate at which the effect is applied - * 4: Viscosity adjustment rate - * 5: Pain reduction rate - * - * Return Value: - * None - * - * Example: - * [bob, "leg", 1, 2, 3, 4] call ACE_medical_fnc_medicationEffectLoop - * - * Public: No - */ - -params ["_unit", "_variableName", "_amountDecreased","_decreaseRate", "_viscosityAdjustmentRate", "_painReduceRate"]; - -// If the unit died the loop is finished -if (!alive _unit) exitWith {}; - -// If locality changed finish the local loop -if (!local _unit) exitWith {}; - -// Apply medicinal effect -private _usedMeds = (_unit getVariable [_variableName, 0]) - _decreaseRate; -_unit setVariable [_variableName, _usedMeds]; - -// Restore the viscosity while the medication is leaving the system -_unit setVariable [QGVAR(peripheralResistance), ((_unit getVariable [QGVAR(peripheralResistance), 100]) - _viscosityAdjustmentRate) max 0]; -_unit setVariable [QGVAR(painSuppress), ((_unit getVariable [QGVAR(painSuppress), 0]) - _painReduceRate) max 0]; - -// Exit if the medication has finished it's effect -_amountDecreased = _amountDecreased + _decreaseRate; -if (_amountDecreased >= 1 || (_usedMeds <= 0) || !alive _unit) exitWith {}; - -// Schedule the loop to be executed again 1 sec later -[DFUNC(medicationEffectLoop), [_unit, _variableName, _amountDecreased, _decreaseRate, _viscosityAdjustmentRate, _painReduceRate], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_modifyMedicalAction.sqf b/addons/medical/functions/fnc_modifyMedicalAction.sqf deleted file mode 100644 index 16ea718d72..0000000000 --- a/addons/medical/functions/fnc_modifyMedicalAction.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: esteldunedain - * Modify the visuals of a medical action point. - * On Basic medical: modify the icon color based on damage on that body part. - * - * Arguments: - * 0: The Patient Unit - * 1: The Diagnosing Unit - * 2: Selection Number - * 3: The action to modify - * - * Return Value: - * None - * - * Example: - * [bob, kevin, 2, "action"] call ACE_medical_fnc_modifyMedicalAction - * - * Public: No - */ - -params ["_target", "_player", "_partNumber", "_actionData"]; - -private _bloodLossOnSelection = 0; -// Add all bleeding from wounds on selection -{ - _x params ["", "", "_selectionX", "_amountOf", "_percentageOpen"]; - if (_selectionX == _partNumber) then { - _bloodLossOnSelection = _bloodLossOnSelection + (_amountOf * _percentageOpen); - }; -} forEach (_target getvariable [QGVAR(openWounds), []]); - -if (_bloodLossOnSelection >= 0.15) then { - _actionData set [2, QPATHTOF(UI\icons\medical_crossRed.paa)]; -} else { - if (_bloodLossOnSelection > 0 ) then { - _actionData set [2, QPATHTOF(UI\icons\medical_crossYellow.paa)]; - }; -}; diff --git a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf deleted file mode 100644 index e19f670b3a..0000000000 --- a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical treatment settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleAdvancedMedicalSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(enableFor), "enableFor"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableAdvancedWounds), "enableAdvancedWounds"] call EFUNC(common,readSettingFromModule); -// TODO disabled until implemented -// [_logic, QGVAR(enableAirway), "enableAirway"] call EFUNC(common,readSettingFromModule); -// [_logic, QGVAR(enableFractures), "enableFractures"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(medicSetting_PAK), "medicSetting_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(medicSetting_SurgicalKit), "medicSetting_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(consumeItem_PAK), "consumeItem_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(consumeItem_SurgicalKit), "consumeItem_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useLocation_PAK), "useLocation_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useLocation_SurgicalKit), "useLocation_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useCondition_PAK), "useCondition_PAK"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useCondition_SurgicalKit), "useCondition_SurgicalKit"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(healHitPointAfterAdvBandage), "healHitPointAfterAdvBandage"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(painIsOnlySuppressed), "painIsOnlySuppressed"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf b/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf deleted file mode 100644 index d65afdf7cb..0000000000 --- a/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Assign a medical role to a unit. - * - * Arguments: - * 0: The module logic - * 1: Synchronized units - * 2: Activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleAssignMedicRoles - * - * Public: No - */ - -params ["_logic"]; - -if (!isNull _logic) then { - private _list = _logic getVariable ["EnableList", ""]; - private _setting = _logic getVariable ["role", 0]; - - [_list, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList); - [synchronizedObjects _logic, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList); -}; diff --git a/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf b/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf deleted file mode 100644 index a1b6303b45..0000000000 --- a/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Register synchronized objects from passed object as a medical facility - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [kevin, bob], true] call ACE_medical_fnc_moduleAssignMedicalFacility - * - * Public: No - */ - -params [["_logic", objNull, [objNull]]]; -if (!isNull _logic) then { - private _setting = _logic getVariable ["class",0]; - private _objects = synchronizedObjects _logic; - { - if (local _x) then { - _x setVariable[QGVAR(isMedicalFacility), true, true]; - }; - } forEach _objects; -}; - -true; diff --git a/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf b/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf deleted file mode 100644 index 3eda8f0106..0000000000 --- a/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Assign vehicle as a medical vehicle. - * - * Arguments: - * 0: The module logic - * 1: Synchronized units - * 2: Activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleAssignMedicalVehicle - * - * Public: No - */ - -params ["_logic"]; - -if (!isNull _logic) then { - private _list = _logic getVariable ["EnableList", ""]; - private _setting = _logic getVariable ["enabled", 0]; - - [_list, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList); - [synchronizedObjects _logic, QGVAR(medicClass), _setting, true, true] call EFUNC(common,assignObjectsInList); -}; diff --git a/addons/medical/functions/fnc_moduleBasicMedicalSettings.sqf b/addons/medical/functions/fnc_moduleBasicMedicalSettings.sqf deleted file mode 100644 index 6d27cfe803..0000000000 --- a/addons/medical/functions/fnc_moduleBasicMedicalSettings.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical treatment settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [Logic, [bob, kevin], true] call ACE_medical_fnc_moduleBasicMedicalSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(medicSetting_basicEpi), "medicSetting_basicEpi"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(useLocation_basicEpi), "useLocation_basicEpi"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleMedicalSettings.sqf b/addons/medical/functions/fnc_moduleMedicalSettings.sqf deleted file mode 100644 index a843d8c1c1..0000000000 --- a/addons/medical/functions/fnc_moduleMedicalSettings.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical damage settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleMedicalSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(level), "level"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(medicSetting), "medicSetting"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(increaseTrainingInLocations), "increaseTrainingInLocations"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(allowLitterCreation), "allowLitterCreation"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(litterCleanUpDelay), "litterCleanUpDelay"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableScreams), "enableScreams"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(playerDamageThreshold), "playerDamageThreshold"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(AIDamageThreshold), "AIDamageThreshold"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableUnconsciousnessAI), "enableUnconsciousnessAI"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(remoteControlledAI), "remoteControlledAI"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(preventInstaDeath), "preventInstaDeath"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(bleedingCoefficient), "bleedingCoefficient"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(painCoefficient), "painCoefficient"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(keepLocalSettingsSynced), "keepLocalSettingsSynced"] call EFUNC(common,readSettingFromModule); -// [_logic, QGVAR(delayUnconCaptive), "delayUnconCaptive"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleReviveSettings.sqf b/addons/medical/functions/fnc_moduleReviveSettings.sqf deleted file mode 100644 index d7f54583cf..0000000000 --- a/addons/medical/functions/fnc_moduleReviveSettings.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical revive settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_fnc_moduleReviveSettings - * - * Public: No - */ - -params ["_logic", "_units", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(maxReviveTime), "maxReviveTime"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(amountOfReviveLives), "amountOfReviveLives"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableRevive), "enableRevive"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf deleted file mode 100644 index c94a4f898f..0000000000 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ /dev/null @@ -1,170 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Parse the ACE_Medical_Advanced config for all injury types. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_medical_fnc_parseConfigForInjuries - * - * Public: No - */ - -private _injuriesRootConfig = (configFile >> "ACE_Medical_Advanced" >> "Injuries"); -private _allFoundDamageTypes = []; -private _configDamageTypes = (_injuriesRootConfig >> "damageTypes"); - -// minimum lethal damage collection, mapped to damageTypes -private _defaultMinLethalDamage = getNumber (_configDamageTypes >> "lethalDamage"); -GVAR(minLethalDamages) = []; - -// Collect all available damage types from the config -for "_i" from 0 to (count _configDamageTypes -1) /* step +1 */ do { - // Only get the subclasses in damageType class - if (isClass(_configDamageTypes select _i)) then { - _allFoundDamageTypes pushBack (configName (_configDamageTypes select _i)); - private _minLethalDamage = if (isNumber((_configDamageTypes select _i) >> "lethalDamage")) then { - getNumber((_configDamageTypes select _i) >> "lethalDamage"); - } else { - _defaultMinLethalDamage - }; - - GVAR(minLethalDamages) pushBack _minLethalDamage; - }; -}; -GVAR(allAvailableDamageTypes) = _allFoundDamageTypes; -GVAR(woundClassNames) = []; -GVAR(fractureClassNames) = []; - -// Parsing the wounds -// function for parsing a sublcass of an injury -private _parseForSubClassWounds = { - private _subClass = _this select 0; - if (isClass (_entry >> _subClass)) exitWith { - private _subClassConfig = (_entry >> _subClass); - private _subClasstype = _classType + (configName _subClassConfig); - private _subClassselections = if (isArray(_subClassConfig >> "selections")) then { getArray(_subClassConfig >> "selections");} else { _selections }; - private _subClassbloodLoss = if (isNumber(_subClassConfig >> "bleedingRate")) then { getNumber(_subClassConfig >> "bleedingRate");} else { _bloodLoss }; - private _subClasspain = if (isNumber(_subClassConfig >> "pain")) then { getNumber(_subClassConfig >> "pain");} else { _pain }; - private _subClassminDamage = if (isNumber(_subClassConfig >> "minDamage")) then { getNumber(_subClassConfig >> "minDamage");} else { _minDamage }; - private _subClassmaxDamage = if (isNumber(_subClassConfig >> "maxDamage")) then { getNumber(_subClassConfig >> "maxDamage");} else { _maxDamage }; - private _subClasscauses = if (isArray(_subClassConfig >> "causes")) then { getArray(_subClassConfig >> "causes");} else { _causes }; - private _subClassDisplayName = if (isText(_subClassConfig >> "name")) then { getText(_subClassConfig >> "name");} else {_classDisplayName + " " + _subClass}; - if (count _selections > 0 && {count _causes > 0}) then { - GVAR(woundClassNames) pushBack _subClasstype; - _allWoundClasses pushBack [_classID, _subClassselections, _subClassbloodLoss, _subClasspain, [_subClassminDamage, _subClassmaxDamage], _subClasscauses, _subClassDisplayName]; - _classID = _classID + 1; - }; - true; - }; - false; -}; - -// TODO classTypes are strings currently. Convert them to unqiue IDs instead. -private _woundsConfig = (_injuriesRootConfig >> "wounds"); -private _allWoundClasses = []; -private _classID = 0; -if (isClass _woundsConfig) then { - private _amountOf = count _woundsConfig; - for "_i" from 0 to (_amountOf -1) /* step +1 */ do { - private _entry = _woundsConfig select _i; - if (isClass _entry) then { - private _classType = (ConfigName _entry); - private _selections = if (isArray(_entry >> "selections")) then { getArray(_entry >> "selections");} else {[]}; - private _bloodLoss = if (isNumber(_entry >> "bleedingRate")) then { getNumber(_entry >> "bleedingRate");} else {0}; - private _pain = if (isNumber(_entry >> "pain")) then { getNumber(_entry >> "pain");} else {0}; - private _minDamage = if (isNumber(_entry >> "minDamage")) then { getNumber(_entry >> "minDamage");} else {0}; - private _maxDamage = if (isNumber(_entry >> "maxDamage")) then { getNumber(_entry >> "maxDamage");} else {-1}; - private _causes = if (isArray(_entry >> "causes")) then { getArray(_entry >> "causes");} else {[]}; - private _classDisplayName = if (isText(_entry >> "name")) then { getText(_entry >> "name");} else {_classType}; - - // TODO instead of hardcoding minor, medium and large just go through all sub classes recursively until none are found - if (["Minor"] call _parseForSubClassWounds || ["Medium"] call _parseForSubClassWounds || ["Large"] call _parseForSubClassWounds) exitWith {}; // continue to the next one - - // There were no subclasses, so we will add this one instead. - if (count _selections > 0 && count _causes > 0) then { - GVAR(woundClassNames) pushBack _classType; - _allWoundClasses pushBack [_classID, _selections, _bloodLoss, _pain, [_minDamage, _maxDamage], _causes, _classDisplayName]; - _classID = _classID + 1; - }; - true; - }; - }; -}; -GVAR(AllWoundInjuryTypes) = _allWoundClasses; - -// Linking injuries to the woundInjuryType variables. -private _damageTypesConfig = (configFile >> "ACE_Medical_Advanced" >> "Injuries" >> "damageTypes"); -private _thresholds = getArray(_damageTypesConfig >> "thresholds"); -private _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); -{ - private _varName = format[QGVAR(woundInjuryType_%1),_x]; - private _woundTypes = []; - private _type = _x; - { - // Check if this type is in the causes of a wound class, if so, we will store the wound types for this damage type - if (_type in (_x select 5)) then { - _woundTypes pushBack _x; - }; - } forEach _allWoundClasses; - private _typeThresholds = _thresholds; - private _selectionSpecificType = _selectionSpecific; - if (isClass(_damageTypesConfig >> _x)) then { - if (isArray(_damageTypesConfig >> _x >> "thresholds")) then { _typeThresholds = getArray(_damageTypesConfig >> _x >> "thresholds");}; - if (isNumber(_damageTypesConfig >> _x >> "selectionSpecific")) then { _selectionSpecificType = getNumber(_damageTypesConfig >> _x >> "selectionSpecific");}; - }; - missionNamespace setVariable [_varName, [_typeThresholds, _selectionSpecificType > 0, _woundTypes]]; - - // extension loading - private _minDamageThresholds = ""; - private _amountThresholds = ""; - { - _minDamageThresholds = _minDamageThresholds + str(_x select 0); - _amountThresholds = _amountThresholds + str(_x select 1); - if (_forEachIndex < (count _typeThresholds) - 1) then { - _minDamageThresholds = _minDamageThresholds + ":"; - _amountThresholds = _amountThresholds + ":"; - }; - } forEach _typeThresholds; - - "ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _forEachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; - -} forEach _allFoundDamageTypes; - - -// Extension loading - -{ - // add shit to addInjuryType - _x params ["_classID", "_selections", "_bloodLoss", "_pain", "_damage", "_causesArray", "_classDisplayName"]; - _damage params ["_minDamage", "_maxDamage"]; - private _className = GVAR(woundClassNames) select _forEachIndex; - private _allowedSelections = ""; - - { - _allowedSelections = _allowedSelections + _x; - if (_forEachIndex < (count _selections) - 1) then { - _allowedSelections = _allowedSelections + ":"; - }; - } forEach _selections; - - private _causes = ""; - - { - _causes = _causes + _x; - if (_forEachIndex < (count _causesArray) - 1) then { - _causes = _causes + ":"; - }; - } forEach _causesArray; - _classDisplayName = _x select 6; - - "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; - -} forEach _allWoundClasses; - -"ace_medical" callExtension "ConfigComplete"; diff --git a/addons/medical/functions/fnc_playInjuredSound.sqf b/addons/medical/functions/fnc_playInjuredSound.sqf deleted file mode 100644 index 6955886659..0000000000 --- a/addons/medical/functions/fnc_playInjuredSound.sqf +++ /dev/null @@ -1,83 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Play the injured sound for a unit if the unit is damaged. The sound broadcasted across MP. - * Will not play if the unit has already played a sound within to close a time frame. - * Delay: With minimal damage (below 1), the delay is (10 + random(50)) seconds. Otherwise it is 60 seconds / damage. - * - * Arguments: - * 0: The Unit - * 1: Amount of Pain - * - * Return Value: - * None - * - * Example: - * [bob, 5] call ACE_medical_fnc_playInjuredSound - * - * Public: No - */ - -params ["_unit", "_pain"]; -if (!local _unit || !GVAR(enableScreams)) exitWith{}; - -// Lock if the unit is already playing a sound. -if ((_unit getVariable [QGVAR(playingInjuredSound),false])) exitWith {}; -_unit setVariable [QGVAR(playingInjuredSound),true]; - -// Play the sound if there is any damage present. -if (_pain > 0 && {[_unit] call EFUNC(common,isAwake)}) exitWith { - // Classnames of the available sounds. - private _availableSounds_A = [ - "WoundedGuyA_01", - "WoundedGuyA_02", - "WoundedGuyA_03", - "WoundedGuyA_04", - "WoundedGuyA_05", - "WoundedGuyA_06", - "WoundedGuyA_07", - "WoundedGuyA_08" - ]; - private _availableSounds_B = [ - "WoundedGuyB_01", - "WoundedGuyB_02", - "WoundedGuyB_03", - "WoundedGuyB_04", - "WoundedGuyB_05", - "WoundedGuyB_06", - "WoundedGuyB_07", - "WoundedGuyB_08" - ]; - private _availableSounds_C = [ - "WoundedGuyC_01", - "WoundedGuyC_02", - "WoundedGuyC_03", - "WoundedGuyC_04", - "WoundedGuyC_05" - ]; - private _sound = ""; - - // Select the to be played sound based upon damage amount. - if (_pain > 0.5) then { - if (random(1) > 0.5) then { - _sound = selectRandom _availableSounds_A; - } else { - _sound = selectRandom _availableSounds_B; - }; - } else { - _sound = selectRandom _availableSounds_B; - }; - // Play the sound - playSound3D [(getArray(configFile >> "CfgSounds" >> _sound >> "sound") select 0) + ".wss", objNull, false, getPos _unit, 15, 1, 25]; // +2db, 15 meters. - - // Figure out what the delay will be before it is possible to play a sound again. - private _delay = (30 - (random(25) * _pain)) max (3.5 + random(2)); - - // Clean up the lock - [{ - (_this select 0) setVariable [QGVAR(playingInjuredSound), nil]; - }, [_unit], _delay, _delay] call CBA_fnc_waitAndExecute; -}; - -// Clean up in case there has not been played any sounds. -_unit setVariable [QGVAR(playingInjuredSound), nil]; diff --git a/addons/medical/functions/fnc_reviveStateLoop.sqf b/addons/medical/functions/fnc_reviveStateLoop.sqf deleted file mode 100644 index 7e662bdbb1..0000000000 --- a/addons/medical/functions/fnc_reviveStateLoop.sqf +++ /dev/null @@ -1,58 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Loop that handles a unit in the revive state. - * - * Arguments: - * 0: Unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_reviveStateLoop - * - * Public: No - */ - -params ["_unit"]; - -// If locality changed finish the local loop -// @todo: reinitiate the loop elsewhere -if (!local _unit) exitWith {}; - -private _startTime = _unit getVariable [QGVAR(reviveStartTime), 0]; - -// If we are in revive state in a blown up vehicle, try to unload so that people can access the body -if ((alive _unit) && {(vehicle _unit) != _unit} && {!alive (vehicle _unit)}) then { - TRACE_2("Unloading", _unit, vehicle _unit); - [_unit] call EFUNC(common,unloadPerson); -}; - -// If the timer run out, let the unit die and exit the loop -if (GVAR(maxReviveTime) > 0 && {CBA_missionTime - _startTime > GVAR(maxReviveTime)}) exitwith { - _unit setVariable [QGVAR(inReviveState), nil, true]; - _unit setVariable [QGVAR(reviveStartTime), nil]; - [_unit, true] call FUNC(setDead); -}; - -// If the unit was taken out from revive state, exit the loop -if !(_unit getVariable [QGVAR(inReviveState), false]) exitwith { - // Revived without dieing, so in case we have lifes, remove one. - if (GVAR(amountOfReviveLives) > 0) then { - _lifesLeft = _unit getVariable[QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; - _unit setVariable [QGVAR(amountOfReviveLives), _lifesLeft - 1, true]; - }; - - _unit setVariable [QGVAR(reviveStartTime), nil]; -}; - -// Remove heartbeat -if (GVAR(level) >= 2) then { - if (_unit getVariable [QGVAR(heartRate), 60] > 0) then { - _unit setVariable [QGVAR(heartRate), 0]; - }; -}; - -// Schedule the loop to be executed again 1 sec later -[DFUNC(reviveStateLoop), [_unit], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_selectionNameToNumber.sqf b/addons/medical/functions/fnc_selectionNameToNumber.sqf deleted file mode 100644 index c5c0ceb2ed..0000000000 --- a/addons/medical/functions/fnc_selectionNameToNumber.sqf +++ /dev/null @@ -1,18 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Get the number representation of a selection name. - * - * Arguments: - * 0: The selection name of a unit - * - * Return Value: - * Number representation. -1 if invalid. - * - * Example: - * ["head"] call ace_medical_fnc_selectionNameToNumber - * - * Public: yes - */ - -(["head","body","hand_l","hand_r","leg_l","leg_r"] find (_this select 0)); diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf deleted file mode 100644 index a8676c7342..0000000000 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ /dev/null @@ -1,44 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Triggers a unit into the Cardiac Arrest state from CMS. Will put the unit in an unconscious state and run a countdown timer until unit dies. - * Timer is a random value between 120 and 720 seconds. - * - * Arguments: - * 0: The unit that will be put in cardiac arrest state - * - * Return Value: - * None - * - * Example: - * [bob] call ace_medical_fnc_setCardiacArrest - * - * Public: yes - */ - -params ["_unit"]; - -if (_unit getVariable [QGVAR(inCardiacArrest),false]) exitWith {}; -_unit setVariable [QGVAR(inCardiacArrest), true,true]; -_unit setVariable [QGVAR(heartRate), 0]; - -["ace_cardiacArrestEntered", [_unit]] call CBA_fnc_localEvent; - -[_unit, true] call FUNC(setUnconscious); -private _timeInCardiacArrest = 120 + round(random(600)); - -[{ - params ["_args", "_idPFH"]; - _args params ["_unit", "_startTime", "_timeInCardiacArrest"]; - - private _heartRate = _unit getVariable [QGVAR(heartRate), 80]; - if (_heartRate > 0 || !alive _unit) exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(inCardiacArrest), nil,true]; - }; - if (CBA_missionTime - _startTime >= _timeInCardiacArrest) exitWith { - [_idPFH] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(inCardiacArrest), nil,true]; - [_unit] call FUNC(setDead); - }; -}, 1, [_unit, CBA_missionTime, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf deleted file mode 100644 index ce15a0b548..0000000000 --- a/addons/medical/functions/fnc_setDead.sqf +++ /dev/null @@ -1,66 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Either kills a unit or puts the unit in a revivable state, depending on the settings. - * - * Arguments: - * 0: The unit that will be killed - * 1: Force Dead (ignore revive setting) (default: false) - * 1: Delay setDamage for a frame (default: false) - * - * Return Value: - * Did he died? - * - * Example: - * [bob, false, false] call ace_medical_fnc_setDead - * - * Public: yes - */ - -params ["_unit", ["_force", false], ["_delaySetDamage", false]]; - -if ((!alive _unit) || {_unit getVariable ["ACE_isDead", false]}) exitWith {true}; -if (!local _unit) exitwith { - [QGVAR(setDead), [_unit, _force], _unit] call CBA_fnc_targetEvent; - false; -}; - -private _reviveVal = _unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]; -if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == 2)) && !_force) exitwith { - if (_unit getVariable [QGVAR(inReviveState), false]) exitwith { - if (GVAR(amountOfReviveLives) > 0) then { - private _lifesLeft = _unit getVariable[QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; - if (_lifesLeft <= 0) then { - [_unit, true] call FUNC(setDead); - }; - }; - - false; - }; - - _unit setVariable [QGVAR(inReviveState), true, true]; - _unit setVariable [QGVAR(reviveStartTime), CBA_missionTime]; - [_unit, true] call FUNC(setUnconscious); - - // Run the loop that tracks the revive state - [_unit ] call FUNC(reviveStateLoop); - false; -}; - -_unit setVariable ["ACE_isDead", true, true]; -if (isPLayer _unit) then { - _unit setVariable ["isDeadPlayer", true, true]; -}; - -["ace_killed", [_unit]] call CBA_fnc_localEvent; - -//Delay a frame before killing the unit via scripted damage -//to avoid triggering the "Killed" Event twice (and having the wrong killer) - -if (!_delaySetDamage) then { - [_unit, 1] call FUNC(setStructuralDamage); -} else { - [FUNC(setStructuralDamage), [_unit, 1]] call CBA_fnc_execNextFrame; -}; - -true; diff --git a/addons/medical/functions/fnc_setHitPointDamage.sqf b/addons/medical/functions/fnc_setHitPointDamage.sqf deleted file mode 100644 index c68feb83c8..0000000000 --- a/addons/medical/functions/fnc_setHitPointDamage.sqf +++ /dev/null @@ -1,102 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * My very own setHitPointDamage since BIS' one is buggy when affecting a remote unit. - * It also doesn't change the overall damage. This does. - * - * Arguments: - * 0: Unit - * 1: HitPoint - * 2: Damage - * 3: Disable overall damage adjustment (default: false) - * - * Return Value: - * None - * - * Example: - * [medic, "Leg", 2, false] call ace_medical_fnc_setHitPointDamage - * - * Public: Yes - */ -#define LEGDAMAGETRESHOLD1 1 -#define LEGDAMAGETRESHOLD2 1.7 -#define ARMDAMAGETRESHOLD1 1 -#define ARMDAMAGETRESHOLD2 1.7 - -params ["_unit", "_selection", "_damage", ["_disabled", false]]; - -// Unit isn't local, give function to machine where it is. -if !(local _unit) exitWith { - [QGVAR(setHitPointDamage), _this, _unit] call CBA_fnc_targetEvent; -}; - -// Check if overall damage adjustment is disabled -if (_disabled) exitWith { - _unit setHitPointDamage [_selection, _damage]; -}; - -private _selections = [ - "HitHead", - "HitBody", - "HitLeftArm", - "HitRightArm", - "HitLeftLeg", - "HitRightLeg" -]; - -if !(_selection in _selections) exitWith { - _unit setHitPointDamage [_selection, _damage]; -}; - -private _damages = _selections apply {_unit getHitPointDamage _x}; - -private _damageOld = damage _unit; -private _damageSumOld = 0; -{ - _damageSumOld = _damageSumOld + _x; -} forEach _damages; -_damageSumOld = _damageSumOld max 0.001; - -_damages set [_selections find _selection, _damage]; - -private _damageSumNew = 0; -{ - _damageSumNew = _damageSumNew + _x; -} forEach _damages; - -private _damageNew = _damageSumNew / 6; -if (_damageOld > 0) then { - _damageNew = _damageOld * (_damageSumNew / _damageSumOld); -}; - -// prevent death -if (_damageNew >= 0.9) then { - _unit setDamage 0.9; - [_unit] call FUNC(setDead); -} else { - _unit setDamage _damageNew; -}; - -{ - private _damageFinal = (_damages select _forEachIndex); - _unit setHitPointDamage [_x, _damageFinal]; -} forEach _selections; - -// Leg Damage -private _legdamage = (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg"); -if (_legdamage >= LEGDAMAGETRESHOLD1) then { - if (_unit getHitPointDamage "HitLegs" != 1) then {_unit setHitPointDamage ["HitLegs", 1]}; -} else { - if (_unit getHitPointDamage "HitLegs" != 0) then {_unit setHitPointDamage ["HitLegs", 0]}; -}; -// @todo: force prone for completely fucked up legs. - - -// Arm Damage -private _armdamage = (_unit getHitPointDamage "HitLeftArm") + (_unit getHitPointDamage "HitRightArm"); -if (_armdamage >= ARMDAMAGETRESHOLD1) then { - if (_unit getHitPointDamage "HitHands" != 1) then {_unit setHitPointDamage ["HitHands", 1]}; -} else { - if (_unit getHitPointDamage "HitHands" != 0) then {_unit setHitPointDamage ["HitHands", 0]}; -}; -// @todo: Drop weapon for full damage. diff --git a/addons/medical/functions/fnc_setStructuralDamage.sqf b/addons/medical/functions/fnc_setStructuralDamage.sqf deleted file mode 100644 index 4f8c6e2613..0000000000 --- a/addons/medical/functions/fnc_setStructuralDamage.sqf +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Author: commy2 - * Set the structural damage of a soldier without changing the individual hitpoints. Unit has to be local. Not safe to use with vehicles! - * - * Arguments: - * 0: The unit - * - * Return Value: - * None - * - * Example: - * [bob] call ACE_medical_fnc_setStructuralDamage - * - * Public: no? - */ - -params ["_unit", "_damage"]; - -if (!local _unit) exitWith {}; - -private _allHitPoints = getAllHitPointsDamage _unit select 2; - -_unit setDamage _damage; - -{ - _unit setHitIndex [_forEachIndex, _x]; -} forEach _allHitPoints; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index c2e43e702d..618432a5fc 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -2,131 +2,73 @@ /* * Author: Glowbal * Sets a unit in the unconscious state. + * For Public Use * * Arguments: * 0: The unit that will be put in an unconscious state * 1: Set unconsciouns (default: true) - * 2: Minimum unconscious time (default: (round(random(10)+5))) - * 3: Force AI Unconscious (skip random death chance) (default: false) + * 2: Minimum unconscious time (set to 0 to ignore) (default: 0) + * 3: Force wakeup at given time if vitals are stable (default: false) * * Return Value: - * None + * Success? * * Example: * [bob, true] call ace_medical_fnc_setUnconscious; + * [player, true, 5, true] call ace_medical_fnc_setUnconscious; * * Public: yes */ -#define DEFAULT_DELAY (round(random(10)+5)) - // only run this after the settings are initialized if !(EGVAR(common,settingsInitFinished)) exitWith { EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(setUnconscious), _this]; }; -params ["_unit", ["_set", true], ["_minWaitingTime", DEFAULT_DELAY], ["_force", false]]; +params [["_unit", objNull, [objNull]], ["_knockOut", true, [false]], ["_minWaitingTime", 0, [0]], ["_forcedWakup", false, [false]]]; +TRACE_4("setUnconscious",_unit,_knockOut,_minWaitingTime,_forcedWakup); -// No change, fuck off. (why is there no xor?) -if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {}; - -if !(_set) exitWith { - _unit setVariable ["ACE_isUnconscious", false, true]; - if (_unit getVariable [QGVAR(inReviveState), false]) then { - _unit setVariable [QGVAR(inReviveState), nil, true]; - }; +if ((isNull _unit) || {!alive _unit} || {!(_unit isKindOf "CAManBase")}) exitWith { + ERROR_3("Bad Unit %1 [Type: %2] [Alive: %3]",_unit,typeOf _unit,alive _unit); + false }; -if !(!(isNull _unit) && {(_unit isKindOf "CAManBase") && ([_unit] call EFUNC(common,isAwake))}) exitWith{}; - if (!local _unit) exitWith { - [QGVAR(setUnconscious), [_unit, _set, _minWaitingTime, _force], _unit] call CBA_fnc_targetEvent; + [QEGVAR(medical,setUnconscious), _this, _unit] call CBA_fnc_targetEvent; + true }; -_unit setVariable ["ACE_isUnconscious", true, true]; - -if (_unit == ACE_player) then { - if (visibleMap) then {openMap false}; - while {dialog} do { - closeDialog 0; - }; +if (_knockOut isEqualTo IS_UNCONSCIOUS(_unit)) exitWith { + WARNING_2("setUnconscious called with no change [Unit %1] [State [%2]", _unit, _knockOut); + false }; -// if we have unconsciousness for AI disabled, we will kill the unit instead -private _isDead = false; -if (!([_unit, GVAR(remoteControlledAI)] call EFUNC(common,isPlayer)) && !_force) then { - private _enableUncon = _unit getVariable [QGVAR(enableUnconsciousnessAI), GVAR(enableUnconsciousnessAI)]; - if (_enableUncon == 0 or {_enableUncon == 1 and (random 1) < 0.5}) then { - [_unit, true] call FUNC(setDead); - _isDead = true; - }; -}; -if (_isDead) exitWith {}; - -// If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious, -// therefor we force it to select the primairy weapon before going unconscious -if ((vehicle _unit) isKindOf "StaticWeapon") then { - [_unit] call EFUNC(common,unloadPerson); -}; -if (animationState _unit in ["ladderriflestatic","laddercivilstatic"]) then { - _unit action ["ladderOff", (nearestBuilding _unit)]; -}; -if (vehicle _unit == _unit) then { - if (primaryWeapon _unit == "") then { - _unit addWeapon "ACE_FakePrimaryWeapon"; - }; - - if (currentWeapon _unit != primaryWeapon _unit) then { - _unit selectWeapon primaryWeapon _unit; - }; +if (currentWeapon _unit != primaryWeapon _unit) then { + _unit selectWeapon primaryWeapon _unit; }; -// We are storing the current animation, so we can use it later on when waking the unit up inside a vehicle -if (vehicle _unit != _unit) then { - _unit setVariable [QGVAR(vehicleAwakeAnim), [(vehicle _unit), (animationState _unit)]]; -}; - -//Save current stance: -private _originalPos = unitPos _unit; - -_unit setUnitPos "DOWN"; -[_unit, true] call EFUNC(common,disableAI); - -// So the AI does not get stuck, we are moving the unit to a temp group on its own. -//Unconscious units shouldn't be put in another group #527: -if (GVAR(moveUnitsFromGroupOnUnconscious)) then { - [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); -}; -// Delay Unconscious so the AI dont instant stop shooting on the unit #3121 -if (GVAR(delayUnconCaptive) == 0) then { - [_unit, "setHidden", "ace_unconscious", true] call EFUNC(common,statusEffect_set); -} else { - // when the Delay is so high that the unit can wake up and get uncon again we need to check if it is the correct wait that got executed - private _counter = _unit getVariable [QGVAR(unconsciousCounter), 0]; - _counter = _counter + 1; - _unit setVariable [QGVAR(unconsciousCounter), _counter]; - [{ - params ["_unit", "_counter"]; - if (_unit getVariable ["ACE_isUnconscious", false] && (_unit getVariable [QGVAR(unconsciousCounter), 0]) == _counter) then { - [_unit, "setHidden", "ace_unconscious", true] call EFUNC(common,statusEffect_set); +if (_knockOut) then { + if (_minWaitingTime > 0) then { + if (_forcedWakup) then { + // If unit still has stable vitals at min waiting time, then force wake up + [{ + params [["_unit", objNull]]; + if ((alive _unit) && {_unit call EFUNC(medical_status,hasStableVitals)}) then { + TRACE_1("Doing delay wakeup",_unit); + [QGVAR(WakeUp), _unit] call CBA_fnc_localEvent; + } else { + TRACE_1("Skipping delay wakeup",_unit); + }; + }, [_unit], _minWaitingTime] call CBA_fnc_waitAndExecute; }; - },[_unit, _counter], GVAR(delayUnconCaptive)] call CBA_fnc_waitAndExecute; + if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime + _minWaitingTime - SPONTANEOUS_WAKE_UP_INTERVAL]; + }; + }; + + [QGVAR(knockOut), _unit] call CBA_fnc_localEvent; +} else { + [QGVAR(WakeUp), _unit] call CBA_fnc_localEvent; }; -private _anim = [_unit] call EFUNC(common,getDeathAnim); -[_unit, _anim, 1, true] call EFUNC(common,doAnimation); -[{ - params ["_unit", "_anim"]; - if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { - [_unit, _anim, 2, true] call EFUNC(common,doAnimation); - }; -}, [_unit, _anim], 0.5, 0] call CBA_fnc_waitAndExecute; - -private _startingTime = CBA_missionTime; - -[DFUNC(unconsciousPFH), 0.1, [_unit, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; - -// unconscious can't talk -[_unit, "isUnconscious"] call EFUNC(common,muteUnit); - -["ace_unconscious", [_unit, true]] call CBA_fnc_globalEvent; +true diff --git a/addons/medical/functions/fnc_showBloodEffect.sqf b/addons/medical/functions/fnc_showBloodEffect.sqf deleted file mode 100644 index 47abf0536c..0000000000 --- a/addons/medical/functions/fnc_showBloodEffect.sqf +++ /dev/null @@ -1,162 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Does the blood screen effect, just like BIS_fnc_bloodeffect, but in non-sheduled environment. - * - * Arguments: - * 0: Effect multiplier - * - * Return Value: - * None - * - * Example: - * [2] call ace_medical_fnc_showBloodEffect - * - * Public: Yes - */ - -params ["_bloodRemaining"]; - -disableSerialization; - -// get already existing controls, or create them - -private _fxBloodControls = GETUVAR(GVAR(FXBloodControls),[]); - -private _bloodCtrl1 = controlNull; -private _bloodCtrl2 = controlNull; -private _bloodCtrl3 = controlNull; -if (count _fxBloodControls != 3) then { - _bloodCtrl1 = findDisplay 46 ctrlCreate ["RscPicture", -1]; - _bloodCtrl2 = findDisplay 46 ctrlCreate ["RscPicture", -1]; - _bloodCtrl3 = findDisplay 46 ctrlCreate ["RscPicture", -1]; - - // set their textures, screen position etc. - _bloodCtrl1 ctrlSetText "A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_lower_ca.paa"; - _bloodCtrl2 ctrlSetText "A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_middle_ca.paa"; - _bloodCtrl3 ctrlSetText "A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_upper_ca.paa"; - - // positions are from config - private _ctrlPosition = [ - ((0 * safezoneW) + safezoneX) + ((safezoneW - (2.125 * safezoneW * 3/4)) / 2), - (-0.0625 * safezoneH) + safezoneY, - 2.125 * safezoneW * 3/4, - 1.125 * safezoneH - ]; - - _bloodCtrl1 ctrlSetPosition _ctrlPosition; - _bloodCtrl2 ctrlSetPosition _ctrlPosition; - _bloodCtrl3 ctrlSetPosition _ctrlPosition; - - _fxBloodControls = [_bloodCtrl1, _bloodCtrl2, _bloodCtrl3]; - SETUVAR(GVAR(FXBloodControls),_fxBloodControls); -} else { - _bloodCtrl1 = _fxBloodControls select 0; - _bloodCtrl2 = _fxBloodControls select 1; - _bloodCtrl3 = _fxBloodControls select 2; -}; - -// reset everything -_bloodCtrl1 ctrlSetFade 1; -_bloodCtrl2 ctrlSetFade 1; -_bloodCtrl3 ctrlSetFade 1; - -_bloodCtrl1 ctrlCommit 0; -_bloodCtrl2 ctrlCommit 0; -_bloodCtrl3 ctrlCommit 0; - -if (_bloodRemaining < 5) exitWith { - // nothing -}; - -if (_bloodRemaining < 25) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl1 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; -}; - -if (_bloodRemaining < 40) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl2 ctrlSetFade 0.85; - _bloodCtrl1 ctrlCommit 0.2; - _bloodCtrl2 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 1) ctrlCommit 1; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 1.2] call CBA_fnc_waitAndExecute; -}; - -if (_bloodRemaining < 55) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl2 ctrlSetFade 0.7; - _bloodCtrl1 ctrlCommit 0.2; - _bloodCtrl2 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 2) ctrlSetFade 1; - (_this select 1) ctrlCommit 1; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 1.2] call CBA_fnc_waitAndExecute; -}; - -if (_bloodRemaining < 70) exitWith { - _bloodCtrl1 ctrlSetFade 0.2; - _bloodCtrl2 ctrlSetFade 0.7; - _bloodCtrl3 ctrlSetFade 0.85; - _bloodCtrl1 ctrlCommit 0.2; - _bloodCtrl2 ctrlCommit 0.2; - _bloodCtrl3 ctrlCommit 0.2; - - [{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 2) ctrlSetFade 1; - (_this select 2) ctrlCommit 1.5; - }, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 1) ctrlCommit 1; - }, _fxBloodControls, 1.7] call CBA_fnc_waitAndExecute; - - [{ - (_this select 0) ctrlCommit 0.8; - }, _fxBloodControls, 2.2] call CBA_fnc_waitAndExecute; -}; - -//default -_bloodCtrl1 ctrlSetFade 0.2; -_bloodCtrl2 ctrlSetFade 0.7; -_bloodCtrl3 ctrlSetFade 0.7; -_bloodCtrl1 ctrlCommit 0.2; -_bloodCtrl2 ctrlCommit 0.2; -_bloodCtrl3 ctrlCommit 0.2; - -[{ - (_this select 0) ctrlSetFade 1; - (_this select 1) ctrlSetFade 1; - (_this select 2) ctrlSetFade 1; - (_this select 2) ctrlCommit 1.5; -}, _fxBloodControls, 0.7] call CBA_fnc_waitAndExecute; - -[{ - (_this select 1) ctrlCommit 1; -}, _fxBloodControls, 1.7] call CBA_fnc_waitAndExecute; - -[{ - (_this select 0) ctrlCommit 0.8; -}, _fxBloodControls, 2.2] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_translateSelections.sqf b/addons/medical/functions/fnc_translateSelections.sqf deleted file mode 100644 index 3990429e91..0000000000 --- a/addons/medical/functions/fnc_translateSelections.sqf +++ /dev/null @@ -1,96 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Translate selection names into medical usable hit selection names. - * Aims to deal with the new hitpoint system introduced in Arma3 v1.50 and later. - * - * Arguments: - * 0: Unit - * 1: selection name - * 2: HitPoint Index/True to get hitpoint - * - * Return Value: - * translated selection/hitpoint name - * - * Example: - * [bob, "pelvis", 4] call ace_medical_fnc_translateSelections - * Returns "body" - * - * [bob, "body", true] call ace_medical_fnc_translateSelections - * Returns "HitBody" - * - * Public: No - */ - -#define HEAD_SELECTIONS ["face_hub", "neck", "head"] -#define HEAD_HITPOINTS ["hitface", "hitneck", "hithead"] -#define TORSO_SELECTIONS ["pelvis", "spine1", "spine2", "spine3", "body"] -#define TORSO_HITPOINTS ["hitpelvis", "hitabdomen", "hitdiaphragm", "hitchest", "hitbody"] -#define L_ARM_SELECTIONS ["hand_l"] -#define L_ARM_HITPOINTS ["hitleftarm", "hand_l"] -#define R_ARM_SELECTIONS ["hand_r"] -#define R_ARM_HITPOINTS ["hitrightarm", "hand_r"] -#define L_LEG_SELECTIONS ["leg_l"] -#define L_LEG_HITPOINTS ["hitleftleg", "leg_l"] -#define R_LEG_SELECTIONS ["leg_r"] -#define R_LEG_HITPOINTS ["hitrightleg", "leg_r"] - -params ["_unit", "_selection", "_hitPointIndex"]; - -if (_selection == "") exitWith {""}; - -//Get Selection from standard selection ["head","body","hand_l","hand_r","leg_l","leg_r"] -if (_hitPointIndex isEqualTo true) exitWith { - private _returnHitPoint = GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selection); - //If the selection is a valid hitpoint just return it: - if (!isNil {_unit getHitPointDamage _returnHitPoint}) exitWith { - _returnHitPoint; - }; - - //Those VR fuckers have weird limb hitpoints - private _hitPoints = switch (_selection) do { - case ("hand_l"): {L_ARM_HITPOINTS}; - case ("hand_r"): {R_ARM_HITPOINTS}; - case ("leg_l"): {L_LEG_HITPOINTS}; - case ("leg_r"): {R_LEG_HITPOINTS}; - case ("head"): {HEAD_HITPOINTS}; - case ("body"): {TORSO_HITPOINTS}; - default {[]}; - }; - { - if (!isNil {_unit getHitPointDamage _x}) exitWith { - _returnHitPoint = _x; - }; - } forEach _hitPoints; - _returnHitPoint -}; - - -//Get Selection from Selection/HitIndex: - -if (_selection in HEAD_SELECTIONS) exitWith {"head"}; -if (_selection in TORSO_SELECTIONS) exitWith {"body"}; - -// Not necessary unless we get more hitpoints variants in an next arma update -/*if (_selection in L_ARM_SELECTIONS) exitWith {"hand_l"}; -if (_selection in R_ARM_SELECTIONS) exitWith {"hand_r"}; -if (_selection in L_LEG_SELECTIONS) exitWith {"leg_l"}; -if (_selection in R_LEG_SELECTIONS) exitWith {"leg_r"};*/ - -//Backup method to detect weird selections/hitpoints -if ((_selection == "?") || {!(_selection in GVAR(SELECTIONS))}) exitWith { - if (_hitPointIndex < 0) exitWith {_selection}; - private _hitPoint = toLower configName ((configProperties [(configFile >> "CfgVehicles" >> (typeOf _unit) >> "HitPoints")]) select _hitPointIndex); - TRACE_4("Weird sel/hit", _unit, _selection, _hitPointIndex, _hitPoint); - - if (_hitPoint in HEAD_HITPOINTS) exitWith {"head"}; - if (_hitPoint in TORSO_HITPOINTS) exitWith {"body"}; - if (_hitPoint in L_ARM_HITPOINTS) exitWith {"hand_l"}; - if (_hitPoint in R_ARM_HITPOINTS) exitWith {"hand_r"}; - if (_hitPoint in L_LEG_HITPOINTS) exitWith {"leg_l"}; - if (_hitPoint in R_LEG_HITPOINTS) exitWith {"leg_r"}; - - _selection -}; - -_selection; diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf deleted file mode 100644 index 0ed4694c2f..0000000000 --- a/addons/medical/functions/fnc_treatment.sqf +++ /dev/null @@ -1,246 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, KoffeinFlummi - * Starts the treatment process - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "SelectionName","bandage"] call ace_medical_fnc_treatment - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className"]; - -// If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine -if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith { - [DFUNC(treatment), _this] call CBA_fnc_execNextFrame; -}; - -if !(_target isKindOf "CAManBase") exitWith {false}; - -private _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; - -if !(isClass _config) exitwith {false}; - -// Allow self treatment check -if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false}; - -private _medicRequired = if (isNumber (_config >> "requiredMedic")) then { - getNumber (_config >> "requiredMedic"); -} else { - // Check for required class - if (isText (_config >> "requiredMedic")) exitwith { - missionNamespace getVariable [(getText (_config >> "requiredMedic")), 0]; - }; - 0; -}; - -if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; - -private _allowedSelections = getArray (_config >> "allowedSelections"); -if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith {false}; - -// Check item -private _items = getArray (_config >> "items"); -if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; - -private _return = true; -if (isText (_config >> "Condition")) then { - private _condition = getText(_config >> "condition"); - if (_condition != "") then { - if (isnil _condition) then { - _condition = compile _condition; - } else { - _condition = missionNamespace getVariable _condition; - }; - if (_condition isEqualType false) then { - _return = _condition; - } else { - _return = [_caller, _target, _selectionName, _className] call _condition; - }; - }; -}; -if (!_return) exitwith {false}; - -private _patientStateCondition = if (isText(_config >> "patientStateCondition")) then { - missionNamespace getVariable [getText(_config >> "patientStateCondition"), 0] -} else { - getNumber(_config >> "patientStateCondition") -}; -if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; - -// Check allowed locations -private _locations = getArray (_config >> "treatmentLocations"); - -if ("All" in _locations) then { - _return = true; -} else { - private _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; - private _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isInMedicalVehicle))}; - - { - if (_x == "field") exitwith {_return = true;}; - if (_x == "MedicalFacility" && _medFacility) exitwith {_return = true;}; - if (_x == "MedicalVehicle" && _medVeh) exitwith {_return = true;}; - if !(isnil _x) exitwith { - private _val = missionNamespace getVariable _x; - if (_val isEqualType 0) then { - _return = switch (_val) do { - case 0: {true}; //AdvancedMedicalSettings_anywhere - case 1: {call _medVeh}; //AdvancedMedicalSettings_vehicle - case 2: {call _medFacility}; //AdvancedMedicalSettings_facility - case 3: {(call _medFacility) || {call _medVeh}}; //AdvancedMedicalSettings_vehicleAndFacility - default {false}; //Disabled - }; - }; - }; - } foreach _locations; -}; - -if !(_return) exitwith {false}; - -private _usersOfItems = []; -private _consumeItems = if (isNumber (_config >> "itemConsumed")) then { - getNumber (_config >> "itemConsumed"); -} else { - // Check for required class - if (isText (_config >> "itemConsumed")) exitwith { - missionNamespace getVariable [(getText (_config >> "itemConsumed")), 0]; - }; - 0; -}; -if (_consumeItems > 0) then { - _usersOfItems = ([_caller, _target, _items] call FUNC(useItems)) select 1; -}; - -// Parse the config for the progress callback -private _callbackProgress = getText (_config >> "callbackProgress"); -if (_callbackProgress == "") then { - _callbackProgress = "true"; -}; -if (isNil _callbackProgress) then { - _callbackProgress = compile _callbackProgress; -} else { - _callbackProgress = missionNamespace getVariable _callbackProgress; -}; - -// Patient Animation -private _patientAnim = getText (_config >> "animationPatient"); -if (_target getVariable ["ACE_isUnconscious", false] && GVAR(allowUnconsciousAnimationOnTreatment)) then { - if !(animationState _target in (getArray (_config >> "animationPatientUnconsciousExcludeOn"))) then { - _patientAnim = getText (_config >> "animationPatientUnconscious"); - }; -}; - -if (_caller != _target && {vehicle _target == _target} && {_patientAnim != ""}) then { - if (_target getVariable ["ACE_isUnconscious", false]) then { - [_target, _patientAnim, 2, true] call EFUNC(common,doAnimation); - } else { - [_target, _patientAnim, 1, true] call EFUNC(common,doAnimation); - }; -}; - -// Player Animation -private _callerAnim = [getText (_config >> "animationCaller"), getText (_config >> "animationCallerProne")] select (stance _caller == "PRONE"); -if (_caller == _target) then { - _callerAnim = [getText (_config >> "animationCallerSelf"), getText (_config >> "animationCallerSelfProne")] select (stance _caller == "PRONE"); -}; - -_caller setVariable [QGVAR(selectedWeaponOnTreatment), (weaponState _caller)]; - -// Cannot use secondairy weapon for animation -if (currentWeapon _caller == secondaryWeapon _caller) then { - _caller selectWeapon (primaryWeapon _caller); -}; - -private _wpn = ["non", "rfl", "pst"] select (1 + ([primaryWeapon _caller, handgunWeapon _caller] find (currentWeapon _caller))); -private _callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace; -if (vehicle _caller == _caller && {_callerAnim != ""}) then { - if (primaryWeapon _caller == "") then { - _caller addWeapon "ACE_FakePrimaryWeapon"; - }; - if (currentWeapon _caller == "") then { - _caller selectWeapon (primaryWeapon _caller); // unit always has a primary weapon here - }; - - if !(_caller call EFUNC(common,isSwimming)) then { - // Weapon on back also does not work underwater - if (isWeaponDeployed _caller) then { - TRACE_1("Weapon Deployed, breaking out first",(stance _caller)); - [_caller, "", 0] call EFUNC(common,doAnimation); - }; - - if ((stance _caller) == "STAND") then { - switch (_wpn) do {//If standing, end in a crouched animation based on their current weapon - case ("rfl"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWrflDnon"];}; - case ("pst"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWpstDnon"];}; - case ("non"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSnonWnonDnon"];}; - }; - } else { - _caller setVariable [QGVAR(treatmentPrevAnimCaller), animationState _caller]; - }; - [_caller, _callerAnim] call EFUNC(common,doAnimation); - }; -}; - -//Get treatment time -private _treatmentTime = if (isNumber (_config >> "treatmentTime")) then { - getNumber (_config >> "treatmentTime"); -} else { - if (isText (_config >> "treatmentTime")) exitwith { - private _treatmentTimeConfig = getText(_config >> "treatmentTime"); - if (isnil _treatmentTimeConfig) then { - _treatmentTimeConfig = compile _treatmentTimeConfig; - } else { - _treatmentTimeConfig = missionNamespace getVariable _treatmentTimeConfig; - }; - if (_treatmentTimeConfig isEqualType 0) exitwith { - _treatmentTimeConfig; - }; - [_caller, _target, _selectionName, _className] call _treatmentTimeConfig; - }; - 0; -}; - -// Start treatment -[ - _treatmentTime, - [_caller, _target, _selectionName, _className, _items, _usersOfItems], - DFUNC(treatment_success), - DFUNC(treatment_failure), - getText (_config >> "displayNameProgress"), - _callbackProgress, - ["isNotInside", "isNotSwimming"] -] call EFUNC(common,progressBar); - -// Display Icon -private _iconDisplayed = getText (_config >> "actionIconPath"); -if (_iconDisplayed != "") then { - [QGVAR(treatmentActionIcon), true, _iconDisplayed, [1,1,1,1], getNumber(_config >> "actionIconDisplayTime")] call EFUNC(common,displayIcon); -}; - -// handle display of text/hints -private _displayText = ""; -if (_target != _caller) then { - _displayText = getText(_config >> "displayTextOther"); -} else { - _displayText = getText(_config >> "displayTextSelf"); -}; - -if (_displayText != "") then { - [QEGVAR(common,displayTextStructured), [[_displayText, [_caller] call EFUNC(common,getName), [_target] call EFUNC(common,getName)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; -}; - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf deleted file mode 100644 index 5c673c080a..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Callback for the CPR treatment action on success. - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "selectionName", "bandage"] call ace_medical_fnc_treatmentAdvanced_CPR - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (alive _target && {(_target getVariable [QGVAR(inCardiacArrest), false] || _target getVariable [QGVAR(inReviveState), false])}) then { - [_target, "activity_view", LSTRING(Activity_cpr), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); - - if (local _target) then { - [QGVAR(treatmentAdvanced_CPRLocal), [_caller, _target]] call CBA_fnc_localEvent; - } else { - [QGVAR(treatmentAdvanced_CPRLocal), [_caller, _target], _target] call CBA_fnc_targetEvent; - }; -}; -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf deleted file mode 100644 index 9659ee7481..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * local Callback for the CPR treatment action on success. - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient] call ace_medical_fnc_treatmentAdvanced_CPRLocal - * - * Public: Yes - */ - -params ["_caller","_target"]; - -if (_target getVariable [QGVAR(inReviveState), false]) then { - private _reviveStartTime = _target getVariable [QGVAR(reviveStartTime),0]; - if (_reviveStartTime > 0) then { - _target setVariable [QGVAR(reviveStartTime), (_reviveStartTime + random(20)) min CBA_missionTime]; - }; -}; - -if (GVAR(level) > 1 && {(random 1) >= 0.6}) then { - _target setVariable [QGVAR(inCardiacArrest), nil,true]; - _target setVariable [QGVAR(heartRate), 40]; - _target setVariable [QGVAR(bloodPressure), [50,70]]; -}; - -[_target, "activity", LSTRING(Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf deleted file mode 100644 index 9cb4ac423b..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Item - * 5: specific Spot (default: -1) - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "Selectionname", "bandage", "bandage", -1] call ace_medical_fnc_treatmentAdvanced_bandage - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items", "", ["_specificSpot", -1]]; - -[_target, "activity", LSTRING(Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -if (local _target) then { - [QGVAR(treatmentAdvanced_bandageLocal), [_target, _className, _selectionName, _specificSpot]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentAdvanced_bandageLocal), [_target, _className, _selectionName, _specificSpot], _target] call CBA_fnc_targetEvent; -}; - -/* { - if (_x != "") then { - [_target, _x] call FUNC(addToTriageCard); - }; -}forEach _items;*/ - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf deleted file mode 100644 index ba94eb2d01..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ /dev/null @@ -1,187 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the bandage of a patient. - * - * Arguments: - * 0: The patient - * 1: Treatment classname - * - * - * Return Value: - * Succesful treatment started - * - * Example: - * [bob, "classname"] call ACE_medical_fnc_treatmentAdvanced_bandageLocal - * - * Public: No - */ - -params ["_target", "_bandage", "_selectionName", ["_specificClass", -1]]; - -// Ensure it is a valid bodypart -private _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part < 0) exitWith {false}; - -// Get the open wounds for this unit -private _openWounds = _target getVariable [QGVAR(openWounds), []]; -if (count _openWounds == 0) exitWith {false}; // nothing to do here! - -// Get the default effectiveness for the used bandage -private _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); -private _effectiveness = getNumber (_config >> "effectiveness"); -if (isClass (_config >> _bandage)) then { - _config = (_config >> _bandage); - if (isNumber (_config >> "effectiveness")) then { _effectiveness = getNumber (_config >> "effectiveness");}; -}; - -// Figure out which injury for this bodypart is the best choice to bandage -// TODO also use up the remainder on left over injuries -private _mostEffectiveSpot = 0; -private _effectivenessFound = -1; -private _mostEffectiveInjury = _openWounds select 0; -private _exit = false; -{ - _x params ["", "_classID", "_partX"]; - TRACE_2("OPENWOUND: ", _target, _x); - // Only parse injuries that are for the selected bodypart. - if (_partX == _part) then { - private _woundEffectiveness = _effectiveness; - - // Select the classname from the wound classname storage - private _className = GVAR(woundClassNames) select _classID; - - // Check if this wound type has attributes specified for the used bandage - if (isClass (_config >> _className)) then { - // Collect the effectiveness from the used bandage for this wound type - private _woundTreatmentConfig = (_config >> _className); - if (isNumber (_woundTreatmentConfig >> "effectiveness")) then { - _woundEffectiveness = getNumber (_woundTreatmentConfig >> "effectiveness"); - }; - } else { - //Basic medical bandage just has a base level config (same effectivenes for all wound types) - if (_bandage != "Bandage") then { - WARNING_2("No config for wound type [%1] config base [%2]", _className, _config); - }; - }; - - TRACE_2("Wound classes: ", _specificClass, _classID); - if (_specificClass == _classID) exitWith { - _effectivenessFound = _woundEffectiveness; - _mostEffectiveSpot = _forEachIndex; - _mostEffectiveInjury = _x; - _exit = true; - }; - - // Check if this is the currently most effective found. - if (_woundEffectiveness * ((_x select 4) * (_x select 3)) > _effectivenessFound * ((_mostEffectiveInjury select 4) * (_mostEffectiveInjury select 3))) then { - _effectivenessFound = _woundEffectiveness; - _mostEffectiveSpot = _forEachIndex; - _mostEffectiveInjury = _x; - }; - }; - if (_exit) exitWith {}; -} forEach _openWounds; - -if (_effectivenessFound == -1) exitWith {}; // Seems everything is patched up on this body part already.. - - -// TODO refactor this part -// Find the impact this bandage has and reduce the amount this injury is present -private _impact = if ((_mostEffectiveInjury select 3) >= _effectivenessFound) then {_effectivenessFound} else { (_mostEffectiveInjury select 3) }; -_mostEffectiveInjury set [ 3, ((_mostEffectiveInjury select 3) - _impact) max 0]; -_openWounds set [_mostEffectiveSpot, _mostEffectiveInjury]; - -_target setVariable [QGVAR(openWounds), _openWounds, true]; - -// Handle the reopening of bandaged wounds -if (_impact > 0 && {GVAR(level) >= 2} && {GVAR(enableAdvancedWounds)}) then { - [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); -}; - -// If all wounds to a body part have been bandaged, reset damage to that body part to zero -// so that the body part functions normally and blood is removed from the uniform. -// Arma combines left and right arms into a single body part (HitHands), same with left and right legs (HitLegs). -// Arms are actually hands. -if (GVAR(healHitPointAfterAdvBandage) || {GVAR(level) < 2}) then { - // Get the list of the wounds the target is currently suffering from. - private _currentWounds = _target getVariable [QGVAR(openWounds), []]; - - // Tally of unbandaged wounds to each body part. - private _headWounds = 0; - private _bodyWounds = 0; - private _leftArmWounds = 0; - private _leftLegWounds = 0; - private _rightArmWounds = 0; - private _rightLegWounds = 0; - - // Loop through all current wounds and add up the number of unbandaged wounds on each body part. - { - _x params ["", "", "_bodyPart", "_numOpenWounds", "_bloodLoss"]; - - // Use switch/case for early termination if wounded limb is found before all six are checked. - // Number of wounds multiplied by blood loss will return zero for a fully - // bandaged body part, not incrementing the wound counter; or it will return - // some other number which will increment the wound counter. - switch (_bodyPart) do { - // Head - case 0: { - _headWounds = _headWounds + (_numOpenWounds * _bloodLoss); - }; - - // Body - case 1: { - _bodyWounds = _bodyWounds + (_numOpenWounds * _bloodLoss); - }; - - // Left Arm - case 2: { - _leftArmWounds = _leftArmWounds + (_numOpenWounds * _bloodLoss); - }; - - // Right Arm - case 3: { - _rightArmWounds = _rightArmWounds + (_numOpenWounds * _bloodLoss); - }; - - // Left Leg - case 4: { - _leftLegWounds = _leftLegWounds + (_numOpenWounds * _bloodLoss); - }; - - // Right Leg - case 5: { - _rightLegWounds = _rightLegWounds + (_numOpenWounds * _bloodLoss); - }; - }; - } forEach _currentWounds; - - // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] - private _bodyStatus = _target getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - - // Any body part that has no wounds is healed to full health - if (_headWounds == 0) then { - _bodyStatus set [0, 0]; - }; - if (_bodyWounds == 0) then { - _bodyStatus set [1, 0]; - }; - if (_leftArmWounds == 0) then { - _bodyStatus set [2, 0]; - }; - if (_rightArmWounds == 0) then { - _bodyStatus set [3, 0]; - }; - if (_leftLegWounds == 0) then { - _bodyStatus set [4, 0]; - }; - if (_rightLegWounds == 0) then { - _bodyStatus set [5, 0]; - }; - - _target setVariable [QGVAR(bodyPartStatus), _bodyStatus, true]; - - [_target] call FUNC(handleDamage_advancedSetDamage); -}; - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf deleted file mode 100644 index d5c6427aa8..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * - * - * Arguments: - * 0: Caller - * 1: Target - * 2: SelectionName - * 3: ClassName - * 4: Item - * - * Return Value: - * Boolean - * - * Example: - * [bob, kevin, "selection", "classname", ] call ACE_medical_fnc_treatmentAdvanced_fullHeal - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (local _target) then { - [QGVAR(treatmentAdvanced_fullHealLocal), [_caller, _target]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentAdvanced_fullHealLocal), [_caller, _target], _target] call CBA_fnc_targetEvent; -}; - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf deleted file mode 100644 index d2435e0ee0..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf +++ /dev/null @@ -1,75 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * - * - * Arguments: - * 0: Caller - * 1: Target - * - * Return Value: - * Boolean - * - * Example: - * [bob, kevin] call ACE_medical_fnc_treatmentAdvanced_fullHealLocal - * - * Public: No - */ - -params ["_caller", "_target"]; - -if (alive _target) exitWith { - - _target setVariable [QGVAR(pain), 0, true]; - _target setVariable [QGVAR(morphine), 0, true]; - _target setVariable [QGVAR(bloodVolume), 100, true]; - - // tourniquets - _target setVariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; - - // wounds and injuries - _target setVariable [QGVAR(openWounds), [], true]; - _target setVariable [QGVAR(bandagedWounds), [], true]; - _target setVariable [QGVAR(internalWounds), [], true]; - - // vitals - _target setVariable [QGVAR(heartRate), 80]; - _target setVariable [QGVAR(heartRateAdjustments), []]; - _target setVariable [QGVAR(bloodPressure), [80, 120]]; - _target setVariable [QGVAR(peripheralResistance), 100]; - - // fractures - _target setVariable [QGVAR(fractures), []]; - - // IVs - _target setVariable [QGVAR(ivBags), nil, true]; - - // damage storage - _target setVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; - - // airway - _target setVariable [QGVAR(airwayStatus), 100, true]; - _target setVariable [QGVAR(airwayOccluded), false, true]; - _target setVariable [QGVAR(airwayCollapsed), false, true]; - - // generic medical admin - _target setVariable [QGVAR(inCardiacArrest), false, true]; - _target setVariable [QGVAR(inReviveState), false, true]; - _target setVariable ["ACE_isUnconscious", false, true]; - _target setVariable [QGVAR(hasLostBlood), 0, true]; - _target setVariable [QGVAR(isBleeding), false, true]; - _target setVariable [QGVAR(hasPain), false, true]; - _target setVariable [QGVAR(painSuppress), 0, true]; - - // medication - private _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; - { - _target setVariable [_x select 0, nil]; - } forEach _allUsedMedication; - - // Resetting damage - _target setDamage 0; - - [_target, "activity", LSTRING(Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); - [_target, "activity_view", LSTRING(Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message -}; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf deleted file mode 100644 index b48e2bb2da..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Items Used - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "selectionName", "bandage", 2] call ace_medical_fnc_treatmentAdvanced_medication - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; -TRACE_5("params",_caller,_target,_selectionName,_className,_items); - -private _part = [_selectionName] call FUNC(selectionNameToNumber); - -[QGVAR(treatmentAdvanced_medicationLocal), [_target, _className, _part], [_target]] call CBA_fnc_targetEvent; - -{ - if (_x != "") then { - [_target, _x] call FUNC(addToTriageCard); - [_target, "activity", LSTRING(Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); - [_target, "activity_view", LSTRING(Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); - }; -} forEach _items; - - -true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf deleted file mode 100644 index 4435ae4f48..0000000000 --- a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf +++ /dev/null @@ -1,100 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handles the medication given to a patient. - * - * Arguments: - * 0: The patient - * 1: Treatment classname - * 2: Injection Site Part Number - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, "bandage", 2] call ace_medical_fnc_treatmentAdvanced_medicationLocal - * - * Public: Yes - */ - -params ["_target", "_className", "_partNumber"]; -TRACE_3("params",_target,_className,_partNumber); - -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -if ((_tourniquets select _partNumber) > 0) exitWith { - TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets); - private _delayedMedications = _target getVariable [QGVAR(occludedMedications), []]; - _delayedMedications pushBack _this; - _target setVariable [QGVAR(occludedMedications), _delayedMedications, true]; - true -}; - -// We have added a new dose of this medication to our system, so let's increase it -private _varName = format[QGVAR(%1_inSystem), _className]; -private _currentInSystem = _target getVariable [_varName, 0]; -_target setVariable [_varName, _currentInSystem + 1]; - -// Find the proper attributes for the used medication -private _medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication"); -private _painReduce = getNumber (_medicationConfig >> "painReduce"); -private _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); -private _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); -private _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); -private _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); -private _maxDose = getNumber (_medicationConfig >> "maxDose"); -private _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); -private _hrCallback = getText (_medicationConfig >> "hrCallback"); - -private _inCompatableMedication = []; -if (isClass (_medicationConfig >> _className)) then { - _medicationConfig = (_medicationConfig >> _className); - if (isNumber (_medicationConfig >> "painReduce")) then { _painReduce = getNumber (_medicationConfig >> "painReduce");}; - if (isArray (_medicationConfig >> "hrIncreaseLow")) then { _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); }; - if (isArray (_medicationConfig >> "hrIncreaseNormal")) then { _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); }; - if (isArray (_medicationConfig >> "hrIncreaseHigh")) then { _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); }; - if (isNumber (_medicationConfig >> "timeInSystem")) then { _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); }; - if (isNumber (_medicationConfig >> "maxDose")) then { _maxDose = getNumber (_medicationConfig >> "maxDose"); }; - if (isArray (_medicationConfig >> "inCompatableMedication")) then { _inCompatableMedication = getArray (_medicationConfig >> "inCompatableMedication"); }; - if (isNumber (_medicationConfig >> "viscosityChange")) then { _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); }; - if (isText (_medicationConfig >> "hrCallback")) then { _hrCallback = getText (_medicationConfig >> "hrCallback"); }; -}; -if (isNil _hrCallback) then { - _hrCallback = compile _hrCallback; -} else { - _hrCallback = missionNamespace getVariable _hrCallback; -}; -if (!(_hrCallback isEqualType {})) then {_hrCallback = {TRACE_1("callback was NOT code",_hrCallback)};}; - -// Adjust the heart rate based upon config entry -private _heartRate = _target getVariable [QGVAR(heartRate), 70]; -if (alive _target) then { - if (_heartRate > 0) then { - if (_heartRate <= 45) then { - [_target, ((_hrIncreaseLow select 0) + random ((_hrIncreaseLow select 1) - (_hrIncreaseLow select 0))), (_hrIncreaseLow select 2), _hrCallback] call FUNC(addHeartRateAdjustment); - } else { - if (_heartRate > 120) then { - [_target, ((_hrIncreaseHigh select 0) + random ((_hrIncreaseHigh select 1) - (_hrIncreaseHigh select 0))), (_hrIncreaseHigh select 2), _hrCallback] call FUNC(addHeartRateAdjustment); - } else { - [_target, ((_hrIncreaseNorm select 0) + random ((_hrIncreaseNorm select 1) - (_hrIncreaseNorm select 0))), (_hrIncreaseNorm select 2), _hrCallback] call FUNC(addHeartRateAdjustment); - }; - }; - }; -}; - -if (_painReduce > 0) then { - // Reduce pain - private _painSuppress = _target getVariable [QGVAR(painSuppress), 0]; - _target setVariable [QGVAR(painSuppress), (_painSuppress + _painReduce) max 0]; - if (!GVAR(painIsOnlySuppressed)) then { - _pain = _target getVariable [QGVAR(pain), 0]; - _target setVariable [QGVAR(pain), (_pain - _painReduce) max 0, true]; - }; -}; - -private _resistance = _target getVariable [QGVAR(peripheralResistance), 100]; -_target setVariable [QGVAR(peripheralResistance), (_resistance + _viscosityChange) max 0]; - -// Call back to ensure that the medication is decreased over time -[_target, _classname, _varName, _maxDose, _timeInSystem, _inCompatableMedication, _viscosityChange, _painReduce] call FUNC(onMedicationUsage); - -true diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf deleted file mode 100644 index 297e5a5e43..0000000000 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Callback when the bloodbag treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Selection Name - * 3: Treatment classname - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentBasic_bloodbag - * - * Public: No - */ - -params ["_caller", "_target", "_treatmentClassname"]; - -if (local _target) then { - [QGVAR(treatmentBasic_bloodbagLocal), [_target, _treatmentClassname]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentBasic_bloodbagLocal), [_target, _treatmentClassname], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf deleted file mode 100644 index 91626095b5..0000000000 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Local callback when the bloodbag treatment is complete - * - * Arguments: - * 0: The patient - * 1: Treatment Classname - * - * Return Value: - * None - * - * Example: - * [bob, "classname"] call ACE_medical_fnc_treatmentBasic_bloodbagLocal - * - * Public: No - */ -#define BLOODBAGHEAL 70 - -params ["_target", "_treatmentClassname"]; - -private _bloodAdded = switch (true) do { - case (_treatmentClassname == "BloodIV_250"): {0.25 * BLOODBAGHEAL}; - case (_treatmentClassname == "BloodIV_500"): {0.5 * BLOODBAGHEAL}; - default {BLOODBAGHEAL}; -}; - -private _blood = ((_target getVariable [QGVAR(bloodVolume), 100]) + _bloodAdded) min 100; -_target setVariable [QGVAR(bloodVolume), _blood, true]; diff --git a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf b/addons/medical/functions/fnc_treatmentBasic_epipen.sqf deleted file mode 100644 index 4e67cfe697..0000000000 --- a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf +++ /dev/null @@ -1,23 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Callback when the epipen treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Selection Name - * 3: Treatment classname - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentBasic_epipen - * - * Public: No - */ - -params ["_caller", "_target","_className"]; - -[_target, false] call FUNC(setUnconscious); diff --git a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf b/addons/medical/functions/fnc_treatmentBasic_morphine.sqf deleted file mode 100644 index dbfbecab7f..0000000000 --- a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Callback when the morphine treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Selection Name - * 3: Treatment classname - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentBasic_morphine - * - * Public: No - */ -#define MORPHINEHEAL 0.4 - -params ["_caller", "_target"]; - -if (local _target) then { - [QGVAR(treatmentBasic_morphineLocal), [_target]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentBasic_morphineLocal), [_target], _target] call CBA_fnc_targetEvent; -}; diff --git a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf deleted file mode 100644 index 2a2c4358d5..0000000000 --- a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi - * Local callback when the morphine treatment is complete - * - * Arguments: - * 0: The medic - * 1: The patient - * - * Return Value: - * None - * - * Example: - * [bob, kevin] call ACE_medical_fnc_treatmentBasic_morphineLocal - * - * Public: No - */ -#define MORPHINEHEAL 0.4 - -params ["_target"]; - -// reduce pain, pain sensitivity -private _morphine = ((_target getVariable [QGVAR(morphine), 0]) + MORPHINEHEAL) min 1; -_target setVariable [QGVAR(morphine), _morphine, true]; - -private _pain = ((_target getVariable [QGVAR(pain), 0]) - MORPHINEHEAL) max 0; -_target setVariable [QGVAR(pain), _pain, true]; - -// @todo overdose diff --git a/addons/medical/functions/fnc_treatmentIV.sqf b/addons/medical/functions/fnc_treatmentIV.sqf deleted file mode 100644 index 8da7a3bcf6..0000000000 --- a/addons/medical/functions/fnc_treatmentIV.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Patient IV Treatment callback - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * Return Value: - * Succesful treatment started - * - * Example: - * [medic, patient, "SelectionName", "bandage"] call ace_medical_fnc_treatmentIV - * - * Public: Yes - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (_items isEqualTo []) exitWith {false}; - -_items params ["_removeItem"]; -if (local _target) then { - [QGVAR(treatmentIVLocal), [_target, _className]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentIVLocal), [_target, _className], _target] call CBA_fnc_targetEvent; -}; - -[_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", LSTRING(Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf deleted file mode 100644 index 1f59edbc35..0000000000 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * IV Treatment local callback - * - * Arguments: - * 0: The medic - * 1: Treatment classname - * - * - * Return Value: - * None - * - * Example: - * [medic, "Classname"] call ace_medical_fnc_treatmentIVLocal - * - * Public: Yes - */ - -params ["_target", "_treatmentClassname"]; - -private _bloodVolume = _target getVariable [QGVAR(bloodVolume), 100]; -if (_bloodVolume >= 100) exitWith {}; - -// Find the proper attributes for the used IV -private _config = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "IV"); -private _volumeAdded = getNumber (_config >> "volume"); -private _typeOf = getText (_config >> "type"); - -if (isClass (_config >> _treatmentClassname)) then { - _config = (_config >> _treatmentClassname); - if (isNumber (_config >> "volume")) then { _volumeAdded = getNumber (_config >> "volume");}; - if (isText (_config >> "type")) then { _typeOf = getText (_config >> "type"); }; -} else { - ERROR("IV Treatment Classname not found"); -}; - -private _bloodBags = _target getVariable [QGVAR(ivBags), []]; -_bloodBags pushBack [_volumeAdded]; // Future BagType: [_volumeAdded, _typeOf] -_target setVariable [QGVAR(ivBags), _bloodBags, true]; diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf deleted file mode 100644 index 23de5f177a..0000000000 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ /dev/null @@ -1,50 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Apply a tourniquet to the patient - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * - * - * Return Value: - * Succesful treatment started - * - * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_treatmentTourniquet - * - * Public: No - */ - -params ["_caller", "_target", "_selectionName", "_className", "_items"]; - -if (count _items == 0) exitWith {false}; - -private _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part == 0 || _part == 1) exitWith { - // [QEGVAR(common,displayTextStructured), ["You cannot apply a CAT on this body part!"], [_caller]] call CBA_fnc_targetEvent; - false; -}; - -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -if ((_tourniquets select _part) > 0) exitWith { - _output = "There is already a tourniquet on this body part!"; // TODO localization - [QEGVAR(common,displayTextStructured), [_output, 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; - false; -}; - -private _removeItem = _items select 0; -if (local _target) then { - [QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName]] call CBA_fnc_localEvent; -} else { - [QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName], _target] call CBA_fnc_targetEvent; -}; - -[_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", LSTRING(Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message - -true diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf deleted file mode 100644 index dc05d6ce5f..0000000000 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Apply a tourniquet to the patient, local callback. - * - * Arguments: - * 0: The patient - * 1: Item used classname - * - * Return Value: - * None - * - * Example: - * [bob, "classname"] call ACE_medical_fnc_treatmentTourniquetLocal - * - * Public: No - */ - -params ["_target", "_tourniquetItem", "_selectionName"]; - -//If we're not already tracking vitals, start: -[_target] call FUNC(addVitalLoop); - -private _part = [_selectionName] call FUNC(selectionNameToNumber); - -// Place a tourniquet on the bodypart -private _tourniquets = _target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; -_tourniquets set [_part, CBA_missionTime]; -_target setVariable [QGVAR(tourniquets), _tourniquets, true]; diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf deleted file mode 100644 index 02d3153271..0000000000 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ /dev/null @@ -1,74 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Callback when the treatment fails - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Items available > - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selectionname", "classname", ["bandage"]] call ACE_medical_fnc_treatment_failure - * - * Public: No - */ - -params ["_args"]; -_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"]; - -if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { - _caller removeWeapon "ACE_FakePrimaryWeapon"; -}; -if (vehicle _caller == _caller && {!(_caller call EFUNC(common,isSwimming))}) then { - private _lastAnim = _caller getVariable [QGVAR(treatmentPrevAnimCaller), ""]; - //Don't play another medic animation (when player is rapidily treating) - TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch (toLower _lastAnim) do { - case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; - }; - [_caller, _lastAnim, 2] call EFUNC(common,doAnimation); -}; -_caller setVariable [QGVAR(treatmentPrevAnimCaller), nil]; - -private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnTreatment), []]); -if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") && {_previousWeapon in (weapons _caller)}}) then { - for "_index" from 0 to 299 do { - _caller action ["SwitchWeapon", _caller, _caller, _index]; - //Just check weapon, muzzle and mode (ignore ammo in case they were reloading) - if (((weaponState _caller) select [0,3]) isEqualTo (_weaponSelect select [0,3])) exitWith {TRACE_1("Restoring", (weaponState _caller));}; - if ((weaponState _caller) isEqualTo ["","","","",0]) exitWith {ERROR("weaponState not found");}; - }; -} else { - _caller action ["SwitchWeapon", _caller, _caller, 299]; -}; - -{ - _x params ["_unit", "_item"]; - _unit addItem _item; -} forEach _usersOfItems; - -// Record specific callback -private _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; - -private _callback = getText (_config >> "callbackFailure"); -_callback = if (isNil _callback) then { - compile _callback -} else { - missionNamespace getVariable _callback -}; -if (!(_callback isEqualType {})) then {_callback = {TRACE_1("callback was NOT code",_callback)};}; - -_args call _callback; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf deleted file mode 100644 index 17c9de62ba..0000000000 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ /dev/null @@ -1,92 +0,0 @@ -#include "script_component.hpp" -/* - * Author: KoffeinFlummi, Glowbal - * Callback when the treatment is completed - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: SelectionName - * 3: Treatment classname - * 4: Items available > - * - * Return Value: - * None - * - * Example: - * [bob, kevin, "selectionname", "classname", ["bandage"]] call ACE_medical_fnc_treatment_success - * - * Public: No - */ - -params ["_args"]; -_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"]; - -if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { - _caller removeWeapon "ACE_FakePrimaryWeapon"; -}; -if (vehicle _caller == _caller && {!(_caller call EFUNC(common,isSwimming))}) then { - private _lastAnim = _caller getVariable [QGVAR(treatmentPrevAnimCaller), ""]; - //Don't play another medic animation (when player is rapidily treating) - TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch (toLower _lastAnim) do { - case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; - }; - [_caller, _lastAnim, 2] call EFUNC(common,doAnimation); -}; -_caller setVariable [QGVAR(treatmentPrevAnimCaller), nil]; - -private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnTreatment), []]); -if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") && {_previousWeapon in (weapons _caller)}}) then { - for "_index" from 0 to 299 do { - _caller action ["SwitchWeapon", _caller, _caller, _index]; - //Just check weapon, muzzle and mode (ignore ammo in case they were reloading) - if (((weaponState _caller) select [0,3]) isEqualTo (_weaponSelect select [0,3])) exitWith {TRACE_1("Restoring", (weaponState _caller));}; - if ((weaponState _caller) isEqualTo ["","","","",0]) exitWith {ERROR("weaponState not found");}; - }; -} else { - _caller action ["SwitchWeapon", _caller, _caller, 299]; -}; - -// Record specific callback -private _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; - -private _callback = getText (_config >> "callbackSuccess"); -if (isNil _callback) then { - _callback = compile _callback; -} else { - _callback = missionNamespace getVariable _callback; -}; -if (!(_callback isEqualType {})) then {_callback = {TRACE_1("callback was NOT code",_callback)};}; - -//Get current blood loose on limb (for "bloody" litter) -private _bloodLossOnSelection = 0; -private _partNumber = ([_selectionName] call FUNC(selectionNameToNumber)) max 0; - -// Add all bleeding from wounds on selection -private _openWounds = _target getvariable [QGVAR(openWounds), []]; -{ - _x params ["", "", "_selectionX", "_amountOf", "_percentageOpen"]; - if (_selectionX == _partNumber) then { - _bloodLossOnSelection = _bloodLossOnSelection + (_amountOf * _percentageOpen); - }; -} forEach _openWounds; -TRACE_1("advanced",_bloodLossOnSelection); - -_args call _callback; -_args pushBack _bloodLossOnSelection; -_args call FUNC(createLitter); - -//If we're not already tracking vitals, start: -if (!(_target getVariable [QGVAR(addedToUnitLoop),false])) then { - [_target] call FUNC(addVitalLoop); -}; - -["ace_treatmentSucceded", [_caller, _target, _selectionName, _className]] call CBA_fnc_localEvent; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf deleted file mode 100644 index 31f4d60d4b..0000000000 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ /dev/null @@ -1,151 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * PFH logic for unconscious state - * - * Arguments: - * 0: PFEH - - * 0: The unit that will be put in an unconscious state - * 1: unitPos (stance) - * 2: Starting Time - * 3: Minimum Waiting Time - * 4: Has Moved Out - * 5: Parachute Check - * 1: PFEH ID - * - * Return Value: - * None - * - * Example: - * [[unit,"pos", 5, 5, true, false], 5], "classname"] call ace_medical_fnc_unconsciousPFH - * - * Public: yes - */ - -params ["_args", "_idPFH"]; -_args params ["_unit", "_originalPos", "_startingTime", "_minWaitingTime", "_hasMovedOut", "_parachuteCheck"]; - -TRACE_6("ACE_DEBUG_Unconscious_PFH",_unit, _originalPos, _startingTime, _minWaitingTime, _hasMovedOut, _parachuteCheck); - -if (!alive _unit) exitWith { - if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { - TRACE_1("Removing fake weapon [on death]",_unit); - _unit removeWeapon "ACE_FakePrimaryWeapon"; - }; - if (GVAR(moveUnitsFromGroupOnUnconscious)) then { - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - }; - [_unit, "setHidden", "ace_unconscious", false] call EFUNC(common,statusEffect_set); - [_unit, false] call EFUNC(common,disableAI); - //_unit setUnitPos _originalPos; - - [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); - ["ace_unconscious", [_unit, false]] call CBA_fnc_globalEvent; - - TRACE_3("ACE_DEBUG_Unconscious_Exit",_unit, (!alive _unit) , "ace_unconscious"); - - [_idPFH] call CBA_fnc_removePerFrameHandler; -}; - -// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation -if !(_unit getVariable ["ACE_isUnconscious",false]) exitWith { - TRACE_7("ACE_DEBUG_Unconscious_PFH",_unit, _args, [_unit] call FUNC(isBeingCarried), [_unit] call FUNC(isBeingDragged), _idPFH, _unit getVariable QGVAR(unconsciousArguments),animationState _unit); - - //Unmute the unit before the carry check - _unit setVariable ["tf_voiceVolume", 1, true]; - _unit setVariable ["tf_unable_to_use_radio", false, true]; - _unit setVariable ["acre_sys_core_isDisabled", false, true]; - - // TODO, handle this with carry instead, so we can remove the PFH here. - // Wait until the unit isn't being carried anymore, so we won't end up with wierd animations - if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then { - if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { - TRACE_1("Removing fake weapon [on wakeup]",_unit); - _unit removeWeapon "ACE_FakePrimaryWeapon"; - }; - - if (vehicle _unit == _unit) then { - if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then { - [_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation); - [_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation); - } else { - [_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation); - }; - } else { - private _vehicle = vehicle _unit; - private _oldVehicleAnimation = _unit getVariable [QGVAR(vehicleAwakeAnim), []]; - private _awakeInVehicleAnimation = ""; - if (((count _oldVehicleAnimation) > 0) && {(_oldVehicleAnimation select 0) == _vehicle}) then { - _awakeInVehicleAnimation = _oldVehicleAnimation select 1; - }; - //Make sure we have a valid, non-terminal animation: - if ((_awakeInVehicleAnimation != "") && {(getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> _awakeInVehicleAnimation >> "terminal")) == 0}) then { - [_unit, _awakeInVehicleAnimation, 2] call EFUNC(common,doAnimation); - } else { - //Don't have a valid animation saved, reset the unit animation with a moveInXXX - TRACE_1("No Valid Animation, doing seat reset", _awakeInVehicleAnimation); - private _slotInfo = []; - {if ((_x select 0) == _unit) exitWith {_slotInfo = _x;};} forEach (fullCrew _vehicle); - if (_slotInfo isEqualTo []) exitWith {ERROR("No _slotInfo?");}; - //Move the unit out: - _unit setPosASL ((getPosASL _unit) vectorAdd [0,0,100]); - //Move the unit back into old seat: - if ((_slotInfo select 1) == "driver") then { - _unit moveInDriver _vehicle; - } else { - if ((_slotInfo select 1) == "cargo") then { - _unit moveInCargo [_vehicle, (_slotInfo select 2)]; - } else { - _unit moveInTurret [_vehicle, (_slotInfo select 3)]; - }; - }; - }; - }; - _unit setVariable [QGVAR(vehicleAwakeAnim), nil]; - - ["ace_unconscious", [_unit, false]] call CBA_fnc_globalEvent; - // EXIT PFH - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; - if (!_hasMovedOut) then { - // Reset the unit back to the previous captive state. - [_unit, "setHidden", "ace_unconscious", false] call EFUNC(common,statusEffect_set); - - // Swhich the unit back to its original group - //Unconscious units shouldn't be put in another group #527: - if (GVAR(moveUnitsFromGroupOnUnconscious)) then { - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - }; - [_unit, false] call EFUNC(common,disableAI); - _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) - - _unit setUnconscious false; - - [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); - - // ensure this statement runs only once - _args set [4, true]; - }; -}; - -if (_parachuteCheck) then { - if !(vehicle _unit isKindOf "ParachuteBase") then { - [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); - _args set [5, false]; - }; -}; - -if (!local _unit) exitWith { - TRACE_6("ACE_DEBUG_Unconscious_PFH",_unit, _args, _startingTime, _minWaitingTime, _idPFH, _unit getVariable QGVAR(unconsciousArguments)); - _args set [3, _minWaitingTime - (CBA_missionTime - _startingTime)]; - _unit setVariable [QGVAR(unconsciousArguments), _args, true]; - [_idPFH] call CBA_fnc_removePerFrameHandler; -}; - -// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs -if ((CBA_missionTime - _startingTime) >= _minWaitingTime) exitWith { - TRACE_2("ACE_DEBUG_Unconscious_Temp knock outs",_unit, [_unit] call FUNC(getUnconsciousCondition)); - if (!([_unit] call FUNC(getUnconsciousCondition))) then { - _unit setVariable ["ACE_isUnconscious", false, true]; - }; -}; diff --git a/addons/medical/functions/fnc_updateTourniquets.sqf b/addons/medical/functions/fnc_updateTourniquets.sqf deleted file mode 100644 index 3065ea4f07..0000000000 --- a/addons/medical/functions/fnc_updateTourniquets.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: diwako - * Update tourniquets on the body image on the menu. - * - * Arguments: - * 0: Display - * 1: Tourniquets - * - * Return Value: - * None - * - * Example: - * [some_display, [0,0,0,0,0,0]] call ace_medical_fnc_updateTourniquets - * - * Public: No - */ - -params ["_display", "_tourniquets"]; - -// Handle tourniquets -private _availableSelections = [0, 0, 56, 57, 58, 59]; -for "_i" from 2 to 5 do { - private _tourn = _tourniquets select _i; - (_display displayCtrl (_availableSelections select _i)) ctrlSetTextColor [0, 0, 0.8, _tourn]; -}; diff --git a/addons/medical/functions/fnc_useItem.sqf b/addons/medical/functions/fnc_useItem.sqf deleted file mode 100644 index 49efceac05..0000000000 --- a/addons/medical/functions/fnc_useItem.sqf +++ /dev/null @@ -1,60 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Use Equipment if any is available. Priority: 1) Medic, 2) Patient. If in vehicle: 3) Crew - * - * Arguments: - * 0: Medic - * 1: Patient - * 2: Item - * - * Return Value: - * 0: success - * 1: Unit - * - * Example: - * [unit, patient, "bandage"] call ace_repair_fnc_useItem - * - * Public: Yes - */ - -params ["_medic", "_patient", "_item"]; - -if (isNil QGVAR(setting_allowSharedEquipment)) then { - GVAR(setting_allowSharedEquipment) = true; -}; - -if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { - if (local _patient) then { - ["ace_useItem", [_patient, _item]] call CBA_fnc_localEvent; - } else { - ["ace_useItem", [_patient, _item], _patient] call CBA_fnc_targetEvent; - }; - [true, _patient]; -}; - -if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { - if (local _medic) then { - ["ace_useItem", [_medic, _item]] call CBA_fnc_localEvent; - } else { - ["ace_useItem", [_medic, _item], _medic] call CBA_fnc_targetEvent; - }; - [true, _medic]; -}; - -private _return = [false, objNull]; -if ([vehicle _medic] call FUNC(isMedicalVehicle) && {vehicle _medic != _medic}) then { - private _crew = crew vehicle _medic; - { - if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitWith { - _return = [true, _x]; - if (local _x) then { - ["ace_useItem", [_x, _item]] call CBA_fnc_localEvent; - } else { - ["ace_useItem", [_x, _item], _x] call CBA_fnc_targetEvent; - }; - }; - } forEach _crew; -}; - -_return diff --git a/addons/medical/functions/fnc_vitalLoop.sqf b/addons/medical/functions/fnc_vitalLoop.sqf deleted file mode 100644 index 44cd1e4d17..0000000000 --- a/addons/medical/functions/fnc_vitalLoop.sqf +++ /dev/null @@ -1,50 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, esteldunedain - * Vital loop for a unit. - * - * Arguments: - * 0: The Unit - * 1: Time of last computation - * - * Return Value: - * None - * - * Example: - * [bob, 5] call ACE_medical_fnc_vitalLoop - * - * Public: No - */ - -params ["_unit", "_lastTime"]; - -// If the unit died the loop is finished -if (!alive _unit) exitWith {}; - -// If locality changed, broadcast the last medical state and finish the local loop -if (!local _unit) exitWith { - if (GVAR(level) >= 2) then { - _unit setVariable [QGVAR(heartRate), _unit getVariable [QGVAR(heartRate), 80], true]; - _unit setVariable [QGVAR(bloodPressure), _unit getVariable [QGVAR(bloodPressure), [80, 120]], true]; - }; - _unit setVariable [QGVAR(bloodVolume), _unit getVariable [QGVAR(bloodVolume), 100], true]; -}; - -// Handle unit vitals -[_unit, CBA_missionTime - _lastTime] call FUNC(handleUnitVitals); - -// Play injured sounds -private _pain = _unit getVariable [QGVAR(pain), 0]; -if (_pain > (_unit getVariable [QGVAR(painSuppress), 0])) then { - // This introduces wierd unconscious behaviour for basic medical and possibly also advanced. - // TODO This is disabled as it's considered non critical code. - // We will need to decide if we want unconscious triggered on high pain levels or if we can get rid of this entirely. - /*if (_pain > 0.7 && {random(1) > 0.6}) then { - [_unit] call FUNC(setUnconscious); - };*/ - - [_unit, _pain] call FUNC(playInjuredSound); -}; - -// Schedule the loop to be executed again 1 sec later -[DFUNC(vitalLoop), [_unit, CBA_missionTime], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/script_component.hpp b/addons/medical/functions/script_component.hpp index 140463d68d..ea579c04a5 100644 --- a/addons/medical/functions/script_component.hpp +++ b/addons/medical/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\medical\script_component.hpp" +#include "\z\ace\addons\medical\script_component.hpp" \ No newline at end of file diff --git a/addons/medical/initSettings.sqf b/addons/medical/initSettings.sqf new file mode 100644 index 0000000000..0ae2c0e9f1 --- /dev/null +++ b/addons/medical/initSettings.sqf @@ -0,0 +1,14 @@ +// CBA Settings [ADDON: ace_medical]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), "?"]; + +// todo: Check the description is still accurate +[ + QGVAR(spontaneousWakeUpChance), "SLIDER", + [LSTRING(MedicalSettings_spontaneousWakeUpChance_DisplayName), LSTRING(MedicalSettings_spontaneousWakeUpChance_Description)], + _categoryArray, + [0,1,0.05,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(spontaneousWakeUpChance), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index 5735f940f4..d29a19b332 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT medical -#define COMPONENT_BEAUTIFIED Medical +#define COMPONENT_BEAUTIFIED Medical Core #include "\z\ace\addons\main\script_mod.hpp" // #define DEBUG_MODE_FULL @@ -15,5 +15,4 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" - -#define USE_WOUND_EVENT_SYNC false +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 5979939451..081e000d92 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,3784 +1,6 @@ - - INJURIES - VERLETZUNGEN - FERITE - ТРАВМЫ - BLESSURES - OBRAŻENIA - HERIDAS - SÉRÜLÉSEK - ZRANĚNÍ - FERIMENTOS - 負傷 - 부상 - 受伤 - 受傷 - - - No injuries on this bodypart... - Körperteil nicht verletzt... - Non ci sono ferite in questa parte del corpo... - Данная часть тела не повреждена... - Aucune blessure ici... - Brak obrażeń na tej części ciała... - Sin heridas en esta parte del cuerpo... - Ezen a testrészen nincs sérülés... - Žádné zranění na této části těla... - Nenhum ferimento nesta parte do corpo... - この部分に怪我はしていません・・・ - 이 부위에는 부상이 없습니다... - 此身体部位没有受伤 - 此身體部位沒有受傷 - - - Litter Simulation Detail - Detale zużytych medykamentów - Detalle de simulación de basura - Количество мусора от медицины - Dettagli Simulazione Rifiuti - Niveau de simulation des détritus - Abfall-Detaillevel - Hulladékszimuláció részletessége - Detalhe da simulação de sujeira - Počet zobrazených předmětů po použití zdravotnického materiálu - 医療廃棄物シミュレーション詳細度 - 의료폐기물 재현 상세도 - 模拟医疗废弃物细节 - 醫療廢棄物模擬細節 - - - Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. - Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. - Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. - Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента. - Il numero di rifiuti che verranno creati localmente. La creazione di troppi rifiuti in aree locali potrebbe causare lag e calo di FPS. Questo è un settaggio lato client. - Le niveau de simulation des détritus règle la quantité de déchets qui vont être créés localement chez le client. Des quantitées excessive chez certains clients peuvent causer des chutes de FPS, c'est donc une option client uniquement. - Die Einstellung für das Abfall-Detaillevel stellt die Menge des lokal angezeigten medizinischen Abfalls ein. Zuviel Abfall kann FPS-Einbrüche erzeugen, weswegen diese Einstellung nur clientseitig ist. - A hulladékszimuláció részletessége megszabja a kliens által megjelenített hulladékobjektumok mennyiségét. Súlyos mennyiségek izolált területeken alacsony FPS-t okozhatnak, így ez egy kliensoldali beállítás. - O nível de detalhe de sujeira determina o número de itens que irão aparecer no cliente. Quantidades excessivas em áreas locais podem aumentar o lag do FPS, então esta é uma opção somente para o cliente. - Počet zobrazených předmětů po použití zdravotnického materiálu ovlivňuje počet objektů, které budou zobrazeny klientovi v místě použití zdravotnického materiálu. Vyšší množství objektů může způsobovat poklesy FPS a proto je toto nastavení čistě na klientovi. - 医療廃棄物シミュレーションは各クライアントでローカルに作成される、医療廃棄物の詳細度を決定できます。ローカルで多くのアイテムがあると FPS の低下を引き起こすため、クライアント側のみの設定です。 - 의료폐기물 재현 상세도의 경우 얼마나 많은 수의 폐기물이 클라이언트 주변에 생성되는지를 정합니다. 매우 많은 수의 지역은 프레임드랍을 유발할 수 있습니다, 고로 이는 클라이언트 전용 설정입니다. - 设定医疗废弃物的最大产生数量,过多的数量会降低FPS,因此这由用户端性能来设定。 - 設定醫療廢棄物的最大產生數量,過多的數量會導致畫面更新率延遲,因此這由用戶端來設定 - - - Inject Adenosine - Adenosin injizieren - Inyectar Adenosina - Wstrzyknij adenozynę - Adénosine - Inietta andenosina - Aplikovat adenosine - Injetar adenosina - Ввести аденозин - アデノシンを投与 - 아데노신 주사 - 注射腺苷 - 注射腺苷 - - - Inject Atropine - Atropin injizieren - Inyectar Atropina - Aplikovat atropin - Wstrzyknij atropinę - Atropine - Ввести атропин - Atropin beadása - Inietta atropina - Injetar atropina - アトロピンを投与 - 아트로핀 주사 - 注射阿托品 - 注射阿托品 - - - Inject Epinephrine - Epinephrine injizieren - Inyectar Epinefrina - Wstrzyknij adrenalinę - Aplikovat adrenalin - Épinéphrine - Ввести адреналин - Epinefrin beadása - Injetar epinefrina - Inietta adrenalina - アドレナリンを投与 - 에피네프린 주사 - 注射肾上腺素 - 注射腎上腺素 - - - Inject Morphine - Morphin injizieren - Inyectar Morfina - Wstrzyknij morfinę - Aplikovat morfin - Ввести морфин - Morphine - Morfium beadása - Injetar morfina - Inietta morfina - モルヒネを投与 - 모르핀 주사 - 注射吗啡 - 注射嗎啡 - - - Transfuse Blood - Bluttransfusion - Transfundir sangre - Przetocz krew - Transfúze krve - Перелить кровь - Transfuser (sang) - Infúzió (vér) - Transfundir sangue - Trasfusione di sangue - 輸血する - 혈액 수혈 - 输血液 - 輸血液 - - - Transfuse Plasma - Plasmatransfusion - Transfundir plasma - Transfúze plazmy - Przetocz osocze - Transfuser (plasma) - Перелить плазму - Infúzió (vérplazma) - Trasfusione di plasma - Transfundir plasma - 血しょうを投与 - 혈장 수혈 - 输血浆 - 輸血漿 - - - Transfuse Saline - Salzlösungstransfusion - Transfundir salino - Transfúze fyziologického roztoku - Przetocz sól fizjologiczną - Transfuser (saline) - Перелить физраствор - Infúzió (sós víz) - Trasfusione di soluzione salina - Transfundir soro - 生理食塩水を投与 - 생리식염수 수혈 - 注射生理食盐水 - 注射生理食鹽水 - - - Apply Tourniquet - Tourniquet anwenden - Aplicar torniquete - Aplikovat škrtidlo - Załóż stazę - Poser garrot - Наложить жгут - Applica laccio emostatico - Aplicar torniquete - Érszorító alkalmazása - 止血帯を巻く - 지혈대 적용 - 使用军用止血带 - 使用軍用止血帶 - - - Bandage - Verbinden - Venda - Bandażuj - Obvázat - Panser - Benda - Kötözés - Atadura - Перевязать - 包帯 - 붕대 - 绷带 - 繃帶 - - - Bandage Head - Kopf verbinden - Vendar la cabeza - Bandażuj głowę - Obvázat hlavu - Перевязать голову - Panser Tête - Fej kötözése - Atar cabeça - Benda la testa - 包帯を頭へ - 머리에 붕대감기 - 绷带包扎 头部 - 繃帶包紮 頭部 - - - Bandage Torso - Torso verbinden - Vendar el torso - Bandażuj tors - Obvázat hruď - Перевязать торс - Panser Torse - Testtörzs kötözése - Atar tronco - Benda il torso - 包帯を胴体へ - 몸통에 붕대감기 - 绷带包扎 身体 - 繃帶包紮 身體 - - - Bandage Left Arm - Linken Arm verbinden - Vendar el brazo izquierdo - Bandażuj lewe ramię - Obvázat levou ruku - Перевязать левую руку - Panser Bras Gauche - Bal kar kötözése - Atar braço esquerdo - Benda il braccio sinistro - 包帯を左腕に - 왼팔에 붕대감기 - 绷带包扎 左手 - 繃帶包紮 左手 - - - Bandage Right Arm - Rechten Arm verbinden - Vendar el brazo derecho - Bandażuj prawe ramię - Obvázat pravou ruku - Перевязать правую руку - Panser Bras Droit - Jobb kar kötözése - Atar braço direito - Benda il braccio destro - 包帯を右腕に - 오른팔에 붕대감기 - 绷带包扎 右手 - 繃帶包紮 右手 - - - Bandage Left Leg - Linkes Bein verbinden - Vendar la pierna izquierda - Bandażuj lewą nogę - Obvázat levou nohu - Перевязать левую ногу - Panser Jambe Gauche - Bal láb kötözése - Atar perna esquerda - Benda la gamba sinistra - 包帯を左足へ - 왼쪽 다리에 붕대감기 - 绷带包扎 左脚 - 繃帶包紮 左腳 - - - Bandage Right Leg - Rechtes Bein verbinden - Vendar la pierna derecha - Bandażuj prawą nogę - Obvázat pravou nohu - Перевязать правую ногу - Panser Jambe Droite - Jobb láb kötözése - Atar perna direita - Benda la gamba destra - 包帯を右足へ - 오른쪽 다리에 붕대감기 - 绷带包扎 右脚 - 繃帶包紮 右腳 - - - Injecting Morphine... - Morphin injizieren... - Inyectando Morfina... - Wstrzykiwanie morfiny... - Aplikuji morfin... - Введение морфина... - Injection (morphine)... - Morfium beadása... - Injetando morfina... - Inietto la morfina... - モルヒネを投与しています・・・ - 모르핀 주사중... - 吗啡注射中... - 嗎啡注射中... - - - Injecting Epinephrine... - Epinephrin injizieren... - Inyectando Epinefrina... - Wstrzykiwanie adrenaliny... - Aplikuji adrenalin... - Введение адреналина... - Injection (épinéphrine)... - Epinefrin beadása... - Injetando epinefrina... - Inietto l'adrenalina... - アドレナリンを投与しています・・・ - 에피네프린 주사중... - 肾上腺素注射中... - 腎上腺素注射中... - - - Injecting Adenosine... - Adenosin injizieren... - Inyectando Adenosina... - Wstrzykiwanie adenozyny... - Injection (adénosine)... - Inietto l'andenosina - Aplikuji adenosine... - Injetando adenosina... - Введение аденозина... - アドネシンを投与しています・・・ - 아데노신 주사중... - 腺苷注射中... - 腺苷注射中... - - - Injecting Atropine... - Atropin injizieren... - Inyectando Atropina... - Aplikuji atropin... - Wstrzykiwanie atropiny... - Injection (atropine)... - Введение атропина... - Atropin beadása... - Inietto l'atropina... - Injetando atropina - アトロピンを投与しています・・・ - 아트리핀 주사중... - 阿托品注射中 ... - 阿托品注射中 ... - - - Transfusing Blood... - Bluttransfusion... - Transfusión de sangre... - Przetaczanie krwi... - Probíhá transfúze krve... - Переливание крови... - Transfusion (sang)... - Infúzió vérrel... - Transfundindo sangue... - Effettuo la trasfusione di sangue... - 輸血しています・・・ - 혈액 수혈중... - 输血液中 ... - 輸血液中 ... - - - Transfusing Saline... - Salzlösungtransfusion... - Transfusión de salino... - Probíha transfúze fyziologického roztoku... - Przetaczanie soli fizjologicznej... - Transfusion (solution saline)... - Переливание физраствора... - Infúzió sós vizzel... - Effettuo la rasfusione di soluzione salina - Transfundindo soro... - 生理食塩水を投与しています・・・ - 생리식염수 수혈중... - 施打生理食盐水中 ... - 施打生理食鹽水中 ... - - - Transfusing Plasma... - Plasmatransfusion... - Transfusión de plasma... - Probíha transfúze plazmy... - Przetaczanie osocza... - Transfusion (plasma)... - Переливание плазмы... - Infúzió vérplazmával... - Effettuo la trasfusione di plasma... - Transfundindo plasma... - 血しょうを投与しています・・・ - 혈장 수혈중... - 输血浆中 ... - 輸血漿中 ... - - - Bandaging... - Verbinden... - Vendando... - Bandażowanie... - Obvazuji... - Pansement... - Sto bendando... - Bekötözés... - Atando... - Перевязывание... - 包帯を巻いています・・・ - 붕대감는중... - 绷带包扎中 ... - 繃帶包紮中 ... - - - Applying Tourniquet... - Setze Tourniquet an... - Aplicando torniquete... - Aplikuji škrtidlo... - Zakładanie stazy... - Pose du garrot... - Наложение жгута... - Érszorító felhelyezése... - Sto applicando il laccio emostatico... - Applicando torniquete - 止血帯を巻いています・・・ - 지혈대 적용중... - 使用军用止血带中 ... - 使用軍用止血帶中 ... - - - Medical - Lékařské - Médical - Sanitäter - Medico - Medyczne - Médico - Медик - Médico - Orvosi - 治療 - 치료 - 医疗 - 醫療 - - - Field Dressing - Wundverband - Compresa de campaña - Бинтовая повязка - Obinadlo - Bandaż jałowy - Pansement individuel - Zárókötszer - Bendaggio rapido - Curativo de campo - 緊急圧迫包帯 - 필드 드레싱 - 基础绷带 - 基礎繃帶 - - - Packing Bandage - Mullbinde - Vendaje compresivo - Компресионный пакет - Bandaż uciskowy - Nyomókötszer - Bendaggio compressivo - Bande extensible - Atadura de compressão - Obvaz Tlakový - 弾性包帯 - 거즈 붕대 - 包扎绷带 - 包紮繃帶 - - - Elastic Bandage - Elastischer Verband - Vendaje elástico - Давящая повязка - Obavaz Elastický - Bandaż elastyczny - Bande compressive - Rögzitő kötszer - Bendaggio elastico - Atadura elástica - 伸縮包帯 - 압박 붕대 - 弹性绷带 - 彈性繃帶 - - - QuikClot - QuikClot - QuikClot - QuikClot - Opatrunek QuikClot - QuikClot - Bandage hémostatique - QuikClot - QuikClot (polvere emostatica) - QuikClot (Agente homeostático) - クイッククロット - 퀵 클롯 - 止血粉 - 止血粉 - - - Check Pulse - Puls überprüfen - Comprobar pulso - Проверить пульс - Zkontrolovat puls - Sprawdź tętno - Prendre le pouls - Pulzus ellenőrzése - Controlla il polso - Checar pulso - 心拍数を計る - 맥박 확인 - 检查脉搏 - 檢查脈搏 - - - Check Blood Pressure - Blutdruck überprüfen - Comprobar presión arterial - Проверить давление - Zkontrolovat krevní tlak - Sprawdź ciśnienie krwi - Prendre la tension - Vérnyomás megmérése - Controlla pressionsa sanguigna - Chegar pressão sanguínea - 血圧を計る - 혈압 확인 - 检查血压 - 檢查血壓 - - - Triage Card - Triagekarte - Tarjeta de clasificación - Медкарта - Karta segregacyjna - Štítek - Fiche de triage - Orvosi lap - Triage Card - Cartão de triagem - トリアージ カード - 부상자 분류 카드 - 检伤分类卡 - 檢傷分類卡 - - - No entries on this triage card. - Keine Einträge auf der Triagekarte - Nessuna voce sulla Triage Card - Нет записей. - Fiche vide - Brak wpisów w tej karcie segregacyjnej. - Sin entradas en esta tarjeta de clasificación. - Ez az orvosi lap nem tartalmaz bejegyzést. - Žádné záznamy na tomto štítku - Nenhuma entrada neste cartão de triagem. - トリアージ カードには何もありません。 - 부상자 분류 카드에 쓰여있는것이 없습니다. - 此检伤分类卡上没有任何资料 - 此檢傷分類卡上沒有任何資料 - - - Tourniquet - Tourniquet - Torniquete - Жгут - Škrtidlo - Staza - Garrot - Érszorító - Laccio emostatico - Torniquete - 止血帯 - 지혈대 - 军用止血带 - 軍用止血帶 - - - Remove Tourniquet - Tourniquet entfernen - Quitar torniquete - Снять жгут - Sundat škrtidlo - Zdejmij stazę - Enlever garrot - Érszorító leszedése - Rimuovi laccio emostatico - Remover torniquete - 止血帯を外す - 지혈대 제거 - 移除军用止血带 - 移除軍用止血帶 - - - Diagnose - Diagnose - Diagnosi - Диагностика - Diagnostiquer - Diagnoza - Diagnosticar - Diagnosztizálás - Diagnóza - Diagnosticar - 診断する - 진단 - 诊断 - 診斷 - - - Diagnosing... - Diagnostizieren... - Diagnosi in corso... - Диагностика... - Diagnostic en cours - Diagnozowanie... - Diagnosticando... - Diagnózis folyamatban... - Diagnostika... - Diagnosticando... - 診断しています・・・ - 진단중... - 诊断中... - 診斷中... - - - CPR - HLW - RCP - Сердечно-лёгочная реанимация - RCP - RKO - RCP - Újraélesztés - CPR - SBV - 心肺蘇生 - 심폐소생술 - 心肺复苏术 - 心肺復甦術 - - - Performing CPR... - HLW durchführen... - Eseguendo RCP... - Сердечно-лёгочная реанимация... - RCP en cours - Przeprowadzanie RKO... - Realizando RCP... - Újraélesztés folyamatban... - Provádím CPR... - Realizando o SBV... - 心肺蘇生をしています・・・ - 심폐소생중... - 进行心肺复苏术中... - 進行心肺復甦術中... - - - Give Blood IV (1000ml) - Bluttransfusion IV (1000ml) - Dar Sangre IV (1000ml) - Перелить пакет крови (1000 мл) - Podaj krew IV (1000ml) - Sang en IV (1000ml) - Podat krev. transfúzi (1000ml) - Vér adása intravénásan (1000ml) - Effettua trasfusione sangue EV (1˙000ml) - Administrar sangue IV (1000ml) - 血液 IV (1000ml) を与える - IV 혈액 수혈 (1000ml) - 输血液 (1000ml) - 輸血液 (1000ml) - - - Give Blood IV (500ml) - Bluttransfusion IV (500ml) - Dar Sangre IV (500ml) - Перелить пакет крови (500 мл) - Podaj krew IV (500ml) - Sang en IV (500ml) - Podat krev. transfúzi (500ml) - Vér adása intravénásan (500ml) - Effettua trasfusione sangue EV (500ml) - Administrar sangue IV (500ml) - 血液 IV (500ml) を与える - IV 혈액 수혈 (500ml) - 输血液 (500ml) - 輸血液 (500ml) - - - Give Blood IV (250ml) - Bluttransfusion IV (250ml) - Dar Sangre IV (250ml) - Перелить пакет крови (250 мл) - Podaj krew IV (250ml) - Sang en IV (250ml) - Podat krev. transfúzi (250ml) - Vér adása intravénásan (250ml) - Effettua trasfusione sangue EV (250ml) - Administrar sangue IV (250ml) - 血液 IV (250ml) を与える - IV 혈액 수혈 (250ml) - 输血液 (250ml) - 輸血液 (250ml) - - - Give Plasma IV (1000ml) - Plasmatransfusion IV (1000ml) - Dar Plasma IV (1000ml) - Перелить пакет плазмы (1000 мл) - Podaj osocze IV (1000ml) - Plasma en IV (1000ml) - Podat plazmu (1000ml) - Vérplazma adása intravénásan (1000ml) - Effettua trasfusione plasma EV (1˙000ml) - Administrar plasma IV (1000ml) - 血しょう IV (1000ml) を与える - IV 혈장 수혈 (1000ml) - 输血浆 (1000ml) - 輸血漿 (1000ml) - - - Give Plasma IV (500ml) - Plasmatransfusion IV (500ml) - Dar Plasma IV (500ml) - Перелить пакет плазмы (500 мл) - Podaj osocze IV (500ml) - Plasma en IV (500ml) - Podat plazmu (500ml) - Vérplazma adása intravénásan (500ml) - Effettua trasfusione plasma EV (500ml) - Administrar plasma IV (500ml) - 血しょう IV (500ml) を与える - IV 혈장 수혈 (500ml) - 输血浆 (500ml) - 輸血漿 (500ml) - - - Give Plasma IV (250ml) - Plasmatransfusion IV (250ml) - Dar Plasma IV (250ml) - Перелить пакет плазмы (250 мл) - Podaj osocze IV (250ml) - Plasma en IV (250ml) - Podat plazmu (250ml) - Vérplazma adása intravénásan (250ml) - Effettua trasfusione plasma EV (250ml) - Administrar plasma IV (250ml) - 血しょう IV (250ml) をあたえる - IV 혈장 수혈 (250ml) - 输血浆 (250ml) - 輸血漿 (250ml) - - - Give Saline IV (1000ml) - Kochsalzlösung IV (1000ml) - Dar Salino IV (1000ml) - Перелить пакет физраствора (1000 мл) - Podaj sól fizjologiczną IV (1000ml) - Solution saline en IV (1000ml) - Podaz fyz. roztok (1000ml) - Sós víz adása intravénásan (1000ml) - Effettua trasfusione salina EV (1˙000ml) - Administrar soro IV (1000ml) - 生理食塩水 IV (1000ml) を与える - IV 생리식염수 수혈 (1000ml) - 注射生理食盐水 (1000ml) - 注射生理食鹽水 (1000ml) - - - Give Saline IV (500ml) - Kochsalzlösung IV (500ml) - Dar Salino IV (500ml) - Перелить пакет физраствора (500 мл) - Podaj sól fizjologiczną IV (500ml) - Solution saline en IV (500ml) - Podaz fyz. roztok (500ml) - Sós víz adása intravénásan (500ml) - Effettua trasfusione salina EV (500ml) - Administrar soro IV (500ml) - 生理食塩水 IV (500ml) をあたえる - IV 생리식염수 수혈 (500ml) - 注射生理食盐水 (500ml) - 注射生理食鹽水 (500ml) - - - Give Saline IV (250ml) - Kochsalzlösung IV (250ml) - Dar Salino IV (250ml) - Перелить пакет физраствора (250 мл) - Podaj sól fizjologiczną IV (250ml) - Solution saline en IV (250ml) - Podaz fyz. roztok (250ml) - Sós víz adása intravénásan (250ml) - Effettua trasfusione salina EV (250ml) - Administrar soro IV (250ml) - 生理食塩水 IV (250ml) を与える - IV 생리식염수 수혈 (250ml) - 注射生理食盐水 (250ml) - 注射生理食鹽水 (250ml) - - - Minor - Gering - Menor - Несрочная помощь - Normalny - Traitement en attente - Minimální - Enyhe - Minore - Leve - 保留群 - 경미 - 轻微 - 輕微 - - - Delayed - Retrasado - Срочная помощь - Opóźniony - Traitement urgent - Verzögert - Odložitelný - Késleltetett - Differito - Atrasado - 待機的治療群 - 늦어짐 - 延后 - 延後 - - - Immediate - Inmediato - Неотложная помощь - Natychmiastowy - Traitement immédiat - Sofort - Okamžitý - Azonnali - Immediata - Imediato - 再優先治療群 - 긴급 - 紧急 - 緊急 - - - Deceased - Fallecido - Труп - Nie żyje - Décédé - Verstorben - Mrtvý - Elhalálozott - Deceduto - Falecido - 死亡群 - 사망 - 死亡 - 死亡 - - - None - Ninguno - Отсутствует - Brak - Pas de fiche - Keine - Nic - Semmi - Nessuna - Nenhum - なし - 없음 - 未分类 - 未分類 - - - Normal breathing - Дыхание в норме - Respiración normal - Respiration normale - Normalny oddech - Normale Atmung - Dýchá normálně - Normális légzés - Respiro normale - Respiração normal - 通常の呼吸 - 정상 호흡 - 呼吸正常 - 呼吸正常 - - - No breathing - Keine Atmung - Дыхание отсутствует - No respira - Pas de respiration - Brak oddechu - Nedýchá - Nincs légzés - Mancanza di respiro - Não respira - 息をしていません - 호흡 불가 - 没有呼吸 - 沒有呼吸 - - - Difficult breathing - Дыхание затруднено - Dificultad para respirar - Difficulté respiratoire - Trudności z oddychaniem - Schwere Atmung - Dýchá s obtížemi - Nehéz légzés - Difficoltà a respirare - Dificuldade para respirar - 呼吸が苦しそうです - 호흡 곤란 - 呼吸困难 - 呼吸困難 - - - Almost no breathing - Beinahe keine Atmung - Дыхание очень слабое - Casi sin respiración - Respiration faible - Prawie brak oddechu - Skoro nedýchá - Alig van légzés - Respira a fatica - Quase não respira - ほとんど呼吸をしていません - 호흡이 없음 - 快要没呼吸 - 快要沒呼吸 - - - Bleeding - Blutet - Кровотечение - Sangrando - Saignement - Krwawienie zewnętrzne - Krvácí - Vérzik - Sanguinando - Sangrando - 出血しています - 출혈 - 流血中 - 流血中 - - - In pain - Hat Schmerzen - Испытывает боль - Con dolor - Douleur moyenne - W bólu - V bolestech - Fájdalom alatt - Con dolore - Com dor - 痛みがあります - 고통 - 疼痛中 - 疼痛中 - - - Lost a lot of Blood - Hat eine große Menge Blut verloren - Большая кровопотеря - Mucha sangre perdida - A perdu beaucoup de sang - Stracił dużo krwi - Ztratil hodně krve - Sok vért vesztett - Ha perso parecchio sangue - Perdeu muito sangue - 大量失血しています - 大量失血中 - 大量失血中 - 혈액 부족 - - - Tourniquet [CAT] - Tourniquet [CAT] - Жгут - Torniquete [CAT] - Garrot [CAT] - Staza [typ. CAT] - Škrtidlo [CAT] - Érszorító [CAT] - Laccio emostatico [CAT] - Torniquete [CAT] - 止血帯 [CAT] - 지혈대 [CAT] - 军用止血带 - 軍用止血帶 - - - Receiving IV [%1ml] - Erhalte IV [%1ml] - Recibiendo IV [%1ml] - Принимается переливание [%1 мл] - Otrzymywanie IV [pozostało %1ml] - Transfusion : [%1ml] - Přijímání transfúze [%1ml] - Infúzióra kötve [%1ml] - Ricevendo EV [%1ml] - Recebendo IV [%1ml] - IV で [%1ml] 投与されています - 接收静脉注射液中 [%1ml] - 接收靜脈注射液中 [%1ml] - IV처리 [%1ml] 수혈중 - - - Bandage (Basic) - Bandage (Einfach) - Повязка (обычная) - Vendaje (Básico) - Pansement adhésif - Bandaż (jałowy) - Obvaz (Standartní) - Kötszer (Általános) - Bendaggio (base) - Atadura (Básica) - 包帯 (緊急圧迫) - 붕대 (기본) - 基础绷带 - 基礎繃帶 - - - Used to cover a wound - Для перевязки ран - Utilizado para cubrir una herida - Utilisé pour couvrir une blessure - Używany w celu przykrycia i ochrony miejsca zranienia. Najczęściej stosowany bandaż na otarcia i draśnięcia. - Verwendet um Wunden abzudecken - Sebesülések befedésére alkalmas - Usato per coprire una ferita - Usado para cobrir um ferimento - Slouží k překrytí poranění - 傷口を覆います - 상처를 덮을때 씁니다 - 用于覆盖伤口 - 用於覆蓋傷口 - - - A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. - Ein Verband, der aus einem besonderen Material besteht um die Wunde zu schützen, nachdem die Blutung gestoppt wurde. - Повязка, накладываемая поверх раны после остановки кровотечения. - Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar. - Pansement utilisé pour couvrir une blessure lorsque le saignement a été stoppé. - Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. - Egy különleges anyagú kötszer sebek betakarására, amelyet a vérzés elállítása után helyeznek fel. - Una benda apposita, utilizzata per coprire una ferita, la quale viene applicata su di essa una volta fermata l'emorragia. - Um curativo, material específico usado para cobrir um ferimento assim que o sangramento é estancando. - Obvaz je vhodným způsobem upravený sterilní materiál, určený k překrytí rány, případně k fixaci poranění. - 緊急圧迫包帯は傷口を血液凝固剤でおおうようにできていて、つかうと出血の原因を取りさります。 - 드레싱, 출혈을 막고서 상처를 덮기위해 쓰는 물건입니다. - 用于覆盖伤口以防止出血,透过敷料的止血剂来让出血慢慢停止。 - 用於覆蓋傷口以防止出血,透過敷料的止血劑來讓出血慢慢停止 - - - Packing Bandage - Mullbinde - Тампонирующая повязка - Vendaje compresivo - Bande extensible - Bandaż (uciskowy) - Nyomókötszer - Bendaggio compressivo - Atadura de compressão - Obvaz (Tlakový) - 弾性包帯 - 거즈 붕대 - 包扎绷带 - 包紮繃帶 - - - Used to pack medium to large wounds and stem the bleeding - Wird verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen - Для тампонирования ран среднего и большого размера и остановки кровотечения. - Se utiliza para vendar heridas medianas o grandes y detener el sangrado - Utilisé pour couvrir des blessures moyennes et grandes, ralentit le saignement. - Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. Dobrze radzi sobie z tamowaniem ran płatowych oraz postrzałowych. - Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer - Usato su ferite medie o larghe per fermare emorragie. - Usado para atar ferimentos médios ou grandes e estancar sangramentos. - Používá se k zastavení středních až silnějších krvácení - 弾性包帯は粘着フィルム状で、普通から大きめなケガに使い止血します。 - 중형 또는 대형 상처를 채우고 출혈을 막기위해 쓰입니다 - 用于包扎中到大型伤口,并防止出血 - 用於包紮中到大型傷口,並防止出血 - - - A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. - Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжёлых сочетанных ранениях возможно тампонирование раны. - Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. - Bandage servant à recouvrir les blessures pour arrêter les hémoragies et faciliter la guérison. Recouvrir une blessure est optionnel dans le cas de blessures polytraumatiques. - Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. - Egy kötszerfajta, melyet a sebek nyomására használnak a vérzés elállítása és sebgyógyulás érdekében. A nyomókötés egy lehetőség nagyobb polytraumatikus sérülések esetén. - Un bendaggio usato per coprire la ferita, fermare il sanguinamento e facilitarne la guarigione. Questa tecnica è opzionale su ferite multiple. - Ein Verband, um die Wunde abzudecken und die Wundheilung zu fördern. Wunden abdecken ist eine Option bei größeren Polytraumen - Atadura usada para atar o ferimento, estancando o sangramento e facilitando a cicatrização. Atar feridas é uma opção em ferimentos de politrauma grandes. - Tlakový obvaz se skládá se ze sterilní krycí vrstvy, na kterou je přiložena silná vrstva savého materiálu stlačující cévu v ráně a která je přitlačována k ráně a připevněna obinadlem. Slouží k zastavení silnějších krvácení. - 包帯を使うと出血を防ぎ治療を促進させます。また大きめな多発性外傷に対しても使えます。 - 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 채우는것도 한 가지 방법입니다. - 用于包扎中到大型伤口,并防止出血,为在大型多处性伤口的选项之一! - 用於包紮中到大型傷口,並防止出血,為在大型多處性傷口的選項之一! - - - Bandage (Elastic) - Bandage (Elastisch) - Повязка (давящая) - Vendaje (Elástico) - Bande compressive - Bandaż (elastyczny) - Obvaz (Elastický) - Rögzító kötszer - Benda (elastica) - Atadura (Elástica) - 包帯 (伸縮) - 붕대 (압박) - 弹性绷带 - 彈性繃帶 - - - Bandage kit, Elastic - Elastische Binde (Kompressionsbinde) - Давящая повязка - Kit de vendaje (Elástico) - Bande compressive - Bandaż elastyczny służy do opatrywania ran ciętych oraz kłutych. Dobrze radzi sobie również ze zgniecieniami tkanek miękkich oraz rozerwaniami powierzchni skóry. - Rugalmas kötszercsomag, "rögzítő" - Kit di bendaggio, elastico - Kit de ataduras elásticas - Sada obvazů, Elastická - 包帯キット (伸縮) - 붕대, 압박 - 弹性绷带 - 彈性繃帶 - - - Allows an even compression and extra support to the injured area. - Ermöglicht eine gleichmäßige Kompression und zusätzliche Unterstützung für den verletzten Bereich. - Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку повреждённой области - Ce bandage peut être utilisé pour compresser la plaie afin de ralentir le saignement et assurer la tenue du bandage lors de mouvement. - Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. - Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada - Egyenletes nyomást és támogatást biztosít a sebesült felületnek. - Permette di comprimere e aiutare la zone ferita. - Esta atadura pode ser utilizada para comprimir o ferimento e diminuir o sangramento e garantir que não se abra em movimento. - Hodí se k fixačním účelům a to i v oblastech kloubů. - 負傷部分へ最大の対応と止血を続けられます。 - 부상 부위를 골고루 압박해주면서 동시에 고정시켜 줍니다. - 可对伤口持续压迫并固定以防止伤口情况变严重 - 可對傷口持續壓迫並固定以防止傷口情況變嚴重 - - - Tourniquet (CAT) - Tourniquet [CAT] - Жгут - Torniquete (CAT) - Garrot (CAT) - Staza (typ. CAT) - Škrtidlo (CAT) - Érszorító (CAT) - Laccio emostatico (CAT) - Torniquete (CAT) - 止血帯 (CAT) - 지혈대 [CAT] - 军用止血带 - 軍用止血帶 - - - Slows down blood loss when bleeding - Замедляет кровопотерю при кровотечении - Reduce la velocidad de pérdida de sangre - Ralentit l'hémorragie - Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. Nie może być noszony zbyt długo ze względu na narastający ból z kończyny. - Verringert den Blutverlust - Lelassítja a vérvesztést vérzés esetén - Rallenta la perdita di sangue in caso di sanguinamento - Reduz a velocidade da perda de sangue - Zpomaluje ztráty krve při krvácení - 出血している時に失血量を抑えます。 - 출혈 시 혈액손실을 늦춰줍니다 - 减缓失血的速度 - 減緩失血的速度 - - - A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. - Жгут используется для прижатия сосудов к костным выступам, которое приводит к остановке или значительному уменьшению кровотечения - Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre - Un dispositif permettant de compresser les artères et veines afin de ralentir l'hémorragie. - Opaska uciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym krwawieniem tętniczym lub żylnym. - Ein Hilfsmittel, das Druck auf Venen und Arterien ausübt und so den Blutfluss verringert. - Egy szűkítőeszköz, mely a vénás és artériás nyomás keringés helyi összenyomására szolgál, ezzel lelassítva vagy megállítva az adott területen a vérkeringést. Ez csökkenti a vérvesztés mértékét. - Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. - Aparelho que comprime as artérias e veias para diminuir a perda de sangue. - Zařízení používané ke stlačení venózního a arteriálního oběhu. V důsledku dochází ke zpomalení toku krve a tedy i snížení ztrát krve. - 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れを遅くし、失血を防ぎます。 - 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. - 用于压迫静脉与动脉的血液流动,达到减缓失血速度的目的。 - 用於壓迫靜脈與動脈的血液流動,達到減緩失血速度的目的 - - - Morphine autoinjector - Morphium-Autoinjektor - Морфин в пневмошприце - Morfina auto-inyectable - Auto-injecteur de morphine - Autostrzykawka z morfiną - Auto-morfin - Morfium autoinjektor - Autoiniettore di morfina - Auto-injetor de morfina - モルヒネ注射器 - 모르핀 자동주사기 - 吗啡自动注射器 - 嗎啡自動注射器 - - - Used to combat moderate to severe pain experiences - Wird verwendet um moderate bis starke Schmerzen zu lindern. - Для снятия средних и сильных болевых ощущений - Usado para combatir los estados dolorosos de moderados a severos - Utilisé pour réduire les douleurs modérées à sévères. - Morfina. Ma silne działanie przeciwbólowe. Powoduje spowolnienie tętna oraz rozrzedzenie krwi, zwiększając tym samym ciśnienie tętnicze krwi. Działa przez ok. 15 minut. - Mérsékelttől erős fájdalomig, ellene alkalmazandó termék - Usato per combattere il dolore. - Usado para combater dores moderadas e severas - Slouží k tlumení středně těžkých a těžkých bolestí - 戦闘が収まった時、痛みに対して使います。 - 심한 통증을 완화하는데 쓰입니다 - 减低中度至重度的疼痛感 - 減低中度至重度的疼痛感 - - - An analgesic used to combat moderate to severe pain experiences. - Обезболивающее для снятия средних и сильных болевых ощущений. - Analgésico usado para combatir los estados dolorosos de moderados a severos. - Un analgésique puissant servant à réduire les douleurs modérées à sévères. - Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. - Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln - Egy fájdalomcsillapító anyag, jellemzően mérsékelt vagy erős fájdalom esetén alkalmazandó. - Un analgesico usato per combattere il dolore. - Um analgésico usado para combater dores moderadas e fortes. - Analgetikum slouží k tlumení středně těžkých a těžkých bolestí - 戦闘が収まった時、モルヒネを痛みに対して使います。 - 심한 통증을 완화하기 위해 쓰이는 진통제입니다. - 止痛药的一种,用于减低中度至重度的疼痛感。 - 止痛藥的一種,用於減低中度至重度的疼痛感 - - - Adenosine autoinjector - Adenosin-Autoinjektor - Asenosina auto-inyectable - Autostrzykawka z adenozyną - Auto-injecteur d'adénosine - Autoiniettore di adenosina - Auto-adenosine - Auto-injetor de adenosina - Аденозин в пневмошприце - アデノシン注射器 - 아데노신 자동주사기 - 腺苷自动注射器 - 腺苷自動注射器 - - - Used to counter effects of Epinephrine - Wird verwendet um die Symptome von Epiniphrin zu lindern - Utilizada para contrarrestar los effectos de la Epinefrina - Adenozyna. Stosowana do zwalczania efektów działania adrenaliny. - Utilisé pour contrer les effets de l'épinéphrine - Usato per contrastare l'effetto dell'epinefrina - Slouží jako protiváha Adrenalinu - Usado para combater os efeitos da epinefrina - Используется для купирования эффектов адреналина - アドレナリンの反対の効果として使います。 - 에피네프린 대응책으로 쓰입니다 - 用来对付肾上腺素的影响 - 用來對付腎上腺素的影響 - - - A drug used to counter the effects of Epinephrine - Ein Medikament, das die Symptome von Epiniphrin bekämpft. - Medicamento usado para contrarrestar los efectos de la Epinefrina. - Organiczny związek chemiczny z grupy nukleozydów. Skuteczna w leczeniu częstoskurczu komorowego. Działa rozszerzająco na naczynia krwionośne. - Un composé utilisé pour contrer les effets de l'épinéphrine - Medicamento usato per contrastare l'effetto dell'epinefrina - Droga používaná k tlumení efektu Adrenalinu - Uma droga usada para combater os efeitos da epinefrina - Препарат используется для купирования эффектов адреналина - 使用するとアドレナリンと反対の効果が出ます。 - 에피네프린에 대응용으로 쓰이는 약품 - 一种药物用于减低肾上腺素的效果 - 一種藥物用於減低腎上腺素的效果 - - - Atropine autoinjector - Атропин в пневмошприце - Atropina auto-inyectable - Auto-injecteur d'atropine - Autostrzykawka AtroPen - Atropin-Autoinjektor - Auto-atropine - Atropin autoinjektor - Autoiniettore di atropina - Auto-injetor de atropina - アトロピン注射器 - 아트로핀 자동주사기 - 阿托品自动注射器 - 阿托品自動注射器 - - - Used in NBC scenarios - Применяется для защиты от ОМП - Usado en escenarios NBQ - Utilisé en cas d'attaque CBRN - Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. - Verwendet bei ABC-Kontamination - NBK helyzetek esetén használandó - Usato in situazioni con gas nervino. - Usado em casos de ataque QBRN - Používá se v přítomnosti nervových plynů - 核・生物・化学兵器による汚染環境下にて使います。 - 핵,생물,화학 상황에 쓰입니다 - 使用于核生化污染的情况 - 使用於核生化汙染的情況 - - - A drug used by the Military in NBC scenarios. - Препарат, используемый в войсках для защиты от оружия массового поражения. - Medicamento usado por militares en escenarios NBQ - Médicament utilisé par l'armée en cas d'attaque CBRN - Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC. - Ein Medikament, das vom Militär bei ABC-Kontamination verwendet wird. - Egy instabil alkaloid, NBK helyzetek esetén a katonai szervezetek veszik használatba. - E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. - Uma droga usada por militares em casos de ataque QBRN. - Atropin slouží jako protijed na otravu organofosfátovými insekticidy (diazinon) a nervovými plyny. - 核・生物・化学兵器による汚染環境下において使います。 - 핵,생물,화학 상황에 쓰이는 군용 약품 - 军用神经解毒针,用来应付核生化污染的情况。 - 軍用神經解毒針,用來應付核生化汙染的情況 - - - Epinephrine autoinjector - Адреналин в пневмошприце - Epinefrina auto-inyectable - Auto-injecteur d'épinéphrine - Autostrzykawka EpiPen - Epiniphrin-Autoinjektor - Auto-adrenalin - Epinefrin autoinjektor - Autoiniettore di adrenalina - Auto-injetor de epinefrina - アドレナリン注射器 - 에피네프린 자동주사기 - 肾上腺素自动注射器 - 腎上腺素自動注射器 - - - Increase heart rate and counter effects given by allergic reactions - Стимулирует работу сердца и купирует аллергические реакции - Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas - Augmente la fréquence cadiaque et annule les effets d'une réaction anaphylactique - Adrenalina. Przyśpiesza tętno oraz zwiększa ciśnienie krwi a także przeciwdziała efektom wywołanym przez reakcje alergiczne. - Steigert die Herzfrequenz und bekämpft Symptome von allergischen Reaktionen. - Növeli a szívverést és ellenzi az allergiás reakciók hatásait - Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. - Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas - Zvyšuje srdeční frekvenci a chrání před alergickými reakcemi - 心拍数を増加させたり、アレルギー反応を収める効果もあります。 - 심박수를 높이며 알러지반응의 대응책입니다 - 增加心跳速率的一种药物 - 增加心跳速率的一種藥物 - - - A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. - Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшенной вероятностью благоприятного исхода. - Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos. - Medicament qui fonctionne sur le système nerveux sympathique créant une dilatation des bronches, augmente la fréquence cardiaque et annule les effets d'une réaction allergique (anaphylaxie). Utilisé lors d'arrêt cardio-respiratoire pour augmenter les chances de retrouver un pouls. - EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. - Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. - Ein Medikament, das die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen (Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. - Uma droga que trabalha dilatando os brônquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas (anáfilaticas). Usado em casos de parada cardíaca com poucas chances de recuperação. - Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. - Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. - 薬は気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります(アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などに使われます。 - 기관지를 확장시키는 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과에 대응합니다(아나필락시스). 심폐가 정지하는 경우 호전이 되지않을때 사용합니다. - 俗称强心针,为一种支气管扩张药物,会增加心跳速率并减缓过敏反应(过敏性休克),在心跳骤停时有恢复心跳的效果! - 俗稱強心針,為一種支氣管擴張藥物,會增加心跳速率並減緩過敏反應(過敏性休克),在心跳驟停時有恢復心跳的效果! - - - Plasma IV (1000ml) - Плазма для в/в вливания (1000 мл) - Plasma IV (1000ml) - Plasma IV (1000ml) - Osocze IV (1000ml) - Plasma IV (1000ml) - Vérplazma-infúzió (1000ml) - Plasma EV (1000ml) - Plasma IV (1000ml) - Krevní plazma (1000ml) - 血しょう IV (1000ml) - 혈장 IV (250ml) - 血浆 (1000ml) - 血漿 (1000ml) - - - A volume-expanding blood supplement. - Дополнительный препарат, применяемый при возмещении объема крови. - Suplemento para expandir el volumen sanguíneo. - Supplément sanguin visant à remplacer les volumes perdus. - Składnik krwi, używany do zwiększenia jej objętości. - Egy térfogatnövelő vérkiegészítmény. - Aiuta ad aumentare il volume sanguigno. - Volumenerweiterungsmittel (künstliches Blutvolumen) - Suplemento para expandir o volume sanguíneo. - Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 - 혈액량을 늘리기위한 보조수단 입니다. - 可快速得到血液补充 - 可快速得到血液補充 - - - A volume-expanding blood supplement. - Дополнительный препарат, применяемый при возмещении объема крови. - Suplemento para expandir el volumen sanguíneo. - Supplément visant à remplacer le volume sanguin perdu et remplace les plaquettes. - Składnik krwi, używany do zwiększenia jej objętości. - Egy térfogatnövelő vérkiegészítmény. - Aiuta ad aumentare il volume sanguigno. - Volumenerweiterungsmittel (künstliches Blutvolumen) - Suplemento para expandir o volume sanguíneo. - Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 - 혈액량을 늘리기위한 보조수단 입니다. - 可快速得到血液补充 - 可快速得到血液補充 - - - Plasma IV (500ml) - Плазма для в/в вливания (500 мл) - Plasma IV (500ml) - Plasma IV (500ml) - Osocze IV (500ml) - Plasma IV (500ml) - Vérplazma-infúzió (500ml) - Plasma EV (500ml) - Plasma IV (500ml) - Krevní plazma (500ml) - 血しょう IV (500ml) - 혈장 IV (500ml) - 血浆 (500ml) - 血漿 (500ml) - - - Plasma IV (250ml) - Плазма для в/в вливания (250 мл) - Plasma IV (250ml) - Plasma (250ml) - Osocze IV (250ml) - Plasma IV (250ml) - Vérplazma-infúzió (250ml) - Plasma EV (250ml) - Plasma IV (250ml) - Krevní plazma (250ml) - 血しょう IV (250ml) - 혈장 IV (250ml) - 血浆 (250ml) - 血漿 (250ml) - - - Blood IV (1000ml) - Кровь для переливания (1000 мл) - Sangre IV (1000ml) - Culot sanguin IV (1000ml) - Krew IV (1000ml) - Blut IV (1000ml) - Vér-infúzió (1000ml) - Sangue EV (1000ml) - Sangue IV (1000ml) - Krevní transfúze (1000ml) - 血液 IV (1000ml) - 혈액 IV (1000ml) - 血液 (1000ml) - 血液 (1000ml) - - - Blood IV, for restoring a patients blood (keep cold) - Пакет крови для возмещения объёма потерянной крови (хранить в холодильнике) - Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) - Culot sanguin O-, utilisé seulement lors de perte sanguine majeure afin de remplacer le volume sanguin perdu. Habituellement utilisé lors du transport ou dans un établissement de soins. - Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych. - Vér-infúzió, intravénás bejuttatásra egy páciensnek (hidegen tárolandó) - Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue (conservare al fresco) - Blut IV, Bluthaushalt des Patienten wiederherstellen. (Kühl halten) - Sangue intravenoso, para restaurar o volume sanguíneo do paciente.(Manter frio) - Krevní transfuze pro doplnění pacientovi krve (skladujte v chladu) - 血液 IV は、患者へ血液を補給します。(要低温保存) - 혈액 IV, 환자에게 혈액을 공급합니다. (차갑게 할것) - 血液,用于补充伤者流失的血液 (需冷藏) - 血液,用於補充傷者流失的血液 (需冷藏) - - - O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. - Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. - Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. - Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. - Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. - Culot sanguin O- utilisé dans de rares et stricts cas pour compléter une perte de sang importante. Administré normalement lors d'un MEDEVAC. - O Negative Blutinfusion wird nur in seltenen Fällen verwendet, um den Bluthaushalt des Patienten zu ergänzen. Wird in der Regel wärend der Transportphase durchgeführt. - Sangue "O" de fator Rh negativo, utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento. - Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben. - 0 Rh negativní krev se používá v vzácných případech k doplnění pacientovy hladiny krve, obvykle při převozu zraněné osoby do nemocnice. - O 型への輸血はまれで厳格であり、通常は治療のための輸送段階で輸血をおこないます。 - O- 형 혈액 투여는 매우 엄격하고 드문 혈액보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. - O型负值注射用血液,在紧急情况时使用,用于补充伤者流失的血液。 - O型負值注射用血液,在緊急情況時使用,用於補充傷者流失的血液。 - - - Blood IV (500ml) - Кровь для переливания (500 мл) - Sangre IV (500ml) - Culot sanguin IV (500ml) - Krew IV (500ml) - Blut IV (500ml) - Vér-infúzió (500ml) - Sangue EV (500ml) - Sangue IV (500ml) - Krevní transfúze (500ml) - 血液 IV (500ml) - 혈액 IV (500ml) - 血液 (500ml) - 血液 (500ml) - - - Blood IV (250ml) - Кровь для переливания (250 мл) - Sangre IV (250ml) - Culot sanguin IV (250ml) - Krew IV (250ml) - Blut IV (250ml) - Vér-infúzió (250ml) - Sangue EV (250ml) - Sangue IV (250ml) - Krevní transfúze (250ml) - 血液 IV (250ml) - 혈액 IV (250ml) - 血液 (250ml) - 血液 (250ml) - - - Saline IV (1000ml) - Физраствор для в/в вливания (1000 мл) - Salino IV (1000ml) - Solution saline IV (1000ml) - Sól fizjologiczna IV (1000ml) - Kochsalzlösung (1000ml) - 0,9%-os sósvíz-infúzió (1000ml) - Soluzione salina EV (1˙000ml) - Soro IV (1000ml) - Fyziologický roztok (1000ml) - 生理食塩水 IV (1000ml) - 생리식염수 IV (1000ml) - 生理食盐水 (1000ml) - 生理食鹽水 (1000ml) - - - Saline IV, for restoring a patients blood - Пакет физраствора для возмещения объёма потерянной крови - Solución salina intravenosa, para restaurar el volumen sanguíneo - Solution saline, pour rétablir temporairement la tension artérielle - Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). - 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására - Soluzione salina, usata per ripristinare sangue nei pazienti. - Kochsalzlösung, ein medizinisches Volumenersatzmittel - Solução salina intravenosa, para restaurar o volume de sangue. - Fyziologický roztok se aplikuje intravenózně a slouží k obnově pacientovi krve - 生理食塩水 IV は、患者の血液量を補助します - 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 - 生理食盐水,用于恢复伤者血液 - 生理食鹽水,用於恢復傷者血液 - - - A medical volume-replenishing agent introduced into the blood system through an IV infusion. - Пакет физиологического раствора для возмещения объёма потерянной крови путем внутривенного вливания - Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. - Un remplacant temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse - Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). - Egy orvosi térfogat-helyreállító készítmény, melyet intravénás módon lehet a szervezetbe juttatni. - Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione EV. - Ein medizinisches Volumenersatzmittel, dass durch einen intravenösen Zugang in den Blutkreislauf verabreicht wird. - Uma reposição temporária para restaurar a pressão arterial perdida por perda de sangue. - Fyziologický roztok se využívá nejčastěji jako infuze při dehydrataci organismu. - 生理食塩水 IV を静脈へ投与し、血液量を増加させることができます。 - 혈류에 IV로 투여되는 의료 용적 대체 요법 - 利用静脉注射进入人体血液系统,帮助伤者血液恢复。 - 利用靜脈注射進入人體血液系統,幫助傷者血液恢復。 - - - Saline IV (500ml) - Физраствор для в/в вливания (500 мл) - Salino IV (500ml) - Solution saline IV (500ml) - Sól fizjologiczna IV (500ml) - Kochsalzlösung (500ml) - 0,9%-os sósvíz-infúzió (500ml) - Soluzione salina EV (500ml) - Soro IV (500ml) - Fyziologický roztok (500ml) - 生理食塩水 IV (500ml) - 생리식염수 IV (500ml) - 生理食盐水 (500ml) - 生理食鹽水 (500ml) - - - Saline IV (250ml) - Физраствор для в/в вливания (250 мл) - Salino IV (250ml) - Solution saline IV (250ml) - Sól fizjologiczna IV (250ml) - Kochsalzlösung (250ml) - 0,9%-os sósvíz-infúzió (250ml) - Soluzione salina EV (250ml) - Soro IV (250ml) - Fyziologický roztok (250ml) - 生理食塩水 IV (250ml) - 생리식염수 IV (250ml) - 生理食盐水 (250ml) - 生理食鹽水 (250ml) - - - Basic Field Dressing (QuikClot) - Первичный перевязочный пакет (QuikClot) - Vendaje básico (QuickClot) - Bandage basique (Hémostatique) - Opatrunek QuikClot ACS - Verbandpäckchen (QuikClot) - Általános zárókötszer (QuikClot) - Bendaggio emostatico (QuikClot) - Atadura básica (Coagulante) - Hemostatický obvaz (QuikClot) - 緊急圧迫止血包帯 (クイッククロット) - 필드 드레싱 (퀵 클롯) - 基本战地包扎 (止血粉) - 基本戰地包紮 (止血粉) - - - QuikClot bandage - Гемостатический пакет QuikClot - Vendaje QuikClot - Bandage hémostatique - Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. - Bandage mit Gerinnungsmittel - QuikClot kötszer - Bendaggio emostatico (QuikClot) - Atadura com agente coagulante - Hemostatický obvaz (QuikClot) - クイッククロット包帯 - 퀵 클롯 붕대 - 止血粉绷带 - 止血粉繃帶 - - - Hemostatic bandage with coagulant that stops bleeding. - Медицинский коагулянт для экстренной остановки кровотечения - Un bandage aidant à coaguler les saignements mineurs à moyens. - Proszkowy opatrunek adsorpcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. - Vendaje hemostático con coagulante que detiene el sangrado. - Verband mit Gerinnungsmittel, um starke Blutung zu behandeln. - Hemostatikus kötszer egy vérzésgátló anyaggal. - Bendaggio emostatico con coagulante che permette di arrestare perdite di sangue - Atadura homeostática com coagulante que controla hemorragias médias e grandes. - Hemostatický obvaz určený k zástavě krvácení - 血液凝固剤を含む包帯により、止血できます。 - 지혈시 사용하는 붕대로 혈액 응고제를 포함하고있습니다. - 包含止血粉成分的止血绷带,可用于止血。 - 包含止血粉成分的止血繃帶,可用於止血。 - - - Personal Aid Kit - Аптечка - Trousse sanitaire - Equipo de primeros auxilios - Apteczka osobista - Persönliches Erste-Hilfe-Set - Elsősegélycsomag - Pronto soccorso personale - Kit de Primeiros Socorros Pessoal - Osobní lékárnička (PAK) - 応急処置キット - 개인응급키트 - 个人急救包 - 個人急救包 - - - Includes various treatment kit needed for stitching or advanced treatment - Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. - Incluye material médico para tratamientos avanzados - Inclut du matériel medical pour les traitements délicats, tel les points de suture. - Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego. - Beinhaltet medizinisches Material für fortgeschrittene Behandlung und zum Nähen. - Változatos segédfelszereléseket tartalmaz sebvarráshoz és haladó elsősegélynyújtáshoz - Include vario materiale medico per trattamenti avanzati. - Inclui vários tratamentos materiais para costura e tratamento avançado - Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných - 縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 - 봉합및 고급 조치에 필요한 다양한 치료 도구가 있습니다. - 包含各种医疗套件,以及进阶伤口系统需要的缝合用品 - 包含各種醫療套件,以及進階傷口系統需要的縫合用品 - - - Personal Aid Kit for in field stitching or advanced treatment - W znacznym stopniu poprawia stan pacjenta - Полевая аптчека для продвинутого лечения и зашивания ран - Persönliches Erste-Hilfe-Set zum ambulanten Nähen und fortgeschrittener Behandlung. - Inclut du matériel medical pour les traitements délicats, tel les points de suture. - Equipo de primeros auxilios para sutura de campaña o tratamientos avanzados - Elsősegélycsomag, terepen való sebvarráshoz és haladó ellátáshoz - Kit de primeiros socorros para sutura ou tratamentos avançados - Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných v poli - Pronto soccorso personale da campo per mettersi i punti o per trattamenti avanzati. - 応急処置キットは戦場での縫合や高度な治療に使われます。 - 야전에서 봉합및 고급 조치를 위한 개인응급키트 - 个人急救包可用于战地缝合手术或进阶伤口系统使用 - 個人急救包可用於戰地縫合手術或進階傷口系統使用 - - - Use Personal Aid Kit - Erste-Hilfe-Set benutzen - Использовать аптечку - Utiliser la trousse sanitaire - Użyj apteczki osobistej - Usar equipo de primeros auxilios - Elsősegélycsomag használata - Usar o kit de primeiros socorros - Použít osobní lékárničku (PAK) - Usa il pronto soccorso personale - 応急処置キットを使う - 개인 응급 키트사용하기 - 使用个人急救包 - 使用個人急救包 - - - Surgical Kit - Trousse chirurgicale - Хирургический набор - Kit quirúrgico - Zestaw do szycia ran - Operationsset - Sebészeti készlet - Kit chirurgico - Kit Cirúrgico - Chirurgická sada - 縫合キット - 봉합 키트 - 手术包 - 手術包 - - - Surgical Kit for in field advanced medical treatment - Trousse chirurgicale pour le traitement sur le terrain - Набор для хирургической помощи в полевых условиях - Kit quirúrgico para el tratamiento avanzado en el campo de batalla - Zestaw pozwalający na zszywanie ran w polu - Operationsset für fortgeschrittene medizinische Feldversorgung - Sebészeti készlet komplex orvosi feladatok terepen való ellátására - Kit chirurgico per trattamenti avanzati sul campo. - Kit Cirurgico para uso de tratamento médico avançado em campo - Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli - 縫合キットは戦場で高度な処置をする為に使われます。 - 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) - 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) - - - Surgical Kit for in field advanced medical treatment - Набор для хирургической помощи в полевых условиях - Kit quirúrgico para el tratamiento avanzado en el campo de batalla - Zestaw pozwalający na zszywanie ran w polu - Operationsset für fortgeschrittene medizinische Feldversorgung - Trousse chirurgicale pour le traitement sur le terrain - Sebészeti készlet komplex orvosi feladatok terepen való ellátására - Kit chirurgico per trattamenti avanzati sul campo. - Kit Cirúrgico para tratamento médico avançado em campo. - Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli - 縫合キットは戦場で高度な処置をする為に使われます。 - 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) - 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) - - - Use Surgical Kit - Operationsset benutzen - Usa kit chirurgico - Использовать хирургический набор - Utiliser la trousse chirugicale - Zszyj rany - Usar equipo quirúrgico - Sebészeti készlet használata - Použít chirurgickou sadu - Usar kit cirúrgico - 縫合キットを使う - 봉합키트 사용하기 - 使用手术包 - 使用手術包 - - - Bodybag - Housse mortuaire - Мешок для трупов - Bolsa para cadáveres - Worek na zwłoki - Leichensack - Hullazsák - Sacca per corpi - Saco mortuário - Pytel na mrtvoly - 死体袋 - 尸袋 - 屍袋 - 시체 운반 가방 - - - A bodybag for dead bodies - Housse de transport des corps - Мешок для упаковки трупов - Una bolsa para cadáveres - Worek do pakowania zwłok - Ein Leichensack für Tote - Egy hullazsák a holttestek számára - Una sacca nera per trasportare cadaveri. - Um saco para corpos mortos - Pytel na mrtvoly - 死体袋は死体を入れるために使います - 시체를 운반할때 쓰는 가방입니다 - 用来装尸体用 - 用來裝屍體用 - - - A bodybag for dead bodies - Housse de transport des corps - Мешок для упаковки трупов - Una bolsa para cadáveres - Worek do pakowania zwłok - Ein Leichensack für Tote - Egy hullazsák a holttestek számára - Una sacca nera per trasportare cadaveri. - Um saco para corpos mortos. - Pytel na mrtvoly - 死体袋は死体を入れるために使います - 시체를 운반할때 쓰는 가방입니다 - 用来装尸体用 - 用來裝屍體用 - - - Blood Pressure - Tension artérielle - Артериальное давление - Presión arterial - Ciśnienie krwi - Blutdruck - Vérnyomás - Pressione sanguigna - Pressão arterial - Krevní tlak - 血圧を測る - 혈압 - 血压 - 血壓 - - - Checking Blood Pressure.. - Prise de la tension... - Проверка артериального давления... - Comprobando presión arterial... - Sprawdzanie ciśnienia krwi... - Blutdruck kontrollieren... - Vérnyomás megmérése... - Controllando la pressione sanguigna.. - Aferindo pressão arterial... - Měřím krevní tlak... - 血圧を測定しています・・・ - 혈압 측정증... - 检查血压中... - 檢查血壓中... - - - %1 checked Blood Pressure: %2 - %1 kontrollierte Blutdruck: %2 - %1 controllata pressione sanguigna: %2 - %1 проверил артериальное давление: %2 - %1 a mesuré la tension: %2 - %1 sprawdził ciśnienie krwi: %2 - %1 verificada la presión arterial: %2 - %1 ellenőrizte a vérnyomást: %2 - %1 zkontroloval krevní tlak: %2 - %1 verificou pressão arterial: %2 - %1 が測った血圧は: %2 - %1 (이)가 혈압을 측정했습니다: %2 - 已由%1确认血压: %2 - 已由%1確認血壓: %2 - - - You checked %1 - Vous examinez %1 - Вы осмотрели раненого %1 - Examinando a %1 - Zbadałeś %1 - Kontrolliert %1 - A %1 ellenőrizve - Hai diagnosticato %1 - Você verificou o paciente %1 - Zkontroloval jsi %1 - 自分の血圧は %1 - 나의 혈압은 %1 이다 - 你已经检查 %1 - 你已經檢查 %1 - - - You find a blood pressure of %2/%3 - Vous avez mesuré une tension de %2/%3 - Артериальное давление %2/%3 - La Presión Arterial es %2/%3 - A vérnyomás %2/%3 - Hai riscontrato una pressione di %2/%3 - Wyczuwasz ciśnienie krwi o wartości %2/%3 - Der Blutdruck liegt bei %2/%3 - A pressão arterial é de %2/%3 - Naměřil si krevní tlak u %2/%3 - 血圧は %2/%3 - 혈압이 %2/%3 이다 - 血压为%2/%3 - 血壓為%2/%3 - - - You find a low blood pressure - Tension basse - Давление низкое - La presión arterial es baja - Wyczuwasz niskie ciśnienie krwi - Blutdruck ist niedrig - A vérnyomás alacsony - La pressione sanguigna è bassa - Pressão arterial baixa - Naměřil si nízký krevní tlak - 血圧はかなり低い - 发现到低血压 - 發現到低血壓 - 혈압이 낮음 - - - You find a normal blood pressure - Tension normale - Давление нормальное - La presión arterial es normal - Wyczuwasz normalne ciśnienie krwi - Blutdruck ist normal - A vérnyomás normális - La pressione sanguigna è normale - Pressão arterial normal - Naměřil si normální krevní tlak - 血圧は通常 - 发现到正常血压 - 發現到正常血壓 - 혈압이 정상 - - - You find a high blood pressure - Tension élevée - Давление высокое - La presión arterial es alta - Wyczuwasz wysokie ciśnienie krwi - Blutdruck ist hoch - A vérnyomás magas - La pressione sanguigna è alta - Pressão arterial alta - Naměřil si vysoký krevní tlak - 血圧はかなり高い - 发现到高血压 - 發現到高血壓 - 혈압이 높음 - - - You find no blood pressure - Pas de tension - Давления нет - No hay presión arterial - Nie wyczuwasz ciśnienia krwi - Patient hat keinen Blutdruck - Nem észlelhető vérnyomás - La pressione sanguigna è assente - Sem pressão arterial - Nenaměřil si žádný krevní tlak - 血圧を測れませんでした - 혈압이 잡히지 않는다 - 量不到血压 - 量不到血壓 - - - You fail to find a blood pressure - Vous n'avez pas pu mesurer de tension - Артериальное давление не определяется - No puedes encontrar presión arterial - Nie udało Ci się sprawdzić ciśnienia krwi - Du konntest keinen Blutdruck feststellen - Nem sikerült a vérnyomás megmérése - Manca strumento per misurare pressione sanguigna - Você falhou em aferir a pressão arterial - Nedokázal si změřit krevní tlak - 血圧を測るのに失敗しました - 혈압을 잡을 수 없었다 - 检查血压的动作失败 - 檢查血壓的動作失敗 - - - Low - Niedrig - Bassa - Низкое - basse - Niskie - Baja - Alacsony - Nízký - Baixa - 低い - 낮음 - - - - - Normal - Normal - Normale - Нормальное - normale - Normalne - Normal - Normális - Normální - Normal - 通常 - 보통 - 正常 - 正常 - - - High - Hoch - Alta - Высокое - élevée - Wysokie - Alta - Magas - Vysoký - Alta - 高い - 높음 - - - - - No Blood Pressure - Kein Blutdruck - Nessuna Pressione Sanguigna - Артериальное давление отсутствует - pas de tension - Brak ciśnienia krwi - Sin presión arterial - Nincs vérnyomás - Žádný krevní tlak - Sem pressão arterial - 血圧なし - 혈압 없음 - 无血压 - 無血壓 - - - Pulse - Пульс - Pouls - Pulso - Tętno - Puls - Pulzus - Polso - Pulso - Puls - 心拍数 - 맥박 - 脉搏 - 脈搏 - - - Checking Heart Rate... - Vérification du pouls... - Проверка пульса... - Comprobando ritmo cardíaco... - Sprawdzanie tętna... - Kontrolliere Herzfrequenz... - Szívverés-szám mérése... - Controllando il battito cardiaco... - Aferindo pulso... - Kontroluji srdeční tep... - 心拍数を測定しています・・・ - 맥박 확인중... - 检查心跳中... - 檢查心跳中... - - - You checked %1 - Вы осмотрели раненого %1 - Vous examinez %1 - Examinando a %1 - Zbadałeś %1 - Kontrolliert %1 - A %1 ellenőrizve - Hai diagnosticato %1 - Você aferiu o paciente %1 - Zkontroloval si %1 - 心拍数は %1 - 나의 맥박은 %1 이다 - 你已经检查 %1 - 你已經檢查 %1 - - - %1 checked Heart Rate: %2 - %1 kontrollierte Herzfrequenz: %2 - %1 Controllata Frequenza Cardiaca: %2 - %1 проверил пульс: %2 - %1 a vérifié le pouls de : %2 - %1 sprawdził tętno: %2 - %1 verificado el ritmo cardíaco: %2 - %1 ellenőrizte a szívverés-számot: %2 - %1 zkontroloval srdeční tep: %2 - %1 verificou a frequência cardíaca: %2 - %1 が測った心拍数は: %2 - %1 (이)가 맥박을 측정했습니다: %2 - 已由%1确认心跳: %2 - 已由%1確認心跳: %2 - - - None - Нет - Żadna - Nada - Keine - Žádný - Nada - aucun - Nincs - Niente - なし - 없음 - - - - - Weak - Schwach - Lento - Слабый - lent - Słabe - Débil - Gyenge - Slabý - Fraca - 弱い - 약함 - 微弱 - 微弱 - - - Normal - Normal - Normale - Нормальный - normal - Normalne - Normal - Normális - Normální - Normal - 通常 - 보통 - 正常 - 正常 - - - Strong - Stark - Veloce - Сильный - rapide - Silne - Fuerte - Erős - Silný - Forte - 強い - 강함 - 过快 - 過快 - - - You find a Heart Rate of %2 - %2 battements par minute - Пульс %2 уд./мин. - El ritmo cardíaco es de %2 - Wyczuwasz tętno o wartości %2 - Herzfrequenz ist %2 - A szívverés-szám %2 - Il battito cardiaco è %2 - A freqüência cardíaca é de %2 - Nahmatal jsi srdeční tep u %2 - 心拍数は %2 - 心跳为%2 - 心跳為%2 - 맥박 %2 - - - You find a weak Heart Rate - Poulslent - Пульс слабый - El ritmo cardíaco es débil - Wyczuwasz słabe tętno - Schwacher Puls - A szívverés-szám alacsony - Hai riscontrato un debole battito cardiaco - Freqüência cardíaca baixa - Nahmatal si slabý srdeční puls - 自分の心拍数は低い - 心跳微弱 - 心跳微弱 - 약한 맥박 - - - You find a strong Heart Rate - pouls rapide - Пульс учащенный - El ritmo cardíaco está acelerado - Wyczuwasz silne tętno - Starker Puls - A szívverés-szám magas - Hai riscontrato un forte battito cardiaco - Freqüência cardíaca normal - Nahmatal si silný srdeční puls - 自分の心拍数は強い - 心跳过快 - 心跳過快 - 강한 맥박 - - - You find a normal Heart Rate - pouls normal - Пульс в норме - El ritmo cardíaco es bueno - Wyczuwasz normalne tętno - Normaler Puls - A szívverés-szám normális - Hai riscontrato un normale battito cardiaco - Freqüência cardíaca alta - Nahmatal si normální srdeční puls - 自分の心拍数は通常 - 心跳正常 - 心跳正常 - 보통 맥박 - - - You find no Heart Rate - pas de pouls - Пульс не прощупывается - No tiene ritmo cardíaco - Wyczuwasz brak tętna - Kein Puls gefunden - Nem észlelhető szívverés - Hai riscontrato una assenza di battito cardiaco - Sem freqüência cardíaca - Žádný puls - 心拍数を測れませんでした - 量不到心跳 - 量不到心跳 - 맥박 없음 - - - Response - Conscience - Реакция - Respuesta - Przytomność - Ansprechbarkeit - Reagálóképesség - Risposta - Reação - Odezva - 反応を見る - 반응 - 反应 - 反應 - - - You check response of patient - Vous évaluez l'état de conscience - Вы проверяете реакцию раненого - Compruebas si el paciente reacciona - Sprawdzasz przytomność pacjenta - Du prüfst ob der Patient ansprechbar ist - Ellenőrzöd a páciens reagálóképességét - Controlli la risposta del paziente - Aferindo se o paciente tem reação - Zkontroloval jsi reakci pacienta - 患者からの反応を見る - 대상의 반응 확인중 - 检查伤者的反应 - 檢查傷者的反應 - - - %1 is responsive - %1 реагирует на раздражители - %1 est conscient - %1 ha reaccionado - %1 jest przytomny - %1 ist ansprechbar - %1 reakcióképes - %1 e' cosciente - %1 está respondendo - %1 odpovídá - %1 は反応あり - %1 有反应 - %1 有反應 - %1 은 반응이 있다 - - - %1 is not responsive - %1 не реагирует на раздражители - %1 est inconscient - %1 no reacciona - %1 jest nieprzytomny - %1 ist nicht ansprechbar - %1 nem reagál - %1 e' incosciente - %1 não está respondendo - %1 neodpovídá - %1 の反応なし - %1 没有反应 - %1 沒有反應 - %1 은 반응이 없다 - - - You checked %1 - Вы осмотрели раненого %1 - Vous avez examiné %1 - Examinas a %1 - Zbadałeś %1 - Du hast versucht, %1 anzusprechen - Megnézted %1-t - Hai controllato %1 - Você aferiu o paciente %1 - Zkontroloval jsi %1 - %1 を見ました - %1 을 확인함 - 你已经检查 %1 - 你已經檢查 %1 - - - Patient %1<br/>is %2.<br/>%3.<br/>%4 - Il paziente %1<br/>è %2.<br/>%3.<br/>%4 - Пациент %1<br/>%2.<br/>%3.<br/>%4 - Patient %1<br/>ist %2.<br/>%3.<br/>%4 - Patient %1<br/>est %2.<br/>%3.<br/> - Pacjent %1<br/>jest %2.<br/>%3.<br/>%4 - Paciente %1<br/>is %2.<br/>%3.<br/>%4 - A páciens, %1,<br/>%2.<br/>%3.<br/>%4 - Pacient %1<br/>je %2.<br/>%3.<br/>%4 - Paciente %1<br/>é %2.<br/>%3.<br/>%4 - 患者 %1<br/>は %2.<br/>%3.<br/>%4 - 환자 %1<br/>는 %2.<br/>%3.<br/>%4 - 伤者 %1<br/>is %2.<br/>%3.<br/>%4 - 傷者 %1<br/>is %2.<br/>%3.<br/>%4 - - - alive - vivo - жив - lebendig - vivant - żywy - vivo - élő - naživu - vivo - 生存 - 생존 - 活着 - 活著 - - - dead - morto - мёртв - muerto - tot - décédé - martwy - halott - mrtev - morto - 死亡 - 사망 - 死亡 - 死亡 - - - He's lost some blood - Ha perso poco sangue - Ha perdido un poco de sangre - Есть кровопотеря - Er hat etwas Blut verloren - Il a perdu du sang - Stracił trochę krwi - Valamennyi vért vesztett - Ztratil trochu krve - Ele perdeu um pouco de sangue - 出血しています - 적은 양의 피를 잃었다 - 他流失一些血液 - 他流失一些血液 - - - He's lost a lot of blood - Er hat viel Blut verloren - Sok vért vesztett - Stracił sporo krwi - Большая кровопотеря - Ha perdido mucha sangre - Il a perdu beaucoup de sang - Ztratil hodně krve - Ele perdeu muito sangue - Ha perso molto sangue - 大量失血しています - 많은 양의 피를 잃었다 - 他流失大量血液 - 他流失大量血液 - - - He hasn't lost blood - Non ha perso sangue - Нет кровопотери - Er hat kein Blut verloren - Il n'a pas perdu de sang - Nie stracił krwi - No ha perdido sangre - Nem vesztett vért - Neztratil žádnou krev - Ele não perdeu sangue - 失血していません - 피를 잃지 않았다 - 他并没有失血 - 他並沒有失血 - - - He is in pain - Sente dolori - Испытывает боль - Er hat Schmerzen - Il souffre - Odczuwa ból - Siente dolor - Fájdalmai vannak - Je v bolestech - Ele está com dor - 痛い様です - 통증이 있다 - 他感到疼痛 - 他感到疼痛 - - - He is not in pain - Non sente dolori - Не испытывает боли - Er hat keine Schmerzen - Il ne souffre pas - Nie odczuwa bólu - No siente dolor - Nincsenek fájdalmai - Nemá žádné bolesti - Ele não está com dor - 痛くない様です - 통증이 없다 - 他不会疼痛 - 他不會疼痛 - - - Bandaged - Pansé - Повязка наложена - Vendado - Zabandażowano - Bekötözve - Bendato - verbunden - Enfaixado - Obvázaný - 包帯 - 붕대 감음 - 绷带 - 繃帶 - - - You bandage %1 (%2) - Vous pansez %1 (%2) - Вы перевязали раненого %1 (%2) - Aplicas vendaje a %1 en %2 - Bandażujesz %1 (%2) - Bekötözöd %1-t (%2) - Stai bendando %1 (%2) - Du verbindest %1 (%2) - Você aplica atadura no paciente %1 (%2) - Obvazuješ %1 (%2) - %1 (%2) 包帯を使いました - %1 (%2) 붕대를 감았다 - 你正在对 %1 (%2) 包扎绷带中 - 你正在對 %1 (%2) 包紮繃帶中 - - - %1 is bandaging you - %1 vous panse - %1 перевязывает вас - %1 te está vendando - %1 bandażuje Ciebie - %1 bekötöz téged - %1 ti sta bendando - %1 verbindet dich - %1 está aplicando uma bandagem em você - %1 tě obvazuje - %1 はあなたに包帯を巻いています - %1 (이)가 나에게 붕대를 감고있다 - %1 正在对你包扎绷带中 - %1 正在對你包紮繃帶中 - - - You start stitching injuries from %1 (%2) - Вы зашиваете ранения от %1 (%2) - Du nähst die Wunden von %1 (%2) - Vous suturez %1 (%2) - Estás suturando heridas de %1 en %2 - Zszywasz rany %1 (%2) - Elkezded összevarni %1 sérüléseit (%2) - Stai suturando le ferite di %1 (%2) - Você começa a suturar os ferimentos do %1 (%2) - Zašíváš rány %1 (%2) - %1 (%2) の外傷へ縫合を始めました - 나는 %1(%2) 상처로부터 봉합을 시작했다 - 你正开始对 %1 (%2) 缝合伤口中 - 你正開始對 %1 (%2) 縫合傷口中 - - - Stitching - Наложение швов - Suturando - Nähen - Sutures - Szycie - Összevarrás - Suturando - Suturando - Šití - 縫合中 - 붕합중 - 缝合中 - 縫合中 - - - You treat the airway of %1 - Вы интубируете раненого %1 - Estás intubando a %1 - Du behandelst die Atemwege von %1 - Vous traitez les voies respiratoires de %1 - Udrażniasz drogi oddechowe %1 - Kezeled %1 légútját - Controlli le vie respiratorie di %1 - Você entuba o %1 - Ošetřuješ dýchací cesty %1 - %1 の気道を診断する - %1의 기도를 확보했다 - 你治疗 %1 的呼吸道 - 你治療 %1 的呼吸道 - - - Airway - Дыхательные пути - Vías aéreas - Drogi oddechowe - Atemwege - Voies respiratoires - Légút - Vie respiratorie - Vias Aéreas - Dýchací cesty - 気道 - 기도 - 呼吸道 - 呼吸道 - - - %1 is treating your airway - %1 проводит вам интубацию - %1 traite vos voies respiratoires - %1 te está intubando - %1 udrażnia Twoje drogi oddechowe - %1 behandelt deine Atemwege - %1 kezeli a légútadat - %1 ti sta trattando le vie respiratorie - %1 está te entubando - %1 ošetřuje tvoje dýchací cesty - %1 はあなたの気道を見ています - %1 (이)가 나의 기도를 확보중이다 - %1 正在治疗你的呼吸道 - %1 正在治療你的呼吸道 - - - Drag - Ziehen - Arrastrar - Ciągnij - Táhnout - Тащить - Traîner - Húzás - Arrastar - Trascina - 引きずる - 끌다 - 拖拉 - 拖拉 - - - Carry - Tragen - Cargar - Nieś - Nést - Нести - Porter - Cipelés - Carregar - Trasporta - 運ぶ - 업다 - 背起 - 背起 - - - Release - Loslassen - Soltar - Połóż - Položit - Отпустить - Déposer - Elengedés - Soltar - Rrilascia - 離す - 내려놓기 - 放下 - 放下 - - - Load Patient Into - Patient einladen - Cargar al paciente en - Załaduj pacjenta - Naložit pacianta do - Погрузить пациента в - Embarquer le patient - Sebesült berakása - Carregar paciente em - Carica paziente nel - 患者を載せる - 환자 싣기 - 将伤者放入 - 將傷者放入 - - - Unload Patient - Patient ausladen - Descargar al paciente - Wyładuj pacjenta - Vyložit pacienta - Выгрузить пациента - Débarquer le patient - Sebesült kihúzása - Descarregar paciente - Scarica il paziente - 患者を降ろす - 환자 내리기 - 将伤者背出 - 將傷者背出 - - - Unload patient - Descargar al paciente - Выгрузить пациента - Patient ausladen - Wyładuj pacjenta - Le patient débarque - Sebesült kihúzása - Scarica il paziente - Descarregar paciente - Vyložit pacienta - 患者を降ろす - 환자 내리기 - 将伤者背出 - 將傷者背出 - - - Load patient - Cargar al paciente en - Погрузить пациента - Patient einladen - Załaduj pacjenta - Embarquer le patient - Sebesült berakása - Carica il paziente - Carregar paciente em - Naložit pacienta - 患者を載せる - 환자 싣기 - 将伤者放入 - 將傷者放入 - - - %1<br/>loaded into<br/>%2 - %1<br/>cargado en<br/>%2 - %1<br/>chargé dans<br/>%2 - %1<br/>in<br/>%2 verladen - %1<br/>załadowano do<br/>%2 - %1<br/>naloženo do<br/>%2 - %1<br/>carregado em<br/>%2 - %1<br/>caricato su<br/>%2 - %1<br/>berakodva ide:<br/>%2 - %1<br/>загружен в<br/>%2 - %1<br/>は<br/>%2へ積み込まれました - %1<br/>는<br/>%2 에 실림 - %1<br/>裝載至<br/>%2 - %1<br/>装载至<br/>%2 - - - Place body in bodybag - Colocar cuerpo en bolsa para cadáveres - Поместить тело в мешок для трупов - Körper in Leichesack verstauen - Zapakuj ciało do worka na zwłoki - Mettre le corps dans la housse mortuaire - Test hullazsákba helyezése - Metti il corpo nella sacca per cadaveri - Colocar corpo dentro do saco mortuário - Umístni tělo do pytle na mrtvoly - 死体袋に入れる - 시체 가방에 담기 - 将尸体放入尸袋 - 將屍體放入屍袋 - - - Placing body in bodybag... - Colocando cuerpo en bolsa para cadáveres... - Упаковка тела... - Körper wird in Leichensack gepackt... - Pakowanie ciała do worka na zwłoki... - Placement du corps dans la housse... - Test hullazsákba helyezése... - Stai mettendo il corpo nella sacca... - Colocando corpo dentro do saco mortuário... - Umístňuji tělo do pytle na mrtvoly... - 死体袋へ入れています・・・ - 시체 가방에 담는중... - 将尸体放入尸袋中... - 將屍體放入屍袋中... - - - %1 has bandaged patient - %1 has vendado al paciente - %1 перевязал пациента - %1 hat den Patienten verbunden - %1 założył bandaż - %1 a pansé le patient - %1 bekötözte a pácienst - %1 ha bendato il paziente - %1 aplicou atadura no paciente - %1 již obvázal pacienta - %1 は包帯を巻きました - %1 已包扎伤者 - %1 已包紮傷者 - %1 (이)가 붕대를 감음 - - - %1 performed CPR - %1 wykonał cykl RKO - %1 provádí CPR - %1 hat eine HLW durchgeführt - %1 ha eseguito CPR - %1 realizou RCP - %1 провел сердечно-легочную реанимацию - %1 realicó RCP - %1 à fait une RCP - %1 は心肺蘇生をしました - %1 已执行心肺复苏术 - %1 已執行心肺復甦術 - %1 (이)가 심폐소생술을 실시함 - - - %1 used %2 - %1 usó %2 - %1 benutzt %2 - %1 использовал %2 - %1 użył %2 - %1 utilise %2 - %1 használta a %2-t - %1 ha usato %2 - %1 usou %2 - %1 použil %2 - %1 は %2 を使いました - %1 已使用 %2 - %1 已使用 %2 - %1 (이)가 %2 을 사용함 - - - %1 has given an IV - %1 провёл переливание - %1 ha puesto una IV - %1 hat eine Infusion verabreicht - %1 podał IV - %1 a plaçé une IV - %1 infúziót adott - %1 ha somministrato una EV - %1 aplicou um intravenoso - %1 již aplikoval IV - %1 は IV をしました - %1 已经给予静脉注射液 - %1 已經給予靜脈注射液 - %1 (이)가 IV를 실시함 - - - %1 applied a tourniquet - %1 aplicado torniquete - %1 наложил жгут - %1 hat ein Tourniquet angelegt - %1 założył stazę - %1 a plaçé un garrot - %1 felhelyezett egy érszorítót - %1 ha applicato un laccio emostatico - %1 aplicou um torniquete - %1 použil škrtidlo - %1 は止血帯を巻きました - %1 已经绑上止血带 - %1 已經綁上止血帶 - %1 (이)가 지혈대를 적용함 - - - %1 used Personal Aid Kit - %1 hat das eigene Erste-Hilfe-Set verwendet - %1 użył apteczki - %1 utilizou KPS - %1 používá PAK - %1 использовал аптечку - %1 ha usato Kit Pronto Soccorso Personale - %1 usó Kit de Primeros Auxilios - %1 a utilisé une trousse - %1 は応急処置キットを使いました - %1 已使用了个人急救包 - %1 已使用了個人急救包 - %1 (이)가 개인응급키트를 사용함 - - - Heavily wounded - Schwer verwundet: - Ciężko ranny - Тяжелые ранения - Gravemente ferito - Gravemente herido - Gravement blessé - Erősen sérült - Těžce raněn - Gravemente ferido - 重傷 - 중상 - 重伤 - 重傷 - - - Lightly wounded - Leicht verwundet: - Lekko ranny - Легкие ранения - Leggermente ferito - Levemente herido - Légèrement blessé - Enyhén sérült - Lehce raněn - Levemente ferido - 軽傷 - 경상 - 轻伤 - 輕傷 - - - Very lightly wounded - Sehr leicht verwundet: - B. lekko ranny - Царапины - Ferito lievemente - Muy levemente herido - Très légèrement blessé - Nagyon enyhén sérült - Velmi lehce raněn - Ferido muito levemente - かなり浅い傷 - 매우 가벼운 부상 - 小伤 - 小傷 - - - Head - Kopf - Głowa - Головы - Testa - Cabeza - Tête - Fej - Hlava - Cabeça - 頭部 - 머리 - 头部 - 頭部 - - - Torso - Torso - Tors - Торса - Torso - Torso - Torse - Testtörzs - Trup - Torso - 胴体 - 몸통 - 身体 - 身體 - - - Left Arm - Linker Arm - Lewe ramię - Левой руки - Braccio sinistro - Brazo izquierdo - Bras gauche - Bal kar - Levá ruka - Braço esquerdo - 左腕 - 왼쪽 팔 - 左手 - 左手 - - - Right Arm - Rechter Arm - Prawe ramię - Правой руки - Braccio destro - Brazo derecho - Bras droit - Jobb kar - Pravá ruka - Braço direito - 右腕 - 오른쪽 팔 - 右手 - 右手 - - - Left Leg - Linkes Bein - Lewa noga - Левой ноги - Gamba sinistra - Pierna izquierda - Jambe gauche - Bal láb - Levá noha - Perna esquerda - 左足 - 왼쪽 다리 - 左脚 - 左腳 - - - Right Leg - Rechtes Bein - Prawa noga - Правой ноги - Gamba destra - Pierna derecha - Jambe droite - Jobb láb - Pravá noha - Perna direita - 右足 - 오른쪽 다리 - 右脚 - 右腳 - - - Heal fully bandaged hitpoints - Lecz w pełni zabandażowane hitpointy - Curar miembros totalmente vendados - Исцелять полностью перебинтованные части тела - Curar pontos de vida totalmente enfaixados - Heal fully bandaged hitpoints - Cura hitpoints completamente bendati - Soigner les plaies entièrement bandées - Heilt vollständig bandagierte Trefferpunkte - 包帯は体力を完全に回復する - 붕대를 감은후 체력을 회복함 - 完全医疗包扎的部位至痊愈 - 完全醫療包紮的部位至痊癒 - - - Pain is only temporarily suppressed - Schmerzen werden nur vorübergehend unterdrückt - Ból jest tymczasowo zwalczany - Bolest je potlačena pouze dočasně - El dolor se suprime solo temporalmente - Dor é suprimida somente temporariamente - La douleur est temporairement calmée - A fájdalom csak ideiglenesen csökken - Боль приглушается только временно - Dolore è soppresso solo temporaneamente - 痛みは一時的な影響 - 疼痛只会暂时性压制 - 疼痛只會暫時性壓制 - 고통은 일시적으로만 회복 - - - Pain Effect Type - Schmerzeffekt-Typ - Rodzaj efektu bólu - Визуальный эффект боли - Pain Effect Type - Tipo de efecto de dolor - Type d'effet de douleur - Fájdalom-effekt típusa - Tipo do efeito da dor - Typ bolesti - efekt - 痛みの種類 - 고통 효과 종류 - 疼痛效果类型 - 疼痛效果類型 - - - Colour Flashing - Farbblinken - Pulsujące kolory - Пульсирующий свет - Colore lampeggiante - Parpadeo de color - Flash de couleur - Színvillódzás - Flash de cor - Blikající barva - 色の点滅 - 색 반짝임 - 闪烁颜色 - 閃爍顏色 - - - Chromatic Aberration - Chromatische Aberration - Aberracja chromatyczna - Хроматическая аберрация - Aberrazione cromatica - Aberración cromática - Aberration chromatique - Kromatikus aberráció - Chromatická aberace - Aberração cromática - 色の収差 - 색수차 - 色差 - 色差 - - - Style of menu (Medical) - Styl menu medycznego - Style de menu (médical) - Menüstil (Medizin) - Вид меню (медицина) - Tipo de menú (Medico) - Styl menu (Zdravotní) - Estilo do menu (Médico) - Menü stílusa (Orvosi) - Stile del menù (medico) - メニューの表示形式 (治療) - 메뉴의 스타일 (의료) - 选单样式 (医疗) - 選單樣式 (醫療) - - - Select the type of menu you prefer; default 3d selections or radial. - Wybierz rodzaj menu, który preferujesz: domyślne pozycje 3D lub radialne - Sélectionne le type de menu préféré; par défaut la sélection 3D ou radiale - Wähle den Menüstil: Standard 3D-Auswahl oder kreisförmig. - Выберите тип меню: стандартный вариант (3D) или радиальный - Selecciona el tipo de menú que prefieres: selecciones 3d por defecto o radial. - Selecione o tipo de menu que você prefere; seleções 3d padrão ou radial. - Válaszd ki a neked megfelelő menüt: Alapértelmezett 3D válogatás, vagy kerek. - Zvolte typ menu: základní 3D výběr nebo kruhový - Seleziona il tipo di menù che preferisci: selezione (3D), radiale o disabilitata. - メニューの表示形式を選んでください。標準では 3D 選択か円状です。 - 선호하는 종류의 메뉴를 고르세요; 기본 3d 선택형 혹은 다이얼형 - 选择你喜欢的选单样式; 预设为3D选项或放射状 - 選擇你喜歡的選單樣式; 預設為3D選項或放射狀 - - - Show medical interaction for self - 自分に治療インタラクションを表示 - Pokaż menu interakcji medycznej dla postaci - - - Show the self interaction medical actions - セルフ インタラクションに治療動作を表示します。 - Pokaż elementy menu interakcji medycznej dla postaci - - - Selections (3d) - Pozycje (3D) - Sélection (3D) - 3D-Auswahl - Стандартный (3D) - Selecciones (3d) - Seleção (3d) - Választékok (3D) - 3D výběr - Selezione (3D) - 選択 (3D) - 선택 (3d) - 选择 (3D) - 選擇 (3D) - - - Radial - Radialne - Radial - Kreisförmig - Радиальный - Radial - Radial - Kerek - Kruhový - Radiale - 円状 - 다이얼형 - 放射状 - 放射狀 - - - Scrape - Kratzer - Scorticatura - Ссадина - Abrasion - Draśnięcie - Arañazo - Horzsolás - Escoriação - Odřenina - 擦り傷 - 찰과상 - 擦伤 - 擦傷 - - - Minor Scrape - Kleiner Kratzer - Minima Scorticatura - Малая ссадина - Petite abrasion - Pomniejsze draśnięcie - Arañazo menor - Kis horzsolás - Escoriação leve - Malá odřenina - 小さな擦り傷 - 소형 찰과상 - 小擦伤 - 小擦傷 - - - Medium Scrape - Mittlerer Kratzer - Media Scorticatura - Средняя ссадина - Moyenne abrasion - Średnie draśnięcie - Arañazo medio - Közepes horzsolás - Escoriação média - Středně velká odřenina - 中くらいの擦り傷 - 중형 찰과상 - 中擦伤 - 中擦傷 - - - Large Scrape - Großer Kratzer - Alta Scorticatura - Большая ссадина - Grande abrasion - Duże draśnięcie - Arañazo severo - Nagy horzsolás - Escoriação grave - Velká odřenina - 大きな擦り傷 - 대형 찰과상 - 大擦伤 - 大擦傷 - - - Avulsion - Avulsion - Avulsione - Рваная рана - Avulsion - Rana płatowa - Avulsión - Leszakadás - Avulsão - Avulze - 剥離傷 - 적출상 - 撕脱伤 - 撕脫傷 - - - Minor Avulsion - Kleine Avulsion - Minima Avulsione - Малая рваная рана - Petite avulsion - Pomniejsza rana płatowa - Avulsión menor - Kis leszakadás - Avulsão leve - Malá avulze - 小さな剥離傷 - 소형 적출상 - 小撕脱伤 - 小撕脫傷 - - - Medium Avulsion - Mittlere Avulsion - Media Avulsione - Средняя рваная рана - Moyenne avulsion - Średnia rana płatowa - Avulsión media - Közepes leszakadás - Avulsão média - Střední avulze - 中くらいの剥離傷 - 중형 적출상 - 中撕脱伤 - 中撕脫傷 - - - Large Avulsion - Große Avulsion - Alta Avulsione - Большая рваная рана - Grande avulsion - Duża rana płatowa - Avulsión severa - Nagy leszakadás - Avulsão grave - Velká avulze - 大きな剥離傷 - 대형 적출상 - 大撕脱伤 - 大撕脫傷 - - - Bruise - Prellung - Contusione - Ушиб - Contusion - Stłuczenie - Contusión - Zúzódás - Contusão - Modřina - 打ち傷 - 타박상 - 挫伤 - 挫傷 - - - Minor Bruise - Kleine Prellung - Minima Contusione - Малый ушиб - Petite contusion - Pomniejsze stłuczenie - Contusión menor - Kis zúzódás - Hematoma leve - Malá modřina - 小さな打ち傷 - 소형 타박상 - 小挫伤 - 小挫傷 - - - Medium Bruise - Mittlere Prellung - Media Contusione - Средний ушиб - Moyenne contusion - Średnie stłuczenie - Contusión media - Közepes zúzódás - Hematoma médio - Středně velká modřina - 中くらいの打ち傷 - 중형 타박상 - 中挫伤 - 中挫傷 - - - Large Bruise - Große Prellung - Alta Contusione - Большой ушиб - Grande contusion - Duże stłuczenie - Contusión severa - Nagy zúzódás - Hematoma grande - Velká modřina - 大きな打撲傷 - 대형 타박상 - 大挫伤 - 大挫傷 - - - Crushed tissue - Quetschverletzung - Tessuto Schiacciato - Компресионная травма - Écrasement - Zgniecienie tkanek miękkich - Tejido triturado - Zúzott szövet - Contusão - Zhmoždění měkkých tkání - 圧挫傷 - 압궤상 - 撞伤 - 撞傷 - - - Minor crushed tissue - Kleine Quetschverletzung - Minimo Tessuto Schiacciato - Малая компрессионная травма - Petit écrasement - Pomniejsze zgniecienie tkanek miękkich - Tejido triturado menor - Kis zúzott szövet - Contusão leve - Malé zhmoždění měkkých tkání - 小さな圧挫傷 - 소형 압궤상 - 小撞伤 - 小撞傷 - - - Medium crushed tissue - Mittlere Quetschverletzung - Medio Tessuto Schiacciato - Средняя компрессионная травма - Moyen écrasement - Średnie zgniecienie tkanek miękkich - Tejido triturado medio - Közepes zúzott szövet - Contusão média - Střední zhmoždění měkkých tkání - 中くらいの圧挫傷 - 중형 압궤상 - 中撞伤 - 中撞傷 - - - Large crushed tissue - Große Quetschverletzung - Alto Tessuto Schiacciato - Большая компрессионная травма - Grand écrasement - Duże zgniecienie tkanek miękkich - Tejido triturado severo - Nagy zúzött szövet - Contusão grande - Velké zhmoždění měkkých tkání - 大きな圧挫傷 - 대형 압궤상 - 大撞伤 - 大撞傷 - - - Cut - Schnittwunde - Taglio - Резаная рана - Coupure - Rana cięta - Corte - Vágás - Corte - Řezná rána - 切り傷 - 절상 - 割伤 - 割傷 - - - Small Cut - Kleine Schnittwunde - Piccolo Taglio - Малая резаная рана - Pomniejsza rana cięta - Corte menor - Kis vágás - Petite coupure - Corte leve - Malá řezná rána - 小さな切り傷 - 소형 절상 - 小割伤 - 小割傷 - - - Medium Cut - Mittlere Schnittwunde - Medio Taglio - Средняя резаная рана - Średnia rana cięta - Corte mediano - Közepes vágás - Moyenne coupure - Corte médio - Střední řezná rána - 中くらいの切り傷 - 중형 절상 - 中割伤 - 中割傷 - - - Large Cut - Große Schnittwunde - Grande Taglio - Большая резаная рана - Duża rana cięta - Corte severo - Nagy vágás - Grande coupure - Corte grave - Velká řezná rána - 大きな切り傷 - 대형 절상 - 大割伤 - 大割傷 - - - Tear - Riss - Strappo - Рваная рана - Rozerwanie skóry - Lacération - Desgarro - Szakadás - Ruptura - Tržná rána - 裂傷 - 열상 - 撕裂伤 - 撕裂傷 - - - Small Tear - Kleiner Riss - Piccolo Strappo - Малая рваная рана - Pomniejsze rozerwanie skóry - Petite lacération - Desgarro menor - Kis szakadás - Ruptura leve - Malá tržná rána - 小さな裂傷 - 소형 열상 - 小撕裂伤 - 小撕裂傷 - - - Medium Tear - Mittlerer Riss - Medio Strappo - Средняя рваная рана - Średnie rozerwanie skóry - Desgarro medio - Közepes szakadás - Moyenne lacération - Ruptura média - Střední tržná rána - 中くらいの裂傷 - 중형 열상 - 中撕裂伤 - 中撕裂傷 - - - Large Tear - Großer Riss - Grande Strappo - Большая рваная рана - Duże rozerwanie skóry - Desgarro severo - Nagy szakadás - Grande lacération - Ruptura grave - Velká tržná rána - 大きな裂傷 - 대형 열상 - 大撕裂伤 - 大撕裂傷 - - - Velocity Wound - Ballistisches Trauma - Velocità Ferita - Огнестрельная рана - Rana postrzałowa - Plaie pénétrante - Herida de bala - Lőtt seb - Trauma balístico - Střelné poranění - 銃創 - 총상 - 穿透伤 - 穿透傷 - - - Small Velocity Wound - Kleines Ballistisches Trauma - Lenta Velocità Ferita - Малая огнестрельная рана - Pomniejsza rana postrzałowa - Herida de bala menor - Kis lőtt seb - Petite plaie pénétrante - Trauma balístico pequeno - Malé střelné poranění - 小さな銃創 - 소형 총상 - 小穿透伤 - 小穿透傷 - - - Medium Velocity Wound - Mittleres Ballistisches Trauma - Media Velocità Ferita - Средняя огнестрельная рана - Średnia rana postrzałowa - Herida de bala media - Közepes lőtt seb - Moyenne plaie pénétrante - Trauma balístico médio - Střední střelné poranění - 中くらいの銃創 - 중형 총상 - 中穿透伤 - 中穿透傷 - - - Large Velocity Wound - Großes Ballistisches Trauma - Alta Velocità Ferita - Большая огнестрельная рана - Duża rana postrzałowa - Herida de bala severa - Nagy lőtt seb - Grande plaie pénétrante - Trauma balístico grande - Velké střelné poranění - 大きな銃創 - 대형 총상 - 大穿透伤 - 大穿透傷 - - - Puncture Wound - Stichwunde - Puntura Ferita - Колотая рана - Rana kłuta - Perforation - Herida punzante - Szúrt seb - Ferimento perfurante - Bodná rána - 刺し傷 - 자상 - 穿刺伤 - 穿刺傷 - - - Minor Puncture Wound - Kleine Stichwunde - Piccola Puntura Ferita - Малая колотая рана - Pomniejsza rana kłuta - Herida punzante menor - Kis szúrt seb - Petite perforation - Ferimento perfurante leve - Malá bodná rána - 小さな刺し傷 - 소형 자상 - 小穿刺伤 - 小穿刺傷 - - - Medium Puncture Wound - Mittlere Stichwunde - Media Puntura Ferita - Средняя колотая рана - Średnia rana kłuta - Herida punzante media - Közepes szúrt seb - Moyenne perforation - Ferimento perfurante médio - Střední bodná rána - 中くらいの刺し傷 - 중형 자상 - 中穿刺伤 - 中穿刺傷 - - - Large Puncture Wound - Große Stichwunde - Grande Puntura Ferita - Большая колотая рана - Duża rana kłuta - Herida punzante severa - Nagy szúrt seb - Grande perforation - Ferimento perfurante grave - Velká bodná rána - 大きな刺し傷 - 대형 자상 - 大穿刺伤 - 大穿刺傷 - - - Broken Femur - Gebrochener Oberschenkelknochen - Femore Rotto - Перелом - Zkłamana kość udowa - Fémur cassé - Femur roto - Törött combcsont - Fêmur quebrado - Zlomená stehenní kost - 大腿骨の骨折 - 대퇴골 골절 - 大腿骨骨折 - 大腿骨骨折 - - - Treating... - Behandeln... - Ellátás... - Opatrywanie ran... - Traitement... - Лечение... - Tratando... - Tratando... - Ošetřuji... - Curando... - 治療しています・・・ - 치료중... - 治疗中... - 治療中... - - - Removing Tourniquet... - Tourniquet entfernen... - Zdejmowanie stazy... - Quitando torniquete... - Retire le garrot... - Removendo torniquete... - Érszorító eltávolítása... - Sundavám škrtidlo... - Снятие жгута... - Togliendo il laccio emostatico... - 止血帯を外しています・・・ - 지혈대 제거중... - 移除军用止血带中... - 移除軍用止血帶中... - ACE Medical ACE: медицина @@ -3795,22 +17,6 @@ ACE 医疗系统 ACE 醫療系統 - - Medical Settings [ACE] - Настройки медицины [ACE] - Ustawienia medyczne - Ajustes médicos [ACE] - Sanitätseinstellungen [ACE] - Lékařské nastavení [ACE] - Ajustes médicos [ACE] - Options médicales [ACE] - Orvosi beállítások [ACE] - Impostazioni Mediche [ACE] - 医療設定 [ACE] - 의료 설정 [ACE] - 医疗设定 [ACE] - 醫療設定 [ACE] - Medical Level Сложность медицины @@ -3838,105 +44,11 @@ Quel niveau de simulation médicale choisissez-vous? Milyen komplex legyen az orvosi szimuláció? Qual'è il livello di simulazione medica? - 治療の再現度 + 治療の再現度は? 의료 시뮬레이션의 수준 选择需要的医疗模拟等级 選擇需要的醫療模擬等級 - - Basic - Базовый - Podstawowy - Básico - Standard - Základní - Básica - Basique - Alap - Basico - ベーシック - 기본 - 基本 - 基本 - - - Advanced - Усложненный - Zaawansowany - Avanzado - Erweitert - Pokročilé - Avançada - Avancé - Fejlett - Avanzato - アドバンスド - 고급 - 进阶 - 進階 - - - Medics setting - Настройки медиков - Poziom medyków - Configuración médica - Sanitätseinstellungen - Úroveň zdravotníků - Configuração médica - Règlage des infirmiers - Orvosok beállítása - Parametri Medici - 治療の設定 - 의료 설정 - 医护兵等级 - 醫護兵等級 - - - What is the level of detail prefered for medics? - Wie hoch soll das Simulationslevel für Sanitäter sein? - Каков уровень подробностей для медиков? - Jaki jest poziom detali medycznych wyświetlanych dla medyków? - ¿Cuál es el nivel de detalle preferido para los médicos? - Jaká úroveň detailů je preferována pro zdravotníky? - Qual o nível de detalhe preferido para os médicos? - Quel niveau de détail voulez-vous pour les infirmiers? - Mi a javasolt részletesség orvosok számára? - Qual'è il livello di dettagli preferito per i medici? - 衛生兵への再現度をどのくらいに設定しますか? - 의무병의 시뮬레이션 정도? - 设定医护兵的预设医疗水平(医疗兵,军医) - 設定醫護兵的預設醫療水平(醫療兵,軍醫) - - - Locations boost training - Místa pro vylepšení zkušeností - Località aumentano addestramento - Örtliche Trainingssteigerung - Ubicación mejora entrenamiento. - Miejsca zwiększają wyszkolenie - Localização melhora treinamento - Le lieu améliore l'efficacité - Места ускоренного обучения - 衛生兵としての能力を与える場所 - 受所在位置影响提升医疗能力 - 受所在位置影響提升醫療能力 - 의료 효과 증가 지역 - - - Boost medic rating in medical vehicles or near medical facilities [untrained becomes medic, medic becomes doctor] - Zlepšit zkušenosti zdravotníka v medickém vozidle nebo poblíž zdravotního zařízení [nezkušení se stane zdravotníkem, zdravotník se stane doktorem] - Aumenta il rating medico in veicoli medici o vicino strutture mediche [non addestrato diventa medico, medico diventa dottore] - Steigert die medizinische Einstufung eines Soldaten in Sanitätsfarhzeugen oder in der Nähe von Sanitätseinrichtungen [untrainiert wird zu Sanitäter, Sanitäter zu Doktor] - Mejora el entrenamiento médico dentro de vehículos médicos o cerca de instalaciones médicas (no entrenados se convierten en médicos, médicos se convierten en doctores) - Zwiększa poziom wyszkolenia medyków wewnątrz pojazdów medycznych lub w pobliżu budynków medycznych [niedoświadczony zostaje medykiem, medyk zostaje doktorem] - Aumenta a classificação do médico dentro de veículos médicos ou perto de instalações médicas [sem treinamento vira médico, médico vira doutor] - Améliore l'efficacité des soins dans les véhicules ou structures de soins [non formés deviennent médecins, médecins deviennent docteurs] - Улучшает медицинскую подготовку в мед. транспорте и около мед. строений [нетренированные становятся медиками, медики становятся врачами] - 医療車両や医療施設の近くは衛生兵としての能力を与える場所となり、衛生兵の訓練を受けていないのに衛生兵としてなる (未訓練は衛生兵に、衛生兵は医師に) - 의무병의 수준이 주변의 차량이나 의료시설에 따라 증가합니다. [비교육자가 의무병이되고, 의무병이 의사가 됩니다] - 当人员在医疗载具或是医护设施旁进行医疗时,该员医疗能力将会有所提升 (未受训人员提升为医疗兵,医疗兵提升为军医) - 當人員在醫療載具或是醫護設施旁進行醫療時,該員醫療能力將會有所提升 (未受訓人員提升為醫療兵,醫療兵提升為軍醫) - Disable medics Отключить медиков @@ -3976,7 +88,7 @@ Activar los restos médicos que se crean en el tratamiento Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde Vytváří odpad zdravotnického materiálu pří léčení - Ativar lixo a ser criado após tratamento + Ativar lixo ser criado após tratamento Activer la création de détrimus au début des traitements Engedélyezi a szemét keletkezését ellátáskor Abilita la creazione della barella dopo trattamento @@ -3992,7 +104,7 @@ Tiempo de vida de los restos médicos Dauer des angezeigten Abfalls Životnost pro odpadky - Tempo de vida do lixo médico + Tempo de vida dos objetos do lixo Durée d'affichage des détritus Szemétobjektumok élettartama Tempo di vita delle barelle @@ -4008,7 +120,7 @@ ¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre. Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. - Quanto tempo o lixo médico deve permanecer? Em segundos. -1 é para sempre. + Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre. Combien de temps doivent rester affiché les détritus? En secondes. -1 pour tout le temps Milyen sokáig legyenek jelen a szemétobjektumok (másodpercben)? A -1 végtelen időt jelent. Per quanto devono restare le barelle? In secondi. -1 è permanente @@ -4017,134 +129,6 @@ 定义医疗废弃物存在时间,以秒为单位,-1为永远存在。 定義醫療廢棄物存在時間,以秒為單位,-1為永遠存在。 - - Enable Screams - Включить крики - Aktywuj wrzaski - Activar gritos - Schreie aktivieren - Povolit křik - Ativar gritos - Activer les hurlements - Kiáltások engedélyezése - Abilita Grida - 叫びを有効化 - 비명 활성화 - 启用尖叫 - 啟用尖叫 - - - Enable screaming by injured units - Включить крики раненных бойцов - Aktywuj wrzeszczenie z bólu przez ranne jednostki - Activar gritos para unidades heridas - Aktiviere Schreie bei verletzten Einheiten - Povolit křičení zraněných jednotek - Ativa gritos para unidades feridas - Active les hurlements d'unités blessées - Engedélyezi a sérült egységek kiáltásait - Abilita Grida da parte delle unità ferite - 負傷したユニットが叫ぶように - 부상당한 인원이 소리지르는것을 활성화합니다 - 启用伤者的尖叫声 - 啟用傷者的尖叫聲 - - - Player Damage - Урон игроку - Próg obrażeń graczy - Daño de jugador - Spielerschaden - Poškození hráče - Dano do jogador - Dégats du joueur - Játékos sérülés - Danno Giocatore - プレイヤーへの損傷 - 플레이어 부상 - 玩家伤害 - 玩家傷害 - - - What is the damage a player can take before being killed? - Какой уровень урона необходим, чтобы убить игрока? - Jaki jest próg obrażeń, jakie gracz może otrzymać zanim zostanie zabity? - ¿Cuál es el daño que un jugador puede sufrir antes de morir? - Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird? - Jaké poškození může hráč dostat než bude zabit? - Qual é o dano que um jogador pode sofrer antes de morrer? - Quels dégâts peut subir un joueur avant d'être tué - Mennyi sérülést szenvedhet el egy játékos, mielőtt meghal? - Quanto è il danno che un giocatore può sostenere prima di essere ucciso? - プレイヤーが死に始める前に損傷を受けるようにしますか? - 얼마정도의 부상을 플레이어가 죽기 전까지 버틸 수 있습니까? - 玩家死亡前所能承受的伤害程度 - 玩家死亡前所能承受的傷害程度 - - - AI Damage - Урон ботам - Próg obrażeń AI - Daño IA - KI-Schaden - Poškození AI - Dano da IA - Dégâts des IA - AI sérülés - Danno AI - AI への損傷 - 인공지능 부상 - AI伤害 - AI傷害 - - - What is the damage an AI can take before being killed? - Какой уровень урона необходим, чтобы убить бота? - Jaki jest próg obrażeń, jakie AI może otrzymać zanim zostanie zabite? - ¿Cuál es el daño que la IA puede sufrir antes de morir? - Wie viel Schaden kann eine KI erleiden, bis sie getötet wird? - Jaké poškození může AI dostat než bude zabito? - Qual é o dano que uma IA pode sofrer antes de morrer? - Quels dégâts peut subir une IA avant d'être tuée - Mennyi sérülést szenvedhet el egy AI, mielőtt meghal? - Quanto è il danno che un'IA può sostenere prima di essere uccisa? - AI が死に始める前に損傷を受けるようにしますか? - 얼마정도의 부상을 인공지능이 죽기 전까지 버틸 수 있습니까? - AI 死亡前所能承受的伤害程度 - AI 死亡前所能承受的傷害程度 - - - AI Unconsciousness - Потеря сознания ботами - Nieprzytomność AI - Inconsciencia IA - KI-Bewusstlosigkeit - Bezvědomí AI - Inconsciência da IA - Inconscience des IA - AI eszméletlenség - Incoscienza IA - AI の気絶 - 인공지능 기절 - AI无意识 - AI無意識 - - - Allow AI to go unconscious - Позволить ботам терять сознание - Czy AI może być nieprzytomne od odniesionych obrażeń? - Permita a la IA caer inconsciente - KI kann bewusstlos werden - Umožňuje AI upadnout do bezvědomí - Permite IA ficar inconsciente - Autoriser les IA à tomber inconscients - Engedélyezi az AI eszméletének elvesztését - Permetti alle IA di diventare incoscienti - AI が気絶をするように - 인공지능도 기절에 빠지게 합니다 - 允许AI进入无意识状态 - 允許AI進入無意識狀態 - Remote Controlled AI Ferngesteuerte KI-Einheiten @@ -4200,7 +184,7 @@ Mover una unidad a inconsciente en vez de a muerta Lässt eine Einheit bewusstlos werden anstatt zu sterben Jednotka upadne do bezvědomí namísto smrti - Fazer a unidade ficar inconsciente ao invés de morrer + Fazer a unidade ficar inconsciente invés de morrer Forcer l'inconscience au lieu de la mort instantanée Egy egység kerüljön eszméletlen állapotba a halott helyett Imposta un'unità come incosciente invece di morta @@ -4209,102 +193,6 @@ 伤者最严重只会立即进入昏迷,而非立即死亡 傷者最嚴重只會立即進入昏迷,而非立即死亡 - - Bleeding coefficient - Коэффициент кровопотери - Mnożnik krwawienia - Coeficiente de sangrado - Verblutungsmultiplikator - Koeficient krvácení - Coeficiente de sangramento - Coéfficient de saignement - Vérzési koefficiens - Coefficiente sanguinamento - 出血の係数 - 출혈 계수 - 流血系数 - 流血係數 - - - Coefficient to modify the bleeding speed - Коэффициент, изменяющий скорость потери крови - Mnożnik modyfikujący prędkość wykrwawiania się - Coeficiente para modificar la velocidad de sangrado - Multiplikator um die Verblutungsgeschwindigkeit zu verändern - Koeficient rychlosti krvácení - Coeficiente para modificar a velocidade do sangramento - Modifie le débit des saignements - Egy szorzó a vérzés sebességének szabályozására - Coefficiente che modifica la velocità di sanguinamento - この係数では出血速度を変更できます - 출혈의 속도를 계수만큼 변경합니다 - 修改流血速度 - 修改流血速度 - - - Pain coefficient - Коэффициент боли - Mnożnik bólu - Coeficiente de dolor - Schmerzmultiplikator - Koeficient bolesti - Coeficiente de dor - Coéfficient de douleur - Fájdalmi koefficiens - Coefficiente dolore - 痛みの係数 - 고통 계수 - 疼痛系数 - 疼痛係數 - - - Coefficient to modify the pain intensity - Коэффициент, изменяющий уровень боли - Mnożnik modyfikujący intensywność bólu - Coeficiente para modificar la intensidad del dolor - Multiplikator um die Schmerzintensität zu verändern - Koeficient intenzity bolesti - Coeficiente para modificar a instensidade de dor - Modifie l'intensité de la douleur - Egy szorzó a fájdalom erősségének szabályozására - Coefficiente che modifica l'intensità del dolore - この係数では痛みの強さを変更できます - 고통의 정도를 계수만큼 변경합니다 - 修改疼痛强度的系数 - 修改疼痛強度的係數 - - - Sync status - Синхронизация статуса - Synchronizuj status - Sincronizador estado - Status synchronisieren - Synchronizovat status - Sincronizar estado - Synchronisation du status - Szinkronizációs állapot - Sincronizza stato - 同期状態 - 상태 동기화 - 同步状态 - 同步狀態 - - - Keep unit status synced. Recommended on. - Синхронизировать статус юнитов. Рекомендуется включить. - Utrzymuj synchronizację statusu jednostek. Zalecane zostawienie tej opcji włączonej. - Mantener el estado de la unidad sincronizado. Recomendado activado - Status der Einheit synchron halten. Sollte aktiviert bleiben. - Udržuje status jednotky synchronizovaný. Doporučeno zapnout. - Mater o estado da unidade sincronizado. Recomendado ativado. - Garder l'unité synchronisée. Activation recommandée. - Egységállapotok szinkronizálása. Javasolt a bekapcsolása. - Mantieni lo stato delle unità sincronizzato. Consigliato attivo. - ユニット状態の同期を続けます。有効化を推奨。 - 인원의 상태를 동기화합니다. 켜기를 권장합니다. - 保持单位状态同步,建议启用! - 保持單位狀態同步,建議啟用! - Provides a medical system for both players and AI. Включает медицинскую систему как для игроков, так и для ботов. @@ -4318,8 +206,8 @@ Fornisce un sistema medico sia per giocatori che IA. プレイヤーと AI の両方へ医療システムを提供します。 의료 시스템을 플레이어 및 인공지능에게 제공합니다. - 医疗系统将同时对玩家与AI发生作用。 - 醫療系統將同時對玩家與AI發生作用。 + 医疗系统将同时对玩家与AI发生作用 + 醫療系統將同時對玩家與AI發生作用 Basic Medical Settings [ACE] @@ -4336,23 +224,7 @@ 基本医疗设定 [ACE] 基本醫療設定 [ACE] - - Advanced Medical Settings [ACE] - Настройки усложненной медицины [ACE] - Zaawansowane ustawienia medyczne - Ajustes médicos avanzados [ACE] - Erweiterte Sanitätseinstellungen [ACE] - Pokročilé zdravotnické nastavení [ACE] - Ajustes médicos avançados [ACE] - Paramètres des soins avancés - Fejlett orvosi beállítások [ACE] - Impostazioni Mediche Avanzate [ACE] - アドバンスド医療設定 [ACE] - 고급 의료 설정 [ACE] - 进阶医疗设定 [ACE] - 進階醫療設定 [ACE] - - + Enabled for Включено для Aktywne dla @@ -4368,7 +240,7 @@ 被启用给 被啟用給 - + Select what units the advanced medical system will be enabled for Выберите, на кого будет распространяться усложненная система медицины Wybierz dla kogo zaawansowany system medyczny będzie aktywny @@ -4392,7 +264,7 @@ Nur Spieler Pouze hráči Somente jogadores - Joueurs uniquement + Joueur uniquement Csak játékosok Solo giocatori プレイヤーのみ @@ -4416,46 +288,14 @@ 玩家与AI 玩家與AI - - Enable Advanced wounds - Усложненные раны - Aktywuj zaawansowane rany - Activa heridas avanzadas - Aktiviere erweiterte Wunden - Povolit pokročilé zranění - Ativar ferimentos avançados - Activer les plaies compliquées - Komplex sebek engedélyezése - Abilita ferite Avanzate - アドバンスドな傷を有効化 - 고급 부상 활성화 - 启用进阶伤口系统 - 啟用進階傷口系統 - - - Allow reopening of bandaged wounds? - Будут ли открываться уже перевязанные раны? - Pozwól na otwieranie się zabandażowanych ran? - Permitir la reapertura de las heridas vendadas? - Erlaube das Öffnen von bandagierten Wunden? - Umožnit znovuotevření zavázané rány? - Permitr reabertura de ferimentos enfaixados? - Les plaies peuvent se rouvrir - Visszanyílhatnak a bekötözött sebek? - Permetti la riapertura di ferite bendate? - 包帯で巻かれた傷を再び開くようにしますか? - 붕대가 풀리는것을 활성화합니까? - 启用进阶伤口系统会使已被包扎的伤口有机率裂开 - 啟用進階傷口系統會使已被包紮的傷口有機率裂開 - - + Vehicle Crashes Аварии транспорта Obrażenia od kolizji Accidentes de vehículos Fahrzeugunfälle Poškození z kolize - Colisão de veículos + Batidas de veículos Accident en véhicule Járműbalesetek Schianto Veicoli @@ -4464,14 +304,14 @@ 载具碰撞 載具碰撞 - + Do units take damage from a vehicle crash? Должны ли юниты получать повреждения от аварий на транспорте? Czy jednostki otrzymują obrażenia w wyniku kolizji pojazdów? ¿Las unidades reciben daño de un accidente de tráfico? Verursacht ein Fahrzeugunfall Verletzungen Dostane jednotka poškození při autonehodě? - As unidades recebem dano de uma colisão de veículo? + As unidades recebem dano de uma batida de veículo? Les unités subissent des dégats lors d'accident Sérülnek-e az egységek autós ütközés során? Le unità sostengono danni da incidenti con veicoli? @@ -4480,163 +320,6 @@ 设定人员是否会因为载具冲撞别的物件而产生伤害? 設定人員是否會因為載具衝撞別的物件而產生傷害? - - Allow Epinephrine - Erlaube Epiniphrin - Permitir Epinefrina - Ograniczenia adrenaliny - Activer l'épinéphrine - Permette epinefrina - Povolit adrenalin - Permitir epinefrina - Разрешить Адреналин - アドレナリンの許可 - 에피네프린 활성화 - 允许使用肾上腺素 - 允許使用腎上腺素 - - - Who can use Epinephrine for full heal? (Basic medical only) - Wer darf Epiniphrin zur vollständigen Heilung benutzen? (Standard Sanitätseinstellungen) - Configura quienes pueden usar Epinefrina (Solo sistema médico básico) - Kto może skorzystać z adrenaliny w celu pełnego uleczenia? (Tylko podstawowy system medyczny) - Qui peut utiliser l'adrénaline pour les soins complets ? (Médical basique seulement) - Chi può usare l'epinefrina per la cura completa? (solo per sistema medico di base) - Kdo může použít adrenalin k úplnému vyléčení? (Pouze základní zdravotní systém) - Quem pode usar epinefrina para cura completa? (Somente sistema médico básico) - Кому разрешено использовать адреналин для полного излечения? (Только для базовой медицины) - 完全に回復できるよう誰しもがアドレナリンを使えるようにしますか? (ベーシック医療のみ) - 완전한 체력회복을 위해 어느 인원이 에피네프린을 쓸 수 있습니까? (기본 의료 전용) - 谁可以使用肾上腺素完整医治? (仅适用于基本医疗) - 誰可以使用腎上腺素完整醫治? (僅適用於基本醫療) - - - Allow PAK - Использование аптечки - Ustawienie apteczek osobistych - Permitir EPA - Erlaube Erste-Hilfe-Set - Povolit osobní lékárničky (PAK) - Permitir Kit de Primeiros Socorros - Activer la trousse sanitaire - Elsősegélycsomag engedélyezése - Consenti Kit di Pronto Soccorso - 応急処置キットの許可 - 개인응급키트 활성화 - 允许使用个人急救包 - 允許使用個人急救包 - - - Who can use the PAK for full heal? - Кому разрешено выполнять полное лечение с помощью аптечки? - Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? - ¿Quién puede utilizar el EPA para una cura completa? - Wer kann das Erste-Hilfe-Set für eine Endheilung verwenden? - Kdo může použít osobní lékárničku pro plné vyléčení? - Quem pode usar o KPS para cura completa? - Qui peut utilier la trousse sanitaire pour des soins complets? - Ki használhatja az elsősegélycsomagot teljes gyógyításra? - Chi può usare il KPS per cura completa? - 完全に回復できるよう誰しもが応急処置キットを使えるようにしますか? - 완전한 체력회복을 위해 어느 인원이 개인응급키트을 쓸 수 있습니까? (기본 의료 전용) - 谁能够使用个人急救包来达到完整医疗? - 誰能夠使用個人急救包來達到完整醫療? - - - Anyone - Кем угодно - Wszyscy - Nadie - Jeder - Kdokoliv - Qualquer um - Tous - Akárki - Chiunque - だれでも - 모두 - 任何人 - 任何人 - - - Medics only - Только медиками - Tylko medycy - Solo médicos - Nur Sanitäter - Pouze zdravotník - Somente médicos - Infirmiers uniquement - Csak orvosok - Solo medici - 衛生兵のみ - 의무병만 - 只限医疗兵 - 只限醫療兵 - - - Doctors only - Только врачами - Tylko doktorzy - Solo doctores - Nur Ärzte - Pouze doktor - Somente doutores - Médecins uniquement - Csak doktorok - Solo dottori - 医師のみ - 의사만 - 只限军医 - 只限軍醫 - - - Remove PAK on use - Удалять аптечки после использования - Usuń apteczkę po użyciu - Eliminar EPA después del uso - Entf. Erste-Hilfe-Set bei Verwendung - Odebrat osobní lékárničku po použití - Remover o KPS após uso - Utilisation unique de la trousse sanitaire - Elsősegélycsomag eltávolítása használatkor - Rimuovi Kit Pronto Soccorso dopo l'uso - 応急処置キットの削除 - 개인응급키트 사용후 사라짐 - 在使用后删除个人急救包 - 在使用後刪除個人急救包 - - - Should PAK be removed on usage? - Нужно ли удалять аптечки после использования? - Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? - El EPA será eliminado después de usarlo - Sollen Erste-Hilfe-Sets bei Verwendung entfernt werden? - Má se osobní lékárnička odstranit po použití? - Deve o KPS ser removido após seu uso? - La trousse sanitaire doit être consommée à l'utilisation? - Eltávolítódjon az elsősegélycsomag használatkor? - Il Kit Pronto Soccorso dev'essere rimosso dopo l'utilizzo? - 応急処置キットを使うと削除しますか? - 개인응급키트를 사용하고 나서 제거합니까? - 要在使用后删除个人急救包吗? - 要在使用後刪除個人急救包嗎? - - - Locations Epinephrine - Orte für Epiniphrin - Ubicaciones epinefrina - Ograniczenia adrenaliny - Utilisation de l'épinéphrine - Ubicazione epinefrina - Oblast k použití adrenalinu - Localizações de epinefrina - Место использования адреналина - アドレナリンをつかう場所 - 에피네프린 사용 장소 - 肾上腺素使用地点 - 腎上腺素使用地點 - Where can the Epinephrine be used? (Basic Medical) Wo kann Epiniphrin verwendet werden? (Standard Sanitätseinstellungen) @@ -4645,276 +328,20 @@ Où peut être utilisé l'épinéphrine ? (Médical basique) Dove si può usare l'epinefrina? (Sistema medico di base) Kde může být použit adrenalin? (Pouze základní zdravotní systém) - Onde pode-se usar a epinefrina? (Somente sistema médico básico) + Onde pode-se usar a Epinefrina? (Somente sistema médico básico) Где может использоваться адреналин? (Базовая медицина) どこでもアドレナリンを使えるようにしますか? (ベーシック医療のみ) 어디에서 에피네프린을 사용할 수 있습니까? (기본 의료) 在哪里可以使用肾上腺素? (基本医疗) 在哪裡可以使用腎上腺素? (基本醫療) - - Locations PAK - Место использования аптечки - Ograniczenie apteczek osobistych - Ubicaciones del EPA - Orte für Erste-Hilfe-Set - Oblast k použití PAK - Localizações do KPS - Lieu d'utilisation da trousse sanitaire - Elsősegélycsomag helyek - Locazioni Kit Pronto Soccorso - 応急処置キットを使う場所 - 개인응급키트 사용 장소 - 个人急救包使用地点 - 個人急救包使用地點 - - - Where can the PAK be used? - Где может использоваться аптечка? - Gdzie można korzystać z apteczek osobistych? - ¿Dónde se puede utilizar el equipo de primeros auxilios? - Wo kann das Erste-Hilfe-Set verwendet werden? - Kde může být použita osobní lékárnička (PAK)? - Onde o kit de primeiros socorros pode ser utilizado? - Où la trousse sanitaire peut être utilisée ? - Hol lehet az elsősegélycsomagot használni? - Dove può essere usato il Kit Pronto Soccorso? - どこでも応急処置キットを使えるようにしますか? - 어디에서 개인응급키트를 사용할 수 있습니까? - 在哪里可以使用个人急救包? - 在哪裡可以使用個人急救包? - - - Condition PAK - Bedingungen für d. Erste-Hilfe-Set - Podmínky pro použití osobní lékárničky - Condición EPA - Condition d'utilisation de la trousse sanitaire - Warunek apteczek - Elsősegélycsomag állapot - Condição do KPS - Условие использования аптечки - Condizioni Kit Pronto Soccorso - 応急処置キットの状態 - 개인응급키트 상태 - 个人急救包使用条件 - 個人急救包使用條件 - - - When can the PAK be used? - Wann kann das Erste-Hilfe-Set verwendet werden? - Kdy může být použita osobní lékárnička? - ¿Cuando se puede utilizar el Equipo de primeros auxilios? - Quand peut être utilisé la trousse sanitaire? - Po spełnieniu jakich warunków apteczka osobista może zostać zastosowana na pacjencie? - Mikor lehet az elsősegélycsomagot használni? - Onde o kit de primeiros socorros pode ser utilizado? - Когда может использоваться аптечка? - Quando può essere usato il Kit Pronto Soccorso? - どこでも応急処置キットを使えるようにしますか? - 언제 개인응급키트를 사용할 수 있습니까? - 何时可以使用个人急救包? - 何時可以使用個人急救包? - - - Anywhere - Где угодно - Wszędzie - Donde sea - Überall - Kdekoliv - Qualquer lugar - Partout - Akárhol - Ovunque - どこでも - 어디서나 - 任何地方 - 任何地方 - - - Medical vehicles - В медицинском транспорте - Pojazdy medyczne - Vehiculos médicos - Sanitätsfahrzeuge - Zdravotnická vozidla - Veículos médicos - Dans les véhicules sanitaires - Orvosi járművek - Veicoli medici - 医療車両のみ - 의료차량 - 医疗载具 - 醫療載具 - - - Medical facility - В госпитале - Budynki medyczne - Centro médico - Medizinische Einrichtungen - Zdravotnické zařízení - Instalação médica - Dans les structures sanitaires - Orvosi létesítmény - Strutture mediche - 医療施設でのみ - 의료시설 - 医疗设施 - 醫療設施 - - - Vehicles & facility - В транспорте и госпитале - Pojazdy i budynki medyczne - Vehículos y centros - Fahrzeuge & Einrichtungen - Vozidla a zařízení - Veículos e instalações - Dans les véhicules et les structures sanitaires - Járművek & létesítmény - Veicoli e Strutture - 車両 & 施設 - 차량 및 시설 - 医疗载具 & 医疗设施 - 醫療載具 & 醫療設施 - - - Allow Surgical Kit (Adv) - Хирургический набор может использоваться (усл.) - Ustawienia zestawu chirurgicznego - Permitir equipo quirúrgico (Avanzado) - Erlaube Operationskasten - Povolit chirurgickou soupravu (Pokr.) - Permite kit cirúrgico (avançado) - Permettre les trousses chirurgicales (Avancé) - Sebészkészlet (Fejlett) engedélyezése - Permetti Kit Chirurgico (Avanzato) - 縫合キットの許可 (アド) - 봉합키트 활성화 (고급) - 允许使用手术包 (进阶伤口) - 允許使用手術包 (進階傷口) - - - Who can use the Surgical Kit? - Кто может использовать хирургический набор? - Kto może skorzystać z zestawu chirurgicznego w celu zszycia ran? - ¿Quién puede utilizar el equipo quirúrgico? - Wer kann den Operationskasten verwenden? - Kdo může použít chirurgickou soupravu? - Quem pode usar o kit cirúrgico? - Qui peut utiliser les trousses chirurgicales? - Ki használhatja a sebészkészletet? - Chi può usare il Kit Chirurgico? - だれでも縫合キットを使えるようにしますか? - 어느 인원이 봉합키트를 사용할 수 있습니까? - 谁能够使用手术包? - 誰能夠使用手術包? - - - Remove Surgical Kit (Adv) - Удалять хирургический набор (усл.) - Usuń zestaw chirurgiczny po użyciu - Eliminar equipo quirúrgico (Avanzado) - Entferne Operationskasten (erweitert) - Odebrat chirurgickou soupravu (Pokr.) - Remover kit cirúrgico (avançado) - Consommer les trousses chirurgicales (Av.) - Sebészkészlet (Fejlett) eltávolítása - Rimuovi Kit Chirurgico (Avanzato) - 縫合キットを削除 (アド) - 봉합키트 제거 (고급) - 在使用后删除手术包 (进阶伤口) - 在使用後刪除手術包 (進階傷口) - - - Should Surgical kit be removed on usage? - Нужно ли удалять хирургический набор после использования? - Czy zestaw chirurgiczny powinien zniknąć z ekwipunku po jego użyciu? - Eliminar el equipo quirúrgico después del uso - Entferne Operationskästen bei Verwendung? - Odebrat chirurgickou soupravu po použití? - Deve o kit cirúrgico ser removido após seu uso? - La trousse chirurgicale doit être consommée à l'utilisation? - Eltávolítódjon a sebészkészlet használatkor? - Il Kit Chirurgico dev'essere rimosso dopo l'uso? - 縫合キットを使った後に削除しますか? - 봉합키트를 사용하고 나서 제거합니까? - 手术包会在使用后被删除吗? - 手術包會在使用後被刪除嗎? - - - Locations Surgical Kit (Adv) - Место использования хирургического набора (усл.) - Ograniczenie zestawu chirurgicznego - Ubicaciones del equipo quirúrgico (Avanzado) - Orte für Operationskästen (erweitert) - Lokace chirurgické soupravy (Pokr.) - Localizações do kit cirúrgico (avançado) - Lieu d'utilisation des trousses chirurgicales - Sebészkészlet (Fejlett) helyei - Località Kit Chirurgico (Avanzato) - 縫合キットをつかう場所 (アド) - 봉합키트 사용 장소 (고급) - 手术包使用地点 (进阶伤口) - 手術包使用地點 (進階傷口) - - - Where can the Surgical Kit be used? - Где может использоваться хирургический набор? - Gdzie można korzystać z zestawu chirurgicznego? - Dónde se puede utilizar el equipo quirúrgico - Wo kann der Operationskasten verwendet werden? - Kde může být použita chirurgická souprava? - Onde o kit cirúrgico pode ser utilizado? - Où peut être utilisé les trousses chirurgicales? - Hol lehet a sebészkészletet használni? - Dove può essere usato il Kit Chirurgico? - どこでも縫合キットを使えるようにしますか? - 어디에서 봉합키트를 사용할 수 있게 합니까? - 定义手术包可被使用的地方? - 定義手術包可被使用的地方? - - - Condition Surgical Kit (Adv) - Beding. für d. Operationskasten (erw.) - Podmínka chirurgické soupravy (Pokr.) - Condición de equipo quirúrgico (Av) - Conditions d'utilisation de la trousse chirurgicale (Av.) - Warunek zestawu chirurgicznego - Sebészkészlet állapot - Condição do Kit Cirúrgico (Avançado) - Условие использования хирургического набора (усл.) - Condizioni Kit Chirurgico (Avanzato) - 縫合キットの状態 (アド) - 봉합키트 상태 (고급) - 使用手术包的条件 (进阶伤口) - 使用手術包的條件 (進階傷口) - - - When can the Surgical Kit be used? - Wann kann der Operationskasten verwendet werden? - Kde může být použita chirurgická souprava? - ¿Cuando se puede utilizar el equipo quirúrgico? - Quand peut être utilisé la trousse chirurgicale - Po spełnieniu jakich warunków zestaw chirurgiczny może zostać zastosowany na pacjencie? - Mikor lehet a sebészkészletet használni? - Onde o kit cirúrgico pode ser utilizado? - Когда может использоваться хирургический набор? - Quando può essere usato il Kit Chirurgico? - いつでも縫合キットを使えるようにしますか? - 언제 봉합키트를 사용할 수 있습니까? - 何时可以使用手术工具包? - 何時可以使用手術工具包? - - + Heal hitpoints Heile Trefferpunkte Lecz hitpointy Curar puntos de vida Исцелять части тела - Curar pontos de vida + Curar hitpoints Léčit hitponty Cura Hitpoints Soigner les blessures @@ -4923,52 +350,18 @@ 完整治疗 完整治療 - + Heal fully bandaged hitpoints Heile verbundene Trefferpunkte Po bandażowaniu ulecz hitpointy, usuwając z nich ślady krwi i przywracając im pełną sprawność. Curar miembros totalmente vendados Исцелять полностью перебинтованные части тела - Curar totalmente pontos de vida enfaixados + Curar totalmente hitpoints enfaixados Heal fully bandaged hitpoints Cura Hitpoints completamente bendati Soigner les plaies entièrement bandées. 包帯によりヒットポイントを完全に回復する 붕대를 감아서 체력을 회복 - 完全医疗包扎的部位至痊愈 - 完全醫療包紮的部位至痊癒 - - - Pain suppression - Schmerzunterdrückung - Zwalczanie bólu - Potlačení bolesti - Supresión del dolor - Supressão de dor - Traitement de la douleur - Fájdalomcsillapítás - Приглушение боли - Soppressione dolore - 痛みの継続 - 고통 억제 - 疼痛抑制 - 疼痛抑制 - - - Pain is only temporarily suppressed, not removed - Schmerzen werden nur vorübergehend unterdrückt, nicht deren Ursache geheilt. - Ból jest tylko tymczasowo zwalczany, nie jest usuwany trwale - Bolest je potlačena, ale jen dočastně - El dolor se suprime solo temporalmente, no se elimina. - Dor é somente temporariamente suprimida, não removida - La douleur est seulement temporairement calmée - A fájdalom csak ideiglenesen csökken, nem távolítódik el - Боль приглушается только временно - Dolore è solo temporaneamente soppresso, non rimosso - 痛みを一時的に継続させ、取り除かない - 고통은 제거가 아닌 일시적으로 억제만 가능합니다. - 疼痛只会被暂时抑制,而不能完全消除 - 疼痛只會被暫時抑制,而不能完全消除 Configure the treatment settings from ACE Basic Medical @@ -4984,502 +377,6 @@ 设定ACE基本医疗的规则 設定ACE基本醫療的規則 - - Configure the treatment settings from ACE Advanced Medical - Настройка лечения в усложненной медицинской системе ACE - Skonfiguruj zaawansowane ustawienia leczenia systemu medycznego ACE - Configure las opciones de tratamiento del sistema médico avanzado de ACE - Behandlungseinstellungen vom ACE-Medizin konfigurieren - Konfigurace nastavení léčby ze zdravotnické systému ACE - Configure as opções de tratamento do ACE Médico - Configure les réglages de traitement dans dans ACE médical avancé - Kezelési lehetőségek konfigurálása az ACE Orvosi rendszerből - Configura le impostazioni trattamenti per ACE Medical - ACE アドバンスド医療による設定で、治療を設定する - ACE 고급 의료에 대한 치료 설정 수정 - 设定ACE进阶医疗的规则 - 設定ACE進階醫療的規則 - - - Revive Settings [ACE] - Настройки реанимации [ACE] - Ustawienia wskrzeszania - Sistema de resucitado [ACE] - Wiederbelebungseinstellungen [ACE] - Nastavení oživení [ACE] - Sistema de reavivamento [ACE] - Paramètre du revive [ACE] - Újraélesztés beállításai [ACE] - Impostazioni Revive [ACE] - 蘇生設定 [ACE] - 소생 설정 [ACE] - 复苏设定 [ACE] - 復甦設定 [ACE] - - - Enable Revive - Включить реанимацию - Aktywuj wskrzeszanie - Habilitar resucitado - Erlaube Wiederbelebung - Povolit oživení - Habilitar reavivamento - Activer le revive - Újraélesztés engedélyezése - Abilita Revive - 蘇生を有効化 - 소생 활성화 - 启用复苏 - 啟用復甦 - - - Enable a basic revive system - Включить базовую систему реанимации - Aktywuj podstawowy system wskrzeszania - Habilitar un sistema básico de resucitado - Aktiviere Standard-Wiederbelebungssystem - Povolit základní systém oživení - Habilitar um sistema básico de reavivamento - Active un système de revive basique - Egy alap újraélesztési rendszer engedélyezése - Abilita un sistema revive basico - ベーシックな蘇生を有効化 - 기본 소생 시스템 활성화 - 启用基本复苏系统 - 啟用基本復甦系統 - - - Max Revive time - Макс. время реанимации - Maksymalny czas agonii - Tiempo máximo de resucitado - Maximale Wiederbelebungszeit - Maximální čas pro oživení - Tempo máximo de reavivamento - Délai maximum pour le revive - Maximum újraélesztési idő - Tempo massimo Revive - 最大蘇生待機時間 - 최대 소생 시간 - 最大复苏时间 - 最大復甦時間 - - - Max amount of seconds a unit can spend in revive state - Максимальное время в секундах, в течение которого бойца можно реанимировать - Maksymalna długość agonii w sekundach (czas na wskrzeszenie) - Cantidad máxima de segundos que una unidad puede gastar en estado de resucitación - Maximale Zeitspanne in Sekunden die eine Einheit im Wiederbelebungszustand verbringen kann - Maximální doba v agónii v sekundách - Quantidade máxima de segundos que uma unidade pode gastar em um estado de reavivamento - Délai d'attente maximum pour un revive - Maximum másodperc, amit egy egység újraélesztési állapotban tölthet - Numero massimo di secondi che un'unità può spendere in stato revive - ユニットが蘇生待機状態になっている時の最大時間を設定できます - 소생상태에서 인원이 버틸 수 있는 최대 시간을 초 단위로 정합니다 - 人员在等待复苏状态下能够等待的最大时间(秒) - 人員在等待復甦狀態下能夠等待的最大時間(秒) - - - Max Revive lives - Макс. кол-во жизней - Maks. ilość wskrzeszeń - Vidas máximas de resucitado - Maximale Anzahl der Wiederbelebungen - Maximální počet oživení - Vidas máximas do reavivado - Nombre maximum de revive - Maximum újraélesztési lehetőségek - Numero massimo Revives - 最大蘇生数 - 최대 소생 횟수 - 最大被救活次数 - 最大被救活次數 - - - Max amount of lives a unit. 0 or -1 is disabled. - Максимальное количество жизней у бойца. Чтобы отключить, укажите 0 или -1. - Maksymalna ilość wskrzeszeń. Wpisz 0 lub -1 aby wyłączyć. - Cantidad máxima de vidas por unidad. 0 o -1 es desactivado. - Anzahl der Leben einer Einheit. 0 oder -1 bedeutet deaktiviert. - Maximální počet životu pro jednotku. 0 nebo -1 je zakázáno. - Quantidade máxima de vidas por unidade. 0 ou -1 é desativado. - Nombre de vie maximum d'une unité. 0 ou -1 désactive - Egy egység maximum "életei". 0 vagy -1 letiltja. - Numero massimo di vite di un'unità. 0 o -1 per disabilitare. - ユニットの最大蘇生数を設定できます。0 または -1 は無効化になります - 소생 가능한 횟수입니다. 0 혹은 -1 로 비활성화 합니다 - 一个人员最大可被救活次数,0或-1为关闭 (无限救活) - 一個人員最大可被救活次數,0或-1為關閉 (無限救活) - - - Provides a medical system for both players and AI. - Включает медицинскую систему как для игроков, так и для ботов. - Moduł ten aktywuje podstawowy system wskrzeszania. Jednostka po otrzymaniu śmiertelnych obrażeń przechodzi do stanu agonii, która trwa określoną długość czasu. W tym czasie aby wskrzesić i jednocześnie odratować jednostkę należy opatrzeć jej rany i wykonać RKO. - Proporciona un sistema médico para jugadores e IA. - Aktiviert das Sanitätssystem für Spieler und KI. - Poskytuje zdravotní systém pro hráče a AI. - Proporciona um sistema médico para jogadores e IA. - Fourni un sytème médical pour les joueurs et les IA. - Egy orvosi rendszert ad játékosok és AI-k számára. - Fornisce un sistema medico sia per giocatori che IA - プレイヤーと AI の両方へ医療システムを提供します。 - 플레이어와 인공지능 모두에게 의료 시스템을 지원합니다. - 医疗系统将同时作用在玩家与AI - 醫療系統將同時作用在玩家與AI - - - Set Medic Class [ACE] - Сделать медиком [ACE] - Ustaw klasę medyka - Establecer case médica [ACE] - Setze Sanitäterklassen [ACE] - Určit třídu medika [ACE] - Definir classe médica [ACE] - Définir classe médicale [ACE] - Orvos beállítása [ACE] - Imposta Classe Medico [ACE] - 衛生兵クラスとして設定 [ACE] - 의무병 보직 설정 [ACE] - 设定医疗兵单位 [ACE] - 設定醫療兵單位 [ACE] - - - List - Список - Lista - Lista - Liste - Seznam - Lista - Liste - Lista - Lista - 一覧 - 목록 - 列表 - 列表 - - - List of unit names that will be classified as medic, separated by commas. - Список имен юнитов, которые будут считаться медиками (через запятую). - Lista nazw jednostek, które są sklasyfikowane jako medycy, oddzielone przecinkami. - Lista de los nombres de las unidades que se clasifican como médico, separados por comas. - Aufzählung von Einheiten, die als Sanitäter gelten. Werden durch Kommata getrennt. - Seznam osob které budou klasifikovány jako zdravotník, oddělené čárkami. - Lista dos nomes das unidades que se classificam como médicos, separados por vírgulas. - Liste d'unité qui seront qualifiés comme infirmier, séparation par virgule. - Azon egységek nevei, melyek orvosként vannak meghatározva, vesszővel elválasztva. - Lista di nomi unità che verranno classificati come medici, separati da virgole. - 衛生兵として設定されるユニット名を一覧で指定でき、コンマで区切りを付けられます。 - 보직 이름 목록으로 의무병이 구분됩니다, 쉼표로 구분. - 列出的单位名字将被指派为医疗兵,记得用逗号隔开! - 列出的單位名字將被指派為醫療兵,記得用逗號隔開! - - - Is Medic - Является медиком - Klasa medyczna - Es médico - Ist Sanitäter - Je zdravotník - É médico - Est infirmier - Orvos-e - E' Medico - 衛生兵として - 의무병 - 是医疗兵 - 是醫療兵 - - - This module allows you to assign the medic class to selected units. - Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. - Dieses Modul legt fest, welche Einheiten Sanitäter sind. - Tento modul určuje, která jednotka je zdravotník. - Este módulo determina qual unidade é um paramédico. - Ce module permet d'assigner la classe médicale à une unité sélectionnée - Ez a modul engedélyezi az orvosi jelző hozzárendelését kiválasztott egységekhez. - Этот модуль позволяет назначить класс медика выбранным юнитам. - Este módulo permite asignar la clase médico a las unidades seleccionadas. - Questo modulo ti permette di assegnare la classe Medico alle unità selezionate. - 選択されたユニットを衛生兵として指定します。 - 이 모듈은 선택한 보직이 의무병을 할 수 있게 해줍니다. - 本模块可让被同步的单位成为医疗兵 - 本模塊可讓被同步的單位成為醫療兵 - - - None - Нет - Żadna - Nada - Keine - Žádný - Nada - Aucun - Nincs - Nessuno - なし - 없음 - - - - - Regular medic - Обычный медик - Zwykły medyk - Médico regular - Normaler Sanitäter - Řadový zdravotník - Médico regular - Infirmier - Hagyományos orvos - Medico Regolare - 通常の衛生兵 - 일반 의무병 - 普通医疗兵 - 普通醫療兵 - - - Doctor (Only Advanced Medics) - Врач (только усложн.) - Doktor (tylko zaawansowani medycy) - Doctor (Solo medicina avanzada) - Arzt (Nur erweitertes Sanitätssystem) - Doktor (Pouze pokročilý zdravotníci) - Doutor (Somente médicos avançados) - Médecin (traitements avancés uniquement) - Doktor (csak fejlett orvosok) - Dottore (Solo Medici Avanzati) - 医師 (アドバンスド医療のみ) - 의사 (오직 고급 의료에서만) - 军医 (只限进阶医疗系统) - 軍醫 (只限進階醫療系統) - - - Doctor - Врач - Doktor - Doctor - Arzt - Doktor - Doutor - Médecin - Doktor - Dottore - 医師 - 의사 - 军医 - 軍醫 - - - Assigns the ACE medic class to a unit - Задает юниту класс медика - Moduł ten przypisuje klasę medyka ACE do jednostek. - Asigna la clase médico ACE a una unidad - Weise die ACE-Sanitäterklasse einer Einheit zu. - Přiřadí ACE třídu zdravotníka do jednotky - Atribui a classe médica do ACE a uma unidade - Assigner la classe médicale à une unité - Az ACE orvosi jelző hozzárendelése egy egységhez - Assegna la classe medico ACE ad un'unità - ユニットを ACE の衛生兵として割り当てる - 인원에게 ACE 의무병 보직 선정 - 指派ACE医疗职位给该单位 - 指派ACE醫療職位給該單位 - - - Set Medical Vehicle [ACE] - Сделать мед. транспортом [ACE] - Ustaw pojazd medyczny - Establecer vehículos médicos [ACE] - Setze Sanitätsfahrzeug [ACE] - Určit zdravotnické vozidlo [ACE] - Definir veículo médico [ACE] - Définir comme véhicule médical [ACE] - Orvosi jármű beállítása [ACE] - Imposta Veicolo Medico [ACE] - 医療車両を設定 [ACE] - 의료 차랑 선정 [ACE] - 设定医疗载具 [ACE] - 設定醫療載具 [ACE] - - - List - Список - Lista - Lista - Liste - Seznam - Lista - Liste - Lista - Lista - 一覧 - 목록 - 列表 - 列表 - - - List of vehicles that will be classified as medical vehicle, separated by commas. - Список транспортных средств, которые будут считаться медицинским транспортом (через запятую). - Lista nazw pojazdów, które są sklasyfikowane jako pojazdy medyczne, oddzielone przecinkami. - Lista de los vehículos que se clasifican como vehículo médicos, separados por comas. - Aufzählung von Fahrzeugen, die als Sanitätsfahrzeug gelten. Werden durch Kommata getrennt. - Seznam vozidel které budou klasifikovány jako zdravotnická vozidla, oddělené čárkami. - Lista de veículos que serão classificados como veículos médicos, separados por vírgulas. - Liste de véhicule classé comme véhicule médical, séparation par virgule. - Orvosi járműveknek tekintett járművek listája, vesszővel elválasztva. - Lista di veicoli che verranno classificati come veicoli medici, separati da virgole. - 医療車両として設定されるクラス名を一覧で指定でき、コンマで区切りを付けられます - 차량 명칭 목록으로 의료차량이 구분됩니다, 쉼표로 구분. - 列出的载具将被指定为医疗载具,记得用逗号隔开! - 列出的載具將被指定為醫療載具,記得用逗號隔開! - - - Is Medical Vehicle - Является медицинским транспортом - Jest pojazdem medycznym - Es vehículo médico - Ist medizinisches Fahrzeug - Zdravotnické vozidlo - É um veículo médico - Véhicule médical - Orvosi jármű-e - E' Veicolo Medico - 医療車両として - 의료 차량 - 是医疗载具 - 是醫療載具 - - - Whatever or not the objects in the list will be a medical vehicle. - Будут ли объекты в списке считаться медицинским транспортом. - Czy pojazdy z tej listy są pojazdami medycznymi? - Cualquiera de la lista o fuera de ella será un vehículo médico. - Legt fest, ob das Objekt in der Liste ein Sanitätsfahrzeug ist. - Ať už jsou nebo nejsou objekty v seznamu budou zdravotnická vozidla. - Se serão ou não os objetos dessa lista veículos médicos. - Quoi qu'il arrive les objets de la liste seront des véhicules médical - A listában lévő objektumok orvosi járművek-e, vagy sem. - Gli oggetti nella lista verranno considerati veicoli medici o meno. - どれでも、またはこの一覧にないオブジェクトを医療車両として割り当てる。 - 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. - 列表中的载具将会变成医疗载具 - 列表中的載具將會變成醫療載具 - - - Assigns the ACE medic class to a unit - Задает юниту класс медика - Moduł ten pozwala na przypisanie danym pojazdom statusu pojazdów medycznych. Wewnątrz takiego pojazdu można wykonywać zaawansowane zabiegi medyczne. - Asigna la clase médico ACE a una unidad - Weist die ACE-Sanitäterklasse einer Einheit zu - Přiřadí ACE třídu zdravotníka do jednotky - Atribui a classe médica ACE a uma unidade - Assigne la classe médicale à une unité - Hozzárendeli az ACE orvosi jelzőt egy egységhez - Assegna la classe medico ACE ad un'unità - ユニットを ACE の衛生兵として割り当てる - 指派ACE医疗职位给该单位 - 指派ACE醫療職位給該單位 - 병력에 ACE 의무병 보직 선정 - - - Set Medical Facility [ACE] - Сделать госпиталем [ACE] - Ustaw budynek medyczny - Establece el centro médico [ACE] - Setze medizinische Einrichtung [ACE] - Určit zdravotnické zařízení [ACE] - Definir instalação médica [ACE] - Définir comme installation médical [ACE] - Orvosi létesítmény beállítása [ACE] - Imposta Struttura Medica [ACE] - 医療施設を設定 [ACE] - 의료시설 선정 [ACE] - 设定医疗设施 [ACE] - 設定醫療設施 [ACE] - - - Is Medical Facility - Является госпиталем - Jest budynkiem medycznym - Es centro médico - Ist eine medizinische Einrichtung - Zdravotnické zařízení - É uma instalação médica - Est une installation médical - Orvosi létesítmény-e - E' Struttura Medica - 医療施設として - 의료시설 - 是医疗设施 - 是醫療設施 - - - Registers an object as a medical facility - Определяет объект в качестве госпиталя - Przypisuje danemu obiektowi status budynku medycznego - Registra un objeto como un centro médico - Definiert ein Objekt als medizinische Einrichtung - Registruje objekt jako zdravotnické zařízení - Registra um objeto como instalacão médica - Enregistrer un objet comme une installation médical - Egy objektum orvosi létesítményként való regisztrálása - Registra un oggetto come struttura medica - オブジェクトを医療施設として割り当てる - 물체를 의료시설로 등록합니다 - 指定一个物件作为医疗设施 - 指定一個物件作為醫療設施 - - - Defines an object as a medical facility. This allows for more advanced treatments. Can be used on buildings and vehicles. - Определяет объект в качестве госпиталя. Позволяет оказывать более сложную помощь. Может применяться к зданиям и технике. - Moduł ten pozwala przypisać status budynku medycznego danemu obiektowi. Budynek taki pozwala na wykonywanie zaawansowanych zabiegów medycznych. Może być użyte na pojazdach i budynkach. - Define un objeto como un centro médico. Esto permite tratamientos más avanzados. Se puede utilizar en edificios y vehículos. - Definiert ein Objekt als medizinische Einrichtung. Hier werden weitere, tiefgreifende Behandlungen ermöglicht. Kann Fahrzeugen oder Gebäuden zugewiesen werden. - Definuje objekt jako zdravotnické zařízení. To umožňuje více pokročilé léčení. Může být použito na budovy nebo na vozidla. - Define um objeto como instalação médica. Isso permite tratamentos mais avançados. Pode ser utilizado em edifícios e veículos. - Définir un objet comme installation médical. Cela permet les traitements avancés. Peut être utilisé sur les batiments et les véhicules - Egy objektumot orvosi létesítményként határoz meg. Ez fejlett ellátási lehetőségeket engedélyez. Használható járműveken és épületeken. - Definisce un oggetto come struttura medica. Questo permette cure più avanzate. Può essere usato su edifici e veicoli. - オブジェクトを医療施設として割り当てます。建物と車両へ割り当てられた場合、より高度な治療が可能になります。 - 물체를 의료시설로 정의합니다. 건물 혹은 차량이 될 수 있습니다. 이는 고급 의료 조치를 할 수 있게해줍니다. - 定义一个物件作为医疗设施,此医疗设施将被允许使用更进阶的医疗方法。此功能可用于建筑物或是载具上! - 定義一個物件作為醫療設施,此醫療設施將被允許使用更進階的醫療方法。此功能可用於建築物或是載具上! - - - [ACE] Medical Supply Crate (Basic) - [ACE] Ящик с медикаментами (базовая медицина) - [ACE] Skrzynka z zapasami medycznymi (podstawowa) - [ACE] Caja de suministros médicos (Básica) - [ACE] Sanitätskiste (Standard) - [ACE] Zdravotnické zásoby (základní) - [ACE] Caixa com suprimentos médicos - [ACE] Caisse médicale (basique) - [ACE] Orvosi láda (Alap) - [ACE] Cassa Rifornimenti Medici (Basico) - [ACE] 医療物資箱 (ベーシック) - [ACE] 의료 물자 (기본) - [ACE] 医疗补给箱(基本) - [ACE] 醫療補給箱(基本) - - - [ACE] Medical Supply Crate (Advanced) - [ACE] Ящик с медикаментами (усложн. медицина) - [ACE] Skrzynka z zapasami medycznymi (zaawansowana) - [ACE] Caja de suministros médicos (Avanzada) - [ACE] Sanitätskiste (erweitert) - [ACE] Zdravotnické zásoby (pokročilé) - [ACE] Caixa com suprimentos médicos (Avançados) - [ACE] Caisse médicale (avancée) - [ACE] Orvosi láda (Fejlett) - [ACE] Cassa Rifornimenti Medici (Avanzato) - [ACE] 医療物資箱 (アドバンスド) - [ACE] 의료 물자 (고급) - [ACE] 医疗补给箱(进阶) - [ACE] 醫療補給箱(進階) - Anytime Jederzeit @@ -5529,7 +426,7 @@ 醫療設定 - Distance to %1 has become to far for treatment + Distance to %1 has become too far for treatment Die Entfernung zu %1 ist zu groß für eine Behandlung %1 odszedł zbyt daleko, nie można kontynuować leczenia Расстояние до %1 стало слишком большим для лечения @@ -5538,7 +435,7 @@ %1 je příliš daleko, léčba není možná Distanza da %1 è diventata troppo alta per permettere trattamento %1 est trop loin pour être soigné - %1 は治療をできない所まで離れました + %1 は治療をできない所まで離れた %1 부터의 거리가 너무 멀어 치료할 수 없습니다 设定当距离超过%1将不能使用治疗动作 設定當距離超過%1將不能使用治療動作 @@ -5553,83 +450,16 @@ Tato osoba (%1) je vzhůru a nemůže být naložena Questa persona (%1) è sveglia e non può essere caricata. %1 est conscient et ne peut être embarqué. - 患者 (%1) は意識があり、積み込めません + 患者 (%1) は意識があり、積み込めない 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 此人(%1)是清醒且不能被装载 此人(%1)是清醒且不能被裝載 - - There is no tourniquet on this body part! - An diesem Körperteil befindet sich kein Tourniquet! - Na tej części ciała nie ma stazy! - No hay torniquete en esta parte del cuerpo! - Нет жгута на этой части тела! - Não existe nenhum torniquete nesta parte do corpo! - Žádné škrtidlo na této části těla! - Non c'è nessun laccio emostatico su questa parte del corpo! - Il n'y a pas de garrot sur ce membre ! - 身体には止血帯が無い! - 이 부위에는 지혈대가 없습니다! - 这部位没有止血带! - 這部位沒有止血帶! + + Unconscious Wake Up Chance - - Medical training - Wyszkolenie medyczne - Addestramento Medico - Sanitätsausbildung - Entrenamiento médico - Entraînement médical - Lékařský výcvik - Treino médico - Медицинская подготовка - 治療の訓練 - 의료 훈련 - 医疗训练 - 醫療訓練 - - - Whether or not the object will be a medical vehicle. - Czy pojazd ma być pojazdem medycznym? - L'oggetto in questione sarà un veicolo medico o meno. - Legt fest, ob das Objekt ein Sanitätsfahrzeug ist. - Es un vehículo médico? - Détermine si c'est un véhicule sanitaire. - Se o objeto será ou não um veículo médico - Будет ли объект считаться медицинским транспортом. - どれでも、またはオブジェクトを医療車両として割り当てます。 - 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. - 是否使该载具为医疗载具? - 是否使該載具為醫療載具? - - - Delay cease fire of AI while player is unconscious for medical reasons. - Verzögert das Ende des KI-Beschusses auf einen Spieler, wenn dieser aus medizinischen Gründen bewustlos wird. - Ritarda il cessate il fuoco dell'IA quando il giocatore è svenuto per motivi medici. - Prodleva zastavení palby pro AI, pokud je hráč v bezvědomí ze zdravotních důvodů. - Atraso durante cessar fogo da AI durante inconsciência médica - Délai de cessez le feu pour l'IA pendant que le joueur est inconscient pour des raisons médicales. - Задержка прекращения огня ботами, когда игрок теряет сознание по медицинским причинам. - AI はプレイヤーが医療的な理由で気絶している場合に限り、撃つのをためらいます。 - Opóźnij stan wstrzymania ognia u AI kiedy gracz jest nieprzytomny z powodów medycznych. - 의료상의 이유로 플레이어가 기절할 경우 인공지능이 발사를 지연합니다. - 当玩家为无意识的状态时, 延长AI的开火时间 - 當玩家為無意識的狀態時, 延長AI的停火時間 - - - Delay cease fire of AI for unconsciousness - Verzögert Ende des KI-Beschusses bei medizinischer Bewustlosigkeit - Demora antes de volverse neutral al caer inconsciente - Opóźnij wstrzymanie ognia AI dla nieprzytomnych osób - Ritarda il cessate il fuoco dell'IA quando si è svenuti - Prodleva zastavení palby AI na bezvědomé - Atraso durante cessar fogo da AI durante inconsciência - Délai de cessez le feu de l'IA pour la perte de conscience - Задержка прекращения огня ботами при потере сознания - AI が気絶者へためらってから射撃 - 기절할 경우 인공지능이 발사를 지연합니다 - 延长AI对已无意识玩家的开火时间 - 延長AI對已無意識玩家的停火時間 + + Probablity that a unit with stable vitals will wake up from unconscious [Checked every 15 sec] Open lid @@ -5651,68 +481,5 @@ 뚜껑 닫기 Zamknij pokrywę - - Unconscious animation during treatment - 処置中に気絶アニメーション - 治疗时死亡动画 - 醫療時加入的昏迷動作 - Animazione da svenuto durante la cura - Nieprzytomne animacje podczas leczenia - - - Allow animation of unconscious patients during treatment. - 患者の処置中に気絶アニメーションを許可します。 - 在无意识患者治疗时死亡,会播放死亡动画? - 允許醫療時加入昏迷的動作 - Permette l'animazione da svenuto dei pazioenti durante loro la cura. - Zezwalaj na animacje nieprzytomnych pacjentów podczas leczenia. - - - Move unconscious units from group - グループから気絶ユニットを移動 - 从小队中移除无意识伤者 - 從小隊中移動昏迷的單位 - Toglie le unità svenute dal grouppo - Przenieś nieprzytomne jednostki z grupy - - - When a group member goes unconscious, removes them from their group. - グループのメンバーが気絶すると、グループから退出させます。 - 当一个队员失去意识时,他将被移除出小队 - 當隊員昏迷時,將被他的小組中刪除 - Quando un membro del gruppo sviene, viene tolto dal gruppo. - Kiedy członek grupy straci przytomność, usuwa ich z ich grupy. - - - Overdosing - 過剰投与 - 过量 - 過量 - Overdose - Przedawkowanie - - - Makes patient vulnerable to Morphine/Epinephrine/Atropine overdosing. - モルヒネ/アドレナリン/アトロピンの過剰投与により患者を脆弱にします。 - 当队员处于吗啡/肾上腺素/阿托品过量时再次受伤,他的伤害会更重 - 當隊員對嗎啡/腎上腺素/阿托品過量時,會使他的傷害更重 - Rende il paziente suscettibile di overdose da morfina, epinefrina o atropina. - Sprawia, że pacjent jest podatny na przedawkowanie morfiny/epinefryny. - - - Convert vanilla items - 標準アイテムを変換 - Skonwertuj przedmioty z Army3 (vanilia) na przedmioty medyczne ACE3 - - - Enables or disables whether vanilla medical items are converted to ACE medical items or just removed - 有効化すると標準の治療アイテムを ACE 治療アイテムへ変換し、無効化すると削除します。 - Decyduje czy oryginalne przedmioty medyczne z Army 3 mają być skonwertowane na przedmioty medyczne ACE3 czy usunięte - - - Just remove vanilla medical - 標準の治療アイテムを削除 - Usuń przedmioty z Army 3 (vanilia) - diff --git a/addons/medical/ui/Icon_Module_Medical_ca.paa b/addons/medical/ui/Icon_Module_Medical_ca.paa deleted file mode 100644 index d66921dfcc..0000000000 Binary files a/addons/medical/ui/Icon_Module_Medical_ca.paa and /dev/null differ diff --git a/addons/medical/ui/RscTitles.hpp b/addons/medical/ui/RscTitles.hpp deleted file mode 100644 index 00182d24dd..0000000000 --- a/addons/medical/ui/RscTitles.hpp +++ /dev/null @@ -1,145 +0,0 @@ -class ACE_gui_backgroundBase; -class ACE_gui_listBoxBase; - -class Rsctitles { - class GVAR(DisplayInformation) { - duration = 10e10; - idd = 1111; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(DisplayInformation))), _this select 0)]); - onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(DisplayInformation))), nil)]); - class controlsBackground { - class bodyImgBackground: ACE_gui_backgroundBase { - idc = -1; - x = "safezoneX + (2.5 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "8.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "8.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOF(ui\body_background.paa); - }; - class bodyImgHead: bodyImgBackground { - idc = 50; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOF(ui\body_head.paa); - }; - class bodyImgTorso: bodyImgHead { - idc = 51; - text = QPATHTOF(ui\body_torso.paa); - }; - class bodyImgArms_l: bodyImgHead { - idc = 52; - text = QPATHTOF(ui\body_arm_left.paa); - }; - class bodyImgArms_r: bodyImgHead { - idc = 53; - text = QPATHTOF(ui\body_arm_right.paa); - }; - class bodyImgLegs_l: bodyImgHead { - idc = 54; - text = QPATHTOF(ui\body_leg_left.paa); - }; - class bodyImgLegs_r: bodyImgHead { - idc = 55; - text = QPATHTOF(ui\body_leg_right.paa); - }; - class bodyImgTournAL: bodyImgHead { - idc = 56; - text = QPATHTOF(ui\tourniquet_arm_left.paa); - }; - class bodyImgTournAR: bodyImgHead { - idc = 57; - text = QPATHTOF(ui\tourniquet_arm_right.paa); - }; - class bodyImgTournLL: bodyImgHead { - idc = 58; - text = QPATHTOF(ui\tourniquet_leg_left.paa); - }; - class bodyImgTournLR: bodyImgHead { - idc = 59; - text = QPATHTOF(ui\tourniquet_leg_right.paa); - }; - class InjuryListLabel { - idc = 199; - type = CT_STATIC; - x = "safezoneX + (2 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "10.2 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "9 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - style = 0x00 + 0x100; // ST_LEFT + ST_SHADOW - font = "RobotoCondensed"; - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {"(profilenamespace getVariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getVariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getVariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - text = CSTRING(Injuries); - }; - class InjuryList: ACE_gui_listBoxBase { - idc = 200; - x = "safezoneX + (2 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "11 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "9 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - colorBackground[] = {0, 0, 0, 0.2}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {0.95, 0.95, 0.95, 1}; - colorSelect2[] = {0.95, 0.95, 0.95, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.5}; - }; - class ActivityLog: InjuryList { - idc = 302; - y = "21.3 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - h = "7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - shadow = 2; - colorBackground[] = {0, 0, 0, 0}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {1,1,1,1}; - colorSelect2[] = {1,1,1,1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0}; - }; - class TriageStatus { - idc = 303; - type = CT_STATIC; - x = "safezoneX + (2 * (((safezoneW / safezoneH) min 1.2) / 40))"; - y = "20.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; - w = "9 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - style = 0x00 + 0x100; // ST_LEFT + ST_SHADOW - font = "RobotoCondensed"; - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {0,0,0,0.9}; - text = ""; - }; - }; - }; - - // disables blood texture overlay - class RscHealthTextures { - class controls { - class Flame_1; - class Blood_1: Flame_1 { - text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_lower_ca.paa"; - }; - class Blood_2: Flame_1 { - text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_middle_ca.paa"; - }; - class Blood_3: Flame_1 { - text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_upper_ca.paa"; - }; - }; - }; -}; diff --git a/addons/medical/ui/icons/medical_cross.paa b/addons/medical/ui/icons/medical_cross.paa deleted file mode 100644 index 656ebc000b..0000000000 Binary files a/addons/medical/ui/icons/medical_cross.paa and /dev/null differ diff --git a/addons/medical/ui/icons/medical_crossRed.paa b/addons/medical/ui/icons/medical_crossRed.paa deleted file mode 100644 index 5a0c8e9f9c..0000000000 Binary files a/addons/medical/ui/icons/medical_crossRed.paa and /dev/null differ diff --git a/addons/medical/ui/icons/medical_crossYellow.paa b/addons/medical/ui/icons/medical_crossYellow.paa deleted file mode 100644 index 74ddefd837..0000000000 Binary files a/addons/medical/ui/icons/medical_crossYellow.paa and /dev/null differ diff --git a/addons/medical/ui/moduleIcon.paa b/addons/medical/ui/moduleIcon.paa deleted file mode 100644 index 9cb6c4782d..0000000000 Binary files a/addons/medical/ui/moduleIcon.paa and /dev/null differ diff --git a/addons/medical/ui/triagecard.hpp b/addons/medical/ui/triagecard.hpp deleted file mode 100644 index 43a64625eb..0000000000 --- a/addons/medical/ui/triagecard.hpp +++ /dev/null @@ -1,191 +0,0 @@ -class ACE_gui_buttonBase; - -class GVAR(triageCard) { - idd = 7010; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(triageCard))), _this select 0)]); - onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QUOTE(GVAR(triageCard))), nil)]); - class controlsBackground { - class Background: ACE_gui_backgroundBase { - idc = -1; - type = CT_STATIC; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "19 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_LEFT + ST_SHADOW; - font = "RobotoCondensed"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.0, 0.0, 0.0, 1}; - colorBackground[] = {1,1,1,1}; - text = ""; - }; - class cornor_top_l: ACE_gui_backgroundBase { - idc = -1; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - font = "RobotoCondensed"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {1,1,0,1}; - colorBackground[] = {0,0,0,0}; - text = QPATHTOF(ui\triage_card_corner_l.paa); - }; - class cornor_top_r: cornor_top_l { - x = "20 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(ui\triage_card_corner_r.paa); - }; - - class TriageCardLabel { - idc = 199; - type = CT_STATIC; - x = "14.25 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "7.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - style = 0x02 + 0x100; // ST_LEFT + ST_SHADOW - font = "RobotoCondensed"; - colorText[] = {0,0,0,1}; - colorBackground[] = {0,0,0,0}; - text = CSTRING(Actions_TriageCard); - }; - class TriageList: ACE_gui_listBoxBase { - idc = 200; - x = "11 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "13 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "13 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - colorBackground[] = {0, 0, 0, 0}; - colorText[] = {0,0,0, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 0}; - colorSelect[] = {0.0, 0.0, 0.0, 1}; - colorSelect2[] = {0.0, 0.0, 0.0, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - }; - class TriageTextBottom: TriageCardLabel { - idc = 2000; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "20 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = 0x02; - colorText[] = {1, 1, 1.0, 1}; - colorBackground[] = {0,0.0,0.0,0.7}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - }; - class selectTriageStatus: ACE_gui_buttonBase { - idc = 2001; - x = "10 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "20 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE([true] call FUNC(dropDownTriageCard);); - text = ""; - }; - class selectTriageStatusNone: selectTriageStatus { - idc = 2002; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_None); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel),0,true)];); - }; - class selectTriageStatusMinor: selectTriageStatus { - idc = 2003; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Minor); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel),1,true)];); - }; - class selectTriageStatusDelayed: selectTriageStatus { - idc = 2004; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Delayed); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel),2,true)];); - }; - class selectTriageStatusImmediate: selectTriageStatus { - idc = 2005; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Immediate); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureOver = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel), 3, true)];); - }; - class selectTriageStatusDeceased: selectTriageStatus { - idc = 2006; - x = 0; - y = 0; - w = 0; - h = 0; - text = CSTRING(Triage_Status_Deceased); - style = 0x02; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([false] call FUNC(dropDownTriageCard); (GVAR(TriageCardTarget)) setVariable [ARR_3(QQGVAR(triageLevel), 4, true)];); - }; - }; -}; diff --git a/addons/medical_ai/ACE_Settings.hpp b/addons/medical_ai/ACE_Settings.hpp index fc24f6dc2f..e970265467 100644 --- a/addons/medical_ai/ACE_Settings.hpp +++ b/addons/medical_ai/ACE_Settings.hpp @@ -1,10 +1,5 @@ class ACE_Settings { class GVAR(enabledFor) { - category = ECSTRING(medical,Category_Medical); - displayName = CSTRING(enabledFor_DisplayName); - description = CSTRING(enabledFor_Description); - value = 2; - typeName = "SCALAR"; - values[] = {ECSTRING(Common,Disabled), CSTRING(enabledFor_OnlyServerAndHC), ECSTRING(Common,Enabled)}; + movedToSQF = 1; }; }; diff --git a/addons/medical_ai/StateMachine.hpp b/addons/medical_ai/StateMachine.hpp index 130458f563..0c428e4c65 100644 --- a/addons/medical_ai/StateMachine.hpp +++ b/addons/medical_ai/StateMachine.hpp @@ -5,7 +5,7 @@ class GVAR(stateMachine) { class Initial { class Injured { targetState = "Injured"; - condition = QUOTE(call FUNC(isInjured)); + condition = QFUNC(isInjured); }; class HealUnit { targetState = "HealUnit"; @@ -20,7 +20,7 @@ class GVAR(stateMachine) { class InSafety { targetState = "Safe"; - condition = QUOTE(call FUNC(isSafe)); + condition = QFUNC(isSafe); }; }; @@ -31,8 +31,8 @@ class GVAR(stateMachine) { class RequestMedic { targetState = "HealSelf"; - condition = QUOTE(call FUNC(canRequestMedic)); - onTransition = QUOTE(call FUNC(requestMedic)); + condition = QFUNC(canRequestMedic); + onTransition = QFUNC(requestMedic); }; class HealSelf { targetState = "HealSelf"; @@ -41,7 +41,7 @@ class GVAR(stateMachine) { }; class HealSelf { - onState = QUOTE(call FUNC(healSelf)); + onState = QFUNC(healSelf); onStateLeaving = QUOTE(_this setVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),nil)]); class Initial { @@ -63,7 +63,7 @@ class GVAR(stateMachine) { }; class HealUnit { - onState = QUOTE(call FUNC(healUnit)); + onState = QFUNC(healUnit); onStateLeaving = QUOTE(_this setVariable [ARR_2(QUOTE(QGVAR(treatmentOverAt)),nil)]); class Initial { diff --git a/addons/medical_ai/XEH_postInit.sqf b/addons/medical_ai/XEH_postInit.sqf index 075a972c25..e3a902d27a 100644 --- a/addons/medical_ai/XEH_postInit.sqf +++ b/addons/medical_ai/XEH_postInit.sqf @@ -1,12 +1,12 @@ #include "script_component.hpp" -["ace_settingsInitialized", { +/*["ace_settingsInitialized", { TRACE_1("settingsInitialized", GVAR(enabledFor)); if (GVAR(enabledFor) == 0) exitWith {}; // 0: disabled if ((GVAR(enabledFor) == 1) && {!isServer} && {hasInterface}) exitWith {}; // 1: Don't Run on non-hc Clients // Only run for AI that does not have to deal with advanced medical - if (EGVAR(medical,level) == 2 && {EGVAR(medical,enableFor) == 1 || hasInterface}) exitWith {}; + if (EGVAR(medical,enableFor) == 1 || {hasInterface}) exitWith {}; ["ace_firedNonPlayer", { _unit setVariable [QGVAR(lastFired), CBA_missionTime]; @@ -19,7 +19,7 @@ private _medic = objNull; { - if ((!isPlayer _x) && {[_x] call EFUNC(medical,isMedic)}) exitWith { + if ((!isPlayer _x) && {[_x] call EFUNC(medical_treatment,isMedic)}) exitWith { _medic = _x; }; } forEach (units _unit); @@ -32,4 +32,4 @@ }; GVAR(statemachine) = [configFile >> "ACE_Medical_AI_StateMachine"] call CBA_statemachine_fnc_createFromConfig; -}] call CBA_fnc_addEventHandler; +}] call CBA_fnc_addEventHandler;*/ diff --git a/addons/medical_ai/XEH_preInit.sqf b/addons/medical_ai/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/medical_ai/XEH_preInit.sqf +++ b/addons/medical_ai/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/medical_ai/config.cpp b/addons/medical_ai/config.cpp index 07f9e3b050..e9df7730c4 100644 --- a/addons/medical_ai/config.cpp +++ b/addons/medical_ai/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_medical"}; + requiredAddons[] = {"ace_medical_treatment"}; author = ECSTRING(common,ACETeam); authors[] = {"BaerMitUmlaut"}; url = ECSTRING(main,URL); diff --git a/addons/medical_ai/functions/fnc_canRequestMedic.sqf b/addons/medical_ai/functions/fnc_canRequestMedic.sqf index ab03042899..8865819d6a 100644 --- a/addons/medical_ai/functions/fnc_canRequestMedic.sqf +++ b/addons/medical_ai/functions/fnc_canRequestMedic.sqf @@ -19,10 +19,10 @@ // we ignore this here. We need to "notice" the medic that he should // treat other units, or else he won't do anything on his own. -if ([_this] call EFUNC(medical,isMedic) || {vehicle _this != _this}) exitWith {false}; +if ([_this] call EFUNC(medical_treatment,isMedic) || {vehicle _this != _this}) exitWith {false}; { - if ([_x] call EFUNC(medical,isMedic) && {!([_x] call EFUNC(common,isPlayer))}) exitWith { + if ([_x] call EFUNC(medical_treatment,isMedic) && {!([_x] call EFUNC(common,isPlayer))}) exitWith { _this setVariable [QGVAR(assignedMedic), _x]; true }; diff --git a/addons/medical_ai/functions/fnc_healSelf.sqf b/addons/medical_ai/functions/fnc_healSelf.sqf index 6cb0c3257f..c03dccdad8 100644 --- a/addons/medical_ai/functions/fnc_healSelf.sqf +++ b/addons/medical_ai/functions/fnc_healSelf.sqf @@ -18,12 +18,12 @@ // Player will have to do this manually of course if ([_this] call EFUNC(common,isPlayer)) exitWith {}; // Can't heal self when unconscious -if (_this getVariable ["ACE_isUnconscious", false]) exitWith {}; +if IS_UNCONSCIOUS(_this) exitWith {}; // Check if we're still treating if ((_this getVariable [QGVAR(treatmentOverAt), CBA_missionTime]) > CBA_missionTime) exitWith {}; -private _needsBandaging = ([_this] call EFUNC(medical,getBloodLoss)) > 0; -private _needsMorphine = (_this getVariable [QEGVAR(medical,pain), 0]) > 0.2; +private _needsBandaging = GET_BLOOD_LOSS(_this) > 0; +private _needsMorphine = GET_PAIN(_this) > 0.2; switch (true) do { case _needsBandaging: { @@ -35,8 +35,8 @@ switch (true) do { _index }; } forEach _openWounds; - private _selection = ["head","body","hand_l","hand_r","leg_l","leg_r"] select _partIndex; - [_this, "Bandage", _selection] call EFUNC(medical,treatmentAdvanced_bandageLocal); + private _selection = ALL_BODY_PARTS select _partIndex; + [_this, "BasicBandage", _selection] call EFUNC(medical_treatment,treatmentBandageLocal); #ifdef DEBUG_MODE_FULL systemChat format ["%1 is bandaging selection %2", _this, _selection]; @@ -47,7 +47,7 @@ switch (true) do { _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 5]; }; case _needsMorphine: { - [_this] call EFUNC(medical,treatmentBasic_morphineLocal); + [_this, "Morphine", 2] call EFUNC(medical_treatment,treatmentMedicationLocal); [_this, false, true] call FUNC(playTreatmentAnim); _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; diff --git a/addons/medical_ai/functions/fnc_healUnit.sqf b/addons/medical_ai/functions/fnc_healUnit.sqf index 2d9116be4f..003c85a4b5 100644 --- a/addons/medical_ai/functions/fnc_healUnit.sqf +++ b/addons/medical_ai/functions/fnc_healUnit.sqf @@ -16,7 +16,7 @@ */ // Can't heal other units when unconscious -if (_this getVariable ["ACE_isUnconscious", false]) exitWith {}; +if IS_UNCONSCIOUS(_this) exitWith {}; // Check if we're still treating if ((_this getVariable [QGVAR(treatmentOverAt), CBA_missionTime]) > CBA_missionTime) exitWith {}; @@ -52,9 +52,9 @@ _this setVariable [QGVAR(movingToInjured), false]; _this forceSpeed 0; _target forceSpeed 0; -private _needsBandaging = ([_target] call EFUNC(medical,getBloodLoss)) > 0; -private _needsMorphine = (_target getVariable [QEGVAR(medical,pain), 0]) > 0.2; -private _needsEpinephrine = _target getVariable ["ACE_isUnconscious", false]; +private _needsBandaging = GET_BLOOD_LOSS(_target) > 0; +private _needsMorphine = GET_PAIN(_target) > 0.2; +private _needsEpinephrine = IS_UNCONSCIOUS(_target); switch (true) do { case _needsBandaging: { @@ -66,8 +66,8 @@ switch (true) do { _index }; } forEach _openWounds; - private _selection = ["head","body","hand_l","hand_r","leg_l","leg_r"] select _partIndex; - [_this, _target, _selection, "Bandage"] call EFUNC(medical,treatmentAdvanced_bandage); + private _selection = ALL_BODY_PARTS select _partIndex; + [_target, "BasicBandage", _selection] call EFUNC(medical_treatment,treatmentBandageLocal); #ifdef DEBUG_MODE_FULL systemChat format ["%1 is bandaging selection %2 on %3", _this, _selection, _target]; @@ -78,7 +78,7 @@ switch (true) do { _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 5]; }; case _needsMorphine: { - [_this, _target] call EFUNC(medical,treatmentBasic_morphine); + [_this, "Morphine", 2] call EFUNC(medical_treatment,treatmentMedicationLocal); [_this, false, false] call FUNC(playTreatmentAnim); _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; @@ -86,13 +86,14 @@ switch (true) do { systemChat format ["%1 is giving %2 morphine", _this, _target]; #endif }; - case _needsEpinephrine: { - [_this, _target] call EFUNC(medical,treatmentBasic_epipen); - [_this, false, false] call FUNC(playTreatmentAnim); - _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; +//ToDo - Figure out how to connect to new medical + // case _needsEpinephrine: { + // [_this, _target] call EFUNC(medical,treatmentBasic_epipen); + // [_this, false, false] call FUNC(playTreatmentAnim); + // _this setVariable [QGVAR(treatmentOverAt), CBA_missionTime + 2]; - #ifdef DEBUG_MODE_FULL - systemChat format ["%1 is using an epipen on %2", _this, _target]; - #endif - }; + // #ifdef DEBUG_MODE_FULL + // systemChat format ["%1 is using an epipen on %2", _this, _target]; + // #endif + // }; }; diff --git a/addons/medical_ai/functions/fnc_isInjured.sqf b/addons/medical_ai/functions/fnc_isInjured.sqf index 8cbe280914..3fa5370641 100644 --- a/addons/medical_ai/functions/fnc_isInjured.sqf +++ b/addons/medical_ai/functions/fnc_isInjured.sqf @@ -4,17 +4,21 @@ * Checks if a unit needs treatment. * * Arguments: - * None + * Unit * * Return Value: * Does unit need treatment * * Example: - * call ACE_medical_ai_fnc_isInjured + * player call ACE_medical_ai_fnc_isInjured * * Public: No */ if !(alive _this) exitWith {false}; -((_this getVariable [QEGVAR(medical,pain), 0] > 0.2) || {[_this] call EFUNC(medical,getBloodLoss) > 0 || {_this getVariable ["ACE_isUnconscious", false]}}) +private _bloodLoss = GET_BLOOD_LOSS(_this); +private _pain = GET_PAIN_PERCEIVED(_this); +private _unconscious = IS_UNCONSCIOUS(_this); + +(_bloodLoss > 0) || {_pain > 0.2} || _unconscious diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf index 92d5460daf..72a4116137 100644 --- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf +++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf @@ -21,7 +21,7 @@ params ["_unit", "_isBandage", "_isSelfTreatment"]; if (vehicle _unit != _unit) exitWith {}; private _animConfig = if (_isBandage) then { - configFile >> "ACE_Medical_Actions" >> "Basic" >> "Bandage"; + configFile >> "ACE_Medical_Actions" >> "Basic" >> "BasicBandage"; } else { configFile >> "ACE_Medical_Actions" >> "Basic" >> "Morphine"; }; diff --git a/addons/medical_ai/initSettings.sqf b/addons/medical_ai/initSettings.sqf new file mode 100644 index 0000000000..297961872c --- /dev/null +++ b/addons/medical_ai/initSettings.sqf @@ -0,0 +1,12 @@ +[ + QGVAR(enabledFor), + "LIST", + [LLSTRING(enableFor_title), LLSTRING(enableFor_desc)], + LLSTRING(settingCategory), + [ + [0, 1, 2], + [LELSTRING(Common,Disabled), LLSTRING(enabledFor_OnlyServerAndHC), LELSTRING(Common,Enabled)], + 2 + ], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_ai/script_component.hpp b/addons/medical_ai/script_component.hpp index cd0c047751..53ffcf20ba 100644 --- a/addons/medical_ai/script_component.hpp +++ b/addons/medical_ai/script_component.hpp @@ -15,3 +15,4 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index c5c24a53e1..e3cd9efd67 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -1,21 +1,14 @@ - - Medical AI enabled for - 次に AI 治療を有効 - AI医疗启用 - AI醫療啟用 - AI medica abilitata per: - Medyczna SI aktywowana dla + + ACE Medical - AI - - Enable AI units to heal themselves and each other. - AI ユニットの自己や相互治療を有効化します。 - 使AI单位能够彼此治疗自己 - 啟用AI能夠彼此醫療自己 - Permette alle unità AI di curare se stesse e fra di loro. - Zezwala jednostki SI do leczenia siebie samych i siebie nawzajem. + + Medic AI + + + AI will respond to injury and unconsciousness Only Server and HC diff --git a/addons/medical_blood/ACE_Settings.hpp b/addons/medical_blood/ACE_Settings.hpp index b5e1f0db21..e970265467 100644 --- a/addons/medical_blood/ACE_Settings.hpp +++ b/addons/medical_blood/ACE_Settings.hpp @@ -1,10 +1,5 @@ class ACE_Settings { class GVAR(enabledFor) { - category = ECSTRING(medical,Category_Medical); - displayName = CSTRING(MedicalBloodSettings_enabledFor_DisplayName); - description = CSTRING(MedicalBloodSettings_enabledFor_Description); - value = 2; - typeName = "SCALAR"; - values[] = {ECSTRING(Common,Disabled), CSTRING(enabledFor_OnlyPlayers), ECSTRING(Common,Enabled)}; + movedToSQF = 1; }; }; diff --git a/addons/medical_blood/XEH_PREP.hpp b/addons/medical_blood/XEH_PREP.hpp index 64ebbae911..aa7d358388 100644 --- a/addons/medical_blood/XEH_PREP.hpp +++ b/addons/medical_blood/XEH_PREP.hpp @@ -1,6 +1,7 @@ -PREP(hit); +PREP(handleWoundReceived); PREP(isBleeding); PREP(onBleeding); PREP(createBlood); +PREP(serverCleanupBlood); PREP(spurt); diff --git a/addons/medical_blood/XEH_postInit.sqf b/addons/medical_blood/XEH_postInit.sqf index a26afea627..c0193aa532 100644 --- a/addons/medical_blood/XEH_postInit.sqf +++ b/addons/medical_blood/XEH_postInit.sqf @@ -3,22 +3,24 @@ GVAR(useAceMedical) = ["ace_medical"] call EFUNC(common,isModLoaded); // To support public API regardless of component settings -[QGVAR(spurt), { - _this call FUNC(spurt); -}] call CBA_fnc_addEventHandler; +[QGVAR(spurt), FUNC(spurt)] call CBA_fnc_addEventHandler; if (isServer) then { GVAR(bloodDrops) = []; [QGVAR(bloodDropCreated), { params ["_bloodDrop"]; - GVAR(bloodDrops) pushBack _bloodDrop; + // Add to created queue with format [expireTime, object] + private _index = GVAR(bloodDrops) pushBack [(CBA_missionTime + BLOOD_OBJECT_LIFETIME), _bloodDrop]; + if (count GVAR(bloodDrops) >= MAX_BLOOD_OBJECTS) then { - private _deletedBloodDrop = GVAR(bloodDrops) deleteAt 0; + (GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; deleteVehicle _deletedBloodDrop; }; - [{deleteVehicle _this}, _bloodDrop, BLOOD_OBJECT_LIFETIME] call CBA_fnc_waitAndExecute; + if (_index == 1) then { // Start the waitAndExecute loop + [FUNC(serverCleanupBlood), [], BLOOD_OBJECT_LIFETIME] call CBA_fnc_waitAndExecute; + }; }] call CBA_fnc_addEventHandler; }; @@ -32,15 +34,9 @@ if (isServer) then { } else { EFUNC(common,getLocalUnits) // filter all local units }; - + private _stateMachine = [_listcode, true] call CBA_statemachine_fnc_create; [_stateMachine, {call FUNC(onBleeding)}, {}, {}, "Bleeding"] call CBA_statemachine_fnc_addState; - - ["CAManBase", "hit", { - params ["_unit"]; - if (GVAR(enabledFor) == 1 && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; - _this call FUNC(hit); - }] call CBA_fnc_addClassEventHandler; - + [QEGVAR(medical,woundReceived), FUNC(handleWoundReceived)] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler; diff --git a/addons/medical_blood/XEH_preInit.sqf b/addons/medical_blood/XEH_preInit.sqf index 9cf50a1b60..ae4de9d026 100644 --- a/addons/medical_blood/XEH_preInit.sqf +++ b/addons/medical_blood/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + // blood object model namespace GVAR(models) = [] call CBA_fnc_createNamespace; diff --git a/addons/medical_blood/config.cpp b/addons/medical_blood/config.cpp index 65b2a69809..5c133b9456 100644 --- a/addons/medical_blood/config.cpp +++ b/addons/medical_blood/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_main"}; + requiredAddons[] = {"ace_medical_status"}; author = ECSTRING(common,ACETeam); authors[] = {"Glowbal","Sickboy","commy2"}; url = ECSTRING(main,URL); diff --git a/addons/medical_blood/functions/fnc_handleWoundReceived.sqf b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf new file mode 100644 index 0000000000..20abbd4621 --- /dev/null +++ b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handle wounds received event. + * + * Arguments: + * 0: unit + * 1: bodyPart + * 2: damage + * 3: shooter + * + * Return Value: + * None + * + * Example: + * [player, "Body", 0.5, badGuy] call ace_medical_blood_fnc_handleWoundReceived + * + * Public: No + */ + +params ["_unit", "", "_damage", "_shooter"]; + +if (GVAR(enabledFor) == 1 && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; +if (vehicle _unit != _unit && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted + +_damage = _damage min 1; + +if (isNull _shooter) exitWith { // won't be able to calculate the direction properly, so instead we pick something at random + [QGVAR(spurt), [_unit, random 360, _damage]] call CBA_fnc_serverEvent; +}; + +// Calculate bulletDirection +private _bulletDir = _shooter getDir _unit; + +[QGVAR(spurt), [_unit, _bulletDir, _damage]] call CBA_fnc_serverEvent; diff --git a/addons/medical_blood/functions/fnc_hit.sqf b/addons/medical_blood/functions/fnc_hit.sqf deleted file mode 100644 index 17df627f1f..0000000000 --- a/addons/medical_blood/functions/fnc_hit.sqf +++ /dev/null @@ -1,31 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handle unit hit eventhandler - * - * Arguments: - * 0: unit - * 1: caused by - * 2: damage - * - * Return Value: - * None - * - * Example: - * [bob, kevin, 5] call ACE_medical_blood_fnc_hit - * - * Public: No - */ - -params ["_unit", "_causedBy", "_damage"]; - -if (((vehicle _unit) != _unit) && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted - -if (isNull _causedBy) exitWith { // won't be able to calculate the direction properly, so instead we pick something at random - [QGVAR(spurt), [_unit, random 360, _damage]] call CBA_fnc_serverEvent; -}; - -// Calculate bulletDirection -private _bulletDir = _unit getDir _causedBy; - -[QGVAR(spurt), [_unit, _bulletDir, _damage]] call CBA_fnc_serverEvent; diff --git a/addons/medical_blood/functions/fnc_isBleeding.sqf b/addons/medical_blood/functions/fnc_isBleeding.sqf index 73e5c10e6f..b063c52ab0 100644 --- a/addons/medical_blood/functions/fnc_isBleeding.sqf +++ b/addons/medical_blood/functions/fnc_isBleeding.sqf @@ -10,7 +10,7 @@ * is Bleeding * * Example: - * [UNIT] call ace_medical_blood_fnc_isBleeding + * [player] call ace_medical_blood_fnc_isBleeding * * Public: No */ @@ -18,6 +18,7 @@ params ["_unit"]; if (GVAR(useAceMedical)) exitWith { - _unit getVariable [QEGVAR(medical,isBleeding), false]; + IS_BLEEDING(_unit); }; -alive _unit && {getDammage _unit > 0.3}; + +alive _unit && {getDammage _unit > 0.3} diff --git a/addons/medical_blood/functions/fnc_onBleeding.sqf b/addons/medical_blood/functions/fnc_onBleeding.sqf index c800c32dc6..9bf27e1de4 100644 --- a/addons/medical_blood/functions/fnc_onBleeding.sqf +++ b/addons/medical_blood/functions/fnc_onBleeding.sqf @@ -10,7 +10,7 @@ * is Bleeding * * Example: - * [UNIT] call ace_medical_blood_fnc_onBleeding + * [player] call ace_medical_blood_fnc_onBleeding * * Public: No */ @@ -21,7 +21,8 @@ if (!([_unit] call FUNC(isBleeding))) exitWith {}; if (((vehicle _unit) != _unit) && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted private _lastTime = _unit getVariable [QGVAR(lastTime), -10]; -private _bloodLoss = (if (GVAR(useAceMedical)) then {([_unit] call EFUNC(medical,getBloodLoss)) * 2.5} else {getDammage _unit * 2}) min 6; +private _bloodLoss = (if (GVAR(useAceMedical)) then {GET_BLOOD_LOSS(_unit) * 2.5} else {getDammage _unit * 2}) min 6; +TRACE_1("",_bloodLoss); if ((CBA_missionTime - _lastTime) + _bloodLoss >= 8 + random 2) then { _unit setVariable [QGVAR(lastTime), CBA_missionTime]; diff --git a/addons/medical_blood/functions/fnc_serverCleanupBlood.sqf b/addons/medical_blood/functions/fnc_serverCleanupBlood.sqf new file mode 100644 index 0000000000..5a1762a7a8 --- /dev/null +++ b/addons/medical_blood/functions/fnc_serverCleanupBlood.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Loop that cleans up blood + * + * Arguments: + * None + * + * ReturnValue: + * None + * + * Public: No + */ + +(GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; +deleteVehicle _deletedBloodDrop; + +// If we cleaned out the array, exit loop +if (GVAR(bloodDrops) isEqualTo []) exitWith {}; + +// Wait until the next blood drop in the queue will expire +(GVAR(bloodDrops) select 0) params ["_expireTime"]; +[FUNC(serverCleanupBlood), [], (_expireTime - CBA_missionTime)] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_blood/functions/fnc_spurt.sqf b/addons/medical_blood/functions/fnc_spurt.sqf index 6f1dbaaa1d..9c6d2d1e5d 100644 --- a/addons/medical_blood/functions/fnc_spurt.sqf +++ b/addons/medical_blood/functions/fnc_spurt.sqf @@ -27,9 +27,12 @@ _damage = _damage min 1; private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage; private _offset = OFFSET + _distanceBetweenDrops; private _pos = _unit getPos [_offset, _dir]; + ["blooddrop_2", _pos, _dir] call FUNC(createBlood); private _dropAmount = ceil (MAXIMUM_DROPS * _damage); +TRACE_2("spurt blood",_dropAmount,_damage); + if (_dropAmount > 1) then { for "_i" from 2 to _dropAmount do { _pos = _pos getPos [_distanceBetweenDrops, _dir]; diff --git a/addons/medical_blood/initSettings.sqf b/addons/medical_blood/initSettings.sqf new file mode 100644 index 0000000000..e743002ffa --- /dev/null +++ b/addons/medical_blood/initSettings.sqf @@ -0,0 +1,13 @@ +// CBA Settings [ADDON: ace_medical_blood]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; + +[ + QGVAR(enabledFor), "LIST", + [LSTRING(MedicalBloodSettings_enabledFor_DisplayName), LSTRING(MedicalBloodSettings_enabledFor_Description)], + _categoryArray, + [[0,1,2],[LELSTRING(Common,Disabled),LLSTRING(enabledFor_OnlyPlayers),LELSTRING(Common,Enabled)],2], // [values, titles, defaultIndex] + true, // isGlobal + {[QGVAR(enabledFor), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical_blood/script_component.hpp b/addons/medical_blood/script_component.hpp index 335cdc44c5..c7bf8fb91e 100644 --- a/addons/medical_blood/script_component.hpp +++ b/addons/medical_blood/script_component.hpp @@ -15,6 +15,7 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" #define MAX_BLOOD_OBJECTS 500 #define BLOOD_OBJECT_LIFETIME 900 diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index d58f41bfc4..6b6df06cd4 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -1,6 +1,9 @@ + + Bleeding Effect + Only Players プレイヤーのみ diff --git a/addons/medical_damage/$PBOPREFIX$ b/addons/medical_damage/$PBOPREFIX$ new file mode 100644 index 0000000000..188701b560 --- /dev/null +++ b/addons/medical_damage/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_damage \ No newline at end of file diff --git a/addons/medical_damage/ACE_Medical_Injuries.hpp b/addons/medical_damage/ACE_Medical_Injuries.hpp new file mode 100644 index 0000000000..ea15797cbe --- /dev/null +++ b/addons/medical_damage/ACE_Medical_Injuries.hpp @@ -0,0 +1,130 @@ +// bleeding - maximum possible bleeding rate for a given wound type (0 .. 1) +// pain - maximum possible pain level for a given wound type (0 .. 1) + +class ACE_Medical_Injuries { + // Defines all the possible injury types + class wounds { + // Source: Scarle + // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). + class Abrasion { + causes[] = {"falling", "ropeburn", "vehiclecrash", "collision", "unknown"}; + bleeding = 0.001; + pain = 0.4; + minDamage = 0.01; + maxDamage = 0.30; + }; + // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. + class Avulsion { + causes[] = {"explosive", "vehiclecrash", "collision", "grenade", "shell", "bullet", "backblast", "bite"}; + bleeding = 0.25; + pain = 1.0; + minDamage = 0.01; + causeLimping = 1; + }; + // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. + class Contusion { + causes[] = {"bullet", "backblast", "punch", "vehiclecrash", "collision", "falling"}; + bleeding = 0.0; + pain = 0.3; + minDamage = 0.02; + maxDamage = 0.35; + }; + // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. + class Crush { + causes[] = {"falling", "vehiclecrash", "collision", "punch", "unknown"}; + bleeding = 0.05; + pain = 0.8; + minDamage = 0.1; + causeLimping = 1; + }; + // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. + class Cut { + causes[] = {"vehiclecrash", "collision", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; + bleeding = 0.04; + pain = 0.1; + minDamage = 0.1; + }; + // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. + class Laceration { + selections[] = {"All"}; + causes[] = {"vehiclecrash", "collision", "punch"}; + bleeding = 0.05; + pain = 0.2; + minDamage = 0.01; + }; + // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. + class VelocityWound { + causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; + bleeding = 0.5; + pain = 0.9; + minDamage = 0.35; + causeLimping = 1; + }; + // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. + class PunctureWound { + causes[] = {"stab", "grenade"}; + bleeding = 0.05; + pain = 0.4; + minDamage = 0.02; + causeLimping = 1; + }; + }; + class damageTypes { + // thresholds[] {{, }, {...}} + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + + class bullet { + // above damage, amount. Put the highest threshold to the left and lower the threshold with the elements to the right of it. + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + class grenade { + thresholds[] = {{0.1, 3}, {0, 1}}; + selectionSpecific = 0; + }; + class explosive { + thresholds[] = {{1, 6}, {0.1, 4}, {0, 1}}; + selectionSpecific = 0; + }; + class shell { + thresholds[] = {{1, 7}, {0.1, 5}, {0, 1}}; + selectionSpecific = 0; + }; + class vehiclecrash { + thresholds[] = {{0.5, 5}, {0.3, 2}, {0.05, 1}}; + selectionSpecific = 0; + }; + class collision { + thresholds[] = {{0.5, 5}, {0.3, 2}, {0.05, 1}}; + selectionSpecific = 0; + }; + class backblast { + thresholds[] = {{1, 6}, {0.55, 5}, {0, 2}}; + selectionSpecific = 0; + }; + class stab { + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + class punch { + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + class falling { + thresholds[] = {{0.6, 4}, {0.35, 2}, {0.1, 1}}; + selectionSpecific = 1; + }; + class ropeburn { + thresholds[] = {{0.1, 1}}; + selectionSpecific = 1; + }; + //No related wounds as drowning should not cause wounds/bleeding. Can be extended for internal injuries if they are added. + class drowning { + thresholds[] = {{0, 0}}; + }; + class unknown { + thresholds[] = {{0.1, 1}}; + }; + }; +}; diff --git a/addons/medical_damage/ACE_Settings.hpp b/addons/medical_damage/ACE_Settings.hpp new file mode 100644 index 0000000000..d9356d8244 --- /dev/null +++ b/addons/medical_damage/ACE_Settings.hpp @@ -0,0 +1,8 @@ +class ACE_Settings { + class EGVAR(medical,playerDamageThreshold) { + movedToSQF = 1; + }; + class EGVAR(medical,AIDamageThreshold) { + movedToSQF = 1; + }; +}; diff --git a/addons/medical_damage/CfgEventHandlers.hpp b/addons/medical_damage/CfgEventHandlers.hpp new file mode 100644 index 0000000000..93e3311cf2 --- /dev/null +++ b/addons/medical_damage/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/medical_damage/XEH_PREP.hpp b/addons/medical_damage/XEH_PREP.hpp new file mode 100644 index 0000000000..ad2055ccc5 --- /dev/null +++ b/addons/medical_damage/XEH_PREP.hpp @@ -0,0 +1,5 @@ +PREP(getTypeOfDamage); +PREP(handleIncapacitation); +PREP(parseConfigForInjuries); +PREP(woundsHandler); +PREP(woundsHandlerSQF); diff --git a/addons/medical_damage/XEH_preInit.sqf b/addons/medical_damage/XEH_preInit.sqf new file mode 100644 index 0000000000..203f11109d --- /dev/null +++ b/addons/medical_damage/XEH_preInit.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +call FUNC(parseConfigForInjuries); + +addMissionEventHandler ["Loaded",{ + INFO("Mission Loaded - Reloading medical configs for extension"); + // Reload configs into extension (handle full game restart) + call FUNC(parseConfigForInjuries); +}]; + +// decide which woundsHandler to use by whether the extension is present or not +if ("ace_medical" callExtension "version" != "") then { + DFUNC(woundsHandlerActive) = LINKFUNC(woundsHandler); +} else { + DFUNC(woundsHandlerActive) = LINKFUNC(woundsHandlerSQF); +}; + +[QEGVAR(medical,woundReceived), { + params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo"]; + + private _typeOfDamage = _ammo call FUNC(getTypeOfDamage); + [_unit, _woundedHitPoint, _receivedDamage, _typeOfDamage] call FUNC(woundsHandlerActive); +}] call CBA_fnc_addEventHandler; + +ADDON = true; diff --git a/addons/medical_menu/XEH_preStart.sqf b/addons/medical_damage/XEH_preStart.sqf similarity index 100% rename from addons/medical_menu/XEH_preStart.sqf rename to addons/medical_damage/XEH_preStart.sqf diff --git a/addons/medical_menu/config.cpp b/addons/medical_damage/config.cpp similarity index 64% rename from addons/medical_menu/config.cpp rename to addons/medical_damage/config.cpp index 633323c2cf..5e420a173e 100644 --- a/addons/medical_menu/config.cpp +++ b/addons/medical_damage/config.cpp @@ -6,19 +6,18 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_medical"}; + requiredAddons[] = {"ace_medical_engine"}; author = ECSTRING(common,ACETeam); - authors[] = {"Glowbal"}; + authors[] = {""}; url = ECSTRING(main,URL); VERSION_CONFIG; }; }; -#include "CfgEventHandlers.hpp" -#include "ui\menu.hpp" #include "ACE_Settings.hpp" -#include "CfgVehicles.hpp" +#include "ACE_Medical_Injuries.hpp" +#include "CfgEventHandlers.hpp" -class ACE_newEvents { - Medical_onMenuOpen = "ace_medicalMenuOpened"; +class ACE_Extensions { + extensions[] += {"ace_medical"}; }; diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf similarity index 80% rename from addons/medical/functions/fnc_getTypeOfDamage.sqf rename to addons/medical_damage/functions/fnc_getTypeOfDamage.sqf index c65f5d78e7..53645f7b8b 100644 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf @@ -10,14 +10,14 @@ * Type of damage * * Example: - * ["bullet"] call ACE_medical_fnc_getTypeOfDamage + * ["bullet"] call ace_medical_damage_fnc_getTypeOfDamage * * Public: No */ params ["_typeOfProjectile"]; - +// --- projectiles if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"}; if (_typeOfProjectile isKindOf "ShotgunBase") exitWith {"bullet"}; if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"}; @@ -30,4 +30,11 @@ if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"}; if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"}; if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"}; if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"}; + +// --- non-projectiles reported by custom handleDamge wrapper +if ((_typeOfProjectile select [0,1]) isEqualTo "#") then { + _typeOfProjectile = _typeOfProjectile select [1]; +}; + +// --- otherwise toLower _typeOfProjectile diff --git a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf new file mode 100644 index 0000000000..f61b2f9c90 --- /dev/null +++ b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: Ruthberg + * Handle incapacitation due to damage and pain + * + * Arguments: + * 0: The Unit + * + * ReturnValue: + * None + * + * Example: + * [player] call ace_medical_damage_fnc_handleIncapacitation + * + * Public: No + */ + +params ["_unit"]; + +private _painLevel = GET_PAIN_PERCEIVED(_unit); +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; + +_bodyPartDamage params ["_headDamage", "_bodyDamage", "_leftArmDamage", "_rightArmDamage", "_leftLegDamage", "_rightLegDamage"]; + +// Exclude non penetrating body damage +{ + _x params ["", "", "_bodyPartN", "_amountOf", "", "_damage"]; + if (_bodyPartN == 1 && {_damage < PENETRATION_THRESHOLD}) then { + _bodyDamage = _bodyDamage - (_amountOf * _damage); + }; +} forEach (_unit getVariable [QEGVAR(medical,openWounds), []]); + +private _damageThreshold = [ + EGVAR(medical,AIDamageThreshold), + EGVAR(medical,playerDamageThreshold) +] select (isPlayer _unit); + +if ((_headDamage > _damageThreshold / 2) || {_bodyDamage > _damageThreshold} || {(_painLevel >= PAIN_UNCONSCIOUS) && {random 1 < 0.1}}) then { + [QEGVAR(medical,CriticalInjury), _unit] call CBA_fnc_localEvent; +}; diff --git a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf new file mode 100644 index 0000000000..682b12e141 --- /dev/null +++ b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf @@ -0,0 +1,128 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Parse the ACE_Medical_Advanced config for all injury types. + * + * Arguments: + * None + * + * ReturnValue: + * None + * + * Example: + * [] call ace_medical_damage_fnc_parseConfigForInjuries + * + * Public: No + */ + +private _injuriesConfigRoot = configFile >> "ACE_Medical_Injuries"; + +// --- parse wounds +GVAR(woundClassNames) = []; +GVAR(woundsData) = []; // @todo classTypes are strings currently. Convert them to unqiue IDs instead. + +private _woundsConfig = _injuriesConfigRoot >> "wounds"; +private _classID = 0; + +{ + private _entry = _x; + private _className = configName _entry; + + private _selections = GET_ARRAY(_entry >> "selections",["All"]); + private _bleeding = GET_NUMBER(_entry >> "bleeding",0); + private _pain = GET_NUMBER(_entry >> "pain",0); + private _minDamage = GET_NUMBER(_entry >> "minDamage",0); + private _maxDamage = GET_NUMBER(_entry >> "maxDamage",-1); + private _causes = GET_ARRAY(_entry >> "causes",[]); + private _causeLimping = GET_NUMBER(_entry >> "causeLimping",0); + + if !(_causes isEqualTo []) then { + GVAR(woundClassNames) pushBack _className; + GVAR(woundsData) pushBack [_classID, _selections, _bleeding, _pain, [_minDamage, _maxDamage], _causes, _className, _causeLimping]; + _classID = _classID + 1; + }; +} forEach configProperties [_woundsConfig, "isClass _x"]; + +// --- parse damage types +GVAR(allDamageTypes) = []; // @todo, currently unused by handle damage (was GVAR(allAvailableDamageTypes)) +GVAR(allDamageTypesData) = [] call CBA_fnc_createNamespace; + +// minimum lethal damage collection, mapped to damageTypes +private _damageTypesConfig = _injuriesConfigRoot >> "damageTypes"; +private _thresholdsDefault = getArray (_damageTypesConfig >> "thresholds"); +private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionSpecific"); + +// Collect all available damage types from the config +{ + private _entry = _x; + private _className = configName _entry; + + GVAR(allDamageTypes) pushBack _className; + + // Check if this type is in the causes of a wound class, if so, we will store the wound types for this damage type + private _woundTypes = []; + { + if (_className in (_x select 5)) then { + _woundTypes pushBack _x; + }; + } forEach GVAR(woundsData); + + private _damageTypeSubClassConfig = _damageTypesConfig >> _className; + + private _thresholds = GET_ARRAY(_damageTypeSubClassConfig >> "thresholds",_thresholdsDefault); + private _selectionSpecific = GET_NUMBER(_damageTypeSubClassConfig >> "selectionSpecific",_selectionSpecificDefault); + + GVAR(allDamageTypesData) setVariable [_className, [_thresholds, _selectionSpecific > 0, _woundTypes]]; + + // extension loading + private _minDamageThresholds = (_thresholds apply {str (_x select 0)}) joinString ":"; + private _amountThresholds = (_thresholds apply {str (_x select 1)}) joinString ":"; + + // load in the damage types into the medical extension + private _extensionArgs = format [ + "addDamageType,%1,%2,%3,%4,%5", + _className, + 1, //@todo remove 'minLethalDamage' from extension + _minDamageThresholds, + _amountThresholds, + _selectionSpecific + ]; + TRACE_1("",_extensionArgs); + + private _extensionRes = "ace_medical" callExtension _extensionArgs; + TRACE_1("",_extensionRes); +} forEach configProperties [_damageTypesConfig, "isClass _x"]; + +// extension loading +{ + _x params ["_classID", "_selections", "_bleedingRate", "_pain", "_damageExtrema", "_causes", "_displayName"]; + _damageExtrema params ["_minDamage", "_maxDamage"]; + + private _className = GVAR(woundClassNames) select _forEachIndex; + + if (_displayName isEqualTo "") then { + _displayName = _className; + }; + + private _selections = _selections joinString ":"; + private _causes = _causes joinString ":"; + + private _extensionArgs = format [ + "addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", + _classID, + _className, + _selections, + _bleedingRate, + _pain, + _minDamage, + _maxDamage, + _causes, + _displayName + ]; + TRACE_1("",_extensionArgs); + + private _extensionRes = "ace_medical" callExtension _extensionArgs; + TRACE_1("",_extensionRes); +} forEach GVAR(woundsData); + +"ace_medical" callExtension "ConfigComplete"; diff --git a/addons/medical_damage/functions/fnc_woundsHandler.sqf b/addons/medical_damage/functions/fnc_woundsHandler.sqf new file mode 100644 index 0000000000..b1204bbf03 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandler.sqf @@ -0,0 +1,140 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Body Part + * 2: Amount Of Damage + * 3: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, "Body", 0.5, "bullet"] call ace_medical_damage_fnc_woundsHandler + * + * Public: No + */ + +params ["_unit", "_bodyPart", "_damage", "_typeOfDamage"]; +TRACE_5("start",_unit,_bodyPart,_damage,_typeOfDamage); + +if (_typeOfDamage isEqualTo "") then { + _typeOfDamage = "unknown"; +}; + +if (isNil {GVAR(allDamageTypesData) getVariable _typeOfDamage} ) then { + _typeOfDamage = "unknown"; +}; + +// Administration for open wounds and ids +private _openWounds = _unit getVariable [QEGVAR(medical,openWounds), []]; +private _woundID = _unit getVariable [QEGVAR(medical,lastUniqueWoundID), 1]; // Unique wound ids are not used anywhere: ToDo Remove from openWounds array + +TRACE_4("extension call",_bodyPart,_damage,_typeOfDamage,_woundID); +private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _bodyPart, _damage, _typeOfDamage, _woundID]; +TRACE_1("",_extensionOutput); + +// these are default values and modified by _extensionOutput +private _painToAdd = 0; +private _woundsCreated = []; + +call compile _extensionOutput; + +// todo: Make the pain and bleeding calculations part of the extension again +private _woundDamage = _damage / ((count _woundsCreated) max 1); // If the damage creates multiple wounds +private _painLevel = 0; +private _critialDamage = false; +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; +private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); +{ + _x params ["", "_woundClassIDToAdd", "_bodyPartNToAdd", "", "_bleeding"]; + + _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 + + // The higher the nastiness likelihood the higher the change to get a painful and bloody wound + private _nastinessLikelihood = linearConversion [0, 20, _woundDamage, 0.5, 30, true]; + private _bleedingModifier = 0.25 + 8 * exp ((random [-4.5, -5, -6]) / _nastinessLikelihood); + private _painModifier = 0.05 + 2 * exp (-2 / _nastinessLikelihood); + + TRACE_3("",_nastinessLikelihood,_bleedingModifier,_painModifier); + + _bleeding = _bleeding * _bleedingModifier; + private _pain = (((GVAR(woundsData) select _woundClassIDToAdd) select 3) * _painModifier); + _painLevel = _painLevel + _pain; + + // wound category (minor [0..0.5], medium[0.5..1.0], large[1.0+]) + private _category = floor linearConversion [0, 1, _bleedingModifier, 0, 2, true]; + + _x set [4, _bleeding]; + _x set [5, _woundDamage]; + _x set [6, _category]; + + + if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { + _critialDamage = true; + }; +#ifdef DEBUG_MODE_FULL + systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; +#endif + + // Emulate damage to vital organs + switch (true) do { + // Fatal damage to the head is guaranteed death + case (_bodyPartNToAdd == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}): { + TRACE_1("lethal headshot",_woundDamage toFixed 2); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + // Fatal damage to torso has various results based on organ hit + case (_bodyPartNToAdd == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD}): { + // Heart shot is lethal + if (random 1 < HEART_HIT_CHANCE) then { + TRACE_1("lethal heartshot",_woundDamage toFixed 2); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + }; + }; + + // todo `forceWalk` based on leg damage + private _causeLimping = (GVAR(woundsData) select _woundClassIDToAdd) select 7; + if (_causeLimping == 1 && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} && {_bodyPartNToAdd > 3}) then { + [_unit, true] call EFUNC(medical_engine,setLimping); + }; + + // if possible merge into existing wounds + private _createNewWound = true; + { + _x params ["", "_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage", "_oldCategory"]; + if (_woundClassIDToAdd == _classID && {_bodyPartNToAdd == _bodyPartN && {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}}) then { + if (_oldCategory == _category) exitWith { + private _newAmountOf = _oldAmountOf + 1; + _x set [3, _newAmountOf]; + private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; + _x set [4, _newBleeding]; + private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; + _x set [5, _newDamage]; + _createNewWound = false; + }; + }; + } forEach _openWounds; + + if (_createNewWound) then { + _openWounds pushBack _x; + }; +} forEach _woundsCreated; + +_unit setVariable [QEGVAR(medical,openWounds), _openWounds, true]; +_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; + +_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); + +[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; + +if (_critialDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { + [_unit] call FUNC(handleIncapacitation); +}; + +TRACE_5("exit",_unit,_painLevel,GET_PAIN(_unit),_unit getVariable QEGVAR(medical,openWounds),_woundsCreated); diff --git a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf new file mode 100644 index 0000000000..6071f64a2f --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf @@ -0,0 +1,191 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Body Part + * 2: Amount Of Damage + * 3: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, "Body", 0.5, "bullet"] call ace_medical_damage_fnc_woundsHandlerSQF + * + * Public: No + */ + +params ["_unit", "_bodyPart", "_damage", "_typeOfDamage"]; +TRACE_4("start",_unit,_bodyPart,_damage,_typeOfDamage); + +// Convert the selectionName to a number and ensure it is a valid selection. +private _bodyPartN = ALL_BODY_PARTS find toLower _bodyPart; +if (_bodyPartN < 0) exitWith {}; + +if (_typeOfDamage isEqualTo "") then { + _typeOfDamage = "unknown"; +}; + +if (isNil {GVAR(allDamageTypesData) getVariable _typeOfDamage} ) then { + _typeOfDamage = "unknown"; +}; + +// Get the damage type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] +// WoundTypes are the available wounds for this damage type. Format [[classID, selections, bleedingRate, pain], ..] +private _damageTypeInfo = [GVAR(allDamageTypesData) getVariable _typeOfDamage] param [0, [[], false, []]]; +_damageTypeInfo params ["_thresholds", "_isSelectionSpecific", "_woundTypes"]; + +// find the available injuries for this damage type and damage amount +private _highestPossibleSpot = -1; +private _highestPossibleDamage = -1; +private _allPossibleInjuries = []; + +{ + _x params ["", "_selections", "", "", "_damageExtrema"]; + _damageExtrema params ["_minDamage", "_maxDamage"]; + + // Check if the damage is higher as the min damage for the specific injury + if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { + // Check if the injury can be applied to the given selection name + if ("All" in _selections || {_bodyPart in _selections}) then { // @todo, this is case sensitive! + + // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries + if (_minDamage > _highestPossibleDamage) then { + _highestPossibleSpot = _forEachIndex; + _highestPossibleDamage = _minDamage; + }; + + // Store the valid possible injury for the damage type, damage amount and selection + _allPossibleInjuries pushBack _x; + }; + }; +} forEach _woundTypes; + +// No possible wounds available for this damage type or damage amount. +if (_highestPossibleSpot < 0) exitWith {}; + +// Administration for open wounds and ids +private _openWounds = _unit getVariable [QEGVAR(medical,openWounds), []]; +private _woundID = _unit getVariable [QEGVAR(medical,lastUniqueWoundID), 1]; // Unique wound ids are not used anywhere: ToDo Remove from openWounds array + +private _painLevel = 0; +private _critialDamage = false; +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; +private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); +private _woundsCreated = []; +{ + _x params ["_thresholdMinDam", "_thresholdWoundCount"]; + if (_thresholdMinDam <= _damage) exitWith { + private _woundDamage = _damage / (_thresholdWoundCount max 1); // If the damage creates multiple wounds + for "_i" from 0 to (_thresholdWoundCount-1) do { + // Find the injury we are going to add. Format [ classID, allowdSelections, bleedingRate, injuryPain] + private _oldInjury = if (random 1 >= 0.85) then { + _woundTypes select _highestPossibleSpot + } else { + selectRandom _allPossibleInjuries + }; + + _oldInjury params ["_woundClassIDToAdd", "", "_injuryBleedingRate", "_injuryPain"]; + + private _bodyPartNToAdd = [floor random 6, _bodyPartN] select _isSelectionSpecific; // 6 == count ALL_BODY_PARTS + + _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 + + // Create a new injury. Format [ID, classID, bodypart, percentage treated, bleeding rate] + private _injury = [_woundID, _woundClassIDToAdd, _bodyPartNToAdd, 1, _injuryBleedingRate]; + + // The higher the nastiness likelihood the higher the change to get a painful and bloody wound + private _nastinessLikelihood = linearConversion [0, 20, (_woundDamage / _thresholdWoundCount), 0.5, 30, true]; + private _bleedingModifier = 0.25 + 8 * exp ((random [-4.5, -5, -6]) / _nastinessLikelihood); + private _painModifier = 0.05 + 2 * exp (-2 / _nastinessLikelihood); + + private _bleeding = _injuryBleedingRate * _bleedingModifier; + private _pain = _injuryPain * _painModifier; + _painLevel = _painLevel + _pain; + + // wound category (minor [0..0.5], medium[0.5..1.0], large[1.0+]) + private _category = floor linearConversion [0, 1, _bleedingModifier, 0, 2, true]; + + // wound category (minor, medium, large) + private _category = floor ((0 max _bleeding min 0.1) / 0.05); + + _injury set [4, _bleeding]; + _injury set [5, _woundDamage]; + _injury set [6, _category]; + + if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { + _critialDamage = true; + }; +#ifdef DEBUG_MODE_FULL + systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; +#endif + + // Emulate damage to vital organs + switch (true) do { + // Fatal damage to the head is guaranteed death + case (_bodyPartNToAdd == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}): { + TRACE_1("lethal headshot",_woundDamage toFixed 2); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + // Fatal damage to torso has various results based on organ hit + case (_bodyPartNToAdd == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD}): { + // Heart shot is lethal + if (random 1 < HEART_HIT_CHANCE) then { + TRACE_1("lethal heartshot",_woundDamage toFixed 2); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + }; + }; + + // todo `forceWalk` based on leg damage + private _causeLimping = (GVAR(woundsData) select _woundClassIDToAdd) select 7; + if (_causeLimping == 1 && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} && {_bodyPartNToAdd > 3}) then { + [_unit, true] call EFUNC(medical_engine,setLimping); + }; + + // if possible merge into existing wounds + private _createNewWound = true; + { + _x params ["", "_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage", "_oldCategory"]; + if (_woundClassIDToAdd == _classID && {_bodyPartNToAdd == _bodyPartN && {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}}) then { + if (_oldCategory == _category) exitWith { + private _newAmountOf = _oldAmountOf + 1; + _x set [3, _newAmountOf]; + private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; + _x set [4, _newBleeding]; + private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; + _x set [5, _newDamage]; + _createNewWound = false; + }; + }; + } forEach _openWounds; + + if (_createNewWound) then { + _openWounds pushBack _injury; + }; + + // New injuries will also increase the wound ID + _woundID = _woundID + 1; + + // Store the injury so we can process it later correctly. + _woundsCreated pushBack _injury; + }; + }; +} forEach _thresholds; + +_unit setVariable [QEGVAR(medical,openWounds), _openWounds, true]; +_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; + +_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); + +[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; + +if (_critialDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { + [_unit] call FUNC(handleIncapacitation); +}; + +TRACE_5("exit",_unit,_painLevel,GET_PAIN(_unit),_unit getVariable QEGVAR(medical,openWounds),_woundsCreated); diff --git a/addons/medical_damage/functions/script_component.hpp b/addons/medical_damage/functions/script_component.hpp new file mode 100644 index 0000000000..66d3d51283 --- /dev/null +++ b/addons/medical_damage/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_damage\script_component.hpp" \ No newline at end of file diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf new file mode 100644 index 0000000000..88a1283cf7 --- /dev/null +++ b/addons/medical_damage/initSettings.sqf @@ -0,0 +1,23 @@ +// CBA Settings [ADDON: ace_medical_damage]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; + +[ + QEGVAR(medical,playerDamageThreshold), "SLIDER", + [LSTRING(playerDamageThreshold_DisplayName), LSTRING(playerDamageThreshold_Description)], + _categoryArray, + [0,25,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QEGVAR(medical,playerDamageThreshold), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,AIDamageThreshold), "SLIDER", + [LSTRING(AIDamageThreshold_DisplayName), LSTRING(AIDamageThreshold_Description)], + _categoryArray, + [0,25,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QEGVAR(medical,AIDamageThreshold), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical_damage/script_component.hpp b/addons/medical_damage/script_component.hpp new file mode 100644 index 0000000000..f96a81d378 --- /dev/null +++ b/addons/medical_damage/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_damage +#define COMPONENT_BEAUTIFIED Medical Damage +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +//#define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_DAMAGE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_DAMAGE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_DAMAGE +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml new file mode 100644 index 0000000000..d1d20c0032 --- /dev/null +++ b/addons/medical_damage/stringtable.xml @@ -0,0 +1,522 @@ + + + + + + Damage Threshold + + + Player Damage + Урон игроку + Próg obrażeń graczy + Daño de jugador + Spielerschaden + Poškození hráče + Dano do jogador + Dégats du joueur + Játékos sérülés + Danno Giocatore + プレイヤーへの損傷 + 플레이어 부상 + 玩家伤害 + 玩家傷害 + + + What is the damage a player can take before being killed? + Какой уровень урона необходим, чтобы убить игрока? + Jaki jest próg obrażeń, jakie gracz może otrzymać zanim zostanie zabity? + ¿Cuál es el daño que un jugador puede sufrir antes de morir? + Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird? + Jaké poškození může hráč dostat než bude zabit? + Qal é o dano que um jogador pode sofrer antes de morrer? + Quels dégâts peut subir un joueur avant d'être tué + Mennyi sérülést szenvedhet el egy játékos, mielőtt meghal? + Quanto è il danno che un giocatore può sostenere prima di essere ucciso? + プレイヤーが死に始める前に損傷を受けるようにしますか? + 얼마정도의 부상을 플레이어가 죽기 전까지 버틸 수 있습니까? + 玩家死亡前所能承受的伤害程度 + 玩家死亡前所能承受的傷害程度 + + + AI Damage + Урон ботам + Próg obrażeń AI + Daño IA + KI-Schaden + Poškození AI + Dano da IA + Dégâts des IA + AI sérülés + Danno AI + AI への損傷 + 인공지능 부상 + AI伤害 + AI傷害 + + + What is the damage an AI can take before being killed? + Какой уровень урона необходим, чтобы убить бота? + Jaki jest próg obrażeń, jakie AI może otrzymać zanim zostanie zabite? + ¿Cuál es el daño que la IA puede sufrir antes de morir? + Wie viel Schaden kann eine KI erleiden, bis sie getötet wird? + Jaké poškození může AI dostat než bude zabito? + Qual é o dano que uma IA pode sofrer antes de morrer? + Quels dégâts peut subir une IA avant d'être tuée + Mennyi sérülést szenvedhet el egy AI, mielőtt meghal? + Quanto è il danno che un'IA può sostenere prima di essere uccisa? + AI が死に始める前に損傷を受けるようにしますか? + 얼마정도의 부상을 인공지능이 죽기 전까지 버틸 수 있습니까? + AI 死亡前所能承受的伤害程度 + AI 死亡前所能承受的傷害程度 + + + + Scrape + Kratzer + Scorticatura + Ссадина + Eraflure + Draśnięcie + Arañazo + Horzsolás + Raspão + Odřenina + 擦り傷 + 긁힘 + + + Minor Scrape + Kleiner Kratzer + Minima Scorticatura + Малая ссадина + Petite éraflure + Pomniejsze draśnięcie + Arañazo menor + Kis horzsolás + Raspão leve + Malá odřenina + 小さな擦り傷 + 조금 긁힘 + + + Medium Scrape + Mittlerer Kratzer + Media Scorticatura + Средняя ссадина + Moyenne éraflure + Średnie draśnięcie + Arañazo medio + Közepes horzsolás + Raspão médio + Středně velká odřenina + 中くらいの擦り傷 + 꽤 긁힘 + + + Large Scrape + Großer Kratzer + Alta Scorticatura + Большая ссадина + Grande éraflure + Duże draśnięcie + Arañazo severo + Nagy horzsolás + Raspão grave + Velká odřenina + 大きな擦り傷 + 심하게 긁힘 + + + Avulsion + Avulsion + Avulsione + Авульсия + Avulsion + Rana płatowa + Avulsión + Leszakadás + Avulsão + Avulze + 剥離傷 + 떨어져나감 + + + Minor Avulsion + Kleine Avulsion + Minima Avulsione + Малая Авульсия + Petite avulsion + Pomniejsza rana płatowa + Avulsión menor + Kis leszakadás + Avulsão leve + Malá avulze + 小さな剥離傷 + 조금 떨어져나감 + + + Medium Avulsion + Mittlere Avulsion + Media Avulsione + Средняя Авульсия + Moyenne avulsion + Średnia rana płatowa + Avulsión media + Közepes leszakadás + Avulsão média + Střední avulze + 中くらいの剥離傷 + 꽤 떨어져나감 + + + Large Avulsion + Große Avulsion + Alta Avulsione + Большая Авульсия + Grande avulsion + Duża rana płatowa + Avulsión severa + Nagy leszakadás + Avulsão grave + Velká avulze + 大きな剥離傷 + 크게 떨어져나감 + + + Bruise + Prellung + Contusione + Ушиб + Hématome + Stłuczenie + Contusión + Zúzódás + Contusão + Modřina + 打ち傷 + + + + Minor Bruise + Kleine Prellung + Minima Contusione + Малый ушиб + Petit hématome + Pomniejsze stłuczenie + Contusión menor + Kis zúzódás + Contusão leve + Malá modřina + 小さな打ち傷 + 조금 멍듬 + + + Medium Bruise + Mittlere Prellung + Media Contusione + Средний ушиб + Hématome moyen + Średnie stłuczenie + Contusión media + Közepes zúzódás + Contusão média + Středně velká modřina + 中くらいの打ち傷 + 꽤 멍듬 + + + Large Bruise + Große Prellung + Alta Contusione + Большой ушиб + Hématome important + Duże stłuczenie + Contusión severa + Nagy zúzódás + Contusão grave + Velká modřina + 大きな打撲傷 + 심하게 멍듬 + + + Crushed tissue + Quetschverletzung + Tessuto Schiacciato + Компресионная травма + Tissu écrasé + Zgniecienie tkanek miękkich + Tejido triturado + Zúzott szövet + Tecido esmagado + Zhmoždění měkkých tkání + 圧挫傷 + 뭉개짐 + + + Minor crushed tissue + Kleine Quetschverletzung + Minimo Tessuto Schiacciato + Малая компрессионная травма + Tissu écrasé léger + Pomniejsze zgniecienie tkanek miękkich + Tejido triturado menor + Kis zúzott szövet + Tecido esmagado leve + Malé zhmoždění měkkých tkání + 小さな圧挫傷 + 조금 뭉개짐 + + + Medium crushed tissue + Mittlere Quetschverletzung + Medio Tessuto Schiacciato + Средняя компрессионная травма + Tissu écrasé moyen + Średnie zgniecienie tkanek miękkich + Tejido triturado medio + Közepes zúzott szövet + Tecido esmagado médio + Střední zhmoždění měkkých tkání + 中くらいの圧挫傷 + 꽤 뭉개짐 + + + Large crushed tissue + Große Quetschverletzung + Alto Tessuto Schiacciato + Большая компрессионная травма + Tissu écrasé large + Duże zgniecienie tkanek miękkich + Tejido triturado severo + Nagy zúzött szövet + Tecido esmagado grave + Velké zhmoždění měkkých tkání + 大きな圧挫傷 + 심하게 뭉개짐 + + + Cut + Schnittwunde + Taglio + Резаная рана + Coupure + Rana cięta + Corte + Vágás + Corte + Řezná rána + 切り傷 + 베임 + + + Small Cut + Kleine Schnittwunde + Piccolo Taglio + Малая резаная рана + Pomniejsza rana cięta + Corte menor + Kis vágás + Petite coupure + Corte leve + Malá řezná rána + 小さな切り傷 + 조금 베임 + + + Medium Cut + Mittlere Schnittwunde + Medio Taglio + Средняя резаная рана + Średnia rana cięta + Corte mediano + Közepes vágás + Moyenne coupure + Corte médio + Střední řezná rána + 中くらいの切り傷 + 꽤 베임 + + + Large Cut + Große Schnittwunde + Grande Taglio + Большая резаная рана + Duża rana cięta + Corte severo + Nagy vágás + Large coupure + Corte grave + Velká řezná rána + 大きな切り傷 + 심하게 베임 + + + Tear + Riss + Strappo + Рваная рана + Rozerwanie skóry + Déchirure + Desgarro + Szakadás + Ruptura + Tržná rána + 裂傷 + 찢어짐 + + + Small Tear + Kleiner Riss + Piccolo Strappo + Малая рваная рана + Pomniejsze rozerwanie skóry + Petite Déchirure + Desgarro menor + Kis szakadás + Ruptura leve + Malá tržná rána + 小さな裂傷 + 조금 찢어짐 + + + Medium Tear + Mittlerer Riss + Medio Strappo + Средняя рваная рана + Średnie rozerwanie skóry + Desgarro medio + Közepes szakadás + Moyenne déchirure + Ruptura média + Střední tržná rána + 中くらいの裂傷 + 꽤 찢어짐 + + + Large Tear + Großer Riss + Grande Strappo + Большая рваная рана + Duże rozerwanie skóry + Desgarro severo + Nagy szakadás + Large déchirure + Ruptura grave + Velká tržná rána + 大きな裂傷 + 심하게 찢어짐 + + + Velocity Wound + Ballistisches Trauma + Velocità Ferita + Огнестрельная рана + Rana postrzałowa + Blessure de vélocité + Herida de bala + Lőtt seb + Ferimento por projétil de arma de fogo + Střelné poranění + 銃創 + 총상 + + + Small Velocity Wound + Kleines Ballistisches Trauma + Lenta Velocità Ferita + Малая огнестрельная рана + Pomniejsza rana postrzałowa + Herida de bala menor + Kis lőtt seb + Petite blessure de vélocité + Ferimento leve por projétil de arma de fogo + Malé střelné poranění + 小さな銃創 + 소형 총상 + + + Medium Velocity Wound + Mittleres Ballistisches Trauma + Media Velocità Ferita + Средняя огнестрельная рана + Średnia rana postrzałowa + Herida de bala media + Közepes lőtt seb + Moyenne blessure de vélocité + Ferimento médio por projétil de arma de fogo + Střední střelné poranění + 中くらいの銃創 + 중형 총상 + + + Large Velocity Wound + Großes Ballistisches Trauma + Alta Velocità Ferita + Большая огнестрельная рана + Duża rana postrzałowa + Herida de bala severa + Nagy lőtt seb + Large blessure de vélocité + Ferimento grave por projétil de arma de fogo + Velké střelné poranění + 大きな銃創 + 대형 총상 + + + Puncture Wound + Stichwunde + Puntura Ferita + Колотая рана + Rana kłuta + Blessure de perforation + Herida punzante + Szúrt seb + Ferimento por perfuração + Bodná rána + 刺し傷 + 관통상 + + + Minor Puncture Wound + Kleine Stichwunde + Piccola Puntura Ferita + Малая колотая рана + Pomniejsza rana kłuta + Herida punzante menor + Kis szúrt seb + Légère blessure de perforation + Ferimento leve por perfuração + Malá bodná rána + 小さな刺し傷 + 소형 관통상 + + + Medium Puncture Wound + Mittlere Stichwunde + Media Puntura Ferita + Средняя колотая рана + Średnia rana kłuta + Herida punzante media + Közepes szúrt seb + Moyenne blessure de perforation + Ferimento médio por perfuração + Střední bodná rána + 中くらいの刺し傷 + 중형 관통상 + + + Large Puncture Wound + Große Stichwunde + Grande Puntura Ferita + Большая колотая рана + Duża rana kłuta + Herida punzante severa + Nagy szúrt seb + Large blessure de perforation + Ferimento grave por perfuração + Velká bodná rána + 大きな刺し傷 + 대형 관통상 + + + diff --git a/addons/medical_engine/$PBOPREFIX$ b/addons/medical_engine/$PBOPREFIX$ new file mode 100644 index 0000000000..6dc35db6f9 --- /dev/null +++ b/addons/medical_engine/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_engine diff --git a/addons/medical_engine/CfgActions.hpp b/addons/medical_engine/CfgActions.hpp new file mode 100644 index 0000000000..64ecf717db --- /dev/null +++ b/addons/medical_engine/CfgActions.hpp @@ -0,0 +1,16 @@ + +class CfgActions { + class None; + class Heal: None { + show = 0; + }; + class HealSoldier: None { + show = 0; + }; + class HealSoldierSelf: None { + show = 0; + }; + class FirstAid: None { + show = 0; + }; +}; diff --git a/addons/medical_engine/CfgEventHandlers.hpp b/addons/medical_engine/CfgEventHandlers.hpp new file mode 100644 index 0000000000..becf395052 --- /dev/null +++ b/addons/medical_engine/CfgEventHandlers.hpp @@ -0,0 +1,18 @@ + +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_engine/CfgExtendedAnimation.hpp b/addons/medical_engine/CfgExtendedAnimation.hpp new file mode 100644 index 0000000000..8f9525f0a5 --- /dev/null +++ b/addons/medical_engine/CfgExtendedAnimation.hpp @@ -0,0 +1,10 @@ + +// we want the face down animation every time +class CfgExtendedAnimation { + class Revive { + left = "Unconscious"; + right = "Unconscious"; + front = "Unconscious"; + back = "Unconscious"; + }; +}; diff --git a/addons/medical_engine/CfgMoves.hpp b/addons/medical_engine/CfgMoves.hpp new file mode 100644 index 0000000000..d7d304c7f8 --- /dev/null +++ b/addons/medical_engine/CfgMoves.hpp @@ -0,0 +1,27 @@ + +class CfgMovesBasic; +class CfgMovesMaleSdr: CfgMovesBasic { + class States { + // fixes hand being stuck at rifle which is on the back + class AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon; + class AinvPknlMstpSlayWnonDnon_medicOther: AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon { + weaponIK = 0; + }; + + class AmovPpneMstpSnonWnonDnon; + class ACE_UnconsciousOutProne: AmovPpneMstpSnonWnonDnon { + //file = "\A3\anims_f\Data\Anim\Sdr\dth\pne\stp\ras\Rfl\AdthPpneMstpSrasWrflDnon_1"; + looped = 0; + canBlendStep = 0; + blockMobileSwitching = 1; + forceAim = 1; + interpolationRestart = 1; + variantsPlayer[] = {}; + variantsAI[] = {}; + useIdles = 0; + InterpolateTo[] = {"Unconscious",0.2}; + ConnectTo[] = {"AmovPpneMstpSnonWnonDnon",0.2}; + speed = 100; + }; + }; +}; diff --git a/addons/medical_engine/CfgVehicles.hpp b/addons/medical_engine/CfgVehicles.hpp new file mode 100644 index 0000000000..3cccea2c3f --- /dev/null +++ b/addons/medical_engine/CfgVehicles.hpp @@ -0,0 +1,101 @@ + +class CfgVehicles { + class Man; + class CAManBase: Man { + // General + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // BluFor + class B_Soldier_base_F; + class B_Soldier_04_f: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class B_Soldier_05_f: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + + // Indep + class I_Soldier_base_F; + class I_Soldier_03_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class I_Soldier_04_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + + // OpFor + class SoldierEB; + class O_Soldier_base_F: SoldierEB { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class O_Soldier_02_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + class O_officer_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,2); + }; + }; + class O_Soldier_diver_base_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // Virtual Reality + class B_Soldier_VR_F: B_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class O_Soldier_VR_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class I_Soldier_VR_F: I_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // Civilians + class C_man_1; + class C_Soldier_VR_F: C_man_1 { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + class O_Protagonist_VR_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(1,1); + }; + }; + + // APEX + class O_V_Soldier_Viper_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(3,3); + }; + }; + class O_V_Soldier_base_F: O_Soldier_base_F { + class HitPoints { + ADD_ACE_HITPOINTS(3,3); + }; + }; +}; diff --git a/addons/medical_engine/CfgWeapons.hpp b/addons/medical_engine/CfgWeapons.hpp new file mode 100644 index 0000000000..b4e3572620 --- /dev/null +++ b/addons/medical_engine/CfgWeapons.hpp @@ -0,0 +1,11 @@ + +class CfgWeapons { + // Remove items from Virtual Arsenal. + class ItemCore; + class FirstAidKit: ItemCore { + type = 0; + }; + class Medikit: ItemCore { + type = 0; + }; +}; diff --git a/addons/medical_menu/README.md b/addons/medical_engine/README.md similarity index 52% rename from addons/medical_menu/README.md rename to addons/medical_engine/README.md index 86ae2039ea..c609f506cc 100644 --- a/addons/medical_menu/README.md +++ b/addons/medical_engine/README.md @@ -1,11 +1,11 @@ -ace_medical_menu +ace_medical_engine =============== -Provides the CSE medical menu for the advanced medical system. +Links Arma 3 soldier health simulation to ACE medical system. ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Glowbal](https://github.com/Glowbal) +- [commy2](https://github.com/commy2) diff --git a/addons/medical_engine/XEH_PREP.hpp b/addons/medical_engine/XEH_PREP.hpp new file mode 100644 index 0000000000..3c7872c515 --- /dev/null +++ b/addons/medical_engine/XEH_PREP.hpp @@ -0,0 +1,6 @@ +PREP(handleDamage); +PREP(damageBodyPart); +PREP(updateBodyPartVisuals); +PREP(setLimping); +PREP(setStructuralDamage); +PREP(setUnconsciousAnim); diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf new file mode 100644 index 0000000000..f4f9f746c7 --- /dev/null +++ b/addons/medical_engine/XEH_postInit.sqf @@ -0,0 +1,61 @@ +#include "script_component.hpp" + +["CAManBase", "init", { + params ["_unit"]; + + // Check if last hit point is our dummy. + private _allHitPoints = getAllHitPointsDamage _unit param [0, []]; + reverse _allHitPoints; + + if (_allHitPoints param [0, ""] != "ACE_HDBracket") then { + private _config = [_unit] call CBA_fnc_getObjectConfig; + if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);}; + if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)}; + ERROR_1("Bad hitpoints for unit type ""%1""",typeOf _unit); + } else { + // Calling this function inside curly brackets allows the usage of + // "exitWith", which would be broken with "HandleDamage" otherwise. + _unit setVariable [ + QEGVAR(medical,HandleDamageEHID), + _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}] + ]; + }; +}, nil, nil, true] call CBA_fnc_addClassEventHandler; + +#ifdef DEBUG_MODE_FULL +[QEGVAR(medical,woundReceived), { + params ["_unit", "_woundedHitPoint", "_receivedDamage", "_shooter", "_ammo"]; + TRACE_5("wound",_unit,_woundedHitPoint, _receivedDamage, _shooter, _ammo); + //systemChat str _this; +}] call CBA_fnc_addEventHandler; +#endif + +// Kill vanilla bleeding feedback effects. +#ifdef DISABLE_VANILLA_DAMAGE_EFFECTS +[{ + {isNil _x} count [ + "BIS_fnc_feedback_damageCC", + "BIS_fnc_feedback_damageRadialBlur", + "BIS_fnc_feedback_damageBlur" + ] == 0 +}, { + { + ppEffectDestroy _x; + } forEach [ + BIS_fnc_feedback_damageCC, + BIS_fnc_feedback_damageRadialBlur, + BIS_fnc_feedback_damageBlur + ]; +}] call CBA_fnc_waitUntilAndExecute; +#endif + +// this handles moving units into vehicles via load functions or zeus +// needed, because the vanilla INCAPACITATED state does not handle vehicles +["CAManBase", "GetInMan", { + params ["_unit"]; + if (!local _unit) exitWith {}; + + if (lifeState _unit == "INCAPACITATED") then { + [_unit, true] call FUNC(setUnconsciousAnim); + }; +}] call CBA_fnc_addClassEventHandler; diff --git a/addons/medical_engine/XEH_preInit.sqf b/addons/medical_engine/XEH_preInit.sqf new file mode 100644 index 0000000000..18bc483c55 --- /dev/null +++ b/addons/medical_engine/XEH_preInit.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// Hack for #3168 (units in static weapons do not take any damage): +// Doing a manual pre-load with a small distance seems to fix the LOD problems +// with handle damage not returning full results. +GVAR(fixedStatics) = []; + +private _fnc_fixStatic = { + params ["_vehicle"]; + private _type = typeOf _vehicle; + + if !(_type in GVAR(fixedStatics)) then { + GVAR(fixedStatics) pushBack _type; + PRELOAD_CLASS(_type); + }; +}; + +["StaticWeapon", "init", _fnc_fixStatic] call CBA_fnc_addClassEventHandler; +["Car", "init", _fnc_fixStatic] call CBA_fnc_addClassEventHandler; + +addMissionEventHandler ["Loaded", { + { + PRELOAD_CLASS(_x); + } forEach GVAR(fixedStatics); +}]; + +ADDON = true; diff --git a/addons/medical_engine/XEH_preStart.sqf b/addons/medical_engine/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_engine/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_engine/config.cpp b/addons/medical_engine/config.cpp new file mode 100644 index 0000000000..698428a632 --- /dev/null +++ b/addons/medical_engine/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal","KoffeinFlummi","commy2"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" + +#include "CfgActions.hpp" +#include "CfgMoves.hpp" +#include "CfgExtendedAnimation.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/medical_engine/functions/fnc_damageBodyPart.sqf b/addons/medical_engine/functions/fnc_damageBodyPart.sqf new file mode 100644 index 0000000000..a435632801 --- /dev/null +++ b/addons/medical_engine/functions/fnc_damageBodyPart.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Damages a body part of a local unit. Does not kill the unit. + * + * Arguments: + * 0: Unit + * 1: Selection, can be "Head", "Body", "Arms" or "Legs" + * 2: Damaged + * + * Return Value: + * None + * + * Example: + * [player, "HEAD", true] call ace_medical_engine_fnc_damageBodyPart + * + * Notes: + * Head: Blood visuals @ 0.45 + * Body: Blood visuals @ 0.45 + * Arms: Blood visuals @ 0.35, increases weapon sway linerarly + * Legs: Blood visuals @ 0.35, limping @ 0.5 + * + * Public: No + */ + +params ["_unit", "_selection", "_damage"]; +TRACE_3("damageBodyPart",_unit,_selection,_damage); + +_damage = [0, DAMAGED_MIN_THRESHOLD] select _damage; + +switch (toLower _selection) do { + case ("head"): { + _unit setHitPointDamage ["HitHead", _damage]; + }; + case ("body"): { + _unit setHitPointDamage ["HitBody", _damage]; + }; + case ("arms"): { + _unit setHitPointDamage ["HitHands", _damage]; + }; + case ("legs"): { + _unit setHitPointDamage ["HitLegs", _damage + ([0, LIMPING_MIN_DAMAGE] select (_unit getVariable [QEGVAR(medical,isLimping), false]))]; + }; +}; diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf new file mode 100644 index 0000000000..4bc0f8c611 --- /dev/null +++ b/addons/medical_engine/functions/fnc_handleDamage.sqf @@ -0,0 +1,190 @@ +#include "script_component.hpp" +/* + * Author: commy2, SilentSpike + * HandleDamage EH where wound events are raised based on incoming damage. + * Be aware that for each source of damage, the EH can fire multiple times (once for each hitpoint). + * We store these incoming damages and compare them on our final hitpoint: "ace_hdbracket". + * + * Arguments: + * Handle damage EH + * + * Return Value: + * Damage to be inflicted + * + * Public: No + */ +// for travis +#define HIT_STRUCTURAL QGVAR($#structural) + +params ["_unit", "_selection", "_damage", "_shooter", "_ammo", "_hitPointIndex", "_instigator", "_hitpoint"]; + +// HD sometimes triggers for remote units - ignore. +if !(local _unit) exitWith {nil}; + +// Get missing meta info +private _oldDamage = 0; + +if (_hitPoint isEqualTo "") then { + _hitPoint = "#structural"; + _oldDamage = damage _unit; +} 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}; + +// Damages are stored for "ace_hdbracket" event triggered last +private _newDamage = _damage - _oldDamage; +_unit setVariable [format [QGVAR($%1), _hitPoint], _newDamage]; + +// Engine damage to these hitpoints controls blood visuals, limping, weapon sway +// Handled in fnc_damageBodyPart, persist here +if (_hitPoint in ["hithead", "hitbody", "hithands", "hitlegs"]) exitWith {_oldDamage}; + +// This hitpoint is set to trigger last, evaluate all the stored damage values +// to determine where wounds are applied +if (_hitPoint isEqualTo "ace_hdbracket") exitWith { + _unit setVariable [QGVAR(lastShooter), _shooter]; + _unit setVariable [QGVAR(lastInstigator), _instigator]; + + private _damageStructural = _unit getVariable [HIT_STRUCTURAL, 0]; + + // --- Head + private _damageFace = _unit getVariable [QGVAR($HitFace), 0]; + private _damageNeck = _unit getVariable [QGVAR($HitNeck), 0]; + private _damageHead = (_unit getVariable [QGVAR($HitHead), 0]) max _damageFace max _damageNeck; + + // --- Body + private _damagePelvis = _unit getVariable [QGVAR($HitPelvis), 0]; + private _damageAbdomen = _unit getVariable [QGVAR($HitAbdomen), 0]; + private _damageDiaphragm = _unit getVariable [QGVAR($HitDiaphragm), 0]; + private _damageChest = _unit getVariable [QGVAR($HitChest), 0]; + private _damageBody = (_unit getVariable [QGVAR($HitBody), 0]) max _damagePelvis max _damageAbdomen max _damageDiaphragm max _damageChest; + + // --- Arms and Legs + private _damageLeftArm = _unit getVariable [QGVAR($HitLeftArm), 0]; + private _damageRightArm = _unit getVariable [QGVAR($HitRightArm), 0]; + private _damageLeftLeg = _unit getVariable [QGVAR($HitLeftLeg), 0]; + private _damageRightLeg = _unit getVariable [QGVAR($HitRightLeg), 0]; + + // Find hit point that received the maxium damage + // Priority used for sorting if incoming damage is equivalent (e.g. max which is 4) + private _allDamages = [ + [_damageHead, PRIORITY_HEAD, "Head"], + [_damageBody, PRIORITY_BODY, "Body"], + [_damageLeftArm, PRIORITY_LEFT_ARM, "LeftArm"], + [_damageRightArm, PRIORITY_RIGHT_ARM, "RightArm"], + [_damageLeftLeg, PRIORITY_LEFT_LEG, "LeftLeg"], + [_damageRightLeg, PRIORITY_RIGHT_LEG, "RightLeg"] + ]; + TRACE_2("incoming",_allDamages,_damageStructural); + + _allDamages sort false; + (_allDamages select 0) params ["_receivedDamage", "", "_woundedHitPoint"]; + + // We know it's structural when no specific hitpoint is damaged + if (_receivedDamage == 0) then { + _receivedDamage = _damageStructural; + _woundedHitPoint = "Body"; + }; + + // Environmental damage sources all have empty ammo string + // No explicit source given, we infer from differences between them + if (_ammo isEqualTo "") then { + // Any collision with terrain/vehicle/object has a shooter + // Check this first because burning can happen at any velocity + if !(isNull _shooter) then { + _ammo = "#collision"; + + /* + If shooter != unit then they hit unit, otherwise it could be: + - Unit hitting anything at speed + - An empty vehicle hitting unit + - A physX object hitting unit + Assume fall damage for downward velocity because it's most common + */ + if (_shooter == _unit && {(velocity _unit select 2) < -2}) then { + _woundedHitPoint = selectRandom ["RightLeg", "LeftLeg"]; + TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_receivedDamage); + } else { + _woundedHitPoint = selectRandom ["RightArm", "LeftArm", "RightLeg", "LeftLeg"]; + TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_receivedDamage); + }; + + // Significant damage suggests high relative velocity + // Momentum transfers to body/head for worse wounding + // Higher momentum results in higher chance for head to be hit for more lethality + if (_receivedDamage > 0.35) then { + private _headHitWeight = (_receivedDamage / 2) min 1; + _woundedHitPoint = selectRandomWeighted ["Body", (1 - _headHitWeight), "Head", _headHitWeight]; + }; + } else { + // Anything else is almost guaranteed to be fire damage + _woundedHitPoint = selectRandom ["LeftLeg", "RightLeg", "Body"]; + _ammo = "#unknown"; + + // Fire damage can occur as lots of minor damage events + // Combine these until significant enough to wound + private _combinedDamage = _receivedDamage + (_unit getVariable [QGVAR(trivialDamage), 0]); + if (_combinedDamage > 0.1) then { + _unit setVariable [QGVAR(trivialDamage), 0]; + _receivedDamage = _combinedDamage; + TRACE_5("Burning",_unit,_shooter,_instigator,_damage,_receivedDamage); + } else { + _unit setVariable [QGVAR(trivialDamage), _combinedDamage]; + _receivedDamage = 0; + }; + }; + }; + + // No wounds for minor damage + if (_receivedDamage > 1E-3) then { + [QEGVAR(medical,woundReceived), [_unit, _woundedHitPoint, _receivedDamage, _shooter, _ammo]] call CBA_fnc_localEvent; + TRACE_2("received",_receivedDamage,_woundedHitPoint); + }; + + // Clear stored damages otherwise they will influence future damage events + // (aka wounds will pile onto the historically most damaged hitpoint) + { + _unit setVariable [_x, nil]; + } forEach [ + QGVAR($HitFace),QGVAR($HitNeck),QGVAR($HitHead), + QGVAR($HitPelvis),QGVAR($HitAbdomen),QGVAR($HitDiaphragm),QGVAR($HitChest),QGVAR($HitBody), + QGVAR($HitLeftArm),QGVAR($HitRightArm),QGVAR($HitLeftLeg),QGVAR($HitRightLeg) + ]; + + 0 +}; + +// Drowning doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs +// Damage occurs in consistent increments +if ( + _hitPoint isEqualTo "#structural" && + {getOxygenRemaining _unit <= 0.5} && + {_damage isEqualTo (_oldDamage + 0.005)} +) exitWith { + [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "#drowning"]] call CBA_fnc_localEvent; + TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage); + + 0 +}; + +// Crashing a vehicle doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs +// It does fire the EH multiple times, but this seems to scale with the intensity of the crash +private _vehicle = vehicle _unit; +if ( + _hitPoint isEqualTo "#structural" && + {_ammo isEqualTo ""} && + {_vehicle != _unit} && + {vectorMagnitude (velocity _vehicle) > 5} + // todo: no way to detect if stationary and another vehicle hits you +) exitWith { + [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "#vehiclecrash"]] call CBA_fnc_localEvent; + TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage); + + 0 +}; + +// We store our own damage values so engine damage is unnecessary +0 diff --git a/addons/medical_engine/functions/fnc_setLimping.sqf b/addons/medical_engine/functions/fnc_setLimping.sqf new file mode 100644 index 0000000000..11ead53c54 --- /dev/null +++ b/addons/medical_engine/functions/fnc_setLimping.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Forces a unit to limp or not. + * + * Arguments: + * 0: Unit + * 1: Limping (optional, default: true) + * + * Return Value: + * None + * + * Example: + * [player, true] call ace_medical_engine_fnc_setLimping + * + * Public: No + */ + +params [["_unit", objNull, [objNull]], ["_isLimping", true, [false]]]; + +if (!local _unit) exitWith { + ERROR("Unit not local or null"); +}; + +_unit setVariable [QEGVAR(medical,isLimping), _isLimping, true]; + +// refresh +private _isDamaged = _unit getHitPointDamage "HitLegs" >= DAMAGED_MIN_THRESHOLD && {_unit getHitPointDamage "HitLegs" != LIMPING_MIN_DAMAGE}; + +[_unit, "Legs", _isDamaged] call FUNC(damageBodyPart); diff --git a/addons/medical_engine/functions/fnc_setStructuralDamage.sqf b/addons/medical_engine/functions/fnc_setStructuralDamage.sqf new file mode 100644 index 0000000000..11821fbe25 --- /dev/null +++ b/addons/medical_engine/functions/fnc_setStructuralDamage.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Set structural damage of an object without modifying the individual hit points. + * + * Arguments: + * 0: Unit + * 1: New damage value + * + * Return Value: + * None + * + * Example: + * [player, 0.5] call ace_medical_engine_fnc_setStructuralDamage + * + * Public: No + */ + +params [["_unit", objNull, [objNull]], ["_damage", 0, [0]]]; + +if (!local _unit) exitWith { + ERROR("Unit not local or null"); +}; + +private _hitPointDamages = getAllHitPointsDamage _unit param [2, []]; + +_unit setDamage _damage; + +{ + _unit setHitIndex [_forEachIndex, _x]; +} forEach _hitPointDamages; diff --git a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf new file mode 100644 index 0000000000..aa7f3f7db5 --- /dev/null +++ b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Force local unit into ragdoll / unconsciousness animation. + * + * Arguments: + * 0: Unit + * 1: Is unconscious (optional, default: true) + * + * Return Value: + * None + * + * Example: + * [player, true] call ace_medical_engine_fnc_setUnconsciousAnim + * + * Public: No + */ + +params [["_unit", objNull, [objNull]], ["_isUnconscious", true, [false]]]; + +if (!local _unit) exitWith { + ERROR("Unit not local or null"); +}; + +_unit setUnconscious _isUnconscious; + +if (_isUnconscious) then { + // eject from static weapon + if (vehicle _unit isKindOf "StaticWeapon") then { + [_unit] call EFUNC(common,unloadPerson); + }; + + // set animation inside vehicles + if (vehicle _unit != _unit) then { + private _unconAnim = _unit call EFUNC(common,getDeathAnim); + [_unit, _unconAnim] call EFUNC(common,doAnimation); + }; +} else { + // reset animation inside vehicles + if (vehicle _unit != _unit) then { + private _awakeAnim = _unit call EFUNC(common,getAwakeAnim); + [_unit, _awakeAnim, 2] call EFUNC(common,doAnimation); + } else { + // and on foot + [_unit, "AmovPpneMstpSnonWnonDnon"] call EFUNC(common,doAnimation); + + if (currentWeapon _unit == secondaryWeapon _unit && {currentWeapon _unit != ""}) then { + [_unit, "AmovPknlMstpSrasWlnrDnon"] call EFUNC(common,doAnimation); + }; + + [{ + params ["_unit"]; + + if (animationState _unit == "unconscious" && {lifeState _unit != "INCAPACITATED"}) then { + [_unit, "AmovPpneMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + }, _unit, 0.5] call CBA_fnc_waitAndExecute; + }; +}; diff --git a/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf new file mode 100644 index 0000000000..3e240b807b --- /dev/null +++ b/addons/medical_engine/functions/fnc_updateBodyPartVisuals.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Damages a body part of a local unit. Does not kill the unit. + * + * Arguments: + * 0: Unit + * 1: Update Head + * 2: Update Body + * 3: Update Arms + * 4: Update Legs + * + * Return Value: + * None + * + * Example: + * [player, true, true, true, true] call ace_medical_engine_fnc_updateBodyPartVisuals + * + * Public: No + */ + +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]]; + +if (_updateHead) then { + [_unit, "head", (_bodyPartDamage select 0) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart); +}; +if (_updateBody) then { + [_unit, "body", (_bodyPartDamage select 1) > 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); +}; +if (_updateLegs) then { + [_unit, "legs", ((_bodyPartDamage select 4) max (_bodyPartDamage select 5)) > VISUAL_BODY_DAMAGE_THRESHOLD] call FUNC(damageBodyPart); +}; diff --git a/addons/medical_engine/functions/script_component.hpp b/addons/medical_engine/functions/script_component.hpp new file mode 100644 index 0000000000..c28da622f0 --- /dev/null +++ b/addons/medical_engine/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_engine\script_component.hpp" diff --git a/addons/medical_engine/script_component.hpp b/addons/medical_engine/script_component.hpp new file mode 100644 index 0000000000..d45c30a024 --- /dev/null +++ b/addons/medical_engine/script_component.hpp @@ -0,0 +1,38 @@ +#define COMPONENT medical_engine +#define COMPONENT_BEAUTIFIED Medical (Engine) +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_ENGINE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_ENGINE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_ENGINE +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" +#include "\z\ace\addons\medical_engine\script_macros_config.hpp" + +#define PRELOAD_CLASS(class) \ + INFO_1("Starting preload for (%1)",class);\ + [{\ + 1 preloadObject _this;\ + }, {\ + INFO_1("Preload done for (%1)",_this);\ + }, class] call CBA_fnc_waitUntilAndExecute + +#define PRIORITY_HEAD 3 +#define PRIORITY_BODY 4 +#define PRIORITY_LEFT_ARM (1 + random 1) +#define PRIORITY_RIGHT_ARM (1 + random 1) +#define PRIORITY_LEFT_LEG (1 + random 1) +#define PRIORITY_RIGHT_LEG (1 + random 1) + +// don't change, these reflect hard coded engine behaviour +#define DAMAGED_MIN_THRESHOLD 0.45 +#define LIMPING_MIN_DAMAGE 0.5 diff --git a/addons/medical_engine/script_macros_config.hpp b/addons/medical_engine/script_macros_config.hpp new file mode 100644 index 0000000000..b29f9dd958 --- /dev/null +++ b/addons/medical_engine/script_macros_config.hpp @@ -0,0 +1,64 @@ +/* + Usage: + + #include "\z\ace\addons\medical_engine\script_macros_config.hpp" + + class CfgVehicles { + class My_AwesomeUnit_base; + class My_AwesomeUnit: My_AwesomeUnit_base { + class HitPoints { + ADD_ACE_HITPOINTS(2,2); + }; + }; + }; +*/ + +// Our method for adding left and right arm and leg armor. Uses those selections +// that are used for animations and therefore exist in all third party units +// usage: arm_armor and leg_armor are the armor values of of HitHands and +// HitLegs respectively. +// "ACE_HDBracket" is a special hit point. It is designed in a way where the +// "HandleDamage" event handler will compute it at the end of every damage +// calculation step. This way we can figure out which hit point took the most +// damage from one projectile and should be receiving the ACE medical wound. +// the hit point itself should not take any damage +// It is important that the "ACE_HDBracket" hit point is the last in the config, +// but has the same selection as the first one (always "HitHead" for soldiers). +#define ADD_ACE_HITPOINTS(arm_armor,leg_armor)\ + class HitLeftArm {\ + armor = arm_armor;\ + material = -1;\ + name = "hand_l";\ + passThrough = 1;\ + radius = 0.08;\ + explosionShielding = 1;\ + visual = "injury_hands";\ + minimalHit = 0.01;\ + };\ + class HitRightArm: HitLeftArm {\ + name = "hand_r";\ + };\ + class HitLeftLeg {\ + armor = leg_armor;\ + material = -1;\ + name = "leg_l";\ + passThrough = 1;\ + radius = 0.1;\ + explosionShielding = 1;\ + visual = "injury_legs";\ + minimalHit = 0.01;\ + };\ + class HitRightLeg: HitLeftLeg {\ + name = "leg_r";\ + };\ + class ACE_HDBracket {\ + armor = 1;\ + material = -1;\ + name = "head";\ + passThrough = 0;\ + radius = 1;\ + explosionShielding = 1;\ + visual = "";\ + minimalHit = 0;\ + depends = "HitHead";\ + } diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp new file mode 100644 index 0000000000..62384ba8e4 --- /dev/null +++ b/addons/medical_engine/script_macros_medical.hpp @@ -0,0 +1,153 @@ + +#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", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] + +// Damage threshold above which fatal organ damage can occur +#define HEAD_DAMAGE_THRESHOLD 1 +#define ORGAN_DAMAGE_THRESHOLD 0.6 + +// Chance to hit heart based on ratio of 70kg (approx. 70L) body to 70mL stroke volume of heart +// Assuming torso is 50% of the body volume (35L) +#define HEART_HIT_CHANCE 0.05 + +#define MEDICAL_ACTION_DISTANCE 1.75 + +// scale received pain to 0-2 level to select type of scream +// below 0.25: 0, from 0.25 to 0.5: 1, more than 0.5: 2 +#define PAIN_TO_SCREAM(pain) (floor (4 * pain) min 2) + +// scale received pain to 0-2 level to select type of scream +// below 0.33: 0, from 0.34 to 0.66: 1, more than 0.67: 2 +#define PAIN_TO_MOAN(pain) (floor (3 * pain) min 2) + +#define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) +#define GET_STRING(config,default) (if (isText (config)) then {getText (config)} else {default}) +#define GET_ARRAY(config,default) (if (isArray (config)) then {getArray (config)} else {default}) + +#define DEFAULT_HEART_RATE 80 +#define DEFAULT_PERIPH_RES 100 + +// --- blood +// 0.077 l/kg * 80kg = 6.16l +#define DEFAULT_BLOOD_VOLUME 6.0 // in liters + +#define BLOOD_VOLUME_CLASS_1_HEMORRHAGE 6.000 // lost less than 15% blood, Class I Hemorrhage +#define BLOOD_VOLUME_CLASS_2_HEMORRHAGE 5.100 // lost more than 15% blood, Class II Hemorrhage +#define BLOOD_VOLUME_CLASS_3_HEMORRHAGE 4.200 // lost more than 30% blood, Class III Hemorrhage +#define BLOOD_VOLUME_CLASS_4_HEMORRHAGE 3.600 // lost more than 40% blood, Class IV Hemorrhage +#define BLOOD_VOLUME_FATAL 3.0 // Lost more than 50% blood, Unrecoverable + +// IV Change per second calculation: +// 250 ml should take 60 seconds to fill. 250 ml / 60 s ~ 4.1667 ml/s. +#define IV_CHANGE_PER_SECOND 4.1667 // in milliliters per second + +// Minimum amount of damage required for penetrating wounds (also minDamage for velocity wounds) +#define PENETRATION_THRESHOLD 0.35 + +// To be replaced by a proper blood pressure calculation +#define BLOOD_LOSS_KNOCK_OUT_THRESHOLD 0.5 // 50% of cardiac output + +// Used to color interaction icons and body image selections +#define BLOOD_LOSS_RED_THRESHOLD 0.5 +#define BLOOD_LOSS_TOTAL_COLORS 10 +#define DAMAGE_BLUE_THRESHOLD 0.8 +#define DAMAGE_TOTAL_COLORS 10 + +// --- pain +#define PAIN_UNCONSCIOUS 0.5 + +// Pain fade out time (time it takes until pain is guaranteed to be completly gone) +#define PAIN_FADE_TIME 900 + +// Only relevant when advanced medication is disabled +// Morphine pain suppression fade out time (time it takes until pain suppression is guaranteed to be completly gone) +#define PAIN_SUPPRESSION_FADE_TIME 1800 + +// Chance to wake up when vitals are stable (checked once every SPONTANEOUS_WAKE_UP_INTERVAL seconds) +#define SPONTANEOUS_WAKE_UP_INTERVAL 15 + +// Minimum leg damage required for limping +#define LIMPING_DAMAGE_THRESHOLD 0.30 + +// Minimum body part damage required for blood effect on uniform +#define VISUAL_BODY_DAMAGE_THRESHOLD 0.35 + +// Empty wound data, used for some default return values +// [ID, classID, bodypartIndex, amountOf, bloodloss, damage, category] +#define EMPTY_WOUND [-1, -1, -1, 0, 0, 0, 0] + +// Base time to bandage each wound category +#define BANDAGE_TIME_S 4 +#define BANDAGE_TIME_M 6 +#define BANDAGE_TIME_L 8 +#define BANDAGE_TIME_MOD_MEDIC -2 +#define BANDAGE_TIME_MOD_SELF 4 + +#define DEFAULT_BANDAGE_REOPENING_CHANCE 0.1 +#define DEFAULT_BANDAGE_REOPENING_MIN_DELAY 120 +#define DEFAULT_BANDAGE_REOPENING_MAX_DELAY 200 + +#define DEFAULT_TOURNIQUET_VALUES [0,0,0,0,0,0] + +// Triage colors, for consistency across UIs and functions +#define TRIAGE_COLOR_NONE 0, 0, 0, 0.9 +#define TRIAGE_COLOR_MINIMAL 0, 0.5, 0, 0.9 +#define TRIAGE_COLOR_DELAYED 1, 0.84, 0, 0.9 +#define TRIAGE_COLOR_IMMEDIATE 1, 0, 0, 0.9 +#define TRIAGE_COLOR_DECEASED 0, 0, 0, 0.9 + +#define TRIAGE_TEXT_COLOR_NONE 1, 1, 1, 1 +#define TRIAGE_TEXT_COLOR_MINIMAL 1, 1, 1, 1 +#define TRIAGE_TEXT_COLOR_DELAYED 0, 0, 0, 1 +#define TRIAGE_TEXT_COLOR_IMMEDIATE 1, 1, 1, 1 +#define TRIAGE_TEXT_COLOR_DECEASED 1, 1, 1, 1 + +// - Unit Variables ---------------------------------------------------- +// These variables get stored in object space and used across components +// Defined here for easy consistency with GETVAR/SETVAR (also a list for reference) +#define VAR_BLOOD_PRESS QEGVAR(medical,bloodPressure) +#define VAR_BLOOD_VOL QEGVAR(medical,bloodVolume) +#define VAR_CRDC_ARRST QEGVAR(medical,inCardiacArrest) +#define VAR_HEART_RATE QEGVAR(medical,heartRate) +#define VAR_PAIN QEGVAR(medical,pain) +#define VAR_PAIN_SUPP QEGVAR(medical,painSuppress) +#define VAR_PERIPH_RES QEGVAR(medical,peripheralResistance) +#define VAR_UNCON "ACE_isUnconscious" +// These variables track gradual adjustments (from medication, etc.) +#define VAR_HEART_RATE_ADJ QEGVAR(medical,heartRateAdjustments) +#define VAR_PAIN_SUPP_ADJ QEGVAR(medical,painSuppressAdjustments) +#define VAR_PERIPH_RES_ADJ QEGVAR(medical,peripheralResistanceAdjustments) +// These variables track the current state of status values above +#define VAR_HEMORRHAGE QEGVAR(medical,hemorrhage) +#define VAR_IN_PAIN QEGVAR(medical,inPain) +#define VAR_IS_BLEEDING QEGVAR(medical,isBleeding) +#define VAR_TOURNIQUET QEGVAR(medical,tourniquets) + + +// - Unit Functions --------------------------------------------------- +// Retrieval macros for common unit values +// Defined for easy consistency and speed +#define GET_BLOOD_VOLUME(unit) (unit getVariable [VAR_BLOOD_VOL,DEFAULT_BLOOD_VOLUME]) +#define GET_HEART_RATE(unit) (unit getVariable [VAR_HEART_RATE,DEFAULT_HEART_RATE]) +#define GET_HEMORRHAGE(unit) (unit getVariable [VAR_HEMORRHAGE,0]) +#define GET_PAIN(unit) (unit getVariable [VAR_PAIN,0]) +#define GET_PAIN_SUPPRESS(unit) (unit getVariable [VAR_PAIN_SUPP,0]) +#define GET_TOURNIQUETS(unit) (unit getVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES]) +#define IN_CRDC_ARRST(unit) (unit getVariable [VAR_CRDC_ARRST,false]) +#define IS_BLEEDING(unit) (unit getVariable [VAR_IS_BLEEDING,false]) +#define IS_IN_PAIN(unit) (unit getVariable [VAR_IN_PAIN,false]) +#define IS_UNCONSCIOUS(unit) (unit getVariable [VAR_UNCON,false]) + +// The following function calls are defined here just for consistency +#define GET_BLOOD_LOSS(unit) ([unit] call EFUNC(medical_status,getBloodLoss)) +#define GET_BLOOD_PRESSURE(unit) ([unit] call EFUNC(medical_status,getBloodPressure)) + +// Derivative unit values commonly used +#define GET_PAIN_PERCEIVED(unit) (0 max (GET_PAIN(unit) - GET_PAIN_SUPPRESS(unit)) min 1) + +#define HAS_TOURNIQUET_APPLIED_ON(unit,index) ((GET_TOURNIQUETS(unit) select index) > 0) + +// Cache expiry values, in seconds +#define IN_MEDICAL_FACILITY_CACHE_EXPIRY 1 +#define CAN_TREAT_CONDITION_CACHE_EXPIRY 2 diff --git a/addons/medical_feedback/$PBOPREFIX$ b/addons/medical_feedback/$PBOPREFIX$ new file mode 100644 index 0000000000..410e7d1299 --- /dev/null +++ b/addons/medical_feedback/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_feedback diff --git a/addons/medical_feedback/ACE_Settings.hpp b/addons/medical_feedback/ACE_Settings.hpp new file mode 100644 index 0000000000..63266003e2 --- /dev/null +++ b/addons/medical_feedback/ACE_Settings.hpp @@ -0,0 +1,10 @@ +class ACE_Settings { + // Not currently used anywhere + class GVAR(enableScreams) { + category = ECSTRING(medical,Category_Medical); + displayName = CSTRING(enableScreams_DisplayName); + description = CSTRING(enableScreams_Description); + typeName = "BOOL"; + value = 1; + }; +}; diff --git a/addons/medical_feedback/CfgEventHandlers.hpp b/addons/medical_feedback/CfgEventHandlers.hpp new file mode 100644 index 0000000000..0d3301d6e0 --- /dev/null +++ b/addons/medical_feedback/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical/ui/CfgInGameUI.hpp b/addons/medical_feedback/CfgInGameUI.hpp similarity index 77% rename from addons/medical/ui/CfgInGameUI.hpp rename to addons/medical_feedback/CfgInGameUI.hpp index 5a09a11414..d18024e0a6 100644 --- a/addons/medical/ui/CfgInGameUI.hpp +++ b/addons/medical_feedback/CfgInGameUI.hpp @@ -1,6 +1,8 @@ +#ifdef DISABLE_VANILLA_BLOOD_TEXTURES class CfgInGameUI { class PeripheralVision { bloodTexture = ""; //"A3\ui_f\data\igui\cfg\PeripheralVision\bloodTexture_ca.paa"; }; }; +#endif diff --git a/addons/medical/CfgSounds.hpp b/addons/medical_feedback/CfgSounds.hpp similarity index 59% rename from addons/medical/CfgSounds.hpp rename to addons/medical_feedback/CfgSounds.hpp index 9cc5faedf9..077c32ba5e 100644 --- a/addons/medical/CfgSounds.hpp +++ b/addons/medical_feedback/CfgSounds.hpp @@ -1,37 +1,37 @@ class CfgSounds { class ACE_heartbeat_fast_1 { name = "ACE_heartbeat_fast_1"; - sound[] = {QPATHTOF(sounds\heart_beats\fast_1.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\fast_1.wav), "db+1", 1}; titles[] = {}; }; class ACE_heartbeat_fast_2 { name = "ACE_heartbeat_fast_2"; - sound[] = {QPATHTOF(sounds\heart_beats\fast_2.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\fast_2.wav), "db+1", 1}; titles[] = {}; }; class ACE_heartbeat_fast_3 { name = "ACE_heartbeat_fast_3"; - sound[] = {QPATHTOF(sounds\heart_beats\fast_3.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\fast_3.wav), "db+1", 1}; titles[] = {}; }; class ACE_heartbeat_norm_1 { name = "ACE_heartbeat_norm_1"; - sound[] = {QPATHTOF(sounds\heart_beats\norm_1.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\norm_1.wav), "db+1", 1}; titles[] = {}; }; class ACE_heartbeat_norm_2 { name = "ACE_heartbeat_norm_2"; - sound[] = {QPATHTOF(sounds\heart_beats\norm_2.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\norm_2.wav), "db+1", 1}; titles[] = {}; }; class ACE_heartbeat_slow_1 { name = "ACE_heartbeat_slow_1"; - sound[] = {QPATHTOF(sounds\heart_beats\slow_1.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\slow_1.wav), "db+1", 1}; titles[] = {}; }; class ACE_heartbeat_slow_2 { name = "ACE_heartbeat_slow_2"; - sound[] = {QPATHTOF(sounds\heart_beats\slow_2.wav), "db+1", 1}; + sound[] = {QPATHTOF(sounds\slow_2.wav), "db+1", 1}; titles[] = {}; }; }; diff --git a/addons/medical_feedback/CfgVehicles.hpp b/addons/medical_feedback/CfgVehicles.hpp new file mode 100644 index 0000000000..3c1f114411 --- /dev/null +++ b/addons/medical_feedback/CfgVehicles.hpp @@ -0,0 +1,62 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + // Delete base game sounds. + // These are never played for ai and remote players. + #ifdef DISABLE_VANILLA_SCREAMS + class SoundHitScream { + person1[] = {{"Male08ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person2[] = {{"Male06ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person3[] = {{"Male09ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person4[] = {{"Male07ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person5[] = {{"Male03GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person6[] = {{"Male02ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person7[] = {{"Male01ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person8[] = {{"Male01GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person9[] = {{"Male02ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person10[] = {{"Male02GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person11[] = {{"Male03ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person12[] = {{"Male03ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person13[] = {{"Male04ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person14[] = {{"Male05GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person15[] = {{"Male06GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person16[] = {{"Male04GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person17[] = {{"Male05ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person18[] = {{"Male05ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + }; + #endif + #ifdef DISABLE_VANILLA_MOANS + class SoundInjured { + person_moan1[] = {{"Male08ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan2[] = {{"Male06ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan3[] = {{"Male09ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan4[] = {{"Male07ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan5[] = {{"Male03GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan6[] = {{"Male02ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan7[] = {{"Male01ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan8[] = {{"Male01GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan9[] = {{"Male02ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan10[] = {{"Male02GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan11[] = {{"Male03ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan12[] = {{"Male03ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan13[] = {{"Male04ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan14[] = {{"Male05GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan15[] = {{"Male06GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan16[] = {{"Male04GRE"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan17[] = {{"Male05ENGB"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + person_moan18[] = {{"Male05ENG"},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}},{{EMPTY_SOUND,1}}}; + }; + #endif + // Can't overwrite these with empty sounds -> CTD + // Assume lock up if sound duration is 0 seconds. + // We mute the sounds instead + #ifdef DISABLE_VANILLA_HEARTBEAT + class PulsationSound { + sample0[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_1",0,0.7},1}}}; + sample1[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_3",0,0.7},1}}}; + sample2[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_4",0,0.7},1}}}; + sample3[] = {{{{"A3\sounds_f\characters\human-sfx\other\heart_4_5",0,0.7},1}}}; + }; + #endif + }; +}; diff --git a/addons/medical_feedback/RscTitles.hpp b/addons/medical_feedback/RscTitles.hpp new file mode 100644 index 0000000000..9a9eb43e73 --- /dev/null +++ b/addons/medical_feedback/RscTitles.hpp @@ -0,0 +1,20 @@ + +#ifdef DISABLE_VANILLA_BLOOD_TEXTURES +class RscTitles { + // Disables blood texture overlay + class RscHealthTextures { + class controls { + class Flame_1; + class Blood_1: Flame_1 { + text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_lower_ca.paa"; + }; + class Blood_2: Flame_1 { + text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_middle_ca.paa"; + }; + class Blood_3: Flame_1 { + text = ""; //"A3\Ui_f\data\igui\rsctitles\HealthTextures\blood_upper_ca.paa"; + }; + }; + }; +}; +#endif diff --git a/addons/medical_feedback/XEH_PREP.hpp b/addons/medical_feedback/XEH_PREP.hpp new file mode 100644 index 0000000000..ee4b453bbe --- /dev/null +++ b/addons/medical_feedback/XEH_PREP.hpp @@ -0,0 +1,9 @@ +PREP(effectBleeding); +PREP(effectBloodVolume); +PREP(effectHeartBeat); +PREP(effectIncapacitated); +PREP(effectPain); +PREP(effectUnconscious); +PREP(handleEffects); +PREP(initEffects); +PREP(playInjuredSound); diff --git a/addons/medical_feedback/XEH_postInit.sqf b/addons/medical_feedback/XEH_postInit.sqf new file mode 100644 index 0000000000..6b339f1993 --- /dev/null +++ b/addons/medical_feedback/XEH_postInit.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" + +[QEGVAR(medical,injured), { + params ["_unit", "_painLevel"]; + [_unit, "hit", PAIN_TO_SCREAM(_painLevel)] call FUNC(playInjuredSound); +}] call CBA_fnc_addEventHandler; + +[QEGVAR(medical,moan), { + params ["_unit", "_painLevel"]; + [_unit, "moan", PAIN_TO_MOAN(_painLevel)] call FUNC(playInjuredSound); +}] call CBA_fnc_addEventHandler; + +if (!hasInterface) exitWith {}; + +GVAR(nextFadeIn) = 0; +GVAR(heartBeatEffectRunning) = false; + +[false] call FUNC(initEffects); +[LINKFUNC(handleEffects), 1, []] call CBA_fnc_addPerFrameHandler; + +["ace_unconscious", { + params ["_unit", "_unconscious"]; + + if (_unit != ACE_player) exitWith {}; + + // Toggle unconscious player's ability to talk in radio addons + if (["task_force_radio"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["tf_voiceVolume", [1, 0] select _unconscious, true]; + _unit setVariable ["tf_unable_to_use_radio", _unconscious]; // Only used locally + }; + if (["acre_main"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["acre_sys_core_isDisabled", _unconscious, true]; + }; + // Greatly reduce player's hearing ability while unconscious (affects radio addons) + [QUOTE(ADDON), VOL_UNCONSCIOUS, _unconscious] call EFUNC(common,setHearingCapability); + + [_unconscious, 1] call FUNC(effectUnconscious); + ["unconscious", _unconscious] call EFUNC(common,setDisableUserInputStatus); +}] call CBA_fnc_addEventHandler; + +// Reset volume upon death for spectators +[QEGVAR(medical,death), { + params ["_unit"]; + + if (_unit != ACE_player) exitWith {}; + if (["task_force_radio"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["tf_voiceVolume", 1, true]; + _unit setVariable ["tf_unable_to_use_radio", false]; + }; + if (["acre_main"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["acre_sys_core_isDisabled", false, true]; + }; + [QUOTE(ADDON), 1, false] call EFUNC(common,setHearingCapability); +}] call CBA_fnc_addEventHandler; + +// Update effects to match new unit's current status (this also handles respawn) +["unit", { + params ["_new"]; + + private _status = _new getVariable ["ace_unconscious", false]; + + if (["task_force_radio"] call EFUNC(common,isModLoaded)) then { + _new setVariable ["tf_voiceVolume", [1, 0] select _status, true]; + _new setVariable ["tf_unable_to_use_radio", _status]; + }; + if (["acre_main"] call EFUNC(common,isModLoaded)) then { + _new setVariable ["acre_sys_core_isDisabled", _status, true]; + }; + [QUOTE(ADDON), VOL_UNCONSCIOUS, _status] call EFUNC(common,setHearingCapability); + [_status, 0] call FUNC(effectUnconscious); + ["unconscious", _status] call EFUNC(common,setDisableUserInputStatus); +}] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/medical_feedback/XEH_preInit.sqf b/addons/medical_feedback/XEH_preInit.sqf new file mode 100644 index 0000000000..d064e3d1ef --- /dev/null +++ b/addons/medical_feedback/XEH_preInit.sqf @@ -0,0 +1,750 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +GVAR(lastHeartBeatSound) = 0; + +// HitScream +GVAR(HitScreamNamespace) = [] call CBA_fnc_createNamespace; +GVAR(HitScreamNamespace) setVariable ["#default", "Male08ENG"]; + +GVAR(HitScreamNamespace) setVariable ["Male08ENG", [[ + ["A3\sounds_f\characters\human-sfx\P01\Low_hit_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Low_hit_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Low_hit_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Low_hit_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Low_hit_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P01\Mid_hit_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Mid_hit_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Mid_hit_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Mid_hit_4",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P01\Max_hit_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Max_hit_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Max_hit_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Max_hit_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P01\Max_hit_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male06ENG", [[ + ["A3\sounds_f\characters\human-sfx\P02\Low_hit_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Low_hit_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Low_hit_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Low_hit_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Low_hit_5",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Low_hit_6",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P02\Mid_hit_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Mid_hit_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Mid_hit_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Mid_hit_4",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P02\Max_hit_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Max_hit_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Max_hit_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P02\Max_hit_4",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male09ENG", [[ + ["A3\sounds_f\characters\human-sfx\P03\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P03\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P03\Hit_Low_3",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P03\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P03\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P03\Hit_Mid_3",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P03\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P03\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P03\Hit_Max_3",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male07ENG", [[ + ["A3\sounds_f\characters\human-sfx\P04\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P04\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P04\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male03GRE", [[ + ["A3\sounds_f\characters\human-sfx\P05\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P05\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P05\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male02ENGB", [[ + ["A3\sounds_f\characters\human-sfx\P06\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P06\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P06\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male01ENGB", [[ + ["A3\sounds_f\characters\human-sfx\P07\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P07\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P07\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male01GRE", [[ + ["A3\sounds_f\characters\human-sfx\P08\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P08\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P08\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male02ENG", [[ + ["A3\sounds_f\characters\human-sfx\P09\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P09\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P09\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male02GRE", [[ + ["A3\sounds_f\characters\human-sfx\P10\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P10\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P10\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male03ENG", [[ + ["A3\sounds_f\characters\human-sfx\P11\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P11\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P11\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male03ENGB", [[ + ["A3\sounds_f\characters\human-sfx\P12\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P12\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P12\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male04ENG", [[ + ["A3\sounds_f\characters\human-sfx\P13\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P13\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P13\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male05GRE", [[ + ["A3\sounds_f\characters\human-sfx\P14\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P14\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P14\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male06GRE", [[ + ["A3\sounds_f\characters\human-sfx\P15\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P15\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P15\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male04GRE", [[ + ["A3\sounds_f\characters\human-sfx\P16\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P16\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P16\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male05ENGB", [[ + ["A3\sounds_f\characters\human-sfx\P17\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P17\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P17\Hit_Max_5",3.1622777,1,80] +]]]; + +GVAR(HitScreamNamespace) setVariable ["Male05ENG", [[ + ["A3\sounds_f\characters\human-sfx\P18\Hit_Low_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Low_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Low_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Low_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Low_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_5",3.1622777,1,80] +], [ + ["A3\sounds_f\characters\human-sfx\P18\Hit_Max_1",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Max_2",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Max_3",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Max_4",3.1622777,1,80], + ["A3\sounds_f\characters\human-sfx\P18\Hit_Max_5",3.1622777,1,80] +]]]; + +// InjuredMoan +GVAR(InjuredMoanNamespace) = [] call CBA_fnc_createNamespace; +GVAR(InjuredMoanNamespace) setVariable ["#default", "Male08ENG"]; + +GVAR(InjuredMoanNamespace) setVariable ["Male08ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_5",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_6",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_7",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_8",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_5",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_6",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_7",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_8",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_1",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_2",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_3",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_4",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_5",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_6",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_7",0.15848932,1,20], + ["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_8",0.15848932,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male06ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_5",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_6",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_7",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_8",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_5",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_6",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_7",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_8",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_5",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_6",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_7",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_8",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male09ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_4",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male07ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male03GRE", [[ + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male02ENGB", [[ + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male01ENGB", [[ + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male01GRE", [[ + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male02ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male02GRE", [[ + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male03ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male03ENGB", [[ + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male04ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male05GRE", [[ + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male06GRE", [[ + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male04GRE", [[ + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male05ENGB", [[ + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +GVAR(InjuredMoanNamespace) setVariable ["Male05ENG", [[ + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_1",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_2",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_3",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_4",1.4125376,1,10], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_5",1.4125376,1,10] +], [ + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_1",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_2",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_3",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_4",1.5848932,1,15], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_5",1.5848932,1,15] +], [ + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_1",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_2",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_3",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_4",1.7782794,1,20], + ["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_5",1.7782794,1,20] +]]]; + +ADDON = true; diff --git a/addons/medical_feedback/XEH_preStart.sqf b/addons/medical_feedback/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_feedback/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_feedback/config.cpp b/addons/medical_feedback/config.cpp new file mode 100644 index 0000000000..f56bf8e99f --- /dev/null +++ b/addons/medical_feedback/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_status"}; + author = ECSTRING(common,ACETeam); + authors[] = {""}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +// #include "ACE_Settings.hpp" // ToDo: setting not used +#include "CfgEventHandlers.hpp" +#include "CfgInGameUI.hpp" +#include "CfgSounds.hpp" +#include "CfgVehicles.hpp" +#include "RscTitles.hpp" diff --git a/addons/medical_feedback/data/blood1.paa b/addons/medical_feedback/data/blood1.paa new file mode 100644 index 0000000000..47a160172e Binary files /dev/null and b/addons/medical_feedback/data/blood1.paa differ diff --git a/addons/medical_feedback/data/blood2.paa b/addons/medical_feedback/data/blood2.paa new file mode 100644 index 0000000000..b58e0bbc77 Binary files /dev/null and b/addons/medical_feedback/data/blood2.paa differ diff --git a/addons/medical_feedback/functions/fnc_effectBleeding.sqf b/addons/medical_feedback/functions/fnc_effectBleeding.sqf new file mode 100644 index 0000000000..cf87d2eb35 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectBleeding.sqf @@ -0,0 +1,81 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the bleeding effect. + * + * Arguments: + * 0: Enable effect + * 1: Current bloodloss (in l/s) + * + * Return Value: + * None + * + * Example: + * [false, 0.5] call ace_medical_feedback_fnc_effectBleeding + * + * Public: No + */ + +params ["_enable", "_bloodloss"]; +if (isNull findDisplay 46) exitWith {}; + +private _controls = uiNamespace getVariable [QGVAR(bloodControls), [controlNull, controlNull]]; +_controls params ["_blood1", "_blood2"]; + +if (!_enable) exitWith { + _blood1 ctrlSetFade 1; + _blood2 ctrlSetFade 1; + + _blood1 ctrlCommit 0; + _blood2 ctrlCommit 0; +}; + +// Initialize controls +if (isNull _blood1) then { + TRACE_1("Creating Blood Controls",_controls); + _blood1 = findDisplay 46 ctrlCreate ["RscPicture", -1]; + _blood2 = findDisplay 46 ctrlCreate ["RscPicture", -1]; + + _blood1 ctrlSetText QPATHTOF(data\blood1.paa); + _blood2 ctrlSetText QPATHTOF(data\blood2.paa); + + private _pos = [safeZoneXAbs, safeZoneY, safeZoneWAbs, safeZoneH]; + _blood1 ctrlSetPosition _pos; + _blood2 ctrlSetPosition _pos; + + _blood1 ctrlSetFade 1; + _blood2 ctrlSetFade 1; + + _blood1 ctrlCommit 0; + _blood2 ctrlCommit 0; + + uiNamespace setVariable [QGVAR(bloodControls), [_blood1, _blood2]]; +}; + +private _fade = linearConversion [0, 0.002, _bloodloss, 1, 0, true]; + +private _switchBloodFadeInfo = missionNamespace getVariable [QGVAR(switchBloodFadeInfo), [0, 0]]; +_switchBloodFadeInfo params ["_tickCounter", "_lastBloodloss"]; + +if (_tickCounter == 2) then { + if (ctrlFade _blood1 > ctrlFade _blood2) then { + _blood1 ctrlSetFade _fade; + _blood2 ctrlSetFade 1; + } else { + _blood1 ctrlSetFade 1; + _blood2 ctrlSetFade _fade; + }; + + _blood1 ctrlCommit 3; + _blood2 ctrlCommit 3; + + GVAR(switchBloodFadeInfo) = [0, _bloodloss]; +} else { + GVAR(switchBloodFadeInfo) = [_tickCounter + 1, _bloodloss]; +}; + +// Speed up fade on sudden changes +if (abs (_lastBloodloss - _bloodloss) > 0.001) then { + _blood1 ctrlCommit 1; + _blood2 ctrlCommit 1; +}; diff --git a/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf b/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf new file mode 100644 index 0000000000..e4a8e27053 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectBloodVolume.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the blood volume effect. + * + * Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [false, 0.5] call ace_medical_feedback_fnc_effectBloodVolume + * + * Public: No + */ + +params ["_enable", "_intensity"]; + +if ((!_enable) || {_intensity == 0}) exitWith { + GVAR(ppBloodVolume) ppEffectEnable false; +}; +GVAR(ppBloodVolume) ppEffectEnable true; +GVAR(ppBloodVolume) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1 - _intensity], [0.2, 0.2, 0.2, 0]]; +GVAR(ppBloodVolume) ppEffectCommit 1; diff --git a/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf new file mode 100644 index 0000000000..1c5c9ef968 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the hear beat sound. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_feedback_fnc_effectHeartBeat + * + * Public: No + */ + +private _heartRate = GET_HEART_RATE(ACE_player); + +if (_heartRate == 0) exitWith { + TRACE_1("Ending heart beat effect - zero",_heartRate); + GVAR(heartBeatEffectRunning) = false; +}; +private _waitTime = 60 / _heartRate; + +// TRACE_2("",_heartRate,_waitTime); + +switch (true) do { + case (_heartRate > 160): { + // playSound SND_HEARBEAT_FAST; // Array doesn't blend together well, just play one file consistently + playSound "ACE_heartbeat_fast_1"; + [FUNC(effectHeartBeat), [], _waitTime] call CBA_fnc_waitAndExecute; + }; + case (_heartRate < 60): { + playSound SND_HEARBEAT_SLOW; + [FUNC(effectHeartBeat), [], _waitTime] call CBA_fnc_waitAndExecute; + + }; + default { + TRACE_1("Ending heart beat effect - normal",_heartRate); + GVAR(heartBeatEffectRunning) = false; + }; +}; diff --git a/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf b/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf new file mode 100644 index 0000000000..73526d462a --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectIncapacitated.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Creates the incapacitation effect. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_feedback_fnc_effectIncapacitated + * + * Public: No + */ + +GVAR(ppIncapacitationBlur) ppEffectEnable true; +GVAR(ppIncapacitationGlare) ppEffectEnable true; + +GVAR(ppIncapacitationBlur) ppEffectAdjust [6]; +GVAR(ppIncapacitationGlare) ppEffectAdjust [1.2, 2, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]]; +GVAR(ppIncapacitationBlur) ppEffectCommit 0; +GVAR(ppIncapacitationGlare) ppEffectCommit 0; + +GVAR(ppIncapacitationBlur) ppEffectAdjust [0]; +GVAR(ppIncapacitationGlare) ppEffectAdjust [1.0, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]]; +GVAR(ppIncapacitationBlur) ppEffectCommit 5; +GVAR(ppIncapacitationGlare) ppEffectCommit 5; diff --git a/addons/medical_feedback/functions/fnc_effectPain.sqf b/addons/medical_feedback/functions/fnc_effectPain.sqf new file mode 100644 index 0000000000..1cfa68ff1c --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectPain.sqf @@ -0,0 +1,51 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Triggers the pain effect (single flash). + * + * Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [true, 0.5] call ace_medical_feedback_fnc_effectPain + * + * Public: No + */ + +params ["_enable", "_intensity"]; + +if (!_enable || {_intensity == 0}) exitWith { + GVAR(ppPain) ppEffectEnable false; +}; +GVAR(ppPain) ppEffectEnable true; + +// Trigger effect every 2s +private _showNextTick = missionNamespace getVariable [QGVAR(showPainNextTick), true]; +GVAR(showPainNextTick) = !_showNextTick; +if (_showNextTick) exitWith {}; + +private _initialAdjust = []; +private _delayedAdjust = []; + +if (GVAR(painEffectType) == 0) then { + _intensity = linearConversion [0, 1, _intensity, 0, 0.6, true]; + _initialAdjust = [1, 1, 0, [1, 1, 1, _intensity], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.59, 0.64, 0, 0, 0, 0, 4]]; + _delayedAdjust = [1, 1, 0, [1, 1, 1, 0], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.59, 0.64, 0, 0, 0, 0, 4]]; +} else { + _intensity = linearConversion [0, 1, _intensity, 0, 0.008, true]; + _initialAdjust = [_intensity, _intensity, 0.3, 0.39]; + _delayedAdjust = [ 0, 0, 0.3, 0.39]; +}; + +GVAR(ppPain) ppEffectAdjust _initialAdjust; +GVAR(ppPain) ppEffectCommit FX_PAIN_FADE_IN; +[{ + params ["_adjust", "_painEffectType"]; + if (GVAR(painEffectType) != _painEffectType) exitWith {TRACE_1("Effect type changed",_this);}; + GVAR(ppPain) ppEffectAdjust _adjust; + GVAR(ppPain) ppEffectCommit FX_PAIN_FADE_OUT; +}, [_delayedAdjust, GVAR(painEffectType)], FX_PAIN_FADE_IN] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_feedback/functions/fnc_effectUnconscious.sqf b/addons/medical_feedback/functions/fnc_effectUnconscious.sqf new file mode 100644 index 0000000000..3cd15bd405 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_effectUnconscious.sqf @@ -0,0 +1,114 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the unconscious effect. + * + * Arguments: + * 0: Enable + * 1: Mode (0: instant, 1: animation, 2: fx handler) + * + * Return Value: + * None + * + * Example: + * [true, 0] call ace_medical_feedback_fnc_effectUnconscious + * + * Public: No + */ + +params ["_enable", "_mode"]; + +switch (_mode) do { + // Instant (for Zeus or death) + case 0: { + GVAR(ppUnconsciousBlur) ppEffectEnable _enable; + GVAR(ppUnconsciousBlackout) ppEffectEnable _enable; + }; + // Animated (triggered on unconscious event) + case 1: { + if (_enable) then { + ACE_player setVariable [QGVAR(effectUnconsciousTimeout), CBA_missionTime + FX_UNCON_FADE_IN]; + GVAR(ppUnconsciousBlur) ppEffectEnable true; + GVAR(ppUnconsciousBlackout) ppEffectEnable true; + + GVAR(ppUnconsciousBlur) ppEffectAdjust [0]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + GVAR(ppUnconsciousBlackout) ppEffectCommit 0; + + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit FX_UNCON_FADE_IN; + GVAR(ppUnconsciousBlackout) ppEffectCommit FX_UNCON_FADE_IN; + + // Handle next fade in + GVAR(nextFadeIn) = CBA_missionTime + 15 + random 5; + } else { + ACE_player setVariable [QGVAR(effectUnconsciousTimeout), CBA_missionTime + FX_UNCON_FADE_OUT]; + GVAR(ppUnconsciousBlur) ppEffectEnable true; + GVAR(ppUnconsciousBlackout) ppEffectEnable true; + + // Step 1: Widen eye "hole" + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.9], [0, 0, 0, 1], [0, 0, 0, 0], [0.51, 0.17, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + + // Step 2: Open it + [{ + if (!isNull curatorCamera || {!alive ACE_player}) exitWith {}; + + GVAR(ppUnconsciousBlur) ppEffectAdjust [0]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.8], [0, 0, 0, 1], [0, 0, 0, 0], [0.7, 0.78, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit (FX_UNCON_FADE_OUT * 2/3); + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + }, [], FX_UNCON_FADE_OUT * 1/3] call CBA_fnc_waitAndExecute; + + // Step 3: Fade away vignette + [{ + if (!isNull curatorCamera || {!alive ACE_player}) exitWith {}; + + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0.7, 0.78, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + }, [], FX_UNCON_FADE_OUT * 2/3] call CBA_fnc_waitAndExecute; + }; + }; + // Raised by effectsHandler (blocked if animation in progress) + case 2: { + private _animatedTimeOut = ACE_player getVariable [QGVAR(effectUnconsciousTimeout), 0]; + if (_animatedTimeOut > CBA_missionTime) exitWith {}; + + if (_enable) then { + if (GVAR(nextFadeIn) < CBA_missionTime) then { + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.9], [0, 0, 0, 1], [0, 0, 0, 0], [0.51, 0.17, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 2/3); + + [{ + if (!isNull curatorCamera || {!alive ACE_player}) exitWith {}; + + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlackout) ppEffectCommit (FX_UNCON_FADE_OUT * 1/3); + }, [], FX_UNCON_FADE_OUT * 2/3] call CBA_fnc_waitAndExecute; + + ACE_player setVariable [QGVAR(effectUnconsciousTimeout), CBA_missionTime + FX_UNCON_FADE_OUT]; + GVAR(nextFadeIn) = CBA_missionTime + FX_UNCON_FADE_OUT + 15 + random 5; + } else { + GVAR(ppUnconsciousBlur) ppEffectAdjust [5]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + GVAR(ppUnconsciousBlackout) ppEffectCommit 0; + }; + } else { + GVAR(ppUnconsciousBlur) ppEffectAdjust [0]; + GVAR(ppUnconsciousBlackout) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1]]; + GVAR(ppUnconsciousBlur) ppEffectCommit 0; + GVAR(ppUnconsciousBlackout) ppEffectCommit 0; + }; + + GVAR(ppUnconsciousBlur) ppEffectEnable _enable; + GVAR(ppUnconsciousBlackout) ppEffectEnable _enable; + }; +}; diff --git a/addons/medical_feedback/functions/fnc_handleEffects.sqf b/addons/medical_feedback/functions/fnc_handleEffects.sqf new file mode 100644 index 0000000000..e4e536c4f4 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_handleEffects.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles any visual effects of medical. + * Note: Heart beat sounds run in a different PFH - see fnc_effectHeartBeat. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_feedback_fnc_handleEffects + * + * Public: No + */ + +if (EGVAR(common,OldIsCamera) || {!alive ACE_player}) exitWith { + [false, 0] call FUNC(effectUnconscious); + [false] call FUNC(effectPain); + [false] call FUNC(effectBloodVolume); + [false] call FUNC(effectBleeding); +}; + +BEGIN_COUNTER(handleEffects); + +// - Current state info ------------------------------------------------------- +private _bleedingStrength = GET_BLOOD_LOSS(ACE_player); +private _bloodVolume = GET_BLOOD_VOLUME(ACE_player); +private _unconscious = IS_UNCONSCIOUS(ACE_player); +private _heartRate = GET_HEART_RATE(ACE_player); +private _pain = GET_PAIN_PERCEIVED(ACE_player); + +if ((!GVAR(heartBeatEffectRunning)) && {_heartRate != 0} && {(_heartRate > 160) || {_heartRate < 60}}) then { + TRACE_1("Starting heart beat effect",_heartRate); + GVAR(heartBeatEffectRunning) = true; + [] call FUNC(effectHeartBeat); +}; + +// - Visual effects ----------------------------------------------------------- +[_unconscious, 2] call FUNC(effectUnconscious); +[ + true, linearConversion [BLOOD_VOLUME_CLASS_2_HEMORRHAGE, BLOOD_VOLUME_CLASS_4_HEMORRHAGE, _bloodVolume, 0, 1, true] +] call FUNC(effectBloodVolume); + +if (!_unconscious) then { + [true, _pain] call FUNC(effectPain); +}; + +[true, _bleedingStrength] call FUNC(effectBleeding); + +END_COUNTER(handleEffects); diff --git a/addons/medical_feedback/functions/fnc_initEffects.sqf b/addons/medical_feedback/functions/fnc_initEffects.sqf new file mode 100644 index 0000000000..66099d5806 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_initEffects.sqf @@ -0,0 +1,87 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Initializes visual effects of medical. + * + * Arguments: + * 0: Just Pain Effects + * + * Return Value: + * None + * + * Example: + * [false] call ace_medical_feedback_fnc_initEffects + * + * Public: No + */ + +params [["_justPain", false]]; + +TRACE_1("initEffects",_justPain); + +private _fnc_createEffect = { + params ["_type", "_layer", "_default"]; + + private _effect = ppEffectCreate [_type, _layer]; + _effect ppEffectForceInNVG true; + _effect ppEffectAdjust _default; + _effect ppEffectCommit 0; + + _effect +}; + +// - Pain --------------------------------------------------------------------- +if (!isNil QGVAR(ppPain)) then { + TRACE_1("delete pain",GVAR(ppPain)); + ppEffectDestroy GVAR(ppPain) +}; +if (GVAR(painEffectType) == 0) then { + GVAR(ppPain) = [ + "ColorCorrections", + 13502, + [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] + ] call _fnc_createEffect; +} else { + GVAR(ppPain) = [ + "RadialBlur", // "Will not do anything if RADIAL BLUR is disabled in Video Options." + 13502, + [0, 0, 0.3, 0.39] + ] call _fnc_createEffect; +}; +TRACE_1("created pain",GVAR(ppPain)); + +if (_justPain) exitWith {}; + +// - Unconscious -------------------------------------------------------------- +GVAR(ppUnconsciousBlur) = [ + "DynamicBlur", + 813, // 135xx does not work + [0] +] call _fnc_createEffect; + +GVAR(ppUnconsciousBlackout) = [ + "ColorCorrections", + 13500, + [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] +] call _fnc_createEffect; + + +// - Blood volume ------------------------------------------------------------- +GVAR(ppBloodVolume) = [ + "ColorCorrections", + 13503, + [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0.2, 0.2, 0.2, 0]] +] call _fnc_createEffect; + +// - Incapacitation ----------------------------------------------------------- +GVAR(ppIncapacitationGlare) = [ + "ColorCorrections", + 13504, + [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]] +] call _fnc_createEffect; + +GVAR(ppIncapacitationBlur) = [ + "DynamicBlur", + 814, // 135xx does not work + [0] +] call _fnc_createEffect; diff --git a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf new file mode 100644 index 0000000000..98739d5b30 --- /dev/null +++ b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf @@ -0,0 +1,85 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Play random injured sound for a unit. The sound is broadcasted across MP. + * Will not play if the unit has already played a sound within to close a time frame. + * + * Arguments: + * 0: Unit + * 1: Type (optional) ["hit" (default) or "moan"] + * 2: Severity (optional) [0 (default), 1, 2] + * + * Return Value: + * None + * + * Example: + * [player, "hit", 1] call ace_medical_feedback_fnc_playInjuredSound + * + * Public: No + */ +#define TIME_OUT_HIT 1 +#define TIME_OUT_MOAN 5 + +params [["_unit", objNull, [objNull]], ["_type", "hit", [""]], ["_severity", 0, [0]]]; +// TRACE_3("",_unit,_type,_severity); + +if (!local _unit) exitWith { + ERROR("Unit not local or null"); +}; + +if !(_unit call EFUNC(common,isAwake)) exitWith {}; + +private _timeOut = [TIME_OUT_HIT, TIME_OUT_MOAN] select (_type == "moan"); + +// Handle timeout +if (_unit getVariable [QGVAR(soundTimeout) + _type, -1] > CBA_missionTime) exitWith {}; +_unit setVariable [QGVAR(soundTimeout) + _type, CBA_missionTime + _timeOut]; + +// Get sounds +private _soundsNamespace = NAMESPACE_NULL; + +switch (toLower _type) do { + case ("hit"): { + _soundsNamespace = GVAR(HitScreamNamespace); + }; + case ("moan"): { + _soundsNamespace = GVAR(InjuredMoanNamespace); + }; +}; + +// Get units speaker +private _speaker = speaker _unit; + +if (_speaker == "ACE_NoVoice") then { + _speaker = _unit getVariable "ace_originalSpeaker"; +}; + +private _sounds = _soundsNamespace getVariable _speaker; + +if (isNil "_sounds") then { + _sounds = _soundsNamespace getVariable (_soundsNamespace getVariable "#default"); +}; + +if (isNil "_sounds") exitWith { + ERROR("No sounds for speaker and no default found"); +}; + +// Get correct sound of the speaker +_sounds = _sounds param [_severity, []]; +(selectRandom _sounds) params ["_sound", ["_volume", 1], ["_frequency", 1], ["_distance", 80]]; + +if (isNil "_sound") exitWith { + ERROR("No sound for this speaker"); +}; + +// Delete leading slash. +if (_sound select [0, 1] == "\") then { + _sound = _sound select [1]; +}; + +// Default file extension. +if (_sound find "." == -1) then { + _sound = _sound + ".wss"; +}; + +playSound3D [_sound, objNull, false, position _unit, _volume, _frequency, _distance]; diff --git a/addons/medical_feedback/functions/script_component.hpp b/addons/medical_feedback/functions/script_component.hpp new file mode 100644 index 0000000000..ff9d04881c --- /dev/null +++ b/addons/medical_feedback/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_feedback\script_component.hpp" diff --git a/addons/medical_feedback/initSettings.sqf b/addons/medical_feedback/initSettings.sqf new file mode 100644 index 0000000000..9dd0e957c4 --- /dev/null +++ b/addons/medical_feedback/initSettings.sqf @@ -0,0 +1,21 @@ +// CBA Settings [ADDON: ace_medical_feedback]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; + +[ + QGVAR(painEffectType), + "LIST", + [localize LSTRING(painEffectType), "Selects the used pain effect type"], //@todo + _categoryArray, + [ + [0, 1], + [LLSTRING(painEffectType_whiteFlashing), LLSTRING(painEffectType_pulsingBlur)], + 0 + ], + false, + { + if (isNil QGVAR(ppPain)) exitWith {TRACE_1("Before Post-Init",_this)}; + TRACE_1("reseting ppEffect type",_this); + [true] call FUNC(initEffects); + } +] call CBA_Settings_fnc_init; diff --git a/addons/medical_feedback/script_component.hpp b/addons/medical_feedback/script_component.hpp new file mode 100644 index 0000000000..a082cd3d50 --- /dev/null +++ b/addons/medical_feedback/script_component.hpp @@ -0,0 +1,38 @@ +#define COMPONENT medical_feedback +#define COMPONENT_BEAUTIFIED Medical Feedback +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_FEEDBACK + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_FEEDBACK + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_FEEDBACK +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" + +#define EMPTY_SOUND {"A3\Sounds_F\dummysound.wss",1,1} +#define NAMESPACE_NULL locationNull + +#define DISABLE_VANILLA_SCREAMS +#define DISABLE_VANILLA_MOANS +#define DISABLE_VANILLA_HEARTBEAT +#define DISABLE_VANILLA_BLOOD_TEXTURES +#define DISABLE_VANILLA_DAMAGE_EFFECTS + +#define FX_PAIN_FADE_IN 0.3 +#define FX_PAIN_FADE_OUT 0.7 +#define FX_UNCON_FADE_IN 2.0 +#define FX_UNCON_FADE_OUT 5.0 + +#define SND_HEARBEAT_FAST (selectRandom ["ACE_heartbeat_fast_1", "ACE_heartbeat_fast_2", "ACE_heartbeat_fast_3"]) +#define SND_HEARBEAT_NORMAL (selectRandom ["ACE_heartbeat_norm_1", "ACE_heartbeat_norm_2"]) +#define SND_HEARBEAT_SLOW (selectRandom ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]) + +#define VOL_UNCONSCIOUS 0.25 diff --git a/addons/medical/sounds/heart_beats/fast_1.wav b/addons/medical_feedback/sounds/fast_1.wav similarity index 100% rename from addons/medical/sounds/heart_beats/fast_1.wav rename to addons/medical_feedback/sounds/fast_1.wav diff --git a/addons/medical/sounds/heart_beats/fast_2.wav b/addons/medical_feedback/sounds/fast_2.wav similarity index 100% rename from addons/medical/sounds/heart_beats/fast_2.wav rename to addons/medical_feedback/sounds/fast_2.wav diff --git a/addons/medical/sounds/heart_beats/fast_3.wav b/addons/medical_feedback/sounds/fast_3.wav similarity index 100% rename from addons/medical/sounds/heart_beats/fast_3.wav rename to addons/medical_feedback/sounds/fast_3.wav diff --git a/addons/medical/sounds/heart_beats/norm_1.wav b/addons/medical_feedback/sounds/norm_1.wav similarity index 100% rename from addons/medical/sounds/heart_beats/norm_1.wav rename to addons/medical_feedback/sounds/norm_1.wav diff --git a/addons/medical/sounds/heart_beats/norm_2.wav b/addons/medical_feedback/sounds/norm_2.wav similarity index 100% rename from addons/medical/sounds/heart_beats/norm_2.wav rename to addons/medical_feedback/sounds/norm_2.wav diff --git a/addons/medical/sounds/heart_beats/slow_1.wav b/addons/medical_feedback/sounds/slow_1.wav similarity index 100% rename from addons/medical/sounds/heart_beats/slow_1.wav rename to addons/medical_feedback/sounds/slow_1.wav diff --git a/addons/medical/sounds/heart_beats/slow_2.wav b/addons/medical_feedback/sounds/slow_2.wav similarity index 100% rename from addons/medical/sounds/heart_beats/slow_2.wav rename to addons/medical_feedback/sounds/slow_2.wav diff --git a/addons/medical_feedback/stringtable.xml b/addons/medical_feedback/stringtable.xml new file mode 100644 index 0000000000..9e2e45efaa --- /dev/null +++ b/addons/medical_feedback/stringtable.xml @@ -0,0 +1,62 @@ + + + + + + Feedback + + + Enable Screams + Включить крики + Aktywuj wrzaski + Activar gritos + Schreie aktivieren + Povolit křik + Ativar gritos + Activer les hurlements + Kiáltások engedélyezése + Abilita Grida + 叫びを有効化 + 비명 활성화 + 启用尖叫 + 啟用尖叫 + + + Enable screaming by injured units + Включить крики раненных бойцов + Aktywuj wrzeszczenie z bólu przez ranne jednostki + Activar gritos para unidades heridas + Aktiviere Schreie bei verletzten Einheiten + Povolit křičení zraněných jednotek + Ativa gritos para unidades feridas + Active les hurlements d'unités blessées + Engedélyezi a sérült egységek kiáltásait + Abilita Grida da parte delle unità ferite + 負傷したユニットが叫ぶように + 부상당한 인원이 소리지르는것을 활성화합니다 + 启用伤者的尖叫声 + 啟用傷者的尖叫聲 + + + + Pain Effect Type + Schmerzeffekt-Typ + Rodzaj efektu bólu + Визуальный эффект боли + Pain Effect Type + Tipo de efecto de dolor + Type d'effet de douleur + Fájdalom-effekt típusa + Tipo do efeito de dor + Typ bolesti - efekt + 痛みの種類 + 고통 효과 종류 + + + White flashing + + + Pulsing blur + + + diff --git a/addons/medical_gui/$PBOPREFIX$ b/addons/medical_gui/$PBOPREFIX$ new file mode 100644 index 0000000000..8eca0a3cfe --- /dev/null +++ b/addons/medical_gui/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_gui diff --git a/addons/medical_menu/CfgEventHandlers.hpp b/addons/medical_gui/CfgEventHandlers.hpp similarity index 100% rename from addons/medical_menu/CfgEventHandlers.hpp rename to addons/medical_gui/CfgEventHandlers.hpp diff --git a/addons/medical_gui/CfgVehicles.hpp b/addons/medical_gui/CfgVehicles.hpp new file mode 100644 index 0000000000..3d11924bf3 --- /dev/null +++ b/addons/medical_gui/CfgVehicles.hpp @@ -0,0 +1,65 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Medical { + displayName = CSTRING(Medical); + condition = QGVAR(enableSelfActions); + exceptions[] = {"isNotInside", "isNotSitting"}; + statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); + runOnHover = 1; + icon = QPATHTOF(ui\cross.paa); + #define ACTION_CONDITION condition = "true"; + #include "InteractionBodyParts.hpp" + #undef ACTION_CONDITION + }; + class ACE_Medical_Menu { + displayName = CSTRING(MedicalMenu); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canOpenMenu)); + exceptions[] = {"isNotInside", "isNotSwimming"}; + statement = QUOTE(_target call FUNC(openMenu)); + icon = QPATHTOF(ui\cross.paa); + }; + }; + class ACE_Actions { + #define ACTION_CONDITION condition = QUOTE(GVAR(enableActions) == 0); + #include "InteractionBodyParts.hpp" + #undef ACTION_CONDITION + class ACE_MainActions { + class ACE_Medical_Menu { + displayName = CSTRING(MedicalMenu); + condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); + exceptions[] = {"isNotInside", "isNotSwimming"}; + statement = QUOTE(_target call FUNC(openMenu)); + icon = QPATHTOF(ui\cross.paa); + }; + class ACE_Medical_Radial { + displayName = CSTRING(Medical); + condition = QUOTE((GVAR(enableActions) == 1 || {GVAR(enableActions) != 2 && {vehicle _target != _target && {vehicle _target == vehicle _player}}})); + exceptions[] = {"isNotInside", "isNotSitting"}; + statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); + runOnHover = 1; + icon = QPATHTOF(ui\cross.paa); + #define ACTION_CONDITION condition = "true"; + #include "InteractionBodyParts.hpp" + #undef ACTION_CONDITION + }; + class ACE_LoadPatient { + displayName = CSTRING(LoadPatient); + condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {alive _target} && {vehicle _target == _target}); + exceptions[] = {"isNotDragging", "isNotCarrying"}; + statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,actionLoadUnit)); + icon = QPATHTOF(ui\cross.paa); + insertChildren = QUOTE(call DEFUNC(medical_treatment,addLoadPatientActions)); + }; + class ACE_UnloadPatient { + displayName = CSTRING(UnloadPatient); + condition = QUOTE(_target getVariable [ARR_2('ACE_isUnconscious',false)] && {vehicle _target != _target} && {vehicle _player == _player}); + exceptions[] = {"isNotDragging", "isNotCarrying", "isNotInside"}; + statement = QUOTE([ARR_2(_player, _target)] call EFUNC(medical_treatment,actionUnloadUnit)); + icon = QPATHTOF(ui\cross.paa); + }; + }; + }; + }; +}; diff --git a/addons/medical_gui/InteractionBodyParts.hpp b/addons/medical_gui/InteractionBodyParts.hpp new file mode 100644 index 0000000000..b06e24c2e7 --- /dev/null +++ b/addons/medical_gui/InteractionBodyParts.hpp @@ -0,0 +1,67 @@ +class ACE_Head { + displayName = ECSTRING(interaction,Head); + distance = MEDICAL_ACTION_DISTANCE; + icon = QPATHTOF(ui\cross.paa); + exceptions[] = {"isNotInside", "isNotSitting"}; + ACTION_CONDITION + statement = QUOTE([ARR_2(_target,0)] call FUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_3(_target,0,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; +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)); + modifierFunction = QUOTE([ARR_3(_target,1,_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_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)); + modifierFunction = QUOTE([ARR_3(_target,2,_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)); + modifierFunction = QUOTE([ARR_3(_target,3,_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)); + modifierFunction = QUOTE([ARR_3(_target,4,_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)); + modifierFunction = QUOTE([ARR_3(_target,5,_this select 3)] call FUNC(modifyAction)); + runOnHover = 1; +}; diff --git a/addons/medical/README.md b/addons/medical_gui/README.md similarity index 52% rename from addons/medical/README.md rename to addons/medical_gui/README.md index ecf8f5793e..37bd6250fd 100644 --- a/addons/medical/README.md +++ b/addons/medical_gui/README.md @@ -1,12 +1,11 @@ -ace_medical +ace_medical_gui =============== -Provides a basic and advanced medical system. - +Implements the interaction menu actions, medical menu, information display, and triage card. ## Maintainers The people responsible for merging changes to this component or answering potential questions. - [Glowbal](https://github.com/Glowbal) -- [KoffeinFlummi](https://github.com/KoffeinFlummi) +- [mharis001](https://github.com/mharis001) diff --git a/addons/medical_gui/XEH_PREP.hpp b/addons/medical_gui/XEH_PREP.hpp new file mode 100644 index 0000000000..c53b693bdf --- /dev/null +++ b/addons/medical_gui/XEH_PREP.hpp @@ -0,0 +1,22 @@ +PREP(addTreatmentActions); +PREP(bloodLossToRGBA); +PREP(canOpenMenu); +PREP(collectActions); +PREP(damageToRGBA); +PREP(displayPatientInformation); +PREP(displayTriageCard); +PREP(handleToggle); +PREP(handleTriageSelect); +PREP(menuPFH); +PREP(modifyAction); +PREP(onMenuClose); +PREP(onMenuOpen); +PREP(openMenu); +PREP(toggleTriageSelect); +PREP(updateActions); +PREP(updateBodyImage); +PREP(updateCategories); +PREP(updateInjuryList); +PREP(updateLogList); +PREP(updateTriageCard); +PREP(updateTriageStatus); diff --git a/addons/medical_gui/XEH_postInit.sqf b/addons/medical_gui/XEH_postInit.sqf new file mode 100644 index 0000000000..c6dd4e2722 --- /dev/null +++ b/addons/medical_gui/XEH_postInit.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +GVAR(target) = objNull; +GVAR(previousTarget) = objNull; +GVAR(selectedBodyPart) = 0; +GVAR(selectedCategory) = "triage"; + +GVAR(lastOpenedOn) = -1; +GVAR(pendingReopen) = false; + +GVAR(menuPFH) = -1; + +GVAR(selfInteractionActions) = []; +[] call FUNC(addTreatmentActions); +[] call FUNC(collectActions); + +[QEGVAR(interact_menu,newControllableObject), { + params ["_type"]; // string of the object's classname + if (!(_type isKindOf "CAManBase")) exitWith {}; + { + _x set [0, _type]; + _x call EFUNC(interact_menu,addActionToClass); + } forEach GVAR(selfInteractionActions); +}] call CBA_fnc_addEventHandler; + +["ace_treatmentSucceded", { + if (GVAR(openAfterTreatment) && {GVAR(pendingReopen)}) then { + GVAR(pendingReopen) = false; + [FUNC(openMenu), GVAR(target)] call CBA_fnc_execNextFrame; + }; +}] call CBA_fnc_addEventHandler; + +["ACE3 Common", QGVAR(openMedicalMenuKey), localize LSTRING(OpenMedicalMenu), { + // Get target (cursorTarget and cursorObject), if not valid then target is ACE_player + TRACE_3("Open menu key",cursorTarget,cursorObject,ACE_player); + private _target = cursorTarget; + if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then { + _target = cursorObject; + if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then { + _target = ACE_player; + }; + }; + + // Check conditions: canInteract and canOpenMenu + if !([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, _target] call FUNC(canOpenMenu)) exitWith {false}; + + // Statement + [_target] call FUNC(openMenu); + false +}, { + // Close menu if enough time passed from opening + if (CBA_missionTime - GVAR(lastOpenedOn) > 0.5) exitWith { + [objNull] call FUNC(openMenu); + }; + false +}, [DIK_H, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + + +// Close patient information display when interaction menu is closed +["ace_interactMenuClosed", { + QGVAR(RscPatientInfo) cutFadeOut 0.3; +}] call CBA_fnc_addEventHandler; diff --git a/addons/medical_gui/XEH_preInit.sqf b/addons/medical_gui/XEH_preInit.sqf new file mode 100644 index 0000000000..9361d05015 --- /dev/null +++ b/addons/medical_gui/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/medical_gui/XEH_preStart.sqf b/addons/medical_gui/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_gui/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_gui/config.cpp b/addons/medical_gui/config.cpp new file mode 100644 index 0000000000..10efc9d90f --- /dev/null +++ b/addons/medical_gui/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_treatment", "ace_interaction"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "mharis001"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "gui.hpp" diff --git a/addons/medical/ui/body_arm_left.paa b/addons/medical_gui/data/body_image/arm_left.paa similarity index 100% rename from addons/medical/ui/body_arm_left.paa rename to addons/medical_gui/data/body_image/arm_left.paa diff --git a/addons/medical_gui/data/body_image/arm_left_t.paa b/addons/medical_gui/data/body_image/arm_left_t.paa new file mode 100644 index 0000000000..0f8ac03f2e Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_left_t.paa differ diff --git a/addons/medical/ui/body_arm_right.paa b/addons/medical_gui/data/body_image/arm_right.paa similarity index 100% rename from addons/medical/ui/body_arm_right.paa rename to addons/medical_gui/data/body_image/arm_right.paa diff --git a/addons/medical_gui/data/body_image/arm_right_t.paa b/addons/medical_gui/data/body_image/arm_right_t.paa new file mode 100644 index 0000000000..5e64adf0f2 Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_right_t.paa differ diff --git a/addons/medical/ui/body_background.paa b/addons/medical_gui/data/body_image/background.paa similarity index 100% rename from addons/medical/ui/body_background.paa rename to addons/medical_gui/data/body_image/background.paa diff --git a/addons/medical/ui/body_head.paa b/addons/medical_gui/data/body_image/head.paa similarity index 100% rename from addons/medical/ui/body_head.paa rename to addons/medical_gui/data/body_image/head.paa diff --git a/addons/medical/ui/body_leg_left.paa b/addons/medical_gui/data/body_image/leg_left.paa similarity index 100% rename from addons/medical/ui/body_leg_left.paa rename to addons/medical_gui/data/body_image/leg_left.paa diff --git a/addons/medical_gui/data/body_image/leg_left_t.paa b/addons/medical_gui/data/body_image/leg_left_t.paa new file mode 100644 index 0000000000..035586906d Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_left_t.paa differ diff --git a/addons/medical/ui/body_leg_right.paa b/addons/medical_gui/data/body_image/leg_right.paa similarity index 100% rename from addons/medical/ui/body_leg_right.paa rename to addons/medical_gui/data/body_image/leg_right.paa diff --git a/addons/medical_gui/data/body_image/leg_right_t.paa b/addons/medical_gui/data/body_image/leg_right_t.paa new file mode 100644 index 0000000000..3a1f397e39 Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_right_t.paa differ diff --git a/addons/medical/ui/body_torso.paa b/addons/medical_gui/data/body_image/torso.paa similarity index 100% rename from addons/medical/ui/body_torso.paa rename to addons/medical_gui/data/body_image/torso.paa diff --git a/addons/medical_menu/data/icons/advanced_treatment_small.paa b/addons/medical_gui/data/categories/advanced_treatment.paa similarity index 100% rename from addons/medical_menu/data/icons/advanced_treatment_small.paa rename to addons/medical_gui/data/categories/advanced_treatment.paa diff --git a/addons/medical_menu/data/icons/airway_management_small.paa b/addons/medical_gui/data/categories/airway_management.paa similarity index 100% rename from addons/medical_menu/data/icons/airway_management_small.paa rename to addons/medical_gui/data/categories/airway_management.paa diff --git a/addons/medical_menu/data/icons/bandage_fracture_small.paa b/addons/medical_gui/data/categories/bandage_fracture.paa similarity index 100% rename from addons/medical_menu/data/icons/bandage_fracture_small.paa rename to addons/medical_gui/data/categories/bandage_fracture.paa diff --git a/addons/medical_menu/data/icons/icon_carry.paa b/addons/medical_gui/data/categories/carry.paa similarity index 100% rename from addons/medical_menu/data/icons/icon_carry.paa rename to addons/medical_gui/data/categories/carry.paa diff --git a/addons/medical_menu/data/icons/examine_patient_small.paa b/addons/medical_gui/data/categories/examine_patient.paa similarity index 100% rename from addons/medical_menu/data/icons/examine_patient_small.paa rename to addons/medical_gui/data/categories/examine_patient.paa diff --git a/addons/medical_menu/data/icons/medication_small.paa b/addons/medical_gui/data/categories/medication.paa similarity index 100% rename from addons/medical_menu/data/icons/medication_small.paa rename to addons/medical_gui/data/categories/medication.paa diff --git a/addons/medical_menu/data/icons/toggle_self_small.paa b/addons/medical_gui/data/categories/toggle_self.paa similarity index 100% rename from addons/medical_menu/data/icons/toggle_self_small.paa rename to addons/medical_gui/data/categories/toggle_self.paa diff --git a/addons/medical_menu/data/icons/triage_card_small.paa b/addons/medical_gui/data/categories/triage_card.paa similarity index 100% rename from addons/medical_menu/data/icons/triage_card_small.paa rename to addons/medical_gui/data/categories/triage_card.paa diff --git a/addons/medical/ui/triage_card_corner_l.paa b/addons/medical_gui/data/triage_card/corner_left.paa similarity index 100% rename from addons/medical/ui/triage_card_corner_l.paa rename to addons/medical_gui/data/triage_card/corner_left.paa diff --git a/addons/medical/ui/triage_card_corner_r.paa b/addons/medical_gui/data/triage_card/corner_right.paa similarity index 100% rename from addons/medical/ui/triage_card_corner_r.paa rename to addons/medical_gui/data/triage_card/corner_right.paa diff --git a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf new file mode 100644 index 0000000000..541c308ff0 --- /dev/null +++ b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut, mharis001 + * Creates actions for treatments from config and adds them to the interaction menu. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_addTreatmentActions + * + * Public: No + */ + +private _actionsConfig = configFile >> QEGVAR(medical_treatment,actions); +private _actionPaths = ["ACE_Head", "ACE_Torso", "ACE_ArmLeft", "ACE_ArmRight", "ACE_LegLeft", "ACE_LegRight"]; + +private _fnc_statement = { + params ["_target", "_player", "_args"]; + _args params ["_bodyPart", "_treatmentName"]; + [_player, _target, _bodyPart, _treatmentName] call EFUNC(medical_treatment,treatment); +}; + +private _fnc_condition = { + params ["_target", "_player", "_args"]; + _args params ["_bodyPart", "_treatmentName"]; + [_player, _target, _bodyPart, _treatmentName] call EFUNC(medical_treatment,canTreatCached); +}; + +{ + private _configName = configName _x; + private _actionName = format [QGVAR(_%1), _configName]; + private _displayName = getText (_x >> "displayName"); + private _icon = getText (_x >> "icon"); + + private _allowedBodyParts = getArray (_x >> "allowedSelections") apply {toLower _x}; + if (_allowedBodyParts isEqualTo ["all"]) then { + _allowedBodyParts = ALL_BODY_PARTS apply {toLower _x}; + }; + + { + private _bodyPart = _x; + private _actionPath = _actionPaths select (ALL_BODY_PARTS find toLower _bodyPart); + + private _action = [ + _actionName, + _displayName, + _icon, + _fnc_statement, + _fnc_condition, + {}, + [_bodyPart, _configName], + {[0, 0, 0]}, + 2, + [false, true, false, false, false] + ] call EFUNC(interact_menu,createAction); + + ["CAManBase", 0, [_actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); + ["CAManBase", 0, ["ACE_MainActions", "ACE_Medical_Radial", _actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); + GVAR(selfInteractionActions) pushBack ["", 1, ["ACE_SelfActions", "ACE_Medical", _actionPath], _action]; + } forEach _allowedBodyParts; +} forEach configProperties [_actionsConfig, "isClass _x"]; diff --git a/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf new file mode 100644 index 0000000000..b2852e1a2a --- /dev/null +++ b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: ShackTac, SilentSpike + * Converts a blood loss value into a representative RGBA colour. + * Blood loss colouring follows a "white, yellow, red" colour scale with 10 steps, Bezier interpolation and Correct lightness gradient. + * See: https://gka.github.io/palettes + * + * Arguments: + * 0: The blood loss value (range [0,1]) + * + * Return Value: + * Representative RGBA colour + * + * Example: + * [0.4] call ace_medical_gui_fnc_bloodLossToRGBA + * + * Public: No + */ + +params ["_bloodLoss"]; + +private _frBL = 0 max (_bloodLoss / BLOOD_LOSS_RED_THRESHOLD) min 1; +private _colorInt = ceil (_frBL * (BLOOD_LOSS_TOTAL_COLORS - 1)); + +[ + [1.00, 1.00, 1.00, 1], // #ffffff + [1.00, 0.95, 0.63, 1], // #fff1a1 + [1.00, 0.88, 0.46, 1], // #ffe075 + [1.00, 0.80, 0.33, 1], // #ffcb55 + [1.00, 0.72, 0.24, 1], // #ffb73c + [1.00, 0.63, 0.15, 1], // #ffa127 + [1.00, 0.53, 0.08, 1], // #ff8815 + [1.00, 0.43, 0.02, 1], // #ff6d05 + [1.00, 0.29, 0.00, 1], // #ff4b00 + [1.00, 0.00, 0.00, 1] // #ff0000 +] select _colorInt; diff --git a/addons/medical_gui/functions/fnc_canOpenMenu.sqf b/addons/medical_gui/functions/fnc_canOpenMenu.sqf new file mode 100644 index 0000000000..f94c73bb9e --- /dev/null +++ b/addons/medical_gui/functions/fnc_canOpenMenu.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Checks if the player can open the Medical Menu for the target. + * + * Arguments: + * 0: Player + * 1: Target + * + * Return Value: + * Can open + * + * Example: + * [player, cursorTarget] call ace_medical_gui_fnc_canOpenMenu + * + * Public: No + */ + +params ["_player", "_target"]; + +alive _player +&& {!IS_UNCONSCIOUS(_player)} +&& {!isNull _target} +&& {_player distance _target < GVAR(maxDistance) || {vehicle _player == vehicle _target}} +&& {GVAR(enableMedicalMenu) == 1 || {GVAR(enableMedicalMenu) == 2 && {vehicle _player != _player || {vehicle _target != _target}}}} diff --git a/addons/medical_gui/functions/fnc_collectActions.sqf b/addons/medical_gui/functions/fnc_collectActions.sqf new file mode 100644 index 0000000000..088ddb29fa --- /dev/null +++ b/addons/medical_gui/functions/fnc_collectActions.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Collect treatment actions for medical menu from config. + * Adds dragging actions if it exists. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_collectAction + * + * Public: No + */ + +GVAR(actions) = []; + +{ + private _configName = configName _x; + private _displayName = getText (_x >> "displayName"); + private _category = getText (_x >> "category"); + private _condition = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,canTreatCached)), ALL_BODY_PARTS, _configName]; + private _statement = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,treatment)), ALL_BODY_PARTS, _configName]; + + GVAR(actions) pushBack [_displayName, _category, _condition, _statement]; +} forEach configProperties [configFile >> QEGVAR(medical_treatment,actions), "isClass _x"]; + + +if ("ace_dragging" call EFUNC(common,isModLoaded)) then { + GVAR(actions) pushBack [ + localize ELSTRING(dragging,Drag), "drag", + {ACE_player != GVAR(target) && {[ACE_player, GVAR(target)] call EFUNC(dragging,canDrag)}}, + { + GVAR(pendingReopen) = false; + [ACE_player, GVAR(target)] call EFUNC(dragging,startDrag); + } + ]; + + GVAR(actions) pushBack [ + localize ELSTRING(dragging,Carry), "drag", + {ACE_player != GVAR(target) && {[ACE_player, GVAR(target)] call EFUNC(dragging,canCarry)}}, + { + GVAR(pendingReopen) = false; + [ACE_player, GVAR(target)] call EFUNC(dragging,startCarry); + } + ]; +}; diff --git a/addons/medical_gui/functions/fnc_damageToRGBA.sqf b/addons/medical_gui/functions/fnc_damageToRGBA.sqf new file mode 100644 index 0000000000..f487a332d1 --- /dev/null +++ b/addons/medical_gui/functions/fnc_damageToRGBA.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: ShackTac, SilentSpike + * Converts a damage value into a representative RGBA colour. + * Damage colouring follows a "white, cyan, blue" colour scale with 10 steps, Bezier interpolation and Correct lightness gradient. + * See: https://gka.github.io/palettes + * + * Arguments: + * 0: The damage value (range [0,1]) + * + * Return Value: + * Representative RGBA colour + * + * Example: + * [0.4] call ace_medical_gui_fnc_damageToRGBA + * + * Public: No + */ + +params ["_damage"]; + +private _frD = 0 max (_damage / DAMAGE_BLUE_THRESHOLD) min 1; +private _colorInt = ceil (_frD * (DAMAGE_TOTAL_COLORS - 1)); + +[ + [1.00, 1.00, 1.00, 1], // #ffffff + [0.75, 0.95, 1.00, 1], // #bff2ff + [0.63, 0.87, 1.00, 1], // #a0ddff + [0.54, 0.77, 1.00, 1], // #8ac4ff + [0.48, 0.67, 1.00, 1], // #7aacff + [0.42, 0.57, 1.00, 1], // #6c91ff + [0.37, 0.47, 1.00, 1], // #5e77ff + [0.31, 0.35, 1.00, 1], // #4e5aff + [0.22, 0.23, 1.00, 1], // #383bff + [0.00, 0.00, 1.00, 1] // #0000ff +] select _colorInt diff --git a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf new file mode 100644 index 0000000000..25f87f93ce --- /dev/null +++ b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Opens the patient information display for given target. + * + * Arguments: + * 0: Target + * 1: Body part + * + * Return Value: + * None + * + * Example: + * [_target, 0] call ace_medical_gui_fnc_displayPatientInformation + * + * Public: No + */ + +#define MAX_DISTANCE 4 + +params ["_target", "_selectionN"]; + +private _display = uiNamespace getVariable [QGVAR(RscPatientInfo), displayNull]; + +if (isNull _display) then { + QGVAR(RscPatientInfo) cutRsc [QGVAR(RscPatientInfo), "PLAIN", -1, false]; + _display = uiNamespace getVariable [QGVAR(RscPatientInfo), displayNull]; + + [{ + params ["_display", "_pfhID"]; + + if (isNull _display) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + + private _target = _display getVariable [QGVAR(target), objNull]; + private _selectionN = _display getVariable [QGVAR(selectionN), 0]; + + // Close display if target moved too far away (ignore if in same vehicle) + if (ACE_player distance _target > MAX_DISTANCE && {vehicle _target != vehicle ACE_player}) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + QGVAR(RscPatientInfo) cutFadeOut 0.3; + [[ELSTRING(medical,DistanceToFar), _target call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); + }; + + // Update body image + private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP; + [_ctrlBodyImage, _target] call FUNC(updateBodyImage); + + // Update injury list + private _ctrlInjuries = _display displayCtrl IDC_INJURIES; + [_ctrlInjuries, _target, _selectionN] call FUNC(updateInjuryList); + + // Update activity log + private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; + private _activityLog = _target getVariable [QEGVAR(medical,logFile_activity_view), []]; + [_ctrlActivityLog, _activityLog] call FUNC(updateLogList); + + // Update triage status + [_display, _target] call FUNC(updateTriageStatus); + }, 0, _display] call CBA_fnc_addPerFrameHandler; +}; + +_display setVariable [QGVAR(target), _target]; +_display setVariable [QGVAR(selectionN), _selectionN]; diff --git a/addons/medical_gui/functions/fnc_displayTriageCard.sqf b/addons/medical_gui/functions/fnc_displayTriageCard.sqf new file mode 100644 index 0000000000..3a7f8c4adf --- /dev/null +++ b/addons/medical_gui/functions/fnc_displayTriageCard.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Displays the triage card for the target. + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [_target] call ace_medical_gui_fnc_displayTriageCard + * + * Public: No + */ + +params ["_target"]; + +createDialog QGVAR(RscTriageCard); +private _display = uiNamespace getVariable [QGVAR(RscTriageCard), displayNull]; + +// Set global target variable for triage buttons +GVAR(target) = _target; + +// Initially hide the triage select buttons +[_display] call FUNC(toggleTriageSelect); + +[{ + params ["_args", "_pfhID"]; + _args params ["_display", "_target"]; + + if (isNull _display) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + + // Update triage card + private _ctrlTriageCard = _display displayCtrl IDC_TRIAGE_CARD; + [_ctrlTriageCard, _target] call FUNC(updateTriageCard); + + // Update triage status + [_display, _target] call FUNC(updateTriageStatus); +}, 0, [_display, _target]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical_gui/functions/fnc_handleToggle.sqf b/addons/medical_gui/functions/fnc_handleToggle.sqf new file mode 100644 index 0000000000..c2634affdb --- /dev/null +++ b/addons/medical_gui/functions/fnc_handleToggle.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles toggling of Medical Menu between the player and previous target. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_handleToggle + * + * Public: No + */ + +// Find new target to switch to +private _target = if ( + GVAR(target) == ACE_player + && {[ACE_player, GVAR(previousTarget)] call EFUNC(common,canInteractWith)} + && {[ACE_player, GVAR(previousTarget)] call FUNC(canOpenMenu)} +) then { + GVAR(previousTarget); +} else { + ACE_player; +}; + +// Exit if new target is same as old +if (GVAR(target) == _target) exitWith {}; +GVAR(previousTarget) = GVAR(target); + +// Close and reopen dialog for new target +closeDialog 0; +[FUNC(openMenu), _target, 0.1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_gui/functions/fnc_handleTriageSelect.sqf b/addons/medical_gui/functions/fnc_handleTriageSelect.sqf new file mode 100644 index 0000000000..31a25e18ee --- /dev/null +++ b/addons/medical_gui/functions/fnc_handleTriageSelect.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles clicking the triage select buttons. + * + * Arguments: + * 0: Display + * 1: Target + * 2: Triage status + * + * Return Value: + * None + * + * Example: + * [DISPLAY, _target, 0] call ace_medical_gui_fnc_handleTriageSelect + * + * Public: No + */ + +params ["_display", "_target", "_triageLevel"]; + +[_display] call FUNC(toggleTriageSelect); +[_target, _triageLevel] call EFUNC(medical_treatment,setTriageStatus); diff --git a/addons/medical_gui/functions/fnc_menuPFH.sqf b/addons/medical_gui/functions/fnc_menuPFH.sqf new file mode 100644 index 0000000000..9d24ffd6d3 --- /dev/null +++ b/addons/medical_gui/functions/fnc_menuPFH.sqf @@ -0,0 +1,55 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Handles updating the Medical Menu UI for the current target. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_menuPFH + * + * Public: No + */ + +// Check if menu should stay open for target +if !([ACE_player, GVAR(target), ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith) && {[ACE_player, GVAR(target)] call FUNC(canOpenMenu)}) then { + closeDialog 0; + // Show hint if distance condition failed + if (ACE_player distance GVAR(target) > GVAR(maxDistance)) then { + [[ELSTRING(medical,DistanceToFar), GVAR(target) call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); + }; +}; + +// Get the Medical Menu display +private _display = uiNamespace getVariable [QGVAR(menuDisplay), displayNull]; +if (isNull _display) exitWith {}; + +// Update treatment category buttons +[_display] call FUNC(updateCategories); + +// Update treatment actions for current category +[_display] call FUNC(updateActions); + +// Update injury list +private _ctrlInjuries = _display displayCtrl IDC_INJURIES; +[_ctrlInjuries, GVAR(target), GVAR(selectedBodyPart)] call FUNC(updateInjuryList); + +// Update body image +private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP; +[_ctrlBodyImage, GVAR(target)] call FUNC(updateBodyImage); + +// Update activity and quick view logs +private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; +private _activityLog = GVAR(target) getVariable [QEGVAR(medical,logFile_activity_view), []]; +[_ctrlActivityLog, _activityLog] call FUNC(updateLogList); + +private _ctrlQuickView = _display displayCtrl IDC_QUICKVIEW; +private _quickView = GVAR(target) getVariable [QEGVAR(medical,logFile_quick_view), []]; +[_ctrlQuickView, _quickView] call FUNC(updateLogList); + +// Update triage status +[_display, GVAR(target)] call FUNC(updateTriageStatus); diff --git a/addons/medical_gui/functions/fnc_modifyAction.sqf b/addons/medical_gui/functions/fnc_modifyAction.sqf new file mode 100644 index 0000000000..d4754dab06 --- /dev/null +++ b/addons/medical_gui/functions/fnc_modifyAction.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +/* + * Author: esteldunedain, SilentSpike, mharis001 + * Modifies the medical action icons to show blood loss and tourniquets. + * + * Arguments: + * 0: Unit + * 1: Body part index + * 2: Action data + * + * Return Value: + * None + * + * Example: + * [_target, 0, _actionData] call ace_medical_gui_fnc_modifyAction + * + * Public: No + */ + +#define COLOR_SCALE ["#ffffff", "#fff1a1", "#ffe075", "#ffcb55", "#ffb73c", "#ffa127", "#ff8815", "#ff6d05", "#ff4b00", "#ff0000"] + +params ["_target", "_partIndex", "_actionData"]; + +private _bloodLossOnBodyPart = 0; + +// Add all bleeding from wounds on selection +{ + _x params ["", "", "_bodyPartN", "_amountOf", "_bleeding"]; + + if (_bodyPartN == _partIndex) then { + _bloodLossOnBodyPart = _bloodLossOnBodyPart + (_amountOf * _bleeding); + }; +} forEach (_target getvariable [QEGVAR(medical,openWounds), []]); + +private _frBL = 0 max (_bloodLossOnBodyPart / BLOOD_LOSS_RED_THRESHOLD) min 1; +private _colorInt = ceil (_frBL * (BLOOD_LOSS_TOTAL_COLORS - 1)); // ceil because any bleeding more than zero shouldn't be white + +if (HAS_TOURNIQUET_APPLIED_ON(_target,_partIndex)) then { + _actionData set [2, format [QPATHTOF(ui\cross_t_%1.paa), _colorInt]]; +} else { + _actionData set [2, [QPATHTOF(ui\cross.paa), COLOR_SCALE select _colorInt]]; +}; diff --git a/addons/medical_gui/functions/fnc_onMenuClose.sqf b/addons/medical_gui/functions/fnc_onMenuClose.sqf new file mode 100644 index 0000000000..bc65e975fd --- /dev/null +++ b/addons/medical_gui/functions/fnc_onMenuClose.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: joko // Jonas + * Handles closing the Medical Menu. Called from onUnload event. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_medical_gui_fnc_onMenuClose + * + * Public: No + */ + +if (EGVAR(interact_menu,menuBackground) == 1) then {[QGVAR(id), false] call EFUNC(common,blurScreen)}; +if (EGVAR(interact_menu,menuBackground) == 2) then {(uiNamespace getVariable [QEGVAR(interact_menu,menuBackground), displayNull]) closeDisplay 0}; + +GVAR(menuPFH) call CBA_fnc_removePerFrameHandler; +GVAR(menuPFH) = -1; diff --git a/addons/medical_gui/functions/fnc_onMenuOpen.sqf b/addons/medical_gui/functions/fnc_onMenuOpen.sqf new file mode 100644 index 0000000000..be4707918f --- /dev/null +++ b/addons/medical_gui/functions/fnc_onMenuOpen.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Handles opening the Medical Menu. Called from onLoad event. + * + * Arguments: + * 0: Medical Menu display + * + * Return Value: + * None + * + * Example: + * [DISPLAY] call ace_medical_gui_fnc_onMenuOpen + * + * Public: No + */ + +params ["_display"]; + +// Create background effects based on interact menu setting +if (EGVAR(interact_menu,menuBackground) == 1) then {[QGVAR(id), true] call EFUNC(common,blurScreen)}; +if (EGVAR(interact_menu,menuBackground) == 2) then {0 cutRsc [QEGVAR(interact_menu,menuBackground), "PLAIN", 1, false]}; + +// Fix mouse moving randomly +[{ + [{setMousePosition _this}, _this] call CBA_fnc_execNextFrame; +}, getMousePosition] call CBA_fnc_execNextFrame; + +// Set target name as title +private _ctrlTitle = _display displayCtrl IDC_TITLE; +_ctrlTitle ctrlSetText ([GVAR(target)] call EFUNC(common,getName)); + +// Initially hide the triage select buttons +[_display] call FUNC(toggleTriageSelect); + +// Store display and add PFH to update it +uiNamespace setVariable [QGVAR(menuDisplay), _display]; +["ace_medicalMenuOpened", [ACE_player, GVAR(target), _display]] call CBA_fnc_localEvent; + +if (GVAR(menuPFH) != -1) exitWith { + TRACE_1("Menu PFH already running",GVAR(menuPFH)); +}; + +GVAR(menuPFH) = [FUNC(menuPFH), 0, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical_gui/functions/fnc_openMenu.sqf b/addons/medical_gui/functions/fnc_openMenu.sqf new file mode 100644 index 0000000000..cd8f71274c --- /dev/null +++ b/addons/medical_gui/functions/fnc_openMenu.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Opens the Medical Menu for given target. + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [ACE_player] call ace_medical_gui_fnc_openMenu + * + * Public: No + */ + +params ["_target"]; + +if (dialog || {isNull _target}) exitWith { + private _display = uiNamespace getVariable [QGVAR(menuDisplay), displayNull]; + if (!isNull _display) then {closeDialog 0}; +}; + +// Store current target +GVAR(target) = _target; + +// Create the menu display +createDialog "ACE_Medical_Menu"; +GVAR(lastOpenedOn) = CBA_missionTime; diff --git a/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf b/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf new file mode 100644 index 0000000000..11281692e3 --- /dev/null +++ b/addons/medical_gui/functions/fnc_toggleTriageSelect.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Toggles showing of the triage select buttons. + * + * Arguments: + * 0: Display + * + * Return Value: + * None + * + * Example: + * [DISPLAY] call ace_medical_gui_fnc_toggleTriageSelect + * + * Public: No + */ + +params ["_display"]; + +private _ctrlTriageSelect = _display displayCtrl IDC_TRIAGE_SELECT; +private _show = !ctrlShown _ctrlTriageSelect; + +_ctrlTriageSelect ctrlEnable _show; +_ctrlTriageSelect ctrlShow _show; diff --git a/addons/medical_gui/functions/fnc_updateActions.sqf b/addons/medical_gui/functions/fnc_updateActions.sqf new file mode 100644 index 0000000000..def2466009 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateActions.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the action buttons based currently avaiable treatments. + * + * Arguments: + * 0: Medical Menu display + * + * Return Value: + * None + * + * Example: + * [_display] call ace_medical_gui_fnc_updateActions + * + * Public: No + */ + +params ["_display"]; + +private _selectedCategory = GVAR(selectedCategory); + +// Clear all action buttons +{ + private _ctrl = _display displayCtrl _x; + _ctrl ctrlRemoveAllEventHandlers "ButtonClick"; + _ctrl ctrlShow false; +} forEach IDCS_ACTION_BUTTONS; + +// Handle triage list (no actions shown) +private _ctrlTriage = _display displayCtrl IDC_TRIAGE_CARD; +private _showTriage = _selectedCategory == "triage"; +_ctrlTriage ctrlEnable _showTriage; + +lbClear _ctrlTriage; + +if (_showTriage) exitWith { + [_ctrlTriage, GVAR(target)] call FUNC(updateTriageCard); +}; + +// Show treatment options on action buttons +private _idcIndex = 0; + +{ + _x params ["_displayName", "_category", "_condition", "_statement"]; + + // Check action category and condition + if (_category == _selectedCategory && {call _condition}) then { + private _ctrl = _display displayCtrl (IDCS_ACTION_BUTTONS select _idcIndex); + _ctrl ctrlSetText _displayName; + _ctrl ctrlShow true; + + _ctrl ctrlAddEventHandler ["ButtonClick", _statement]; + _ctrl ctrlAddEventHandler ["ButtonClick", {GVAR(pendingReopen) = true}]; + + _idcIndex = _idcIndex + 1; + }; +} forEach GVAR(actions); diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf new file mode 100644 index 0000000000..62b2ebd0fb --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, SilentSpike, mharis001 + * Updates the body image for given target. + * + * Arguments: + * 0: Body image controls group + * 1: Target + * + * Return Value: + * None + * + * Example: + * [CONTROL, _target] call ace_medical_menu_fnc_updateBodyImage + * + * Public: No + */ + +params ["_ctrlGroup", "_target"]; + +// Get tourniquets, damage, and blood loss for target +private _tourniquets = GET_TOURNIQUETS(_target); +private _bodyPartDamage = _target getVariable [QEGVAR(medical,bodyPartDamage), [0, 0, 0, 0, 0, 0]]; +private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0]; + +{ + _x params ["", "", "_bodyPartN", "_amountOf", "_bleeding"]; + _bodyPartBloodLoss set [_bodyPartN, (_bodyPartBloodLoss select _bodyPartN) + (_bleeding * _amountOf)]; +} forEach (_target getVariable [QEGVAR(medical,openWounds), []]); + +{ + _x params ["_bodyPartIDC", ["_tourniquetIDC", -1]]; + + // Show or hide the tourniquet icon + if (_tourniquetIDC != -1) then { + private _hasTourniquet = _tourniquets select _forEachIndex > 0; + private _ctrlTourniquet = _ctrlGroup controlsGroupCtrl _tourniquetIDC; + _ctrlTourniquet ctrlShow _hasTourniquet; + }; + + // Update body part color based on blood loss and damage + private _bloodLoss = _bodyPartBloodLoss select _forEachIndex; + private _bodyPartColor = if (_bloodLoss > 0) then { + [_bloodLoss] call FUNC(bloodLossToRGBA); + } else { + private _damage = _bodyPartDamage select _forEachIndex; + [_damage] call FUNC(damageToRGBA); + }; + + private _ctrlBodyPart = _ctrlGroup controlsGroupCtrl _bodyPartIDC; + _ctrlBodyPart ctrlSetTextColor _bodyPartColor; +} forEach [ + [IDC_BODY_HEAD], + [IDC_BODY_TORSO], + [IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_T], + [IDC_BODY_ARMRIGHT, IDC_BODY_ARMRIGHT_T], + [IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_T], + [IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_T] +]; diff --git a/addons/medical_gui/functions/fnc_updateCategories.sqf b/addons/medical_gui/functions/fnc_updateCategories.sqf new file mode 100644 index 0000000000..ac1c068fb7 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateCategories.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the category buttons based currently avaiable treatments. + * + * Arguments: + * 0: Medical Menu display + * + * Return Value: + * None + * + * Example: + * [_display] call ace_medical_gui_fnc_updateCategories + * + * Public: No + */ + +params ["_display"]; + +{ + _x params ["_idc", "_category"]; + + private _ctrl = _display displayCtrl _idc; + private _enable = GVAR(actions) findIf {_category == _x select 1 && {call (_x select 2)}} > -1; + _ctrl ctrlEnable _enable; + + private _color = [[0.4, 0.4, 0.4, 1], [1, 1, 1, 1]] select _enable; + _ctrl ctrlSetTextColor _color; +} forEach [ + [IDC_EXAMINE, "examine"], + [IDC_BANDAGE, "bandage"], + [IDC_MEDICATION, "medication"], + [IDC_AIRWAY, "airway"], + [IDC_ADVANCED, "advanced"], + [IDC_DRAG, "drag"] +]; diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf new file mode 100644 index 0000000000..49966fdc4a --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf @@ -0,0 +1,148 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates injury list for given body part for the target. + * + * Arguments: + * 0: Injury list + * 1: Target + * 2: Body part + * + * Return Value: + * None + * + * Example: + * [_ctrlInjuries, _target, 0] call ace_medical_gui_fnc_updateInjuryList + * + * Public: No + */ + +params ["_ctrl", "_target", "_selectionN"]; + +private _entries = []; + +// Add selected body part name +private _bodyPartName = [ + LSTRING(Head), + LSTRING(Torso), + LSTRING(LeftArm), + LSTRING(RightArm), + LSTRING(LeftLeg), + LSTRING(RightLeg) +] select _selectionN; + +_entries pushBack [localize _bodyPartName, [1, 1, 1, 1]]; + +// Indicate if unit is bleeding at all +if (IS_BLEEDING(_target)) then { + _entries pushBack [localize LSTRING(Status_Bleeding), [1, 0, 0, 1]]; +}; + +// Give a qualitative description of the blood volume lost +switch (GET_HEMORRHAGE(_target)) do { + case 1: { + _entries pushBack [localize LSTRING(Lost_Blood1), [1, 0, 0, 1]]; + }; + case 2: { + _entries pushBack [localize LSTRING(Lost_Blood2), [1, 0, 0, 1]]; + }; + case 3: { + _entries pushBack [localize LSTRING(Lost_Blood3), [1, 0, 0, 1]]; + }; + case 4: { + _entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]]; + }; +}; + +// Indicate if a tourniquet is applied +if (HAS_TOURNIQUET_APPLIED_ON(_target,_selectionN)) then { + _entries pushBack [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; +}; + +// Indicate the amount of pain the unit is in +if ([_target] call EFUNC(common,isAwake)) then { + private _pain = GET_PAIN_PERCEIVED(_target); + if (_pain > 0) then { + private _painText = switch (true) do { + case (_pain > 0.5): { + ELSTRING(medical_treatment,Status_SeverePain); + }; + case (_pain > 0.1): { + ELSTRING(medical_treatment,Status_Pain); + }; + default { + ELSTRING(medical_treatment,Status_MildPain); + }; + }; + _entries pushBack [localize _painText, [1, 1, 1, 1]]; + }; +}; + +// Show receiving IV volume remaining +private _totalIvVolume = 0; +{ + _x params ["_volumeRemaining"]; + _totalIvVolume = _totalIvVolume + _volumeRemaining; +} forEach (_target getVariable [QEGVAR(medical,ivBags), []]); + +if (_totalIvVolume >= 1) then { + _entries pushBack [format [localize ELSTRING(medical_treatment,receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; +}; + +// Add entries for open, bandaged, and stitched wounds +private _woundEntries = []; + +private _fnc_getWoundDescription = { + private _className = EGVAR(medical_damage,woundsData) select _woundClassID select 6; + private _suffix = ["Minor", "Medium", "Large"] select _category; + private _woundName = localize format [ELSTRING(medical_damage,%1_%2), _className, _suffix]; + if (_amountOf >= 1) then { + format ["%1x %2", ceil _amountOf, _woundName]; + } else { + format ["Partial %1", _woundName]; + }; +}; + +{ + _x params ["", "_woundClassID", "_bodyPartN", "_amountOf", "", "", "_category"]; + if (_selectionN == _bodyPartN) then { + if (_amountOf > 0) then { + _woundEntries pushBack [call _fnc_getWoundDescription, [1, 1, 1, 1]]; + } else { + if !(EGVAR(medical_treatment,advancedBandages) && {EGVAR(medical_treatment,woundReopening)}) then { + _woundEntries pushBack [format ["[B] %1", call _fnc_getWoundDescription], [0.7, 0.7, 0.7, 1]]; + }; + }; + }; +} forEach (_target getVariable [QEGVAR(medical,openWounds), []]); + +{ + _x params ["", "_woundClassID", "_bodyPartN", "_amountOf", "", "", "_category"]; + if (_selectionN == _bodyPartN && {_amountOf > 0}) then { + _woundEntries pushBack [format ["[B] %1", call _fnc_getWoundDescription], [0.88, 0.7, 0.65, 1]]; + }; +} forEach (_target getVariable [QEGVAR(medical,bandagedWounds), []]); + +{ + _x params ["", "_woundClassID", "_bodyPartN", "_amountOf", "", "", "_category"]; + if (_selectionN == _bodyPartN && {_amountOf > 0}) then { + _woundEntries pushBack [format ["[S] %1", call _fnc_getWoundDescription], [0.7, 0.7, 0.7, 1]]; + }; +} forEach (_target getVariable [QEGVAR(medical,stitchedWounds), []]); + +// Handle no wound entries +if (_woundEntries isEqualTo []) then { + _entries pushBack [localize ELSTRING(medical_treatment,NoInjuriesBodypart), [1, 1, 1, 1]]; +} else { + _entries append _woundEntries; +}; + +// Add all entries to injury list +lbClear _ctrl; + +{ + _x params ["_text", "_color"]; + private _index = _ctrl lbAdd _text; + _ctrl lbSetColor [_index, _color]; + _ctrl lbSetSelectColor [_index, _color]; +} forEach _entries; diff --git a/addons/medical_gui/functions/fnc_updateLogList.sqf b/addons/medical_gui/functions/fnc_updateLogList.sqf new file mode 100644 index 0000000000..731b358796 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateLogList.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates list control with given logs. + * + * Arguments: + * 0: Log list + * 1: Log to add + * + * Return Value: + * None + * + * Example: + * [_ctrlActivityLog, _activityLog] call ace_medical_gui_fnc_updateLogList + * + * Public: No + */ + +params ["_ctrl", "_logs"]; + +lbClear _ctrl; + +{ + _x params ["_message", "_moment", "", "_arguments"]; + + // Localize message and arguments + if (isLocalized _message) then { + _message = localize _message; + }; + + _arguments = _arguments apply {if (_x isEqualType "" && {isLocalized _x}) then {localize _x} else {_x}}; + + // Format message with arguments + _message = format ([_message] + _arguments); + + _ctrl lbAdd format ["%1 %2", _moment, _message]; +} forEach _logs; diff --git a/addons/medical_gui/functions/fnc_updateTriageCard.sqf b/addons/medical_gui/functions/fnc_updateTriageCard.sqf new file mode 100644 index 0000000000..b4e1977d42 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateTriageCard.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the triage card for the given target. + * + * Arguments: + * 0: Triage list + * 1: Target + * + * Return Value: + * None + * + * Example: + * [_ctrlTriage, _target] call ace_medical_gui_fnc_updateTriageCard + * + * Public: No + */ + +params ["_ctrl", "_target"]; + +private _triageCard = _target getVariable [QEGVAR(medical,triageCard), []]; +lbClear _ctrl; + +{ + _x params ["_item", "_amount", "_time"]; + + // Check for item displayName or localized text + if (isClass (configFile >> "CfgWeapons" >> _item)) then { + _item = getText (configFile >> "CfgWeapons" >> _item >> "displayName"); + } else { + if (isLocalized _item) then { + _item = localize _item; + }; + }; + + // Convert time to minutes ago + _time = round ((CBA_missionTime - _time) / 60); + + _ctrl lbAdd format ["%1x - %2 (%3m)", _amount, _item, _time]; +} forEach _triageCard; + +// Handle no triage card entries +if (lbSize _ctrl == 0) then { + _ctrl lbAdd localize ELSTRING(medical_treatment,TriageCard_NoEntry); +}; diff --git a/addons/medical_gui/functions/fnc_updateTriageStatus.sqf b/addons/medical_gui/functions/fnc_updateTriageStatus.sqf new file mode 100644 index 0000000000..9a50e4f6c0 --- /dev/null +++ b/addons/medical_gui/functions/fnc_updateTriageStatus.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: mharis001 + * Updates the triage status control for the given target. + * + * Arguments: + * 0: Display + * 1: Target + * + * Return Value: + * None + * + * Example: + * [_display, _target] call ace_medical_gui_fnc_updateTriageStatus + * + * Public: No + */ + +params ["_display", "_target"]; + +private _triageStatus = [_target] call EFUNC(medical_treatment,getTriageStatus); +_triageStatus params ["", "_triageText", "_triageColor", "_triageTextColor"]; + +private _ctrlTriage = _display displayCtrl IDC_TRIAGE_STATUS; +_ctrlTriage ctrlSetText _triageText; +_ctrlTriage ctrlSetBackgroundColor _triageColor; +_ctrlTriage ctrlSetTextColor _triageTextColor; diff --git a/addons/medical_gui/functions/script_component.hpp b/addons/medical_gui/functions/script_component.hpp new file mode 100644 index 0000000000..d2302a9920 --- /dev/null +++ b/addons/medical_gui/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_gui\script_component.hpp" diff --git a/addons/medical_gui/gui.hpp b/addons/medical_gui/gui.hpp new file mode 100644 index 0000000000..eceb263a60 --- /dev/null +++ b/addons/medical_gui/gui.hpp @@ -0,0 +1,614 @@ +class RscText; +class RscButton; +class RscPicture; +class RscListBox; +class RscActivePicture; +class RscButtonMenu; +class RscControlsGroupNoScrollbars; + +class GVAR(BodyImage): RscControlsGroupNoScrollbars { + idc = IDC_BODY_GROUP; + x = POS_X(13.33); + y = POS_Y(2.73); + w = POS_W(12.33); + h = POS_H(12.33); + class controls { + class Background: RscPicture { + idc = -1; + text = QPATHTOF(data\body_image\background.paa); + x = 0; + y = 0; + w = POS_W(12.33); + h = POS_H(12.33); + }; + class Head: Background { + idc = IDC_BODY_HEAD; + text = QPATHTOF(data\body_image\head.paa); + }; + class Torso: Background { + idc = IDC_BODY_TORSO; + text = QPATHTOF(data\body_image\torso.paa); + }; + class ArmLeft: Background { + idc = IDC_BODY_ARMLEFT; + text = QPATHTOF(data\body_image\arm_left.paa); + }; + class ArmRight: Background { + idc = IDC_BODY_ARMRIGHT; + text = QPATHTOF(data\body_image\arm_right.paa); + }; + class LegLeft: Background { + idc = IDC_BODY_LEGLEFT; + text = QPATHTOF(data\body_image\leg_left.paa); + }; + class LegRight: Background { + idc = IDC_BODY_LEGRIGHT; + text = QPATHTOF(data\body_image\leg_right.paa); + }; + class ArmLeftT: Background { + idc = IDC_BODY_ARMLEFT_T; + text = QPATHTOF(data\body_image\arm_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); + }; + class LegLeftT: ArmLeftT { + idc = IDC_BODY_LEGLEFT_T; + text = QPATHTOF(data\body_image\leg_left_t.paa); + }; + class LegRightT: ArmLeftT { + idc = IDC_BODY_LEGRIGHT_T; + text = QPATHTOF(data\body_image\leg_right_t.paa); + }; + }; +}; + +class GVAR(TriageToggle): RscButton { + idc = -1; + onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(toggleTriageSelect)); + x = POS_X(13.33); + y = POS_Y(15.5); + w = POS_W(12.33); + h = POS_H(1.1); + colorFocused[] = {0, 0, 0, 0}; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {0, 0, 0, 0}; +}; + +class GVAR(TriageSelect): RscControlsGroupNoScrollbars { + idc = IDC_TRIAGE_SELECT; + x = POS_X(13.33); + y = POS_Y(16.6); + w = POS_W(12.33); + h = POS_H(5.5); + class controls { + class None: RscButton { + idc = -1; + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),0)] call FUNC(handleTriageSelect)); + style = ST_CENTER; + text = ECSTRING(medical_treatment,Triage_Status_None); + x = 0; + y = 0; + w = POS_W(12.33); + h = POS_H(1.1); + shadow = 0; + colorText[] = {TRIAGE_TEXT_COLOR_NONE}; + colorFocused[] = {TRIAGE_COLOR_NONE}; + colorBackground[] = {TRIAGE_COLOR_NONE}; + colorBackgroundActive[] = {TRIAGE_COLOR_NONE}; + }; + class Minimal: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),1)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Minimal); + y = POS_H(1.1); + colorText[] = {TRIAGE_TEXT_COLOR_MINIMAL}; + colorFocused[] = {TRIAGE_COLOR_MINIMAL}; + colorBackground[] = {TRIAGE_COLOR_MINIMAL}; + colorBackgroundActive[] = {TRIAGE_COLOR_MINIMAL}; + }; + class Delayed: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),2)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Delayed); + y = POS_H(2.2); + colorText[] = {TRIAGE_TEXT_COLOR_DELAYED}; + colorFocused[] = {TRIAGE_COLOR_DELAYED}; + colorBackground[] = {TRIAGE_COLOR_DELAYED}; + colorBackgroundActive[] = {TRIAGE_COLOR_DELAYED}; + }; + class Immediate: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),3)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Immediate); + y = POS_H(3.3); + colorText[] = {TRIAGE_TEXT_COLOR_IMMEDIATE}; + colorFocused[] = {TRIAGE_COLOR_IMMEDIATE}; + colorBackground[] = {TRIAGE_COLOR_IMMEDIATE}; + colorBackgroundActive[] = {TRIAGE_COLOR_IMMEDIATE}; + }; + class Deceased: None { + onButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),GVAR(target),4)] call FUNC(handleTriageSelect)); + text = ECSTRING(medical_treatment,Triage_Status_Deceased); + y = POS_H(4.4); + colorText[] = {TRIAGE_TEXT_COLOR_DECEASED}; + colorFocused[] = {TRIAGE_COLOR_DECEASED}; + colorBackground[] = {TRIAGE_COLOR_DECEASED}; + colorBackgroundActive[] = {TRIAGE_COLOR_DECEASED}; + }; + }; +}; + +class ACE_Medical_Menu { + idd = IDD_MEDICAL_MENU; + movingEnable = 1; + enableSimulation = 1; + onLoad = QUOTE(_this call FUNC(onMenuOpen)); + onUnload = QUOTE(_this call FUNC(onMenuClose)); + class controlsBackground { + class Title: RscText { + idc = IDC_TITLE; + x = POS_X(1); + y = POS_Y(0); + w = POS_W(38); + h = POS_H(1); + colorBackground[] = GUI_BCG_COLOR; + moving = 1; + }; + class Center: RscText { + idc = -1; + x = POS_X(1); + y = POS_Y(1.1); + w = POS_W(38); + h = POS_H(16); + colorBackground[] = {0, 0, 0, 0.7}; + }; + class Bottom: Center { + y = POS_Y(17.6); + h = POS_H(9); + }; + }; + class controls { + class TreatmentHeader: RscText { + idc = -1; + style = ST_CENTER; + text = CSTRING(EXAMINE_TREATMENT); + x = POS_X(1); + y = POS_Y(1.5); + w = POS_W(12.33); + h = POS_H(1); + sizeEx = POS_H(1.2); + colorText[] = {1, 1, 1, 0.9}; + }; + class StatusHeader: TreatmentHeader { + text = CSTRING(STATUS); + x = POS_X(13.33); + }; + class OverviewHeader: TreatmentHeader { + text = CSTRING(OVERVIEW); + x = POS_X(25.66); + }; + class HeaderLine: RscText { + idc = -1; + x = POS_X(1.5); + y = POS_Y(2.6); + w = POS_W(37); + h = POS_H(0.03); + colorBackground[] = {1, 1, 1, 0.5}; + }; + class Triage: RscActivePicture { + idc = IDC_TRIAGE; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'triage'); + text = QPATHTOF(data\categories\triage_card.paa); + tooltip = CSTRING(ViewTriageCard); + x = POS_X(1.5); + y = POS_Y(2.73); + w = POS_W(1.5); + h = POS_H(1.5); + color[] = {1, 1, 1, 1}; + soundClick[] = {"\a3\ui_f\data\sound\rscbutton\soundClick", 0.09, 1}; + soundEnter[] = {"\a3\ui_f\data\sound\rscbutton\soundEnter", 0.09, 1}; + soundEscape[] = {"\a3\ui_f\data\sound\rscbutton\soundEscape", 0.09, 1}; + soundPush[] = {"\a3\ui_f\data\sound\rscbutton\soundPush", 0.09, 1}; + }; + class Examine: Triage { + idc = IDC_EXAMINE; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'examine'); + text = QPATHTOF(data\categories\examine_patient.paa); + tooltip = CSTRING(ExaminePatient); + x = POS_X(3); + }; + class Bandage: Triage { + idc = IDC_BANDAGE; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'bandage'); + text = QPATHTOF(data\categories\bandage_fracture.paa); + tooltip = CSTRING(BandageFractures); + x = POS_X(4.5); + }; + class Medication: Triage { + idc = IDC_MEDICATION; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'medication'); + text = QPATHTOF(data\categories\medication.paa); + tooltip = CSTRING(Medication); + x = POS_X(6); + }; + class Airway: Triage { + idc = IDC_AIRWAY; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'airway'); + text = QPATHTOF(data\categories\airway_management.paa); + tooltip = CSTRING(AirwayManagement); + x = POS_X(7.5); + }; + class Advanced: Triage { + idc = IDC_ADVANCED; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'advanced'); + text = QPATHTOF(data\categories\advanced_treatment.paa); + tooltip = CSTRING(AdvancedTreatment); + x = POS_X(9); + }; + class Drag: Triage { + idc = IDC_DRAG; + onButtonClick = QUOTE(GVAR(selectedCategory) = 'drag'); + text = QPATHTOF(data\categories\carry.paa); + tooltip = CSTRING(DragCarry); + x = POS_X(10.5); + }; + class Toggle: Triage { + idc = IDC_TOGGLE; + onButtonClick = QUOTE(call FUNC(handleToggle)); + text = QPATHTOF(data\categories\toggle_self.paa); + tooltip = CSTRING(ToggleSelf); + x = POS_X(12); + }; + class TriageCard: RscListBox { + idc = IDC_TRIAGE_CARD; + x = POS_X(1.5); + y = POS_Y(4.4); + w = POS_W(12); + h = POS_H(10); + sizeEx = POS_H(0.7); + colorSelect[] = {1, 1, 1, 1}; + colorSelect2[] = {1, 1, 1, 1}; + colorBackground[] = {0, 0, 0, 0.2}; + colorSelectBackground[] = {0, 0, 0, 0}; + colorSelectBackground2[] = {0, 0, 0, 0}; + colorScrollbar[] = {0.9, 0.9, 0.9, 1}; + }; + class Action1: RscButtonMenu { + idc = IDC_ACTION_1; + style = ST_LEFT; + x = POS_X(1.5); + y = POS_Y(4.4); + w = POS_W(12); + h = POS_H(1); + size = POS_H(0.9); + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + class Action2: Action1 { + idc = IDC_ACTION_2; + y = POS_Y(5.5); + }; + class Action3: Action1 { + idc = IDC_ACTION_3; + y = POS_Y(6.6); + }; + class Action4: Action1 { + idc = IDC_ACTION_4; + y = POS_Y(7.7); + }; + class Action5: Action1 { + idc = IDC_ACTION_5; + y = POS_Y(8.8); + }; + class Action6: Action1 { + idc = IDC_ACTION_6; + y = POS_Y(9.9); + }; + class Action7: Action1 { + idc = IDC_ACTION_7; + y = POS_Y(11); + }; + class Action8: Action1 { + idc = IDC_ACTION_8; + y = POS_Y(12.1); + }; + class Action9: Action1 { + idc = IDC_ACTION_9; + y = POS_Y(13.2); + }; + class BodyImage: GVAR(BodyImage) {}; + class SelectHead: RscButton { + idc = -1; + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 0); + tooltip = CSTRING(SelectHead); + x = POS_X(18.8); + y = POS_Y(3.2); + w = POS_W(1.4); + h = POS_H(1.8); + colorFocused[] = {0, 0, 0, 0}; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {0, 0, 0, 0}; + }; + class SelectTorso: SelectHead { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 1); + tooltip = CSTRING(SelectTorso); + x = POS_X(18.4); + y = POS_Y(5); + w = POS_W(2.2); + h = POS_H(3.8); + }; + class SelectArmLeft: SelectHead { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 2); + tooltip = CSTRING(SelectLeftArm); + x = POS_X(20.6); + y = POS_Y(5.1); + w = POS_W(1.1); + h = POS_H(4.6); + }; + class SelectArmRight: SelectArmLeft { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 3); + tooltip = CSTRING(SelectRightArm); + x = POS_X(17.4); + }; + class SelectLegLeft: SelectHead { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 4); + tooltip = CSTRING(SelectLeftLeg); + x = POS_X(19.5); + y = POS_Y(8.8); + w = POS_W(1.1); + h = POS_H(5.8); + }; + class SelectLegRight: SelectLegLeft { + onButtonClick = QUOTE(GVAR(selectedBodyPart) = 5); + tooltip = CSTRING(SelectRightLeg); + x = POS_X(18.4); + }; + class Injuries: TriageCard { + idc = IDC_INJURIES; + x = POS_X(25.66); + w = POS_W(12.33); + }; + class ActivityHeader: TreatmentHeader { + text = CSTRING(ACTIVITY_LOG); + y = POS_Y(17.6); + w = POS_W(18.5); + sizeEx = POS_H(1); + colorText[] = {0.6, 0.7, 1, 1}; + }; + class QuickViewHeader: ActivityHeader { + text = CSTRING(QUICK_VIEW); + x = POS_X(19.5); + }; + class LowerLine: HeaderLine { + y = POS_Y(18.5); + }; + class Activity: Injuries { + idc = IDC_ACTIVITY; + x = POS_X(1.5); + y = POS_Y(18.5); + w = POS_W(18.5); + h = POS_H(6.5); + colorBackground[] = {0, 0, 0, 0}; + }; + class QuickView: Activity { + idc = IDC_QUICKVIEW; + x = POS_X(21.5); + }; + class TriageStatus: RscText { + idc = IDC_TRIAGE_STATUS; + style = ST_CENTER; + x = POS_X(13.33); + y = POS_Y(15.5); + w = POS_W(12.33); + h = POS_H(1.1); + shadow = 0; + }; + class TriageToggle: GVAR(TriageToggle) {}; + class TriageSelect: GVAR(TriageSelect) {}; + }; +}; + +class GVAR(RscTriageCard) { + idd = -1; + movingEnable = 1; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(RscTriageCard), _this select 0)]); + class controls { + class Background: RscText { + idc = -1; + x = POS_X(12.5); + y = POS_Y(0); + w = POS_W(15); + h = POS_H(19); + colorBackground[] = {1, 1, 1, 1}; + moving = 1; + }; + class CornerLeft: RscPicture { + idc = -1; + text = QPATHTOF(data\triage_card\corner_left.paa); + x = POS_X(12.5); + y = POS_Y(0); + w = POS_W(5); + h = POS_H(5); + colorText[] = {1, 1, 0, 1}; + }; + class CornerRight: CornerLeft { + text = QPATHTOF(data\triage_card\corner_right.paa); + x = POS_X(22.5); + }; + class Title: RscText { + idc = -1; + style = ST_CENTER; + text = CSTRING(Actions_TriageCard); + x = POS_X(12.5); + y = POS_Y(3); + w = POS_W(15); + h = POS_H(0.9); + sizeEx = POS_H(0.9); + shadow = 0; + colorText[] = {0, 0, 0, 1}; + }; + class TriageCard: RscListBox { + idc = IDC_TRIAGE_CARD; + x = POS_X(13.5); + y = POS_Y(5); + w = POS_W(13); + h = POS_H(13); + sizeEx = POS_H(0.7); + colorText[] = {0, 0, 0, 1}; + colorSelect[] = {0, 0, 0, 1}; + colorSelect2[] = {0, 0, 0, 1}; + colorBackground[] = {0, 0, 0, 0}; + colorSelectBackground[] = {0, 0, 0, 0}; + colorSelectBackground2[] = {0, 0, 0, 0}; + colorScrollbar[] = {0, 0, 0, 1}; + }; + class TriageStatus: RscText { + idc = IDC_TRIAGE_STATUS; + style = ST_CENTER; + x = POS_X(12.5); + y = POS_Y(19); + w = POS_W(15); + h = POS_H(1.1); + shadow = 0; + }; + class TriageToggle: GVAR(TriageToggle) { + x = POS_X(12.5); + y = POS_Y(19); + w = POS_W(15); + }; + class TriageSelect: GVAR(TriageSelect) { + x = POS_X(12.5); + y = POS_Y(20); + w = POS_W(15); + class controls: controls { + class None: None { + w = POS_W(15); + }; + class Minimal: Minimal { + w = POS_W(15); + }; + class Delayed: Delayed { + w = POS_W(15); + }; + class Immediate: Immediate { + w = POS_W(15); + }; + class Deceased: Deceased { + w = POS_W(15); + }; + }; + }; + }; +}; + +class RscTitles { + class GVAR(RscPatientInfo) { + idd = -1; + fadeIn = 0.3; + fadeOut = 0.3; + duration = 999999; + movingEnable = 0; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(RscPatientInfo), _this select 0)]); + class controls { + class BodyImage: GVAR(BodyImage) { + x = safeZoneX + POS_W(2.25); + y = safeZoneY + POS_H(1.5); + w = POS_W(8.5); + h = POS_H(8.5); + class controls: controls { + class Background: Background { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class Head: Head { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class Torso: Torso { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmLeft: ArmLeft { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmRight: ArmRight { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegLeft: LegLeft { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegRight: LegRight { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmLeftT: ArmLeftT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class ArmRightT: ArmRightT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegLeftT: LegLeftT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + class LegRightT: LegRightT { + w = POS_W(8.5); + h = POS_H(8.5); + }; + }; + }; + class InjuriesLabel: RscText { + idc = -1; + text = CSTRING(INJURIES); + x = safeZoneX + POS_W(2); + y = safeZoneY + POS_H(10.2); + w = POS_W(9); + h = POS_H(0.7); + sizeEx = POS_H(0.7); + colorBackground[] = GUI_BCG_COLOR; + }; + class Injuries: RscListBox { + idc = IDC_INJURIES; + x = safeZoneX + POS_W(2); + y = safeZoneY + POS_H(11); + w = POS_W(9); + h = POS_H(9); + sizeEx = POS_H(0.7); + colorSelect[] = {1, 1, 1, 1}; + colorSelect2[] = {1, 1, 1, 1}; + colorBackground[] = {0, 0, 0, 0.2}; + colorSelectBackground[] = {0, 0, 0, 0}; + colorSelectBackground2[] = {0, 0, 0, 0}; + colorScrollbar[] = {0.9, 0.9, 0.9, 1}; + }; + class TriageStatus: RscText { + idc = IDC_TRIAGE_STATUS; + x = safeZoneX + POS_W(2); + y = safeZoneY + POS_H(20.2); + w = POS_W(9); + h = POS_H(0.7); + sizeEx = POS_H(0.7); + shadow = 0; + }; + class Activity: Injuries { + idc = IDC_ACTIVITY; + x = safeZoneX + POS_W(1.75); + y = safeZoneY + POS_H(21); + w = POS_W(15); + h = POS_H(7); + shadow = 2; + colorBackground[] = {0, 0, 0, 0}; + }; + }; + }; +}; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf new file mode 100644 index 0000000000..6066d073af --- /dev/null +++ b/addons/medical_gui/initSettings.sqf @@ -0,0 +1,44 @@ +[ + QGVAR(enableActions), + "LIST", + [LSTRING(EnableActions_DisplayName), LSTRING(EnableActions_Description)], + LSTRING(Category), + [[0, 1, 2], [LSTRING(Selections3D), LSTRING(Radial), ELSTRING(common,Disabled)], 0], + false +] call CBA_settings_fnc_init; + +[ + QGVAR(enableSelfActions), + "CHECKBOX", + [LSTRING(EnableSelfActions_DisplayName), LSTRING(EnableSelfActions_Description)], + LSTRING(Category), + true, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(enableMedicalMenu), + "LIST", + [LSTRING(EnableMedicalMenu_DisplayName), LSTRING(EnableMedicalMenu_Description)], + LSTRING(Category), + [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), ELSTRING(common,VehiclesOnly)], 1], + false +] call CBA_settings_fnc_init; + +[ + QGVAR(openAfterTreatment), + "CHECKBOX", + [LSTRING(OpenAfterTreatment_DisplayName), LSTRING(OpenAfterTreatment_Description)], + LSTRING(Category), + true, + false +] call CBA_settings_fnc_init; + +[ + QGVAR(maxDistance), + "SLIDER", + [LSTRING(MaxDistance_DisplayName), LSTRING(MaxDistance_Description)], + LSTRING(Category), + [0, 10, 3, 1], + false +] call CBA_settings_fnc_init; diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp new file mode 100644 index 0000000000..f87ebc8bc9 --- /dev/null +++ b/addons/medical_gui/script_component.hpp @@ -0,0 +1,72 @@ +#define COMPONENT medical_gui +#define COMPONENT_BEAUTIFIED Medical GUI +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_GUI + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_GUI + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_GUI +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" + +#include "\a3\ui_f\hpp\defineResincl.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineCommonGrids.inc" +#include "\a3\ui_f\hpp\defineCommonColors.inc" + +#define POS_X(N) ((N) * GUI_GRID_W + GUI_GRID_CENTER_X) +#define POS_Y(N) ((N) * GUI_GRID_H + GUI_GRID_CENTER_Y) +#define POS_W(N) ((N) * GUI_GRID_W) +#define POS_H(N) ((N) * GUI_GRID_H) + +#define IDD_MEDICAL_MENU 38580 + +#define IDC_TITLE 1200 +#define IDC_TRIAGE 1300 +#define IDC_EXAMINE 1310 +#define IDC_BANDAGE 1320 +#define IDC_MEDICATION 1330 +#define IDC_AIRWAY 1340 +#define IDC_ADVANCED 1350 +#define IDC_DRAG 1360 +#define IDC_TOGGLE 1370 + +#define IDC_TRIAGE_CARD 1400 +#define IDC_INJURIES 1410 +#define IDC_ACTIVITY 1420 +#define IDC_QUICKVIEW 1430 + +#define IDC_ACTION_1 1500 +#define IDC_ACTION_2 1510 +#define IDC_ACTION_3 1520 +#define IDC_ACTION_4 1530 +#define IDC_ACTION_5 1540 +#define IDC_ACTION_6 1550 +#define IDC_ACTION_7 1560 +#define IDC_ACTION_8 1570 +#define IDC_ACTION_9 1580 + +#define IDCS_ACTION_BUTTONS [IDC_ACTION_1, IDC_ACTION_2, IDC_ACTION_3, IDC_ACTION_4, IDC_ACTION_5, IDC_ACTION_6, IDC_ACTION_7, IDC_ACTION_8, IDC_ACTION_9] + +#define IDC_BODY_GROUP 6000 +#define IDC_BODY_HEAD 6005 +#define IDC_BODY_TORSO 6010 +#define IDC_BODY_ARMLEFT 6015 +#define IDC_BODY_ARMRIGHT 6020 +#define IDC_BODY_LEGLEFT 6025 +#define IDC_BODY_LEGRIGHT 6030 +#define IDC_BODY_ARMLEFT_T 6035 +#define IDC_BODY_ARMRIGHT_T 6040 +#define IDC_BODY_LEGLEFT_T 6045 +#define IDC_BODY_LEGRIGHT_T 6050 + +#define IDC_TRIAGE_STATUS 7000 +#define IDC_TRIAGE_SELECT 7100 diff --git a/addons/medical_menu/stringtable.xml b/addons/medical_gui/stringtable.xml similarity index 67% rename from addons/medical_menu/stringtable.xml rename to addons/medical_gui/stringtable.xml index 7b273febc6..3359f08bd5 100644 --- a/addons/medical_menu/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -1,7 +1,88 @@ - - + + + ACE Medical GUI + + + Enable Medical Actions + + + Enables medical actions for the Interaction Menu and selects their style. + + + Selections (3D) + Pozycje (3D) + Sélection (3D) + 3D-Auswahl + Стандартный (3D) + Selecciones (3d) + Seleção (3d) + Választékok (3D) + 3D výběr + Selezione (3D) + 選択 (3d) + 선택 (3d) + 选择 (3D) + 選擇 (3D) + + + Radial + Radialne + Radial + Kreisförmig + Радиальный + Radial + Radial + Kerek + Kruhový + Radiale + 円状 + 다이얼형 + 放射状 + 放射狀 + + + Enable Medical Self Actions + + + Enables medical actions for the Self Interaction Menu. + + + Enable Medical Menu + + + Enables the use of the Medical Menu through the keybind or interaction menu. + + + Reopen Medical Menu + + + Reopen the Medical Menu after successful treatment. + + + Maximum Distance + + + Maximum distance from which the Medical Menu can be opened. + + + Medical + Lékařské + Médical + Sanitäter + Medico + Medyczne + Médico + Медик + Médico + Orvosi + 治療 + 치료 + 医疗 + 醫療 + + Medical Menu Sanitätsmenü Menu medyczne @@ -16,97 +97,7 @@ 医疗选单 醫療選單 - - Allow Medical Menu - Erlaube Sanitätsmenü - Akt. menu medyczne - Permitir menu médico - Разрешить мед. меню - Permitir menú médico - Povolit zdravotnickou nabídku - Consenti Menù Medico - Autoriser le menu médical - 治療メニューを有効化 - 의료 메뉴 활성화 - 允许医疗选单 - 允許醫療選單 - - - Allow clients to use the medical menu - Erlaube Clients das Sanitätsmenü zu verwenden - Zezwalaj graczom korzystać z menu medycznego - Permite que clientes utilizem o menu médico - Разрешает клиентам использовать медицинское меню - Permitir a los clientes utilizar el menú médico - Povolit klientům používat zdravotnickou nabídku - Consenti ai clients di usare il Menù Medico - Autoriser les clients à utiliser le menu médical - 全クライアントが治療メニューを使えるようにします - 클라이언트가 의료 메뉴를 쓰는것을 허락합니다 - 允许客户端使用医疗选单 - 允許客戶端使用醫療選單 - - - Use Medical menu - Verwende Sanitätsmenü - Użyj menu medycznego - Usar o menu médico - Использовать медицинское меню - Utiliza el menú médico - Použít zdravotnickou nabídku - Usa Menù Medico - Utiliser le menu médical - 治療メニューを使う - 의료 메뉴 사용 - 使用医疗选单 - 使用醫療選單 - - - If allowed by server, enable the option to use the Medical Menu through keybinding and interaction menu - Wenn vom Server erlaubt, aktiviert diese Einstellung das Sanitätsmenü, welches durch Tastenkombination oder Interaktionsmenü aufgerufen werden kann. - Jeżeli zezwolone przez serwer, aktywuj menu medyczne poprzez skrót klawiszowy i menu interakcji. - Se permitido pelo servidor, ativa a opção de usar o menu médico por atalhos de teclas e menu de interação - Если разрешено сервером, включает опцию использования медицинского меню с помощью горячих главиш или меню взаимодействия - Si está permitido por el servidor, active la opción de utilizar el menú médico a través del menú de las teclas - Pokud je povoleno serverem, umožní použít zdravotnickou nabídku skrze kláv. zkratku a interakční menu - Se consentito dal server, abilita l'opzione di usare il Menù Medico attraverso hotkeys e menù interazione - Si autorisé par le serveur, active l'option d'utiliser le menu médical à travers les raccourcis clavier et le menu d'interaction. - サーバーが有効化を許可している場合はオプションから有効化でき、治療メニューはキー割り当てとインタラクション メニューを無視できます - 서버 허가하에 단축키와 상호작용 메뉴로 의료 메뉴사용을 허가합니다 - 如果伺服器允许,只需透过按键即可叫出医疗选单 - 如果伺服器允許,只需透過按鍵即可叫出醫療選單 - - - Re-open Medical menu - Sanitätsmenü offen lassen - Otwieraj ponownie menu medyczne - Reabrir menu médico - Переоткрывать мед. меню - Reabrir menú médico - Znovu otevřít zdravotnickou nabídku - Ri-apri Menù Medico - Ré-ouvrir le menu médical - 治療メニューを再び開く - 의료 메뉴 다시 열기 - 重新开启医疗选单 - 重新開啟醫療選單 - - - Re-open the medical menu after succesful treatment - Öffnet das Sanitätsmenü nach einer erfolgreichen Behandlung erneut - Otwórz ponownie menu medyczne po udanym zakończeniu leczenia - Reabre o menu médico depois de um tratamento bem sucedido - Переоткрывать медицинское меню после удачного лечения - Reabre el menú médico despues de un tratamiento con éxito - Znovu otevřít zdravotnickou nabídku po úspěšné léčbě - Ri-Apri il Menù Medico dopo un trattamento riuscito - Ré-ouvrir le menu médical après un traitement réussi - 治療が終わった後、再び治療メニューを開きます - 성공적으로 치료한후에 의료 메뉴를 다시 엽니다 - 当治疗成功后重新打开医疗选单 - 當治療成功後重新打開醫療選單 - - + Open Medical Menu Öffne Sanitätsmenü Otwórz menu medyczne @@ -116,42 +107,44 @@ Otevřít zdravotnickou nabídku Apri Menù Medico Ouvir le menu médical - 治療メニューを開く + 治療メニューをひらく 의료 메뉴 열기 开起医疗选单 開起醫療選單 - - Medical Menu Settings - Sanitätsmenü Einstellungen - Ustawienia menu medycznego - Preferências do menu médico - Настройки медицинского меню - Ajustes del mení médico - Nastavení zdravotnické nabídky - Impostazioni Menù Medico - Réglages du menu médical - 治療メニューの設定 - 의료 메뉴 설정 - 医疗选单设定 - 醫療選單設定 + + Load Patient + Cargar al paciente en + Погрузить пациента + Patient einladen + Załaduj pacjenta + Embarquer le patient + Sebesült berakása + Carica il paziente + Carregar Paciente Em + Naložit pacienta + 患者を載せる + 환자 싣기 + 将伤者放入 + 將傷者放入 - - Configure the usage of the Medical Menu - Stelle die Verwendung des Sanitätsmenüs ein - Skonfiguruj opcje menu medycznego - Configura o uso do menu médico - Настройки использования медицинского меню - Configurar el uso del menú médico - Konfigurace využití zdravotnické nabídky - Configura l'uso del Menù Medico - Configurer l'utilisation du menu médical - 治療メニュー用の設定 - 의료 메뉴 사용의 설정 - 设置医疗选单的使用 - 設置醫療選單的使用 + + Unload Patient + Descargar al paciente + Выгрузить пациента + Patient ausladen + Wyładuj pacjenta + Le patient débarque + Sebesült kihúzása + Scarica il paziente + Descarregar Paciente + Vyložit pacienta + 患者を降ろす + 환자 내리기 + 将伤者背出 + 將傷者背出 - + EXAMINE & TREATMENT Untersuchung & Behandlung ОСМОТР И ЛЕЧЕНИЕ @@ -166,7 +159,7 @@ 检查 & 治疗 檢查 & 治療 - + STATUS STATUS СОСТОЯНИЕ @@ -181,7 +174,7 @@ 状态 狀態 - + OVERVIEW ÜBERSICHT ОБЩАЯ ИНФОРМАЦИЯ @@ -196,7 +189,7 @@ 概述 概述 - + ACTIVITY LOG AKTIVITÄTSVERLAUF ПРОВЕДЕННЫЕ МАНИПУЛЯЦИИ @@ -211,7 +204,7 @@ 医疗纪录 醫療紀錄 - + QUICK VIEW SCHNELLANSICHT БЫСТРЫЙ ОСМОТР @@ -226,8 +219,24 @@ 快速检查 快速檢查 - - View triage Card + + INJURIES + VERLETZUNGEN + FERITE + ТРАВМЫ + BLESSURES + OBRAŻENIA + HERIDAS + SÉRÜLÉSEK + ZRANĚNÍ + FERIMENTOS + 負傷 + 부상 + 受伤 + 受傷 + + + View Triage Card Zeige Triagekarte Смотреть первичную карточку Ver Triage @@ -241,7 +250,7 @@ 查看诊断卡 查看診斷卡 - + Examine Patient Untersuche Patient Осмотреть пациента @@ -256,7 +265,7 @@ 检查伤者 檢查傷者 - + Bandage / Fractures Bandagen / Brüche Раны / переломы @@ -271,7 +280,7 @@ 绷带 / 骨折 繃帶 / 骨折 - + Medication Medikamentation Медикаменты @@ -286,7 +295,7 @@ 药物 藥物 - + Airway Management Дыхательные пути Vías Aéreas @@ -301,7 +310,7 @@ 呼吸道管理 呼吸道管理 - + Advanced Treatments Erweiterte Behandlungen Специальная медпомощь @@ -316,22 +325,22 @@ 进阶治疗 進階治療 - - Drag/Carry - Ziehen/Tragen - Тащить/нести - Arrastrar/Cargar - Traîner/Porter - Ciągnij/Nieś - Arrastar/Carregar - Táhnout/Nést - Trascina/Trasporta + + Drag / Carry + Ziehen / Tragen + Тащить / нести + Arrastrar / Cargar + Traîner / Porter + Ciągnij / Nieś + Arrastar / Carregar + Táhnout / Nést + Trascina / Trasporta 引きずる / 運ぶ 끌기 / 들기 拖 / 背 拖 / 背 - + Toggle (Self) Umschalter (Selbst) Лечить себя/другого раненого @@ -346,112 +355,7 @@ 切换 (自己) 切換 (自己) - - Select triage status - Setze Status auf der Triagekarte - Сортировка - Seleccionar estado de Triage - Sélectionner l'état de triage - Wybierz priorytet - Selecionar estado de triagem - Vybrat prioritu - Seleziona stato Triage - トリアージによる状態を選択 - 부상 상태 고르기 - 选择分诊状态 - 選擇分診狀態 - - - Select Head - Wähle Kopf - Выбрать голову - Seleccionar Cabeza - Sélectionner la tête - Wybierz głowę - Selecionar Cabeça - Vybrat Hlavu - Seleziona Testa - 頭部を選ぶ - 머리 선택 - 选择头部 - 選擇頭部 - - - Select Torso - Wähle Torso - Выбрать торс - Seleccionar Torso - Sélectionner le torse - Wybierz tors - Selecionar Torso - Vybrat Trup - Seleziona Torso - 胴体を選ぶ - 몸통 선택 - 选择身体 - 選擇身體 - - - 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 - 左腕を選ぶ - 왼쪽 팔 선택 - 选择左手 - 選擇左手 - - - 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 - 右腕を選ぶ - 오른쪽 팔 선택 - 选择右手 - 選擇右手 - - - 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 - 左足を選ぶ - 왼쪽 다리 선택 - 选择左脚 - 選擇左腳 - - - 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 - 右足を選ぶ - 오른쪽 다리 선택 - 选择右脚 - 選擇右腳 - - + Head Kopf Голова @@ -466,7 +370,7 @@ 头部 頭部 - + Torso Torso Торс @@ -481,7 +385,7 @@ 身体 身體 - + Left Arm Linker Arm Левая рука @@ -496,7 +400,7 @@ 左手 左手 - + Right Arm Rechter Arm Правая рука @@ -511,7 +415,7 @@ 右手 右手 - + Left Leg Linkes Bein Левая нога @@ -526,7 +430,7 @@ 左脚 左腳 - + Right Leg Rechtes Bein Правая нога @@ -541,22 +445,97 @@ 右脚 右腳 - - Body Part: %1 - Körperteil: %1 - Часть тела: %1 - Parte del cuerpo: %1 - Partie du corps : %1 - Część ciała: %1 - Parte do corpo: %1 - Část těla: %1 - Parte del Corpo: %1 - 身体の一部: %1 - 신체 부위: %1 - 身体部位: %1 - 身體部位: %1 + + Select Head + Wähle Kopf + Выбрать голову + Seleccionar Cabeza + Sélectionner la tête + Wybierz głowę + Selecionar Cabeça + Vybrat Hlavu + Seleziona Testa + 頭部を選ぶ + 머리 선택 + 选择头部 + 選擇頭部 - + + Select Torso + Wähle Torso + Выбрать торс + Seleccionar Torso + Sélectionner le torse + Wybierz tors + Selecionar Torso + Vybrat Trup + Seleziona Torso + 胴体を選ぶ + 몸통 선택 + 选择身体 + 選擇身體 + + + 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 + 左腕を選ぶ + 왼쪽 팔 선택 + 选择左手 + 選擇左手 + + + 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 + 右腕を選ぶ + 오른쪽 팔 선택 + 选择右手 + 選擇右手 + + + 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 + 左足を選ぶ + 왼쪽 다리 선택 + 选择左脚 + 選擇左腳 + + + 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 + 右足を選ぶ + 오른쪽 다리 선택 + 选择右脚 + 選擇右腳 + + Small Klein малого размера @@ -571,7 +550,7 @@ - + Medium Mittel среднего размера @@ -586,7 +565,7 @@ - + Large Groß большого размера @@ -601,7 +580,7 @@ - + There are %2 %1 Open Wounds Er hat %2 offene Wunden (%1) %2 открытые раны %1 @@ -611,12 +590,12 @@ Existem %2 ferimentos abertos %1 Jsou zde %2 %1 otevřené rány Ci sono %2 %1 Ferite Aperte - 開いている傷口が %2 %1 ほどあります + 開いている傷口が %2 %1 ほどあるようだ 여기 %2 %1 크기의 열린 상처가 있다 有 %2 %1 开放性伤口 有 %2 %1 開放性傷口 - + There is 1 %1 Open Wound Er hat 1 offene Wunde (%1) Открытая рана %1 @@ -631,7 +610,7 @@ 有 1 %1 开放性伤口 有 1 %1 開放性傷口 - + There is a partial %1 Open wound Er hat eine zum Teil offene Wunde (%1) Частично открытая рана %1 @@ -641,12 +620,12 @@ Existe um ferimento parcial aberto %1 Je zde částečně %1 otevřená rána C'è 1 parziale %1 Ferita Aperta - 部分的に開いている %1 の傷口があります + 部分的に開いている %1 の傷口がある 여기 부분적으로 %1 크기의 상처가 있다 有部分 %1 开放性伤口 有部分 %1 開放性傷口 - + There are %2 %1 Bandaged Wounds Er hat %2 verbundene Wunden (%1) %2 перевязанные раны %1 @@ -656,12 +635,12 @@ Existem %2 ferimentos %1 tratados Jsou zde %2 %1 ovázané rány Ci sono %2 %1 Ferite Bendate - ここには %2 %1 の処置された傷があります + ここには %2 %1 の処置された傷がある 여기에 붕대를 감은 %2 %1 크기의 상처가 있다 有 %2 %1 包扎过伤口 有 %2 %1 包紮過傷口 - + There is 1 %1 Bandaged Wound Er hat 1 verbundene Wunde (%1) 1 перевязанная рана %1 @@ -676,7 +655,7 @@ 有 1 %1 包扎过伤口 有 1 %1 包紮過傷口 - + There is a partial %1 Bandaged wound Er hat eine zum Teil verbundene Wunde (%1) Частично перевязанная рана %1 @@ -686,12 +665,12 @@ Existe um ferimento parcial tratado %1 Je zde částěčně %1 ovázaná rána C'è 1 parziale %1 Ferita Bendata - 患者には %1 の包帯で処置された傷があります + 患者には %1 の包帯で処置された傷がある 여기 부분적으로 붕대질한 %1 크기의 상처가 있다 有部分 %1 包扎过伤口 有部分 %1 包紮過傷口 - + Normal breathing Normale Atmung Дыхание в норме @@ -706,7 +685,7 @@ 正常呼吸 正常呼吸 - + No breathing Keine Atmung Дыхания нет @@ -716,12 +695,12 @@ Sem respiração Nedýchá Nessuna Respirazione - 息をしていません + 息をしていない 호흡이 없음 没有呼吸 沒有呼吸 - + Difficult breathing Schwere Atmung Дыхание затруднено @@ -731,12 +710,12 @@ Dificuldade para respirar Potíže s dýcháním Difficoltà Respiratorie - 呼吸が難しそうです + 呼吸が難しそうだ 호흡 곤란 呼吸困难 呼吸困難 - + Almost no breathing Beinahe keine Atmung Дыхания почти нет @@ -746,12 +725,12 @@ Quase sem respiração Téměř nedýchá Quasi nessuna Respirazione - ほとんど呼吸していません + ほとんど呼吸していない 호흡이 거의 없음 几乎没有呼吸 幾乎沒有呼吸 - + Bleeding Blutung Кровотечение @@ -766,7 +745,7 @@ 出血中 出血中 - + in Pain hat Schmerzen Испытывает боль @@ -781,7 +760,7 @@ 疼痛中 疼痛中 - + Lost a lot of Blood hat sehr viel Blut verloren Большая кровопотеря @@ -791,12 +770,40 @@ Perdeu muito sangue Ztratil hodně krve Perso molto Sangue - 大量失血しています + 大量失血している 많은 피를 흘림 大量失血 大量失血 - + + + Lost some blood + + + Lost a lot of blood + Hat eine große Menge Blut verloren + Большая кровопотеря + Mucha sangre perdida + A perdu beaucoup de sang + Stracił dużo krwi + Ztratil hodně krve + Sok vért vesztett + Ha perso parecchio sangue + Perdeu muito sangue + 大量失血している + 많은 양의 혈액을 잃음 + 大量失血中 + 大量失血中 + + + Lost a large amount of blood + + + Lost a fatal amount of blood + + Tourniquet [CAT] Tourniquet [CAT] Жгут @@ -811,7 +818,7 @@ 军用止血带 軍用止血帶 - + Nasopharyngeal Tube [NPA] Nasen-Rachen-Rohr Назотрахеальная трубка @@ -826,21 +833,21 @@ 鼻咽管 鼻咽管 - - Medical Menu maximum range - 治療メニューの最大範囲 - 医疗菜单最大范围 - 醫療選單最大範圍 - Dirstanza menù medico - Maksymalny zasięg menu medycznego - - - Maximum distance from where the Medical Menu can be opened. - 你可以打开医疗菜单的最大范围 - 醫療選單可以開啟的最大距離 - 医疗选单可以开启的最大距离 - Massima distanza dalla quale si può aprire il menù medico. - Maksymalny dystans skąd menu medyczne może być otwarte. + + Triage Card + Triagekarte + Tarjeta de clasificación + Медкарта + Karta segregacyjna + Štítek + Fiche de triage + Orvosi lap + Triage Card + Cartão de Triagem + トリアージ カード + 부상자 분류 카드 + 检伤分类卡 + 檢傷分類卡 diff --git a/addons/medical/ui/icons/autoInjector.paa b/addons/medical_gui/ui/auto_injector.paa similarity index 100% rename from addons/medical/ui/icons/autoInjector.paa rename to addons/medical_gui/ui/auto_injector.paa diff --git a/addons/medical/ui/icons/bandage.paa b/addons/medical_gui/ui/bandage.paa similarity index 100% rename from addons/medical/ui/icons/bandage.paa rename to addons/medical_gui/ui/bandage.paa diff --git a/addons/medical/ui/icons/bodybag.paa b/addons/medical_gui/ui/bodybag.paa similarity index 100% rename from addons/medical/ui/icons/bodybag.paa rename to addons/medical_gui/ui/bodybag.paa diff --git a/addons/medical_gui/ui/cross.paa b/addons/medical_gui/ui/cross.paa new file mode 100644 index 0000000000..b9b4015eb6 Binary files /dev/null and b/addons/medical_gui/ui/cross.paa differ diff --git a/addons/medical_gui/ui/cross_t_0.paa b/addons/medical_gui/ui/cross_t_0.paa new file mode 100644 index 0000000000..7e5697efe0 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_0.paa differ diff --git a/addons/medical_gui/ui/cross_t_1.paa b/addons/medical_gui/ui/cross_t_1.paa new file mode 100644 index 0000000000..921887e201 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_1.paa differ diff --git a/addons/medical_gui/ui/cross_t_2.paa b/addons/medical_gui/ui/cross_t_2.paa new file mode 100644 index 0000000000..708055d56b Binary files /dev/null and b/addons/medical_gui/ui/cross_t_2.paa differ diff --git a/addons/medical_gui/ui/cross_t_3.paa b/addons/medical_gui/ui/cross_t_3.paa new file mode 100644 index 0000000000..f6988c60ce Binary files /dev/null and b/addons/medical_gui/ui/cross_t_3.paa differ diff --git a/addons/medical_gui/ui/cross_t_4.paa b/addons/medical_gui/ui/cross_t_4.paa new file mode 100644 index 0000000000..80aa8ea785 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_4.paa differ diff --git a/addons/medical_gui/ui/cross_t_5.paa b/addons/medical_gui/ui/cross_t_5.paa new file mode 100644 index 0000000000..5fbab99bba Binary files /dev/null and b/addons/medical_gui/ui/cross_t_5.paa differ diff --git a/addons/medical_gui/ui/cross_t_6.paa b/addons/medical_gui/ui/cross_t_6.paa new file mode 100644 index 0000000000..e93da27307 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_6.paa differ diff --git a/addons/medical_gui/ui/cross_t_7.paa b/addons/medical_gui/ui/cross_t_7.paa new file mode 100644 index 0000000000..53599cb2f8 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_7.paa differ diff --git a/addons/medical_gui/ui/cross_t_8.paa b/addons/medical_gui/ui/cross_t_8.paa new file mode 100644 index 0000000000..b1c26afe7c Binary files /dev/null and b/addons/medical_gui/ui/cross_t_8.paa differ diff --git a/addons/medical_gui/ui/cross_t_9.paa b/addons/medical_gui/ui/cross_t_9.paa new file mode 100644 index 0000000000..003c2bcb60 Binary files /dev/null and b/addons/medical_gui/ui/cross_t_9.paa differ diff --git a/addons/medical/ui/icons/iv.paa b/addons/medical_gui/ui/iv.paa similarity index 100% rename from addons/medical/ui/icons/iv.paa rename to addons/medical_gui/ui/iv.paa diff --git a/addons/medical/ui/icons/packingBandage.paa b/addons/medical_gui/ui/packing_bandage.paa similarity index 100% rename from addons/medical/ui/icons/packingBandage.paa rename to addons/medical_gui/ui/packing_bandage.paa diff --git a/addons/medical/ui/icons/surgicalKit.paa b/addons/medical_gui/ui/surgical_kit.paa similarity index 100% rename from addons/medical/ui/icons/surgicalKit.paa rename to addons/medical_gui/ui/surgical_kit.paa diff --git a/addons/medical/ui/icons/tourniquet.paa b/addons/medical_gui/ui/tourniquet.paa similarity index 100% rename from addons/medical/ui/icons/tourniquet.paa rename to addons/medical_gui/ui/tourniquet.paa diff --git a/addons/medical/ui/icons/triageCard.paa b/addons/medical_gui/ui/triage_card.paa similarity index 100% rename from addons/medical/ui/icons/triageCard.paa rename to addons/medical_gui/ui/triage_card.paa diff --git a/addons/medical_menu/$PBOPREFIX$ b/addons/medical_menu/$PBOPREFIX$ deleted file mode 100644 index 6ca7434932..0000000000 --- a/addons/medical_menu/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\medical_menu \ No newline at end of file diff --git a/addons/medical_menu/ACE_Settings.hpp b/addons/medical_menu/ACE_Settings.hpp deleted file mode 100644 index b180157b3a..0000000000 --- a/addons/medical_menu/ACE_Settings.hpp +++ /dev/null @@ -1,36 +0,0 @@ -class ACE_Settings { - class GVAR(allow) { - displayName = CSTRING(allow); - description = CSTRING(allow_Descr); - value = 1; - typeName = "SCALAR"; - values[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled), ECSTRING(common,VehiclesOnly)}; - category = ECSTRING(medical,Category_Medical); - }; - class GVAR(useMenu) { - displayName = CSTRING(useMenu); - description = CSTRING(useMenu_Descr); - value = 0; - typeName = "SCALAR"; - values[] = {ECSTRING(common,Disabled), ECSTRING(common,Enabled), ECSTRING(common,VehiclesOnly)}; - isClientSettable = 1; - category = ECSTRING(medical,Category_Medical); - }; - class GVAR(openAfterTreatment) { - displayName = CSTRING(openAfterTreatment); - description = CSTRING(openAfterTreatment_Descr); - typeName = "BOOL"; - value = 1; - isClientSettable = 1; - category = ECSTRING(medical,Category_Medical); - }; - class GVAR(maxRange) { - displayName = CSTRING(maxRange); - description = CSTRING(maxRange_Descr); - //for ref: 3d interaction (MEDICAL_ACTION_DISTANCE) is 1.75 - value = 3; - typeName = "SCALAR"; - category = ECSTRING(medical,Category_Medical); - sliderSettings[] = {0, 10, 3, 1}; - }; -}; diff --git a/addons/medical_menu/CfgVehicles.hpp b/addons/medical_menu/CfgVehicles.hpp deleted file mode 100644 index d152077f47..0000000000 --- a/addons/medical_menu/CfgVehicles.hpp +++ /dev/null @@ -1,71 +0,0 @@ - -class CfgVehicles { - - class ACE_Module; - class ACE_moduleMedicalMenuSettings: ACE_Module { - scope = 1; - displayName = CSTRING(module_DisplayName); - icon = QPATHTOEF(medical,UI\Icon_Module_Medical_ca.paa); - category = "ACE_medical"; - function = QUOTE(DFUNC(module)); - functionPriority = 1; - isGlobal = 1; - isSingular = 1; - isTriggerActivated = 0; - author = ECSTRING(common,ACETeam); - class Arguments { - class allow { - displayName = CSTRING(allow); - description = CSTRING(allow_Descr); - typeName = "NUMBER"; - class values { - class disable { - name = ECSTRING(common,Disabled); - value = 0; - }; - class enable { - name = ECSTRING(common,Enabled); - value = 1; - default = 1; - }; - class VehiclesOnly { - name = ECSTRING(common,VehiclesOnly); - value = 2; - }; - }; - }; - }; - class ModuleDescription { - description = CSTRING(module_Desc); - sync[] = {}; - }; - }; - - class Man; - class CAManBase: Man { - class ACE_SelfActions { - class Medical_Menu { - displayName = CSTRING(OpenMenu); - runOnHover = 0; - exceptions[] = {"isNotInside", "isNotSwimming"}; - condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); - statement = QUOTE([_target] call DFUNC(openMenu)); - icon = QPATHTOEF(medical,UI\icons\medical_cross.paa); - }; - }; - - class ACE_Actions { - // Create a consolidates medical menu for treatment while boarded - class ACE_MainActions { - class Medical_Menu { - displayName = CSTRING(OpenMenu); - runOnHover = 0; - exceptions[] = {"isNotInside", "isNotSwimming"}; - condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); - statement = QUOTE([_target] call DFUNC(openMenu)); - icon = QPATHTOEF(medical,UI\icons\medical_cross.paa); - }; - }; - }; - }; -}; diff --git a/addons/medical_menu/XEH_PREP.hpp b/addons/medical_menu/XEH_PREP.hpp deleted file mode 100644 index 8a44bd2bdc..0000000000 --- a/addons/medical_menu/XEH_PREP.hpp +++ /dev/null @@ -1,18 +0,0 @@ - -PREP(onMenuOpen); -PREP(onMenuClose); -PREP(openMenu); - -PREP(canOpenMenu); -PREP(updateIcons); -PREP(updateUIInfo); -PREP(handleUI_DisplayOptions); -PREP(handleUI_dropDownTriageCard); -PREP(getTreatmentOptions); -PREP(updateActivityLog); -PREP(updateQuickViewLog); -PREP(updateBodyImage); -PREP(updateInformationLists); -PREP(setTriageStatus); -PREP(collectActions); -PREP(module); diff --git a/addons/medical_menu/XEH_postInit.sqf b/addons/medical_menu/XEH_postInit.sqf deleted file mode 100644 index fcf2dbfd66..0000000000 --- a/addons/medical_menu/XEH_postInit.sqf +++ /dev/null @@ -1,41 +0,0 @@ -#include "script_component.hpp" - -if (!hasInterface) exitWith {}; - -GVAR(MenuPFHID) = -1; -GVAR(lastOpenedOn) = -1; -GVAR(pendingReopen) = false; - -["ace_treatmentSucceded", { - if (GVAR(openAfterTreatment) && {GVAR(pendingReopen)}) then { - GVAR(pendingReopen) = false; - [{ - [GVAR(INTERACTION_TARGET)] call FUNC(openMenu); - }, []] call CBA_fnc_execNextFrame; - }; -}] call CBA_fnc_addEventHandler; - -["ACE3 Common", QGVAR(displayMenuKeyPressed), localize LSTRING(DisplayMenuKey), -{ - TRACE_3("keyDown",cursorTarget,cursorObject,ACE_player); - private _target = cursorTarget; - if (!((_target isKindOf "CAManBase") && {[ACE_player, _target] call FUNC(canOpenMenu)})) then { - _target = cursorObject; - if (!((_target isKindOf "CAManBase") && {[ACE_player, _target] call FUNC(canOpenMenu)})) then { _target = ACE_player; }; - }; - - // Conditions: canInteract - if !([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; - if !([ACE_player, _target] call FUNC(canOpenMenu)) exitWith {false}; - - // Statement - [_target] call FUNC(openMenu); - false -}, -{ - if (CBA_missionTime - GVAR(lastOpenedOn) > 0.5) exitWith { - [objNull] call FUNC(openMenu); - }; - false -}, -[35, [false, false, false]], false, 0] call CBA_fnc_addKeybind; diff --git a/addons/medical_menu/XEH_preInit.sqf b/addons/medical_menu/XEH_preInit.sqf deleted file mode 100644 index 16e448fc38..0000000000 --- a/addons/medical_menu/XEH_preInit.sqf +++ /dev/null @@ -1,16 +0,0 @@ -#include "script_component.hpp" - -ADDON = false; - -PREP_RECOMPILE_START; -#include "XEH_PREP.hpp" -PREP_RECOMPILE_END; - -GVAR(INTERACTION_TARGET) = objNull; -GVAR(actionsOther) = []; -GVAR(actionsSelf) = []; -GVAR(selectedBodyPart) = 0; - -call FUNC(collectActions); - -ADDON = true; diff --git a/addons/medical_menu/data/background_img.paa b/addons/medical_menu/data/background_img.paa deleted file mode 100644 index de59065e3b..0000000000 Binary files a/addons/medical_menu/data/background_img.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_advanced_treatment.paa b/addons/medical_menu/data/icons/icon_advanced_treatment.paa deleted file mode 100644 index d6bf6effd9..0000000000 Binary files a/addons/medical_menu/data/icons/icon_advanced_treatment.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_airway_management.paa b/addons/medical_menu/data/icons/icon_airway_management.paa deleted file mode 100644 index f444f5f385..0000000000 Binary files a/addons/medical_menu/data/icons/icon_airway_management.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_bandage_fracture.paa b/addons/medical_menu/data/icons/icon_bandage_fracture.paa deleted file mode 100644 index df8d1de571..0000000000 Binary files a/addons/medical_menu/data/icons/icon_bandage_fracture.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_bleeding.paa b/addons/medical_menu/data/icons/icon_bleeding.paa deleted file mode 100644 index d11c2ed496..0000000000 Binary files a/addons/medical_menu/data/icons/icon_bleeding.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_examine_patient.paa b/addons/medical_menu/data/icons/icon_examine_patient.paa deleted file mode 100644 index 12eb06c890..0000000000 Binary files a/addons/medical_menu/data/icons/icon_examine_patient.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_medication.paa b/addons/medical_menu/data/icons/icon_medication.paa deleted file mode 100644 index 98893ad863..0000000000 Binary files a/addons/medical_menu/data/icons/icon_medication.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_toggle_self.paa b/addons/medical_menu/data/icons/icon_toggle_self.paa deleted file mode 100644 index 3078eb5dd5..0000000000 Binary files a/addons/medical_menu/data/icons/icon_toggle_self.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_tourniquet.paa b/addons/medical_menu/data/icons/icon_tourniquet.paa deleted file mode 100644 index 8b34a7bfbb..0000000000 Binary files a/addons/medical_menu/data/icons/icon_tourniquet.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_tourniquet_small.paa b/addons/medical_menu/data/icons/icon_tourniquet_small.paa deleted file mode 100644 index a457e2c0d5..0000000000 Binary files a/addons/medical_menu/data/icons/icon_tourniquet_small.paa and /dev/null differ diff --git a/addons/medical_menu/data/icons/icon_triage_card.paa b/addons/medical_menu/data/icons/icon_triage_card.paa deleted file mode 100644 index 850ab0f4ce..0000000000 Binary files a/addons/medical_menu/data/icons/icon_triage_card.paa and /dev/null differ diff --git a/addons/medical_menu/data/ui_background.paa b/addons/medical_menu/data/ui_background.paa deleted file mode 100644 index f1c42c7d7d..0000000000 Binary files a/addons/medical_menu/data/ui_background.paa and /dev/null differ diff --git a/addons/medical_menu/functions/fnc_canOpenMenu.sqf b/addons/medical_menu/functions/fnc_canOpenMenu.sqf deleted file mode 100644 index f69cf80d12..0000000000 --- a/addons/medical_menu/functions/fnc_canOpenMenu.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Check if ACE_player can Open the medical menu - * - * Arguments: - * 0: Caller - * 1: Target - * - * Return Value: - * Can open - * - * Example: - * [player, cursorTarget] call ace_medical_menu_fnc_canOpenMenu - * - * Public: No - */ - -params ["_caller", "_target"]; - -(alive _caller) -&& {!isNull _target} -&& {((_caller distance _target) < GVAR(maxRange)) || {(vehicle _caller) == (vehicle _target)}} //for now, ignore range when in same vehicle -&& {(GVAR(allow) == 1) || {(GVAR(allow) == 2) && {(vehicle _caller != _caller) || {vehicle _target != _target}}}} -&& {(GVAR(useMenu) == 1) || {(GVAR(useMenu) == 2) && {(vehicle _caller != _caller) || {vehicle _target != _target}}}} diff --git a/addons/medical_menu/functions/fnc_collectActions.sqf b/addons/medical_menu/functions/fnc_collectActions.sqf deleted file mode 100644 index 5353582fb2..0000000000 --- a/addons/medical_menu/functions/fnc_collectActions.sqf +++ /dev/null @@ -1,63 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Collect treatment actions from medical config - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_medical_menu_fnc_collectActions - * - * Public: No - */ - -private _configBasic = (configFile >> "ACE_Medical_Actions" >> "Basic"); -private _configAdvanced = (configFile >> "ACE_Medical_Actions" >> "Advanced"); - -private _fnc_compileActionsLevel = { - params ["_config"]; - private _actions = []; - - { - if (isClass _x) then { - private _displayName = getText (_x >> "displayName"); - private _category = getText (_x >> "category"); - private _condition = format[QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical,canTreatCached)), configName _x]; - private _statement = format[QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical,treatment)), configName _x]; - _actions pushBack [_displayName, _category, compile _condition, compile _statement]; - }; - nil - } count ("true" configClasses _config); - - _actions; -}; - -GVAR(actionsBasic) = [_configBasic] call _fnc_compileActionsLevel; -GVAR(actionsAdvanced) = [_configAdvanced] call _fnc_compileActionsLevel; - -//Manually add the drag actions, if dragging exists. -if (["ace_dragging"] call EFUNC(common,isModLoaded)) then { - private _condition = { - (ACE_player != GVAR(INTERACTION_TARGET)) && {[ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,canDrag)} - }; - private _statement = { - GVAR(pendingReopen) = false; //No medical_treatmentSuccess event after drag, so don't want this true - [ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,startDrag); - }; - GVAR(actionsBasic) pushBack [localize ELSTRING(dragging,Drag), "drag", _condition, _statement]; - GVAR(actionsAdvanced) pushBack [localize ELSTRING(dragging,Drag), "drag", _condition, _statement]; - - private _condition = { - (ACE_player != GVAR(INTERACTION_TARGET)) && {[ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,canCarry)} - }; - private _statement = { - GVAR(pendingReopen) = false; //No medical_treatmentSuccess event after drag, so don't want this true - [ACE_player, GVAR(INTERACTION_TARGET)] call EFUNC(dragging,startCarry); - }; - GVAR(actionsBasic) pushBack [localize ELSTRING(dragging,Carry), "drag", _condition, _statement]; - GVAR(actionsAdvanced) pushBack [localize ELSTRING(dragging,Carry), "drag", _condition, _statement]; -}; diff --git a/addons/medical_menu/functions/fnc_getTreatmentOptions.sqf b/addons/medical_menu/functions/fnc_getTreatmentOptions.sqf deleted file mode 100644 index eac639c4d5..0000000000 --- a/addons/medical_menu/functions/fnc_getTreatmentOptions.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Grab available treatment options for given category - * - * Arguments: - * 0: The medic - * 1: The patient - * 2: Category name - * - * Return Value: - * Available actions - * - * Example: - * [ACE_player, poor_dude, "some category"] call ace_medical_menu_fnc_getTreatmentOptions - * - * Public: No - */ - -params ["_player", "_target", "_name"]; - -if (!([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith))) exitWith {[]}; - -private _actions = if (EGVAR(medical,level) == 2) then { - GVAR(actionsAdvanced); -} else { - GVAR(actionsBasic); -}; - -private _collectedActions = []; -private _bodyPart = EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart); -{ - _x params ["", "_currentCategory", "_currentCondition"]; - if (_name == _currentCategory && {call _currentCondition}) then { - _collectedActions pushBack _x; - }; - nil -} count _actions; - -_collectedActions; diff --git a/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf b/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf deleted file mode 100644 index 55de1339d0..0000000000 --- a/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf +++ /dev/null @@ -1,109 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Display the available treatment options in category - * - * Arguments: - * 0: Category name - * - * Return Value: - * None - * - * Example: - * ["some category"] call ace_medical_menu_fnc_handleUI_DisplayOptions - * - * Public: No - */ - -#define START_IDC 20 -#define END_IDC 27 -#define AMOUNT_OF_ENTRIES (count _entries) - -if (!hasInterface) exitWith{}; - -params ["_name"]; - -disableSerialization; - -private _display = uiNamespace getVariable QGVAR(medicalMenu); -if (isNil "_display") exitWith {}; // no valid dialog present - -if (_name isEqualTo "toggle") exitWith { - private _newTarget = ACE_player; - //If we are on the player, and only if our old target is still valid, switch to it: - if ((GVAR(INTERACTION_TARGET) == ACE_player) && - {[ACE_player, GVAR(INTERACTION_TARGET_PREVIOUS), ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)} && - {[ACE_player, GVAR(INTERACTION_TARGET_PREVIOUS)] call FUNC(canOpenMenu)}) then { - _newTarget = GVAR(INTERACTION_TARGET_PREVIOUS); - }; - - GVAR(INTERACTION_TARGET_PREVIOUS) = GVAR(INTERACTION_TARGET); - - closeDialog 0; - [{ - [_this select 0] call FUNC(openMenu); - }, [_newTarget], 0.1] call CBA_fnc_waitAndExecute; -}; - -// Clean the dropdown options list from all actions -for [{_x = START_IDC}, {_x <= END_IDC}, {_x = _x + 1}] do { - private _ctrl = (_display displayCtrl (_x)); - _ctrl ctrlSetText ""; - _ctrl ctrlShow false; - _ctrl ctrlSetEventHandler ["ButtonClick",""]; - _ctrl ctrlSetTooltip ""; - _ctrl ctrlCommit 0; -}; - -GVAR(LatestDisplayOptionMenu) = _name; - -// The triage card has no options available -lbClear 212; -if (_name isEqualTo "triage") exitWith { - - ctrlEnable [212, true]; - private _log = GVAR(INTERACTION_TARGET) getVariable [QEGVAR(medical,triageCard), []]; - private _triageCardTexts = []; - { - _x params ["_item", "_amount", "_time"]; - private _message = _item; - if (isClass(configFile >> "CfgWeapons" >> _item)) then { - _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); - } else { - if (isLocalized _message) then { - _message = localize _message; - }; - }; - _triageCardTexts pushBack format["%1x - %2 (%3m)", _amount, _message, round((CBA_missionTime - _time) / 60)]; - nil; - } count _log; - - if (count _triageCardTexts == 0) exitWith { - lbAdd [212,(localize ELSTRING(medical,TriageCard_NoEntry))]; - }; - { - lbAdd [212,_x]; - nil; - }count _triageCardTexts; -}; - -ctrlEnable [212, false]; - -_entries = [ACE_player, GVAR(INTERACTION_TARGET), _name] call FUNC(getTreatmentOptions); - -{ - //player sidechat format["TRIGGERED: %1",_x]; - if (_forEachIndex > END_IDC) exitWith {}; - _ctrl = (_display displayCtrl (START_IDC + _forEachIndex)); - if (!(_forEachIndex > AMOUNT_OF_ENTRIES)) then { - _ctrl ctrlSetText (_x select 0); - private _code = format ["ace_medical_menu_pendingReopen = true; call %1;", (_x select 3)]; - _ctrl ctrlSetEventHandler ["ButtonClick", _code]; - _ctrl ctrlSetTooltip (_x select 0); // TODO implement - _ctrl ctrlShow true; - } else { - _ctrl ctrlSetText ""; - _ctrl ctrlSetEventHandler ["ButtonClick", ""]; - }; - _ctrl ctrlCommit 0; -} forEach _entries; diff --git a/addons/medical_menu/functions/fnc_handleUI_dropDownTriageCard.sqf b/addons/medical_menu/functions/fnc_handleUI_dropDownTriageCard.sqf deleted file mode 100644 index 988022d7a6..0000000000 --- a/addons/medical_menu/functions/fnc_handleUI_dropDownTriageCard.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handle the triage card display - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_medical_menu_fnc_handleUI_dropDownTriageCard - * - * Public: No - */ - -disableSerialization; - -private _display = uiNamespace getVariable QGVAR(medicalMenu); -private _pos = [0, 0, 0, 0]; -private _currentPos = ctrlPosition (_display displayCtrl 2002); -_currentPos params ["_currentPosX", "_currentPosY"]; -if (_currentPosX == 0 && _currentPosY == 0) then { - _pos = ctrlPosition (_display displayCtrl 2001); -}; - -for "_idc" from 2002 to 2006 step 1 do { - _pos set [1, (_pos select 1) + (_pos select 3)]; - private _ctrl = _display displayCtrl _idc; - _ctrl ctrlSetPosition _pos; - _ctrl ctrlCommit 0; -}; diff --git a/addons/medical_menu/functions/fnc_module.sqf b/addons/medical_menu/functions/fnc_module.sqf deleted file mode 100644 index bdb6f33086..0000000000 --- a/addons/medical_menu/functions/fnc_module.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Module for adjusting the medical menu settings - * - * Arguments: - * 0: The module logic - * 1: units - * 2: activated - * - * Return Value: - * None - * - * Example: - * [LOGIC, [bob, kevin], true] call ACE_medical_menu_fnc_module - * - * Public: No - */ - -params ["_logic", "", "_activated"]; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(allow), "allow"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical_menu/functions/fnc_onMenuClose.sqf b/addons/medical_menu/functions/fnc_onMenuClose.sqf deleted file mode 100644 index f6318263dd..0000000000 --- a/addons/medical_menu/functions/fnc_onMenuClose.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "script_component.hpp" -/* - * Author: joko // Jonas - * Handle medical menu closed - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ace_medical_menu_fnc_onMenuClosed - * - * Public: No - */ - -if (EGVAR(interact_menu,menuBackground)==1) then {[QGVAR(id), false] call EFUNC(common,blurScreen);}; -if (EGVAR(interact_menu,menuBackground)==2) then {(uiNamespace getVariable [QEGVAR(interact_menu,menuBackground), displayNull]) closeDisplay 0;}; - -[GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler; -GVAR(MenuPFHID) = -1; diff --git a/addons/medical_menu/functions/fnc_onMenuOpen.sqf b/addons/medical_menu/functions/fnc_onMenuOpen.sqf deleted file mode 100644 index 991529712a..0000000000 --- a/addons/medical_menu/functions/fnc_onMenuOpen.sqf +++ /dev/null @@ -1,88 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Handle medical menu opened - * - * Arguments: - * 0: Medical Menu display - * - * Return Value: - * None - * - * Example: - * [medical_menu] call ace_medical_menu_fnc_onMenuOpen - * - * Public: No - */ -#define MAX_DISTANCE 10 - -params ["_display"]; - -if (isNil "_display") exitWith {}; - -if (EGVAR(interact_menu,menuBackground)==1) then {[QGVAR(id), true] call EFUNC(common,blurScreen);}; -if (EGVAR(interact_menu,menuBackground)==2) then {0 cutRsc[QEGVAR(interact_menu,menuBackground), "PLAIN", 1, false];}; - -if (isNil QGVAR(LatestDisplayOptionMenu)) then { - GVAR(LatestDisplayOptionMenu) = "triage"; -} else { - if (GVAR(LatestDisplayOptionMenu) == "toggle") then { - GVAR(LatestDisplayOptionMenu) = "triage"; - GVAR(INTERACTION_TARGET) = GVAR(INTERACTION_TARGET_PREVIOUS); - }; -}; - -private _target = GVAR(INTERACTION_TARGET); -if (isNil QGVAR(INTERACTION_TARGET_PREVIOUS)) then { - GVAR(INTERACTION_TARGET_PREVIOUS) = _target; -}; -[GVAR(LatestDisplayOptionMenu)] call FUNC(handleUI_DisplayOptions); - -disableSerialization; - -[_target, _display] call FUNC(updateUIInfo); - -(_display displayCtrl 11) ctrlSetTooltip localize LSTRING(VIEW_TRIAGE_CARD); -(_display displayCtrl 12) ctrlSetTooltip localize LSTRING(EXAMINE_PATIENT); -(_display displayCtrl 13) ctrlSetTooltip localize LSTRING(BANDAGE_FRACTURES); -(_display displayCtrl 14) ctrlSetTooltip localize LSTRING(MEDICATION); -(_display displayCtrl 15) ctrlSetTooltip localize LSTRING(AIRWAY_MANAGEMENT); -(_display displayCtrl 16) ctrlSetTooltip localize LSTRING(ADVANCED_TREATMENT); -(_display displayCtrl 17) ctrlSetTooltip localize LSTRING(DRAG_CARRY); -(_display displayCtrl 18) ctrlSetTooltip localize LSTRING(TOGGLE_SELF); - -(_display displayCtrl 301) ctrlSetTooltip localize LSTRING(SELECT_HEAD); -(_display displayCtrl 302) ctrlSetTooltip localize LSTRING(SELECT_TORSO); -(_display displayCtrl 303) ctrlSetTooltip localize LSTRING(SELECT_ARM_R); -(_display displayCtrl 304) ctrlSetTooltip localize LSTRING(SELECT_ARM_L); -(_display displayCtrl 305) ctrlSetTooltip localize LSTRING(SELECT_LEG_R); -(_display displayCtrl 306) ctrlSetTooltip localize LSTRING(SELECT_LEG_L); -(_display displayCtrl 2001) ctrlSetTooltip localize LSTRING(SELECT_TRIAGE_STATUS); - -(_display displayCtrl 1) ctrlSetText format ["%1", [_target] call EFUNC(common,getName)]; -setMousePosition [0.4, 0.4]; - -if (GVAR(MenuPFHID) != -1) exitWith {ERROR("PFID already running");}; - -GVAR(MenuPFHID) = [{ - - (_this select 0) params ["_display"]; - if (isNull GVAR(INTERACTION_TARGET)) then { - GVAR(INTERACTION_TARGET) = ACE_player; - }; - [GVAR(INTERACTION_TARGET), _display] call FUNC(updateUIInfo); - [GVAR(INTERACTION_TARGET)] call FUNC(updateIcons); - [GVAR(LatestDisplayOptionMenu)] call FUNC(handleUI_DisplayOptions); - - //Check that it's valid to stay open: - if !(([ACE_player, GVAR(INTERACTION_TARGET), ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) && {[ACE_player, GVAR(INTERACTION_TARGET)] call FUNC(canOpenMenu)}) then { - closeDialog 314412; - //If we failed because of distance check, show UI message: - if ((ACE_player distance GVAR(INTERACTION_TARGET)) > GVAR(maxRange)) then { - [[ELSTRING(medical,DistanceToFar), [GVAR(INTERACTION_TARGET)] call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured); - }; - }; - -}, 0, [_display]] call CBA_fnc_addPerFrameHandler; - -["ace_medicalMenuOpened", [ACE_player, _target]] call CBA_fnc_localEvent; diff --git a/addons/medical_menu/functions/fnc_openMenu.sqf b/addons/medical_menu/functions/fnc_openMenu.sqf deleted file mode 100644 index a492da8c43..0000000000 --- a/addons/medical_menu/functions/fnc_openMenu.sqf +++ /dev/null @@ -1,34 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Open the medical menu for target - * - * Arguments: - * 0: Target - * - * Return Value: - * If action was taken - * - * Example: - * [some_player] call ace_medical_menu_fnc_openMenu - * - * Public: No - */ - -params ["_interactionTarget"]; - -if (dialog || {isNull _interactionTarget}) exitWith { - disableSerialization; - - private _display = uiNamespace getVariable QGVAR(medicalMenu); - if (!isNil "_display") then { - closeDialog 314412; - }; -}; - -GVAR(INTERACTION_TARGET) = _interactionTarget; - -createDialog QGVAR(medicalMenu); -GVAR(lastOpenedOn) = CBA_missionTime; - -true diff --git a/addons/medical_menu/functions/fnc_setTriageStatus.sqf b/addons/medical_menu/functions/fnc_setTriageStatus.sqf deleted file mode 100644 index 9580a051e8..0000000000 --- a/addons/medical_menu/functions/fnc_setTriageStatus.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Set the triage status of object - * - * Arguments: - * 0: Target - * 1: Status - * - * Return Value: - * None - * - * Example: - * [bob, 2] call ACE_medical_menu_fnc_setTriageStatus - * - * Public: No - */ - -params ["_target", "_status"]; - -_target setVariable [QEGVAR(medical,triageLevel), _status, true]; diff --git a/addons/medical_menu/functions/fnc_updateActivityLog.sqf b/addons/medical_menu/functions/fnc_updateActivityLog.sqf deleted file mode 100644 index c99bc1ef4f..0000000000 --- a/addons/medical_menu/functions/fnc_updateActivityLog.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the activity log - * - * Arguments: - * 0: display - * 1: log collection - * - * Return Value: - * None - * - * Example: - * [some_display, log] call ace_medical_menu_fnc_updateActivityLog - * - * Public: No - */ - -params ["_display", "_logs"]; - -private _logCtrl = _display displayCtrl 214; -lbClear _logCtrl; - -{ - _x params ["_message", "_moment", "", "_arguments"]; - - if (isLocalized _message) then { - _message = localize _message; - }; - - { - if (_x isEqualType "" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; - }; - } forEach _arguments; - - _message = format ([_message] + _arguments); - _logCtrl lbAdd format ["%1 %2", _moment, _message]; - nil -} count _logs; diff --git a/addons/medical_menu/functions/fnc_updateBodyImage.sqf b/addons/medical_menu/functions/fnc_updateBodyImage.sqf deleted file mode 100644 index 234556a969..0000000000 --- a/addons/medical_menu/functions/fnc_updateBodyImage.sqf +++ /dev/null @@ -1,41 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the body image on the menu - * - * Arguments: - * 0: selection bloodloss - * 1: damaged (array of bools) - * 2: display - * - * Return Value: - * None - * - * Example: - * [0.3, some_display] call ace_medical_menu_fnc_updateBodyImage - * - * Public: No - */ - -params ["_selectionBloodLoss", "_damaged", "_display"]; - -// Handle the body image coloring -private _availableSelections = [50, 51, 52, 53, 54, 55]; -{ - private _red = 1; - private _green = 1; - private _blue = 1; - - if (_x > 0) then { - if (_damaged select _forEachIndex) then { - _green = (0.9 - _x) max 0; - _blue = _green; - } else { - _green = (0.9 - _x) max 0; - _red = _green; - //_blue = _green; - }; - }; - - (_display displayCtrl (_availableSelections select _forEachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; -} forEach _selectionBloodLoss; diff --git a/addons/medical_menu/functions/fnc_updateIcons.sqf b/addons/medical_menu/functions/fnc_updateIcons.sqf deleted file mode 100644 index 2d437612d7..0000000000 --- a/addons/medical_menu/functions/fnc_updateIcons.sqf +++ /dev/null @@ -1,33 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the category icons - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_medical_menu_fnc_updateIcons - * - * Public: No - */ - -#define START_IDC 111 -#define END_IDC 118 - -disableSerialization; - -private _display = uiNamespace getVariable QGVAR(medicalMenu); -private _options = ["triage" , "examine", "bandage", "medication", "airway", "advanced", "drag", "toggle"]; - -for "_idc" from START_IDC to END_IDC step 1 do { - private _amount = [ACE_player, GVAR(INTERACTION_TARGET), _options select (_idc - START_IDC)] call FUNC(getTreatmentOptions); - if ((count _amount) > 0 || _idc == START_IDC || _idc == END_IDC) then { - (_display displayCtrl _idc) ctrlSettextColor [1, 1, 1, 1]; - } else { - (_display displayCtrl _idc) ctrlSettextColor [0.4, 0.4, 0.4, 1]; - }; -}; diff --git a/addons/medical_menu/functions/fnc_updateInformationLists.sqf b/addons/medical_menu/functions/fnc_updateInformationLists.sqf deleted file mode 100644 index 25f457503c..0000000000 --- a/addons/medical_menu/functions/fnc_updateInformationLists.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the treatment information list - * - * Arguments: - * 0: display - * 1: message collection - * 2: injury collection - * - * Return Value: - * None - * - * Example: - * [DISPLAY, [messagecollection], [injurycollection]] call ACE_medical_menu_fnc_updateInformationLists - * - * Public: No - */ - -params ["_display", "_genericMessages", "_allInjuryTexts"]; - -private _lbCtrl = _display displayCtrl 213; -lbClear _lbCtrl; -{ - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_forEachIndex, _color]; -} forEach _genericMessages; - -private _amountOfGeneric = count _genericMessages; -{ - _x params ["_add", "_color"]; - _lbCtrl lbAdd _add; - _lbCtrl lbSetColor [_forEachIndex + _amountOfGeneric, _color]; -} forEach _allInjuryTexts; - -if (_allInjuryTexts isEqualTo []) then { - _lbCtrl lbAdd localize ELSTRING(medical,NoInjuriesBodypart); -}; diff --git a/addons/medical_menu/functions/fnc_updateQuickViewLog.sqf b/addons/medical_menu/functions/fnc_updateQuickViewLog.sqf deleted file mode 100644 index c398faaf14..0000000000 --- a/addons/medical_menu/functions/fnc_updateQuickViewLog.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update the quick view log - * - * Arguments: - * 0: display - * 1: log collection - * - * Return Value: - * None - * - * Example: - * [some_display, log] call ace_medical_menu_fnc_updateQuickViewLog - * - * Public: No - */ - -params ["_display", "_logs"]; - -private _logCtrl = _display displayCtrl 215; -lbClear _logCtrl; - -{ - _x params ["_message", "_moment", "", "_arguments"]; - - { - if (_x isEqualType "" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; - }; - } forEach _arguments; - - _message = format ([([_message, localize _message] select (isLocalized _message))] + _arguments); - _logCtrl lbAdd format ["%1 %2", _moment, _message]; - nil -} count _logs; diff --git a/addons/medical_menu/functions/fnc_updateUIInfo.sqf b/addons/medical_menu/functions/fnc_updateUIInfo.sqf deleted file mode 100644 index f1341bf693..0000000000 --- a/addons/medical_menu/functions/fnc_updateUIInfo.sqf +++ /dev/null @@ -1,153 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal - * Update all UI information in the medical menu - * - * Arguments: - * 0: target - * 1: display - * - * Return Value: - * None - * - * Example: - * [some_player, some_display] call ace_medical_menu_fnc_updateUIInfo - * - * Public: No - */ - -params ["_target", "_display"]; - -if (isNil "_display" || {isNull _display}) exitWith {ERROR("No display");}; - -private _selectionN = GVAR(selectedBodyPart); -if (_selectionN < 0 || {_selectionN > 5}) exitWith {}; - -private _genericMessages = []; -private _partText = [ELSTRING(medical,Head), ELSTRING(medical,Torso), ELSTRING(medical,LeftArm) ,ELSTRING(medical,RightArm) ,ELSTRING(medical,LeftLeg), ELSTRING(medical,RightLeg)] select _selectionN; -_genericMessages pushBack [localize _partText, [1, 1, 1, 1]]; - -if (_target getVariable [QEGVAR(medical,isBleeding), false]) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Bleeding), [1, 0.1, 0.1, 1]]; -}; - -if (_target getVariable [QEGVAR(medical,hasLostBlood), 0] > 1) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Lost_Blood), [1, 0.1, 0.1, 1]]; -}; - -if (((_target getVariable [QEGVAR(medical,tourniquets), [0, 0, 0, 0, 0, 0]]) select _selectionN) > 0) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; -}; - -if (_target getVariable [QEGVAR(medical,hasPain), false]) then { - _genericMessages pushBack [localize ELSTRING(medical,Status_Pain), [1, 1, 1, 1]]; -}; - -private _totalIvVolume = 0; -private _bloodBags = _target getVariable [QEGVAR(medical,ivBags), []]; -{ - _x params ["_bagVolumeRemaining"]; - _totalIvVolume = _totalIvVolume + _bagVolumeRemaining; -} foreach _bloodBags; - -if (_totalIvVolume >= 1) then { - _genericMessages pushBack [format [localize ELSTRING(medical,receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; -}; - -private _damaged = [false, false, false, false, false, false]; -private _selectionBloodLoss = [0, 0, 0, 0, 0, 0]; - -private _allInjuryTexts = []; -if ((EGVAR(medical,level) >= 2) && {([_target] call EFUNC(medical,hasMedicalEnabled))}) then { - private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if (_amountOf > 0) then { - _damaged set [_x select 2, true]; - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - - if (_selectionN == (_x select 2)) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushBack [format["%2x %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6, ceil _amountOf], [1,1,1,1]]; - } else { - // TODO localization - _allInjuryTexts pushBack [format["Partial %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6], [1,1,1,1]]; - }; - }; - }; - } forEach _openWounds; - - private _bandagedwounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if !(_damaged select (_x select 2)) then { - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - }; - if (_selectionN == (_x select 2)) then { - // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] - if (_amountOf > 0) then { - if (_amountOf >= 1) then { - // TODO localization - _allInjuryTexts pushBack [format ["[B] %2x %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6, ceil _amountOf], [0.88,0.7,0.65,1]]; - } else { - // TODO localization - _allInjuryTexts pushBack [format ["[B] Partial %1", (EGVAR(medical,AllWoundInjuryTypes) select (_x select 1)) select 6], [0.88,0.7,0.65,1]]; - }; - }; - }; - } forEach _bandagedwounds; -} else { - - // Add all bleeding from wounds on selection - private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if (_amountOf > 0) then { - _damaged set [_x select 2, true]; - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - }; - } forEach _openWounds; - - private _bandagedwounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; - { - private _amountOf = _x select 3; - // Find how much this bodypart is bleeding - if !(_damaged select (_x select 2)) then { - _selectionBloodLoss set [_x select 2, (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; - }; - } forEach _bandagedwounds; - - private _bloodLossOnSelection = _selectionBloodLoss select _selectionN; - if (_bloodLossOnSelection > 0) then { - private _severity = switch (true) do { - case (_bloodLossOnSelection > 0.5): {localize ELSTRING(medical,HeavilyWounded)}; - case (_bloodLossOnSelection > 0.1): {localize ELSTRING(medical,LightlyWounded)}; - default {localize ELSTRING(medical,VeryLightlyWounded)}; - }; - private _part = localize ([ - ELSTRING(medical,Head), - ELSTRING(medical,Torso), - ELSTRING(medical,LeftArm), - ELSTRING(medical,RightArm), - ELSTRING(medical,LeftLeg), - ELSTRING(medical,RightLeg) - ] select _selectionN); - _allInjuryTexts pushBack [format ["%1 %2", _severity, toLower _part], [1,1,1,1]]; - }; -}; - -[_selectionBloodLoss, _damaged, _display] call FUNC(updateBodyImage); -[_display, _genericMessages, _allInjuryTexts] call FUNC(updateInformationLists); -[_display, _target getVariable [QEGVAR(medical,tourniquets), [0,0,0,0,0,0]]] call EFUNC(medical,updateTourniquets); - -[_display, _target getVariable [QEGVAR(medical,logFile_activity_view), []]] call FUNC(updateActivityLog); -[_display, _target getVariable [QEGVAR(medical,logFile_quick_view), []]] call FUNC(updateQuickViewLog); - -private _triageStatus = [_target] call EFUNC(medical,getTriageStatus); -(_display displayCtrl 2000) ctrlSetText (_triageStatus select 0); -(_display displayCtrl 2000) ctrlSetBackgroundColor (_triageStatus select 2); diff --git a/addons/medical_menu/functions/script_component.hpp b/addons/medical_menu/functions/script_component.hpp deleted file mode 100644 index 8c2e419166..0000000000 --- a/addons/medical_menu/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\medical_menu\script_component.hpp" diff --git a/addons/medical_menu/script_component.hpp b/addons/medical_menu/script_component.hpp deleted file mode 100644 index 28ab0311b3..0000000000 --- a/addons/medical_menu/script_component.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#define COMPONENT medical_menu -#define COMPONENT_BEAUTIFIED Medical Menu -#include "\z\ace\addons\main\script_mod.hpp" - -// #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE -// #define ENABLE_PERFORMANCE_COUNTERS - -#ifdef DEBUG_ENABLED_MEDICAL_MENU - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_MEDICAL_MENU - #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_MENU -#endif - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/medical_menu/ui/menu.hpp b/addons/medical_menu/ui/menu.hpp deleted file mode 100644 index 0743dc93d5..0000000000 --- a/addons/medical_menu/ui/menu.hpp +++ /dev/null @@ -1,586 +0,0 @@ -#include "\z\ace\addons\common\define.hpp" - -class GVAR(medicalMenu) { - idd = 314412; - movingEnable = true; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([] call FUNC(onMenuClose)); - class controlsBackground { - class HeaderBackground: ACE_gui_backgroundBase { - idc = -1; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(0,0,0,0)"; - }; - class CenterBackground: HeaderBackground { - y = "2.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - h = "16 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(0,0,0,0.8)"; - colorText[] = {0, 0, 0, "(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - colorBackground[] = {0,0,0,"(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - }; - class BottomBackground: CenterBackground { - y = "(18.6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))"; - h = "9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - }; - }; - - class controls { - class HeaderName { - idc = 1; - type = CT_STATIC; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_LEFT + ST_SHADOW; - font = "RobotoCondensed"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {"(profilenamespace getVariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getVariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getVariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getVariable ['GUI_BCG_RGB_A',0.9])"}; - text = ""; - }; - - class IconsBackGroundBar: ACE_gui_backgroundBase{ - idc = -1; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "2.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "3.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = QPATHTOF(data\background_img.paa); - colorText[] = {1, 1, 1, 0.0}; - }; - class CatagoryLeft: HeaderName { - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - colorText[] = {1, 1, 1.0, 0.9}; - colorBackground[] = {0,0,0,0}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; - text = CSTRING(EXAMINE_TREATMENT); - }; - class CatagoryCenter: CatagoryLeft { - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = CSTRING(STATUS); - }; - class CatagoryRight: CatagoryCenter{ - x = "25.66 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = CSTRING(OVERVIEW); - }; - class Line: ACE_gui_backgroundBase { - idc = -1; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "37 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.03 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(1,1,1,0.5)"; - }; - - class iconImg1: ACE_gui_backgroundBase { - idc = 111; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.1)"; - colorBackground[] = {0,0,0,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOF(data\icons\triage_card_small.paa); - }; - class iconImg2: iconImg1 { - idc = 112; - x = "3 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\examine_patient_small.paa); - }; - class iconImg3: iconImg1 { - idc = 113; - x = "4.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\bandage_fracture_small.paa); - }; - class iconImg4: iconImg1 { - idc = 114; - x = "6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\medication_small.paa); - }; - class iconImg5: iconImg1 { - idc = 115; - x = "7.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\airway_management_small.paa); - }; - class iconImg6: iconImg1 { - idc = 116; - x = "9 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\advanced_treatment_small.paa); - }; - class iconImg7: iconImg1 { - idc = 117; - x = "10.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\icon_carry.paa); - }; - class iconImg8: iconImg1 { - idc = 118; - x = "12 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = QPATHTOF(data\icons\toggle_self_small.paa); - }; - - - class BtnIconLeft1: ACE_gui_buttonBase { - idc = 11; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE(['triage'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft2: BtnIconLeft1 { - idc = 12; - x = "3 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['examine'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft3: BtnIconLeft1 { - idc = 13; - x = "4.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['bandage'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft4: BtnIconLeft1 { - idc = 14; - x = "6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['medication'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft5: BtnIconLeft1 { - idc = 15; - x = "7.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['airway'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft6: BtnIconLeft1 { - idc = 16; - x = "9 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['advanced'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft7: BtnIconLeft1 { - idc = 17; - x = "10.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['drag'] call FUNC(handleUI_DisplayOptions);); - }; - class BtnIconLeft8: BtnIconLeft1 { - idc = 18; - x = "12 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(['toggle'] call FUNC(handleUI_DisplayOptions);); - }; - - class TriageCardList: ACE_gui_listBoxBase { - idc = 212; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "10 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - colorBackground[] = {0, 0, 0, 0.2}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {0.95, 0.95, 0.95, 1}; - colorSelect2[] = {0.95, 0.95, 0.95, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - }; - - // Left side - class BtnMenu1: BtnIconLeft1 { - idc = 20; - y = "5.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = ""; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.9)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.8)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.5)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - color[] = {1, 1, 1, 1}; - color2[] = {0,0,0, 1}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground[] = {1,1,1,1}; - colorbackground2[] = {1,1,1,1}; - colorDisabled[] = {0.5,0.5,0.5,0.8}; - colorFocused[] = {0,0,0,1}; - periodFocus = 1; - periodOver = 1; - action = ""; - }; - class BtnMenu2: BtnMenu1 { - idc = 21; - y = "6.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu3: BtnMenu1 { - idc = 22; - y = "7.6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu4: BtnMenu1 { - idc = 23; - y = "8.7 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text =""; - }; - class BtnMenu5: BtnMenu1 { - idc = 24; - y = "9.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu6: BtnMenu1 { - idc = 25; - y = "10.9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu7: BtnMenu1 { - idc = 26; - y = "12 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - class BtnMenu8: BtnMenu1 { - idc = 27; - y = "13.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - text = ""; - }; - // center - - class bodyImgBackground: ACE_gui_backgroundBase { - idc = -1; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "12.33 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,1}; - colorText[] = {1,1,1,1}; - text = QPATHTOEF(medical,ui\body_background.paa); - }; - class bodyImgHead: bodyImgBackground { - idc = 50; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.73 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "12.33 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - colorBackground[] = {1,1,1,1}; - colorPicture[] = {1,1,1,0.75}; - colorText[] = {1,1,1,0.75}; - text = QPATHTOEF(medical,ui\body_head.paa); - }; - - class bodyImgTorso: bodyImgHead { - idc = 51; - text = QPATHTOEF(medical,ui\body_torso.paa); - }; - class bodyImgArms_l: bodyImgHead { - idc = 52; - text = QPATHTOEF(medical,ui\body_arm_left.paa); - }; - class bodyImgArms_r: bodyImgHead { - idc = 53; - text = QPATHTOEF(medical,ui\body_arm_right.paa); - }; - class bodyImgLegs_l: bodyImgHead { - idc = 54; - text = QPATHTOEF(medical,ui\body_leg_left.paa); - }; - class bodyImgLegs_r: bodyImgHead { - idc = 55; - text = QPATHTOEF(medical,ui\body_leg_right.paa); - }; - class bodyImgTournAL: bodyImgHead { - idc = 56; - text = QPATHTOEF(medical,ui\tourniquet_arm_left.paa); - }; - class bodyImgTournAR: bodyImgHead { - idc = 57; - text = QPATHTOEF(medical,ui\tourniquet_arm_right.paa); - }; - class bodyImgTournLL: bodyImgHead { - idc = 58; - text = QPATHTOEF(medical,ui\tourniquet_leg_left.paa); - }; - class bodyImgTournLR: bodyImgHead { - idc = 59; - text = QPATHTOEF(medical,ui\tourniquet_leg_right.paa); - }; - - - class selectHead: ACE_gui_buttonBase { - idc = 301; - x = "18.8 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "3.9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.4 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE(GVAR(selectedBodyPart) = 0;); - }; - class selectTorso : selectHead { - idc = 302; - x = "18.4 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "2.2 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "4.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - action = QUOTE(GVAR(selectedBodyPart) = 1;); - }; - class selectLeftArm: selectHead{ - idc = 303; - x = "17.4 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.9 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.1 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "4.3 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - action = QUOTE(GVAR(selectedBodyPart) = 3;); - }; - class selectRightArm: selectLeftArm{ - idc = 304; - x = "20.6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(GVAR(selectedBodyPart) = 2;); - }; - class selectLeftLeg :selectHead { - idc = 305; - x = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "9.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "1.1 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - action = QUOTE(GVAR(selectedBodyPart) = 5;); - }; - class selectRightLeg :selectLeftLeg { - idc = 306; - x = "19.6 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - action = QUOTE(GVAR(selectedBodyPart) = 4;); - }; - - - class TriageTextBottom: HeaderName { - idc = 2000; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "16.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - colorText[] = {1, 1, 1.0, 1}; - colorBackground[] = {0,0.0,0.0,0.7}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - }; - - // Right side - class InjuryList: ACE_gui_listBoxBase { - idc = 213; - x = "25.66 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "5.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "10 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - rowHeight = 0.03; - colorBackground[] = {0, 0, 0, 0.2}; - colorText[] = {1,1, 1, 1.0}; - colorScrollbar[] = {0.95, 0.95, 0.95, 1}; - colorSelect[] = {0.95, 0.95, 0.95, 1}; - colorSelect2[] = {0.95, 0.95, 0.95, 1}; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.5}; - }; - // bottom - - class ActivityLogHeader: CatagoryLeft { - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "18.6 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - colorText[] = {0.6, 0.7, 1.0, 1}; - colorBackground[] = {0,0,0,0}; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = CSTRING(ACTIVITY_LOG); - }; - class QuickViewHeader: ActivityLogHeader { - x = "19.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = CSTRING(QUICK_VIEW); - }; - class LineBottomHeaders: Line { - y = "19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - }; - class ActivityLog: InjuryList { - idc = 214; - //style = 16; - //type = 102; - //rows=1; - colorBackground[] = {0, 0, 0, 0}; - x = "1.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "(19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))"; - w = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "6.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - //colorSelectBackground[] = {0, 0, 0, 0.0}; - //colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - //columns[] = {0.0, 0.08}; - //canDrag=true; - //arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; - // arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; - drawSideArrows = 0; - //idcLeft = -1; - //idcRight = -1; - }; - - class QuikViewLog: InjuryList { - idc = 215; - //style = 16; - //type = 102; - //rows=1; - colorBackground[] = {0, 0, 0, 0}; - x = "21.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "(19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))"; - w = "18.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "6.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.7)"; - colorSelectBackground[] = {0, 0, 0, 0.0}; - colorSelectBackground2[] = {0.0, 0.0, 0.0, 0.0}; - - //columns[] = {0.0, 0.08}; - //canDrag=true; - //arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; - // arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; - drawSideArrows = 0; - //idcLeft = -1; - //idcRight = -1; - }; - - class selectTriageStatus: ACE_gui_buttonBase { - idc = 2001; - x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "16.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "12.33 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.0)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.0)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard);); - }; - class selectTriageStatusNone: selectTriageStatus { - idc = 2002; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_None); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),0)] call FUNC(setTriageStatus);); - }; - - class selectTriageStatusMinor: selectTriageStatus { - idc = 2003; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Minor); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0.5,0,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),1)] call FUNC(setTriageStatus);); - }; - class selectTriageStatusDelayed: selectTriageStatus { - idc = 2004; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Delayed); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0.77,0.51,0.08,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),2)] call FUNC(setTriageStatus);); - }; - class selectTriageStatusImmediate: selectTriageStatus { - idc = 2005; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Immediate); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureOver = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(1,0.2,0.2,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),3)] call FUNC(setTriageStatus);); - }; - class selectTriageStatusDeceased: selectTriageStatus { - idc = 2006; - x = 0; - y = 0; - w = 0; - h = 0; - text = ECSTRING(Medical,Triage_Status_Deceased); - style = ST_CENTER; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureOver = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureFocused = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTexturePressed = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDefault = "#(argb,8,8,3)color(0,0,0,0.9)"; - action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),4)] call FUNC(setTriageStatus);); - }; - }; -}; diff --git a/addons/medical_statemachine/$PBOPREFIX$ b/addons/medical_statemachine/$PBOPREFIX$ new file mode 100644 index 0000000000..08235272dc --- /dev/null +++ b/addons/medical_statemachine/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_statemachine diff --git a/addons/medical_statemachine/ACE_Settings.hpp b/addons/medical_statemachine/ACE_Settings.hpp new file mode 100644 index 0000000000..8b47bd106d --- /dev/null +++ b/addons/medical_statemachine/ACE_Settings.hpp @@ -0,0 +1,14 @@ +class ACE_Settings { + class GVAR(fatalInjuryCondition) { + movedToSQF = 1; + }; + class GVAR(fatalInjuryConditionAI) { + movedToSQF = 1; + }; + class GVAR(unconsciousConditionAI) { + movedToSQF = 1; + }; + class GVAR(cardiacArrestTime) { + movedToSQF = 1; + }; +}; diff --git a/addons/medical_statemachine/CfgEventHandlers.hpp b/addons/medical_statemachine/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f0de7ed461 --- /dev/null +++ b/addons/medical_statemachine/CfgEventHandlers.hpp @@ -0,0 +1,25 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; + +class Extended_Respawn_EventHandlers { + class CAManBase { + class ADDON { + respawn = QUOTE(call FUNC(resetStateDefault)); + }; + }; +}; diff --git a/addons/medical_statemachine/Statemachine.hpp b/addons/medical_statemachine/Statemachine.hpp new file mode 100644 index 0000000000..12a5a01779 --- /dev/null +++ b/addons/medical_statemachine/Statemachine.hpp @@ -0,0 +1,117 @@ +// Manual transitions applied to this statemachine +// - fnc_resetStateDefault on unit respawn +class ACE_Medical_StateMachine { + list = QUOTE(call EFUNC(common,getLocalUnits)); + skipNull = 1; + + class Default { + onState = QFUNC(handleStateDefault); + class Injury { + targetState = "Injured"; + events[] = {QEGVAR(medical,injured), QEGVAR(medical,LoweredVitals)}; + }; + class CriticalInjuryOrVitals { + targetState = "Unconscious"; + events[] = {QEGVAR(medical,CriticalInjury), QEGVAR(medical,CriticalVitals), QEGVAR(medical,knockOut)}; + }; + class FatalVitals { + targetState = "CardiacArrest"; + events[] = {QEGVAR(medical,FatalVitals), QEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QEGVAR(medical,FatalInjury)}; + }; + }; + class Injured { + onState = QFUNC(handleStateInjured); + class FullHeal { + targetState = "Default"; + events[] = {QEGVAR(medical,FullHeal)}; + }; + class CriticalInjuryOrVitals { + targetState = "Unconscious"; + events[] = {QEGVAR(medical,CriticalInjury), QEGVAR(medical,CriticalVitals), QEGVAR(medical,knockOut)}; + }; + class FatalVitals { + targetState = "CardiacArrest"; + events[] = {QEGVAR(medical,FatalVitals), QEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QEGVAR(medical,FatalInjury)}; + }; + }; + class Unconscious { + onState = QFUNC(handleStateUnconscious); + onStateEntered = QUOTE([ARR_2(_this,(true))] call EFUNC(medical_status,setUnconscious)); + class DeathAI { + targetState = "Dead"; + condition = QUOTE(!isPlayer _this && {GVAR(unconsciousConditionAI)}); + }; + class WakeUp { + targetState = "Injured"; + condition = QEFUNC(medical_status,hasStableVitals); + events[] = {QEGVAR(medical,WakeUp)}; + onTransition = QUOTE([ARR_2(_this,(false))] call EFUNC(medical_status,setUnconscious)); + }; + class FatalTransitions { + targetState = "CardiacArrest"; + events[] = {QEGVAR(medical,FatalVitals), QEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QEGVAR(medical,FatalInjury)}; + }; + }; + class FatalInjury { + // Transition state for handling instant death + // This state raises the next transition in the same frame + onStateEntered = QFUNC(enteredStateFatalInjury); + class DeathAI { + events[] = {QEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "Dead"; + condition = QUOTE(!isPlayer _this && {GVAR(fatalInjuryConditionAI)}); + }; + class SecondChance { + events[] = {QEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "CardiacArrest"; + condition = QUOTE(GVAR(fatalInjuryCondition) > 0); + onTransition = QFUNC(transitionSecondChance); + }; + class Death { + events[] = {QEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "Dead"; + condition = "true"; + }; + }; + class CardiacArrest { + onStateEntered = QFUNC(enteredStateCardiacArrest); + onStateLeaving = QFUNC(leftStateCardiacArrest); + class DeathAI { + targetState = "Dead"; + condition = QUOTE(!isPlayer _this && {GVAR(fatalInjuryConditionAI)}); + }; + class Timeout { + targetState = "Dead"; + condition = QFUNC(conditionCardiacArrestTimer); + }; + class Reanimation { + targetState = "Unconscious"; + events[] = {QEGVAR(medical,CPRSucceeded)}; + }; + class Execution { + targetState = "Dead"; + condition = QFUNC(conditionExecutionDeath); + events[] = {QEGVAR(medical,FatalInjury)}; + }; + class Bleedout { + targetState = "Dead"; + events[] = {QEGVAR(medical,Bleedout)}; + }; + }; + class Dead { + // When the unit is killed it's no longer handled by the statemachine + onStateEntered = QFUNC(enteredStateDeath); + }; +}; diff --git a/addons/medical_statemachine/XEH_PREP.hpp b/addons/medical_statemachine/XEH_PREP.hpp new file mode 100644 index 0000000000..e2e27963b1 --- /dev/null +++ b/addons/medical_statemachine/XEH_PREP.hpp @@ -0,0 +1,11 @@ +PREP(conditionCardiacArrestTimer); +PREP(conditionExecutionDeath); +PREP(enteredStateCardiacArrest); +PREP(enteredStateDeath); +PREP(enteredStateFatalInjury); +PREP(handleStateDefault); +PREP(handleStateInjured); +PREP(handleStateUnconscious); +PREP(leftStateCardiacArrest); +PREP(resetStateDefault); +PREP(transitionSecondChance); diff --git a/addons/medical_statemachine/XEH_postInit.sqf b/addons/medical_statemachine/XEH_postInit.sqf new file mode 100644 index 0000000000..421c54b49f --- /dev/null +++ b/addons/medical_statemachine/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/addons/medical_statemachine/XEH_preInit.sqf b/addons/medical_statemachine/XEH_preInit.sqf new file mode 100644 index 0000000000..2d8754ad32 --- /dev/null +++ b/addons/medical_statemachine/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +#include "initSettings.sqf" + +EGVAR(medical,STATE_MACHINE) = (configFile >> "ACE_Medical_StateMachine") call CBA_statemachine_fnc_createFromConfig; + +ADDON = true; diff --git a/addons/medical_statemachine/XEH_preStart.sqf b/addons/medical_statemachine/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_statemachine/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_statemachine/config.cpp b/addons/medical_statemachine/config.cpp new file mode 100644 index 0000000000..a87d797163 --- /dev/null +++ b/addons/medical_statemachine/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_vitals"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_Settings.hpp" +#include "Statemachine.hpp" +#include "CfgEventHandlers.hpp" diff --git a/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf b/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf new file mode 100644 index 0000000000..df29c592a1 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_conditionCardiacArrestTimer.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Checks if the cardiac arrest timer ran out. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_conditionCardiacArrestTimer + * + * Public: No + */ + +params ["_unit"]; + +private _startTime = _unit getVariable [QGVAR(cardiacArrestStart), CBA_missionTime]; +private _lifeTime = _unit getVariable [QGVAR(cardiacArrestTime), GVAR(cardiacArrestTime)]; + +(CBA_missionTime - _startTime) > _lifeTime diff --git a/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf b/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf new file mode 100644 index 0000000000..a409069fba --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_conditionExecutionDeath.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Condition for an execution caused death. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_conditionExecutionDeath + * + * Public: No + */ + +params ["_unit"]; + +(GVAR(fatalInjuryCondition) < 2) && {!(_unit getVariable [QEGVAR(medical,deathBlocked), false])} diff --git a/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf new file mode 100644 index 0000000000..f418e38b84 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles a unit entering cardiac arrest (calls for a status update). + * Sets required variables for countdown timer until death. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateCardiacArrest + * + * Public: No + */ + +params ["_unit"]; + +// 10% possible variance in cardiac arrest time +private _time = GVAR(cardiacArrestTime); +_time = _time + random [_time*-0.1, 0, _time*0.1]; + +_unit setVariable [QGVAR(cardiacArrestTime), _time]; +_unit setVariable [QGVAR(cardiacArrestStart), CBA_missionTime]; + +// Update the unit status to reflect cardiac arrest +[_unit, true] call EFUNC(medical_status,setCardiacArrest); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf new file mode 100644 index 0000000000..d99d13faca --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Handles a unit reaching the point of death (calls for a status update). + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateDeath + * + * Public: No + */ + +params ["_unit"]; + +// TODO: Probably also needs additional logic to deal with edge cases + +// Send a local event before death +[QEGVAR(medical,death), [_unit]] call CBA_fnc_localEvent; + +[_unit] call EFUNC(medical_status,setDead); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf new file mode 100644 index 0000000000..04121b1c95 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Raises the transition to the next state instantly when fatally injured. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateFatalInjury + * + * Public: No + */ + +params ["_unit"]; + +[QEGVAR(medical,FatalInjuryInstantTransition), _unit] call CBA_fnc_localEvent; diff --git a/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf new file mode 100644 index 0000000000..34187fca28 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the default state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateDefault + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit) exitWith {}; + +// If locality changed, broadcast the last medical state and finish the local loop +if (!local _unit) exitWith { + _unit setVariable [VAR_HEART_RATE, GET_HEART_RATE(_unit), true]; + _unit setVariable [VAR_BLOOD_PRESS, _unit getVariable [VAR_BLOOD_PRESS, [80, 120]], true]; + _unit setVariable [VAR_BLOOD_VOL, GET_BLOOD_VOLUME(_unit), true]; +}; + +[_unit] call EFUNC(medical_vitals,handleUnitVitals); + +private _painLevel = GET_PAIN_PERCEIVED(_unit); +if (_painLevel > 0) then { + [QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent; +}; diff --git a/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf new file mode 100644 index 0000000000..a75397c876 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the injured state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateInjured + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit) exitWith {}; + +// If locality changed, broadcast the last medical state and finish the local loop +if (!local _unit) exitWith { + _unit setVariable [VAR_HEART_RATE, GET_HEART_RATE(_unit), true]; + _unit setVariable [VAR_BLOOD_PRESS, _unit getVariable [VAR_BLOOD_PRESS, [80, 120]], true]; + _unit setVariable [VAR_BLOOD_VOL, GET_BLOOD_VOLUME(_unit), true]; +}; + +[_unit] call EFUNC(medical_vitals,handleUnitVitals); + +private _painLevel = GET_PAIN_PERCEIVED(_unit); +if (_painLevel > 0) then { + [QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent; +}; diff --git a/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf b/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf new file mode 100644 index 0000000000..fdb730c0bf --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_handleStateUnconscious.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Handles the unconscious state + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_handleStateUnconscious + * + * Public: No + */ + +params ["_unit"]; + +// If the unit died the loop is finished +if (!alive _unit) exitWith {}; + +// If locality changed, broadcast the last medical state and finish the local loop +if (!local _unit) exitWith { + _unit setVariable [VAR_HEART_RATE, GET_HEART_RATE(_unit), true]; + _unit setVariable [VAR_BLOOD_PRESS, _unit getVariable [VAR_BLOOD_PRESS, [80, 120]], true]; + _unit setVariable [VAR_BLOOD_VOL, GET_BLOOD_VOLUME(_unit), true]; +}; + +[_unit] call EFUNC(medical_vitals,handleUnitVitals); + +private _painLevel = GET_PAIN_PERCEIVED(_unit); +if (_painLevel > 0) then { + [QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent; +}; + +// Handle spontaneous wakeup from unconsciousness +if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { + if (_unit call EFUNC(medical_status,hasStableVitals)) then { + private _lastWakeUpCheck = _unit getVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; + if (CBA_missionTime - _lastWakeUpCheck > SPONTANEOUS_WAKE_UP_INTERVAL) then { + TRACE_2("Checking for wake up",_unit,EGVAR(medical,spontaneousWakeUpChance)); + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; + if ((random 1) < EGVAR(medical,spontaneousWakeUpChance)) then { + TRACE_1("Spontaneous wake up!",_unit); + [QEGVAR(medical,WakeUp), _unit] call CBA_fnc_localEvent; + }; + }; + } else { + // Unstable vitals, procrastinate the next wakeup check + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; + }; +}; diff --git a/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf new file mode 100644 index 0000000000..85c469c4a5 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_leftStateCardiacArrest.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: RedBery + * Handles a unit leaving cardiac arrest (calls for a status update). + * Clears countdown timer variables. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_leftStateCardiacArrest + * + * Public: No + */ + +params ["_unit"]; + +_unit setVariable [QGVAR(cardiacArrestTime), nil]; +_unit setVariable [QEGVAR(medical,cardiacArrestStart), nil]; + +// Temporary fix for vitals loop on cardiac arrest exit +_unit setVariable [QGVAR(lastTimeUpdated), CBA_missionTime]; + +[_unit, false] call EFUNC(medical_status,setCardiacArrest); diff --git a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf new file mode 100644 index 0000000000..4cffd47076 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Resets the default state on a unit after respawning. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_resetStateDefault + * + * Public: No + */ + +params ["_unit"]; + +// Statemachine only handles local units +if !(local _unit) exitWith {}; + +[_unit, EGVAR(medical,STATE_MACHINE), "Dead", "Default"] call CBA_statemachine_fnc_manualTransition; diff --git a/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf b/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf new file mode 100644 index 0000000000..bdee0f9432 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_transitionSecondChance.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Gives the unit a second chance and prevents death for 1 second. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_transitionSecondChance + * + * Public: No + */ + +params ["_unit"]; + +_unit setVariable [QEGVAR(medical,deathBlocked), true]; +[{ + _this setVariable [QEGVAR(medical,deathBlocked), false]; +}, _unit, 1] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_statemachine/functions/script_component.hpp b/addons/medical_statemachine/functions/script_component.hpp new file mode 100644 index 0000000000..5dd15bb8b4 --- /dev/null +++ b/addons/medical_statemachine/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_statemachine\script_component.hpp" diff --git a/addons/medical_statemachine/initSettings.sqf b/addons/medical_statemachine/initSettings.sqf new file mode 100644 index 0000000000..268902a0f1 --- /dev/null +++ b/addons/medical_statemachine/initSettings.sqf @@ -0,0 +1,43 @@ +// CBA Settings [ADDON: ace_medical_statemachine]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; + +[ + QGVAR(fatalInjuryCondition), "LIST", + [LSTRING(fatalInjuryCondition_DisplayName), LSTRING(fatalInjuryCondition_Description)], + _categoryArray, + [[0,1,2],["Always","In Cardiac Arrest","Never"],0], // [values, titles, defaultIndex] //ToDo: Localize + true, // isGlobal + {[QGVAR(fatalInjuryCondition), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(fatalInjuryConditionAI), "CHECKBOX", + [LSTRING(fatalInjuryConditionAI_DisplayName), LSTRING(fatalInjuryConditionAI_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(fatalInjuryConditionAI), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(unconsciousConditionAI), "CHECKBOX", + [LSTRING(unconsciousConditionAI_DisplayName), LSTRING(unconsciousConditionAI_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(unconsciousConditionAI), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(cardiacArrestTime), "SLIDER", + [LSTRING(cardiacArrestTime_DisplayName), LSTRING(cardiacArrestTime_Description)], + _categoryArray, + [1,3600,30,0], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(cardiacArrestTime), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical_statemachine/script_component.hpp b/addons/medical_statemachine/script_component.hpp new file mode 100644 index 0000000000..1553911601 --- /dev/null +++ b/addons/medical_statemachine/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_statemachine +#define COMPONENT_BEAUTIFIED Medical State Machine +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_STATEMACHINE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_STATEMACHINE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_STATEMACHINE +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml new file mode 100644 index 0000000000..96f9ac93ad --- /dev/null +++ b/addons/medical_statemachine/stringtable.xml @@ -0,0 +1,69 @@ + + + + + + States + + + Fatal Injury Player + + + Defines when Player can receive a fatal injury + + + Instant death AI + + + Defines if AI will be able to die instantly + + + Forbid unconscious AI + + + Defines if AI will be denied to go unconscious and will die instead + + + In Cardiac Arrest + + + Cardiac Arrest time (seconds) + + + Defines how long it takes to die from cardiac arrest? + + + AI Unconsciousness + Потеря сознания ботами + Nieprzytomność AI + Inconsciencia IA + KI-Bewusstlosigkeit + Bezvědomí AI + Inconsciência da IA + Inconscience des IA + AI eszméletlenség + Incoscienza IA + AI の気絶 + 인공지능 기절 + AI无意识 + AI無意識 + + + Allow AI to go unconscious + Позволить ботам терять сознание + Czy AI może być nieprzytomne od odniesionych obrażeń? + Permita a la IA caer inconsciente + KI kann bewusstlos werden + Umožňuje AI upadnout do bezvědomí + Permite IA ficar inconsciente + Autoriser les IA à tomber inconscients + Engedélyezi az AI eszméletének elvesztését + Permetti alle IA di diventare incoscienti + AI が気絶をするように + 인공지능도 기절에 빠지게 합니다 + 允许AI进入无意识状态 + 允許AI進入無意識狀態 + + + + diff --git a/addons/medical_status/$PBOPREFIX$ b/addons/medical_status/$PBOPREFIX$ new file mode 100644 index 0000000000..c21e7332eb --- /dev/null +++ b/addons/medical_status/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_status diff --git a/addons/medical_status/ACE_settings.hpp b/addons/medical_status/ACE_settings.hpp new file mode 100644 index 0000000000..11783ac42f --- /dev/null +++ b/addons/medical_status/ACE_settings.hpp @@ -0,0 +1,11 @@ +class ACE_Settings { + class EGVAR(medical,bleedingCoefficient) { + movedToSQF = 1; + }; + class EGVAR(medical,painCoefficient) { + movedToSQF = 1; + }; + class GVAR(ivFlowRate) { + movedToSQF = 1; + }; +}; diff --git a/addons/medical_status/CfgEventHandlers.hpp b/addons/medical_status/CfgEventHandlers.hpp new file mode 100644 index 0000000000..93107ab7d3 --- /dev/null +++ b/addons/medical_status/CfgEventHandlers.hpp @@ -0,0 +1,26 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; + +class Extended_Init_EventHandlers { + class CAManBase { + class ADDON { + onRespawn = 1; + init = QUOTE(call FUNC(initUnit)); + }; + }; +}; diff --git a/addons/medical_status/XEH_PREP.hpp b/addons/medical_status/XEH_PREP.hpp new file mode 100644 index 0000000000..3b74368c2a --- /dev/null +++ b/addons/medical_status/XEH_PREP.hpp @@ -0,0 +1,14 @@ +PREP(addHeartRateAdjustment); +PREP(adjustPainLevel); +PREP(getBloodLoss); +PREP(getBloodPressure); +PREP(getBloodVolumeChange); +PREP(getCardiacOutput); +PREP(hasStableVitals); +PREP(initUnit); +PREP(isBeingCarried); +PREP(isBeingDragged); +PREP(isInStableCondition); +PREP(setCardiacArrest); +PREP(setDead); +PREP(setUnconscious); diff --git a/addons/medical_status/XEH_postInit.sqf b/addons/medical_status/XEH_postInit.sqf new file mode 100644 index 0000000000..9b7d186b46 --- /dev/null +++ b/addons/medical_status/XEH_postInit.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" + +// Handle pain changes on injury +[QEGVAR(medical,injured), LINKFUNC(adjustPainLevel)] call CBA_fnc_addEventHandler; diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf new file mode 100644 index 0000000000..9361d05015 --- /dev/null +++ b/addons/medical_status/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/medical_status/XEH_preStart.sqf b/addons/medical_status/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_status/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_status/config.cpp b/addons/medical_status/config.cpp new file mode 100644 index 0000000000..69c1b2fd27 --- /dev/null +++ b/addons/medical_status/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_engine"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_settings.hpp" +#include "CfgEventHandlers.hpp" diff --git a/addons/medical_status/functions/fnc_addHeartRateAdjustment.sqf b/addons/medical_status/functions/fnc_addHeartRateAdjustment.sqf new file mode 100644 index 0000000000..39b65a4ead --- /dev/null +++ b/addons/medical_status/functions/fnc_addHeartRateAdjustment.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Adds a heart rate adjustment that will take effect over time. + * + * Arguments: + * 0: The Unit + * 1: Heart rate change + * 2: Time in system for the adjustment to reach its peak + * 3: Duration the adjustment will have an effect + * + * Return Value: + * None + */ + +params ["_unit", "_change", "_timeToMaxEffect", "_maxTimeInSystem"]; + +private _adjustments = _unit getVariable [VAR_HEART_RATE_ADJ,[]]; +// The last number indicates the time the adjustment is already in the system +_adjustments pushBack [_change, _timeToMaxEffect, _maxTimeInSystem, 0]; +_unit setVariable [VAR_HEART_RATE_ADJ, _adjustments]; diff --git a/addons/medical_status/functions/fnc_adjustPainLevel.sqf b/addons/medical_status/functions/fnc_adjustPainLevel.sqf new file mode 100644 index 0000000000..a8fe5eebd6 --- /dev/null +++ b/addons/medical_status/functions/fnc_adjustPainLevel.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Interface to allow external modules to affect the pain level + * + * Arguments: + * 0: The patient + * 1: Desired pain level (0 .. 1) + * + * Return Value: + * None + * + * Example: + * [guy, 0.5] call ace_medical_status_fnc_adjustPainLevel + * + * Public: No + */ + +params ["_unit", "_desiredPainLevel"]; + +if (!local _unit) exitWith { ERROR("unit is not local"); }; + +TRACE_2("adjustPainLevel",_unit,_desiredPainLevel); + +_desiredPainLevel = _desiredPainLevel * EGVAR(medical,painCoefficient); + +private _pain = GET_PAIN(_unit); +_pain = 0 max (_pain max _desiredPainLevel) min 1; + +_unit setVariable [VAR_PAIN, _pain]; diff --git a/addons/medical_status/functions/fnc_getBloodLoss.sqf b/addons/medical_status/functions/fnc_getBloodLoss.sqf new file mode 100644 index 0000000000..0471cb0dfb --- /dev/null +++ b/addons/medical_status/functions/fnc_getBloodLoss.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Calculate the total blood loss of a unit. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Total blood loss of unit + * + * Example: + * [bob] call ace_medical_status_fnc_getBloodLoss + * + * Public: No + */ + +params ["_unit"]; + +private _tourniquets = GET_TOURNIQUETS(_unit); +private _bodyPartBleeding = [0,0,0,0,0,0]; +{ + _x params ["", "", "_bodyPart", "_amountOf", "_bleeeding"]; + if (_tourniquets select _bodyPart == 0) then { + _bodyPartBleeding set [_bodyPart, (_bodyPartBleeding select _bodyPart) + (_amountOf * _bleeeding)]; + }; +} forEach (_unit getVariable [QEGVAR(medical,openWounds), []]); + +if (_bodyPartBleeding isEqualTo [0,0,0,0,0,0]) exitWith { 0 }; + +_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; + +// limb bleeding is scaled down based on the amount of body bleeding +_limbBleedingRate = _limbBleedingRate * (1 - _bodyBleedingRate); + +private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); + +((_bodyBleedingRate + _limbBleedingRate) * _cardiacOutput * EGVAR(medical,bleedingCoefficient)) diff --git a/addons/medical/functions/fnc_getBloodPressure.sqf b/addons/medical_status/functions/fnc_getBloodPressure.sqf similarity index 52% rename from addons/medical/functions/fnc_getBloodPressure.sqf rename to addons/medical_status/functions/fnc_getBloodPressure.sqf index 7a582df5e1..244a421201 100644 --- a/addons/medical/functions/fnc_getBloodPressure.sqf +++ b/addons/medical_status/functions/fnc_getBloodPressure.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Glowbal - * Calculates the blood volume change and decreases the IVs given to the unit. + * Calculate the blood pressure of a unit. * * Arguments: * 0: The Unit @@ -11,23 +11,21 @@ * 1: BloodPressure High * * Example: - * [bob, kevin] call ACE_medical_fnc_getBloodPressure + * [player] call ace_medical_status_fnc_getBloodPressure * * Public: No */ // Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120. -#define MODIFIER_BP_HIGH 0.229 +#define MODIFIER_BP_HIGH 13.7142792 // Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80. -#define MODIFIER_BP_LOW 0.1524 +#define MODIFIER_BP_LOW 9.1428528 params ["_unit"]; private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); -private _resistance = _unit getVariable [QGVAR(peripheralResistance), 100]; +private _resistance = _unit getVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES]; +private _bloodPressure = _cardiacOutput * _resistance; -private _bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance; -private _bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance; - -[_bloodPressureLow max 0, _bloodPressureHigh max 0] +[round(_bloodPressure * MODIFIER_BP_LOW), round(_bloodPressure * MODIFIER_BP_HIGH)] diff --git a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf new file mode 100644 index 0000000000..bce1847e19 --- /dev/null +++ b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf @@ -0,0 +1,54 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Calculates the blood volume change and decreases the IVs given to the unit. + * + * Arguments: + * 0: The Unit + * 1: Time since last update + * 2: Global Sync Values (bloodbags) + * + * Return Value: + * Blood volume change (liters per second) + * + * Example: + * [player, 1, true] call ace_medical_status_fnc_getBloodVolumeChange + * + * Public: No + */ + +params ["_unit", "_deltaT", "_syncValues"]; + +private _bloodVolume = GET_BLOOD_VOLUME(_unit); +private _bloodVolumeChange = -_deltaT * GET_BLOOD_LOSS(_unit); + +if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then { + private _bloodBags = _unit getVariable [QEGVAR(medical,ivBags), []]; + private _tourniquets = GET_TOURNIQUETS(_unit); + + _bloodBags = _bloodBags apply { + _x params ["_bagVolumeRemaining", "_type", "_bodyPart"]; + + if (_tourniquets select _bodyPart == 0) then { + private _bagChange = (_deltaT * GVAR(ivFlowRate) * IV_CHANGE_PER_SECOND) min _bagVolumeRemaining; // absolute value of the change in miliLiters + _bagVolumeRemaining = _bagVolumeRemaining - _bagChange; + _bloodVolumeChange = _bloodVolumeChange + (_bagChange / 1000); + }; + + if (_bagVolumeRemaining < 0.01) then { + [] + } else { + [_bagVolumeRemaining, _type, _bodyPart] + }; + }; + + _bloodBags = _bloodBags - [[]]; // remove empty bags + + if (_bloodBags isEqualTo []) then { + _unit setVariable [QEGVAR(medical,ivBags), nil, true]; // no bags left - clear variable (always globaly sync this) + } else { + _unit setVariable [QEGVAR(medical,ivBags), _bloodBags, _syncValues]; + }; +}; + +_bloodVolumeChange diff --git a/addons/medical/functions/fnc_getCardiacOutput.sqf b/addons/medical_status/functions/fnc_getCardiacOutput.sqf similarity index 60% rename from addons/medical/functions/fnc_getCardiacOutput.sqf rename to addons/medical_status/functions/fnc_getCardiacOutput.sqf index 9fcaad8731..c082292e1e 100644 --- a/addons/medical/functions/fnc_getCardiacOutput.sqf +++ b/addons/medical_status/functions/fnc_getCardiacOutput.sqf @@ -7,17 +7,16 @@ * 0: The Unit * * Return Value: - * Current cardiac output + * Current cardiac output (liter per second) * * Example: - * [bob] call ACE_medical_fnc_getCardiacOutput + * [player] call ace_medical_status_fnc_getCardiacOutput * * Public: No */ /* - Cardiac output (Q or or CO ) is the volume of blood being pumped by the heart, in particular by a left or right ventricle in the CBA_missionTime interval of one minute. CO may be measured in many ways, for example dm3/min (1 dm3 equals 1 litre). - + Cardiac output (Q or or CO ) is the volume of blood being pumped by the heart, in particular by a left or right ventricle in the CBA_missionTime interval of one second. CO may be measured in many ways, for example dm3/min (1 dm3 equals 1 litre). Source: http://en.wikipedia.org/wiki/Cardiac_output */ @@ -26,4 +25,8 @@ params ["_unit"]; -((_unit getVariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getVariable [QGVAR(heartRate), 80])/80-1); +private _bloodVolume = (GET_BLOOD_VOLUME(_unit) / DEFAULT_BLOOD_VOLUME) * 100; +private _heartRate = GET_HEART_RATE(_unit); +private _cardiacOutput = ((_bloodVolume / MODIFIER_CARDIAC_OUTPUT) + ((_heartRate / DEFAULT_HEART_RATE) - 1)) / 60; + +(0 max _cardiacOutput) diff --git a/addons/medical_status/functions/fnc_hasStableVitals.sqf b/addons/medical_status/functions/fnc_hasStableVitals.sqf new file mode 100644 index 0000000000..90e2caac93 --- /dev/null +++ b/addons/medical_status/functions/fnc_hasStableVitals.sqf @@ -0,0 +1,34 @@ +#include "script_component.hpp" +/* + * Author: Ruthberg + * Check if a unit has stable vitals (required to become conscious) + * + * Arguments: + * 0: The patient + * + * Return Value: + * Has stable vitals + * + * Example: + * [player] call ace_medical_status_fnc_hasStableVitals + * + * Public: No + */ + +params ["_unit"]; + +if (GET_BLOOD_VOLUME(_unit) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE) exitWith { false }; +if IN_CRDC_ARRST(_unit) exitWith { false }; + +private _cardiacOutput = [_unit] call FUNC(getCardiacOutput); +private _bloodLoss = GET_BLOOD_LOSS(_unit); +if (_bloodLoss > (BLOOD_LOSS_KNOCK_OUT_THRESHOLD * _cardiacOutput) / 2) exitWith { false }; + +private _bloodPressure = GET_BLOOD_PRESSURE(_unit); +_bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; +if (_bloodPressureL < 50 || {_bloodPressureH < 60}) exitWith { false }; + +private _heartRate = GET_HEART_RATE(_unit); +if (_heartRate < 40) exitWith { false }; + +true diff --git a/addons/medical_status/functions/fnc_initUnit.sqf b/addons/medical_status/functions/fnc_initUnit.sqf new file mode 100644 index 0000000000..0393adf1a3 --- /dev/null +++ b/addons/medical_status/functions/fnc_initUnit.sqf @@ -0,0 +1,85 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, commy2 + * Initializes unit variables. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [bob] call ace_medical_status_fnc_init + * + * Public: No + */ + +params ["_unit"]; + +if (!local _unit) exitWith {}; + +if (damage _unit > 0) then { + _unit setDamage 0; +}; + +// - Blood and heart ---------------------------------------------------------- +_unit setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; +_unit setVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE, true]; +_unit setVariable [VAR_HEART_RATE_ADJ, [], true]; +_unit setVariable [VAR_BLOOD_PRESS, [80, 120], true]; +_unit setVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES, true]; +_unit setVariable [VAR_PERIPH_RES_ADJ, [], true]; +_unit setVariable [VAR_CRDC_ARRST, false, true]; +_unit setVariable [VAR_HEMORRHAGE, 0, true]; +_unit setVariable [VAR_IS_BLEEDING, false, true]; + +// - Pain --------------------------------------------------------------------- +_unit setVariable [VAR_PAIN, 0, true]; +_unit setVariable [VAR_IN_PAIN, false, true]; +_unit setVariable [VAR_PAIN_SUPP, 0, true]; +_unit setVariable [VAR_PAIN_SUPP_ADJ, [], true]; + +// - Wounds ------------------------------------------------------------------- +_unit setVariable [QEGVAR(medical,openWounds), [], true]; +_unit setVariable [QEGVAR(medical,bandagedWounds), [], true]; +_unit setVariable [QEGVAR(medical,stitchedWounds), [], true]; +_unit setVariable [QEGVAR(medical,isLimping), false, true]; + +// - Misc --------------------------------------------------------------------- +_unit setVariable [VAR_UNCON, false, true]; + +// - Treatments --------------------------------------------------------------- +_unit setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true]; +_unit setVariable [QEGVAR(medical,occludedMedications), nil, true]; //Delayed Medications (from tourniquets) +_unit setVariable [QEGVAR(medical,ivBags), nil, true]; + +// triage card and logs +_unit setVariable [QEGVAR(medical,triageLevel), 0, true]; +_unit setVariable [QEGVAR(medical,triageCard), [], true]; + +// damage storage +_unit setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true]; +#ifdef DEBUG_TESTRESULTS +_unit setVariable [QEGVAR(medical,bodyPartStatus), [0,0,0,0,0,0], true]; +#endif + +// medication +private _allUsedMedication = _unit getVariable [QEGVAR(medical,allUsedMedication), []]; +{ + _unit setVariable [_x select 0, nil]; +} forEach _allUsedMedication; +_unit setVariable [QEGVAR(medical,allUsedMedication), [], true]; + +// TODO move to treatment +private _logs = _unit getVariable [QEGVAR(medical,allLogs), []]; +{ + _unit setVariable [_x, nil]; +} forEach _logs; +_unit setVariable [QEGVAR(medical,allLogs), [], true]; + +[{ + params ["_unit"]; + TRACE_2("Unit Init",_unit,local _unit); + [QGVAR(initialized), [_unit]] call CBA_fnc_localEvent; +}, [_unit], 0.5] call CBA_fnc_waitAndExecute; diff --git a/addons/medical/functions/fnc_isBeingCarried.sqf b/addons/medical_status/functions/fnc_isBeingCarried.sqf similarity index 68% rename from addons/medical/functions/fnc_isBeingCarried.sqf rename to addons/medical_status/functions/fnc_isBeingCarried.sqf index 79a0f4ce9d..7e58efc1ed 100644 --- a/addons/medical/functions/fnc_isBeingCarried.sqf +++ b/addons/medical_status/functions/fnc_isBeingCarried.sqf @@ -10,7 +10,7 @@ * Is being carried * * Example: - * [bob] call ace_medical_fnc_isBeingCarried + * [bob] call ace_medical_status_fnc_isBeingCarried * * Public: No */ @@ -19,6 +19,5 @@ params ["_target"]; private _owner = _target getVariable [QEGVAR(common,owner), objNull]; -if (isNull _owner) exitWith {false}; - -(_owner getVariable [QEGVAR(dragging,carriedObject), objNull]) == _target +!(isNull _owner) + && {(_owner getVariable [QEGVAR(dragging,carriedObject), objNull]) == _target} diff --git a/addons/medical/functions/fnc_isBeingDragged.sqf b/addons/medical_status/functions/fnc_isBeingDragged.sqf similarity index 68% rename from addons/medical/functions/fnc_isBeingDragged.sqf rename to addons/medical_status/functions/fnc_isBeingDragged.sqf index e10ba60b8f..e8c21bdb56 100644 --- a/addons/medical/functions/fnc_isBeingDragged.sqf +++ b/addons/medical_status/functions/fnc_isBeingDragged.sqf @@ -10,7 +10,7 @@ * Is being dragged * * Example: - * [bob] call ace_medical_fnc_isBeingDragged + * [bob] call ace_medical_status_fnc_isBeingDragged * * Public: No */ @@ -19,6 +19,5 @@ params ["_target"]; private _owner = _target getVariable [QEGVAR(common,owner), objNull]; -if (isNull _owner) exitWith {false}; - -(_owner getVariable [QEGVAR(dragging,draggedObject), objNull]) == _target +!(isNull _owner) + && {(_owner getVariable [QEGVAR(dragging,draggedObject), objNull]) == _target} diff --git a/addons/medical_status/functions/fnc_isInStableCondition.sqf b/addons/medical_status/functions/fnc_isInStableCondition.sqf new file mode 100644 index 0000000000..ae67ce286e --- /dev/null +++ b/addons/medical_status/functions/fnc_isInStableCondition.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Check if a unit is in a stable condition + * + * Arguments: + * 0: The patient + * + * Return Value: + * Is in stable condition + * + * Example: + * [player] call ace_medical_status_fnc_isInStableCondition + * + * Public: No + */ + +params ["_unit"]; + +(alive _unit + && {!IS_UNCONSCIOUS(_unit)} + && {GET_BLOOD_LOSS(_unit) == 0} + && {_unit call FUNC(hasStableVitals)}) diff --git a/addons/medical_status/functions/fnc_setCardiacArrest.sqf b/addons/medical_status/functions/fnc_setCardiacArrest.sqf new file mode 100644 index 0000000000..32c858b36d --- /dev/null +++ b/addons/medical_status/functions/fnc_setCardiacArrest.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Marks a unit as in cardiac arrest and sets heart rate to 0. + * Will put the unit in an unconscious state if not already. + * + * Arguments: + * 0: The unit that will be put in cardiac arrest state + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", "_active"]; + +// No change to make +if (_active isEqualTo IN_CRDC_ARRST(_unit)) exitWith {}; + +// No heart rate in cardiac arrest, low heart rate if revived +_unit setVariable [VAR_CRDC_ARRST, _active, true]; +_unit setVariable [VAR_HEART_RATE, [40, 0] select _active, true]; + +// Cardiac arrest is an extension of unconsciousness +[_unit, _active] call FUNC(setUnconscious); + +["ace_cardiacArrest", [_unit, _active]] call CBA_fnc_localEvent; diff --git a/addons/medical_status/functions/fnc_setDead.sqf b/addons/medical_status/functions/fnc_setDead.sqf new file mode 100644 index 0000000000..12a07cd617 --- /dev/null +++ b/addons/medical_status/functions/fnc_setDead.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Kills a local unit. + * + * Arguments: + * 0: The unit + * 1: Reason for death + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", ["_reason", "unknown"]]; + +// No heart rate or blood pressure to measure when dead +_unit setVariable [VAR_HEART_RATE, 0, true]; +_unit setVariable [VAR_BLOOD_PRESS, [0, 0], true]; + +// Kill the unit without changing visual apperance +[_unit, 1] call EFUNC(medical_engine,setStructuralDamage); + +private _lastShooter = _unit getVariable [QEGVAR(medical_engine,lastShooter), objNull]; +private _lastInstigator = _unit getVariable [QEGVAR(medical_engine,lastInstigator), objNull]; + +["ace_killed", [_unit, _reason, _lastShooter, _lastInstigator]] call CBA_fnc_globalEvent; diff --git a/addons/medical_status/functions/fnc_setUnconscious.sqf b/addons/medical_status/functions/fnc_setUnconscious.sqf new file mode 100644 index 0000000000..5c3a24d759 --- /dev/null +++ b/addons/medical_status/functions/fnc_setUnconscious.sqf @@ -0,0 +1,47 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Sets a unit in the unconscious state. + * For Internal Use: Called from the state machine. + * + * Arguments: + * 0: The unit that will be put in an unconscious state + * 1: Set unconscious + * + * Return Value: + * Success + * + * Public: No + */ + +params ["_unit", "_active"]; + +// No change to make +if (_active isEqualTo IS_UNCONSCIOUS(_unit)) exitWith {}; + +_unit setVariable [VAR_UNCON, _active, true]; + +// Toggle unit ragdoll state +[_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); + +if (_active) then { + // Don't bother setting this if not used + if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; + }; + + if (_unit == ACE_player) then { + if (visibleMap) then {openMap false}; + + while {dialog} do { + closeDialog 0; + }; + }; +} else { + // Unit has woken up, no longer need to track this + _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil]; +}; + +// This event doesn't correspond to unconscious in statemachine +// It's for any time a unit changes consciousness (including cardiac arrest) +["ace_unconscious", [_unit, _active]] call CBA_fnc_globalEvent; diff --git a/addons/medical_status/functions/script_component.hpp b/addons/medical_status/functions/script_component.hpp new file mode 100644 index 0000000000..9b83bfbc4f --- /dev/null +++ b/addons/medical_status/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_status\script_component.hpp" diff --git a/addons/medical_status/initSettings.sqf b/addons/medical_status/initSettings.sqf new file mode 100644 index 0000000000..1118973f37 --- /dev/null +++ b/addons/medical_status/initSettings.sqf @@ -0,0 +1,33 @@ +// CBA Settings [ADDON: ace_medical_status]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; + +[ + QEGVAR(medical,bleedingCoefficient), "SLIDER", + [LSTRING(bleedingCoefficient_DisplayName), LSTRING(bleedingCoefficient_Description)], + _categoryArray, + [0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QEGVAR(medical,bleedingCoefficient), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,painCoefficient), "SLIDER", + [LSTRING(painCoefficient_DisplayName), LSTRING(painCoefficient_Description)], + _categoryArray, + [0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QEGVAR(medical,painCoefficient), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(ivFlowRate), "SLIDER", + [LSTRING(ivFlowRate_DisplayName), LSTRING(ivFlowRate_Description)], + _categoryArray, + [0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(ivFlowRate), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical_status/script_component.hpp b/addons/medical_status/script_component.hpp new file mode 100644 index 0000000000..2030cedb6a --- /dev/null +++ b/addons/medical_status/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_status +#define COMPONENT_BEAUTIFIED Medical Status +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_STATUS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_STATUS + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_STATUS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml new file mode 100644 index 0000000000..a92a16c7b6 --- /dev/null +++ b/addons/medical_status/stringtable.xml @@ -0,0 +1,80 @@ + + + + + + Status + + + Bleeding coefficient + Коэффициент кровопотери + Mnożnik krwawienia + Coeficiente de sangrado + Verblutungsmultiplikator + Koeficient krvácení + Coeficiente de sangramento + Coéfficient de saignement + Vérzési koefficiens + Coefficiente sanguinamento + 出血の係数 + 출혈 계수 + 流血系数 + 流血係數 + + + Coefficient to modify the bleeding speed + Коэффициент, изменяющий скорость потери крови + Mnożnik modyfikujący prędkość wykrwawiania się + Coeficiente para modificar la velocidad de sangrado + Multiplikator um die Verblutungsgeschwindigkeit zu verändern + Koeficient rychlosti krvácení + Coeficiente para modificar a velocidade do sangramento + Modifie le débit des saignements + Egy szorzó a vérzés sebességének szabályozására + Coefficiente che modifica la velocità di sanguinamento + この係数では出血速度を変更できます + 출혈의 속도를 계수만큼 변경합니다 + 修改流血速度 + 修改流血速度 + + + Pain coefficient + Коэффициент боли + Mnożnik bólu + Coeficiente de dolor + Schmerzmultiplikator + Koeficient bolesti + Coeficiente de dor + Coéfficient de douleur + Fájdalmi koefficiens + Coefficiente dolore + 痛みの係数 + 고통 계수 + 疼痛系数 + 疼痛係數 + + + Coefficient to modify the pain intensity + Коэффициент, изменяющий уровень боли + Mnożnik modyfikujący intensywność bólu + Coeficiente para modificar la intensidad del dolor + Multiplikator um die Schmerzintensität zu verändern + Koeficient intenzity bolesti + Coeficiente para modificar a instensidade de dor + Modifie l'intensité de la douleur + Egy szorzó a fájdalom erősségének szabályozására + Coefficiente che modifica l'intensità del dolore + この係数では痛みの強さを変更できます + 고통의 정도를 계수만큼 변경합니다 + 修改疼痛强度的系数 + 修改疼痛強度的係數 + + + IV Transfusion Flow Rate + + + Effects how quickly IV Bags will have effect + + + + diff --git a/addons/medical_treatment/$PBOPREFIX$ b/addons/medical_treatment/$PBOPREFIX$ new file mode 100644 index 0000000000..b6c73c4043 --- /dev/null +++ b/addons/medical_treatment/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_treatment \ No newline at end of file diff --git a/addons/medical_treatment/ACE_Medical_Treatment.hpp b/addons/medical_treatment/ACE_Medical_Treatment.hpp new file mode 100644 index 0000000000..88a2e46663 --- /dev/null +++ b/addons/medical_treatment/ACE_Medical_Treatment.hpp @@ -0,0 +1,665 @@ + +class ADDON { + class Bandaging { + // Field dressing is normal average treatment + // packing bandage is average treatment, higher reopen change, longer reopening delay + // elastic bandage is higher treatment, higher reopen change, shorter reopen delay + // quickclot is lower treatment, lower reopen change, longer reopening delay + class BasicBandage { + effectiveness = 5; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + + class FieldDressing { + // How effect is the bandage for treating one wounds type injury + effectiveness = 1; + // What is the chance and delays (in seconds) of the treated default injury reopening + reopeningChance = 0.1; + reopeningMinDelay = 120; + reopeningMaxDelay = 200; + + class Abrasion { + effectiveness = 3; + reopeningChance = 0.3; + reopeningMinDelay = 200; + reopeningMaxDelay = 1000; + }; + class AbrasionMinor: Abrasion { + effectiveness = 3; + }; + class AbrasionMedium: Abrasion { + effectiveness = 2.5; + reopeningChance = 0.7; + }; + class AbrasionLarge: Abrasion { + effectiveness = 2; + reopeningChance = 0.9; + }; + + class Avulsion: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 120; + reopeningMaxDelay = 200; + }; + class AvulsionMinor: Avulsion { + effectiveness = 1; + }; + class AvulsionMedium: Avulsion { + effectiveness = 0.9; + }; + class AvulsionLarge: Avulsion { + effectiveness = 0.75; + }; + + class Contusion: Abrasion { + effectiveness = 1; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 1; + reopeningChance = 0.2; + reopeningMinDelay = 200; + reopeningMaxDelay = 1000; + }; + class CrushMinor: Crush { + effectiveness = 1; + reopeningChance = 0.2; + }; + class CrushMedium: Crush { + effectiveness = 0.7; + reopeningChance = 0.3; + }; + class CrushLarge: Crush { + effectiveness = 0.6; + reopeningChance = 0.4; + }; + + class Cut: Abrasion { + effectiveness = 4; + reopeningChance = 0.1; + reopeningMinDelay = 300; + reopeningMaxDelay = 1000; + }; + class CutMinor: Cut { + effectiveness = 4; + reopeningChance = 0.1; + }; + class CutMedium: Cut { + effectiveness = 3; + reopeningChance = 0.3; + }; + class CutLarge: Cut { + effectiveness = 1; + reopeningChance = 0.5; + }; + + class Laceration: Abrasion { + effectiveness = 0.95; + reopeningChance = 0.3; + reopeningMinDelay = 100; + reopeningMaxDelay = 800; + }; + class LacerationMinor: Laceration { + effectiveness = 0.95; + reopeningChance = 0.3; + }; + class LacerationMedium: Laceration { + effectiveness = 0.7; + reopeningChance = 0.5; + }; + class LacerationLarge: Laceration { + effectiveness = 0.5; + reopeningChance = 0.6; + }; + + class VelocityWound: Abrasion { + effectiveness = 2; + reopeningChance = 0.7; + reopeningMinDelay = 100; + reopeningMaxDelay = 500; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 2; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 1.5; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 1; + }; + + class PunctureWound: Abrasion { + effectiveness = 2; + reopeningChance = 0.5; + reopeningMinDelay = 200; + reopeningMaxDelay = 850; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 2; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 1.3; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 0.9; + }; + }; + + class PackingBandage: fieldDressing { + class Abrasion { + effectiveness = 3; + reopeningChance = 0.6; + reopeningMinDelay = 800; + reopeningMaxDelay = 1500; + }; + class AbrasionMinor: Abrasion { + effectiveness = 3; + }; + class AbrasionMedium: Abrasion { + effectiveness = 2.5; + reopeningChance = 0.9; + }; + class AbrasionLarge: Abrasion { + effectiveness = 2; + reopeningChance = 1; + }; + + class Avulsion: Abrasion { + effectiveness = 1; + reopeningChance = 0.7; + reopeningMinDelay = 1000; + reopeningMaxDelay = 1600; + }; + class AvulsionMinor: Avulsion { + effectiveness = 1; + }; + class AvulsionMedium: Avulsion { + effectiveness = 0.9; + }; + class AvulsionLarge: Avulsion { + effectiveness = 0.75; + }; + + class Contusion: Abrasion { + effectiveness = 1; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 600; + reopeningMaxDelay = 1000; + }; + class CrushMinor: Crush { + effectiveness = 1; + reopeningChance = 0.6; + }; + class CrushMedium: Crush { + effectiveness = 0.7; + reopeningChance = 0.7; + }; + class CrushLarge: Crush { + effectiveness = 0.6; + reopeningChance = 0.8; + }; + + class Cut: Abrasion { + effectiveness = 4; + reopeningChance = 0.4; + reopeningMinDelay = 700; + reopeningMaxDelay = 1000; + }; + class CutMinor: Cut { + effectiveness = 4; + reopeningChance = 0.6; + }; + class CutMedium: Cut { + effectiveness = 3; + reopeningChance = 0.7; + }; + class CutLarge: Cut { + effectiveness = 1; + reopeningChance = 0.8; + }; + + class Laceration: Abrasion { + effectiveness = 0.95; + reopeningChance = 0.65; + reopeningMinDelay = 500; + reopeningMaxDelay = 2000; + }; + class LacerationMinor: Laceration { + effectiveness = 0.95; + reopeningChance = 0.65; + }; + class LacerationMedium: Laceration { + effectiveness = 0.7; + reopeningChance = 0.8; + }; + class LacerationLarge: Laceration { + effectiveness = 0.5; + reopeningChance = 0.9; + }; + + class VelocityWound: Abrasion { + effectiveness = 2; + reopeningChance = 1; + reopeningMinDelay = 800; + reopeningMaxDelay = 2000; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 2; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 1.5; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 1; + }; + + class PunctureWound: Abrasion { + effectiveness = 2; + reopeningChance = 1; + reopeningMinDelay = 1000; + reopeningMaxDelay = 3000; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 2; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 1.3; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 0.9; + }; + }; + + class ElasticBandage: fieldDressing { + class Abrasion { + effectiveness = 4; + reopeningChance = 0.6; + reopeningMinDelay = 80; + reopeningMaxDelay = 150; + }; + class AbrasionMinor: Abrasion { + effectiveness = 43; + }; + class AbrasionMedium: Abrasion { + effectiveness = 3; + reopeningChance = 0.9; + }; + class AbrasionLarge: Abrasion { + effectiveness = 2.5; + reopeningChance = 1; + }; + + class Avulsion: Abrasion { + effectiveness = 2; + reopeningChance = 0.7; + reopeningMinDelay = 100; + reopeningMaxDelay = 160; + }; + class AvulsionMinor: Avulsion { + effectiveness = 2; + }; + class AvulsionMedium: Avulsion { + effectiveness = 1.4; + }; + class AvulsionLarge: Avulsion { + effectiveness = 1; + }; + + class Contusion: Abrasion { + effectiveness = 2; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 2; + reopeningChance = 0.5; + reopeningMinDelay = 60; + reopeningMaxDelay = 100; + }; + class CrushMinor: Crush { + effectiveness = 2; + reopeningChance = 0.6; + }; + class CrushMedium: Crush { + effectiveness = 1.7; + reopeningChance = 0.7; + }; + class CrushLarge: Crush { + effectiveness = 1.6; + reopeningChance = 0.8; + }; + + class Cut: Abrasion { + effectiveness = 5; + reopeningChance = 0.4; + reopeningMinDelay = 70; + reopeningMaxDelay = 100; + }; + class CutMinor: Cut { + effectiveness = 5; + reopeningChance = 0.6; + }; + class CutMedium: Cut { + effectiveness = 3.5; + reopeningChance = 0.7; + }; + class CutLarge: Cut { + effectiveness = 2; + reopeningChance = 0.8; + }; + + class Laceration: Abrasion { + effectiveness = 2; + reopeningChance = 0.65; + reopeningMinDelay = 50; + reopeningMaxDelay = 200; + }; + class LacerationMinor: Laceration { + effectiveness = 2; + reopeningChance = 0.65; + }; + class LacerationMedium: Laceration { + effectiveness = 1.5; + reopeningChance = 0.8; + }; + class LacerationLarge: Laceration { + effectiveness = 1; + reopeningChance = 0.9; + }; + + class VelocityWound: Abrasion { + effectiveness = 2.2; + reopeningChance = 1; + reopeningMinDelay = 80; + reopeningMaxDelay = 200; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 2.2; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 1.75; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 1.5; + }; + + class PunctureWound: Abrasion { + effectiveness = 2.5; + reopeningChance = 1; + reopeningMinDelay = 100; + reopeningMaxDelay = 300; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 2.5; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 2; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 1.5; + }; + }; + + class QuikClot: fieldDressing { + class Abrasion { + effectiveness = 2; + reopeningChance = 0.3; + reopeningMinDelay = 800; + reopeningMaxDelay = 1500; + }; + class AbrasionMinor: Abrasion { + effectiveness = 2; + }; + class AbrasionMedium: Abrasion { + effectiveness = 1; + reopeningChance = 0.4; + }; + class AbrasionLarge: Abrasion { + effectiveness = 0.7; + reopeningChance = 5; + }; + + class Avulsion: Abrasion { + effectiveness = 0.7; + reopeningChance = 0.2; + reopeningMinDelay = 1000; + reopeningMaxDelay = 1600; + }; + class AvulsionMinor: Avulsion { + effectiveness = 0.7; + }; + class AvulsionMedium: Avulsion { + effectiveness = 0.65; + }; + class AvulsionLarge: Avulsion { + effectiveness = 0.5; + }; + + class Contusion: Abrasion { + effectiveness = 1; + reopeningChance = 0; + reopeningMinDelay = 0; + reopeningMaxDelay = 0; + }; + class ContusionMinor: Contusion {}; + class ContusionMedium: Contusion {}; + class ContusionLarge: Contusion {}; + + class Crush: Abrasion { + effectiveness = 0.6; + reopeningChance = 0.5; + reopeningMinDelay = 600; + reopeningMaxDelay = 1000; + }; + class CrushMinor: Crush { + effectiveness = 0.6; + reopeningChance = 0.3; + }; + class CrushMedium: Crush { + effectiveness = 0.5; + }; + class CrushLarge: Crush { + effectiveness = 0.4; + }; + + class Cut: Abrasion { + effectiveness = 2; + reopeningChance = 0.2; + reopeningMinDelay = 700; + reopeningMaxDelay = 1000; + }; + class CutMinor: Cut { + effectiveness = 2; + reopeningChance = 0.3; + }; + class CutMedium: Cut { + effectiveness = 1; + }; + class CutLarge: Cut { + effectiveness = 0.6; + }; + + class Laceration: Abrasion { + effectiveness = 0.7; + reopeningChance = 0.4; + reopeningMinDelay = 500; + reopeningMaxDelay = 2000; + }; + class LacerationMinor: Laceration { + effectiveness = 0.7; + reopeningChance = 0.4; + }; + class LacerationMedium: Laceration { + effectiveness = 0.7; + }; + class LacerationLarge: Laceration { + effectiveness = 0.5; + }; + + class VelocityWound: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 800; + reopeningMaxDelay = 2000; + }; + class VelocityWoundMinor: VelocityWound { + effectiveness = 1; + }; + class VelocityWoundMedium: VelocityWound { + effectiveness = 0.75; + }; + class VelocityWoundLarge: VelocityWound { + effectiveness = 0.5; + }; + + class PunctureWound: Abrasion { + effectiveness = 1; + reopeningChance = 0.5; + reopeningMinDelay = 1000; + reopeningMaxDelay = 3000; + }; + class PunctureWoundMinor: PunctureWound { + effectiveness = 1; + }; + class PunctureWoundMedium: PunctureWound { + effectiveness = 0.7; + }; + class PunctureWoundLarge: PunctureWound { + effectiveness = 0.4; + }; + }; + }; + + class Medication { + // How much does the pain get reduced? + painReduce = 0; + // How much will the heart rate be increased when the HR is low (below 55)? {minIncrease, maxIncrease} + hrIncreaseLow[] = {0, 0}; // _heartRate < 55 + hrIncreaseNormal[] = {0, 0}; // 55 <= _heartRate <= 110 + hrIncreaseHigh[] = {0, 0}; // 110 < _heartRate + + // How long until this medication has disappeared + timeInSystem = 120; + // How long until the maximum effect is reached + timeTillMaxEffect = 30; + // How many of this type of medication can be in the system before the patient overdoses? + maxDose = 4; + // Function to execute upon overdose. Arguments passed to call back are 0: unit , 1: medicationClassName + onOverDose = ""; + // The viscosity of a fluid is a measure of its resistance to gradual deformation by shear stress or tensile stress. For liquids, it corresponds to the informal concept of "thickness". This value will increase/decrease the viscoty of the blood with the percentage given. Where 100 = max. Using the minus will decrease viscosity + viscosityChange = 0; + + // specific details for the ACE_Morphine treatment action + class Morphine { + painReduce = 0.8; + hrIncreaseLow[] = {-10, -20}; + hrIncreaseNormal[] = {-10, -30}; + hrIncreaseHigh[] = {-10, -35}; + timeInSystem = 1800; + timeTillMaxEffect = 30; + maxDose = 4; + inCompatableMedication[] = {}; + viscosityChange = -10; + }; + class Epinephrine { + painReduce = 0; + hrIncreaseLow[] = {10, 20}; + hrIncreaseNormal[] = {10, 50}; + hrIncreaseHigh[] = {10, 40}; + timeInSystem = 120; + timeTillMaxEffect = 10; + maxDose = 10; + inCompatableMedication[] = {}; + }; + class Adenosine { + painReduce = 0; + hrIncreaseLow[] = {-7, -10}; + hrIncreaseNormal[] = {-15, -30}; + hrIncreaseHigh[] = {-15, -35}; + timeInSystem = 120; + timeTillMaxEffect = 15; + maxDose = 6; + inCompatableMedication[] = {}; + }; + class Atropine { + painReduce = 0; + hrIncreaseLow[] = {-2, -5}; + hrIncreaseNormal[] = {-10, -15}; + hrIncreaseHigh[] = {-5, -20}; + timeInSystem = 120; + timeTillMaxEffect = 15; + maxDose = 6; + inCompatableMedication[] = {}; + }; + class PainKillers { + painReduce = 0.1; + timeInSystem = 600; + timeTillMaxEffect = 60; + maxDose = 10; + inCompatableMedication[] = {}; + viscosityChange = 5; + }; + }; + class IV { + // volume is in millileters + volume = 1000; + ratio[] = {}; + type = "Blood"; + class BloodIV { + volume = 1000; + ratio[] = {"Plasma", 1}; + }; + class BloodIV_500: BloodIV { + volume = 500; + }; + class BloodIV_250: BloodIV { + volume = 250; + }; + class PlasmaIV: BloodIV { + volume = 1000; + ratio[] = {"Blood", 1}; + type = "Plasma"; + }; + class PlasmaIV_500: PlasmaIV { + volume = 500; + }; + class PlasmaIV_250: PlasmaIV { + volume = 250; + }; + class SalineIV: BloodIV { + volume = 1000; + type = "Saline"; + ratio[] = {}; + }; + class SalineIV_500: SalineIV { + volume = 500; + }; + class SalineIV_250: SalineIV { + volume = 250; + }; + }; +}; diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp new file mode 100644 index 0000000000..ae1582c040 --- /dev/null +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -0,0 +1,301 @@ + +class GVAR(Actions) { + // --- bandages + class BasicBandage { + displayName = CSTRING(Bandage); + displayNameProgress = CSTRING(Bandaging); + icon = QPATHTOEF(medical_gui,ui\bandage.paa); + category = "bandage"; + treatmentLocations[] = {"All"}; + allowedSelections[] = {"All"}; + allowSelfTreatment = 1; + requiredMedic = 0; + treatmentTime = QFUNC(getBandageTime); + treatmentTimeSelfCoef = 1; + items[] = {{"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}}; + condition = QFUNC(canBandage); + itemConsumed = 1; + callbackSuccess = QFUNC(treatmentBandage); + callbackFailure = ""; + callbackProgress = ""; + + animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; + animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; + animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic"; + animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; + litter[] = { + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + }; + }; + class FieldDressing: BasicBandage { + displayName = CSTRING(Actions_FieldDressing); + items[] = {"ACE_fieldDressing"}; + litter[] = { + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + }; + }; + class PackingBandage: BasicBandage { + displayName = CSTRING(Actions_PackingBandage); + icon = QPATHTOEF(medical_gui,ui\packing_bandage.paa); + items[] = {"ACE_packingBandage"}; + litter[] = { + {"All", "", {"ACE_MedicalLitter_packingBandage"}}, + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + }; + }; + class ElasticBandage: BasicBandage { + displayName = CSTRING(Actions_ElasticBandage); + items[] = {"ACE_elasticBandage"}; + litter[] = { + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + }; + }; + class QuikClot: BasicBandage { + displayName = CSTRING(Actions_QuikClot); + items[] = {"ACE_quikclot"}; + litter[] = { + {"All", "", {"ACE_MedicalLitter_QuickClot"}}, + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + }; + }; + + // --- tourniquet + class Tourniquet: BasicBandage { + displayName = CSTRING(Apply_Tourniquet); + displayNameProgress = CSTRING(Applying_Tourniquet); + icon = QPATHTOEF(medical_gui,ui\tourniquet.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + items[] = {"ACE_tourniquet"}; + treatmentTime = 7; + callbackSuccess = QFUNC(treatmentTourniquet); + condition = QUOTE(!([ARR_2(_target,_bodyPart)] call FUNC(hasTourniquetAppliedTo))); + litter[] = {}; + }; + class RemoveTourniquet: Tourniquet { + displayName = CSTRING(Actions_RemoveTourniquet); + displayNameProgress = CSTRING(RemovingTourniquet); + items[] = {}; + callbackSuccess = QFUNC(treatmentTourniquetRemove); + condition = QUOTE([ARR_2(_target,_bodyPart)] call FUNC(hasTourniquetAppliedTo)); + }; + + // --- syringes + class Morphine: FieldDressing { + displayName = CSTRING(Inject_Morphine); + displayNameProgress = CSTRING(Injecting_Morphine); + icon = QPATHTOEF(medical_gui,ui\auto_injector.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + category = "medication"; + items[] = {"ACE_morphine"}; + condition = ""; + treatmentTime = 5; + callbackSuccess = QFUNC(treatmentMedication); + animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; + sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}}; + }; + class Adenosine: Morphine { + displayName = CSTRING(Inject_Adenosine); + displayNameProgress = CSTRING(Injecting_Adenosine); + condition = QGVAR(advancedMedication); + items[] = {"ACE_adenosine"}; + litter[] = { {"All", "", {"ACE_MedicalLitter_adenosine"}} }; + }; + class Atropine: Morphine { + displayName = CSTRING(Inject_Atropine); + displayNameProgress = CSTRING(Injecting_Atropine); + condition = QGVAR(advancedMedication); + items[] = {"ACE_atropine"}; + litter[] = { {"All", "", {"ACE_MedicalLitter_atropine"}} }; + }; + class Epinephrine: Morphine { + displayName = CSTRING(Inject_Epinephrine); + displayNameProgress = CSTRING(Injecting_Epinephrine); + requiredMedic = QEGVAR(medical,medicSetting_Epi); + items[] = {"ACE_epinephrine"}; + litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; + treatmentLocations[] = {QEGVAR(medical,useLocation_Epi)}; + }; + + // --- iv bags + class BloodIV: BasicBandage { + displayName = CSTRING(Actions_Blood4_1000); + displayNameProgress = CSTRING(Transfusing_Blood); + icon = QPATHTOEF(medical_gui,ui\iv.paa); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + allowSelfTreatment = QGVAR(allowSelfIV); + category = "advanced"; + requiredMedic = 1; + treatmentTime = 12; + items[] = {"ACE_bloodIV"}; + condition = ""; + callbackSuccess = QFUNC(treatmentIV); + animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + litter[] = {}; + }; + class BloodIV_500: BloodIV { + displayName = CSTRING(Actions_Blood4_500); + items[] = {"ACE_bloodIV_500"}; + }; + class BloodIV_250: BloodIV { + displayName = CSTRING(Actions_Blood4_250); + items[] = {"ACE_bloodIV_250"}; + }; + class PlasmaIV: BloodIV { + displayName = CSTRING(Actions_Plasma4_1000); + displayNameProgress = CSTRING(Transfusing_Plasma); + items[] = {"ACE_plasmaIV"}; + animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + }; + class PlasmaIV_500: PlasmaIV { + displayName = CSTRING(Actions_Plasma4_500); + items[] = {"ACE_plasmaIV_500"}; + }; + class PlasmaIV_250: PlasmaIV { + displayName = CSTRING(Actions_Plasma4_250); + items[] = {"ACE_plasmaIV_250"}; + }; + class SalineIV: BloodIV { + displayName = CSTRING(Actions_Saline4_1000); + displayNameProgress = CSTRING(Transfusing_Saline); + items[] = {"ACE_salineIV"}; + animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + }; + class SalineIV_500: SalineIV { + displayName = CSTRING(Actions_Saline4_500); + items[] = {"ACE_salineIV_500"}; + }; + class SalineIV_250: SalineIV { + displayName = CSTRING(Actions_Saline4_250); + items[] = {"ACE_salineIV_250"}; + }; + + // --- diagnose + class Diagnose: BasicBandage { + displayName = CSTRING(Actions_Diagnose); + displayNameProgress = CSTRING(Actions_Diagnosing); + icon = ""; + category = "examine"; + treatmentLocations[] = {"All"}; + allowedSelections[] = {"Head", "Body"}; + requiredMedic = 0; + treatmentTime = 2.5; + items[] = {}; + condition = QUOTE(!GVAR(advancedDiagnose)); + callbackSuccess = QFUNC(actionDiagnose); + callbackFailure = ""; + callbackProgress = ""; + animationCaller = ""; // TODO + itemConsumed = 0; + litter[] = {}; + }; + class CheckPulse: Diagnose { + displayName = CSTRING(Actions_CheckPulse); + displayNameProgress = CSTRING(Check_Pulse_Content); + allowedSelections[] = {"All"}; + condition = QGVAR(advancedDiagnose); + callbackSuccess = QFUNC(actionCheckPulse); + animationCallerProne = ""; + animationCallerSelfProne = ""; + }; + class CheckBloodPressure: CheckPulse { + displayName = CSTRING(Actions_CheckBloodPressure); + displayNameProgress = CSTRING(Check_Bloodpressure_Content); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + callbackSuccess = QFUNC(actionCheckBloodPressure); + }; + class CheckResponse: CheckPulse { + displayName = CSTRING(Check_Response); + displayNameProgress = CSTRING(Check_Response_Content); + allowedSelections[] = {"Head"}; + allowSelfTreatment = 0; + callbackSuccess = QFUNC(actionCheckResponse); + }; + + // --- misc + class BodyBag: BasicBandage { + displayName = CSTRING(PlaceInBodyBag); + displayNameProgress = CSTRING(PlacingInBodyBag); + icon = QPATHTOEF(medical_gui,ui\bodybag.paa); + category = "advanced"; + treatmentLocations[] = {"All"}; + allowSelfTreatment = 0; + requiredMedic = 0; + treatmentTime = 15; + items[] = {"ACE_bodyBag"}; + condition = "!alive _target"; + callbackSuccess = QFUNC(actionPlaceInBodyBag); + callbackFailure = ""; + callbackProgress = ""; + itemConsumed = 1; + litter[] = {}; + }; + class CPR: BasicBandage { + displayName = CSTRING(Actions_CPR); + displayNameProgress = CSTRING(Actions_PerformingCPR); + icon = ""; + category = "advanced"; + treatmentLocations[] = {"All"}; + allowedSelections[] = {"Body"}; + allowSelfTreatment = 0; + requiredMedic = 0; + treatmentTime = 15; + items[] = {}; + condition = QUOTE(!(_target call EFUNC(common,isAwake)) && {!(_target getVariable [ARR_2('GVAR(receiveCPR)', false)])}); + callbackSuccess = QFUNC(treatmentCPR); + callbackFailure = QFUNC(treatmentCPR_failure); + callbackProgress = QFUNC(treatmentCPR_progress); + callbackStart = QFUNC(treatmentCPR_start); + animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medic"; + animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic"; + animationCallerSelf = ""; + animationCallerSelfProne = ""; + itemConsumed = 0; + litter[] = {}; + }; + + class SurgicalKit: FieldDressing { + displayName = CSTRING(Use_SurgicalKit); + displayNameProgress = CSTRING(Stitching); + icon = QPATHTOEF(medical_gui,ui\surgical_kit.paa); + category = "advanced"; + items[] = {"ACE_surgicalKit"}; + treatmentLocations[] = {QEGVAR(medical,useLocation_SurgicalKit)}; + allowSelfTreatment = 0; + requiredMedic = QEGVAR(medical,medicSetting_SurgicalKit); + treatmentTime = QUOTE(count (_target getVariable [ARR_2('EGVAR(medical,bandagedWounds)',[])]) * 5); + condition = QFUNC(canStitch); + callbackSuccess = ""; + callbackProgress = QFUNC(treatmentSurgicalKit_onProgress); + itemConsumed = QEGVAR(medical,consumeItem_SurgicalKit); + animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; + litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"} }}; + }; + class PersonalAidKit: BasicBandage { + displayName = CSTRING(Use_Aid_Kit); + displayNameProgress = CSTRING(TreatmentAction); + icon = ""; + category = "advanced"; + condition = QUOTE(_target call EFUNC(medical_status,isInStableCondition)); + items[] = {"ACE_personalAidKit"}; + treatmentLocations[] = {QEGVAR(medical,useLocation_PAK)}; + requiredMedic = QEGVAR(medical,medicSetting_PAK); + treatmentTime = QUOTE(_target call FUNC(healTime)); + callbackSuccess = QFUNC(treatmentFullHeal); + itemConsumed = QEGVAR(medical,consumeItem_PAK); + animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medicOther"; + animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther"; + animationCallerSelf = ""; + animationCallerSelfProne = ""; + litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"}}, + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart > 0", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}}, + {"All", "_bloodLossOnBodyPart <= 0", {"ACE_MedicalLitter_clean"}} + }; + }; +}; diff --git a/addons/medical_treatment/ACE_Settings.hpp b/addons/medical_treatment/ACE_Settings.hpp new file mode 100644 index 0000000000..309c923299 --- /dev/null +++ b/addons/medical_treatment/ACE_Settings.hpp @@ -0,0 +1,48 @@ +class ACE_Settings { + class EGVAR(medical,allowLitterCreation) { + movedToSqf = 1; + }; + class EGVAR(medical,CPRcreatesPulse) { + movedToSqf = 1; + }; + class EGVAR(medical,litterCleanUpDelay) { + movedToSqf = 1; + }; + class EGVAR(medical,litterSimulationDetail) { + movedToSqf = 1; + _values[] = { 0, 50, 100, 1000, 5000 }; + }; + class EGVAR(medical,increaseTrainingInLocations) { + movedToSqf = 1; + }; + class EGVAR(medical,PAKTime) { + movedToSqf = 1; + }; + class EGVAR(medical,medicSetting_Epi) { + movedToSqf = 1; + }; + class EGVAR(medical,medicSetting_PAK) { + movedToSqf = 1; + }; + class EGVAR(medical,medicSetting_SurgicalKit) { + movedToSqf = 1; + }; + class EGVAR(medical,consumeItem_PAK) { + movedToSqf = 1; + }; + class EGVAR(medical,consumeItem_SurgicalKit) { + movedToSqf = 1; + }; + class EGVAR(medical,useLocation_Epi) { + movedToSqf = 1; + }; + class EGVAR(medical,useLocation_PAK) { + movedToSqf = 1; + }; + class EGVAR(medical,useLocation_SurgicalKit) { + movedToSqf = 1; + }; + class EGVAR(medical,convertItems) { + movedToSqf = 1; + }; +}; diff --git a/addons/medical/CfgEden.hpp b/addons/medical_treatment/CfgEden.hpp similarity index 94% rename from addons/medical/CfgEden.hpp rename to addons/medical_treatment/CfgEden.hpp index bebfdb9549..d3c2f6c721 100644 --- a/addons/medical/CfgEden.hpp +++ b/addons/medical_treatment/CfgEden.hpp @@ -35,7 +35,7 @@ class Cfg3DEN { control = QGVAR(isMedicControl); displayName = CSTRING(AssignMedicRoles_role_DisplayName); tooltip = CSTRING(Attributes_isMedic_Description); - expression = QUOTE(if (_value > -1) then {_this setVariable [ARR_3(QUOTE(QGVAR(medicClass)),_value, true)];};); + expression = QUOTE(if (_value > -1) then {_this setVariable [ARR_3(QQEGVAR(medical,medicClass),_value,true)];};); typeName = "NUMBER"; condition = "objectBrain"; defaultValue = "-1"; @@ -46,7 +46,7 @@ class Cfg3DEN { control = "CheckboxNumber"; displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); tooltip = CSTRING(Attributes_isMedicalVehicle_Description); - expression = QUOTE(_this setVariable [ARR_3(QUOTE(QGVAR(medicClass)),_value, true)];); + expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,medicClass),_value,true)];); typeName = "NUMBER"; condition = "objectVehicle"; defaultValue = 0; @@ -57,7 +57,7 @@ class Cfg3DEN { control = "Checkbox"; displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); tooltip = CSTRING(AssignMedicalFacility_enabled_Description); - expression = QUOTE(_this setVariable [ARR_3(QUOTE(QGVAR(isMedicalFacility)),_value, true)];); + expression = QUOTE(_this setVariable [ARR_3(QQEGVAR(medical,isMedicalFacility),_value,true)];); typeName = "BOOL"; condition = "(1 - objectBrain) * (1 - objectVehicle)"; defaultValue = "false"; diff --git a/addons/medical_treatment/CfgEventHandlers.hpp b/addons/medical_treatment/CfgEventHandlers.hpp new file mode 100644 index 0000000000..0d3301d6e0 --- /dev/null +++ b/addons/medical_treatment/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_treatment/CfgVehicles.hpp b/addons/medical_treatment/CfgVehicles.hpp new file mode 100644 index 0000000000..39940da4fc --- /dev/null +++ b/addons/medical_treatment/CfgVehicles.hpp @@ -0,0 +1,314 @@ +class CBA_Extended_EventHandlers; +class CfgVehicles { + // Bodybag vehicle + class MapBoard_altis_F; + class ACE_bodyBagObject: MapBoard_altis_F { + class EventHandlers { + class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; + }; + + scope = 1; + scopeCurator = 2; + side = -1; + model = QPATHTOEF(apl,ace_bodybag.p3d); + icon = ""; + displayName = CSTRING(Bodybag_Display); + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition)[] = {0,1.2,0}; + EGVAR(dragging,dragDirection) = 0; + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; + hiddenSelections[] = {"camo"}; + hiddenSelectionsTextures[] = {QPATHTOEF(apl,data\bodybag_co.paa)}; + class ACE_Actions { + class ACE_MainActions { + displayName = ECSTRING(interaction,MainAction); + distance = 5; + condition = QUOTE(true); + statement = ""; + icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; + selection = ""; + }; + }; + }; + + // Medical litter classes + class Thing; + class ACE_MedicalLitterBase: Thing { + scope = 1; + scopeCurator = 0; + displayName = " "; + destrType = "DestructNo"; + model = QPATHTOF(data\littergeneric.p3d); + }; + class ACE_MedicalLitter_clean: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_clean.p3d); + }; + class ACE_MedicalLitter_bandage1: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_bandages1.p3d); + }; + class ACE_MedicalLitter_bandage2: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_bandages2.p3d); + }; + class ACE_MedicalLitter_bandage3: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_bandages3.p3d); + }; + class ACE_MedicalLitter_packingBandage: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_packingBandage.p3d); + }; + class ACE_MedicalLitter_gloves: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_gloves.p3d); + }; + class ACE_MedicalLitter_adenosine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_adenosine.p3d); + }; + class ACE_MedicalLitter_atropine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_atropine.p3d); + }; + class ACE_MedicalLitter_epinephrine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_epinephrine.p3d); + }; + class ACE_MedicalLitter_morphine: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_morphine.p3d); + }; + class ACE_MedicalLitter_QuickClot: ACE_MedicalLitterBase { + model = QPATHTOF(data\littergeneric_Quikclot.p3d); + }; + + // Treatment items + class Item_Base_F; + class ACE_fieldDressingItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Bandage_Basic_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_fieldDressing,1); + }; + }; + class ACE_packingBandageItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Packing_Bandage_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_packingBandage,1); + }; + }; + class ACE_elasticBandageItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Bandage_Elastic_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_elasticBandage,1); + }; + }; + class ACE_tourniquetItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Tourniquet_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_tourniquet,1); + }; + }; + class ACE_morphineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Morphine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_morphine,1); + }; + }; + class ACE_adenosineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Adenosine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_adenosine,1); + }; + }; + class ACE_atropineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Atropine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_atropine,1); + }; + }; + class ACE_epinephrineItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Epinephrine_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_epinephrine,1); + }; + }; + class ACE_plasmaIVItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Plasma_IV); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_plasmaIV,1); + }; + }; + + class ACE_bloodIVItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Blood_IV); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_bloodIV,1); + }; + }; + class ACE_salineIVItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Saline_IV); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_salineIV,1); + }; + }; + class ACE_quikClotItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(QuikClot_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_quikclot,1); + }; + }; + class ACE_personalAidKitItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Aid_Kit_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_personalAidKit,1); + }; + }; + class ACE_surgicalKitItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(SurgicalKit_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_surgicalKit,1); + }; + }; + class ACE_bodyBagItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(Bodybag_Display); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_bodyBag,1); + }; + }; + + // Medical supply crates + class ThingX; + class ReammoBox_F: ThingX { + class ACE_Actions; + }; + class NATO_Box_Base: ReammoBox_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions; + }; + }; + class ACE_medicalSupplyCrate: NATO_Box_Base { + scope = 2; + scopeCurator = 2; + accuracy = 1000; + displayName = CSTRING(medicalSupplyCrate); + model = QPATHTOF(data\ace_medcrate.p3d); + author = ECSTRING(common,ACETeam); + class TransportItems { + MACRO_ADDITEM(ACE_fieldDressing,50); + MACRO_ADDITEM(ACE_morphine,25); + MACRO_ADDITEM(ACE_epinephrine,25); + MACRO_ADDITEM(ACE_bloodIV,15); + MACRO_ADDITEM(ACE_bloodIV_500,15); + MACRO_ADDITEM(ACE_bloodIV_250,15); + MACRO_ADDITEM(ACE_bodyBag,10); + }; + class AnimationSources { + class Cover { + source = "user"; + animPeriod = 1.5; + initPhase = 0; + minValue = 0; + maxValue = 1; + }; + }; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + selection = "cover_action"; + + class ACE_OpenLid { + displayName = ECSTRING(medical,openLid); + condition = QUOTE(alive _target && {_target animationPhase 'Cover' < 0.5}); + statement = QUOTE(_target animate ARR_2(['Cover',1])); + showDisabled = 0; + priority = -1; + }; + class ACE_CloseLid { + displayName = ECSTRING(medical,closeLid); + condition = QUOTE(alive _target && {_target animationPhase 'Cover' >= 0.5}); + statement = QUOTE(_target animate ARR_2(['Cover',0])); + showDisabled = 0; + priority = -1; + }; + }; + }; + }; + class ACE_medicalSupplyCrate_advanced: ACE_medicalSupplyCrate { + displayName = CSTRING(medicalSupplyCrate_advanced); + class TransportItems { + MACRO_ADDITEM(ACE_fieldDressing,25); + MACRO_ADDITEM(ACE_packingBandage,25); + MACRO_ADDITEM(ACE_elasticBandage,25); + MACRO_ADDITEM(ACE_tourniquet,15); + MACRO_ADDITEM(ACE_morphine,15); + MACRO_ADDITEM(ACE_adenosine,15); + MACRO_ADDITEM(ACE_atropine,15); + MACRO_ADDITEM(ACE_epinephrine,15); + MACRO_ADDITEM(ACE_plasmaIV,7); + MACRO_ADDITEM(ACE_plasmaIV_500,7); + MACRO_ADDITEM(ACE_plasmaIV_250,7); + MACRO_ADDITEM(ACE_salineIV,7); + MACRO_ADDITEM(ACE_salineIV_500,7); + MACRO_ADDITEM(ACE_salineIV_250,7); + MACRO_ADDITEM(ACE_bloodIV,7); + MACRO_ADDITEM(ACE_bloodIV_500,7); + MACRO_ADDITEM(ACE_bloodIV_250,7); + MACRO_ADDITEM(ACE_quikClot,20); + MACRO_ADDITEM(ACE_personalAidKit,3); + MACRO_ADDITEM(ACE_surgicalKit,2); + MACRO_ADDITEM(ACE_bodyBag,5); + }; + }; +}; diff --git a/addons/medical/CfgWeapons.hpp b/addons/medical_treatment/CfgWeapons.hpp similarity index 97% rename from addons/medical/CfgWeapons.hpp rename to addons/medical_treatment/CfgWeapons.hpp index 7260452bc4..17ed52fd4f 100644 --- a/addons/medical/CfgWeapons.hpp +++ b/addons/medical_treatment/CfgWeapons.hpp @@ -31,7 +31,7 @@ class CfgWeapons { descriptionShort = CSTRING(Bandage_Basic_Desc_Short); descriptionUse = CSTRING(Bandage_Basic_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_packingBandage: ACE_ItemCore { @@ -43,7 +43,7 @@ class CfgWeapons { descriptionShort = CSTRING(Packing_Bandage_Desc_Short); descriptionUse = CSTRING(Packing_Bandage_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_elasticBandage: ACE_ItemCore { @@ -55,7 +55,7 @@ class CfgWeapons { descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_tourniquet: ACE_ItemCore { @@ -67,7 +67,7 @@ class CfgWeapons { descriptionShort = CSTRING(Tourniquet_Desc_Short); descriptionUse = CSTRING(Tourniquet_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_morphine: ACE_ItemCore { @@ -79,7 +79,7 @@ class CfgWeapons { descriptionShort = CSTRING(Morphine_Desc_Short); descriptionUse = CSTRING(Morphine_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_adenosine: ACE_ItemCore { @@ -91,7 +91,7 @@ class CfgWeapons { descriptionShort = CSTRING(adenosine_Desc_Short); descriptionUse = CSTRING(adenosine_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_atropine: ACE_ItemCore { @@ -103,7 +103,7 @@ class CfgWeapons { descriptionShort = CSTRING(Atropine_Desc_Short); descriptionUse = CSTRING(Atropine_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_epinephrine: ACE_ItemCore { @@ -115,7 +115,7 @@ class CfgWeapons { descriptionShort = CSTRING(Epinephrine_Desc_Short); descriptionUse = CSTRING(Epinephrine_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; @@ -218,7 +218,7 @@ class CfgWeapons { descriptionShort = CSTRING(QuikClot_Desc_Short); descriptionUse = CSTRING(QuikClot_Desc_Use); class ItemInfo: CBA_MiscItem_ItemInfo { - mass = 1; + mass = 2; }; }; class ACE_personalAidKit: ACE_ItemCore { diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp new file mode 100644 index 0000000000..77e91fbc2a --- /dev/null +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -0,0 +1,71 @@ + +// actions +PREP(actionCheckBloodPressure); +PREP(actionCheckBloodPressureLocal); +PREP(actionCheckPulse); +PREP(actionCheckPulseLocal); +PREP(actionCheckResponse); +PREP(actionDiagnose); +PREP(actionLoadUnit); +PREP(actionPlaceInBodyBag); +PREP(actionUnloadUnit); +PREP(addLoadPatientActions); + +// treaments +PREP(canTreat); +PREP(canTreatCached); +PREP(treatment); +PREP(treatment_failure); +PREP(treatment_success); + +PREP(treatmentBandage); +PREP(treatmentBandageLocal); +PREP(treatmentCPR); +PREP(treatmentCPR_failure); +PREP(treatmentCPR_progress); +PREP(treatmentCPR_start); +PREP(treatmentCPRLocal); +PREP(treatmentFullHeal); +PREP(treatmentFullHealLocal); +PREP(treatmentIV); +PREP(treatmentIVLocal); +PREP(treatmentMedication); +PREP(treatmentMedicationLocal); +PREP(treatmentSurgicalKit_onProgress); +PREP(treatmentTourniquet); +PREP(treatmentTourniquetLocal); +PREP(treatmentTourniquetRemove); + +// misc +PREP(addToLog); +PREP(addToTriageCard); +PREP(bodyCleanupLoop); +PREP(calculateBlood); +PREP(canAccessMedicalEquipment); +PREP(canBandage); +PREP(canStitch); +PREP(findMostEffectiveWound); +PREP(getBandageTime); +PREP(getTriageStatus); +PREP(handleBandageOpening); +PREP(hasTourniquetAppliedTo); +PREP(healTime); +PREP(isInMedicalFacility); +PREP(isInMedicalVehicle); +PREP(isMedic); +PREP(isMedicalVehicle); +PREP(onMedicationUsage); +PREP(serverRemoveBody); +PREP(setTriageStatus); + +// items +PREP(checkItems); +PREP(hasItem); +PREP(hasItems); +PREP(useItem); +PREP(useItems); + +// litter +PREP(litterCleanupLoop); +PREP(litterCreate); +PREP(litterHandleCreate); diff --git a/addons/medical_treatment/XEH_postInit.sqf b/addons/medical_treatment/XEH_postInit.sqf new file mode 100644 index 0000000000..ecaca5cea6 --- /dev/null +++ b/addons/medical_treatment/XEH_postInit.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" + +[QEGVAR(medical_status,initialized), FUNC(checkItems)] call CBA_fnc_addEventHandler; +["loadout", FUNC(checkItems)] call CBA_fnc_addPlayerEventHandler; + +// Handle bodybags and litter on server +if (isServer) then { + [QGVAR(createLitterServer), FUNC(litterHandleCreate)] call CBA_fnc_addEventHandler; + ["ace_placedInBodyBag", FUNC(serverRemoveBody)] call CBA_fnc_addEventHandler; +}; + +// treatment events +[QGVAR(treatmentBandageLocal), FUNC(treatmentBandageLocal)] call CBA_fnc_addEventHandler; +[QGVAR(treatmentTourniquetLocal), FUNC(treatmentTourniquetLocal)] call CBA_fnc_addEventHandler; +[QGVAR(treatmentMedicationLocal), FUNC(treatmentMedicationLocal)] call CBA_fnc_addEventHandler; +[QGVAR(treatmentIVLocal), FUNC(treatmentIVLocal)] call CBA_fnc_addEventHandler; +[QGVAR(treatmentCPRLocal), FUNC(treatmentCPRLocal)] call CBA_fnc_addEventHandler; +[QGVAR(treatmentFullHealLocal), FUNC(treatmentFullHealLocal)] call CBA_fnc_addEventHandler; + +// action events +[QGVAR(actionCheckPulseLocal), FUNC(actionCheckPulseLocal)] call CBA_fnc_addEventHandler; +[QGVAR(actionCheckBloodPressureLocal), FUNC(actionCheckBloodPressureLocal)] call CBA_fnc_addEventHandler; +[QGVAR(actionPlaceInBodyBag), FUNC(actionPlaceInBodyBag)] call CBA_fnc_addEventHandler; + +// log events +[QGVAR(addToMedicalLog), FUNC(addToLog)] call CBA_fnc_addEventHandler; +[QGVAR(addToTriageCard), FUNC(addToTriageCard)] call CBA_fnc_addEventHandler; diff --git a/addons/medical_treatment/XEH_preInit.sqf b/addons/medical_treatment/XEH_preInit.sqf new file mode 100644 index 0000000000..a4ddb9f082 --- /dev/null +++ b/addons/medical_treatment/XEH_preInit.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +// config to determine animation acceleration coefficient +// adjusting these is trail and error +// if the animation is cut of ingame, increase these values +// if the unit idles too much, decrease them +GVAR(animDurations) = [] call CBA_fnc_createNamespace; + +{ + GVAR(animDurations) setVariable _x; +} forEach [ + ["AinvPknlMstpSlayWnonDnon_medic", 7.5], + ["AinvPpneMstpSlayWnonDnon_medic", 7], + ["AinvPknlMstpSlayWrflDnon_medic", 7], + ["AinvPpneMstpSlayWrflDnon_medic", 9.5], + ["AinvPknlMstpSlayWlnrDnon_medic", 9], + ["AinvPknlMstpSlayWpstDnon_medic", 9.5], + ["AinvPpneMstpSlayWpstDnon_medic", 10], + ["AinvPknlMstpSlayWnonDnon_medicOther", 8.5], + ["AinvPpneMstpSlayWnonDnon_medicOther", 8.5], + ["AinvPknlMstpSlayWrflDnon_medicOther", 7], + ["AinvPpneMstpSlayWrflDnon_medicOther", 9], + ["AinvPknlMstpSlayWlnrDnon_medicOther", 9], + ["AinvPknlMstpSlayWpstDnon_medicOther", 10], + ["AinvPpneMstpSlayWpstDnon_medicOther", 8.5], + ["AinvPknlMstpSnonWnonDnon_medic1", 10] +]; + +ADDON = true; diff --git a/addons/medical_treatment/XEH_preStart.sqf b/addons/medical_treatment/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_treatment/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp new file mode 100644 index 0000000000..30ea36a861 --- /dev/null +++ b/addons/medical_treatment/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_status", "ace_medical_damage", "ace_apl"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi", "Arcanum"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "ACE_Medical_Treatment.hpp" +#include "ACE_Medical_Treatment_Actions.hpp" +#include "ACE_Settings.hpp" +#include "CfgEden.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/medical/data/EpiMorphine_co.paa b/addons/medical_treatment/data/EpiMorphine_co.paa similarity index 100% rename from addons/medical/data/EpiMorphine_co.paa rename to addons/medical_treatment/data/EpiMorphine_co.paa diff --git a/addons/medical/data/ivbag.rvmat b/addons/medical_treatment/data/IVBag.rvmat similarity index 95% rename from addons/medical/data/ivbag.rvmat rename to addons/medical_treatment/data/IVBag.rvmat index c33c0ead90..1b4677e42b 100644 --- a/addons/medical/data/ivbag.rvmat +++ b/addons/medical_treatment/data/IVBag.rvmat @@ -14,7 +14,7 @@ PixelShaderID = "Super"; VertexShaderID = "Super"; class Stage1 { - texture = "z\ace\addons\medical\data\IVBag_nohq.paa"; + texture = "z\ace\addons\medical_treatment\data\IVBag_nohq.paa"; uvSource = "tex"; class uvTransform { diff --git a/addons/medical_treatment/data/IVBag_1000ml.p3d b/addons/medical_treatment/data/IVBag_1000ml.p3d new file mode 100644 index 0000000000..af08038509 Binary files /dev/null and b/addons/medical_treatment/data/IVBag_1000ml.p3d differ diff --git a/addons/medical_treatment/data/IVBag_250ml.p3d b/addons/medical_treatment/data/IVBag_250ml.p3d new file mode 100644 index 0000000000..de4113793f Binary files /dev/null and b/addons/medical_treatment/data/IVBag_250ml.p3d differ diff --git a/addons/medical_treatment/data/IVBag_500ml.p3d b/addons/medical_treatment/data/IVBag_500ml.p3d new file mode 100644 index 0000000000..92e510d9bd Binary files /dev/null and b/addons/medical_treatment/data/IVBag_500ml.p3d differ diff --git a/addons/medical/data/ivbag_blood_1000ml_ca.paa b/addons/medical_treatment/data/IVBag_blood_1000ml_ca.paa similarity index 100% rename from addons/medical/data/ivbag_blood_1000ml_ca.paa rename to addons/medical_treatment/data/IVBag_blood_1000ml_ca.paa diff --git a/addons/medical/data/ivbag_blood_250ml_ca.paa b/addons/medical_treatment/data/IVBag_blood_250ml_ca.paa similarity index 100% rename from addons/medical/data/ivbag_blood_250ml_ca.paa rename to addons/medical_treatment/data/IVBag_blood_250ml_ca.paa diff --git a/addons/medical/data/ivbag_blood_500ml_ca.paa b/addons/medical_treatment/data/IVBag_blood_500ml_ca.paa similarity index 100% rename from addons/medical/data/ivbag_blood_500ml_ca.paa rename to addons/medical_treatment/data/IVBag_blood_500ml_ca.paa diff --git a/addons/medical/data/IVBag_nohq.paa b/addons/medical_treatment/data/IVBag_nohq.paa similarity index 100% rename from addons/medical/data/IVBag_nohq.paa rename to addons/medical_treatment/data/IVBag_nohq.paa diff --git a/addons/medical/data/IVBag_plasma_1000ml_ca.paa b/addons/medical_treatment/data/IVBag_plasma_1000ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_plasma_1000ml_ca.paa rename to addons/medical_treatment/data/IVBag_plasma_1000ml_ca.paa diff --git a/addons/medical/data/IVBag_plasma_250ml_ca.paa b/addons/medical_treatment/data/IVBag_plasma_250ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_plasma_250ml_ca.paa rename to addons/medical_treatment/data/IVBag_plasma_250ml_ca.paa diff --git a/addons/medical/data/IVBag_plasma_500ml_ca.paa b/addons/medical_treatment/data/IVBag_plasma_500ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_plasma_500ml_ca.paa rename to addons/medical_treatment/data/IVBag_plasma_500ml_ca.paa diff --git a/addons/medical/data/IVBag_saline_1000ml_ca.paa b/addons/medical_treatment/data/IVBag_saline_1000ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_saline_1000ml_ca.paa rename to addons/medical_treatment/data/IVBag_saline_1000ml_ca.paa diff --git a/addons/medical/data/IVBag_saline_250ml_ca.paa b/addons/medical_treatment/data/IVBag_saline_250ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_saline_250ml_ca.paa rename to addons/medical_treatment/data/IVBag_saline_250ml_ca.paa diff --git a/addons/medical/data/IVBag_saline_500ml_ca.paa b/addons/medical_treatment/data/IVBag_saline_500ml_ca.paa similarity index 100% rename from addons/medical/data/IVBag_saline_500ml_ca.paa rename to addons/medical_treatment/data/IVBag_saline_500ml_ca.paa diff --git a/addons/medical_treatment/data/QuikClot.p3d b/addons/medical_treatment/data/QuikClot.p3d new file mode 100644 index 0000000000..d112ff163e Binary files /dev/null and b/addons/medical_treatment/data/QuikClot.p3d differ diff --git a/addons/medical_treatment/data/QuikClot.rvmat b/addons/medical_treatment/data/QuikClot.rvmat new file mode 100644 index 0000000000..4b96d78ccb --- /dev/null +++ b/addons/medical_treatment/data/QuikClot.rvmat @@ -0,0 +1,82 @@ +class StageTI +{ + texture="a3\data_f\default_ti_ca.paa"; +}; +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.050000008,0.050000008,0.050000008,1}; +specularPower=50; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\quikclot_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={0,9,0}; + up[]={4.5,0,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 +{ + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage5 +{ + texture="#(argb,8,8,3)color(1,1,1,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 +{ + texture="#(ai,64,64,1)fresnel(1.5,1.22)"; + uvSource="none"; +}; +class Stage7 +{ + texture="a3\data_f\env_land_co.paa"; + uvSource="none"; +}; diff --git a/addons/medical/data/quikclot_co.paa b/addons/medical_treatment/data/QuikClot_CO.paa similarity index 100% rename from addons/medical/data/quikclot_co.paa rename to addons/medical_treatment/data/QuikClot_CO.paa diff --git a/addons/medical/data/quikclot_nohq.paa b/addons/medical_treatment/data/QuikClot_NOHQ.paa similarity index 100% rename from addons/medical/data/quikclot_nohq.paa rename to addons/medical_treatment/data/QuikClot_NOHQ.paa diff --git a/addons/medical/data/ace_litterclean_co.paa b/addons/medical_treatment/data/ace_litterclean_co.paa similarity index 100% rename from addons/medical/data/ace_litterclean_co.paa rename to addons/medical_treatment/data/ace_litterclean_co.paa diff --git a/addons/medical/data/ace_littergeneric1_co.paa b/addons/medical_treatment/data/ace_littergeneric1_co.paa similarity index 100% rename from addons/medical/data/ace_littergeneric1_co.paa rename to addons/medical_treatment/data/ace_littergeneric1_co.paa diff --git a/addons/medical_treatment/data/ace_medcrate.p3d b/addons/medical_treatment/data/ace_medcrate.p3d new file mode 100644 index 0000000000..5e6b2840fd Binary files /dev/null and b/addons/medical_treatment/data/ace_medcrate.p3d differ diff --git a/addons/medical/data/ace_medcrate.rvmat b/addons/medical_treatment/data/ace_medcrate.rvmat similarity index 87% rename from addons/medical/data/ace_medcrate.rvmat rename to addons/medical_treatment/data/ace_medcrate.rvmat index 17488ebfdf..c66fb9ca65 100644 --- a/addons/medical/data/ace_medcrate.rvmat +++ b/addons/medical_treatment/data/ace_medcrate.rvmat @@ -8,7 +8,7 @@ specularPower=50; PixelShaderID="Super"; VertexShaderID="Super"; class Stage1 { - texture="z\ace\addons\medical\data\ace_medcrate_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\ace_medcrate_nohq.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; @@ -38,7 +38,7 @@ class Stage3 { }; }; class Stage4 { - texture="z\ace\addons\medical\data\ace_medcrate_as.paa"; + texture="z\ace\addons\medical_treatment\data\ace_medcrate_as.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; @@ -48,7 +48,7 @@ class Stage4 { }; }; class Stage5 { - texture="z\ace\addons\medical\data\ace_medcrate_smdi.paa"; + texture="z\ace\addons\medical_treatment\data\ace_medcrate_smdi.paa"; uvSource="tex"; class uvTransform { aside[]={1,0,0}; diff --git a/addons/medical/data/ace_medcrate_as.paa b/addons/medical_treatment/data/ace_medcrate_as.paa similarity index 100% rename from addons/medical/data/ace_medcrate_as.paa rename to addons/medical_treatment/data/ace_medcrate_as.paa diff --git a/addons/medical/data/ace_medcrate_co.paa b/addons/medical_treatment/data/ace_medcrate_co.paa similarity index 100% rename from addons/medical/data/ace_medcrate_co.paa rename to addons/medical_treatment/data/ace_medcrate_co.paa diff --git a/addons/medical/data/ace_medcrate_nohq.paa b/addons/medical_treatment/data/ace_medcrate_nohq.paa similarity index 100% rename from addons/medical/data/ace_medcrate_nohq.paa rename to addons/medical_treatment/data/ace_medcrate_nohq.paa diff --git a/addons/medical/data/ace_medcrate_smdi.paa b/addons/medical_treatment/data/ace_medcrate_smdi.paa similarity index 100% rename from addons/medical/data/ace_medcrate_smdi.paa rename to addons/medical_treatment/data/ace_medcrate_smdi.paa diff --git a/addons/medical_treatment/data/adenosine.p3d b/addons/medical_treatment/data/adenosine.p3d new file mode 100644 index 0000000000..f52e980760 Binary files /dev/null and b/addons/medical_treatment/data/adenosine.p3d differ diff --git a/addons/medical_treatment/data/atropine.p3d b/addons/medical_treatment/data/atropine.p3d new file mode 100644 index 0000000000..f52e980760 Binary files /dev/null and b/addons/medical_treatment/data/atropine.p3d differ diff --git a/addons/medical/data/atropine_co.paa b/addons/medical_treatment/data/atropine_co.paa similarity index 100% rename from addons/medical/data/atropine_co.paa rename to addons/medical_treatment/data/atropine_co.paa diff --git a/addons/medical_treatment/data/bandage.p3d b/addons/medical_treatment/data/bandage.p3d new file mode 100644 index 0000000000..646a381de6 Binary files /dev/null and b/addons/medical_treatment/data/bandage.p3d differ diff --git a/addons/medical_treatment/data/bodybagItem.p3d b/addons/medical_treatment/data/bodybagItem.p3d new file mode 100644 index 0000000000..5195fd59d9 Binary files /dev/null and b/addons/medical_treatment/data/bodybagItem.p3d differ diff --git a/addons/medical/data/bodybagitem.rvmat b/addons/medical_treatment/data/bodybagItem.rvmat similarity index 84% rename from addons/medical/data/bodybagitem.rvmat rename to addons/medical_treatment/data/bodybagItem.rvmat index a373bfaae8..e470a4e4f6 100644 --- a/addons/medical/data/bodybagitem.rvmat +++ b/addons/medical_treatment/data/bodybagItem.rvmat @@ -8,7 +8,7 @@ PixelShaderID="NormalMapSpecularDIMap"; VertexShaderID="NormalMap"; class Stage1 { - texture="z\ace\addons\medical\data\bodybagItem_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\bodybagItem_nohq.paa"; uvSource="tex"; class uvTransform { @@ -20,7 +20,7 @@ class Stage1 }; class Stage2 { - texture="z\ace\addons\medical\data\bodybagItem_smdi.paa"; + texture="z\ace\addons\medical_treatment\data\bodybagItem_smdi.paa"; uvSource="tex"; class uvTransform { diff --git a/addons/medical/data/bodybagitem_co.paa b/addons/medical_treatment/data/bodybagItem_co.paa similarity index 100% rename from addons/medical/data/bodybagitem_co.paa rename to addons/medical_treatment/data/bodybagItem_co.paa diff --git a/addons/medical/data/bodybagItem_nohq.paa b/addons/medical_treatment/data/bodybagItem_nohq.paa similarity index 100% rename from addons/medical/data/bodybagItem_nohq.paa rename to addons/medical_treatment/data/bodybagItem_nohq.paa diff --git a/addons/medical/data/bodybagItem_smdi.paa b/addons/medical_treatment/data/bodybagItem_smdi.paa similarity index 100% rename from addons/medical/data/bodybagItem_smdi.paa rename to addons/medical_treatment/data/bodybagItem_smdi.paa diff --git a/addons/medical_treatment/data/epinephrine.p3d b/addons/medical_treatment/data/epinephrine.p3d new file mode 100644 index 0000000000..03b6cdde00 Binary files /dev/null and b/addons/medical_treatment/data/epinephrine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric.p3d b/addons/medical_treatment/data/littergeneric.p3d new file mode 100644 index 0000000000..a5e1d19c56 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_Quikclot.p3d b/addons/medical_treatment/data/littergeneric_Quikclot.p3d new file mode 100644 index 0000000000..949d19b7c0 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_Quikclot.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_adenosine.p3d b/addons/medical_treatment/data/littergeneric_adenosine.p3d new file mode 100644 index 0000000000..b33c34ed2d Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_adenosine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_atropine.p3d b/addons/medical_treatment/data/littergeneric_atropine.p3d new file mode 100644 index 0000000000..b33c34ed2d Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_atropine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_bandages1.p3d b/addons/medical_treatment/data/littergeneric_bandages1.p3d new file mode 100644 index 0000000000..b55652e6a2 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_bandages1.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_bandages2.p3d b/addons/medical_treatment/data/littergeneric_bandages2.p3d new file mode 100644 index 0000000000..b6c9c67fbd Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_bandages2.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_bandages3.p3d b/addons/medical_treatment/data/littergeneric_bandages3.p3d new file mode 100644 index 0000000000..b6c9c67fbd Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_bandages3.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_clean.p3d b/addons/medical_treatment/data/littergeneric_clean.p3d new file mode 100644 index 0000000000..41cbf34824 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_clean.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_epinephrine.p3d b/addons/medical_treatment/data/littergeneric_epinephrine.p3d new file mode 100644 index 0000000000..0d08f978cc Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_epinephrine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_gloves.p3d b/addons/medical_treatment/data/littergeneric_gloves.p3d new file mode 100644 index 0000000000..538935cf22 Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_gloves.p3d differ diff --git a/addons/medical/data/littergeneric_gloves.rvmat b/addons/medical_treatment/data/littergeneric_gloves.rvmat similarity index 88% rename from addons/medical/data/littergeneric_gloves.rvmat rename to addons/medical_treatment/data/littergeneric_gloves.rvmat index 0a0df2c55c..fdcfa17688 100644 --- a/addons/medical/data/littergeneric_gloves.rvmat +++ b/addons/medical_treatment/data/littergeneric_gloves.rvmat @@ -8,7 +8,7 @@ PixelShaderID="NormalMapSpecularDIMap"; VertexShaderID="NormalMap"; class Stage1 { - texture="z\ace\addons\medical\data\littergeneric_gloves_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\littergeneric_gloves_nohq.paa"; uvSource="tex"; class uvTransform { diff --git a/addons/medical/data/littergeneric_gloves_co.paa b/addons/medical_treatment/data/littergeneric_gloves_co.paa similarity index 100% rename from addons/medical/data/littergeneric_gloves_co.paa rename to addons/medical_treatment/data/littergeneric_gloves_co.paa diff --git a/addons/medical/data/littergeneric_gloves_nohq.paa b/addons/medical_treatment/data/littergeneric_gloves_nohq.paa similarity index 100% rename from addons/medical/data/littergeneric_gloves_nohq.paa rename to addons/medical_treatment/data/littergeneric_gloves_nohq.paa diff --git a/addons/medical_treatment/data/littergeneric_morphine.p3d b/addons/medical_treatment/data/littergeneric_morphine.p3d new file mode 100644 index 0000000000..f33b0120da Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_morphine.p3d differ diff --git a/addons/medical_treatment/data/littergeneric_packingbandage.p3d b/addons/medical_treatment/data/littergeneric_packingbandage.p3d new file mode 100644 index 0000000000..abd840cafb Binary files /dev/null and b/addons/medical_treatment/data/littergeneric_packingbandage.p3d differ diff --git a/addons/medical/data/littergeneric_packingbandage.rvmat b/addons/medical_treatment/data/littergeneric_packingbandage.rvmat similarity index 86% rename from addons/medical/data/littergeneric_packingbandage.rvmat rename to addons/medical_treatment/data/littergeneric_packingbandage.rvmat index 8deaff550f..25c9315da1 100644 --- a/addons/medical/data/littergeneric_packingbandage.rvmat +++ b/addons/medical_treatment/data/littergeneric_packingbandage.rvmat @@ -7,7 +7,7 @@ PixelShaderID="NormalMapSpecularDIMap"; VertexShaderID="NormalMap"; class Stage1 { - texture="z\ace\addons\medical\data\littergeneric_packingbandage_nohq.paa"; + texture="z\ace\addons\medical_treatment\data\littergeneric_packingbandage_nohq.paa"; uvSource="tex"; class uvTransform { diff --git a/addons/medical/data/littergeneric_packingbandage_nohq.paa b/addons/medical_treatment/data/littergeneric_packingbandage_nohq.paa similarity index 100% rename from addons/medical/data/littergeneric_packingbandage_nohq.paa rename to addons/medical_treatment/data/littergeneric_packingbandage_nohq.paa diff --git a/addons/medical/data/medical_co.paa b/addons/medical_treatment/data/medical_co.paa similarity index 100% rename from addons/medical/data/medical_co.paa rename to addons/medical_treatment/data/medical_co.paa diff --git a/addons/medical/data/model.cfg b/addons/medical_treatment/data/model.cfg similarity index 100% rename from addons/medical/data/model.cfg rename to addons/medical_treatment/data/model.cfg diff --git a/addons/medical_treatment/data/morphine.p3d b/addons/medical_treatment/data/morphine.p3d new file mode 100644 index 0000000000..93f0b965a2 Binary files /dev/null and b/addons/medical_treatment/data/morphine.p3d differ diff --git a/addons/medical_treatment/data/packingbandage.p3d b/addons/medical_treatment/data/packingbandage.p3d new file mode 100644 index 0000000000..7442a1e68d Binary files /dev/null and b/addons/medical_treatment/data/packingbandage.p3d differ diff --git a/addons/medical_treatment/data/packingbandage.rvmat b/addons/medical_treatment/data/packingbandage.rvmat new file mode 100644 index 0000000000..fcf42db5d1 --- /dev/null +++ b/addons/medical_treatment/data/packingbandage.rvmat @@ -0,0 +1,32 @@ +ambient[]={1,1,1,1}; +diffuse[]={0.5,0.5,0.5,1}; +forcedDiffuse[]={0.5,0.5,0.5,0}; +emmisive[]={0,0,0,0}; +specular[]={0,0,0,0}; +specularPower=0; +PixelShaderID="NormalMapSpecularDIMap"; +VertexShaderID="NormalMap"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\packingbandage_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture= "#(argb,8,8,3)color(0,0,0,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={0,0,0}; + up[]={0,0,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/medical/data/packingbandage_co.paa b/addons/medical_treatment/data/packingbandage_co.paa similarity index 100% rename from addons/medical/data/packingbandage_co.paa rename to addons/medical_treatment/data/packingbandage_co.paa diff --git a/addons/medical/data/packingbandage_nohq.paa b/addons/medical_treatment/data/packingbandage_nohq.paa similarity index 100% rename from addons/medical/data/packingbandage_nohq.paa rename to addons/medical_treatment/data/packingbandage_nohq.paa diff --git a/addons/medical_treatment/data/surgical_kit.p3d b/addons/medical_treatment/data/surgical_kit.p3d new file mode 100644 index 0000000000..73de0d2469 Binary files /dev/null and b/addons/medical_treatment/data/surgical_kit.p3d differ diff --git a/addons/medical_treatment/data/surgical_kit.rvmat b/addons/medical_treatment/data/surgical_kit.rvmat new file mode 100644 index 0000000000..ed60fdd689 --- /dev/null +++ b/addons/medical_treatment/data/surgical_kit.rvmat @@ -0,0 +1,92 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.70399898,0.70399898,0.70399898,0}; +specularPower=70; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="z\ace\addons\medical_treatment\data\surgical_kit_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 +{ + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage5 +{ + texture="#(argb,8,8,3)color(0,0.05,1,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 +{ + texture="#(ai,32,128,1)fresnel(0.98,1.02)"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage7 +{ + texture="z\ace\addons\apl\data\env_co.tga"; + uvSource="tex"; + class uvTransform + { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/medical/data/surgical_kit_co.paa b/addons/medical_treatment/data/surgical_kit_co.paa similarity index 100% rename from addons/medical/data/surgical_kit_co.paa rename to addons/medical_treatment/data/surgical_kit_co.paa diff --git a/addons/medical/data/surgical_kit_metal.rvmat b/addons/medical_treatment/data/surgical_kit_metal.rvmat similarity index 100% rename from addons/medical/data/surgical_kit_metal.rvmat rename to addons/medical_treatment/data/surgical_kit_metal.rvmat diff --git a/addons/medical/data/surgical_kit_nohq.paa b/addons/medical_treatment/data/surgical_kit_nohq.paa similarity index 100% rename from addons/medical/data/surgical_kit_nohq.paa rename to addons/medical_treatment/data/surgical_kit_nohq.paa diff --git a/addons/medical_treatment/data/tourniquet.p3d b/addons/medical_treatment/data/tourniquet.p3d new file mode 100644 index 0000000000..841279b5ae Binary files /dev/null and b/addons/medical_treatment/data/tourniquet.p3d differ diff --git a/addons/medical/data/tourniquet_co.paa b/addons/medical_treatment/data/tourniquet_co.paa similarity index 100% rename from addons/medical/data/tourniquet_co.paa rename to addons/medical_treatment/data/tourniquet_co.paa diff --git a/addons/medical_treatment/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical_treatment/functions/fnc_actionCheckBloodPressure.sqf new file mode 100644 index 0000000000..6c5c17a151 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_actionCheckBloodPressure.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Action for checking the blood pressure of the patient + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart"]; + +[QGVAR(actionCheckBloodPressureLocal), [_caller, _target, _bodyPart], _target] call CBA_fnc_targetEvent; + +true diff --git a/addons/medical_treatment/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical_treatment/functions/fnc_actionCheckBloodPressureLocal.sqf new file mode 100644 index 0000000000..c0a995e3cd --- /dev/null +++ b/addons/medical_treatment/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for checking the blood pressure of a patient + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart"]; + +private _bloodPressure = [0, 0]; + +if (alive _target && {!([_target, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { + _bloodPressure = GET_BLOOD_PRESSURE(_target); +}; + +private _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_6); +private _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_NoBloodpressure); + +_bloodPressure params ["_bloodPressureLow", "_bloodPressureHigh"]; + +if (_bloodPressureHigh > 20) then { + if (_caller call FUNC(isMedic)) then { + _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_1); + _logOutPut = format ["%1/%2", round _bloodPressureHigh, round _bloodPressureLow]; + } else { + if (_bloodPressureHigh > 20) then { + _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_2); + _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_Low); + + if (_bloodPressureHigh > 100) then { + _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_3); + _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_Normal); + + if (_bloodPressureHigh > 160) then { + _bloodPressureOutput = ELSTRING(medical_treatment,Check_Bloodpressure_Output_4); + _logOutPut = ELSTRING(medical_treatment,Check_Bloodpressure_High); + }; + }; + }; + }; +}; + +[QEGVAR(common,displayTextStructured), [[_bloodPressureOutput, _target call EFUNC(common,getName), round _bloodPressureHigh, round _bloodPressureLow], 1.75, _caller], _caller] call CBA_fnc_targetEvent; + +if (_logOutPut != "") then { + [_target, "activity", ELSTRING(medical_treatment,Check_Bloodpressure_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); + [_target, "quick_view", ELSTRING(medical_treatment,Check_Bloodpressure_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); +}; diff --git a/addons/medical_treatment/functions/fnc_actionCheckPulse.sqf b/addons/medical_treatment/functions/fnc_actionCheckPulse.sqf new file mode 100644 index 0000000000..29afe8a60e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_actionCheckPulse.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Action for checking the pulse or heart rate of the patient + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart"]; + +[QGVAR(actionCheckPulseLocal), [_caller, _target, _bodyPart], _target] call CBA_fnc_targetEvent; + +true diff --git a/addons/medical_treatment/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical_treatment/functions/fnc_actionCheckPulseLocal.sqf new file mode 100644 index 0000000000..585ba4c7d8 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_actionCheckPulseLocal.sqf @@ -0,0 +1,54 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Local callback for checking the pulse of a patient + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart"]; + +private _heartRate = 0; + +if (alive _target && {!([_target, _bodyPart] call FUNC(hasTourniquetAppliedTo))}) then { + _heartRate = GET_HEART_RATE(_target); +}; + +private _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_5); +private _logOutPut = ELSTRING(medical_treatment,Check_Pulse_None); + +if (_heartRate > 1.0) then { + if (_caller call FUNC(isMedic)) then { + _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_1); + _logOutPut = format ["%1", round(_heartRate)]; + } else { + // non medical personel will only find a pulse/HR + _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_2); + _logOutPut = ELSTRING(medical_treatment,Check_Pulse_Weak); + + if (_heartRate > 60) then { + if (_heartRate > 100) then { + _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_3); + _logOutPut = ELSTRING(medical_treatment,Check_Pulse_Strong); + } else { + _heartRateOutput = ELSTRING(medical_treatment,Check_Pulse_Output_4); + _logOutPut = ELSTRING(medical_treatment,Check_Pulse_Normal); + }; + }; + }; +}; + +[QEGVAR(common,displayTextStructured), [[_heartRateOutput, _target call EFUNC(common,getName), round _heartRate], 1.5, _caller], _caller] call CBA_fnc_targetEvent; + +if (_logOutPut != "") then { + [_target, "activity", ELSTRING(medical_treatment,Check_Pulse_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); + [_target, "quick_view", ELSTRING(medical_treatment,Check_Pulse_Log), [_caller call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); +}; diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical_treatment/functions/fnc_actionCheckResponse.sqf similarity index 56% rename from addons/medical/functions/fnc_actionCheckResponse.sqf rename to addons/medical_treatment/functions/fnc_actionCheckResponse.sqf index 58e8219be9..7bf7cf7c5c 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical_treatment/functions/fnc_actionCheckResponse.sqf @@ -11,16 +11,16 @@ * None * * Example: - * [bob, kevin] call ACE_medical_fnc_actionCheckResponse + * [bob, kevin] call ace_medical_treatment_fnc_actionCheckResponse * * Public: No */ params ["_caller", "_target"]; -private _output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select ([_target] call EFUNC(common,isAwake)); +private _output = [ELSTRING(medical_treatment,Check_Response_Unresponsive), ELSTRING(medical_treatment,Check_Response_Responsive)] select (_target call EFUNC(common,isAwake)); -[QEGVAR(common,displayTextStructured), [[_output, [_target] call EFUNC(common,getName)], 2, _caller], [_caller]] call CBA_fnc_targetEvent; +[QEGVAR(common,displayTextStructured), [[_output, _target call EFUNC(common,getName)], 2, _caller], _caller] call CBA_fnc_targetEvent; [_target ,"activity", _output, [[_target, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); [_target, "quick_view", _output, [[_target, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical_treatment/functions/fnc_actionDiagnose.sqf b/addons/medical_treatment/functions/fnc_actionDiagnose.sqf new file mode 100644 index 0000000000..6e9eda9610 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_actionDiagnose.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* +* Author: Glowbal +* Action for diagnosing in basic medical +* +* Arguments: +* 0: The medic +* 1: The patient +* +* Return Value: +* None +* +* Public: No +*/ + +params ["_caller", "_target"]; + +private _genericMessages = [ELSTRING(medical_treatment,diagnoseMessage), _target call EFUNC(common,getName)]; + +if (alive _target) then { + _genericMessages pushBack ELSTRING(medical_treatment,diagnoseAlive); +} else { + _genericMessages pushBack ELSTRING(medical_treatment,diagnoseDead); +}; + +private _hemorrhage = GET_HEMORRHAGE(_target); +if (_hemorrhage > 0) then { + if (_hemorrhage > 1) then { + _genericMessages pushBack ELSTRING(medical_treatment,lostBloodALot); + } else { + _genericMessages pushBack ELSTRING(medical_treatment,lostBlood); + }; +} else { + _genericMessages pushBack ELSTRING(medical_treatment,noBloodloss); +}; + +if (alive _target) then { + if IS_IN_PAIN(_target) then { + _genericMessages pushBack ELSTRING(medical_treatment,inPain); + } else { + _genericMessages pushBack ELSTRING(medical_treatment,noPain); + }; +}; + +[QEGVAR(common,displayTextStructured), [_genericMessages, 3.0, _caller], _caller] call CBA_fnc_targetEvent; diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical_treatment/functions/fnc_actionLoadUnit.sqf similarity index 68% rename from addons/medical/functions/fnc_actionLoadUnit.sqf rename to addons/medical_treatment/functions/fnc_actionLoadUnit.sqf index dd56a4074a..d4e6b57dc4 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_actionLoadUnit.sqf @@ -9,10 +9,10 @@ * 2: The vehicle (default: objNull) * * Return Value: - * None + * Vehicle they are loaded into (objNull on failure) * * Example: - * [bob, kevin] call ACE_medical_fnc_actionLoadUnit + * [bob, kevin] call ace_medical_treatment_treatment_fnc_actionLoadUnit * * Public: No */ @@ -20,12 +20,14 @@ params ["_caller", "_target", ["_vehicle", objNull]]; if ([_target] call EFUNC(common,isAwake)) exitWith { - [QEGVAR(common,displayTextStructured), [[LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; + [QEGVAR(common,displayTextStructured), [[ELSTRING(medical,CanNotLoaded), _target call EFUNC(common,getName)], 1.5, _caller], _caller] call CBA_fnc_targetEvent; }; -if ([_target] call FUNC(isBeingCarried)) then { + +if ([_target] call EFUNC(medical_status,isBeingCarried)) then { [_caller, _target] call EFUNC(dragging,dropObject_carry); }; -if ([_target] call FUNC(isBeingDragged)) then { + +if ([_target] call EFUNC(medical_status,isBeingDragged)) then { [_caller, _target] call EFUNC(dragging,dropObject); }; @@ -36,3 +38,5 @@ if (!isNull _vehicle) then { private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); [[_hint, _itemName, _vehicleName], 3.0] call EFUNC(common,displayTextStructured); }; + +_vehicle diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical_treatment/functions/fnc_actionPlaceInBodyBag.sqf similarity index 68% rename from addons/medical/functions/fnc_actionPlaceInBodyBag.sqf rename to addons/medical_treatment/functions/fnc_actionPlaceInBodyBag.sqf index b4f53370aa..0069e74e67 100644 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ b/addons/medical_treatment/functions/fnc_actionPlaceInBodyBag.sqf @@ -11,9 +11,9 @@ * body bag (will return objNull when run where target is not local) * * Example: - * [player, cursorTarget] call ace_medical_fnc_actionPlaceInBodyBag + * [player, cursorTarget] call ace_medical_treatment_fnc_actionPlaceInBodyBag * - * Public: Yes + * Public: No */ params ["_caller", "_target"]; @@ -21,23 +21,23 @@ TRACE_2("params",_caller,_target); if (!local _target) exitWith { TRACE_1("running where local",local _target); - [QGVAR(actionPlaceInBodyBag), [_caller, _target], [_target]] call CBA_fnc_targetEvent; + [QGVAR(actionPlaceInBodyBag), [_caller, _target], _target] call CBA_fnc_targetEvent; objNull }; if (alive _target) then { TRACE_1("manually killing with setDead",_target); - [_target, true] call FUNC(setDead); + [_target, true, "buried_alive"] call EFUNC(medical_status,setDead); }; private _position = (getPosASL _target) vectorAdd [0, 0, 0.2]; -private _headPos = _target modelToWorldVisual (_target selectionPosition "head"); +private _headPos = _target modelToWorldVisual (_target selectionPosition "head"); private _spinePos = _target modelToWorldVisual (_target selectionPosition "Spine3"); private _dirVect = _headPos vectorFromTo _spinePos; private _direction = _dirVect call CBA_fnc_vectDir; -//move the body away now, so it won't physX the bodyBag object (this setPos seems to need to be called where object is local) +// move the body away now, so it won't physX the bodyBag object (this setPos seems to need to be called where object is local) _target setPosASL [-5000, -5000, 0]; private _bodyBag = createVehicle ["ACE_bodyBagObject", _position, [], 0, "NONE"]; @@ -46,6 +46,6 @@ private _bodyBag = createVehicle ["ACE_bodyBagObject", _position, [], 0, "NONE"] _bodyBag setPosASL _position; _bodyBag setDir _direction; -["ace_placedInBodyBag", [_target, _bodyBag]] call CBA_fnc_globalEvent; //hide and delete body on server +["ace_placedInBodyBag", [_target, _bodyBag]] call CBA_fnc_globalEvent; // hide and delete body on server _bodyBag diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical_treatment/functions/fnc_actionUnloadUnit.sqf similarity index 65% rename from addons/medical/functions/fnc_actionUnloadUnit.sqf rename to addons/medical_treatment/functions/fnc_actionUnloadUnit.sqf index e98c01fd2b..d69b2a7c64 100644 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_actionUnloadUnit.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [bob, kevin, false] call ACE_medical_fnc_actionUnloadUnit + * [bob, kevin, false] call ace_medical_treatment_fnc_actionUnloadUnit * * Public: No */ @@ -20,7 +20,7 @@ params ["_caller", "_target", ["_drag", false]]; // cannot unload a unit not in a vehicle. -if (vehicle _target == _target) exitWith {}; -if (([_target] call EFUNC(common,isAwake))) exitWith {}; +if (vehicle _target == _target) exitWith {WARNING_1("Unit [%1] not in vehicle",_target);}; +if (_target call EFUNC(common,isAwake)) exitWith {WARNING_1("Unit [%1] is awake",_target);}; ["ace_unloadPersonEvent", [_target, vehicle _target, _caller], _target] call CBA_fnc_targetEvent; diff --git a/addons/medical/functions/fnc_addLoadPatientActions.sqf b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf similarity index 89% rename from addons/medical/functions/fnc_addLoadPatientActions.sqf rename to addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf index 0b0b64fb69..3448793847 100644 --- a/addons/medical/functions/fnc_addLoadPatientActions.sqf +++ b/addons/medical_treatment/functions/fnc_addLoadPatientActions.sqf @@ -10,7 +10,7 @@ * Child actions * * Example: - * [kevin] call ace_medical_fnc_addLoadPatientActions + * [kevin] call ace_medical_treatment_fnc_addLoadPatientActions * * Public: No */ diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical_treatment/functions/fnc_addToLog.sqf similarity index 73% rename from addons/medical/functions/fnc_addToLog.sqf rename to addons/medical_treatment/functions/fnc_addToLog.sqf index dadab94a2a..077cfc73ab 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical_treatment/functions/fnc_addToLog.sqf @@ -13,9 +13,9 @@ * None * * Example: - * [bob, "type", "message", [_args]] call ace_medical_fnc_addToLog + * [bob, "type", "message", [_args]] call ace_medical_treatment_fnc_addToLog * - * Public: Yes + * Public: No */ params ["_unit", "_type", "_message", "_arguments"]; @@ -26,27 +26,31 @@ if (!local _unit) exitWith { date params ["", "", "", "_hour", "_minute"]; -private _moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute]; -private _logVarName = format[QGVAR(logFile_%1), _type]; - +private _moment = format [["%1:%2", "%1:0%2"] select (_minute < 10), _hour, _minute]; +private _logVarName = format [QEGVAR(medical,logFile_%1), _type]; private _log = _unit getVariable [_logVarName, []]; + if (count _log >= 8) then { private _newLog = []; + { // ensure the first element will not be added if (_forEachIndex > 0) then { _newLog pushBack _x; }; } forEach _log; + _log = _newLog; }; + _log pushBack [_message, _moment, _type, _arguments]; _unit setVariable [_logVarName, _log, true]; ["ace_medicalLogEntryAdded", [_unit, _type, _message, _arguments]] call CBA_fnc_localEvent; -private _logs = _unit getVariable [QGVAR(allLogs), []]; +private _logs = _unit getVariable [QEGVAR(medical,allLogs), []]; + if !(_logVarName in _logs) then { _logs pushBack _logVarName; - _unit setVariable [QGVAR(allLogs), _logs, true]; + _unit setVariable [QEGVAR(medical,allLogs), _logs, true]; }; diff --git a/addons/medical/functions/fnc_addToTriageCard.sqf b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf similarity index 65% rename from addons/medical/functions/fnc_addToTriageCard.sqf rename to addons/medical_treatment/functions/fnc_addToTriageCard.sqf index 9b240846bc..3d67d3288c 100644 --- a/addons/medical/functions/fnc_addToTriageCard.sqf +++ b/addons/medical_treatment/functions/fnc_addToTriageCard.sqf @@ -5,15 +5,15 @@ * * Arguments: * 0: The patient - * 1: The new item classname + * 1: The new item class name * * Return Value: * None * * Example: - * [bob, "bandage"] call ace_medical_fnc_addToTriageCard + * [bob, "bandage"] call ace_medical_treatment_fnc_addToTriageCard * - * Public: Yes + * Public: No */ params ["_unit", "_newItem"]; @@ -22,17 +22,18 @@ if (!local _unit) exitWith { [QGVAR(addToTriageCard), _this, _unit] call CBA_fnc_targetEvent; }; -private _log = _unit getVariable [QGVAR(triageCard), []]; +private _log = _unit getVariable [QEGVAR(medical,triageCard), []]; private _inList = false; private _amount = 1; + { - if ((_x select 0) == _newItem) exitWith { + if (_x select 0 == _newItem) exitWith { private _info = _log select _forEachIndex; - _info set [1,(_info select 1) + 1]; + _info set [1, (_info select 1) + 1]; _info set [2, CBA_missionTime]; _log set [_forEachIndex, _info]; - _amount = (_info select 1); + _amount = _info select 1; _inList = true; }; } forEach _log; @@ -40,5 +41,6 @@ private _amount = 1; if (!_inList) then { _log pushBack [_newItem, 1, CBA_missionTime]; }; -_unit setVariable [QGVAR(triageCard), _log, true]; + +_unit setVariable [QEGVAR(medical,triageCard), _log, true]; ["ace_triageCardItemAdded", [_unit, _newItem, _amount]] call CBA_fnc_localEvent; diff --git a/addons/medical/functions/fnc_bodyCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf similarity index 85% rename from addons/medical/functions/fnc_bodyCleanupLoop.sqf rename to addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf index 31d1ef8b92..a11c9a7a25 100644 --- a/addons/medical/functions/fnc_bodyCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Glowbal, esteldunedain - * Loop that cleans up litter + * Loop that cleans up player bodies that were replaced by bodybags * * Arguments: * None @@ -10,7 +10,7 @@ * None * * Example: - * call ACE_medical_fnc_bodyCleanupLoop + * call ace_medical_treatment_fnc_bodyCleanupLoop * * Public: No */ diff --git a/addons/medical_treatment/functions/fnc_calculateBlood.sqf b/addons/medical_treatment/functions/fnc_calculateBlood.sqf new file mode 100644 index 0000000000..074022ed29 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_calculateBlood.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Calculate the blood lost and blood volume for a unit. Used from CPR to simulate a heart rate while in cardiac arrest. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Public: No + */ + +params["_unit"]; + +// We will just simulate blood flow for now! +private _lastTimeUpdated = _unit getVariable [QEGVAR(medical,lastTimeUpdated), CBA_missionTime]; +private _deltaT = CBA_missionTime - _lastTimeUpdated; + +private _lastTimeValuesSynced = _unit getVariable [QEGVAR(medical,lastMomentValuesSynced), 0]; +private _syncValues = (CBA_missionTime - _lastTimeValuesSynced) >= (10 + floor(random(10))); + +_unit setVariable [QEGVAR(medical,lastTimeUpdated), CBA_missionTime]; +if (_deltaT != 0) then { + private _change = ([_unit, _deltaT, _syncValues] call EFUNC(medical_status,getBloodVolumeChange)); + private _bloodVolume = 0 max (GET_BLOOD_VOLUME(_unit) + _change) min DEFAULT_BLOOD_VOLUME; + _unit setVariable [VAR_BLOOD_VOL, _bloodVolume, _syncValues]; +}; diff --git a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf b/addons/medical_treatment/functions/fnc_canAccessMedicalEquipment.sqf similarity index 51% rename from addons/medical/functions/fnc_canAccessMedicalEquipment.sqf rename to addons/medical_treatment/functions/fnc_canAccessMedicalEquipment.sqf index d73a70f657..3544022c2b 100644 --- a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf +++ b/addons/medical_treatment/functions/fnc_canAccessMedicalEquipment.sqf @@ -11,21 +11,18 @@ * Can Treat * * Example: - * [bob, target] call ace_medical_fnc_canAccessMedicalEquipment + * [bob, target] call ace_medical_treatment_fnc_canAccessMedicalEquipment * - * Public: Yes + * Public: No */ params ["_caller", "_target"]; private _accessLevel = _target getVariable [QGVAR(allowSharedEquipmentAccess), -1]; -private _return = false; - -if (_accessLevel >= 0) then { - if (_accessLevel == 0) exitWith { _return = true; }; - if (_accessLevel == 1) exitWith { _return = (side _target == side _caller); }; - if (_accessLevel == 2) exitWith { _return = (group _target == group _caller); }; +switch (_accessLevel) do { + case 0: { true }; + case 1: { side _target == side _caller }; + case 2: { group _target == group _caller }; + default { false }; }; - -_return; diff --git a/addons/medical_treatment/functions/fnc_canBandage.sqf b/addons/medical_treatment/functions/fnc_canBandage.sqf new file mode 100644 index 0000000000..315862c753 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canBandage.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Prevents bandage actions from showing if selected body part isn't bleeding. + * Toggles between showing all or only basic bandage action for advanced setting. + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * + * ReturnValue: + * Can Bandage + * + * Example: + * [player, cursorTarget, "Head", "FieldDressing"] call ace_medical_treatment_fnc_canBandage + * + * Public: No + */ + +params ["_medic", "_patient", "_bodypart", "_bandage"]; + +// Bandage type and bandage setting XNOR to show only active actions +if ((_bandage == "BasicBandage") isEqualTo GVAR(advancedBandages)) exitWith { false }; + +private _index = ALL_BODY_PARTS find toLower _bodypart; +private _canBandage = false; + +{ + _x params ["", "", "_bodyPartN", "_amountOf", "_bleeding"]; + + // If any single wound on the bodypart is bleeding bandaging can go ahead + if (_bodyPartN == _index && {_amountOf * _bleeding > 0}) exitWith { + _canBandage = true; + }; +} forEach (_patient getVariable [QEGVAR(medical,openWounds), []]); + +_canBandage diff --git a/addons/medical_treatment/functions/fnc_canStitch.sqf b/addons/medical_treatment/functions/fnc_canStitch.sqf new file mode 100644 index 0000000000..d4013d97f1 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canStitch.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Katalam + * Prevents stitch actions from showing if the body is either fully stitched or has no open wounds. + * + * Arguments: + * 0: The medic + * 1: The patient + * + * ReturnValue: + * Can Stitch + * + * Example: + * [player, cursorTarget] call ace_medical_treatment_fnc_canStitch + * + * Public: No + */ + +params ["", "_patient"]; + +!((_patient getVariable [QEGVAR(medical,bandagedWounds), []]) isEqualTo []) diff --git a/addons/medical_treatment/functions/fnc_canTreat.sqf b/addons/medical_treatment/functions/fnc_canTreat.sqf new file mode 100644 index 0000000000..26c981a02c --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canTreat.sqf @@ -0,0 +1,116 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Check if the treatment action can be performed. + * + * Arguments: + * 0: The caller + * 1: The target + * 2: Body part + * 3: Treatment class name + * + * ReturnValue: + * Can Treat + * + * Example: + * [player, cursorTarget, "Head", "SurgicalKit"] call ace_medical_treatment_fnc_canTreat + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart", "_className"]; + +if !(_target isKindOf "CAManBase") exitWith {false}; + +private _config = configFile >> QGVAR(Actions) >> _className; + +if !(isClass _config) exitWith {false}; + +// allow self treatment check +private _isSelf = _caller isEqualTo _target; +private _allowSelf = 0; + +if (_isSelf) then { + if (isNumber (_config >> "allowSelfTreatment")) then { + _allowSelf = getNumber (_config >> "allowSelfTreatment"); + } else { + if (isText (_config >> "allowSelfTreatment")) then { + _allowSelf = missionNamespace getVariable [getText (_config >> "allowSelfTreatment"), 0]; + }; + }; +}; + +if (_isSelf && {_allowSelf == 0}) exitWith {false}; + +private _medicRequired = 0; + +if (isNumber (_config >> "requiredMedic")) then { + _medicRequired = getNumber (_config >> "requiredMedic"); +} else { + if (isText (_config >> "requiredMedic")) then { + _medicRequired = missionNamespace getVariable [getText (_config >> "requiredMedic"), 0]; + }; +}; + +if !([_caller, _medicRequired] call FUNC(isMedic)) exitWith {false}; + +// check selection +private _allowedSelections = getArray (_config >> "allowedSelections") apply {toLower _x}; + +if !("all" in _allowedSelections || {(_bodyPart in _allowedSelections)}) exitWith {false}; + +// check item +private _items = getArray (_config >> "items"); + +if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitWith {false}; + +private _condition = true; + +if (isText (_config >> "condition")) then { + _condition = getText (_config >> "condition"); + + if (_condition isEqualTo "") exitWith { + _condition = true; + }; + + if (isNil _condition) then { + _condition = compile _condition; + } else { + _condition = missionNamespace getVariable _condition; + }; + + if !(_condition isEqualType false) then { + _condition = call _condition; + }; +}; + +if !(_condition) exitWith {false}; + +// check allowed locations +private _locations = getArray (_config >> "treatmentLocations") apply {toLower _x}; + +if ("all" in _locations) then { + _locations = true; +} else { + private _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; + private _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isInMedicalVehicle))}; + + { + if (_x == "field") exitWith { _locations = true; }; + if (_x == "MedicalFacility" && _medFacility) exitWith { _locations = true; }; + if (_x == "MedicalVehicle" && _medVeh) exitWith { _locations = true; }; + if !(isNil _x) exitWith { + _locations = missionNamespace getVariable _x; + + if !(_locations isEqualType false) then { + if (_locations isEqualTo 0) exitWith { _locations = true; }; //AdvancedMedicalSettings_anywhere + if (_locations isEqualTo 1) exitWith { _locations = call _medVeh; }; //AdvancedMedicalSettings_vehicle + if (_locations isEqualTo 2) exitWith { _locations = call _medFacility; }; //AdvancedMedicalSettings_facility + if (_locations isEqualTo 3) exitWith { _locations = call _medFacility || {call _medVeh}; }; //AdvancedMedicalSettings_vehicleAndFacility + _locations = false; //Disabled + }; + }; + } forEach _locations; +}; + +_locations diff --git a/addons/medical/functions/fnc_canTreatCached.sqf b/addons/medical_treatment/functions/fnc_canTreatCached.sqf similarity index 61% rename from addons/medical/functions/fnc_canTreatCached.sqf rename to addons/medical_treatment/functions/fnc_canTreatCached.sqf index 35fc3ada22..53ad59cdf4 100644 --- a/addons/medical/functions/fnc_canTreatCached.sqf +++ b/addons/medical_treatment/functions/fnc_canTreatCached.sqf @@ -7,19 +7,18 @@ * 0: The caller * 1: The target * 2: Selection name - * 3: ACE_Medical_Treatments Classname + * 3: ACE_Medical_Treatment Classname * * Return Value: * Can Treat * * Example: - * [bob, kevin, "selection", "classname"] call ACE_medical_fnc_canTreatCached + * [bob, kevin, "selection", "classname"] call ace_medical_treatment_fnc_canTreatCached * * Public: No */ -#define MAX_DURATION_CACHE 2 params ["", "_target", "_selection", "_classname"]; // parameters, function, namespace, uid -[_this, DFUNC(canTreat), _target, format [QGVAR(canTreat_%1_%2), _selection, _classname], MAX_DURATION_CACHE, QEGVAR(interact_menu,clearConditionCaches)] call EFUNC(common,cachedCall); +[_this, DFUNC(canTreat), _target, format [QGVAR(canTreat_%1_%2), _selection, _classname], CAN_TREAT_CONDITION_CACHE_EXPIRY, QEGVAR(interact_menu,clearConditionCaches)] call EFUNC(common,cachedCall); diff --git a/addons/medical_treatment/functions/fnc_checkItems.sqf b/addons/medical_treatment/functions/fnc_checkItems.sqf new file mode 100644 index 0000000000..4c2278a408 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_checkItems.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, commy2 + * Replaces vanilla items with ACE ones. + * + * Arguments: + * 0: The unit + * + * ReturnValue: + * None + * + * Public: No + */ + +if (EGVAR(medical,convertItems) == 2) exitWith {}; + +params ["_unit"]; + +private _countFirstAidKit = [_unit, "FirstAidKit"] call EFUNC(common,getCountOfItem); +_unit removeItems "FirstAidKit"; + +private _countMedikit = [_unit, "Medikit"] call EFUNC(common,getCountOfItem); +_unit removeItems "Medikit"; + +if (EGVAR(medical,convertItems) != 0) exitWith {}; + +for "_i" from 1 to _countFirstAidKit do { + _unit addItem "ACE_fieldDressing"; + _unit addItem "ACE_packingBandage"; + _unit addItem "ACE_morphine"; + _unit addItem "ACE_tourniquet"; +}; + +for "_i" from 1 to _countMedikit do { + _unit addItemToBackpack "ACE_fieldDressing"; + _unit addItemToBackpack "ACE_packingBandage"; + _unit addItemToBackpack "ACE_packingBandage"; + _unit addItemToBackpack "ACE_epinephrine"; + _unit addItemToBackpack "ACE_morphine"; + _unit addItemToBackpack "ACE_salineIV_250"; + _unit addItemToBackpack "ACE_tourniquet"; +}; diff --git a/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf new file mode 100644 index 0000000000..a136e1be4a --- /dev/null +++ b/addons/medical_treatment/functions/fnc_findMostEffectiveWound.sqf @@ -0,0 +1,73 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Finds the wound most effective to bandage on the given bodypart of the patient for the given bandage type. + * + * Arguments: + * 0: The patient + * 1: Treatment class name + * 2: Body part index + * + * Return Value: + * [Wound, Index, Effectiveness] + * + * Public: No + */ + +params ["_patient", "_bandage", "_partIndex"]; + +// Get the default effectiveness for the used bandage +private _config = configFile >> QUOTE(ADDON) >> "Bandaging"; +private _effectiveness = getNumber (_config >> "effectiveness"); + +if (isClass (_config >> _bandage)) then { + _config = (_config >> _bandage); + + if (isNumber (_config >> "effectiveness")) then { + _effectiveness = getNumber (_config >> "effectiveness"); + }; +}; + +// Iterate over open wounds to find the most effective target +private _openWounds = _patient getVariable [QEGVAR(medical,openWounds), []]; +if (_openWounds isEqualTo []) exitWith { [EMPTY_WOUND, -1, -1] }; + +private _wound = EMPTY_WOUND; +private _woundIndex = -1; +private _effectivenessFound = -1; + +{ + _x params ["", "_classID", "_partIndexN", "_amountOf", "_bleeding", "_damage", "_category"]; + + // Ignore wounds on other bodyparts + if (_partIndexN == _partIndex) then { + private _woundEffectiveness = _effectiveness; + + // Select the classname from the wound classname storage + private _suffix = ["Minor", "Medium", "Large"] select _category; + private _className = format ["%1%2", EGVAR(medical_damage,woundClassNames) select _classID, _suffix]; + + // Get the effectiveness of the bandage on this wound type + if (isClass (_config >> _className)) then { + private _woundTreatmentConfig = _config >> _className; + + if (isNumber (_woundTreatmentConfig >> "effectiveness")) then { + _woundEffectiveness = getNumber (_woundTreatmentConfig >> "effectiveness"); + }; + } else { + // Basic medical bandage just has a base level config (same effectivenes for all wound types) + if (_bandage != "BasicBandage") then { + WARNING_2("No config for wound type [%1] config base [%2]",_className,_config); + }; + }; + + // Track most effective found so far + if (_woundEffectiveness * _amountOf * _bleeding > _effectivenessFound * (_wound select 3) * (_wound select 4)) then { + _effectivenessFound = _woundEffectiveness; + _woundIndex = _forEachIndex; + _wound = _x; + }; + }; +} forEach _openWounds; + +[_wound, _woundIndex, _effectivenessFound] diff --git a/addons/medical_treatment/functions/fnc_getBandageTime.sqf b/addons/medical_treatment/functions/fnc_getBandageTime.sqf new file mode 100644 index 0000000000..442c7ee0b4 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getBandageTime.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: SilentSpike + * Calculates the time to bandage a wound based on it's size, the patient and the medic. + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * + * Return Value: + * Time in seconds + * + * Public: No + */ + +params ["_medic", "_patient", "_bodypart", "_bandage"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +if (_partIndex < 0) exitWith { 0 }; + +private _targetWound = [_patient, _bandage, _partIndex] call FUNC(findMostEffectiveWound); +_targetWound params ["_wound", "_woundIndex", "_effectiveness"]; + +// Everything is patched up on this body part already +if (_wound isEqualTo EMPTY_WOUND) exitWith { 0 }; + +_wound params ["", "", "", "_amountOf", "_bloodloss", "_damage", "_category"]; + +// Base bandage time is based on wound size and remaining percentage +private _bandageTime = ([ + BANDAGE_TIME_S, + BANDAGE_TIME_M, + BANDAGE_TIME_L +] select _category) * _amountOf; + +// Medics are more practised at applying bandages +if ([_medic] call FUNC(isMedic)) then { + _bandageTime = _bandageTime + BANDAGE_TIME_MOD_MEDIC; +}; + +// Bandaging yourself requires more work +if (_medic == _patient) then { + _bandageTime = _bandageTime + BANDAGE_TIME_MOD_SELF; +}; + +// Nobody can bandage instantly +_bandageTime max 1 diff --git a/addons/medical_treatment/functions/fnc_getTriageStatus.sqf b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf new file mode 100644 index 0000000000..de4f78a853 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_getTriageStatus.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, mharis001 + * Returns the current triage status of the unit. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Triage info + * 0: Status ID + * 1: Name + * 2: Color + * 3: Text color + * + * Example: + * [player] call ace_medical_treatment_fnc_getTriageStatus + * + * Public: No + */ + +params ["_unit"]; + +private _status = _unit getVariable [QEGVAR(medical,triageLevel), -1]; + +switch (_status) do { + case 1: {[1, localize LSTRING(Triage_Status_Minimal), [TRIAGE_COLOR_MINIMAL], [TRIAGE_TEXT_COLOR_MINIMAL]]}; + case 2: {[2, localize LSTRING(Triage_Status_Delayed), [TRIAGE_COLOR_DELAYED], [TRIAGE_TEXT_COLOR_DELAYED]]}; + case 3: {[3, localize LSTRING(Triage_Status_Immediate), [TRIAGE_COLOR_IMMEDIATE], [TRIAGE_TEXT_COLOR_IMMEDIATE]]}; + case 4: {[4, localize LSTRING(Triage_Status_Deceased), [TRIAGE_COLOR_DECEASED], [TRIAGE_TEXT_COLOR_DECEASED]]}; + default {[0, localize LSTRING(Triage_Status_None), [TRIAGE_COLOR_NONE], [TRIAGE_TEXT_COLOR_NONE]]}; +}; diff --git a/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf new file mode 100644 index 0000000000..472c91441e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_handleBandageOpening.sqf @@ -0,0 +1,118 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles the bandage of a patient. + * + * Arguments: + * 0: The target + * 1: The impact + * 2: Selection part number + * 3: Injury index + * 4: Injury + * 5: Used Bandage type + * + * Return Value: + * None + * + * Public: No + */ + +params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; + +private _classID = _injury select 1; +private _bodyPartN = _injury select 2; +private _category = _injury select 6; +private _postfix = ["Minor", "Medium", "Large"] select _category; +private _className = format ["%1%2", EGVAR(medical_damage,woundClassNames) select _classID, _postfix]; + +private _reopeningChance = DEFAULT_BANDAGE_REOPENING_CHANCE; +private _reopeningMinDelay = DEFAULT_BANDAGE_REOPENING_MIN_DELAY; +private _reopeningMaxDelay = DEFAULT_BANDAGE_REOPENING_MAX_DELAY; + +// Get the default values for the used bandage +private _config = configFile >> QUOTE(ADDON) >> "Bandaging"; + +if (isClass (_config >> _bandage)) then { + _config = _config >> _bandage; + _reopeningChance = getNumber (_config >> "reopeningChance"); + _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); + _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; +} else { + WARNING_2("No config for bandage [%1] config base [%2]", _bandage, _config); +}; + +if (isClass (_config >> _className)) then { + private _woundTreatmentConfig = _config >> _className; + + if (isNumber (_woundTreatmentConfig >> "reopeningChance")) then { + _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); + }; + + if (isNumber (_woundTreatmentConfig >> "reopeningMinDelay")) then { + _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); + }; + + if (isNumber (_woundTreatmentConfig >> "reopeningMaxDelay")) then { + _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; + }; +} else { + WARNING_2("No config for wound type [%1] config base [%2]", _className, _config); +}; +TRACE_5("configs",_bandage,_className,_reopeningChance,_reopeningMinDelay,_reopeningMaxDelay); + +private _bandagedWounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; +private _exist = false; +{ + _x params ["", "_id", "_partN", "_amountOf", "_bleeding", "_damage", "_oldCategory"]; + if (_id == _classID && {_partN == _bodyPartN && {_oldCategory == _category}}) exitWith { + _x set [3, _amountOf + _impact]; + _bandagedWounds set [_forEachIndex, _x]; + _exist = true; + }; +} forEach _bandagedWounds; + +if (!_exist) then { + private _bandagedInjury = +_injury; + _bandagedInjury set [3, _impact]; + _bandagedWounds pushBack _bandagedInjury; +}; + +_target setVariable [QEGVAR(medical,bandagedWounds), _bandagedWounds, true]; + +TRACE_1("",_reopeningChance); +// Check if we are ever going to reopen this +if (random 1 <= _reopeningChance) then { + private _delay = _reopeningMinDelay + random (_reopeningMaxDelay - _reopeningMinDelay); + TRACE_1("Will open",_delay); + [{ + params ["_target", "_impact", "_part", "_injuryIndex", "_injury"]; + TRACE_5("params",_target,_impact,_part,_injuryIndex,_injury); + + private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; + if (count _openWounds - 1 < _injuryIndex) exitWith {}; + + _injury params ["", "_classID", "_bodyPartN"]; + + private _selectedInjury = _openWounds select _injuryIndex; + if (_selectedInjury select 1 == _classID && {_selectedInjury select 2 == _bodyPartN}) then { // matching the IDs + private _bandagedWounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; + private _exist = false; + { + _x params ["", "_id", "_partN", "_amountOf", "_bleeding", "_damage", "_oldCategory"]; + if (_id == _classID && {_partN == _bodyPartN && {_oldCategory == _category}}) exitWith { + _x set [3, 0 max (_amountOf - _impact)]; + _bandagedWounds set [_forEachIndex, _x]; + _exist = true; + }; + } forEach _bandagedWounds; + + if (_exist) then { + TRACE_2("Reopening Wound",_bandagedWounds,_openWounds); + _selectedInjury set [3, (_selectedInjury select 3) + _impact]; + _openWounds set [_injuryIndex, _selectedInjury]; + _target setVariable [QEGVAR(medical,bandagedWounds), _bandagedWounds, true]; + _target setVariable [QEGVAR(medical,openWounds), _openWounds, true]; + }; + }; + }, [_target, _impact, _part, _injuryIndex, +_injury], _delay] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/medical_treatment/functions/fnc_hasItem.sqf b/addons/medical_treatment/functions/fnc_hasItem.sqf new file mode 100644 index 0000000000..f6e07b576e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_hasItem.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Check if the item is present between the patient and the medic + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Item + * + * Return Value: + * Has the items + * + * Example: + * [bob, patient, "bandage"] call ace_medical_treatment_fnc_hasItem + * + * Public: No + */ + +params ["_medic", "_patient", "_item"]; + +if (isNil QEGVAR(medical,setting_allowSharedEquipment)) then { + EGVAR(medical,setting_allowSharedEquipment) = true; +}; + +if (EGVAR(medical,setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { + true +}; + +if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { + true +}; + +private _hasItem = false; + +if (vehicle _medic != _medic && {vehicle _medic call FUNC(isMedicalVehicle)}) then { + { + if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {[_x, _item] call EFUNC(common,hasItem)}) exitWith { + _hasItem = true; + }; + } forEach crew vehicle _medic; +}; + +_hasItem diff --git a/addons/medical/functions/fnc_hasItems.sqf b/addons/medical_treatment/functions/fnc_hasItems.sqf similarity index 61% rename from addons/medical/functions/fnc_hasItems.sqf rename to addons/medical_treatment/functions/fnc_hasItems.sqf index 1ea0f15b65..c55ad47e34 100644 --- a/addons/medical/functions/fnc_hasItems.sqf +++ b/addons/medical_treatment/functions/fnc_hasItems.sqf @@ -12,22 +12,25 @@ * Has the items * * Example: - * [bob, patient, ["bandage", "morphine"]] call ace_medical_fnc_hasItems + * [bob, patient, ["bandage", "morphine"]] call ace_medical_treatment_fnc_hasItems * - * Public: Yes + * Public: No */ params ["_medic", "_patient", "_items"]; private _return = true; + { - // - if (_x isEqualType [] && {({[_medic, _patient, _x] call FUNC(hasItem)}count _x == 0)}) exitwith { + // handle a one of type use item + if (_x isEqualType [] && {{[_medic, _patient, _x] call FUNC(hasItem)} count _x == 0}) exitWith { _return = false; }; - if (_x isEqualType "" && {!([_medic, _patient, _x] call FUNC(hasItem))}) exitwith { + + // handle required item + if (_x isEqualType "" && {!([_medic, _patient, _x] call FUNC(hasItem))}) exitWith { _return = false; }; -}foreach _items; +} forEach _items; _return diff --git a/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf new file mode 100644 index 0000000000..d3f573cb55 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_hasTourniquetAppliedTo.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Check if unit has a tourniquet applied to the specified bodypart + * + * Arguments: + * 0: The Unit + * 1: Body Part + * + * Return Value: + * Has tourniquet applied + * + * Example: + * [player, "leftleg"] call ace_medical_treatment_fnc_hasTourniquetAppliedTo + * + * Public: No + */ + +params ["_target", "_bodyPart"]; + +private _index = ALL_BODY_PARTS find toLower _bodyPart; + +_index >= 0 && {HAS_TOURNIQUET_APPLIED_ON(_target,_index)} diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf b/addons/medical_treatment/functions/fnc_healTime.sqf similarity index 50% rename from addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf rename to addons/medical_treatment/functions/fnc_healTime.sqf index 35c9c5133f..0dcb1f74d2 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf +++ b/addons/medical_treatment/functions/fnc_healTime.sqf @@ -10,15 +10,23 @@ * treatment time * * Example: - * [_target] call ace_medical_fnc_treatmentAdvanced_fullHealTreatmentTime + * [_target] call ace_medical_treatment_fnc_healTime * * Public: No */ +params ["_unit"]; + private _totalDamage = 0; +private _treatTime = 0; { _totalDamage = _totalDamage + _x; -} forEach (_this getVariable [QGVAR(bodyPartStatus), []]); +} forEach (_unit getVariable [QEGVAR(medical,bodyPartDamage), []]); -(10 max (_totalDamage * 10) min 120) +if (EGVAR(medical,PAKTime) > 0) then { + _treatTime = EGVAR(medical,PAKTime); +} else { + _treatTime = 10 max (_totalDamage * 5) min 180; +}; +_treatTime diff --git a/addons/medical/functions/fnc_isInMedicalFacility.sqf b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf similarity index 77% rename from addons/medical/functions/fnc_isInMedicalFacility.sqf rename to addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf index 9d12bd9640..a9b01345b8 100644 --- a/addons/medical/functions/fnc_isInMedicalFacility.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf @@ -10,9 +10,9 @@ * Is in medical facility * * Example: - * [player] call ace_medical_fnc_isInMedicalFacility + * [player] call ace_medical_treatment_fnc_isInMedicalFacility * - * Public: Yes + * Public: No */ params ["_unit"]; @@ -44,20 +44,20 @@ private _medicalFacility = private _objects = (lineIntersectsWith [_unit modelToWorldVisual [0, 0, (_eyePos select 2)], _unit modelToWorldVisual [0, 0, (_eyePos select 2) +10], _unit]); { - if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitWith { + if (((typeOf _x) in _medicalFacility) || {_x getVariable [QEGVAR(medical,isMedicalFacility),false]}) exitWith { _isInBuilding = true; }; } forEach _objects; + if (!_isInBuilding) then { _objects = _unit nearObjects 7.5; { - if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitWith { + if (((typeOf _x) in _medicalFacility) || {_x getVariable [QEGVAR(medical,isMedicalFacility),false]}) exitWith { _isInBuilding = true; }; } forEach _objects; }; -//Save the results (with a 1 second expiry) -_unit setVariable [QGVAR(cacheInFacility), [CBA_missionTime + 1, _isInBuilding]]; +_unit setVariable [QGVAR(cacheInFacility), [CBA_missionTime + IN_MEDICAL_FACILITY_CACHE_EXPIRY, _isInBuilding]]; _isInBuilding; diff --git a/addons/medical/functions/fnc_isInMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf similarity index 68% rename from addons/medical/functions/fnc_isInMedicalVehicle.sqf rename to addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf index 77b36caa25..6c4d895492 100644 --- a/addons/medical/functions/fnc_isInMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalVehicle.sqf @@ -10,15 +10,16 @@ * Is unit in medical vehicle? * * Example: - * [player] call ace_medical_fnc_isInMedicalVehicle + * [player] call ace_medical_treatment_fnc_isInMedicalVehicle * - * Public: Yes + * Public: No */ params ["_unit"]; + private _vehicle = vehicle _unit; if (_unit == _vehicle) exitWith {false}; if (_unit in [driver _vehicle, gunner _vehicle, commander _vehicle]) exitWith {false}; -(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 +[_vehicle] call FUNC(isMedicalVehicle); diff --git a/addons/medical/functions/fnc_isMedic.sqf b/addons/medical_treatment/functions/fnc_isMedic.sqf similarity index 60% rename from addons/medical/functions/fnc_isMedic.sqf rename to addons/medical_treatment/functions/fnc_isMedic.sqf index 580733b4d5..65bbdcc853 100644 --- a/addons/medical/functions/fnc_isMedic.sqf +++ b/addons/medical_treatment/functions/fnc_isMedic.sqf @@ -11,20 +11,20 @@ * Is in of medic class * * Example: - * [player] call ace_medical_fnc_isMedic + * [player] call ace_medical_treatment_fnc_isMedic * - * Public: Yes + * Public: No */ params ["_unit", ["_medicN", 1]]; -private _class = _unit getVariable [QGVAR(medicClass), [0, 1] select (_unit getUnitTrait "medic")]; +private _class = _unit getVariable [QEGVAR(medical,medicClass), [0, 1] select (_unit getUnitTrait "medic")]; -if (_class >= _medicN min GVAR(medicSetting)) exitWith {true}; -if (!GVAR(increaseTrainingInLocations)) exitWith {false}; +if (_class >= _medicN) exitWith {true}; +if (!EGVAR(medical,increaseTrainingInLocations)) exitWith {false}; if (([_unit] call FUNC(isInMedicalVehicle)) || {[_unit] call FUNC(isInMedicalFacility)}) then { _class = _class + 1; //boost by one: untrained becomes medic, medic becomes doctor }; -_class >= _medicN min GVAR(medicSetting) +_class >= _medicN diff --git a/addons/medical/functions/fnc_isMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf similarity index 52% rename from addons/medical/functions/fnc_isMedicalVehicle.sqf rename to addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf index 26f2bd6850..d109a14e87 100644 --- a/addons/medical/functions/fnc_isMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf @@ -10,11 +10,11 @@ * Is in of medic class * * Example: - * [car] call ace_medical_fnc_isMedicalVehicle + * [cursorObject] call ace_medical_treatment_fnc_isMedicalVehicle * - * Public: Yes + * Public: No */ params ["_vehicle"]; -(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 +(_vehicle getVariable [QEGVAR(medical,medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 diff --git a/addons/medical/functions/fnc_litterCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf similarity index 67% rename from addons/medical/functions/fnc_litterCleanupLoop.sqf rename to addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf index 539ca74e26..20b2cc20ec 100644 --- a/addons/medical/functions/fnc_litterCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_litterCleanupLoop.sqf @@ -10,27 +10,31 @@ * None * * Example: - * call ACE_medical_fnc_litterCleanupLoop + * call ace_medical_treatment_fnc_litterCleanupLoop * * Public: No */ { _x params ["_time", "_objects"]; - //Older elements are always at the begining of the array: - if ((CBA_missionTime - _time) < GVAR(litterCleanUpDelay)) exitWith {}; + + // Older elements are always at the begining of the array + if (CBA_missionTime - _time < GVAR(litterCleanUpDelay)) exitWith {}; + TRACE_2("deleting",_time,_objects); { deleteVehicle _x; } forEach _objects; + GVAR(allCreatedLitter) set [_forEachIndex, objNull]; } forEach GVAR(allCreatedLitter); + GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; -// If no more litter remaining, exit the loop +// If no more litter remain, exit the loop if (GVAR(allCreatedLitter) isEqualTo []) exitWith { GVAR(litterPFHRunning) = false; }; // Schedule the loop to be executed again 30 sec later -[DFUNC(litterCleanupLoop), [], 30] call CBA_fnc_waitAndExecute; +[FUNC(litterCleanupLoop), [], 30] call CBA_fnc_waitAndExecute; diff --git a/addons/medical_treatment/functions/fnc_litterCreate.sqf b/addons/medical_treatment/functions/fnc_litterCreate.sqf new file mode 100644 index 0000000000..c923a6461e --- /dev/null +++ b/addons/medical_treatment/functions/fnc_litterCreate.sqf @@ -0,0 +1,98 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Spawns litter for the treatment action on the ground around the target + * + * Arguments: + * 0: The Caller + * 1: The target + * 2: The treatment Selection Name + * 3: The treatment classname + * 4: ? + * 5: Users of Items + * 6: Blood Loss on selection (previously called _previousDamage) + * + * Return Value: + * None + * + * Public: No + */ + +#define MIN_ENTRIES_LITTER_CONFIG 3 + +params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_bloodLossOnSelection"]; +TRACE_6("params",_caller,_target,_selectionName,_className,_usersOfItems,_bloodLossOnSelection); + +// Ensures comptibilty with other possible medical treatment configs +private _previousDamage = _bloodLossOnSelection; + +// Exit if litter is disabled by setting +if !(EGVAR(medical,allowLitterCreation)) exitWith {}; + +// Don't create litter if medic or patient are inside a vehicle +if (vehicle _caller != _caller || {vehicle _target != _target}) exitWith {}; + +private _config = configFile >> QGVAR(Actions) >> _className; +if !(isClass _config) exitWith {TRACE_1("No action config",_className);}; + +if !(isArray (_config >> "litter")) exitWith {TRACE_1("No litter config",_className);}; +private _litter = getArray (_config >> "litter"); + +private _createLitter = { + params ["_unit", "_litterClass"]; + + private _position = getPosASL _unit; + + // @TODO: handle carriers over water + // For now, don't spawn litter if we are over water to avoid floating litter + if (surfaceIsWater _position) exitWith {false}; + + _position = _position vectorAdd [ + random 2 - 1, + random 2 - 1, + 0 + ]; + + private _direction = random 360; + + // Create the litter, and timeout the event based on the cleanup delay + // The cleanup delay for events in MP is handled by the server side + TRACE_3("Creating Litter on server",_litterClass,_position,_direction); + [QGVAR(createLitterServer), [_litterClass, _position, _direction]] call CBA_fnc_serverEvent; + + true +}; + +{ + if (count _x < MIN_ENTRIES_LITTER_CONFIG) then { + WARNING_2("Wrong litter array: %1",_x); + } else { + _x params [ + ["_selection", "", [""]], + ["_litterCondition", "", [""]], + ["_litterOptions", [], [[]]] + ]; + + if (toLower _selection in [toLower _selectionName, "all"]) then { + if (_litterCondition isEqualTo "") then { + _litterCondition = {true}; + } else { + _litterCondition = compile _litterCondition; + }; + + // existing configs seem to use carried over magic variables. we pass them as arguments (_this) anyway + if !([_caller, _target, _selectionName, _className, _usersOfItems, _bloodLossOnSelection] call _litterCondition) exitWith {}; + + // Loop through through the litter options and place the litter + { + if (_x isEqualType "") then { + [_target, _x] call _createLitter; + }; + + if (_x isEqualType [] && {count _x > 0}) then { + [_target, selectRandom _x] call _createLitter; + }; + } foreach _litterOptions; + }; + }; +} foreach _litter; diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical_treatment/functions/fnc_litterHandleCreate.sqf similarity index 57% rename from addons/medical/functions/fnc_handleCreateLitter.sqf rename to addons/medical_treatment/functions/fnc_litterHandleCreate.sqf index 7a39fe767a..10cbc1f580 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical_treatment/functions/fnc_litterHandleCreate.sqf @@ -12,7 +12,7 @@ * None * * Example: - * ["litter", [2, 5, 6], bob] call ACE_medical_fnc_handleCreateLitter + * ["litter", [2, 5, 6], bob] call ace_medical_treatment_fnc_handleCreateLitter * * Public: No */ @@ -20,29 +20,40 @@ params ["_litterClass", "_position", "_direction"]; TRACE_3("params",_litterClass,_position,_direction); -//IGNORE_PRIVATE_WARNING(_values); +//IGNORE_PRIVATE_WARNING ["_values"]; if (isNil QGVAR(allCreatedLitter)) then { GVAR(allCreatedLitter) = []; GVAR(litterPFHRunning) = false; }; -private _p3dFile = getText (configFile >> "CfgVehicles" >> _litterClass >> "model"); -if (_p3dFile == "") exitWith {TRACE_2("no model",_litterClass,_p3dFile)}; +private _model = getText (configFile >> "CfgVehicles" >> _litterClass >> "model"); +if (_model == "") exitWith {TRACE_2("no model",_litterClass,_model)}; + // createSimpleObject expects a path without the leading slash -if ((_p3dFile select [0,1]) == "\") then {_p3dFile = _p3dFile select [1];}; +if (_model select [0,1] == "\") then { + _model = _model select [1]; +}; -private _litterObject = createSimpleObject [_p3dFile, [0,0,0]]; +private _litterObject = createSimpleObject [_model, [0,0,0]]; TRACE_2("created",_litterClass,_litterObject); -_litterObject setDir _direction; -_litterObject setPosATL _position; -// Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112 -[{ params ["_object", "_pos"]; _object setPosATL _pos; }, [_litterObject, _position]] call CBA_fnc_execNextFrame; -private _maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); -if ((count GVAR(allCreatedLitter)) > _maxLitterCount) then { +_litterObject setDir _direction; +_litterObject setPosASL _position; + +// Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112 +[{ + params ["_object", "_position"]; + + _object setPosASL _position; +}, [_litterObject, _position]] call CBA_fnc_execNextFrame; + +private _maxLitterCount = getArray (configFile >> "ACE_Settings" >> QEGVAR(medical,litterSimulationDetail) >> "_values") select EGVAR(medical,litterSimulationDetail); + +if (count GVAR(allCreatedLitter) > _maxLitterCount) then { // gank the first litter object, and spawn ours. private _oldLitter = GVAR(allCreatedLitter) deleteAt 0; + { deleteVehicle _x; } forEach (_oldLitter select 1); @@ -50,7 +61,7 @@ if ((count GVAR(allCreatedLitter)) > _maxLitterCount) then { GVAR(allCreatedLitter) pushBack [CBA_missionTime, [_litterObject]]; -if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { +if (!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { // Start the litter cleanup loop GVAR(litterPFHRunning) = true; call FUNC(litterCleanupLoop); diff --git a/addons/medical/functions/fnc_onMedicationUsage.sqf b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf similarity index 56% rename from addons/medical/functions/fnc_onMedicationUsage.sqf rename to addons/medical_treatment/functions/fnc_onMedicationUsage.sqf index ee45d60a39..2cb12cf389 100644 --- a/addons/medical/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf @@ -8,31 +8,30 @@ * 1: Medication Treatment classname * 2: The medication treatment variablename * 3: Max dosage - * 4: The time in the system - * 5: Incompatable medication > + * 4: Incompatable medication > * * Return Value: * None * * Example: - * [bob, "classname", "varname", 5, 6, ["stuff"]] call ACE_medical_fnc_onMedicationUsage + * [bob, "classname", "varname", 5, 6, ["stuff"]] call ace_medical_treatment_fnc_onMedicationUsage * * Public: No */ -params ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_viscosityChange", "_painReduce"]; -TRACE_8("params",_target,_className,_variable,_maxDosage,_timeInSystem,_incompatabileMeds,_viscosityChange,_painReduce); +params ["_target", "_className", "_variable", "_maxDosage", "_incompatabileMeds"]; +TRACE_5("params",_target,_className,_variable,_maxDosage,_incompatabileMeds); private _foundEntry = false; -private _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; +private _allUsedMedication = _target getVariable [QEGVAR(medical,allUsedMedication), []]; { _x params ["_variableX", "_allMedsFromClassname"]; - if (_variableX== _variable) exitWith { + if (_variableX == _variable) exitWith { if !(_className in _allMedsFromClassname) then { _allMedsFromClassname pushBack _className; _x set [1, _allMedsFromClassname]; _allUsedMedication set [_forEachIndex, _x]; - _target setVariable [QGVAR(allUsedMedication), _allUsedMedication]; + _target setVariable [QEGVAR(medical,allUsedMedication), _allUsedMedication]; }; _foundEntry = true; }; @@ -40,13 +39,12 @@ private _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; if (!_foundEntry) then { _allUsedMedication pushBack [_variable, [_className]]; - _target setVariable [QGVAR(allUsedMedication), _allUsedMedication]; + _target setVariable [QEGVAR(medical,allUsedMedication), _allUsedMedication]; }; - private _usedMeds = _target getVariable [_variable, 0]; -if (_usedMeds >= floor (_maxDosage + round(random(2))) && _maxDosage >= 1 && GVAR(enableOverdosing)) then { - [_target] call FUNC(setDead); +if (_usedMeds >= floor (_maxDosage + round(random(2))) && {_maxDosage >= 1}) then { + [QEGVAR(medical,CriticalVitals), _target] call CBA_fnc_localEvent; }; private _hasOverDosed = 0; @@ -60,8 +58,8 @@ private _hasOverDosed = 0; } forEach _allUsedMedication; } forEach _incompatabileMeds; -if (_hasOverDosed > 0 && GVAR(enableOverdosing)) then { - private _medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication"); +if (_hasOverDosed > 0) then { + private _medicationConfig = (configFile >> "ace_medical_treatment" >> "Medication"); private _onOverDose = getText (_medicationConfig >> "onOverDose"); if (isClass (_medicationConfig >> _className)) then { _medicationConfig = (_medicationConfig >> _className); @@ -74,9 +72,3 @@ if (_hasOverDosed > 0 && GVAR(enableOverdosing)) then { }; [_target, _className] call _onOverDose; }; - -private _decreaseAmount = 1 / _timeInSystem; -private _viscosityAdjustment = _viscosityChange / _timeInSystem; - -// Run the loop that computes the effect of the medication over time -[_target, _variable, 0, _decreaseAmount, _viscosityAdjustment, _painReduce / _timeInSystem] call FUNC(medicationEffectLoop); diff --git a/addons/medical/functions/fnc_serverRemoveBody.sqf b/addons/medical_treatment/functions/fnc_serverRemoveBody.sqf similarity index 88% rename from addons/medical/functions/fnc_serverRemoveBody.sqf rename to addons/medical_treatment/functions/fnc_serverRemoveBody.sqf index 3b85fb06a3..aa29cbc982 100644 --- a/addons/medical/functions/fnc_serverRemoveBody.sqf +++ b/addons/medical_treatment/functions/fnc_serverRemoveBody.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [cursorTarget] call ace_medical_fnc_serverRemoveBody + * [cursorTarget] call ace_medical_treatment_fnc_serverRemoveBody * * Public: No */ @@ -19,7 +19,7 @@ params ["_target"]; TRACE_2("",_target,isPlayer _target); -//Hide the body globaly +// Hide the body globaly [QEGVAR(common,hideObjectGlobal), [_target, true]] call CBA_fnc_serverEvent; if (isNil QGVAR(bodiesToDelete)) then {GVAR(bodiesToDelete) = [];}; diff --git a/addons/medical_treatment/functions/fnc_setTriageStatus.sqf b/addons/medical_treatment/functions/fnc_setTriageStatus.sqf new file mode 100644 index 0000000000..aee8326056 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_setTriageStatus.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Sets the traige status of the given unit. + * + * Arguments: + * 0: Unit + * 1: Status + * + * Return Value: + * None + * + * Example: + * [player, 2] call ace_medical_treatment_fnc_setTriageStatus + * + * Public: No + */ + +params ["_unit", "_status"]; + +_unit setVariable [QEGVAR(medical,triageLevel), _status, true]; diff --git a/addons/medical_treatment/functions/fnc_treatment.sqf b/addons/medical_treatment/functions/fnc_treatment.sqf new file mode 100644 index 0000000000..b76e6799ee --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatment.sqf @@ -0,0 +1,199 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, KoffeinFlummi + * Starts the treatment process + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart", "_className"]; + +// if the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine +if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened), false]) exitWith { + [DFUNC(treatment), _this] call CBA_fnc_execNextFrame; +}; + +if !([_caller, _target, _bodyPart, _className] call FUNC(canTreat)) exitWith {false}; + +private _config = configFile >> QGVAR(Actions) >> _className; +private _isSelf = _caller isEqualTo _target; + +// handle items +private _items = getArray (_config >> "items"); + +private _consumeItems = 0; + +if (isNumber (_config >> "itemConsumed")) then { + _consumeItems = getNumber (_config >> "itemConsumed"); +} else { + if (isText (_config >> "itemConsumed")) then { + _consumeItems = missionNamespace getVariable [getText (_config >> "itemConsumed"), 0]; + }; +}; + +private _usersOfItems = []; + +if (_consumeItems > 0) then { + _usersOfItems = ([_caller, _target, _items] call FUNC(useItems)) select 1; +}; + +// parse the config for the progress callback +private _callbackProgress = getText (_config >> "callbackProgress"); + +if (_callbackProgress isEqualTo "") then { + _callbackProgress = "true"; +}; + +if (isNil _callbackProgress) then { + _callbackProgress = compile _callbackProgress; +} else { + _callbackProgress = missionNamespace getVariable _callbackProgress; +}; + +// play animation +private _callerAnim = if (_isSelf) then { + getText (_config >> ["animationCallerSelf", "animationCallerSelfProne"] select (stance _caller == "PRONE")); +} else { + getText (_config >> ["animationCaller", "animationCallerProne"] select (stance _caller == "PRONE")); +}; + +_caller setVariable [QGVAR(selectedWeaponOnTreatment), weaponState _caller]; + +private _wpn = ["non", "rfl", "lnr", "pst"] param [["", primaryWeapon _caller, secondaryWeapon _caller, handgunWeapon _caller] find currentWeapon _caller, "non"]; + +_callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace; + +// this one is missing +if (_callerAnim == "AinvPknlMstpSlayWlnrDnon_medic") then { + _callerAnim = "AinvPknlMstpSlayWlnrDnon_medicOther"; +}; + +private _animDuration = GVAR(animDurations) getVariable _callerAnim; + +// these animations have transitions that take a bit longer... +if (weaponLowered _caller) then { + _animDuration = _animDuration + 0.5; + + // fix problems with lowered weapon transitions by raising the weapon first + if (currentWeapon _caller != "" && {_callerAnim != ""}) then { + _caller action ["WeaponInHand", _caller]; + }; +}; + +if (binocular _caller != "" && {binocular _caller == currentWeapon _caller}) then { + _animDuration = _animDuration + 1.0; +}; + +if (vehicle _caller == _caller && {_callerAnim != ""}) then { + private _endInAnim = "AmovP[pos]MstpS[stn]W[wpn]Dnon"; + + private _pos = ["knl", "pne"] select (stance _caller == "PRONE"); + private _stn = "non"; + + if (_wpn != "non") then { + _stn = ["ras", "low"] select (weaponLowered _caller); + }; + + _endInAnim = [_endInAnim, "[pos]", _pos] call CBA_fnc_replace; + _endInAnim = [_endInAnim, "[stn]", _stn] call CBA_fnc_replace; + _endInAnim = [_endInAnim, "[wpn]", _wpn] call CBA_fnc_replace; + TRACE_1("",_endInAnim); + + [_caller, _callerAnim] call EFUNC(common,doAnimation); + [_caller, _endInAnim] call EFUNC(common,doAnimation); + _caller setVariable [QGVAR(endInAnim), _endInAnim]; +}; + +// get treatment time from config - also supports variables and code expressions +private _treatmentTime = 0; + +if (isNumber (_config >> "treatmentTime")) then { + _treatmentTime = getNumber (_config >> "treatmentTime"); +} else { + if (isText (_config >> "treatmentTime")) then { + _treatmentTime = getText (_config >> "treatmentTime"); + + if (isNil _treatmentTime) then { + _treatmentTime = compile _treatmentTime; + } else { + _treatmentTime = missionNamespace getVariable _treatmentTime; + }; + + if !(_treatmentTime isEqualType 0) then { + _treatmentTime = call _treatmentTime; + }; + }; +}; +TRACE_1("",_treatmentTime); + +if (_treatmentTime == 0) exitWith { false }; + +// speed up animation depending on treatment time +if (!isNil "_animDuration") then { + [QEGVAR(common,setAnimSpeedCoef), [_caller, _animDuration / _treatmentTime]] call CBA_fnc_globalEvent; + TRACE_2("",_animDuration,_treatmentTime); +}; + +// play sound +if (isArray (_config >> "sounds")) then { + selectRandom getArray (_config >> "sounds") params ["_file", ["_volume", 1], ["_pitch", 1], ["_distance", 0]]; + TRACE_4("playSound3D",_file,_volume,_pitch,_distance); + playSound3D [ + _file, + objNull, + false, + getPosASL _caller, + _volume, + _pitch, + _distance + ]; +}; + +private _startCallback = getText (_config >> "callbackStart"); +if (isNil _startCallback) then { + _startCallback = compile _startCallback; +} else { + _startCallback = missionNamespace getVariable _startCallback; +}; + +if !(_startCallback isEqualType {}) then { + _startCallback = {TRACE_1("startCallback was NOT code",_startCallback)}; +}; + +[_caller, _target, _bodyPart, _className, _items, _usersOfItems] call _startCallback; + +// start treatment +[ + _treatmentTime, + [_caller, _target, _bodyPart, _className, _items, _usersOfItems], + DFUNC(treatment_success), + DFUNC(treatment_failure), + getText (_config >> "displayNameProgress"), + _callbackProgress, + ["isnotinside"] +] call EFUNC(common,progressBar); + +// display icon +private _iconDisplayed = getText (_config >> "actionIconPath"); + +if (_iconDisplayed != "") then { + [QGVAR(treatmentActionIcon), true, _iconDisplayed, [1,1,1,1], getNumber (_config >> "actionIconDisplayTime")] call EFUNC(common,displayIcon); +}; + +// handle display of text/hints +private _displayText = getText (_config >> ["displayTextOther", "displayTextSelf"] select _isSelf); + +if (_displayText != "") then { + [QEGVAR(common,displayTextStructured), [[_displayText, _caller call EFUNC(common,getName), _target call EFUNC(common,getName)], 1.5, _caller], _caller] call CBA_fnc_targetEvent; +}; + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentBandage.sqf b/addons/medical_treatment/functions/fnc_treatmentBandage.sqf new file mode 100644 index 0000000000..bb4ac5ed9b --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentBandage.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Bandage treatment callback + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * 4: Item + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart", "_className", "_items"]; + +[_target, "activity", ELSTRING(medical_treatment,Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity_view", ELSTRING(medical_treatment,Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message + +[QGVAR(treatmentBandageLocal), [_target, _className, _bodyPart], _target] call CBA_fnc_targetEvent; + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentBandageLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentBandageLocal.sqf new file mode 100644 index 0000000000..f3cd43cbdf --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentBandageLocal.sqf @@ -0,0 +1,46 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles the bandage of a patient. + * + * Arguments: + * 0: The patient + * 1: Treatment class name + * 2: Body part + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_target", "_bandage", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +if (_partIndex < 0) exitWith { false }; + +private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; +if (_openWounds isEqualTo []) exitWith { false }; + +// Figure out which injury for this bodypart is the best choice to bandage +// TODO also use up the remainder on left over injuries +private _targetWound = [_target, _bandage, _partIndex] call FUNC(findMostEffectiveWound); +_targetWound params ["_wound", "_woundIndex", "_effectiveness"]; + +// Everything is patched up on this body part already +if (_effectiveness == -1) exitWith {}; + +// Find the impact this bandage has and reduce the amount this injury is present +private _amountOf = _wound select 3; +private _impact = _effectiveness min _amountOf; +_wound set [3, _amountOf - _impact]; +_openWounds set [_woundIndex, _wound]; + +_target setVariable [QEGVAR(medical,openWounds), _openWounds, true]; + +// Handle the reopening of bandaged wounds +if (_impact > 0 && {GVAR(advancedBandages) && {GVAR(woundReopening)}}) then { + [_target, _impact, _partIndex, _woundIndex, _wound, _bandage] call FUNC(handleBandageOpening); +}; + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR.sqf new file mode 100644 index 0000000000..69adc04bc6 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentCPR.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Callback for the CPR treatment action on success. + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target", "_selectionName", "_className", "_items"]; + +_target setVariable [VAR_HEART_RATE, 0, true]; +_target setVariable [QGVAR(receiveCPR), false, true]; // CPR finished +[_target] call FUNC(calculateBlood); + +if (alive _target && {IN_CRDC_ARRST(_target)}) then { + [_target, "activity_view", ELSTRING(medical_treatment,Activity_cpr), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); + + [QGVAR(treatmentCPRLocal), [_caller, _target], _target] call CBA_fnc_targetEvent; +}; + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPRLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentCPRLocal.sqf new file mode 100644 index 0000000000..58d882d927 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentCPRLocal.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * local Callback for the CPR treatment action on success. + * + * Arguments: + * 0: The medic + * 1: The patient + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target"]; + +if ((random 1) >= 0.6) then { + [QEGVAR(medical,CPRSucceeded), _target] call CBA_fnc_localEvent; +}; + +[_target, "activity", ELSTRING(medical_treatment,Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity_view", ELSTRING(medical_treatment,Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR_failure.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR_failure.sqf new file mode 100644 index 0000000000..a09dfccba4 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentCPR_failure.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles the failure of the CPR treatment. + * + * Arguments: + * 0: The medic + * 1: The patient + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target"]; + +if (!(_target call EFUNC(common,isAwake)) || {IN_CRDC_ARRST(_target)}) then { + _target setVariable [VAR_HEART_RATE, 0, true]; +}; +_target setVariable [QGVAR(receiveCPR), false, true]; +[_target] call FUNC(calculateBlood); diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR_progress.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR_progress.sqf new file mode 100644 index 0000000000..f03f9708fd --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentCPR_progress.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles the progress of the CPR treatment. + * + * Arguments: + * 0: Arguments + * 0: Caller + * 1: Target + * 1: Elapsed Time + * 2: Total Time + * + * Return Value: + * May Treatment continue + * + * Public: No + */ + +params ["_args", "_elapsedTime", "_totalTime"]; +_args params ["_caller", "_target"]; + +// If the patient awakes by mysterious force, no cpr is needed! +if (_target call EFUNC(common,isAwake)) exitWith {false}; +if !IN_CRDC_ARRST(_target) exitWith {false}; + +[_target] call FUNC(calculateBlood); // Calculate blood volume. If their is no pulse, nothing happens! + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentCPR_start.sqf b/addons/medical_treatment/functions/fnc_treatmentCPR_start.sqf new file mode 100644 index 0000000000..642cd722a0 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentCPR_start.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: Zakant + * Handles the start of the CPR treatment. + * + * Arguments: + * 0: The medic + * 1: The patient + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target"]; + +_target setVariable [QGVAR(receiveCPR), true, true]; // Target receives CPR +if (EGVAR(medical,CPRcreatesPulse) && {GET_HEART_RATE(_target) == 0}) then { + _target setVariable [VAR_HEART_RATE, round (30 + random [-5, 0, 5]) , true]; // And we have a (random) pulse +}; + +_target setVariable [QEGVAR(medical,lastTimeUpdated), CBA_missionTime, true]; diff --git a/addons/medical_treatment/functions/fnc_treatmentFullHeal.sqf b/addons/medical_treatment/functions/fnc_treatmentFullHeal.sqf new file mode 100644 index 0000000000..8499d4f525 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentFullHeal.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Full heal treatment + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * 4: Item + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target"]; + +[QGVAR(treatmentFullHealLocal), [_target], _target] call CBA_fnc_targetEvent; + +[_target, "activity", ELSTRING(medical_treatment,Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity_view", ELSTRING(medical_treatment,Activity_fullHeal), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf new file mode 100644 index 0000000000..4dfa555828 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf @@ -0,0 +1,83 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles full heal of a patient. + * + * Arguments: + * 0: The patient + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_target"]; + +if (!alive _target) exitWith {}; + +// Treatment conditions would normally limit this to non-unconc units, but treatment event may be called externally (zeus) +if (_target getVariable [QEGVAR(medical,inCardiacArrest), false]) then { + TRACE_1("exiting cardiac arrest",_target); + [QEGVAR(medical,CPRSucceeded), _target] call CBA_fnc_localEvent; +}; +if (_target getVariable ["ACE_isUnconscious",false]) then { + TRACE_1("waking up",_target); // wake up first or unconc variables will be reset + [QEGVAR(medical,WakeUp), _target] call CBA_fnc_localEvent; +}; + + +_target setVariable [VAR_PAIN, 0, true]; +_target setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; + +// tourniquets +_target setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true]; +_target setVariable [QGVAR(occludedMedications), nil, true]; + +// wounds and injuries +_target setVariable [QEGVAR(medical,openWounds), [], true]; +_target setVariable [QEGVAR(medical,bandagedWounds), [], true]; +_target setVariable [QEGVAR(medical,stitchedWounds), [], true]; +_target setVariable [QEGVAR(medical,isLimping), false, true]; + +// vitals +_target setVariable [VAR_HEART_RATE, DEFAULT_HEART_RATE, true]; +_target setVariable [VAR_HEART_RATE_ADJ, [], true]; +_target setVariable [VAR_BLOOD_PRESS, [80, 120], true]; +_target setVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES, true]; +_target setVariable [VAR_PERIPH_RES_ADJ, [], true]; + +// IVs +_target setVariable [QEGVAR(medical,ivBags), nil, true]; + +// damage storage +_target setVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true]; +#ifdef DEBUG_TESTRESULTS +_target setVariable [QEGVAR(medical,bodyPartStatus), [0,0,0,0,0,0], true]; +#endif + +// generic medical admin +_target setVariable [VAR_CRDC_ARRST, false, true]; +_target setVariable [VAR_UNCON, false, true]; +_target setVariable [VAR_HEMORRHAGE, 0, true]; +_target setVariable [VAR_IS_BLEEDING, false, true]; +_target setVariable [VAR_IN_PAIN, false, true]; +_target setVariable [VAR_PAIN_SUPP, 0, true]; +_target setVariable [VAR_PAIN_SUPP_ADJ, [], true]; + +// medication +private _allUsedMedication = _target getVariable [QEGVAR(medical,allUsedMedication), []]; + +{ + _target setVariable [_x select 0, nil]; +} forEach _allUsedMedication; + +// Reset triage card since medication is all reset +_target setVariable [QEGVAR(medical,triageCard), [], true]; + +[_target, false] call EFUNC(medical_engine,setLimping); + +// Resetting damage +_target setDamage 0; + +[QEGVAR(medical,FullHeal), _target] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_treatmentIV.sqf b/addons/medical_treatment/functions/fnc_treatmentIV.sqf new file mode 100644 index 0000000000..e6f6be0e16 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentIV.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Patient IV Treatment callback + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * 4: Item + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart", "_className", "_items"]; + +if (_items isEqualTo []) exitWith {false}; + +_items params ["_removeItem"]; + +[QGVAR(treatmentIVLocal), [_target, _className, _bodyPart], _target] call CBA_fnc_targetEvent; + +[_target, _removeItem] call FUNC(addToTriageCard); +[_target, "activity", ELSTRING(medical_treatment,Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity_view", ELSTRING(medical_treatment,Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentIVLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentIVLocal.sqf new file mode 100644 index 0000000000..a7c3914313 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentIVLocal.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * IV Treatment local callback + * + * Arguments: + * 0: The patient + * 1: Treatment class name + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_target", "_treatmentClassname", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +if (_partIndex < 0) exitWith { false }; + +private _bloodVolume = GET_BLOOD_VOLUME(_target); + +if (_bloodVolume >= DEFAULT_BLOOD_VOLUME) exitWith {}; + +// Find the proper attributes for the used IV +private _config = configFile >> QUOTE(ADDON) >> "IV"; +private _volumeAdded = getNumber (_config >> "volume"); +private _type = getText (_config >> "type"); + +if (isClass (_config >> _treatmentClassname)) then { + _config = _config >> _treatmentClassname; + + if (isNumber (_config >> "volume")) then { + _volumeAdded = getNumber (_config >> "volume"); + }; + + if (isText (_config >> "type")) then { + _type = getText (_config >> "type"); + }; +} else { + ERROR("IV Treatment Classname not found"); +}; + +private _bloodBags = _target getVariable [QEGVAR(medical,ivBags), []]; +_bloodBags pushBack [_volumeAdded, _type, _partIndex]; + +_target setVariable [QEGVAR(medical,ivBags), _bloodBags, true]; diff --git a/addons/medical_treatment/functions/fnc_treatmentMedication.sqf b/addons/medical_treatment/functions/fnc_treatmentMedication.sqf new file mode 100644 index 0000000000..77fabe5bf8 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentMedication.sqf @@ -0,0 +1,34 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * IV Treatment callback + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * 4: Items Used + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart", "_className", "_items"]; +TRACE_5("params",_caller,_target,_bodyPart,_className,_items); + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +[QGVAR(treatmentMedicationLocal), [_target, _className, _partIndex], _target] call CBA_fnc_targetEvent; + +{ + if (_x != "") then { + [_target, _x] call FUNC(addToTriageCard); + [_target, "activity", ELSTRING(medical_treatment,Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); + [_target, "activity_view", ELSTRING(medical_treatment,Activity_usedItem), [[_caller, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); + }; +} forEach _items; + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentMedicationLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentMedicationLocal.sqf new file mode 100644 index 0000000000..b8b4dfb3d8 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentMedicationLocal.sqf @@ -0,0 +1,107 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Handles the medication given to a patient. + * + * Arguments: + * 0: The patient + * 1: Treatment class name + * 2: Injection Site Part Number + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ +#define MORPHINE_PAIN_SUPPRESSION 0.6 + +params ["_target", "_className", "_partIndex"]; +TRACE_3("params",_target,_className,_partIndex); + +if (!GVAR(advancedMedication)) exitWith { + TRACE_1("MedicalSettingAdvancedMedication is:", GVAR(advancedMedication)); + if (_className == "Morphine") exitWith { + private _painSupress = GET_PAIN_SUPPRESS(_target); + _target setVariable [VAR_PAIN_SUPP, (_painSupress + MORPHINE_PAIN_SUPPRESSION) min 1, true]; + }; + if (_className == "Epinephrine") exitWith { + [QEGVAR(medical,WakeUp), _target] call CBA_fnc_localEvent; + }; +}; +TRACE_1("Running treatmentMedicationLocal with Advanced configuration for", _target); + +private _tourniquets = GET_TOURNIQUETS(_target); + +if (_tourniquets select _partIndex > 0) exitWith { + TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets); + private _delayedMedications = _target getVariable [QEGVAR(medical,occludedMedications), []]; + + _delayedMedications pushBack _this; + _target setVariable [QEGVAR(medical,occludedMedications), _delayedMedications, true]; + + true +}; + +// We have added a new dose of this medication to our system, so let's increase it +private _varName = format [QGVAR(%1_inSystem), _className]; +private _currentInSystem = _target getVariable [_varName, 0]; +_target setVariable [_varName, _currentInSystem + 1]; + +// Find the proper attributes for the used medication +private _medicationConfig = configFile >> QUOTE(ADDON) >> "Medication"; +private _painReduce = getNumber (_medicationConfig >> "painReduce"); +private _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); +private _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); +private _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); +private _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); +private _timeTillMaxEffect = getNumber (_medicationConfig >> "timeTillMaxEffect"); +private _maxDose = getNumber (_medicationConfig >> "maxDose"); +private _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); + +private _inCompatableMedication = []; + +if (isClass (_medicationConfig >> _className)) then { + _medicationConfig = _medicationConfig >> _className; + if (isNumber (_medicationConfig >> "painReduce")) then { _painReduce = getNumber (_medicationConfig >> "painReduce");}; + if (isArray (_medicationConfig >> "hrIncreaseLow")) then { _hrIncreaseLow = getArray (_medicationConfig >> "hrIncreaseLow"); }; + if (isArray (_medicationConfig >> "hrIncreaseNormal")) then { _hrIncreaseNorm = getArray (_medicationConfig >> "hrIncreaseNormal"); }; + if (isArray (_medicationConfig >> "hrIncreaseHigh")) then { _hrIncreaseHigh = getArray (_medicationConfig >> "hrIncreaseHigh"); }; + if (isNumber (_medicationConfig >> "timeInSystem")) then { _timeInSystem = getNumber (_medicationConfig >> "timeInSystem"); }; + if (isNumber (_medicationConfig >> "timeTillMaxEffect")) then { _timeTillMaxEffect = getNumber (_medicationConfig >> "timeTillMaxEffect"); }; + if (isNumber (_medicationConfig >> "maxDose")) then { _maxDose = getNumber (_medicationConfig >> "maxDose"); }; + if (isArray (_medicationConfig >> "inCompatableMedication")) then { _inCompatableMedication = getArray (_medicationConfig >> "inCompatableMedication"); }; + if (isNumber (_medicationConfig >> "viscosityChange")) then { _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); }; +}; + +if (alive _target) then { + private _heartRate = GET_HEART_RATE(_target); + private _hrIncrease = [_hrIncreaseLow, _hrIncreaseNorm, _hrIncreaseHigh] select (floor ((0 max _heartRate min 110) / 55)); + _hrIncrease params ["_minIncrease", "_maxIncrease"]; + private _heartRateChange = _minIncrease + random (_maxIncrease - _minIncrease); + + // Adjust the heart rate based upon config entry + if (_heartRateChange != 0) then { + TRACE_1("heartRateChange", _heartRateChange); + private _adjustments = _target getVariable [VAR_HEART_RATE_ADJ,[]]; + _adjustments pushBack [_heartRateChange, _timeTillMaxEffect, _timeInSystem, 0]; + _target setVariable [VAR_HEART_RATE_ADJ, _adjustments]; + }; + + // Adjust the pain suppression based upon config entry + if (_painReduce > 0) then { + TRACE_1("painReduce", _painReduce); + private _adjustments = _target getVariable [VAR_PAIN_SUPP_ADJ,[]]; + _adjustments pushBack [_painReduce, _timeTillMaxEffect, _timeInSystem, 0]; + _target setVariable [VAR_PAIN_SUPP_ADJ, _adjustments]; + }; + + // Adjust the peripheral resistance based upon config entry + if (_viscosityChange != 0) then { + TRACE_1("viscosityChange", _viscosityChange); + private _adjustments = _target getVariable [VAR_PERIPH_RES_ADJ,[]]; + _adjustments pushBack [_viscosityChange, _timeTillMaxEffect, _timeInSystem, 0]; + _target setVariable [VAR_PERIPH_RES_ADJ, _adjustments]; + }; +}; + +true diff --git a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf b/addons/medical_treatment/functions/fnc_treatmentSurgicalKit_onProgress.sqf similarity index 52% rename from addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf rename to addons/medical_treatment/functions/fnc_treatmentSurgicalKit_onProgress.sqf index 7f7cb481aa..f57b035598 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf +++ b/addons/medical_treatment/functions/fnc_treatmentSurgicalKit_onProgress.sqf @@ -14,7 +14,7 @@ * Succesful treatment started * * Example: - * [[bob, kevin], 5, 5] call ACE_medical_fnc_treatmentAdvanced_surgicalKit_onProgress + * [[bob, kevin], 5, 5] call ace_medical_treatment_fnc_treatmentAdvanced_surgicalKit_onProgress * * Public: No */ @@ -22,15 +22,18 @@ params ["_args", "_elapsedTime", "_totalTime"]; _args params ["_caller", "_target"]; -private _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; +private _bandagedWounds = _target getVariable [QEGVAR(medical,bandagedWounds), []]; +private _stitchedWounds = _target getVariable [QEGVAR(medical,stitchedWounds), []]; //In case two people stitch up one patient and the last wound has already been closed we can stop already if (count _bandagedWounds == 0) exitWith { false }; //Has enough time elapsed that we can close another wound? -if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then { - _bandagedWounds deleteAt 0; - _target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; +if (_totalTime - _elapsedTime <= (count _bandagedWounds - 1) * 5) then { + private _treatedWound = _bandagedWounds deleteAt 0; + _stitchedWounds pushBack _treatedWound; + _target setVariable [QEGVAR(medical,bandagedWounds), _bandagedWounds, true]; + _target setVariable [QEGVAR(medical,stitchedWounds), _stitchedWounds, true]; }; true diff --git a/addons/medical_treatment/functions/fnc_treatmentTourniquet.sqf b/addons/medical_treatment/functions/fnc_treatmentTourniquet.sqf new file mode 100644 index 0000000000..595d55d589 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentTourniquet.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Apply a tourniquet to the patient + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart", "_className", "_items"]; + +if (count _items == 0) exitWith {false}; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +private _tourniquets = GET_TOURNIQUETS(_target); + +if (_tourniquets select _partIndex > 0) exitWith { + private _output = "There is already a tourniquet on this body part!"; // TODO localization + [QEGVAR(common,displayTextStructured), [_output, 1.5, _caller], _caller] call CBA_fnc_targetEvent; + false +}; + +private _removeItem = _items select 0; + +[QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _bodyPart], _target] call CBA_fnc_targetEvent; + +[_target, _removeItem] call FUNC(addToTriageCard); +[_target, "activity", ELSTRING(medical_treatment,Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity_view", ELSTRING(medical_treatment,Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message + +true diff --git a/addons/medical_treatment/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentTourniquetLocal.sqf new file mode 100644 index 0000000000..32dc6566ac --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentTourniquetLocal.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Apply a tourniquet to the patient, local callback. + * + * Arguments: + * 0: The patient + * 1: Item used classname + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_target", "_tourniquetItem", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; + +// Place a tourniquet on the bodypart +private _tourniquets = GET_TOURNIQUETS(_target); + +_tourniquets set [_partIndex, CBA_missionTime]; + +_target setVariable [VAR_TOURNIQUET, _tourniquets, true]; diff --git a/addons/medical_treatment/functions/fnc_treatmentTourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_treatmentTourniquetRemove.sqf new file mode 100644 index 0000000000..762c429a5c --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatmentTourniquetRemove.sqf @@ -0,0 +1,54 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Action for removing the tourniquet on specified selection + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * + * Return Value: + * None + * + * Public: No + */ + +params ["_caller", "_target", "_bodyPart"]; +TRACE_3("params",_caller,_target,_bodyPart); + +// grab the required data +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _tourniquets = GET_TOURNIQUETS(_target); + +// Check if there is a tourniquet on this bodypart +if (_tourniquets select _partIndex == 0) exitWith { + [QEGVAR(common,displayTextStructured), [ELSTRING(medical_treatment,noTourniquetOnBodyPart), 1.5, _caller], [_caller]] call CBA_fnc_targetEvent; +}; + +// Removing the tourniquet +_tourniquets set [_partIndex, 0]; +_target setVariable [VAR_TOURNIQUET, _tourniquets, true]; + +// Adding the tourniquet item to the caller +[_caller, "ACE_tourniquet", true] call CBA_fnc_addItem; + +//Handle all injected medications now that blood is flowing +private _delayedMedications = _target getVariable [QEGVAR(medical,occludedMedications), []]; +private _updatedArray = false; +TRACE_2("meds",_partIndex,_delayedMedications); + +{ + _x params ["", "", "_medPartNum"]; + if (_partIndex == _medPartNum) then { + TRACE_1("delayed medication call after tourniquet removeal",_x); + [QGVAR(treatmentMedicationLocal), _x, _target] call CBA_fnc_targetEvent; + _delayedMedications set [_forEachIndex, -1]; + _updatedArray = true; + }; +} forEach _delayedMedications; + +if (_updatedArray) then { + _delayedMedications = _delayedMedications - [-1]; + _target setVariable [QEGVAR(medical,occludedMedications), _delayedMedications, true]; +}; diff --git a/addons/medical_treatment/functions/fnc_treatment_failure.sqf b/addons/medical_treatment/functions/fnc_treatment_failure.sqf new file mode 100644 index 0000000000..8b3114cc66 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatment_failure.sqf @@ -0,0 +1,56 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, Glowbal + * Callback when the treatment fails + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * 4: Items available > + * + * Return Value: + * None + * + * Public: No + */ + +params ["_args"]; +_args params ["_caller", "_target", "_bodyPart", "_className", "_items", "_usersOfItems"]; + +// switch to end anim immediately +private _endInAnim = _caller getVariable QGVAR(endInAnim); + +if (!isNil "_endInAnim") then { + if (animationState _caller != _endInAnim) then { + [_caller, _endInAnim, 2] call EFUNC(common,doAnimation); + }; + _caller setVariable [QGVAR(endInAnim), nil]; + TRACE_1("abort",_endInAnim); +}; + +// reset sped up animations +[QEGVAR(common,setAnimSpeedCoef), [_caller, 1]] call CBA_fnc_globalEvent; + +{ + _x params ["_unit", "_item"]; + _unit addItem _item; +} forEach _usersOfItems; + +// Record specific callback +private _config = configFile >> QGVAR(Actions) >> _className; + +private _callback = getText (_config >> "callbackFailure"); + +if (isNil _callback) then { + _callback = compile _callback; +} else { + _callback = missionNamespace getVariable _callback; +}; + +if !(_callback isEqualType {}) then { + _callback = {TRACE_1("callback was NOT code",_callback)}; +}; + +_args call _callback; diff --git a/addons/medical_treatment/functions/fnc_treatment_success.sqf b/addons/medical_treatment/functions/fnc_treatment_success.sqf new file mode 100644 index 0000000000..903e32e677 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_treatment_success.sqf @@ -0,0 +1,71 @@ +#include "script_component.hpp" +/* + * Author: KoffeinFlummi, Glowbal + * Callback when the treatment is completed + * + * Arguments: + * 0: The medic + * 1: The patient + * 2: Body part + * 3: Treatment class name + * 4: Items available > + * + * Return Value: + * None + * + * Public: No + */ + +params ["_args"]; +_args params ["_caller", "_target", "_bodyPart", "_className", "_items", "_usersOfItems"]; + +// switch to end anim immediately +private _endInAnim = _caller getVariable QGVAR(endInAnim); + +if (!isNil "_endInAnim") then { + if (animationState _caller != _endInAnim) then { + [_caller, _endInAnim, 2] call EFUNC(common,doAnimation); + }; + _caller setVariable [QGVAR(endInAnim), nil]; + TRACE_1("abort",_endInAnim); +}; + +// reset sped up animations +[QEGVAR(common,setAnimSpeedCoef), [_caller, 1]] call CBA_fnc_globalEvent; + +// Record specific callback +private _config = configFile >> QGVAR(Actions) >> _className; + +private _callback = getText (_config >> "callbackSuccess"); + +if (isNil _callback) then { + _callback = compile _callback; +} else { + _callback = missionNamespace getVariable _callback; +}; + +if !(_callback isEqualType {}) then { + _callback = {TRACE_1("callback was NOT code",_callback)}; +}; + +//Get current blood loose on limb (for "bloody" litter) +private _bloodLossOnBodyPart = 0; +private _partIndex = (ALL_BODY_PARTS find toLower _bodyPart) max 0; + +// Add all bleeding from wounds on selection +private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []]; + +{ + _x params ["", "", "_bodyPartN", "_amountOf", "_percentageOpen"]; + + if (_bodyPartN isEqualTo _partIndex) then { + _bloodLossOnBodyPart = _bloodLossOnBodyPart + (_amountOf * _percentageOpen); + }; +} forEach _openWounds; +TRACE_1("advanced",_bloodLossOnBodyPart); + +_args call _callback; +_args pushBack _bloodLossOnBodyPart; +_args call FUNC(litterCreate); + +["ace_treatmentSucceded", [_caller, _target, _bodyPart, _className]] call CBA_fnc_localEvent; diff --git a/addons/medical_treatment/functions/fnc_useItem.sqf b/addons/medical_treatment/functions/fnc_useItem.sqf new file mode 100644 index 0000000000..6977052209 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_useItem.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Use Equipment if any is available. Priority: 1) Medic, 2) Patient. If in vehicle: 3) Crew + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Item + * + * ReturnValue: + * 0: success + * 1: Unit + * + * Public: No + */ + +params ["_medic", "_patient", "_item"]; + +if (isNil QEGVAR(medical,setting_allowSharedEquipment)) then { + EGVAR(medical,setting_allowSharedEquipment) = true; +}; + +if (EGVAR(medical,setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitWith { + ["ace_useItem", [_patient, _item], _patient] call CBA_fnc_targetEvent; + [true, _patient] +}; + +if ([_medic, _item] call EFUNC(common,hasItem)) exitWith { + ["ace_useItem", [_medic, _item], _medic] call CBA_fnc_targetEvent; + [true, _medic] +}; + +private _return = [false, objNull]; + +if (vehicle _medic != _medic && {vehicle _medic call FUNC(isMedicalVehicle)}) then { + { + if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {[_x, _item] call EFUNC(common,hasItem)}) exitWith { + ["ace_useItem", [_x, _item], _x] call CBA_fnc_targetEvent; + _return = [true, _x]; + }; + } forEach crew vehicle _medic; +}; + +_return diff --git a/addons/medical/functions/fnc_useItems.sqf b/addons/medical_treatment/functions/fnc_useItems.sqf similarity index 58% rename from addons/medical/functions/fnc_useItems.sqf rename to addons/medical_treatment/functions/fnc_useItems.sqf index ef3dc78ab3..13ccf627b0 100644 --- a/addons/medical/functions/fnc_useItems.sqf +++ b/addons/medical_treatment/functions/fnc_useItems.sqf @@ -9,30 +9,41 @@ * 2: Items > * * Return Value: - * None + * 0: success + * 1: Unit * * Example: - * [unit, patient, ["bandage"]] call ace_medical_fnc_useItems + * [unit, patient, ["bandage"]] call ace_medical_treatment_fnc_useItems * - * Public: Yes + * Public: No */ +#define HAS_USED_ITEM(itemUsedInfo) (itemUsedInfo select 0) +#define GET_ITEM_USED_BY(itemUsedInfo) (itemUsedInfo select 1) + params ["_medic", "_patient", "_items"]; private _itemsUsedBy = []; + { // handle a one of type use item if (_x isEqualType []) then { { private _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); - if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushBack [(_itemUsedInfo select 1), _x]}; + + if (HAS_USED_ITEM(_itemUsedInfo)) exitWith { + _itemsUsedBy pushBack [GET_ITEM_USED_BY(_itemUsedInfo), _x]; + }; } forEach _x; }; // handle required item if (_x isEqualType "") then { private _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); - if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushBack [(_itemUsedInfo select 1), _x]}; + + if (HAS_USED_ITEM(_itemUsedInfo)) exitWith { + _itemsUsedBy pushBack [GET_ITEM_USED_BY(_itemUsedInfo), _x]; + }; }; } forEach _items; diff --git a/addons/medical_treatment/functions/script_component.hpp b/addons/medical_treatment/functions/script_component.hpp new file mode 100644 index 0000000000..86227531f9 --- /dev/null +++ b/addons/medical_treatment/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_treatment\script_component.hpp" \ No newline at end of file diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf new file mode 100644 index 0000000000..6cd3f8c897 --- /dev/null +++ b/addons/medical_treatment/initSettings.sqf @@ -0,0 +1,206 @@ +// CBA Settings [ADDON: ace_medical_treatment]: + +private _categoryArray = [LELSTRING(medical,Category_DisplayName), LLSTRING(subCategory)]; + +// todo: the strings for all three advanced bandages/medication/diagnose settings are terribly ambigious + +[// todo: I don't like that wound reopening requires this setting to be enabled, they should be independent + QGVAR(advancedBandages), "CHECKBOX", + [LSTRING(advancedBandages_DisplayName), LSTRING(advancedBandages_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(advancedBandages), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[// todo: this setting just disables some treatment options, remove? + QGVAR(advancedDiagnose), "CHECKBOX", + [LSTRING(advancedDiagnose_DisplayName), LSTRING(advancedDiagnose_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(advancedDiagnose), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(advancedMedication), "CHECKBOX", + [LSTRING(advancedMedication_DisplayName), LSTRING(advancedMedication_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(advancedMedication), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(woundReopening), "CHECKBOX", + [LSTRING(woundReopening_DisplayName), LSTRING(woundReopening_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QGVAR(woundReopening), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(allowSelfIV), "LIST", // This setting is list because we want number for treatment config + [LSTRING(allowSelfIV_DisplayName), LSTRING(allowSelfIV_Description)], + _categoryArray, + [[0,1],["No","Yes"],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QGVAR(allowSelfIV), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +// Ported Settings: +[ + QEGVAR(medical,convertItems), "LIST", + [LSTRING(convertItems_DisplayName), LSTRING(convertItems_Description)], + _categoryArray, + [[0,1,2],[LELSTRING(common,Enabled),LLSTRING(convertItems_remove),LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,convertItems), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,allowLitterCreation), "CHECKBOX", + [LSTRING(allowLitterCreation), LSTRING(allowLitterCreation_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QEGVAR(medical,allowLitterCreation), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,CPRcreatesPulse), "CHECKBOX", + [LSTRING(CPRcreatesPulse), LSTRING(CPRcreatesPulse_Description)], + _categoryArray, + true, // default value + true, // isGlobal + {[QEGVAR(medical,CPRcreatesPulse), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,litterCleanUpDelay), "SLIDER", + [LSTRING(litterCleanUpDelay), LSTRING(litterCleanUpDelay_Description)], + _categoryArray, + [-1,5000,0,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QEGVAR(medical,litterCleanUpDelay), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,litterSimulationDetail), "LIST", + [LSTRING(litterSimulationDetail), LSTRING(litterSimulationDetail_Description)], + _categoryArray, + [[0,1,2,3,4],["Off","Low","Medium","High","Ultra"],3], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,litterSimulationDetail), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,increaseTrainingInLocations), "CHECKBOX", + [LSTRING(increaseTrainingInLocations_DisplayName), LSTRING(increaseTrainingInLocations_Description)], + _categoryArray, + false, // default value + true, // isGlobal + {[QEGVAR(medical,increaseTrainingInLocations), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,PAKTime), "SLIDER", + [LSTRING(PAKTime), LSTRING(PAKTime_Description)], + _categoryArray, + [-1,5000,0,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QEGVAR(medical,PAKTime), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,medicSetting_Epi), "LIST", + [LSTRING(medicSetting_Epi_DisplayName), LSTRING(medicSetting_Epi_Description)], + _categoryArray, + [[0,1,2],["Anyone","Medics only","Doctors only"],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,medicSetting_Epi), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,medicSetting_PAK), "LIST", + [LSTRING(medicSetting_PAK_DisplayName), LSTRING(medicSetting_PAK_Description)], + _categoryArray, + [[0,1,2],["Anyone","Medics only","Doctors only"],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,medicSetting_PAK), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,medicSetting_SurgicalKit), "LIST", + [LSTRING(MedicalSettings_medicSetting_SurgicalKit_DisplayName), LSTRING(MedicalSettings_medicSetting_SurgicalKit_Description)], + _categoryArray, + [[0,1,2],["Anyone","Medics only","Doctors only"],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,medicSetting_SurgicalKit), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,consumeItem_PAK), "LIST", + [LSTRING(MedicalSettings_consumeItem_PAK_DisplayName), LSTRING(MedicalSettings_consumeItem_PAK_Description)], + _categoryArray, + [[0,1],["No","Yes"],1], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,consumeItem_PAK), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,consumeItem_SurgicalKit), "LIST", + [LSTRING(MedicalSettings_consumeItem_SurgicalKit_DisplayName), LSTRING(MedicalSettings_consumeItem_SurgicalKit_Description)], + _categoryArray, + [[0,1],["No","Yes"],1], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,consumeItem_SurgicalKit), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,useLocation_Epi), "LIST", + [LSTRING(MedicalSettings_useLocation_Epi_DisplayName), LSTRING(MedicalSettings_useLocation_Epi_Description)], + _categoryArray, + [[0,1,2,3,4],[LELSTRING(common,Anywhere), LELSTRING(common,Vehicle), LLSTRING(medicalFacility), LLSTRING(vehicleAndFacility), LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,useLocation_Epi), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,useLocation_PAK), "LIST", + [LSTRING(MedicalSettings_useLocation_PAK_DisplayName), LSTRING(MedicalSettings_useLocation_PAK_Description)], + _categoryArray, + [[0,1,2,3,4],[LELSTRING(common,Anywhere), LELSTRING(common,Vehicle), LLSTRING(medicalFacility), LLSTRING(vehicleAndFacility), LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,useLocation_PAK), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,useLocation_SurgicalKit), "LIST", + [LSTRING(MedicalSettings_useLocation_SurgicalKit_DisplayName), LSTRING(MedicalSettings_useLocation_SurgicalKit_Description)], + _categoryArray, + [[0,1,2,3,4],[LELSTRING(common,Anywhere), LELSTRING(common,Vehicle), LLSTRING(medicalFacility), LLSTRING(vehicleAndFacility), LELSTRING(common,Disabled)],0], // [values, titles, defaultIndex] + true, // isGlobal + {[QEGVAR(medical,useLocation_SurgicalKit), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/medical_treatment/script_component.hpp b/addons/medical_treatment/script_component.hpp new file mode 100644 index 0000000000..ff7360dfc5 --- /dev/null +++ b/addons/medical_treatment/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_treatment +#define COMPONENT_BEAUTIFIED Medical Treatment +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_TREATMENT + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_TREATMENT + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_TREATMENT +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/medical/sounds/Inject.ogg b/addons/medical_treatment/sounds/Inject.ogg similarity index 100% rename from addons/medical/sounds/Inject.ogg rename to addons/medical_treatment/sounds/Inject.ogg diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml new file mode 100644 index 0000000000..75b9dffc8d --- /dev/null +++ b/addons/medical_treatment/stringtable.xml @@ -0,0 +1,3660 @@ + + + + + + Treatment + + + Advanced Bandages + + + Enable advanced bandages (required for wound reopening) + + + Advanced Diagnose + + + Enable advanced diagnose + + + Advanced Medication + + + Enable advanced medication + + + Locations boost training + Místa pro vylepšení zkušeností + Località aumentano addestramento + Örtliche Trainingssteigerung + Ubicación mejora entrenamiento. + Miejsca zwiększają wyszkolenie + Localização melhora treinamento + Le lieu améliore l'efficacité + Места ускоренного обучения + 衛生兵としての能力を与える場所 + 교육 증가 지역 + 受所在位置影响提升医疗能力 + 受所在位置影響提升醫療能力 + + + Boost medic rating in medical vehicles or near medical facilities [untrained becomes medic, medic becomes doctor] + Zlepšit zkušenosti zdravotníka v medickém vozidle nebo poblíž zdravotního zařízení [nezkušení se stane zdravotníkem, zdravotník se stane doktorem] + Aumenta il rating medico in veicoli medici o vicino strutture mediche [non addestrato diventa medico, medico diventa dottore] + Steigert die medizinische Einstufung eines Soldaten in Sanitätsfarhzeugen oder in der Nähe von Sanitätseinrichtungen [untrainiert wird zu Sanitäter, Sanitäter zu Doktor] + Mejora el entrenamiento médico dentro de vehículos médicos o cerca de instalaciones médicas (no entrenados se convierten en médicos, médicos se convierten en doctores) + Zwiększa poziom wyszkolenia medyków wewnątrz pojazdów medycznych lub w pobliżu budynków medycznych [niedoświadczony zostaje medykiem, medyk zostaje doktorem] + Aumenta a classificação do médico dentro de veículos médicos ou perto de instalações médicas [sem treinamento vira médico, médico vira doutor] + Améliore l'efficacité des soins dans les véhicules ou structures de soins [non formés deviennent médecins, médecins deviennent docteurs] + Улучшает медицинскую подготовку в мед. транспорте и около мед. строений [нетренированные становятся медиками, медики становятся врачами] + 医療車両や医療施設の近くは衛生兵としての能力を与える場所となり、衛生兵の訓練を受けていないのに衛生兵としてなる (未訓練は衛生兵に、衛生兵は医師に) + 의무병의 수준이 주변의 차량이나 의료시설에 따라 증가합니다. [비교육자가 의무병이되고, 의무병이 의사가 됩니다] + 当人员在医疗载具或是医护设施旁进行医疗时, 该员医疗能力将会有所提升 (未受训人员提升为医疗兵, 医疗兵提升为军医) + 當人員在醫療載具或是醫護設施旁進行醫療時, 該員醫療能力將會有所提升 (未受訓人員提升為醫療兵, 醫療兵提升為軍醫) + + + Self IV Transfusion + + + Allows using IV Transfusions on yourself + + + CPR creates pulse + HLW erzeugt einen Puls + + + CPR will create a pulse for the patient while performing + HLW erzeugt während der Behandlung beim Patienten einen Puls + + + Enable Advanced wounds + Усложненные раны + Aktywuj zaawansowane rany + Activa heridas avanzadas + Aktiviere erweiterte Wunden + Povolit pokročilé zranění + Ativar ferimentos avançados + Activer les plaies compliquées + Komplex sebek engedélyezése + Abilita ferite Avanzate + アドバンスドな傷を有効化 + 고급 부상 활성화 + 启用进阶伤口系统 + 啟用進階傷口系統 + + + Allow reopening of bandaged wounds? + Будут ли открываться уже перевязанные раны? + Pozwól na otwieranie się zabandażowanych ran? + Permitir la reapertura de las heridas vendadas? + Erlaube das Öffnen von bandagierten Wunden? + Umožnit znovuotevření zavázané rány? + Permitr reabertura de ferimentos enfaixados? + Les plaies peuvent se rouvrir + Visszanyílhatnak a bekötözött sebek? + Permetti la riapertura di ferite bendate? + 包帯で巻かれた傷を再び開くようにしますか? + 붕대가 풀리는것을 활성화합니까? + 启用进阶伤口系统会使已被包扎的伤口有机率裂开 + 啟用進階傷口系統會使已被包紮的傷口有機率裂開 + + + + + Allow Epinephrine + Erlaube Epiniphrin + Permitir Epinefrina + Ograniczenia adrenaliny + Activer l'épinéphrine + Permette epinefrina + Povolit adrenalin + Permitir Epinefrina + Разрешить Адреналин + アドレナリンの許可 + 에피네프린 활성화 + 允许使用肾上腺素 + 允許使用腎上腺素 + + + Who can use Epinephrine? + + + Allow PAK + Использование аптечки + Ustawienie apteczek osobistych + Permitir EPA + Erlaube Erste-Hilfe-Set + Povolit osobní lékárničky (PAK) + Permitir Kit de Primeiros Socorros + Activer la trousse sanitaire + Elsősegélycsomag engedélyezése + Consenti Kit di Pronto Soccorso + 応急処置キットの許可 + 개인응급키트 활성화 + 允许使用个人急救包 + 允許使用個人急救包 + + + Who can use the PAK for full heal? + Кому разрешено выполнять полное лечение с помощью аптечки? + Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? + ¿Quién puede utilizar el EPA para una cura completa? + Wer kann das Erste-Hilfe-Set für eine Endheilung verwenden? + Kdo může použít osobní lékárničku pro plné vyléčení? + Quem pode usar o KPS para cura completa? + Qui peut utilier la trousse sanitaire pour des soins complets? + Ki használhatja az elsősegélycsomagot teljes gyógyításra? + Chi può usare il KPS per cura completa? + 完全に回復できるよう誰しもが応急処置キットを使えるようにしますか? + 완전한 체력회복을 위해 어느 인원이 개인응급키트을 쓸 수 있습니까? (기본 의료 전용) + 谁能够使用个人急救包来达到完整医疗? + 誰能夠使用個人急救包來達到完整醫療? + + + Anyone + Кем угодно + Wszyscy + Nadie + Jeder + Kdokoliv + Qualquer um + Tous + Akárki + Chiunque + だれでも + 모두 + 任何人 + 任何人 + + + Medics only + Только медиками + Tylko medycy + Solo médicos + Nur Sanitäter + Pouze zdravotník + Somente médicos + Infirmiers uniquement + Csak orvosok + Solo medici + 衛生兵のみ + 의무병만 + 只限医疗兵 + 只限醫療兵 + + + Doctors only + Только врачами + Tylko doktorzy + Solo doctores + Nur Ärzte + Pouze doktor + Somente doutores + Médecins uniquement + Csak doktorok + Solo dottori + 医師のみ + 오직 의사만 + 只限军医 + 只限軍醫 + + + Medical facility + В госпитале + Budynki medyczne + Centro médico + Medizinische Einrichtungen + Zdravotnické zařízení + Instalação médica + Dans les structures sanitaires + Orvosi létesítmény + Strutture mediche + 医療施設でのみ + 의료시설 + 医疗设施 + 醫療設施 + + + Vehicles & facility + В транспорте и госпитале + Pojazdy i budynki medyczne + Vehículos y centros + Fahrzeuge & Einrichtungen + Vozidla a zařízení + Veículos e instalações + Dans les véhicules et les structures sanitaires + Járművek & létesítmény + Veicoli e Strutture + 車両 & 施設 + 차량 및 시설 + 医疗载具 & 医疗设施 + 醫療載具 & 醫療設施 + + + Remove PAK on use + Удалять аптечки после использования + Usuń apteczkę po użyciu + Eliminar EPA después del uso + Entf. Erste-Hilfe-Set bei Verwendung + Odebrat osobní lékárničku po použití + Remover o KPS depois do uso + Utilisation unique de la trousse sanitaire + Elsősegélycsomag eltávolítása használatkor + Rimuovi Kit Pronto Soccorso dopo l'uso + 応急処置キットの削除 + 개인응급키트 사용후 사라짐 + 在使用后删除个人急救包 + 在使用後刪除個人急救包 + + + Should PAK be removed on usage? + Нужно ли удалять аптечки после использования? + Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? + El EPA será eliminado después de usarlo + Sollen Erste-Hilfe-Sets bei Verwendung entfernt werden? + Má se osobní lékárnička odstranit po použití? + Deve o KPS ser removido depois do uso? + La trousse sanitaire doit être consommée à l'utilisation? + Eltávolítódjon az elsősegélycsomag használatkor? + Il Kit Pronto Soccorso dev'essere rimosso dopo l'utilizzo? + 応急処置キットを使うと削除しますか? + 개인응급키트를 사용하고 나서 제거합니까? + 要在使用后删除个人急救包吗? + 要在使用後刪除個人急救包嗎? + + + Locations Epinephrine + Orte für Epiniphrin + Ubicaciones epinefrina + Ograniczenia adrenaliny + Utilisation de l'épinéphrine + Ubicazione epinefrina + Oblast k použití adrenalinu + Localizações de Epinefrina + Место использования адреналина + アドレナリンをつかう場所 + 에피네프린 사용 장소 + 肾上腺素使用地点 + 腎上腺素使用地點 + + + Where can the Epinephrine be used? + + + How long should PAK take to apply? + + + How long should PAK take to apply? Use 0 for default (based on damage) + + + + + Enable Litter + Включить мусор + Aktywuj odpadki + Activar restos médicos + Abfälle aktivieren + Povolit odpadky + Ativar lixo médico + Activer les détritus + Szemét engedélyezése + Abilita Barella + 医療廃棄物の表示を有効化 + + + Enable litter being created upon treatment + Включить появление мусора после лечения + Twórz odpadki medyczne podczas leczenia + Activar los restos médicos que se crean en el tratamiento + Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde + Vytváří odpad zdravotnického materiálu pří léčení + Ativar lixo ser criado após tratamento + Activer la création de détrimus au début des traitements + Engedélyezi a szemét keletkezését ellátáskor + Abilita la creazione della barella dopo trattamento + 治療を始めると、医療廃棄物の作成を有効化する + + + Litter Simulation Detail + Detale zużytych medykamentów + Detalle de simulación de basura + Количество мусора от медицины + Dettagli Simulazione Rifiuti + Niveau de simulation des détritus + Abfall-Detaillevel + Hulladékszimuláció részletessége + Detalhe da simulação de sujeira + Počet zobrazených předmětů po použití zdravotnického materiálu + 医療廃棄物を再現する詳細度 + + + Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. + Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. + Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. + Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента. + Il numero di rifiuti che verranno creati localmente. La creazione di troppi rifiuti in aree locali potrebbe causare lag e calo di FPS. Questo è un settaggio lato client. + Le niveau de simulation des détritus règle la quantité de déchets qui vont être créés localement chez le client. Des quantitées excessive chez certains clients peuvent causer des chutes de FPS, c'est donc une option client uniquement. + Die Einstellung für das Abfall-Detaillevel stellt die Menge des lokal angezeigten medizinischen Abfalls ein. Zuviel Abfall kann FPS-Einbrüche erzeugen, weswegen diese Einstellung nur clientseitig ist. + A hulladékszimuláció részletessége megszabja a kliens által megjelenített hulladékobjektumok mennyiségét. Súlyos mennyiségek izolált területeken alacsony FPS-t okozhatnak, így ez egy kliensoldali beállítás. + O nível de detalhe de sujeira determina o número de itens que irão aparecer no cliente. Quantidades excessivas em áreas locais podem aumentar o lag do FPS, então esta é uma opção somente para o cliente. + Počet zobrazených předmětů po použití zdravotnického materiálu ovlivňuje počet objektů, které budou zobrazeny klientovi v místě použití zdravotnického materiálu. Vyšší množství objektů může způsobovat poklesy FPS a proto je toto nastavení čistě na klientovi. + 医療廃棄物再現度は各クライアントでローカルに作成される、医療廃棄物への詳細度を決定できます。ローカルで多くのアイテムがあると FPS の低下を引き起こすため、クライアント側のみの設定です。 + + + Life time of litter objects + Время удаления мусора + Długość życia odpadków + Tiempo de vida de los restos médicos + Dauer des angezeigten Abfalls + Životnost pro odpadky + Tempo de vida dos objetos do lixo + Durée d'affichage des détritus + Szemétobjektumok élettartama + Tempo di vita delle barelle + 医療廃棄物の作成限界数を設定 + + + How long should litter objects stay? In seconds. -1 is forever. + Как долго мусор будет оставаться на земле? В секундах. -1 означает бесконечное время. + Ile czasu musi upłynąć, aby odpadki zaczęły znikać? W sekundach. -1 dla nieskończoności. + ¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre. + Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. + Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. + Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre. + Combien de temps doivent rester affiché les détritus? En secondes. -1 pour tout le temps + Milyen sokáig legyenek jelen a szemétobjektumok (másodpercben)? A -1 végtelen időt jelent. + Per quanto devono restare le barelle? In secondi. -1 è permanente + 医療廃棄物オブジェクトが表示されつづける時間を設定しますか?-1 は永遠です。 + + + + [ACE] Medical Supply Crate (Basic) + [ACE] Ящик с медикаментами (базовая медицина) + [ACE] Skrzynka z zapasami medycznymi (podstawowa) + [ACE] Caja de suministros médicos (Básica) + [ACE] Sanitätskiste (Standard) + [ACE] Zdravotnické zásoby (základní) + [ACE] Caixa com suprimentos médicos + [ACE] Caisse médicale (basique) + [ACE] Orvosi láda (Alap) + [ACE] Cassa Rifornimenti Medici (Basico) + [ACE] 医療物資箱 (ベーシック) + [ACE] 의료 물자 (기본) + [ACE] 医疗补给箱(基本) + [ACE] 醫療補給箱(基本) + + + [ACE] Medical Supply Crate (Advanced) + [ACE] Ящик с медикаментами (усложн. медицина) + [ACE] Skrzynka z zapasami medycznymi (zaawansowana) + [ACE] Caja de suministros médicos (Avanzada) + [ACE] Sanitätskiste (erweitert) + [ACE] Zdravotnické zásoby (pokročilé) + [ACE] Caixa com suprimentos médicos (Avançados) + [ACE] Caisse médicale (avancée) + [ACE] Orvosi láda (Fejlett) + [ACE] Cassa Rifornimenti Medici (Avanzato) + [ACE] 医療物資箱 (アドバンスド) + [ACE] 의료 물자 (고급) + [ACE] 医疗补给箱(进阶) + [ACE] 醫療補給箱(進階) + + + Whether or not the object will be a medical vehicle. + Czy pojazd ma być pojazdem medycznym? + L'oggetto in questione sarà un veicolo medico o meno. + Legt fest, ob das Objekt ein Sanitätsfahrzeug ist. + Es un vehículo médico? + Détermine si c'est un véhicule sanitaire. + Se o objeto será ou não um veículo médico + Будет ли объект считаться медицинским транспортом. + どれでも、またはオブジェクトを医療車両として割り当てます。 + 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. + 是否使该载具为医疗载具? + 是否使該載具為醫療載具? + + + Medical training + Wyszkolenie medyczne + Addestramento Medico + Sanitätsausbildung + Entrenamiento médico + Entraînement médical + Lékařský výcvik + Treino médico + Медицинская подготовка + 治療の訓練 + 의료 훈련 + 医疗训练 + 醫療訓練 + + + Is Medic + Является медиком + Klasa medyczna + Es médico + Ist Sanitäter + Je zdravotník + É médico + Est infirmier + Orvos-e + E' Medico + 衛生兵として + 의무병 + 是医疗兵 + 是醫療兵 + + + This module allows you to assign the medic class to selected units. + Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. + Dieses Modul legt fest, welche Einheiten Sanitäter sind. + Tento modul určuje, která jednotka je zdravotník. + Este módulo determina qual unidade é um paramédico. + Ce module permet d'assigner la classe médicale à une unité sélectionnée + Ez a modul engedélyezi az orvosi jelző hozzárendelését kiválasztott egységekhez. + Этот модуль позволяет назначить класс медика выбранным юнитам. + Este módulo permite asignar la clase médico a las unidades seleccionadas. + Questo modulo ti permette di assegnare la classe Medico alle unità selezionate. + 選択されたユニットを衛生兵として指定します。 + 이 모듈은 선택한 보직이 의무병을 할 수 있게 해줍니다. + 本模块可让被同步的单位成为医疗兵 + 本模塊可讓被同步的單位成為醫療兵 + + + None + Нет + Żadna + Nada + Keine + Žádný + Nada + Aucun + Nincs + Nessuno + なし + 없음 + + + + + Regular medic + Обычный медик + Zwykły medyk + Médico regular + Normaler Sanitäter + Řadový zdravotník + Médico regular + Infirmier + Hagyományos orvos + Medico Regolare + 通常の衛生兵 + 일반 의무병 + 普通医疗兵 + 普通醫療兵 + + + Is Medical Vehicle + Является медицинским транспортом + Jest pojazdem medycznym + Es vehículo médico + Ist medizinisches Fahrzeug + Zdravotnické vozidlo + É um veículo médico + Véhicule médical + Orvosi jármű-e + E' Veicolo Medico + 医療車両として + 의료 차량 + 是医疗载具 + 是醫療載具 + + + Is Medical Facility + Является госпиталем + Jest budynkiem medycznym + Es centro médico + Ist eine medizinische Einrichtung + Zdravotnické zařízení + É uma instalação médica + Est une installation médical + Orvosi létesítmény-e + E' Struttura Medica + 医療施設として + 의료시설 + 是医疗设施 + 是醫療設施 + + + Registers an object as a medical facility + Определяет объект в качестве госпиталя + Przypisuje danemu obiektowi status budynku medycznego + Registra un objeto como un centro médico + Definiert ein Objekt als medizinische Einrichtung + Registruje objekt jako zdravotnické zařízení + Registra um objeto como instalacão médica + Enregistrer un objet comme une installation médical + Egy objektum orvosi létesítményként való regisztrálása + Registra un oggetto come struttura medica + オブジェクトを医療施設として割り当てる + 물체를 의료시설로 등록합니다 + 指定一个物件作为医疗设施 + 指定一個物件作為醫療設施 + + + Doctor (Only Advanced Medics) + Врач (только усложн.) + Doktor (tylko zaawansowani medycy) + Doctor (Solo medicina avanzada) + Arzt (Nur erweitertes Sanitätssystem) + Doktor (Pouze pokročilý zdravotníci) + Doutor (Somente médicos avançados) + Médecin (traitements avancés uniquement) + Doktor (csak fejlett orvosok) + Dottore (Solo Medici Avanzati) + 医師 (アドバンスド医療のみ) + 의사 (오직 고급 의료에서만) + 军医 (只限进阶医疗系统) + 軍醫 (只限進階醫療系統) + + + Doctor + Врач + Doktor + Doctor + Arzt + Doktor + Doutor + Médecin + Doktor + Dottore + 医師 + 의사 + 军医 + 軍醫 + + + Bandage (Basic) + Bandage (Einfach) + Повязка (обычная) + Vendaje (Básico) + Pansement adhésif + Bandaż (jałowy) + Obvaz (Standartní) + Kötszer (Általános) + Bendaggio (base) + Bandagem(Básico) + 包帯 (緊急圧迫) + 붕대 (기본) + 基础绷带 + 基礎繃帶 + + + Used to cover a wound + Для перевязки ран + Utilizado para cubrir una herida + Utilisé pour couvrir une blessure + Używany w celu przykrycia i ochrony miejsca zranienia. Najczęściej stosowany bandaż na otarcia i draśnięcia. + Verwendet um Wunden abzudecken + Sebesülések befedésére alkalmas + Usato per coprire una ferita + Usado para cobrir um ferimento + Slouží k překrytí poranění + 傷口をおおう + 상처를 덮을때 씁니다 + 用于覆盖伤口 + 用於覆蓋傷口 + + + A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. + Ein Verband, der aus einem besonderen Material besteht um die Wunde zu schützen, nachdem die Blutung gestoppt wurde. + Повязка, накладываемая поверх раны после остановки кровотечения. + Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar. + Pansement utilisé pour couvrir une blessure lorsque le saignement a été stoppé. + Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. + Egy különleges anyagú kötszer sebek betakarására, amelyet a vérzés elállítása után helyeznek fel. + Una benda apposita, utilizzata per coprire una ferita, la quale viene applicata su di essa una volta fermata l'emorragia. + Uma curativo, material específico para cobrir um ferimento que é aplicado assim que o sangramento é estancando. + Obvaz je vhodným způsobem upravený sterilní materiál, určený k překrytí rány, případně k fixaci poranění. + 緊急圧迫包帯は、傷口を血液凝固剤でおおうようにできていて、つかうと出血の原因を取りさります。 + 드레싱, 출혈을 막고서 상처를 덮기위해 쓰는 물건입니다. + 用于覆盖伤口以防止出血, 透过敷料的止血剂来让出血慢慢停止 + 用於覆蓋傷口以防止出血, 透過敷料的止血劑來讓出血慢慢停止 + + + Packing Bandage + Mullbinde + Тампонирующая повязка + Vendaje compresivo + Bande extensible + Bandaż (uciskowy) + Nyomókötszer + Bendaggio compressivo + Bandagem de Compressão + Obvaz (Tlakový) + 弾性包帯 + 거즈 붕대 + 包扎绷带 + 包紮繃帶 + + + Used to pack medium to large wounds and stem the bleeding + Wird verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen + Для тампонирования ран среднего и большого размера и остановки кровотечения. + Se utiliza para vendar heridas medianas o grandes y detener el sangrado + Utilisé pour couvrir des blessures moyennes et grandes, ralentit le saignement. + Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. Dobrze radzi sobie z tamowaniem ran płatowych oraz postrzałowych. + Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer + Usato su ferite medie o larghe per fermare emorragie. + Usado para o preenchimento de cavidades geradas por ferimentos médios e grandes e estancar o sangramento. + Používá se k zastavení středních až silnějších krvácení + 弾性包帯は粘着フィルム状で、普通から大きめなケガにつかい止血します。 + 중형 또는 대형 상처를 채우고 출혈을 막기위해 쓰입니다 + 用于包扎中到大型伤口, 并防止出血 + 用於包紮中到大型傷口, 並防止出血 + + + A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. + Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжёлых сочетанных ранениях возможно тампонирование раны. + Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. + Bandage servant à recouvrir les blessures pour arrêter les hémoragies et faciliter la guérison. Recouvrir une blessure est optionnel dans le cas de blessures polytraumatiques. + Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. + Egy kötszerfajta, melyet a sebek nyomására használnak a vérzés elállítása és sebgyógyulás érdekében. A nyomókötés egy lehetőség nagyobb polytraumatikus sérülések esetén. + Un bendaggio usato per coprire la ferita, fermare il sanguinamento e facilitarne la guarigione. Questa tecnica è opzionale su ferite multiple. + Ein Verband, um die Wunde abzudecken und die Wundheilung zu fördern. Wunden abdecken ist eine Option bei größeren Polytraumen + Uma bandagem usada para preencher o ferimento para estancar o sangramento e facilitar a cicatrização. Preenchimento de feridas é uma opção em ferimentos de politrauma grandes. + Tlakový obvaz se skládá se ze sterilní krycí vrstvy, na kterou je přiložena silná vrstva savého materiálu stlačující cévu v ráně a která je přitlačována k ráně a připevněna obinadlem. Slouží k zastavení silnějších krvácení. + 包帯をつかうと出血の原因を取りのぞき、それを促進させます。また大きめな多発性外傷にたいしても使えます。 + 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 채우는것도 한 가지 방법입니다. + 用于包扎中到大型伤口, 并防止出血, 为在大型多处性伤口的选项之一! + 用於包紮中到大型傷口, 並防止出血, 為在大型多處性傷口的選項之一! + + + Bandage (Elastic) + Bandage (Elastisch) + Повязка (давящая) + Vendaje (Elástico) + Bande compressive + Bandaż (elastyczny) + Obvaz (Elastický) + Rögzító kötszer + Benda (elastica) + Bandagem (Elástica) + 包帯 (伸縮) + 붕대 (압박) + 弹性绷带 + 彈性繃帶 + + + Bandage kit, Elastic + Elastische Binde (Kompressionsbinde) + Давящая повязка + Kit de vendaje (Elástico) + Bande compressive + Bandaż elastyczny służy do opatrywania ran ciętych oraz kłutych. Dobrze radzi sobie również ze zgniecieniami tkanek miękkich oraz rozerwaniami powierzchni skóry. + Rugalmas kötszercsomag, "rögzítő" + Kit di bendaggio, elastico + Kit de Bandagem, Elástica + Sada obvazů, Elastická + 包帯キット (伸縮) + 붕대, 압박 + 弹性绷带 + 彈性繃帶 + + + Allows an even compression and extra support to the injured area. + Ermöglicht eine gleichmäßige Kompression und zusätzliche Unterstützung für den verletzten Bereich. + Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку повреждённой области + Ce bandage peut être utilisé pour compresser la plaie afin de ralentir le saignement et assurer la tenue du bandage lors de mouvement. + Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. + Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada + Egyenletes nyomást és támogatást biztosít a sebesült felületnek. + Permette di comprimere e aiutare la zone ferita. + Esta bandagem pode ser utilizada para comprimir o ferimento e diminuir o sangramento e garantir que o ferimento não abra em movimento. + Hodí se k fixačním účelům a to i v oblastech kloubů. + 負傷部分へ最大の対応と止血を続けられます。 + 부상 부위를 골고루 압박해주면서 동시에 고정시켜 줍니다. + 可对伤口持续压迫并固定以防止伤口情况变严重 + 可對傷口持續壓迫並固定以防止傷口情況變嚴重 + + + Tourniquet (CAT) + Tourniquet [CAT] + Жгут + Torniquete (CAT) + Garrot (CAT) + Staza (typ. CAT) + Škrtidlo (CAT) + Érszorító (CAT) + Laccio emostatico (CAT) + Torniquete (CAT) + 止血帯 (CAT) + 지혈대 [CAT] + 军用止血带 + 軍用止血帶 + + + Slows down blood loss when bleeding + Замедляет кровопотерю при кровотечении + Reduce la velocidad de pérdida de sangre + Ralentit l'hémorragie + Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. Nie może być noszony zbyt długo ze względu na narastający ból z kończyny. + Verringert den Blutverlust + Lelassítja a vérvesztést vérzés esetén + Rallenta la perdita di sangue in caso di sanguinamento + Reduz a velocidade da perda de sangue + Zpomaluje ztráty krve při krvácení + 出血しているときに、流れ出る量をへらします。 + 출혈 시 혈액손실을 늦춰줍니다 + 减缓失血的速度 + 減緩失血的速度 + + + A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. + Жгут используется для прижатия сосудов к костным выступам, которое приводит к остановке или значительному уменьшению кровотечения + Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre + Un dispositif permettant de compresser les artères et veines afin de ralentir l'hémorragie. + Opaska uciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym krwawieniem tętniczym lub żylnym. + Ein Hilfsmittel, das Druck auf Venen und Arterien ausübt und so den Blutfluss verringert. + Egy szűkítőeszköz, mely a vénás és artériás nyomás keringés helyi összenyomására szolgál, ezzel lelassítva vagy megállítva az adott területen a vérkeringést. Ez csökkenti a vérvesztés mértékét. + Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. + A aparelho que comprime as artérias e veias para diminuir a perda de sangue. + Zařízení používané ke stlačení venózního a arteriálního oběhu. V důsledku dochází ke zpomalení toku krve a tedy i snížení ztrát krve. + 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れをおそくし、失血を防ぎます。 + 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. + 用于压迫静脉与动脉的血液流动, 达到减缓失血速度的目的 + 用於壓迫靜脈與動脈的血液流動, 達到減緩失血速度的目的 + + + Morphine autoinjector + Morphium-Autoinjektor + Морфин в пневмошприце + Morfina auto-inyectable + Auto-injecteur de morphine + Autostrzykawka z morfiną + Auto-morfin + Morfium autoinjektor + Autoiniettore di morfina + Auto-injetor de morfina + モルヒネ注射器 + 모르핀 자동주사기 + 吗啡自动注射器 + 嗎啡自動注射器 + + + Used to combat moderate to severe pain experiences + Wird verwendet um moderate bis starke Schmerzen zu lindern. + Для снятия средних и сильных болевых ощущений + Usado para combatir los estados dolorosos de moderados a severos + Utilisé pour réduire les douleurs modérées à sévères. + Morfina. Ma silne działanie przeciwbólowe. Powoduje spowolnienie tętna oraz rozrzedzenie krwi, zwiększając tym samym ciśnienie tętnicze krwi. Działa przez ok. 15 minut. + Mérsékelttől erős fájdalomig, ellene alkalmazandó termék + Usato per combattere il dolore. + Usado para combater dores moderadas e severas + Slouží k tlumení středně těžkých a těžkých bolestí + 戦闘が収まったとき、痛みにたいしてつかいます。 + 심한 통증을 완화하는데 쓰입니다 + 减低中度至重度的疼痛感 + 減低中度至重度的疼痛感 + + + An analgesic used to combat moderate to severe pain experiences. + Обезболивающее для снятия средних и сильных болевых ощущений. + Analgésico usado para combatir los estados dolorosos de moderados a severos. + Un analgésique puissant servant à réduire les douleurs modérées à sévères. + Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. + Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln + Egy fájdalomcsillapító anyag, jellemzően mérsékelt vagy erős fájdalom esetén alkalmazandó. + Un analgesico usato per combattere il dolore. + Um analgésico usado para combater dores moderadas e fortes. + Analgetikum slouží k tlumení středně těžkých a těžkých bolestí + 戦闘が収まったとき、モルヒネを痛みにたいしてつかいます。 + 심한 통증을 완화하기 위해 쓰이는 진통제입니다. + 止痛药的一种, 用于减低中度至重度的疼痛感 + 止痛藥的一種, 用於減低中度至重度的疼痛感 + + + Adenosine autoinjector + Adenosin-Autoinjektor + Asenosina auto-inyectable + Autostrzykawka z adenozyną + Auto-injecteur d'adénosine + Autoiniettore di adenosina + Auto-adenosine + Auto-injetor de Adenosina + Аденозин в пневмошприце + アデノシン注射器 + 아데노신 자동주사기 + 腺苷自动注射器 + 腺苷自動注射器 + + + Used to counter effects of Epinephrine + Wird verwendet um die Symptome von Epiniphrin zu lindern + Utilizada para contrarrestar los effectos de la Epinefrina + Adenozyna. Stosowana do zwalczania efektów działania adrenaliny. + Utilisé pour contrer les effets de l'épinéphrine + Usato per contrastare l'effetto dell'epinefrina + Slouží jako protiváha Adrenalinu + Usado para combater os efeitos da Epinefrina + Используется для купирования эффектов адреналина + アドレナリンの反対の効果としてつかいます。 + 에피네프린 대응책으로 쓰입니다 + 用来对付肾上腺素的影响 + 用來對付腎上腺素的影響 + + + A drug used to counter the effects of Epinephrine + Ein Medikament, das die Symptome von Epiniphrin bekämpft. + Medicamento usado para contrarrestar los efectos de la Epinefrina. + Organiczny związek chemiczny z grupy nukleozydów. Skuteczna w leczeniu częstoskurczu komorowego. Działa rozszerzająco na naczynia krwionośne. + Un composé utilisé pour contrer les effets de l'épinéphrine + Medicamento usato per contrastare l'effetto dell'epinefrina + Droga používaná k tlumení efektu Adrenalinu + Uma droga usada para combater os efeitos da Epinefrina + Препарат используется для купирования эффектов адреналина + つかうと、アドレナリンと反対の効果がでます。 + 에피네프린에 대응용으로 쓰이는 약품 + 一种药物用于减低肾上腺素的效果 + 一種藥物用於減低腎上腺素的效果 + + + Atropine autoinjector + Атропин в пневмошприце + Atropina auto-inyectable + Auto-injecteur d'atropine + Autostrzykawka AtroPen + Atropin-Autoinjektor + Auto-atropine + Atropin autoinjektor + Autoiniettore di atropina + Auto-injetor de Atropina + アトロピン注射器 + 아트로핀 자동주사기 + 阿托品自动注射器 + 阿托品自動注射器 + + + Used in NBC scenarios + Применяется для защиты от ОМП + Usado en escenarios NBQ + Utilisé en cas d'attaque CBRN + Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. + Verwendet bei ABC-Kontamination + NBK helyzetek esetén használandó + Usato in situazioni con gas nervino. + Usado em casos de ataque QBRN + Používá se v přítomnosti nervových plynů + 核・生物・化学兵器がつかわれている条件下にてつかいます。 + 핵,생물,화학 상황에 쓰입니다 + 使用于核生化污染的情况 + 使用於核生化汙染的情況 + + + A drug used by the Military in NBC scenarios. + Препарат, используемый в войсках для защиты от оружия массового поражения. + Medicamento usado por militares en escenarios NBQ + Médicament utilisé par l'armée en cas d'attaque CBRN + Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC. + Ein Medikament, das vom Militär bei ABC-Kontamination verwendet wird. + Egy instabil alkaloid, NBK helyzetek esetén a katonai szervezetek veszik használatba. + E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. + Uma droga usada por militares em casos de ataque QBRN. + Atropin slouží jako protijed na otravu organofosfátovými insekticidy (diazinon) a nervovými plyny. + 核・生物・化学兵器がつかわれている条件下にてつかいます。 + 핵,생물,화학 상황에 쓰이는 군용 약품 + 军用神经解毒针, 用来应付核生化污染的情况. + 軍用神經解毒針, 用來應付核生化汙染的情況. + + + Epinephrine autoinjector + Адреналин в пневмошприце + Epinefrina auto-inyectable + Auto-injecteur d'épinéphrine + Autostrzykawka EpiPen + Epiniphrin-Autoinjektor + Auto-adrenalin + Epinefrin autoinjektor + Autoiniettore di adrenalina + Auto-injetor de epinefrina + アドレナリン注射器 + 에피네프린 자동주사기 + 肾上腺素自动注射器 + 腎上腺素自動注射器 + + + Increase heart rate and counter effects given by allergic reactions + Стимулирует работу сердца и купирует аллергические реакции + Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas + Augmente la fréquence cadiaque et annule les effets d'une réaction anaphylactique + Adrenalina. Przyśpiesza tętno oraz zwiększa ciśnienie krwi a także przeciwdziała efektom wywołanym przez reakcje alergiczne. + Steigert die Herzfrequenz und bekämpft Symptome von allergischen Reaktionen. + Növeli a szívverést és ellenzi az allergiás reakciók hatásait + Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. + Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas + Zvyšuje srdeční frekvenci a chrání před alergickými reakcemi + 心拍数を増加させたり、アレルギー反応を収める効果もあります。 + 심박수를 높이며 알러지반응의 대응책입니다 + 增加心跳速率的一种药物 + 增加心跳速率的一種藥物 + + + A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. + Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшенной вероятностью благоприятного исхода. + Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos. + Medicament qui fonctionne sur le système nerveux sympathique créant une dilatation des bronches, augmente la fréquence cardiaque et annule les effets d'une réaction allergique (anaphylaxie). Utilisé lors d'arrêt cardio-respiratoire pour augmenter les chances de retrouver un pouls. + EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. + Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. + Ein Medikament, das die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen (Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. + Uma droga trabalha dilatando os bronquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas(anáfilaticas). Usado em casos de parada cardiaca com poucas changes de recuperação. + Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. + Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. + 薬は気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります(アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにつかわれます。 + 기관지를 확장시키는 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과에 대응합니다(아나필락시스). 심폐가 정지하는 경우 호전이 되지않을때 사용합니다. + 俗称强心针, 为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! + 俗稱強心針, 為一種支氣管擴張藥物, 會增加心跳速率並減緩過敏反應(過敏性休克), 在心跳驟停時有恢復心跳的效果! + + + Plasma IV (1000ml) + Плазма для в/в вливания (1000 мл) + Plasma IV (1000ml) + Plasma IV (1000ml) + Osocze IV (1000ml) + Plasma IV (1000ml) + Vérplazma-infúzió (1000ml) + Plasma EV (1000ml) + Plasma IV (1000ml) + Krevní plazma (1000ml) + 血しょう IV (1000ml) + 혈장 IV (250ml) + 血浆 (1000ml) + 血漿 (1000ml) + + + A volume-expanding blood supplement. + Дополнительный препарат, применяемый при возмещении объема крови. + Suplemento para expandir el volumen sanguíneo. + Supplément sanguin visant à remplacer les volumes perdus. + Składnik krwi, używany do zwiększenia jej objętości. + Egy térfogatnövelő vérkiegészítmény. + Aiuta ad aumentare il volume sanguigno. + Volumenerweiterungsmittel (künstliches Blutvolumen) + Suplemento para expandir o volume sanguíneo. + Intravenózně podávaný doplněk k zvětšení objemu krve + 血液量を増加させる補助です。 + 혈액량을 늘리기위한 보조수단 입니다. + 可快速得到血液补充 + 可快速得到血液補充 + + + A volume-expanding blood supplement. + Дополнительный препарат, применяемый при возмещении объема крови. + Suplemento para expandir el volumen sanguíneo. + Supplément visant à remplacer le volume sanguin perdu et remplace les plaquettes. + Składnik krwi, używany do zwiększenia jej objętości. + Egy térfogatnövelő vérkiegészítmény. + Aiuta ad aumentare il volume sanguigno. + Volumenerweiterungsmittel (künstliches Blutvolumen) + Suplemento para expandir o volume sanguíneo. + Intravenózně podávaný doplněk k zvětšení objemu krve + 血液量を増加させる補助です。 + 혈액량을 늘리기위한 보조수단 입니다. + 可快速得到血液补充 + 可快速得到血液補充 + + + Plasma IV (500ml) + Плазма для в/в вливания (500 мл) + Plasma IV (500ml) + Plasma IV (500ml) + Osocze IV (500ml) + Plasma IV (500ml) + Vérplazma-infúzió (500ml) + Plasma EV (500ml) + Plasma IV (500ml) + Krevní plazma (500ml) + 血しょう IV (500ml) + 혈장 IV (500ml) + 血浆 (500ml) + 血漿 (500ml) + + + Plasma IV (250ml) + Плазма для в/в вливания (250 мл) + Plasma IV (250ml) + Plasma (250ml) + Osocze IV (250ml) + Plasma IV (250ml) + Vérplazma-infúzió (250ml) + Plasma EV (250ml) + Plasma IV (250ml) + Krevní plazma (250ml) + 血しょう IV (250ml) + 혈장 IV (250ml) + 血浆 (250ml) + 血漿 (250ml) + + + Blood IV (1000ml) + Кровь для переливания (1000 мл) + Sangre IV (1000ml) + Culot sanguin IV (1000ml) + Krew IV (1000ml) + Blut IV (1000ml) + Vér-infúzió (1000ml) + Sangue EV (1000ml) + Sangue IV (1000ml) + Krevní transfúze (1000ml) + 血液 IV (1000ml) + 혈액 IV (1000ml) + 血液 (1000ml) + 血液 (1000ml) + + + Blood IV, for restoring a patients blood (keep cold) + Пакет крови для возмещения объёма потерянной крови (хранить в холодильнике) + Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) + Culot sanguin O-, utilisé seulement lors de perte sanguine majeure afin de remplacer le volume sanguin perdu. Habituellement utilisé lors du transport ou dans un établissement de soins. + Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych. + Vér-infúzió, intravénás bejuttatásra egy páciensnek (hidegen tárolandó) + Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue (conservare al fresco) + Blut IV, Bluthaushalt des Patienten wiederherstellen. (Kühl halten) + Sangue intravenoso, para restaurar o volume sanguinio do paciente.(Manter frio) + Krevní transfuze pro doplnění pacientovi krve (skladujte v chladu) + 血液 IV は、患者へ血液を補給します。(要低温保存) + 혈액 IV, 환자에게 혈액을 공급합니다. (차갑게 할것) + 血液, 用于补充伤者流失的血液 (需冷藏) + 血液, 用於補充傷者流失的血液 (需冷藏) + + + O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. + Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. + Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. + Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. + Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. + Culot sanguin O- utilisé dans de rares et stricts cas pour compléter une perte de sang importante. Administré normalement lors d'un MEDEVAC. + O Negative Blutinfusion wird nur in seltenen Fällen verwendet, um den Bluthaushalt des Patienten zu ergänzen. Wird in der Regel wärend der Transportphase durchgeführt. + Sangue O- , utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento. + Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben. + 0 Rh negativní krev se používá v vzácných případech k doplnění pacientovy hladiny krve, obvykle při převozu zraněné osoby do nemocnice. + O 型への輸血はまれで厳格であり、通常は治療のための輸送段階で輸血をおこないます。 + O- 형 혈액 투여는 매우 엄격하고 드문 혈액보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. + O型负值注射用血液, 在紧急情况时使用, 用于补充伤者流失的血液 + O型負值注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液 + + + Blood IV (500ml) + Кровь для переливания (500 мл) + Sangre IV (500ml) + Culot sanguin IV (500ml) + Krew IV (500ml) + Blut IV (500ml) + Vér-infúzió (500ml) + Sangue EV (500ml) + Sangue IV (500ml) + Krevní transfúze (500ml) + 血液 IV (500ml) + 혈액 IV (500ml) + 血液 (500ml) + 血液 (500ml) + + + Blood IV (250ml) + Кровь для переливания (250 мл) + Sangre IV (250ml) + Culot sanguin IV (250ml) + Krew IV (250ml) + Blut IV (250ml) + Vér-infúzió (250ml) + Sangue EV (250ml) + Sangue IV (250ml) + Krevní transfúze (250ml) + 血液 IV (250ml) + 혈액 IV (250ml) + 血液 (250ml) + 血液 (250ml) + + + Saline IV (1000ml) + Физраствор для в/в вливания (1000 мл) + Salino IV (1000ml) + Solution saline IV (1000ml) + Sól fizjologiczna IV (1000ml) + Kochsalzlösung (1000ml) + 0,9%-os sósvíz-infúzió (1000ml) + Soluzione salina EV (1˙000ml) + Soro IV (1000ml) + Fyziologický roztok (1000ml) + 生理食塩水 IV (1000ml) + 생리식염수 IV (1000ml) + 生理食盐水 (1000ml) + 生理食鹽水 (1000ml) + + + Saline IV, for restoring a patients blood + Пакет физраствора для возмещения объёма потерянной крови + Solución salina intravenosa, para restaurar el volumen sanguíneo + Solution saline, pour rétablir temporairement la tension artérielle + Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). + 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására + Soluzione salina, usata per ripristinare sangue nei pazienti. + Kochsalzlösung, ein medizinisches Volumenersatzmittel + Solução Salina Intravenosa 0.9%, para restaurar o volume de sangue temporariamente. + Fyziologický roztok se aplikuje intravenózně a slouží k obnově pacientovi krve + 生理食塩水 IV は、患者の血液量を補助します + 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 + 生理食盐水, 用于恢复伤者血液 + 生理食鹽水, 用於恢復傷者血液 + + + A medical volume-replenishing agent introduced into the blood system through an IV infusion. + Пакет физиологического раствора для возмещения объёма потерянной крови путем внутривенного вливания + Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. + Un remplacant temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse + Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). + Egy orvosi térfogat-helyreállító készítmény, melyet intravénás módon lehet a szervezetbe juttatni. + Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione EV. + Ein medizinisches Volumenersatzmittel, dass durch einen intravenösen Zugang in den Blutkreislauf verabreicht wird. + Uma reposição temporaria para restaurar a pressão arterial perdida por perda de sangue. + Fyziologický roztok se využívá nejčastěji jako infuze při dehydrataci organismu. + 生理食塩水 IV を静脈へ投与し、血液量を増加させることができます。 + 혈류에 IV로 투여되는 의료 용적 대체 요법 + 利用静脉注射进入人体血液系统, 帮助伤者血液恢复 + 利用靜脈注射進入人體血液系統, 幫助傷者血液恢復 + + + Saline IV (500ml) + Физраствор для в/в вливания (500 мл) + Salino IV (500ml) + Solution saline IV (500ml) + Sól fizjologiczna IV (500ml) + Kochsalzlösung (500ml) + 0,9%-os sósvíz-infúzió (500ml) + Soluzione salina EV (500ml) + Soro IV (1000ml) + Fyziologický roztok (500ml) + 生理食塩水 IV (500ml) + 생리식염수 IV (500ml) + 生理食盐水 (500ml) + 生理食鹽水 (500ml) + + + Saline IV (250ml) + Физраствор для в/в вливания (250 мл) + Salino IV (250ml) + Solution saline IV (250ml) + Sól fizjologiczna IV (250ml) + Kochsalzlösung (250ml) + 0,9%-os sósvíz-infúzió (250ml) + Soluzione salina EV (250ml) + Soro IV (1000ml) + Fyziologický roztok (250ml) + 生理食塩水 IV (250ml) + 생리식염수 IV (250ml) + 生理食盐水 (250ml) + 生理食鹽水 (250ml) + + + Basic Field Dressing (QuikClot) + Первичный перевязочный пакет (QuikClot) + Vendaje básico (QuickClot) + Bandage basique (Hémostatique) + Opatrunek QuikClot ACS + Verbandpäckchen (QuikClot) + Általános zárókötszer (QuikClot) + Bendaggio emostatico (QuikClot) + Bandagem básica (Coagulante) + Hemostatický obvaz (QuikClot) + 緊急圧迫止血包帯 (クイッククロット) + 필드 드레싱 (퀵 클롯) + 基本战地包扎 (止血粉) + 基本戰地包紮 (止血粉) + + + QuikClot bandage + Гемостатический пакет QuikClot + Vendaje QuikClot + Bandage hémostatique + Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. + Bandage mit Gerinnungsmittel + QuikClot kötszer + Bendaggio emostatico (QuikClot) + Bandagem com agente coagulante + Hemostatický obvaz (QuikClot) + クイッククロット + 퀵 클롯 붕대 + 止血粉绷带 + 止血粉繃帶 + + + Hemostatic bandage with coagulant that stops bleeding. + Медицинский коагулянт для экстренной остановки кровотечения + Un bandage aidant à coaguler les saignements mineurs à moyens. + Proszkowy opatrunek adsorpcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. + Vendaje hemostático con coagulante que detiene el sangrado. + Verband mit Gerinnungsmittel, um starke Blutung zu behandeln. + Hemostatikus kötszer egy vérzésgátló anyaggal. + Bendaggio emostatico con coagulante che permette di arrestare perdite di sangue + Bandagem Hemostática com coagulante que controla hemorragia médias e grandes com risco de vida. + Hemostatický obvaz určený k zástavě krvácení + 血液凝固剤をふくむ包帯により、止血できます。 + 지혈시 사용하는 붕대로 혈액 응고제를 포함하고있습니다. + 包含止血粉成分的止血绷带, 可用于止血 + 包含止血粉成分的止血繃帶, 可用於止血 + + + Personal Aid Kit + Аптечка + Trousse sanitaire + Equipo de primeros auxilios + Apteczka osobista + Persönliches Erste-Hilfe-Set + Elsősegélycsomag + Pronto soccorso personale + Kit De Primeiros Socorros Pessoal + Osobní lékárnička (PAK) + 応急処置キット + 개인응급키트 + 个人急救包 + 個人急救包 + + + Includes various treatment kit needed for stitching or advanced treatment + Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. + Incluye material médico para tratamientos avanzados + Inclut du matériel medical pour les traitements délicats, tel les points de suture. + Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego. + Beinhaltet medizinisches Material für fortgeschrittene Behandlung und zum Nähen. + Változatos segédfelszereléseket tartalmaz sebvarráshoz és haladó elsősegélynyújtáshoz + Include vario materiale medico per trattamenti avanzati. + Inclui vários tratamentos materiais para custura e tratamento avançado + Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných + 縫合や高度な処置に必要とされる、さまざまな治療器具が含まれています。 + 봉합및 고급 조치에 필요한 다양한 치료 도구가 있습니다. + 包含各种医疗套件, 以及进阶伤口系统需要的缝合用品 + 包含各種醫療套件, 以及進階傷口系統需要的縫合用品 + + + Personal Aid Kit for in field stitching or advanced treatment + W znacznym stopniu poprawia stan pacjenta + Полевая аптчека для продвинутого лечения и зашивания ран + Persönliches Erste-Hilfe-Set zum ambulanten Nähen und fortgeschrittener Behandlung. + Inclut du matériel medical pour les traitements délicats, tel les points de suture. + Equipo de primeros auxilios para sutura de campaña o tratamientos avanzados + Elsősegélycsomag, terepen való sebvarráshoz és haladó ellátáshoz + Kit de primeiros socorros para sutura ou tratamentos avançados + Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných v poli + Pronto soccorso personale da campo per mettersi i punti o per trattamenti avanzati. + 戦場で縫合や高度な処置に必要とされる、さまざまな治療器具が含まれています。 + 야전에서 봉합및 고급 조치를 위한 개인응급키트 + 个人急救包可用于战地缝合手术或进阶伤口系统使用 + 個人急救包可用於戰地縫合手術或進階傷口系統使用 + + + Use Personal Aid Kit + Erste-Hilfe-Set benutzen + Использовать аптечку + Utiliser la trousse sanitaire + Użyj apteczki osobistej + Usar equipo de primeros auxilios + Elsősegélycsomag használata + Usar o kit de primeiros socorros + Použít osobní lékárničku (PAK) + Usa il pronto soccorso personale + 応急処置キットをつかう + 개인 응급 키트사용하기 + 使用个人急救包 + 使用個人急救包 + + + Surgical Kit + Trousse chirurgicale + Хирургический набор + Kit quirúrgico + Zestaw do szycia ran + Operationsset + Sebészeti készlet + Kit chirurgico + Kit Cirurgico + Chirurgická sada + 縫合キット + 봉합 키트 + 手术包 + 手術包 + + + Surgical Kit for in field advanced medical treatment + Trousse chirurgicale pour le traitement sur le terrain + Набор для хирургической помощи в полевых условиях + Kit quirúrgico para el tratamiento avanzado en el campo de batalla + Zestaw pozwalający na zszywanie ran w polu + Operationsset für fortgeschrittene medizinische Feldversorgung + Sebészeti készlet komplex orvosi feladatok terepen való ellátására + Kit chirurgico per trattamenti avanzati sul campo. + Kit Cirurgico para uso de tratamento médico avançado em campo + Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli + 縫合キットは戦場で高度な処置をするためにつかわれます。 + 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) + + + Surgical Kit for in field advanced medical treatment + Набор для хирургической помощи в полевых условиях + Kit quirúrgico para el tratamiento avanzado en el campo de batalla + Zestaw pozwalający na zszywanie ran w polu + Operationsset für fortgeschrittene medizinische Feldversorgung + Trousse chirurgicale pour le traitement sur le terrain + Sebészeti készlet komplex orvosi feladatok terepen való ellátására + Kit chirurgico per trattamenti avanzati sul campo. + Kit Cirurgico para uso de tratamento médico avançado em campo. + Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli + 縫合キットは戦場で高度な処置をするためにつかわれます。 + 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用於在戰場上為傷口進行縫合(需要開啟進階傷口系統) + + + Use Surgical Kit + Operationsset benutzen + Usa kit chirurgico + Использовать хирургический набор + Utiliser la trousse chirugicale + Zszyj rany + Usar equipo quirúrgico + Sebészeti készlet használata + Použít chirurgickou sadu + Usar kit cirúrgico + 縫合キットをつかう + 봉합키트 사용하기 + 使用手术包 + 使用手術包 + + + Bodybag + Housse mortuaire + Мешок для трупов + Bolsa para cadáveres + Worek na zwłoki + Leichensack + Hullazsák + Sacca per corpi + Saco para cadáver + Pytel na mrtvoly + 死体袋 + 시체 가방 + 尸袋 + 屍袋 + + + A bodybag for dead bodies + Housse de transport des corps + Мешок для упаковки трупов + Una bolsa para cadáveres + Worek do pakowania zwłok + Ein Leichensack für Tote + Egy hullazsák a holttestek számára + Una sacca nera per trasportare cadaveri. + Um saco para corpos mortos + Pytel na mrtvoly + 死体袋は死体を入れるためにつかいます + 시체를 운반할때 쓰는 가방입니다 + 用来装尸体用 + 用來裝屍體用 + + + A bodybag for dead bodies + Housse de transport des corps + Мешок для упаковки трупов + Una bolsa para cadáveres + Worek do pakowania zwłok + Ein Leichensack für Tote + Egy hullazsák a holttestek számára + Una sacca nera per trasportare cadaveri. + Um saco para corpos mortos. + Pytel na mrtvoly + 死体袋は死体を入れるためにつかいます + 시체를 운반할때 쓰는 가방입니다 + 用来装尸体用 + 用來裝屍體用 + + + No injuries on this bodypart... + Körperteil nicht verletzt... + Non ci sono ferite in questa parte del corpo... + Данная часть тела не повреждена... + Aucune blessures sur cette partie du corps... + Brak obrażeń na tej części ciała... + Sin heridas en esta parte del cuerpo... + Ezen a testrészen nincs sérülés... + Žádné zranění na této části těla... + Nenhum ferimento nesta parte do corpo... + この身体は怪我をしていません・・・ + 이 부위에는 부상이 없습니다... + 此身体部位没有受伤 + 此身體部位沒有受傷 + + + Inject Adenosine + Adenosin injizieren + Inyectar Adenosina + Wstrzyknij adenozynę + Adénosine + Inietta andenosina + Aplikovat adenosine + Injetar Adenosina + Ввести аденозин + アデノシンを投与 + 아데노신 주사 + 注射腺苷 + 注射腺苷 + + + Inject Atropine + Atropin injizieren + Inyectar Atropina + Aplikovat atropin + Wstrzyknij atropinę + Atropine + Ввести атропин + Atropin beadása + Inietta atropina + Injetar Atropina + アトロピンを投与 + 아트로핀 주사 + 注射阿托品 + 注射阿托品 + + + Inject Epinephrine + Epinephrine injizieren + Inyectar Epinefrina + Wstrzyknij adrenalinę + Aplikovat adrenalin + Épinéphrine + Ввести адреналин + Epinefrin beadása + Injetar Epinefrina + Inietta adrenalina + アドレナリンを投与 + 에피네프린 주사 + 注射肾上腺素 + 注射腎上腺素 + + + Inject Morphine + Morphin injizieren + Inyectar Morfina + Wstrzyknij morfinę + Aplikovat morfin + Ввести морфин + Morphine + Morfium beadása + Injetar Morfina + Inietta morfina + モルヒネを投与 + 모르핀 주사 + 注射吗啡 + 注射嗎啡 + + + Transfuse Blood + Bluttransfusion + Transfundir sangre + Przetocz krew + Transfúze krve + Перелить кровь + Transfuser (sang) + Infúzió (vér) + Transfundir Sangue + Trasfusione di sangue + 輸血する + 혈액 수혈 + 输血液 + 輸血液 + + + Transfuse Plasma + Plasmatransfusion + Transfundir plasma + Transfúze plazmy + Przetocz osocze + Transfuser (plasma) + Перелить плазму + Infúzió (vérplazma) + Trasfusione di plasma + Transfundir Plasma + 血しょうを投与 + 혈장 수혈 + 输血浆 + 輸血漿 + + + Transfuse Saline + Salzlösungstransfusion + Transfundir salino + Transfúze fyziologického roztoku + Przetocz sól fizjologiczną + Transfuser (saline) + Перелить физраствор + Infúzió (sós víz) + Trasfusione di soluzione salina + Transfundir Soro + 生理食塩水を投与 + 생리식염수 수혈 + 注射生理食盐水 + 注射生理食鹽水 + + + Apply Tourniquet + Tourniquet anwenden + Aplicar torniquete + Aplikovat škrtidlo + Załóż stazę + Poser garrot + Наложить жгут + Applica laccio emostatico + Aplicar Torniquete + Érszorító alkalmazása + 止血帯を巻く + 지혈대 적용 + 使用军用止血带 + 使用軍用止血帶 + + + Bandage + Verbinden + Venda + Bandażuj + Obvázat + Panser + Benda + Kötözés + Atadura + Перевязать + 包帯 + 붕대 + 绷带 + 繃帶 + + + Bandage Head + Kopf verbinden + Vendar la cabeza + Bandażuj głowę + Obvázat hlavu + Перевязать голову + Panser Tête + Fej kötözése + Atar Cabeça + Benda la testa + 包帯を頭へ + 머리에 붕대감기 + 绷带包扎 头部 + 繃帶包紮 頭部 + + + Bandage Torso + Torso verbinden + Vendar el torso + Bandażuj tors + Obvázat hruď + Перевязать торс + Panser Torse + Testtörzs kötözése + Atar Tronco + Benda il torso + 包帯を胴体へ + 몸통에 붕대감기 + 绷带包扎 身体 + 繃帶包紮 身體 + + + Bandage Left Arm + Linken Arm verbinden + Vendar el brazo izquierdo + Bandażuj lewe ramię + Obvázat levou ruku + Перевязать левую руку + Panser Bras Gauche + Bal kar kötözése + Atar Braço Esquerdo + Benda il braccio sinistro + 包帯を左腕に + 왼팔에 붕대감기 + 绷带包扎 左手 + 繃帶包紮 左手 + + + Bandage Right Arm + Rechten Arm verbinden + Vendar el brazo derecho + Bandażuj prawe ramię + Obvázat pravou ruku + Перевязать правую руку + Panser Bras Droit + Jobb kar kötözése + Atar Braço Direito + Benda il braccio destro + 包帯を右腕に + 오른팔에 붕대감기 + 绷带包扎 右手 + 繃帶包紮 右手 + + + Bandage Left Leg + Linkes Bein verbinden + Vendar la pierna izquierda + Bandażuj lewą nogę + Obvázat levou nohu + Перевязать левую ногу + Panser Jambe Gauche + Bal láb kötözése + Atar Perna Esquerda + Benda la gamba sinistra + 包帯を左足へ + 왼쪽 다리에 붕대감기 + 绷带包扎 左脚 + 繃帶包紮 左腳 + + + Bandage Right Leg + Rechtes Bein verbinden + Vendar la pierna derecha + Bandażuj prawą nogę + Obvázat pravou nohu + Перевязать правую ногу + Panser Jambe Droite + Jobb láb kötözése + Atar Perna Direita + Benda la gamba destra + 包帯を右足へ + 오른쪽 다리에 붕대감기 + 绷带包扎 右脚 + 繃帶包紮 右腳 + + + Injecting Morphine... + Morphin injizieren... + Inyectando Morfina... + Wstrzykiwanie morfiny... + Aplikuji morfin... + Введение морфина... + Injection (morphine)... + Morfium beadása... + Injetando Morfina... + Inietto la morfina... + モルヒネを投与しています・・・ + 모르핀 주사중... + 吗啡注射中... + 嗎啡注射中... + + + Injecting Epinephrine... + Epinephrin injizieren... + Inyectando Epinefrina... + Wstrzykiwanie adrenaliny... + Aplikuji adrenalin... + Введение адреналина... + Injection (épinéphrine)... + Epinefrin beadása... + Injetando Epinefrina... + Inietto l'adrenalina... + アドレナリンを投与しています・・・ + 에피네프린 주사중... + 肾上腺素注射中... + 腎上腺素注射中... + + + Injecting Adenosine... + Adenosin injizieren... + Inyectando Adenosina... + Wstrzykiwanie adenozyny... + Injection (adénosine)... + Inietto l'andenosina + Aplikuji adenosine... + Injetando Adenosina... + Введение аденозина... + アドネシンを投与しています・・・ + 아데노신 주사중... + 腺苷注射中... + 腺苷注射中... + + + Injecting Atropine... + Atropin injizieren... + Inyectando Atropina... + Aplikuji atropin... + Wstrzykiwanie atropiny... + Injection (atropine)... + Введение атропина... + Atropin beadása... + Inietto l'atropina... + Injetando Atropina + アトロピンを投与しています・・・ + 아트리핀 주사중... + 阿托品注射中 ... + 阿托品注射中 ... + + + Transfusing Blood... + Bluttransfusion... + Transfusión de sangre... + Przetaczanie krwi... + Probíhá transfúze krve... + Переливание крови... + Transfusion (sang)... + Infúzió vérrel... + Transfundindo Sangue... + Effettuo la trasfusione di sangue... + 輸血しています・・・ + 혈액 수혈중... + 输血液中 ... + 輸血液中 ... + + + Transfusing Saline... + Salzlösungtransfusion... + Transfusión de salino... + Probíha transfúze fyziologického roztoku... + Przetaczanie soli fizjologicznej... + Transfusion (solution saline)... + Переливание физраствора... + Infúzió sós vizzel... + Effettuo la rasfusione di soluzione salina + Transfundindo Soro... + 生理食塩水を投与しています・・・ + 생리식염수 수혈중... + 施打生理食盐水中 ... + 施打生理食鹽水中 ... + + + Transfusing Plasma... + Plasmatransfusion... + Transfusión de plasma... + Probíha transfúze plazmy... + Przetaczanie osocza... + Transfusion (plasma)... + Переливание плазмы... + Infúzió vérplazmával... + Effettu la trasfusione di plasma... + Transfundindo Plasma... + 血しょうを投与しています・・・ + 혈장 수혈중... + 输血浆中 ... + 輸血漿中 ... + + + Bandaging... + Verbinden... + Vendando... + Bandażowanie... + Obvazuji... + Pansement... + Sto bendando... + Bekötözés... + Atando... + Перевязывание... + 包帯を巻いています・・・ + 붕대감는중... + 绷带包扎中 ... + 繃帶包紮中 ... + + + Applying Tourniquet... + Setze Tourniquet an... + Aplicando torniquete... + Aplikuji škrtidlo... + Zakładanie stazy... + Pose du garrot... + Наложение жгута... + Érszorító felhelyezése... + Sto applicando il laccio emostatico... + Applicando Torniquete + 止血帯を巻いています・・・ + 지혈대 적용중... + 使用军用止血带中 ... + 使用軍用止血帶中 ... + + + Field Dressing + Wundverband + Compresa de campaña + Бинтовая повязка + Obinadlo + Bandaż jałowy + Pansement individuel + Zárókötszer + Bendaggio rapido + Curativo de Campo + 緊急圧迫包帯 + 필드 드레싱 + 基础绷带 + 基礎繃帶 + + + Packing Bandage + Mullbinde + Vendaje compresivo + Компресионный пакет + Bandaż uciskowy + Nyomókötszer + Bendaggio compressivo + Bande extensible + Bandagem de Compressão + Obvaz Tlakový + 弾性包帯 + 거즈 붕대 + 包扎绷带 + 包紮繃帶 + + + Elastic Bandage + Elastischer Verband + Vendaje elástico + Давящая повязка + Obavaz Elastický + Bandaż elastyczny + Bande compressive + Rögzitő kötszer + Bendaggio elastico + Bandagem Elástica + 伸縮包帯 + 압박 붕대 + 弹性绷带 + 彈性繃帶 + + + QuikClot + QuikClot + QuikClot + QuikClot + Opatrunek QuikClot + QuikClot + Bandage hémostatique + QuikClot + QuikClot (polvere emostatica) + QuikClot + クイッククロット + 퀵 클롯 + 止血粉 + 止血粉 + + + Check Pulse + Puls überprüfen + Comprobar pulso + Проверить пульс + Zkontrolovat puls + Sprawdź tętno + Prendre le pouls + Pulzus ellenőrzése + Controlla il polso + Checar Pulso + 心拍数をはかる + 맥박 확인 + 检查脉搏 + 檢查脈搏 + + + Check Blood Pressure + Blutdruck überprüfen + Comprobar presión arterial + Проверить давление + Zkontrolovat krevní tlak + Sprawdź ciśnienie krwi + Prendre la tension + Vérnyomás megmérése + Controlla pressionsa sanguigna + Chegar Pressão Sanguínea + 血圧をはかる + 혈압 확인 + 检查血压 + 檢查血壓 + + + No entries on this triage card. + Keine Einträge auf der Triagekarte + Nessuna voce sulla Triage Card + Нет записей. + Fiche vide + Brak wpisów w tej karcie segregacyjnej. + Sin entradas en esta tarjeta de clasificación. + Ez az orvosi lap nem tartalmaz bejegyzést. + Žádné záznamy na tomto štítku + Nenhuma entrada neste cartão de triagem + トリアージ カードには何も無い。 + 부상자 분류 카드에 쓰여있는것이 없습니다. + 此检伤分类卡上没有任何资料 + 此檢傷分類卡上沒有任何資料 + + + Tourniquet + Tourniquet + Torniquete + Жгут + Škrtidlo + Staza + Garrot + Érszorító + Laccio emostatico + Torniquete + 止血帯 + 지혈대 + 军用止血带 + 軍用止血帶 + + + Remove Tourniquet + Tourniquet entfernen + Quitar torniquete + Снять жгут + Sundat škrtidlo + Zdejmij stazę + Enlever garrot + Érszorító leszedése + Rimuovi laccio emostatico + Remover Torniquete + 止血帯をはずす + 지혈대 제거 + 移除军用止血带 + 移除軍用止血帶 + + + Diagnose + Diagnose + Diagnosi + Диагностика + Diagnostiquer + Diagnoza + Diagnosticar + Diagnosztizálás + Diagnóza + Diagnosticar + 診断する + 진단 + 诊断 + 診斷 + + + Diagnosing... + Diagnostizieren... + Diagnosi in corso... + Диагностика... + Diagnostic en cours + Diagnozowanie... + Diagnosticando... + Diagnózis folyamatban... + Diagnostika... + Diagnosticando... + 診断しています・・・ + 진단중... + 诊断中... + 診斷中... + + + CPR + HLW + RCP + Сердечно-лёгочная реанимация + RCP + RKO + RCP + Újraélesztés + CPR + SBV + 心肺蘇生 + 심폐소생술 + 心肺复苏术 + 心肺復甦術 + + + Performing CPR... + HLW durchführen... + Eseguendo RCP... + Сердечно-лёгочная реанимация... + RCP en cours + Przeprowadzanie RKO... + Realizando RCP... + Újraélesztés folyamatban... + Provádím CPR... + Realizando o SBV... + 心肺蘇生をしています・・・ + 심폐소생중... + 进行心肺复苏术中... + 進行心肺復甦術中... + + + Give Blood IV (1000ml) + Bluttransfusion IV (1000ml) + Dar Sangre IV (1000ml) + Перелить пакет крови (1000 мл) + Podaj krew IV (1000ml) + Sang en IV (1000ml) + Podat krev. transfúzi (1000ml) + Vér adása intravénásan (1000ml) + Effettua trasfusione sangue EV (1˙000ml) + Administrar Sangue IV (1000ml) + 血液 IV (1000ml) をあたえる + IV 혈액 수혈 (1000ml) + 输血液 (1000ml) + 輸血液 (1000ml) + + + Give Blood IV (500ml) + Bluttransfusion IV (500ml) + Dar Sangre IV (500ml) + Перелить пакет крови (500 мл) + Podaj krew IV (500ml) + Sang en IV (500ml) + Podat krev. transfúzi (500ml) + Vér adása intravénásan (500ml) + Effettua trasfusione sangue EV (500ml) + Administrar Sangue IV (500ml) + 血液 IV (500ml) をあたえる + IV 혈액 수혈 (500ml) + 输血液 (500ml) + 輸血液 (500ml) + + + Give Blood IV (250ml) + Bluttransfusion IV (250ml) + Dar Sangre IV (250ml) + Перелить пакет крови (250 мл) + Podaj krew IV (250ml) + Sang en IV (250ml) + Podat krev. transfúzi (250ml) + Vér adása intravénásan (250ml) + Effettua trasfusione sangue EV (250ml) + Administrar Sangue IV (250ml) + 血液 IV (250ml) をあたえる + IV 혈액 수혈 (250ml) + 输血液 (250ml) + 輸血液 (250ml) + + + Give Plasma IV (1000ml) + Plasmatransfusion IV (1000ml) + Dar Plasma IV (1000ml) + Перелить пакет плазмы (1000 мл) + Podaj osocze IV (1000ml) + Plasma en IV (1000ml) + Podat plazmu (1000ml) + Vérplazma adása intravénásan (1000ml) + Effettua trasfusione plasma EV (1˙000ml) + Administrar Plasma IV (1000ml) + 血しょう IV (1000ml) をあたえる + IV 혈장 수혈 (1000ml) + 输血浆 (1000ml) + 輸血漿 (1000ml) + + + Give Plasma IV (500ml) + Plasmatransfusion IV (500ml) + Dar Plasma IV (500ml) + Перелить пакет плазмы (500 мл) + Podaj osocze IV (500ml) + Plasma en IV (500ml) + Podat plazmu (500ml) + Vérplazma adása intravénásan (500ml) + Effettua trasfusione plasma EV (500ml) + Administrar Plasma IV (500ml) + 血しょう IV (500ml) をあたえる + IV 혈장 수혈 (500ml) + 输血浆 (500ml) + 輸血漿 (500ml) + + + Give Plasma IV (250ml) + Plasmatransfusion IV (250ml) + Dar Plasma IV (250ml) + Перелить пакет плазмы (250 мл) + Podaj osocze IV (250ml) + Plasma en IV (250ml) + Podat plazmu (250ml) + Vérplazma adása intravénásan (250ml) + Effettua trasfusione plasma EV (250ml) + Administrar Plasma IV (250ml) + 血しょう IV (250ml) をあたえる + IV 혈장 수혈 (250ml) + 输血浆 (250ml) + 輸血漿 (250ml) + + + Give Saline IV (1000ml) + Kochsalzlösung IV (1000ml) + Dar Salino IV (1000ml) + Перелить пакет физраствора (1000 мл) + Podaj sól fizjologiczną IV (1000ml) + Solution saline en IV (1000ml) + Podaz fyz. roztok (1000ml) + Sós víz adása intravénásan (1000ml) + Effettua trasfusione salina EV (1˙000ml) + Administrar Soro IV (1000ml) + 生理食塩水 IV (1000ml) をあたえる + IV 생리식염수 수혈 (1000ml) + 注射生理食盐水 (1000ml) + 注射生理食鹽水 (1000ml) + + + Give Saline IV (500ml) + Kochsalzlösung IV (500ml) + Dar Salino IV (500ml) + Перелить пакет физраствора (500 мл) + Podaj sól fizjologiczną IV (500ml) + Solution saline en IV (500ml) + Podaz fyz. roztok (500ml) + Sós víz adása intravénásan (500ml) + Effettua trasfusione salina EV (500ml) + Administrar Soro IV (500ml) + 生理食塩水 IV (500ml) をあたえる + IV 생리식염수 수혈 (500ml) + 注射生理食盐水 (500ml) + 注射生理食鹽水 (500ml) + + + Give Saline IV (250ml) + Kochsalzlösung IV (250ml) + Dar Salino IV (250ml) + Перелить пакет физраствора (250 мл) + Podaj sól fizjologiczną IV (250ml) + Solution saline en IV (250ml) + Podaz fyz. roztok (250ml) + Sós víz adása intravénásan (250ml) + Effettua trasfusione salina EV (250ml) + Administrar Soro IV (250ml) + 生理食塩水 IV (250ml) をあたえる + IV 생리식염수 수혈 (250ml) + 注射生理食盐水 (250ml) + 注射生理食鹽水 (250ml) + + + Minimal + + + Delayed + Retrasado + Срочная помощь + Opóźniony + Traitement urgent + Verzögert + Odložitelný + Késleltetett + Differito + Atrasado + 待機的治療群 + 늦어짐 + 延后 + 延後 + + + Immediate + Inmediato + Неотложная помощь + Natychmiastowy + Traitement immédiat + Sofort + Okamžitý + Azonnali + Immediata + Imediato + 再優先治療群 + 긴급 + 紧急 + 緊急 + + + Deceased + Fallecido + Труп + Nie żyje + Décédé + Verstorben + Mrtvý + Elhalálozott + Deceduto + Falecido + 死亡群 + 사망 + 死亡 + 死亡 + + + None + Ninguno + Отсутствует + Brak + Pas de fiche + Keine + Nic + Semmi + Nessuna + Nenhum + なし + 없음 + 未分类 + 未分類 + + + Normal breathing + Дыхание в норме + Respiración normal + Respiration normale + Normalny oddech + Normale Atmung + Dýchá normálně + Normális légzés + Respiro normale + Respiração normal + 通常の呼吸 + 정상 호흡 + 呼吸正常 + 呼吸正常 + + + No breathing + Keine Atmung + Дыхание отсутствует + No respira + Pas de respiration + Brak oddechu + Nedýchá + Nincs légzés + Mancanza di respiro + Não respira + 息をしていない + 호흡 불가 + 没有呼吸 + 沒有呼吸 + + + Difficult breathing + Дыхание затруднено + Dificultad para respirar + Difficulté respiratoire + Trudności z oddychaniem + Schwere Atmung + Dýchá s obtížemi + Nehéz légzés + Difficoltà a respirare + Dificuldade para respirar + 呼吸が苦しそうだ + 호흡 곤란 + 呼吸困难 + 呼吸困難 + + + Almost no breathing + Beinahe keine Atmung + Дыхание очень слабое + Casi sin respiración + Respiration faible + Prawie brak oddechu + Skoro nedýchá + Alig van légzés + Respira a fatica + Quase não respira + ほとんど呼吸をしていない + 호흡이 없음 + 快要没呼吸 + 快要沒呼吸 + + + In mild pain + Hat leichte Schmerzen + + + In pain + Hat Schmerzen + Испытывает боль + Con dolor + Douleur moyenne + W bólu + V bolestech + Fájdalom alatt + Con dolore + Com dor + 痛みがある + 고통 + 疼痛中 + 疼痛中 + + + In severe pain + Hat starke Schmerzen + + + Tourniquet [CAT] + Tourniquet [CAT] + Жгут + Torniquete [CAT] + Garrot [CAT] + Staza [typ. CAT] + Škrtidlo [CAT] + Érszorító [CAT] + Laccio emostatico [CAT] + Torniquete [CAT] + 止血帯 [CAT] + 지혈대 [CAT] + 军用止血带 + 軍用止血帶 + + + Receiving IV [%1ml] + Erhalte IV [%1ml] + Recibiendo IV [%1ml] + Принимается переливание [%1 мл] + Otrzymywanie IV [pozostało %1ml] + Transfusion : [%1ml] + Přijímání transfúze [%1ml] + Infúzióra kötve [%1ml] + Ricevendo EV [%1ml] + Recebendo IV [%1ml] + IV [%1ml] を投与されている + IV로 [%1ml] 수혈중 + 接收静脉注射液中 [%1ml] + 接收靜脈注射液中 [%1ml] + + + Blood Pressure + Tension artérielle + Артериальное давление + Presión arterial + Ciśnienie krwi + Blutdruck + Vérnyomás + Pressione sanguigna + Pressão Arterial + Krevní tlak + 血圧を測る + 혈압 + 血压 + 血壓 + + + Checking Blood Pressure.. + Prise de la tension... + Проверка артериального давления... + Comprobando presión arterial... + Sprawdzanie ciśnienia krwi... + Blutdruck kontrollieren... + Vérnyomás megmérése... + Controllando la pressione sanguigna.. + Aferindo Pressão Arterial... + Měřím krevní tlak... + 血圧を測定しています・・・ + 혈압 측정증... + 检查血压中... + 檢查血壓中... + + + %1 checked Blood Pressure: %2 + %1 kontrollierte Blutdruck: %2 + %1 controllata pressione sanguigna: %2 + %1 проверил артериальное давление: %2 + %1 a mesuré la tension: %2 + %1 sprawdził ciśnienie krwi: %2 + %1 verificada la presión arterial: %2 + %1 ellenőrizte a vérnyomást: %2 + %1 zkontroloval krevní tlak: %2 + %1 verificou pressão arterial: %2 + %1 が測った血圧は: %2 + %1 (이)가 혈압을 측정했습니다: %2 + 已由%1确认血压: %2 + 已由%1確認血壓: %2 + + + You checked %1 + Vous examinez %1 + Вы осмотрели раненого %1 + Examinando a %1 + Zbadałeś %1 + Kontrolliert %1 + A %1 ellenőrizve + Hai diagnosticato %1 + Você verificou o paciente %1 + Zkontroloval jsi %1 + 自分の血圧は %1 + 나의 혈압은 %1 이다 + 你已经检查 %1 + 你已經檢查 %1 + + + You find a blood pressure of %2/%3 + Vous avez mesuré une tension de %2/%3 + Артериальное давление %2/%3 + La Presión Arterial es %2/%3 + A vérnyomás %2/%3 + Hai riscontrato una pressione di %2/%3 + Wyczuwasz ciśnienie krwi o wartości %2/%3 + Der Blutdruck liegt bei %2/%3 + A Pressão Arterial é de %2/%3 + Naměřil si krevní tlak u %2/%3 + 血圧は %2/%3 + 혈압이 %2/%3 이다 + 血压为%2/%3 + 血壓為%2/%3 + + + You find a low blood pressure + Tension basse + Давление низкое + La presión arterial es baja + Wyczuwasz niskie ciśnienie krwi + Blutdruck ist niedrig + A vérnyomás alacsony + La pressione sanguigna è bassa + Pressão Arterial baixa + Naměřil si nízký krevní tlak + 血圧はかなり低い + 혈압이 매우 낮다 + 发现到低血压 + 發現到低血壓 + + + You find a normal blood pressure + Tension normale + Давление нормальное + La presión arterial es normal + Wyczuwasz normalne ciśnienie krwi + Blutdruck ist normal + A vérnyomás normális + La pressione sanguigna è normale + Pressão Arterial normal + Naměřil si normální krevní tlak + 血圧は通常 + 혈압이 정상이다 + 发现到正常血压 + 發現到正常血壓 + + + You find a high blood pressure + Tension élevée + Давление высокое + La presión arterial es alta + Wyczuwasz wysokie ciśnienie krwi + Blutdruck ist hoch + A vérnyomás magas + La pressione sanguigna è alta + Pressão Arterial Alta + Naměřil si vysoký krevní tlak + 血圧はかなり高い + 혈압이 매우 높다 + 发现到高血压 + 發現到高血壓 + + + You find no blood pressure + Pas de tension + Давления нет + No hay presión arterial + Nie wyczuwasz ciśnienia krwi + Patient hat keinen Blutdruck + Nem észlelhető vérnyomás + La pressione sanguigna è assente + Sem Pressão Arterial + Nenaměřil si žádný krevní tlak + 血圧は測れなかった + 혈압이 잡히지 않는다 + 量不到血压 + 量不到血壓 + + + You fail to find a blood pressure + Vous n'avez pas pu mesurer de tension + Артериальное давление не определяется + No puedes encontrar presión arterial + Nie udało Ci się sprawdzić ciśnienia krwi + Du konntest keinen Blutdruck feststellen + Nem sikerült a vérnyomás megmérése + Manca strumento per misurare pressione sanguigna + Você falhou em aferir a Pressão Arterial + Nedokázal si změřit krevní tlak + 血圧を測るのに失敗 + 혈압을 잡을 수 없었다 + 检查血压的动作失败 + 檢查血壓的動作失敗 + + + Low + Niedrig + Bassa + Низкое + basse + Niskie + Baja + Alacsony + Nízký + Baixa + 低い + 낮음 + + + + + Normal + Normal + Normale + Нормальное + normale + Normalne + Normal + Normális + Normální + Normal + 通常 + 보통 + 正常 + 正常 + + + High + Hoch + Alta + Высокое + élevée + Wysokie + Alta + Magas + Vysoký + Alta + 高い + 높음 + + + + + No Blood Pressure + Kein Blutdruck + Nessuna Pressione Sanguigna + Артериальное давление отсутствует + pas de tension + Brak ciśnienia krwi + Sin presión arterial + Nincs vérnyomás + Žádný krevní tlak + Sem pressão arterial + 血圧なし + 혈압 없음 + 无血压 + 無血壓 + + + Pulse + Пульс + Pouls + Pulso + Tętno + Puls + Pulzus + Polso + Pulso + Puls + 心拍数 + 맥박 + 脉搏 + 脈搏 + + + Checking Heart Rate... + Vérification du pouls... + Проверка пульса... + Comprobando ritmo cardíaco... + Sprawdzanie tętna... + Kontrolliere Herzfrequenz... + Szívverés-szám mérése... + Controllando il battito cardiaco... + Aferindo Pulso... + Kontroluji srdeční tep... + 心拍数を測定しています・・・ + 맥박 확인중... + 检查心跳中... + 檢查心跳中... + + + You checked %1 + Вы осмотрели раненого %1 + Vous examinez %1 + Examinando a %1 + Zbadałeś %1 + Kontrolliert %1 + A %1 ellenőrizve + Hai diagnosticato %1 + Você aferiu o paciente %1 + Zkontroloval si %1 + 心拍数は %1 + 나의 맥박은 %1 이다 + 你已经检查 %1 + 你已經檢查 %1 + + + %1 checked Heart Rate: %2 + %1 kontrollierte Herzfrequenz: %2 + %1 Controllata Frequenza Cardiaca: %2 + %1 проверил пульс: %2 + %1 a vérifié le pouls de : %2 + %1 sprawdził tętno: %2 + %1 verificado el ritmo cardíaco: %2 + %1 ellenőrizte a szívverés-számot: %2 + %1 zkontroloval srdeční tep: %2 + %1 verificou a frequência cardíaca: %2 + %1 が測った心拍数は: %2 + %1 (이)가 맥박을 측정했습니다: %2 + 已由%1确认心跳: %2 + 已由%1確認心跳: %2 + + + None + Нет + Żadna + Nada + Keine + Žádný + Nada + aucun + Nincs + Niente + なし + 없음 + + + + + Weak + Schwach + Lento + Слабый + lent + Słabe + Débil + Gyenge + Slabý + Fraca + 弱い + 약함 + 微弱 + 微弱 + + + Normal + Normal + Normale + Нормальный + normal + Normalne + Normal + Normális + Normální + Normal + 通常 + 보통 + 正常 + 正常 + + + Strong + Stark + Veloce + Сильный + rapide + Silne + Fuerte + Erős + Silný + Forte + 強い + 강함 + 过快 + 過快 + + + You find a Heart Rate of %2 + %2 battements par minute + Пульс %2 уд./мин. + El ritmo cardíaco es de %2 + Wyczuwasz tętno o wartości %2 + Herzfrequenz ist %2 + A szívverés-szám %2 + Il battito cardiaco è %2 + A Freqüência Cardíaca é de %2 + Nahmatal jsi srdeční tep u %2 + 心拍数は %2 + 맥박이 %2 이다 + 心跳为%2 + 心跳為%2 + + + You find a weak Heart Rate + Poulslent + Пульс слабый + El ritmo cardíaco es débil + Wyczuwasz słabe tętno + Schwacher Puls + A szívverés-szám alacsony + Hai riscontrato un debole battito cardiaco + Freqüência Cardíaca baixa + Nahmatal si slabý srdeční puls + 自分の心拍数は低い + 약한 맥박이다 + 心跳微弱 + 心跳微弱 + + + You find a strong Heart Rate + pouls rapide + Пульс учащенный + El ritmo cardíaco está acelerado + Wyczuwasz silne tętno + Starker Puls + A szívverés-szám magas + Hai riscontrato un forte battito cardiaco + Freqüência Cardíaca normal + Nahmatal si silný srdeční puls + 自分の心拍数は強い + 강한 맥박이다 + 心跳过快 + 心跳過快 + + + You find a normal Heart Rate + pouls normal + Пульс в норме + El ritmo cardíaco es bueno + Wyczuwasz normalne tętno + Normaler Puls + A szívverés-szám normális + Hai riscontrato un normale battito cardiaco + Freqüência Cardíaca alta + Nahmatal si normální srdeční puls + 自分の心拍数は通常 + 보통 맥박이다 + 心跳正常 + 心跳正常 + + + You find no Heart Rate + pas de pouls + Пульс не прощупывается + No tiene ritmo cardíaco + Wyczuwasz brak tętna + Kein Puls gefunden + Nem észlelhető szívverés + Hai riscontrato una assenza di battito cardiaco + Sem Freqüência Cardíaca + Žádný puls + 心拍数を測れなかった + 맥박을 찾을 수가 없다 + 量不到心跳 + 量不到心跳 + + + Response + Conscience + Реакция + Respuesta + Przytomność + Ansprechbarkeit + Reagálóképesség + Risposta + Reação + Odezva + 反応を見る + 반응 + 反应 + 反應 + + + You check response of patient + Vous évaluez l'état de conscience + Вы проверяете реакцию раненого + Compruebas si el paciente reacciona + Sprawdzasz przytomność pacjenta + Du prüfst ob der Patient ansprechbar ist + Ellenőrzöd a páciens reagálóképességét + Controlli la risposta del paziente + Aferindo se o paciente tem reação + Zkontroloval jsi reakci pacienta + 患者からの反応をみる + 대상의 반응 확인중 + 检查伤者的反应 + 檢查傷者的反應 + + + %1 is responsive + %1 реагирует на раздражители + %1 est conscient + %1 ha reaccionado + %1 jest przytomny + %1 ist anprechbar + %1 reakcióképes + %1 e' cosciente + %1 está respondendo + %1 odpovídá + %1 は反応あり + %1 은 반응이있다 + %1 有反应 + %1 有反應 + + + %1 is not responsive + %1 не реагирует на раздражители + %1 est inconscient + %1 no reacciona + %1 jest nieprzytomny + %1 ist nicht ansprechbar + %1 nem reagál + %1 e' incosciente + %1 não está respondendo + %1 neodpovídá + %1 の反応なし + %1 은 반응이없다 + %1 没有反应 + %1 沒有反應 + + + You checked %1 + Вы осмотрели раненого %1 + Vous avez examiné %1 + Examinas a %1 + Zbadałeś %1 + Du hast versucht, %1 anzusprechen + Megnézted %1-t + Hai controllato %1 + Você aferiu o paciente %1 + Zkontroloval jsi %1 + %1 を見た + %1 을 확인함 + 你已经检查 %1 + 你已經檢查 %1 + + + Patient %1<br/>is %2.<br/>%3.<br/>%4 + Il paziente %1<br/>è %2.<br/>%3.<br/>%4 + Пациент %1<br/>%2.<br/>%3.<br/>%4 + Patient %1<br/>ist %2.<br/>%3.<br/>%4 + Patient %1<br/>est %2.<br/>%3.<br/> + Pacjent %1<br/>jest %2.<br/>%3.<br/>%4 + Paciente %1<br/>is %2.<br/>%3.<br/>%4 + A páciens, %1,<br/>%2.<br/>%3.<br/>%4 + Pacient %1<br/>je %2.<br/>%3.<br/>%4 + Paciente %1<br/>é %2.<br/>%3.<br/>%4 + 患者 %1<br/>は %2.<br/>%3.<br/>%4 + 환자 %1<br/>는 %2.<br/>%3.<br/>%4 + 伤者 %1<br/>is %2.<br/>%3.<br/>%4 + 傷者 %1<br/>is %2.<br/>%3.<br/>%4 + + + alive + vivo + жив + lebendig + vivant + żywy + vivo + élő + naživu + vivo + 生存 + 생존 + 活着 + 活著 + + + dead + morto + мёртв + muerto + tot + décédé + martwy + halott + mrtev + morto + 死亡 + 사망 + 死亡 + 死亡 + + + He's lost some blood + Ha perso poco sangue + Ha perdido un poco de sangre + Есть кровопотеря + Er hat etwas Blut verloren + Il a perdu du sang + Stracił trochę krwi + Valamennyi vért vesztett + Ztratil trochu krve + Ele perdeu um pouco de sangue + 彼は出血している + 적은 양의 피를 잃었다 + 他流失一些血液 + 他流失一些血液 + + + He's lost a lot of blood + Er hat viel Blut verloren + Sok vért vesztett + Stracił sporo krwi + Большая кровопотеря + Ha perdido mucha sangre + Il a perdu beaucoup de sang + Ztratil hodně krve + Ele perdeu muito sangue + Ha perso molto sangue + 彼は大量失血している + 많은 양의 피를 잃었다 + 他流失大量血液 + 他流失大量血液 + + + He hasn't lost blood + Non ha perso sangue + Нет кровопотери + Er hat kein Blut verloren + Il n'a pas perdu de sang + Nie stracił krwi + No ha perdido sangre + Nem vesztett vért + Neztratil žádnou krev + Ele não perdeu sangue + 彼は失血していない + 피를 잃지 않았다 + 他并没有失血 + 他並沒有失血 + + + He is in pain + Sente dolori + Испытывает боль + Er hat Schmerzen + Il souffre + Odczuwa ból + Siente dolor + Fájdalmai vannak + Je v bolestech + Ele está com dor + 彼には痛みがあるようだ + 통증이 있다 + 他感到疼痛 + 他感到疼痛 + + + He is not in pain + Non sente dolori + Не испытывает боли + Er hat keine Schmerzen + Il ne souffre pas + Nie odczuwa bólu + No siente dolor + Nincsenek fájdalmai + Nemá žádné bolesti + Ele não está com dor + 彼には痛みがないようだ + 통증이 없다 + 他不会疼痛 + 他不會疼痛 + + + Bandaged + Pansé + Повязка наложена + Vendado + Zabandażowano + Bekötözve + Bendato + verbunden + Enfaixado + Obvázaný + 包帯 + 붕대 감음 + 绷带 + 繃帶 + + + You bandage %1 (%2) + Vous pansez %1 (%2) + Вы перевязали раненого %1 (%2) + Aplicas vendaje a %1 en %2 + Bandażujesz %1 (%2) + Bekötözöd %1-t (%2) + Stai bendando %1 (%2) + Du verbindest %1 (%2) + Você aplica bandagem no paciente %1 (%2) + Obvazuješ %1 (%2) + %1 (%2) 包帯をつかった + %1 (%2) 붕대를 감았다 + 你正在对 %1 (%2) 包扎绷带中 + 你正在對 %1 (%2) 包紮繃帶中 + + + %1 is bandaging you + %1 vous panse + %1 перевязывает вас + %1 te está vendando + %1 bandażuje Ciebie + %1 bekötöz téged + %1 ti sta bendando + %1 verbindet dich + %1 está aplicando uma bandagem em você + %1 tě obvazuje + %1 はあなたに包帯を巻いている + %1 (이)가 나에게 붕대를 감고있다 + %1 正在对你包扎绷带中 + %1 正在對你包紮繃帶中 + + + You start stitching injuries from %1 (%2) + Вы зашиваете ранения от %1 (%2) + Du nähst die Wunden von %1 (%2) + Vous suturez %1 (%2) + Estás suturando heridas de %1 en %2 + Zszywasz rany %1 (%2) + Elkezded összevarni %1 sérüléseit (%2) + Stai suturando le ferite di %1 (%2) + Você começa a suturar os ferimentos do %1 (%2) + Zašíváš rány %1 (%2) + あなたは %1 (%2) の外傷へ縫合をはじめた + 나는 %1(%2) 상처로부터 봉합을 시작했다 + 你正开始对 %1 (%2) 缝合伤口中 + 你正開始對 %1 (%2) 縫合傷口中 + + + Stitching + Наложение швов + Suturando + Nähen + Sutures + Szycie + Összevarrás + Suturando + Suturando + Šití + 縫合中 + 붕합중 + 缝合中 + 縫合中 + + + You treat the airway of %1 + Вы интубируете раненого %1 + Estás intubando a %1 + Du behandelst die Atemwege von %1 + Vous traitez les voies respiratoires de %1 + Udrażniasz drogi oddechowe %1 + Kezeled %1 légútját + Controlli le vie respiratorie di %1 + Você entuba o %1 + Ošetřuješ dýchací cesty %1 + %1 の気道を診断する + %1의 기도를 확보했다 + 你治疗 %1 的呼吸道 + 你治療 %1 的呼吸道 + + + Airway + Дыхательные пути + Vías aéreas + Drogi oddechowe + Atemwege + Voies respiratoires + Légút + Vie respiratorie + Vias Aéreas + Dýchací cesty + 気道 + 기도 + 呼吸道 + 呼吸道 + + + %1 is treating your airway + %1 проводит вам интубацию + %1 traite vos voies respiratoires + %1 te está intubando + %1 udrażnia Twoje drogi oddechowe + %1 behandelt deine Atemwege + %1 kezeli a légútadat + %1 ti sta trattando le vie respiratorie + %1 está te entubando + %1 ošetřuje tvoje dýchací cesty + %1 はあなたの気道を見ている + %1 (이)가 나의 기도를 확보중이다 + %1 正在治疗你的呼吸道 + %1 正在治療你的呼吸道 + + + Drag + Ziehen + Arrastrar + Ciągnij + Táhnout + Тащить + Traîner + Húzás + Arrastar + Trascina + 引きずる + 끌다 + 拖拉 + 拖拉 + + + Carry + Tragen + Cargar + Nieś + Nést + Нести + Porter + Cipelés + Carregar + Trasporta + 運ぶ + 업다 + 背起 + 背起 + + + Release + Loslassen + Soltar + Połóż + Položit + Отпустить + Déposer + Elengedés + Soltar + Rrilascia + 離す + 내려놓기 + 放下 + 放下 + + + Load Patient Into + Patient einladen + Cargar al paciente en + Załaduj pacjenta + Naložit pacianta do + Погрузить пациента в + Embarquer le patient + Sebesült berakása + Carregar Paciente Em + Carica paziente nel + 患者を載せる + 환자 싣기 + 将伤者放入 + 將傷者放入 + + + Unload Patient + Patient ausladen + Descargar al paciente + Wyładuj pacjenta + Vyložit pacienta + Выгрузить пациента + Débarquer le patient + Sebesült kihúzása + Descarregar Paciente + Scarica il paziente + 患者を降ろす + 환자 내리기 + 将伤者背出 + 將傷者背出 + + + %1<br/>loaded into<br/>%2 + %1<br/>cargado en<br/>%2 + %1<br/>chargé dans<br/>%2 + %1<br/>in<br/>%2 verladen + %1<br/>załadowano do<br/>%2 + %1<br/>naloženo do<br/>%2 + %1<br/>carregado em<br/>%2 + %1<br/>caricato su<br/>%2 + %1<br/>berakodva ide:<br/>%2 + %1<br/>загружен в<br/>%2 + %1<br/>は<br/>%2へ積み込まれました + %1<br/>는<br/>%2 에 실림 + %1<br/>裝載至<br/>%2 + %1<br/>装载至<br/>%2 + + + Place body in bodybag + Colocar cuerpo en bolsa para cadáveres + Поместить тело в мешок для трупов + Körper in Leichesack verstauen + Zapakuj ciało do worka na zwłoki + Mettre le corps dans la housse mortuaire + Test hullazsákba helyezése + Metti il corpo nella sacca per cadaveri + Colocar corpo dentro do saco para cadáver + Umístni tělo do pytle na mrtvoly + 死体袋に入れる + 시체 가방에 담기 + 将尸体放入尸袋 + 將屍體放入屍袋 + + + Placing body in bodybag... + Colocando cuerpo en bolsa para cadáveres... + Упаковка тела... + Körper wird in Leichensack gepackt... + Pakowanie ciała do worka na zwłoki... + Placement du corps dans la housse... + Test hullazsákba helyezése... + Stai mettendo il corpo nella sacca... + Colocando corpo dentro do saco para cadáver... + Umístňuji tělo do pytle na mrtvoly... + 死体袋へ入れています・・・ + 시체 가방에 담는중... + 将尸体放入尸袋中... + 將屍體放入屍袋中... + + + %1 has bandaged patient + %1 has vendado al paciente + %1 перевязал пациента + %1 hat den Patienten verbunden + %1 założył bandaż + %1 a pansé le patient + %1 bekötözte a pácienst + %1 ha bendato il paziente + %1 aplicou bandagem no paciente + %1 již obvázal pacienta + %1 は包帯を巻いた + %1 (이)가 붕대를 감아줬다 + %1 已包扎伤者 + %1 已包紮傷者 + + + %1 performed CPR + %1 wykonał cykl RKO + %1 provádí CPR + %1 hat eine HLW durchgeführt + %1 ha eseguito CPR + %1 realizou RCP + %1 провел сердечно-легочную реанимацию + %1 realicó RCP + %1 à fait une RCP + %1 は心肺蘇生をした + %1 (이)가 심폐소생술을 실시했다 + %1 已执行心肺复苏术 + %1 已執行心肺復甦術 + + + %1 used %2 + %1 usó %2 + %1 benutzt %2 + %1 использовал %2 + %1 użył %2 + %1 utilise %2 + %1 használta a %2-t + %1 ha usato %2 + %1 usou %2 + %1 použil %2 + %1 は %2 をつかった + %1 (이)가 %2 을 썼다 + %1 已使用 %2 + %1 已使用 %2 + + + %1 has given an IV + %1 провёл переливание + %1 ha puesto una IV + %1 hat eine Infusion verabreicht + %1 podał IV + %1 a plaçé une IV + %1 infúziót adott + %1 ha somministrato una EV + %1 aplicou um intravenoso + %1 již aplikoval IV + %1 は IV を与えた + %1 (이)가 IV를 실시했다 + %1 已经给予静脉注射液 + %1 已經給予靜脈注射液 + + + %1 applied a tourniquet + %1 aplicado torniquete + %1 наложил жгут + %1 hat ein Tourniquet angelegt + %1 założył stazę + %1 a plaçé un garrot + %1 felhelyezett egy érszorítót + %1 ha applicato un laccio emostatico + %1 aplicou um torniquete + %1 použil škrtidlo + %1 は止血帯を巻いた + %1 (이)가 지혈대를 적용했다 + %1 已经绑上止血带 + %1 已經綁上止血帶 + + + %1 used Personal Aid Kit + %1 hat das eigene Erste-Hilfe-Set verwendet + %1 użył apteczki + %1 utilizou KPS + %1 používá PAK + %1 использовал аптечку + %1 ha usato Kit Pronto Soccorso Personale + %1 usó Kit de Primeros Auxilios + %1 a utilisé une trousse + %1 は応急処置キットをつかった + %1 (이)가 개인응급키트를 사용했다 + %1 已使用了个人急救包 + %1 已使用了個人急救包 + + + Heavily wounded + Schwer verwundet: + Ciężko ranny + Тяжелые ранения + Gravemente ferito + Gravemente herido + Gravement blessé + Erősen sérült + Těžce raněn + Gravemente ferido + 重傷 + 중상 + 重伤 + 重傷 + + + Lightly wounded + Leicht verwundet: + Lekko ranny + Легкие ранения + Leggermente ferito + Levemente herido + Légèrement blessé + Enyhén sérült + Lehce raněn + Levemente ferido + 軽傷 + 경상 + 轻伤 + 輕傷 + + + Very lightly wounded + Sehr leicht verwundet: + B. lekko ranny + Царапины + Ferito lievemente + Muy levemente herido + Très légèrement blessé + Nagyon enyhén sérült + Velmi lehce raněn + Muito levemente ferido + かなり浅い傷 + 매우 가벼운 부상 + 小伤 + 小傷 + + + Heal fully bandaged hitpoints + Lecz w pełni zabandażowane hitpointy + Curar miembros totalmente vendados + Исцелять полностью перебинтованные части тела + Curar hitpoints totalmente enfaixados + Heal fully bandaged hitpoints + Cura hitpoints completamente bendati + Soigner les plaies entièrement bandées + Heilt vollständig bandagierte Trefferpunkte + 包帯は体力を完全に回復する + 붕대를 감은후 체력을 회복함 + 完全医疗包扎的部位至痊愈 + 完全醫療包紮的部位至痊癒 + + + Treating... + Behandeln... + Ellátás... + Opatrywanie ran... + Traitement... + Лечение... + Tratando... + Tratando... + Ošetřuji... + Curando... + 治療しています・・・ + 치료중... + 治疗中... + 治療中... + + + Removing Tourniquet... + Tourniquet entfernen... + Zdejmowanie stazy... + Quitando torniquete... + Retire le garrot... + Removendo torniquete... + Érszorító eltávolítása... + Sundavám škrtidlo... + Снятие жгута... + Togliendo il laccio emostatico... + 止血帯を外しています・・・ + 지혈대 제거중... + 移除军用止血带中... + 移除軍用止血帶中... + + + Convert vanilla items + + + Enables or disables whether vanilla medical items are converted to ACE medical items or just removed + + + Just remove vanilla medical + + + Locations PAK + Место использования аптечки + Ograniczenie apteczek osobistych + Ubicaciones del EPA + Orte für Erste-Hilfe-Set + Oblast k použití PAK + Localizações do KPS + Lieu d'utilisation da trousse sanitaire + Elsősegélycsomag helyek + Locazioni Kit Pronto Soccorso + 応急処置キットを使う場所 + 개인응급키트 사용 장소 + 个人急救包使用地点 + 個人急救包使用地點 + + + Remove Surgical Kit (Adv) + Удалять хирургический набор (усл.) + Usuń zestaw chirurgiczny po użyciu + Eliminar equipo quirúrgico (Avanzado) + Entferne Operationskasten (erweitert) + Odebrat chirurgickou soupravu (Pokr.) + Remover kit cirúrgico (avançado) + Consommer les trousses chirurgicales (Av.) + Sebészkészlet (Fejlett) eltávolítása + Rimuovi Kit Chirurgico (Avanzato) + 縫合キットを削除 (アド) + 봉합키트 제거 (고급) + 在使用后删除手术包 (进阶伤口) + 在使用後刪除手術包 (進階傷口) + + + Should Surgical kit be removed on usage? + Нужно ли удалять хирургический набор после использования? + Czy zestaw chirurgiczny powinien zniknąć z ekwipunku po jego użyciu? + Eliminar el equipo quirúrgico después del uso + Entferne Operationskästen bei Verwendung? + Odebrat chirurgickou soupravu po použití? + Deve o kit cirúrgico ser removido após o uso? + La trousse chirurgicale doit être consommée à l'utilisation? + Eltávolítódjon a sebészkészlet használatkor? + Il Kit Chirurgico dev'essere rimosso dopo l'uso? + 縫合キットを使った後に削除しますか? + 봉합키트를 사용하고 나서 제거합니까? + 手术包会在使用后被删除吗? + 手術包會在使用後被刪除嗎? + + + Allow Surgical Kit (Adv) + Хирургический набор может использоваться (усл.) + Ustawienia zestawu chirurgicznego + Permitir equipo quirúrgico (Avanzado) + Erlaube Operationskasten + Povolit chirurgickou soupravu (Pokr.) + Permite kit cirúrgico (avançado) + Permettre les trousses chirurgicales (Avancé) + Sebészkészlet (Fejlett) engedélyezése + Permetti Kit Chirurgico (Avanzato) + 縫合キットの許可 (アド) + 봉합키트 활성화 (고급) + 允许使用手术包 (进阶伤口) + 允許使用手術包 (進階傷口) + + + Who can use the Surgical Kit? + Кто может использовать хирургический набор? + Kto może skorzystać z zestawu chirurgicznego w celu zszycia ran? + ¿Quién puede utilizar el equipo quirúrgico? + Wer kann den Operationskasten verwenden? + Kdo může použít chirurgickou soupravu? + Quem pode usar o kit cirúrgico? + Qui peut utiliser les trousses chirurgicales? + Ki használhatja a sebészkészletet? + Chi può usare il Kit Chirurgico? + だれでも縫合キットを使えるようにしますか? + 어느 인원이 봉합키트를 사용할 수 있습니까? + 谁能够使用手术包? + 誰能夠使用手術包? + + + There is no tourniquet on this body part! + An diesem Körperteil befindet sich kein Tourniquet! + Na tej części ciała nie ma stazy! + No hay torniquete en esta parte del cuerpo! + Нет жгута на этой части тела! + Não existe nenhum torniquete nesta parte do corpo! + Žádné škrtidlo na této části těla! + Non c'è nessun laccio emostatico su questa parte del corpo! + Il n'y a pas de garrot sur ce membre ! + 身体には止血帯が無い! + 이 부위에는 지혈대가 없습니다! + 这部位没有止血带! + 這部位沒有止血帶! + + + When can the PAK be used? + Wann kann das Erste-Hilfe-Set verwendet werden? + Kdy může být použita osobní lékárnička? + ¿Cuando se puede utilizar el Equipo de primeros auxilios? + Quand peut être utilisé la trousse sanitaire? + Po spełnieniu jakich warunków apteczka osobista może zostać zastosowana na pacjencie? + Mikor lehet az elsősegélycsomagot használni? + Onde o kit de primeiros socorros pode ser utilizado? + Когда может использоваться аптечка? + Quando può essere usato il Kit Pronto Soccorso? + どこでも応急処置キットを使えるようにしますか? + 언제 개인응급키트를 사용할 수 있습니까? + 何时可以使用个人急救包? + 何時可以使用個人急救包? + + + Locations Surgical Kit (Adv) + Место использования хирургического набора (усл.) + Ograniczenie zestawu chirurgicznego + Ubicaciones del equipo quirúrgico (Avanzado) + Orte für Operationskästen (erweitert) + Lokace chirurgické soupravy (Pokr.) + Localizações do kit cirúrgico (avançado) + Lieu d'utilisation des trousses chirurgicales + Sebészkészlet (Fejlett) helyei + Località Kit Chirurgico (Avanzato) + 縫合キットをつかう場所 (アド) + 봉합키트 사용 장소 (고급) + 手术包使用地点 (进阶伤口) + 手術包使用地點 (進階傷口) + + + Where can the Surgical Kit be used? + Где может использоваться хирургический набор? + Gdzie można korzystać z zestawu chirurgicznego? + Dónde se puede utilizar el equipo quirúrgico + Wo kann der Operationskasten verwendet werden? + Kde může být použita chirurgická souprava? + Onde o kit cirúrgico pode ser utilizado? + Où peut être utilisé les trousses chirurgicales? + Hol lehet a sebészkészletet használni? + Dove può essere usato il Kit Chirurgico? + どこでも縫合キットを使えるようにしますか? + 어디에서 봉합키트를 사용할 수 있게 합니까? + 定义手术包可被使用的地方? + 定義手術包可被使用的地方? + + + Condition Surgical Kit (Adv) + Beding. für d. Operationskasten (erw.) + Podmínka chirurgické soupravy (Pokr.) + Condición de equipo quirúrgico (Av) + Conditions d'utilisation de la trousse chirurgicale (Av.) + Warunek zestawu chirurgicznego + Sebészkészlet állapot + Condição do Kit Cirúrgico (Avançado) + Условие использования хирургического набора (усл.) + Condizioni Kit Chirurgico (Avanzato) + 縫合キットの状態 (アド) + 봉합키트 상태 (고급) + 使用手术包的条件 (进阶伤口) + 使用手術包的條件 (進階傷口) + + + When can the Surgical Kit be used? + Wann kann der Operationskasten verwendet werden? + Kde může být použita chirurgická souprava? + ¿Cuando se puede utilizar el equipo quirúrgico? + Quand peut être utilisé la trousse chirurgicale + Po spełnieniu jakich warunków zestaw chirurgiczny może zostać zastosowany na pacjencie? + Mikor lehet a sebészkészletet használni? + Onde o kit cirúrgico pode ser utilizado? + Когда может использоваться хирургический набор? + Quando può essere usato il Kit Chirurgico? + いつでも縫合キットを使えるようにしますか? + 언제 봉합키트를 사용할 수 있습니까? + 何时可以使用手术工具包? + 何時可以使用手術工具包? + + + Where can the PAK be used? + Где может использоваться аптечка? + Gdzie można korzystać z apteczek osobistych? + ¿Dónde se puede utilizar el equipo de primeros auxilios? + Wo kann das Erste-Hilfe-Set verwendet werden? + Kde může být použita osobní lékárnička (PAK)? + Onde o kit de primeiros socorros pode ser utilizado? + Où la trousse sanitaire peut être utilisée ? + Hol lehet az elsősegélycsomagot használni? + Dove può essere usato il Kit Pronto Soccorso? + どこでも応急処置キットを使えるようにしますか? + 어디에서 개인응급키트를 사용할 수 있습니까? + 在哪里可以使用个人急救包? + 在哪裡可以使用個人急救包? + + + Condition PAK + Bedingungen für d. Erste-Hilfe-Set + Podmínky pro použití osobní lékárničky + Condición EPA + Condition d'utilisation de la trousse sanitaire + Warunek apteczek + Elsősegélycsomag állapot + Condição do KPS + Условие использования аптечки + Condizioni Kit Pronto Soccorso + 応急処置キットの状態 + 개인응급키트 상태 + 个人急救包使用条件 + 個人急救包使用條件 + + + diff --git a/addons/medical/ui/items/adenosine_x_ca.paa b/addons/medical_treatment/ui/items/adenosine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/adenosine_x_ca.paa rename to addons/medical_treatment/ui/items/adenosine_x_ca.paa diff --git a/addons/medical/ui/items/atropine_x_ca.paa b/addons/medical_treatment/ui/items/atropine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/atropine_x_ca.paa rename to addons/medical_treatment/ui/items/atropine_x_ca.paa diff --git a/addons/medical/ui/items/bloodIV_x_ca.paa b/addons/medical_treatment/ui/items/bloodiv_x_ca.paa similarity index 100% rename from addons/medical/ui/items/bloodIV_x_ca.paa rename to addons/medical_treatment/ui/items/bloodiv_x_ca.paa diff --git a/addons/medical/ui/items/bodybag_x_ca.paa b/addons/medical_treatment/ui/items/bodybag_x_ca.paa similarity index 100% rename from addons/medical/ui/items/bodybag_x_ca.paa rename to addons/medical_treatment/ui/items/bodybag_x_ca.paa diff --git a/addons/medical/ui/items/elasticBandage_x_ca.paa b/addons/medical_treatment/ui/items/elasticbandage_x_ca.paa similarity index 100% rename from addons/medical/ui/items/elasticBandage_x_ca.paa rename to addons/medical_treatment/ui/items/elasticbandage_x_ca.paa diff --git a/addons/medical/ui/items/epinephrine_x_ca.paa b/addons/medical_treatment/ui/items/epinephrine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/epinephrine_x_ca.paa rename to addons/medical_treatment/ui/items/epinephrine_x_ca.paa diff --git a/addons/medical/ui/items/fieldDressing_x_ca.paa b/addons/medical_treatment/ui/items/fielddressing_x_ca.paa similarity index 100% rename from addons/medical/ui/items/fieldDressing_x_ca.paa rename to addons/medical_treatment/ui/items/fielddressing_x_ca.paa diff --git a/addons/medical/ui/items/morphine_x_ca.paa b/addons/medical_treatment/ui/items/morphine_x_ca.paa similarity index 100% rename from addons/medical/ui/items/morphine_x_ca.paa rename to addons/medical_treatment/ui/items/morphine_x_ca.paa diff --git a/addons/medical/ui/items/packingBandage_x_ca.paa b/addons/medical_treatment/ui/items/packingbandage_x_ca.paa similarity index 100% rename from addons/medical/ui/items/packingBandage_x_ca.paa rename to addons/medical_treatment/ui/items/packingbandage_x_ca.paa diff --git a/addons/medical/ui/items/personal_aid_kit_x_ca.paa b/addons/medical_treatment/ui/items/personal_aid_kit_x_ca.paa similarity index 100% rename from addons/medical/ui/items/personal_aid_kit_x_ca.paa rename to addons/medical_treatment/ui/items/personal_aid_kit_x_ca.paa diff --git a/addons/medical/ui/items/plasmaIV_x_ca.paa b/addons/medical_treatment/ui/items/plasmaiv_x_ca.paa similarity index 100% rename from addons/medical/ui/items/plasmaIV_x_ca.paa rename to addons/medical_treatment/ui/items/plasmaiv_x_ca.paa diff --git a/addons/medical/ui/items/quickclot_x_ca.paa b/addons/medical_treatment/ui/items/quickclot_x_ca.paa similarity index 100% rename from addons/medical/ui/items/quickclot_x_ca.paa rename to addons/medical_treatment/ui/items/quickclot_x_ca.paa diff --git a/addons/medical/ui/items/salineIV_x_ca.paa b/addons/medical_treatment/ui/items/salineiv_x_ca.paa similarity index 100% rename from addons/medical/ui/items/salineIV_x_ca.paa rename to addons/medical_treatment/ui/items/salineiv_x_ca.paa diff --git a/addons/medical/ui/items/surgicalKit_x_ca.paa b/addons/medical_treatment/ui/items/surgicalkit_x_ca.paa similarity index 100% rename from addons/medical/ui/items/surgicalKit_x_ca.paa rename to addons/medical_treatment/ui/items/surgicalkit_x_ca.paa diff --git a/addons/medical/ui/items/tourniquet_x_ca.paa b/addons/medical_treatment/ui/items/tourniquet_x_ca.paa similarity index 100% rename from addons/medical/ui/items/tourniquet_x_ca.paa rename to addons/medical_treatment/ui/items/tourniquet_x_ca.paa diff --git a/addons/medical_vitals/$PBOPREFIX$ b/addons/medical_vitals/$PBOPREFIX$ new file mode 100644 index 0000000000..c3a2843a0e --- /dev/null +++ b/addons/medical_vitals/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\medical_vitals diff --git a/addons/medical_vitals/CfgEventHandlers.hpp b/addons/medical_vitals/CfgEventHandlers.hpp new file mode 100644 index 0000000000..0d3301d6e0 --- /dev/null +++ b/addons/medical_vitals/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/medical_vitals/XEH_PREP.hpp b/addons/medical_vitals/XEH_PREP.hpp new file mode 100644 index 0000000000..8f8c427751 --- /dev/null +++ b/addons/medical_vitals/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(handleUnitVitals); +PREP(updateHeartRate); +PREP(updatePainSuppress); +PREP(updatePeripheralResistance); diff --git a/addons/medical_vitals/XEH_postInit.sqf b/addons/medical_vitals/XEH_postInit.sqf new file mode 100644 index 0000000000..6eccf9d1dd --- /dev/null +++ b/addons/medical_vitals/XEH_postInit.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" + diff --git a/addons/medical_vitals/XEH_preInit.sqf b/addons/medical_vitals/XEH_preInit.sqf new file mode 100644 index 0000000000..a7feade1c3 --- /dev/null +++ b/addons/medical_vitals/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +ADDON = true; diff --git a/addons/medical_vitals/XEH_preStart.sqf b/addons/medical_vitals/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/medical_vitals/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/medical_vitals/config.cpp b/addons/medical_vitals/config.cpp new file mode 100644 index 0000000000..91995242c9 --- /dev/null +++ b/addons/medical_vitals/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_medical_status"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal", "KoffeinFlummi"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf new file mode 100644 index 0000000000..e5fbc51704 --- /dev/null +++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf @@ -0,0 +1,149 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Updates the vitals. Called from the statemachine's onState functions. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_vitals_fnc_handleUnitVitals + * + * Public: No + */ +// #define DEBUG_MODE_FULL + +params ["_unit"]; + +private _lastTimeUpdated = _unit getVariable [QGVAR(lastTimeUpdated), 0]; +private _deltaT = (CBA_missionTime - _lastTimeUpdated) min 10; +if (_deltaT < 1) exitWith {}; // state machines could be calling this very rapidly depending on number of local units + +BEGIN_COUNTER(Vitals); + +_unit setVariable [QGVAR(lastTimeUpdated), CBA_missionTime]; +private _lastTimeValuesSynced = _unit getVariable [QGVAR(lastMomentValuesSynced), 0]; +private _syncValues = (CBA_missionTime - _lastTimeValuesSynced) >= (10 + floor(random 10)); + +if (_syncValues) then { + _unit setVariable [QGVAR(lastMomentValuesSynced), CBA_missionTime]; +}; + +private _bloodVolume = GET_BLOOD_VOLUME(_unit) + ([_unit, _deltaT, _syncValues] call EFUNC(medical_status,getBloodVolumeChange)); +_bloodVolume = 0 max _bloodVolume min DEFAULT_BLOOD_VOLUME; + +// @todo: replace this and the rest of the setVariable with EFUNC(common,setApproximateVariablePublic) +_unit setVariable [VAR_BLOOD_VOL, _bloodVolume, _syncValues]; + +// Set variables for synchronizing information across the net +private _hemorrhage = switch (true) do { + case (_bloodVolume < BLOOD_VOLUME_CLASS_4_HEMORRHAGE): { 4 }; + case (_bloodVolume < BLOOD_VOLUME_CLASS_3_HEMORRHAGE): { 3 }; + case (_bloodVolume < BLOOD_VOLUME_CLASS_2_HEMORRHAGE): { 2 }; + case (_bloodVolume < BLOOD_VOLUME_CLASS_1_HEMORRHAGE): { 1 }; + default {0}; +}; + +if (_hemorrhage != GET_HEMORRHAGE(_unit)) then { + _unit setVariable [VAR_HEMORRHAGE, _hemorrhage, true]; +}; + +private _bloodLoss = GET_BLOOD_LOSS(_unit); +if (_bloodLoss > 0) then { + _unit setVariable [QGVAR(bloodloss), _bloodLoss, _syncValues]; + if !IS_BLEEDING(_unit) then { + _unit setVariable [VAR_IS_BLEEDING, true, true]; + }; +} else { + if IS_BLEEDING(_unit) then { + _unit setVariable [VAR_IS_BLEEDING, false, true]; + }; +}; + +private _inPain = GET_PAIN_PERCEIVED(_unit) > 0; +if !(_inPain isEqualTo IS_IN_PAIN(_unit)) then { + _unit setVariable [VAR_IN_PAIN, _inPain, true]; +}; + +// Handle pain due tourniquets, that have been applied more than 120 s ago +private _tourniquetPain = 0; +private _tourniquets = GET_TOURNIQUETS(_unit); +{ + if (_x > 0 && {CBA_missionTime - _x > 120}) then { + _tourniquetPain = _tourniquetPain max (CBA_missionTime - _x - 120) * 0.001; + }; +} forEach _tourniquets; +if (_tourniquetPain > 0) then { + [_unit, _tourniquetPain] call EFUNC(medical_status,adjustPainLevel); +}; + +private _heartRate = [_unit, _deltaT, _syncValues] call FUNC(updateHeartRate); +[_unit, _deltaT, _syncValues] call FUNC(updatePainSuppress); +[_unit, _deltaT, _syncValues] call FUNC(updatePeripheralResistance); + +private _bloodPressure = GET_BLOOD_PRESSURE(_unit); +_unit setVariable [VAR_BLOOD_PRESS, _bloodPressure, _syncValues]; + +_bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; + +private _cardiacOutput = [_unit] call EFUNC(medical_status,getCardiacOutput); + +// Statements are ordered by most lethal first. +switch (true) do { + case (_bloodVolume < BLOOD_VOLUME_FATAL): { + TRACE_3("BloodVolume Fatal",_unit,BLOOD_VOLUME_FATAL,_bloodVolume); + [QEGVAR(medical,Bleedout), _unit] call CBA_fnc_localEvent; + }; + case (_hemorrhage == 4): { + TRACE_3("Class IV Hemorrhage",_unit,_hemorrhage,_bloodVolume); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_heartRate < 20 || {_heartRate > 220}): { + TRACE_2("heartRate Fatal",_unit,_heartRate); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodPressureH < 50 && {_bloodPressureL < 40} && {_heartRate < 40}): { + TRACE_4("bloodPressure (H & L) + heartRate Fatal",_unit,_bloodPressureH,_bloodPressureL,_heartRate); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodPressureL >= 190): { + TRACE_2("bloodPressure L above limits",_unit,_bloodPressureL); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_heartRate < 30): { // With a heart rate below 30 but bigger than 20 there is a chance to enter the cardiac arrest state + private _nextCheck = _unit getVariable [QGVAR(lastCheckCriticalHeartRate), CBA_missionTime]; + private _enterCardiacArrest = false; + if (CBA_missionTime >= _nextCheck) then { + _enterCardiacArrest = random 1 < (0.4 + 0.6*(30 - _heartRate)/10); // Variable chance of getting into cardiac arrest. + _unit setVariable [QGVAR(lastCheckCriticalHeartRate), CBA_missionTime + 5]; + }; + if (_enterCardiacArrest) then { + TRACE_2("Heart rate critical. Cardiac arrest",_unit,_heartRate); + [QEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + } else { + TRACE_2("Heart rate critical. Critical vitals",_unit,_heartRate); + [QEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + }; + case (_bloodLoss / EGVAR(medical,bleedingCoefficient) > BLOOD_LOSS_KNOCK_OUT_THRESHOLD * _cardiacOutput): { + [QEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodLoss > 0): { + [QEGVAR(medical,LoweredVitals), _unit] call CBA_fnc_localEvent; + }; + case (_inPain): { + [QEGVAR(medical,LoweredVitals), _unit] call CBA_fnc_localEvent; + }; +}; + +#ifdef DEBUG_MODE_FULL +if (!isPlayer _unit) then { + private _painLevel = _unit getVariable [VAR_PAIN, 0]; + hintSilent format["blood volume: %1, blood loss: [%2, %3]\nhr: %4, bp: %5, pain: %6", round(_bloodVolume * 100) / 100, round(_bloodLoss * 1000) / 1000, round((_bloodLoss / (0.001 max _cardiacOutput)) * 100) / 100, round(_heartRate), _bloodPressure, round(_painLevel * 100) / 100]; +}; +#endif + +END_COUNTER(Vitals); diff --git a/addons/medical_vitals/functions/fnc_updateHeartRate.sqf b/addons/medical_vitals/functions/fnc_updateHeartRate.sqf new file mode 100644 index 0000000000..0946a76202 --- /dev/null +++ b/addons/medical_vitals/functions/fnc_updateHeartRate.sqf @@ -0,0 +1,83 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update the heart rate + * + * Arguments: + * 0: The Unit + * 1: Time since last update + * 2: Sync value? + * + * ReturnValue: + * Current Heart Rate + * + * Example: + * [player, 1, false] call ace_medical_vitals_fnc_updateHeartRate + * + * Public: No + */ + +params ["_unit", "_deltaT", "_syncValue"]; + +private _hrTargetAdjustment = 0; +private _adjustments = _unit getVariable [VAR_HEART_RATE_ADJ,[]]; + +if !(_adjustments isEqualTo []) then { + { + _x params ["_value", "_timeTillMaxEffect", "_maxTimeInSystem", "_timeInSystem"]; + if (_value != 0 && {_maxTimeInSystem > 0}) then { + if (_timeInSystem >= _maxTimeInSystem) then { + _adjustments set [_forEachIndex, nil]; + } else { + _timeInSystem = _timeInSystem + _deltaT; + private _effectRatio = ((_timeInSystem / (1 max _timeTillMaxEffect)) ^ 2) min 1; + _hrTargetAdjustment = _hrTargetAdjustment + _value * _effectRatio * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + _x set [3, _timeInSystem]; + }; + } else { + _adjustments set [_forEachIndex, nil]; + }; + } forEach _adjustments; + + _unit setVariable [VAR_HEART_RATE_ADJ, _adjustments - [nil], _syncValue]; +}; + +private _heartRate = GET_HEART_RATE(_unit); + +if !IN_CRDC_ARRST(_unit) then { + private _hrChange = 0; + private _targetHR = 0; + private _bloodVolume = GET_BLOOD_VOLUME(_unit); + if (_bloodVolume > BLOOD_VOLUME_CLASS_4_HEMORRHAGE) then { + GET_BLOOD_PRESSURE(_unit) params ["_bloodPressureL", "_bloodPressureH"]; + private _meanBP = (2/3) * _bloodPressureH + (1/3) * _bloodPressureL; + private _painLevel = GET_PAIN_PERCEIVED(_unit); + + private _targetBP = 107; + if (_bloodVolume < BLOOD_VOLUME_CLASS_3_HEMORRHAGE) then { + _targetBP = _targetBP * (_bloodVolume / DEFAULT_BLOOD_VOLUME); + }; + + _targetHR = DEFAULT_HEART_RATE; + if (_bloodVolume < BLOOD_VOLUME_CLASS_2_HEMORRHAGE) then { + _targetHR = _heartRate * (_targetBP / (45 max _meanBP)); + }; + if (_painLevel > 0.2) then { + _targetHR = _targetHR max (80 + 50 * _painLevel); + }; + _targetHR = (_targetHR + _hrTargetAdjustment) max 0; + + _hrChange = round(_targetHR - _heartRate) / 2; + } else { + _hrChange = -round(_heartRate / 10); + }; + if (_hrChange < 0) then { + _heartRate = (_heartRate + _deltaT * _hrChange) max _targetHR; + } else { + _heartRate = (_heartRate + _deltaT * _hrChange) min _targetHR; + }; +}; + +_unit setVariable [VAR_HEART_RATE, _heartRate, _syncValue]; + +_heartRate diff --git a/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf b/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf new file mode 100644 index 0000000000..2bdab699ab --- /dev/null +++ b/addons/medical_vitals/functions/fnc_updatePainSuppress.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update the pain suppression + * + * Arguments: + * 0: The Unit + * 1: Time since last update + * 2: Sync value? + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", "_deltaT", "_syncValue"]; + +private _painSupressAdjustment = 0; +private _adjustments = _unit getVariable [VAR_PAIN_SUPP_ADJ, []]; + +if !(_adjustments isEqualTo []) then { + { + _x params ["_value", "_timeTillMaxEffect", "_maxTimeInSystem", "_timeInSystem"]; + if (_value != 0 && {_maxTimeInSystem > 0}) then { + if (_timeInSystem >= _maxTimeInSystem) then { + _adjustments set [_forEachIndex, nil]; + } else { + _timeInSystem = _timeInSystem + _deltaT; + private _effectRatio = ((_timeInSystem / (1 max _timeTillMaxEffect)) ^ 2) min 1; + _painSupressAdjustment = _painSupressAdjustment + _value * _effectRatio * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + _x set [3, _timeInSystem]; + }; + } else { + _adjustments set [_forEachIndex, nil]; + }; + } forEach _adjustments; + + _unit setVariable [VAR_PAIN_SUPP_ADJ, _adjustments - [nil], (_syncValue || {_adjustments isEqualTo []})]; // always sync on last run + + _unit setVariable [VAR_PAIN_SUPP, 0 max _painSupressAdjustment, _syncValue]; +}; + +// Handle continuous pain reduction +private _pain = GET_PAIN(_unit); +_unit setVariable [QEGVAR(medical_status,pain), 0 max (_pain - _deltaT / PAIN_FADE_TIME), _syncValue]; + +// Handles simple medication +if (isNil QEGVAR(medical_treatment,advancedMedication) || {!EGVAR(medical_treatment,advancedMedication)}) then { + private _painSupress = _unit getVariable [VAR_PAIN_SUPP, 0]; + _painSupress = _painSupress - _deltaT / PAIN_SUPPRESSION_FADE_TIME; + _unit setVariable [VAR_PAIN_SUPP, 0 max _painSupress, _syncValue]; +}; diff --git a/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf new file mode 100644 index 0000000000..cdbf0d926c --- /dev/null +++ b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: Glowbal + * Update the peripheral resistance + * + * Arguments: + * 0: The Unit + * 1: Time since last update + * 2: Sync value? + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", "_deltaT", "_syncValue"]; + +private _peripheralResistanceAdjustment = 0; +private _adjustments = _unit getVariable [VAR_PERIPH_RES_ADJ, []]; + +if !(_adjustments isEqualTo []) then { + { + _x params ["_value", "_timeTillMaxEffect", "_maxTimeInSystem", "_timeInSystem"]; + if (_value != 0 && {_maxTimeInSystem > 0}) then { + if (_timeInSystem >= _maxTimeInSystem) then { + _adjustments set [_forEachIndex, nil]; + } else { + _timeInSystem = _timeInSystem + _deltaT; + private _effectRatio = ((_timeInSystem / (1 max _timeTillMaxEffect)) ^ 2) min 1; + _peripheralResistanceAdjustment = _peripheralResistanceAdjustment + _value * _effectRatio * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + _x set [3, _timeInSystem]; + }; + } else { + _adjustments set [_forEachIndex, nil]; + }; + } forEach _adjustments; + + _unit setVariable [VAR_PERIPH_RES_ADJ, _adjustments - [nil], _syncValue]; + + // always sync on last run + _unit setVariable [VAR_PERIPH_RES, 0 max (DEFAULT_PERIPH_RES + _peripheralResistanceAdjustment), _syncValue || {_adjustments isEqualTo []}]; +}; diff --git a/addons/medical_vitals/functions/script_component.hpp b/addons/medical_vitals/functions/script_component.hpp new file mode 100644 index 0000000000..4fe94957b5 --- /dev/null +++ b/addons/medical_vitals/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\medical_vitals\script_component.hpp" diff --git a/addons/medical_vitals/script_component.hpp b/addons/medical_vitals/script_component.hpp new file mode 100644 index 0000000000..cf5452e193 --- /dev/null +++ b/addons/medical_vitals/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT medical_vitals +#define COMPONENT_BEAUTIFIED Medical Vitals +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MEDICAL_VITALS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MEDICAL_VITALS + #define DEBUG_SETTINGS DEBUG_SETTINGS_MEDICAL_VITALS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" diff --git a/addons/nightvision/XEH_preInit.sqf b/addons/nightvision/XEH_preInit.sqf index d021ef1f57..9361d05015 100644 --- a/addons/nightvision/XEH_preInit.sqf +++ b/addons/nightvision/XEH_preInit.sqf @@ -6,6 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -#include "initSettings.sqf"; +#include "initSettings.sqf" ADDON = true; diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index cff8807003..f1eb7b16c0 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -33,12 +33,12 @@ if (isNil "_energyIncrement") then { // If the bullet mass is not configured, estimate it _bulletMass = 3.4334 + 0.5171 * (getNumber (configFile >> "CfgAmmo" >> _ammo >> "hit") + getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber")); }; - + // Projectile motion is roughly equal to Barrel heat // Ref: https://en.wikipedia.org/wiki/Physics_of_firearms // Muzzle Engergy = 1/2 * m * v^2 = (1/2 * 0.001 g/kg * bulletMass (grams) * v^2) // Multiple by 3 becase we only calc every 3rd bullet: (3 * 1/2 * 0.001) = 0.0015 - private _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); + _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); GVAR(cacheAmmoData) setVariable [_ammo, _energyIncrement]; }; diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 3c65ca813c..fc5070e8a8 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -51,7 +51,7 @@ if (_distance < _backblastRange) then { private _damage = _alpha * _beta * _backblastDamage; [_damage * 100] call BIS_fnc_bloodEffect; - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical") && {([_unit] call EFUNC(medical,hasMedicalEnabled))}) then { + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { [_unit, _damage, "body", "backblast"] call EFUNC(medical,addDamageToUnit); } else { TRACE_1("",isDamageAllowed _unit); diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 53b02fe10d..b648d291d0 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -56,7 +56,7 @@ TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); // If the target is the ACE_player if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical") && {([_x] call EFUNC(medical,hasMedicalEnabled))}) then { + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { [_x, _damage, "body", "backblast"] call EFUNC(medical,addDamageToUnit); } else { TRACE_1("",isDamageAllowed _x); diff --git a/addons/pylons/functions/fnc_showDialog.sqf b/addons/pylons/functions/fnc_showDialog.sqf index ae5d4d3561..119489f4d8 100644 --- a/addons/pylons/functions/fnc_showDialog.sqf +++ b/addons/pylons/functions/fnc_showDialog.sqf @@ -1,20 +1,20 @@ #include "script_component.hpp" /* -* Author: 654wak654 -* Shows the aircraft loadout dialog for given aircraft. -* -* Arguments: -* 0: Aircraft -* 1: Is curator. Disables time and resource requirements. (default: false) -* -* Return Value: -* None -* -* Example: -* [vehicle ace_player] call ace_pylons_fnc_showDialog -* -* Public: Yes -*/ + * Author: 654wak654 + * Shows the aircraft loadout dialog for given aircraft. + * + * Arguments: + * 0: Aircraft + * 1: Is curator. Disables time and resource requirements. (default: false) + * + * Return Value: + * None + * + * Example: + * [vehicle ace_player] call ace_pylons_fnc_showDialog + * + * Public: Yes + */ params ["_aircraft", ["_isCurator", false]]; diff --git a/addons/quickmount/CfgVehicles.hpp b/addons/quickmount/CfgVehicles.hpp index d24a207d4b..a0b54df48b 100644 --- a/addons/quickmount/CfgVehicles.hpp +++ b/addons/quickmount/CfgVehicles.hpp @@ -43,7 +43,7 @@ class CfgVehicles { condition = QUOTE(call DFUNC(canShowFreeSeats)); \ statement = QUOTE(call DFUNC(getInNearest)); \ exceptions[] = {"isNotSwimming"}; \ - insertChildren = QUOTE(call DFUNC(addFreeSeatsActions)); \ + insertChildren = QUOTE((_this select 2) param [ARR_2(0, [])]); \ }; \ }; \ }; \ @@ -52,7 +52,7 @@ class CfgVehicles { displayName = CSTRING(ChangeSeat); \ condition = QUOTE(call DFUNC(canShowFreeSeats)); \ statement = ""; \ - insertChildren = QUOTE(call DFUNC(addFreeSeatsActions)); \ + insertChildren = QUOTE((_this select 2) param [ARR_2(0, [])]); \ }; \ } diff --git a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf index 560a036a50..ac146a8c57 100644 --- a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf +++ b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf @@ -6,6 +6,7 @@ * Arguments: * 0: Vehicle * 1: Unit + * 2: Args * * Return Value: * Can show menu @@ -16,8 +17,9 @@ * Public: No */ -params ["_vehicle", "_unit"]; +params ["_vehicle", "_unit", "_args"]; +_args set [0, []]; private _isInVehicle = _unit in _vehicle; GVAR(enabled) @@ -36,4 +38,8 @@ GVAR(enabled) 0.3 < vectorUp _vehicle select 2 // moveIn* and GetIn* don't work for flipped vehicles || {_vehicle isKindOf "Air"} // except Air } -&& {!([] isEqualTo (_this call FUNC(addFreeSeatsActions)))} // this should be replaced with faster function +&& { + private _subActions = _this call FUNC(addFreeSeatsActions); + _args set [0, _subActions]; + !([] isEqualTo _subActions) +} diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf index 232d6776ad..1af5d96a50 100644 --- a/addons/rearm/functions/fnc_hasEnoughSupply.sqf +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -1,20 +1,20 @@ #include "script_component.hpp" /* -* Author: GitHawk -* Check whether enough supply is left to take the magazine. -* -* Arguments: -* 0: Ammo Truck -* 1: Magazine Classname -* -* Return Value: -* Enough supply -* -* Example: -* [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply -* -* Public: No -*/ + * Author: GitHawk + * Check whether enough supply is left to take the magazine. + * + * Arguments: + * 0: Ammo Truck + * 1: Magazine Classname + * + * Return Value: + * Enough supply + * + * Example: + * [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply + * + * Public: No + */ params ["_truck", "_magazineClass"]; diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index d87c3d8cd8..922d25b646 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -30,7 +30,7 @@ if (_pylon > 0) exitWith { if (GVAR(level) == 1) then { // Fill magazine completely if (_turretPath isEqualTo [-1]) then {_turretPath = [];}; // Convert back to pylon turret format - TRACE_2("",_pylon,_magazineClass,_rounds); + TRACE_3("",_pylon,_magazineClass,_rounds); _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath]; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), @@ -40,7 +40,7 @@ if (_pylon > 0) exitWith { if (_turretPath isEqualTo [-1]) then {_turretPath = [];}; // Convert back to pylon turret format private _currentCount = _vehicle ammoOnPylon _pylon; private _newCount = ((_currentCount max 0) + _numRounds) min _rounds; - TRACE_2("",_pylon,_magazineClass,_newCount); + TRACE_3("",_pylon,_magazineClass,_newCount); _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath]; _vehicle setAmmoOnPylon [_pylon, _newCount]; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _numRounds, diff --git a/addons/recoil/functions/fnc_camshake.sqf b/addons/recoil/functions/fnc_camshake.sqf index fff9fecd6c..f5fa820b65 100644 --- a/addons/recoil/functions/fnc_camshake.sqf +++ b/addons/recoil/functions/fnc_camshake.sqf @@ -69,6 +69,6 @@ private _camshake = [ BASE_FREQ ]; -TRACE_4("addCamShake",_recoil,_powerCoef,_powerMod,_camshake);\ +TRACE_4("addCamShake",_recoil,_powerCoef,_powerMod,_camshake); addCamShake _camshake; diff --git a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf index 7f4d936ed3..9fae9abdab 100644 --- a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf +++ b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf @@ -72,7 +72,7 @@ TRACE_2("start",_unit,_nozzle); }; if !(_unit == vehicle _unit && {_unit isEqualTo ACE_player}) exitWith { - TRACE_1("stop vehicle/player",_unit,vehicle _unit); + TRACE_2("stop vehicle/player",_unit,vehicle _unit); DROP_NOZZLE UNHOLSTER_WEAPON END_PFH diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf index 8394b4f5ac..7439d35c12 100644 --- a/addons/repair/functions/fnc_getHitPointString.sqf +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -33,6 +33,7 @@ if (_track) then { }; // Prepare first part of the string from stringtable +//IGNORE_STRING_WARNING(str_ace_repair_hit); private _text = LSTRING(Hit); // Remove "Hit" from hitpoint name if one exists diff --git a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf index aa10af0358..25a50d140b 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Nelson Duarte, AACO, SilentSpike * Function used to handle key down event diff --git a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf index 1ab7213aa1..cf08d4caf6 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Nelson Duarte, SilentSpike * Function used to handle key up event diff --git a/addons/spectator/functions/fnc_ui_updateHelp.sqf b/addons/spectator/functions/fnc_ui_updateHelp.sqf index f715cb1eca..d1187ae355 100644 --- a/addons/spectator/functions/fnc_ui_updateHelp.sqf +++ b/addons/spectator/functions/fnc_ui_updateHelp.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineDIKCodes.inc" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" /* * Author: Nelson Duarte, SilentSpike * Updates spectator UI help element diff --git a/addons/tagging/functions/fnc_tag.sqf b/addons/tagging/functions/fnc_tag.sqf index 2e14906d43..1a0fe20e64 100644 --- a/addons/tagging/functions/fnc_tag.sqf +++ b/addons/tagging/functions/fnc_tag.sqf @@ -37,7 +37,7 @@ private _intersections = lineIntersectsSurfaces [_startPosASL, _endPosASL, _unit // If there's no intersections if (_intersections isEqualTo []) exitWith { - TRACE_3("No intersections",_intersections); + TRACE_1("No intersections",_intersections); false }; @@ -95,7 +95,7 @@ if ( !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || {!([ 0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk) || {!([-0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || {!([-0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk)}}}) exitWith { - TRACE_3("Unsuitable location:",_touchingPoint); + TRACE_1("Unsuitable location:",_touchingPoint); false }; diff --git a/addons/vehicles/XEH_preInit.sqf b/addons/vehicles/XEH_preInit.sqf index b47cf6628d..028a8aec1c 100644 --- a/addons/vehicles/XEH_preInit.sqf +++ b/addons/vehicles/XEH_preInit.sqf @@ -6,4 +6,37 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + +[ + "AllVehicles", + "initPost", + { + params ["_vehicle"]; + _vehicle setVariable [QGVAR(engineState), isEngineOn _vehicle]; + } +] call CBA_fnc_addClassEventHandler; +[ + "AllVehicles", + "engine", + { + params ["_vehicle", "_state"]; + _vehicle setVariable [QGVAR(engineState), _state]; + } +] call CBA_fnc_addClassEventHandler; +[ + "AllVehicles", + "getout", + { + params ["_vehicle", "_position", "_unit"]; + if (!GVAR(keepEngineRunning)) exitWith {}; + if (_unit == ACE_player && {_position == "driver" && {_vehicle getVariable [QGVAR(engineState), false]}}) then { + [{ + params ["_vehicle"]; + [QEGVAR(common,engineOn), _this, _vehicle] call CBA_fnc_targetEvent; + }, [_vehicle, true]] call CBA_fnc_execNextFrame; + }; + } +] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/vehicles/initSettings.sqf b/addons/vehicles/initSettings.sqf new file mode 100644 index 0000000000..026367a794 --- /dev/null +++ b/addons/vehicles/initSettings.sqf @@ -0,0 +1,9 @@ + +[ + QGVAR(keepEngineRunning), + "CHECKBOX", + [LSTRING(SettingKeepEngineRunningName), LSTRING(SettingKeepEngineRunningDesc)], + localize ELSTRING(common,ACEKeybindCategoryVehicles), + false, // default value + true // isGlobal +] call CBA_settings_fnc_init; diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index b2d282b305..271c788ad3 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -67,5 +67,13 @@ 速度制限を減らす Zmniejsz ograniczenie prędkości + + Disable automatic engine shut-off + Motor nach Verlassen laufen lassen + + + Prevent the automatic shut-off of the engine when exiting vehicles. + Verhindere das automatische Abschalten des Motors beim Verlassen des Fahrzeugs. + diff --git a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf index a43ba78189..4659fba2d5 100644 --- a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf +++ b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf @@ -20,7 +20,7 @@ params ["_varName", "_varValue"]; _varValue params ["_general", "_accuracy", "_handling", "_spotting", "_cover", "_combat"]; TRACE_1("Params",_this); -TRACE_6("AI settings updated",GVAR(GlobalSkillAI)); +TRACE_1("AI settings updated",GVAR(GlobalSkillAI)); { if (local _x) then { _x setSkill ["general", _general]; diff --git a/addons/zeus/functions/fnc_moduleHeal.sqf b/addons/zeus/functions/fnc_moduleHeal.sqf index 647112f67a..287a84ac79 100644 --- a/addons/zeus/functions/fnc_moduleHeal.sqf +++ b/addons/zeus/functions/fnc_moduleHeal.sqf @@ -43,8 +43,9 @@ switch (false) do { }; // Heal validated target -if (["ace_medical"] call EFUNC(common,isModLoaded) && {EGVAR(medical,level) > 0}) then { - [QEGVAR(medical,treatmentAdvanced_fullHealLocal), [_unit, _unit], _unit] call CBA_fnc_targetEvent; +if (["ace_medical"] call EFUNC(common,isModLoaded)) then { + TRACE_1("healing with ace_medical",_unit); + [QEGVAR(medical_treatment,treatmentFullHealLocal), [_unit], _unit] call CBA_fnc_targetEvent; } else { // BI's scripted revive system if ((missionNamespace getVariable ["bis_revive_mode", 0]) != 0) then { diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index fbba773b04..9bcec2cdcb 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -37,9 +37,9 @@ if (isNil QEFUNC(medical,setUnconscious)) then { if !(alive _unit) then { [LSTRING(OnlyAlive)] call FUNC(showMessage); } else { - private _conscious = GETVAR(_unit,ACE_isUnconscious,false); + private _unconscious = GETVAR(_unit,ACE_isUnconscious,false); // Function handles locality for me - [_unit, !_conscious, 10e10, true] call EFUNC(medical,setUnconscious); + [_unit, !_unconscious, 10e10] call EFUNC(medical,setUnconscious); }; }; }; diff --git a/circle.yml b/circle.yml index 77b01ba205..5cd5f0d72d 100644 --- a/circle.yml +++ b/circle.yml @@ -6,8 +6,8 @@ jobs: steps: - checkout - run: - name: Validate SQF and Config style - command: python tools/sqf_validator.py && python tools/config_style_checker.py + name: Validate SQF and Config style and Stringtable entries + command: python tools/sqf_validator.py && python tools/config_style_checker.py && python tools/check_strings.py linting: docker: diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 7e516cdb68..a19a72b0a1 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -43,7 +43,7 @@ {% endif %} {% if include.component == "captives" %} -`ACE_Interaction` +`ace_interaction` {% endif %} {% if include.component == "cargo" %} @@ -71,7 +71,7 @@ {% endif %} {% if include.component == "disarming" %} -`ACE_Interaction` +`ace_interaction` {% endif %} {% if include.component == "disposable" %} @@ -219,19 +219,47 @@ {% endif %} {% if include.component == "medical" %} -`ace_interaction`, `ace_apl` +`ace_common` {% endif %} {% if include.component == "medical_ai" %} -`ace_medical` +`ace_medical_treatment` {% endif %} {% if include.component == "medical_blood" %} -`ace_main` +`ace_medical_status` {% endif %} -{% if include.component == "medical_menu" %} -`ace_medical` +{% if include.component == "medical_damage" %} +`ace_medical_engine` +{% endif %} + +{% if include.component == "medical_engine" %} +`ace_common` +{% endif %} + +{% if include.component == "medical_feedback" %} +`ace_medical_status` +{% endif %} + +{% if include.component == "medical_gui" %} +`ace_medical_treatment`, `ace_interaction` +{% endif %} + +{% if include.component == "medical_statemachine" %} +`ace_medical_vitals` +{% endif %} + +{% if include.component == "medical_status" %} +`ace_medical_engine` +{% endif %} + +{% if include.component == "medical_treatment" %} +`ace_medical_status`, `ace_medical_damage`, `ace_apl` +{% endif %} + +{% if include.component == "medical_vitals" %} +`ace_medical_status` {% endif %} {% if include.component == "microdagr" %} diff --git a/docs/tools/document_functions.py b/docs/tools/document_functions.py new file mode 100644 index 0000000000..b51aae18a3 --- /dev/null +++ b/docs/tools/document_functions.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python3 +""" +Author: SilentSpike +Crawl function headers to produce appropriate documentation of public functions. + +Supported header sections: + - Author(s) (with description below) + - Arguments + - Return Value + - Example(s) + - Public (by default function will only be documented if set to "Yes") + +EXAMPLES + document_functions common --debug + Crawl only functions in addons/common and only reports debug messages. +""" + +import os +import sys +import re +import argparse + +class FunctionFile: + def __init__(self, directory="."): + self.directory = directory + + # False unless specified in processing + self.debug = False + + # Empty until imported from file + self.path = "" + self.header = "" + + # Defaults until header is processed + self.public = False + self.authors = [] + self.description = "" + self.arguments = [] + self.return_value = [] + self.example = "" + + # Filepath should only be logged once + self.logged = False + + def import_header(self, file_path): + self.path = file_path + + with open(file_path) as file: + code = file.read() + + header_match = re.match(r"\s*/\*.+?\*/", code, re.S) + if header_match: + self.header = header_match.group(0) + else: + self.feedback("Missing header", 3) + + def has_header(self): + return bool(self.header) + + def process_header(self, debug=False): + # Detailed debugging occurs here so value is set + self.debug = debug + + # Preemptively cut away the comment characters (and leading/trailing whitespace) + self.header_text = "\n".join([x[3:].strip() for x in self.header.splitlines()]) + + # Split the header into expected sections + self.sections = re.split(r"^(Author|Argument|Return Value|Example|Public)s?:\s?", self.header_text, 0, re.M) + + # If public section is missing we can't continue + public_raw = self.get_section("Public") + if not public_raw: + self.feedback("Public value undefined", 3) + return + + # Determine whether the header is public + self.public = self.process_public(public_raw) + + # Don't bother to process the rest if private + # Unless in debug mode + if not self.public and not self.debug: + return + + # Retrieve the raw sections text for processing + author_raw = self.get_section("Author") + arguments_raw = self.get_section("Argument") + return_value_raw = self.get_section("Return Value") + example_raw = self.get_section("Example") + + # Author and description are stored in first section + if author_raw: + self.authors = self.process_author(author_raw) + self.description = self.process_description(author_raw) + + if arguments_raw: + self.arguments = self.process_arguments(arguments_raw) + + # Process return + if return_value_raw: + self.return_value = self.process_return_value(return_value_raw) + + # Process example + if example_raw: + self.example = example_raw.strip() + + def get_section(self, section_name): + try: + section_text = self.sections[self.sections.index(section_name) + 1] + return section_text + except ValueError: + self.feedback("Missing \"{}\" header section".format(section_name), 2) + return "" + + def process_public(self, raw): + # Raw just includes an EOL character + public_text = raw[:-1] + + if not re.match(r"(Yes|No)", public_text, re.I): + self.feedback("Invalid public value \"{}\"".format(public_text), 2) + + return public_text.capitalize() == "Yes" + + def is_public(self): + return self.public + + def process_author(self, raw): + # Authors are listed on the first line + authors_text = raw.splitlines()[0] + + # Seperate authors are divided by commas + return authors_text.split(", ") + + def process_description(self, raw): + # Just use all the lines after the authors line + description_text = "".join(raw.splitlines(1)[1:]) + + return description_text + + def process_arguments(self, raw): + lines = raw.splitlines() + + if lines[0] == "None": + return [] + + if lines.count("") == len(lines): + self.feedback("No arguments provided (use \"None\" where appropriate)", 2) + return [] + + if lines[-1] == "": + lines.pop() + else: + self.feedback("No blank line after arguments list", 1) + + arguments = [] + for argument in lines: + valid = re.match(r"^(\d+):\s(.+?)\<([\s\w]+?)\>(\s\(default: (.+)\))?$", argument) + + if valid: + arg_index = valid.group(1) + arg_name = valid.group(2) + arg_types = valid.group(3) + arg_default = valid.group(5) + arg_notes = [] + + if arg_index != str(len(arguments)): + self.feedback("Argument index {} does not match listed order".format(arg_index), 1) + + if arg_default == None: + arg_default = "" + + arguments.append([arg_index, arg_name, arg_types, arg_default, arg_notes]) + else: + # Notes about the above argument won't start with an index + # Only applies if there exists an above argument + if re.match(r"^(\d+):", argument) or not arguments: + self.feedback("Malformed argument \"{}\"".format(argument), 2) + arguments.append(["?", "Malformed", "?", "?", []]) + else: + arguments[-1][-1].append(argument) + + return arguments + + def process_return_value(self, raw): + return_value = raw.strip() + + if return_value == "None": + return [] + + valid = re.match(r"^(.+?)\<([\s\w]+?)\>", return_value) + + if valid: + return_name = valid.group(1) + return_types = valid.group(2) + else: + self.feedback("Malformed return value \"{}\"".format(return_value), 2) + return ["Malformed",""] + + return [return_name, return_types] + + def document(self, component): + str_list = [] + + # Title + str_list.append("\n## ace_{}_fnc_{}\n".format(component,os.path.basename(self.path)[4:-4])) + # Description + str_list.append("__Description__\n\n" + self.description) + # Arguments + if self.arguments: + str_list.append("__Parameters__\n\nIndex | Description | Datatype(s) | Default Value\n--- | --- | --- | ---\n") + for argument in self.arguments: + str_list.append("{} | {} | {} | {}\n".format(*argument)) + str_list.append("\n") + else: + str_list.append("__Parameters__\n\nNone\n\n") + # Return Value + if self.return_value: + str_list.append("__Return Value__\n\nDescription | Datatype(s)\n--- | ---\n{} | {}\n\n".format(*self.return_value)) + else: + str_list.append("__Return Value__\n\nNone\n\n") + # Example + str_list.append("__Example__\n\n```sqf\n{}\n```\n\n".format(self.example)) + # Authors + str_list.append("\n__Authors__\n\n") + for author in self.authors: + str_list.append("- {}\n".format(author)) + # Horizontal rule + str_list.append("\n---\n") + + return ''.join(str_list) + + def log_file(self, error=False): + # When in debug mode we only want to see the files with errors + if not self.debug or error: + if not self.logged: + rel_path = os.path.relpath(self.path, self.directory) + + self.write("Processing... {}".format(rel_path), 1) + self.logged = True + + def feedback(self, message, level=0): + priority_str = ["Info","Warning","Error","Aborted"][level] + + self.log_file(level > 0) + self.write("{0}: {1}".format(priority_str, message)) + + def write(self, message, indent=2): + to_print = [" "]*indent + to_print.append(message) + print("".join(to_print)) + +def document_functions(components): + os.makedirs('../wiki/functions/', exist_ok=True) + + for component in components: + output = os.path.join('../wiki/functions/',component) + ".md" + with open(output, "w") as file: + for function in components[component]: + file.write(function.document(component)) + +def crawl_dir(directory, debug=False): + components = {} + + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(".sqf") and file.startswith("fnc_"): + file_path = os.path.join(root, file) + + # Attempt to import the header from file + function = FunctionFile(directory) + function.import_header(file_path) + + # Undergo data extraction and detailed debug + if function.has_header(): + function.process_header(debug) + + if function.is_public() and not debug: + # Add functions to component key (initalise key if necessary) + component = os.path.basename(os.path.dirname(root)) + components.setdefault(component,[]).append(function) + + function.feedback("Publicly documented") + + document_functions(components) + +def main(): + print(""" + ######################### + # Documenting Functions # + ######################### + """) + + parser = argparse.ArgumentParser() + parser.add_argument('directory', nargs="?", type=str, default=".", help='only crawl specified module addon folder') + parser.add_argument('--debug', action="store_true", help='only check for header debug messages') + args = parser.parse_args() + + # abspath is just used for the terminal output + prospective_dir = os.path.abspath(os.path.join('../../addons/',args.directory)) + if os.path.isdir(prospective_dir): + print("Directory: {}".format(prospective_dir)) + crawl_dir(prospective_dir, args.debug) + else: + print("Invalid directory: {}".format(prospective_dir)) + +if __name__ == "__main__": + main() diff --git a/docs/wiki/development/branching-and-release.md b/docs/wiki/development/branching-and-release.md index 7e6c1772da..80216f3b92 100644 --- a/docs/wiki/development/branching-and-release.md +++ b/docs/wiki/development/branching-and-release.md @@ -40,7 +40,7 @@ During this release process between the Friday and Tuesday, the day of release, ### 3.1 Branching * New features, bug fixes that are not a hotfix or other work will always be branched off `master` or another branch but never a `hotfix` or the `release` branch. -* Hotfixes are always branched off the `release` branch +* Hotfixes are always branched off the `release` branch. * The `release` branch is never merged or deleted. Only `master` or hotfixes are allowed to merge into the `release` branch. ### 3.2 Diagram diff --git a/docs/wiki/framework/explosives-framework.md b/docs/wiki/framework/explosives-framework.md index bd6779b68e..fe59e388ef 100644 --- a/docs/wiki/framework/explosives-framework.md +++ b/docs/wiki/framework/explosives-framework.md @@ -204,3 +204,9 @@ Jammer that blocks RF triggers: true }] call ace_explosives_fnc_addDetonateHandler; ``` + +#### 5.4 Custom timer limits +`Added in 3.12.7` + +Can set custom min and max time for the timer trigger, can set one or both, time in seconds +`ace_explosives_customTimerMin` / `ace_explosives_customTimerMax` diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 2a50ba4ee6..001877a2cd 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -78,7 +78,7 @@ namespace ace { } } if (highestSpot == NULL) { - break; + break; } int c = 0; @@ -94,10 +94,10 @@ namespace ace { { injuryToAdd = highestSpot; } - else - { + else + { int indexNewInjuryToAdd = rand() % information.size(); - injuryToAdd = information.at(indexNewInjuryToAdd); + injuryToAdd = information.at(indexNewInjuryToAdd); } int bodyPartID = selection; @@ -105,7 +105,7 @@ namespace ace { { bodyPartID = rand() % 6; } - + injuries::OpenWound newWound(woundID++, injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); injuriesToAdd.push_back(newWound); } @@ -202,14 +202,14 @@ namespace ace { } } - int handleDamage::SelectionToNumber(const std::string& selectionName) + int handleDamage::SelectionToNumber(const std::string& hitpointName) { // TODO use dynamic selections instead - std::vector selections = { "head", "body", "hand_l", "hand_r", "leg_l", "leg_r" }; - std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); - if (it != selections.end()) + std::vector hitpoints = { "Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg" }; + std::vector::iterator it = find(hitpoints.begin(), hitpoints.end(), hitpointName); + if (it != hitpoints.end()) { - return it - selections.begin(); + return it - hitpoints.begin(); } else { diff --git a/extras/airFrictionAnalysis.txt b/extras/airFrictionAnalysis.txt index ad06f309d2..49c64aa2f6 100644 --- a/extras/airFrictionAnalysis.txt +++ b/extras/airFrictionAnalysis.txt @@ -154,10 +154,10 @@ Optimal airFriction: 0.00063027 Ammo Class: ACE_762x67_Ball_Berger_Hybrid_OTM MaxRanges (m): [900, 1000, 1000] MuzzleVelocities (m/s): [800, 853, 884] -Max. Velocity diff (m/s): 19.94 -Max. Drop diff (cm): 8.04 -Max. Tof diff (ms): 16.0 -Optimal airFriction: 0.00055262 +Max. Velocity diff (m/s): 19.15 +Max. Drop diff (cm): 7.57 +Max. Tof diff (ms): 15.0 +Optimal airFriction: 0.00053638 ########################################## Ammo Class: B_762x54_Ball MaxRanges (m): [500, 800, 800] diff --git a/include/a3/data_f/$PBOPREFIX$ b/include/a3/data_f/$PBOPREFIX$ new file mode 100644 index 0000000000..74761492ac --- /dev/null +++ b/include/a3/data_f/$PBOPREFIX$ @@ -0,0 +1 @@ +a3\data_f \ No newline at end of file diff --git a/include/a3/ui_f/$PBOPREFIX$ b/include/a3/ui_f/$PBOPREFIX$ new file mode 100644 index 0000000000..bcaad3e8cc --- /dev/null +++ b/include/a3/ui_f/$PBOPREFIX$ @@ -0,0 +1 @@ +a3\ui_f \ No newline at end of file diff --git a/include/a3/ui_f/hpp/defineDIKCodes.inc b/include/a3/ui_f/hpp/defineDIKCodes.inc new file mode 100644 index 0000000000..c641d60132 --- /dev/null +++ b/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -0,0 +1,190 @@ +#ifndef DIK_ESCAPE + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ + diff --git a/include/a3/ui_f/hpp/defineResincl.inc b/include/a3/ui_f/hpp/defineResincl.inc new file mode 100644 index 0000000000..7a94b6b592 --- /dev/null +++ b/include/a3/ui_f/hpp/defineResincl.inc @@ -0,0 +1,3170 @@ +/*******************/ +/* Tactical menu */ +/*******************/ + +// Menu commands + // main menu +#define CMD_SEPARATOR -1 +#define CMD_NOTHING -2 +#define CMD_HIDE_MENU -3 +#define CMD_BACK -4 +// Custom menu command +#define CMD_EXECUTE -5 + +#ifdef _CONFIG +enum +{ +// note: this CMD should be if possible organized as is menu +// (items from the same menu together) +// this makes searching much easier + +//main menu level +CMD_GETIN, +CMD_GETOUT, +CMD_ACTION, + +// move submenu + +// other commands +CMD_ADVANCE, +CMD_STAY_BACK, +CMD_FLANK_LEFT, +CMD_FLANK_RIGHT, +CMD_NEXT_WAYPOINT, +CMD_HIDE, +CMD_JOIN, +CMD_STOP, +CMD_EXPECT, +CMD_MOVE, + + // formations +CMD_FORM_COLUMN, +CMD_FORM_STAGCOL, +CMD_FORM_WEDGE, +CMD_FORM_ECHLEFT, +CMD_FORM_ECHRIGHT, +CMD_FORM_VEE, +CMD_FORM_LINE, +CMD_FORM_DIAMOND, +CMD_FORM_FILE, + +// engage +CMD_ENGAGE, +CMD_LOOSE_FORM, +CMD_KEEP_FORM, + +CMD_HOLD_FIRE, +CMD_OPEN_FIRE, +CMD_FIRE, + +// status +CMD_WATCH, +CMD_WATCH_AROUND, +CMD_WATCH_AUTO, +CMD_WATCH_DIR, + +// combat modes +CMD_STEALTH, +CMD_COMBAT, +CMD_AWARE, +CMD_SAFE, + +// heal +CMD_HEALBLEEDING, +CMD_HEAL, +CMD_HEAL_SELF, +CMD_REPAIR_VEHICLE, +CMD_CARRY, +CMD_DROP_CARRIED, +CMD_PUTIN, +CMD_UNLOADFROM, + +// swiming and diving +CMD_KEEP_DEPTH_RELATIVE_UP, +CMD_KEEP_DEPTH_RELATIVE_DOWN, +CMD_KEEP_DEPTH_LEADER, +CMD_KEEP_DEPTH_UNDERSURFACE, +CMD_KEEP_DEPTH_ABOVESURFACE, +CMD_KEEP_DEPTH_BOTTOM, + +//suppress fire +CMD_SUPPRESS, + +CMD_POS_UP, +CMD_POS_MIDDLE, +CMD_POS_DOWN, +CMD_POS_AUTO, + // teams +CMD_TEAM_MAIN, +CMD_TEAM_RED, +CMD_TEAM_GREEN, +CMD_TEAM_BLUE, +CMD_TEAM_YELLOW, +CMD_ASSIGN_MAIN, +CMD_ASSIGN_RED, +CMD_ASSIGN_GREEN, +CMD_ASSIGN_BLUE, +CMD_ASSIGN_YELLOW, +CMD_TEAM_DISSOLVE, + +// radio +CMD_RADIO_ALPHA, +CMD_RADIO_BRAVO, +CMD_RADIO_CHARLIE, +CMD_RADIO_DELTA, +CMD_RADIO_ECHO, +CMD_RADIO_FOXTROT, +CMD_RADIO_GOLF, +CMD_RADIO_HOTEL, +CMD_RADIO_INDIA, +CMD_RADIO_JULIET, + +// reply commands + +CMD_REPLY_DONE, +CMD_REPLY_FAIL, +CMD_REPLY_COPY, +CMD_REPLY_REPEAT, +CMD_REPLY_WHERE_ARE_YOU, +CMD_REPORT, +CMD_REPLY_ENGAGING, +CMD_REPLY_UNDER_FIRE, +CMD_REPLY_HIT, +CMD_REPLY_ONE_LESS, +CMD_REPLY_FIREREADY, +CMD_REPLY_FIRENOTREADY, +CMD_REPLY_KILLED, +CMD_REPLY_AMMO_LOW, +CMD_REPLY_FUEL_LOW, +CMD_REPLY_INJURED, +CMD_REPLY_OUT_OF_FAKs, + +CMD_SUPPORT_MEDIC, +CMD_SUPPORT_AMBULANCE, +CMD_SUPPORT_REPAIR, +CMD_SUPPORT_REARM, +CMD_SUPPORT_REFUEL, +CMD_SUPPORT_DONE, + +CMD_RADIO_CUSTOM, +CMD_RADIO_CUSTOM_1, +CMD_RADIO_CUSTOM_2, +CMD_RADIO_CUSTOM_3, +CMD_RADIO_CUSTOM_4, +CMD_RADIO_CUSTOM_5, +CMD_RADIO_CUSTOM_6, +CMD_RADIO_CUSTOM_7, +CMD_RADIO_CUSTOM_8, +CMD_RADIO_CUSTOM_9, +CMD_RADIO_CUSTOM_0, + +CMD_UNIT_1, +CMD_UNIT_2, +CMD_UNIT_3, +CMD_UNIT_4, +CMD_UNIT_5, +CMD_UNIT_6, +CMD_UNIT_7, +CMD_UNIT_8, +CMD_UNIT_9, +CMD_UNIT_10, +CMD_UNIT_11, +CMD_UNIT_12, +CMD_UNITS_ALL, + +CMD_MY_VEHICLE, + +CMD_SELECT_MAIN, +CMD_SELECT_RED, +CMD_SELECT_GREEN, +CMD_SELECT_BLUE, +CMD_SELECT_YELLOW, + +CMD_VEHICLE_1, +CMD_VEHICLE_2, +CMD_VEHICLE_3, +CMD_VEHICLE_4, +CMD_VEHICLE_5, +CMD_VEHICLE_6, +CMD_VEHICLE_7, +CMD_VEHICLE_8, +CMD_VEHICLE_9, +CMD_VEHICLE_10, +CMD_VEHICLE_11, +CMD_VEHICLE_12, + +CMD_SINGLE_UNITS, + +CMD_MP_CHANNEL_GLOBAL, +CMD_MP_CHANNEL_SIDE, +CMD_MP_CHANNEL_COMMAND, +CMD_MP_CHANNEL_GROUP, +CMD_MP_CHANNEL_VEHICLE, + +CMD_CONVERSATION, + +// Context sensitive commands +CMD_MOVE_AUTO, +CMD_STOP_AUTO, +CMD_WATCH_CTX, +CMD_GETIN_AUTO, +CMD_REARM_AUTO, +CMD_ATTACK_AUTO, +CMD_FIRE_AT_POSITION_AUTO, +CMD_SELECT_AUTO, +CMD_SELECT_AUTO_ADD, +CMD_DESELECT_AUTO, +CMD_JOIN_AUTO, +CMD_OPEN_FIRE_AUTO, +CMD_HOLD_FIRE_AUTO, +CMD_COMPLEX_COMMAND, +CMD_DISABLE_MINE, + +CMD_SELECT_UNIT_FROM_BAR, +CMD_DESELECT_UNIT_FROM_BAR, +CMD_SELECT_VEHICLE_FROM_BAR, +CMD_DESELECT_VEHICLE_FROM_BAR, +CMD_SELECT_TEAM_FROM_BAR, +CMD_DESELECT_TEAM_FROM_BAR, + +CMD_JOIN_ALL, + +CMD_SWITCH_TO_LEADER, +CMD_SWITCH_TO_SELECTED, + +CMD_NOTARGET, + +CMD_HC_SELECT_AUTO, +CMD_HC_SELECT_AUTO_ADD, +CMD_HC_DESELECT_AUTO, +CMD_HC_SELECT_UNIT_FROM_BAR, +CMD_HC_DESELECT_UNIT_FROM_BAR, +CMD_HC_SELECT_TEAM_FROM_BAR, +CMD_HC_DESELECT_TEAM_FROM_BAR, +CMD_OPENPARACHUTE, +CMD_TAKE_BACKPACK, +CMD_ASSEMBLE_WEAPON, +CMD_DISASSEMBLE_WEAPON, +CMD_ENGAGE_AUTO, +CMD_FIRE_AUTO, +CMD_FIRE_AT_POSITION_AMMO // same as CMD_FIRE_AT_POSITION_AUTO but with custom magazine +}; + +/// In-game UI hiding animation type +enum HideType +{ + HTNone, // no animation + HTFade, // fade in / fade out + HTMoveLeft, // move from / to the left + HTMoveRight // move from / to the right +}; + +enum +{ + SPTPlain, + SPTPercents +}; + +#endif + + +/*******************/ +/* Controls */ +/*******************/ + +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_CONTROLS_TABLE 19 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 +#define CT_VEHICLE_DIRECTION 105 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// MessageBox styles +#define MB_BUTTON_OK 1 +#define MB_BUTTON_CANCEL 2 +#define MB_BUTTON_USER 4 +#define MB_ERROR_DIALOG 8 + +// Xbox buttons +#define KEY_XINPUT 0x00050000 + +#define KEY_XBOX_A KEY_XINPUT + 0 +#define KEY_XBOX_B KEY_XINPUT + 1 +#define KEY_XBOX_X KEY_XINPUT + 2 +#define KEY_XBOX_Y KEY_XINPUT + 3 +#define KEY_XBOX_Up KEY_XINPUT + 4 +#define KEY_XBOX_Down KEY_XINPUT + 5 +#define KEY_XBOX_Left KEY_XINPUT + 6 +#define KEY_XBOX_Right KEY_XINPUT + 7 +#define KEY_XBOX_Start KEY_XINPUT + 8 +#define KEY_XBOX_Back KEY_XINPUT + 9 +#define KEY_XBOX_LeftBumper KEY_XINPUT + 10 +#define KEY_XBOX_RightBumper KEY_XINPUT + 11 +#define KEY_XBOX_LeftTrigger KEY_XINPUT + 12 +#define KEY_XBOX_RightTrigger KEY_XINPUT + 13 +#define KEY_XBOX_LeftThumb KEY_XINPUT + 14 +#define KEY_XBOX_RightThumb KEY_XINPUT + 15 +#define KEY_XBOX_LeftThumbXRight KEY_XINPUT + 16 +#define KEY_XBOX_LeftThumbYUp KEY_XINPUT + 17 +#define KEY_XBOX_RightThumbXRight KEY_XINPUT + 18 +#define KEY_XBOX_RightThumbYUp KEY_XINPUT + 19 +#define KEY_XBOX_LeftThumbXLeft KEY_XINPUT + 20 +#define KEY_XBOX_LeftThumbYDown KEY_XINPUT + 21 +#define KEY_XBOX_RightThumbXLeft KEY_XINPUT + 22 +#define KEY_XBOX_RightThumbYDown KEY_XINPUT + 23 + +// Predefined controls +#define IDC_OK 1 +#define IDC_CANCEL 2 +#define IDC_AUTOCANCEL 3 +#define IDC_ABORT 4 +#define IDC_RESTART 5 +#define IDC_USER_BUTTON 6 +#define IDC_EXIT_TO_MAIN 7 + +// my own control window for tests +#define IDC_MY_FIRST_LISTBOX 110 +#define IDC_MY_FIRST_BUTTON 111 +#define IDC_MY_FIRST_SLIDER 112 + +#define IDC_MAP 51 +#define IDC_WEATHER 52 +#define IDC_POSITION 53 +#define IDC_TIME 54 +#define IDC_DATE 55 +#define IDC_BRIEFING 56 +#define IDC_MAP_NOTES 57 +#define IDC_MAP_PLAN 58 +#define IDC_MAP_TEAM_SWITCH 59 +#define IDC_MAP_GROUP 60 +//#define IDC_MAP_BRIEFING 61 +//#define IDC_MAP_DEBRIEFING 62 +#define IDC_RADIO_ALPHA 63 +#define IDC_RADIO_BRAVO 64 +#define IDC_RADIO_CHARLIE 65 +#define IDC_RADIO_DELTA 66 +#define IDC_RADIO_ECHO 67 +#define IDC_RADIO_FOXTROT 68 +#define IDC_RADIO_GOLF 69 +#define IDC_RADIO_HOTEL 70 +#define IDC_RADIO_INDIA 71 +#define IDC_RADIO_JULIET 72 +#define IDC_MAP_NAME 73 +#define IDC_WARRANT 74 +#define IDC_GPS 75 + +#define IDC_NOTEPAD_PICTURE 76 + +#define IDC_GPS_ALT 77 +#define IDC_GPS_HEADING 78 + +// - diary topics (used in multiple displays - diary, map, briefing, debriefing) +#define IDC_DIARY_TOPIC_MAP 80 +#define IDC_DIARY_TOPIC_1 81 +#define IDC_DIARY_TOPIC_2 82 +#define IDC_DIARY_TOPIC_3 83 +#define IDC_DIARY_TOPIC_4 84 +#define IDC_DIARY_TOPIC_5 85 +#define IDC_DIARY_TOPIC_6 86 +#define IDC_DIARY_TOPIC_7 87 +#define IDC_DIARY_TOPIC_8 88 +#define IDC_DIARY_TOPIC_9 89 + +#define IDC_HSLIDER 98 +#define IDC_VSLIDER 99 + +#define IDC_ARTILLERY_MAP 500 +#define IDC_ARTILLERY_MAP_FIRE 501 + +#define IDC_ARTILLERY_MAP_NAME 502 +#define IDC_ARTILLERY_MAP_ID 503 +#define IDC_ARTILLERY_MAP_GRID 504 +#define IDC_ARTILLERY_MAP_DIST 505 +#define IDC_ARTILLERY_MAP_MIN 506 +#define IDC_ARTILLERY_MAP_MAX 507 +#define IDC_ARTILLERY_MAP_DIR 508 +#define IDC_ARTILLERY_MAP_ALT 509 +#define IDC_ARTILLERY_MAP_MODE 510 +#define IDC_ARTILLERY_MAP_AMMO 511 +#define IDC_ARTILLERY_MAP_SHELLS 512 +#define IDC_ARTILLERY_MAP_SPREAD 513 +#define IDC_ARTILLERY_MAP_ETA 514 +#define IDC_ARTILLERY_MAP_AMMOCOUNT 515 +#define IDC_ARTILLERY_MAP_WARNING 516 +#define IDC_ARTILLERY_MAP_AIMABOVE 517 + +#define IDC_DIARY_TOPIC_LIST 1001 +#define IDC_DIARY_TOPIC_LISTINDEX 1002 +#define IDC_DIARY_TOPIC_HTML 1003 +#define IDC_DIARY_TOPIC_ADD_RECORD 1004 +#define IDC_DIARY_TOPIC_HTML_GROUP 1013 + +#define IDC_DIARY_PLAYER_NAME 111 +#define IDC_DIARY_MISSION_NAME 112 +#define IDC_DIARY_CURRENT_TASK 113 +#define IDC_DIARY_PLAYER_RANK 116 +//VON/chat muting in Diary +#define IDC_DIARY_PLAYERS_BUTTON 117 +#define IDC_DIARY_PLAYERS_SORT 118 +#define IDC_DIARY_MUTE_ALL 119 + +#define IDC_DIARY_TOPIC_BACKGROUND 1021 +#define IDC_DIARY_SUBTOPIC_BACKGROUND 1022 +#define IDC_DIARY_CONTENT_BACKGROUND 1023 + +//IDCs for marker color and icon. +//Are directly connected to RscMapControl, namely its idcMarkerColor and idcMarkerIcon parameters. +//Engine searches for the parameters in any display where RscMapControl is used, that's why they got more uncommon IDCs. +#define IDC_DIARY_MARKER_COLOR 1090 +#define IDC_DIARY_MARKER_ICON 1091 + + +// Instances of display +#define IDD_MAIN 0 +#define IDD_GAME 1 +#define IDD_SINGLE_MISSION 2 +#define IDD_OPTIONS 3 +#define IDD_CONFIGURE 4 +#define IDD_OPTIONS_VIDEO 5 +#define IDD_OPTIONS_AUDIO 6 +#define IDD_MULTIPLAYER 8 +#define IDD_LOAD_AAR 9 +#define IDD_MAIN_MAP 12 +#define IDD_SAVE 13 +#define IDD_END 14 +#define IDD_SERVER 17 +#define IDD_CLIENT 18 +#define IDD_IP_ADDRESS 19 +#define IDD_SERVER_SETUP 20 +#define IDD_CLIENT_SETUP 21 +#define IDD_CLIENT_WAIT 22 +#define IDD_CHAT 24 +#define IDD_CUSTOM_ARCADE 25 +#define IDD_ARCADE_MAP 26 +#define IDD_ARCADE_UNIT 27 +#define IDD_ARCADE_WAYPOINT 28 +#define IDD_TEMPLATE_SAVE 29 +#define IDD_TEMPLATE_LOAD 30 +#define IDD_LOGIN 31 +#define IDD_INTEL 32 +#define IDD_CAMPAIGN 33 +#define IDD_CREDITS 34 +#define IDD_INTEL_GETREADY 37 +#define IDD_ARCADE_GROUP 40 +#define IDD_ARCADE_SENSOR 41 +#define IDD_NEW_USER 42 +#define IDD_CAMPAIGN_LOAD 43 +#define IDD_ARCADE_EFFECTS 44 +#define IDD_ARCADE_MARKER 45 +#define IDD_MISSION 46 +#define IDD_INTRO 47 +#define IDD_OUTRO 48 +#define IDD_INTERRUPT 49 +#define IDD_DEBRIEFING 50 +#define IDD_SELECT_ISLAND 51 +#define IDD_SERVER_GET_READY 52 +#define IDD_CLIENT_GET_READY 53 +#define IDD_INSERT_MARKER 54 +#define IDD_VOICE_CHAT 55 +#define IDD_DEBUG 56 +#define IDD_HINTC 57 +#define IDD_MISSION_END 58 +#define IDD_SERVER_SIDE 59 +#define IDD_CLIENT_SIDE 60 +#define IDD_MULTIPLAYER_ROLE 61 +#define IDD_AWARD 62 +#define IDD_CHANNEL 63 +#define IDD_PASSWORD 64 +#define IDD_MP_PLAYERS 65 +#define IDD_REVERT 66 +#define IDD_PORT 69 +#define IDD_MP_SETUP 70 +#define IDD_FILTER 71 +#define IDD_HINTC_EX 72 +#define IDD_SELECT_PROFILE 73 +#define IDD_CAMPAIGN_SELECT 74 +#define IDD_PROFILE 75 +#define IDD_PROFILE_NAME 76 +#define IDD_PROFILE_FACE 77 +#define IDD_PROFILE_VOICE 78 +#define IDD_PROFILE_CONTROLLER 79 +#define IDD_PROFILE_AUDIO 80 +#define IDD_PROFILE_VIDEO 81 +#define IDD_PROFILE_LIVE 82 +#define IDD_MP_TYPE 83 +#define IDD_MP_PASSCODE 84 +#define IDD_OPTIMATCH_FILTER 86 +#define IDD_QUICKMATCH 87 +#define IDD_FRIENDS 88 +#define IDD_FRIENDS_OPTIONS 89 +#define IDD_XWIZARD_TEMPLATE 90 +#define IDD_XWIZARD_INTEL 91 +#define IDD_XWIZARD_NAME 92 +#define IDD_XWIZARD_ISLAND 93 +#define IDD_XWIZARD_WEATHER 94 +#define IDD_XWIZARD_TIME 95 +#define IDD_XWIZARD_UNIT 96 +#define IDD_XWIZARD_MAP 97 +#define IDD_XWIZARD_UNIT_SELECT 98 +#define IDD_XWIZARD_UNIT_SELECT_CUSTOM 99 +#define IDD_XWIZARD_WAYPOINT 100 +#define IDD_DOWNLOAD_CONTENT 101 +#define IDD_DOWNLOAD_CONTENT_DETAILS 102 +#define IDD_XPLAYERS 103 +#define IDD_XPLAYERS_ACTIONS 104 +#define IDD_XPLAYERS_FEEDBACK 105 +#define IDD_GEAR 106 +#define IDD_EQUIP 555 +#define IDD_DOWNLOAD_CONTENT_INSTALL 108 +#define IDD_SERVER_SETTINGS 109 +#define IDD_SERVER_ADVANCED 110 +#define IDD_SERVER_SELECT_PLAYER 112 +#define IDD_DEDICATED_SERVER 114 +#define IDD_FRIEND_MISSIONS 115 +#define IDD_LIVE_STATS 116 +#define IDD_LIVE_STATS_BOARD 117 +#define IDD_NETWORK_CONDITIONS 118 +#define IDD_SEND_VOICE_MAIL 119 +#define IDD_RECEIVE_VOICE_MAIL 120 +#define IDD_SELECT_ISLAND_NEW 351 + +#define IDD_EDIT_OBJECT 121 +#define IDD_MISSION_LOAD 122 +#define IDD_MISSION_SAVE 123 + +#define IDD_EDIT_DIARY_RECORD 125 + +#define IDD_SERVER_VOTED 126 +#define IDD_DEDICATED_SERVER_SETTINGS 127 + +#define IDD_MISSION_EDITOR 128 + +#define IDD_DIARY 129 + +#define IDD_TEAM_SWITCH 130 + +#define IDD_CONFIGURE_ACTION 131 + +#define IDD_HOST_SETTINGS 132 + +#define IDD_MINIMAP 133 +#define IDD_OVERLAY_CREATE 134 +#define IDD_OVERLAY_LOAD 135 + +#define IDD_ESRB 136 + +#define IDD_MISSION_EDITOR_REALTIME 137 + +//TODO: Has to be checked by Pete! +#define IDD_EDIT_BRIEFING 138 +#define IDD_LIVE 139 + +#define IDD_LASE 141 + +#define IDD_LAYER_LOAD 142 + +#define IDD_CONTROLS 143 +#define IDD_INTERRUPT_REVERT 144 + +#define IDD_PERFORMANCE 145 +#define IDD_XWIZARD_PARAMS 146 +#define IDD_XWIZARD_PARAMETER 147 + +#define IDD_CONFIGURE_JOYSTICKS 148 +#define IDD_CAPTURE 149 +#define IDD_CUSTOMIZE_CONTROLLER 150 +#define IDD_GAMEOPTIONS 151 + +//new editor dialog +#define IDD_ARCADE_MODULES 153 +#define IDD_SELECT_SAVE 154 +#define IDD_DSINTERFACE 155 +#define IDD_ADDON_ACTIONS 156 + +// PhysX debug window +#define IDD_PHYSX_DEBUG 157 + +// mod launcher dialog +#define IDD_MOD_LAUNCHER 157 +#define IDD_NEW_MOD 158 + +// joystick schemes mapping dialog +#define IDD_JOYSTICK_SCHEMES 159 + +//AV Terminal dialog - MUF +#define IDD_AV_TERMINAL 160 +//Field Manual +#define IDD_FIELD_MANUAL 162 +//Dialogue for controls scheme selection +#define IDD_CONTROLS_SCHEME 163 +//Dialogue for choosing layout of mission editor. NOTE: 161-163 are already in use, see A3\Ui_f\hpp\defineResincl.inc +#define IDD_EDITOR_LAYOUT 164 +//Dialogue for publishing mission on Steam. +#define IDD_PUBLISH_MISSION 165 +//Dialogue for selecting tags for mission on Steam. +#define IDD_PUBLISH_MISSION_TAGS 166 +//Dialogue for selecting file from the hard drive +#define IDD_FILE_SELECT_DIALOG 167 +//Idd reserved for debriefing 168 +#define IDD_DLC_VEHICLEMSGBOX 169 +#define IDD_DLC_PURCHASENOTIFICATION 170 +#define IDD_BOOTCAMPMSGBOX 171 +#define IDD_COMMUNITY_GUIDE 172 +#define IDD_SLING_LOAD_ASSISTANT 173 +#define IDD_DLC_CONTENTBROWSER 174 +#define IDD_MP_SCORE_TABLE 175 +#define IDD_CAMPAIGN_MP 176 +#define IDD_MP_QUICK_PLAY 177 +#define IDD_MP_SERVER_SEARCH 178 +#define IDD_MP_SERVER_FOUND 179 +#define IDD_KEYMAPMSGBOX 180 + +// MessageBoxes +#define IDD_MSG_DELETEPLAYER 200 +#define IDD_MSG_DELETEGAME 201 +#define IDD_MSG_CLEARTEMPLATE 202 +#define IDD_MSG_EXITTEMPLATE 203 +#define IDD_MSG_LAUNCHGAME 204 // ADDED IN PATCH 1.04 + +#define IDD_MSG_NEWACCOUNT 205 + +#define IDD_MSG_FRIENDS_REMOVE 206 +#define IDD_MSG_FRIENDS_BLOCK 207 +#define IDD_MSG_FRIENDS_INVITE 208 + +#define IDD_MSG_DELETEMISSION 209 + +#define IDD_MSG_XONLINE_CONNECTION_FAILED 210 +#define IDD_MSG_XONLINE_UPDATE_REQUIRED 211 +#define IDD_MSG_XONLINE_SERVER_BUSY 212 +#define IDD_MSG_XONLINE_REQUIRED_MSG 213 +#define IDD_MSG_XONLINE_RECOMMENDED_MSG 214 +#define IDD_MSG_XONLINE_INVALID_USER 215 +#define IDD_MSG_XONLINE_WRONG_PASSCODE 216 + +#define IDD_MSG_CANCEL_SUBSCRIPTION 217 +#define IDD_MSG_SUBSCRIBE 218 +#define IDD_MSG_PURCHASE 219 +#define IDD_MSG_INSTALL_ABORT 220 +#define IDD_MSG_INSTALL_RESULT 221 + +#define IDD_MSG_DECLINE_INVITATION 222 +#define IDD_MSG_REVOKE_INVITATION 223 +#define IDD_MSG_BLOCK_REQUEST 224 +#define IDD_MSG_DECLINE_REQUEST 225 +#define IDD_MSG_CANCEL_REQUEST 226 +#define IDD_MSG_KICK_OFF 227 +#define IDD_MSG_TERMINATE_SESSION 228 +#define IDD_MSG_NETWORK_CONDITIONS 229 + +#define IDD_MSG_STATS_NOT_UPLOADED 230 + +#define IDD_MSG_LOAD_FAILED 231 +#define IDD_MSG_DELETESAVE 232 + +#define IDD_MSG_DISK_FULL 233 + +#define IDD_MSG_RESTART_MISSION 234 +#define IDD_MSG_SAVE_MISSION 235 +#define IDD_MSG_SIGN_OUT 236 +#define IDD_MSG_LOAD_MISSION 237 +#define IDD_MSG_NEGATIVE_FEEDBACK 238 +#define IDD_MSG_PENDING_INVITATION 239 +#define IDD_MSG_HOST_SESSION 240 +#define IDD_MSG_ROLES_LOST 241 +#define IDD_MSG_ACCEPT_INVITATION 242 +#define IDD_MSG_MP_PLAYER_COUNT 243 +#define IDD_MSG_GAME_JOIN 244 +#define IDD_MSG_EDITOR_WIZARD_NONAME_MISSION 245 + +#define IDD_MSG_RESTART_NEEDED 246 + +// new editor +#define IDD_MSG_COMMIT_OVERLAY 247 +#define IDD_MSG_CLEAR_OVERLAY 248 +#define IDD_MSG_LOAD_OVERLAY 249 +#define IDD_MSG_EXIT_OVERLAY 250 +#define IDD_MSG_CREATE_OVERLAY 251 +#define IDD_MSG_CLOSE_OVERLAY 252 +#define IDD_MSG_LOAD_AAR 253 +#define IDD_MSG_CLEAR_MISSION 254 +#define IDD_MSG_RETRY_MISSION 255 +#define IDD_MSG_DELETE_DIARY_RECORD 256 + +// XBOX 360 profile and save messages +#define IDD_MSG_XBOX_NO_SIGN_IN 257 +#define IDD_MSG_XBOX_NO_STORAGE 258 +#define IDD_MSG_XBOX_STORAGE_CHANGED 259 +#define IDD_MSG_XBOX_SAVE_FAILED 260 +#define IDD_MSG_XBOX_NO_STORAGE_ON_INVITE 261 + +#define IDD_OPTIONS_AUDIO_ADJUST_MIC 262 + +//MUF-MessageBox for restarting mission editor during layout change +#define IDD_MSG_RESTART_EDITOR 263 + +#define IDD_PROGRESS_MESSAGE 264 + +//Message box for confirming deleting published mission +#define IDD_MSG_DELETE_STEAM_MISSION 265 +//Message box for confirming updating published mission +#define IDD_MSG_UPDATE_STEAM_MISSION 266 +//Message box for confirming saving current mission before the publish dialog is opened +#define IDD_MSG_SAVE_MISSION_BEFORE_PUBLISH 267 +//Message box for asking user to agree with Battleye licence. +#define IDD_MSG_BATTLEYE_LICENCE 268 +#define IDD_MSG_UPNP_ACTIVATION 269 +//#define IDD_MSG_ACCOUNT_LOGIN_GUIDE 270 - Reserved + +// InGameUI +#define IDD_UNITINFO 300 +#define IDD_HINT 301 +#define IDD_TASKHINT 302 +#define IDD_STANCEINFO 303 +#define IDD_AVCAMERA 304 +#define IDD_STAMINA_BAR 305 + +//Custom Info +#define IDD_CUSTOMINFO 310 +#define IDD_CUSTOMINFO_MINIMAP 311 +#define IDD_CUSTOMINFO_SLA 312 +#define IDD_CUSTOMINFO_CREW 313 +#define IDD_CUSTOMINFO_SENS 314 +#define IDD_CUSTOMINFO_FEEDUAV 315 +#define IDD_CUSTOMINFO_FEEDDRIVER 316 +#define IDD_CUSTOMINFO_FEEDPRIMARYGUNNER 317 +#define IDD_CUSTOMINFO_FEEDCOMMANDER 318 +#define IDD_CUSTOMINFO_FEEDMISSILE 319 +#define IDD_CUSTOMINFO_MINEDETECT 320 + + +// Futura ui +#define IDD_FUTURAGEAR 602 +// FUTURA GEAR controls +#define IDC_FG_PRIMARY 610 +#define IDC_FG_SECONDARY 611 +#define IDC_FG_HANDGUN 612 + +// prefix 620 means slot items +//--- +#define IDC_FG_MAP 6211 +#define IDC_FG_COMPASS 6212 +#define IDC_FG_WATCH 6213 +#define IDC_FG_RADIO 6214 +#define IDC_FG_GPS 6215 + +#define IDC_FG_GOGGLES 6216 +#define IDC_FG_HMD 6217 +#define IDC_FG_BINOC 6238 + +#define IDC_FG_BACKPACK2 6239 +#define IDC_FG_HEADGEAR 6240 + +// prefix 630 means slot container items(uniform, vest, backpack) +#define IDC_FG_UNIFORM_SLOT 6301 +#define IDC_FG_VEST_SLOT 6302 +#define IDC_FG_BACKPACK_SLOT 6303 +/// containers load +#define IDC_FG_UNIFORM_LOAD 6304 +#define IDC_FG_VEST_LOAD 6305 +#define IDC_FG_BACKPACK_LOAD 6306 +#define IDC_FG_GROUND_LOAD 6307 +#define IDC_FG_TOTAL_LOAD 6308 +//--- +#define IDC_FG_MAGAZINES 618 +// primary +#define IDC_FG_PW_MUZZLE 620 +#define IDC_FG_PW_OPTICS 621 +#define IDC_FG_PW_FLASHLIGHT 622 +#define IDC_FG_PW_MAGAZINE 623 +// secondary +#define IDC_FG_SW_MUZZLE 624 +#define IDC_FG_SW_OPTICS 625 +#define IDC_FG_SW_FLASHLIGHT 626 +#define IDC_FG_SW_MAGAZINE 627 +// handgun +#define IDC_FG_HG_MUZZLE 628 +#define IDC_FG_HG_OPTICS 629 +#define IDC_FG_HG_FLASHLIGHT 630 +#define IDC_FG_HG_MAGAZINE 631 + +#define IDC_FG_GROUND_ITEMS 632 +#define IDC_FG_CHOSEN_CONTAINER 640 +#define IDC_FG_PW_UNDERBARREL 641 +#define IDC_FG_SW_UNDERBARREL 642 +#define IDC_FG_HG_UNDERBARREL 643 +#define IDC_FG_PW_MAGAZINE_GL 644 +// #define IDC_FG_BACKPACK_ITEMS 633 +// #define IDC_FG_ITEMS 619 + +// new inventory + +// filter +#define IDC_FG_GROUND_FILTER 6554 + +// images which will painted over containers during DnD state +#define IDC_FG_GROUND_MARKER 6385 +#define IDC_FG_CONTAINER_MARKER 6325 +#define IDC_FG_CHOSEN_MARKER 6405 + +#define IDC_FG_VEST_CONTAINER 638 +#define IDC_FG_UNIFORM_CONTAINER 633 +#define IDC_FG_BACKPACK_CONTAINER 619 + +#define IDC_FG_VEST_TAB 6381 +#define IDC_FG_VEST_TEXT 6382 +#define IDC_FG_UNIFORM_TAB 6331 +#define IDC_FG_UNIFORM_TEXT 6332 +#define IDC_FG_BACKPACK_TAB 6191 +#define IDC_FG_BACKPACK_TEXT 6192 + +#define IDC_FG_CHOSEN_TAB 6401 +#define IDC_FG_CHOSEN_TEXT 6402 +#define IDC_FG_GROUND_TAB 6321 +#define IDC_FG_GROUND_TEXT 6322 +#define IDC_DLC_TEMPLATE_LOGO 100 +#define IDC_DLC_TEMPLATE_BACKGROUND 101 +/////////////// + +/// weight info +#define IDC_FG_GROUND_WEIGHT 634 +#define IDC_FG_BACKPACK_WEIGHT 635 +#define IDC_FG_ITEMS_WEIGHT 636 + +/// player info +#define IDC_FG_TOTAL_WEIGHT 637 +////// + +// Arcade Sites +#define IDD_ARCADE_SITE 700 + +#define IDC_AS_AZIMUT 701 +#define IDC_AS_AZIMUT_PICTURE 702 + +// ---- combos +#define IDC_AS_SIDE 703 +#define IDC_AS_FACTION 704 +#define IDC_AS_CLASS 705 +#define IDC_AS_SITETYPE 706 +#define IDC_AS_REPAIRABLE 707 +#define IDC_AS_FASTTRAVEL 708 +#define IDC_AS_STORAGE 709 +// ---- flags +#define IDC_AS_FLGEQUIP 710 +#define IDC_AS_FLGFOOD 711 +#define IDC_AS_FLGARMORED 712 +#define IDC_AS_FLGFUEL 713 +#define IDC_AS_FLGWEAPON 714 +// ---- strings +#define IDC_AS_NAME 715 +#define IDC_AS_DESC 716 +#define IDC_AS_INIT 717 +#define IDC_AS_CONDITION 718 +#define IDC_AS_RADIUS 719 +// ---- sliders +#define IDC_AS_HEALTH 720 +#define IDC_AS_MOOD 721 +#define IDC_AS_PRESENCE 722 + +#define IDC_AS_ARGUMENTS 733 +//////////////////////////////////////// + +// Virtual keyboard +#define IDC_VK_SHIFT 1001 +#define IDC_VK_CAPSLOCK 1002 +#define IDC_VK_SYMBOLS 1003 +#define IDC_VK_ACCENTS 1004 +#define IDC_VK_BACKSPACE 1005 +#define IDC_VK_LEFT 1006 +#define IDC_VK_RIGHT 1007 +#define IDC_VK_BASE 1010 + +// Main display controls +#define IDC_MAIN_GAME 101 +#define IDC_MAIN_OPTIONS 102 +#define IDC_MAIN_TRAINING 103 +#define IDC_MAIN_CUSTOM 104 +#define IDC_MAIN_MULTIPLAYER 105 +#define IDC_MAIN_QUIT 106 +#define IDC_MAIN_CREDITS 107 +#define IDC_MAIN_ARCADE 108 +#define IDC_MAIN_PLAYER 109 +#define IDC_MAIN_RANK 110 +#define IDC_MAIN_ISLAND 111 +#define IDC_MAIN_DATE 112 +#define IDC_MAIN_MISSION 113 +#define IDC_MAIN_CONTINUE 114 +#define IDC_MAIN_EDITOR 115 +#define IDC_MAIN_BOOK 116 +#define IDC_MAIN_SINGLE 117 +#define IDC_MAIN_VERSION 118 +#define IDC_MAIN_SINGLE_PROFILES 119 +#define IDC_MAIN_CAMPAIGN_PROFILES 120 +#define IDC_MAIN_MP_PROFILES 121 +#define IDC_MAIN_SETTINGS_PROFILES 122 +#define IDC_MAIN_SYSTEM_LINK 123 +#define IDC_MAIN_CUSTOM_PROFILES 124 +#define IDC_MAIN_SIGN_IN_STATUS 125 +#define IDC_MAIN_PLAYER_LABEL 126 +#define IDC_MAIN_PLAYER_NAME 127 +#define IDC_MAIN_CONTROLS 128 +#define IDC_MAIN_PLAYER_ID 129 +#define IDC_MAIN_PLAYER_COLOR 130 +#define IDC_MAIN_SERVICE_ID_LABEL 131 +#define IDC_MAIN_NICKNAME_LABEL 132 +#define IDC_MAIN_NICKNAME_BG 133 +#define IDC_MAIN_LOAD 134 +#define IDC_MAIN_SAVE 135 +#define IDC_MAIN_AAR 136 +#define IDC_MAIN_ACHIEVEMENTS 137 +#define IDC_MAIN_SINGLEPLAYER 138 +#define IDC_MAIN_MOD_LIST 139 +#define IDC_MAIN_MOD_LAUNCHER 140 +#define IDC_MAIN_MOD_ICONS 141 +#define IDC_SP_EDITOR 142 +#define IDC_MAIN_FIELD_MANUAL 143 +#define IDC_MAIN_DLC_ICONS 144 +#define IDC_MAIN_DLC_OWNED_ICONS 145 +#define IDC_MAIN_DLC_ICONS_BACK 146 +#define IDC_MAIN_MOD_ICONS_BACK 147 +#define IDC_MAIN_DLC_OWNED_ICONS_BACK 148 +#define IDC_MAIN_BOOTCAMP_CAMPAIGN 149 +#define IDC_MAIN_BOOTCAMP_SHOWCASES 150 +#define IDC_MAIN_BOOTCAMP_CHALLENGES 151 +#define IDC_MAIN_BOOTCAMP_VRTRAINING 152 +#define IDC_MAIN_QUICKPLAY 154 +#define IDC_MAIN_UNIT 155 + +#define IDC_MAIN_CARDAS_CUDL 199 // muj vlastni cudl + +#define IDC_MAIN_VIDEOCONTROL 3335 + +#define IDC_MAIN_TAB_LOGIN 9001 +#define IDC_MAIN_TAB_LIBRARY 9002 +#define IDC_MAIN_TAB_SINGLE 9003 +#define IDC_MAIN_TAB_MULTIPLAYER 9004 +#define IDC_MAIN_TAB_OPTIONS 9005 +#define IDC_MAIN_TAB_CONTROLS 9006 +#define IDC_MAIN_TAB_EDITOR 9007 +#define IDC_MAIN_TAB_QUIT 9008 +#define IDC_MAIN_TAB_AAR 9011 + +#define IDC_BUILD_VERSION 9009 +#define IDC_BUILD_DATE 9010 + +// Single player display controls +#define IDC_SP_TRAINING 101 +//#define IDC_SP_EDITOR 102 +#define IDC_SP_MISSION 103 +#define IDC_SP_CAMPAIGN 104 + +// Select profile display controls +#define IDC_PROFILES_LIST 101 +#define IDC_PROFILES_HEAD 102 +#define IDC_PROFILES_TITLE 103 +#define IDC_PROFILES_CONTROLLER 104 +#define IDC_PROFILES_DIFFICULTY 105 +#define IDC_PROFILES_MISSION 106 +#define IDC_PROFILES_LIVE 107 +#define IDC_PROFILES_MISSION_TEXT 108 +#define IDC_PROFILES_SIGN_IN_STATUS 109 +#define IDC_PROFILES_EDIT 110 +#define IDC_PROFILES_DELETE 111 + +// Edit profile display controls +#define IDC_PROFILE_NAME 101 +#define IDC_PROFILE_FACE 102 +#define IDC_PROFILE_VOICE 103 +#define IDC_PROFILE_CONTROLLER 104 +#define IDC_PROFILE_AUDIO 105 +#define IDC_PROFILE_VIDEO 106 +#define IDC_PROFILE_HEAD 108 +#define IDC_PROFILE_SUM_NAME 109 +#define IDC_PROFILE_SUM_CONTROLLER 110 +#define IDC_PROFILE_SUM_LIVE 111 +#define IDC_PROFILE_VOICE_MASK 112 +#define IDC_PROFILE_SIGN_IN_STATUS 113 +#define IDC_PROFILE_CREDITS 114 +#define IDC_PROFILE_STORAGE_DEVICE 115 + +// Edit profile name display controls +#define IDC_PROFILE_NAME_PREVIEW 101 + +// Edit profile face +#define IDC_PROF_FACE_FACE 101 +#define IDC_PROF_FACE_GLASSES 102 +#define IDC_PROF_FACE_HEAD 103 + +// Edit profile voice +#define IDC_PROF_VOICE_SPEAKER 101 +#define IDC_PROF_VOICE_PITCH_TITLE 102 +#define IDC_PROF_VOICE_PITCH_VALUE 103 +#define IDC_PROF_VOICE_PITCH 104 +#define IDC_PROF_VOICE_MASK 105 +#define IDC_PROF_VOICE_THROUGH_SPEAKERS 106 +#define IDC_PROF_VOICE_HEAD 107 +#define IDC_PROF_VOICE_DEFAULT 108 + +// Edit profile controller +#define IDC_PROF_CONTR_VEHICLE 101 +#define IDC_PROF_CONTR_TYPE 102 +#define IDC_PROF_CONTR_IMAGE 103 +#define IDC_PROF_CONTR_SCHEME 104 +#define IDC_PROF_CONTR_SENSITIVITY 105 +#define IDC_PROF_CONTR_A 200 +#define IDC_PROF_CONTR_B 201 +#define IDC_PROF_CONTR_Y 202 +#define IDC_PROF_CONTR_X 203 +#define IDC_PROF_CONTR_WHITE 204 +#define IDC_PROF_CONTR_BLACK 205 +#define IDC_PROF_CONTR_LEFT 206 +#define IDC_PROF_CONTR_RIGHT 207 +#define IDC_PROF_CONTR_UP 208 +#define IDC_PROF_CONTR_DOWN 209 +#define IDC_PROF_CONTR_BACK 210 +#define IDC_PROF_CONTR_START 211 +#define IDC_PROF_CONTR_LEFT_THUMB 212 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_X 213 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_Y 214 +#define IDC_PROF_CONTR_RIGHT_THUMB 215 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_X 216 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_Y 217 +#define IDC_PROF_CONTR_LEFT_TRIGGER 218 +#define IDC_PROF_CONTR_RIGHT_TRIGGER 219 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE 220 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE 221 +#define IDC_PROF_CONTR_DPAD 222 +#define IDC_PROF_CONTR_NEXT_SCHEME 223 +#define IDC_PROF_CONTR_PREV_SCHEME 224 +#define IDC_PROF_CONTR_Y_AXIS 225 +#define IDC_PROF_CONTR_VIBRATIONS 226 + +// Controller buttons +// #define IDC_CONTROLLER_BUTTONS 101 + +// Edit profile audio options +#define IDC_PROF_AUDIO_MUSIC_TITLE 101 +#define IDC_PROF_AUDIO_MUSIC_VALUE 102 +#define IDC_PROF_AUDIO_MUSIC 103 +#define IDC_PROF_AUDIO_RADIO_TITLE 104 +#define IDC_PROF_AUDIO_RADIO_VALUE 105 +#define IDC_PROF_AUDIO_RADIO 106 +#define IDC_PROF_AUDIO_EFFECT_TITLE 107 +#define IDC_PROF_AUDIO_EFFECT_VALUE 108 +#define IDC_PROF_AUDIO_EFFECT 109 +#define IDC_PROF_AUDIO_DEFAULT 110 + +// Edit profile video options +#define IDC_PROF_VIDEO_BRIGHT 101 +#define IDC_PROF_VIDEO_BRIGHT_TITLE 102 +#define IDC_PROF_VIDEO_BRIGHT_VALUE 103 +#define IDC_PROF_VIDEO_GAMMA 104 +#define IDC_PROF_VIDEO_GAMMA_TITLE 105 +#define IDC_PROF_VIDEO_GAMMA_VALUE 106 +#define IDC_PROF_VIDEO_SUBTITLES 107 +#define IDC_PROF_VIDEO_RADIO 108 +#define IDC_PROF_VIDEO_DEFAULT 109 + +// Select profile an Xbox live account display controls +#define IDC_PROFILE_LIVE_ACCOUNTS 101 +#define IDC_PROFILE_LIVE_CREATE 102 + +// Select difficulty dialog +#define IDC_DIFF_LIST 108 +#define IDC_DIFF_DESC 102 + +// Single mission display controls +#define IDC_SINGLE_MISSION 101 +#define IDC_SINGLE_OVERVIEW 102 +#define IDC_SINGLE_MISSION_PAD 103 +#define IDC_SINGLE_DIFF 104 +#define IDC_SINGLE_LOAD 105 +#define IDC_SINGLE_TITLE 106 +#define IDC_SINGLE_DELETE 107 +#define IDC_SINGLE_COPY 108 +#define IDC_SINGLE_EDIT 109 +#define IDC_SINGLE_NAME 110 +#define IDC_SINGLE_AUTHOR 111 +#define IDC_SINGLE_PICTURE 112 +#define IDC_SINGLE_DESCRIPTION 113 +#define IDC_SINGLE_LOADING_PICTURE 114 +#define IDC_SINGLE_SHOW_MISSION_WORKSHOP 115 +#define IDC_SINGLE_SHOW_GAME_WORKSHOP 116 +#define IDC_SINGLE_SHOW_GAME_OR_MISSION_WORKSHOP 117 +#define IDC_SINGLE_MISSION_SORT_COMBO 118 +#define IDC_SINGLE_MISSION_SORT_ORDER 119 +#define IDC_SINGLE_MISSION_BUY_DLC 120 +#define IDC_SINGLE_MISSION_DLCSTRIPE 121 +#define IDC_SINGLE_MISSION_DLCICON 122 + +// Xbox style mission wizard +#define IDC_XWIZ_TEMPLATE 101 +#define IDC_XWIZ_TEMPLATE_OVERVIEW 102 + +#define IDC_XWIZ_NAME 101 +#define IDC_XWIZ_ISLAND 102 +#define IDC_XWIZ_WEATHER 103 +#define IDC_XWIZ_TIME 104 +#define IDC_XWIZ_SUM_NAME 105 +#define IDC_XWIZ_SUM_TIME 106 +#define IDC_XWIZ_SUM_TEMPLATE 107 +#define IDC_XWIZ_SUM_ISLAND 108 +#define IDC_XWIZ_SUM_WEATHER 109 +#define IDC_XWIZ_SUM_WEATHER_FORECAST 110 +#define IDC_XWIZ_UNIT 111 +#define IDC_XWIZ_MAP 112 +#define IDC_XWIZ_SUM_DATE 113 +#define IDC_XWIZ_PARAM 114 +#define IDC_XWIZ_SAVE 115 + +#define IDC_XWIZ_UNITS 101 +#define IDC_XWIZ_UNITS_OVERVIEW 102 + +#define IDC_XWIZ_PARAMS 101 +#define IDC_XWIZ_PARAMS_TITLES 102 +#define IDC_XWIZ_PARAMS_VALUES 103 +#define IDC_EDIT 104 +#define IDD_XWIZARD_PARAMETER_TITLE 105 + +#define IDC_XWIZ_UNIT_SELECT 101 +#define IDC_XWIZ_UNIT_SELECT_TITLE 102 + +#define IDC_XWIZ_UNIT_CLASS 101 +#define IDC_XWIZ_UNIT_TYPE 102 +#define IDC_XWIZ_UNIT_COUNT 103 +#define IDC_XWIZ_UNIT_SIDE 104 +#define IDC_XWIZ_UNIT_SELECT_CUSTOM_TITLE 105 + +#define IDC_XWIZ_WP_TYPE 101 +#define IDC_XWIZ_WP_BEHAVIOUR 102 +#define IDC_XWIZ_WP_FORMATION 103 +#define IDC_XWIZ_WP_COMBAT_MODE 104 + +#define IDC_XWIZ_ISLAND_LIST 101 +#define IDC_XWIZ_ISLAND_MAP 102 +#define IDC_XWIZ_ISLAND_SHOTS 103 + +#define IDC_XWIZ_WEATHER_TITLE 101 +#define IDC_XWIZ_WEATHER_VALUE 102 +#define IDC_XWIZ_WEATHER_FORECAST_TITLE 103 +#define IDC_XWIZ_WEATHER_FORECAST_VALUE 104 +#define IDC_XWIZ_FOG_TITLE 105 +#define IDC_XWIZ_FOG_VALUE 106 +#define IDC_XWIZ_FOG_FORECAST_TITLE 107 +#define IDC_XWIZ_FOG_FORECAST_VALUE 108 +#define IDC_XWIZ_VIEW_DISTANCE_TITLE 109 +#define IDC_XWIZ_VIEW_DISTANCE_VALUE 110 + +#define IDC_XWIZ_TIME_HOUR 101 +#define IDC_XWIZ_TIME_MINUTE 102 +#define IDC_XWIZ_TIME_DAY 103 +#define IDC_XWIZ_TIME_MONTH 104 +#define IDC_XWIZ_TIME_YEAR 105 + +#define IDC_XWIZ_MAP_POINTS 101 +#define IDC_XWIZ_MAP_DELETE 102 +#define IDC_XWIZ_MAP_EDIT 103 +#define IDC_XWIZ_MAP_INSERT_WP 104 +#define IDC_XWIZ_MAP_NOTEPAD 105 +#define IDC_XWIZ_MAP_MOVE 106 + +// Select campaign display +#define IDC_CAMPAIGNS_LIST 101 +#define IDC_CAMPAIGNS_CAMPAIGN 102 +#define IDC_CAMPAIGNS_DESCRIPTION 103 + +// Campaign display +#define IDC_CAMPAIGN_HISTORY 101 +#define IDC_CAMPAIGN_REPLAY 102 +#define IDC_CAMPAIGN_DIFF 103 +#define IDC_CAMPAIGN_NAME 104 +#define IDC_CAMPAIGN_AUTHOR 105 +#define IDC_CAMPAIGN_PICTURE 106 +#define IDC_CAMPAIGN_DESCRIPTION 107 +#define IDC_CAMPAIGN_TEXT_ESTDEPLOY 108 +#define IDC_CAMPAIGN_RELEASEDATE 109 +#define IDC_CAMPAIGN_BUY_DLC 110 +#define IDC_CAMPAIGN_DLCSTRIPE 111 +#define IDC_CAMPAIGN_DLCICON 112 + +// MP campaign display +#define IDC_CAMPAIGN_MP_LIST 101 +#define IDC_CAMPAIGN_MP_TITLE 102 +#define IDC_CAMPAIGN_MP_NAME 103 +#define IDC_CAMPAIGN_MP_AUTHOR 104 +#define IDC_CAMPAIGN_MP_PICTURE 105 +#define IDC_CAMPAIGN_MP_DESCRIPTION 106 +#define IDC_CAMPAIGN_MP_PLAY 107 +#define IDC_CAMPAIGN_MP_HOST 108 +#define IDC_CAMPAIGN_MP_JOIN 109 +#define IDC_CAMPAIGN_MP_BUY_DLC 110 + +// Revert display +#define IDC_REVERT_BOOK 101 +#define IDC_REVERT_TITLE 102 +#define IDC_REVERT_QUESTION 103 + +// Game display controls +#define IDC_GAME_SELECT 301 +#define IDC_SIDE_NAME 101 + +// Options display controls +#define IDC_OPTIONS_VIDEO 301 +#define IDC_OPTIONS_AUDIO 302 +#define IDC_OPTIONS_CONFIGURE 303 +#define IDC_OPTIONS_DIFFICULTY 304 +#define IDC_OPTIONS_NOTEBOOK 305 +#define IDC_OPTIONS_CREDITS 306 +#define IDC_OPTIONS_GAMEOPTIONS 307 + +#define IDC_OPTIONS_OBJECT_VISIBILITY_VALUE 308 +#define IDC_OPTIONS_OBJECT_VISIBILITY_SLIDER 309 +#define IDC_OPTIONS_VISIBILITY_TEXT 310 +#define IDC_OPTIONS_SHADOW_VISIBILITY_VALUE 311 +#define IDC_OPTIONS_SHADOW_VISIBILITY_SLIDER 312 +#define IDC_OPTIONS_SHADOW_VISIBILIT_TEXT 313 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_VALUE 314 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_SLIDER 315 + +#define IDC_OPTIONS_PIP_VALUE 334 +#define IDC_OPTIONS_SW_VALUE 335 +#define IDC_OPTIONS_FXAA_VALUE 336 +#define IDC_OPTIONS_WATER_SS_REFLECTIONS_VALUE 337 + +#define IDC_OPTIONS_QUALITY_VALUE 101 +#define IDC_OPTIONS_QUALITY_SLIDER 102 +#define IDC_OPTIONS_VISIBILITY_VALUE 103 +#define IDC_OPTIONS_VISIBILITY_SLIDER 104 + +#define IDC_OPTIONS_DRAWDISTANCE_VALUE 1336 +#define IDC_OPTIONS_DRAWDISTANCE_SLIDER 1337 + +#define IDC_OPTIONS_RATE_VALUE 105 +#define IDC_OPTIONS_RATE_SLIDER 106 +#define IDC_OPTIONS_TEXTURES_VALUE 107 +#define IDC_OPTIONS_TEXTURES_SLIDER 108 +#define IDC_OPTIONS_GAMMA_VALUE 109 +#define IDC_OPTIONS_GAMMA_SLIDER 110 +#define IDC_OPTIONS_BRIGHT_VALUE 111 +#define IDC_OPTIONS_BRIGHT_SLIDER 112 +#define IDC_OPTIONS_RESOLUTION 113 +#define IDC_OPTIONS_DISPLAY_MODE 1131 +#define IDC_OPTIONS_REFRESH 114 +#define IDC_OPTIONS_OBJSHADOWS 115 +//#define IDC_OPTIONS_VEHSHADOWS 116 +//#define IDC_OPTIONS_CLOUDLETS 117 +//#define IDC_OPTIONS_HWTL 118 +#define IDC_OPTIONS_BLOOD 119 +//#define IDC_OPTIONS_MULTITEXTURING 120 +#define IDC_OPTIONS_WBUFFER 121 +#define IDC_OPTIONS_BLOOD_TEXT 122 +#define IDC_OPTIONS_TERRAIN 123 +#define IDC_OPTIONS_LIFESTATE 199 +#define IDC_OPTIONS_TUTORIAL_HINTS 140 + +#define IDC_OBJECTS_DETAIL 124 +#define IDC_TEXTURE_DETAIL 125 +#define IDC_QUALITY_PREFERENCE 126 +#define IDC_SHADING_DETAIL 127 +#define IDC_SHADOW_DETAIL 128 + +#define IDC_OPTIONS_VIDEO_DEFAULT 129 +#define IDC_OPTIONS_VIDEO_AUTODETECT 1291 + +#define IDC_ANISO_DETAIL 130 +#define IDC_HDR_DETAIL 131 +#define IDC_POSTPROCESS_EFFECTS 132 +#define IDC_FSAA_DETAIL 133 +#define IDC_ASPECT_RATIO 134 +#define IDC_ATOC_DETAIL 1300 +#define IDC_PPAA_DETAIL 1301 + +#define IDC_OPTIONS_PP_SSAO 1310 +#define IDC_OPTIONS_PP_BLOOM_SLIDER 1311 +#define IDC_OPTIONS_PP_BLOOM_VALUE 1312 +#define IDC_OPTIONS_PP_ROTBLUR_SLIDER 1313 +#define IDC_OPTIONS_PP_ROTBLUR_VALUE 1314 +#define IDC_OPTIONS_PP_RADIALBLUR_SLIDER 1315 +#define IDC_OPTIONS_PP_RADIALBLUR_VALUE 1316 +#define IDC_OPTIONS_PP_DOF_SLIDER 1317 +#define IDC_OPTIONS_PP_DOF_VALUE 1318 +#define IDC_OPTIONS_PP_CAUSTICS 1319 +#define IDC_OPTIONS_PP_SHARPEN_SLIDER 1320 +#define IDC_OPTIONS_PP_SHARPEN_VALUE 1321 +#define IDC_OPTIONS_PP_COLOR_CORRECTIONS 1322 +#define IDC_OPTIONS_PP_BRIGHTNESS_SLIDER 1323 +#define IDC_OPTIONS_PP_BRIGHTNESS_VALUE 1324 +#define IDC_OPTIONS_PP_CONTRAST_SLIDER 1325 +#define IDC_OPTIONS_PP_CONTRAST_VALUE 1326 +#define IDC_OPTIONS_PP_SATURATION_SLIDER 1327 +#define IDC_OPTIONS_PP_SATURATION_VALUE 1328 + +#define IDC_OPTIONS_VIDEO_FPS_TEXT 1400 +#define IDC_OPTIONS_VIDEO_PERF_WARNING 1401 + + +#define IDC_OPTIONS_LANGUAGE 135 + +#define IDC_OPTIONS_IGUISIZE 136 +#define IDC_OPTIONS_IGUISIZE_LABEL 1014 +#define IDC_OPTIONS_IGUISIZE_TEXT 137 +#define IDC_OPTIONS_HEADBOB 138 + +#define IDC_VRAM_VALUE 139 + +#define IDC_VSYNC_VALUE 140 +#define IDC_OPTIONS_IMPERIALUNITS 141 +#define IDC_OPTIONS_VEHICLEFREELOOK 142 +#define IDC_OPTIONS_STREAM_FRIENDLY 143 +#define IDC_OPTIONS_ADAPTIVE_CROSSHAIR 144 +#define IDC_OPTIONS_INSTRUCTOR_FIGURE 145 +#define IDC_OPTIONS_ENABLE_RTD 146 +#define IDC_OPTIONS_ALLOW_FULL_RTD_HUD 147 +#define IDC_OPTIONS_ALLOW_ROUGH_LANDING_RTD 148 +#define IDC_OPTIONS_WIND_INFLUENCE_DYN_RTD 149 +#define IDC_OPTIONS_AUTO_TRIM_RTD 150 +#define IDC_OPTIONS_STRESS_DAMAGE_RTD 151 + +#define IDC_PARTICLES_EFFECTS 143 +#define IDC_OPTIONS_DYNAMIC_LIGHTS 144 + +#define IDC_OPTIONS_SLIDER_FILLRATE 1234 +#define IDC_OPTIONS_VALUE_FILLRATE 1236 + + +#define IDC_OPTIONS_MUSIC_VALUE 101 +#define IDC_OPTIONS_MUSIC_SLIDER 102 +#define IDC_OPTIONS_EFFECTS_VALUE 103 +#define IDC_OPTIONS_EFFECTS_SLIDER 104 +#define IDC_OPTIONS_VOICES_VALUE 105 +#define IDC_OPTIONS_VOICES_SLIDER 106 +#define IDC_OPTIONS_SAMPLING 107 +#define IDC_OPTIONS_HWACC 108 +#define IDC_OPTIONS_EAX 109 +#define IDC_OPTIONS_SINGLE_VOICE 110 +#define IDC_OPTIONS_AUDIO_DEFAULT 111 +#define IDC_OPTIONS_PLAYER_VOICE 112 +#define IDC_OPTIONS_VON_VALUE 113 +#define IDC_OPTIONS_VON_SLIDER 114 +#define IDC_OPTIONS_SAMPLES_VALUE 115 +#define IDC_OPTIONS_SAMPLES_SLIDER 116 +#define IDC_OPTIONS_MIC_SENS_SLIDER 117 +#define IDC_OPTIONS_MIC_ADJUST 118 + +// microphone adjustment +#define IDC_OPTIONS_MIC_PROGRESS_BAR 1001 +#define IDC_OPTIONS_MIC_PROGRESS 1002 + +#define IDC_OPTIONS_SUBTITLES 102 +#define IDC_OPTIONS_RADIO 103 + +#define IDC_DIFF_AI_LEVEL_TEXT 1510 +#define IDC_DIFF_AI_LEVEL 1511 +#define IDC_DIFF_AI_SKILL_LABEL 1512 +#define IDC_DIFF_AI_SKILL_SLIDER 1513 +#define IDC_DIFF_AI_SKILL_VALUE 1514 +#define IDC_DIFF_AI_PRECISION_LABEL 1515 +#define IDC_DIFF_AI_PRECISION_SLIDER 1516 +#define IDC_DIFF_AI_PRECISION_VALUE 1517 +#define IDC_DIFF_PICTURE 1518 +#define IDC_DIFF_DESCRIPTION 1519 +#define IDC_DIFF_OPTIONS_GROUP 1520 +#define IDC_DIFF_REDUCED_DAMAGE 1521 +#define IDC_DIFF_GROUP_INDICATORS 1522 +#define IDC_DIFF_FRIENDLY_TAG 1523 +#define IDC_DIFF_ENEMY_TAG 1524 +#define IDC_DIFF_MINES 1525 +#define IDC_DIFF_COMMANDS 1526 +#define IDC_DIFF_WAYPOINTS 1527 +#define IDC_DIFF_WEAPON_INFO 1528 +#define IDC_DIFF_STANCE_INDICATOR 1529 +#define IDC_DIFF_STAMINA_BAR 1530 +#define IDC_DIFF_CROSSHAIR 1531 +#define IDC_DIFF_VISION_AID 1532 +#define IDC_DIFF_THIRD_PERSON 1533 +#define IDC_DIFF_CAMERA_SHAKE 1534 +#define IDC_DIFF_SCORE_TABLE 1535 +#define IDC_DIFF_KILLED_BY 1536 +#define IDC_DIFF_VON_ID 1537 +#define IDC_DIFF_EXTENDED_MAP_FRIENDLY 1538 +#define IDC_DIFF_AUTO_REPORT 1539 +#define IDC_DIFF_MULTIPLE_SAVES 1540 +// #define IDC_DIFF_SQUAD_RADAR 1541 +#define IDC_DIFF_TACTICAL_PING 1542 +#define IDC_DIFF_EXTENDED_MAP_ENEMY 1543 +#define IDC_DIFF_EXTENDED_MAP_MINES 1544 +#define IDC_DIFF_MINIMAP_ALLOWED 1545 +#define IDC_DIFF_EXTENDED_MAP_PING 1546 + +// Configure display controls +#define IDC_CONFIG_DEFAULT 101 +#define IDC_CONFIG_KEYS 102 +#define IDC_CONFIG_XAXIS 103 +#define IDC_CONFIG_YAXIS 104 +#define IDC_CONFIG_YREVERSED 105 +#define IDC_CONFIG_JOYSTICK 106 +#define IDC_CONFIG_BUTTONS 107 +#define IDC_CONFIG_CONTROLS_PAGE 108 +#define IDC_CONFIG_FLOATING_ZONE 109 +#define IDC_CONFIG_MOUSE_FILTERING 110 +#define IDC_CONFIG_GEARBOX_MODE 112 +#define IDC_CONFIG_MOUSE_ACCELERATION 113 +#define IDC_CONFIG_KEY_PRESETS 114 + +// dialog for selecting default controls preset +#define IDC_CONFIG_DEFAULTCONTROLS_LIST 101 + +// Multiplayer type display controls +#define IDC_MP_TYPE_RANKED_MATCH 101 +#define IDC_MP_TYPE_PLAYER_MATCH 102 +#define IDC_MP_TYPE_SYSTEM_LINK 103 +#define IDC_MP_TYPE_FRIENDS 104 +#define IDC_MP_TYPE_DOWNLOAD 105 +#define IDC_MP_TYPE_INFO 106 +#define IDC_MP_TYPE_STATS 107 +#define IDC_MP_TYPE_SIGN_OUT 108 +#define IDC_MP_TYPE_DEDICATED_SERVER 109 +#define IDC_MP_TYPE_SERVER 110 +#define IDC_MP_TYPE_APPEAR_OFFLINE 111 + +// Xbox Live display controls +#define IDC_LIVE_QUICK_MATCH 101 +#define IDC_LIVE_CUSTOM_MATCH 102 +#define IDC_LIVE_CREATE_MATCH 103 + +// Friends dialog +#define IDC_FRIENDS_LIST 101 +#define IDC_FRIENDS_STATUS 102 + +// Friends options dialog +#define IDC_FRIENDS_PLAYER 101 +#define IDC_FRIENDS_GAME_INVITE 102 +#define IDC_FRIENDS_GAME_CANCEL 103 +#define IDC_FRIENDS_GAME_ACCEPT 104 +#define IDC_FRIENDS_GAME_DECLINE 105 +#define IDC_FRIENDS_GAME_JOIN 106 +#define IDC_FRIENDS_ACCEPT 107 +#define IDC_FRIENDS_DECLINE 108 +#define IDC_FRIENDS_STOP 109 +#define IDC_FRIENDS_CANCEL 110 +#define IDC_FRIENDS_REMOVE 111 +#define IDC_FRIENDS_VOICE 112 +#define IDC_FRIENDS_FEEDBACK 113 +#define IDC_FRIENDS_GAME_INVITE_VOICE 114 +#define IDC_FRIENDS_PLAY_MESSAGE 115 +#define IDC_FRIENDS_MISSIONS 152 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 + +// Send voice mail dialog +#define IDC_SVM_TITLE 101 +#define IDC_SVM_PLAYER 102 +#define IDC_SVM_RECORD 103 +#define IDC_SVM_PLAY 104 +#define IDC_SVM_SEND 105 +#define IDC_SVM_PROGRESS 106 +#define IDC_SVM_TIME 107 + +// Receive voice mail dialog +#define IDC_RVM_TITLE 101 +#define IDC_RVM_PLAYER 102 +#define IDC_RVM_PLAY 103 +#define IDC_RVM_FEEDBACK 104 +#define IDC_RVM_PROGRESS 105 +#define IDC_RVM_TIME 106 + +// Xbox players dialog +#define IDC_XPLAYERS_LIST 101 +#define IDC_XPLAYERS_STATUS 102 +#define IDC_XPLAYERS_DISABLE_VOICE 103 +#define IDC_XPLAYERS_ENABLE_VOICE 104 +#define IDC_XPLAYERS_KICKOFF 105 + +// Xbox players options dialog +#define IDC_XPLAYERS_PLAYER 101 +#define IDC_XPLAYERS_ASK 102 +#define IDC_XPLAYERS_MUTE 103 +#define IDC_XPLAYERS_FEEDBACK 104 +#define IDC_XPLAYERS_CANCEL 105 +#define IDC_XPLAYERS_ASK_VOICE 107 + +// Feedback dialog +#define IDC_FEEDBACK_PLAYER 101 +#define IDC_FEEDBACK_DATE 102 +#define IDC_FEEDBACK_GREAT_SESSION 103 +#define IDC_FEEDBACK_GOOD_ATTITUDE 104 +#define IDC_FEEDBACK_BAD_NAME 105 +#define IDC_FEEDBACK_CURSING 106 +#define IDC_FEEDBACK_SCREAM 107 +#define IDC_FEEDBACK_CHEAT 108 +#define IDC_FEEDBACK_THREAT 109 +#define IDC_FEEDBACK_MSG_HARASSING 110 +#define IDC_FEEDBACK_MSG_OFFENSIVE 111 +#define IDC_FEEDBACK_MSG_SPAM 112 + +// Download content display controls +#define IDC_DOWNLOAD_CONTENT_LIST 101 + +#define IDC_DOWNLOAD_CONTENT_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_TERMS 102 +#define IDC_DOWNLOAD_CONTENT_PICTURE 103 +#define IDC_DOWNLOAD_CONTENT_SHOW_PRICE 104 + +#define IDC_DOWNLOAD_CONTENT_PRICE_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_PRICE 102 +#define IDC_DOWNLOAD_CONTENT_PRICE_QUESTION 103 + +#define IDC_INSTALL_CONTENT_PROGRESS 101 +#define IDC_INSTALL_CONTENT_NAME 102 +#define IDC_INSTALL_CONTENT_TIME 103 + +// Multiplayer passcode display controls +#define IDC_MP_PASSCODE_FIRST 101 + +// Multiplayer display controls +#define IDC_MULTI_TITLE 101 +#define IDC_MULTI_SESSIONS 102 +//#define IDC_MULTI_REMOTE 103 //Renamed to IDC_MULTI_TAB_DIRECT_CONNECT +//#define IDC_MULTI_NEW 104 //Renamed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_JOIN 105 +#define IDC_MULTI_NOTEBOOK 106 +#define IDC_MULTI_PASSWORD 107 +#define IDC_MULTI_PORT 108 +#define IDC_MULTI_SERVER_ICON 111 +#define IDC_MULTI_SERVER_COLUMN 112 +#define IDC_MULTI_MISSION_ICON 113 +#define IDC_MULTI_MISSION_COLUMN 114 +#define IDC_MULTI_STATE_ICON 115 +#define IDC_MULTI_STATE_COLUMN 116 +#define IDC_MULTI_PLAYERS_ICON 117 +#define IDC_MULTI_PLAYERS_COLUMN 118 +#define IDC_MULTI_PING_ICON 119 +#define IDC_MULTI_PING_COLUMN 120 +#define IDC_MULTI_PROGRESS 121 +#define IDC_MULTI_INTERNET 122 +#define IDC_MULTI_REFRESH 123 +#define IDC_MULTI_FILTER 124 +#define IDC_MULTI_SERVER_FILTER 125 +#define IDC_MULTI_MISSION_FILTER 126 +#define IDC_MULTI_PLAYERS_FILTER 127 +#define IDC_MULTI_PING_FILTER 128 +#define IDC_MP_HOST 129 +#define IDC_MP_TYPE 130 +#define IDC_MP_MISSION 131 +#define IDC_MP_ISLAND 132 +#define IDC_MP_STATE 133 +#define IDC_MP_TIMELEFT 134 +#define IDC_MP_SLOTS_PUBLIC 135 +#define IDC_MP_SLOTS_PRIVATE 136 +#define IDC_MP_NO_SESSION 137 +#define IDC_MP_DIFFICULTY 138 +#define IDC_MP_LANGUAGE 139 +#define IDC_MULTI_GAMETYPE_ICON 140 +#define IDC_MULTI_GAMETYPE_COLUMN 141 +#define IDC_MP_PING 142 +#define IDC_MP_PASSWORD 143 +#define IDC_MP_PLATFORM 144 +#define IDC_MP_COUNTRY 145 +#define IDC_MP_VERSION 146 +#define IDC_MP_VERSION_REQUIRED 147 +#define IDC_MP_MODS 148 +#define IDC_MP_PLAYERS_ROW 149 +#define IDC_MULTI_PASSWORDED_FILTER 150 +#define IDC_MULTI_FULL_FILTER 151 +#define IDC_MULTI_TYPE_FILTER 152 +#define IDC_MP_NEXT_SESSION 153 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 +#define IDC_MULTI_FAVORITE_COLUMN 156 +#define IDC_MULTI_FAVORITE_ICON 157 +#define IDC_MULTI_SERVER_COUNT 158 +#define IDC_MULTI_TAB_INTERNET 159 +#define IDC_MULTI_TAB_RECENT 160 +#define IDC_MULTI_TAB_LAN 161 +#define IDC_MULTI_TAB_FRIENDS 162 +#define IDC_MULTI_TAB_OFFICIAL 163 //Changed 164 to 163 +#define IDC_MULTI_TAB_QUICK_PLAY 164 //IDC_MULTI_QUICK_PLAY renamed to IDC_MULTI_TAB_OFFICIAL, changed to 164 +#define IDC_MULTI_TAB_SERVERS 165 //IDC_MULTI_SERVERS renamed to IDC_MULTI_TAB_SERVERS, changed to 165 +#define IDC_MULTI_TAB_DIRECT_CONNECT 166 //IDC_MULTI_REMOTE 103 renamed and changed to IDC_MULTI_TAB_DIRECT_CONNECT +#define IDC_MULTI_TAB_HOST_SERVER 167 //IDC_MULTI_NEW 104 renamed and changed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_LAUNCHER 168 //Launcher button +#define IDC_MP_FILEPATCHING 169 + +//MP Quick Play dialogue +#define IDC_MP_QUICK_GAME_TYPE 110 +#define IDC_MP_QUICK_MAX_PING 111 +#define IDC_MP_QUICK_BEST_SERVER 112 +#define IDC_MP_QUICK_FIND_SERVER 113 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_MODE_TITLE 115 +#define IDC_MP_QUICK_MODE_PICTURE 116 +#define IDC_MP_QUICK_MODE_DESCRIPTION 117 +#define IDC_MP_QUICK_MODE_BACKGROUND 118 + +//Server Search dialogue +#define IDC_MP_SERVER_SEARCH_STATUS 101 +#define IDC_MP_SERVER_SEARCH_PROGRESS 102 + +//Server Found dialogue +#define IDC_MP_SERVER_FOUND_COUNTDOWN 101 +#define IDC_MP_SERVER_FOUND_MISSION 102 +#define IDC_MP_SERVER_FOUND_GAME_TYPE 103 +#define IDC_MP_SERVER_FOUND_PLAYERS 104 +#define IDC_MP_SERVER_FOUND_BUTTON_NEXT 105 +#define IDC_MP_SERVER_FOUND_BUTTON_JOIN 106 + +#define IDC_OPTIMATCH_FILTER_SPEED 101 +#define IDC_OPTIMATCH_FILTER_TYPE 102 +#define IDC_OPTIMATCH_FILTER_MIN_PLAYERS 103 +#define IDC_OPTIMATCH_FILTER_MAX_PLAYERS 104 +#define IDC_OPTIMATCH_FILTER_LANGUAGE 105 +#define IDC_OPTIMATCH_FILTER_DIFFICULTY 106 + +#define IDC_PASSWORD 101 + +#define IDC_IP_ADDRESS 101 +#define IDC_IP_PORT 102 + +#define IDC_PORT_PORT 101 + +#define IDC_FILTER_SERVER 101 +#define IDC_FILTER_MISSION 102 +#define IDC_FILTER_MAXPING 103 +#define IDC_FILTER_MINPLAYERS 104 +#define IDC_FILTER_MAXPLAYERS 105 +#define IDC_FILTER_FULL 106 +#define IDC_FILTER_PASSWORDED 107 +#define IDC_FILTER_DEFAULT 108 +#define IDC_FILTER_TYPE 109 +#define IDC_FILTER_BATTLEYE 110 +#define IDC_FILTER_EXPANSIONS 111 +#define IDC_FILTER_MONETIZED 112 + +#define IDC_CLIENT_TEXT 101 +#define IDC_CLIENT_PLAYERS 102 +#define IDC_CLIENT_PROGRESS 103 + +#define IDC_SERVER_ISLAND 101 +#define IDC_SERVER_MISSION 102 +#define IDC_SERVER_EDITOR 103 +#define IDC_SERVER_DIFF 104 +#define IDC_SERVER_PLAYERS 105 +#define IDC_SERVER_GAMETYPE 106 +#define IDC_SERVER_SLOTS 107 +#define IDC_SERVER_SLOTS_PRIVATE 108 +#define IDC_SERVER_SLOTS_PUBLIC 109 +#define IDC_SERVER_MIN_PLAYERS 110 +#define IDC_SERVER_MAX_PLAYERS 111 +#define IDC_SERVER_SLOTS_PRIVATE_TITLE 112 +#define IDC_SERVER_SLOTS_PRIVATE_TEXT 112 +#define IDC_SERVER_SLOTS_PUBLIC_TITLE 113 +#define IDC_SERVER_SLOTS_PUBLIC_TEXT 113 +#define IDC_SERVER_SLOTS_PUBLIC_VALUE 114 +#define IDC_SERVER_SLOTS_PRIVATE_VALUE 115 +#define IDC_SERVER_VOTED_MISSIONS 116 +#define IDC_SERVER_PLAYERS_TITLE 117 +#define IDC_SERVER_TIMEOUT 118 +#define IDC_SERVER_VOTED_DIFFICULTY 119 +#define IDC_SERVER_DELETE 120 +#define IDC_SERVER_COPY 121 +#define IDC_SERVER_EDIT 122 +#define IDC_SERVER_LOAD 123 +#define IDC_SERVER_PRIVATE_SLOTS_TITLE 124 +#define IDC_SERVER_PRIVATE_SLOTS_VALUE 125 +#define IDC_SERVER_PRIVATE_SLOTS 126 +#define IDC_SERVER_MAXIMUM_SLOTS_TITLE 127 +#define IDC_SERVER_MAXIMUM_SLOTS 128 +#define IDC_SERVER_MAXIMUM_SLOTS_VALUE 129 +#define IDC_SERVER_MI_OVERVIEW 130 +#define IDC_SERVER_MI_GAMETYPE 131 +#define IDC_SERVER_MI_MAX_PLAYERS 132 +#define IDC_SERVER_MI_RESPAWN 133 +#define IDC_SERVER_MI_MIN_PLAYERS 134 +#define IDC_SERVER_SHOW_MISSION_WORKSHOP 135 +#define IDC_SERVER_SHOW_GAME_WORKSHOP 136 +#define IDC_SERVER_MI_NAME 137 +#define IDC_SERVER_MI_AUTHOR 138 +#define IDC_SERVER_MI_PICTURE 139 +#define IDC_SERVER_MI_DESCRIPTION 140 +#define IDC_SERVER_LOADING_PICTURE 141 +#define IDC_SERVER_GAME_OR_MISSION_WORKSHOP 142 +#define IDC_SERVER_ISLAND_TITLE 143 +#define IDC_SERVER_MISSION_TITLE 144 +#define IDC_SERVER_DIFF_INDICATOR 145 +#define IDC_SERVER_PURCHASE_BUTTON 146 + + +#define IDC_REQUIRED_BATTLEYE 201 + +// _VBS3 +#define IDC_AAR_SERVER 121 +#define IDC_AAR_SERVER_FILES 122 +#define IDC_AAR_DOWNLOADPROGRESS 123 +#define IDC_AAR_DOWNLOADSTART 124 +#define IDC_AAR_DOWNLOADSTOP 125 + +// Host settings dialog +#define IDC_HOST_NAME 101 +#define IDC_HOST_PASSWORD 102 +#define IDC_HOST_MAX_PLAYERS 103 +#define IDC_HOST_PRIVATE 104 +#define IDC_HOST_PORT 105 +#define IDC_HOST_PORT_WARNING 106 +#define IDC_HOST_UPNP 107 + +#define IDC_DED_SERVER_SLOTS_PUBLIC 101 +#define IDC_DED_SERVER_SLOTS_PUBLIC_TITLE 102 +#define IDC_DED_SERVER_SLOTS_PUBLIC_VALUE 103 +#define IDC_DED_SERVER_SLOTS_PRIVATE 104 +#define IDC_DED_SERVER_SLOTS_PRIVATE_TITLE 105 +#define IDC_DED_SERVER_SLOTS_PRIVATE_VALUE 106 + +#define IDC_WIZT_TEMPLATES 101 +#define IDC_WIZT_OVERVIEW 102 +#define IDC_WIZT_NAME 103 + +#define IDC_WIZM_EDIT 101 + +#define IDC_SRVSETUP_PLAYERS 101 +#define IDC_SRVSETUP_UNITS 102 +#define IDC_SRVSETUP_ISLAND 103 +#define IDC_SRVSETUP_NAME 104 +#define IDC_SRVSETUP_DESC 105 +#define IDC_SRVSETUP_ASSIGN 106 +#define IDC_SRVSETUP_UNASSIGN 107 +#define IDC_SRVSETUP_RANDOM 108 +#define IDC_SRVSETUP_PARAM1 109 +#define IDC_SRVSETUP_PARAM1_TEXT 110 +#define IDC_SRVSETUP_PARAM2 111 +#define IDC_SRVSETUP_PARAM2_TEXT 112 + +#define IDC_SRVSIDE_NAME 101 +#define IDC_SRVSIDE_ISLAND 102 +#define IDC_SRVSIDE_POOL 103 +#define IDC_SRVSIDE_WEST 104 +#define IDC_SRVSIDE_EAST 105 +#define IDC_SRVSIDE_RESIST 106 +#define IDC_SRVSIDE_CIVIL 107 +#define IDC_SRVSIDE_WEST_TEXT 108 +#define IDC_SRVSIDE_EAST_TEXT 109 +#define IDC_SRVSIDE_RESIST_TEXT 110 +#define IDC_SRVSIDE_CIVIL_TEXT 111 +#define IDC_SRVSIDE_DEFAULT 112 +#define IDC_SRVSIDE_PARAM1 113 +#define IDC_SRVSIDE_PARAM1_TEXT 114 +#define IDC_SRVSIDE_PARAM2 115 +#define IDC_SRVSIDE_PARAM2_TEXT 116 +#define IDC_SRVSIDE_PLAYERS 117 + +#define IDC_MPROLE_TITLE 101 +#define IDC_MPROLE_NAME 102 +#define IDC_MPROLE_ISLAND 103 +#define IDC_MPROLE_DESC 104 +#define IDC_MPROLE_POOL 105 +#define IDC_MPROLE_POOL_TEXT 106 +#define IDC_MPROLE_ROLES 107 +#define IDC_MPROLE_DEFAULT 108 +#define IDC_MPROLE_ENABLE 109 +#define IDC_MPROLE_SIDES 110 +#define IDC_MPROLE_ENABLE_ALL 111 + +#define IDC_CLIENT_GAME 101 + +#define IDC_CLIENTMAP_START1 101 +#define IDC_CLIENTMAP_START2 102 + +#define IDC_CLIENT_READY_PLAYERS 120 +#define IDC_CLIENT_READY_PLAYERS_TITLE 121 +#define IDC_CLIENT_READY_TIMEOUT 122 + +#define IDC_SERVER_READY_PLAYERS 120 +#define IDC_SERVER_READY_PLAYERS_TITLE 121 + +#define IDC_MP_PLAYERS 101 +#define IDC_MP_PL 102 +#define IDC_MP_PL_NAME 103 +#define IDC_MP_PL_MAIL 104 +#define IDC_MP_PL_ICQ 105 +#define IDC_MP_PL_REMARK 106 +#define IDC_MP_SQ 107 +#define IDC_MP_SQ_NAME 108 +#define IDC_MP_SQ_ID 109 +#define IDC_MP_SQ_MAIL 110 +#define IDC_MP_SQ_WEB 111 +#define IDC_MP_SQ_PICTURE 112 +#define IDC_MP_SQ_TITLE 113 +#define IDC_MP_KICKOFF 114 +#define IDC_MP_BAN 115 +#define IDC_MP_PL_MISSION 116 +#define IDC_MP_PL_ISLAND 117 +#define IDC_MP_PL_TIME 118 +#define IDC_MP_PL_MINPING 119 +#define IDC_MP_PL_AVGPING 120 +#define IDC_MP_PL_MAXPING 121 +#define IDC_MP_PL_MINBAND 122 +#define IDC_MP_PL_AVGBAND 123 +#define IDC_MP_PL_MAXBAND 124 +#define IDC_MP_PL_DESYNC 125 +#define IDC_MP_PL_REST 126 +#define IDC_MP_MUTE 127 + +#define IDC_CLIENT_WAIT_TITLE 130 // is used together with MP_PL + +#define IDC_MPSETUP_NAME 101 +#define IDC_MPSETUP_ISLAND 102 +#define IDC_MPSETUP_DESC 103 +#define IDC_MPSETUP_WEST 104 +#define IDC_MPSETUP_EAST 105 +#define IDC_MPSETUP_GUERRILA 106 +#define IDC_MPSETUP_CIVILIAN 107 +#define IDC_MPSETUP_ROLES_TITLE 108 +#define IDC_MPSETUP_ROLES 109 +#define IDC_MPSETUP_PARAM1_TITLE 110 +#define IDC_MPSETUP_PARAM1 111 +#define IDC_MPSETUP_PARAM2_TITLE 112 +#define IDC_MPSETUP_PARAM2 113 +#define IDC_MPSETUP_POOL 114 +#define IDC_MPSETUP_MESSAGE 115 +#define IDC_MPSETUP_KICK 116 +#define IDC_MPSETUP_ENABLE_ALL 117 +#define IDC_MPSETUP_LOCK 118 +#define IDC_MPSETUP_SIDE 119 +#define IDC_MPSETUP_POOL_TITLE 120 +#define IDC_MPSETUP_TIMEOUT 121 +#define IDC_MPSETUP_PLAYERS 122 +#define IDC_MPSETUP_FRIENDS 123 +#define IDC_MPSETUP_ADVANCED 124 +#define IDC_MPSETUP_GAMERCARD 125 +#define IDC_MPSETUP_PARTYGUI 126 +#define IDC_MPSETUP_ASSIGNROLE 127 +#define IDC_MPSETUP_PARAMS 128 +#define IDC_MPSETUP_DSINTERFACE 129 +#define IDC_MPSETUP_MISSION_WORKSHOP 130 +#define IDC_MPSETUP_LOGIC 131 +#define IDC_MPSETUP_VIRTUAL 132 +#define IDC_MPSETUP_PLAYERS_BUTTON 133 +#define IDC_MPSETUP_PLAYERS_SORT 134 +#define IDC_MPSETUP_PING_BUTTON 135 +#define IDC_MPSETUP_PING_SORT 136 +#define IDC_MPSETUP_MUTE_ALL 137 + +#define IDC_MPSETUP_MSG_MESSAGE 101 +#define IDC_MPSETUP_MSG_PROGRESS 102 +#define IDC_MPSETUP_MSG_TIME 103 + +#define IDC_PROGRESS_MSG_MESSAGE 101 +#define IDC_PROGRESS_MSG_PROGRESS 102 +#define IDC_PROGRESS_MSG_TIME 103 + +#define IDC_SERVER_SETTINGS_PARAM1_TEXT 101 +#define IDC_SERVER_SETTINGS_PARAM1 102 +#define IDC_SERVER_SETTINGS_PARAM2_TEXT 103 +#define IDC_SERVER_SETTINGS_PARAM2 104 +#define IDC_SERVER_SETTINGS_AI 105 +#define IDC_SERVER_SETTINGS_ASSIGN 106 + +#define IDC_SERVER_ADVANCED_ROLES 101 +#define IDC_SERVER_ADVANCED_DISABLE_ALL 102 +#define IDC_SERVER_ADVANCED_AUTOASSIGN 103 + +#define IDC_SERVER_SELECT_PLAYERS 101 + +// Main map display controls +#define IDC_MAP_WATCH 101 +#define IDC_MAP_COMPASS 102 +#define IDC_MAP_WALKIE_TALKIE 103 +#define IDC_MAP_NOTEPAD 104 +#define IDC_MAP_WARRANT 105 +#define IDC_MAP_GPS 106 +#define IDC_MAP_TEXTURES 107 +#define IDC_MAP_BRIEFING_SHOW 108 +#define IDC_MAP_BRIEFING_PAGE 109 +#define IDC_MAP_PREV_MARKER 110 +#define IDC_MAP_NEXT_MARKER 111 +#define IDC_MAP_GEAR 112 + +// Diary display controls +#define IDC_DIARY 101 +#define IDC_DIARY_INDEX 102 +#define IDC_DIARY_PAGE 103 +#define IDC_DIARY_ADD 104 + +// Select island display controls +#define IDC_SELECT_ISLAND 101 +#define IDC_SELECT_ISLAND_NOTEBOOK 102 +#define IDC_SELECT_ISLAND_WIZARD 103 +#define IDC_SELECT_ISLAND_EDITOR 104 +#define IDC_SELECT_ISLAND_EDITOR_OLD 105 +//Redefined in Eden +//IDC_SELECT_ISLAND_EDITOR_OLD 105 +//IDC_SELECT_ISLAND_3DEN 106 +#define IDC_SELECT_ISLAND_BUTTON_PURCHASE 107 + +// Custom arcade display controls +#define IDC_CUST_GAME 101 +#define IDC_CUST_PLAY 102 +#define IDC_CUST_EDIT 103 +#define IDC_CUST_DELETE 104 +#define IDC_CUST_EDIT_2 105 + +#define IDC_MISSION_PARAMS_LABEL 101 +#define IDC_MISSION_PARAMS_COMBO 102 + +#define IDC_ARCMAP_LOAD 101 +#define IDC_ARCMAP_SAVE 102 +#define IDC_ARCMAP_CLEAR 103 +#define IDC_ARCMAP_MODE 104 +#define IDC_ARCMAP_INTEL 105 +#define IDC_ARCMAP_MERGE 106 +#define IDC_ARCMAP_PREVIEW 107 +#define IDC_ARCMAP_CONTINUE 108 +#define IDC_ARCMAP_SECTION 109 +#define IDC_ARCMAP_IDS 111 +#define IDC_ARCMAP_TEXTURES 112 +#define IDC_ARCMAP_MISSION_NAME 113 +#define IDC_ARCMAP_MAP 114 +#define IDC_ARCMAP_BACKGROUND 115 +#define IDC_ARCMAP_LAYOUT 116 +#define IDC_ARCMAP_PUBLISH_MISSION 117 + +#define IDC_ARCUNIT_TITLE 101 +#define IDC_ARCUNIT_SIDE 102 +#define IDC_ARCUNIT_VEHICLE 103 +#define IDC_ARCUNIT_RANK 104 +#define IDC_ARCUNIT_CTRL 105 +#define IDC_ARCUNIT_CLASS 107 +#define IDC_ARCUNIT_HEALTH 108 +#define IDC_ARCUNIT_FUEL 109 +#define IDC_ARCUNIT_AMMO 110 +#define IDC_ARCUNIT_AZIMUT 111 +#define IDC_ARCUNIT_SPECIAL 112 +#define IDC_ARCUNIT_AGE 113 +#define IDC_ARCUNIT_AZIMUT_PICTURE 114 +#define IDC_ARCUNIT_PLACE 115 +#define IDC_ARCUNIT_PRESENCE 116 +#define IDC_ARCUNIT_PRESENCE_COND 117 +#define IDC_ARCUNIT_TEXT 118 +#define IDC_ARCUNIT_LOCK 119 +#define IDC_ARCUNIT_INIT 120 +#define IDC_ARCUNIT_SKILL 121 +#define IDC_ARCUNIT_DESC 122 +#define IDC_ARCUNIT_FACTION 123 +#define IDC_ARCUNIT_ELEVATION 124 +#define IDC_ARCUNIT_EQUIP 125 +#define IDC_ARCUNIT_RADIUS 126 +#define IDC_ARCUNIT_ARGUMENTS 127 +#define IDC_ARCUNIT_CATEGORY 128 +#define IDC_ARCUNIT_SETTINGS 2301 + +#define IDC_ARCGRP_SIDE 101 +#define IDC_ARCGRP_TYPE 102 +#define IDC_ARCGRP_NAME 103 +#define IDC_ARCGRP_AZIMUT 104 +#define IDC_ARCGRP_AZIMUT_PICTURE 105 +#define IDC_ARCGRP_FACTION 106 +#define IDC_ARCGRP_UNITS_LIST 107 + +#define IDC_ARCWP_TITLE 101 +#define IDC_ARCWP_TYPE 102 +#define IDC_ARCWP_SEQ 103 +#define IDC_ARCWP_DESC 104 +#define IDC_ARCWP_SEMAPHORE 105 +#define IDC_ARCWP_FORM 106 +#define IDC_ARCWP_SPEED 107 +#define IDC_ARCWP_COMBAT 108 +#define IDC_ARCWP_PLACE 109 +#define IDC_ARCWP_EFFECTS 110 +#define IDC_ARCWP_TIMEOUT_MIN 111 +#define IDC_ARCWP_TIMEOUT_MAX 112 +#define IDC_ARCWP_TIMEOUT_MID 113 +#define IDC_ARCWP_HOUSEPOS 114 +#define IDC_ARCWP_HOUSEPOSTEXT 115 +#define IDC_ARCWP_EXPACTIV 116 +#define IDC_ARCWP_SHOW 117 +#define IDC_ARCWP_EXPCOND 118 +#define IDC_ARCWP_SCRIPT 119 +#define IDC_ARCWP_PREC 120 +#define IDC_ARCWP_HEIGHT 121 +#define IDC_ARCWP_HEIGHTTEXT 122 +#define IDC_ARCWP_SCRIPTTEXT 123 +#define IDC_ARCWP_CATEGORY 124 + +#define IDC_ARCWP_ARGUMENTS 125 +#define IDC_ARCWP_ARGUMENTSTEXT 126 +#define IDC_ARCWP_NAME 127 + +#define IDC_ARCEFF_SOUND 103 +#define IDC_ARCEFF_VOICE 104 +#define IDC_ARCEFF_SOUND_ENV 105 +#define IDC_ARCEFF_SOUND_DET 106 +#define IDC_ARCEFF_MUSIC 107 +#define IDC_ARCEFF_TITTYPE 108 +#define IDC_ARCEFF_TITEFF 109 +#define IDC_ARCEFF_TITTEXT 110 +#define IDC_ARCEFF_TITRES 111 +#define IDC_ARCEFF_TITOBJ 112 +//#define IDC_ARCEFF_PLAYERONLY 113 +#define IDC_ARCEFF_CONDITION 113 +#define IDC_ARCEFF_TEXT_TITTEXT 114 + +#define IDC_ARCSENS_TITLE 101 +#define IDC_ARCSENS_A 102 +#define IDC_ARCSENS_B 103 +#define IDC_ARCSENS_ANGLE 104 +#define IDC_ARCSENS_ACTIV 105 +#define IDC_ARCSENS_PRESENCE 106 +#define IDC_ARCSENS_REPEATING 107 +#define IDC_ARCSENS_INTERRUPT 108 +#define IDC_ARCSENS_TIMEOUT_MIN 109 +#define IDC_ARCSENS_TIMEOUT_MAX 110 +#define IDC_ARCSENS_TIMEOUT_MID 111 +#define IDC_ARCSENS_TYPE 112 +#define IDC_ARCSENS_OBJECT 113 +#define IDC_ARCSENS_TEXT 114 +#define IDC_ARCSENS_AGE 115 +#define IDC_ARCSENS_EFFECTS 116 +#define IDC_ARCSENS_EXPCOND 117 +#define IDC_ARCSENS_EXPACTIV 118 +#define IDC_ARCSENS_EXPDESACTIV 119 +#define IDC_ARCSENS_RECT 120 +#define IDC_ARCSENS_NAME 121 + +#define IDC_ARCMARK_TITLE 101 +#define IDC_ARCMARK_NAME 102 +#define IDC_ARCMARK_MARKER 103 +#define IDC_ARCMARK_TYPE 104 +#define IDC_ARCMARK_COLOR 105 +#define IDC_ARCMARK_A 106 +#define IDC_ARCMARK_B 107 +#define IDC_ARCMARK_ANGLE 108 +#define IDC_ARCMARK_TYPE_TEXT 109 +#define IDC_ARCMARK_FILL 110 +#define IDC_ARCMARK_TEXT 111 + +#define IDC_INTEL_RESISTANCE 101 +#define IDC_INTEL_MONTH 102 +#define IDC_INTEL_DAY 103 +#define IDC_INTEL_HOUR 104 +#define IDC_INTEL_MINUTE 105 +#define IDC_INTEL_BRIEFING_NAME 106 +#define IDC_INTEL_BRIEFING_DESC 107 +#define IDC_INTEL_WEATHER 108 +#define IDC_INTEL_FOG 109 +#define IDC_INTEL_WEATHER_FORECAST 110 +#define IDC_INTEL_FOG_FORECAST 111 +#define IDC_INTEL_YEAR 112 +//added by MUF - new intel dialog-------------------------- +#define IDC_INTEL_WEATHER_TB 113 +#define IDC_INTEL_WEATHER_FORECAST_TB 114 + +#define IDC_INTEL_FOG_CB 115 +#define IDC_INTEL_FOG_TB 116 +#define IDC_INTEL_FOG_FORECAST_TB 117 + +#define IDC_INTEL_RAIN_CB 118 +#define IDC_INTEL_RAIN 119 +#define IDC_INTEL_RAIN_TB 120 +#define IDC_INTEL_RAIN_FORECAST 121 +#define IDC_INTEL_RAIN_FORECAST_TB 122 + +#define IDC_INTEL_LIGHTN_CB 123 +#define IDC_INTEL_LIGHTN 124 +#define IDC_INTEL_LIGHTN_TB 125 +#define IDC_INTEL_LIGHTN_FORECAST 126 +#define IDC_INTEL_LIGHTN_FORECAST_TB 127 + +#define IDC_INTEL_WAVES_CB 128 +#define IDC_INTEL_WAVES 129 +#define IDC_INTEL_WAVES_TB 130 +#define IDC_INTEL_WAVES_FORECAST 131 +#define IDC_INTEL_WAVES_FORECAST_TB 132 + +#define IDC_INTEL_WIND_CB 133 +#define IDC_INTEL_STRENGTH 134 +#define IDC_INTEL_STRENGTH_TB 135 +#define IDC_INTEL_STRENGTH_FORECAST 136 +#define IDC_INTEL_STRENGTH_FORECAST_TB 137 + +#define IDC_INTEL_GUSTS 138 +#define IDC_INTEL_GUSTS_TB 139 +#define IDC_INTEL_GUSTS_FORECAST 140 +#define IDC_INTEL_GUSTS_FORECAST_TB 141 + +#define IDC_INTEL_WINDDIR 142 +#define IDC_INTEL_WINDDIR_TB 143 +#define IDC_INTEL_WINDDIR_FORECAST 144 +#define IDC_INTEL_WINDDIR_FORECAST_TB 145 + +#define IDC_INTEL_CHNGTIME 146 +#define IDC_INTEL_CHNGTIME_HOUR_TB 147 +#define IDC_INTEL_CHNGTIME_MIN_TB 148 + +#define IDC_INTEL_CHNGTIME_HLEFT 149 +#define IDC_INTEL_CHNGTIME_HMIDDLE 150 +#define IDC_INTEL_CHNGTIME_HRIGHT 151 + +//added by MUF - new intel dialog-------------------------- + +// Dialog for choosing Editor's layout +#define IDC_LAYOUT_LIST 101 +#define IDC_LAYOUT_PICTURE 102 + +// Chat +#define IDC_CHANNEL 101 +#define IDC_CHANNEL_VOICE 102 +#define IDC_CHANNEL_MUTE_VON 103 +#define IDC_CHANNEL_MUTE_CHAT 104 + +#define IDC_CHAT 101 + +#define IDC_VOICE_CHAT 101 + +// Save / load template +#define IDC_TEMPL_NAME 101 +#define IDC_TEMPL_TITLE 102 +#define IDC_TEMPL_MODE 103 +#define IDC_TEMPL_ISLAND 104 + +// publish / update to Steam workshop +#define IDC_PUBLISH_STEAM_TITLE 101 +#define IDC_PUBLISH_STEAM_TAGS 102 +#define IDC_PUBLISH_STEAM_PICTURE 103 +#define IDC_PUBLISH_STEAM_DESCRIPTION 104 +#define IDC_PUBLISH_STEAM_MISSION_LIST 105 +#define IDC_PUBLISH_STEAM_VISIBILITY 106 +#define IDC_PUBLISH_STEAM_CHANGE_NOTES 107 +#define IDC_PUBLISH_STEAM_PREVIEW_FILE 108 +#define IDC_PUBLISH_CHECKBOX_LICENCE 109 +#define IDC_PUBLISH_TEXT_MISSION_SIZE 110 +#define IDC_PUBLISH_TEXT_QUOTA 111 +#define IDC_PUBLISH_BUTTON_PUBLISH 112 +#define IDC_PUBLISH_BUTTON_UPDATE 113 +#define IDC_PUBLISH_BUTTON_DELETE 114 +#define IDC_PUBLISH_BUTTON_EDIT_TAGS 115 +#define IDC_PUBLISH_BUTTON_WORKSHOP 116 +#define IDC_PUBLISH_BUTTON_WORKSHOP_LICENCE 117 +#define IDC_PUBLISH_BUTTON_SELECT_PREVIEW 118 +#define IDC_PUBLISH_BUTTON_DEFAULT_PREVIEW 119 +#define IDC_PUBLISH_STORAGE_SLIDER 120 +// group that is hidden when new mission is selected and shown when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_HIDE_NEW_MISSION 121 +// group that is shown when new mission is selected and hidden when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_SHOW_NEW_MISSION 122 + +// publish / update to Steam workshop - tags dialog +#define IDC_PUBLISH_STEAM_TAGS_AVAILABLE 101 +#define IDC_PUBLISH_STEAM_TAGS_SELECTED 102 +#define IDC_PUBLISH_STEAM_TAGS_ADD 103 +#define IDC_PUBLISH_STEAM_TAGS_REMOVE 104 +#define IDC_PUBLISH_STEAM_TAGS_NEXT 105 +#define IDC_PUBLISH_STEAM_TAGS_BACK 106 +#define IDC_PUBLISH_STEAM_TAGS_TITLE 107 + +// select file dialog +#define IDC_FILE_SELECT_PATH 101 +#define IDC_FILE_SELECT_DIR_TREE 102 +#define IDC_FILE_SELECT_FILE_LIST 103 +#define IDC_FILE_SELECT_PREVIEW 104 + + +//Login display +#define IDC_LOGIN_USER_LIST 101 +#define IDC_LOGIN_EDIT 102 +#define IDC_LOGIN_NEW_USER 103 +#define IDC_LOGIN_DELETE 104 +#define IDC_LOGIN_NAME 105 +#define IDC_LOGIN_FACE 106 +#define IDC_LOGIN_SPEAKER 107 +#define IDC_LOGIN_PITCH 108 +#define IDC_LOGIN_HEAD 109 +#define IDC_LOGIN_GLASSES 110 +#define IDC_LOGIN_ID 111 +#define IDC_LOGIN_SQUAD 112 +#define IDC_LOGIN_SQUAD_TEXT 113 +#define IDC_LOGIN_DISCARD 114 +#define IDC_LOGIN_TAB_AVATAR 115 +#define IDC_LOGIN_TAB_UNIT 116 +#define IDC_LOGIN_UNIT_SELECT 117 +#define IDC_LOGIN_UNIT_LOGO 118 +#define IDC_LOGIN_UNIT_NAME 119 +#define IDC_LOGIN_UNIT_MOTTO 120 +#define IDC_LOGIN_UNIT_DESCRIPTION 121 +#define IDC_LOGIN_ID_TEXT 122 +#define IDC_LOGIN_REFRESH 123 + +// Interrupt display +#define IDC_INT_OPTIONS 101 +#define IDC_INT_LOAD 102 +#define IDC_INT_SAVE 103 +#define IDC_INT_ABORT 104 +#define IDC_INT_RETRY 105 +#define IDC_INT_TITLE 106 +#define IDC_INT_SETTINGS 107 +#define IDC_INT_FRIENDS 108 +#define IDC_INT_PLAYERS 109 +#define IDC_INT_APPEAR_OFFLINE 110 +#define IDC_INT_MISSION 111 +#define IDC_INT_SIGN_IN_STATUS 112 +#define IDC_INT_EDIT_MAP 113 +#define IDC_INT_EDIT_3D 114 +#define IDC_INT_EDIT_PREVIEW 115 +#define IDC_INT_EDIT_REALTIME 116 +#define IDC_INT_RESTART 117 +#define IDC_INT_DIARY 118 +#define IDC_INT_REVERT 119 +#define IDC_INT_MISSIONNAME 120 +#define IDC_INT_TRAFFIC_LIGHT 121 +#define IDC_INT_FIELD_MANUAL 122 + +// Interrupt revert display +#define IDC_INT_REVERT_TYPE 101 + +// Select save display +#define IDC_SELECT_SAVE_SLOTS 101 + +// Mission end display +#define IDC_ME_SUBTITLE 101 +#define IDC_ME_QUOTATION 102 +#define IDC_ME_AUTHOR 103 +#define IDC_ME_RETRY 104 +#define IDC_ME_LOAD 105 +#define IDC_ME_RESTART 106 +#define IDC_ME_TEAM_SWITCH 107 + +// Get ready display +#define IDC_GETREADY_NAME 101 +#define IDC_GETREADY_DESC 102 +#define IDC_GETREADY_PRIMARY 105 +#define IDC_GETREADY_SECONDARY 106 +#define IDC_GETREADY_PLAYER 107 +#define IDC_GETREADY_DATE 108 +#define IDC_GETREADY_MODE 110 +#define IDC_GETREADY_PRIMARY_TEXT 111 +#define IDC_GETREADY_SECONDARY_TEXT 112 +#define IDC_GETREADY_EDITMODE 113 +#define IDC_GETREADY_TITLE 114 + +#define IDC_GEAR_UNIT 101 +#define IDC_GEAR_SKILL 102 +#define IDC_GEAR_VEHICLE 103 +#define IDC_GEAR_POOL 105 +#define IDC_GEAR_OVERVIEW 106 +#define IDC_GEAR_SLOT_PRIMARY 107 +#define IDC_GEAR_SLOT_SECONDARY 108 +#define IDC_GEAR_SLOT_ITEM1 109 +#define IDC_GEAR_SLOT_ITEM2 110 +#define IDC_GEAR_SLOT_ITEM3 111 +#define IDC_GEAR_SLOT_ITEM4 112 +#define IDC_GEAR_SLOT_ITEM5 113 +#define IDC_GEAR_SLOT_ITEM6 114 +#define IDC_GEAR_SLOT_ITEM7 115 +#define IDC_GEAR_SLOT_ITEM8 116 +#define IDC_GEAR_SLOT_ITEM9 117 +#define IDC_GEAR_SLOT_ITEM10 118 +#define IDC_GEAR_SLOT_ITEM11 119 +#define IDC_GEAR_SLOT_ITEM12 120 +#define IDC_GEAR_SLOT_HANDGUN 121 +#define IDC_GEAR_SLOT_HANGUN_ITEM1 122 +#define IDC_GEAR_SLOT_HANGUN_ITEM2 123 +#define IDC_GEAR_SLOT_HANGUN_ITEM3 124 +#define IDC_GEAR_SLOT_HANGUN_ITEM4 125 +#define IDC_GEAR_SLOT_HANGUN_ITEM5 126 +#define IDC_GEAR_SLOT_HANGUN_ITEM6 127 +#define IDC_GEAR_SLOT_HANGUN_ITEM7 128 +#define IDC_GEAR_SLOT_HANGUN_ITEM8 129 +#define IDC_GEAR_SLOT_SPECIAL1 130 +#define IDC_GEAR_SLOT_SPECIAL2 131 +#define IDC_GEAR_REARM 132 +#define IDC_GEAR_CONTINUE 133 +#define IDC_GEAR_SLOT_INVENTORY1 134 +#define IDC_GEAR_SLOT_INVENTORY2 135 +#define IDC_GEAR_SLOT_INVENTORY3 136 +#define IDC_GEAR_SLOT_INVENTORY4 137 +#define IDC_GEAR_SLOT_INVENTORY5 138 +#define IDC_GEAR_SLOT_INVENTORY6 139 +#define IDC_GEAR_SLOT_INVENTORY7 140 +#define IDC_GEAR_SLOT_INVENTORY8 141 +#define IDC_GEAR_SLOT_INVENTORY9 142 +#define IDC_GEAR_SLOT_INVENTORY10 143 +#define IDC_GEAR_SLOT_INVENTORY11 144 +#define IDC_GEAR_SLOT_INVENTORY12 145 + +#define IDC_GEAR_ADD_ITEM 146 +#define IDC_GEAR_REMOVE_ITEM 147 + +#define IDC_GEAR_FILTER 148 +#define IDC_GEAR_FILTER_ICON1 149 +#define IDC_GEAR_FILTER_ICON2 150 +#define IDC_GEAR_FILTER_ICON3 151 +#define IDC_GEAR_FILTER_ICON4 152 +#define IDC_GEAR_FILTER_ICON5 153 +#define IDC_GEAR_FILTER_ICON6 154 + +#define IDC_GEAR_POOL_GROUP 155 +#define IDC_GEAR_SOURCE_NAME 156 +#define IDC_GEAR_OPEN_BAG 157 +#define IDC_GEAR_CLOSE_BAG 158 +#define IDC_GEAR_ADD_DEFAULT 255 +#define IDC_GEAR_CLEAR_ALL 256 +#define IDC_BAG_ITEMS_GROUP 159 +#define IDC_UNIT_ITEMS_GROUP 160 + +#define IDC_GEAR_BAG_EMPTY 5000 +/* +#define IDC_GEAR_BAG_EMPTY_SLOT1 5000 +#define IDC_GEAR_BAG_EMPTY_SLOT2 5001 +#define IDC_GEAR_BAG_EMPTY_SLOT3 5002 +. +. +. +#define IDC_GEAR_BAG_EMPTY_SLOT499 5498 +#define IDC_GEAR_BAG_EMPTY_SLOT500 5499 +*/ +#define IDC_GEAR_BAG_FULL 5500 + +// Debriefing +/* +#define IDC_DEBRIEFING_LEFT 101 +#define IDC_DEBRIEFING_RIGHT 102 +*/ +#define IDC_DEBRIEFING_STAT 103 +#define IDC_DEBRIEFING_RESTART 104 +#define IDC_DEBRIEFING_PAD2 105 +#define IDC_DEBRIEFING_PLAYERS_TITLE_BG 106 +#define IDC_DEBRIEFING_PLAYERS_TITLE 107 +#define IDC_DEBRIEFING_PLAYERS_BG 108 +#define IDC_DEBRIEFING_PLAYERS 109 +#define IDC_DEBRIEFING_TIMEOUT 110 +#define IDC_DEBRIEFING_RESULT 111 +#define IDC_DEBRIEFING_TITLE 112 +#define IDC_DEBRIEFING_DEBRIEFING 113 +#define IDC_DEBRIEFING_OBJECTIVES 114 +#define IDC_DEBRIEFING_INFO 115 +#define IDC_DEBRIEFING_SHOW_PLAYERS 116 +#define IDC_DEBRIEFING_SHOW_PAGE2 117 +#define IDC_DEBRIEFING_LIVE_STATS 118 +#define IDC_DEBRIEFING_PREV_PAGE 119 +#define IDC_DEBRIEFING_NEXT_PAGE 120 +#define IDC_DEBRIEFING_LOAD 121 +#define IDC_DEBRIEFING_TEXT_GROUP 122 +#define IDC_DEBRIEFING_OBJECTIVES_GROUP 123 +#define IDC_DEBRIEFING_STATS_GROUP 124 +#define IDC_DEBRIEFING_MISSION_WORKSHOP 125 +#define IDC_DEBRIEFING_READY 126 +#define IDC_DEBRIEFING_DISCONNECT 127 + +// Debug display +#define IDC_DEBUG_EXP 101 +#define IDC_DEBUG_APPLY 102 +#define IDC_DEBUG_LOG 103 +#define IDC_DEBUG_SEARCH 161 +#define IDC_DEBUG_SEARCH_BUTTON 162 +#define IDC_DEBUG_HISTORY 163 + +#define IDC_DEBUG_EXP1 121 +#define IDC_DEBUG_EXP2 122 +#define IDC_DEBUG_EXP3 123 +#define IDC_DEBUG_EXP4 124 + +#define IDC_DEBUG_RES1 141 +#define IDC_DEBUG_RES2 142 +#define IDC_DEBUG_RES3 143 +#define IDC_DEBUG_RES4 144 + +#define IDC_DEBUG_CLEAR_LOG 151 +#define IDC_DEBUG_FILTER_EDIT 152 + +// Debug PhysX Display +#define IDC_PHYSX_DEBUG_DIAGMODE 101 +#define IDC_PHYSX_DEBUG_DIAGMODEDRAW 102 + +#define IDC_PHYSX_DEBUG_TERRAIN 103 +#define IDC_PHYSX_DEBUG_STATIC 104 +#define IDC_PHYSX_DEBUG_KINEMATIC 105 +#define IDC_PHYSX_DEBUG_DYNAMIC 106 + +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_START 109 +#define IDC_PHYSX_DEBUG_WORLD_AXES 110 +#define IDC_PHYSX_DEBUG_BODY_AXES 111 +#define IDC_PHYSX_DEBUG_BODY_MASS_AXES 112 +#define IDC_PHYSX_DEBUG_BODY_LIN_VELOCITY 113 +#define IDC_PHYSX_DEBUG_BODY_ANG_VELOCITY 114 +#define IDC_PHYSX_DEBUG_BODY_JOINT_GROUPS 115 +#define IDC_PHYSX_DEBUG_JOINT_LOCAL_AXES 116 +#define IDC_PHYSX_DEBUG_JOINT_WORLD_AXES 117 +#define IDC_PHYSX_DEBUG_JOINT_LIMITS 118 +#define IDC_PHYSX_DEBUG_CONTACT_POINT 119 +#define IDC_PHYSX_DEBUG_CONTACT_NORMAL 120 +#define IDC_PHYSX_DEBUG_CONTACT_ERROR 121 +#define IDC_PHYSX_DEBUG_CONTACT_FORCE 122 +#define IDC_PHYSX_DEBUG_ACTOR_AXES 123 +#define IDC_PHYSX_DEBUG_COLLISION_AABBS 124 +#define IDC_PHYSX_DEBUG_COLLISION_SHAPES 125 +#define IDC_PHYSX_DEBUG_COLLISION_AXES 126 +#define IDC_PHYSX_DEBUG_COLLISION_COMPOUNDS 127 +#define IDC_PHYSX_DEBUG_COLLISION_VNORMALS 128 +#define IDC_PHYSX_DEBUG_COLLISION_FNORMALS 129 +#define IDC_PHYSX_DEBUG_COLLISION_EDGES 130 +#define IDC_PHYSX_DEBUG_COLLISION_SPHERES 131 +#define IDC_PHYSX_DEBUG_COLLISION_STATIC 132 +#define IDC_PHYSX_DEBUG_COLLISION_DYNAMIC 133 +#define IDC_PHYSX_DEBUG_COLLISION_FREE 134 +#define IDC_PHYSX_DEBUG_COLLISION_CCD 135 +#define IDC_PHYSX_DEBUG_COLLISION_SKELETONS 136 +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_END 148 + +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_START 149 +#define IDC_PHYSX3_DEBUG_WORLD_AXES 150 +#define IDC_PHYSX3_DEBUG_BODY_AXES 151 +#define IDC_PHYSX3_DEBUG_BODY_MASS_AXES 152 +#define IDC_PHYSX3_DEBUG_BODY_LIN_VELOCITY 153 +#define IDC_PHYSX3_DEBUG_BODY_ANG_VELOCITY 154 +#define IDC_PHYSX3_DEBUG_BODY_JOINT_GROUPS 155 +#define IDC_PHYSX3_DEBUG_CONTACT_POINT 156 +#define IDC_PHYSX3_DEBUG_CONTACT_NORMAL 157 +#define IDC_PHYSX3_DEBUG_CONTACT_ERROR 158 +#define IDC_PHYSX3_DEBUG_CONTACT_FORCE 159 +#define IDC_PHYSX3_DEBUG_ACTOR_AXES 160 +#define IDC_PHYSX3_DEBUG_COLLISION_AABBS 161 +#define IDC_PHYSX3_DEBUG_COLLISION_SHAPES 162 +#define IDC_PHYSX3_DEBUG_COLLISION_AXES 163 +#define IDC_PHYSX3_DEBUG_COLLISION_COMPOUNDS 164 +#define IDC_PHYSX3_DEBUG_COLLISION_FNORMALS 165 +#define IDC_PHYSX3_DEBUG_COLLISION_EDGES 166 +#define IDC_PHYSX3_DEBUG_COLLISION_STATIC 167 +#define IDC_PHYSX3_DEBUG_COLLISION_DYNAMIC 168 +#define IDC_PHYSX3_DEBUG_COLLISION_PAIRS 169 +#define IDC_PHYSX3_DEBUG_JOINT_LOCAL_AXES 170 +#define IDC_PHYSX3_DEBUG_JOINT_LIMITS 171 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_POSITION 172 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_VELOCITY 173 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_COLLISION_NORMAL 174 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BOUNDS 175 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_GRID 176 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BROADPHASE_BOUNDS 177 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_MAX_MOTION_DISTANCE 178 +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_END 188 + +#define IDC_PHYSX_DEBUG_ALL 190 +#define IDC_PHYSX_DEBUG_NONE 191 +#define IDC_PHYSX_DEBUG_DIAGMODEPERF 192 +#define IDC_PHYSX_DEBUG_DIAGMODESTATS 193 + +#define IDC_PHYSX_DEBUG_USECONVEXSHAPES 194 +#define IDC_PHYSX_DEBUG_USEROADWAYS 195 +#define IDC_PHYSX_DEBUG_USEONECAPSULE 196 +#define IDC_PHYSX_DEBUG_IMMEDIATEFETCH 197 + +#define IDC_PHYSX_DEBUG_BASIC 198 + +// DS interface display +#define IDC_DSI_PLAYERLIST 101 +#define IDC_DSI_MISSONLIST 102 + +// HintC display +#define IDC_HINTC_BG 101 +#define IDC_HINTC_HINT 102 +#define IDC_HINTC_TITLE 103 +#define IDC_HINTC_CONTINUE 104 +#define IDC_HINTC_LINE1 105 +#define IDC_HINTC_LINE2 106 + +// Insert marker display +#define IDC_INSERT_MARKER 101 +#define IDC_INSERT_MARKER_PICTURE 102 +#define IDC_INSERT_MARKER_CHANNELS 103 + +// InGameUI +// - unit info +#define IDC_IGUI_TIME 101 +#define IDC_IGUI_DATE 102 +#define IDC_IGUI_NAME 103 +#define IDC_IGUI_UNIT 104 +#define IDC_IGUI_VALUE_EXP 106 +#define IDC_IGUI_COMBAT_MODE 107 +#define IDC_IGUI_VALUE_HEALTH 109 +#define IDC_IGUI_HITZONES 111 +#define IDC_IGUI_VALUE_FUEL 113 +#define IDC_IGUI_CARGO_MAN 114 +#define IDC_IGUI_CARGO_FUEL 115 +#define IDC_IGUI_CARGO_REPAIR 116 +#define IDC_IGUI_CARGO_AMMO 117 +#define IDC_IGUI_WEAPON 118 +#define IDC_IGUI_AMMO 119 +#define IDC_IGUI_VEHICLE 120 +#define IDC_IGUI_SPEED 121 +#define IDC_IGUI_ALT 122 +#define IDC_IGUI_FORMATION 123 +#define IDC_IGUI_BG 124 +#define IDC_IGUI_COMMANDER 125 +#define IDC_IGUI_DRIVER 126 +#define IDC_IGUI_GUNNER 127 + +#define IDC_IGUI_SPEED_FREEFALL 380 +#define IDC_IGUI_SPEED_VERTICAL_FREEFALL 381 +#define IDC_IGUI_ALT_FREEFALL 382 + +#define IDC_IGUI_ANALOGUE_HORIZON 383 +#define IDC_IGUI_ANALOGUE_SPEED_LADDER 384 +#define IDC_IGUI_ANALOGUE_ALT_LADDER 385 + +#define IDC_IGUI_OPTICS_GROUP 390 +#define IDC_IGUI_DRIVER_GROUP 391 +#define IDC_IGUI_DRIVER_OPTICS_GROUP 392 +#define IDC_IGUI_VEHICLE_PITCH 393 + + +//AV_Terminal +#define IDC_IGUI_AVT_NAME 100 +#define IDC_IGUI_AVT_TAKE_CONTROL 101 +#define IDC_IGUI_AVT_STATUS 102 +#define IDC_IGUI_AVT_TARGET 103 +#define IDC_IGUI_AVT_POSITION 104 +#define IDC_IGUI_AVT_PIP1 105 +#define IDC_IGUI_AVT_PIP2 106 +#define IDC_IGUI_AVT_COUNT 107 +#define IDC_IGUI_AVT_EDITOR_MENU 108 +#define IDC_IGUI_AVT_FUEL 109 +#define IDC_IGUI_AVT_WEAPON 110 +#define IDC_IGUI_AVT_AMMO 111 +#define IDC_IGUI_AVT_WEAPON_SEC 112 +#define IDC_IGUI_AVT_AMMO_SEC 113 +#define IDC_IGUI_AVT_TAKE_CONTROL_DRIVER 114 +#define IDC_IGUI_AVT_TAKE_CONTROL_GUNNER 115 +#define IDC_IGUI_AVT_AUTONOMOUS 116 +#define IDC_IGUI_AVT_COMBO 117 +#define IDC_IGUI_AVT_ALLOW_LIGHTS 118 + +//AV Camera +#define IDC_IGUI_AVC_PIP_DRIVER 100 +#define IDC_IGUI_AVC_PIP_GUNNER 101 +#define IDC_IGUI_AVC_PIP_SINGLE_VIEW 102 +#define IDC_IGUI_AVC_PIP_SOURCE 103 +#define IDC_IGUI_AVC_PIP_HEADING 104 +#define IDC_IGUI_AVC_PIP_MODE 105 + +//Sling Load Assistant +#define IDC_SLA_MAP 100 +#define IDC_SLA_HDIST 101 +#define IDC_SLA_VDIST 102 +#define IDC_SLA_STATUS 103 +#define IDC_SLA_LIFT_PROGRESS 104 +#define IDC_SLA_HEIGHT_BAR 105 +#define IDC_SLA_MAX_ALT 106 +#define IDC_SLA_VIEWPORT 107 + +//Sensors Display +#define IDC_SENS_VIEWPORT 101 +#define IDC_SENS_CIRCLES 102 +#define IDC_SENS_VEHICLE 103 +#define IDC_SENS_RANGE 104 +#define IDC_SENS_RADARON 105 +#define IDC_SENS_RADAROFF 106 +#define IDC_SENS_TARGET 107 +#define IDC_SENS_TARGETRANGE 108 +#define IDC_SENS_TARGETSPEED 109 +#define IDC_SENS_TARGETALT 110 +#define IDC_SENS_HEADING 111 + +//Mine detector Display +#define IDC_MINEDETECT_VIEWPORT 101 +#define IDC_MINEDETECT_CIRCLES 102 +#define IDC_MINEDETECT_VEHICLE 103 +#define IDC_MINEDETECT_RANGE 104 + +//Crew list +#define IDC_CREW_VEHICLE 101 +#define IDC_CREW_LIST 102 + +//MP Score Table +#define IDC_MP_SCORE_TABLE_TITLE 101 +#define IDC_MP_SCORE_TABLE_PLAYERS_LIST 102 +#define IDC_MP_SCORE_TABLE_SIDES_LIST 103 +#define IDC_MP_SCORE_TABLE_LINE_TEMPLATE 104 +#define IDC_MP_SCORE_TABLE_LINE_BACK 105 +#define IDC_MP_SCORE_TABLE_ORDER 106 +#define IDC_MP_SCORE_TABLE_PLAYERSNAME 107 +#define IDC_MP_SCORE_TABLE_KILLS_INF 108 +#define IDC_MP_SCORE_TABLE_KILLS_SOFT 109 +#define IDC_MP_SCORE_TABLE_KILLS_ARMOR 110 +#define IDC_MP_SCORE_TABLE_KILLS_AIR 111 +#define IDC_MP_SCORE_TABLE_KILLED 112 +#define IDC_MP_SCORE_TABLE_KILLSTOTAL 113 + +//Vehicle MessageBox +#define IDC_VEHICLEMSGBOX_BACKGROUND 100 +#define IDC_VEHICLEMSGBOX_LOGO 101 +#define IDC_VEHICLEMSGBOX_TEXT 102 +#define IDC_VEHICLEMSGBOX_PURCHASE 103 + +//Action Notification +#define IDC_DLC_ACTION_NOTIFICATION_GROUP 11406 +#define IDC_DLC_ACTION_NOTIFICATION_LOGO 100 +#define IDC_DLC_ACTION_NOTIFICATION_TEXT 101 +#define IDC_DLC_ACTION_NOTIFICATION_TITLE 102 + +//first aid icons +#define IDC_IGUI_BLEEDING0 401 +#define IDC_IGUI_BLEEDING1 402 +#define IDC_IGUI_INJURED_HEAD0 403 +#define IDC_IGUI_INJURED_HEAD1 404 +#define IDC_IGUI_INJURED_HANDS0 405 +#define IDC_IGUI_INJURED_HANDS1 406 +#define IDC_IGUI_INJURED_HANDS2 407 +#define IDC_IGUI_INJURED_LEGS0 408 +#define IDC_IGUI_INJURED_LEGS1 409 +#define IDC_IGUI_INJURED_LEGS2 410 +#define IDC_IGUI_BODY 411 +#define IDC_IGUI_VALUE_OXYGEN 412 +#define IDC_IGUI_BURNING 413 + +#define IDC_IGUI_ALT_WANTED 128 +#define IDC_IGUI_SPEED_WANTED 129 +#define IDC_IGUI_POSITION 130 +#define IDC_IGUI_OPTIC 131 + +// _VBS3 + #define IDC_IGUI_MAGAZINE 132 + #define IDC_IGUI_OVR_STATUS 133 + //TI + #define IDC_IGUI_TI_BACK 134 + #define IDC_IGUI_TI_MODE 135 + #define IDC_IGUI_TI_BRIGHTNESS_TXT 136 + #define IDC_IGUI_TI_BRIGHTNESS 137 + #define IDC_IGUI_TI_CONTRAST_TXT 138 + #define IDC_IGUI_TI_CONTRAST 139 + #define IDC_IGUI_TI_AUTO_CONTRAST 140 + + //LASE + #define IDC_IGLR_RANGE 141 + #define IDC_IGLR_BG 142 + #define IDC_IGLR_RANGE_NUM 143 + + //AVRS + #define IDC_IGUI_NICK 144 + #define IDC_IGUI_NICK_VAL 145 + #define IDC_IGUI_BANK 146 + #define IDC_IGUI_BANK_VAL 147 +// !_VBS3 +#define IDC_IGUI_HEADING 148 + +// !new arrowhead +#define IDC_IGUI_WEAPON_MODE 149 +#define IDC_IGUI_WEAPON_GUNNER 150 +#define IDC_IGUI_COUNTER_MEASURES_AMMO 151 +#define IDC_IGUI_COUNTER_MEASURES_MODE 152 + +#define IDC_IGUI_RADARRANGE 153 +#define IDC_IGUI_VALUE_RELOAD 154 +#define IDC_IGUI_WEAPON_AMMO 155 + +// New Arma 3 +#define IDC_IGUI_STANCE_INDICATOR 188 +#define IDC_IGUI_GPS_PLAYER 189 +#define IDC_IGUI_SPEED2 190 +#define IDC_IGUI_ALT2 191 +#define IDC_IGUI_PILOT_OPTIC_ZOOM 192 +#define IDC_IGUI_STAMINA_BAR 193 + +// weapon/turret info controls +#define IDC_IGUI_WEAPON_DISTANCE 151 +#define IDC_IGUI_WEAPON_VISION_MODE 152 +#define IDC_IGUI_WEAPON_FLIR_MODE 153 +#define IDC_IGUI_WEAPON_FOV_MODE 154 +#define IDC_IGUI_WEAPON_COMPASS 155 +#define IDC_IGUI_WEAPON_HEADING 156 +#define IDC_IGUI_WEAPON_AUTOHOVER 157 +#define IDC_IGUI_WEAPON_LASER_MARKER_ON 158 +#define IDC_IGUI_WEAPON_BALL_ENABLED 159 +#define IDC_IGUI_WEAPON_JAVELIN_DAY 160 +#define IDC_IGUI_WEAPON_JAVELIN_FLTR 161 +#define IDC_IGUI_WEAPON_JAVELIN_NFOV 162 +#define IDC_IGUI_WEAPON_JAVELIN_WFOV 163 +#define IDC_IGUI_WEAPON_BALL_RANGE 164 +#define IDC_IGUI_WEAPON_BALISTIC_COMP 165 +#define IDC_IGUI_WEAPON_JAVELIN_SEEK 166 +#define IDC_IGUI_WEAPON_JAVELIN_MISSLE 167 +#define IDC_IGUI_WEAPON_ELEVATION 168 +#define IDC_IGUI_WEAPON_ELEVATION_TEXT 169 +#define IDC_IGUI_WEAPON_STATIC_ITEMS 170 +#define IDC_IGUI_WEAPON_GPS_PLAYER 171 +#define IDC_IGUI_WEAPON_GPS_TARGET 172 +#define IDC_IGUI_WEAPON_ARTI_DIST 173 +#define IDC_IGUI_WEAPON_ARTI_TIME 174 +#define IDC_IGUI_WEAPON_ARTI_ELEV 175 +#define IDC_IGUI_WEAPON_ARTI_ELEV_NEED 176 +#define IDC_IGUI_WEAPON_ARTI_OUT_RANGE 177 +#define IDC_IGUI_WEAPON_ARTI_AUTO_ELEV 178 +#define IDC_IGUI_WEAPON_VISION_MODE2 179 +#define IDC_IGUI_WEAPON_OPTICS_ZOOM 180 +#define IDC_IGUI_WEAPON_TARGET_UNIT 181 +#define IDC_IGUI_WEAPON_OPTICS_PITCH 182 +#define IDC_IGUI_WEAPON_DISTANCE2 183 + +// unit info (to preserve order) - new A3 +#define IDC_IGUI_AMMOCOUNT 184 +#define IDC_IGUI_MAGCOUNT 185 + +#define IDC_IGUI_DEPTH 186 +#define IDC_IGUI_WEAPON_MODE_TEXTURE 187 +#define IDC_IGUI_WEAPON_SPEED 188 +#define IDC_IGUI_WEAPON_ALT 189 +#define IDC_IGUI_WEAPON_TIME 190 + +#define IDC_IGUI_WEAPON_CAM_TRACK_AREA 194 +#define IDC_IGUI_WEAPON_CAM_TRACK_TARGET 195 + +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_FROM_TOP 196 +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_DIRECT 197 + +#define IDC_IGUI_WEAPON_LASED_DISTANCE 198 +#define IDC_IGUI_WEAPON_LASED_SPEED 199 +#define IDC_IGUI_WEAPON_LASED_VALID 200 +#define IDC_IGUI_WEAPON_LASED_ERR_LEAD 201 +#define IDC_IGUI_WEAPON_LASED_ERR_ELEV 202 +#define IDC_IGUI_WEAPON_LASED_ERR_OBJECT 203 +#define IDC_IGUI_WEAPON_LASER_ZEROING_DELAY 204 + +#define IDC_IGUI_THROTTLE 205 +#define IDC_IGUI_VEHICLE_DIRECTION 206 +#define IDC_IGUI_VEHICLE_DIRECTION2 207 + + + + + +// helicopter unit info +#define IDC_IGUI_GMETER 501 +#define IDC_IGUI_RADARALTIMETER 505 +#define IDC_IGUI_RADARALTIMETER_BAR 506 +#define IDC_IGUI_RADARALTIMETER_VALUE 507 +#define IDC_IGUI_TORQUE 510 +#define IDC_IGUI_WINDINDICATOR 515 +#define IDC_IGUI_WINDINDICATOR_TEXT 516 +#define IDC_IGUI_WINDINDICATOR_IMAGE 517 +#define IDC_IGUI_STABILITYINDICATOR 520 +#define IDC_IGUI_STABILITYINDICATOR_AXIS 521 +#define IDC_IGUI_STABILITYINDICATOR_OFFSET 522 +#define IDC_IGUI_COLLECTIVE 525 +#define IDC_IGUI_AIRSPEEDINDICATOR 530 +#define IDC_IGUI_AIRSPEEDINDICATOR_AXIS 531 +#define IDC_IGUI_AIRSPEEDINDICATOR_VALUE 532 +#define IDC_IGUI_ALTIMETER 535 +#define IDC_IGUI_ALTIMETER_AXIS 536 +#define IDC_IGUI_ALTIMETER_VALUE 537 +#define IDC_IGUI_ATTITUDEINDICATOR 540 +#define IDC_IGUI_ATTITUDEINDICATOR_LITE 541 +#define IDC_IGUI_TRIMINDICATOR 545 +#define IDC_IGUI_AUTOHOVERNDICATOR 546 +#define IDC_IGUI_HELIHUD_MISCELLANEOUS 550 + +// helicopter Analogue unit info +#define IDC_IGUI_ANALOGUE_SPEED 601 +#define IDC_IGUI_ANALOGUE_SPEED_NEEDLE 602 +#define IDC_IGUI_ANALOGUE_SPEED_MIN 603 +#define IDC_IGUI_ANALOGUE_SPEED_MAX 604 +#define IDC_IGUI_ANALOGUE_SPEED_TEXT 605 +#define IDC_IGUI_ANALOGUE_SPEED_IMPERIAL 606 +#define IDC_IGUI_ANALOGUE_SPEED_METRIC 607 + +#define IDC_IGUI_ANALOGUE_ALTITUDE 611 +#define IDC_IGUI_ANALOGUE_ALTITUDE_NEEDLE 612 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MIN 613 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MAX 614 +#define IDC_IGUI_ANALOGUE_ALTITUDE_TEXT 615 +#define IDC_IGUI_ANALOGUE_ALTITUDE_IMPERIAL 616 +#define IDC_IGUI_ANALOGUE_ALTITUDE_METRIC 617 + +#define IDC_IGUI_ANALOGUE_ATTITUDE 621 +#define IDC_IGUI_ANALOGUE_ATTITUDE_HORIZON 622 +#define IDC_IGUI_ANALOGUE_ATTITUDE_VALUE 623 + +#define IDC_IGUI_ANALOGUE_COMPASS 631 +#define IDC_IGUI_ANALOGUE_COMPASS_DIR 632 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND 633 +#define IDC_IGUI_ANALOGUE_COMPASS_WAYPOINT 634 +#define IDC_IGUI_ANALOGUE_COMPASS_MIN 635 +#define IDC_IGUI_ANALOGUE_COMPASS_MAX 636 +#define IDC_IGUI_ANALOGUE_COMPASS_TEXT 637 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND_TEXT 638 + +#define IDC_IGUI_ANALOGUE_STABILITY 641 +#define IDC_IGUI_ANALOGUE_STABILITY_SPEED 642 +#define IDC_IGUI_ANALOGUE_STABILITY_TEXT 643 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED_NEEDLE 644 +#define IDC_IGUI_ANALOGUE_STABILITY_COLLECTIVE 645 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED 646 +#define IDC_IGUI_ANALOGUE_STABILITY_IMPERIAL 647 +#define IDC_IGUI_ANALOGUE_STABILITY_METRIC 648 + +//damage +#define IDC_IGUI_DAMAGE_GROUP 660 +#define IDC_IGUI_DAMAGE_ENGINESRPM 662 +#define IDC_IGUI_DAMAGE_ENGINESDAMAGE 663 +#define IDC_IGUI_DAMAGE_TORQUE 664 +#define IDC_IGUI_DAMAGE_ELECTRICITY 665 +#define IDC_IGUI_DAMAGE_FUEL 666 +#define IDC_IGUI_DAMAGE_HYDRAULICS 667 +#define IDC_IGUI_DAMAGE_MAINROTOR 668 +#define IDC_IGUI_DAMAGE_TAILROTOR 669 +#define IDC_IGUI_DAMAGE_AUTOHOVER 670 +#define IDC_IGUI_DAMAGE_INSTALLATIONS 671 +#define IDC_IGUI_DAMAGE_HULL 672 +#define IDC_IGUI_DAMAGE_WHEELBRAKE 673 +#define IDC_IGUI_DAMAGE_ROTORBRAKE 674 +#define IDC_IGUI_DAMAGE_WINCH 675 +#define IDC_IGUI_DAMAGE_GEAR 676 + +// - hint +#define IDC_IGHINT_BG 101 +#define IDC_IGHINT_HINT 102 + +// - task hint +#define IDC_IGTASKHINT_BG 103 +#define IDC_IGTASKHINT_HINT 104 + +// - load mission progress bar +#define IDC_LOAD_MISSION_NAME 101 +#define IDC_LOAD_MISSION_DATE 102 +#define IDC_PROGRESS_TIME 103 +#define IDC_PROGRESS_PROGRESS 104 +#define IDC_LOAD_MISSION_PICTURE 105 +#define IDC_LOAD_MISSION_TEXT 106 + +// - dedicated server dialog +#define IDC_DS_REPORT 101 +#define IDC_DS_PLAYERS 102 +#define IDC_DS_FRIENDS 103 + +// - friend's missions dialog +#define IDC_FRIEND_MISSIONS_LIST 101 + +// - live statistics dialogs +#define IDC_LIVE_STATS_BOARDS 101 + +#define IDC_LIVE_STATS_LIST 101 +#define IDC_LIVE_STATS_COUNT 102 +#define IDC_LIVE_STATS_TITLE 103 +#define IDC_LIVE_STATS_PLAYER 104 +#define IDC_LIVE_STATS_BEGIN 105 +#define IDC_LIVE_STATS_END 106 +#define IDC_LIVE_STATS_PREV 107 +#define IDC_LIVE_STATS_NEXT 108 +#define IDC_LIVE_STATS_FRIENDS 109 +#define IDC_LIVE_STATS_GAMER_CARD 110 + +#define IDC_RECEIVING_TEXT 101 +#define IDC_RECEIVING_TIME 102 + +#define IDC_MSG_BOX_MESSAGE 101 + +#define IDC_EDITOR_OBJECTS 201 +#define IDC_EDITOR_ATTRIBUTES 202 +#define IDC_EDITOR_BACKGROUND 203 +#define IDC_EDITOR_MENU 204 +#define IDC_EDITOR_SAVE 205 +#define IDC_EDITOR_LOAD 206 +#define IDC_EDITOR_RESTART 207 +#define IDC_EDITOR_PREVIEW 208 +#define IDC_EDITOR_MAP 209 +#define IDC_EDITOR_CLEAR 210 +#define IDC_EDITOR_TYPE_LIST 211 + +// editor menu system +#define IDC_EDITOR_FILE 212 +#define IDC_EDITOR_VIEW 213 +#define IDC_EDITOR_USER 214 +#define IDC_EDITOR_MENU_FILE 216 +#define IDC_EDITOR_MENU_VIEW 217 +#define IDC_EDITOR_MENU_USER 218 + +#define IDC_EDITOR_CONTROLS_HELP 220 +#define IDC_EDITOR_LOAD_AAR 221 + +#define IDC_EDITOR_ADDOBJ_TYPES 222 +#define IDC_EDITOR_ADDOBJ_CATEGORIES 223 +#define IDC_EDITOR_ADDOBJ_LISTING 224 + +#define IDC_MINI_MAP 225 + +// editor tree filtering +#define IDC_EDITOR_OBJECTS_FILTER 236 +#define IDC_EDITOR_TREE_EXPAND_ALL 237 +#define IDC_EDITOR_TREE_EXPAND_ALL_BACK 238 +#define IDC_EDITOR_TREE_COLLAPSE_ALL 239 +#define IDC_EDITOR_TREE_COLLAPSE_ALL_BACK 240 + +#define IDC_EDIT_OBJECT_CONTROLS 101 +#define IDC_EDIT_OBJECT_TOGGLE_BUTTON 102 + +#define IDC_NEW_OBJECT_TYPE 101 +#define IDC_NEW_OBJECT_PARENT 102 + +#define IDC_MISSION_LOAD_ISLAND 101 +#define IDC_MISSION_LOAD_MISSION 102 + +#define IDC_MISSION_SAVE_MISSION 101 +#define IDC_MISSION_SAVE_TITLE 102 +#define IDC_MISSION_SAVE_DESCRIPTION 103 +#define IDC_MISSION_SAVE_PLACEMENT 104 + +#define IDC_OVERLAY_CREATE_NAME 101 +#define IDC_OVERLAY_LOAD_NAME 101 +#define IDC_OVERLAY_LOAD_MISSION 102 + +#define IDC_EDIT_DIARY_RECORD 101 +#define IDC_EDIT_DIARY_TITLE 102 + +#define IDC_LOAD_AAR_NAME 101 + +#define IDC_EDITOR_EB_PLAN 101 +#define IDC_EDITOR_EB_NOTES 102 +#define IDC_EDITOR_EB_SIDE 103 +#define IDC_EDITOR_EB_OBJECTIVES 104 +#define IDC_EDITOR_EB_NEW_OBJECTIVE 105 +#define IDC_EDITOR_EB_ADD_OBJECTIVE 106 +#define IDC_EDITOR_EB_DEL_OBJECTIVE 107 + +// - team switch display + +#define IDC_TEAM_SWITCH_ROLES 101 + +// - configure action display + +#define IDC_CONFIGURE_ACTION_TITLE 101 +#define IDC_CONFIGURE_ACTION_KEYS 102 +#define IDC_CONFIGURE_ACTION_SPECIAL 103 +#define IDC_CONFIGURE_ACTION_DELETE 104 +#define IDC_CONFIGURE_ACTION_DEFAULT 105 +#define IDC_CONFIGURE_ACTION_CLEAR 106 +#define IDC_CONFIGURE_ACTION_CANCEL 107 +#define IDC_CONFIGURE_ACTION_PREV 108 +#define IDC_CONFIGURE_ACTION_NEXT 109 + +// - controls display +#define IDC_CONTROLS_TYPE 101 +#define IDC_CONTROLS_CONFIGURE 102 + +// - miniMap display + +#define IDC_MINIMAP 101 +#define IDC_MINIMAP_VIEWPORT 102 +#define IDC_MINIMAP_GRID 197 +#define IDC_MINIMAP_HEADING 198 +#define IDC_MINIMAP_TIME 199 + + +// - scripting help display +#define IDC_SCRITING_HELP 101 +#define IDC_SCRITING_HELP_BACK 102 +#define IDC_SCRITING_HELP_FORWARD 103 +#define IDC_SCRITING_HELP_EXAMPLE 104 + +// - performance display +#define IDC_PERF_INDEX 101 +#define IDC_PERF_ENABLE 102 +#define IDC_PERF_GRAPH 103 +#define IDC_PERF_GRAPH_TITLE 104 +#define IDC_PERF_MAXTIME 105 + +// - capture display +#define IDC_CAPTURE_INDEX 101 +#define IDC_CAPTURE_TIMELINES 102 +#define IDC_CAPTURE_ZOOMIN 103 +#define IDC_CAPTURE_ZOOMOUT 104 +#define IDC_CAPTURE_EXPORT 105 +#define IDC_CAPTURE_INFO 106 +#define IDC_CAPTURE_EXPORT_ALL 107 +#define IDC_CAPTURE_IMPORT_ALL 108 +#define IDC_CAPTURE_PREVIOUS_DATA 109 +#define IDC_CAPTURE_AVERAGES 110 +#define IDC_CAPTURE_SAVE_ARCHIVE 111 +#define IDC_CAPTURE_SEARCH 112 + + +// - joysticks configuration display +#define IDC_CONTROLLER_CUSTOMIZE 101 +#define IDC_CONTROLLER_ENABLE 102 +#define IDC_CONTROLLER_XINPUT_LIST 103 +#define IDC_CONTROLLER_LIST 104 +#define IDC_CONTROLLER_REFRESH 105 + +// - customize controllers +#define IDC_CUSTOMIZE_CTRL_SENSITIVITIES 101 +#define IDC_CUSTOMIZE_CTRL_UNMAP 102 +#define IDC_CUSTOMIZE_CTRL_DEFAULT 103 +#define IDC_CUSTOMIZE_CTRL_TITLE 104 +#define IDC_CUSTOMIZE_CTRL_DEFAULT_BINDING 105 +#define IDC_CUSTOMIZE_CTRL_ADVANCED 106 +#define IDC_SENSITIVITY_SLIDER 120 +#define IDC_DEADZONE_SLIDER 220 +#define IDC_CUSTOMIZE_CTRL_ACTIVE_AXIS_ICON 320 +#define IDC_CUSTOMIZE_CTRL_STEEPNESS 420 +#define IDC_CUSTOMIZE_CTRL_VALUE 520 + +// - joystick schemes +#define IDC_JOY_SCHEMES_TITLE 101 +#define IDC_JOY_SCHEMES_LIST 102 +#define IDC_JOY_SCHEMES_MAP 103 + +// - helper IDC for DisplayCampaignLoadLight +#define IDC_MP_CAMPAIGN_RESTART 150 +#define IDC_MP_CAMPAIGN_REPLAY 151 +#define IDC_MP_CAMPAIGN_LOAD 152 + +// - addon actions display +#define IDC_ADDON_ACTIONS 101 +#define IDC_ADDON_ACTIONS_NEW_MOD 102 + +// - mod launcher +#define IDC_MOD_LAUNCHER_MODS 101 +#define IDC_MOD_LAUNCHER_PICTURE 102 +#define IDC_MOD_LAUNCHER_UP 103 +#define IDC_MOD_LAUNCHER_DOWN 104 +#define IDC_MOD_LAUNCHER_DISABLE 105 +#define IDC_MOD_LAUNCHER_ACTION 106 +#define IDC_MOD_LAUNCHER_PURCHASE 107 +#define IDC_MOD_LAUNCHER_DESCRIPTION 108 + +// - create new mod +#define IDC_MOD_NAME 101 +#define IDC_MOD_DIR 102 + + +//A3 credits +#define ONBUTTONCLICK_START_CREDITS "0 = _this spawn (uinamespace getvariable 'bis_fnc_credits');" + + +// Hitzone types +#define HZ_AIRPLANE_HULL 0 +#define HZ_AIRPLANE_ENG 22 +#define HZ_AIRPLANE_FUEL 23 +#define HZ_AIRPLANE_GEAR 24 +#define HZ_AIRPLANE_WINGS 25 +#define HZ_AIRPLANE_INST 26 + +#define HZ_HELICOPTER_HULL 1 +#define HZ_HELICOPTER_ENG 2 +#define HZ_HELICOPTER_INST 3 +#define HZ_HELICOPTER_ATRQ 4 +#define HZ_HELICOPTER_MROT 5 +#define HZ_HELICOPTER_WINCH 6 + +#define HZ_CAR_HULL 7 +#define HZ_CAR_ENG 8 +#define HZ_CAR_FUEL 9 +#define HZ_CAR_WHL 10 + +#define HZ_MOTORCYCLE_HULL 11 +#define HZ_MOTORCYCLE_ENG 12 +#define HZ_MOTORCYCLE_FUEL 13 +#define HZ_MOTORCYCLE_WHL 14 + +#define HZ_TANK_HULL 15 +#define HZ_TANK_ENG 16 +#define HZ_TANK_GUN 17 +#define HZ_TANK_LTR 18 +#define HZ_TANK_RTR 19 +#define HZ_TANK_TRRT 20 + +#define HZ_VEH_GUN HZ_TANK_GUN +#define HZ_VEH_TRRT HZ_TANK_TRRT + +#define HZ_SHIP_ENG 21 + +#define HZ_VEH_TOTAL 27 + +#define HZ_TANK_CMDGUN 28 +#define HZ_TANK_CMDTRRT 29 +#define HZ_VEH_CMDGUN HZ_TANK_CMDGUN +#define HZ_VEH_CMDTRRT HZ_TANK_CMDTRRT + +#define HZ_VEH_TRRT_TOTAL 30 +#define HZ_VEH_CMDTRRT_TOTAL 31 + +#define HZ_TANK_BOTH_TRACKS 32 diff --git a/include/a3/ui_f/hpp/defineResinclDesign.inc b/include/a3/ui_f/hpp/defineResinclDesign.inc new file mode 100644 index 0000000000..0c669371e9 --- /dev/null +++ b/include/a3/ui_f/hpp/defineResinclDesign.inc @@ -0,0 +1,1063 @@ +#define IDC_SEARCH 645 +#define IDC_SEARCH_BUTTON 646 + +//--- RscDisplayMain +#define IDC_MAIN_GAMEMODES 201 +#define IDC_MAIN_MP_SCENARIOS 202 +#define IDC_MAIN_ARSENAL 203 +#define IDC_MAIN_COMMUNITYGUIDES 204 +#define IDC_MAIN_PROFILE 205 +#define IDC_MAIN_CAMPAIGN_MP 206 + +#define IDC_MAIN_MOUSEAREA 999 +#define IDC_MAIN_BACKGROUND_PICTURE 998 +#define IDC_MAIN_BACKGROUND_BLACK 997 + +#define IDC_MAIN_GROUP_SINGLEPLAYER 1001 +#define IDC_MAIN_GROUP_MULTIPLAYER 1002 +#define IDC_MAIN_GROUP_TUTORIALS 1003 +#define IDC_MAIN_GROUP_OPTIONS 1004 +#define IDC_MAIN_GROUP_SESSION 1005 + +#define IDC_MAIN_TITLE_SINGLEPLAYER 1011 +#define IDC_MAIN_TITLE_MULTIPLAYER 1012 +#define IDC_MAIN_TITLE_TUTORIALS 1013 +#define IDC_MAIN_TITLE_OPTIONS 1014 +#define IDC_MAIN_TITLE_SESSION 1015 + +#define IDC_MAIN_TITLEICON_SINGLEPLAYER 1111 +#define IDC_MAIN_TITLEICON_MULTIPLAYER 1112 +#define IDC_MAIN_TITLEICON_TUTORIALS 1113 +#define IDC_MAIN_TITLEICON_OPTIONS 1114 +#define IDC_MAIN_TITLEICON_SESSION 1115 + +#define IDC_MAIN_SPOTLIGHT_GROUP_1 1020 +#define IDC_MAIN_SPOTLIGHT_GROUP_2 1021 +#define IDC_MAIN_SPOTLIGHT_GROUP_3 1022 +#define IDC_MAIN_SPOTLIGHT_PICTURE 1023 +#define IDC_MAIN_SPOTLIGHT_VIDEO 1024 +#define IDC_MAIN_SPOTLIGHT_HOVER 1025 +#define IDC_MAIN_SPOTLIGHT_BUTTON 1026 +#define IDC_MAIN_SPOTLIGHT_ACTION 1027 +#define IDC_MAIN_SPOTLIGHT_TEXT 1028 +#define IDC_MAIN_SPOTLIGHT_TEXTBCG 1029 + +#define IDC_MAIN_SPOTLIGHT_PREV 1060 +#define IDC_MAIN_SPOTLIGHT_NEXT 1061 + +#define IDC_MAIN_INFO_MODS 1030 +#define IDC_MAIN_INFO_DLCS 1031 +#define IDC_MAIN_INFO_DLCSOWNED 10311 +#define IDC_MAIN_INFO_NEWS 1032 +#define IDC_MAIN_INFO_VERSION 1033 + +#define IDC_MAIN_INFO_BACKGROUND 1034 +#define IDC_MAIN_INFO_BACKGROUND_ICON 1035 +#define IDC_MAIN_INFO_ICON 1036 +#define IDC_MAIN_INFO_BUTTON 1037 +#define IDC_MAIN_INFO_BUTTON_DEV 1038 +#define IDC_MAIN_INFO_NOTIFICATION 1039 + +#define IDC_MAIN_VERSION_DEV 1050 + +#define BARCOLOR 0, 0, 0, 0.75 +#define INFO_BACKGROUND_COLOR BARCOLOR +#define INFO_ICON_COLOR 1, 1, 1, 0.5 + +//--- RscDisplayDebug +#define IDC_RSCDISPLAYDEBUG_DESIGNHTML 11735 +#define IDC_RSCDISPLAYDEBUG_TEXTEXPRESSION 11736 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR1 11737 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR2 11738 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR3 11739 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR4 11740 +#define IDC_RSCDISPLAYDEBUG_TEXTWATCH 11741 +#define IDC_RSCDISPLAYDEBUG_DIAGTEXT 11747 +#define IDC_RSCDISPLAYDEBUG_DRAWTEXT 11748 +#define IDC_RSCDISPLAYDEBUG_CA_TITLE 11838 +#define IDC_RSCDISPLAYDEBUG_CA_PLAYER 12145 +#define IDC_RSCDISPLAYDEBUG_CA_VERSION 12146 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST 12236 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST_SEARCH 12238 +#define IDC_RSCDISPLAYDEBUG_DRAWLIST 12237 +#define IDC_RSCDISPLAYDEBUG_DIAGFRAME 12535 +#define IDC_RSCDISPLAYDEBUG_DRAWFRAME 12536 +#define IDC_RSCDISPLAYDEBUG_FRAMELOG 12537 +#define IDC_RSCDISPLAYDEBUG_G_EXPRESSION 13035 +#define IDC_RSCDISPLAYDEBUG_G_DIAG 13036 +#define IDC_RSCDISPLAYDEBUG_G_DESIGN 13037 +#define IDC_RSCDISPLAYDEBUG_G_WATCH 13038 +#define IDC_RSCDISPLAYDEBUG_G_DRAW 13039 +#define IDC_RSCDISPLAYDEBUG_DIAGBUTTON 13138 +#define IDC_RSCDISPLAYDEBUG_DRAWBUTTON 13139 +#define IDC_RSCDISPLAYDEBUG_DEBUGFLOW 13140 +#define IDC_RSCDISPLAYDEBUG_DEBUGANIM 13141 +#define IDC_RSCDISPLAYDEBUG_B_CAMERANEW 13142 +#define IDC_RSCDISPLAYDEBUG_CREATEJIRAISSUE 13143 +#define IDC_RSCDISPLAYDEBUG_DEBUGGUI 13144 +#define IDC_RSCDISPLAYDEBUG_DEBUGFUNCTIONS 13145 +#define IDC_RSCDISPLAYDEBUG_DEBUGCONFIG 13154 +#define IDC_RSCDISPLAYDEBUG_B_CAMERA 13155 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT1 13157 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT2 13158 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT3 13159 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT4 13160 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT5 13161 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT6 13163 +#define IDC_RSCDISPLAYDEBUG_DEBUGCAPTURE 13164 + +//--- RscDisplayAnimViewer +#define IDC_RSCDISPLAYANIMVIEWER_TITLE 1000 +#define IDC_RSCDISPLAYANIMVIEWER_BACKGROUND 1001 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTACTION 1002 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTPOSE 1003 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTMOVEMENT 1004 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTSTANCE 1005 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTITEM 1006 +#define IDC_RSCDISPLAYANIMVIEWER_DESCRIPTION 1100 +#define IDC_RSCDISPLAYANIMVIEWER_MISC 1500 +#define IDC_RSCDISPLAYANIMVIEWER_ACTION 2100 +#define IDC_RSCDISPLAYANIMVIEWER_POSE 2101 +#define IDC_RSCDISPLAYANIMVIEWER_MOVEMENT 2102 +#define IDC_RSCDISPLAYANIMVIEWER_STANCE 2103 +#define IDC_RSCDISPLAYANIMVIEWER_ITEM 2104 +#define IDC_RSCDISPLAYANIMVIEWER_SOLDIER 2106 +#define IDC_RSCDISPLAYANIMVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYANIMVIEWER_MOUSEAREA 999 +#define IDC_RSCDISPLAYANIMVIEWER 1320 + +//--- RscDisplayFunctionsViewer +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEBACKGROUND 1000 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDLEFT 1001 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDRIGHT 1002 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDMETA 1003 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLETEXT 1004 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_AUTHOR 1005 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODESTRUCTURED 1100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEICON 1200 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODE 1400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_NAME 1401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_FUNCTIONS 1500 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_SOURCES 2100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TAGS 2101 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CATEGORIES 2102 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_PREVIEW 2300 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_ALL 2400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_SELECTED 2401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYFUNCTIONSVIEWER 1321 + +//--- Loading +#define IDC_LOADING_MAPBACKTOP 1000 +#define IDC_LOADING_MAPNAME 1001 +#define IDC_LOADING_MAPAUTHOR 1002 +#define IDC_LOADING_MAPBACKBOTTOM 1003 +#define IDC_LOADING_MISSIONBACKGROUNDTOP 1005 +#define IDC_LOADING_MISSIONNAME 1006 +#define IDC_LOADING_MISSIONAUTHOR 1007 +#define IDC_LOADING_PROGRESSMAP 1008 +#define IDC_LOADING_DISCLAIMERNAME 1009 +#define IDC_LOADING_MISSIONPICTUREBACK 1010 +#define IDC_LOADING_MISSIONGAMETYPE 1012 +#define IDC_LOADING_PROGRESSMISSION 1013 +#define IDC_LOADING_MISSIONDESCRIPTION 1100 +#define IDC_LOADING_DISCLAIMERDESCRIPTION 1101 +#define IDC_LOADING_MAPDESCRIPTION 1102 +#define IDC_LOADING_MISSION 2300 +#define IDC_LOADING_DISCLAIMER 2301 +//--- Loading - DLC part +#define IDC_LOADING_DLCNAME 3207 +#define IDC_LOADING_DLCAUTHOR 3208 +#define IDC_LOADING_DLCPICTUREBACK 3209 +#define IDC_LOADING_DLCDESCRIPTION 3296 +#define IDC_LOADING_DLCPICTURE 3393 +#define IDC_LOADING_DLCSTRIPE 3395 +#define IDC_LOADING_DLCICON 3396 + +#define IDC_LOADING_MAP 999 + +//--- LoadingStart +#define IDC_LOADINGSTART_BLACK 1000 +#define IDC_LOADINGSTART_LOGO 1200 +#define IDC_LOADINGSTART_NOISE 1201 +#define IDC_LOADINGSTART_LOADINGSTART 2310 + +//--- RscDisplayDebriefing +#define IDC_RSCDISPLAYDEBRIEFING_LISTGROUP 21903 //Defined manually +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE 21904 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBACKGROUND 20594 +#define IDC_RSCDISPLAYDEBRIEFING_MAINBACKGROUND 20595 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBACKGROUND 20596 +#define IDC_RSCDISPLAYDEBRIEFING_PLAYERNAME 20599 +#define IDC_RSCDISPLAYDEBRIEFING_TITLE 20600 +#define IDC_RSCDISPLAYDEBRIEFING_SUBTITLE 20601 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVESBACKGROUND 20602 +#define IDC_RSCDISPLAYDEBRIEFING_STATBACKGROUND 20603 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONBACKGROUND 20604 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBACKGROUND 20605 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGTEXT 20606 +#define IDC_RSCDISPLAYDEBRIEFING_RATING 20607 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBEST 20608 +#define IDC_RSCDISPLAYDEBRIEFING_TIMETEXT 20609 +#define IDC_RSCDISPLAYDEBRIEFING_TIME 20610 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBEST 20611 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSTEXT 20612 +#define IDC_RSCDISPLAYDEBRIEFING_LOADS 20613 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBEST 20614 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWBACKGROUND 20615 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWTEXT 20616 +#define IDC_RSCDISPLAYDEBRIEFING_DLCCOUNTDOWN 20617 +#define IDC_RSCDISPLAYDEBRIEFING_TABSBACKGROUND 20618 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBAR 20619 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONTEXT 20693 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOMTEXT 20694 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE1 20696 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE2 20697 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE3 20698 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE4 20699 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE5 20700 +#define IDC_RSCDISPLAYDEBRIEFING_PICTURE 20793 +#define IDC_RSCDISPLAYDEBRIEFING_MISSIONPICTURE 20794 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWPICTURE 20795 +#define IDC_RSCDISPLAYDEBRIEFING_DLCLOCKICON 20798 +#define IDC_RSCDISPLAYDEBRIEFING_SECTION 21093 +#define IDC_RSCDISPLAYDEBRIEFING_SUMMARY 21893 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTION 21894 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVES 21895 +#define IDC_RSCDISPLAYDEBRIEFING_STAT 21896 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOM 21897 +#define IDC_RSCDISPLAYDEBRIEFING_DATA 21898 +#define IDC_RSCDISPLAYDEBRIEFING_SIDES 21899 +#define IDC_RSCDISPLAYDEBRIEFING_DLCGENERALGROUP 21900 +#define IDC_RSCDISPLAYDEBRIEFING_LOAC 21901 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONALLASSETS 21995 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONKARTS 21996 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONHELI 21997 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONMARKSMEN 21998 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONAPEX 22000 + +//--- RscDisplayDebriefing - DLC item template +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUND 20623 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUNDBLACK 20624 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMNAME 20625 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTSESSIONTIME 20626 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMSESSIONTIME 20627 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTTOTALTIME 20628 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTOTALTIME 20629 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDESCRIPTION 20630 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMPICTURE 20796 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDLCLOGO 20797 +#define IDC_RSCDISPLAYDEBRIEFING_RSCDISPLAYDEBRIEFING_ITEMTEMPLATE 21902 +#define IDC_RSCDISPLAYDEBRIEFING_BUTTONPURCHASE 21999 + +//--- RscDisplayDebriefing_LOACTemplate +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_BACKGROUND 52605 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TITLE 52705 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXT 52706 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_PICTURE 52805 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXTGROUP 53905 + + +//--- RscDebugConsole +#define IDC_RSCDEBUGCONSOLE_TITLE 11884 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONBACKGROUND 11885 +#define IDC_RSCDEBUGCONSOLE_WATCHBACKGROUND 11886 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND1 11887 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND2 11888 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND3 11889 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND4 11890 +#define IDC_RSCDEBUGCONSOLE_LINK 11891 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONTEXT 11892 +#define IDC_RSCDEBUGCONSOLE_WATCHTEXT 11893 +#define IDC_RSCDEBUGCONSOLE_EXPRESSION 12284 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT1 12285 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT1 12286 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT2 12287 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT2 12288 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT3 12289 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT3 12290 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT4 12291 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT4 12293 +#define IDC_RSCDEBUGCONSOLE_RSCDEBUGCONSOLE 13184 +#define IDC_RSCDEBUGCONSOLE_BUTTONCODEPERFORMANCE 13284 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTEALL 13285 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTESERVER 13286 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPECTATORCAMERA 13287 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPLENDIDCAMERA 13288 +#define IDC_RSCDEBUGCONSOLE_BUTTONFUNCTIONS 13289 +#define IDC_RSCDEBUGCONSOLE_BUTTONCONFIG 13290 +#define IDC_RSCDEBUGCONSOLE_BUTTONANIMATIONS 13291 +#define IDC_RSCDEBUGCONSOLE_BUTTONGUI 13292 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTELOCAL 13484 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUT 13190 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUTBACKGROUND 13191 + + + +//--- RscDisplayOptionsLayout +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TITLE 1000 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BACKGROUND 1001 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGSTEXT 1002 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETSLABEL 1003 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_MOUSEAREA 1004 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERW 1005 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERH 1006 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TOOLTIP 1100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGS 2100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETS 2101 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONSAVE 2400 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONOK 2600 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONCANCEL 2700 + +//--- RscDisplayRespawn +#define IDC_RSCDISPLAYRESPAWN_TITLE 1000 +#define IDC_RSCDISPLAYRESPAWN_LISTBACKGROUND 1001 +#define IDC_RSCDISPLAYRESPAWN_SECTION 1002 +#define IDC_RSCDISPLAYRESPAWN_BLACK 1003 +#define IDC_RSCDISPLAYRESPAWN_CONTENTBACKGROUND 1004 +#define IDC_RSCDISPLAYRESPAWN_BLACKCONTENT 1005 +#define IDC_RSCDISPLAYRESPAWN_PLAYERSNAME 1006 +#define IDC_RSCDISPLAYRESPAWN_CONTENT 1100 +#define IDC_RSCDISPLAYRESPAWN_LIST 1500 +#define IDC_RSCDISPLAYRESPAWN_CONTENTGROUP 2300 +#define IDC_RSCDISPLAYRESPAWN_BUTTONOK 2600 +#define IDC_RSCDISPLAYRESPAWN_BUTTONCANCEL 2700 + +#define IDC_RSCDISPLAYRESPAWN_MAP 1050 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 1000 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 1002 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 1003 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 1004 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 1200 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 1201 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 1202 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 1203 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 1204 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 1205 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 2300 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 2600 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 2700 + +//--- RscSpectator +#define IDC_RSCSPECTATOR_PLAYERNAMEBACKGROUND 1000 +#define IDC_RSCSPECTATOR_PLAYERGROUP 1001 +#define IDC_RSCSPECTATOR_PLAYERNAME 1002 +#define IDC_RSCSPECTATOR_PLAYERDESCRIPTION 1100 +#define IDC_RSCSPECTATOR_PLAYERICON 1200 +#define IDC_RSCSPECTATOR_PLAYER 2300 + +//--- RscMissionEnd +#define IDC_RSCMISSIONEND_TITLE 8942 +#define IDC_RSCMISSIONEND_SUBTITLE 8943 +#define IDC_RSCMISSIONEND_SIDE1 9045 +#define IDC_RSCMISSIONEND_SIDE2 9046 +#define IDC_RSCMISSIONEND_SIDE3 9047 +#define IDC_RSCMISSIONEND_SIDE4 9048 +#define IDC_RSCMISSIONEND_SIDE5 9049 +#define IDC_RSCMISSIONEND_PICTURE 9142 +#define IDC_RSCMISSIONEND_SIDES 10248 + +//--- RscNotification +#define IDC_RSCNOTIFICATION_TITLE 12135 +#define IDC_RSCNOTIFICATION_PICTUREBACKGROUND 12136 +#define IDC_RSCNOTIFICATION_SCORE 12137 +#define IDC_RSCNOTIFICATION_DESCRIPTIONBACKGROUND 12138 +#define IDC_RSCNOTIFICATION_DESCRIPTION 12235 +#define IDC_RSCNOTIFICATION_PICTURE 12335 +#define IDC_RSCNOTIFICATION_NOTIFICATION 13435 + +#define IDC_RSCNOTIFICATION_NOTIFICATIONAREA 312 + +//--- RscCommMenuItems +#define IDC_RSCCOMMMENUITEMS_SLOT1BACKGROUND 1000 +#define IDC_RSCCOMMMENUITEMS_SLOT2BACKGROUND 1001 +#define IDC_RSCCOMMMENUITEMS_SLOT3BACKGROUND 1002 +#define IDC_RSCCOMMMENUITEMS_SLOT4BACKGROUND 1003 +#define IDC_RSCCOMMMENUITEMS_SLOT5BACKGROUND 1004 +#define IDC_RSCCOMMMENUITEMS_SLOT6BACKGROUND 1005 +#define IDC_RSCCOMMMENUITEMS_SLOT7BACKGROUND 1006 +#define IDC_RSCCOMMMENUITEMS_SLOT8BACKGROUND 1007 +#define IDC_RSCCOMMMENUITEMS_SLOT9BACKGROUND 1008 +#define IDC_RSCCOMMMENUITEMS_SLOT0BACKGROUND 1009 +#define IDC_RSCCOMMMENUITEMS_SLOT1TEXT 1010 +#define IDC_RSCCOMMMENUITEMS_SLOT1 1200 +#define IDC_RSCCOMMMENUITEMS_SLOT2 1201 +#define IDC_RSCCOMMMENUITEMS_SLOT3 1202 +#define IDC_RSCCOMMMENUITEMS_SLOT4 1203 +#define IDC_RSCCOMMMENUITEMS_SLOT5 1204 +#define IDC_RSCCOMMMENUITEMS_SLOT6 1205 +#define IDC_RSCCOMMMENUITEMS_SLOT7 1206 +#define IDC_RSCCOMMMENUITEMS_SLOT8 1207 +#define IDC_RSCCOMMMENUITEMS_SLOT9 1208 +#define IDC_RSCCOMMMENUITEMS_SLOT0 1209 +#define IDC_RSCCOMMMENUITEMS_SLOT2TEXT 1210 +#define IDC_RSCCOMMMENUITEMS_SLOT3TEXT 1211 +#define IDC_RSCCOMMMENUITEMS_SLOT4TEXT 1212 +#define IDC_RSCCOMMMENUITEMS_SLOT5TEXT 1213 +#define IDC_RSCCOMMMENUITEMS_SLOT6TEXT 1214 +#define IDC_RSCCOMMMENUITEMS_SLOT7TEXT 1215 +#define IDC_RSCCOMMMENUITEMS_SLOT8TEXT 1216 +#define IDC_RSCCOMMMENUITEMS_SLOT9TEXT 1217 +#define IDC_RSCCOMMMENUITEMS_SLOT0TEXT 1218 +#define IDC_RSCCOMMMENUITEMS_RSCCOMMMENUITEMS 2300 + +//--- RscRespawnCounter +#define IDC_RSCRESPAWNCOUNTER_MPTABLE 1000 +#define IDC_RSCRESPAWNCOUNTER_TITLE 1001 +#define IDC_RSCRESPAWNCOUNTER_TITLEBACKGROUND 1002 +#define IDC_RSCRESPAWNCOUNTER_PLAYERRESPAWNTIME 1003 +#define IDC_RSCRESPAWNCOUNTER_DESCRIPTION 1100 + +//--- RscFiringDrillTime +#define IDC_RSCFIRINGDRILLTIME_CURRENTBACKGROUND 1100 +#define IDC_RSCFIRINGDRILLTIME_BEST 1101 +#define IDC_RSCFIRINGDRILLTIME_PREVIOUS 1102 +#define IDC_RSCFIRINGDRILLTIME_BONUS 1103 +#define IDC_RSCFIRINGDRILLTIME_CURRENT 1104 +#define IDC_RSCFIRINGDRILLTIME_PENALTY 1105 +#define IDC_RSCFIRINGDRILLTIME_TIME 2300 + +//--- RscFiringDrillCheckpoint +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTBACKGROUND 1000 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETBACKGROUND 1001 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEBACKGROUND 1002 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONBACKGROUND 1003 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTTEXT 1004 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTTOTAL 1005 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTCURRENT 1006 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTPICTURE 1200 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEPICTURE 1201 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONPICTURE 1202 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETPICTURE 1203 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINT 2300 + +//--- RscAdvancedHint +#define IDC_RSCADVANCEDHINT_TITLE 11657 +#define IDC_RSCADVANCEDHINT_HINT 11757 +#define IDC_RSCADVANCEDHINT_HINTGROUP 12957 + +//--- RscSectorCapture +#define IDC_RSCSECTORCAPTURE_WEST 1001 +#define IDC_RSCSECTORCAPTURE_EAST 1002 +#define IDC_RSCSECTORCAPTURE_GUER 1003 +#define IDC_RSCSECTORCAPTURE_CIV 1004 +#define IDC_RSCSECTORCAPTURE_NAME 1005 +#define IDC_RSCSECTORCAPTURE_BACKGROUND 1200 +#define IDC_RSCSECTORCAPTURE_SECTORCAPTURE 2300 + +//--- RscMissionStatus +#define IDC_RSCMISSIONSTATUS_BARBRIDGE 13983 +#define IDC_RSCMISSIONSTATUS_BARWEST 13984 +#define IDC_RSCMISSIONSTATUS_BAREAST 13985 +#define IDC_RSCMISSIONSTATUS_BARGUER 13986 +#define IDC_RSCMISSIONSTATUS_BARCIV 13987 +#define IDC_RSCMISSIONSTATUS_BARUNKNOWN 13988 +#define IDC_RSCMISSIONSTATUS_SLOT1BACKGROUND 13989 +#define IDC_RSCMISSIONSTATUS_SLOT1PROGRESS 13990 +#define IDC_RSCMISSIONSTATUS_SLOT2BACKGROUND 13991 +#define IDC_RSCMISSIONSTATUS_SLOT2PROGRESS 13992 +#define IDC_RSCMISSIONSTATUS_SLOT3BACKGROUND 13993 +#define IDC_RSCMISSIONSTATUS_SLOT3PROGRESS 13994 +#define IDC_RSCMISSIONSTATUS_SLOT4BACKGROUND 13995 +#define IDC_RSCMISSIONSTATUS_SLOT4PROGRESS 13996 +#define IDC_RSCMISSIONSTATUS_SLOT5BACKGROUND 13997 +#define IDC_RSCMISSIONSTATUS_SLOT5PROGRESS 13998 +#define IDC_RSCMISSIONSTATUS_SLOT6BACKGROUND 13999 +#define IDC_RSCMISSIONSTATUS_SLOT6PROGRESS 14000 +#define IDC_RSCMISSIONSTATUS_SLOT7BACKGROUND 14001 +#define IDC_RSCMISSIONSTATUS_SLOT7PROGRESS 14002 +#define IDC_RSCMISSIONSTATUS_SLOT8BACKGROUND 14003 +#define IDC_RSCMISSIONSTATUS_SLOT8PROGRESS 14004 +#define IDC_RSCMISSIONSTATUS_SLOT9BACKGROUND 14005 +#define IDC_RSCMISSIONSTATUS_SLOT9PROGRESS 14006 +#define IDC_RSCMISSIONSTATUS_SLOT0BACKGROUND 14007 +#define IDC_RSCMISSIONSTATUS_SLOT0PROGRESS 14008 +#define IDC_RSCMISSIONSTATUS_SLOT1TEXT 14093 +#define IDC_RSCMISSIONSTATUS_SLOT2TEXT 14094 +#define IDC_RSCMISSIONSTATUS_SLOT3TEXT 14095 +#define IDC_RSCMISSIONSTATUS_SLOT4TEXT 14096 +#define IDC_RSCMISSIONSTATUS_SLOT5TEXT 14097 +#define IDC_RSCMISSIONSTATUS_SLOT6TEXT 14098 +#define IDC_RSCMISSIONSTATUS_SLOT7TEXT 14099 +#define IDC_RSCMISSIONSTATUS_SLOT8TEXT 14100 +#define IDC_RSCMISSIONSTATUS_SLOT9TEXT 14101 +#define IDC_RSCMISSIONSTATUS_SLOT0TEXT 14102 +#define IDC_RSCMISSIONSTATUS_SLOT1 14183 +#define IDC_RSCMISSIONSTATUS_SLOT2 14184 +#define IDC_RSCMISSIONSTATUS_SLOT3 14185 +#define IDC_RSCMISSIONSTATUS_SLOT4 14186 +#define IDC_RSCMISSIONSTATUS_SLOT5 14187 +#define IDC_RSCMISSIONSTATUS_SLOT6 14188 +#define IDC_RSCMISSIONSTATUS_SLOT7 14189 +#define IDC_RSCMISSIONSTATUS_SLOT8 14190 +#define IDC_RSCMISSIONSTATUS_SLOT9 14191 +#define IDC_RSCMISSIONSTATUS_SLOT0 14192 +#define IDC_RSCMISSIONSTATUS_RSCMISSIONSTATUS 15283 + +//--- RscFeedback +#define IDC_RSCFEEDBACK_RSCFEEDBACK 6455 + +//--- RscDisplayCommunityGuide +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_TITLE 29956 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_PLAYERSNAME 29957 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BRIEFINGNAME 29958 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_AUTHOR 29959 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWTEXT 30056 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWPICTURE 30156 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_GUIDELIST 30456 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWCONTROLSGROUP 31256 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONPLAY 31556 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONCANCEL 31656 + +//--- RscDisplayArsenal +#define IDC_RSCDISPLAYARSENAL_MOUSEAREA 899 +#define IDC_RSCDISPLAYARSENAL_MOUSEBLOCK 898 +#define IDC_RSCDISPLAYARSENAL_TABS 1800 +#define IDC_RSCDISPLAYARSENAL_FRAMELEFT 1801 +#define IDC_RSCDISPLAYARSENAL_FRAMERIGHT 1802 +#define IDC_RSCDISPLAYARSENAL_LINEICON 1803 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFT 1804 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFTSELECTED 1805 +#define IDC_RSCDISPLAYARSENAL_LINETABRIGHT 1806 +#define IDC_RSCDISPLAYARSENAL_ICON 900 +#define IDC_RSCDISPLAYARSENAL_ICONBACKGROUND 830 +#define IDC_RSCDISPLAYARSENAL_TAB 930 +#define IDC_RSCDISPLAYARSENAL_LIST 960 +#define IDC_RSCDISPLAYARSENAL_SORT 800 +#define IDC_RSCDISPLAYARSENAL_LISTDISABLED 860 +#define IDC_RSCDISPLAYARSENAL_LOAD 990 +#define IDC_RSCDISPLAYARSENAL_LOADCARGO 991 +#define IDC_RSCDISPLAYARSENAL_ARROWLEFT 992 +#define IDC_RSCDISPLAYARSENAL_ARROWRIGHT 993 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDLEFT 994 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDRIGHT 995 +#define IDC_RSCDISPLAYARSENAL_MESSAGE 996 + +#define IDC_RSCDISPLAYARSENAL_TAB_PRIMARYWEAPON 0 +#define IDC_RSCDISPLAYARSENAL_TAB_SECONDARYWEAPON 1 +#define IDC_RSCDISPLAYARSENAL_TAB_HANDGUN 2 +#define IDC_RSCDISPLAYARSENAL_TAB_UNIFORM 3 +#define IDC_RSCDISPLAYARSENAL_TAB_VEST 4 +#define IDC_RSCDISPLAYARSENAL_TAB_BACKPACK 5 +#define IDC_RSCDISPLAYARSENAL_TAB_HEADGEAR 6 +#define IDC_RSCDISPLAYARSENAL_TAB_GOGGLES 7 +#define IDC_RSCDISPLAYARSENAL_TAB_NVGS 8 +#define IDC_RSCDISPLAYARSENAL_TAB_BINOCULARS 9 +#define IDC_RSCDISPLAYARSENAL_TAB_MAP 10 +#define IDC_RSCDISPLAYARSENAL_TAB_GPS 11 +#define IDC_RSCDISPLAYARSENAL_TAB_RADIO 12 +#define IDC_RSCDISPLAYARSENAL_TAB_COMPASS 13 +#define IDC_RSCDISPLAYARSENAL_TAB_WATCH 14 +#define IDC_RSCDISPLAYARSENAL_TAB_FACE 15 +#define IDC_RSCDISPLAYARSENAL_TAB_VOICE 16 +#define IDC_RSCDISPLAYARSENAL_TAB_INSIGNIA 17 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMOPTIC 18 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMACC 19 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMMUZZLE 20 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMBIPOD 25 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAG 21 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOTHROW 22 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOPUT 23 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMISC 24 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAGALL 26 + +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONBACKGROUND 29489 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONTEXT 29589 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPON 30789 + +#define IDC_RSCDISPLAYARSENAL_INFO_INFOBACKGROUND 24515 +#define IDC_RSCDISPLAYARSENAL_INFO_INFONAME 24516 +#define IDC_RSCDISPLAYARSENAL_INFO_INFOAUTHOR 24517 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCBACKGROUND 24518 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCICON 24715 +#define IDC_RSCDISPLAYARSENAL_INFO_INFO 25815 + +#define IDC_RSCDISPLAYARSENAL_STATS_STATSBACKGROUND 27347 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT1 27348 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT2 27349 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT3 27350 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT4 27351 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT5 27352 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT1 27353 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT2 27354 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT3 27355 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT4 27356 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT5 27357 +#define IDC_RSCDISPLAYARSENAL_STATS_STATS 28644 + +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_CONTROLBAR 44046 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONSAVE 44146 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONLOAD 44147 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONEXPORT 44148 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONIMPORT 44149 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONRANDOM 44150 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONINTERFACE 44151 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONOK 44346 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONTRY 44347 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONCLOSE 44448 + +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TITLE 34619 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN1 34620 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEXTNAME 34621 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_MAINBACKGROUND 34622 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN2 34623 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN3 34624 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN4 34625 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN5 34626 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_EDITNAME 35020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_VALUENAME 35119 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEMPLATE 35919 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONOK 36019 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONCANCEL 36020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONDELETE 36021 + +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENALBACKGROUND 26603 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGEBACKGROUND 26604 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENAL 26803 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGE 26804 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACE 27903 + +//--- RscDisplayGarage +#define IDC_RSCDISPLAYGARAGE_TAB_CAR 0 +#define IDC_RSCDISPLAYGARAGE_TAB_ARMOR 1 +#define IDC_RSCDISPLAYGARAGE_TAB_HELI 2 +#define IDC_RSCDISPLAYGARAGE_TAB_PLANE 3 +#define IDC_RSCDISPLAYGARAGE_TAB_NAVAL 4 +#define IDC_RSCDISPLAYGARAGE_TAB_STATIC 5 + +#define IDC_RSCDISPLAYGARAGE_TAB_SUBCREW 18 //--- Match he numbers with Arsenal right panel IDCs +#define IDC_RSCDISPLAYGARAGE_TAB_SUBANIMATION 19 +#define IDC_RSCDISPLAYGARAGE_TAB_SUBTEXTURE 20 + +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBANIMATION 0 +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBTEXTURE 1 + +//--- RscDisplayCreateJIRAIssue +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BACKGROUND 29997 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATHTITLE 29998 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_TITLE 30097 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMISSION 30098 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMAP 30099 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONOBJECT 30100 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONEMPTY 30101 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATH 30397 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONCANCEL 31697 + +//--- RscDisplayDLCContentBrowser - main display +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLEBACKGROUND 37179 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MAINBACKGROUND 37180 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLE 37099 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_PLAYERSNAME 37100 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONCANCEL 38799 //MUF - todo - was exported, but not added to config +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_LISTGROUP 38400 +//--- RscDisplayDLCContentBrowser - General +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWBACKGROUND 37101 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWTEXT 37102 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TABSBACKGROUND 37106 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWDLCNAME 37137 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWPICTURE 37299 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_GENERALGROUP 38399 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONASSETS 38499 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONSINGLEPLAYER 38500 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONMULTIPLAYER 38501 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONFEATURES 38502 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONPURCHASE 38503 +//--- RscDisplayDLCContentBrowser - item template +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUND 37129 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUNDBLACK 37130 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMNAME 37131 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTSESSIONTIME 37132 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMSESSIONTIME 37133 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTTOTALTIME 37134 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTOTALTIME 37135 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMDESCRIPTION 37136 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPICTURE 37300 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPREMIUMICON 37311 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEMPLATE 38401 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONTRY 38504 +//--- RscDisplayDLCContentBrowser - dlc selection group +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSPURCHASED 37103 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIPURCHASED 37104 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENPURCHASED 37105 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSBACKGROUND 37108 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSNAME 37109 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIBACKGROUND 37110 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELINAME 37111 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENBACKGROUND 37112 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENNAME 37113 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEBACKGROUND 37114 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLENAME 37115 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSLOGO 37301 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELILOGO 37302 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENLOGO 37303 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLELOGO 37304 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSOVERLAY 37305 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIOVERLAY 37306 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENOVERLAY 37307 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEOVERLAY 37308 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCSELECTIONGROUP 38402 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXBACKGROUND 37116 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXNAME 37117 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXPURCHASED 37118 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXLOGO 37309 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXOVERLAY 37310 + + +//--- GroundSupport_ProcedureVisualization +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_PROGRESS 68374 +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_TEXT 68375 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 24691 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 24693 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 24694 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 24695 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 24891 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 24892 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 24893 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 24894 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 24895 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 24896 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 25991 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE3D 26091 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 26291 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 26391 + +//--- RscDisplayPurchaseNotification +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TITLE 46662 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TEXT 46663 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_DLCLIST 46762 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNPICTURE 46862 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNCONTROLSGROUP 47962 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_BUTTONOK 48262 + +//--- RscDiary +#define IDC_TASKTOOLTIP 47060 +#define IDC_TASKTOOLTIP_BACKGROUND 47061 +#define IDC_TASKTOOLTIP_TITLE 47062 +#define IDC_TASKTOOLTIP_SUBTITLE 47063 +#define IDC_TASKTOOLTIP_BUTTON 47064 +#define IDC_TASKTOOLTIP_ASSIGNEDICON 47065 +#define IDC_TASKTOOLTIP_ASSIGNEDCOUNTER 47066 + +//--- RscRespawnControlsGroup +#define IDC_RSCRESPAWNCONTROLS_RESPAWNCONTROLSGROUP 88800 +#define IDC_RSCRESPAWNCONTROLS_LOCBACKGROUND 88802 +#define IDC_RSCRESPAWNCONTROLS_ROLEBACKGROUND 88803 +#define IDC_RSCRESPAWNCONTROLS_GEARBACKGROUND 88804 +#define IDC_RSCRESPAWNCONTROLS_HEADERBACKGROUND 88801 +#define IDC_RSCRESPAWNCONTROLS_BUTTONSPECTATE 88811 +#define IDC_RSCRESPAWNCONTROLS_LOCLIST 88808 +#define IDC_RSCRESPAWNCONTROLS_ROLELIST 88809 +#define IDC_RSCRESPAWNCONTROLS_COUNTERTEXT 88826 +#define IDC_RSCRESPAWNCONTROLS_COUNTER 88806 +#define IDC_RSCRESPAWNCONTROLS_AUTORESPAWN 88830 +#define IDC_RSCRESPAWNCONTROLS_TEAMTEXT 88827 +#define IDC_RSCRESPAWNCONTROLS_TEAM 88805 +#define IDC_RSCRESPAWNCONTROLS_TICKETSTEXT 88828 +#define IDC_RSCRESPAWNCONTROLS_TICKETS 88807 +#define IDC_RSCRESPAWNCONTROLS_HEADERRESPAWNBUTTON 88829 +#define IDC_RSCRESPAWNCONTROLS_WARNING 88831 +#define IDC_RSCRESPAWNCONTROLS_COMBOLOADOUT 88813 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILS 88814 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDPRIMARYWEAPON 88822 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDSECONDARYWEAPON 88823 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDOPTICS 88824 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDITEM 88825 +#define IDC_RSCRESPAWNCONTROLS_PICTUREPRIMARYWEAPON 88815 +#define IDC_RSCRESPAWNCONTROLS_PICTURESECONDARYWEAPON 88816 +#define IDC_RSCRESPAWNCONTROLS_PICTUREOPTICS 88817 +#define IDC_RSCRESPAWNCONTROLS_PICTUREITEM 88818 +#define IDC_RSCRESPAWNCONTROLS_LOCTITLE 88819 +#define IDC_RSCRESPAWNCONTROLS_ROLETITLE 88820 +#define IDC_RSCRESPAWNCONTROLS_GEARTITLE 88821 +#define IDC_RSCRESPAWNCONTROLS_LOCDISABLED 88832 +#define IDC_RSCRESPAWNCONTROLS_ROLEDISABLED 88833 +#define IDC_RSCRESPAWNCONTROLS_LOADOUTDISABLED 88834 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSCONTROLSGROUP 88850 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDDETAILS 88851 +#define IDC_RSCRESPAWNCONTROLS_DETAILSTITLE 88852 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILSCLOSE 88853 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSLISTCONTROLSGROUP 88860 +#define IDC_RSCRESPAWNCONTROLS_DETAILSLIST 88861 + +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERBACKGROUND 88870 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERLEFT 88871 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERRIGHT 88872 + +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO 88874 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_TITLE 88875 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_OPTION 88876 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO 88877 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_TITLE 88878 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_OPTION 88879 + +//--- RscRevive +#define IDC_RSCREVIVE_REVIVEPROGRESSBACKGROUND 4817 +#define IDC_RSCREVIVE_REVIVEPROGRESS 4818 +#define IDC_RSCREVIVE_REVIVEKEYPROGRESS 4819 +#define IDC_RSCREVIVE_REVIVEBAR 4820 +#define IDC_RSCREVIVE_REVIVETEXT 4917 +#define IDC_RSCREVIVE_REVIVECOUNTDOWN 4918 +#define IDC_RSCREVIVE_REVIVEINFO 4919 +#define IDC_RSCREVIVE_REVIVEKEYBACKGROUND 4920 +#define IDC_RSCREVIVE_REVIVEKEY 4921 +#define IDC_RSCREVIVE_REVIVEMEDIKIT 5017 +#define IDC_RSCREVIVE_REVIVEMEDIKITPROGRESS 5018 +#define IDC_RSCREVIVE_REVIVEDEATH 5019 +#define IDC_RSCREVIVE_REVIVERESPAWN 6117 +#define IDC_RSCREVIVE_REVIVETEXT2 6118 + +//--- DynamicGroups +#define IDC_DYNAMICGROUPS_HEADER 9377 +#define IDC_DYNAMICGROUPS_BACKGROUNDMANAGE 9379 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAME 9380 +#define IDC_DYNAMICGROUPS_BACKGROUNDGROUPNAME 9381 +#define IDC_DYNAMICGROUPS_BACKGROUNDPLAYERS 9382 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDE 9383 +#define IDC_DYNAMICGROUPS_TEXTPLAYERCOUNT 9384 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCORE 9386 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAMEFILL 9387 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDEFILL 9388 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCOREFILL 9389 +#define IDC_DYNAMICGROUPS_TEXTPRIVATE 9390 +#define IDC_DYNAMICGROUPS_GROUPICON 9577 +#define IDC_DYNAMICGROUPS_PICTURESIDE 9578 +#define IDC_DYNAMICGROUPS_EDITGROUPNAME 9777 +#define IDC_DYNAMICGROUPS_LISTBOXGROUPS 9877 +#define IDC_DYNAMICGROUPS_LISTBOXMANAGE 9878 +#define IDC_DYNAMICGROUPS_LISTBOXPLAYERS 9880 +#define IDC_DYNAMICGROUPS_BUTTONJOIN 9977 +#define IDC_DYNAMICGROUPS_BUTTONCREATELEAVEKICK 9978 +#define IDC_DYNAMICGROUPS_BUTTONPROMOTEDISBAND 9979 +#define IDC_DYNAMICGROUPS_BUTTONINVITE 9980 +#define IDC_DYNAMICGROUPS_TABBUTTONGROUPS 9981 +#define IDC_DYNAMICGROUPS_TABBUTTONPLAYERS 9983 +#define IDC_DYNAMICGROUPS_SECTIONMANAGE 10677 +#define IDC_DYNAMICGROUPS_SECTIONGROUPS 10679 +#define IDC_DYNAMICGROUPS_CHECKBOXPRIVATE 11177 + +//--- RscHvtPhase +#define IDC_RSCHVTPHASE_PERSISTENT 6610 +#define IDC_RSCHVTPHASE_DYNAMIC 6611 +#define IDC_RSCHVTPHASE_DOWNLOADTITLE 6612 +#define IDC_RSCHVTPHASE_DOWNLOADCONTENT 6613 +#define IDC_RSCHVTPHASE_MULTIPLIER 6614 +#define IDC_RSCHVTPHASE_RANGEBACKGROUND 6615 +#define IDC_RSCHVTPHASE_TIMER 6616 +#define IDC_RSCHVTPHASE_PROGRESSBAR 6620 +#define IDC_RSCHVTPHASE_DOWNLOADSPEED 6621 +#define IDC_RSCHVTPHASE_RANGE 6810 +#define IDC_RSCHVTPHASE_CARRIERPICTURE 6811 +#define IDC_RSCHVTPHASE_DOWNLOAD 7910 + +//--- RscPhaseRules +#define IDC_RSCPHASERULES_PHASE1NUMBER 9131 +#define IDC_RSCPHASERULES_PHASE1TEXT 9132 +#define IDC_RSCPHASERULES_PHASE2TEXT 9133 +#define IDC_RSCPHASERULES_PHASE2NUMBER 9134 +#define IDC_RSCPHASERULES_PHASE3TEXT 9135 +#define IDC_RSCPHASERULES_PHASE3NUMBER 9136 +#define IDC_RSCPHASERULES_PHASE1INFO 9137 +#define IDC_RSCPHASERULES_PHASE2INFO 9138 +#define IDC_RSCPHASERULES_PHASE3INFO 9139 +#define IDC_RSCPHASERULES_PHASERULES 10431 + +//--- RscDisplayEGSpectator +#define IDD_RSCDISPLAYEGSPECTATOR 60492 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMETIMETEXT 42609 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMEPHASETEXT 48610 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBBACKGROUND 42611 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEATASK 42612 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEABACKGROUND 42613 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBTASK 42614 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLORBACKGROUND 42615 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLORBACKGROUND 42616 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLOR 42617 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLOR 42618 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEAPROGRESSGROUP 48909 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBPROGRESSGROUP 43910 +#define IDC_RSCDISPLAYEGSPECTATOR_MOUSEHANDLER 42989 +#define IDC_RSCDISPLAYEGSPECTATOR_TABS 43609 +#define IDC_RSCDISPLAYEGSPECTATOR_LIST 43109 +#define IDC_RSCDISPLAYEGSPECTATOR_LISTGROUP 43909 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESBACKGROUND 52610 +#define IDC_RSCDISPLAYEGSPECTATOR_FREE 52809 +#define IDC_RSCDISPLAYEGSPECTATOR_FOLLOW 52810 +#define IDC_RSCDISPLAYEGSPECTATOR_FPS 52811 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESGROUP 52909 +#define IDC_RSCDISPLAYEGSPECTATOR_MAP 62609 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPHEADER 62610 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPFOOTER 62611 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPTITLE 62612 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSCOUNT 62613 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSICON 62809 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPGROUP 63909 +#define IDC_RSCDISPLAYEGSPECTATOR_HELPBACKGROUND 72812 +#define IDC_RSCDISPLAYEGSPECTATOR_HELP 73189 +#define IDC_RSCDISPLAYEGSPECTATOR_UPPERBACKGROUND 82609 +#define IDC_RSCDISPLAYEGSPECTATOR_NAME 82610 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERLEFTBACKGROUND 82611 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERRIGHTBACKGROUND 82612 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATARBACKGROUND 82613 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS_COUNT 82614 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS_COUNT 82615 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS_COUNT 82616 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS_COUNT 82617 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS_COUNT 82618 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL_COUNT 82619 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATAR 82809 +#define IDC_RSCDISPLAYEGSPECTATOR_UNITTYPE 82810 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS 82811 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS 82812 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS 82813 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS 82814 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS 82815 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL 82816 +#define IDC_RSCDISPLAYEGSPECTATOR_WEAPONPICTURE 82817 +#define IDC_RSCDISPLAYEGSPECTATOR_VEHICLETYPE 82818 +#define IDC_RSCDISPLAYEGSPECTATOR_FOCUSINFO 83909 + +//--- RscEGProgress +#define IDC_RSCEGPROGRESS_DOWNLOADICONBACKGROUND 9170 +#define IDC_RSCEGPROGRESS_OBJECTIVELETTER 9171 +#define IDC_RSCEGPROGRESS_ACTIVITYBACKGROUND 9172 +#define IDC_RSCEGPROGRESS_PROGRESSBARBACKGROUND 9173 +#define IDC_RSCEGPROGRESS_TITLE 9174 +#define IDC_RSCEGPROGRESS_PROGRESSBAR 9180 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUND 9370 +#define IDC_RSCEGPROGRESS_ACTIVITY 9372 +#define IDC_RSCEGPROGRESS_DOWNLOADICON 9374 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUNDCOLOURED 9375 +#define IDC_RSCEGPROGRESS_DOWNLOAD 9376 + +//--- RscDisplayQuickPlay +#define IDC_RSCDISPLAYQUICKPLAY_TITLE 18702 +#define IDC_RSCDISPLAYQUICKPLAY_PLAYERSNAME 18703 +#define IDC_RSCDISPLAYQUICKPLAY_MODTEXT 18704 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENTBACKGROUND 18705 +#define IDC_RSCDISPLAYQUICKPLAY_MAXPINGTEXT 18706 +#define IDC_RSCDISPLAYQUICKPLAY_BESTMATCHTEXT 18707 +#define IDC_RSCDISPLAYQUICKPLAY_MODBACKGROUND 18708 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTION 18713 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLEBACKGROUND 18714 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLE 18715 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEOVERVIEW 18903 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTIONBACKGROUND 18904 +#define IDC_RSCDISPLAYQUICKPLAY_MODICON 18905 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENT 20002 +#define IDC_RSCDISPLAYQUICKPLAY_BUTTONBACK 20402 + +//--- RscDisplayCampaignLobby (Scripted campaign lobby) +#define IDD_CAMPAIGN_LOBBY 50000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_FULL_GROUP 51000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_GROUP 51100 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_LOADING_GROUP 51200 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_BORDER_GROUP 51300 +#define IDC_CAMPAIGN_LOBBY_TABLET_GROUP 52000 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_GROUP 52100 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SEARCH_GROUP 52200 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SETTINGS_GROUP 52300 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_RESPAWN_GROUP 52400 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_REVIVE_GROUP 52500 +#define IDC_CAMPAIGN_LOBBY_TABLET_MILITARY_GROUP 52600 +#define IDC_CAMPAIGN_LOBBY_MAIN_GROUP 53000 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_GROUP 53100 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_HEADER_GROUP 53200 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_STRUCTURE_GROUP 53300 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_CORE_GROUP 53400 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_GROUP 53500 +#define IDC_CAMPAIGN_LOBBY_LOGIN_GROUP 54100 +#define IDC_CAMPAIGN_LOBBY_ACCESS_KEY_GROUP 54200 +#define IDC_CAMPAIGN_LOBBY_MISSION_GROUP 54300 +#define IDC_CAMPAIGN_LOBBY_MISSION_VIDEO_GROUP 54400 +#define IDC_CAMPAIGN_LOBBY_MISSION_INTEL_GROUP 54500 +#define IDC_CAMPAIGN_LOBBY_MISSION_OVERLAY_GROUP 54600 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_CORE_GROUP 55000 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_GROUP 55100 +#define IDC_CAMPAIGN_LOBBY_PROGRESS_GROUP 56000 +#define IDC_CAMPAIGN_LOBBY_OVERLAY_GROUP 57000 + +// RscDisplayDLCContentBrowser +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTUREBACKGROUND 2000 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTURE 2001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEOGROUP 2002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEO 2003 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_ICON 2004 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEL 2005 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINER 2006 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINET 2007 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEB 2008 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_BUTTON 2009 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_TITLE 2010 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_HOVER 2011 + +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MOUSEAREA 999 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCGROUP 1001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCBACKGROUND 1002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONBACKGROUND 1003 + +//--- RscDisplayDLCPreview_List +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUND 31263 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOTITLE 31264 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUNDBOTTOM 31266 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFO 31363 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOSTATS 31364 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIM 31463 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURE 31464 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSEPREV 31465 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSENEXT 31466 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAY 31467 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAY 31468 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAYICON 31469 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAYICON 31470 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREBACKGROUND 31471 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMBACKGROUND 31472 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREGROUP 32563 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURELISTGROUP 32564 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOGROUP 32565 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONTRY 32663 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONPURCHASE 32664 + +//--- RscDisplayDLCPreview_ListItem +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SELECT 41883 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_HOVER 41884 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_PICTURE 42083 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SESSIONNOTIFICATION 42084 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BACKGROUND 42085 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BUTTON 42483 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_RSCDISPLAYDLCPREVIEW_LISTITEM 43183 + +//--- RscDisplayDLCPreview +#define IDC_RSCDISPLAYDLCPREVIEW_BACKGROUND 1001 +#define IDC_RSCDISPLAYDLCPREVIEW_LOGO 1002 +#define IDC_RSCDISPLAYDLCPREVIEW_OVERVIEW 1003 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWGROUP 1004 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWBACKGROUND 1005 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONBACKGROUND 1006 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONPURCHASE 1007 +#define IDC_RSCDISPLAYDLCPREVIEW_AUTHOR 1008 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTGROUP 1009 +#define IDC_RSCDISPLAYDLCPREVIEW_BOHEMIA 1010 + +//--- RscDisplayTimeline +#define IDD_RSCDISPLAYTIMELINE 15000 + +//--- RscDisplayTimeline +#define IDC_RSCDISPLAYTIMELINE_BACKGROUND 16985 +#define IDC_RSCDISPLAYTIMELINE_TEXTTIME 17085 +#define IDC_RSCDISPLAYTIMELINE_TEXTPLAYRATE 17086 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYFORWARD 17585 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYBACKWARD 17586 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPAUSE 17587 +#define IDC_RSCDISPLAYTIMELINE_BUTTONDECREASEPLAYRATE 17588 +#define IDC_RSCDISPLAYTIMELINE_BUTTONINCREASEPLAYRATE 17589 +#define IDC_RSCDISPLAYTIMELINE_LIST 18085 +#define IDC_RSCDISPLAYTIMELINE_TIMELINECONTROLS 18285 diff --git a/optionals/compat_rhs_usf3/CfgMagazineWells.hpp b/optionals/compat_rhs_usf3/CfgMagazineWells.hpp new file mode 100644 index 0000000000..7ee767c4a9 --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgMagazineWells.hpp @@ -0,0 +1,8 @@ +class CfgMagazineWells { + class ace_hellfire_K { + ADDON[] = {QGVAR(pylon_mag_2rnd_hellfire_k)}; + }; + class ace_hellfire_N { + ADDON[] = {GVAR(pylon_mag_2rnd_hellfire_n)}; + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp index 9e595fddfb..1f692792f0 100644 --- a/optionals/compat_rhs_usf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -23,4 +23,17 @@ class cfgMagazines { EGVAR(overpressure,range) = 0; EGVAR(overpressure,damage) = 0; }; + + class rhs_mag_AGM114K_2; + class GVAR(pylon_mag_2rnd_hellfire_k): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114K [ACE]"; + pylonWeapon = "ace_hellfire_launcher"; + ammo = "ACE_Hellfire_AGM114K"; + }; + class GVAR(pylon_mag_2rnd_hellfire_n): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114N [ACE]"; + pylonWeapon = "ace_hellfire_launcher_N"; + ammo = "ACE_Hellfire_AGM114N"; + }; + }; diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp index 5a27eb8526..b9029d5c55 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -7,7 +7,7 @@ class CfgWeapons { EGVAR(nightvision,bluRadius) = 0.13; }; class rhsusf_ANPVS_15: rhsusf_ANPVS_14 { // Binocular (same as base) - modelOptics = ""; + modelOptics = ""; EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa); EGVAR(nightvision,bluRadius) = 0.15; }; @@ -241,11 +241,18 @@ class CfgWeapons { ace_overpressure_damage = 0.75; }; + #define HEARING_PROTECTION_OPEN EGVAR(hearing,protection) = 0; EGVAR(hearing,lowerVolume) = 0; #define HEARING_PROTECTION_VICCREW EGVAR(hearing,protection) = 0.85; EGVAR(hearing,lowerVolume) = 0.6; #define HEARING_PROTECTION_EARMUFF EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0.5; #define HEARING_PROTECTION_PELTOR EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0; // Fast Helmets class rhsusf_opscore_01; + class rhsusf_ihadss: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; + class rhsusf_opscore_ut_pelt_nsw: rhsusf_opscore_01 { + HEARING_PROTECTION_PELTOR + }; class rhsusf_opscore_aor1_pelt: rhsusf_opscore_01 { HEARING_PROTECTION_PELTOR }; @@ -295,6 +302,9 @@ class CfgWeapons { HEARING_PROTECTION_PELTOR }; class rhsusf_opscore_cover; + class rhsusf_opscore_mc_cover_pelt_nsw: rhsusf_opscore_cover { + HEARING_PROTECTION_PELTOR + }; class rhsusf_opscore_mc_cover_pelt: rhsusf_opscore_cover { HEARING_PROTECTION_PELTOR }; @@ -380,7 +390,9 @@ class CfgWeapons { class rhsusf_mich_bare_norotos_alt_semi: rhsusf_mich_bare_norotos_semi { HEARING_PROTECTION_PELTOR }; - class rhsusf_mich_bare_norotos_arc_semi; + class rhsusf_mich_bare_norotos_arc_semi: rhsusf_mich_bare_norotos_alt_semi { + HEARING_PROTECTION_OPEN + }; class rhsusf_mich_bare_norotos_arc_alt_semi: rhsusf_mich_bare_norotos_arc_semi { HEARING_PROTECTION_PELTOR }; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index 5847a2ac40..59aaa625bd 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -17,6 +17,7 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" +#include "CfgMagazineWells.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" #include "CfgGlasses.hpp" diff --git a/optionals/nocrosshair/CfgInGameUI.hpp b/optionals/nocrosshair/CfgInGameUI.hpp deleted file mode 100644 index cdaf4eba78..0000000000 --- a/optionals/nocrosshair/CfgInGameUI.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class CfgInGameUI { - class Cursor { - weapon = ""; // "\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"; - }; -}; diff --git a/optionals/nocrosshair/CfgWeaponCursors.hpp b/optionals/nocrosshair/CfgWeaponCursors.hpp new file mode 100644 index 0000000000..57cef92ae4 --- /dev/null +++ b/optionals/nocrosshair/CfgWeaponCursors.hpp @@ -0,0 +1,27 @@ +#define EMPTY_TEXTURE(weapon) \ + class weapon: default { \ + texture = ""; \ + } + +class CfgWeaponCursors { + class default; + EMPTY_TEXTURE(arifle); + EMPTY_TEXTURE(mg); + EMPTY_TEXTURE(srifle); + EMPTY_TEXTURE(smg); + EMPTY_TEXTURE(hgun); + EMPTY_TEXTURE(sgun); + EMPTY_TEXTURE(gl); + EMPTY_TEXTURE(throw); + EMPTY_TEXTURE(put); + EMPTY_TEXTURE(missile); + EMPTY_TEXTURE(rocket); + EMPTY_TEXTURE(bomb); + EMPTY_TEXTURE(cannon); + EMPTY_TEXTURE(mortar); + EMPTY_TEXTURE(coil); + EMPTY_TEXTURE(laserdesignator); + // if these classes have empty texture the crosshair appears + // EMPTY_TEXTURE(cursorAim); + // EMPTY_TEXTURE(cursorAimOn); +}; diff --git a/optionals/nocrosshair/config.cpp b/optionals/nocrosshair/config.cpp index b7528917ef..1e5f0f3bc5 100644 --- a/optionals/nocrosshair/config.cpp +++ b/optionals/nocrosshair/config.cpp @@ -15,4 +15,4 @@ class CfgPatches { }; }; -#include "CfgInGameUI.hpp" +#include "CfgWeaponCursors.hpp" diff --git a/tools/check_strings.py b/tools/check_strings.py new file mode 100644 index 0000000000..78ad52b04e --- /dev/null +++ b/tools/check_strings.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# PabstMirror +# Checks all strings are defined, run with -u to return all unused strings + +import fnmatch +import os +import re +import sys + +def getDefinedStrings(filepath): + # print("getDefinedStrings {0}".format(filepath)) + with open(filepath, 'r', encoding="latin-1") as file: + content = file.read() + srch = re.compile('Key ID\=\"(STR_ACE_[_a-zA-Z0-9]*)"', re.IGNORECASE) + modStrings = srch.findall(content) + modStrings = [s.lower() for s in modStrings] + return modStrings + +def getStringUsage(filepath): + selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + # print("Checking {0} from {1}".format(filepath,selfmodule)) + fileStrings = [] + + with open(filepath, 'r') as file: + content = file.read() + + srch = re.compile('(STR_ACE_[_a-zA-Z0-9]*)', re.IGNORECASE) + fileStrings = srch.findall(content) + + srch = re.compile('[^E][CL]STRING\(([_a-zA-Z0-9]*)\)', re.IGNORECASE) + modStrings = srch.findall(content) + for localString in modStrings: + fileStrings.append("STR_ACE_{0}_{1}".format(selfmodule, localString)) + + srch = re.compile('E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + exStrings = srch.findall(content) + for (exModule, exString) in exStrings: + fileStrings.append("STR_ACE_{0}_{1}".format(exModule, exString)) + + srch = re.compile('IGNORE_STRING_WARNING\([\'"]*([_a-zA-Z0-9]*)[\'"]*\)') + ignoreWarnings = srch.findall(content) + + fileStrings = [s.lower() for s in fileStrings] + return [s for s in fileStrings if s not in (i.lower() for i in ignoreWarnings)] + +def main(argv): + print("### check_strings.py {} ###".format(argv)) + sqf_list = [] + xml_list = [] + + allDefinedStrings = [] + allUsedStrings = [] + + # Allow running from root directory as well as from inside the tools directory + rootDir = "../addons" + if (os.path.exists("addons")): + rootDir = "addons" + + for root, dirnames, filenames in os.walk(rootDir): + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.h'): + sqf_list.append(os.path.join(root, filename)) + + for filename in fnmatch.filter(filenames, '*.xml'): + xml_list.append(os.path.join(root, filename)) + + for filename in xml_list: + allDefinedStrings = allDefinedStrings + getDefinedStrings(filename) + for filename in sqf_list: + allUsedStrings = allUsedStrings + getStringUsage(filename) + + allDefinedStrings = list(sorted(set(allDefinedStrings))) + allUsedStrings = list(sorted(set(allUsedStrings))) + + print("-----------") + countUnusedStrings = 0 + countUndefinedStrings = 0 + for s in allDefinedStrings: + if (not (s in allUsedStrings)): + countUnusedStrings = countUnusedStrings + 1; + if ("-u" in argv): + print("String {} defined but not used".format(s)) + print("-----------") + for s in allUsedStrings: + if (not (s in allDefinedStrings)): + print("String {} not defined".format(s)) + countUndefinedStrings = countUndefinedStrings + 1; + print("-----------") + + print("Defined Strings:{0} Used Strings:{1}".format(len(allDefinedStrings),len(allUsedStrings))) + print("Unused Strings:{0} Undefined Strings:{1}".format(countUnusedStrings,countUndefinedStrings)) + + return countUndefinedStrings + +if __name__ == "__main__": + main(sys.argv) diff --git a/tools/event_rename.py b/tools/event_rename.py deleted file mode 100644 index 99dd261a02..0000000000 --- a/tools/event_rename.py +++ /dev/null @@ -1,115 +0,0 @@ -import os -import sys -import re - -un_capitalize = lambda s: s[:1].lower() + s[1:] if s else '' - -def add_to_config(old, new): - with open(add_to_config.file, "r+") as file: - contents = file.read() - - events_class = re.search(r"class\s+ACE_newEvents\s+{\n",contents,re.I) - - if events_class: - newline_index = events_class.end() - insert = " {0} = \"{1}\";\n".format(old,new) - else: - newline_index = len(contents) - insert = "\nclass ACE_newEvents {{\n {0} = \"{1}\";\n}};".format(old,new) - - contents = contents[:newline_index] + insert + contents[newline_index:] - - file.seek(0) - file.write(contents) - file.truncate() - -def event_replace(match): - event = un_capitalize(match.group(1)) - add_to_config(match.group(1), "ace_" + event) - - return "[\"ace_{0}\", {1}] call CBA_fnc_{2}".format(event,match.group(2),match.group(3)) - -def process_directory(dir, config=""): - if not config: - config = os.path.join(dir,"config.cpp") - if os.path.isfile(config): - add_to_config.file = config - - for p in os.listdir(dir): - path = os.path.join(dir, p) - if os.path.isdir(path): - process_directory(path, config) - continue - - ext = os.path.splitext(path)[1] - if ext not in [".sqf",".hpp",".cpp"]: - continue - - with open(path, "r+") as file: - contents = file.read() - - # Simple single-line substitutions - find = r"\[\s*\"(?!ace_)(\w+)\"\s*,\s*(.+?)\s*\]\s+call\s+CBA_fnc_((add|remove|local|global|target|server)Event(Handler)?)" - contents, subbed = re.subn(find,event_replace,contents,0,re.I) - - # Handle multi-line code blocks - for match in re.finditer(r"\[\s*\"(?!ace_)(\w+)\"\s*,\s*({.+?})\s*\]\s+call\s*CBA_fnc_(add|remove)EventHandler",contents,re.I|re.S): - pair = 0 - for i, c in enumerate(contents[match.start(2):]): - if c == "{": - pair += 1 - elif c == "}": - pair -= 1 - if pair == 0: - pair = i - break - if re.match(r"\s*\]\s+call\s+CBA_fnc_(add|remove)EventHandler",contents[pair+match.start(2)+1:],re.I): - event = un_capitalize(match.group(1)) - add_to_config(match.group(1), "ace_" + event) - - contents = contents[:match.start(1)] + "ace_" + event + contents[match.end(1):] - subbed += 1 - - # Handle multi-line argument arrays - for match in re.finditer(r"\[\s*\"(?!ace_)(\w+)\"\s*,\s*(\[.+?\])\s*\]\s+call\s*CBA_fnc_(local|global|server)Event",contents,re.I|re.S): - pair = 0 - for i, c in enumerate(contents[match.start(2):]): - if c == "[": - pair += 1 - elif c == "]": - pair -= 1 - if pair == 0: - pair = i - break - if re.match(r"\s*\]\s+call\s+CBA_fnc_(local|global|server)Event",contents[pair+match.start(2)+1:],re.I): - event = un_capitalize(match.group(1)) - add_to_config(match.group(1), "ace_" + event) - - contents = contents[:match.start(1)] + "ace_" + event + contents[match.end(1):] - subbed += 1 - - if subbed > 0: - print("Making {0} substitutions: {1}".format(subbed,path)) - - file.seek(0) - file.write(contents) - file.truncate() - -def main(): - scriptpath = os.path.realpath(sys.argv[0]) - projectpath = os.path.dirname(os.path.dirname(scriptpath)) - addonspath = os.path.join(projectpath, "addons") - - os.chdir(addonspath) - - for p in os.listdir(addonspath): - path = os.path.join(addonspath, p) - if not os.path.isdir(path): - continue - if p[0] == ".": - continue - - process_directory(path) - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tools/generate_airfriction_config.py b/tools/generate_airfriction_config.py index ac312c08ba..f91adea564 100644 --- a/tools/generate_airfriction_config.py +++ b/tools/generate_airfriction_config.py @@ -480,7 +480,7 @@ ammoList = [["B_556x45_Ball", [300, 500, 500], [750, 870, 910], 7, 0.151], ["ACE_243_Winchester_Ball", [700, 900, 900], [830, 900, 920], 7, 0.278], ["ACE_762x67_Ball_Mk248_Mod_0", [800, 900, 900], [865, 900, 924], 7, 0.268], ["ACE_762x67_Ball_Mk248_Mod_1", [800, 900, 900], [847, 867, 877], 7, 0.310], - ["ACE_762x67_Ball_Berger_Hybrid_OTM", [900, 1000, 1000], [800, 853, 884], 7, 0.358], + ["ACE_762x67_Ball_Berger_Hybrid_OTM", [900, 1000, 1000], [800, 853, 884], 7, 0.368], ["B_762x54_Ball", [500, 800, 800], [760, 835, 865], 1, 0.4], ["ACE_762x35_Ball", [400, 500], [620, 675], 1, 0.330], ["ACE_762x39_Ball", [400, 600], [650, 750], 1, 0.275],