From f8f6931f1d18253063ee7fb38ed314b28b2bfd19 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Sat, 20 Apr 2024 19:47:14 +0100 Subject: [PATCH 01/37] Initial commit --- addons/brain/$PBOPREFIX$ | 1 + addons/brain/CfgEventHandlers.hpp | 20 ++++++++++++++ addons/brain/XEH_PREP.hpp | 4 +++ addons/brain/XEH_postInit.sqf | 3 +++ addons/brain/XEH_preInit.sqf | 41 +++++++++++++++++++++++++++++ addons/brain/config.cpp | 36 +++++++++++++++++++++++++ addons/brain/functions/fnc_init.sqf | 23 ++++++++++++++++ addons/brain/script_component.hpp | 17 ++++++++++++ 8 files changed, 145 insertions(+) create mode 100644 addons/brain/$PBOPREFIX$ create mode 100644 addons/brain/CfgEventHandlers.hpp create mode 100644 addons/brain/XEH_PREP.hpp create mode 100644 addons/brain/XEH_postInit.sqf create mode 100644 addons/brain/XEH_preInit.sqf create mode 100644 addons/brain/config.cpp create mode 100644 addons/brain/functions/fnc_init.sqf create mode 100644 addons/brain/script_component.hpp diff --git a/addons/brain/$PBOPREFIX$ b/addons/brain/$PBOPREFIX$ new file mode 100644 index 000000000..9793c72cf --- /dev/null +++ b/addons/brain/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\brain \ No newline at end of file diff --git a/addons/brain/CfgEventHandlers.hpp b/addons/brain/CfgEventHandlers.hpp new file mode 100644 index 000000000..4551ce282 --- /dev/null +++ b/addons/brain/CfgEventHandlers.hpp @@ -0,0 +1,20 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + disableModuload = "true"; + }; +}; + +class Extended_Init_EventHandlers { + class CAManBase { + class ADDON { + init = QUOTE([ARR_2((_this select 0),false)] call FUNC(init)); + }; + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp new file mode 100644 index 000000000..f94172021 --- /dev/null +++ b/addons/brain/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(handleConcussionState); +PREP(handleConcussionDeterioration); +PREP(handleHeadHit); +PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf new file mode 100644 index 000000000..366e71284 --- /dev/null +++ b/addons/brain/XEH_postInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +[QACEGVAR(medical,woundReceived),LINKFUNC(handleHeadHit)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf new file mode 100644 index 000000000..f16977c82 --- /dev/null +++ b/addons/brain/XEH_preInit.sqf @@ -0,0 +1,41 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#define CBA_SETTINGS_CAT "KAT - ADV Medical: Brain Injuries" + +//Enable head injuries +[ + QGVAR(enable), + "CHECKBOX", + LLSTRING(SETTING_enable), + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [true], + true +] call CBA_Settings_fnc_init; + +//Set concussion deterioration chance +[ + QGVAR(deterioratingConcussion_chance), + "SLIDER", + [LLSTRING(SETTING_deterioratingConcussion_chance), LLSTRING(DESCRIPTION_deterioratingConcussion_chance)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [0, 100, 8, 0], + true +] call CBA_Settings_fnc_init; + +//Set concussion deterioration interval +[ + QGVAR(deterioratingConcussion_interval), + "SLIDER", + [LLSTRING(SETTING_deterioratingConcussion_interval), LLSTRING(DESCRIPTION_deterioratingConcussion_interval)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [1, 3600, 180, 0], + true +] call CBA_Settings_fnc_init; + +ADDON = true; \ No newline at end of file diff --git a/addons/brain/config.cpp b/addons/brain/config.cpp new file mode 100644 index 000000000..845094b1a --- /dev/null +++ b/addons/brain/config.cpp @@ -0,0 +1,36 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + units[] = {}; + weapons[] = {}; + magazines[] = { }; + requiredAddons[] = { + "ace_medical", + "ace_medical_ai", + "ace_medical_blood", + "ace_medical_damage", + "ace_medical_engine", + "ace_medical_feedback", + "ace_medical_gui", + "ace_medical_statemachine", + "ace_medical_status", + "ace_medical_treatment", + "ace_medical_vitals", + "ace_dogtags", + "kat_main", + "kat_airway", + "kat_circulation", + "cba_settings" + }; + author = "apo_tle"; + authors[] = {"apo_tle"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +//#include "CfgWeapons.hpp" \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf new file mode 100644 index 000000000..31ae93ae5 --- /dev/null +++ b/addons/brain/functions/fnc_init.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: Katalam + * Initializes unit variables. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [bob] call kat_brain_fnc_init + * + * Public: No + */ + +params ["_unit", ["_isRespawn", true]]; + +if (!local _unit) exitWith {}; +if !(GVAR(enable)) exitWith {}; + +_unit setVariable [QGVAR(concussion), 0, true]; diff --git a/addons/brain/script_component.hpp b/addons/brain/script_component.hpp new file mode 100644 index 000000000..a34bec86a --- /dev/null +++ b/addons/brain/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT brain +#define COMPONENT_BEAUTIFIED KAT - Brain Injuries +#include "\x\kat\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_BRAIN + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_BRAIN + #define DEBUG_SETTINGS DEBUG_SETTINGS_BRAIN +#endif + +#include "\x\kat\addons\main\script_macros.hpp" From 835605f792bfe2f0764686059880fcd53f20c264 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Sat, 20 Apr 2024 19:51:31 +0100 Subject: [PATCH 02/37] Initial commit 2 --- addons/brain/XEH_PREP.hpp | 3 --- addons/brain/XEH_postInit.sqf | 4 +--- addons/brain/functions/fnc_init.sqf | 2 -- addons/brain/stringtable.xml | 8 ++++++++ 4 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 addons/brain/stringtable.xml diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index f94172021..1f35d4024 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,4 +1 @@ -PREP(handleConcussionState); -PREP(handleConcussionDeterioration); -PREP(handleHeadHit); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index 366e71284..84f252991 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1,3 +1 @@ -#include "script_component.hpp" - -[QACEGVAR(medical,woundReceived),LINKFUNC(handleHeadHit)] call CBA_fnc_addEventHandler; \ No newline at end of file +#include "script_component.hpp" \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 31ae93ae5..0e09185d8 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -19,5 +19,3 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; if !(GVAR(enable)) exitWith {}; - -_unit setVariable [QGVAR(concussion), 0, true]; diff --git a/addons/brain/stringtable.xml b/addons/brain/stringtable.xml new file mode 100644 index 000000000..153b314e6 --- /dev/null +++ b/addons/brain/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Enable Traumatic Brain Injuries + + + From 54b680c93afc80be913fdd1a3e8eea2a3f6bf185 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Sat, 20 Apr 2024 23:24:24 +0100 Subject: [PATCH 03/37] Add ICP tracker --- addons/brain/XEH_PREP.hpp | 1 + addons/brain/XEH_postInit.sqf | 4 +- addons/brain/XEH_preInit.sqf | 22 +------ addons/brain/functions/fnc_handleICP.sqf | 77 ++++++++++++++++++++++++ addons/brain/functions/fnc_init.sqf | 9 ++- addons/brain/stringtable.xml | 2 +- 6 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 addons/brain/functions/fnc_handleICP.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 1f35d4024..86030acb5 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1 +1,2 @@ +PREP(handleICP); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index 84f252991..d4b993107 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1 +1,3 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[QGVAR(handleICP), LINKFUNC(handleICP)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index f16977c82..67ec4088a 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -8,7 +8,7 @@ PREP_RECOMPILE_END; #define CBA_SETTINGS_CAT "KAT - ADV Medical: Brain Injuries" -//Enable head injuries +//Enable traumatic brain injuries [ QGVAR(enable), "CHECKBOX", @@ -18,24 +18,4 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -//Set concussion deterioration chance -[ - QGVAR(deterioratingConcussion_chance), - "SLIDER", - [LLSTRING(SETTING_deterioratingConcussion_chance), LLSTRING(DESCRIPTION_deterioratingConcussion_chance)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], - [0, 100, 8, 0], - true -] call CBA_Settings_fnc_init; - -//Set concussion deterioration interval -[ - QGVAR(deterioratingConcussion_interval), - "SLIDER", - [LLSTRING(SETTING_deterioratingConcussion_interval), LLSTRING(DESCRIPTION_deterioratingConcussion_interval)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], - [1, 3600, 180, 0], - true -] call CBA_Settings_fnc_init; - ADDON = true; \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleICP.sqf b/addons/brain/functions/fnc_handleICP.sqf new file mode 100644 index 000000000..5f92abda7 --- /dev/null +++ b/addons/brain/functions/fnc_handleICP.sqf @@ -0,0 +1,77 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Handles increasing/decreasing intercranial pressure. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_brain_fnc_handleICP + * + * Public: No + */ + + params ["_unit"]; + +if ((_unit getVariable [QGVAR(icpHandler), false]) || !(GVAR(enable))) exitWith {}; +_unit setVariable [QGVAR(icpHandler),true]; + +if (!local _unit) then { + [QGVAR(handleICP), [_unit], _unit] call CBA_fnc_targetEvent; +}; + +[{ + params ["_args","_handle"]; + _args params ["_unit"]; + if !(alive _unit) exitWith { + _unit setVariable [QGVAR(icpHandler),false]; + [_handle] call CBA_fnc_removePerFrameHandler; + }; + + //todo post processing + + private _icp = _unit getVariable [QGVAR(icp),15]; + private _pr =_unit getVariable [QACEGVAR(medical,heartRate),0]; + private _bp = _unit getVariable [QGVAR(StoredBloodPressure), [0,0]]; + + private _concussion = _unit getVariable [QGVAR(concussion),0]; + + //check for lethal ICP + if ((_icp > 35) && !(_unit getVariable [QACEGVAR(medical,deathblocked), false])) exitWith { + [_unit, "terminal_icp_death"] call ACEFUNC(medical_status,setDead); + _unit setVariable [QGVAR(handleICP), false]; + [_handle] call CBA_fnc_removePerFrameHandler; + }; + + private _icpChange = 0; + if (_concussion isEqualTo 0) then { // no concussion + if (bp >= 80 && bp <= 160) then { //bp between 80 and 160 + _icpChange = -0.1; + }; + }; + if (_concussion isEqualTo 1) then { //mild concussion + if (bp >= 80 && bp <= 160) then { //bp between 80 and 160 + _icpChange = 0.05; + } else { + _icpChange = 0.1; + }; + }; + if (_concussion isEqualTo 2) then { //severe concussion + if (bp >= 80 && bp <= 160) then { //bp between 80 and 160 + _icpChange = 0.1; + } else { + _icpChange = 0.15; + }; + }; + + //todo multipliers + + private _output = _icp + _icpChange; + _output = 15 max _output; + + _unit setVariable [QGVAR(icp), _output, true]; +}, 3, [_unit]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 0e09185d8..9c6e6107b 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* - * Author: Katalam + * Author: apo_tle * Initializes unit variables. * * Arguments: @@ -19,3 +19,10 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; if !(GVAR(enable)) exitWith {}; + +_unit setVariable [QGVAR(icp),15,true]; +_unit setVariable [QGVAR(icpHandler),false]; + +_unit setVariable [QGVAR(concussion),0]; + +[_unit] call FUNC(handleICP); \ No newline at end of file diff --git a/addons/brain/stringtable.xml b/addons/brain/stringtable.xml index 153b314e6..95ea14276 100644 --- a/addons/brain/stringtable.xml +++ b/addons/brain/stringtable.xml @@ -1,7 +1,7 @@ - + Enable Traumatic Brain Injuries From 2ad9eeab6b82a80351a190e7a95d082702c7ebf4 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Sat, 25 May 2024 00:28:47 +0100 Subject: [PATCH 04/37] Change ICP monitorig (redundant, will be removed) --- addons/brain/functions/fnc_handleICP.sqf | 48 ++++++++++++------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/addons/brain/functions/fnc_handleICP.sqf b/addons/brain/functions/fnc_handleICP.sqf index 5f92abda7..593a1bf3e 100644 --- a/addons/brain/functions/fnc_handleICP.sqf +++ b/addons/brain/functions/fnc_handleICP.sqf @@ -1,7 +1,7 @@ #include "..\script_component.hpp" /* * Author: apo_tle - * Handles increasing/decreasing intercranial pressure. + * Handles increasing/decreasing intracranial pressure. * * Arguments: * 0: The Unit @@ -15,6 +15,11 @@ * Public: No */ +// concussion 0: no concussion +// concussion 1: grade 1 concussion, no loss of consciousness +// concussion 2: grade 2 concussion, immediate or delayed LOC +// concussion 3: grade 3 concussion, extended and seizures + params ["_unit"]; if ((_unit getVariable [QGVAR(icpHandler), false]) || !(GVAR(enable))) exitWith {}; @@ -34,44 +39,41 @@ if (!local _unit) then { //todo post processing - private _icp = _unit getVariable [QGVAR(icp),15]; + private _icp = _unit getVariable [QGVAR(icp),0]; private _pr =_unit getVariable [QACEGVAR(medical,heartRate),0]; - private _bp = _unit getVariable [QGVAR(StoredBloodPressure), [0,0]]; private _concussion = _unit getVariable [QGVAR(concussion),0]; //check for lethal ICP - if ((_icp > 35) && !(_unit getVariable [QACEGVAR(medical,deathblocked), false])) exitWith { + if ((_icp >= 1000) && !(_unit getVariable [QACEGVAR(medical,deathblocked), false])) exitWith { [_unit, "terminal_icp_death"] call ACEFUNC(medical_status,setDead); _unit setVariable [QGVAR(handleICP), false]; [_handle] call CBA_fnc_removePerFrameHandler; }; private _icpChange = 0; - if (_concussion isEqualTo 0) then { // no concussion - if (bp >= 80 && bp <= 160) then { //bp between 80 and 160 - _icpChange = -0.1; + private _output = 0; + switch _concussion do { + case 0: { + // returning to original vitals + _output = 0 max _output; }; - }; - if (_concussion isEqualTo 1) then { //mild concussion - if (bp >= 80 && bp <= 160) then { //bp between 80 and 160 - _icpChange = 0.05; - } else { - _icpChange = 0.1; + case 1: { + // mild concussion starts 100 and rises to ~350 + // todo faster rising ICP for higher blood pressure + _output = 100 max _output; // if ICP is below 100 then it'll be brought up }; - }; - if (_concussion isEqualTo 2) then { //severe concussion - if (bp >= 80 && bp <= 160) then { //bp between 80 and 160 - _icpChange = 0.1; - } else { - _icpChange = 0.15; + case 2: { + // grade 2 concussion starts 200 and rises to 400-600 + }; + case 3: { + // severe concussion starts 350 and rises to 1000 }; }; - //todo multipliers + //todo value floors (prevent decreasing further without proper treatment) - private _output = _icp + _icpChange; - _output = 15 max _output; + //todo multipliers _unit setVariable [QGVAR(icp), _output, true]; -}, 3, [_unit]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; //todo make a setting \ No newline at end of file From e566ac0a16b72ff92d994bf7bd659507157a184c Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Sun, 16 Jun 2024 19:46:29 +0100 Subject: [PATCH 05/37] Initial commit --- addons/brain/XEH_PREP.hpp | 1 - addons/brain/XEH_postInit.sqf | 4 +- addons/brain/functions/fnc_handleICP.sqf | 79 ------------------------ addons/brain/functions/fnc_init.sqf | 6 -- addons/brain/stringtable.xml | 2 +- 5 files changed, 2 insertions(+), 90 deletions(-) delete mode 100644 addons/brain/functions/fnc_handleICP.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 86030acb5..1f35d4024 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,2 +1 @@ -PREP(handleICP); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index d4b993107..84f252991 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1,3 +1 @@ -#include "script_component.hpp" - -[QGVAR(handleICP), LINKFUNC(handleICP)] call CBA_fnc_addEventHandler; \ No newline at end of file +#include "script_component.hpp" \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleICP.sqf b/addons/brain/functions/fnc_handleICP.sqf deleted file mode 100644 index 593a1bf3e..000000000 --- a/addons/brain/functions/fnc_handleICP.sqf +++ /dev/null @@ -1,79 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: apo_tle - * Handles increasing/decreasing intracranial pressure. - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [player] call kat_brain_fnc_handleICP - * - * Public: No - */ - -// concussion 0: no concussion -// concussion 1: grade 1 concussion, no loss of consciousness -// concussion 2: grade 2 concussion, immediate or delayed LOC -// concussion 3: grade 3 concussion, extended and seizures - - params ["_unit"]; - -if ((_unit getVariable [QGVAR(icpHandler), false]) || !(GVAR(enable))) exitWith {}; -_unit setVariable [QGVAR(icpHandler),true]; - -if (!local _unit) then { - [QGVAR(handleICP), [_unit], _unit] call CBA_fnc_targetEvent; -}; - -[{ - params ["_args","_handle"]; - _args params ["_unit"]; - if !(alive _unit) exitWith { - _unit setVariable [QGVAR(icpHandler),false]; - [_handle] call CBA_fnc_removePerFrameHandler; - }; - - //todo post processing - - private _icp = _unit getVariable [QGVAR(icp),0]; - private _pr =_unit getVariable [QACEGVAR(medical,heartRate),0]; - - private _concussion = _unit getVariable [QGVAR(concussion),0]; - - //check for lethal ICP - if ((_icp >= 1000) && !(_unit getVariable [QACEGVAR(medical,deathblocked), false])) exitWith { - [_unit, "terminal_icp_death"] call ACEFUNC(medical_status,setDead); - _unit setVariable [QGVAR(handleICP), false]; - [_handle] call CBA_fnc_removePerFrameHandler; - }; - - private _icpChange = 0; - private _output = 0; - switch _concussion do { - case 0: { - // returning to original vitals - _output = 0 max _output; - }; - case 1: { - // mild concussion starts 100 and rises to ~350 - // todo faster rising ICP for higher blood pressure - _output = 100 max _output; // if ICP is below 100 then it'll be brought up - }; - case 2: { - // grade 2 concussion starts 200 and rises to 400-600 - }; - case 3: { - // severe concussion starts 350 and rises to 1000 - }; - }; - - //todo value floors (prevent decreasing further without proper treatment) - - //todo multipliers - - _unit setVariable [QGVAR(icp), _output, true]; -}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; //todo make a setting \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 9c6e6107b..24068c644 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -20,9 +20,3 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; if !(GVAR(enable)) exitWith {}; -_unit setVariable [QGVAR(icp),15,true]; -_unit setVariable [QGVAR(icpHandler),false]; - -_unit setVariable [QGVAR(concussion),0]; - -[_unit] call FUNC(handleICP); \ No newline at end of file diff --git a/addons/brain/stringtable.xml b/addons/brain/stringtable.xml index 95ea14276..6cdd02ab0 100644 --- a/addons/brain/stringtable.xml +++ b/addons/brain/stringtable.xml @@ -1,6 +1,6 @@ - + Enable Traumatic Brain Injuries From d344eaa99bf78119aa72aa73c882c1a9ea802f3d Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Mon, 17 Jun 2024 11:11:13 +0100 Subject: [PATCH 06/37] Add variables --- addons/brain/XEH_postInit.sqf | 4 ++- .../functions/fnc_handleBrainActivity.sqf | 30 +++++++++++++++++++ addons/brain/functions/fnc_init.sqf | 4 +++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 addons/brain/functions/fnc_handleBrainActivity.sqf diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index 84f252991..65c6d74e7 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1 +1,3 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[QGVAR(handleBrainActivity), LINKFUNC(handleBrainActivity)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf new file mode 100644 index 000000000..0b7bc798a --- /dev/null +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Handles the main loop for brain vitals and maintaining perfect cerebral metabolic rate + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [bob] call kat_brain_fnc_handleBrainActivity + * + * Public: No + */ + + params ["_unit"]; + +if (!local _unit) then { + [QGVAR(handleBrainActivity), [_unit], _unit] call CBA_fnc_targetEvent; +}; + +[{ + params ["_args", "_idPFH"]; + _args params ["_unit"]; + if !(alive _unit) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; +}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 24068c644..169b348fc 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -20,3 +20,7 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; if !(GVAR(enable)) exitWith {}; +_unit setVariable [QGVAR(CMR),20,true]; +_unit setVariable [QGVAR(CBF),800,true]; +_unit setVariable [QGVAR(CVR),0.1,true]; +_unit setVariable [QGVAR(ICP),10,true]; \ No newline at end of file From c1ebbf3c43beb1dbd7182054e50023d61acd2c18 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Mon, 17 Jun 2024 11:32:36 +0100 Subject: [PATCH 07/37] Add PFH for brain activity --- addons/brain/XEH_PREP.hpp | 1 + addons/brain/functions/fnc_handleBrainActivity.sqf | 7 +++++++ addons/brain/functions/fnc_init.sqf | 4 +++- addons/misc/functions/fnc_handleRespawn.sqf | 8 ++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 1f35d4024..6307b0925 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1 +1,2 @@ +PREP(handleBrainActivity); PREP(init); \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index 0b7bc798a..025bad8bc 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -21,10 +21,17 @@ if (!local _unit) then { [QGVAR(handleBrainActivity), [_unit], _unit] call CBA_fnc_targetEvent; }; +if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { + true +}; + [{ params ["_args", "_idPFH"]; _args params ["_unit"]; if !(alive _unit) exitWith { + _unit setVariable [GVAR(activityPFH),false,true]; [_idPFH] call CBA_fnc_removePerFrameHandler; }; }, 15, [_unit]] call CBA_fnc_addPerFrameHandler; + +true; diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 169b348fc..be2cd65ef 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -23,4 +23,6 @@ if !(GVAR(enable)) exitWith {}; _unit setVariable [QGVAR(CMR),20,true]; _unit setVariable [QGVAR(CBF),800,true]; _unit setVariable [QGVAR(CVR),0.1,true]; -_unit setVariable [QGVAR(ICP),10,true]; \ No newline at end of file +_unit setVariable [QGVAR(ICP),10,true]; + +_unit setVariable [QGVAR(activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; \ No newline at end of file diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index dfdf38741..04e4df82e 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -33,6 +33,14 @@ _unit setVariable [QEGVAR(airway,recovery), false, true]; _unit setVariable [QEGVAR(airway,airway_item), "", true]; _unit setVariable [QEGVAR(airway,clearedTime), 0, true]; +// KAT Brain + +_unit setVariable [QGVAR(CMR),20,true]; +_unit setVariable [QGVAR(CBF),800,true]; +_unit setVariable [QGVAR(CVR),0.1,true]; +_unit setVariable [QGVAR(ICP),10,true]; +_unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; + // KAT Breathing _unit setVariable [QEGVAR(breathing,airwayStatus), 100, true]; From 33b08731c197c4591850966c0bc218400feabb37 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Mon, 17 Jun 2024 11:49:45 +0100 Subject: [PATCH 08/37] Add more variables --- addons/brain/functions/fnc_init.sqf | 4 ++++ addons/brain/stringtable.xml | 2 +- addons/misc/functions/fnc_handleRespawn.sqf | 11 +++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index be2cd65ef..fcf89f3c3 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -24,5 +24,9 @@ _unit setVariable [QGVAR(CMR),20,true]; _unit setVariable [QGVAR(CBF),800,true]; _unit setVariable [QGVAR(CVR),0.1,true]; _unit setVariable [QGVAR(ICP),10,true]; +_unit setVariable [QGVAR(rO2),80,true]; + +_unit setVariable [QGVAR(necrosis),0,true]; +_unit setVariable [QGVAR(reversibleDamage),0,true]; _unit setVariable [QGVAR(activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; \ No newline at end of file diff --git a/addons/brain/stringtable.xml b/addons/brain/stringtable.xml index 6cdd02ab0..c9d3de738 100644 --- a/addons/brain/stringtable.xml +++ b/addons/brain/stringtable.xml @@ -2,7 +2,7 @@ - Enable Traumatic Brain Injuries + Enable Brain Simulation diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index 04e4df82e..169b12480 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -35,10 +35,13 @@ _unit setVariable [QEGVAR(airway,clearedTime), 0, true]; // KAT Brain -_unit setVariable [QGVAR(CMR),20,true]; -_unit setVariable [QGVAR(CBF),800,true]; -_unit setVariable [QGVAR(CVR),0.1,true]; -_unit setVariable [QGVAR(ICP),10,true]; +_unit setVariable [QEGVAR(brain,CMR),20,true]; +_unit setVariable [QEGVAR(brain,CBF),800,true]; +_unit setVariable [QEGVAR(brain,CVR),0.1,true]; +_unit setVariable [QEGVAR(brain,ICP),10,true]; +_unit setVariable [QEGVAR(brain,rO2),80,true]; +_unit setVariable [QEGVAR(brain,necrosis),0,true]; +_unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; _unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; // KAT Breathing From 297e52e5ebdf9f0e3e1562560ce5107a996fa5a6 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Mon, 17 Jun 2024 12:39:51 +0100 Subject: [PATCH 09/37] Add autoregulation, cerebral blood flow tracker --- addons/brain/XEH_PREP.hpp | 2 +- addons/brain/XEH_postInit.sqf | 2 +- .../functions/fnc_handleAutoregulation.sqf | 64 +++++++++++++++++++ .../functions/fnc_handleBrainActivity.sqf | 37 ----------- addons/brain/functions/fnc_init.sqf | 12 ++-- addons/misc/functions/fnc_handleRespawn.sqf | 2 +- 6 files changed, 73 insertions(+), 46 deletions(-) create mode 100644 addons/brain/functions/fnc_handleAutoregulation.sqf delete mode 100644 addons/brain/functions/fnc_handleBrainActivity.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 6307b0925..92fabbe11 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,2 +1,2 @@ -PREP(handleBrainActivity); +PREP(handleAutoregulation); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index 65c6d74e7..d204da889 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1,3 +1,3 @@ #include "script_component.hpp" -[QGVAR(handleBrainActivity), LINKFUNC(handleBrainActivity)] call CBA_fnc_addEventHandler; \ No newline at end of file +[QGVAR(handleAutoregulation), LINKFUNC(handleAutoregulation)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleAutoregulation.sqf b/addons/brain/functions/fnc_handleAutoregulation.sqf new file mode 100644 index 000000000..e59bad4de --- /dev/null +++ b/addons/brain/functions/fnc_handleAutoregulation.sqf @@ -0,0 +1,64 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Handles the autoregulation of CVR to achieve optimal CBF. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * 0: PFH enabled + * + * Example: + * [bob] call kat_brain_fnc_handleAutoregulation + * + * Public: No + */ + + params ["_unit"]; + +if (!local _unit) then { + [QGVAR(handleAutoregulation), [_unit], _unit] call CBA_fnc_targetEvent; +}; + +if (!GVAR(enable) || _unit getVariable [QGVAR(autoregulationPFH),false]) exitWith { + true +}; + +[{ + params ["_args", "_idPFH"]; + _args params ["_unit"]; + if !(alive _unit) exitWith { + _unit setVariable [QGVAR(activityPFH),false,true]; + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + GET_BLOOD_PRESSURE(_unit) params ["_systolic","_diastolic"]; + private _MAP = _diastolic + ((_systolic-_diastolic)/3); + + private _CVR = _unit getVariable [QGVAR(CVR),0.1]; + private _ICP = 20 max (_unit getVariable [QGVAR(ICP),10]); + + // calculate cerebral blood flow and autoregulation + private _targetCBF = 800; //TODO change this value depending on blood oxygen saturation + + private _targetCVR = (_MAP-20)/_targetCBF; + _targetCVR = (0.0375 max _targetCVR) min 0.17875; //Clamp CVR between two values: + //If the required CVR is less than 0.0375, CBF will not be able to be high enough and reduced perfusion occurs. + //If the required CVR exceeds 0.17875, CBF will be too high and luxury perfusion occurs. + + private _newCVR = (((_CVR+_targetCVR ) / 2) + _targetCVR) / 2; // interpolate CVR to target value + + private _CPP = _MAP-_ICP max 0; + if (_CPP > 200) then { // Simulate autoregulation breakthrough (too large CPP causes spike in CBF) + _newCVR = 0.1; + }; + + private _CBF = round (_CPP/_newCVR); + + _unit setVariable [QGVAR(CVR),_newCVR,true]; + _unit setVariable [QGVAR(CBF),_CBF,true]; + +}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; + +true; diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf deleted file mode 100644 index 025bad8bc..000000000 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: apo_tle - * Handles the main loop for brain vitals and maintaining perfect cerebral metabolic rate - * - * Arguments: - * 0: The Unit - * - * Return Value: - * None - * - * Example: - * [bob] call kat_brain_fnc_handleBrainActivity - * - * Public: No - */ - - params ["_unit"]; - -if (!local _unit) then { - [QGVAR(handleBrainActivity), [_unit], _unit] call CBA_fnc_targetEvent; -}; - -if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { - true -}; - -[{ - params ["_args", "_idPFH"]; - _args params ["_unit"]; - if !(alive _unit) exitWith { - _unit setVariable [GVAR(activityPFH),false,true]; - [_idPFH] call CBA_fnc_removePerFrameHandler; - }; -}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; - -true; diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index fcf89f3c3..bcf82b5e4 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -20,13 +20,13 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; if !(GVAR(enable)) exitWith {}; -_unit setVariable [QGVAR(CMR),20,true]; -_unit setVariable [QGVAR(CBF),800,true]; -_unit setVariable [QGVAR(CVR),0.1,true]; -_unit setVariable [QGVAR(ICP),10,true]; -_unit setVariable [QGVAR(rO2),80,true]; +_unit setVariable [QGVAR(CMR),20,true]; // Cerebral Metabolic Rate +_unit setVariable [QGVAR(CBF),800,true]; // Cerebral Blood Flow +_unit setVariable [QGVAR(CVR),0.1,true]; // Cerebral Vascular Resistance +_unit setVariable [QGVAR(ICP),10,true]; // Intracranial Pressure +_unit setVariable [QGVAR(rO2),80,true]; // Brain O2 saturation _unit setVariable [QGVAR(necrosis),0,true]; _unit setVariable [QGVAR(reversibleDamage),0,true]; -_unit setVariable [QGVAR(activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; \ No newline at end of file +_unit setVariable [QGVAR(autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; \ No newline at end of file diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index 169b12480..626fe1abc 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -42,7 +42,7 @@ _unit setVariable [QEGVAR(brain,ICP),10,true]; _unit setVariable [QEGVAR(brain,rO2),80,true]; _unit setVariable [QEGVAR(brain,necrosis),0,true]; _unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; -_unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; +_unit setVariable [QEGVAR(brain,autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; // KAT Breathing From 4eee060c9817397cf707bc3f7187142e3f2309a2 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Mon, 17 Jun 2024 12:43:40 +0100 Subject: [PATCH 10/37] Increase tick speed for autoregulation --- addons/brain/functions/fnc_handleAutoregulation.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/brain/functions/fnc_handleAutoregulation.sqf b/addons/brain/functions/fnc_handleAutoregulation.sqf index e59bad4de..f71da6634 100644 --- a/addons/brain/functions/fnc_handleAutoregulation.sqf +++ b/addons/brain/functions/fnc_handleAutoregulation.sqf @@ -59,6 +59,6 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(autoregulationPFH),false]) exitWit _unit setVariable [QGVAR(CVR),_newCVR,true]; _unit setVariable [QGVAR(CBF),_CBF,true]; -}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; +}, 3, [_unit]] call CBA_fnc_addPerFrameHandler; true; From 43c507c0b309ebc743be9771802ae4e622d6fa8f Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Tue, 18 Jun 2024 12:01:37 +0100 Subject: [PATCH 11/37] Add brain oxygen saturation simulation --- addons/brain/XEH_PREP.hpp | 1 + addons/brain/XEH_postInit.sqf | 3 +- .../functions/fnc_handleAutoregulation.sqf | 7 ++- .../functions/fnc_handleBrainActivity.sqf | 50 +++++++++++++++++++ addons/brain/functions/fnc_init.sqf | 4 +- addons/misc/functions/fnc_handleRespawn.sqf | 6 +-- 6 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 addons/brain/functions/fnc_handleBrainActivity.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 92fabbe11..527ec75ae 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,2 +1,3 @@ PREP(handleAutoregulation); +PREP(handleBrainActivity); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index d204da889..5374c5166 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1,3 +1,4 @@ #include "script_component.hpp" -[QGVAR(handleAutoregulation), LINKFUNC(handleAutoregulation)] call CBA_fnc_addEventHandler; \ No newline at end of file +[QGVAR(handleAutoregulation), LINKFUNC(handleAutoregulation)] call CBA_fnc_addEventHandler; +[QGVAR(handleBrainActivity), LINKFUNC(handleBrainActivity)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleAutoregulation.sqf b/addons/brain/functions/fnc_handleAutoregulation.sqf index f71da6634..74dd9b509 100644 --- a/addons/brain/functions/fnc_handleAutoregulation.sqf +++ b/addons/brain/functions/fnc_handleAutoregulation.sqf @@ -15,7 +15,7 @@ * Public: No */ - params ["_unit"]; +params ["_unit"]; if (!local _unit) then { [QGVAR(handleAutoregulation), [_unit], _unit] call CBA_fnc_targetEvent; @@ -29,7 +29,7 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(autoregulationPFH),false]) exitWit params ["_args", "_idPFH"]; _args params ["_unit"]; if !(alive _unit) exitWith { - _unit setVariable [QGVAR(activityPFH),false,true]; + _unit setVariable [QGVAR(autoregulationPFH),false,true]; [_idPFH] call CBA_fnc_removePerFrameHandler; }; @@ -55,9 +55,12 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(autoregulationPFH),false]) exitWit }; private _CBF = round (_CPP/_newCVR); + private _CPR = (_CBF/800 * 100) min 200; + _CPR = _CPR * (GET_SPO2(_unit)/100); _unit setVariable [QGVAR(CVR),_newCVR,true]; _unit setVariable [QGVAR(CBF),_CBF,true]; + _unit setVariable [QGVAR(CPR),_CPR,true]; }, 3, [_unit]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf new file mode 100644 index 000000000..76821dd2d --- /dev/null +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -0,0 +1,50 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Handles the simulation of oxygen perfusion into the brain and therefore the metabolic rate. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * 0: PFH enabled + * + * Example: + * [bob] call kat_brain_fnc_handleBrainActivity + * + * Public: No + */ + + if (!local _unit) then { + [QGVAR(handleBrainActivity), [_unit], _unit] call CBA_fnc_targetEvent; +}; + +if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { + true +}; + +[{ + params ["_args", "_idPFH"]; + _args params ["_unit"]; + if !(alive _unit) exitWith { + _unit setVariable [QGVAR(activityPFH),false,true]; + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _CPR = _unit getVariable [QGVAR(CPR),100]; + private _perfusionDelta = switch (true) do { // Calculate change in rO2 based on graph + case (_CPR <= 50): {-3}; + case (_CPR <= 100): {(_CPR/10) - 8}; + case (_CPR <= 110): {2}; + case (_CPR <= 121.052): {(_CPR/30) - (5/3)}; + case (_CPR <= 160): {(_CPR/-8) + 17.5}; + default {-2.5}; + }; + + private _rO2 = _unit getVariable [QGVAR(rO2),80]; + _rO2 = (0 max (_rO2 + _perfusionDelta)) min 80; // Transform rO2 by the perfusion delta within bounds of 0 and 80 + _unit setVariable [QGVAR(rO2),_rO2,true]; + +}, 15, [_unit]] call CBA_fnc_addPerFrameHandler; + +true; \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index bcf82b5e4..01d34db4f 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -24,9 +24,11 @@ _unit setVariable [QGVAR(CMR),20,true]; // Cerebral Metabolic Rate _unit setVariable [QGVAR(CBF),800,true]; // Cerebral Blood Flow _unit setVariable [QGVAR(CVR),0.1,true]; // Cerebral Vascular Resistance _unit setVariable [QGVAR(ICP),10,true]; // Intracranial Pressure +_unit setVariable [QGVAR(CPR),100,true]; // Cerebral Perfusion Rate _unit setVariable [QGVAR(rO2),80,true]; // Brain O2 saturation _unit setVariable [QGVAR(necrosis),0,true]; _unit setVariable [QGVAR(reversibleDamage),0,true]; -_unit setVariable [QGVAR(autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; \ No newline at end of file +_unit setVariable [QGVAR(autoregulationPFH), [_unit] call FUNC(handleAutoregulation),true]; +_unit setVariable [QGVAR(activityPFH), [_unit] call FUNC(handleBrainActivity),true]; \ No newline at end of file diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index ab8696ee8..b2cc79f2c 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -21,7 +21,6 @@ TRACE_2("handleRespawn",_unit,_dead); if (!local _unit) exitWith {}; -<<<<<<< HEAD // KAT Airway _unit setVariable [QEGVAR(airway,obstruction), false, true]; @@ -40,10 +39,13 @@ _unit setVariable [QEGVAR(brain,CMR),20,true]; _unit setVariable [QEGVAR(brain,CBF),800,true]; _unit setVariable [QEGVAR(brain,CVR),0.1,true]; _unit setVariable [QEGVAR(brain,ICP),10,true]; +_unit setVariable [QEGVAR(brain,CPR),100,true]; _unit setVariable [QEGVAR(brain,rO2),80,true]; _unit setVariable [QEGVAR(brain,necrosis),0,true]; _unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; _unit setVariable [QEGVAR(brain,autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; +_unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; + // KAT Breathing @@ -104,12 +106,10 @@ _unit setVariable [QEGVAR(misc,isLeftArmFree), true, true]; _unit setVariable [QEGVAR(misc,isRightArmFree), true, true]; _unit setVariable [QEGVAR(misc,isLeftLegFree), true, true]; _unit setVariable [QEGVAR(misc,isRightLegFree), true, true]; -======= _unit setVariable [QGVAR(isLeftArmFree), true, true]; _unit setVariable [QGVAR(isRightArmFree), true, true]; _unit setVariable [QGVAR(isLeftLegFree), true, true]; _unit setVariable [QGVAR(isRightLegFree), true, true]; ->>>>>>> 3e01878778b7eaacf82763ae62b3ab60904d8d35 _unit setVariable [QGVAR(Tourniquet_ArmNecrosis), 0]; _unit setVariable [QGVAR(Tourniquet_LegNecrosis), 0]; From d7f3025987b06d2feb8fa570d5d3d2b6b49bbf9a Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Tue, 18 Jun 2024 19:25:52 +0100 Subject: [PATCH 12/37] Add tissue necrosis --- addons/brain/XEH_preInit.sqf | 29 +++++++++++++++++++ .../functions/fnc_handleBrainActivity.sqf | 13 ++++++++- addons/brain/functions/fnc_init.sqf | 1 + addons/misc/functions/fnc_handleRespawn.sqf | 1 + 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index 67ec4088a..c1a0f08b1 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -18,4 +18,33 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +// Number of ticks required until tissue necrosis begins to occur +[ + QGVAR(necrosisTicks), + "SLIDER", + [LLSTRING(SETTING_necrosisTicks)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_BrainDeath)], + [1, 60, 10, 0], + true +] call CBA_Settings_fnc_init; +// rO2 value required before necrosis occurs +[ + QGVAR(necrosisThreshold), + "SLIDER", + [LLSTRING(SETTING_necrosisThreshold)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_BrainDeath)], + [1, 80, 50, 0], + true +] call CBA_Settings_fnc_init; + +//How much necrosis increases each tick +[ + QGVAR(necrosisIncrease), + "SLIDER", + [LLSTRING(SETTING_necrosisIncrease)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_BrainDeath)], + [0, 10, 1.6, 1], + true +] call CBA_Settings_fnc_init; + ADDON = true; \ No newline at end of file diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index 76821dd2d..f064892b4 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -31,6 +31,7 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { [_idPFH] call CBA_fnc_removePerFrameHandler; }; + // Calculate brain oxygen saturation private _CPR = _unit getVariable [QGVAR(CPR),100]; private _perfusionDelta = switch (true) do { // Calculate change in rO2 based on graph case (_CPR <= 50): {-3}; @@ -40,11 +41,21 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { case (_CPR <= 160): {(_CPR/-8) + 17.5}; default {-2.5}; }; - private _rO2 = _unit getVariable [QGVAR(rO2),80]; _rO2 = (0 max (_rO2 + _perfusionDelta)) min 80; // Transform rO2 by the perfusion delta within bounds of 0 and 80 _unit setVariable [QGVAR(rO2),_rO2,true]; + //Calculate tissue necrosis and brain death + private _necrosis = _unit getVariable [QGVAR(necrosis),0]; + private _deoxygenatedTicks = _unit getVariable [QGVAR(deoxygenatedTicks),0]; + _deoxygenatedTicks = [_deoxygenatedTicks + 1,_deoxygenatedTicks - 2] select (rO2 < GVAR(necrosisThreshold)); + _deoxygenatedTicks = (0 max _dexoxygenation) min GVAR(necrosisTicks); + if (_deoxygenatedTicks == GVAR(necrosisThreshold)) then { + _necrosis = (_necrosis + GVAR(necrosisIncrease)) min 100; + //TODO kill unit when this gets too high + _unit setVariable [QGVAR(necrosis),_necrosis,true]; + }; + }, 15, [_unit]] call CBA_fnc_addPerFrameHandler; true; \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 01d34db4f..a8cab798f 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -28,6 +28,7 @@ _unit setVariable [QGVAR(CPR),100,true]; // Cerebral Perfusion Rate _unit setVariable [QGVAR(rO2),80,true]; // Brain O2 saturation _unit setVariable [QGVAR(necrosis),0,true]; +_unit setVariable [QGVAR(deoxygenatedTicks),0,true]; _unit setVariable [QGVAR(reversibleDamage),0,true]; _unit setVariable [QGVAR(autoregulationPFH), [_unit] call FUNC(handleAutoregulation),true]; diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index b2cc79f2c..0097cb306 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -42,6 +42,7 @@ _unit setVariable [QEGVAR(brain,ICP),10,true]; _unit setVariable [QEGVAR(brain,CPR),100,true]; _unit setVariable [QEGVAR(brain,rO2),80,true]; _unit setVariable [QEGVAR(brain,necrosis),0,true]; +_unit setVariable [QGVAR(deoxygenatedTicks),0,true]; _unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; _unit setVariable [QEGVAR(brain,autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; _unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; From 833357dfe1f0fbaad27e17fe6026ac1e5f26e3b6 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Tue, 18 Jun 2024 19:34:21 +0100 Subject: [PATCH 13/37] Add CMR tracker --- addons/brain/functions/fnc_handleBrainActivity.sqf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index f064892b4..fb1648fc5 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -53,9 +53,15 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { if (_deoxygenatedTicks == GVAR(necrosisThreshold)) then { _necrosis = (_necrosis + GVAR(necrosisIncrease)) min 100; //TODO kill unit when this gets too high - _unit setVariable [QGVAR(necrosis),_necrosis,true]; }; + + //Finally, calculate total brain metabolic rate + _CMR = 20 * (rO2/80) * ((100-_necrosis)/100); + + _unit setVariable [QGVAR(necrosis),_necrosis,true]; + _unit setVariable [QGVAR(CMR),_CMR,true]; + }, 15, [_unit]] call CBA_fnc_addPerFrameHandler; true; \ No newline at end of file From c312d19cfb1ae9467de3e7c46dfd70c45fab291e Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Tue, 18 Jun 2024 20:24:03 +0100 Subject: [PATCH 14/37] Add concussion chances --- addons/brain/XEH_PREP.hpp | 1 + addons/brain/XEH_preInit.sqf | 21 +++++++++++++++ addons/brain/functions/fnc_concussion.sqf | 32 +++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 addons/brain/functions/fnc_concussion.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 527ec75ae..daa39d948 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,3 +1,4 @@ +PREP(concussion); PREP(handleAutoregulation); PREP(handleBrainActivity); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index c1a0f08b1..090c323e4 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -18,6 +18,26 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +//Minimum damage required for a concussion to occur +[ + QGVAR(concussionDamage), + "SLIDER", + [LLSTRING(SETTING_concussionDamage)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [0, 2, 1, 1], + true +] call CBA_Settings_fnc_init; + +//Chance of a concussion occuring +[ + QGVAR(concussionChance), + "SLIDER", + [LLSTRING(SETTING_concussionChance)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [0, 100, 5, 1], + true +] call CBA_Settings_fnc_init; + // Number of ticks required until tissue necrosis begins to occur [ QGVAR(necrosisTicks), @@ -27,6 +47,7 @@ PREP_RECOMPILE_END; [1, 60, 10, 0], true ] call CBA_Settings_fnc_init; + // rO2 value required before necrosis occurs [ QGVAR(necrosisThreshold), diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf new file mode 100644 index 000000000..2ec891f05 --- /dev/null +++ b/addons/brain/functions/fnc_concussion.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Called when a unit is hit. Handles receiving TBIs and setting up dedicated PFHs to increase ICP. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 0: Damage + * 1: Bodypart + * 2: Shooter + * 3: Ammo classname or damage type + * + * Return Value: + * None + * + * Example: + * [cursorTarget, [1, "Head"], objNull, "BulletBase"] call kat_brain_fnc_concussion + * + * Public: No + */ + + params ["_unit", "_allDamages", "", "_ammo"]; +_allDamages select 0 params ["_damage", "_bodyPart"]; + +if (!(GVAR(enable)) || !(_bodyPart isEqualTo "Head")) exitWith {}; +if (_damage < GVAR(concussionDamage)) exitWith {}; +if (!(_ammo in ["vehiclehit","explosive","shell","vehiclecrash"])) exitWith {}; + +// Increase the chance of concussions depending on the damage type +private _chanceIncrease = linearConversion [0,3,(["vehiclehit","explosive","shell","vehiclecrash"] find _ammo),1,1.5,true]; +private _concussionChance = GVAR(concussionChance) * _chanceIncrease \ No newline at end of file From 1e3c0de6f0c20f0c06d56876f39abdacfd3e54ad Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 16:50:13 +0100 Subject: [PATCH 15/37] Set up concussion PFHs --- addons/brain/XEH_preInit.sqf | 10 ------- addons/brain/functions/fnc_concussion.sqf | 31 ++++++++++++++++++--- addons/brain/functions/fnc_init.sqf | 5 +++- addons/misc/functions/fnc_handleRespawn.sqf | 2 ++ 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index 090c323e4..37a26205a 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -18,16 +18,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -//Minimum damage required for a concussion to occur -[ - QGVAR(concussionDamage), - "SLIDER", - [LLSTRING(SETTING_concussionDamage)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], - [0, 2, 1, 1], - true -] call CBA_Settings_fnc_init; - //Chance of a concussion occuring [ QGVAR(concussionChance), diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf index 2ec891f05..e7c5fcfab 100644 --- a/addons/brain/functions/fnc_concussion.sqf +++ b/addons/brain/functions/fnc_concussion.sqf @@ -24,9 +24,32 @@ _allDamages select 0 params ["_damage", "_bodyPart"]; if (!(GVAR(enable)) || !(_bodyPart isEqualTo "Head")) exitWith {}; -if (_damage < GVAR(concussionDamage)) exitWith {}; -if (!(_ammo in ["vehiclehit","explosive","shell","vehiclecrash"])) exitWith {}; +// Increase the chance based on how much damage was received +private _chanceIncrease = linearConversion [0,1,_damage,5,30,true]; // Increase the chance of concussions depending on the damage type -private _chanceIncrease = linearConversion [0,3,(["vehiclehit","explosive","shell","vehiclecrash"] find _ammo),1,1.5,true]; -private _concussionChance = GVAR(concussionChance) * _chanceIncrease \ No newline at end of file +private _chanceMultiplier = linearConversion [0,3,(["vehiclehit","explosive","shell","vehiclecrash"] find _ammo),1,1.5,true]; + +private _concussionChance = (GVAR(concussionChance) + _chanceIncrease) * _chanceMultiplier; +if (floor (random 100) <= _concussionChance) then { + private _currentSeverity = _unit getVariable [QGVAR(concussionSeverity),0]) + private _newSeverity = linearConversion [0, 3,_damage,0,1,true]; + if (_newSeverity > _currentSeverity) then { //Replace the current concussion with the more severe one + if !(_currentSeverity isEqualTo 0) then { //Delete the existing concussion PFH if it exists + private _existingPFH = _unit getVariable [QGVAR(concussionPFH),0]; + [_existingPFH] call CBA_fnc_removePerFrameHandler; + } + + [{ + params ["_args", "_idPFH"]; + _args params ["_unit","_severity"]; + if !(alive _unit) exitWith { + _unit setVariable [QGVAR(concussionPFH),0,true]; + _unit setVariable [QGVAR(concussionSeverity),0,true]; + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + }, 15, [_unit,_newSeverity]] call CBA_fnc_addPerFrameHandler; + } + +}; \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index a8cab798f..a49180d2d 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -32,4 +32,7 @@ _unit setVariable [QGVAR(deoxygenatedTicks),0,true]; _unit setVariable [QGVAR(reversibleDamage),0,true]; _unit setVariable [QGVAR(autoregulationPFH), [_unit] call FUNC(handleAutoregulation),true]; -_unit setVariable [QGVAR(activityPFH), [_unit] call FUNC(handleBrainActivity),true]; \ No newline at end of file +_unit setVariable [QGVAR(activityPFH), [_unit] call FUNC(handleBrainActivity),true]; + +_unit setVariable [QGVAR(concussionPFH),0,true]; +_unit setVariable [QGVAR(concussionSeverity),0,true]; \ No newline at end of file diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index 0097cb306..ba8d2d7f7 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -46,6 +46,8 @@ _unit setVariable [QGVAR(deoxygenatedTicks),0,true]; _unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; _unit setVariable [QEGVAR(brain,autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; _unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; +_unit setVariable [QEGVAR(brain,concussionPFH),0,true]; +_unit setVariable [QEGVAR(brain,concussionSeverity),0,true]; // KAT Breathing From 84ce976b0c431abced92b9e94ff87a66cfaceda0 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 17:42:36 +0100 Subject: [PATCH 16/37] Add concussions that increase ICP --- addons/brain/XEH_postInit.sqf | 3 +- addons/brain/XEH_preInit.sqf | 22 ++++++++- addons/brain/functions/fnc_concussion.sqf | 54 ++++++++++++++++----- addons/brain/functions/fnc_init.sqf | 2 +- addons/misc/functions/fnc_handleRespawn.sqf | 2 +- 5 files changed, 66 insertions(+), 17 deletions(-) diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index 5374c5166..29111c0b7 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" [QGVAR(handleAutoregulation), LINKFUNC(handleAutoregulation)] call CBA_fnc_addEventHandler; -[QGVAR(handleBrainActivity), LINKFUNC(handleBrainActivity)] call CBA_fnc_addEventHandler; \ No newline at end of file +[QGVAR(handleBrainActivity), LINKFUNC(handleBrainActivity)] call CBA_fnc_addEventHandler; +[QACEGVAR(medical,woundReceived),LINKFUNC(concussion)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index 37a26205a..9c787b330 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -28,6 +28,26 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +// Minimum impact damage required to cause healable tissue damage upon receiving a concussion +[ + QGVAR(tissueImpactDamage), + "SLIDER", + [LLSTRING(SETTING_tissueImpactDamage)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [1, 3, 0.3, 1], + true +] call CBA_Settings_fnc_init; + +// Minimum impact damage required to cause instant tissue necrosis upon receiving a concussion +[ + QGVAR(necrosisImpactDamage), + "SLIDER", + [LLSTRING(SETTING_necrosisImpactDamage)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [1, 3, 0.9, 1], + true +] call CBA_Settings_fnc_init; + // Number of ticks required until tissue necrosis begins to occur [ QGVAR(necrosisTicks), @@ -44,7 +64,7 @@ PREP_RECOMPILE_END; "SLIDER", [LLSTRING(SETTING_necrosisThreshold)], [CBA_SETTINGS_CAT, LSTRING(SubCategory_BrainDeath)], - [1, 80, 50, 0], + [1, 80, 60, 0], true ] call CBA_Settings_fnc_init; diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf index e7c5fcfab..a100725c0 100644 --- a/addons/brain/functions/fnc_concussion.sqf +++ b/addons/brain/functions/fnc_concussion.sqf @@ -28,28 +28,56 @@ if (!(GVAR(enable)) || !(_bodyPart isEqualTo "Head")) exitWith {}; // Increase the chance based on how much damage was received private _chanceIncrease = linearConversion [0,1,_damage,5,30,true]; // Increase the chance of concussions depending on the damage type -private _chanceMultiplier = linearConversion [0,3,(["vehiclehit","explosive","shell","vehiclecrash"] find _ammo),1,1.5,true]; +private _chanceMultiplier = 1; +if (_ammo in ["vehiclehit","explosive","shell","vehiclecrash"]) then { + _chanceMultiplier = linearConversion [0,3,(["vehiclehit","explosive","shell","vehiclecrash"] find _ammo),1.2,2,true]; +}; private _concussionChance = (GVAR(concussionChance) + _chanceIncrease) * _chanceMultiplier; if (floor (random 100) <= _concussionChance) then { - private _currentSeverity = _unit getVariable [QGVAR(concussionSeverity),0]) - private _newSeverity = linearConversion [0, 3,_damage,0,1,true]; + private _currentSeverity = _unit getVariable [QGVAR(concussionSeverity),0]; + private _newSeverity = linearConversion [0, 1,_damage,0,0.6,true]; if (_newSeverity > _currentSeverity) then { //Replace the current concussion with the more severe one + // Add instantaneous effects from concussions + if (_damage > GVAR(necrosisImpactDamage)) then { // Cause instant necrosis if threshold is surpassed + private _necrosis = _unit getVariable [QGVAR(necrosis),0]; + private _newNecrosis = linearConversion [0, 3,_damage,0,1,true]; //Increase tissue necrosis by 1% max on impact + if (_newNecrosis > _necrosis) then { // Prevent reverting existing necrosis levels + _unit setVariable [QGVAR(necrosis),_newNecrosis,true]; + }; + }; + if (_damage > GVAR(tissueImpactDamage)) then { // Cause reversible tissue damage if threshold is surpassed + private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0]; + _reversibleDamage = _reversibleDamage + (linearConversion [0,3,_damage,0,5,true]); //Increase reversible damage by max 5% on impact + _unit setVariable [QGVAR(reversibleDamage),_reversibleDamage,true]; + }; + + // Increase ICP to a base level depending on damage taken + private _ICP = _unit getVariable [QGVAR(ICP),10]; + private _ICPincrease = linearConversion [0, 1,_damage,0,2,true]; + _unit setVariable [QGVAR(ICP),_ICP+_damage,true]; + + // Set up PFH if !(_currentSeverity isEqualTo 0) then { //Delete the existing concussion PFH if it exists private _existingPFH = _unit getVariable [QGVAR(concussionPFH),0]; [_existingPFH] call CBA_fnc_removePerFrameHandler; - } - - [{ - params ["_args", "_idPFH"]; - _args params ["_unit","_severity"]; - if !(alive _unit) exitWith { - _unit setVariable [QGVAR(concussionPFH),0,true]; - _unit setVariable [QGVAR(concussionSeverity),0,true]; - [_idPFH] call CBA_fnc_removePerFrameHandler; }; + private _newPFH = [{ + params ["_args", "_idPFH"]; + _args params ["_unit","_severity"]; + if !(alive _unit) exitWith { + _unit setVariable [QGVAR(concussionPFH),0,true]; + _unit setVariable [QGVAR(concussionSeverity),0,true]; + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _ICP = _unit getVariable [QGVAR(ICP),10]; + _unit setVariable [QGVAR(ICP),_ICP+_severity,true]; //Increase ICP by concussion severity - }, 15, [_unit,_newSeverity]] call CBA_fnc_addPerFrameHandler; + }, 10, [_unit,_newSeverity]] call CBA_fnc_addPerFrameHandler; + + _unit setVariable [QGVAR(concussionPFH),_newPFH,true]; + _unit setVariable [QGVAR(concussionSeverity),_newSeverity,true]; } }; \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index a49180d2d..787960679 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -23,7 +23,7 @@ if !(GVAR(enable)) exitWith {}; _unit setVariable [QGVAR(CMR),20,true]; // Cerebral Metabolic Rate _unit setVariable [QGVAR(CBF),800,true]; // Cerebral Blood Flow _unit setVariable [QGVAR(CVR),0.1,true]; // Cerebral Vascular Resistance -_unit setVariable [QGVAR(ICP),10,true]; // Intracranial Pressure +_unit setVariable [QGVAR(ICP),15,true]; // Intracranial Pressure _unit setVariable [QGVAR(CPR),100,true]; // Cerebral Perfusion Rate _unit setVariable [QGVAR(rO2),80,true]; // Brain O2 saturation diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index ba8d2d7f7..368a08e39 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -38,7 +38,7 @@ _unit setVariable [QEGVAR(airway,clearedTime), 0, true]; _unit setVariable [QEGVAR(brain,CMR),20,true]; _unit setVariable [QEGVAR(brain,CBF),800,true]; _unit setVariable [QEGVAR(brain,CVR),0.1,true]; -_unit setVariable [QEGVAR(brain,ICP),10,true]; +_unit setVariable [QEGVAR(brain,ICP),15,true]; _unit setVariable [QEGVAR(brain,CPR),100,true]; _unit setVariable [QEGVAR(brain,rO2),80,true]; _unit setVariable [QEGVAR(brain,necrosis),0,true]; From 1d4702c81cb126b6cac06cc8e40b3d41c3c630f2 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 19:36:27 +0100 Subject: [PATCH 17/37] Prevent ICP from exceeding a maximum value depending on concussion severity --- addons/brain/functions/fnc_concussion.sqf | 19 +++++++++++++++---- .../functions/fnc_handleBrainActivity.sqf | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf index a100725c0..405bc66db 100644 --- a/addons/brain/functions/fnc_concussion.sqf +++ b/addons/brain/functions/fnc_concussion.sqf @@ -36,7 +36,7 @@ if (_ammo in ["vehiclehit","explosive","shell","vehiclecrash"]) then { private _concussionChance = (GVAR(concussionChance) + _chanceIncrease) * _chanceMultiplier; if (floor (random 100) <= _concussionChance) then { private _currentSeverity = _unit getVariable [QGVAR(concussionSeverity),0]; - private _newSeverity = linearConversion [0, 1,_damage,0,0.6,true]; + private _newSeverity = linearConversion [0, 2,_damage,0,1,true]; if (_newSeverity > _currentSeverity) then { //Replace the current concussion with the more severe one // Add instantaneous effects from concussions if (_damage > GVAR(necrosisImpactDamage)) then { // Cause instant necrosis if threshold is surpassed @@ -62,9 +62,11 @@ if (floor (random 100) <= _concussionChance) then { private _existingPFH = _unit getVariable [QGVAR(concussionPFH),0]; [_existingPFH] call CBA_fnc_removePerFrameHandler; }; + + private _maxICPIncrease = linearConversion [0,1,_newSeverity,10,40]; private _newPFH = [{ params ["_args", "_idPFH"]; - _args params ["_unit","_severity"]; + _args params ["_unit","_severity","_maxICPIncrease"]; if !(alive _unit) exitWith { _unit setVariable [QGVAR(concussionPFH),0,true]; _unit setVariable [QGVAR(concussionSeverity),0,true]; @@ -72,9 +74,18 @@ if (floor (random 100) <= _concussionChance) then { }; private _ICP = _unit getVariable [QGVAR(ICP),10]; - _unit setVariable [QGVAR(ICP),_ICP+_severity,true]; //Increase ICP by concussion severity + + //Kill the concussion once ICP reaches the limit for the concussion's severity + if (_ICP >= (20+_maxICPIncrease)) exitWith { + _unit setVariable [QGVAR(concussionPFH),0,true]; + _unit setVariable [QGVAR(concussionSeverity),0,true]; + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _ICPincrease = linearConversion [0,1,_severity,0,0.6,true]; + _unit setVariable [QGVAR(ICP),_ICP+_ICPincrease,true]; //Increase ICP by concussion severity - }, 10, [_unit,_newSeverity]] call CBA_fnc_addPerFrameHandler; + }, 10, [_unit,_newSeverity,_maxICPIncrease]] call CBA_fnc_addPerFrameHandler; _unit setVariable [QGVAR(concussionPFH),_newPFH,true]; _unit setVariable [QGVAR(concussionSeverity),_newSeverity,true]; diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index fb1648fc5..b43028f5f 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -55,9 +55,10 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { //TODO kill unit when this gets too high }; + private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0]; //Finally, calculate total brain metabolic rate - _CMR = 20 * (rO2/80) * ((100-_necrosis)/100); + _CMR = 20 * (rO2/80) * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100); _unit setVariable [QGVAR(necrosis),_necrosis,true]; _unit setVariable [QGVAR(CMR),_CMR,true]; From fb84d1d2e4c09561f5d771194d985fe99078acc1 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 20:12:17 +0100 Subject: [PATCH 18/37] Add ICP decreasing when not swelling --- addons/brain/XEH_preInit.sqf | 14 +++++++++-- addons/brain/functions/fnc_concussion.sqf | 10 ++++---- .../functions/fnc_handleBrainActivity.sqf | 23 +++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index 9c787b330..cd96f5237 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -18,6 +18,16 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +//Amount to reduce ICP by when brain is not actively swelling +[ + QGVAR(ICPreduction), + "SLIDER", + [LLSTRING(SETTING_ICPreduction)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Basic)], + [0, 2, 0.3, 1], + true +] call CBA_Settings_fnc_init; + //Chance of a concussion occuring [ QGVAR(concussionChance), @@ -34,7 +44,7 @@ PREP_RECOMPILE_END; "SLIDER", [LLSTRING(SETTING_tissueImpactDamage)], [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], - [1, 3, 0.3, 1], + [0, 2, 0.3, 1], true ] call CBA_Settings_fnc_init; @@ -44,7 +54,7 @@ PREP_RECOMPILE_END; "SLIDER", [LLSTRING(SETTING_necrosisImpactDamage)], [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], - [1, 3, 0.9, 1], + [0, 2, 0.8, 1], true ] call CBA_Settings_fnc_init; diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf index 405bc66db..01438999d 100644 --- a/addons/brain/functions/fnc_concussion.sqf +++ b/addons/brain/functions/fnc_concussion.sqf @@ -41,20 +41,20 @@ if (floor (random 100) <= _concussionChance) then { // Add instantaneous effects from concussions if (_damage > GVAR(necrosisImpactDamage)) then { // Cause instant necrosis if threshold is surpassed private _necrosis = _unit getVariable [QGVAR(necrosis),0]; - private _newNecrosis = linearConversion [0, 3,_damage,0,1,true]; //Increase tissue necrosis by 1% max on impact + private _newNecrosis = linearConversion [0, 3,_damage,0,4,true]; //Increase tissue necrosis by 1% max on impact if (_newNecrosis > _necrosis) then { // Prevent reverting existing necrosis levels _unit setVariable [QGVAR(necrosis),_newNecrosis,true]; }; }; if (_damage > GVAR(tissueImpactDamage)) then { // Cause reversible tissue damage if threshold is surpassed private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0]; - _reversibleDamage = _reversibleDamage + (linearConversion [0,3,_damage,0,5,true]); //Increase reversible damage by max 5% on impact + _reversibleDamage = _reversibleDamage + (linearConversion [0,3,_damage,0,15,true]); //Increase reversible damage by max 5% on impact _unit setVariable [QGVAR(reversibleDamage),_reversibleDamage,true]; }; // Increase ICP to a base level depending on damage taken private _ICP = _unit getVariable [QGVAR(ICP),10]; - private _ICPincrease = linearConversion [0, 1,_damage,0,2,true]; + private _ICPincrease = linearConversion [0, 1,_damage,1,3,true]; _unit setVariable [QGVAR(ICP),_ICP+_damage,true]; // Set up PFH @@ -63,7 +63,7 @@ if (floor (random 100) <= _concussionChance) then { [_existingPFH] call CBA_fnc_removePerFrameHandler; }; - private _maxICPIncrease = linearConversion [0,1,_newSeverity,10,40]; + private _maxICPIncrease = linearConversion [0,1,_newSeverity,0,40]; private _newPFH = [{ params ["_args", "_idPFH"]; _args params ["_unit","_severity","_maxICPIncrease"]; @@ -82,7 +82,7 @@ if (floor (random 100) <= _concussionChance) then { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _ICPincrease = linearConversion [0,1,_severity,0,0.6,true]; + private _ICPincrease = linearConversion [0,1,_severity,0,1.2,true]; _unit setVariable [QGVAR(ICP),_ICP+_ICPincrease,true]; //Increase ICP by concussion severity }, 10, [_unit,_newSeverity,_maxICPIncrease]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index b43028f5f..951bc5e08 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -63,6 +63,29 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { _unit setVariable [QGVAR(necrosis),_necrosis,true]; _unit setVariable [QGVAR(CMR),_CMR,true]; + //Reduce ICP if no longer swelling + if (_unit getVariable [QGVAR(concussionPFH),0] isEqualTo 0) then { + private _ICP = _unit getVariable [QGVAR(ICP),15]; + private _newICP = _ICP - GVAR(ICPreduction); + + // Set "floors" for ICP, preventing ICP from returning to normal levels without pain suppression + if (GET_PAIN_SUPPRESS(_unit) < 0.6) then { + switch (true) do { + case (ICP >= 45): { + _newICP = 45 max _newICP; + }; + case (ICP >= 38): { + _newICP = 38 max _newICP; + }; + default { //Prevent ICP from returning to normal without medication + _newICP = 25 max _newICP; + }; + }; + }; + _newICP = 15 max _newICP; + _unit setVariable [QGVAR(ICP),_newICP,true]; + }; + }, 15, [_unit]] call CBA_fnc_addPerFrameHandler; true; \ No newline at end of file From 064f33e5973ed958dd224c7023e7e7b28fd71a00 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 20:22:41 +0100 Subject: [PATCH 19/37] Fix CMR tracker --- addons/brain/functions/fnc_handleBrainActivity.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index 951bc5e08..bf682ac05 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -58,7 +58,7 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0]; //Finally, calculate total brain metabolic rate - _CMR = 20 * (rO2/80) * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100); + private _CMR = 20 * (_rO2/80) * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100); _unit setVariable [QGVAR(necrosis),_necrosis,true]; _unit setVariable [QGVAR(CMR),_CMR,true]; From 9e1fc3fe54cdd3b12c3f8da2ef027b882dbb063a Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 20:32:11 +0100 Subject: [PATCH 20/37] Raised ICP causes emesis --- addons/airway/functions/fnc_handlePuking.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/airway/functions/fnc_handlePuking.sqf b/addons/airway/functions/fnc_handlePuking.sqf index 7e4f1269a..e595e6fb5 100644 --- a/addons/airway/functions/fnc_handlePuking.sqf +++ b/addons/airway/functions/fnc_handlePuking.sqf @@ -35,7 +35,7 @@ _unit setVariable ["kat_pukeActive_PFH", true]; if (GVAR(occlusion_cooldownPeriod) > 0 && {(_unit getVariable [QGVAR(clearedTime), 0] > 0) && ((_unit getVariable [QGVAR(clearedTime), 0]) + GVAR(occlusion_cooldownPeriod)) > CBA_missionTime}) exitWith {}; - if (random(100) <= GVAR(probability_occluded)) then { + if ((random(100) <= GVAR(probability_occluded)) || (_unit getVariable [QEGVAR(brain,ICP),15] > 25)) then { if !(_unit getVariable [QGVAR(occluded), false]) then { _unit setVariable [QGVAR(occluded), true, true]; if (GVAR(checkbox_puking_sound)) then { From d2a9e0e9de2c4f78f65f71db55123f10717a0535 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 21:05:37 +0100 Subject: [PATCH 21/37] Add bradycardia side effect from high ICP --- addons/brain/XEH_preInit.sqf | 21 +++++++++++++++++++ .../functions/fnc_handleBrainActivity.sqf | 18 +++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index cd96f5237..c48eb99c0 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -58,6 +58,27 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +// Minimum ICP required for bradycardia to occur as a result +[ + QGVAR(ICPbradycardiaThreshold), + "SLIDER", + [LLSTRING(SETTING_ICPbradycardiaThreshold)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [20, 70, 40, 1], + true +] call CBA_Settings_fnc_init; + + +//Chance of bradycardia occuring +[ + QGVAR(ICPbradycardiaChance), + "SLIDER", + [LLSTRING(SETTING_ICPbradycardiaChance)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], + [0, 100, 15, 1], + true +] call CBA_Settings_fnc_init; + // Number of ticks required until tissue necrosis begins to occur [ QGVAR(necrosisTicks), diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index bf682ac05..bf6ee4e5a 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -63,9 +63,10 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { _unit setVariable [QGVAR(necrosis),_necrosis,true]; _unit setVariable [QGVAR(CMR),_CMR,true]; + private _ICP = _unit getVariable [QGVAR(ICP),15]; //Reduce ICP if no longer swelling if (_unit getVariable [QGVAR(concussionPFH),0] isEqualTo 0) then { - private _ICP = _unit getVariable [QGVAR(ICP),15]; + private _newICP = _ICP - GVAR(ICPreduction); // Set "floors" for ICP, preventing ICP from returning to normal levels without pain suppression @@ -86,6 +87,21 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { _unit setVariable [QGVAR(ICP),_newICP,true]; }; + //Chance to cause bradycardia if ICP is too high + if (_ICP >= GVAR(ICPbradycardiaThreshold)) then { + if !(floor (random 100) <= GVAR(ICPbradycardiaChance)) exitWith {}; + + scopeName "causeBradycardia"; + { //Prevent adding bradycardia if it already exists + _x params ["_medication"]; + if (_medication isEqualTo "BRADYCARDIA") exitWith { + breakOut "causeBradycardia"; + }; + } forEach (_unit getVariable [QACEGVAR(medical,medications), []]); + + [_unit, "BRADYCARDIA", 120, 1200, -40, 0, 0] call ACEFUNC(medical_status,addMedicationAdjustment); + }; + }, 15, [_unit]] call CBA_fnc_addPerFrameHandler; true; \ No newline at end of file From 8a0e989084c4b7b454b83eb95b993cfa35efbca3 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 21:43:22 +0100 Subject: [PATCH 22/37] Add LOC for low CMR --- addons/brain/XEH_preInit.sqf | 34 +++++++++++++++++-- addons/brain/functions/fnc_concussion.sqf | 4 +-- .../functions/fnc_handleBrainActivity.sqf | 7 +++- addons/misc/functions/fnc_hasStableVitals.sqf | 3 ++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index c48eb99c0..5c4336f8f 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -23,11 +23,41 @@ PREP_RECOMPILE_END; QGVAR(ICPreduction), "SLIDER", [LLSTRING(SETTING_ICPreduction)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Basic)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], [0, 2, 0.3, 1], true ] call CBA_Settings_fnc_init; +// Minimum CMR to sustain consciousness. Not achieving will prevent awakening +[ + QGVAR(stableCMR), + "SLIDER", + [LLSTRING(SETTING_stableCMR)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [0, 20, 16, 1], + true +] call CBA_Settings_fnc_init; + +// Minimum CMR required for unit to pass out randomly +[ + QGVAR(CMRunconsciousThreshold), + "SLIDER", + [LLSTRING(SETTING_CMRunconsciousThreshold)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [0, 20, 18, 1], + true +] call CBA_Settings_fnc_init; + +//Chance for a unit to pass out randomly from low CMR +[ + QGVAR(CMRunconsciousChance), + "SLIDER", + [LLSTRING(SETTING_concussionChance)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [0, 100, 20, 1], + true +] call CBA_Settings_fnc_init; + //Chance of a concussion occuring [ QGVAR(concussionChance), @@ -64,7 +94,7 @@ PREP_RECOMPILE_END; "SLIDER", [LLSTRING(SETTING_ICPbradycardiaThreshold)], [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)], - [20, 70, 40, 1], + [20, 70, 50, 1], true ] call CBA_Settings_fnc_init; diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf index 01438999d..97815df85 100644 --- a/addons/brain/functions/fnc_concussion.sqf +++ b/addons/brain/functions/fnc_concussion.sqf @@ -63,7 +63,7 @@ if (floor (random 100) <= _concussionChance) then { [_existingPFH] call CBA_fnc_removePerFrameHandler; }; - private _maxICPIncrease = linearConversion [0,1,_newSeverity,0,40]; + private _maxICPIncrease = linearConversion [0,1,_newSeverity,0,50]; private _newPFH = [{ params ["_args", "_idPFH"]; _args params ["_unit","_severity","_maxICPIncrease"]; @@ -82,7 +82,7 @@ if (floor (random 100) <= _concussionChance) then { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _ICPincrease = linearConversion [0,1,_severity,0,1.2,true]; + private _ICPincrease = linearConversion [0,1,_severity,0,2,true]; _unit setVariable [QGVAR(ICP),_ICP+_ICPincrease,true]; //Increase ICP by concussion severity }, 10, [_unit,_newSeverity,_maxICPIncrease]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index bf6ee4e5a..1ad0cc3f2 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -98,10 +98,15 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { breakOut "causeBradycardia"; }; } forEach (_unit getVariable [QACEGVAR(medical,medications), []]); - + [_unit, "BRADYCARDIA", 120, 1200, -40, 0, 0] call ACEFUNC(medical_status,addMedicationAdjustment); }; + //Cause LOC if CMR becomes too low + if (_CMR <= GVAR(CMRunconsciousThreshold) && !(_unit getVariable ["ACE_isUnconscious",false])) then { + if (!(floor (random 100) <= GVAR(CMRunconsciousChance)) && (_CMR >= GVAR(stableCMR))) exitWith {}; + [QACEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; }, 15, [_unit]] call CBA_fnc_addPerFrameHandler; true; \ No newline at end of file diff --git a/addons/misc/functions/fnc_hasStableVitals.sqf b/addons/misc/functions/fnc_hasStableVitals.sqf index f761a38cc..44edf0a51 100644 --- a/addons/misc/functions/fnc_hasStableVitals.sqf +++ b/addons/misc/functions/fnc_hasStableVitals.sqf @@ -38,4 +38,7 @@ if (_heartRate < 40) exitWith { false }; private _o2 = _unit getVariable [QEGVAR(breathing,airwayStatus), 100]; if (_o2 < EGVAR(breathing,Stable_spo2)) exitWith { false }; +private _CMR = _unit getVariable [QEGVAR(brain,CMR),20]; +if (_CMR < EGVAR(brain,stableCMR)) exitWith { false }; + true From bb70efeafb41094a60bfecf9c74feb71968f5c0d Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 22:25:40 +0100 Subject: [PATCH 23/37] Migrate handlerespawn functionality to correct addon --- addons/brain/XEH_PREP.hpp | 1 + addons/brain/XEH_postInit.sqf | 4 ++- addons/brain/functions/fnc_handleRespawn.sqf | 36 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 addons/brain/functions/fnc_handleRespawn.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index daa39d948..8578bd1fb 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,4 +1,5 @@ PREP(concussion); PREP(handleAutoregulation); PREP(handleBrainActivity); +PREP(handleRespawn); PREP(init); \ No newline at end of file diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index 29111c0b7..a24ea46b4 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -2,4 +2,6 @@ [QGVAR(handleAutoregulation), LINKFUNC(handleAutoregulation)] call CBA_fnc_addEventHandler; [QGVAR(handleBrainActivity), LINKFUNC(handleBrainActivity)] call CBA_fnc_addEventHandler; -[QACEGVAR(medical,woundReceived),LINKFUNC(concussion)] call CBA_fnc_addEventHandler; \ No newline at end of file +[QACEGVAR(medical,woundReceived),LINKFUNC(concussion)] call CBA_fnc_addEventHandler; + +[QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler; diff --git a/addons/brain/functions/fnc_handleRespawn.sqf b/addons/brain/functions/fnc_handleRespawn.sqf new file mode 100644 index 000000000..847f40727 --- /dev/null +++ b/addons/brain/functions/fnc_handleRespawn.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Ensures proper initial values reset on respawn + * + * Arguments: + * 0: Unit + * 1: Corpse + * + * Return Value: + * None + * + * Example: + * [alive, body] call kat_brain_fnc_handleRespawn; + * + * Public: No + */ + +params ["_unit","_dead"]; +TRACE_2("handleRespawn",_unit,_dead); + +[_unit] call FUNC(fullHealLocal); + +_unit setVariable [QEGVAR(brain,CMR),20,true]; +_unit setVariable [QEGVAR(brain,CBF),800,true]; +_unit setVariable [QEGVAR(brain,CVR),0.1,true]; +_unit setVariable [QEGVAR(brain,ICP),15,true]; +_unit setVariable [QEGVAR(brain,CPR),100,true]; +_unit setVariable [QEGVAR(brain,rO2),80,true]; +_unit setVariable [QEGVAR(brain,necrosis),0,true]; +_unit setVariable [QGVAR(deoxygenatedTicks),0,true]; +_unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; +_unit setVariable [QEGVAR(brain,autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; +_unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; +_unit setVariable [QEGVAR(brain,concussionPFH),0,true]; +_unit setVariable [QEGVAR(brain,concussionSeverity),0,true]; \ No newline at end of file From 7634e9ac27537e5a96294a8a51a817eaeb8d65fb Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 22:27:34 +0100 Subject: [PATCH 24/37] Update misc handleRespawn --- addons/misc/functions/fnc_handleRespawn.sqf | 90 +-------------------- 1 file changed, 1 insertion(+), 89 deletions(-) diff --git a/addons/misc/functions/fnc_handleRespawn.sqf b/addons/misc/functions/fnc_handleRespawn.sqf index 368a08e39..c1d15cf34 100644 --- a/addons/misc/functions/fnc_handleRespawn.sqf +++ b/addons/misc/functions/fnc_handleRespawn.sqf @@ -21,94 +21,6 @@ TRACE_2("handleRespawn",_unit,_dead); if (!local _unit) exitWith {}; -// KAT Airway - -_unit setVariable [QEGVAR(airway,obstruction), false, true]; -_unit setVariable [QEGVAR(airway,airway), false, true]; -_unit setVariable [QEGVAR(airway,occluded), false, true]; -_unit setVariable [QEGVAR(airway,overstretch), false, true]; -_unit setVariable [QEGVAR(airway,wasOccluded), false]; -KAT_forceWakeup = false; -_unit setVariable [QEGVAR(airway,recovery), false, true]; -_unit setVariable [QEGVAR(airway,airway_item), "", true]; -_unit setVariable [QEGVAR(airway,clearedTime), 0, true]; - -// KAT Brain - -_unit setVariable [QEGVAR(brain,CMR),20,true]; -_unit setVariable [QEGVAR(brain,CBF),800,true]; -_unit setVariable [QEGVAR(brain,CVR),0.1,true]; -_unit setVariable [QEGVAR(brain,ICP),15,true]; -_unit setVariable [QEGVAR(brain,CPR),100,true]; -_unit setVariable [QEGVAR(brain,rO2),80,true]; -_unit setVariable [QEGVAR(brain,necrosis),0,true]; -_unit setVariable [QGVAR(deoxygenatedTicks),0,true]; -_unit setVariable [QEGVAR(brain,reversibleDamage),0,true]; -_unit setVariable [QEGVAR(brain,autoregulationPFH), [_unit] call EFUNC(brain,handleAutoregulation),true]; -_unit setVariable [QEGVAR(brain,activityPFH), [_unit] call EFUNC(brain,handleBrainActivity),true]; -_unit setVariable [QEGVAR(brain,concussionPFH),0,true]; -_unit setVariable [QEGVAR(brain,concussionSeverity),0,true]; - - -// KAT Breathing - -_unit setVariable [QEGVAR(breathing,airwayStatus), 100, true]; -_unit setVariable [QEGVAR(breathing,pneumothorax), 0, true]; -_unit setVariable [QEGVAR(breathing,hemopneumothorax), false, true]; -_unit setVariable [QEGVAR(breathing,tensionpneumothorax), false, true]; -_unit setVariable [QEGVAR(breathing,activeChestSeal), false, true]; -_unit setVariable [QEGVAR(breathing,deepPenetratingInjury), false, true]; -_unit setVariable [QEGVAR(breathing,PneumoBreathCooldownOn), false, true]; - -_unit setVariable [QEGVAR(breathing,BVMInUse), false, true]; -_unit setVariable [QEGVAR(breathing,oxygenTankConnected), false, true]; -_unit setVariable [QEGVAR(breathing,oxygenTankPreferred), "", true]; - -_unit setVariable [QEGVAR(breathing,pulseoximeter), false, true]; -_unit setVariable [QEGVAR(breathing,PulseOximeter_Volume), false, true]; -_unit setVariable [QEGVAR(breathing,PulseOximeter_VolumePatient), false, true]; -_unit setVariable [QEGVAR(breathing,PulseOximeter_Attached), [0,0], true]; - -_unit setVariable ["kat_PulseoxiInUse_PFH", nil, true]; -_unit setVariable ["kat_O2Breathing_PFH", nil, true]; - -_unit setVariable [QEGVAR(breathing,usingStethoscope), nil]; - -// KAT Circulation - -_unit setVariable ["kat_AEDXPatient_PFH", nil, true]; -_unit setVariable ["kat_AEDXPatient_HR_PFH", nil, true]; -_unit setVariable ["kat_AEDXPatient_PulseOx_PFH", nil, true]; -_unit setVariable [QEGVAR(circulation,Defibrillator_Charged), false, true]; -_unit setVariable [QEGVAR(circulation,DefibrillatorPads_Connected), false, true]; -_unit setVariable [QEGVAR(circulation,AED_X_MedicVitalsMonitor_Connected), false, true]; -_unit setVariable [QEGVAR(circulation,AED_X_MedicVitalsMonitor_Patient), nil, true]; -_unit setVariable [QEGVAR(circulation,AED_X_VitalsMonitor_Connected), false, true]; -_unit setVariable [QEGVAR(circulation,AED_X_VitalsMonitor_Provider), nil, true]; -_unit setVariable [QEGVAR(circulation,AED_X_VitalsMonitor_Volume), false, true]; -_unit setVariable [QEGVAR(circulation,AED_X_VitalsMonitor_VolumePatient), false, true]; -_unit setVariable [QEGVAR(circulation,Defibrillator_Provider), nil, true]; -_unit setVariable [QEGVAR(circulation,Defibrillator_ShockAmount), 0, true]; -_unit setVariable [QEGVAR(circulation,DefibrillatorInUse), false, true]; -_unit setVariable [QEGVAR(circulation,MedicDefibrillatorInUse), false, true]; -_unit setVariable [QEGVAR(circulation,MedicDefibrillator_Patient), nil, true]; -_unit setVariable [QEGVAR(circulation,cardiacArrestType), 0, true]; -_unit setVariable [QEGVAR(circulation,heartRestart), false, true]; -_unit setVariable [QEGVAR(circulation,cprCount), 2, true]; -_unit setVariable [QEGVAR(circulation,bloodtype), [_unit, _dead, true] call EFUNC(circulation,generateBloodType), true]; -_unit setVariable [QEGVAR(circulation,internalBleeding), 0, true]; -_unit setVariable [QEGVAR(circulation,StoredBloodPressure), [0,0], true]; - -_unit setVariable [VAR_BLOODPRESSURE_CHANGE, nil, true]; - -_unit setVariable [QEGVAR(circulation,isPerformingCPR), false, true]; -_unit setVariable [QEGVAR(circulation,OxygenationPeriod), 0, true]; - -// KAT Misc -_unit setVariable [QEGVAR(misc,isLeftArmFree), true, true]; -_unit setVariable [QEGVAR(misc,isRightArmFree), true, true]; -_unit setVariable [QEGVAR(misc,isLeftLegFree), true, true]; -_unit setVariable [QEGVAR(misc,isRightLegFree), true, true]; _unit setVariable [QGVAR(isLeftArmFree), true, true]; _unit setVariable [QGVAR(isRightArmFree), true, true]; _unit setVariable [QGVAR(isLeftLegFree), true, true]; @@ -119,4 +31,4 @@ _unit setVariable [QGVAR(Tourniquet_LegNecrosis), 0]; _unit setVariable [QGVAR(Tourniquet_PFH), -1]; _unit setVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0, true]; -[QGVAR(handleRespawn), _unit] call CBA_fnc_localEvent; +[QGVAR(handleRespawn), _unit] call CBA_fnc_localEvent; \ No newline at end of file From cc78886d736ba4c38afbfb4aa403061dd75681ba Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 19 Jun 2024 22:32:16 +0100 Subject: [PATCH 25/37] Migrate init file to fullHealLocal --- addons/brain/XEH_PREP.hpp | 1 + addons/brain/XEH_postInit.sqf | 1 + addons/brain/functions/fnc_fullHealLocal.sqf | 36 ++++++++++++++++++++ addons/brain/functions/fnc_init.sqf | 17 +-------- 4 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 addons/brain/functions/fnc_fullHealLocal.sqf diff --git a/addons/brain/XEH_PREP.hpp b/addons/brain/XEH_PREP.hpp index 8578bd1fb..036459261 100644 --- a/addons/brain/XEH_PREP.hpp +++ b/addons/brain/XEH_PREP.hpp @@ -1,4 +1,5 @@ PREP(concussion); +PREP(fullHealLocal); PREP(handleAutoregulation); PREP(handleBrainActivity); PREP(handleRespawn); diff --git a/addons/brain/XEH_postInit.sqf b/addons/brain/XEH_postInit.sqf index a24ea46b4..45722abb7 100644 --- a/addons/brain/XEH_postInit.sqf +++ b/addons/brain/XEH_postInit.sqf @@ -5,3 +5,4 @@ [QACEGVAR(medical,woundReceived),LINKFUNC(concussion)] call CBA_fnc_addEventHandler; [QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler; +[QACEGVAR(medical_treatment,fullHealLocalMod), LINKFUNC(fullHealLocal)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/brain/functions/fnc_fullHealLocal.sqf b/addons/brain/functions/fnc_fullHealLocal.sqf new file mode 100644 index 000000000..294cb1f18 --- /dev/null +++ b/addons/brain/functions/fnc_fullHealLocal.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Local callback for fully healing a patient. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_brain_fnc_fullHealLocal + * + * Public: No + */ + +params ["_patient"]; +TRACE_1("fullHealLocal",_patient); + +_unit setVariable [QGVAR(CMR),20,true]; // Cerebral Metabolic Rate +_unit setVariable [QGVAR(CBF),800,true]; // Cerebral Blood Flow +_unit setVariable [QGVAR(CVR),0.1,true]; // Cerebral Vascular Resistance +_unit setVariable [QGVAR(ICP),15,true]; // Intracranial Pressure +_unit setVariable [QGVAR(CPR),100,true]; // Cerebral Perfusion Rate +_unit setVariable [QGVAR(rO2),80,true]; // Brain O2 saturation + +_unit setVariable [QGVAR(necrosis),0,true]; +_unit setVariable [QGVAR(deoxygenatedTicks),0,true]; +_unit setVariable [QGVAR(reversibleDamage),0,true]; + +_unit setVariable [QGVAR(autoregulationPFH), [_unit] call FUNC(handleAutoregulation),true]; +_unit setVariable [QGVAR(activityPFH), [_unit] call FUNC(handleBrainActivity),true]; + +_unit setVariable [QGVAR(concussionPFH),0,true]; +_unit setVariable [QGVAR(concussionSeverity),0,true]; \ No newline at end of file diff --git a/addons/brain/functions/fnc_init.sqf b/addons/brain/functions/fnc_init.sqf index 787960679..e0c2bd945 100644 --- a/addons/brain/functions/fnc_init.sqf +++ b/addons/brain/functions/fnc_init.sqf @@ -20,19 +20,4 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; if !(GVAR(enable)) exitWith {}; -_unit setVariable [QGVAR(CMR),20,true]; // Cerebral Metabolic Rate -_unit setVariable [QGVAR(CBF),800,true]; // Cerebral Blood Flow -_unit setVariable [QGVAR(CVR),0.1,true]; // Cerebral Vascular Resistance -_unit setVariable [QGVAR(ICP),15,true]; // Intracranial Pressure -_unit setVariable [QGVAR(CPR),100,true]; // Cerebral Perfusion Rate -_unit setVariable [QGVAR(rO2),80,true]; // Brain O2 saturation - -_unit setVariable [QGVAR(necrosis),0,true]; -_unit setVariable [QGVAR(deoxygenatedTicks),0,true]; -_unit setVariable [QGVAR(reversibleDamage),0,true]; - -_unit setVariable [QGVAR(autoregulationPFH), [_unit] call FUNC(handleAutoregulation),true]; -_unit setVariable [QGVAR(activityPFH), [_unit] call FUNC(handleBrainActivity),true]; - -_unit setVariable [QGVAR(concussionPFH),0,true]; -_unit setVariable [QGVAR(concussionSeverity),0,true]; \ No newline at end of file +[_unit] call FUNC(fullHealLocal); \ No newline at end of file From e2609b85e79b3d1044f62cf965eb85adef1c0dc1 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Mon, 12 Aug 2024 23:07:17 +0100 Subject: [PATCH 26/37] Adjust concussion syntax --- addons/brain/functions/fnc_concussion.sqf | 13 ++++++------- addons/brain/functions/fnc_fullHealLocal.sqf | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf index 97815df85..0d2a7fee5 100644 --- a/addons/brain/functions/fnc_concussion.sqf +++ b/addons/brain/functions/fnc_concussion.sqf @@ -36,19 +36,18 @@ if (_ammo in ["vehiclehit","explosive","shell","vehiclecrash"]) then { private _concussionChance = (GVAR(concussionChance) + _chanceIncrease) * _chanceMultiplier; if (floor (random 100) <= _concussionChance) then { private _currentSeverity = _unit getVariable [QGVAR(concussionSeverity),0]; - private _newSeverity = linearConversion [0, 2,_damage,0,1,true]; - if (_newSeverity > _currentSeverity) then { //Replace the current concussion with the more severe one + if (_damage > _currentSeverity) then { //Replace the current concussion with the more severe one // Add instantaneous effects from concussions if (_damage > GVAR(necrosisImpactDamage)) then { // Cause instant necrosis if threshold is surpassed private _necrosis = _unit getVariable [QGVAR(necrosis),0]; - private _newNecrosis = linearConversion [0, 3,_damage,0,4,true]; //Increase tissue necrosis by 1% max on impact + private _newNecrosis = linearConversion [0, 1,_damage,0,4,true]; //Increase tissue necrosis by 1% max on impact if (_newNecrosis > _necrosis) then { // Prevent reverting existing necrosis levels _unit setVariable [QGVAR(necrosis),_newNecrosis,true]; }; }; if (_damage > GVAR(tissueImpactDamage)) then { // Cause reversible tissue damage if threshold is surpassed private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0]; - _reversibleDamage = _reversibleDamage + (linearConversion [0,3,_damage,0,15,true]); //Increase reversible damage by max 5% on impact + _reversibleDamage = _reversibleDamage + (linearConversion [0,1,_damage,0,15,true]); //Increase reversible damage by max 5% on impact _unit setVariable [QGVAR(reversibleDamage),_reversibleDamage,true]; }; @@ -63,7 +62,7 @@ if (floor (random 100) <= _concussionChance) then { [_existingPFH] call CBA_fnc_removePerFrameHandler; }; - private _maxICPIncrease = linearConversion [0,1,_newSeverity,0,50]; + private _maxICPIncrease = linearConversion [0,1,_damage,0,40]; private _newPFH = [{ params ["_args", "_idPFH"]; _args params ["_unit","_severity","_maxICPIncrease"]; @@ -85,10 +84,10 @@ if (floor (random 100) <= _concussionChance) then { private _ICPincrease = linearConversion [0,1,_severity,0,2,true]; _unit setVariable [QGVAR(ICP),_ICP+_ICPincrease,true]; //Increase ICP by concussion severity - }, 10, [_unit,_newSeverity,_maxICPIncrease]] call CBA_fnc_addPerFrameHandler; + }, 10, [_unit,_damage,_maxICPIncrease]] call CBA_fnc_addPerFrameHandler; _unit setVariable [QGVAR(concussionPFH),_newPFH,true]; - _unit setVariable [QGVAR(concussionSeverity),_newSeverity,true]; + _unit setVariable [QGVAR(concussionSeverity),_damage,true]; } }; \ No newline at end of file diff --git a/addons/brain/functions/fnc_fullHealLocal.sqf b/addons/brain/functions/fnc_fullHealLocal.sqf index 294cb1f18..65d0999da 100644 --- a/addons/brain/functions/fnc_fullHealLocal.sqf +++ b/addons/brain/functions/fnc_fullHealLocal.sqf @@ -29,6 +29,7 @@ _unit setVariable [QGVAR(necrosis),0,true]; _unit setVariable [QGVAR(deoxygenatedTicks),0,true]; _unit setVariable [QGVAR(reversibleDamage),0,true]; +//TODO fix these PFHs so that they dont create duplicates when a player is healed _unit setVariable [QGVAR(autoregulationPFH), [_unit] call FUNC(handleAutoregulation),true]; _unit setVariable [QGVAR(activityPFH), [_unit] call FUNC(handleBrainActivity),true]; From 1015a4015803d3e06c1307603859c8ce1df3a161 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 14 Aug 2024 11:57:57 +0100 Subject: [PATCH 27/37] Initial overwrite of ace_medical_statemachine --- addons/statemachine/$PBOPREFIX$ | 1 + addons/statemachine/CfgEventHandlers.hpp | 29 ++++ addons/statemachine/CfgFunctions.hpp | 13 ++ addons/statemachine/Statemachine.hpp | 113 ++++++++++++++ addons/statemachine/XEH_PREP.hpp | 1 + addons/statemachine/XEH_postInit.sqf | 14 ++ addons/statemachine/XEH_preInit.sqf | 65 ++++++++ addons/statemachine/config.cpp | 21 +++ addons/statemachine/script_component.hpp | 17 ++ addons/statemachine/stringtable.xml | 190 +++++++++++++++++++++++ 10 files changed, 464 insertions(+) create mode 100644 addons/statemachine/$PBOPREFIX$ create mode 100644 addons/statemachine/CfgEventHandlers.hpp create mode 100644 addons/statemachine/CfgFunctions.hpp create mode 100644 addons/statemachine/Statemachine.hpp create mode 100644 addons/statemachine/XEH_PREP.hpp create mode 100644 addons/statemachine/XEH_postInit.sqf create mode 100644 addons/statemachine/XEH_preInit.sqf create mode 100644 addons/statemachine/config.cpp create mode 100644 addons/statemachine/script_component.hpp create mode 100644 addons/statemachine/stringtable.xml diff --git a/addons/statemachine/$PBOPREFIX$ b/addons/statemachine/$PBOPREFIX$ new file mode 100644 index 000000000..467f97e45 --- /dev/null +++ b/addons/statemachine/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\statemachine diff --git a/addons/statemachine/CfgEventHandlers.hpp b/addons/statemachine/CfgEventHandlers.hpp new file mode 100644 index 000000000..58ac85323 --- /dev/null +++ b/addons/statemachine/CfgEventHandlers.hpp @@ -0,0 +1,29 @@ +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 ACEFUNC(medical_statemachine,resetStateDefault)); + exclude[] = {IGNORE_BASE_UAVPILOTS}; + }; + }; +}; + +class Extended_Local_EventHandlers { + class CAManBase { + class ADDON { + local = QUOTE(call ACEFUNC(medical_statemachine,localityChangedEH)); // TODO replace with kam function + exclude[] = {IGNORE_BASE_UAVPILOTS}; + }; + }; +}; diff --git a/addons/statemachine/CfgFunctions.hpp b/addons/statemachine/CfgFunctions.hpp new file mode 100644 index 000000000..68bb0c54e --- /dev/null +++ b/addons/statemachine/CfgFunctions.hpp @@ -0,0 +1,13 @@ +class CfgFunctions { + class overwrite_ace_medical_statemachine { + tag = "ace_medical_statemachine"; + class ace_medical_statemachine { + class conditionExecutionDeath { + file = QPATHTOF(functions\fnc_conditionExecutionDeath.sqf); //TODO move these over here + }; + class conditionSecondChance { + file = QPATHTOF(functions\fnc_conditionSecondChance.sqf); + }; + }; + }; +}; diff --git a/addons/statemachine/Statemachine.hpp b/addons/statemachine/Statemachine.hpp new file mode 100644 index 000000000..f311e1256 --- /dev/null +++ b/addons/statemachine/Statemachine.hpp @@ -0,0 +1,113 @@ +// Overwrite for ACE_Medical_StateMachine +class KAT_StateMachine { + list = QUOTE(call ACEFUNC(common,getLocalUnits)); + skipNull = 1; + class Default { + onState = QACEFUNC(medical_statemachine,handleStateDefault); + class Injury { + targetState = "Injured"; + events[] = {QACEGVAR(medical,injured), QACEGVAR(medical,LoweredVitals)}; + }; + class CriticalInjuryOrVitals { + targetState = "Unconscious"; + events[] = {QACEGVAR(medical,CriticalInjury), QACEGVAR(medical,CriticalVitals), QACEGVAR(medical,knockOut)}; + }; + class FatalVitals { + targetState = "CardiacArrest"; + events[] = {QACEGVAR(medical,FatalVitals), QACEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QACEGVAR(medical,FatalInjury)}; + }; + }; + class Injured { + onState = QACEFUNC(medical_statemachine,handleStateInjured); + class FullHeal { + targetState = "Default"; + events[] = {QACEGVAR(medical,FullHeal)}; + }; + class CriticalInjuryOrVitals { + targetState = "Unconscious"; + events[] = {QACEGVAR(medical,CriticalInjury), QACEGVAR(medical,CriticalVitals), QACEGVAR(medical,knockOut)}; + }; + class FatalVitals { + targetState = "CardiacArrest"; + events[] = {QACEGVAR(medical,FatalVitals), QACEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QACEGVAR(medical,FatalInjury)}; + }; + }; + class Unconscious { + onState = QACEFUNC(medical_statemachine,handleStateUnconscious); + onStateEntered = QACEFUNC(medical_statemachine,enteredStateUnconscious); + class DeathAI { + targetState = "Dead"; + condition = QUOTE(!(_this getVariable [ARR_2(QQACEGVAR(medical_statemachine,AIUnconsciousness),ACEGVAR(medical_statemachine,AIUnconsciousness))]) && {!isPlayer _this}); + }; + class WakeUp { + targetState = "Injured"; + condition = QACEFUNC(medical_status,hasStableVitals); + events[] = {QACEGVAR(medical,WakeUp)}; + onTransition = QUOTE([ARR_2(_this,false)] call ACEFUNC(medical_status,setUnconsciousState)); + }; + class FatalTransitions { + targetState = "CardiacArrest"; + events[] = {QACEGVAR(medical,FatalVitals), QACEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QACEGVAR(medical,FatalInjury)}; + }; + }; + class FatalInjury { + // Transition state for handling instant death from fatal injuries + // This state raises the next transition in the same frame + onStateEntered = QACEFUNC(medical_statemachine,enteredStateFatalInjury); + class SecondChance { + events[] = {QACEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "CardiacArrest"; + condition = QACEFUNC(medical_statemachine,conditionSecondChance); + onTransition = QACEFUNC(medical_statemachine,transitionSecondChance); + }; + class Death { + events[] = {QACEGVAR(medical,FatalInjuryInstantTransition)}; + targetState = "Dead"; + }; + }; + class CardiacArrest { + onState = QACEFUNC(medical_statemachine,handleStateCardiacArrest); + onStateEntered = QACEFUNC(medical_statemachine,enteredStateCardiacArrest); + onStateLeaving = QACEFUNC(medical_statemachine,leftStateCardiacArrest); + class DeathAI { + // If an AI unit reanimates, they will immediately die upon entering unconsciousness if AI Unconsciousness is disabled + // As a result, we immediately kill the AI unit since cardiac arrest is effectively useless for it + targetState = "Dead"; + condition = QUOTE(!ACEGVAR(medical_statemachine,AIUnconsciousness) && {!isPlayer _this}); + }; + class Timeout { + targetState = "Dead"; + condition = QACEFUNC(medical_statemachine,conditionCardiacArrestTimer); + }; + class Reanimation { + targetState = "Unconscious"; + events[] = {QACEGVAR(medical,CPRSucceeded)}; + }; + class Execution { + targetState = "Dead"; + condition = QACEFUNC(medical_statemachine,conditionExecutionDeath); + events[] = {QACEGVAR(medical,FatalInjury)}; + }; + class Bleedout { + targetState = "Dead"; + condition = QUOTE((ACEGVAR(medical_statemachine,cardiacArrestBleedoutEnabled))); // wrap to ensure cba uses this as code and not a direct variable + events[] = {QACEGVAR(medical,Bleedout)}; + }; + }; + class Dead { + // When the unit is killed it's no longer handled by the statemachine + onStateEntered = QACEFUNC(medical_statemachine,enteredStateDeath); + }; +}; diff --git a/addons/statemachine/XEH_PREP.hpp b/addons/statemachine/XEH_PREP.hpp new file mode 100644 index 000000000..bd0c5a899 --- /dev/null +++ b/addons/statemachine/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(handleStateDefault); \ No newline at end of file diff --git a/addons/statemachine/XEH_postInit.sqf b/addons/statemachine/XEH_postInit.sqf new file mode 100644 index 000000000..5e9e46dbc --- /dev/null +++ b/addons/statemachine/XEH_postInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +// ["ace_killed", { // global event +// params ["_unit"]; + +// // Prevent second ragdoll of uncon units when they're killed +// if ( +// IS_UNCONSCIOUS(_unit) && !isAwake _unit // uncon and not ragdolling +// && {isPlayer _unit || {_unit getVariable [QGVAR(AIUnconsciousness), GVAR(AIUnconsciousness)]}} +// ) then { +// _unit enableSimulation false; +// [{_this enableSimulation true}, _unit, 2] call CBA_fnc_waitAndExecute; +// }; +// }] call CBA_fnc_addEventHandler; diff --git a/addons/statemachine/XEH_preInit.sqf b/addons/statemachine/XEH_preInit.sqf new file mode 100644 index 000000000..cc39b0268 --- /dev/null +++ b/addons/statemachine/XEH_preInit.sqf @@ -0,0 +1,65 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +[ + QGVAR(fatalInjuriesPlayer), + "LIST", + [LSTRING(FatalInjuriesPlayer_DisplayName), LSTRING(FatalInjuriesPlayer_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [ + [FATAL_INJURIES_ALWAYS, FATAL_INJURIES_CRDC_ARRST, FATAL_INJURIES_NEVER], + [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], + 0 + ], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(fatalInjuriesAI), + "LIST", + [LSTRING(FatalInjuriesAI_DisplayName), LSTRING(FatalInjuriesAI_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [ + [FATAL_INJURIES_ALWAYS, FATAL_INJURIES_CRDC_ARRST, FATAL_INJURIES_NEVER], + [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], + 0 + ], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(AIUnconsciousness), + "CHECKBOX", + [LSTRING(AIUnconsciousness_DisplayName), LSTRING(AIUnconsciousness_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(cardiacArrestTime), + "TIME", + [LSTRING(CardiacArrestTime_DisplayName), LSTRING(CardiacArrestTime_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [1, 3600, 300], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(cardiacArrestBleedoutEnabled), + "CHECKBOX", + [LSTRING(CardiacArrestBleedout_DisplayName), LSTRING(CardiacArrestBleedout_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + true +] call CBA_fnc_addSetting; + +// Overwrite ace statemachine +ACEGVAR(medical,STATE_MACHINE) = (configFile >> "KAT_StateMachine") call CBA_statemachine_fnc_createFromConfig; + +ADDON = true; diff --git a/addons/statemachine/config.cpp b/addons/statemachine/config.cpp new file mode 100644 index 000000000..e89ec6439 --- /dev/null +++ b/addons/statemachine/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "ace_medical_vitals", + "ace_medical_statemachine" + }; + author = "apo_tle"; + authors[] = {"Glowbal", "KoffeinFlummi","apo_tle"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "Statemachine.hpp" +#include "CfgEventHandlers.hpp" \ No newline at end of file diff --git a/addons/statemachine/script_component.hpp b/addons/statemachine/script_component.hpp new file mode 100644 index 000000000..e2e55adff --- /dev/null +++ b/addons/statemachine/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT statemachine +#define COMPONENT_BEAUTIFIED KAT - STATEMACHINE +#include "\x\kat\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_STATEMACHINE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_STATEMACHINE + #define DEBUG_SETTINGS DEBUG_SETTINGS_STATEMACHINE +#endif + +#include "\x\kat\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/statemachine/stringtable.xml b/addons/statemachine/stringtable.xml new file mode 100644 index 000000000..2b828d506 --- /dev/null +++ b/addons/statemachine/stringtable.xml @@ -0,0 +1,190 @@ + + + + + States + Zustände + 状態 + Состояния + États + Estados + 狀態 + 状态 + Stato + Stavy + Stany + Devletler + Estados + 현재 상태 + + + Player Fatal Injuries + Lesões Fatais do Jogador + プレイヤーの致命傷 + 玩家致命傷 + 玩家致命伤 + Décès si blessure mortelle (joueurs) + Smrtelná zranění hráčů + Śmiertelne Obrażenia Gracza + Ferite letali su giocatori + Oyuncu Ölümcül Yaralanmaları + Tödliche Spielerverletzungen + Смертельные травмы игрока + Heridas mortales del jugador + 플레이어 중태 + + + Controls when players can receive fatal injuries. A fatal injury is caused by significant damage to the head or torso. + Controla quando os jogadores podem receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco. + プレイヤーが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。 + 控制當玩家受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。 + 控制当玩家受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。 + Détermine si les joueurs décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur. + Oyuncuların ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafaya veya vücuda önemli hasar verir. + Nastavuje zda hráči mohou utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu. + Controlla quando i giocatori possono ricevere infortuni mortali. Una ferita letale è causata da un danno significativo alla testa o al torso. + Definiuje, kiedy gracze mogą otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu. + Legt fest, wann Spieler tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Torso verursacht. + Определяет, могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища. + Controla cuándo los jugadores pueden sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. + 플레이어가 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다. + + + AI Fatal Injuries + Lesões Fatais da IA + AIの致命傷 + AI致命傷 + AI 致命伤 + Décès si blessure mortelle (IA) + Smrtelná zranění AI + Śmiertelne obrażenia AI. + Ferite letali su IA + AI Ölümcül Yaralanmaları + Tödliche KI-Verletzungen + Смертельные травмы ИИ + Heridas mortales IA + 인공지능 중태 + + + Controls when AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or troso.\nWhen set to "Always", this effectively produces "AI Instant Death" behaviour as AI will immediately die from any fatal injury.\nNOTE: Any mode other than "Always" requires AI Unconsciousness to be enabled. + Controla quando a IA pode receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco.\nQuando definido para "Sempre", isso efetivamente causa a "Morte Instantânea da IA", pois a IA irá imediatamente morrer para qualquer lesão fatal.\nNOTA: Qualquer opção além de "Sempre" requer que Inconsciência de IA esteja ativada. + AIが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。\n"常に"に設定されていると、いかなる致命傷でも"AIの即死"効果が生まれます。\n注: "常に"以外のモードでは"AIの無意識状態化"を有効化させる必要があります。 + 控制當AI受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。\n當設置為"總是"時,這會使其與"AI 瞬間死亡"同一個效果,在AI受到致命傷時瞬間死亡。\n備註:選了"總是"以外的選項的話必須開啟「AI無意識」的選項。 + 控制当 AI 受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。\n当设置为"总是"时,这将有效地产生"AI 即时死亡"行为,因为 AI 将立即死于任何致命伤。\n注意:"总是"以外的任何模式都需要启用 AI 无意识。 + Détermine si les unités IA décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur.\nSi réglé sur "Toujours", cela produit effectivement un comportement de "Mort instantanée" car les unités IA mourront immédiatement de toute blessure mortelle.\nNOTE : Tout mode autre que "Toujours" nécessite l'activation de l'option "Inconscience IA". + AI'nın ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafa veya vücudun önemli hasar görmesinden kaynaklanır. \"Her zaman" olarak ayarlandığında, AI herhangi bir ölümcül yaralanmadan hemen öleceği için bu etkili bir şekilde "AI Anında Ölüm" davranışı üretir.\ NOT: "Her zaman" "Yapay Zeka Bilinci'nin etkinleştirilmesini gerektirir. + Nastavuje zda AI může utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu.\nPokud je tato možnost nastavena na "Vždy", efektivně nastává stav "Povolit okamžitou smrt AI", protože AI okamžitě zemře při jakémkoliv smrtelném zranění.\nPOZNÁMKA: Jakýkoliv jiný stav než "Vždy" potřebuje zapnutou možnost "Bezvědomí AI". + Controlla quando l'IA può ricevere infortuni mortali. Una ferita letale è causata da un danno significativo alla testa o al torso.\nSe impostato su "Sempre", questo produce efficacemente il comportamento "Morte istantanea AI", poiché l'IA morirà immediatamente a causa di qualsiasi lesione mortale.\nNOTA: Qualsiasi modalità diversa da "Sempre" richiede l'attivazione dell'Incoscienza IA. + Definiuje, kiedy AI może otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu.\n Ustawienie "Zawsze" powoduje "Natychmiastową śmierć AI", ponieważ AI natychmiast umiera z powodu śmiertelnych obrażeń.\n UWAGA: Każdy inny tryb niż "Zawsze" wymaga włączenia nieprzytomności AI. + Legt fest, wann KI-Einheiten tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Körper verursacht.\nWenn "Immer" eingestellt ist, erzeugt diese Einstellung das "KI Sofort-Tod" Verhalten. KI-Einheiten sterben sofort durch jede tödliche Verletzung.\nBEACHTE: Eine andere Einstellung als "Immer" bedingt, dass "KI-Bewusstlosigkeit" verwendet wird. + Определяет могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища.\nКогда установлено «Всегда», это вызывает поведение «Мгновенной смерти ИИ», так как ИИ немедленно умрет от любой смертельной травмы.\nПРИМЕЧАНИЕ: Любой режим, кроме «Всегда», требует включения функции «Потеря сознания». + Controla cuándo la IA puede sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. \n Cuando se establece en "Siempre", esto produce efectivamente un comportamiento de "Muerte instantánea de IA", ya que la IA morirá inmediatamente por cualquier lesión fatal. \n NOTA: Cualquier modo que no sea "Siempre" requiere que la inconsciencia de la IA esté habilitada. + 인공지능이 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다.\n "언제나"로 설정하면 "인공지능 즉사" 기능이 즉각 적용됩니다.\n 참고: "언제나"를 제외한 다른 모드는 인공지능의 기절이 활성화가 필요합니다. + + + AI Unconsciousness + Потеря сознания ботами + Nieprzytomność AI + Inconsciencia IA + KI-Bewusstlosigkeit + Bezvědomí AI + Inconsciência da IA + Inconscience IA + AI eszméletlenség + Incoscienza IA + AIの無意識状態化 + 인공지능 기절 + AI 无意识 + AI無意識 + Yapay Zeka Bilinci + + + Controls whether AI can go unconscious instead of immediately dying.\nThis setting works together with the "AI Fatal Injuries" setting since, going into cardiac arrest requires that the unit is able to go unconscious.\nHowever, these settings are separated because units can go unconscious from critical vitals resulting from non-fatal injuries.\nIn essence, this means that in order to enable cardiac arrest for AI units, this setting must be enabled. + Controla se a IA pode ficar inconsciente ao invés de morrer imediatamente.\nEssa configuração funciona com "Lesões Fatais de IA", pois para uma unidade ter uma parada cardíaca é necessário que a IA possa fica inconsciente.\nContudo, essas configurações são separadas pois unidades podem ficar inconscientes por vitais críticos causados por ferimentos não-fatais.\nEssencialmente, isso significa que para ativar uma parada cardíaca em IA, essa configuração precisa estar ativa. + AIが即死する代わりに無意識状態化するかどうかを制御します。\nこれは "AIの致命傷" 設定と連動します。何故ならば、ユニットを心停止させるためには無意識状態に陥る必要がある為です。\nしかし、これらの設定は、致命的ではない負傷の経過による重症状態化でユニットが無意識状態に陥ることが出来るようにするため、分割されています。\n要するに、AIユニットの心停止を有効にするには、この設定を有効にする必要があるということです。 + 控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「AI致命傷」的選項聯動,使單位心搏停止的話必須先讓其無意識。\n然而,兩個設定分開之原因是使單位能因從非致命傷的攻擊情況下進入生命危險的狀態。\n簡單來說,你想要讓AI單位有心搏停止可能的話,該選項必須啟用。 + 控制 AI 是否可以进入昏迷状态而不是立即死亡。\n这个设置与"AI 致命伤"设置一起工作,因为进入心脏骤停需要单位能够昏迷。\n然而,这些设置是分开的,因为单位可能会因非致命伤害导致的关键生命体征而昏迷过去。\n从本质上讲,这意味着为了使 AI 单位的心脏骤停,必须启用此设置。 + Définit si les unités IA peuvent perdre connaissance au lieu de mourir immédiatement.\nCe paramètre fonctionne conjointement avec l'option "Décès si blessure mortelle (IA)" car, pour qu'une unité IA subisse un arrêt cardiaque, elle doit également pouvoir perdre connaissance.\nCependant, ces paramètres sont séparés car les unités peuvent s'évanouir suite à des signes vitaux critiques résultant de blessures non mortelles.\nEn résumé, cela signifie que ce paramètre doit absolument être activé pour qu'une unité IA puisse entrer en état d'arrêt cardiaque. + Nastavuje zda AI může upadnout do bezvědomí namísto okamžité smrti.\nToto nastavení funguje společně s "Smrtelná zranění AI" protože srdeční zástava potřebuje možnost upadnout do bezvědomí.\nTyto možnosti jsou separované, protože jednotky mohou upadnout do bezvědomí kvůli kritickému stavu způsobenému ne smrtelnými zraněními.\nV podstatě to znamená, že pokud chcete zapnout srdeční zástavu pro AI, tato možnost musí být zapnutá. + Definiuje, czy AI może stracić przytomność zamiast natychmiast zginąć.\n Ta opcja działa razem z ustawieniem "Śmiertelne urazy AI", ponieważ przejście do zatrzymania akcji serca wymaga, aby jednostka mogła stracić przytomność.\n Jednak te ustawienia są rozdzielone, ponieważ jednostki mogą stracić przytomność z powodu krytycznych czynności życiowych powstałych w wyniku urazów innych niż śmiertelne.\n W istocie oznacza to, że aby umożliwić zatrzymanie akcji serca dla jednostek AI, to ustawienie musi być włączone. + Controlla se l'IA può perdere i sensi invece di morire immediatamente. Questa impostazione funziona insieme all'impostazione "Ferite letali IA" poiché, per andare in arresto cardiaco, è necessario che l'unità sia in grado di perdere i sensi. Tuttavia, queste impostazioni sono separate perché le unità possono perdere i sensi da segni vitali critici derivanti da ferite non letali. + Kontrolliert, ob KI bewusstlos werden kann anstatt sofort zu sterben.\nDiese Einstellung funktioniert zusammen mit der Einstellung "Tödliche KI-Verletzungen". Denn wenn eine Einheit einen Herzstillstand erleiden soll, muss diese auch in der Lage sein, bewusstlos zu werden.\nDennoch sind diese beiden Einstellungen voneinander getrennt, da Einheiten auch durch kritische Vitalwerte bewusstlos werden können, die durch nicht tödliche Verletzungen aufgetreten sind.\nZusammengefasst bedeutet das, dass wenn KI-Einheiten einen Herzstillstand erleiden sollen, diese Einstellung aktiviert sein muss. + Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен. + Yapay zekanın hemen ölmek yerine bilinçsiz duruma geçip geçemeyeceğini kontrol eder. \ Bu ayar, "Yapay Zeka Ölümcül Yaralanmalar" ayarı ile birlikte çalışır, çünkü kalp durması, ünitenin bilinçsiz duruma geçebilmesini gerektirir. \ Özünde, bunun anlamı şudur: AI birimleri için kalp durmasını etkinleştirirseniz, bu ayar etkinleştirilmelidir. + Controla si la IA puede quedar inconsciente en lugar de morir de inmediato. \n Esta configuración funciona junto con la configuración de "Heridas mortales IA", ya que, sufrir un paro cardíaco requiere que la unidad pueda quedar inconsciente. \n Sin embargo, estas configuraciones están separadas porque las unidades pueden perder el conocimiento de los signos vitales críticos como resultado de lesiones no mortales. \n En esencia, esto significa que para habilitar el paro cardíaco en las unidades de IA, esta configuración debe estar habilitada. + 인공지능이 즉사하기보다 기절하는걸 설정합니다.\n이 기능은 "인공지능 중태" 기능과 같이 사용시 심정지를 구현합니다. + + + Cardiac Arrest Time + Überlebenszeit im Herzstillstand + 心停止時間 + Длительность остановки сердца + Durée de l'arrêt cardiaque + Tempo de Parada Cardíaca + 心搏停止時間 + 心脏骤停时间 + Tempo d'arresto cardiaco + Délka srdeční zástavy + Czas Zatrzymania Akcji Serca + Kalp Durma Süresi + Tiempo de paro cardíaco + 심정지 시간 + + + Controls how long it takes to die from cardiac arrest. + どのくらいの時間、心停止すると死亡するかを制御します。 + Définit le temps qu'il faut pour mourir d'un arrêt cardiaque. + Контролирует, сколько времени требуется, чтобы умереть от остановки сердца. + Controla o tempo necessário para morrer para uma parada cardíaca. + 控制心搏停止後多久死亡 + 控制心脏骤停后多久单位死亡 + Determina quanto tempo ci vuole per morire di arresto cardiaco. + Nastavuje po jak dlouhé době pacient zemře kvůli srdeční zástavě. + Definiuje czas potrzebny na śmierć z powodu zatrzymania akcji serca. + Bestimmt die Dauer bis zum Tod durch Herzstillstand. + Ne kadar süre de kalbi durarak ölmesini belirleyin. + Controla cuanto tiempo dura el paro cardiaco antes de morir. + 심정지 후 얼마나 지나야 죽는지 결정합니다. + + + In Cardiac Arrest + Herzstillstand + 心停止中 + При остановке сердца + Provoquer un arrêt cardiaque + Em Parada Cardíaca + 心搏停止中 + 心脏骤停中 + In arresto cardiaco + V srdeční zástavě + Zatrzymanie Akcji Serca + Kalbi Durdu + En parada cardíaca + 심정지가 옴 + + + Bleedout During Cardiac Arrest + Кровотечение во время остановки сердца + Ausbluten im Herzstillstand + Dissanguamento in arresto cardiaco + Saignement durant l'arrêt cardiaque + 心停止中の失血死 + Desangrado durante parada cardíaca + Wykrwawienie podczas zatrzymanej akcji serca + 心脏骤停期间失血情况 + 심정지 중 출혈 + + + Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. + Определяет, можно ли умереть от потери крови во время остановки сердца, даже если время жизни при остановке сердца еще не истекло. + Legt fest, ob man während des Herzstillstands durch Blutverlust sterben kann, auch wenn die Überlebenszeit im Herzstillstand noch nicht ausgelaufen ist. + Determina se è possibile morire per eccessiva perdita di sangue anche se non è ancora scaduto il 'tempo d'arresto cardiaco'. + Définit si un joueur en arrêt cardiaque peut mourir par exsanguination, avant que la durée de l'arrêt cardiaque définie ci-dessus ne soit écoulée. + 心停止中の失血によって心停止時間よりも早く死亡するかどうかを制御します。 + COntrola si una persona puede morir en parada cardíaca por causa de pérdida de sangre antes de que se termine el contador de parada cardíaca + Kontroluje czy śmierć osoby może nastąpić poprzez wykrwawienie zanim wyczerpię się Czas Zatrzymania Akcji Serca. + 控制单位是否会在心脏骤停时间耗完之前因失血过多而死亡。 + 지정한 심정지 시간이 다 되기 전에 출혈로 인해 사망할 수 있는 지를 결정합니다. + + + From e3b5a582f6521cf32087736d0da53d1565616ea1 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 14 Aug 2024 21:59:31 +0100 Subject: [PATCH 28/37] Add seizures to statemachine --- addons/statemachine/Statemachine.hpp | 20 +++++++++++++++++++ .../functions/fnc_enteredStateSeizure.sqf | 0 .../functions/fnc_handleStateSeizure.sqf | 0 3 files changed, 20 insertions(+) create mode 100644 addons/statemachine/functions/fnc_enteredStateSeizure.sqf create mode 100644 addons/statemachine/functions/fnc_handleStateSeizure.sqf diff --git a/addons/statemachine/Statemachine.hpp b/addons/statemachine/Statemachine.hpp index f311e1256..3c3095b44 100644 --- a/addons/statemachine/Statemachine.hpp +++ b/addons/statemachine/Statemachine.hpp @@ -61,6 +61,10 @@ class KAT_StateMachine { targetState = "FatalInjury"; events[] = {QACEGVAR(medical,FatalInjury)}; }; + class EnterSeizure { + targetState = "Seizure"; + events[] = {QEGVAR(brain,enterSeizure)}; + }; }; class FatalInjury { // Transition state for handling instant death from fatal injuries @@ -106,6 +110,22 @@ class KAT_StateMachine { events[] = {QACEGVAR(medical,Bleedout)}; }; }; + class Seizure { + onStateEntered = QFUNC(enteredStateSeizure); + onState = QFUNC(handleStateSeizure); + class ExitSeizure { + targetState = "Unconscious"; + events[] = {QEGVAR(brain,exitSeizure)}; + }; + class FatalTransitions { + targetState = "CardiacArrest"; + events[] = {QACEGVAR(medical,FatalVitals), QACEGVAR(medical,Bleedout)}; + }; + class FatalInjury { + targetState = "FatalInjury"; + events[] = {QACEGVAR(medical,FatalInjury)}; + }; + }; class Dead { // When the unit is killed it's no longer handled by the statemachine onStateEntered = QACEFUNC(medical_statemachine,enteredStateDeath); diff --git a/addons/statemachine/functions/fnc_enteredStateSeizure.sqf b/addons/statemachine/functions/fnc_enteredStateSeizure.sqf new file mode 100644 index 000000000..e69de29bb diff --git a/addons/statemachine/functions/fnc_handleStateSeizure.sqf b/addons/statemachine/functions/fnc_handleStateSeizure.sqf new file mode 100644 index 000000000..e69de29bb From 3cc2a94b86c572c59d55db2dac2711c04daf256e Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 14 Aug 2024 22:35:17 +0100 Subject: [PATCH 29/37] Overwrite localityChangeEH --- addons/main/script_macros.hpp | 4 ++ addons/statemachine/CfgFunctions.hpp | 7 +-- addons/statemachine/XEH_PREP.hpp | 5 +- addons/statemachine/config.cpp | 3 +- .../functions/fnc_localityChangedEH.sqf | 63 +++++++++++++++++++ .../functions/fnc_setSeizureState.sqf | 0 6 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 addons/statemachine/functions/fnc_localityChangedEH.sqf create mode 100644 addons/statemachine/functions/fnc_setSeizureState.sqf diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 02973388e..f9ba5bb69 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -285,5 +285,9 @@ #define VAR_BLOODPRESSURE_CHANGE QEGVAR(circulation,bloodPressureChange) #define GET_BLOODPRESSURE_CHANGE(unit) (unit getVariable [VAR_BLOODPRESSURE_CHANGE, [0,0]]) +// Statemachine +#define VAR_SEIZURE QEGVAR(statemachine,inSeizure) +#define IN_SEIZURE(unit) (unit getVariable [VAR_SEIZURE, false]) + //Surgery #define STRING_BODY_PARTS ["head", "body", "left arm", "right arm", "left leg", "right leg"] diff --git a/addons/statemachine/CfgFunctions.hpp b/addons/statemachine/CfgFunctions.hpp index 68bb0c54e..b1f633530 100644 --- a/addons/statemachine/CfgFunctions.hpp +++ b/addons/statemachine/CfgFunctions.hpp @@ -2,11 +2,8 @@ class CfgFunctions { class overwrite_ace_medical_statemachine { tag = "ace_medical_statemachine"; class ace_medical_statemachine { - class conditionExecutionDeath { - file = QPATHTOF(functions\fnc_conditionExecutionDeath.sqf); //TODO move these over here - }; - class conditionSecondChance { - file = QPATHTOF(functions\fnc_conditionSecondChance.sqf); + class localityChangedEH { + file = QPATHTOF(functions\fnc_localityChangedEH.sqf); }; }; }; diff --git a/addons/statemachine/XEH_PREP.hpp b/addons/statemachine/XEH_PREP.hpp index bd0c5a899..13b03226e 100644 --- a/addons/statemachine/XEH_PREP.hpp +++ b/addons/statemachine/XEH_PREP.hpp @@ -1 +1,4 @@ -PREP(handleStateDefault); \ No newline at end of file +PREP(enteredStateSeizure); +PREP(handleStateSeizure); +PREP(localityChangedEH); +PREP(setSeizureState); \ No newline at end of file diff --git a/addons/statemachine/config.cpp b/addons/statemachine/config.cpp index e89ec6439..9169e0182 100644 --- a/addons/statemachine/config.cpp +++ b/addons/statemachine/config.cpp @@ -18,4 +18,5 @@ class CfgPatches { }; #include "Statemachine.hpp" -#include "CfgEventHandlers.hpp" \ No newline at end of file +#include "CfgEventHandlers.hpp" +#include "CfgFunctions.hpp" \ No newline at end of file diff --git a/addons/statemachine/functions/fnc_localityChangedEH.sqf b/addons/statemachine/functions/fnc_localityChangedEH.sqf new file mode 100644 index 000000000..7b2611762 --- /dev/null +++ b/addons/statemachine/functions/fnc_localityChangedEH.sqf @@ -0,0 +1,63 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Modified: apo_tle + * Handles locality switch. Will also be called at unit init. + * Because state machine state is local only, when a unit transfers locality we need to manually transition to it's current state + * + * Arguments: + * 0: Unit + * 1: isLocal + * + * Return Value: + * None + * + * Example: + * [player, true] call ace_medical_statemachine_fnc_localityChangedEH + * + * Public: No + */ + +params ["_unit", "_isLocal"]; +TRACE_2("localityChangedEH",_unit,_isLocal); + +if (!alive _unit) exitWith {}; + +if (_isLocal) then { + private _currentState = [_unit, ACEGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; + TRACE_1("local",_currentState); + + switch (true) do { + case (IN_CRDC_ARRST(_unit)): { + if (_currentState == "CardiacArrest") exitWith {}; + _unit setVariable [VAR_CRDC_ARRST, false]; // force reset vars so setCardiacArrestState can run (enteredStateCardiacArrest will also be called) + _unit setVariable [VAR_UNCON, false]; + TRACE_1("manually changing state to CardiacArrest",_currentState); + [_unit, ACEGVAR(medical,STATE_MACHINE), _currentState, "CardiacArrest", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IN_SEIZURE(_unit)): { + if (_currentState == "Seizure") exitWith {}; + _unit setVariable [VAR_SEIZURE, false]; // force reset vars so setSeizureState can run (enteredSeizureState will also be called) + _unit setVariable [VAR_UNCON, false]; + TRACE_1("manually changing state to Seizure",_currentState); + [_unit, ACEGVAR(medical,STATE_MACHINE), _currentState, "Seizure", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IS_UNCONSCIOUS(_unit)): { + if (_currentState == "Unconscious") exitWith {}; + _unit setVariable [VAR_UNCON, false]; // force reset var so ace_medical_status_fnc_setUnconsciousState can run + TRACE_1("manually changing state to Unconscious",_currentState); + [_unit, ACEGVAR(medical,STATE_MACHINE), _currentState, "Unconscious", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IS_BLEEDING(_unit) || {IS_IN_PAIN(_unit)}): { + if (_currentState == "Injured") exitWith {}; + TRACE_1("manually changing state to Injured",_currentState); + [_unit, ACEGVAR(medical,STATE_MACHINE), _currentState, "Injured", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + default { + // If locality transfers back and forth, we could be in an old state and should transfer back to default + if (_currentState == "Default") exitWith {}; + TRACE_1("manually changing state to Default",_currentState); + [_unit, ACEGVAR(medical,STATE_MACHINE), _currentState, "Default", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + }; +} \ No newline at end of file diff --git a/addons/statemachine/functions/fnc_setSeizureState.sqf b/addons/statemachine/functions/fnc_setSeizureState.sqf new file mode 100644 index 000000000..e69de29bb From 6dbd8e47da42c03f6dda86373e0c3a2692af6ac9 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 14 Aug 2024 23:14:19 +0100 Subject: [PATCH 30/37] Add logic for entering seizure state --- addons/brain/XEH_preInit.sqf | 4 +- addons/brain/functions/fnc_fullHealLocal.sqf | 2 +- .../functions/fnc_handleBrainActivity.sqf | 2 +- addons/brain/functions/fnc_handleRespawn.sqf | 2 +- addons/misc/functions/fnc_hasStableVitals.sqf | 2 +- addons/statemachine/Statemachine.hpp | 1 + addons/statemachine/XEH_preInit.sqf | 61 ++---- .../functions/fnc_enteredStateSeizure.sqf | 30 +++ addons/statemachine/stringtable.xml | 196 ++---------------- 9 files changed, 73 insertions(+), 227 deletions(-) diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf index 5c4336f8f..d9c035938 100644 --- a/addons/brain/XEH_preInit.sqf +++ b/addons/brain/XEH_preInit.sqf @@ -34,7 +34,7 @@ PREP_RECOMPILE_END; "SLIDER", [LLSTRING(SETTING_stableCMR)], [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], - [0, 20, 16, 1], + [0, 100, 80, 1], true ] call CBA_Settings_fnc_init; @@ -44,7 +44,7 @@ PREP_RECOMPILE_END; "SLIDER", [LLSTRING(SETTING_CMRunconsciousThreshold)], [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], - [0, 20, 18, 1], + [0, 100, 85, 1], true ] call CBA_Settings_fnc_init; diff --git a/addons/brain/functions/fnc_fullHealLocal.sqf b/addons/brain/functions/fnc_fullHealLocal.sqf index 65d0999da..cf26d33ca 100644 --- a/addons/brain/functions/fnc_fullHealLocal.sqf +++ b/addons/brain/functions/fnc_fullHealLocal.sqf @@ -18,7 +18,7 @@ params ["_patient"]; TRACE_1("fullHealLocal",_patient); -_unit setVariable [QGVAR(CMR),20,true]; // Cerebral Metabolic Rate +_unit setVariable [QGVAR(CMR),100,true]; // Cerebral Metabolic Rate (%) _unit setVariable [QGVAR(CBF),800,true]; // Cerebral Blood Flow _unit setVariable [QGVAR(CVR),0.1,true]; // Cerebral Vascular Resistance _unit setVariable [QGVAR(ICP),15,true]; // Intracranial Pressure diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf index 1ad0cc3f2..100b1d6d1 100644 --- a/addons/brain/functions/fnc_handleBrainActivity.sqf +++ b/addons/brain/functions/fnc_handleBrainActivity.sqf @@ -58,7 +58,7 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith { private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0]; //Finally, calculate total brain metabolic rate - private _CMR = 20 * (_rO2/80) * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100); + private _CMR = 100 * (_rO2/80) * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100); _unit setVariable [QGVAR(necrosis),_necrosis,true]; _unit setVariable [QGVAR(CMR),_CMR,true]; diff --git a/addons/brain/functions/fnc_handleRespawn.sqf b/addons/brain/functions/fnc_handleRespawn.sqf index 847f40727..7af49fd35 100644 --- a/addons/brain/functions/fnc_handleRespawn.sqf +++ b/addons/brain/functions/fnc_handleRespawn.sqf @@ -21,7 +21,7 @@ TRACE_2("handleRespawn",_unit,_dead); [_unit] call FUNC(fullHealLocal); -_unit setVariable [QEGVAR(brain,CMR),20,true]; +_unit setVariable [QEGVAR(brain,CMR),100,true]; _unit setVariable [QEGVAR(brain,CBF),800,true]; _unit setVariable [QEGVAR(brain,CVR),0.1,true]; _unit setVariable [QEGVAR(brain,ICP),15,true]; diff --git a/addons/misc/functions/fnc_hasStableVitals.sqf b/addons/misc/functions/fnc_hasStableVitals.sqf index 44edf0a51..a1cf4a4e2 100644 --- a/addons/misc/functions/fnc_hasStableVitals.sqf +++ b/addons/misc/functions/fnc_hasStableVitals.sqf @@ -38,7 +38,7 @@ if (_heartRate < 40) exitWith { false }; private _o2 = _unit getVariable [QEGVAR(breathing,airwayStatus), 100]; if (_o2 < EGVAR(breathing,Stable_spo2)) exitWith { false }; -private _CMR = _unit getVariable [QEGVAR(brain,CMR),20]; +private _CMR = _unit getVariable [QEGVAR(brain,CMR),100]; if (_CMR < EGVAR(brain,stableCMR)) exitWith { false }; true diff --git a/addons/statemachine/Statemachine.hpp b/addons/statemachine/Statemachine.hpp index 3c3095b44..88794c7cf 100644 --- a/addons/statemachine/Statemachine.hpp +++ b/addons/statemachine/Statemachine.hpp @@ -63,6 +63,7 @@ class KAT_StateMachine { }; class EnterSeizure { targetState = "Seizure"; + condition = QUOTE((GVAR(enableSeizure))); // wrapped to allow cba to read code //TODO also check brain sim is on events[] = {QEGVAR(brain,enterSeizure)}; }; }; diff --git a/addons/statemachine/XEH_preInit.sqf b/addons/statemachine/XEH_preInit.sqf index cc39b0268..44d919493 100644 --- a/addons/statemachine/XEH_preInit.sqf +++ b/addons/statemachine/XEH_preInit.sqf @@ -6,58 +6,37 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -[ - QGVAR(fatalInjuriesPlayer), - "LIST", - [LSTRING(FatalInjuriesPlayer_DisplayName), LSTRING(FatalInjuriesPlayer_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory)], - [ - [FATAL_INJURIES_ALWAYS, FATAL_INJURIES_CRDC_ARRST, FATAL_INJURIES_NEVER], - [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], - 0 - ], - true -] call CBA_fnc_addSetting; - -[ - QGVAR(fatalInjuriesAI), - "LIST", - [LSTRING(FatalInjuriesAI_DisplayName), LSTRING(FatalInjuriesAI_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory)], - [ - [FATAL_INJURIES_ALWAYS, FATAL_INJURIES_CRDC_ARRST, FATAL_INJURIES_NEVER], - [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], - 0 - ], - true -] call CBA_fnc_addSetting; +#define CBA_SETTINGS_CAT "KAT - ADV Medical: States" +//Enable transitions to seizure state [ - QGVAR(AIUnconsciousness), + QGVAR(enableSeizure), "CHECKBOX", - [LSTRING(AIUnconsciousness_DisplayName), LSTRING(AIUnconsciousness_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory)], - true, + [LSTRING(enableSeizure_DisplayName), LSTRING(enableSeizure_Description)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Seizures)], + false, true ] call CBA_fnc_addSetting; +//Minimum duration of seizure [ - QGVAR(cardiacArrestTime), - "TIME", - [LSTRING(CardiacArrestTime_DisplayName), LSTRING(CardiacArrestTime_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory)], - [1, 3600, 300], + QGVAR(Seizure_Min_Length), + "SLIDER", + [LSTRING(Seizure_Min_Length_DisplayName),LSTRING(Seizure_Min_Length_Description)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Seizures)], + [5, 180, 10, 0], true -] call CBA_fnc_addSetting; +] call CBA_Settings_fnc_init; +//Maximum duration of seizure [ - QGVAR(cardiacArrestBleedoutEnabled), - "CHECKBOX", - [LSTRING(CardiacArrestBleedout_DisplayName), LSTRING(CardiacArrestBleedout_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory)], - true, + QGVAR(Seizure_Max_Length), + "SLIDER", + [LSTRING(Seizure_Max_Length_DisplayName),LSTRING(Seizure_Max_Length_Description)], + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Seizures)], + [5, 180, 120, 0], true -] call CBA_fnc_addSetting; +] call CBA_Settings_fnc_init; // Overwrite ace statemachine ACEGVAR(medical,STATE_MACHINE) = (configFile >> "KAT_StateMachine") call CBA_statemachine_fnc_createFromConfig; diff --git a/addons/statemachine/functions/fnc_enteredStateSeizure.sqf b/addons/statemachine/functions/fnc_enteredStateSeizure.sqf index e69de29bb..2552f505c 100644 --- a/addons/statemachine/functions/fnc_enteredStateSeizure.sqf +++ b/addons/statemachine/functions/fnc_enteredStateSeizure.sqf @@ -0,0 +1,30 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Handles a unit entering a seizure (calls for a status update). + * Sets variables to begin seizure logic. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_statemachine_fnc_enteredStateSeizure + * + * Public: No + */ + + params ["_unit"]; + if (isNull _unit || {!isNil {_unit getVariable QACEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateSeizure: State transition on dead or null unit - %1",_unit); +}; + +private _CMR = _unit getVariable [QEGVAR(brain,CMR),100]; +private _CMRdiff = 100 - _CMR; + +private _time = linearConversion [0,100,_CMRdiff,GVAR(Seizure_Min_Length),GVAR(Seizure_Max_Length),true]; + +_unit setVariable [QGVAR(seizureTimeLeft),_time,true]; +_unit setVariable [QGVAR(seizureTimeLastUpdate),CBA_missionTime]; \ No newline at end of file diff --git a/addons/statemachine/stringtable.xml b/addons/statemachine/stringtable.xml index 2b828d506..0b1c5e4ab 100644 --- a/addons/statemachine/stringtable.xml +++ b/addons/statemachine/stringtable.xml @@ -1,190 +1,26 @@ - - - - States - Zustände - 状態 - Состояния - États - Estados - 狀態 - 状态 - Stato - Stavy - Stany - Devletler - Estados - 현재 상태 + + + + Seizures - - Player Fatal Injuries - Lesões Fatais do Jogador - プレイヤーの致命傷 - 玩家致命傷 - 玩家致命伤 - Décès si blessure mortelle (joueurs) - Smrtelná zranění hráčů - Śmiertelne Obrażenia Gracza - Ferite letali su giocatori - Oyuncu Ölümcül Yaralanmaları - Tödliche Spielerverletzungen - Смертельные травмы игрока - Heridas mortales del jugador - 플레이어 중태 + + Enable Seizures - - Controls when players can receive fatal injuries. A fatal injury is caused by significant damage to the head or torso. - Controla quando os jogadores podem receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco. - プレイヤーが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。 - 控制當玩家受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。 - 控制当玩家受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。 - Détermine si les joueurs décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur. - Oyuncuların ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafaya veya vücuda önemli hasar verir. - Nastavuje zda hráči mohou utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu. - Controlla quando i giocatori possono ricevere infortuni mortali. Una ferita letale è causata da un danno significativo alla testa o al torso. - Definiuje, kiedy gracze mogą otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu. - Legt fest, wann Spieler tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Torso verursacht. - Определяет, могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища. - Controla cuándo los jugadores pueden sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. - 플레이어가 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다. + + Disabling this setting will prevent seizures from occuring - - AI Fatal Injuries - Lesões Fatais da IA - AIの致命傷 - AI致命傷 - AI 致命伤 - Décès si blessure mortelle (IA) - Smrtelná zranění AI - Śmiertelne obrażenia AI. - Ferite letali su IA - AI Ölümcül Yaralanmaları - Tödliche KI-Verletzungen - Смертельные травмы ИИ - Heridas mortales IA - 인공지능 중태 + + Minimum Seizure Duration - - Controls when AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or troso.\nWhen set to "Always", this effectively produces "AI Instant Death" behaviour as AI will immediately die from any fatal injury.\nNOTE: Any mode other than "Always" requires AI Unconsciousness to be enabled. - Controla quando a IA pode receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco.\nQuando definido para "Sempre", isso efetivamente causa a "Morte Instantânea da IA", pois a IA irá imediatamente morrer para qualquer lesão fatal.\nNOTA: Qualquer opção além de "Sempre" requer que Inconsciência de IA esteja ativada. - AIが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。\n"常に"に設定されていると、いかなる致命傷でも"AIの即死"効果が生まれます。\n注: "常に"以外のモードでは"AIの無意識状態化"を有効化させる必要があります。 - 控制當AI受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。\n當設置為"總是"時,這會使其與"AI 瞬間死亡"同一個效果,在AI受到致命傷時瞬間死亡。\n備註:選了"總是"以外的選項的話必須開啟「AI無意識」的選項。 - 控制当 AI 受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。\n当设置为"总是"时,这将有效地产生"AI 即时死亡"行为,因为 AI 将立即死于任何致命伤。\n注意:"总是"以外的任何模式都需要启用 AI 无意识。 - Détermine si les unités IA décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur.\nSi réglé sur "Toujours", cela produit effectivement un comportement de "Mort instantanée" car les unités IA mourront immédiatement de toute blessure mortelle.\nNOTE : Tout mode autre que "Toujours" nécessite l'activation de l'option "Inconscience IA". - AI'nın ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafa veya vücudun önemli hasar görmesinden kaynaklanır. \"Her zaman" olarak ayarlandığında, AI herhangi bir ölümcül yaralanmadan hemen öleceği için bu etkili bir şekilde "AI Anında Ölüm" davranışı üretir.\ NOT: "Her zaman" "Yapay Zeka Bilinci'nin etkinleştirilmesini gerektirir. - Nastavuje zda AI může utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu.\nPokud je tato možnost nastavena na "Vždy", efektivně nastává stav "Povolit okamžitou smrt AI", protože AI okamžitě zemře při jakémkoliv smrtelném zranění.\nPOZNÁMKA: Jakýkoliv jiný stav než "Vždy" potřebuje zapnutou možnost "Bezvědomí AI". - Controlla quando l'IA può ricevere infortuni mortali. Una ferita letale è causata da un danno significativo alla testa o al torso.\nSe impostato su "Sempre", questo produce efficacemente il comportamento "Morte istantanea AI", poiché l'IA morirà immediatamente a causa di qualsiasi lesione mortale.\nNOTA: Qualsiasi modalità diversa da "Sempre" richiede l'attivazione dell'Incoscienza IA. - Definiuje, kiedy AI może otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu.\n Ustawienie "Zawsze" powoduje "Natychmiastową śmierć AI", ponieważ AI natychmiast umiera z powodu śmiertelnych obrażeń.\n UWAGA: Każdy inny tryb niż "Zawsze" wymaga włączenia nieprzytomności AI. - Legt fest, wann KI-Einheiten tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Körper verursacht.\nWenn "Immer" eingestellt ist, erzeugt diese Einstellung das "KI Sofort-Tod" Verhalten. KI-Einheiten sterben sofort durch jede tödliche Verletzung.\nBEACHTE: Eine andere Einstellung als "Immer" bedingt, dass "KI-Bewusstlosigkeit" verwendet wird. - Определяет могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища.\nКогда установлено «Всегда», это вызывает поведение «Мгновенной смерти ИИ», так как ИИ немедленно умрет от любой смертельной травмы.\nПРИМЕЧАНИЕ: Любой режим, кроме «Всегда», требует включения функции «Потеря сознания». - Controla cuándo la IA puede sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. \n Cuando se establece en "Siempre", esto produce efectivamente un comportamiento de "Muerte instantánea de IA", ya que la IA morirá inmediatamente por cualquier lesión fatal. \n NOTA: Cualquier modo que no sea "Siempre" requiere que la inconsciencia de la IA esté habilitada. - 인공지능이 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다.\n "언제나"로 설정하면 "인공지능 즉사" 기능이 즉각 적용됩니다.\n 참고: "언제나"를 제외한 다른 모드는 인공지능의 기절이 활성화가 필요합니다. + + Avoid setting this higher than Max Duration or expect incorrect behaviour - - AI Unconsciousness - Потеря сознания ботами - Nieprzytomność AI - Inconsciencia IA - KI-Bewusstlosigkeit - Bezvědomí AI - Inconsciência da IA - Inconscience IA - AI eszméletlenség - Incoscienza IA - AIの無意識状態化 - 인공지능 기절 - AI 无意识 - AI無意識 - Yapay Zeka Bilinci + + Maximum Seizure Duration - - Controls whether AI can go unconscious instead of immediately dying.\nThis setting works together with the "AI Fatal Injuries" setting since, going into cardiac arrest requires that the unit is able to go unconscious.\nHowever, these settings are separated because units can go unconscious from critical vitals resulting from non-fatal injuries.\nIn essence, this means that in order to enable cardiac arrest for AI units, this setting must be enabled. - Controla se a IA pode ficar inconsciente ao invés de morrer imediatamente.\nEssa configuração funciona com "Lesões Fatais de IA", pois para uma unidade ter uma parada cardíaca é necessário que a IA possa fica inconsciente.\nContudo, essas configurações são separadas pois unidades podem ficar inconscientes por vitais críticos causados por ferimentos não-fatais.\nEssencialmente, isso significa que para ativar uma parada cardíaca em IA, essa configuração precisa estar ativa. - AIが即死する代わりに無意識状態化するかどうかを制御します。\nこれは "AIの致命傷" 設定と連動します。何故ならば、ユニットを心停止させるためには無意識状態に陥る必要がある為です。\nしかし、これらの設定は、致命的ではない負傷の経過による重症状態化でユニットが無意識状態に陥ることが出来るようにするため、分割されています。\n要するに、AIユニットの心停止を有効にするには、この設定を有効にする必要があるということです。 - 控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「AI致命傷」的選項聯動,使單位心搏停止的話必須先讓其無意識。\n然而,兩個設定分開之原因是使單位能因從非致命傷的攻擊情況下進入生命危險的狀態。\n簡單來說,你想要讓AI單位有心搏停止可能的話,該選項必須啟用。 - 控制 AI 是否可以进入昏迷状态而不是立即死亡。\n这个设置与"AI 致命伤"设置一起工作,因为进入心脏骤停需要单位能够昏迷。\n然而,这些设置是分开的,因为单位可能会因非致命伤害导致的关键生命体征而昏迷过去。\n从本质上讲,这意味着为了使 AI 单位的心脏骤停,必须启用此设置。 - Définit si les unités IA peuvent perdre connaissance au lieu de mourir immédiatement.\nCe paramètre fonctionne conjointement avec l'option "Décès si blessure mortelle (IA)" car, pour qu'une unité IA subisse un arrêt cardiaque, elle doit également pouvoir perdre connaissance.\nCependant, ces paramètres sont séparés car les unités peuvent s'évanouir suite à des signes vitaux critiques résultant de blessures non mortelles.\nEn résumé, cela signifie que ce paramètre doit absolument être activé pour qu'une unité IA puisse entrer en état d'arrêt cardiaque. - Nastavuje zda AI může upadnout do bezvědomí namísto okamžité smrti.\nToto nastavení funguje společně s "Smrtelná zranění AI" protože srdeční zástava potřebuje možnost upadnout do bezvědomí.\nTyto možnosti jsou separované, protože jednotky mohou upadnout do bezvědomí kvůli kritickému stavu způsobenému ne smrtelnými zraněními.\nV podstatě to znamená, že pokud chcete zapnout srdeční zástavu pro AI, tato možnost musí být zapnutá. - Definiuje, czy AI może stracić przytomność zamiast natychmiast zginąć.\n Ta opcja działa razem z ustawieniem "Śmiertelne urazy AI", ponieważ przejście do zatrzymania akcji serca wymaga, aby jednostka mogła stracić przytomność.\n Jednak te ustawienia są rozdzielone, ponieważ jednostki mogą stracić przytomność z powodu krytycznych czynności życiowych powstałych w wyniku urazów innych niż śmiertelne.\n W istocie oznacza to, że aby umożliwić zatrzymanie akcji serca dla jednostek AI, to ustawienie musi być włączone. - Controlla se l'IA può perdere i sensi invece di morire immediatamente. Questa impostazione funziona insieme all'impostazione "Ferite letali IA" poiché, per andare in arresto cardiaco, è necessario che l'unità sia in grado di perdere i sensi. Tuttavia, queste impostazioni sono separate perché le unità possono perdere i sensi da segni vitali critici derivanti da ferite non letali. - Kontrolliert, ob KI bewusstlos werden kann anstatt sofort zu sterben.\nDiese Einstellung funktioniert zusammen mit der Einstellung "Tödliche KI-Verletzungen". Denn wenn eine Einheit einen Herzstillstand erleiden soll, muss diese auch in der Lage sein, bewusstlos zu werden.\nDennoch sind diese beiden Einstellungen voneinander getrennt, da Einheiten auch durch kritische Vitalwerte bewusstlos werden können, die durch nicht tödliche Verletzungen aufgetreten sind.\nZusammengefasst bedeutet das, dass wenn KI-Einheiten einen Herzstillstand erleiden sollen, diese Einstellung aktiviert sein muss. - Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен. - Yapay zekanın hemen ölmek yerine bilinçsiz duruma geçip geçemeyeceğini kontrol eder. \ Bu ayar, "Yapay Zeka Ölümcül Yaralanmalar" ayarı ile birlikte çalışır, çünkü kalp durması, ünitenin bilinçsiz duruma geçebilmesini gerektirir. \ Özünde, bunun anlamı şudur: AI birimleri için kalp durmasını etkinleştirirseniz, bu ayar etkinleştirilmelidir. - Controla si la IA puede quedar inconsciente en lugar de morir de inmediato. \n Esta configuración funciona junto con la configuración de "Heridas mortales IA", ya que, sufrir un paro cardíaco requiere que la unidad pueda quedar inconsciente. \n Sin embargo, estas configuraciones están separadas porque las unidades pueden perder el conocimiento de los signos vitales críticos como resultado de lesiones no mortales. \n En esencia, esto significa que para habilitar el paro cardíaco en las unidades de IA, esta configuración debe estar habilitada. - 인공지능이 즉사하기보다 기절하는걸 설정합니다.\n이 기능은 "인공지능 중태" 기능과 같이 사용시 심정지를 구현합니다. - - - Cardiac Arrest Time - Überlebenszeit im Herzstillstand - 心停止時間 - Длительность остановки сердца - Durée de l'arrêt cardiaque - Tempo de Parada Cardíaca - 心搏停止時間 - 心脏骤停时间 - Tempo d'arresto cardiaco - Délka srdeční zástavy - Czas Zatrzymania Akcji Serca - Kalp Durma Süresi - Tiempo de paro cardíaco - 심정지 시간 - - - Controls how long it takes to die from cardiac arrest. - どのくらいの時間、心停止すると死亡するかを制御します。 - Définit le temps qu'il faut pour mourir d'un arrêt cardiaque. - Контролирует, сколько времени требуется, чтобы умереть от остановки сердца. - Controla o tempo necessário para morrer para uma parada cardíaca. - 控制心搏停止後多久死亡 - 控制心脏骤停后多久单位死亡 - Determina quanto tempo ci vuole per morire di arresto cardiaco. - Nastavuje po jak dlouhé době pacient zemře kvůli srdeční zástavě. - Definiuje czas potrzebny na śmierć z powodu zatrzymania akcji serca. - Bestimmt die Dauer bis zum Tod durch Herzstillstand. - Ne kadar süre de kalbi durarak ölmesini belirleyin. - Controla cuanto tiempo dura el paro cardiaco antes de morir. - 심정지 후 얼마나 지나야 죽는지 결정합니다. - - - In Cardiac Arrest - Herzstillstand - 心停止中 - При остановке сердца - Provoquer un arrêt cardiaque - Em Parada Cardíaca - 心搏停止中 - 心脏骤停中 - In arresto cardiaco - V srdeční zástavě - Zatrzymanie Akcji Serca - Kalbi Durdu - En parada cardíaca - 심정지가 옴 - - - Bleedout During Cardiac Arrest - Кровотечение во время остановки сердца - Ausbluten im Herzstillstand - Dissanguamento in arresto cardiaco - Saignement durant l'arrêt cardiaque - 心停止中の失血死 - Desangrado durante parada cardíaca - Wykrwawienie podczas zatrzymanej akcji serca - 心脏骤停期间失血情况 - 심정지 중 출혈 - - - Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. - Определяет, можно ли умереть от потери крови во время остановки сердца, даже если время жизни при остановке сердца еще не истекло. - Legt fest, ob man während des Herzstillstands durch Blutverlust sterben kann, auch wenn die Überlebenszeit im Herzstillstand noch nicht ausgelaufen ist. - Determina se è possibile morire per eccessiva perdita di sangue anche se non è ancora scaduto il 'tempo d'arresto cardiaco'. - Définit si un joueur en arrêt cardiaque peut mourir par exsanguination, avant que la durée de l'arrêt cardiaque définie ci-dessus ne soit écoulée. - 心停止中の失血によって心停止時間よりも早く死亡するかどうかを制御します。 - COntrola si una persona puede morir en parada cardíaca por causa de pérdida de sangre antes de que se termine el contador de parada cardíaca - Kontroluje czy śmierć osoby może nastąpić poprzez wykrwawienie zanim wyczerpię się Czas Zatrzymania Akcji Serca. - 控制单位是否会在心脏骤停时间耗完之前因失血过多而死亡。 - 지정한 심정지 시간이 다 되기 전에 출혈로 인해 사망할 수 있는 지를 결정합니다. + + Avoid setting this lower than Max Duration or expect incorrect behaviour From d2a4b3795a7bd61e315c206388faa47e03d0c904 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Wed, 14 Aug 2024 23:44:00 +0100 Subject: [PATCH 31/37] Add setSeizureState --- .../functions/fnc_enteredStateSeizure.sqf | 7 ++++- .../functions/fnc_handleStateSeizure.sqf | 16 +++++++++++ .../functions/fnc_setSeizureState.sqf | 27 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/addons/statemachine/functions/fnc_enteredStateSeizure.sqf b/addons/statemachine/functions/fnc_enteredStateSeizure.sqf index 2552f505c..f88f107eb 100644 --- a/addons/statemachine/functions/fnc_enteredStateSeizure.sqf +++ b/addons/statemachine/functions/fnc_enteredStateSeizure.sqf @@ -27,4 +27,9 @@ private _CMRdiff = 100 - _CMR; private _time = linearConversion [0,100,_CMRdiff,GVAR(Seizure_Min_Length),GVAR(Seizure_Max_Length),true]; _unit setVariable [QGVAR(seizureTimeLeft),_time,true]; -_unit setVariable [QGVAR(seizureTimeLastUpdate),CBA_missionTime]; \ No newline at end of file +_unit setVariable [QGVAR(seizureTimeLastUpdate),CBA_missionTime]; + +TRACE_3("enteredStateSeizure",_unit,_time,CBA_missionTime); + +// Update the unit status to reflect seizure +[_unit, true] call FUNC(setSeizureState); diff --git a/addons/statemachine/functions/fnc_handleStateSeizure.sqf b/addons/statemachine/functions/fnc_handleStateSeizure.sqf index e69de29bb..5dad39a66 100644 --- a/addons/statemachine/functions/fnc_handleStateSeizure.sqf +++ b/addons/statemachine/functions/fnc_handleStateSeizure.sqf @@ -0,0 +1,16 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Handles updating a unit's status on the seizure. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_statemachine_fnc_enteredStateSeizure + * + * Public: No + */ \ No newline at end of file diff --git a/addons/statemachine/functions/fnc_setSeizureState.sqf b/addons/statemachine/functions/fnc_setSeizureState.sqf index e69de29bb..afe7b4547 100644 --- a/addons/statemachine/functions/fnc_setSeizureState.sqf +++ b/addons/statemachine/functions/fnc_setSeizureState.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: apo_tle + * Sets a unit in the seizure state. Called from enteredStateSeizure. + * + * Arguments: + * 0: The unit that will be put in an unconscious state + * 1: Set seizure + * + * Return Value: + * None + * + * Example: + * [player, true] call kat_statemachine_fnc_setSeizureState + * + * Public: No + */ + + params ["_unit", "_active"]; + TRACE_2("setUnconsciousState",_unit,_active); + + if (_active isEqualTo IN_SEIZURE(_unit) || (!alive _unit)) exitWith {}; + + _unit setVariable [VAR_SEIZURE, _active, true]; + + //TODO play seizure animation + [_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); //temporary, switch to seizure anim later \ No newline at end of file From 76b0c6dbb190ab8120a3f78b060f9704c92c8e86 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Tue, 8 Oct 2024 21:28:47 +0100 Subject: [PATCH 32/37] Change syntax --- addons/statemachine/XEH_preInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/statemachine/XEH_preInit.sqf b/addons/statemachine/XEH_preInit.sqf index 44d919493..fb0069803 100644 --- a/addons/statemachine/XEH_preInit.sqf +++ b/addons/statemachine/XEH_preInit.sqf @@ -6,7 +6,7 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -#define CBA_SETTINGS_CAT "KAT - ADV Medical: States" +#define CBA_SETTINGS_CAT "KAT - ADV Medical: Advanced States" //Enable transitions to seizure state [ From 89942f6172827d68bf20274598ca387869982d94 Mon Sep 17 00:00:00 2001 From: WishaWoshi Date: Sun, 13 Oct 2024 20:26:01 +0100 Subject: [PATCH 33/37] Merge to 3.0 --- .github/workflows/arma.yml | 3 +- .hemtt/launch.toml | 6 + .hemtt/project.toml | 38 +- addons/airway/XEH_postInit.sqf | 3 - .../fnc_gui_updateInjuryListGeneral.sqf | 2 +- .../fnc_gui_updateInjuryListPart.sqf | 2 +- addons/airway/functions/fnc_handlePuking.sqf | 2 +- ...reatmentAdvanced_RemoveAirwayItemLocal.sqf | 2 +- addons/airway/licence.txt | 2 +- addons/airway/stringtable.xml | 121 ++++ addons/breathing/XEH_PREP.hpp | 3 - addons/breathing/XEH_postInit.sqf | 1 - addons/breathing/XEH_preInit.sqf | 22 +- .../functions/fnc_checkBreathing.sqf | 6 +- .../breathing/functions/fnc_fullHealLocal.sqf | 1 - addons/breathing/functions/fnc_getETCo2.sqf | 78 --- .../functions/fnc_getRespiratoryRate.sqf | 62 -- .../fnc_gui_updateInjuryListPart.sqf | 10 +- .../functions/fnc_handleBreathing.sqf | 4 - .../functions/fnc_handlePulmoHit.sqf | 5 +- addons/breathing/functions/fnc_lowSpO2pp.sqf | 63 -- ...c_treatmentAdvanced_pulseoximeterLocal.sqf | 4 +- addons/breathing/functions/fnc_useBVM.sqf | 2 +- addons/breathing/licence.txt | 2 +- addons/breathing/stringtable.xml | 254 ++++++-- addons/chemical/functions/fnc_afterWait.sqf | 7 +- addons/chemical/functions/fnc_breathing.sqf | 2 +- .../chemical/functions/fnc_chemDetector.sqf | 4 +- addons/chemical/functions/fnc_gasAI.sqf | 12 +- addons/chemical/functions/fnc_gasCheck.sqf | 4 +- .../functions/fnc_getChemDetectorState.sqf | 2 +- addons/chemical/functions/fnc_getList.sqf | 4 +- addons/chemical/functions/fnc_handleFired.sqf | 6 +- addons/chemical/functions/fnc_init.sqf | 4 +- .../chemical/functions/fnc_throwGrenade.sqf | 2 +- addons/chemical/stringtable.xml | 54 ++ .../ACE_Medical_Treatment_Actions.hpp | 12 +- addons/circulation/Blood_Medical.hpp | 48 +- addons/circulation/CfgVehicles.hpp | 125 ++++ addons/circulation/CfgWeapons.hpp | 76 +++ addons/circulation/XEH_PREP.hpp | 5 + addons/circulation/XEH_preInit.sqf | 10 + addons/circulation/defines.hpp | 6 +- .../functions/fnc_AEDX_ViewMonitor.sqf | 2 +- .../functions/fnc_AEDX_VitalsMonitor.sqf | 30 +- .../circulation/functions/fnc_AED_Analyze.sqf | 14 +- .../circulation/functions/fnc_AED_Charge.sqf | 14 +- .../fnc_Defibrillator_AttachPads.sqf | 2 +- .../fnc_Defibrillator_ManualCharge.sqf | 10 +- .../functions/fnc_addArterialApplyActions.sqf | 57 ++ .../functions/fnc_addArterialTestActions.sqf | 59 ++ .../functions/fnc_attachBloodGas.sqf | 23 + addons/circulation/functions/fnc_canDraw.sqf | 4 +- addons/circulation/functions/fnc_cprLocal.sqf | 16 +- .../functions/fnc_drawArterial.sqf | 35 ++ .../circulation/functions/fnc_drawBlood.sqf | 6 +- .../functions/fnc_fullHealLocal.sqf | 11 + .../functions/fnc_handleCardiacArrest.sqf | 6 +- .../functions/fnc_showBloodGas.sqf | 37 ++ .../fnc_updateBloodPressureChange.sqf | 2 +- .../functions/fnc_updateHeartRate.sqf | 8 +- .../functions/fnc_updateInternalBleeding.sqf | 2 +- addons/circulation/licence.txt | 2 +- addons/circulation/stringtable.xml | 278 ++++++++- addons/feedback/$PBOPREFIX$ | 1 + addons/feedback/CfgEventHandlers.hpp | 12 + addons/feedback/XEH_PREP.hpp | 4 + addons/feedback/XEH_postInit.sqf | 12 + addons/feedback/XEH_preInit.sqf | 30 + addons/feedback/config.cpp | 32 + .../feedback/functions/fnc_effectLowSpO2.sqf | 44 ++ .../feedback/functions/fnc_effectOpioid.sqf | 44 ++ .../feedback/functions/fnc_handleEffects.sqf | 41 ++ addons/feedback/functions/fnc_initEffects.sqf | 47 ++ addons/feedback/script_component.hpp | 23 + addons/feedback/stringtable.xml | 41 ++ addons/gui/CfgFunctions.hpp | 3 + addons/gui/XEH_PREP.hpp | 9 +- addons/gui/functions/fnc_dumpBloodGas.sqf | 20 + addons/gui/functions/fnc_handleABGShow.sqf | 21 + addons/gui/functions/fnc_handleIVAdjust.sqf | 25 + addons/gui/functions/fnc_handleIVShow.sqf | 21 + addons/gui/functions/fnc_menuPFH.sqf | 66 ++ addons/gui/functions/fnc_onMenuOpen.sqf | 4 + addons/gui/functions/fnc_updateABGStatus.sqf | 51 ++ addons/gui/functions/fnc_updateIVStatus.sqf | 90 +++ addons/gui/functions/fnc_updateInjuryList.sqf | 8 +- addons/gui/gui.hpp | 510 +++++++++++++++- addons/gui/gui_defines.hpp | 73 +++ addons/gui/stringtable.xml | 150 ++++- addons/hypothermia/$PBOPREFIX$ | 1 + .../ACE_Medical_Treatment_Actions.hpp | 45 ++ addons/hypothermia/CfgEventHandlers.hpp | 20 + addons/hypothermia/CfgVehicles.hpp | 27 + addons/hypothermia/CfgWeapons.hpp | 27 + addons/hypothermia/XEH_PREP.hpp | 12 + addons/hypothermia/XEH_postInit.sqf | 8 + addons/hypothermia/XEH_preInit.sqf | 26 + addons/hypothermia/config.cpp | 39 ++ .../functions/fnc_applyFluidWarmer.sqf | 26 + .../functions/fnc_applyFluidWarmerLocal.sqf | 23 + .../functions/fnc_checkHandWarmers.sqf | 51 ++ .../functions/fnc_checkTemperature.sqf | 28 + .../functions/fnc_fullHealLocal.sqf | 24 + .../functions/fnc_handleRespawn.sqf | 53 ++ addons/hypothermia/functions/fnc_init.sqf | 56 ++ .../functions/fnc_removeFluidWarmer.sqf | 25 + .../functions/fnc_removeFluidWarmerLocal.sqf | 26 + .../functions/fnc_removeWarmer.sqf | 27 + .../functions/fnc_useHandWarmer.sqf | 27 + .../functions/fnc_useHandWarmerLocal.sqf | 24 + addons/hypothermia/script_component.hpp | 17 + addons/hypothermia/stringtable.xml | 251 ++++++++ addons/hypothermia/ui/fluidWarmer.paa | Bin 0 -> 117103 bytes addons/hypothermia/ui/warmers.paa | Bin 0 -> 125165 bytes addons/main/CfgSettings.hpp | 13 + addons/main/config.cpp | 2 + addons/main/script_macros.hpp | 61 +- addons/main/script_mod.hpp | 5 +- addons/main/script_version.hpp | 8 +- addons/main/stringtable.xml | 1 + addons/misc/CfgFunctions.hpp | 8 - addons/misc/CfgVehicles.hpp | 128 +--- addons/misc/CfgWeapons.hpp | 14 - addons/misc/XEH_PREP.hpp | 9 +- addons/misc/XEH_postInit.sqf | 8 +- addons/misc/config.cpp | 8 +- addons/misc/functions/fnc_BubbleWrap.sqf | 3 +- addons/misc/functions/fnc_FAK_checkRepack.sqf | 6 +- .../misc/functions/fnc_FAK_displayContent.sqf | 20 +- addons/misc/functions/fnc_FAK_repack.sqf | 8 +- addons/misc/functions/fnc_FAK_unpack.sqf | 8 +- .../misc/functions/fnc_FAK_updateContents.sqf | 8 +- addons/misc/functions/fnc_actionLowerBy10.sqf | 74 --- addons/misc/functions/fnc_addActionRaise.sqf | 77 --- addons/misc/functions/fnc_canCheckDogtag.sqf | 7 +- addons/misc/functions/fnc_carryObject.sqf | 24 +- .../functions/fnc_heliAddActionDeploy.sqf | 70 --- .../functions/fnc_heliStretcherAttach.sqf | 28 - .../functions/fnc_removeTourniquetTime.sqf | 27 + .../misc/functions/fnc_setTourniquetTime.sqf | 26 + addons/misc/functions/fnc_stretcher.sqf | 40 -- addons/misc/functions/fnc_stringToArray.sqf | 2 +- addons/misc/functions/fnc_treatment.sqf | 2 +- addons/misc/functions/fnc_unSlingArmband.sqf | 10 +- .../functions/fnc_unloadAndCarryPatient.sqf | 2 +- .../functions/fnc_updateDamageEffects.sqf | 2 +- addons/misc/functions/fnc_useItem.sqf | 12 +- addons/misc/licence.txt | 2 +- .../models/stretcher/vurtual_stretcher.p3d | Bin 369457 -> 0 bytes addons/misc/stringtable.xml | 392 +++++------- addons/pharma/ACE_Medical_Treatment.hpp | 9 +- .../pharma/ACE_Medical_Treatment_Actions.hpp | 18 +- addons/pharma/CfgWeapons.hpp | 4 +- addons/pharma/XEH_PREP.hpp | 4 +- addons/pharma/XEH_preInit.sqf | 65 +- addons/pharma/functions/fnc_alphaAction.sqf | 24 - addons/pharma/functions/fnc_clotWound.sqf | 6 +- addons/pharma/functions/fnc_coagRegen.sqf | 2 +- addons/pharma/functions/fnc_fluidLocal.sqf | 8 +- addons/pharma/functions/fnc_fullHealLocal.sqf | 39 +- .../functions/fnc_getBloodVolumeChange.sqf | 81 ++- addons/pharma/functions/fnc_handleRespawn.sqf | 54 +- addons/pharma/functions/fnc_init.sqf | 59 +- .../pharma/functions/fnc_medicationLocal.sqf | 21 +- addons/pharma/functions/fnc_pervitinPP.sqf | 47 -- .../pharma/functions/fnc_tourniquetRemove.sqf | 15 +- .../fnc_treatmentAdvanced_CarbonateLocal.sqf | 2 +- .../fnc_treatmentAdvanced_CheckCoag.sqf | 4 +- .../fnc_treatmentAdvanced_DialysisLocal.sqf | 2 +- .../fnc_treatmentAdvanced_EACALocal.sqf | 5 +- .../fnc_treatmentAdvanced_FentanylLocal.sqf | 49 +- .../fnc_treatmentAdvanced_KetamineLocal.sqf | 66 -- .../fnc_treatmentAdvanced_MorphineLocal.sqf | 3 - .../fnc_treatmentAdvanced_NalbuphineLocal.sqf | 3 - ...c_treatmentAdvanced_ReorientationLocal.sqf | 2 +- .../fnc_treatmentAdvanced_TXALocal.sqf | 11 +- addons/pharma/licence.txt | 2 +- addons/pharma/stringtable.xml | 568 ++++++++++++------ addons/stretcher/$PBOPREFIX$ | 1 + addons/stretcher/CfgEventHandlers.hpp | 12 + addons/{misc => stretcher}/CfgMoves.hpp | 0 addons/stretcher/CfgVehicles.hpp | 224 +++++++ addons/stretcher/CfgWeapons.hpp | 35 ++ addons/stretcher/XEH_PREP.hpp | 17 + addons/stretcher/XEH_postInit.sqf | 7 + addons/stretcher/XEH_preInit.sqf | 11 + addons/stretcher/config.cpp | 40 ++ .../fnc_assemble_canDeployStretcher.sqf | 22 + .../fnc_assemble_deployStretcher.sqf | 73 +++ .../functions/fnc_attachHeliStretcher.sqf | 27 + .../functions/fnc_attachStretcher.sqf | 4 +- .../functions/fnc_canAdjustRopes.sqf | 19 + .../functions/fnc_canAttachHeliStretcher.sqf | 20 + .../functions/fnc_canDeployHeliStretcher.sqf | 18 + .../functions/fnc_canDetachHeliStretcher.sqf | 18 + .../functions/fnc_canPackIntoBackpack.sqf | 20 + .../functions/fnc_canPackIntoBag.sqf | 20 + .../functions/fnc_deployHeliStretcher.sqf | 35 ++ .../functions/fnc_detachHeliStretcher.sqf | 36 ++ .../functions/fnc_lowerHeliStretcher.sqf | 28 + .../functions/fnc_packIntoBackpack.sqf | 25 + .../stretcher/functions/fnc_packIntoBag.sqf | 74 +++ .../functions/fnc_raiseHeliStretcher.sqf | 25 + .../functions/fnc_retractHeliStretcher.sqf | 62 ++ .../models/stretcher/Model.cfg | 0 .../models/stretcher/env_land_co.paa | Bin .../models/stretcher/seat.rvmat | 4 +- .../models/stretcher/seat_destruct.rvmat | 6 +- .../models/stretcher/seat_destruct_mc.paa | Bin .../models/stretcher/seat_destruct_smdi.paa | Bin .../models/stretcher/seat_nohq.paa | Bin .../models/stretcher/seat_smdi.paa | Bin .../models/stretcher/stretcher.rvmat | 4 +- .../models/stretcher/stretcher_co.paa | Bin .../models/stretcher/stretcher_nohq.paa | Bin .../models/stretcher/vurtual_stretcher.p3d | Bin 0 -> 380526 bytes addons/stretcher/script_component.hpp | 24 + addons/stretcher/stringtable.xml | 229 +++++++ addons/{misc => stretcher}/ui/downarrow.paa | Bin addons/{misc => stretcher}/ui/fliparrow.paa | Bin addons/{misc => stretcher}/ui/stretcher.paa | Bin addons/{misc => stretcher}/ui/uparrow.paa | Bin .../{misc => stretcher}/vehicle_stretcher.hpp | 8 + .../surgery/ACE_Medical_Treatment_Actions.hpp | 16 +- .../functions/fnc_closedReductionLocal.sqf | 2 +- .../surgery/functions/fnc_openReduction.sqf | 4 +- .../functions/fnc_openReductionLocal.sqf | 16 +- addons/surgery/stringtable.xml | 160 ++++- addons/vitals/$PBOPREFIX$ | 1 + addons/vitals/CfgEventHandlers.hpp | 20 + addons/vitals/CfgFunctions.hpp | 21 + addons/vitals/XEH_PREP.hpp | 10 + addons/vitals/XEH_postInit.sqf | 3 + addons/vitals/XEH_preInit.sqf | 20 + addons/vitals/config.cpp | 33 + .../functions/fnc_addMedicationAdjustment.sqf | 34 ++ .../functions/fnc_handleCardiacFunction.sqf | 71 +++ .../functions/fnc_handleOxygenFunction.sqf | 95 +++ addons/vitals/functions/fnc_handleRespawn.sqf | 20 + .../functions/fnc_handleSimpleVitals.sqf | 121 ++++ .../fnc_handleTemperatureFunction.sqf | 36 ++ .../vitals/functions/fnc_handleUnitVitals.sqf | 200 ++++++ .../functions/fnc_hasStableVitals.sqf | 4 +- addons/vitals/functions/fnc_init.sqf | 20 + .../functions/fnc_updateOpioidEffect.sqf | 24 + addons/vitals/script_component.hpp | 17 + addons/vitals/stringtable.xml | 11 + addons/watch/$PBOPREFIX$ | 2 + addons/watch/CfgEventHandlers.hpp | 11 + addons/watch/CfgWeapons.hpp | 10 + addons/watch/RscTitles.hpp | 194 ++++++ addons/watch/UI/watch_icon.paa | Bin 0 -> 32487 bytes addons/watch/UI/watch_katmin.paa | Bin 0 -> 211769 bytes addons/watch/UI/watch_katmin_direction.paa | Bin 0 -> 37989 bytes addons/watch/UI/watch_overcast.paa | Bin 0 -> 30270 bytes addons/watch/UI/watch_rain.paa | Bin 0 -> 30554 bytes addons/watch/UI/watch_sun.paa | Bin 0 -> 30207 bytes addons/watch/XEH_PREP.hpp | 2 + addons/watch/XEH_postInit.sqf | 16 + addons/watch/XEH_preInit.sqf | 38 ++ addons/watch/config.cpp | 37 ++ addons/watch/functions/fnc_hideKWatch.sqf | 19 + addons/watch/functions/fnc_showKWatch.sqf | 127 ++++ addons/watch/script_component.hpp | 17 + addons/watch/stringtable.xml | 89 +++ addons/zeus/functions/fnc_openMedicalMenu.sqf | 2 +- .../functions/fnc_toggleAIDeathModule.sqf | 2 +- .../zeus/functions/fnc_ui_changeBloodType.sqf | 13 +- .../functions/fnc_ui_changeCardiacState.sqf | 4 +- addons/zeus/functions/fnc_ui_manageAirway.sqf | 22 +- addons/zeus/script_component.hpp | 2 +- addons/zeus/stringtable.xml | 60 +- 273 files changed, 7148 insertions(+), 1858 deletions(-) create mode 100644 .hemtt/launch.toml delete mode 100644 addons/breathing/functions/fnc_getETCo2.sqf delete mode 100644 addons/breathing/functions/fnc_getRespiratoryRate.sqf delete mode 100644 addons/breathing/functions/fnc_lowSpO2pp.sqf create mode 100644 addons/circulation/functions/fnc_addArterialApplyActions.sqf create mode 100644 addons/circulation/functions/fnc_addArterialTestActions.sqf create mode 100644 addons/circulation/functions/fnc_attachBloodGas.sqf create mode 100644 addons/circulation/functions/fnc_drawArterial.sqf create mode 100644 addons/circulation/functions/fnc_showBloodGas.sqf create mode 100644 addons/feedback/$PBOPREFIX$ create mode 100644 addons/feedback/CfgEventHandlers.hpp create mode 100644 addons/feedback/XEH_PREP.hpp create mode 100644 addons/feedback/XEH_postInit.sqf create mode 100644 addons/feedback/XEH_preInit.sqf create mode 100644 addons/feedback/config.cpp create mode 100644 addons/feedback/functions/fnc_effectLowSpO2.sqf create mode 100644 addons/feedback/functions/fnc_effectOpioid.sqf create mode 100644 addons/feedback/functions/fnc_handleEffects.sqf create mode 100644 addons/feedback/functions/fnc_initEffects.sqf create mode 100644 addons/feedback/script_component.hpp create mode 100644 addons/feedback/stringtable.xml create mode 100644 addons/gui/functions/fnc_dumpBloodGas.sqf create mode 100644 addons/gui/functions/fnc_handleABGShow.sqf create mode 100644 addons/gui/functions/fnc_handleIVAdjust.sqf create mode 100644 addons/gui/functions/fnc_handleIVShow.sqf create mode 100644 addons/gui/functions/fnc_menuPFH.sqf create mode 100644 addons/gui/functions/fnc_updateABGStatus.sqf create mode 100644 addons/gui/functions/fnc_updateIVStatus.sqf create mode 100644 addons/hypothermia/$PBOPREFIX$ create mode 100644 addons/hypothermia/ACE_Medical_Treatment_Actions.hpp create mode 100644 addons/hypothermia/CfgEventHandlers.hpp create mode 100644 addons/hypothermia/CfgVehicles.hpp create mode 100644 addons/hypothermia/CfgWeapons.hpp create mode 100644 addons/hypothermia/XEH_PREP.hpp create mode 100644 addons/hypothermia/XEH_postInit.sqf create mode 100644 addons/hypothermia/XEH_preInit.sqf create mode 100644 addons/hypothermia/config.cpp create mode 100644 addons/hypothermia/functions/fnc_applyFluidWarmer.sqf create mode 100644 addons/hypothermia/functions/fnc_applyFluidWarmerLocal.sqf create mode 100644 addons/hypothermia/functions/fnc_checkHandWarmers.sqf create mode 100644 addons/hypothermia/functions/fnc_checkTemperature.sqf create mode 100644 addons/hypothermia/functions/fnc_fullHealLocal.sqf create mode 100644 addons/hypothermia/functions/fnc_handleRespawn.sqf create mode 100644 addons/hypothermia/functions/fnc_init.sqf create mode 100644 addons/hypothermia/functions/fnc_removeFluidWarmer.sqf create mode 100644 addons/hypothermia/functions/fnc_removeFluidWarmerLocal.sqf create mode 100644 addons/hypothermia/functions/fnc_removeWarmer.sqf create mode 100644 addons/hypothermia/functions/fnc_useHandWarmer.sqf create mode 100644 addons/hypothermia/functions/fnc_useHandWarmerLocal.sqf create mode 100644 addons/hypothermia/script_component.hpp create mode 100644 addons/hypothermia/stringtable.xml create mode 100644 addons/hypothermia/ui/fluidWarmer.paa create mode 100644 addons/hypothermia/ui/warmers.paa create mode 100644 addons/main/CfgSettings.hpp delete mode 100644 addons/misc/functions/fnc_actionLowerBy10.sqf delete mode 100644 addons/misc/functions/fnc_addActionRaise.sqf delete mode 100644 addons/misc/functions/fnc_heliAddActionDeploy.sqf delete mode 100644 addons/misc/functions/fnc_heliStretcherAttach.sqf create mode 100644 addons/misc/functions/fnc_removeTourniquetTime.sqf create mode 100644 addons/misc/functions/fnc_setTourniquetTime.sqf delete mode 100644 addons/misc/functions/fnc_stretcher.sqf delete mode 100644 addons/misc/models/stretcher/vurtual_stretcher.p3d delete mode 100644 addons/pharma/functions/fnc_alphaAction.sqf delete mode 100644 addons/pharma/functions/fnc_treatmentAdvanced_KetamineLocal.sqf create mode 100644 addons/stretcher/$PBOPREFIX$ create mode 100644 addons/stretcher/CfgEventHandlers.hpp rename addons/{misc => stretcher}/CfgMoves.hpp (100%) create mode 100644 addons/stretcher/CfgVehicles.hpp create mode 100644 addons/stretcher/CfgWeapons.hpp create mode 100644 addons/stretcher/XEH_PREP.hpp create mode 100644 addons/stretcher/XEH_postInit.sqf create mode 100644 addons/stretcher/XEH_preInit.sqf create mode 100644 addons/stretcher/config.cpp create mode 100644 addons/stretcher/functions/fnc_assemble_canDeployStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_assemble_deployStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_attachHeliStretcher.sqf rename addons/{misc => stretcher}/functions/fnc_attachStretcher.sqf (92%) create mode 100644 addons/stretcher/functions/fnc_canAdjustRopes.sqf create mode 100644 addons/stretcher/functions/fnc_canAttachHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_canDeployHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_canDetachHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_canPackIntoBackpack.sqf create mode 100644 addons/stretcher/functions/fnc_canPackIntoBag.sqf create mode 100644 addons/stretcher/functions/fnc_deployHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_detachHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_lowerHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_packIntoBackpack.sqf create mode 100644 addons/stretcher/functions/fnc_packIntoBag.sqf create mode 100644 addons/stretcher/functions/fnc_raiseHeliStretcher.sqf create mode 100644 addons/stretcher/functions/fnc_retractHeliStretcher.sqf rename addons/{misc => stretcher}/models/stretcher/Model.cfg (100%) rename addons/{misc => stretcher}/models/stretcher/env_land_co.paa (100%) rename addons/{misc => stretcher}/models/stretcher/seat.rvmat (80%) rename addons/{misc => stretcher}/models/stretcher/seat_destruct.rvmat (81%) rename addons/{misc => stretcher}/models/stretcher/seat_destruct_mc.paa (100%) rename addons/{misc => stretcher}/models/stretcher/seat_destruct_smdi.paa (100%) rename addons/{misc => stretcher}/models/stretcher/seat_nohq.paa (100%) rename addons/{misc => stretcher}/models/stretcher/seat_smdi.paa (100%) rename addons/{misc => stretcher}/models/stretcher/stretcher.rvmat (94%) rename addons/{misc => stretcher}/models/stretcher/stretcher_co.paa (100%) rename addons/{misc => stretcher}/models/stretcher/stretcher_nohq.paa (100%) create mode 100644 addons/stretcher/models/stretcher/vurtual_stretcher.p3d create mode 100644 addons/stretcher/script_component.hpp create mode 100644 addons/stretcher/stringtable.xml rename addons/{misc => stretcher}/ui/downarrow.paa (100%) rename addons/{misc => stretcher}/ui/fliparrow.paa (100%) rename addons/{misc => stretcher}/ui/stretcher.paa (100%) rename addons/{misc => stretcher}/ui/uparrow.paa (100%) rename addons/{misc => stretcher}/vehicle_stretcher.hpp (82%) create mode 100644 addons/vitals/$PBOPREFIX$ create mode 100644 addons/vitals/CfgEventHandlers.hpp create mode 100644 addons/vitals/CfgFunctions.hpp create mode 100644 addons/vitals/XEH_PREP.hpp create mode 100644 addons/vitals/XEH_postInit.sqf create mode 100644 addons/vitals/XEH_preInit.sqf create mode 100644 addons/vitals/config.cpp create mode 100644 addons/vitals/functions/fnc_addMedicationAdjustment.sqf create mode 100644 addons/vitals/functions/fnc_handleCardiacFunction.sqf create mode 100644 addons/vitals/functions/fnc_handleOxygenFunction.sqf create mode 100644 addons/vitals/functions/fnc_handleRespawn.sqf create mode 100644 addons/vitals/functions/fnc_handleSimpleVitals.sqf create mode 100644 addons/vitals/functions/fnc_handleTemperatureFunction.sqf create mode 100644 addons/vitals/functions/fnc_handleUnitVitals.sqf rename addons/{misc => vitals}/functions/fnc_hasStableVitals.sqf (91%) create mode 100644 addons/vitals/functions/fnc_init.sqf create mode 100644 addons/vitals/functions/fnc_updateOpioidEffect.sqf create mode 100644 addons/vitals/script_component.hpp create mode 100644 addons/vitals/stringtable.xml create mode 100644 addons/watch/$PBOPREFIX$ create mode 100644 addons/watch/CfgEventHandlers.hpp create mode 100644 addons/watch/CfgWeapons.hpp create mode 100644 addons/watch/RscTitles.hpp create mode 100644 addons/watch/UI/watch_icon.paa create mode 100644 addons/watch/UI/watch_katmin.paa create mode 100644 addons/watch/UI/watch_katmin_direction.paa create mode 100644 addons/watch/UI/watch_overcast.paa create mode 100644 addons/watch/UI/watch_rain.paa create mode 100644 addons/watch/UI/watch_sun.paa create mode 100644 addons/watch/XEH_PREP.hpp create mode 100644 addons/watch/XEH_postInit.sqf create mode 100644 addons/watch/XEH_preInit.sqf create mode 100644 addons/watch/config.cpp create mode 100644 addons/watch/functions/fnc_hideKWatch.sqf create mode 100644 addons/watch/functions/fnc_showKWatch.sqf create mode 100644 addons/watch/script_component.hpp create mode 100644 addons/watch/stringtable.xml diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml index e7a70ea35..fec0872e6 100644 --- a/.github/workflows/arma.yml +++ b/.github/workflows/arma.yml @@ -41,7 +41,8 @@ jobs: - name: Run HEMTT Build run: hemtt build - name: Upload Release - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: '@kat' path: '.hemttout/build/*' + include-hidden-files: true # Because .hemttout is a hidden directory diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml new file mode 100644 index 000000000..662ac1232 --- /dev/null +++ b/.hemtt/launch.toml @@ -0,0 +1,6 @@ +[default] +workshop = [ + "450814997", # CBA_A3's Workshop ID + "463939057", # ACE3's Workshop ID + "2369477168", # Advanced Developer Tools's Workshop ID +] \ No newline at end of file diff --git a/.hemtt/project.toml b/.hemtt/project.toml index b465fc5c1..1dc8474fb 100644 --- a/.hemtt/project.toml +++ b/.hemtt/project.toml @@ -1,12 +1,8 @@ name = "KAM" prefix = "kat" -author = "Katalam, Tomcat, Kygan, YetheSamartaka, Battlekeeper, MJSTIC, Digii / Julian and MiszczuZPolski" +author = "Katalam, Tomcat, Kygan, YetheSamartaka, Battlekeeper, MJSTIC, Digii / Julian, MiszczuZPolski and Blue" mainprefix = "x" -#modname = "{{prefix}}_mods" -#key_name = "{{prefix}}_{{version}}" -#authority = "{{prefix}}_{{version}}" - [files] include = [ "mod.cpp", @@ -19,35 +15,3 @@ include = [ [version] git_hash = 0 - -#[properties] -#version = "{{git \"id 8\"}}" - -[lint.sqf] -enabled = true # Default: true -exclude = [ - "a3/3DEN/UI/macroexecs.inc", - "a3/ui_f/hpp/defineResincl.inc", - "a3/ui_f/hpp/defineDIKCodes.inc", - "a3/ui_f/hpp/defineCommonGrids.inc", - "a3/ui_f/hpp/defineCommonColors.inc", -] - - - -[asc] -enabled = true -exclude = [ - "/initsettings.sqf", - "/initkeybinds.sqf", - "/xeh_prep.sqf" -] - -[hemtt.config] -preset = "Hemtt" - -[hemtt.launch] -workshop = [ - "450814997", # CBA_A3's Workshop ID - "463939057", # ACE3's Workshop ID -] diff --git a/addons/airway/XEH_postInit.sqf b/addons/airway/XEH_postInit.sqf index 9b2d9b8e3..cd443c7d2 100644 --- a/addons/airway/XEH_postInit.sqf +++ b/addons/airway/XEH_postInit.sqf @@ -29,9 +29,6 @@ if !(GVAR(enable)) exitWith {}; private _alive = alive _unit; if ((!_alive) || (_unit getVariable [GVAR(string_exit), ""] isEqualTo "keko_wasPunched") || KAT_forceWakeup) exitWith {}; - if (EGVAR(breathing,enable)) then { - [QEGVAR(breathing,handleBreathing), [_unit, CBA_missionTime], _unit] call CBA_fnc_targetEvent; - }; [_unit] call FUNC(handleAirway); [_unit] call FUNC(handlePuking); }] call CBA_fnc_addEventHandler; diff --git a/addons/airway/functions/fnc_gui_updateInjuryListGeneral.sqf b/addons/airway/functions/fnc_gui_updateInjuryListGeneral.sqf index 8f748601b..ea56a0e93 100644 --- a/addons/airway/functions/fnc_gui_updateInjuryListGeneral.sqf +++ b/addons/airway/functions/fnc_gui_updateInjuryListGeneral.sqf @@ -21,5 +21,5 @@ params ["_ctrl", "_target", "_selectionN", "_entries"]; if (_target getVariable [QGVAR(recovery), false]) then { - _entries pushback [LLSTRING(RecoveryPosition), [0.1, 1, 1, 1]]; + _entries pushBack [LLSTRING(RecoveryPosition), [0.1, 1, 1, 1]]; }; diff --git a/addons/airway/functions/fnc_gui_updateInjuryListPart.sqf b/addons/airway/functions/fnc_gui_updateInjuryListPart.sqf index e2e8b7881..92b2ed4f9 100644 --- a/addons/airway/functions/fnc_gui_updateInjuryListPart.sqf +++ b/addons/airway/functions/fnc_gui_updateInjuryListPart.sqf @@ -28,6 +28,6 @@ if (_target getVariable [QGVAR(airway), false] && _selectionN isEqualTo 0) then private _a = _target getVariable [QGVAR(airway_item), ""]; if !(_a isEqualTo "") then { private _text = format [LSTRING(%1_Display), _a]; - _entries pushback [localize _text, [0.1, 1, 1, 1]]; + _entries pushBack [localize _text, [0.1, 1, 1, 1]]; }; }; diff --git a/addons/airway/functions/fnc_handlePuking.sqf b/addons/airway/functions/fnc_handlePuking.sqf index e595e6fb5..258de9327 100644 --- a/addons/airway/functions/fnc_handlePuking.sqf +++ b/addons/airway/functions/fnc_handlePuking.sqf @@ -39,7 +39,7 @@ _unit setVariable ["kat_pukeActive_PFH", true]; if !(_unit getVariable [QGVAR(occluded), false]) then { _unit setVariable [QGVAR(occluded), true, true]; if (GVAR(checkbox_puking_sound)) then { - playsound3D [selectRandom [QPATHTOF_SOUND(sounds\puking1.wav),QPATHTOF_SOUND(sounds\puking2.wav),QPATHTOF_SOUND(sounds\puking3.wav)], _unit, false, getPosASL _unit, 8, 1, 15]; + playSound3D [selectRandom [QPATHTOF_SOUND(sounds\puking1.wav),QPATHTOF_SOUND(sounds\puking2.wav),QPATHTOF_SOUND(sounds\puking3.wav)], _unit, false, getPosASL _unit, 8, 1, 15]; }; }; }; diff --git a/addons/airway/functions/fnc_treatmentAdvanced_RemoveAirwayItemLocal.sqf b/addons/airway/functions/fnc_treatmentAdvanced_RemoveAirwayItemLocal.sqf index 473e30f52..941c7939d 100644 --- a/addons/airway/functions/fnc_treatmentAdvanced_RemoveAirwayItemLocal.sqf +++ b/addons/airway/functions/fnc_treatmentAdvanced_RemoveAirwayItemLocal.sqf @@ -27,7 +27,7 @@ if (_item isEqualTo "Larynxtubus") then { _patient call FUNC(handlePuking); }; -if !(GVAR(ReusableAirwayItems)) exitwith {}; +if !(GVAR(ReusableAirwayItems)) exitWith {}; if (_item isEqualTo "Larynxtubus") then { [_medic, "kat_larynx"] call ACEFUNC(common,addToInventory); diff --git a/addons/airway/licence.txt b/addons/airway/licence.txt index e4d6b39be..4dd142f90 100644 --- a/addons/airway/licence.txt +++ b/addons/airway/licence.txt @@ -1,4 +1,4 @@ -This addon is made by Katalam. +This addon is made by Katalam. This file must not be removed from the folder and must be contained in every work based on this addon or parts of it. diff --git a/addons/airway/stringtable.xml b/addons/airway/stringtable.xml index f9d1969d4..ccb088d61 100644 --- a/addons/airway/stringtable.xml +++ b/addons/airway/stringtable.xml @@ -18,6 +18,7 @@ ACE - Lesões nas vias aéreas ativadas? ACE - Luftveiskade aktivert? Hengitysteiden vammat aktivoituivat? + Is ACE-Luchtweg verwondingen geactiveerd? Probability for an obstructed airway @@ -36,6 +37,7 @@ Probabilidade de obstrução das vias aéreas Sannsynligheten for blokkert luftvei Tukkeutuneiden hengitysteiden todennäköisyys + Kans op geblokkeerde luchtweg Probability for an obstructed airway in percentage that gets rolled every: \n- Falling unconscious \n- Removing KingLT / Guedel Tube @@ -50,6 +52,7 @@ Probabilidade percentual de obstrução de uma via aérea a cada vez que: \n- Ficar inconsciente \n- Remoção do Tubo Laríngeo / Cânula de Guedel Tukkeutuneen hengitysteiden todennäköisyys prosentteina, joka pyörii joka kerta:\n- Putoaminen tajuttomuuteen poistaminen / Guedel putki Вероятность закупорки дыхательных путей в процентах, которая приводит к смерти при каждом: \n- падении без сознания \n - Удалении гортанной трубки/трубки Геделя + Kans op geblokkeerde luchtweg in een percentage die gerold wordt elke: \n- Bewusteloos raken \n- KingLT / Guedel verwijderen Probability for airway occluding @@ -68,6 +71,7 @@ Probabilidade de oclusão das vias aéreas Sannsynlighet for at luftveien blir blokkert Todennäköisyys hengitysteiden tukkeutumiseen + Kans op een luchtwegverstopping Probability for an occlusion in percentage that gets rolled Setting:[Occlusion repeat timer] (default every 60s) @@ -82,6 +86,7 @@ Probabilidade percentual de oclusão, lançada a cada intervalo de tempo definido pela configuração: [Temporizador de repetição de oclusão] (por padrão, 60s) Tukosten todennäköisyys prosentteina joka on satunnaisesti laskettu Asetukset: [Okkluusiotoistoajastin] (oletusarvo on kuusikymmentä sekuntia) Вероятность возникновения окклюзии в процентах, которая будет отменена Настройка: [Таймер повтора окклюзии] (по умолчанию каждые 60 секунд) + Kans op een luchtwegverstopping in een percentage die gerold wordt elke Instelling:[Verstopping herhaling timer] (standaard elke 60 seconden) Occlusion repeat timer @@ -98,6 +103,7 @@ Repetisjonsintervall for Okklusjon Okkluusiotoistoajastin Таймер повторения окклюзии + Verstoppings herhaling timer Occlusion Cooldown Period @@ -110,6 +116,7 @@ Tiempo para repetirse oclusion Okkluusiojäähdytyssykli Период восстановления окклюзии + Verstoppings afkoelingsperiode Activate the puking sound? @@ -128,6 +135,7 @@ Ativar o som de vômito? Aktiver lyd for oppkast? Ota oksennusääni käyttöön? + Braakgeluiden activeren? Community called keko had addon for AFK players. They were put unconscious so others could drag them away. That triggered chances for airway problems. This string prevents that from happening when they get unconscious by that AFK addon. @@ -146,6 +154,7 @@ A comunidade Keko tinha um addon para os jogadores AFK. Eles foram colocados inconscientes para que outros pudessem arrastá-los. Isso desencadeou chances de problemas nas vias aéreas. Esta corda evita que isso aconteça quando eles ficam inconscientes por causa do addon. Felleskapet kalt "Keko" hadde en tilleggsfunksjon for AFK-spillere. De ble gjort bevisstløse slik at andre kunne dra dem bort. Dette utløste muligheter for luftveisproblemer. Denne strengen forhindrer at det skjer når de blir bevisstløse av det AFK-tillegget. Yhteisössä nimeltä keko oli lisäosa ei-aktiivisille pelaajille. He putosivat tajuttomaksi, jotta muut voisivat vetää heidät pois. Tämä aiheutti hengitysvaikeuksia. Tämä koodi estää tämän tapahtumisen, kun he menettävät tajuntansa tämän lisäosan takia. + De community met de naam keko had een addon voor AFK spelers. Ze werden in een bewusteloze staat gebracht zodat anderen ze konder wegslepen. Dit veroorzaakte kansen voor luchtwegproblemen. Deze streng voorkomt dit wanneer ze door de addon bewusteloos worden gemaakt. Check Airway @@ -164,6 +173,7 @@ Verificar as vias aéreas Sjekk lufveier Tarkista hengitystiet + Check luchtwegen %1 checked airways: %2, %3 @@ -181,6 +191,8 @@ %1 sjekket luftveiene: %2, %3 %1 tarkistettu hengitystiet, %2, %3 %1 проверенные дыхательные пути: %2, %3 + %1 检查呼吸道: %2, %3 + %1 Heeft de luchtwegen gecheckt: %2, %3 %1 inserted a %2 @@ -199,6 +211,7 @@ %1 intubou com %2 %1 satte inn en %2. %1 lisäsi a %2 + %1 heeft een %2 ingebracht Occluded @@ -217,6 +230,7 @@ Ocluída Okkludert Tukkeutunut + Verstopt Obstruction @@ -235,6 +249,7 @@ Obstruída Obstruksjon Tukkeuma + Geblokkeerd Mitigated obstruction @@ -251,6 +266,7 @@ Reduserte obstruksjonen Vähentynyt tukos Уменьшенная обструкция + Blokkade tijdelijk verzacht Not obstructed @@ -269,6 +285,7 @@ Ikke blokkert Ei estetty Язык не запал + Niet geblokkeerd Not occluded @@ -287,6 +304,7 @@ Ikke okkludert Ei tukossa Рвота отсутствуют + Niet verstopt Obstruction is temporarily mitigated @@ -302,6 +320,8 @@ Obstruksjon er midlertidig redusert Tukos on väliaikaisesti lievennetty Препятствие временно устранено + 阻塞暂时减轻 + Blokkade is tijdelijk verzacht Airway is not obstructed @@ -312,7 +332,9 @@ Ilmatiet eivät ole tukossa Дыхательные пути не закупорены языком. Die Atemwege sind nicht blockiert. + 气道未被阻塞 Vias aéreas não obstruídas + Luchtweg is niet geblokkeerd Airway is not occluded @@ -323,7 +345,9 @@ Ilmatiet eivät ole likaisia Дыхательные пути не закупорены рвотой. Die Atemwege sind nicht verstopft. + 气道未闭塞 Vias aéreas não ocluídas + Luchtweg is niet verstopt Airway is obstructed, airway management needed @@ -334,7 +358,9 @@ Hengitystiet ovat tukossa, hengityshoitoa tarvitaan Atemwege sind blockiert, die Atemwege müssen freigelegt werden Дыхательные пути закупорены языком, требуется лечение дыхательных путей + 气道阻塞,需要气道管理 Vias aéreas obstruídas, gerenciamento de vias aéreas necessário + Luchtweg is geblokkeerd, luchtwegmanagement is vereist Airway is occluded, medical suction needed @@ -345,7 +371,9 @@ Hengitystiet ovat likaiset, tarvitaan lääkärin imu Дыхательные пути закупорены рвотой, требуется медицинское отсасывание Die Atemwege sind verstopft. Medizinische Absaugung benötigt. + 气道堵塞,需要吸痰 Vias aéreas ocluídas, sucção médica necessária + Luchtweg is verstopt, medische suctie is vereist Airway is clear @@ -364,6 +392,7 @@ Vias aéreas limpas Luftveiene er frie Tuuliputki on selkeä + Luchtweg is vrij Item could not be used, airways are not clear @@ -382,6 +411,7 @@ O item não pôde ser usado, vias aéreas bloqueadas Gjenstanden kunne ikke brukes, luftveiene er ikke frie Tuotetta ei voitu käyttää, hengitystiet eivät ole selkeät + Item kon niet gebruikt worden, luchtwegen zijn niet vrij Hyperextending Head @@ -400,6 +430,7 @@ Hiperextensão de cabeça Hyperforlengelse av hode Hyperojentuva pää + Hoofd overstrekken Hyperextended Head @@ -418,6 +449,7 @@ Cabeça hiperestendida Hode er overekstendert Hyperpidennetty pää + Hoofd is overstrekt Patient's head is already hyperextended @@ -428,7 +460,9 @@ Potilaan pää on jo yli ojentunut Kopf des Patienten ist bereits überstreckt Голова пациента уже наклонена. + 病人的头部已经过度伸展 A cabeça do paciente já está hiperestendida + Patiënts hoofd is al overstrekt Hyperextending head @@ -447,6 +481,7 @@ Estendendo Forlenger Hyperojentuva pää + Hoofd overstrekken Hyperextending head cancelled @@ -465,6 +500,7 @@ Hiperextensão cancelada Hyperforlengelse av hode er avbrutt Hyperojentuva pää peruttu + Hoofd overstrekking afgebroken Head hyperextended successfully @@ -475,7 +511,9 @@ Pään ylivenyttely onnistui Kopf erfolgreich überstreckt Гиперэкстензия головы завершена + 头部拉伸成功 Cabeça hiperestendida com sucesso + Hoofd succesvol overstrekt %1 hyperextended %2s head @@ -485,6 +523,7 @@ %2s cabeza %1 hiperextendida %1 a placé la tête de %2 en hyperextension %1 hiperestendeu a cabeça de %2 + %1 overstrekte %2s hoofd Head turn performed, airways are still not clear @@ -503,6 +542,7 @@ Cabeça virada, vias aéreas ainda não limpas vending av hode er utført, luftveiene er fortsatt ikke frie Pään käännös suoritettu, hengitystiet vielä epäselvät + Hoofddraaiing uitgevoerd, luchtwegen zij nog niet vrij Occlusion removed @@ -521,6 +561,7 @@ Oclusão removida Okklusjonen er fjernet Likaantuminen poistettu + Verstopping verwijderd Begin Head Turning @@ -533,6 +574,7 @@ Comenzar giro de cabeza Aloita potilaan pään kääntäminen Начать поворачивать голову + Begin hoofddraaiing Head turning cancelled @@ -545,6 +587,8 @@ Giro de cabeza cancelado pään kääntäminen peruttu Поворот головы отменен + 异物清除停止了 + Hoofddraaiing gestopt Head Turning Started @@ -555,7 +599,9 @@ pään kääntyminen alkoi Начался поворот головы Kopfdrehung begonnen + 开始清除异物 Rotação de cabeça iniciada + Hoofddraaiing gestart Stop head turning @@ -568,6 +614,8 @@ Parar giro de cabeza Lopeta potilaan pään kääntäminen Перестаньте поворачивать голову + 停止清除异物 + Stop de hoofddraaiing Medical suction not needed @@ -586,6 +634,7 @@ Sucção médica não necessária Ingen behov for medisinsk suging Lääketieteellistä imua ei vaadita + Medische suctie niet vereist Medical suction completed, Occlusion removed @@ -596,6 +645,7 @@ Succión médica completada. Oclusión quitada Aspiration médicale effectuée. Occlusion retirée Sucção médica completa. Oclusão removida. + Medische suctie voltooid, Verstopping verwijderd Checking Airway @@ -614,6 +664,7 @@ Verificando vias aéreas Sjekker luftveien Hengitysteiden tarkastus + Luchtweg controleren Placing @@ -632,6 +683,7 @@ Colocando Plasserer Sijoittaminen + Plaatsen King LT @@ -650,6 +702,7 @@ Tubo Laríngeo Larynkstube Kurkunpään putki + King LT The King LT is used to maintain the airway @@ -668,6 +721,7 @@ O Tubo Laríngeo evita obstruções e oclusões Larynkstube brukes for å redde luftveiene Kurkunpään letkua käytetään hengitysteiden ylläpitämiseen + De King LT wordt gebruikt om de luchtweg veilig te stellen Guedel Tube @@ -686,6 +740,7 @@ Cânula de Guedel Guedel Tube Guedel-letkua + Guedel-tube The Guedel Tube is used to maintain the airway @@ -704,6 +759,7 @@ A Cânula de Guedel evita obstruções Guedel Tube brukes for å redde luftveiene Guedel-letkua käytetään hengitysteiden ylläpitämiseen + De Guedel-tube wordt gebruikt om de luchtweg veilig te stellen ACCUVAC @@ -713,6 +769,7 @@ ACCUVAC ACCUVAC ACCUVAC + ACCUVAC ACCUVAC is a medical suction device for airway suction with battery drive for mobile use in emergency medicine. @@ -731,6 +788,7 @@ ACCUVAC é uma unidade de sucção portátil utilizada para tratar vias aéreas em caso de emergência médica. ACCUVAC er en medisinsk sugeenhet for suging av luftveier med batteridrift for mobil bruk innen akuttmedisin ACCUVAC on akkukäyttöinen lääketieteellinen imulaite hengitysteiden imemiseen mobiilikäyttöön hätätilanteissa + ACCUVAC is een mobiel apparaat voor medische suctie bij spoedeisende hulp Airway Suction @@ -739,8 +797,10 @@ Ilmateiden imu Всасывание из дыхательных путей Absaugung der Atemwege + 呼吸道抽吸 Aspiration des voies respiratoires Sucção de vias aéreas + Luchtweg suctie Manual Suction Pump @@ -751,6 +811,7 @@ Manuelle Absaugpumpe Pompe d'aspiration manuelle Bomba de Sucção Manual + Handmatige suctiepomp %1 did a medical suction using a %2 @@ -760,6 +821,7 @@ %1 ha hecho una succión médica usando un %2 %1 a effectué une aspiration médicale en utilisant un(e) %2 %1 executou uma sucção médica usando %2 + %1 voerde een medische suctie uit met een %2 Manual Suction Pump is a medical suction device for airway suction manually. This is an alternative to electrical devices. @@ -770,6 +832,7 @@ Die manuelle Absaugpumpe ist eine medizinisches Absauggerät für Atemwege.\nDie Alternative zu einem elektrisch betreibenen Gerät. La pompe d’aspiration manuelle est un dispositif d’aspiration médical pour l’aspiration manuelle des voies respiratoires. C’est une alternative aux appareils électriques. A Bomba de Sucção Manual é um dispositivo médico que possibilita a sucção manual das vias aéras, sendo uma alternativa aos dispositivos elétricos. + De handmatige suctiepomp is een apparaat om handmatig de luchtwegen af te zuigen. Dit is een alternatief voor electrische apparaten Airway Suction (Manual) @@ -780,6 +843,7 @@ Manuelle Absaugung der Atemwege Aspiration des voies respiratoires (Manuel) Sucção de vias aéreas (manual) + Handmatige luchtweg suctie Reusable Manual Suction Pump @@ -790,6 +854,7 @@ Wiederverwendbare manuelle Absaugpumpe Pompre d'aspiration manuelle réutilisable Bomba de Sucção Manual Reutilizável + Herbruikbare handmatige suctiepomp Regain the Manual Suction Pump after use @@ -800,6 +865,7 @@ Erhalte die Manuelle Absaugpumpe nach Benutzung zurück. Récupère la pompe d'asipiration manuelle après utilisation Recupere a Bomba de Sucção Manual após o uso + Krijg de handmatige suctiepomp terug na gebruik Vomit (Small) @@ -818,6 +884,7 @@ Vômito (Pouco) Oppkast (Litt) oksentaa (pieni) + Braaksel (klein) Success probability for head-turning @@ -836,6 +903,7 @@ Probabilidade de sucesso ao virar a cabeça sannsynligheten for sukksess ved vending av hode onnistumisen todennäköisyys pään kääntämisessä + Succeskans voor hoofddraaiing Higher, the better the probability of success @@ -854,6 +922,7 @@ Quanto maior, melhor a probabilidade de sucesso Jo høyere, desto bedre er sannsynligheten for suksess Mitä korkeampi, sitä suurempi on onnistumisen todennäköisyys + Groter betekent een hogere kans op succes Allow Larynxtubus @@ -872,6 +941,7 @@ Permitir Tubo Laríngeo Tillat larynxtubus salli kurkunpään putki + Sta King LT toe Training level required to use a Larynxtubus - KingLT @@ -890,6 +960,7 @@ Nível de treinamento necessário para usar um Tubo Laríngeo Nivået av opplæring som kreves for å bruke en Larynkstube Kurkunpään putken käyttämiseen vaadittava koulutustaso + Trainingsniveau benodigd om een King LT in te brengen Allow Guedeltubus @@ -908,6 +979,7 @@ Permitir Cânula de Guedel Tillat Guedeltubus salli Guedel-putken + Sta Guedel-tube toe Training level required to use a Guedeltubus @@ -926,6 +998,7 @@ Nível de treinamento necessário para usar uma Cânula de Guedel Nivået av opplæring som kreves for å bruke en Guedeltubus Guedel-putken käyttämiseen vaadittava koulutustaso + Trainingsniveau benodigd om een Guedel-tube in te brengen Allow ACCUVAC @@ -944,6 +1017,7 @@ Permitir ACCUVAC Tilatt ACCUVAC Salli ACCUVAC + Sta ACCUVAC toe Training level required to use an ACCUVAC @@ -962,6 +1036,7 @@ Nível de treinamento necessário para usar um ACCUVAC Opplæringsnivået som kreves for å bruke en ACCUVAC koulutustaso, joka vaaditaan ACCUVACin käyttämiseen + Trainingsniveau benodigd om een ACCUVAC te gebruiken Allow Manual Suction Pump @@ -972,6 +1047,7 @@ Manuelle Absaugpumpe zulassen Autoriser la pompe d'aspiration manuelle Permitir Bomba de Sucção Manual + Sta handmatige suctiepomp toe Training level required to use an Manual Suction Pump @@ -982,6 +1058,7 @@ Benötigter medizinischer Grad, um die Manuelle Absaugpumpe zu nutzen Niveau d'entrainement requis pour utiliser une pompe d'aspiration manuelle Nível de formação necessário para utilizar uma Bomba de Sucção Manual + Trainingsniveau benodigd om een handmatige suctiepomp te gebruiken Time to check Airway @@ -1000,6 +1077,7 @@ Tempo para verificar as vias aéreas Tid for å sjekke luftveiene Kuinka kauan hengitysteiden tarkistaminen kestää + Tijd voor de controle van de luchtwegen How long it will take to check Airway @@ -1018,6 +1096,7 @@ Quanto tempo levará para verificar as vias aéreas Hvor lang tid det vil ta å sjekke luftveiene Kuinka kauan hengitysteiden tarkistaminen kestää + Hoe lang het gaat duren om de luchtwegen te checken Time for overstretch the head @@ -1036,6 +1115,7 @@ Tempo para hiperestender a cabeça Tid for å overstrekke hode Kuinka kauan kestää potilaan pään ylivenytys + Tijd voor het overstrekken van het hoofd How long it will take to overstretch the head @@ -1054,6 +1134,7 @@ Quanto tempo demorará para hiperestender a cabeça Hvor lang tid det vil ta å overstrekke hodet Kuinka kauan kestää potilaan pään hypervenytys + Hoe lang het gaat duren om het hoofd te overstrekken Head Turning Interval @@ -1066,6 +1147,7 @@ Intervalo de giro de cabeza pään käännösväli Интервал поворота головы + Hoofddraaiing interval Time between head turning attempts @@ -1078,6 +1160,7 @@ Tiempo entre los giros de cabeza pään käännösyritysten välinen aika Время между попытками поворота головы + Tijd tussen hoofddraaiing pogingen %1 finished head turning (x%2) @@ -1090,6 +1173,7 @@ %1 acabó de girar la cabeza (x%2) %1 lopetti pään kääntämisen (x%2) %1 закончил поворот головы (x%2) + %1 heeft het hoofd gedraaid (x%2) Time for ACCUVAC @@ -1108,6 +1192,7 @@ Tempo para ACCUVAC Tid for ACCUVAC ACCUVACin aika + Behandelstijd van een ACCUVAC How long it will take to use ACCUVAC @@ -1126,6 +1211,7 @@ Quanto tempo demorará para usar ACCUVAC Hvor lang tid vil det ta å bruke ACCUVAC Kuinka kauan ACCUVACin käyttö kestää + Hoe lang het gaat duren om de ACCUVAC te gebruiken Time for Manual Suction Pump @@ -1136,6 +1222,7 @@ Время работы ручного всасывающего насоса Durée d'aspiration avec la pompe d'aspiration manuelle Tempo de uso da Bomba de Sucção Manual + Behandelstijd van een handmatige suctiepomp How long it will take to use Manual Suction Pump @@ -1146,6 +1233,7 @@ Benötigte Zeit zur Verwendung der Manuellen Absaugpumpe Temps nécessaire pour utiliser la pompe d'aspiration manuelle Quanto tempo leva o uso da Bomba de Sucção Manual + Hoe lang het gaat duren om een handmatige suctiepomp te gebruiken Time for Larynxtubus @@ -1164,6 +1252,7 @@ Tempo para Tubo Laríngeo Tid for Larynxtubus Kurkunpään putkiaika + Tijd voor het gebruik van een King LT How long it will take to use Larynxtubus @@ -1182,6 +1271,7 @@ Quanto tempo demorará para usar um Tubo Laríngeo Hvor lang tid vil det ta å bruke Larynxtubus Kuinka kauan kurkunpään putken asettaminen vie + Hoe lang het gaat duren voor het gebruik van een King LT Time for Geudeltubus @@ -1200,6 +1290,7 @@ Tempo para usar uma Cânula de Guedel Tid for Guedeltubus Guedel-putken aika + Intubatietijd voor Guedel-tube How long it will take to use Guedeltubus @@ -1218,6 +1309,7 @@ Quanto tempo demorará para usar uma Cânula de Guedel Hvor lang tid vil det ta å bruke Guedeltubus Kuinka kauan Guedel-putken asettaminen vie + Hoe lang het gaat duren om een Guedel-tube in te brengen Established in recovery position @@ -1235,6 +1327,7 @@ Plassert i stabilt sideleie Potilas asetetaan toipumisasentoon В боковом положении + In stabiele zijligging gelegd Establish recovery position @@ -1252,6 +1345,7 @@ Legg i stabilt sideleie Aseta potilas toipumisasentoon Перевести в боковое положение + Leg in de stabiele zijligging Establishing recovery position @@ -1269,6 +1363,7 @@ Legger i stabilt sideleie Potilaan asettaminen toipumisasentoon Перевод в боковое положение + In de stabiele zijligging leggen Recovery position established successfully @@ -1286,6 +1381,7 @@ Lagt i stabilt sideleie Potilas asetettiin toipumisasentoon onnistuneesti Приведение в боковое положение прошло успешно + Succesvol in de stabiele zijligging gelegd Recovery position cancelled @@ -1303,6 +1399,7 @@ Stabilt Sideleie avbrutt Lepoasento peruutettu Перевод в боковое положение отменен + Stabiele zijligging gestopt %1 established recovery position @@ -1320,6 +1417,7 @@ %1 la dem i stabilt sideleie %1 asetettu toipumisasentoon %1 перевел в боковое положение + %1 heeft in de stabiele zijligging gelegd %1 cancelled recovery position @@ -1331,6 +1429,7 @@ %1 hat die stabile Seitenlage aufgehoben %1 cancelada posición lateral de seguridad %1 cancelou a posição de recuperação + %1 stopte de stabiele zijligging Time for recovery position @@ -1348,6 +1447,7 @@ Tid for å legge i stabilt sideleie palautumisasennon aika Время перевода в боковое положение + Tijd voor de stabiele zijligging How long it will take to establish recovery position @@ -1365,6 +1465,7 @@ Hvor lang tid vil det ta å legge i stabilt sideleie Kuinka kauan kestää, että potilas asetetaan toipumisasentoon Сколько времени потребуется, чтобы перевести в боковое положение + Hoe lang het gaat duren om iemand in de stabiele zijligging te leggen Cancel recovery position @@ -1382,6 +1483,7 @@ Avbrutt stabilt sideleie Peruuta lepoasento Отмена бокового положения + Stop stabiele zijligging Cancelling recovery position @@ -1399,6 +1501,7 @@ Avbrytter stabilt sideleie Lepoasennon peruuttaminen Отмена бокового положения + Stabiele zijligging stoppen Time for cancelling recovery position @@ -1416,6 +1519,7 @@ Tid for å avbryte stabilt sideleie Aika peruuttaa lepoasento Время, необходимое для выхода из бокового положения + Tijd om een stabiele zijligging te stoppen How long it will take to manually cancel recovery position @@ -1427,6 +1531,7 @@ Сколько времени потребуется, чтобы отменить боковое положение Benötigte Zeit, um eine stabile Seitenlage rückganging zu machen. Quanto tempo leva para cancelar manualmente a posição de recuperação + Hoe lang het gaat duren om de stabiele zijligging te stoppen Recovery Position time to drain occlusion @@ -1438,6 +1543,7 @@ Время бокового положения для дренирования окклюзии Stabile Seitenlage: Benötigte Zeit zum Entgegenwirken einer Verstopfung Tempo para remover a oclusão durante a posição de recuperação + Stabiele zijligging: Benodigde tijd om zich te ontdoen van een verstopping Maximum time required for patient in recovery position to be drained of occlusion. @@ -1449,6 +1555,7 @@ Максимальное время, необходимое пациенту в боковом положении для устранения окклюзии. Beschreibt die maximal benötigte Dauer, bei welcher eine Stabile Seitenlage zur zur Freilegung der verstopften Atemwege führt. O tempo máximo necessário para o paciente em posição de recuperação ter sua oclusão removida. + Maximale tijd die nodig is om een patiënt in de stabiele zijligging te ontdoen van een verstopping. Recovery Position + Head Hyperextend Settings @@ -1460,6 +1567,7 @@ Параметры бокового положения + гиперэкстензия Einstellungen für Stabile Seitenlage und Kopfüberstreckung Configurações de posição de recuperação + hiperestensão + Stabiele zijliggings- en hoofd overstrekkings opties Suction devices Settings @@ -1470,6 +1578,7 @@ Opciones de dispositivos de Succión Paramètres des appareils d'aspiration Configurações de dispositivos de sucção + Suctie apparaten instellingen Airway items Settings @@ -1486,6 +1595,7 @@ Instillinger for luftveis gjennstander henkitorven laitteen asetukset Параметры объектов дыхательных путей + Instelling voor luchtwegmiddelen Remove King LT @@ -1500,6 +1610,7 @@ Remover Tubo Laríngeo Irrota kurkunpään putki Удалить гортанную трубку + Verwijder King LT Remove Guedel Tube @@ -1514,6 +1625,7 @@ Remover Cânula de Guedel Irrota guedel-putki Удалить трубку Геделя + Verwijder Guedel-tube Removing @@ -1528,6 +1640,7 @@ Removendo Poistaminen Удаление + Verwijderen Reusable Airway Items @@ -1542,6 +1655,7 @@ Objetos reutilizáveis de vias aéreas Uudelleenkäytettävät henkitorvilaitteet Многоразовые предметы, связанные с дыхательными путями + Herbruikbare luchtwegmiddelen Regain the KingLT or Guedel Tube when manually removing them @@ -1556,6 +1670,7 @@ Recupere o Tubo Laríngeo ou a Cânula de Guedel quando removidos manualmente Ota kurkunpää- tai guedelputki takaisin, kun poistat ne manuaalisesti Извлеките гортанную трубку или трубку Геделя, когда они удалены вручную + Krijg de King LT of de Guedel-tube terug wanneer deze handmatig verwijderd worden %1 removed KingLT @@ -1570,6 +1685,7 @@ %1 removeu o Tubo Laríngeo %1 kurkunpään putki poistettu %1 удалил гортанную трубку + %1 verwijdderde King LT %1 removed Guedel Tube @@ -1584,6 +1700,7 @@ %1 removeu a Cânula de Guedel %1 guedel-putki poistettu %1 удалил трубку Геделя + %1 verwijdderde Guedel-tube Auto Triage Airway @@ -1597,6 +1714,7 @@ Triagem automática das vias aéreas Luokittelee hengitystiet automaattisesti Автоматическая сортировка дыхательных путей + Auto triage van de luchtwegen Sets if checking airways can override current triage level @@ -1610,6 +1728,7 @@ Define se a checagem de vias aéreas pode sobrescrever o nível atual de triagem. Määrittää, voiko hengitysteiden tarkistaminen muuttaa nykyistä luokitusta Определяет, изменяет ли проверка дыхательных путей текущий уровень сортировки + Zet of het checken van de luchtwegen het huidige triage niveau overschrijft Block head turning @@ -1624,6 +1743,7 @@ Bloquear a rotação de cabeça Estä pään kääntyminen Блокировать вращение головы + Blokkeer het draaien van het hoofd Blocks head turning if patient has Guedel Tube inserted @@ -1638,6 +1758,7 @@ Bloqueia a rotação de cabeça em pacientes com Cânula de Guedel Estää pään pyörimisen, jos potilaalla on guedel-putki Блокирует вращение головы, если пациенту вставлена трубка Геделя + Blokkeert het draaien van het hoofd als de patiënt een Guedel-tube in heeft diff --git a/addons/breathing/XEH_PREP.hpp b/addons/breathing/XEH_PREP.hpp index a419a4ca1..9986f02b8 100644 --- a/addons/breathing/XEH_PREP.hpp +++ b/addons/breathing/XEH_PREP.hpp @@ -1,8 +1,6 @@ PREP(canUseBVM); PREP(checkBreathing); PREP(checkPulseOximeter); -PREP(getETCo2); -PREP(getRespiratoryRate); PREP(fullHealLocal); PREP(gui_updateBodyImage); PREP(gui_updateInjuryListPart); @@ -17,7 +15,6 @@ PREP(inflictAdvancedPneumothorax); PREP(init); PREP(inspectChest); PREP(listenLungs); -PREP(lowSpO2pp); PREP(refillOxygenTank); PREP(treatmentAdvanced_chestSeal); PREP(treatmentAdvanced_chestSealLocal); diff --git a/addons/breathing/XEH_postInit.sqf b/addons/breathing/XEH_postInit.sqf index d903a96ad..41d13854e 100644 --- a/addons/breathing/XEH_postInit.sqf +++ b/addons/breathing/XEH_postInit.sqf @@ -6,7 +6,6 @@ [QGVAR(hemopneumothoraxLocal), LINKFUNC(treatmentAdvanced_hemopneumothoraxLocal)] call CBA_fnc_addEventHandler; [QGVAR(tensionpneumothoraxLocal), LINKFUNC(treatmentAdvanced_tensionpneumothoraxLocal)] call CBA_fnc_addEventHandler; [QGVAR(cyanosisLocal), LINKFUNC(treatmentAdvanced_CyanosisLocal)] call CBA_fnc_addEventHandler; -[QGVAR(lowSpO2pp), LINKFUNC(lowSpO2pp)] call CBA_fnc_addEventHandler; [QGVAR(nasalCannulaLocal), LINKFUNC(treatmentAdvanced_nasalCannulaLocal)] call CBA_fnc_addEventHandler; [QGVAR(removeNasalCannulaLocal), LINKFUNC(treatmentAdvanced_removeNasalCannulaLocal)] call CBA_fnc_addEventHandler; diff --git a/addons/breathing/XEH_preInit.sqf b/addons/breathing/XEH_preInit.sqf index b14599365..9f9749a30 100644 --- a/addons/breathing/XEH_preInit.sqf +++ b/addons/breathing/XEH_preInit.sqf @@ -419,16 +419,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -//Enables White Flashing on Below 90% SPO2 -[ - QGVAR(enableSPO2Flashing), - "CHECKBOX", - [LLSTRING(SETTING_SPO2Flashing_display), LLSTRING(SETTING_SPO2Flashing_DESC)], - [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], - [true], - true -] call CBA_Settings_fnc_init; - //Enable stamina loss by low SPO2 [ QGVAR(staminaLossAtLowSPO2), @@ -439,16 +429,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -//low SPO2 Warning Level -[ - QGVAR(lowSPO2Level), - "SLIDER", - [LLSTRING(SETTING_lowSPO2Level_display), LLSTRING(SETTING_lowSPO2Level_DESC)], - [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], - [0, 100, 90, 1], - true -] call CBA_Settings_fnc_init; - // enable/disable etco2 and respiratory rate readouts [ QGVAR(Etco2_Enabled), @@ -543,7 +523,7 @@ PREP_RECOMPILE_END; true ] call CBA_settings_fnc_init; -// Sets whether medical facilites and/or vehicles provide direct oxygen and refill capability +// Sets whether medical facilites and/or vehicles provide direct oxygen and refill capability [ QGVAR(locationProvideOxygen), "LIST", diff --git a/addons/breathing/functions/fnc_checkBreathing.sqf b/addons/breathing/functions/fnc_checkBreathing.sqf index b4d5323e4..8cc5e4de0 100644 --- a/addons/breathing/functions/fnc_checkBreathing.sqf +++ b/addons/breathing/functions/fnc_checkBreathing.sqf @@ -19,7 +19,7 @@ params ["_medic", "_patient"]; -private _ph = _patient getVariable [QEGVAR(pharma,pH), 1500]; +private _ph = GET_PH(_patient); private _hr = GET_HEART_RATE(_patient); private _output = ""; private _output_log = ""; @@ -33,10 +33,10 @@ if (_patient getVariable [QGVAR(pneumothorax), 0] > 0) then { _breathing_log = LLSTRING(breathing_shallow); }; -if (_ph < 750) then { +if (_ph < 7.2) then { _breath = LLSTRING(breath_mild); - if (_ph < 250) then { + if (_ph < 6.9) then { _breath = LLSTRING(breath_stink); }; }; diff --git a/addons/breathing/functions/fnc_fullHealLocal.sqf b/addons/breathing/functions/fnc_fullHealLocal.sqf index d6d563167..9791dd752 100644 --- a/addons/breathing/functions/fnc_fullHealLocal.sqf +++ b/addons/breathing/functions/fnc_fullHealLocal.sqf @@ -25,7 +25,6 @@ _patient setVariable [QGVAR(tensionpneumothorax), false, true]; _patient setVariable [QGVAR(activeChestSeal), false, true]; _patient setVariable [QGVAR(deepPenetratingInjury), false, true]; _patient setVariable [QGVAR(etco2Monitor), [], true]; -_patient setVariable [QGVAR(etco2Level), 40, true]; _patient setVariable [QGVAR(breathRate), 15, true]; _patient setVariable [QGVAR(nasalCannula), false, true]; diff --git a/addons/breathing/functions/fnc_getETCo2.sqf b/addons/breathing/functions/fnc_getETCo2.sqf deleted file mode 100644 index 9660de356..000000000 --- a/addons/breathing/functions/fnc_getETCo2.sqf +++ /dev/null @@ -1,78 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: apo_tle - * Calculate patient's ETCo2 level based on status of their vitals. - * - * Arguments: - * 0: Patient - * - * Return Value: - * ETCo2 level and units : "40 mmHg" - * - * Example: - * [player] call kat_breathing_fnc_getETCo2; - * - * Public: No - */ - -params ["_patient"]; - -if !(alive _patient) exitWith {0}; - -private _pr = GET_HEART_RATE(_patient); -private _bloodVolume = GET_BLOOD_VOLUME(_patient); -private _lostBlood = 6.0 - _bloodVolume; -private _pH = _patient getVariable [QEGVAR(pharma,pH),1500]; -private _phDiff = 1500 - _pH; - -private _ptxTarget = _patient getVariable [QGVAR(pneumothorax), 0]; // more deteriorated closer to 4, at 4 likely to become advanced -private _hasHtx = _patient getVariable [QGVAR(hemopneumothorax), false]; -private _hasTptx = _patient getVariable [QGVAR(tensopneumothorax), false]; - -private _airwayObstructed = _patient getVariable [QEGVAR(airway,obstruction), false] && !(_patient getVariable [QEGVAR(airway,overstretch), false]); -private _airwayOccluded = _patient getVariable [QEGVAR(airway,occluded), false]; - -private _phOffset = [0,(floor (_phDiff / 250))] select (missionNamespace getVariable [QEGVAR(pharma,kidneyAction),false]); // increase etco2 by 1 per 250 points of pH lost -private _randomOffset = selectRandom [-2,-1,0,1,2]; -private _newEtco2 = switch (true) do { - //cpr being performed and patient has no pulse - case ((_patient getVariable [QACEGVAR(medical,CPR_provider), objNull] isNotEqualTo objNull) && (_pr == 0)): { - private _newEtco2 = 11; - private _cardiacType = _patient getVariable [QEGVAR(circulation,cardiacArrestType), 0]; - private _offset = (_cardiacType); - private _bloodOffset = [((floor (_lostBlood / 0.8)) * 2),0] select (_lostBlood > 2); // reduce ETCo2 by 2mmhg for each 800ml of blood lost above 2L threshold (initial 2L incl.) - _newEtco2 = _newEtco2 + _offset - _bloodOffset; - _newEtco2 + _randomOffset; - }; - - //cardiac arrest without cpr being performed - case (IN_CRDC_ARRST(_patient)): {0}; - - //airways blocked - case (_airwayObstructed || _airwayOccluded): {50+_randomOffset+_phOffset}; - - //lost a lot of blood - case (_lostBlood >= 1): { - private _newEtco2 = 37; - _newEtco2 = _newEtco2 - ((floor (_lostBlood / 0.5)) * 4); - (14 max _newEtco2 min 99) + _randomOffset+_phOffset; //subtract 4mmhg of ETCo2 for each 500ml lost, clamped at minimum 14 - }; - - //tptx/hpx - case (_hasHtx || _hasTptx): {22+_randomOffset+_phOffset}; - - // base ptx. ETCo2 decreases as ptx deteriorates - case (_ptxTarget > 0): { - private _newEtco2 = 37 - (_ptxTarget * 3); - _newEtco2 + _randomOffset + _phOffset; - }; - - //no problems - default {40+_randomOffset+_phOffset}; -}; - -if (GVAR(Etco2_Units) == 0) then { - (str _newEtco2) + "mmHg"; -} else { - ((_newEtco2/7.501) toFixed 2)+ "kPa"; -}; \ No newline at end of file diff --git a/addons/breathing/functions/fnc_getRespiratoryRate.sqf b/addons/breathing/functions/fnc_getRespiratoryRate.sqf deleted file mode 100644 index 4e3b86a53..000000000 --- a/addons/breathing/functions/fnc_getRespiratoryRate.sqf +++ /dev/null @@ -1,62 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: apo_tle - * Calculate patient's Respiratory Rate based on status of their vitals. - * - * Arguments: - * 0: Patient - * - * Return Value: - * Respiratory Rate - * - * Example: - * [player] call kat_breathing_fnc_getRespiratoryRate; - * - * Public: No - */ - -params ["_patient"]; - -if !(alive _patient) exitWith {0}; - -private _bloodVolume = GET_BLOOD_VOLUME(_patient); -private _lostBlood = 6.0 - _bloodVolume; -private _pH = _patient getVariable [QEGVAR(pharma,pH),1500]; -private _phDiff = 1500 - _pH; - -private _ptxTarget = _patient getVariable [QGVAR(pneumothorax), 0]; // more deteriorated closer to 4, at 4 likely to become advanced -private _hasHtx = _patient getVariable [QGVAR(hemopneumothorax), false]; -private _hasTptx = _patient getVariable [QGVAR(tensopneumothorax), false]; - -private _airwayObstructed = _patient getVariable [QEGVAR(airway,obstruction), false] && !(_patient getVariable [QEGVAR(airway,overstretch), false]); -private _airwayOccluded = _patient getVariable [QEGVAR(airway,occluded), false]; - -private _phOffset = [0,((floor (_phDiff / 250)))] select (EGVAR(pharma,kidneyAction)); // increase RR by 1 per 250 points of pH lost -private _randomOffset = selectRandom [-1,0,1]; -private _respiratoryRate = 16 + _randomOffset + _phOffset; - -// calculate respiratoryrate for blood loss -if (_lostBlood >= 0.2) then { - _respiratoryRate = (_respiratoryRate + (floor (_lostBlood / 0.2))); // increase breath rate by 1 per 200ml lost -}; -// calculate respiratoryrate for ptxs -if (_ptxTarget > 0) then { - _respiratoryRate = [_respiratoryRate + 9, _respiratoryRate + (_ptxTarget * 2)] select (_hasHtx || _hasTptx); -}; - -switch (true) do { - //cpr being performed and patient has no pulse - case ((_patient getVariable [QACEGVAR(medical,CPR_provider), objNull] isNotEqualTo objNull) && (_pr == 0)): {10}; - - //bvm being used - case (_patient getVariable [QGVAR(BVMInUse), false]): {10}; - - //cardiac arrest - case (IN_CRDC_ARRST(_patient)): {0}; - - //airways blocked - case (_airwayObstructed || _airwayOccluded): {0}; - - //able to breathe - default {_respiratoryRate}; -}; \ No newline at end of file diff --git a/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf b/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf index 0be79479c..4b13dc4e6 100644 --- a/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf +++ b/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf @@ -46,12 +46,12 @@ if (GVAR(showCyanosis) && _selectionN in [0,2,3]) then { if (_target getVariable [QGVAR(pulseoximeter), false] && _selectionN in [2,3]) then { if((_target getVariable [QGVAR(PulseOximeter_Attached), [0,0]] select (_selectionN - 2)) > 0) then { - _entries pushback [LLSTRING(Pulseoximeter), [0.3, 0.8, 0.8, 1]]; + _entries pushBack [LLSTRING(Pulseoximeter), [0.3, 0.8, 0.8, 1]]; }; }; if (_target getVariable [QGVAR(nasalCannula), false] && _selectionN isEqualTo 0) then { - _entries pushback [LLSTRING(NasalCannula_Display), [0.3, 0.8, 0.8, 1]]; + _entries pushBack [LLSTRING(NasalCannula_Display), [0.3, 0.8, 0.8, 1]]; }; private _ptxEntry = []; @@ -70,7 +70,7 @@ if (_selectionN isEqualTo 1) then { if (GVAR(PneumothoraxAlwaysVisible)) then { if ((_target getVariable [QGVAR(pneumothorax), 0] > 0) && !(_tensionhemothorax)) then { - _ptxEntry pushback [LLSTRING(pneumothorax_mm), [1,1,1,1]]; + _ptxEntry pushBack [LLSTRING(pneumothorax_mm), [1,1,1,1]]; }; } else { if (_target getVariable [QGVAR(deepPenetratingInjury), false]) then { @@ -80,11 +80,11 @@ if (_selectionN isEqualTo 1) then { if (GVAR(TensionHemothoraxAlwaysVisible)) then { if (_target getVariable [QGVAR(hemopneumothorax), false]) then { - _ptxEntry pushback [LLSTRING(hemopneumothorax_mm), [1,1,1,1]]; + _ptxEntry pushBack [LLSTRING(hemopneumothorax_mm), [1,1,1,1]]; }; if (_target getVariable [QGVAR(tensionpneumothorax), false]) then { - _ptxEntry pushback [LLSTRING(tensionpneumothorax_mm), [1,1,1,1]]; + _ptxEntry pushBack [LLSTRING(tensionpneumothorax_mm), [1,1,1,1]]; }; }; }; diff --git a/addons/breathing/functions/fnc_handleBreathing.sqf b/addons/breathing/functions/fnc_handleBreathing.sqf index f739787ef..6c8beab49 100644 --- a/addons/breathing/functions/fnc_handleBreathing.sqf +++ b/addons/breathing/functions/fnc_handleBreathing.sqf @@ -33,10 +33,6 @@ if (!local _unit) then { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - if (!(_unit getVariable [QGVAR(lowSpO2ppActive), false]) && hasInterface && ACE_Player == _unit) then { - [QGVAR(lowSpO2pp), [_unit], _unit] call CBA_fnc_targetEvent; - }; - private _airway = true; private _breathing = true; diff --git a/addons/breathing/functions/fnc_handlePulmoHit.sqf b/addons/breathing/functions/fnc_handlePulmoHit.sqf index 6f8a6d8fa..0ef6580e2 100644 --- a/addons/breathing/functions/fnc_handlePulmoHit.sqf +++ b/addons/breathing/functions/fnc_handlePulmoHit.sqf @@ -23,7 +23,7 @@ params ["_unit", "_allDamages", "", "_ammo"]; _allDamages select 0 params ["_damage", "_bodyPart"]; -if (!(GVAR(enable)) || !(_bodyPart isEqualTo "Body") || !(_ammo isKindOF "BulletBase")) exitWith {}; +if (!(GVAR(enable)) || !(_bodyPart isEqualTo "Body") || !(_ammo isKindOf "BulletBase")) exitWith {}; //Other mods can utilise KAT_Pneumothorax_Exclusion variable to prevent Pneumothorax from happening if ((_damage < GVAR(pneumothoraxDamageThreshold)) || (_unit getVariable ["KAT_Pneumothorax_Exclusion", false])) exitWith {}; @@ -33,10 +33,9 @@ if (GVAR(pneumothoraxDamageThreshold_TakenDamage)) then { }; if (floor (random 100) < (GVAR(pneumothoraxChance) + _chanceIncrease)) then { - if (_unit getVariable [QGVAR(pneumothorax), 0] isEqualto 0 && !(_unit getVariable [QGVAR(tensionpneumothorax), false])) then { // Initial pneumothorax + if (_unit getVariable [QGVAR(pneumothorax), 0] isEqualTo 0 && !(_unit getVariable [QGVAR(tensionpneumothorax), false])) then { // Initial pneumothorax // add breathing sound [_unit, 0.2] call ACEFUNC(medical_status,adjustPainLevel); - [_unit] call FUNC(handleBreathing); _unit setVariable [QGVAR(pneumothorax), 1, true]; _unit setVariable [QGVAR(deepPenetratingInjury), true, true]; _unit setVariable [QGVAR(activeChestSeal), false, true]; diff --git a/addons/breathing/functions/fnc_lowSpO2pp.sqf b/addons/breathing/functions/fnc_lowSpO2pp.sqf deleted file mode 100644 index abb1cbbe9..000000000 --- a/addons/breathing/functions/fnc_lowSpO2pp.sqf +++ /dev/null @@ -1,63 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: Miss Heda, Digii - * Triggers the low SPO2 visual effect. - * - * Arguments: - * 0: Target - * - * - * Return Value: - * None - * - * Example: - * [player] call kat_breathing_fnc_lowSpO2pp; - * - * Public: No - */ - -params ["_target"]; - -_currentSpO2 = _target getVariable [QGVAR(airwayStatus), 100]; - -if (!(alive _target) || !([_target] call ACEFUNC(common,isAwake)) || _currentSpO2 > GVAR(lowSPO2Level)) exitWith {}; - -["ColorCorrections", 1500, [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]] spawn { - - params ["_name", "_priority", "_effect", "_handle"]; - while { - _handle = ppEffectCreate [_name, _priority]; - _handle < 0 - } do { - _priority = _priority + 1; - }; - _handle ppEffectEnable true; - _handle ppEffectAdjust _effect; - _handle ppEffectCommit 0.7; - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.9], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]; - _handle ppEffectCommit 0.7; - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectAdjust [1, 1, 0, [0, 0, 0, 0.1], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]; - _handle ppEffectCommit 1.6; - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectEnable false; - ppEffectDestroy _handle; - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; -}; diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf index 1b369b761..203156c3a 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf @@ -40,7 +40,7 @@ _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, tru }; private _HR = GET_HEART_RATE(_patient); - private _SpO2 = _patient getVariable [QGVAR(airwayStatus), 100]; + private _SpO2 = GET_SPO2(_patient); if (([_patient,_bodyPart] call ACEFUNC(medical_treatment,hasTourniquetAppliedTo))) then { _HR = 0; @@ -58,7 +58,7 @@ _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, tru [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _SpO2 = _patient getVariable [QGVAR(airwayStatus), 100]; + private _SpO2 = GET_SPO2(_patient); if (([_patient,_bodyPart] call ACEFUNC(medical_treatment,hasTourniquetAppliedTo))) then { _SpO2 = 0; diff --git a/addons/breathing/functions/fnc_useBVM.sqf b/addons/breathing/functions/fnc_useBVM.sqf index f1ad060bd..760bab4d3 100644 --- a/addons/breathing/functions/fnc_useBVM.sqf +++ b/addons/breathing/functions/fnc_useBVM.sqf @@ -182,7 +182,7 @@ GVAR(BVM_timeOut) = true; _patient setVariable [QGVAR(oxygenTankConnected), false, true]; }; - playsound3D [QPATHTOF_SOUND(audio\squeeze_BVM.ogg), _patient, false, getPosASL _patient, 8, 1, 15]; + playSound3D [QPATHTOF_SOUND(audio\squeeze_BVM.ogg), _patient, false, getPosASL _patient, 8, 1, 15]; [{ // Squeeze BVM every 5 seconds params ["_patient"]; diff --git a/addons/breathing/licence.txt b/addons/breathing/licence.txt index e4d6b39be..4dd142f90 100644 --- a/addons/breathing/licence.txt +++ b/addons/breathing/licence.txt @@ -1,4 +1,4 @@ -This addon is made by Katalam. +This addon is made by Katalam. This file must not be removed from the folder and must be contained in every work based on this addon or parts of it. diff --git a/addons/breathing/stringtable.xml b/addons/breathing/stringtable.xml index 7aac36702..4140e53be 100644 --- a/addons/breathing/stringtable.xml +++ b/addons/breathing/stringtable.xml @@ -9,6 +9,7 @@ Активировать дыхательный модуль Activer le module de respiration Ativar o Módulo de Respiração + Activeer ademhalingsmodule Sets if SPO2 simulation and according functionality like Pneumothorax and \nAirway: occlusion & obstruction (SPO2 reduction will be deactivated) should be activated @@ -18,6 +19,7 @@ Устанавливает, следует ли активировать имитацию SPO2 и соответствующие функции, такие как пневмоторакс и \дыхательные пути: окклюзия и обструкция (уменьшение SPO2 будет отключено) Définit si la simulation SpO2 et les fonctionnalités correspondantes telles que les pneumothorax et \nvoies respiratoires : occlusion & obstruction (la réduction de la SPO2 sera désactivée) doivent être activées Define se a simulação de SpO2 e suas funcionalidades como Pneumotórax e \nOclusão/Obstrução de Vias Aéreas (redução de SpO2 será desabilitada) deve ser habilitada. + Activeert SpO2 simulatie omtrend pneumothorax en luchtwegen: verstopping en obstructie (SpO2 reductie wordt gedeactiveerd) Lethal SpO2 value @@ -35,6 +37,7 @@ SpO2の致命値 Valor letal de SpO2 Tappava SpO2-arvo + Dodelijke SpO2 waarde Activate lethal SpO2 value @@ -52,6 +55,7 @@ SpO2の致命値を有効化 Ativar o valor letal de SpO2 Aktivoi tappava SpO2-arvo + Activeer dodelijke SpO2 waarde Cardiac arrest SpO2 value @@ -60,6 +64,7 @@ SpO2の心停止値 Valeur d'arrêt cardiaque de la SpO2 Valor de SpO2 para parada cardíaca + Hartstilstand SpO2 waarde Activate cardiac arrest SpO2 value @@ -68,6 +73,7 @@ SpO2の心停止値を有効化 Activer la valeur d'arrêt cardique de la SpO2 Ativar parada cardíaca por valor de SpO2 + Activeer hartstilstand SpO2 waarde SpO2 positive multiplier @@ -83,6 +89,7 @@ Multiplicador positivo de SpO2 Multiplicador positivo de SpO2 SpO2-positiivinen kerroin + SpO2 positieve vermenigvuldiger SpO2 negative multiplier @@ -98,6 +105,7 @@ Multiplicador negativo de SpO2 Multiplicador negativo de SpO2 SpO2 negatiivinen kerroin + SpO2 negatieve vermenigvuldiger Enable cardiac arrest SpO2 reduction @@ -113,6 +121,7 @@ Habilitar la reducción de SpO2 en paro cardiaco Habilitar a redução de SpO2 na parada cardíaca Ota käyttöön sydämenpysähdyksen SpO2-vähennys + Activeer SpO2 verlies tijdens hartstilstand Perfusion multiplier @@ -127,6 +136,7 @@ Multiplicador de perfusão Perfuusiokerroin Инфузионный множитель + Perfusie vermenigvuldiger Probability for a pneumothorax @@ -144,6 +154,7 @@ 気胸の確率 Probabilidade de um pneumotórax Hemopneumotoraksin mahdollisuus + Kans op een pneumothorax Enable ETCo2 Monitoring @@ -152,6 +163,7 @@ Включить мониторинг ETCo2 Habilitar monitoramento de ETCo2 Permitir monitoreo de ETCo2 + Activeer ETCo2 monitor Sets if medics can view a patient's ETCo2 and Respiratory Rate in the Vitals Monitor when a device capable of monitoring ETCo2 is connected @@ -160,6 +172,7 @@ Определяет, могут ли медики видеть ETCo2 пациента и частоту дыхания на мониторе жизненно важных показателей, когда подключено устройство, способное контролировать ETCo2 Define se um médico pode ver o ETCo2 e a Frequência Respiratória no Monitor de Sinais Vitais quando um dispositivo capaz de monitorar ETCo2 estiver conectado Establece si los médicos puede ver el ETCo2 y la Frecuencia Respiratoria de una paciente en el monitor de Signos Vitales cuando se conecta un dispositivo capaz de monitorear ETCo2 + Activeert het zien van ETCo2 en ademhalingstempo op de vitale waarden monitor wanneer een apparaat die ETCo2 kan monitoren is aangesloten Desired units for ETCo2 Monitoring @@ -168,6 +181,7 @@ Необходимые устройства для мониторинга ETCo2 Unidades desejadas para monitoramento de ETCo2 Unidades deseadas para el monitoreo de ETCo2 + Geprefereerde eenheden voor ETCo2 monitoren Allow Nasal Cannula @@ -176,6 +190,7 @@ Разрешить использование Назальной Канюли Permitir Cânula Nasal Permitir cánula nasal + Sta nasale canule toe Training level required to insert a Nasal Cannula @@ -184,6 +199,7 @@ Уровень подготовки, необходимый для установки Назальной Канюли Nível de treinamento necessário para inserir uma Cânula Nasal Nivel de formación requerido para insertar una cánula nasal + Trainingsniveau benodigd voor het inbrengen van een nasale canule Time for Nasal Cannula @@ -192,6 +208,7 @@ Время для введения Назальной Канюли Tempo para Cânula Nasal Tiempo de la cánula nasal + Tijd voor het inbrengen van een nasale canule How long it will take to insert a Nasal Cannula @@ -200,6 +217,7 @@ Сколько времени потребуется, чтобы вставить Назальную Канюлю Quanto tempo levará para inserir uma Cânula Nasal Tiempo necesario para insertar una cánula nasal + Hoelang het gaat duren om een nasale canule in te brengen Attach Pulse Oximeter @@ -217,6 +235,7 @@ パルスオキシメーターを取り付ける Colocar Oxímetro de Pulso Kiinnitä pulssioksimetri + Plaats pulsoximeter Remove Pulse Oximeter @@ -234,6 +253,7 @@ パルスオキシメーターを取り外します Remover Oxímetro de Pulso Irrota pulssioksimetri + Verwijder pulsoximeter Pulse Oximeter @@ -251,10 +271,14 @@ パルスオキシメーター Oxímetro de Pulso Pulssioksimetri + Pulsoximeter Used to read pulse rate and SpO2 脈拍数とSpO2を読み取るのに使用 + Wordt gebruikt om polsslag en SpO2 te meten + Utilisé pour vérifier le rythme cardiaque et la SpO2 + Utilizado para analizar el pulso sanguíneo y el SpO2 Placing @@ -272,6 +296,7 @@ 装着中 Colocando Sijoittaminen + plaatsen Removing @@ -289,6 +314,7 @@ 取り外し中 Removendo Poistaminen + verwijderen Pulse Oximeter: PR: %1 SpO2: %2 @@ -304,6 +330,7 @@ Oximetro de Pulso: RC: %1 SpO2: %2 Pulssioksimetri PR:%1 SpO2: %2 Пульсоксиметр: PR: %1 SpO2: %2 + Pulsoximeter: PR: %1 SpO2:%2 %1 connected Pulseoximeter @@ -321,6 +348,7 @@ %1 がパルスオキシメーターを装着した %1 conectou um Oxímetro de Pulso %1 kytketty pulssioksimetri + %1 plaatste pulsoximeter 1x Pneumothorax @@ -338,6 +366,7 @@ 1x 気胸 1x Pneumotórax 1x Pneumotoraksi + 1x Pneumothorax Treating @@ -355,6 +384,7 @@ 治療中 Tratando Hoito + Behandelen Chest Seal @@ -372,6 +402,7 @@ チェストシール Selo de Tórax Rintatiiviste + Chest seal Chest Seal is engineered to treat, seal, and reseal open chest wounds under most circumstances. @@ -389,6 +420,7 @@ チェストシールはほとんどの状況下で、胸部への穿通創の閉塞と開放による治療ができるように設計されています。 O Selo de Tórax é projetado para tratar, selar e resselar feridas abertas no peito na maioria das circunstâncias. Rintatiiviste on suunniteltu käsittelemään, tiivistämään ja uudelleensulkemaan avoimia rintahaavoja useimmissa olosuhteissa + De chest seal is ontwikkeld om open borstwonden te dichten onder de meeste omstandigheden Allow Pulseoximeter @@ -406,6 +438,7 @@ パルスオキシメーターの許可 Permitir Oxímetro de Pulso Salli pulssioksimetri + Sta pulsoximeter toe Training level required to use a Pulseoximeter @@ -423,6 +456,7 @@ パルスオキシメーターの使用に必要な医療スキルのレベルを設定します。 Nível de treinamento necessário para usar um Oxímetro de Pulso Pulssioksimetrin käyttämiseen vaadittava koulutustaso + Trainingsniveau benodigd voor het plaatsen van een pulsoximeter Allow Chest Seal @@ -440,6 +474,7 @@ チェストシールの許可 Permitir Selo de Tórax Salli rintatiiviste + Sta chest seal toe Training level required to use a Chest Seal @@ -457,6 +492,7 @@ チェストシールの使用に必要な医療スキルのレベルを設定します。 Nível de treinamento necessário para usar um Selo de Tórax Rintatiivisteen käyttämiseen vaadittava koulutustaso + Trainingsniveau benodigd om een chest seal te gebruiken Allow Chest Seal self treatment @@ -472,6 +508,7 @@ Permitir autotratarse con un sello torácico Permitir auto-tratamento com Selo de Tórax Salli rintatiivisteen käyttö itsellesi + Sta chest seal zelfbehandeling toe Clear Chest Seal after treatment @@ -483,6 +520,7 @@ Retirar sello toracico tras tratamiento Poista rintatiiviste hoidon jälkeen Устранить уплотнение в грудной клетке после лечения + Verwijder chest seal na behandeling Stable SpO2 value to gain consciousness @@ -500,6 +538,7 @@ 意識を取り戻すために必要なSpO2値 Valor estável de SpO2 para recuperar consciência SpO2-taso, joka vaaditaan tajunnan palauttamiseksi + Stabiele SpO2 waarde om bewustzijn te verkrijgen After reaching more than selected value (default 85), only then patient can get conscious @@ -517,6 +556,7 @@ 設定した値(デフォルトは85)を超えた後、患者は意識を取り戻すことができます Depois de atingir mais do que o valor selecionado (por padrão 85), somente então o paciente pode ficar consciente Vasta sitten, kun valittu arvo (oletusarvo 85) on saavutettu, potilas voi herätä + Alleen na het bereiken van meer dan deze waarde (standaard 85) kan een patiënt zijn bewustzijn terug krijgen Drain Fluid @@ -534,6 +574,7 @@ 胸腔ドレナージ Drenar fluido Tyhjennä neste + Vloeistof afvoeren 1x Hemopneumothorax @@ -551,6 +592,7 @@ 1x 血気胸 1x Hemotórax 1x hemopneumotoraksi + 1x Hemopneumothorax Needle Decompression @@ -568,6 +610,7 @@ 胸腔穿刺減圧 Descompressão com Agulha Neulan dekompressio + Naalddecompressie Needle Decompression (NCD Kit) @@ -582,6 +625,7 @@ Descompressão com Agulha (Kit NCD) Neulan dekompressio (NCD Kit) Декомпрессионная игла (NCD Набор) + Naalddecompressie kit (ND kit) 1x Tension Pneumothorax @@ -599,6 +643,7 @@ 1x 緊張性気胸 1x Pneumotórax Hipertensivo 1x jännitysilmarinta + 1x Spanningspneumothorax AAT Kit @@ -616,6 +661,7 @@ AAT キット Kit AAT AAT-laite + AAT kit The Advanced Airway Treatment Kit is a single use kit designed to treat advanced airway conditions, like hemopneumothorax @@ -633,6 +679,7 @@ AAT キット (Advanced Airway Treatment, 高度気道治療)は、血気胸などの重度な呼吸器症状を治療するために設計された使い捨てキットです。 O AAT é um kit de uso único projetado para tratar problemas avançados de vias aéreas, como o hemotórax. AAT-laite on kertakäyttöinen työkalu, joka on suunniteltu tappavien hengitystiesairauksien, kuten hemopneumotoraksin, hoitoon + de AAT kit is een eenmalig gebruik kit ontwikkeld voor het behandelen van geadvanceerde luchtwegcondities NCD Kit @@ -647,6 +694,7 @@ Kit NCD NCD-laite NCD Набор + ND kit The Needle Chest Decompression Kit is a single use kit designed to treat a tensionpneumothorax. @@ -661,6 +709,7 @@ O NCD é um kit de único uso projetado para tratar o pneumotórax hipertensivo Neulan rintakehän dekompressiotyökalu on kertakäyttöinen työkalu, joka on suunniteltu hemopneumotoraksin hoitoon Игла для декомпрессии грудной клетки - это одноразовый набор, предназначенный для лечения пневмоторакса под напряжением + De naalddecompressie kit is een eenmaligsgebruik kit voor de behandeling van een spanningspneumothorax Hemopneumothorax Chance @@ -675,6 +724,7 @@ Probabilidade de hemotórax Hemopneumotoraksin mahdollisuus Вероятность получить гемоторакс + Hemopneumothorax kans Sets the chance for hemopneumothorax. Also sets the chance for tenstion pneumothorax (60% Hemo = 40% Tension) @@ -689,6 +739,7 @@ Define a chance de hemotórax. Também define a chance de pneumotórax hipertensivo (60% Hemo = 40% Hipertensivo) Asettaa hemopneumotoraksin mahdollisuuden. Asettaa myös jännittyneen pneumotoraksin mahdollisuuden. (60% hemo = 40% jännitystä) Определяет вероятность развития гемопневмоторакса. Также определяет вероятность развития напряженного пневмоторакса (60% Гемо = 40% напряжения) + Legt de kans op een hemopneumothorax vast. Legt ook de kans voor spanningspneumothorax vast. (60% Hemo = 40% spanning) Enable Advanced Pneumothoraxes @@ -703,12 +754,13 @@ Habilitar tipos avançados de pneumotórax Ota käyttöön edistyneet ilmarintakehät Включить расширенный пневмоторакс + Sta geadvanceerde pneumothoraxen toe Enables advanced pneumothoraxes - hemopneumothorax and tensionpneumothorax Habitilita neumotóraxes avanzados - hemotórax y neumotórax a tensión Włącza zaawansowane odmiany odmy opłucnowej - krwiaka opłucnej oraz odmę prężną - 血気胸および緊張性気胸を有効化します + 高度な気胸である血気胸および緊張性気胸の症状を有効にします Povolí pokročilé pneumotoraxy - hemopneumotorax a tenzní pneumotorax. Active les pneumothorax avancés - Hémopneumothorax et pneumothorax sous tension 고급 기흉을 활성화합니다. - 혈기흉 및 긴장성 기흉 @@ -717,6 +769,7 @@ Permite tipos avançados de pneumotórax - hemotórax e pneumotórax hipertensivo Mahdollistaa pitkälle edenneen pneumotoraksin - hemopneumotoraksin ja jännitysilmarinta Включает прогрессирующий пневмоторакс - гемопневмоторакс и напряженный пневмоторакс + Staat geadvanceerde pneumothoraxen - hemopneumothorax en spanningspneumothorax - toe Advanced Pneumothorax Chance @@ -731,6 +784,7 @@ Probabilidade de pneumotórax avançado Mahdollisuus pitkälle edenneelle ilmarintalle Вероятность получить прогрессирующий пневмоторакс + Kans op een geadvanceerde pneumothorax The percentage chance that determines whether a fully deteriorated pneumothorax will deteriorate into an advanced pneumothorax, this is rolled continuously as set in pneumothorax deterioration interval. @@ -741,6 +795,7 @@ Процентная вероятность, определяющая, перерастет ли пневмоторакс с полным ухудшением в запущенный пневмоторакс, непрерывно увеличивается в соответствии с заданным интервалом ухудшения состояния при пневмотораксе. Die Wahrscheinlichkeit in Prozent, welche bestimmt, ob sich ein vollständig verschlechterter Pneumothorax in einen fortgeschrittenen Pneumothorax entwickelt.\nDies wird fortlaufend, auf Basis des Pneumothorax Verschlechterungs Intervals, ermittelt. A porcentagem de chance que determina se um pneumotórax completamente deteriorado irá se deteriorar em um pneumotórax avançado, isso é calculado continuamente conforme o intervalo de deterioração de pneumotórax + De kans in procenten, dat bepaalt of een pneumothorax zich doorontwikkeld naar een geadvanceerde pneumothorax. Dit wordt doorlopend gerold op basis van de pneumothorax verslechterings interval Hemothorax / Tension Pnuemothorax Treament Minimum Level @@ -758,6 +813,7 @@ 血胸/緊張性気胸治療の許可 Nível mínimo exigido para tratar hemotórax/pneumotórax hipertensivo Hemopneumotoraksi / jännitysilmarinta hoidon vähimmäistaso + Hemopneumothorax / spanningspneumothorax minimum behandelingsniveau The minimum medical level required for someone to be able to perform the Needle Decompression and Drain Fluids treatment actions, used to treat Hemothorax or Tension Pneumothorax. @@ -775,6 +831,7 @@ 胸腔穿刺減圧および胸腔ドレナージの使用に必要な医療スキルのレベルを設定します。これらは血胸と緊張性気胸の治療に使われます。 O nível médico mínimo exigido para que alguém possa realizar as ações de tratamento de Descompressão de Agulha e Drenagem de Fluidos, usados ​​para tratar hemotórax ou pneumotórax hipertensivo. Vähimmäiskoulutustaso, joka vaaditaan, jotta joku pystyy suorittamaan neulan dekompression ja nesteenpoiston, jota käytetään hemothoraksin tai jännitysilmarintain hoitoon + Het minimaal benodigde trainingsniveau voor het uitvoeren van de naalddecompressie- en vloeistof afvoerende handelingen, benodigd om een hemo- en spanningspneumothorax te behandelen Pneumothorax Damage Threshold @@ -792,6 +849,7 @@ 負傷による気胸発生のしきい値 Dano mínimo para causar pneumotórax Vaurioiden taso, joka vaaditaan ilmarintakehän kehittymiseen + Pneumothorax schade drempelwaarde The amount of damage in a single impact, on a scale of 0 to 1, that needs to occur before there is a chance of pneumothorax. Lower values means that pneumothorax is more likely to occurr. Setting the value very low, or to zero, may cause unexpected behavior or pneumothorax from unexpected injuries. @@ -809,6 +867,7 @@ 一度の負傷で発生する気胸へのダメージ。値が低いほど気胸が発生する可能性が高くなります。\n値を非常に低く設定するか0に設定すると、予期しない動作や予期しない負傷による気胸を引き起こす可能性があります。 A quantidade de dano em um único impacto, em uma escala de 0 a 1, que precisa ocorrer antes que haja uma chance de pneumotórax. Valores mais baixos significam que o pneumotórax é mais provável de ocorrer. Definir o valor muito baixo ou zero pode causar um comportamento inesperado ou pneumotórax devido a lesões inesperadas. Yhden osuman vaurion määrä asteikolla 0-1, jonka täytyy tapahtua ennen kuin ilmarinta on mahdollista. Pienemmät arvot tarkoittavat, että ilmarinta on todennäköisempää. Arvon asettaminen erittäin alhaiseksi tai arvoon 0 voi aiheuttaa odottamatonta käyttäytymistä tai ilmarintaa epätavallisten vammojen vuoksi. + De hoeveelheid schade van een enkele impact, op een schaal van 0 tot 1, dat benodigd is voordat een pneumothorax gerold wordt. Lagere waarden kan leiden tot meer pneumothoraxen. Als deze instelling laag of zelfs op 0 staat, kan dit leiden tot raar gedrag of pneumothoraxen van onverwachte wonden Increase pneumothorax chance based on damage @@ -820,6 +879,7 @@ Aumentar probabilidad de neumotorax segun el daño Lisää pneumotoraksin mahdollisuutta vaurion perusteella Увеличивает вероятность пневмоторакса в зависимости от повреждения + Verhoogt pneumothorax kans op basis van schade Increase chance of a pneumothorax and advanced pneumothorax occurring based on damage taken if over the pneumothorax damage threshold @@ -831,6 +891,7 @@ Aumenta la probabilidad de que se produzca un neumotórax y un neumotórax avanzado en función del daño recibido si se supera el umbral de daño del neumotórax Lisää ilmarintakehän ja pitkälle edenneen ilmarinnan esiintymisen todennäköisyyttä tehdyn vaurion perusteella, jos vaurio on suurempi kuin ilmarintakehän kehittymiseen vaadittava vähimmäisvaurio. Увеличивает вероятность возникновения пневмоторакса и прогрессирующего пневмоторакса в зависимости от полученного повреждения, если оно превышает порог повреждения от пневмоторакса + Verhoogt de kans op een (geadvanceerde) pneumothorax wanneer de schade hoger is dan de drempelwaarde Deep Penetrating Injury Chance @@ -842,6 +903,7 @@ Probabilidad de lesión de penetración profunda Mahdollisuus syvään tunkeutuvaan vammaan Вероятность глубокого проникающего ранения + Kans op diep penetrerende wond. Chance for deep penetrating injury to appear when pneumothorax damage threshold is passed but no pneumothorax is inflicted @@ -853,6 +915,7 @@ Probabilidad de que aparezca una lesión de penetración profunda cuando se supera el umbral de daño del neumotórax pero no se ha infligido un neumotórax Mahdollisuus syvään tunkeutuvaan vammaan syntyy, kun ilmarintakehän vaurioituminen on minimaalista, mutta ilmarintaa ei ole kehittynyt. Вероятность получения глубокого проникающего ранения возникает, когда порог повреждения пневмотораксом превышен, но пневмоторакс не причинен + Kans voor het verschijnen van een diep penetrerende wond wanneer de drempelwaarde voor een pneumothorax overschreden wordt maar er geen pneumothorax gerold wordt. Deep Penetrating Injury @@ -864,6 +927,7 @@ Lesión de penetración profunda Syvä tunkeutuva vamma Глубокое проникающее ранение + Diep penetrerende wond Chest Seal Applied @@ -875,6 +939,7 @@ Sello toracico aplicado Rintatiiviste on kiinnitetty Наложен оклюзивный пластырь на грудную клетку + Chest seal aangebracht Hemopneumothorax internal bleeding amount @@ -889,6 +954,7 @@ Míra vnitřního krvácení při hemotoraxu Hemopneumotoraksista tulevan sisäisen verenvuodon määrä Объем внутреннего кровотечения при гемопневмотораксе + Hemopneumothorax interne bloedingshoeveelheid Sets amount of internal bleeding that is applied while suffering from hemopneumothorax @@ -903,6 +969,7 @@ Nastavuje míru vnitřního krvácení v případě hemotoraxu Määrittää hemopneumotoraksista johtuvan sisäisen verenvuodon määrän Регулирует количество внутреннего кровотечения, возникающего при гемопневмотораксе у человека + Defineert de hoeveelheid bloedverlies dat wordt verloren wanneer een patiënt een hemopneumothorax heeft Pneumothorax always visible @@ -914,6 +981,7 @@ Neumotórax siempre visible Pneumothorax on aina näkyvissä Пневмоторакс всегда виден + Pneumothorax altijd zichtbaar Sets if pneumothorax should always be visible in the medical menu as an injury instead of requiring diagnosis (1x pneumothorax) @@ -925,6 +993,7 @@ Establece si el neumotórax siempre debe ser visible en el menú médico como una lesión en lugar de requerir un diagnóstico (1x neumotórax) Määrittää, näkyykö ilmarinta aina lääkärille vammana diagnoosin vaatimisen sijaan (1x ilmarinta) Устанавливает, должен ли пневмоторакс всегда отображаться в медицинском меню как травма, а не требовать постановки диагноза (1x пневмоторакс) + Defineert of een pneumothorax altijd zichbaar is in het medische menu als een wond, zonder dat deze een diagnose vereist (1x pneumothorax) Tension pneumothorax and hemothorax always visible @@ -936,6 +1005,7 @@ Neumotórax a tensión y hemotórax siempre visibles Jännitysilmarinta ja hemothorax ovat aina näkyvissä Напряженный пневмоторакс и гемоторакс всегда видны + Spannings- en hemopneumothorax altijd zichtbaar Sets if tension pneumothorax and hemopneumothorax should always be visible in the medical menu as an injury instead of requiring diagnosis (1x tensionpneumothorax/1x hemopneumothorax) @@ -947,6 +1017,7 @@ Establece si el neumotórax a tensión y el hemoneumotórax siempre deben ser visibles en el menú médico como una lesión en lugar de requerir un diagnóstico (1x neumotórax a tensión / 1x hemoneumotórax) Määrittää, pitäisikö jännityspneumotoraksin ja hemopneumotoraksin aina näkyä lääkärille vammana diagnoosin vaatimisen sijaan (1x jännitysilmarinta tai hemopneumotoraksi) Устанавливает, должны ли напряженный пневмоторакс и гемопневмоторакс всегда отображаться в медицинском меню как травма, а не требовать постановки диагноза (1x напряженный пневмоторакс/1x гемопневмоторакс). + Defineert of spannings- en hemopneumothoraxen altijd zichtbaar zijn in het medische menu als een wond, zonder dat deze een diagnose vereist (1x spanningspneumothorax / 1x hemopneumothorax) Stethoscope @@ -964,6 +1035,7 @@ 聴診器 Estetoscópio Stetoskooppi + Stethoscoop Allows you to auscultate lung sounds @@ -981,6 +1053,7 @@ 呼吸音を聴診することができます Permite auscultar sons pulmonares Voit kuunnella keuhkojen ääniä + Zorgt ervoor dat je de longen kan beluisteren Auscultate Lung Sounds @@ -998,6 +1071,7 @@ 呼吸音を聴診 Auscultar sons pulmonares Kuuntele keuhkojen ääniä + Beluister de longen Listening @@ -1015,6 +1089,7 @@ 聴診中 Escutando Kuunteleminen + Luisteren Stethoscope Sound Volume @@ -1031,6 +1106,7 @@ Громкость звука стетоскопа 聴診器の音量 Volume do som do estetoscópio + Stethoscoops geluid volume Determines how loud the breathing sounds are when using the stethoscope @@ -1048,6 +1124,7 @@ 聴診器を使用した際の呼吸音の音の大きさを設定します Determina quão altos são os sons respiratórios ao usar o estetoscópio Stetoskoopin äänenvoimakkuus + Bepaald hoe luid de longgeluiden zijn tijdens het luisteren met een stethoscoop Stethoscope Listening Time @@ -1062,6 +1139,7 @@ Tempo de escuta do estetoscópio Stetoskoopin kuunteluaika Время прослушивания стетоскопом + Stethoscoop luister tijd Sets how long the stethoscope listening period is @@ -1076,6 +1154,7 @@ Define a duração do período de escuta do estetoscópio Asettaa kuinka pitkä stetoskoopin kuuntelujakso on Устанавливает продолжительность прослушивания стетоскопом + Bepaald hoelang de stethoscoop luister periode is Unconscious SpO2 value @@ -1093,6 +1172,7 @@ Бессознательное значение SpO2 Valor de SpO2 para inconsciência SpO2-arvo, joka tekee potilaan tajuttomaksi + SpO2 drempelwaarde voor verlies van bewustzijn SpO2 value that will cause unconscious when dropped below that value @@ -1110,6 +1190,7 @@ Значение SpO2, которое приведет к потере сознания при падении ниже этого значения Valores de SpO2 abaixo deste resultam em perda de consciência SpO2-arvo, joka saavuttaessaan aiheuttaa tajuttomuuden + De SpO2 waarde waaronder je het bewustzijn verliest Show pneumothorax duplicate @@ -1126,6 +1207,7 @@ Mostrar pneumotórax duplicado Näytä päällekkäiset ilmarintavammat Показать дубликат пневмоторакса + pneumothorax duplicaat tonen Default is disabled. If enabled, units with tension pneumothorax or hemopneumothorax will also have pneumothorax injury displayed in medical menu. @@ -1142,6 +1224,7 @@ O padrão é desabilitado. Se ativado, as unidades com pneumotórax hipertensivo ou hemotórax também exibirão lesões por pneumotórax no menu médico. Oletuksena poissa käytöstä. Jos tämä on käytössä, potilaiden, joilla on jännittynyt pneumotoraksi tai hemopneumotoraksi, myös ilmarintavammat näkyvät lääkärinnäytössä. По умолчанию отключено. Если включено, у пациентов с напряженным пневмотораксом или гемопневмотораксом травма от пневмоторакса также будет отображаться в медицинском меню. + Standaard staat deze optie uit. Wanneer dit aanstaat zal een spanningspneumothorax of een hemopneumothorax ook een pneumothorax tonen in het medische menu. Slight Cyanosis @@ -1158,6 +1241,7 @@ Cianosis ligera Cianose Leve Lievä syanoosi + Lichte cyanose Mild Cyanosis @@ -1174,6 +1258,7 @@ Cianosis moderada Cianose Moderada Keskivaikea syanoosi + Milde cyanose Severe Cyanosis @@ -1190,6 +1275,7 @@ Cianosis severa Cianose Grave Vaikea syanoosi + Zware cyanose Show cyanosis @@ -1201,6 +1287,7 @@ Mostrar cianosis Näytä syanoosi Показать цианоз + Toon cyanose Shows cyanosis of patient in overview tab @@ -1212,6 +1299,7 @@ Muestra cianosis del paciente en la pestaña de vista general Näyttää potilaan syanoosin lääketieteellisen yleiskuvan näytössä Показывает цианоз пациента на вкладке обзор + Toont de cyanose van de patiënt op de overzichtspagina Slight cyanosis SpO2 value @@ -1228,6 +1316,7 @@ Valor SpO2 de Cianosis ligera Valor de SpO2 para cianose leve SpO2-arvo, joka laukaisee lievän syanoosin + Lichte cyanose waarde Slight cyanosis value - default 90 SpO2 @@ -1244,6 +1333,7 @@ Valor SpO2 de Cianosis ligera - Predeterminado en 90 SpO2 Valor de SpO2 para cianose leve (padrão 90) SpO2-oletusarvo, joka laukaisee lievän syanoosin, on 90 + Lichte cyanose waarde - standaard 90 SpO2 Mild cyanosis SpO2 value @@ -1260,6 +1350,7 @@ Valor SpO2 de Cianosis moderada Valor de SpO2 para cianose moderada Keskivaikean syanoosin laukaiseva SpO2-arvo + Milde cyanose waarde Mild cyanosis value - default 75 SpO2 @@ -1276,6 +1367,7 @@ Valor SpO2 de Cianosis intermedia - Predeterminado en 75 SpO2 Valor de SpO2 para cianose moderada (padrão 75) Keskivaikean syanoosin laukaiseva SpO2-oletusarvo on 75 + Milde cyanose waarde - standaard 75 SpO2 Severe cyanosis SpO2 value @@ -1292,6 +1384,7 @@ Valor SpO2 de Cianosis severa Valor de SpO2 para cianose grave SpO2-arvo, joka laukaisee vakavan syanoosin + Zware cyanose waarde Severe cyanosis value - default 66 SpO2 \nShould be little bit higher than lethal SpO2 value @@ -1308,6 +1401,7 @@ Valor SpO2 de Cianosis severa - Predeterminado en 66 SpO2 \nEste valor deberia de ser un poco mas alto que el valor letal de SpO2 Valor de SpO2 para cianose grave (padrão 66)\nDeve estar um pouco acima do valor letal de SpO2 Vakavan syanoosin laukaiseva SpO2-oletusarvo on 66. Tämän arvon pitäisi olla hieman korkeampi kuin tappava SpO2-arvo. + Zware cyanose waarde - standaard 66 SpO2\nZou een klein beetje boven de dodelijke SpO2 waarde moeten zitten Pneumothorax deterioration chance @@ -1323,6 +1417,7 @@ Probabilidade de deterioração do pneumotórax Pneumotoraksin huononemisen mahdollisuus Вероятность ухудшения состояния при пневмотораксе + Pneumothorax verslechteringskans Chance for pneumothorax to deteriorate @@ -1334,6 +1429,7 @@ Probabilidad de que el neumotórax empeore Pneumotoraksin mahdollisuus pahentua Вероятность обострения пневмоторакса + Kans voor een pneumothorax om te verslechteren Deteriorating pneumothorax interval @@ -1345,6 +1441,7 @@ Intervalo de deterioro del neumotórax Aika pneumotoraksin pahenemismahdollisuuksien välillä Интервал ухудшения состояния при пневмотораксе + Pneumothorax verslechteringsinterval After each interval a chance will be rolled whether or not the pneumothorax will deteriorate @@ -1356,22 +1453,25 @@ Después de cada intervalo, se lanzará una probabilidad para determinar si el neumotórax empeorará Jokaisen ajanjakson jälkeen lasketaan mahdollisuus, paheneeko ilmarinta vai ei После каждого интервала будет проверяться, ухудшится пневмоторакс или нет + Na elke interval wordt een nieuwe kansrol uitgevoerd die bepaald of de pneumothorax verslechterd Enable Pneumothorax Arrest Включить остановку сердца Habilitar Parada por Pneumothorax - 気胸による心停止を有効にする + 気胸による心停止を有効化 Activer l'arrêt dû au pneumothorax Habilitar Parada por Pneumotórax + Sta pneumothorax hartstilstand toe Enables a chance for cardiac arrest following pneumothorax Увеличивает вероятность остановки сердца после Пневмоторакса Habilitar la probabilidad para parada cardíaca tras un pneumothorax - 気胸発生に付随して心停止となる可能性を有効化します + 気胸発生に付随して心停止となる可能性を有効にします Active la chance qu'un arrêt cardiaque se produise en cas de pneumothorax Habilita uma chance de parada cardíaca após o pneumotórax + Staat de kans op een hartstilstand na een pneumothorax toe Deteriorating pneumothorax arrest interval @@ -1380,6 +1480,7 @@ 気胸による心停止への悪化の間隔 Intervalle de détérioration du pneumothorax en arrêt Intervalo de parada por pneumotórax deteriorado + Pneumothorax verslechterings hartstilstand interval After each interval a chance will be rolled whether or not a pneumothorax will result in cardiac arrest @@ -1388,6 +1489,7 @@ 各間隔の後に気胸が心停止につながるかどうかがロールされます Après chaque intervalle de temps, un pourcentage de chance sera lancé pour savoir si oui ou non le pneumothorax va résulter en un arrêt cardiaque Após cada intervalo, será calculado se o pneumotórax vai resultar em uma parada cardíaca + na elke interval wordt er een kansrol uitgevoerd die bepaald of een pneumothorax leidt tot een hartstilstand Breathing items Settings @@ -1402,6 +1504,7 @@ Configurações de itens de respiração Hengityselinten hoitolaitteiden asetukset Настройки дыхательных элементов + Ademhalingsitem instellingen Thorax injuries Settings @@ -1416,6 +1519,7 @@ Configurações de ferimentos torácicos Asetukset rintakehän vammoihin Параметры травм грудной клетки + Thoraxverwonding instellingen Cyanosis Settings @@ -1430,6 +1534,7 @@ Configurações de cianose Syanoosin asetukset Параметры цианоза + Cyanose instellingen [KAM] General Items @@ -1444,41 +1549,14 @@ [KAM] Itens gerais [KAM] Yleiset kohteet [КАМ] Общие пункты - - - Enable low SpO2 warning - Habilita aviso de Sp02 bajo - Aktiviere visuellen Effekt bei niedrigen SpO2 Wert - Autoriser les alertes de SpO2 basse - 低SpO2警告を有効にする - 낮은 산소포화도 경고 활성화 - Abilità l'allerta di basso SPO2 - Habilita aviso de baixo nível de SpO2 - Włącz ostrzeżenie o niskim SpO2 - Povolit varování při nízkém SpO2 - Ota käyttöön alhaisten SpO2-arvojen varoitus - Включить предупреждение о низком уровне SpO2 - - - Makes your Screen flash black if you are below 90% SpO2 (default value) - Parpadeos negros del monitor que avisan de un Sp02 menor a 90% (valor predeterminado) - Dunkle, pulsierende Vignettierung, wenn der SpO2 Wert unter 90% ist (Standardwert) - Fait flasher l'écran en noir si la valeur de SpO2 est en dessous de 90% (Valeur par défaut) - SpO2が(デフォルトの値では)90%未満の場合、画面が黒く点滅します。 - 산소포화도가 90%(기본값) 미만인 경우 화면이 검은색으로 깜빡입니다. - Rendi lampeggiante il tuo schermo se sei sotto al 90% di SPO2 (valore standard) - Faz sua tela piscar em preto se você estiver abaixo de 90% de SpO2 (valor padrão) - Sprawia, że ekran miga na czarno, jeśli SpO2 jest niższe niż 90% (domyślna wartość) - Černé problikávání obrazovky při hodnotě SpO2 nižší než 90% (výchozí hodnota) - Saa näytön vilkkumaan mustaksi, jos olet alle tietyn SpO2-arvon (oletus on 90 %) - Заставляет ваш экран мигать черным, если уровень SpO2 ниже 90% (значение по умолчанию) + [KAM] Algemene items Enable Stamina loss on low SpO2 Habilita perdida de resistencia por Sp02 bajo Aktiviere Verlust von Ausdauer bei niedrigen SpO2 Wert Autoriser la perte d'endurance en cas de SpO2 basse - 低SpO2でのスタミナ損失を有効にする + 低SpO2でのスタミナ損失を有効化 낮은 산소포화도에서 스태미나 손실 활성화 Abilita la perdità di stamina con bassa pressione SPO2 Ativar perda de stamina sob baixo SpO2 @@ -1486,13 +1564,14 @@ Povolit ztrátu Staminy při nízkém SpO2 Ota kestävyyden menetys käyttöön alhaisilla SpO2-tasoilla Включите потерю выносливости при низком SpO2 + Sta stamina verlies op laag SpO2 toe Makes you lose stamina if you are under 90% SpO2 (default value) Te hace perder resistencia al tener el Sp02 por debajo del 90% (valor predeterminado) Lässt dich Ausdauer verlieren, wenn du unter 90% SpO2 bist (Standardwert) Fait perdre de l'endurance si la valeur de SpO2 est en dessous de 90% (Valeur par défaut) - SpO2が(デフォルトの値では)90%未満の場合、スタミナを失います。 + SpO2が(デフォルトの値では)90%未満の場合、スタミナの損失が発生します。 산소포화도가 90%(기본값) 미만이면 스태미나가 떨어집니다. Perdi stamina se sei sotto il 90% SPO2 (valore standard) Faz você perder stamina se estiver abaixo de 90% SpO2 (valor padrão) @@ -1500,34 +1579,7 @@ Ztrácení staminy pří hodnotě SpO2 nižší než 90% (výchozí hodnota) Menettää kestävyyden, jos olet alle tietyn SpO2-tason (oletusarvo on 90 %) Заставляет вас терять выносливость, если у вас уровень SpO2 ниже 90% (значение по умолчанию) - - - Low SpO2 warning level - Nivel de Sp02 bajo para aviso - Schwellwert für niedrigen SpO2 - Niveau d'alerte de SpO2 basse - 低SpO2警告のレベル - 낮은 산소포화도 경고 수준 - Livello di allerta bassa SPO2 - Nível de alerta de SpO2 baixo - Ostrzeżenie o niskim SpO2 - Hodnota SpO2 pro varování o nízkém SpO2 - Matala SpO2-varoitustaso - Низкий уровень предупреждения SpO2 - - - Lets you change the SpO2 Value at which you get the Flashing warning indicator and stamina loss effect - Te permite bajar el nivel de Sp02 a partir del cual se empiezan a efectuar flashazos negros y se pierde resistencia - Definiert den SpO2 Wert, bei welchem der Ausdauerverlust und der visuelle Effekt (dunkle, pulsierende Vignettierung) eintritt - Règle la valeur de SpO2 à laquelle les flashs d'alerte et la perte d'endurance apparaissent - 低SpO2警告が発生するSpO2のしきい値を変更します。(デフォルトでは90%) - 깜빡임 경고 표시 및 스태미나 손실 효과를 얻게 되는 산소포화도 값을 변경합니다. - Ti permette di cambiare il valore di SPO2 al quale ricevi l'indicatore lampeggiante d'allerta e l'effetto di perdita della stamina - Permite alterar o valor SpO2 no qual você é avisado e sofre perda de stamina - Pozwala zmienić poziom SpO2, poniżej którego będzie widać ostrzeżenie w postaci migotania ekranu i zmniejszonej staminy - Nastavení hodnoty SpO2 při které se aktivují varovné efekty problikávání obrazovky a ztráta staminy - Voit muuttaa SpO2-arvoa, jolla saat vilkkuvan varoituksen ja kestävyyden heikkenemisen - Позволяет изменить значение SpO2, при котором вы получаете мигающий предупреждающий индикатор и эффект потери выносливости + Zorgt ervoor dat je stamina verliest als je onder 90% SpO2 zit (standaard waarde) Enable Pulse Oximeter Alarm @@ -1542,6 +1594,7 @@ Habilitar o alarme do Oxímetro de Pulso Ota pulssioksimetrin hälytys käyttöön Включить сигнал тревоги пульсоксиметра + Zet pulsoximeter alarm aan Disable Pulse Oximeter Alarm @@ -1556,6 +1609,7 @@ Desabilitar o alarme do Oxímetro de Pulso Poista pulssioksimetrin hälytys käytöstä Отключить сигнал тревоги пульсоксиметра + Zet pulsoximeter alarm uit Pulse Oximeter Alarm SpO2 Threshold @@ -1570,6 +1624,7 @@ Nível de SpO2 para ativação do alarme do Oxímetro de Pulso SpO2-taso, joka laukaisee pulssioksimetrin hälytyksen Уровень SpO2, подающий сигнал тревоги пульсоксиметра + Pulsoximeter alarm SpO2 drempelwaarde Use BVM @@ -1584,6 +1639,7 @@ Usar BVM Käytä BVM:ää Использовать BVM + Gebruik BVM Rescue Breaths Started @@ -1594,6 +1650,7 @@ Beatmung hat begonnen Iniciada asistencia respiratoria Ventilação com BVM iniciada + Beademing gestart Put away BVM @@ -1605,6 +1662,7 @@ Guarda el Ambu Varastoi BVM Убрать BVM + BVM wegleggen Rescue Breaths Cancelled @@ -1616,6 +1674,7 @@ Asistencia respiratoria cancelada Pelastushengitykset peruttu Отмена спасения с помощью BVM + Beademing is gestopt Use Pocket BVM @@ -1630,6 +1689,7 @@ Usar BVM portátil Käytä kannettavaa BVM:ää Использовать карманный BVM + Gebruik zak BVM Use BVM with Oxygen Tank @@ -1644,6 +1704,7 @@ Usar BVM com cilindro de oxigênio Käytä BVM:ää happisäiliön kanssa Использовать BVM с кислородным баллоном + Gebruik BVM met zuurstoftank Use BVM with Oxygen @@ -1658,6 +1719,7 @@ Usar BVM com oxigênio Käytä BVM:ää hapen kanssa Использовать BVM с кислородом + Gebruik BVM met zuurstof Use BVM with Oxygen Tank (Vehicle) @@ -1669,6 +1731,7 @@ BVMと酸素ボンベ(車両)を使用 Käytä BVM:ää ajoneuvon happisäiliön kanssa Использовать BVM с кислородным баллоном (автомобиль) + Gebruik BVM met zuurstoftank (voertuig) Using BVM with Oxygen Tank (Vehicle) @@ -1681,6 +1744,7 @@ Usando BVM com cilindro de oxigênio (veículo) BVM:n käyttäminen ajoneuvon happisäiliön kanssa Использование BVM с кислородным баллоном (транспортное средство) + Beademing met BVM en zuurstoftank (voertuig) Oxygen tank disconnected (empty) @@ -1695,6 +1759,7 @@ Cilindro de oxigênio desconectado (vazio) Happisäiliö irrotettu (se on tyhjä) Кислородный баллон отсоединен (пуст) + Zuurstoftank losgekoppeld (leeg) Refilling Portable Oxygen Tank @@ -1709,6 +1774,7 @@ Reabastecendo Cilindro Portátil de Oxigênio Kannettavan happisäiliön täyttö Заправка портативного кислородного баллона + Bijvullen van draagbare zuurstoftank Oxygen Tank Refill Complete @@ -1723,6 +1789,7 @@ Reabastecimento de cilindro de oxigênio finalizado Happisäiliö on täynnä Заправка кислородного баллона завершена + Zuurstoftank bijgevuld Oxygen Tank Refill Cancelled @@ -1737,6 +1804,7 @@ Reabastecimento de cilindro de oxigênio cancelado Happisäiliön täyttö peruttu Заправка кислородного баллона отменена + Zuurstoftank bijvulling stopgezet Refill Portable Oxygen Tank @@ -1751,6 +1819,7 @@ Reabastecer Cilindro Portátil de Oxigênio Täytä kannettava happisäiliö Заправить портативный кислородный баллон + Hervul draagbare zuurstoftank Refill Portable Oxygen Tank (150L) @@ -1765,6 +1834,7 @@ Reabastecer Cilindro Portátil de Oxigênio (150L) Täytä kannettava happisäiliö (150L) Заправить портативный кислородный баллон (150 л) + Hervul draagbare zuurstoftank (150L) Refill Portable Oxygen Tank (300L) @@ -1779,6 +1849,7 @@ Reabastecer Cilindro Portátil de Oxigênio (300L) Täytä kannettava happisäiliö (300L) Заправить портативный кислородный баллон (300 л) + Hervul draagbare zuurstoftank (300L) BVM @@ -1793,6 +1864,7 @@ BVM BVM BVM + BVM Bag-Valve-Mask, used to assist with breathing of unconscious patients @@ -1807,6 +1879,7 @@ Bolsa-Válvula-Máscara, utilizado para auxiliar na respiração de pacientes inconscientes Pussi-venttiili-naamari, käytetään auttamaan tajuttomien potilaiden hengittämisessä Кислородная маска, используемая для облегчения дыхания пациентов, находящихся без сознания + Bag-Valve-Mask of een zakventielmasker wordt gebruikt voor het ondersteunen van de ademhaling van bewusteloze personen Pocket BVM @@ -1821,6 +1894,7 @@ BVM Portátil Kannettava BVM Карманный BVM + Zak BVM Compact version of the Bag-Valve-Mask @@ -1835,6 +1909,7 @@ Versão compacta do dispositivo Bolsa-Válvula-Máscara Pussi-venttiili-naamari kompakti versio Компактная версия BVM + Compacte versie van de BVM Portable Oxygen Tank (150L) @@ -1849,6 +1924,7 @@ Cilindro Portátil de Oxigênio (150L) Kannettava happisäiliö (150L) Портативный кислородный баллон (150Л) + Draagbare zuurstoftank (150L) Portable Oxygen Tank, containing 150L of oxygen. Connect to BVM to further assist with breathing of critical patients. @@ -1863,6 +1939,7 @@ Cilindro Portátil de Oxigênio, contendo 150L de oxigênio. Conecte ao BVM para auxiliar na respiração de pacientes críticos. Kannettava happisäiliö, joka sisältää 150 litraa happea. Yhdistä BVM:ään auttaaksesi kriittisten potilaiden hengittämisessä. Портативный кислородный баллон, содержащий 150 литров кислорода. Подключите к BVM для дальнейшего облегчения дыхания пациентов в критическом состоянии. + Draagbare zuurstoftank, bevat 150L van zuurstof. Helpt met het beademen van kritieke patiënten wanneer verbonden aan een BVM Portable Oxygen Tank (300L) @@ -1877,6 +1954,7 @@ Cilindro Portátil de Oxigênio (300L) Kannettava happisäiliö (300L) Портативный кислородный баллон (300Л) + Draagbare zuurstoftank (300L) Portable Oxygen Tank, containing 300L of oxygen. Connect to BVM to further assist with breathing of critical patients. @@ -1891,6 +1969,7 @@ Cilindro Portátil de Oxigênio, contendo 300L de oxigênio. Conecte ao BVM para auxiliar na respiração de pacientes críticos. Kannettava happisäiliö, joka sisältää 300 litraa happea. Yhdistä BVM:ään auttaaksesi kriittisten potilaiden hengittämisessä. Портативный кислородный баллон, содержащий 300 литров кислорода. Подключите к BVM для дальнейшего облегчения дыхания пациентов в критическом состоянии. + Draagbare zuurstoftank, bevat 300L van zuurstof. Helpt met het beademen van kritieke patiënten wanneer verbonden aan een BVM Empty Portable Oxygen Tank (150L) @@ -1905,6 +1984,7 @@ Cilindro Portátil de Oxigênio vazio (150L) Tyhjä kannettava happisäiliö (150L) Пустой переносной кислородный баллон (150 л) + Lege draagbare zuurstoftank (150L) Empty Portable Oxygen Tank (300L) @@ -1919,6 +1999,7 @@ Cilindro Portátil de Oxigênio vazio (300L) Tyhjä kannettava happisäiliö (300L) Пустой переносной кислородный баллон (300 л) + Lege draagbare zuurstoftank (300L) Empty Portable Oxygen Tank, refill at a medical vehicle or facility @@ -1933,6 +2014,7 @@ Cilindro Portátil de Oxigênio vazio, reabasteça em um veículo ou instalação médica Tyhjennä kannettava happisäiliö, täytä lääketieteellisessä ajoneuvossa tai laitoksessa. Опустошите переносной кислородный баллон, заправьте его в медицинском автомобиле или учреждении + Lege draagbare zuurstoftank, hervul bij een medisch voertuig of -gebouw BVM Oxygen Effectiveness Multiplier @@ -1945,6 +2027,7 @@ Multiplicador de eficacia del oxígeno para el Ambu BVM happitehokkuuskerroin Множитель эффективности использования кислорода BVM + BVM zuurstof effectiviteits vermenigvuldiger %1 used %2 (x%3) @@ -1957,6 +2040,7 @@ %1 uso %2 (x%3) %1 käytetty %2 (x%3) %1 использует %2 (x%3) + %1 gebruikte %2 (x%3) %1 (Oxygenated) @@ -1969,6 +2053,7 @@ %1 (Oxigenado) %1 (Kyllästetty hapella) %1 (насыщение кислородом) + %1 (zuurstofrijk) Allow BVM @@ -1983,6 +2068,7 @@ Permitir BVM Salli BVM Разрешить BVM + Sta BVM toe Sets required medical level to use BVM @@ -1997,6 +2083,7 @@ Define o nível médico necessário para usar BVM Asettaa BVM:n käyttöön vaadittavan lääketieteellisen koulutustason Устанавливает необходимый медицинский уровень для использования BVM + Bepaalt het medische trainingsniveau benodigd voor BVM gebruik Allow Pocket BVM @@ -2011,6 +2098,7 @@ Permitir BVM Portátil Salli kannettava BVM Разрешить карманный BVM + Sta zak BVM toe Sets required medical level to use Pocket BVM @@ -2025,6 +2113,7 @@ Define o nível médico necessário para usar BVM Portátil Asettaa kannettavan BVM:n käyttöön vaaditun lääketieteellisen koulutustason Устанавливает необходимый медицинский уровень для использования карманногоt BVM + Bepaalt het medische trainingsniveau benodigd voor zak BVM gebruik Allow BVM with oxygen @@ -2039,6 +2128,7 @@ Permitir BVM com oxigênio Salli BVM hapen kanssa Разрешить BVM с кислородом + Sta BVM met zuurstof toe Sets required medical level to use BVM with oxygen @@ -2053,6 +2143,7 @@ Define o nível médico necessário para usar BVM com oxigênio Asettaa lääketieteellisen koulutustason, joka vaaditaan BVM:n käyttöön hapen kanssa Устанавливает медицинский уровень, необходимый для использования BVM с кислородом + Bepaald het medische trainingsniveau benodigt voor het gebruik van een BVM met zuurstof Portable Oxygen Tank Base Refill Time @@ -2067,6 +2158,7 @@ Tempo base para reabastecer o Cilindro Portátil de Oxigênio Kannettava happisäiliö vähimmäistäyttöaika Время заполнения переносного кислородного баллона + Draagbare zuurstoftank hervullings tijd Sets time required to refill Oxygen Tank (150L) @@ -2081,6 +2173,7 @@ Define o tempo necessário para reabastecer o Cilindro Portátil de Oxigênio (150L) Asettaa happisäiliön (150L) täyttämiseen tarvittavan ajan Устанавливает время, необходимое для заполнения кислородного баллона (150 л) + Bepaalt de benodigde tijd om een zuurstoftank bij te vullen (150L) Set Portable Oxygen Tank (150L) as preferred @@ -2095,6 +2188,7 @@ Definir Cilindro Portátil de Oxigênio (150L) como preferido Aseta kannettava happisäiliö (150L) ensisijaiseksi happisäiliöksi Установить переносной кислородный баллон (150 л) в качестве предпочтительного + Defineert de 150L draagbare zuurstoftank als voorkeurstank Set Portable Oxygen Tank (300L) as preferred @@ -2109,6 +2203,7 @@ Definir Cilindro Portátil de Oxigênio (300L) como preferido Aseta kannettava happisäiliö (300L) ensisijaiseksi happisäiliöksi Установить переносной кислородный баллон (300 л) по своему усмотрению + Defineert de 300L draagbare zuurstoftank als voorkeurstank Location Provide Oxygen @@ -2121,6 +2216,7 @@ Local de fornecimento de oxigênio Tarjoaako sijainti happea Место, обеспечивающее кислород + Locaties die zuurstof geven Sets if medical vehicles/facilites can provide oxygen @@ -2133,6 +2229,7 @@ Define se veículos ou instalações médicas podem fornecer oxigênio Määrittää, voivatko lääketieteelliset ajoneuvot tai tilat tarjota happea Устанавливает, могут ли медицинские помещения/транспортные средства подавать кислород + Bepaalt of voertuigen/gebouwen zuurstof kunnen geven Check Breathing @@ -2144,6 +2241,7 @@ Comprueba la respiración Tarkista potilaan hengitys Проверить дыхание + Check ademhaling Checking Breathing @@ -2155,6 +2253,7 @@ Comprobando la respiración Potilaan hengityksen tarkistaminen Проверка дыхания + Ademhaling controleren , harsh and metallic @@ -2166,6 +2265,7 @@ , áspero y metálico , kova ja metallinen , резкий и металлический + , hard en metaalachtig , slightly fruity @@ -2177,6 +2277,7 @@ , ligeramente afrutado , hieman hedelmäinen , слегка фруктовый + , lichtelijk fruitig Patient is breathing normally @@ -2188,6 +2289,7 @@ El paciente está respirando con normalidad Potilas hengittää normaalisti Пациент дышит нормально + Patiënt ademt normaal Patient's breathing is shallow @@ -2199,6 +2301,7 @@ La respiración del paciente es superficial Potilaan hengitys on pinnallista Дыхание пациента поверхностное + Patiënts ademhaling is oppervlakkig Shallow @@ -2210,6 +2313,7 @@ Superficial Matala Дыхание поверхностное + Oppervlakkig Patient is not breathing @@ -2224,6 +2328,7 @@ Pacient nedýchá Potilas ei hengitä Пациент не дышит + Patiënt ademt niet %1 checked breathing: %2 @@ -2235,6 +2340,7 @@ %1 comprobó la respiración: %2 %1 tarkistettu hengitys: %2 %1 проверил дыхание: %2 + %1 controleerde ademhaling: %2 Enable Inspect Chest @@ -2246,6 +2352,7 @@ Habilitar la inspección del pecho Ota rinnan tarkastus käyttöön Активировать осмотр грудной клетки + Sta Thoraxinspectie toe Simple @@ -2257,6 +2364,7 @@ Sencillo Yksinkertainen Простой + Simpel Default @@ -2268,6 +2376,7 @@ Por defecto Default Значение по умолчанию + Standaard Inspect Chest Time @@ -2279,6 +2388,7 @@ Tiempo de inspección del pecho Kuinka kauan rintakehän tarkastus kestää Время осмотра грудной клетки + Thorax inspectie tijd Allow Inspecting Chest @@ -2290,6 +2400,7 @@ Permitir la inspección del pecho Salli rintatutkimus Разрешить осмотр грудной клетки + Sta thorax inspectie toe Inspect Chest @@ -2301,6 +2412,7 @@ Inspeccionar el pecho Tutki rintakehä Осмотреть грудную клетку + Thoraxinspectie Inspecting Chest @@ -2312,6 +2424,7 @@ Inspeccionando el pecho Rintakehän tutkiminen Осмотр грудной клетки + Thoraxinspectie %1 inspected chest: %2 @@ -2323,6 +2436,7 @@ %1 inspeccionó el pecho: %2 %1 tarkastettu rintakehä: %2 %1 проверил грудную клетку: %2 + %1 inspecteerde thorax:%2 Chest rise and fall observed @@ -2334,6 +2448,7 @@ Se observa elevación y descenso del pecho Rintakehän nousu ja lasku havaittu Наблюдается подъем и опускание грудной клетки + Stijging en daling van thorax worden geobserveerd No chest movement observed @@ -2345,6 +2460,7 @@ No se observa movimiento del pecho Rintakehän liikettä ei havaittu Движений грудной клетки не наблюдается + Geen thorax beweging wordt geobserveerd No chest movement @@ -2356,6 +2472,7 @@ Sin movimiento del pecho Ei liikettä rinnassa Отсутствие движения грудной клетки + Geen thorax beweging Chest sides are uneven @@ -2367,6 +2484,7 @@ Los lados del pecho son desiguales Rintakehän sivut ovat epätasaiset Бока грудной клетки неровные + Thoraxzijden zijn oneven , chest sides uneven @@ -2378,6 +2496,7 @@ , lados del pecho desiguales , rintakehän sivut epätasaiset , бока грудной клетки неровные + , thoraxzijden oneven Uneven chest rise and fall @@ -2389,6 +2508,7 @@ Elevación y descenso desiguales del pecho Epätasainen rintakehän nousu ja lasku Неравномерный подъем и опускание грудной клетки + Ongelijkmatige stijging en daling van thorax Skin is rigid, looks bruised @@ -2400,6 +2520,7 @@ La piel está rígida y magullada Iho on jäykkä ja näyttää mustelmalta Кожа жесткая, выглядит ушибленной + Huid is stijf, ziet er gekneusd uit Symptoms indicate %1 @@ -2411,6 +2532,7 @@ Los síntomas indican %1 Oireet osoittavat %1 Симптомы указывают на %1 + Symptomen indiceren %1 Pneumothorax @@ -2422,6 +2544,7 @@ Neumotórax Pneumotoraksi Пневмоторакс (PTX) + Pneumothorax Tension Pneumothorax @@ -2433,6 +2556,7 @@ Neumotórax a tensión jännitysilmarinta Напряженный пневмотораксе + Spanningspneumothorax Hemopneumothorax @@ -2444,6 +2568,7 @@ Hemotórax hemopneumotoraksi Гемоторакс + Hemopneumothorax PTX @@ -2455,6 +2580,7 @@ NTX PTK PTX + PTX TPTX @@ -2466,6 +2592,7 @@ NTXT JSA TPTX + SPTX HPTX @@ -2477,6 +2604,7 @@ HTX HPT HPTX + HPTX Nasal Cannula @@ -2485,6 +2613,7 @@ Назальная Канюля Cânula Nasal Cánula Nasal + Nasale canule The Nasal Cannula can be inserted into a patient's nostrils and connected to a vitals monitor to record a patient's ETCo2 level and respiratory rate. @@ -2493,6 +2622,7 @@ Назальная канюля может быть вставлена в ноздри пациента и подключена к монитору жизненно важных функций для регистрации уровня ETCo2 у пациента и частоты дыхания. A Cânula Nasal pode ser inserida nas narinas de um paciente e conectada ao monitor de sinais vitais para mensurar o nível de ETCo2 e a frequência respiratória. La cánula nasal se puede insertar en las fosas nasales de un paciente y conectarse a un monitor de signos vitales para registrar el nivel de ETCo2 y la frecuencia respiratoria del paciente. + De nasale canule kan in de neusgaten van de patiënt aangebracht worden en verbonden aan een vitale waarden monitor om de ETCo2 waarden en het ademhalingstempo van de patiënt te monitoren Remove Nasal Cannula @@ -2501,6 +2631,7 @@ Удалить Назальную Канюлю Remover Cânula Nasal Quitar la cánula nasal + Verwijder nasale canule %1 removed Nasal Cannula @@ -2509,6 +2640,7 @@ %1 удалил Назальную Канюлю %1 removeu a Cânula Nasal %1 retiró la cánula nasal + %1 verwijderde nasale canule diff --git a/addons/chemical/functions/fnc_afterWait.sqf b/addons/chemical/functions/fnc_afterWait.sqf index f807a46f7..a3fe41732 100644 --- a/addons/chemical/functions/fnc_afterWait.sqf +++ b/addons/chemical/functions/fnc_afterWait.sqf @@ -32,13 +32,13 @@ if ((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), [ params ["_args", "_pfhHandler"]; _args params["_unit", "_logic", "_gastype", "_radius_max", "_isinGas"]; - if !(_isinGas) exitwith { + if !(_isinGas) exitWith { [_pfhHandler] call CBA_fnc_removePerFrameHandler; }; private _timeleft = _unit getVariable [QGVAR(gasmask_durability), 10]; _pos = _logic getVariable [QGVAR(gas_position), [0, 0, 0]]; - if (_unit distance _pos > _radius_max || !(_logic getVariable[QGVAR(gas_active), false]) || isNull _logic) exitwith { + if (_unit distance _pos > _radius_max || !(_logic getVariable[QGVAR(gas_active), false]) || isNull _logic) exitWith { _unit setVariable [QGVAR(enteredPoison), false, true]; _isinGas = false; }; @@ -54,7 +54,6 @@ if ((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), [ _unit setVariable [QGVAR(airPoisoning), true, true]; }; }; - [_unit] call EFUNC(breathing,handleBreathing); _isinGas = false; }; @@ -69,7 +68,6 @@ if ((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), [ _unit setVariable [QGVAR(airPoisoning), true, true]; }; }; - [_unit] call EFUNC(breathing,handleBreathing); _isinGas = false; }; @@ -93,6 +91,5 @@ if ((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), [ _unit setVariable [QGVAR(airPoisoning), true, true]; }; }; - [_unit] call EFUNC(breathing,handleBreathing); }; }; diff --git a/addons/chemical/functions/fnc_breathing.sqf b/addons/chemical/functions/fnc_breathing.sqf index f98f37013..f4ab4b46d 100644 --- a/addons/chemical/functions/fnc_breathing.sqf +++ b/addons/chemical/functions/fnc_breathing.sqf @@ -32,7 +32,7 @@ params ["_unit"]; [_handler] call CBA_fnc_removePerFrameHandler; [_unit] call FUNC(breathing); } else { - if (GET_PAIN_PERCEIVED(_unit) >= 0.4 || {_unit getVariable[QACEGVAR(medical,heartrate), 80] >= 105}) then { + if (GET_PAIN_PERCEIVED(_unit) >= 0.4) || (_unit getVariable[QACEGVAR(medical,heartrate), 80] >= 105) then { _unit say3D QGVAR(mask_breath_heavy); } else { private _random = selectRandom[QGVAR(mask_breath_1), QGVAR(mask_breath_2)]; diff --git a/addons/chemical/functions/fnc_chemDetector.sqf b/addons/chemical/functions/fnc_chemDetector.sqf index 4ca1f69a9..64d37996d 100644 --- a/addons/chemical/functions/fnc_chemDetector.sqf +++ b/addons/chemical/functions/fnc_chemDetector.sqf @@ -25,7 +25,7 @@ params ["_unit"]; private _ui = GETUVAR(RscWeaponChemicalDetector,displayNull); private _obj = _ui displayCtrl 101; - if ("ChemicalDetector_01_watch_F" in (assigneditems _unit)) then + if ("ChemicalDetector_01_watch_F" in (assignedItems _unit)) then { private _percent = _unit getVariable [QGVAR(gasPercentage),0]; private _thread = parseNumber (_percent toFixed 1); @@ -48,7 +48,7 @@ params ["_unit"]; params["_args", "_pfhHandler"]; _args params ["_unit"]; - if (_unit getVariable [QGVAR(chemDetectorState), false] && _unit getVariable [QGVAR(gasPercentage), 0] >= 0.1 && "ChemicalDetector_01_watch_F" in (assigneditems _unit)) then { + if (_unit getVariable [QGVAR(chemDetectorState), false] && _unit getVariable [QGVAR(gasPercentage), 0] >= 0.1 && "ChemicalDetector_01_watch_F" in (assignedItems _unit)) then { playSound3D [QPATHTOF(audio\chemDetector.ogg), _unit, false, getPosASL _unit, 4, 1, 10]; }; diff --git a/addons/chemical/functions/fnc_gasAI.sqf b/addons/chemical/functions/fnc_gasAI.sqf index 518ab574b..499890608 100644 --- a/addons/chemical/functions/fnc_gasAI.sqf +++ b/addons/chemical/functions/fnc_gasAI.sqf @@ -54,15 +54,15 @@ if (!isDamageAllowed _unit) exitWith { private _fnc_afterwait = { params ["_unit", "_gastype", "_pos", "_skill"]; - if !((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) exitwith { + if !((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) exitWith { if (_gastype isEqualTo 1) then { if (_unit distance _pos < 10 && _unit getVariable [QGVAR(enteredPoison), false]) then { _unit say3D QGVAR(cough_1); - _unit setskill ["aimingAccuracy", 0.001]; + _unit setSkill ["aimingAccuracy", 0.001]; [ { params["_unit", "_skill"]; - _unit setskill ["aimingAccuracy", _skill]; + _unit setSkill ["aimingAccuracy", _skill]; }, [_unit, _skill], 30 @@ -92,16 +92,16 @@ if (!isDamageAllowed _unit) exitWith { private _timeleft = 30; for "_i" from 0 to 1 step 0 do { _timeleft = _timeleft - 1; - if (_timeleft <= 0) exitwith { + if (_timeleft <= 0) exitWith { [_unit, _gastype, _pos, _skill] call _fnc_afterwait; _i = 2; }; - if (_gastype isEqualTo 1) exitwith { + if (_gastype isEqualTo 1) exitWith { [_unit, _gastype, _pos, _skill] call _fnc_afterwait; _i = 2; }; _pos = _logic getVariable [QGVAR(gas_position), [0, 0, 0]]; - if (_unit distance _pos > _radius_max || !(_logic getVariable [QGVAR(gas_active), false]) || isNull _logic) exitwith { + if (_unit distance _pos > _radius_max || !(_logic getVariable [QGVAR(gas_active), false]) || isNull _logic) exitWith { _unit setVariable [QGVAR(enteredPoison), false, true]; _i = 2; }; diff --git a/addons/chemical/functions/fnc_gasCheck.sqf b/addons/chemical/functions/fnc_gasCheck.sqf index d011430c2..bf2cbc5d0 100644 --- a/addons/chemical/functions/fnc_gasCheck.sqf +++ b/addons/chemical/functions/fnc_gasCheck.sqf @@ -14,7 +14,7 @@ * NONE * * Example: - * [logic, getpos player, 50, 20, 1] call kat_chemical_fnc_gasCheck; + * [logic, getPos player, 50, 20, 1] call kat_chemical_fnc_gasCheck; * * Public: No */ @@ -42,7 +42,7 @@ private _checkPlayers = { continue; }; - _position = if ((toString (_position) != toString (getpos _logic))) then {getpos _logic} else {_position}; + _position = if ((toString (_position) != toString (getPos _logic))) then {getPos _logic} else {_position}; _logic setVariable [QGVAR(gas_position), _position, true]; private _distance = _x distance _position; diff --git a/addons/chemical/functions/fnc_getChemDetectorState.sqf b/addons/chemical/functions/fnc_getChemDetectorState.sqf index 078cb7447..528657971 100644 --- a/addons/chemical/functions/fnc_getChemDetectorState.sqf +++ b/addons/chemical/functions/fnc_getChemDetectorState.sqf @@ -18,4 +18,4 @@ params ["_unit", "_isOnOff"]; private _currentState = _unit getVariable [QGVAR(chemDetectorState), false]; -[false, true] select ("ChemicalDetector_01_watch_F" in (assigneditems _unit) && _currentState == _isOnOff); \ No newline at end of file +[false, true] select ("ChemicalDetector_01_watch_F" in (assignedItems _unit) && _currentState == _isOnOff); \ No newline at end of file diff --git a/addons/chemical/functions/fnc_getList.sqf b/addons/chemical/functions/fnc_getList.sqf index 8d241ac40..8bb758914 100644 --- a/addons/chemical/functions/fnc_getList.sqf +++ b/addons/chemical/functions/fnc_getList.sqf @@ -18,10 +18,10 @@ */ params ["_str", ["_cfg", "", [""]]]; -private _clipstring = _str splitstring ", ""[]()'"; +private _clipstring = _str splitString ", ""[]()'"; private _array = []; { - if (isClass(configFile >> _cfg >> _x) || _cfg isEqualto "") then { + if (isClass(configFile >> _cfg >> _x) || _cfg isEqualTo "") then { _array pushBackUnique _x }; nil diff --git a/addons/chemical/functions/fnc_handleFired.sqf b/addons/chemical/functions/fnc_handleFired.sqf index e77edae08..a531b1cb5 100644 --- a/addons/chemical/functions/fnc_handleFired.sqf +++ b/addons/chemical/functions/fnc_handleFired.sqf @@ -25,9 +25,9 @@ params ["_vehicle", "", "", "", "_ammo", "_magazine", "_projectile"]; // Large enough distance to not simulate any wind deflection -if (_vehicle distance ACE_player > 8000) exitwith {}; +if (_vehicle distance ACE_player > 8000) exitWith {}; -if !(_ammo in KAT_ProjectileCache) exitwith {}; +if !(_ammo in KAT_ProjectileCache) exitWith {}; private _configClass = (configFile >> "CfgAmmo" >> _ammo); @@ -40,7 +40,7 @@ private _gasLvL = [_configClass, "KAT_toxicLvL", 1] call BIS_fnc_returnConfigEnt _args params ["_projectile", "_posArr", "_gasInfo"]; _gasInfo params ["_lifetime", "_radius", "_gasLvL"]; - if (!isNull _projectile) exitwith { + if (!isNull _projectile) exitWith { _args set [1, getPos _projectile]; }; diff --git a/addons/chemical/functions/fnc_init.sqf b/addons/chemical/functions/fnc_init.sqf index 9b46a1d99..f5905b8df 100644 --- a/addons/chemical/functions/fnc_init.sqf +++ b/addons/chemical/functions/fnc_init.sqf @@ -27,9 +27,9 @@ if (!local _unit) exitWith {}; params ["_args", "_pfhID"]; _args params ["_unit"]; private _playertime = _unit getVariable [QGVAR(timeleft), 60]; - private _maxtime = missionnamespace getVariable [QGVAR(infectionTime), 60]; + private _maxtime = missionNamespace getVariable [QGVAR(infectionTime), 60]; if (!(_unit getVariable [QGVAR(enteredPoison), false])) then { - if (_playertime < missionnamespace getVariable [QGVAR(infectionTime), 60]) then { + if (_playertime < missionNamespace getVariable [QGVAR(infectionTime), 60]) then { _playertime = _playertime + 1; if (_playertime >= _maxtime) then { _playertime = _maxtime; diff --git a/addons/chemical/functions/fnc_throwGrenade.sqf b/addons/chemical/functions/fnc_throwGrenade.sqf index 45e3b617b..920612de0 100644 --- a/addons/chemical/functions/fnc_throwGrenade.sqf +++ b/addons/chemical/functions/fnc_throwGrenade.sqf @@ -18,7 +18,7 @@ private _config = configFile >> "CfgAmmo" >> _ammo; -if (getNumber (_config >> "KAT_csGas") != 1) exitwith {}; +if (getNumber (_config >> "KAT_csGas") != 1) exitWith {}; private _timeToLive = getNumber (_config >> "timeToLive"); private _fuzeTimeBase = getNumber (_config >> "explosionTime"); diff --git a/addons/chemical/stringtable.xml b/addons/chemical/stringtable.xml index 3baea78f5..27b3712f1 100644 --- a/addons/chemical/stringtable.xml +++ b/addons/chemical/stringtable.xml @@ -14,6 +14,7 @@ Povolené plynové masky Hyväksytyt kaasunaamarit Разрешенные противогазы + Geaccepteerde gasmaskers Enter here the classname of the masks that should work with the system. @@ -28,6 +29,7 @@ Zde vložte "classname" plynových masek, které mají spolupracovat s tímto systémem. Anna niiden maskien luokan nimet, joiden pitäisi toimia järjestelmän kanssa Введите здесь имя класса масок, которые должны работать с системой. + Voer hier de classnames toe van gasmaskers die zouden moeten werken met het systeem. Gas masks durability @@ -42,6 +44,7 @@ Odolnost Plynových masek Kaasunaamarien kestävyys Время действия противогазов + Levensduur van gasmaskers Determines how long you can stand in the gas with a gas mask without getting infected. @@ -56,6 +59,7 @@ Určuje jak dlouho můžete stát v plynu s plynovou maskou bez následků. Määrittää, kuinka kauan voit seistä kaasussa kaasunaamarin kanssa vaikuttamatta siihen Определяет, как долго вы можете находиться в газе с противогазом без заражения. + Bepaald hoelang je in gas kan staan zonder dat je geïnfecteerd raakt. Time until infection @@ -70,6 +74,7 @@ Čas do infekce Aikaa tartunnan saamiseen Время до заражения + Tijd tot infectie Time you can stand in the gas before you get infected or need a gas mask. @@ -84,6 +89,7 @@ Čas po který můžete stát v plynu bez infikování se či potřeby plynové masky Aika, jonka voit seistä kaasussa, ennen kuin sinulla on vaikutusta tai tarvitset kaasunaamaria Время, когда вы сможете постоять в газе, прежде чем заразитесь или вам понадобится противогаз. + Tijd dat je in gas kan staan voordat je geïnfecteerd raakt of een gasmasker nodig hebt Gas Affects AI @@ -98,6 +104,7 @@ Plyn ovlivňuje AI Kaasu vaikuttaa tekoälyyn Газ влияет на ИИ. + Gas beïnvloed KI/AI Determines if AI is affected by gas (If you are running this on a local server this can cause perfomance problems) @@ -112,6 +119,7 @@ Určuje, zda je AI ovlivněno plynem (může způsobovat problémy s výkonem pokud bude spuštěno na lokálním serveru) Määrittää, vaikuttaako kaasu tekoälyyn (jos käytät peliä paikallisella palvelimella, tämä voi aiheuttaa suorituskykyongelmia) Определяет, влияет ли GAS на искусственный интеллект (если вы запускаете его на локальном сервере, это может вызвать проблемы с производительностью). + Bepaald of KI/AI beïnvloed wordt door gas (als je dit doet op een lokale server kan dit leiden tot prestatieproblemen) Gas mask filter @@ -126,6 +134,7 @@ Filtr Plynových masek Kaasunaamariin suodatin Фильтр противогаза + Gasmasker filter Replacement filter for gas mask @@ -140,6 +149,7 @@ Náhradní filtr pro Plynové masky Vaihtosuodatin kaasunaamariin Сменный фильтр для противогаза + Vervangend filter voor gasmaskers Sealant tube @@ -154,6 +164,7 @@ Těsnící hmota Tiivisteputki Трубка для герметика + Afdichtmiddel buis Sealant which is used to seal objects when e.g. a toxic substance leaks out @@ -168,6 +179,7 @@ Hmota používaná k utěsnění objektů např. při úniku toxických substancí Tiiviste, jota käytetään esineiden tiivistämiseen, kun myrkyllistä ainetta vuotaa ulos Герметик, который используется для герметизации предметов, например, при утечке токсичного вещества + Afdichtmiddel dat gebruikt wordt om een object te dichten wanneer er bijvoorbeeld een giftige stof lekt Put on gas mask @@ -182,6 +194,7 @@ Nasadit Plynovou masku Laita kaasunaamari päälle Надеть противогаз + Doe gasmasker op Put on gas mask... @@ -196,6 +209,7 @@ Nasazování Plynové masky Kaasunaamari on laitettu päähän Надевается противогаз... + Gasmasker wordt opgezet... Check gas mask durability @@ -210,6 +224,7 @@ Zkontrolovat odolnost Plynové masky Tarkista kaasunaamarin kestävyys Проверьте время действия противогаза + Check levensduur Gasmasker Replace gas mask filter @@ -224,6 +239,7 @@ Vyměnit filtr Plynové masky Vaihda kaasunaamarin suodatin Заменить фильтр противогаза + Vervang het filter van de gasmasker Mute Chemical Detector. @@ -238,6 +254,7 @@ Ztlumit Chemický Detektor Mykistä kemikaalien ilmaisin Заглушить химический детектор. + Demp chemicaliën detector. Unmute Chemical Detector. @@ -252,6 +269,7 @@ Zapnout zvuk Chemického Detektoru Poista mykistys kemikaalien tunnistimesta. Включите химический детектор. + Ontdemp chemicaliën detector. Create contaminated area / object @@ -266,6 +284,7 @@ Vytvořit kontaminovanou oblast / objekt Saastuta alue/esine Создать загрязненную область/объект + Creëer gecontamineerd gebied / object Radius around the module which is filled with gas. @@ -280,6 +299,7 @@ Poloměr kolem modulu která bude zamořen plynem Kaasulla täytetyn alueen ympärillä oleva säde Радиус вокруг модуля, заполненного газом. + Radius om de module dat gevuld is met gas. The Minimal Range describes the area around the module where the gas is most lethal @@ -294,6 +314,7 @@ Minimální vzdálenost vyjadřuje oblast kolem modulu kde je plyn nejvíce smrtící Minimialue kuvaa moduulia ympäröivän alueen, jossa kaasu on tappavin Минимальный радиус, описывающий область вокруг модели, в которой газ является наиболее смертоносным + Het minimale bereik beschrijft het gebied om de module waar het gas het dodelijkst is The Maximum Range is a range around the Minimal Range where the gas is less lethal and you have a longer chance of survival.(distance from module to outer ring) @@ -308,6 +329,7 @@ Maximální vzdálenost je vzdálenost kolem Minimální vzdálenosti kde je plyn méně smrtící a máte větší šanci na přežití (vzdálenost od modulu k vnějšímu kruhu). Maksimietäisyys on vähimmäisalue, jossa kaasu on vähemmän tappava ja sinulla on pidempi mahdollisuus selviytyä. (etäisyys moduulista ulkorenkaaseen) Максимальный радиус-это радиус вокруг минимального радиуса, при котором газ менее смертоносен и у вас больше шансов на выживание. (Расстояние от модуля до внешнего круга) + Het maximaal bereik is het bereik om het minimale bereik waar het gas minder dodelijk is, en je een langere overlevings hebt. (afstand van module tot buitenste ring) You are about to create a contaminated Object. @@ -322,6 +344,7 @@ Chystáte se vytvořit kontaminovaný objekt Olet saastuttamassa esineen. Вы собираетесь создать зараженный объект. + Je staat op het punt een gecontamineerd object te creëeren. You are about to create a contaminated Zone. @@ -336,6 +359,7 @@ Chystáte se vytvořit kontaminovou oblast Olet saastuttamassa alueen. Вы собираетесь создать загрязненную зону. + Je staat op het punt om een gecontamineerd gebied te creëeren. To create a contaminated object place the module on a empty object. @@ -350,6 +374,7 @@ Pro vytvoření kontaminovaného objektu položte modul na prázdný objekt. Luodaksesi saastuneen objektin aseta moduuli tyhjälle objektille. Чтобы создать зараженный объект, поместите модуль на пустой объект. + Om een gecontamineerd object te creëeren, moet je de module op een leeg object plaatsen. Seal leak @@ -364,6 +389,7 @@ Utěsnit netěsnost Tiivisteen vuoto Герметизация утечки + Dicht lek Seal leak @@ -378,6 +404,7 @@ Utěsnit netěsnost Tuki vuoto Герметизация утечки + Dicht lek Minimal Range need to be less than Maximum Range! @@ -392,6 +419,7 @@ Minimální vzdálenost musí být menší než Maximální vzdálenost! Vähimmäisalueen on oltava pienempi kuin enimmäisetäisyys Минимальный радиус должен быть меньше максимального радиуса ! + Het minimale bereik moet kleiner zijn dan het maximale bereik! Intoxication @@ -406,6 +434,7 @@ Intoxikace Päihtymys Интоксикация + Intoxicatie [ACE] 82mm Gas Rounds Box @@ -419,6 +448,7 @@ [ACE] Skrzynka amunicji gazowej 82mm [ACE] 82mm kaasulaastin kuorilaatikko [ACE] Коробка с 82-мм газовыми патронами + [ACE] 82mm Gasgranatenkist The M7A3 CS gas grenade is a non-lethal tear gas grenade that causes severe burning of the mucous membranes and eyes on contact. @@ -433,6 +463,7 @@ M7A3 CS je plynový granát s nesmrtícím slzným plynem, který způsobuje závažná popálení sliznic a očí při kontaktu s nimi. M7A3 CS -kaasukranaatti on ei-tappava kyynelkaasukranaatti, joka koskettaa limakalvoja ja silmiä vakavasti. Газовая граната M7A3 CS - это несмертельная граната со слезоточивым газом, которая при попадании вызывает сильное жжение слизистых оболочек и глаз. + The M7A3 CS gasgranaat is een niet-dodelijke traangasgranaat dat op contact een ernstig brandend gevoel in het slijmvlies en de ogen creëerd. Tripwire Gas @@ -447,6 +478,7 @@ Nástražný drát s plynovým granátem Kaasun ja kranaatin laukaisulanka Газовая растяжка + Gas struikeldraad Type: Tripwire gas - Sprays a poisonous gas when triggered.<br />Rounds: 1<br />Used on: Ground @@ -461,6 +493,7 @@ Typ: Nástražný drát s plynovým granátem - Při aktivaci vypustí do ovzduší jedovatý plyn.<br/>Ran: 1<br/>Použití: Země Tyyppi: kaasu-käsikranaatin laukaisulanka - suihkuttaa myrkyllistä kaasua laukaisussa <br/>Laukut: 1 <br/>Käytetty: maassa Тип: Газовая растяжка - распыляет отравляющий газ при активации.<br/>Боеприпасов: 1 <br/>используется на: земле + Type: Gas struikeldraad - Sproeit een giftig gas wanneer geactiveerd.<br/>Ladingen: 1<br/>Gebruik op: De grond Toxic gas @@ -475,6 +508,7 @@ Toxický plyn Myrkyllinen kaasu Токсичный газ + Gifgas 82mm Toxic Gas Round @@ -489,6 +523,7 @@ 82mm Granát s Toxickým Plynem 82 mm myrkyllinen kaasulaastikuori Снаряд с токсичным газом диаметром 82 мм + 82mm Gifgasgranaat CS-Gas @@ -503,6 +538,7 @@ CS-Plyn CS-kaasu CS-газ + CS-Gas 82mm CS-Gas Round @@ -517,6 +553,7 @@ 82mm Granát s CS-Plynem 82mm CS-kaasulaastikuori 82-мм CS-Газовый патрон + 82mm CS-Gasgranaat M7A3 Riot CS gas grenade @@ -531,6 +568,7 @@ Granát M7A3 s CS-Plynem M7A3 CS kaasukranaatti Газовая граната M7A3 Riot CS + M7A3 CS Traangasgranaat M7A3 @@ -545,6 +583,7 @@ M7A3 M7A3 M7A3 + M7A3 M43 BZ LGB @@ -559,6 +598,7 @@ M43 BZ LGB M43 BZ LGB M43 BZ LGB + M43 BZ LGB M43 BZ LGB @@ -573,6 +613,7 @@ M43 BZ LGB M43 BZ LGB M43 BZ LGB + M43 BZ LGB Laser Guided Cluster Bomb with a chemical gas payload. @@ -587,6 +628,7 @@ Laserem naváděná kazetová munice s obsahem chemického plynu Laserohjattu rypälepommi kemiallisen kaasun hyötykuormalla Кассетная бомба с лазерным наведением и боевой нагрузкой из химического газа. + Laser gestuurde clusterbom met een chemisch gas als lading. 2x M43 BZ LGB @@ -601,6 +643,7 @@ 2x M43 BZ LGB 2x M43 BZ LGB 2x M43 BZ LGB + 2x M43 BZ LGB 2x M43 BZ LGB @@ -615,6 +658,7 @@ 2x M43 BZ LGB 2x M43 BZ LGB 2x M43 BZ LGB + 2x M43 BZ LGB Unguided rockets with Toxic-gas warhead. @@ -629,6 +673,7 @@ Neřízené rakety s bojovou hlavicí s toxickým plynem Ohjaamattomat raketit, joissa on myrkyllinen kaasukärje Неуправляемые ракеты с боеголовкой из токсичного газа. + Ongestuurde rakketen met een gifgas kop. Hydra GAS 19x @@ -643,6 +688,7 @@ Hydra GAS 19x Hydra KAASU 19x Hydra GAS 19x + Hydra GAS 19x 70mm GAS @@ -657,6 +703,7 @@ 70mm GAS 70mm KAASU 70mm GAS + 70mm GAS Toxic gas (Level 1) @@ -671,6 +718,7 @@ Toxický plyn (Úroveň 1) Myrkyllinen kaasu (taso 1) Токсичный газ (уровень 1) + Gifgas (Level 1) Maximum Range. @@ -685,6 +733,7 @@ Maximální vzdálenost. Suurin kantama Максимальная дальность действия. + Maximaal bereik. Minimal Range. @@ -699,6 +748,7 @@ Minimální vzdálenost. Vähimmäisalue Минимальный радиус действия. + Minimaal bereik. Is sealable? @@ -713,6 +763,7 @@ Lze utěsnit? Onko se suljettavissa? Поддается герметизации? + Is dichtbaar? ONLY WORKS IF LOGIC IS SYNCED WITH AN OBJECT! @@ -727,6 +778,7 @@ FUNGUJE POUZE POKUD JE LOGIKA SPOJENA S OBJEKTEM! TOIMII VAIN JOS LOGIIKKA SYNKRONOIDAAN OBJEKTIN KANSSA! РАБОТАЕТ ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ МОДУЛЬ СИНХРОНИЗИРОВАН С ОБЪЕКТОМ! + WERKT ALLEEN ALS LOGICA GESYNCHRONISEERD IS MET EEN OBJECT! Select Gas: @@ -741,6 +793,7 @@ Vybrat plyn: Valitse Kaasu Выберите газ: + Selecteer gas: Gas Type: @@ -755,6 +808,7 @@ Typ plynu: Kaasutyyppi Тип газа: + Gas type: diff --git a/addons/circulation/ACE_Medical_Treatment_Actions.hpp b/addons/circulation/ACE_Medical_Treatment_Actions.hpp index 17f4d5e2f..5c88d80e1 100644 --- a/addons/circulation/ACE_Medical_Treatment_Actions.hpp +++ b/addons/circulation/ACE_Medical_Treatment_Actions.hpp @@ -38,7 +38,7 @@ class ACE_Medical_Treatment_Actions { allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; allowSelfTreatment = QGVAR(enable_selfBloodDraw); category = "advanced"; - medicRequired = 0; + medicRequired = 1; consumeItem = 1; callbackSuccess = QUOTE([ARR_3(_medic,_patient,500)] call FUNC(drawBlood)); condition = QUOTE([ARR_3(_medic,_patient,500)] call FUNC(canDraw) && (!(EGVAR(pharma,RequireInsIVBloodDraw)) || EFUNC(pharma,removeIV))); @@ -54,7 +54,7 @@ class ACE_Medical_Treatment_Actions { allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; allowSelfTreatment = QGVAR(enable_selfBloodDraw); category = "advanced"; - medicRequired = 0; + medicRequired = 1; consumeItem = 1; callbackSuccess = QUOTE([ARR_3(_medic,_patient,250)] call FUNC(drawBlood)); condition = QUOTE([ARR_3(_medic,_patient,250)] call FUNC(canDraw) && (!(EGVAR(pharma,RequireInsIVBloodDraw)) || EFUNC(pharma,removeIV))); @@ -63,6 +63,14 @@ class ACE_Medical_Treatment_Actions { animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon", "kat_recoveryposition"}; }; + class DrawArterial: KAT_DrawBlood250 { + displayName = CSTRING(DrawArterial_Action_Use); + displayNameProgress = CSTRING(DrawBlood_Action_Progress); + treatmentTime = 10; + callbackSuccess = QFUNC(drawArterial); + condition = "true"; + items[] = {"kat_IV_16"}; + }; #include "Blood_Medical.hpp" diff --git a/addons/circulation/Blood_Medical.hpp b/addons/circulation/Blood_Medical.hpp index e4e6e0253..0584bf5f7 100644 --- a/addons/circulation/Blood_Medical.hpp +++ b/addons/circulation/Blood_Medical.hpp @@ -2,122 +2,122 @@ class BloodIV; class BloodIV_O: BloodIV { displayName = CSTRING(Action_BloodIV_O); items[] = {"kat_bloodIV_O"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_O_N: BloodIV { displayName = CSTRING(Action_BloodIV_O_N); items[] = {"kat_bloodIV_O_N"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_A: BloodIV { displayName = CSTRING(Action_BloodIV_A); items[] = {"kat_bloodIV_A"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_A_N: BloodIV { displayName = CSTRING(Action_BloodIV_A_N); items[] = {"kat_bloodIV_A_N"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_B: BloodIV { displayName = CSTRING(Action_BloodIV_B); items[] = {"kat_bloodIV_B"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_B_N: BloodIV { displayName = CSTRING(Action_BloodIV_B_N); items[] = {"kat_bloodIV_B_N"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_AB: BloodIV { displayName = CSTRING(Action_BloodIV_AB); items[] = {"kat_bloodIV_AB"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_AB_N: BloodIV { displayName = CSTRING(Action_BloodIV_AB_N); items[] = {"kat_bloodIV_AB_N"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 800, 12]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -800, 12]] call CBA_fnc_localEvent;"; }; class BloodIV_500; class BloodIV_O_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_O); items[] = {"kat_bloodIV_O_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_O_N_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_O_N); items[] = {"kat_bloodIV_O_N_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_A_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_A); items[] = {"kat_bloodIV_A_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_A_N_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_A_N); items[] = {"kat_bloodIV_A_N_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_B_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_B); items[] = {"kat_bloodIV_B_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_B_N_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_B_N); items[] = {"kat_bloodIV_B_N_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_AB_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_AB); items[] = {"kat_bloodIV_AB_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_AB_N_500: BloodIV_500 { displayName = CSTRING(Action_500_BloodIV_AB_N); items[] = {"kat_bloodIV_AB_N_500"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 400, 8]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -400, 8]] call CBA_fnc_localEvent;"; }; class BloodIV_250; class BloodIV_O_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_O); items[] = {"kat_bloodIV_O_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_O_N_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_O_N); items[] = {"kat_bloodIV_O_N_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_A_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_A); items[] = {"kat_bloodIV_A_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_A_N_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_A_N); items[] = {"kat_bloodIV_A_N_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_B_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_B); items[] = {"kat_bloodIV_B_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_B_N_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_B_N); items[] = {"kat_bloodIV_B_N_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_AB_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_AB); items[] = {"kat_bloodIV_AB_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; class BloodIV_AB_N_250: BloodIV_250 { displayName = CSTRING(Action_250_BloodIV_AB_N); items[] = {"kat_bloodIV_AB_N_250"}; - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, 200, 4]] call CBA_fnc_localEvent;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _usedItem] call kat_circulation_fnc_handleTreatment; ['kat_fluid', [_patient, -200, 4]] call CBA_fnc_localEvent;"; }; diff --git a/addons/circulation/CfgVehicles.hpp b/addons/circulation/CfgVehicles.hpp index 61372a570..932e1a86a 100644 --- a/addons/circulation/CfgVehicles.hpp +++ b/addons/circulation/CfgVehicles.hpp @@ -233,9 +233,134 @@ class CfgVehicles { }; }; + class LandVehicle; + class Car: LandVehicle { + class ACE_Actions { + class ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Car_F: Car {}; + class Quadbike_01_base_F: Car_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Kart_01_Base_F: Car_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Tank: LandVehicle { + class ACE_Actions { + class ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Motorcycle: LandVehicle { + class ACE_Actions { + class ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Air; + class Helicopter: Air { + class ACE_Actions { + class ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Plane: Air { + class ACE_Actions { + class ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + + class Ship; + class Ship_F: Ship { + class ACE_Actions { + class ACE_MainActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; + class Man; class CAManBase: Man { class ACE_Actions { + class ACE_MainActions { + class KAT_ApplyBloodTest { + displayName = CSTRING(Arterial_Test); + condition = "true"; + statement = "true"; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialApplyActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Head { class CheckBloodPressure {}; // Remove the ability to check blood pressure at the head }; diff --git a/addons/circulation/CfgWeapons.hpp b/addons/circulation/CfgWeapons.hpp index 7b371ed29..226b72b69 100644 --- a/addons/circulation/CfgWeapons.hpp +++ b/addons/circulation/CfgWeapons.hpp @@ -1,3 +1,19 @@ +#define KAT_bloodSample_ITEM(SAMPLEBASE,SAMPLEID) \ + class SAMPLEBASE##_##SAMPLEID: SAMPLEBASE { \ + scope = 1; \ + scopeArsenal = 0; \ + scopeCurator = 0; \ + nameID = SAMPLEID; \ + } + +#define KAT_bloodResult_ITEM(RESULTBASE,RESULTID) \ + class RESULTBASE##_##RESULTID: RESULTBASE { \ + scope = 1; \ + scopeArsenal = 0; \ + scopeCurator = 0; \ + testID = RESULTID; \ + } + class CfgWeapons { class ACE_ItemCore; class CBA_MiscItem_ItemInfo; @@ -139,4 +155,64 @@ class CfgWeapons { mass = 0.1; }; }; + class KAT_bloodSample: ACE_ItemCore { + author = "Mazinski"; + scope = 0; + displayName = CSTRING(sampleItemName); + model = "\A3\Structures_F_EPA\Items\Medical\Defibrillator_F.p3d"; + picture = QPATHTOF(ui\bloodIV_empty_ca.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 0; + }; + }; + class KAT_bloodResult: ACE_ItemCore { + author = "Mazinski"; + scope = 0; + displayName = CSTRING(resultItemName); + model = "\A3\Structures_F_EPA\Items\Medical\Defibrillator_F.p3d"; + picture = QPATHTOF(ui\bloodIV_empty_ca.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 0; + }; + }; + KAT_bloodSample_ITEM(KAT_bloodSample,1); + KAT_bloodSample_ITEM(KAT_bloodSample,2); + KAT_bloodSample_ITEM(KAT_bloodSample,3); + KAT_bloodSample_ITEM(KAT_bloodSample,4); + KAT_bloodSample_ITEM(KAT_bloodSample,5); + KAT_bloodSample_ITEM(KAT_bloodSample,6); + KAT_bloodSample_ITEM(KAT_bloodSample,7); + KAT_bloodSample_ITEM(KAT_bloodSample,8); + KAT_bloodSample_ITEM(KAT_bloodSample,9); + KAT_bloodSample_ITEM(KAT_bloodSample,10); + KAT_bloodSample_ITEM(KAT_bloodSample,11); + KAT_bloodSample_ITEM(KAT_bloodSample,12); + KAT_bloodSample_ITEM(KAT_bloodSample,13); + KAT_bloodSample_ITEM(KAT_bloodSample,14); + KAT_bloodSample_ITEM(KAT_bloodSample,15); + KAT_bloodSample_ITEM(KAT_bloodSample,16); + KAT_bloodSample_ITEM(KAT_bloodSample,17); + KAT_bloodSample_ITEM(KAT_bloodSample,18); + KAT_bloodSample_ITEM(KAT_bloodSample,19); + KAT_bloodSample_ITEM(KAT_bloodSample,20); + KAT_bloodResult_ITEM(KAT_bloodResult,1); + KAT_bloodResult_ITEM(KAT_bloodResult,2); + KAT_bloodResult_ITEM(KAT_bloodResult,3); + KAT_bloodResult_ITEM(KAT_bloodResult,4); + KAT_bloodResult_ITEM(KAT_bloodResult,5); + KAT_bloodResult_ITEM(KAT_bloodResult,6); + KAT_bloodResult_ITEM(KAT_bloodResult,7); + KAT_bloodResult_ITEM(KAT_bloodResult,8); + KAT_bloodResult_ITEM(KAT_bloodResult,9); + KAT_bloodResult_ITEM(KAT_bloodResult,10); + KAT_bloodResult_ITEM(KAT_bloodResult,11); + KAT_bloodResult_ITEM(KAT_bloodResult,12); + KAT_bloodResult_ITEM(KAT_bloodResult,13); + KAT_bloodResult_ITEM(KAT_bloodResult,14); + KAT_bloodResult_ITEM(KAT_bloodResult,15); + KAT_bloodResult_ITEM(KAT_bloodResult,16); + KAT_bloodResult_ITEM(KAT_bloodResult,17); + KAT_bloodResult_ITEM(KAT_bloodResult,18); + KAT_bloodResult_ITEM(KAT_bloodResult,19); + KAT_bloodResult_ITEM(KAT_bloodResult,20); }; diff --git a/addons/circulation/XEH_PREP.hpp b/addons/circulation/XEH_PREP.hpp index 530966fc7..a207e6fc7 100644 --- a/addons/circulation/XEH_PREP.hpp +++ b/addons/circulation/XEH_PREP.hpp @@ -1,3 +1,5 @@ +PREP(addArterialApplyActions); +PREP(addArterialTestActions); PREP(addDefibrillatorActions); PREP(AED_Analyze); PREP(AED_Charge); @@ -11,6 +13,7 @@ PREP(AEDX_ViewMonitor); PREP(AEDX_VitalsMonitor_CheckCondition); PREP(AEDX_VitalsMonitor); PREP(AEDXPlaced_VitalsMonitor_SetVolume); +PREP(attachBloodGas); PREP(bloodType); PREP(bloodTypeLog); PREP(canDraw); @@ -25,6 +28,7 @@ PREP(Defibrillator_Pads_CheckCondition); PREP(Defibrillator_RemovePads); PREP(DefibrillatorPlaced_CheckCondition); PREP(drawBlood); +PREP(drawArterial); PREP(fullHealLocal); PREP(generateBloodType); PREP(getBloodPressure); @@ -39,6 +43,7 @@ PREP(onCloseDialog); PREP(placeAED_PickUpAction); PREP(placeAED); PREP(removeLog); +PREP(showBloodGas); PREP(treatmentAdvanced_IV); PREP(updateBloodPressureChange); PREP(updateHeartRate); diff --git a/addons/circulation/XEH_preInit.sqf b/addons/circulation/XEH_preInit.sqf index 0f5bf2ebe..e4971657e 100644 --- a/addons/circulation/XEH_preInit.sqf +++ b/addons/circulation/XEH_preInit.sqf @@ -6,6 +6,16 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +if (isServer) then { + private _sampleMap = createHashMap; + missionNamespace setVariable [QGVAR(bloodSampleMap), _sampleMap]; + missionNamespace setVariable [QGVAR(sampleCounter), 0]; + + private _resultSampleMap = createHashMap; + missionNamespace setVariable [QGVAR(resultSampleMap), _resultSampleMap]; + missionNamespace setVariable [QGVAR(resultCounter), 0]; +}; + #define CBA_SETTINGS_CAT "KAT - ADV Medical: Circulation" [ diff --git a/addons/circulation/defines.hpp b/addons/circulation/defines.hpp index 4e454f1d4..af16c3936 100644 --- a/addons/circulation/defines.hpp +++ b/addons/circulation/defines.hpp @@ -1,8 +1,8 @@ // UI stuff -#define KAT_GUI_GRID_W (safezoneW * 0.55) +#define KAT_GUI_GRID_W (safeZoneW * 0.55) #define KAT_GUI_GRID_H (KAT_GUI_GRID_W * 4/3) -#define KAT_GUI_GRID_X (safezoneX + (safezoneW - KAT_GUI_GRID_W) / 2) -#define KAT_GUI_GRID_Y (safezoneY + (safezoneH - KAT_GUI_GRID_H) / 2) +#define KAT_GUI_GRID_X (safeZoneX + (safeZoneW - KAT_GUI_GRID_W) / 2) +#define KAT_GUI_GRID_Y (safeZoneY + (safeZoneH - KAT_GUI_GRID_H) / 2) #define KAT_pxToScreen_X(X) (X / 2048 * KAT_GUI_GRID_W + KAT_GUI_GRID_X) #define KAT_pxToScreen_Y(X) (X / 2048 * KAT_GUI_GRID_H + KAT_GUI_GRID_Y) diff --git a/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf b/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf index fb6aaa380..620cf416c 100644 --- a/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf +++ b/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf @@ -277,7 +277,7 @@ GVAR(PulseRateReady) = true; if (HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget),_partIndex)) then { _bp = [0,0]; } else { - _spO2 = GVAR(AEDX_MonitorTarget) getVariable [QEGVAR(breathing,airwayStatus), 100]; + _spO2 = GET_SPO2(GVAR(AEDX_MonitorTarget)); _pr = GVAR(AEDX_MonitorTarget) getVariable [QACEGVAR(medical,heartRate), 0]; }; diff --git a/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf b/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf index c0386abf5..363ae599d 100644 --- a/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf +++ b/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf @@ -92,21 +92,21 @@ if (_patient getVariable ["kat_AEDXPatient_PFH", -1] isEqualTo -1) then { _bp = [0,0]; _pr = 0; } else { - _spO2 = _patient getVariable [QEGVAR(breathing,airwayStatus), 100]; + _spO2 = GET_SPO2(_patient); - _etco2 = _patient call EFUNC(breathing,getETCo2); - _breathrate = _patient call EFUNC(breathing,getRespiratoryRate); + _etco2 = GET_ETCO2(_patient); + _breathrate = GET_BREATHING_RATE(_patient); }; // List vitals depending on if AED pads and vitals monitoring (pressure cuff + pulse oximeter) is connected if (_patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false] && _patient getVariable [QGVAR(DefibrillatorPads_Connected), false]) then { // heart rate, systolic / diastolic, spO2, etco2, respiratory rate - [_patient, "quick_view", LSTRING(VitalsMonitor_StatusLog)+_hasEtco2Monitor, [round(_hr), round(_bp select 1), round(_bp select 0), round(_spO2), _etco2, round(_breathrate)]] call ACEFUNC(medical_treatment,addToLog); + [_patient, "quick_view", LSTRING(VitalsMonitor_StatusLog)+_hasEtco2Monitor, [round(_hr), round(_bp select 1), round(_bp select 0), round(_spO2), round(_etco2), round(_breathrate)]] call ACEFUNC(medical_treatment,addToLog); } else { if (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false]) then { - [_patient, "quick_view", LSTRING(VitalsMonitor_VMInactive_StatusLog)+_hasEtco2Monitor, [round(_hr), _etco2, round(_breathrate)]] call ACEFUNC(medical_treatment,addToLog); + [_patient, "quick_view", LSTRING(VitalsMonitor_VMInactive_StatusLog)+_hasEtco2Monitor, [round(_hr), round(_etco2), round(_breathrate)]] call ACEFUNC(medical_treatment,addToLog); } else { - [_patient, "quick_view", LSTRING(VitalsMonitor_VMActive_StatusLog)+_hasEtco2Monitor, [round(_pr), round(_bp select 1), round(_bp select 0), round(_spO2), _etco2, round(_breathrate)]] call ACEFUNC(medical_treatment,addToLog); + [_patient, "quick_view", LSTRING(VitalsMonitor_VMActive_StatusLog)+_hasEtco2Monitor, [round(_pr), round(_bp select 1), round(_bp select 0), round(_spO2), round(_etco2), round(_breathrate)]] call ACEFUNC(medical_treatment,addToLog); }; }; @@ -157,10 +157,10 @@ if (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false] && {((_pati private _delay = 1.46; // standard on no heartrate delay if (_hr <= 0) then { - playsound3D [QPATHTOF_SOUND(sounds\noheartrate.wav), _soundSource, false, getPosASL _soundSource, 2, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\noheartrate.wav), _soundSource, false, getPosASL _soundSource, 2, 1, 15]; } else { _delay = 60 / _hr; - playsound3D [QPATHTOF_SOUND(sounds\heartrate.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\heartrate.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; }; [{ params ["_patient"]; @@ -212,7 +212,7 @@ if (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false] && {((_pati if (alive _patient && (_cardiacState in [0,2] || (_cardiacState isEqualTo 4 && !(GVAR(analyzeDelay))))) then { GVAR(AEDBeepPlaying) = true; private _delay = 60 / _hr; - playsound3D [QPATHTOF_SOUND(sounds\heartrate_AED.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\heartrate_AED.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; [{ params ["_patient"]; @@ -225,10 +225,10 @@ if (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false] && {((_pati GVAR(AEDBeepPlaying) = true; private _delayAEDBeepPlaying = 1.835; if (!(GVAR(playedAudio))) then { - playsound3D [QPATHTOF_SOUND(sounds\checkpatient.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\checkpatient.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; GVAR(playedAudio) = true; } else { - playsound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; _delayAEDBeepPlaying = 0.526; }; [{ @@ -243,7 +243,7 @@ if (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false] && {((_pati if (_hr > 0) then { private _delay = 60 / _hr; - playsound3D [QPATHTOF_SOUND(sounds\heartrate_AED.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\heartrate_AED.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; [{ params ["_patient"]; @@ -254,10 +254,10 @@ if (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false] && {((_pati private _delayAEDBeepPlaying = 1.835; if (!(GVAR(playedAudio))) then { - playsound3D [QPATHTOF_SOUND(sounds\checkpatient.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\checkpatient.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; GVAR(playedAudio) = true; } else { - playsound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; _delayAEDBeepPlaying = 0.526; }; [{ @@ -291,7 +291,7 @@ if (_patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false] && {(_pat if (_patient getVariable [QGVAR(DefibrillatorInUse), false] || !(_patient getVariable [QGVAR(AED_X_VitalsMonitor_VolumePatient), false])) then { } else { private _hr = _patient getVariable [QACEGVAR(medical,heartRate), 80]; - private _spO2 = _patient getVariable [QEGVAR(breathing,airwayStatus), 100]; + private _spO2 = GET_SPO2(_patient); if (_spO2 < GVAR(AED_X_Monitor_SpO2Warning) || _tourniquetApplied) then { playSound3D [QPATHTOF_SOUND(sounds\spo2warning.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; }; diff --git a/addons/circulation/functions/fnc_AED_Analyze.sqf b/addons/circulation/functions/fnc_AED_Analyze.sqf index daeb3fb06..64a1173dd 100644 --- a/addons/circulation/functions/fnc_AED_Analyze.sqf +++ b/addons/circulation/functions/fnc_AED_Analyze.sqf @@ -34,7 +34,7 @@ _patient setVariable [QGVAR(RhythmAnalyzed), false, true]; // Analyze rhythm -playsound3D [QPATHTOF_SOUND(sounds\analyzingnow.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; +playSound3D [QPATHTOF_SOUND(sounds\analyzingnow.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; [{ // Don't touch patient while analyzing params ["_medic", "_patient"]; @@ -44,11 +44,11 @@ playsound3D [QPATHTOF_SOUND(sounds\analyzingnow.wav), _soundSource, false, getPo { // Motion detected params ["_medic", "_patient", "_defibrillatorType", "_soundSource"]; - playsound3D [QPATHTOF_SOUND(sounds\stopmotion.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\stopmotion.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; [{ params ["_medic", "_patient", "_defibrillatorType", "_soundSource"]; if (!(isNull (_patient getVariable [QACEGVAR(medical,CPR_provider), objNull])) || _patient getVariable [QGVAR(BVMInUse), false] || _patient call ACEFUNC(common,isAwake)) exitWith { // Motion persists, analyzing cancelled - playsound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; _patient setVariable [QGVAR(DefibrillatorInUse), false, true]; }; [_medic, _patient, _defibrillatorType] call FUNC(AED_Analyze); @@ -63,26 +63,26 @@ playsound3D [QPATHTOF_SOUND(sounds\analyzingnow.wav), _soundSource, false, getPo if (GVAR(AdvRhythm)) then { if (_patient getVariable [QGVAR(cardiacArrestType), 0] > 2) then { // shock advised - playsound3D [QPATHTOF_SOUND(sounds\shockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\shockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; [{ // If shock advised begin to charge params ["_medic", "_patient", "_defibrillatorType", "_soundSource"]; [_medic, _patient, _soundSource, _defibrillatorType] call FUNC(AED_Charge); }, [_medic, _patient, _defibrillatorType, _soundSource], 1.7] call CBA_fnc_waitAndExecute; } else { // no shock advised - playsound3D [QPATHTOF_SOUND(sounds\noshockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\noshockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; _patient setVariable [QGVAR(DefibrillatorInUse), false, true]; }; } else { // If advanced rhythms are disabled just check if patient is in cardiac arrest if (_patient getVariable [QACEGVAR(medical,heartRate), 0] isEqualTo 0) then { - playsound3D [QPATHTOF_SOUND(sounds\shockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\shockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; [{ // If shock advised begin to charge params ["_medic", "_patient", "_defibrillatorType", "_soundSource"]; [_medic, _patient, _soundSource, _defibrillatorType] call FUNC(AED_Charge); }, [_medic, _patient, _defibrillatorType, _soundSource], 1.7] call CBA_fnc_waitAndExecute; } else { - playsound3D [QPATHTOF_SOUND(sounds\noshockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\noshockadvised.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; _patient setVariable [QGVAR(DefibrillatorInUse), false, true]; }; }; diff --git a/addons/circulation/functions/fnc_AED_Charge.sqf b/addons/circulation/functions/fnc_AED_Charge.sqf index ef73ede01..87fef05b8 100644 --- a/addons/circulation/functions/fnc_AED_Charge.sqf +++ b/addons/circulation/functions/fnc_AED_Charge.sqf @@ -20,11 +20,11 @@ params ["_medic", "_patient", "_soundSource", "_defibType"]; -playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; +playSound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; [{ // Charged params ["_medic", "_patient", "_soundSource", "_defibType"]; - playsound3D [QPATHTOF_SOUND(sounds\standclear_pushtoshock.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\standclear_pushtoshock.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; [{ // Ready to shock params ["_medic", "_patient", "_soundSource", "_defibType"]; @@ -40,16 +40,16 @@ playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL if (_patient getVariable [QGVAR(DefibrillatorInUse), false]) then { // Shock administered [_medic, _patient, _defibType] call FUNC(AED_Shock); - playsound3D [QPATHTOF_SOUND(sounds\bump.wav), _patient, false, getPosASL _patient, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\bump.wav), _patient, false, getPosASL _patient, 6, 1, 15]; [{ // Prompt to analyze again params ["_soundSource"]; if (_patient getVariable [QGVAR(DefibrillatorInUse), false] || _patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) exitWith {}; - playsound3D [QPATHTOF_SOUND(sounds\pushanalyze.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\pushanalyze.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; }, [_soundSource], 2] call CBA_fnc_waitAndExecute; } else { // Defibrillator disarmed - playsound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; }; }, [_medic, _patient, _soundSource, _defibType], @@ -61,7 +61,7 @@ playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL [{ // Defibrillator disarmed params ["_patient", "_soundSource"]; - playsound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; _patient setVariable [QGVAR(DefibrillatorInUse), false, true]; }, [_patient, _soundSource], 0.5] call CBA_fnc_waitAndExecute; }] call CBA_fnc_waitUntilAndExecute; @@ -74,7 +74,7 @@ playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL [_idPFH] call CBA_fnc_removePerFrameHandler; }; - playsound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; }, 0.528, [_medic, _patient, _soundSource]] call CBA_fnc_addPerFrameHandler; }, [_medic, _patient, _soundSource, _defibType], 1.3] call CBA_fnc_waitAndExecute; diff --git a/addons/circulation/functions/fnc_Defibrillator_AttachPads.sqf b/addons/circulation/functions/fnc_Defibrillator_AttachPads.sqf index 6b679cdb5..99a335e7d 100644 --- a/addons/circulation/functions/fnc_Defibrillator_AttachPads.sqf +++ b/addons/circulation/functions/fnc_Defibrillator_AttachPads.sqf @@ -139,7 +139,7 @@ if !(_noLog) then { [{ // Prompt to analyze after placing pads (AED) params ["_soundSource"]; - playsound3D [QPATHTOF_SOUND(sounds\pushanalyze.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\pushanalyze.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; }, [_soundSource], 1] call CBA_fnc_waitAndExecute; }; diff --git a/addons/circulation/functions/fnc_Defibrillator_ManualCharge.sqf b/addons/circulation/functions/fnc_Defibrillator_ManualCharge.sqf index 3fcd9b3d0..3c8084558 100644 --- a/addons/circulation/functions/fnc_Defibrillator_ManualCharge.sqf +++ b/addons/circulation/functions/fnc_Defibrillator_ManualCharge.sqf @@ -30,7 +30,7 @@ switch (_defibProvider select 1) do { _patient setVariable [QGVAR(DefibrillatorInUse), true, true]; -playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; +playSound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; [{ // Charged params ["_medic", "_patient", "_soundSource"]; @@ -46,9 +46,9 @@ playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL if (_patient getVariable [QGVAR(DefibrillatorInUse), false]) then { // Shock administered [_medic, _patient, "AEDX"] call FUNC(AED_Shock); - playsound3D [QPATHTOF_SOUND(sounds\bump.wav), _patient, false, getPosASL _patient, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\bump.wav), _patient, false, getPosASL _patient, 6, 1, 15]; } else { // Defibrillator disarmed - playsound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; }; }, [_medic, _patient, _soundSource], @@ -60,7 +60,7 @@ playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL [{ // Defibrillator disarmed params ["_soundSource", "_patient"]; - playsound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\3beep.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; _patient setVariable [QGVAR(DefibrillatorInUse), false, true]; }, [_soundSource, _patient], 0.5] call CBA_fnc_waitAndExecute; }] call CBA_fnc_waitUntilAndExecute; @@ -73,7 +73,7 @@ playsound3D [QPATHTOF_SOUND(sounds\charging.wav), _soundSource, false, getPosASL [_idPFH] call CBA_fnc_removePerFrameHandler; }; - playsound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; + playSound3D [QPATHTOF_SOUND(sounds\alarm.wav), _soundSource, false, getPosASL _soundSource, 6, 1, 15]; }, 0.528, [_medic, _patient, _soundSource]] call CBA_fnc_addPerFrameHandler; }, [_medic, _patient, _soundSource], 4.1] call CBA_fnc_waitAndExecute; diff --git a/addons/circulation/functions/fnc_addArterialApplyActions.sqf b/addons/circulation/functions/fnc_addArterialApplyActions.sqf new file mode 100644 index 000000000..2e469d019 --- /dev/null +++ b/addons/circulation/functions/fnc_addArterialApplyActions.sqf @@ -0,0 +1,57 @@ +#include "..\script_component.hpp" +/* + * Author: SzwedzikPL, mharis001 + * Modified: Mazinski + * Apply arterial blood gas test to patient. + * + * Arguments: + * 0: Patient + * 1: Medic + * + * Return Value: + * Ace actions + * + * Example: + * [patient, medic] call kat_circulation_fnc_addArterialApplyActions; + * + * Public: No + */ + +params ["_target", "_player"]; + +private _fnc_getActions = { + private _actions = []; + private _cfgWeapons = configFile >> "CfgWeapons"; + private _idNumber = 0; + + { + private _config = _cfgWeapons >> _x; + _idNumber = getNumber (_config >> "testID"); + + if (_idNumber > 0) then { + private _resultSampleMap = missionNamespace getVariable [QEGVAR(circulation,resultSampleMap), []]; + _resultSampleMap = _resultSampleMap get _idNumber; + _resultSampleMap = _resultSampleMap select 1; + private _patient = _resultSampleMap select 0; + + _actions pushBack [ + [ + _x, + format [LLSTRING(Apply_Arterial_Test), _patient], + "", + {_this call FUNC(attachBloodGas)}, + {true}, + {}, + [] + ] call ACEFUNC(interact_menu,createAction), + [], + [_resultSampleMap, _target, _idNumber, _player] + ]; + }; + } forEach ([_player, 0] call ACEFUNC(common,uniqueItems)); + + _actions +}; + + +[[], _fnc_getActions, _player, QGVAR(actionsCache), 9999, "cba_events_loadoutEvent"] call ACEFUNC(common,cachedCall); \ No newline at end of file diff --git a/addons/circulation/functions/fnc_addArterialTestActions.sqf b/addons/circulation/functions/fnc_addArterialTestActions.sqf new file mode 100644 index 000000000..2631a67d9 --- /dev/null +++ b/addons/circulation/functions/fnc_addArterialTestActions.sqf @@ -0,0 +1,59 @@ +#include "..\script_component.hpp" +/* + * Author: SzwedzikPL, mharis001 + * Modified: Mazinski + * Add arterial blood gas test action to vehicle. + * + * Arguments: + * 0: Vehicle + * 1: Medic + * + * Return Value: + * Ace actions + * + * Example: + * [vehicle, medic] call kat_circulation_fnc_addArterialTestActions; + * + * Public: No + */ + +params ["_vehicle", "_player"]; + +private _fnc_getActions = { + private _actions = []; + private _cfgWeapons = configFile >> "CfgWeapons"; + private _idNumber = 0; + + { + private _config = _cfgWeapons >> _x; + _idNumber = getNumber (_config >> "nameID"); + + if (_idNumber > 0) then { + private _bloodSampleArray = missionNamespace getVariable [QEGVAR(circulation,bloodSampleMap), []]; + _bloodSampleArray = _bloodSampleArray get _idNumber; + private _patient = _bloodSampleArray select 0; + + _actions pushBack [ + [ + _x, + format [LLSTRING(Blood_Sample_String), _patient], + "", + {_this call FUNC(showBloodGas)}, + {true}, + {}, + [], + {[0, 0, 0]}, + 2, + [false,false,false,false,false] + ] call ACEFUNC(interact_menu,createAction), + [], + [_bloodSampleArray, _player, _idNumber, _vehicle] + ]; + }; + } forEach ([_vehicle, 0] call ACEFUNC(common,uniqueItems)); + + _actions +}; + + +[[], _fnc_getActions, _player, QGVAR(actionsCache), 9999, "cba_events_loadoutEvent"] call ACEFUNC(common,cachedCall); \ No newline at end of file diff --git a/addons/circulation/functions/fnc_attachBloodGas.sqf b/addons/circulation/functions/fnc_attachBloodGas.sqf new file mode 100644 index 000000000..cb974d473 --- /dev/null +++ b/addons/circulation/functions/fnc_attachBloodGas.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Attaches ABG test to patient + * + * Arguments: + * 0: Array + * + * Return Value: + * None + * + * Example: + * [[[40,90,0.96,24,7.4,37], "Patient"], patient] call kat_circulation_fnc_attachBloodGas; + * + * Public: No + */ +params ["_entries"]; +_entries params ["_bloodGas", "_patient", "_idNumber", "_player"]; +_bloodGas params ["_patientName", "_bloodGasArray"]; + +_patient setVariable [QGVAR(testedBloodGas), _bloodGasArray, true]; + +_player removeItem (format ["KAT_bloodResult_%1",_idNumber]); \ No newline at end of file diff --git a/addons/circulation/functions/fnc_canDraw.sqf b/addons/circulation/functions/fnc_canDraw.sqf index 48c74987c..be156c753 100644 --- a/addons/circulation/functions/fnc_canDraw.sqf +++ b/addons/circulation/functions/fnc_canDraw.sqf @@ -20,7 +20,7 @@ params ["_medic", "_patient", "_volume"]; private _bagItem = format ["ACE_bloodIV_%1", _volume]; -private _bloodVolume = (_patient getVariable [QACEGVAR(medical,bloodVolume), 6.0]); -private _volumeChange = _volume/1000; +private _bloodVolume = GET_BLOOD_VOLUME_LITERS(_patient); +private _volumeChange = _volume/ML_TO_LITERS; if (((_bloodVolume - _volumeChange) > GVAR(blood_draw_limit))) exitWith {true}; false diff --git a/addons/circulation/functions/fnc_cprLocal.sqf b/addons/circulation/functions/fnc_cprLocal.sqf index 4a0a2ab02..8d2871964 100644 --- a/addons/circulation/functions/fnc_cprLocal.sqf +++ b/addons/circulation/functions/fnc_cprLocal.sqf @@ -75,6 +75,10 @@ private _fnc_advRhythm = { { _epiBoost = 1.5; }; + case "EpinephrineIV": + { + _epiBoost = 1.5; + }; case "Amiodarone": { _amiBoost = _amiBoost + (random [8,14,20]); @@ -91,24 +95,24 @@ switch (_reviveObject) do { if (GVAR(enable_CPR_Chances)) then { switch (_medic getVariable [QACEGVAR(medical,medicClass),0]) do { case 0: { - _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME(_patient), GVAR(CPR_MinChance_Default), GVAR(CPR_MaxChance_Default), true]; + _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME_LITERS(_patient), GVAR(CPR_MinChance_Default), GVAR(CPR_MaxChance_Default), true]; }; case 1: { - _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME(_patient), GVAR(CPR_MinChance_RegularMedic), GVAR(CPR_MaxChance_RegularMedic), true]; + _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME_LITERS(_patient), GVAR(CPR_MinChance_RegularMedic), GVAR(CPR_MaxChance_RegularMedic), true]; }; case 2: { - _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME(_patient), GVAR(CPR_MinChance_Doctor), GVAR(CPR_MaxChance_Doctor), true]; + _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME_LITERS(_patient), GVAR(CPR_MinChance_Doctor), GVAR(CPR_MaxChance_Doctor), true]; }; }; }; }; case "AED": { [_patient, "activity", LSTRING(Activity_Shock), [[_medic, false, true] call ACEFUNC(common,getName), "AED"]] call ACEFUNC(medical_treatment,addToLog); - _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME(_patient), GVAR(AED_MinChance), GVAR(AED_MaxChance), true]; + _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME_LITERS(_patient), GVAR(AED_MinChance), GVAR(AED_MaxChance), true]; }; case "AEDX": { [_patient, "activity", LSTRING(Activity_Shock), [[_medic, false, true] call ACEFUNC(common,getName), "AED-X"]] call ACEFUNC(medical_treatment,addToLog); - _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME(_patient), GVAR(AED_X_MinChance), GVAR(AED_X_MaxChance), true]; + _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME_LITERS(_patient), GVAR(AED_X_MinChance), GVAR(AED_X_MaxChance), true]; }; }; @@ -138,7 +142,7 @@ if (_reviveObject in ["AED", "AEDX"]) exitWith { if !(GVAR(enable_CPR_Chances)) then { private _min = ACEGVAR(medical_treatment,cprSuccessChanceMin); private _max = ACEGVAR(medical_treatment,cprSuccessChanceMax); - _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME(_patient), _min, _max, true]; + _chance = linearConversion [BLOOD_VOLUME_CLASS_4_HEMORRHAGE, BLOOD_VOLUME_CLASS_2_HEMORRHAGE, GET_BLOOD_VOLUME_LITERS(_patient), _min, _max, true]; // ACE Medical settings are percentages (decimals, 0 <= x <= 1) instead of integers if ((random 1) <= _chance) then { diff --git a/addons/circulation/functions/fnc_drawArterial.sqf b/addons/circulation/functions/fnc_drawArterial.sqf new file mode 100644 index 000000000..81c5c3b4f --- /dev/null +++ b/addons/circulation/functions/fnc_drawArterial.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" +/* + * Author: Battlekeeper, modified by YetheSamartaka, Mazinski + * Refactored by Slatery + * Handles drawing of arterial blood + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [medic, patient] call kat_circulation_fnc_drawArterial; + * + * Public: No + */ + +params ["_medic", "_patient"]; + +private _bloodGas = GET_BLOOD_GAS(_patient); + +private _sampleCounter = missionNamespace getVariable [QEGVAR(circulation,sampleCounter), 0]; +private _bloodSampleMap = missionNamespace getVariable [QEGVAR(circulation,bloodSampleMap), []]; + +_sampleCounter = [_sampleCounter +1, 1] select (_sampleCounter == 20); +missionNamespace setVariable [QEGVAR(circulation,sampleCounter), _sampleCounter, true]; + +_bloodSampleMap set [_sampleCounter, [name(_patient), _bloodGas]]; +missionNamespace setVariable [QEGVAR(circulation,bloodSampleMap), _bloodSampleMap, true]; + +private _itemStr = format ["KAT_bloodSample_%1", _sampleCounter]; + +[_medic, _itemStr, true] call CBA_fnc_addItem; \ No newline at end of file diff --git a/addons/circulation/functions/fnc_drawBlood.sqf b/addons/circulation/functions/fnc_drawBlood.sqf index 2c2e2c66a..1be0c6940 100644 --- a/addons/circulation/functions/fnc_drawBlood.sqf +++ b/addons/circulation/functions/fnc_drawBlood.sqf @@ -23,8 +23,7 @@ params ["_medic", "_patient", "_volume"]; private _modStr = "ACE_"; private _bloodtypeStr = ""; private _bagVolumeStr = format ["_%1",_volume]; -private _volumeChange = _volume/1000; -private _bloodVolume = (_patient getVariable [QACEGVAR(medical,bloodVolume), 6.0]); + if (GVAR(bloodGroups)) then { _modStr = "kat_"; _bloodtype = [_patient] call FUNC(bloodType); @@ -32,4 +31,5 @@ if (GVAR(bloodGroups)) then { }; private _itemStr = format ["%1bloodIV%2%3",_modStr,_bloodtypeStr,_bagVolumeStr]; [_medic, _itemStr] call ACEFUNC(common,addToInventory); -_patient setVariable [QACEGVAR(medical,bloodVolume), _bloodVolume - _volumeChange,true]; + +REDUCE_TOTAL_BLOOD_VOLUME(_patient,_volume); \ No newline at end of file diff --git a/addons/circulation/functions/fnc_fullHealLocal.sqf b/addons/circulation/functions/fnc_fullHealLocal.sqf index cc1efb5b4..6eaf3a2e4 100644 --- a/addons/circulation/functions/fnc_fullHealLocal.sqf +++ b/addons/circulation/functions/fnc_fullHealLocal.sqf @@ -24,10 +24,21 @@ _patient setVariable [QGVAR(cardiacArrestType), 0, true]; _patient setVariable [VAR_BLOODPRESSURE_CHANGE, nil, true]; +_patient setVariable [QGVAR(bodyFluid), DEFAULT_BODY_FLUID]; + _patient setVariable [QGVAR(isPerformingCPR), false, true]; _patient setVariable [QGVAR(OxygenationPeriod), 0, true]; +_patient setVariable [QGVAR(tourniquetTime), [0,0,0,0,0,0]]; + +// PaCO2, PaO2, O2 Sat, HCO3, pH, ETCO2 +_patient setVariable [QGVAR(bloodGas), DEFAULT_BLOOD_GAS, true]; +_patient setVariable [QGVAR(testedBloodGas), [0,0,0,0,0,0], true]; + +_patient setVariable [QGVAR(ABGmenuShow), false]; + _patient setVariable [QGVAR(ht), [], true]; _patient setVariable [QGVAR(effusion), 0, true]; [_patient, true] call FUNC(updateInternalBleeding); + diff --git a/addons/circulation/functions/fnc_handleCardiacArrest.sqf b/addons/circulation/functions/fnc_handleCardiacArrest.sqf index 92b4c38c6..307b12e01 100644 --- a/addons/circulation/functions/fnc_handleCardiacArrest.sqf +++ b/addons/circulation/functions/fnc_handleCardiacArrest.sqf @@ -39,7 +39,7 @@ if ((_unit getVariable [QGVAR(cardiacArrestType), 0] != 0) && _initial) then { if (_initial) then { if !(_active) exitWith {}; - if (_unit getVariable [QACEGVAR(medical,bloodVolume), 6.0] < GVAR(AdvRhythm_asystoleBloodlossThreshold)) then { + if (GET_BLOOD_VOLUME_LITERS(_unit) < GVAR(AdvRhythm_asystoleBloodlossThreshold)) then { if (floor (random 100) < GVAR(AdvRhythm_PEAChance)) then { _cardiacArrestType = 2; } else { @@ -76,7 +76,7 @@ if (GVAR(AdvRhythm_canDeteriorate)) then { [{ params ["_unit"]; - _unit getVariable [QACEGVAR(medical,bloodVolume), 6.0] < GVAR(AdvRhythm_asystoleBloodlossThreshold) && _unit getVariable [QGVAR(cardiacArrestType), 0] > 2 + GET_BLOOD_VOLUME_LITERS(_unit) < GVAR(AdvRhythm_asystoleBloodlossThreshold) && _unit getVariable [QGVAR(cardiacArrestType), 0] > 2 }, { params ["_unit"]; @@ -115,7 +115,7 @@ if (GVAR(AdvRhythm_canDeteriorate)) then { [{ params ["_unit"]; - _unit getVariable [QACEGVAR(medical,bloodVolume), 6.0] < GVAR(AdvRhythm_asystoleBloodlossThreshold) && _unit getVariable [QGVAR(cardiacArrestType), 0] > 2 + GET_BLOOD_VOLUME_LITERS(_unit) < GVAR(AdvRhythm_asystoleBloodlossThreshold) && _unit getVariable [QGVAR(cardiacArrestType), 0] > 2 }, { // If past asystole bloodloss threshold params ["_unit"]; diff --git a/addons/circulation/functions/fnc_showBloodGas.sqf b/addons/circulation/functions/fnc_showBloodGas.sqf new file mode 100644 index 000000000..d683e904b --- /dev/null +++ b/addons/circulation/functions/fnc_showBloodGas.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks patient temperature + * + * Arguments: + * 0: Array + * + * Return Value: + * None + * + * Example: + * [[[40,90,0.96,24,7.4,37], "Patient"], patient] call kat_circulation_fnc_showBloodGas; + * + * Public: No + */ +params ["_entries"]; +_entries params ["_bloodGas", "_player", "_idNumber", "_vehicle"]; +_bloodGas params ["_patientName", "_bloodGasArray"]; +_bloodGasArray params ["_paCO2", "_paO2", "_spO2", "_hCO3", "_pH", "_etCO2"]; + +private _output = format ["Patient: %1, PaCO2: %2, PaO2: %3, SpO2: %4, HCO3: %5, pH: %6", _patientName, _paCO2 toFixed 2, _paO2 toFixed 2, _spO2 toFixed 2, _hCO3 toFixed 2, _pH toFixed 2]; +[_output, 3, _player] call ACEFUNC(common,displayTextStructured); + +private _resultCounter = missionNamespace getVariable [QEGVAR(circulation,resultCounter), 0]; +private _resultSampleMap = missionNamespace getVariable [QEGVAR(circulation,resultSampleMap), []]; + +_resultCounter = [_resultCounter +1, 1] select (_resultCounter == 20); +missionNamespace setVariable [QEGVAR(circulation,resultCounter), _resultCounter, true]; + +_resultSampleMap set [_resultCounter, [name(_patient), _bloodGas]]; +missionNamespace setVariable [QEGVAR(circulation,resultSampleMap), _resultSampleMap, true]; + +private _itemStr = format ["KAT_bloodResult_%1", _resultCounter]; + +[_vehicle, (format ["KAT_bloodSample_%1",_idNumber])] call CBA_fnc_removeItemCargo; +[_player, _itemStr, true] call CBA_fnc_addItem; \ No newline at end of file diff --git a/addons/circulation/functions/fnc_updateBloodPressureChange.sqf b/addons/circulation/functions/fnc_updateBloodPressureChange.sqf index 3d894e96a..82eb24419 100644 --- a/addons/circulation/functions/fnc_updateBloodPressureChange.sqf +++ b/addons/circulation/functions/fnc_updateBloodPressureChange.sqf @@ -22,7 +22,7 @@ params ["_unit", "_systolicChange", "_diastolicChange", "_id", ["_overwrite", fa private _BPChange = _unit getVariable [VAR_BLOODPRESSURE_CHANGE, []]; -private _arrRow = _BPChange findif {(_x select 2) isEqualTo _id}; +private _arrRow = _BPChange findIf {(_x select 2) isEqualTo _id}; if (_arrRow != -1) exitWith { if (_systolicChange isEqualTo 0 && _diastolicChange isEqualTo 0) then { diff --git a/addons/circulation/functions/fnc_updateHeartRate.sqf b/addons/circulation/functions/fnc_updateHeartRate.sqf index d41f8399a..4302dd0fe 100644 --- a/addons/circulation/functions/fnc_updateHeartRate.sqf +++ b/addons/circulation/functions/fnc_updateHeartRate.sqf @@ -33,19 +33,15 @@ if IN_CRDC_ARRST(_unit) then { } else { private _hrChange = 0; private _targetHR = 0; - private _bloodVolume = GET_BLOOD_VOLUME(_unit); + private _bloodVolume = GET_BLOOD_VOLUME_LITERS(_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_2_HEMORRHAGE) then { - _targetBP = _targetBP * (_bloodVolume / DEFAULT_BLOOD_VOLUME); - }; - _targetHR = DEFAULT_HEART_RATE; if (_bloodVolume < BLOOD_VOLUME_CLASS_3_HEMORRHAGE) then { + private _targetBP = 107 * (_bloodVolume / DEFAULT_BLOOD_VOLUME); _targetHR = _heartRate * (_targetBP / (45 max _meanBP)); }; if (_painLevel > 0.2) then { diff --git a/addons/circulation/functions/fnc_updateInternalBleeding.sqf b/addons/circulation/functions/fnc_updateInternalBleeding.sqf index 46fb9f1d3..08933805d 100644 --- a/addons/circulation/functions/fnc_updateInternalBleeding.sqf +++ b/addons/circulation/functions/fnc_updateInternalBleeding.sqf @@ -19,7 +19,7 @@ params ["_unit", ["_heal", false]]; private _cardiacOutput = [_unit] call ACEFUNC(medical_status,getCardiacOutput); -private _alphaAction = _unit getVariable [QEGVAR(pharma,alphaAction), 1]; +private _alphaAction = GET_VASOCONSTRICTION(_unit); private _internalBleeding = 0; if !(_heal) then { diff --git a/addons/circulation/licence.txt b/addons/circulation/licence.txt index e4d6b39be..4dd142f90 100644 --- a/addons/circulation/licence.txt +++ b/addons/circulation/licence.txt @@ -1,4 +1,4 @@ -This addon is made by Katalam. +This addon is made by Katalam. This file must not be removed from the folder and must be contained in every work based on this addon or parts of it. diff --git a/addons/circulation/stringtable.xml b/addons/circulation/stringtable.xml index 6dbfcc5c8..90b38effd 100644 --- a/addons/circulation/stringtable.xml +++ b/addons/circulation/stringtable.xml @@ -17,6 +17,13 @@ 循環器系モジュールを有効化 ACE - Circulação ativada? ACE-Kierto aktivoitu? + ACE-Circulatie actief? + + + AI Simple Medical activated? + AI/KI simpel medische simulatie geactiveerd? + ¿Activar Médico Simple para IA? + AI用単純化医療を有効化しますか? Advanced Rhythms activated? @@ -30,10 +37,11 @@ Ritmo avanzato attivato? ¿Ritmo avanzado activado? Pokročilý Rytmus aktivován? - 高度な心調律 を有効化しますか? + 高度な心調律を有効化しますか? Продвинутый ритм активирован? Ritmo avançado ativado? Edistyneet sykerytmit aktivoitu? + Geadvanceerde hartritmes actief? Blood IV (1000ml) BT: 0+ @@ -51,6 +59,7 @@ 血液 IV (1000ml) O+型 Sangue IV (1000ml) TS: O+ Veri IV (1000ml) V:O+ + Bloed IV (1000ml) BT: 0+ Blood IV (1000ml) BT: 0- @@ -68,6 +77,7 @@ 血液 IV (1000ml) O-型 Sangue IV (1000ml) TS: O- Veri IV (1000ml) V:O- + Bloed IV (1000ml) BT:0- Blood IV (1000ml) BT: A+ @@ -85,6 +95,7 @@ 血液 IV (1000ml) A+型 Sangue IV (1000ml) TS: A+ Veri IV (1000ml) V: A+ + Bloed IV (1000ml) BT: A+ Blood IV (1000ml) BT: A- @@ -102,6 +113,7 @@ 血液 IV (1000ml) A-型 Sangue IV (1000ml) TS: A- Veri IV (1000ml) V: A- + Bloed IV (1000ml) BT: A- Blood IV (1000ml) BT: B+ @@ -119,6 +131,7 @@ 血液 IV (1000ml) B+型 Sangue IV (1000ml) TS: B+ Veri IV (1000ml) V: B+ + Bloed IV (1000ml) BT: B+ Blood IV (1000ml) BT: B- @@ -136,6 +149,7 @@ 血液 IV (1000ml) B-型 Sangue IV (1000ml) TS: B- Veri IV (1000ml) V: B- + Bloed IV (1000ml) BT: B- Blood IV (1000ml) BT: AB+ @@ -153,6 +167,7 @@ 血液 IV (1000ml) AB+型 Sangue IV (1000ml) TS: AB+ Veri IV (1000ml) V: AB+ + Bloed IV (1000ml) BT: AB+ Blood IV (1000ml) BT: AB- @@ -170,6 +185,7 @@ 血液 IV (1000ml) AB-型 Sangue IV (1000ml) TS: AB- Veri IV (1000ml) V: AB- + Bloed IV (1000ml) BT: AB- Blood IV (500ml) BT: 0+ @@ -187,6 +203,7 @@ 血液 IV (500ml) O+型 Sangue IV (500ml) TS: O+ Veri IV (500ml) V: O+ + Bloed IV (500ml) BT: 0+ Blood IV (500ml) BT: 0- @@ -204,6 +221,7 @@ 血液 IV (500ml) O-型 Sangue IV (500ml) TS: O- Veri IV (500ml) V: O- + Bloed IV (500ml) BT: 0- Blood IV (500ml) BT: A+ @@ -221,6 +239,7 @@ 血液 IV (500ml) A+型 Sangue IV (500ml) TS: A+ Veri IV (500ml) V: A+ + Bloed IV (500ml) BT: A+ Blood IV (500ml) BT: A- @@ -238,6 +257,7 @@ 血液 IV (500ml) A-型 Sangue IV (500ml) TS: A- Veri IV (500ml) V: A- + Bloed IV (500ml) BT: A- Blood IV (500ml) BT: B+ @@ -255,6 +275,7 @@ 血液 IV (500ml) B+型 Sangue IV (500ml) TS: B+ Veri IV (500ml) V: B+ + Bloed IV (500ml) BT: B+ Blood IV (500ml) BT: B- @@ -272,6 +293,7 @@ 血液 IV (500ml) B-型 Sangue IV (500ml) TS: B- Veri IV (500ml) V: B- + Bloed IV (500ml) BT: B- Blood IV (500ml) BT: AB+ @@ -289,6 +311,7 @@ 血液 IV (500ml) AB+型 Sangue IV (500ml) TS: AB+ Veri IV (500ml) V: AB+ + Bloed IV (500ml) BT: AB+ Blood IV (500ml) BT: AB- @@ -306,6 +329,7 @@ 血液 IV (500ml) AB-型 Sangue IV (500ml) TS: AB- Veri IV (500ml) V: AB- + Bloed IV (500ml) BT: AB- Blood IV (250ml) BT: 0+ @@ -323,6 +347,7 @@ 血液 IV (250ml) O+型 Sangue IV (250ml) TS: O+ Veri IV (250ml) V: O+ + Bloed IV (250ml) BT: 0+ Blood IV (250ml) BT: 0- @@ -340,6 +365,7 @@ 血液 IV (250ml) O-型 Sangue IV (250ml) TS: O- Veri IV (250ml) V: O- + Bloed IV (250ml) BT: 0- Blood IV (250ml) BT: A+ @@ -357,6 +383,7 @@ 血液 IV (250ml) A+型 Sangue IV (250ml) TS: A+ Veri IV (250ml) V: A+ + Bloed IV (250ml) BT: A+ Blood IV (250ml) BT: A- @@ -374,6 +401,7 @@ 血液 IV (250ml) A-型 Sangue IV (250ml) TS: A- Veri IV (250ml) V: A- + Bloed IV (250ml) BT: A- Blood IV (250ml) BT: B+ @@ -391,6 +419,7 @@ 血液 IV (250ml) B+型 Sangue IV (250ml) TS: B+ Veri IV (250ml) V: B+ + Bloed IV (250ml) BT: B+ Blood IV (250ml) BT: B- @@ -408,6 +437,7 @@ 血液 IV (250ml) B-型 Sangue IV (250ml) TS: B- Veri IV (250ml) V: B- + Bloed IV (250ml) BT: B- Blood IV (250ml) BT: AB+ @@ -425,6 +455,7 @@ 血液 IV (250ml) AB+型 Sangue IV (250ml) TS: AB+ Veri IV (250ml) V: AB+ + Bloed IV (250ml) BT: AB+ Blood IV (250ml) BT: AB- @@ -442,6 +473,7 @@ 血液 IV (250ml) AB-型 Sangue IV (250ml) TS: AB- Veri IV (250ml) V: AB- + Bloed IV (250ml) BT: AB- Give Blood IV (1000ml) BT: 0+ @@ -459,6 +491,7 @@ 血液 IV (1000ml) O+型 を投与 Transfusão de sangue IV (1000ml) TS: O+ Antaa veri IV (1000ml) V:O+ + Geef Bloedtransfusie via IV (1000ml) BT: 0+ Give Blood IV (1000ml) BT: 0- @@ -476,6 +509,7 @@ 血液 IV (1000ml) O-型 を投与 Transfusão de sangue IV (1000ml) TS: O- Antaa veri IV (1000ml) V:O- + Geef Bloedtransfusie via IV (1000ml) BT: 0- Give Blood IV (1000ml) BT: A+ @@ -493,6 +527,7 @@ 血液 IV (1000ml) A+型 を投与 Transfusão de sangue IV (1000ml) TS: A+ Antaa veri IV (1000ml) V:A+ + Geef Bloedtransfusie via IV (1000ml) BT: A+ Give Blood IV (1000ml) BT: A- @@ -510,6 +545,7 @@ 血液 IV (1000ml) A-型 を投与 Transfusão de sangue IV (1000ml) TS: A- Antaa veri IV (1000ml) V:A- + Geef Bloedtransfusie via IV (1000ml) BT: A- Give Blood IV (1000ml) BT: B+ @@ -527,6 +563,7 @@ 血液 IV (1000ml) B+型 を投与 Transfusão de sangue IV (1000ml) TS: B+ Antaa veri IV (1000ml) V:B+ + Geef Bloedtransfusie via IV (1000ml) BT: B+ Give Blood IV (1000ml) BT: B- @@ -544,6 +581,7 @@ 血液 IV (1000ml) B-型 を投与 Transfusão de sangue IV (1000ml) TS: B- Antaa veri IV (1000ml) V:B- + Geef Bloedtransfusie via IV (1000ml) BT: B- Give Blood IV (1000ml) BT: AB+ @@ -561,6 +599,7 @@ 血液 IV (1000ml) AB+型 を投与 Transfusão de sangue IV (1000ml) TS: AB+ Antaa veri IV (1000ml) V:AB+ + Geef Bloedtransfusie via IV (1000ml) BT: AB+ Give Blood IV (1000ml) BT: AB- @@ -578,6 +617,7 @@ 血液 IV (1000ml) AB-型 を投与 Transfusão de sangue IV (1000ml) TS: AB- Antaa veri IV (1000ml) V:AB- + Geef Bloedtransfusie via IV (1000ml) BT: AB- Give Blood IV (500ml) BT: 0+ @@ -595,6 +635,7 @@ 血液 IV (500ml) O+型 を投与 Transfusão de sangue IV (500ml) TS: O+ Antaa veri IV (500ml) V: O+ + Geef Bloedtransfusie via IV (500ml) BT: 0+ Give Blood IV (500ml) BT: 0- @@ -612,6 +653,7 @@ 血液 IV (500ml) O-型 を投与 Transfusão de sangue IV (500ml) TS: O- Antaa veri IV (500ml) V: O- + Geef Bloedtransfusie via IV (500ml) BT: 0- Give Blood IV (500ml) BT: A+ @@ -629,6 +671,7 @@ 血液 IV (500ml) A+型 を投与 Transfusão de sangue IV (500ml) TS: A+ Antaa veri IV (500ml) V: A+ + Geef Bloedtransfusie via IV (500ml) BT: A+ Give Blood IV (500ml) BT: A- @@ -646,6 +689,7 @@ 血液 IV (500ml) A-型 を投与 Transfusão de sangue IV (500ml) TS: A- Antaa veri IV (500ml) V: A- + Geef Bloedtransfusie via IV (500ml) BT: A- Give Blood IV (500ml) BT: B+ @@ -663,6 +707,7 @@ 血液 IV (500ml) B+型 を投与 Transfusão de sangue IV (500ml) TS: B+ Antaa veri IV (500ml) V: B+ + Geef Bloedtransfusie via IV (500ml) BT: B+ Give Blood IV (500ml) BT: B- @@ -680,6 +725,7 @@ 血液 IV (500ml) B-型 を投与 Transfusão de sangue IV (500ml) TS: B- Antaa veri IV (500ml) V: B- + Geef Bloedtransfusie via IV (500ml) BT: B- Give Blood IV (500ml) BT: AB+ @@ -697,6 +743,7 @@ 血液 IV (500ml) AB+型 を投与 Transfusão de sangue IV (500ml) TS: AB+ Antaa veri IV (500ml) V: AB+ + Geef Bloedtransfusie via IV (500ml) BT: AB+ Give Blood IV (500ml) BT: AB- @@ -714,6 +761,7 @@ 血液 IV (500ml) AB-型 を投与 Transfusão de sangue IV (500ml) TS: AB- Antaa veri IV (500ml) V: AB= + Geef Bloedtransfusie via IV (500ml) BT: AB- Give Blood IV (250ml) BT: 0+ @@ -731,6 +779,7 @@ 血液 IV (250ml) O+型 を投与 Transfusão de sangue IV (250ml) TS: O+ Antaa veri IV (250ml) V: O+ + Geef Bloedtransfusie via IV (250ml) BT: 0+ Give Blood IV (250ml) BT: 0- @@ -748,6 +797,7 @@ 血液 IV (250ml) O-型 を投与 Transfusão de sangue IV (250ml) TS: O- Antaa veri IV (250ml) V: O- + Geef Bloedtransfusie via IV (250ml) BT: 0- Give Blood IV (250ml) BT: A+ @@ -765,6 +815,7 @@ 血液 IV (250ml) A+型 を投与 Transfusão de sangue IV (250ml) TS: A+ Antaa veri IV (250ml) V: A+ + Geef Bloedtransfusie via IV (250ml) BT: A+ Give Blood IV (250ml) BT: A- @@ -782,6 +833,7 @@ 血液 IV (250ml) A-型 を投与 Transfusão de sangue IV (250ml) TS: A- Antaa veri IV (250ml) V: A- + Geef Bloedtransfusie via IV (250ml) BT: A- Give Blood IV (250ml) BT: B+ @@ -799,6 +851,7 @@ 血液 IV (250ml) B+型 を投与 Transfusão de sangue IV (250ml) TS: B+ Antaa veri IV (250ml) V: B+ + Geef Bloedtransfusie via IV (250ml) BT: B+ Give Blood IV (250ml) BT: B- @@ -816,6 +869,7 @@ 血液 IV (250ml) B-型 を投与 Transfusão de sangue IV (250ml) TS: B- Antaa veri IV (250ml) V: B- + Geef Bloedtransfusie via IV (250ml) BT: B- Give Blood IV (250ml) BT: AB+ @@ -833,6 +887,7 @@ 血液 IV (250ml) AB+型 を投与 Transfusão de sangue IV (250ml) TS: AB+ Antaa veri IV (250ml) V: AB+ + Geef Bloedtransfusie via IV (250ml) BT: AB+ Give Blood IV (250ml) BT: AB- @@ -850,6 +905,7 @@ 血液 IV (250ml) AB-型 を投与 Transfusão de sangue IV (250ml) TS: AB- Antaa veri IV (250ml) V: AB- + Geef Bloedtransfusie via IV (250ml) BT: AB- Using @@ -867,9 +923,11 @@ 使用中 Usando Käyttämällä + Wordt gebruikt Analyze Rhythm + 心率分析 心調律を解析 Analyser le rythme cardiaque 리듬 분석 @@ -878,6 +936,7 @@ Analizar ritmo Analysoi rytmiä Анализировать частоту сердечных сокращений + Analyseer hartritme Check Dogtags @@ -895,6 +954,7 @@ ドッグタグを確認 Checar placa de identificação Tarkista sotilasmerkit + Controleer herkenningsplaatje Checking @@ -912,6 +972,7 @@ 確認中 Checando Tarkistetaan + Wordt gecontroleerd Already one connected @@ -929,6 +990,7 @@ すでに1つ接続済です Já há um conectado Jo yhdistetty + Er is al een verbonden AED X-Series @@ -946,6 +1008,7 @@ AED Xシリーズ DEA Serie-X AUD X-sarja + AED X-Serie Used to monitor vitals and resuscitate patients @@ -963,9 +1026,11 @@ バイタルの値を監視し、人を蘇生させるために使用される Usado para monitorar valores vitais e para ressuscitar pessoas Käytetään elintoimintojen seurantaan ja potilaiden elvyttämiseen + Wordt gebruikt om de vitale waarden te monitoren en patiënten te reanimeren Place AED Pads + 放置DEA电极 AEDパッドを貼り付ける Placer les électrodes du AED 자동심장충격기 패드 붙이기 @@ -974,6 +1039,7 @@ Colocar electrodos del DEA Aseta AUD-tyynyt Установить электроды AED + Plaats AED pads Station: Place AED Pads @@ -985,6 +1051,7 @@ Estación: Colocar electrodos del AED Asema: aseta AUD-tyynyt Станция: установить электродов AED + Station: Plaats AED pads Vehicle: Place AED Pads @@ -996,9 +1063,11 @@ Vehículo: Colocar electrodos del DEA Ajoneuvo: aseta AUD-tyynyt Транспорт: установить электроды AED + Voertuig: Plaats AED pads Place AED-X Pads + 放置AED-X电极 AED-Xパッドを貼り付ける Placer les électrodes du AED-X X-시리즈 자동심장충격기 패드 붙이기 @@ -1007,6 +1076,7 @@ Colocar electrodos del DEA-X Aseta AUD-X-tyynyt Установить электроды AED-X + Plaats AED-X pads Station: Place AED-X Pads @@ -1018,6 +1088,7 @@ Estación: Colocar electrodos del DEA-X Asema: aseta AUD-X-tyynyt Станция: установить электроды AED-X + Station: Plaats AED-X pads Vehicle: Place AED-X Pads @@ -1029,9 +1100,11 @@ Vehículo: Colocar electrodos del DEA-X Ajonuevo: aseta AUD-X-tyynyt Транспорт: установить электроды AED-X + Voertuig: Plaats AED-X pads Remove Defibrillator Pads + 取下除颤器电极 除細動器パッドを取り外す Retirer les électrodes du défibrilateur 자동심장충격기 패드 떼기 @@ -1040,9 +1113,11 @@ Quitar electrodos del desfibrilador Poista defibrillaattorityynyt Снять электроды дефибриллятора + Verwijder defibrillatiepads Placing Defibrillator Pads + 放置除颤器电极 除細動器パッドを貼り付けています Mise en place des électrodes du défibrilateur 자동심장충격기 패드 붙이는 중 @@ -1051,9 +1126,11 @@ Colocando electrodos del desfibrilador Defibrillaattorityynyjen asettaminen Установка электродов дефибриллятора + Defibrillatiepads worden geplaatst Removing Defibrillator Pads + 正在取下除颤器垫 除細動器パッドを取り外しています Retrait des électrodes du défibrillateur 자동심장충격기 패드 떼는 중 @@ -1062,9 +1139,11 @@ Quitando electrodos del desfibrilador Defibrillaattorityynyjen poistaminen Снять электроды дефибриллятора + Defibrillatiepads worden verwijderd Administer Shock + 实施休克 ショックを実施 Délivrer le choc 쇼크 실시 @@ -1073,9 +1152,11 @@ Administrar descarga Anna sokki potilaalle Применить разряд + Dien schok toe Charge Defibrillator + 除颤器充能 除細動器を充電 Charger le défibrillateur 자동심장충격기 충전 @@ -1084,9 +1165,11 @@ Cargar desfibrilador Lataa defibrillaattori Зарядить дифибриллятор + Laad defribrillator op Cancel Charge + 取消充能 充電を取り消す Annuler la charge du défibrillateur 충전 취소 @@ -1095,9 +1178,11 @@ Cancelar carga Peruuta sähkölataus Отменить заряд + Annuleer lading View Monitor + 查看监护仪 バイタルモニターを表示 Visualiser le moniteur 보니터 보기 @@ -1106,9 +1191,11 @@ Ver monitor Näytä monitori Просмотр монитора + Kijk op monitor Connect Vitals Monitor + 连接监控 バイタルモニターの接続 Connecter les capteurs de signe vitaux à l'AED-X 환자감시장치 연결 @@ -1117,9 +1204,11 @@ Conectar monitor Liitä terveysmonitori Подключить монитор жизненно важных показателей + Verbind de vitale waarden monitor Station: Connect Vitals Monitor + 设置AED:连接监护仪 設置AED: バイタルモニターの接続 Station: Connecter les capteurs de signe vitaux à l'AED-X 환자감시장치 연결(바닥) @@ -1128,6 +1217,7 @@ Estación: Conectar monitor Asema: Liitä kuntomonitori Станция: Подключить монитор жизненно важных показателей + Station: Verbind de vitale waarden monitor Vehicle: Connect Vitals Monitor @@ -1145,6 +1235,7 @@ Трансопрт: Подключить монитор жизненно важных показателей Veículo: Colocar DEA-X Ajoneuvo: Liitä kuntomonitori + Voertuig: Verbind de vitale waarden monitor Disconnect Vitals Monitor @@ -1162,9 +1253,11 @@ バイタルモニターの切断 Remover monitoramento irrota terveysmonitori + Maak vitale waarden monitor los Vitals Monitor Audio ON + 监护仪音频 开启 モニター音声オン Activer le son des signes vitaux de l'AED-X 환자감시장치 소리 켜기 @@ -1173,9 +1266,11 @@ Activar audio del monitor Terveysmonitorin ääni päällä Звук монитора жизненно важных органов ВКЛЮЧЕН + Vitale waarden monitor audio AAN Vitals Monitor Audio OFF + 监护仪音频 关闭 モニター音声オフ Désactiver le son des signes vitaux de l'AED-X 환자감시장치 소리 끄기 @@ -1184,6 +1279,7 @@ Desactivar audio del monitor Tärkeän näytön ääni pois päältä Звук монитора жизненно важных функций ВЫКЛЮЧЕН + Vitale waarden monitor UIT Connecting @@ -1201,6 +1297,7 @@ 接続中 Conectando Yhdistetään + Wordt verbonden Disconnecting @@ -1218,6 +1315,7 @@ 切断中 Desconectando Irrotetaan + Wordt losgemaakt AED-X Vitals Monitor Audio OFF @@ -1235,6 +1333,7 @@ AED-Xモニター音声オン Abaixar o volume do DEA-X AUD-X-terveysmonitorin ääni pois päältä + AED-X vitale waarden monitor geluid UIT AED-X Vitals Monitor Audio ON @@ -1252,6 +1351,7 @@ AED-Xモニター音声オフ Aumentar o volume do DEA-X AUD-X-terveysmonitorin ääni päällä + AED-X vitale waarden monitor geluid AAN [KAM] Medical Blood bank @@ -1269,6 +1369,7 @@ [KAM] 医療用血液バンク [KAM] Banco de Sangue Médico [KAM] Lääketieteellinen veripankki + [KAM] Medische bloedbank Open blood groups cheat sheet @@ -1286,6 +1387,7 @@ 血液型適合確認シートを開く Abrir tabela de compatibilidade sanguínea Avaa veriryhmäopas + Open Bloedgroepentabel Place AED @@ -1303,6 +1405,7 @@ AEDを設置 Colocar DEA Aseta AUD + Plaats AED Place AED-X @@ -1314,6 +1417,7 @@ Colocar DEA-X Aseta AUD-X Разместить AED-X + Plaats AED-X Pick Up AED @@ -1331,6 +1435,7 @@ AEDを拾う Recolher DEA Hae AUD + Pak AED op Pick Up AED-X @@ -1342,6 +1447,7 @@ Recoger DEA-X Hae AUD-X Подобрать AED-X + Pak AED-X op Toggle Volume @@ -1353,6 +1459,7 @@ Cambiar volumen Vaihda äänenvoimakkuutta Переключить громкость + Geluid omwisselen Measure Blood Pressure @@ -1364,6 +1471,7 @@ Medir la presión arterial Mittaa verenpaine Измерить артериальное давление + Meet bloeddruk Check Pads @@ -1375,6 +1483,7 @@ Comprobar electrodos Tarkista tyynyt Проверить электроды + Controleer pads SHOCK ADVISED @@ -1386,6 +1495,7 @@ DESCARGA RECOMENDADA SOKI SUOSITELLAAN Подсказка о разряде + SCHOK GEADVISEERD NO SHOCK ADVISED @@ -1397,6 +1507,7 @@ DESCARGA NO RECOMENDADA EI SUOSITTELUA SHOCKIA Никаких подсказок о разряде + SCHOK NIET GEADVISEERD ANALYZING ECG @@ -1408,6 +1519,7 @@ ANALIZANDO ECG EKG:N ANALYSOINTI Анализ ЭКГ + ECG-ANALYSE CHARGED @@ -1419,6 +1531,7 @@ CARGADO LAADUT Заряженный + OPGELADEN CHARGING @@ -1430,6 +1543,7 @@ CARGANDO LATAUS Зарядка + WORDT GELADEN AED DISARMED @@ -1441,6 +1555,7 @@ DEA DESARMADO AED POIS KÄYTÖSTÄ AED разобран + AED GEDEACTIVEERD DISARMED @@ -1452,6 +1567,7 @@ DESARMADO POIS KÄYTÖSTÄ Разобран + GEDEACTIVEERD Delivered Energy @@ -1463,6 +1579,7 @@ Energía suministrada Toimitettu shokki Передаваемая энергия + Geleverde energie Defibrillator @@ -1473,6 +1590,7 @@ Дефибриллятор Defibrillator Desfibrilador + Defibrillator Selected Energy @@ -1483,6 +1601,7 @@ Выбранная энергия Ausgewählte Leistung Energia selecionada + Geselecteerde energie ENERGY DELIVERED @@ -1494,6 +1613,7 @@ ENERGÍA SUMINISTRADA ISKU TOIMITETTU Передаваемая энергия + GELEVERDE ENERGIE Stand Clear @@ -1505,6 +1625,7 @@ Mantenerse alejado Väistyä Не прикасайтесь к пациенту + Afstand houden Perform CPR @@ -1516,6 +1637,7 @@ Realizar RCP Suorita elvytys Выполнить СЛР + Voer CPR uit PUSH SHOCK @@ -1527,6 +1649,7 @@ PULSAR DESCARGA PAINA SHOKKI РАЗРЯД + DRUK SCHOK Push Analyze @@ -1538,6 +1661,7 @@ Pulsar Analizar Paina analysoida Анализировать + Druk analyse HR @@ -1549,6 +1673,7 @@ RC HR ЧСС + HR PR @@ -1560,6 +1685,31 @@ PS PR Ритм (PR) + PR + + + %1 Blood Sample + %1 bloedstaal + %1 Muestra de sangre + %1 血液サンプル + + + Run ABG Test + Voer ABG test uit + Realizar prueba ABG + ABGテストを行う + + + ABG Test + ABG test + Prueba ABG + ABGテスト + + + Apply %1 Test + Voer %1 test uit + Realizar prueba %1 + %1 テストを実施 Blood groups cheat sheet @@ -1577,6 +1727,7 @@ 血液型適合確認シート Tabela de compatibilidade sanguínea Veriryhmien opas + Bloedgroepentabel A wrong combination of donor and recipient blood can even have deadly consequences. @@ -1594,6 +1745,7 @@ ドナーと患者の血液の間違った組み合わせは、致命的な結果をもたらす可能性さえあります。 Uma combinação errada de sangue de doador e receptor pode trazer consequências fatais Luovutetun veren ja vastaanottajan veren väärällä yhdistelmällä voi olla tappavia seurauksia. + Een verkeerde combinatie van donor- en ontvangersbloed kan zelfs dodelijke gevolgen hebben. Blood Type Assignment @@ -1608,6 +1760,7 @@ Atribuição de tipo sanguíneo Veriryhmämääritys Определение группы крови + Bloedtype toewijzing Sets how players' blood type is assigned: \nPlayer chosen: Player chooses their own blood type \nPlayer chosen (forced): Player chooses their own blood type, but it doesn't change upon respawning \nRandom: Blood type is random each respawn \nRandom (on join): Blood type is random, but doesn't change upon respawning \nSteamID: Blood type is decided based on player's steamID \nSteamID (custom list): Blood type is decided based on player's steamID and custom list @@ -1622,6 +1775,7 @@ Define como o tipo sanguíneo dos jogadores é atribuído: \nEscolha do jogador: o jogador escolhe seu próprio tipo sanguíneo \nEscolha do jogador (forçado): o jogador escolhe seu próprio tipo sanguíneo, mas ele não muda ao renascer \nAleatório: o tipo sanguíneo é aleatório a cada renascimento \nAleatório (ao entrar): O tipo sanguíneo é aleatório, mas não muda ao renascer \nSteamID: O tipo sanguíneo é decidido com base no steamID do jogador \nSteamID (lista personalizada): O tipo sanguíneo é decidido com base no steamID do jogador e na lista personalizada Asettaa kuinka pelaajan veriryhmä määritetään: \nPelaaja valittu: Pelaaja valitsee oman veriryhmänsä \nPelaaja valittu (pakotettu): Pelaaja valitsee oman veriryhmänsä, mutta se ei muutu uudelleensyntyessä. \nSatunnainen: Veriryhmä on satunnainen jokaisen uudelleensyntymisen yhteydessä. \nSatunnainen (pelaajan liittyessä peliin): Veriryhmä on satunnainen, mutta ei muutu uudelleensyntyessä. \nSteamID: Veriryhmä päätetään pelaajan SteamID:n perusteella. \nSteamID (mukautettu lista): Veriryhmä päätetään pelaajan SteamID:n ja mukautetun listan perusteella. Определяет, как назначается группа крови игроков: \nвыбор игрока : каждый игрок выбирает свою собственную группу крови \nвыбор игрока (принудительный): каждый игрок выбирает свою собственную группу крови, но она не изменится при возрождении. n\случайная: группа крови выбирается случайным образом при каждом появлении \nслучайность (определена): группа крови является случайной, но не изменится при появлении n\SteamID: группа группа крови основана на steamID игроков n\SteamID (пользовательский список): группа крови основана на steamID игроки, а также пользовательский список + Bepaald hoe spelers bloedgroep wordt toegewezen: \nSpeler gekozen: Spelers kunnen hun eigen bloedgroep selecteren. \nSpeler gekozen(geforceerd): Spelers kiezen hun eigen bloedgroep, maar dit veranderd niet op respawn. \nWillekeurig: Bloedgroep wordt willekeurig geselecteerd bij elke respawn. \nWillekeurig (bij toetreding): Bloedgroep is willekeurig, maar veranderd niet bij respawn. \nSteamID: Bloedgroep wordt geselecteerd op basis van de Spelers SteamID.\n SteamID (eigen lijst): Bloedgroep wordt geselecteerd op basis van SteamID en de zelf gemaakte lijst. Player chosen @@ -1636,6 +1790,7 @@ Escolha do jogador Pelaaja valittu Выбранный игрок + Speler gekozen Player chosen (forced) @@ -1650,6 +1805,7 @@ Escolha do jogador (forçado) Valittu pelaaja (pakotettu) Выбранный игрок (принудительно) + Speler gekozen (geforceerd) Random @@ -1664,6 +1820,7 @@ Aleatório Satunnainen Случайный + Willekeurig Random (on join) @@ -1678,6 +1835,7 @@ Aleatório (ao entrar) Satunnainen (liittyessä) Случайный (при присоединении) + Willekeurig (bij toetreding) SteamID @@ -1692,6 +1850,7 @@ SteamID SteamID SteamID + SteamID SteamID (custom list) @@ -1706,6 +1865,7 @@ SteamID (lista personalizada) SteamID (muokattu luettelo) SteamID (пользовательский список) + SteamID (Eigen lijst) Weighted Randomizer @@ -1720,6 +1880,7 @@ Aleatoriedade ponderada Painotettu satunnaistin Взвешенный рандомизатор + Gewogen randomizer Sets if random blood type given will be weighted according to blood type commonness @@ -1734,6 +1895,7 @@ Define se o tipo sanguíneo dado aleatoriamente será ponderado de acordo com as estatísticas reais Asettaa, painotetaanko satunnaiset veriryhmät palvelimen yleisen veriryhmän mukaan. Определяет, определяется ли данная случайная группа крови с помощью реалистичных шансов определения группы крови + Bepaald of willekeurige bloedgroepen worden gewogen op basis van de algemeenheid van de bloedgroepen Blood group @@ -1751,6 +1913,7 @@ 血液型 Tipo sanguíneo Veriryhmä + Bloedgroep Blood Type Custom List @@ -1765,6 +1928,7 @@ Lista personalizada de tipo sanguíneo Mukautettu luettelo verityypeistä Пользовательский список групп крови + Bloedgroepen eigen lijst Sets blood types that will be assigned to players based on their SteamID \nBlood types are seperated by a comma (","), list should contain a total of 10 blood types @@ -1779,6 +1943,7 @@ Define os tipos sanguíneos que serão atribuídos aos jogadores com base no seu SteamID \nOs tipos sanguíneos são separados por vírgulas (","), a lista deve conter um total de 10 tipos sanguíneos Asettaa veriryhmät, jotka määritetään pelaajille heidän SteamID:n perusteella. \nVerityypit erotetaan toisistaan merkillä (","). Listalla tulee olla yhteensä 10 veriryhmää. Устанавливает группы крови, которые будут присвоены игрокам на основе их Steam ID \nГруппы крови разделены запятой (","), список должен содержать в общей сложности 10 групп крови + Bepaald de bloedgroepen die aan spelers worden gegeven op basis van hun SteamID. \nBloedgroepen zijn gescheiden met een comma(","). De lijst moet 10 verschillende bloedgroepen bevatten %1 checked dogtags blood group: %2 @@ -1788,6 +1953,7 @@ %1 comprobó el grupo de sangre en la dogtag: %2 %1 a vérifié le groupe sanguin sur la plaque d'identité : %2 %1 checou + %1 heeft de bloedgroep van het herkeningsplaatje gecontroleerd: %2 Locations AED @@ -1805,6 +1971,7 @@ AEDが使用できる場所 Posição do DAE AUD:n sijainti + Locaties voor het gebruik van de AED Where can the AED be used? @@ -1822,6 +1989,7 @@ AEDが使える場所を設定します Onde o DEA pode ser usado? Missä AUD-laitetta voidaan käyttää? + Waar kan de AED gebruikt worden? AED @@ -1833,6 +2001,7 @@ DEA AUD AED + AED AED-X @@ -1844,6 +2013,7 @@ DEA-X AUD-X AED-X + AED-X Automated External Defibrillator @@ -1861,6 +2031,7 @@ AED (自動体外式除細動器) Desfibrilador Externo Automático Automaattinen ulkoinen defibrillaattori + Automatische Externe Defibrillator Used to resuscitate patients @@ -1878,6 +2049,7 @@ 人を蘇生させるために使用される Use para ressuscitar jogadores Käytetään potilaiden elvyttämiseen. + Wordt gebruikt om patiënten te reanimeren %1 administered shock (%2) @@ -1889,6 +2061,7 @@ %1 administró una descarga (%2) %1 annettu sokki (%2) % 1 использовал разряд (% 2) + %1 heeft een schok toegediend (%2) %1 attached defibrillator pads (%2) @@ -1900,6 +2073,7 @@ %1 colocó los electrodos del desfibrilador (%2) %1 kiinnitetyt defibrillaattorityynyt (%2) %1 прикрепил электроды (%2) + %1 heeft defibrillator pad geplaatst (%2) %1 removed defibrillator pads @@ -1911,6 +2085,7 @@ %1 quitó los electrodos del desfibrilador %1 poistettu defibrillaattorityynyt %1 снял электроды + %1 heeft defibrillator pads verwijderd %1 connected vitals monitor @@ -1922,6 +2097,7 @@ %1 conectó el monitor %1 kytketty terveysmonitori %1 подключил монитор жизненно важных показателей + %1 heeft een vitale waarden monitor verbonden %1 disconnected vitals monitor @@ -1933,6 +2109,7 @@ %1 desconectó el monitor %1 irrotettu terveysmonitori %1 отсоединил монитор жизненно важных показателей + %1 heeft een vitale waarden monitor losgekoppeld Patient Disconnected @@ -1944,6 +2121,7 @@ Paciente desconectado Potilas on katkaistu Пациент отключен + Patiënt losgekoppeld Max Success chance for AED-X @@ -1958,6 +2136,7 @@ Probabilidade máxima de sucesso do DEA-X Suurin mahdollisuus menestyä AUD-X:lle Максимальный шанс успеха для AED-X + Maximale succeskans voor AED-X Max Success chance for AED @@ -1972,6 +2151,7 @@ Probabilidade máxima de sucesso do DEA Suurin mahdollisuus menestyä AUD:lle Максимальный шанс успеха для AED + Maximale succeskans voor AED Min Success chance for AED-X @@ -1986,6 +2166,7 @@ Probabilidade mínima de sucesso do DEA-X Minimi mahdollisuus onnistua AUD-X:lle Минимальный шанс успеха для AED-X + Minimale succeskans voor AED-X Min Success chance for AED @@ -2000,6 +2181,7 @@ Probabilidade mínima de sucesso do DEA AUD:n onnistumisen minimimahdollisuus Минимальный шанс успеха для AED + Minimale succeskans voor AED Allow AED @@ -2017,6 +2199,7 @@ AEDの許可 Permitir DEA Salli AUD + Sta AED toe Training level required to use an AED @@ -2034,6 +2217,7 @@ AEDの使用に必要な医療スキルのレベルを設定します。 Nível de treinamento necessário para usar um DEA AUD:n käyttämiseen vaadittava koulutustaso + Benodigd trainingsniveau voor het gebruik van een AED Allow AED-X @@ -2051,6 +2235,7 @@ AED-Xの許可 Permitir DEA-X Salli AUD-X + Sta AED-X toe Allow AED pad application during CPR @@ -2060,6 +2245,7 @@ Permitir la aplicación de parche AED durante la realización de RCP Autoriser l'application des électrodes de l'AED pendant la RCP Permitir aplicação de pás do desfibrilador durante RCP + Sta het plaatsen van AED pads tijdens CPR toe Training level required to use an AED-X @@ -2077,6 +2263,7 @@ AED-Xの使用に必要な医療スキルのレベルを設定します。 Nível de treinamento necessário para usar um DEA-X AUD-X:n käyttämiseen vaadittava koulutustaso + Benodigd trainingsniveau voor het gebruik van een AED-X Allow AED/X Station Interaction @@ -2088,6 +2275,7 @@ Permitir la interacción con la estación de DEA/X Salli AUD-X-vuorovaikutus aseman kanssa Разрешить взаимодействие станции AED/X + Sta AED/X stations interactie toe Medical level required to pick up placed AED/X station @@ -2097,6 +2285,7 @@ Nivel médico requerido para recoger una estación AED/X puesta Niveau médical requis pour ramasser un AED-X posé au sol Nível médico necessário para pegar uma estação DEA/X colocada + Benodigd medisch niveau om geplaatste AED/X stations op te pakken Attach AED-X Vitals Monitor Time @@ -2108,6 +2297,7 @@ Tiempo para colocar el monitor DEA-X Kuinka kauan AUD-X-terveysmonitorin kiinnittäminen kestää Время подключения мониторинга жизненно важных показателей AED-X + Benodigde tijd om AED-X vitale waarden monitor aan te sluiten Detach AED-X Vitals Monitor Time @@ -2119,6 +2309,7 @@ Tiempo para retirar el monitor AED-X Kuinka kauan AUD-X-terveysmonitorin irrottaminen kestää Время отключения мониторинга жизненно важных показателей AED-X + Benodigde tijd om AED-X vitale waarden monitor los te koppelen Attach Defibrillator Pads Time @@ -2130,6 +2321,7 @@ Tiempo para colocar los electrodos del desfibrilador Kuinka kauan defibrillaattorityynyjen kiinnittäminen kestää Время подключения электродов + Benodigde tijd op defibrillator pads aan te brengen Detach Defibrillator Pads Time @@ -2141,6 +2333,7 @@ Tiempo para quitar los electrodos del desfibrilador Kuinka kauan defibrillaattorityynyjen irrottaminen kestää Время отсоединеия электродов + Benodigde tijd om defibrillator pads te verwijderen Distance limit for defibrillators in meters @@ -2152,6 +2345,7 @@ Límite de distancia para los desfibriladores en metros Defibrillaattorien etäisyysraja metreinä Предельное расстояние для дефибрилляторов в метрах + Afstandslimiet voor defibrillators in meters Enable different CPR chances per medical level @@ -2169,6 +2363,7 @@ スキルレベル毎にCPR成功率を変更 Habilite diferentes chances de RCP por nível médico Salli erilaiset onnistumismahdollisuudet elvytyksen suorittamiseen lääketieteellisen koulutustason perusteella + Schakel verschillende CPR kansen op basis van medisch niveau in Max CPR Chance for Doctors @@ -2184,6 +2379,7 @@ Probabilidade máxima de êxito de RCP para doutores Suurin CPR onnistumisen mahdollisuus lääkäreille Максимальный шанс СЛР для врачей + Maximale succeskans van CPR voor doktoren Max CPR Chance for Regular medics @@ -2199,6 +2395,7 @@ Probabilidade máxima de êxito de RCP para médicos Suurin mahdollisuus menestyä elvytystä suorittaville taistelulääkäreille Максимальный шанс СЛР для обычных медиков + Maximale succeskans van CPR voor reguliere medici Max CPR Chance for Default @@ -2214,6 +2411,7 @@ Probabilidade máxima de êxito de RCP para não-médicos Suurin mahdollisuus menestyä oletussotilailla, jotka suorittavat elvytystoimia Максимальный шанс СЛР по умолчанию + Maximale succeskans van CPR voor standaard Min CPR Chance for Doctors @@ -2229,6 +2427,7 @@ Probabilidade mínima de êxito de RCP para doutores Pienin mahdollisuus menestyä elvytyksen suorittamisessa lääkärinä Минимальный шанс СЛР для врачей + Minimale succeskans van CPR voor doktoren Min CPR Chance for Regular medics @@ -2244,6 +2443,7 @@ Probabilidade mínima de êxito de RCP para médicos Pienin mahdollisuus menestyä elvytystyössä taistelulääkärinä Минимальный шанс СЛР для обычных медиков + Minimale succeskans van CPR voor reguliere medici Min CPR Chance for Default @@ -2259,6 +2459,7 @@ Probabilidade mínima de êxito de RCP para não-médicos Pienin mahdollisuus menestyä elvytystoiminnassa oletussotilaana Минимальный шанс СЛР по умолчанию + Minimale succeskans van CPR voor standaard CPR Chance Interval @@ -2270,6 +2471,7 @@ Intervalo de probabilidad de RCP Elvytyksen onnistumislaskelmien välinen aika Интервал шанса СЛР + CPR kans interval Oxygenation Period @@ -2281,6 +2483,7 @@ Período de oxigenación Happisaturaatiojakso Период насыщения кислородом + Oxygenatie periode %1 performed CPR (%2) @@ -2292,6 +2495,7 @@ %1 realizó RCP (%2) %1 suoritettu elyytys (%2) %1 выполнил СЛР (%2) + %1 heeft CPR uitgevoerd (%2) Stop CPR @@ -2303,6 +2507,7 @@ RCP parado Lopeta elvytys Прекратить СЛР + Stop CPR CPR Started @@ -2313,6 +2518,7 @@ HLW begonnen RCP iniciada RCP iniciada + CPR gestart CPR Cancelled @@ -2324,6 +2530,7 @@ RCP cancelada Elvytys peruttu СЛР отменена + CPR afgebroken Field Blood Transfusion Kit (500ml) @@ -2332,7 +2539,7 @@ Kit de transfusión de sangre de campo (500 ml) 野战输血套件 (500ml) 野战输血套件 (500ml) - Polní transfůzní sada (250ml) + Polní transfůzní sada (500ml) 현장 수혈 키트 (500ml) Kit de transfusion sanguine de terrain (500 ml) Saha Kan Transfüzyon Kiti (500ml) @@ -2341,6 +2548,7 @@ 前線輸血キット (500ml) Kit de Transfusão de Sangue de Campo (500ml) Kenttäverensiirtolaitteet (500ml) + Veld bloedtransfusie set (500ml) Field Blood Transfusion Kit (250ml) @@ -2358,6 +2566,7 @@ 前線輸血キット (250ml) Kit de Transfusão de Sangue de Campo (250ml) Kenttäverensiirtolaitteet (250ml) + Veld bloedtransfusie set (250ml) Allows you to draw blood and use it @@ -2375,6 +2584,7 @@ 採血して使用することができます Permite extrair sangue e usá-lo Voit ottaa verta ja käyttää sitä + Maak het mogelijk om bloed te ontrekken en dit te gebruiken Draw Blood (500ml) @@ -2392,6 +2602,7 @@ 採血する (500ml) Extrair sangue (500ml) Ottaa verta (500ml) + Onttrek bloed (500ml) Draw Blood (250ml) @@ -2409,6 +2620,26 @@ 採血する (250ml) Extrair sangue (250ml) Ottaa verta (250ml) + Onttrek bloed(250ml) + + + Draw Arterial Sample + 动脉血液取样 + Neem Arterieel bloedstaal + Extraer muestra arterial + 動脈サンプルを採る + + + Blood Sample + Bloedstaal + Muestra de sangre + 血液サンプル + + + ABG Result + ABG resultaat + Resultado ABG + ABG結果 Drawing Blood @@ -2426,6 +2657,7 @@ 採血中 Extraindo sangue Veren vetäminen + Bloed wordt onttrokken Use Bloodgroups for drawing blood? @@ -2443,6 +2675,7 @@ Использовать группы крови для забора крови? Usar tipos sanguíneos para extração de sangue? Käytätkö verityyppejä veren ottamiseen? + Gebruik van bloedgroepen bij bloedonttrekking? Enable self blood draw @@ -2460,6 +2693,7 @@ 自己採血を有効化 Habilitar auto-extração de sangue Salli veren ottaminen itsestäsi + Sta zelf bloedonttrekking toe Drawing time for 500ml Kit @@ -2477,6 +2711,7 @@ 500mlキットの採血時間 Tempo de extração para o kit de 500ml Aika, joka kuluu 500 ml:n verta ottamiseen + Onttrekkingstijd voor 500ml set Drawing time for 250ml Kit @@ -2494,6 +2729,7 @@ 250mlキットの採血時間 Tempo de extração para o kit de 250ml Aika, joka kuluu 250 ml:n verta ottamiseen + Onttrekkingstijd voor 250ml set Minimum blood volume for donor (liters) @@ -2511,6 +2747,7 @@ 献血者の最低血液量(リットル) Volume mínimo de sangue para o doador (litro) Vähimmäismäärä luovuttajilta otettavaa verta + Minimaal benodigd bloedvolume om te doneren (liters) Minimum volume of blood allowed to drain a donor to, to ignore this setting set to 0 @@ -2528,6 +2765,7 @@ 採血出来る献血者の血液最低量。0に設定で無視します O volume mínimo de sangue que um doador pode retirar. Para ignorar este parâmetro é definido como 0 Vähimmäismäärä verta, jolle luovuttaja voidaan tyhjentää, aseta 0, jotta tämä asetus jätetään huomioimatta + Minimaal benodigd bloedvolume om een donateur te zijn. Om dit te negeren, zet dit op 0. Basic Settings @@ -2543,6 +2781,7 @@ Configurações básicas Perusasetukset Основные настройки + Basis instellingen AED + AED-X Settings @@ -2558,6 +2797,7 @@ Configurações de DEA/DEA-X AUD + AUD-X asetukset Настройки AED + AED-X + AED + AED-X instellingen CPR Settings @@ -2573,6 +2813,7 @@ Configurações de RCP Elvytys asetukset Настройки СЛР + CPR instellingen Advanced Rhythms @@ -2584,9 +2825,11 @@ Ritmos avanzados Edistyneet sydämen rytmit Продвинутые ритмы + Geadvanceerde hartritmen Can Deteriorate + 存在心脏功能受损的可能性 調律状態が悪化するようにする Possibilité de détérioration de la fonction cardiaque 심장기능이 악화될 수 있음 @@ -2595,6 +2838,7 @@ Puede deteriorarse voivatko ne pahentua? Может ухудшиться + Kan verslechteren Random Deteriorate Time Maximum @@ -2606,6 +2850,7 @@ Tiempo aleatorio maximo para deterioro Satunnainen huononemisajan maksimiarvo Максимальное значение времени случайного ухудшения функции сердца + Maximale willekeurige tijd voor een verslechtering Random Deteriorate Time Weight @@ -2617,6 +2862,7 @@ Tiempo aleatorio para deterioro Satunnainen huononemisajan paino Взвешивание времени случайного ухудшения функции сердца + Tijdsgewicht willekeurige verslechtering Deteriorate After Treatment @@ -2628,6 +2874,7 @@ Deterioro tras tratamiento Voiko se pahentua hoidon jälkeen? Ухудшается после лечения + Verslechterd na behandeling PEA Chance @@ -2639,6 +2886,7 @@ Probabilidad de AESP Pulssittoman sähköisen toiminnan mahdollisuus Показатель точности безимпульсной электрической активности (PEA) + PEA kans VT Chance @@ -2650,6 +2898,7 @@ Probabilidad de TV Kammiotakykardian mahdollisuus Вероятность желудочковой тахикардии (VT) + VT kans Asystole blood loss threshold @@ -2661,6 +2910,7 @@ Umbral de pérdida de sangre para la asistolia Asystolan vuoksi menetettävä veren määrä Порог кровопотери при асистолии + Asystole bloedverlies drempelwaarde ROSC After CPR Chance @@ -2672,6 +2922,7 @@ Probabilidad de RCE después desfibrilar con DEA-X ROSC elvytysmahdollisuuden jälkeen Шанс вернуться в спонтанное кровообращение после СЛР + Kans voor ROSC na CPR (Terugkeer naar spontane circulatie) ROSC After AED Chance @@ -2683,6 +2934,7 @@ Probabilidad de RCE después desfibrilar con DEA ROSC AUD-mahdollisuuden jälkeen Шанс вернуться в спонтанное кровообращение после AED + Kans voor ROSC na CPR (Terugkeer naar spontane circulatie) Hardcore Rhythms @@ -2694,6 +2946,7 @@ Ritmos en modo avanzado Vaikeat sydämen rytmit Интенсивность сердечного ритма + Hardcore hartritmen Hardcore Deterioration Chance @@ -2705,6 +2958,7 @@ Probabilidad de deterioro en modo avanzado Vaikean sydämen rytmin heikkenemismahdollisuus Вероятность сильного ухудшения + Hardcore verslechteringskans Blood draw Settings @@ -2720,6 +2974,7 @@ Configurações de extração de sangue Verenoton asetukset Параметры анализа крови + Bloedonttrekkings instellingen AED-X: HR: %1 BP: --/-- SpO2: --- @@ -2733,6 +2988,7 @@ DEA-X: FC: %1 PA: --/-- SpO2: --- AUD-X: HR: %1 BP: --/-- SpO2: --- AED-X: ЧСС: %1 АД: --/-- SpO2: --- + AED-X: HR %1 BD: --/-- SpO2: --- AED-X: PR: %1 BP: %2/%3 SpO2: %4 @@ -2744,6 +3000,7 @@ DEA-X: RC: %1 PS: %2/%3 SpO2: %4 AUD-X: PR: %1 BP: %2/%3 SpO2: %4 AED-X: ЧСС: %1 АД: %2/%3 SpO2: %4 + AED-X: PR %1 BD: %2/%3 SpO2: %4 AED-X: HR: %1 BP: %2/%3 SpO2: %4 @@ -2758,6 +3015,7 @@ AED-X SF: %1 TK: %2%3 SpO2: %4 AUD-X: HR: %1 BP: %2/%3 SpO2: %4 AED-X: ЧСС: %1 АД: %2/%3 SpO2: %4 + AED-X: HR %1 BD: %2/%3 SpO2: %4 AED-X: HR: %1 BP: --/-- SpO2: --- ETCo2: %2 Breaths/min: %3 @@ -2766,6 +3024,7 @@ AED-X: HR: %1 BP: --/-- SpO2: --- ETCo2: %2 Respirations/min: %3 DEA-X: RC: %1 PS: --/-- SpO2: --- ETCo2: %2 Respiraciones/min: %3 DEA-X: FC: %1 PA: --/-- SpO2: --- ETCo2: %2 Respirações/min: %3 + AED-X: HR %1 BD: --/-- SpO2: --- ETCo2: %2 Ademhalingen/min: %3 AED-X: PR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Breaths/min: %6 @@ -2774,6 +3033,7 @@ AED-X: PR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Respirations/min: %6 DEA-X: RC: %1 PS: %2/%3 SpO2: %4 ETCo2: %5 Respiraciones/min: %6 DEA-X: FP: %1 PA: %2/%3 SpO2: %4 ETCo2: %5 Respirações/min: %6 + AED-X: PR %1 BD: %2/%3 SpO2: %4 ETCo2: %5 Ademhalingen/min: %6 AED-X: HR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Breaths/min: %6 @@ -2782,6 +3042,7 @@ AED-X: HR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Respirations/min: %6 DEA-X: RC: %1 PS: %2/%3 SpO2: %4 ETCo2: %5 Respiraciones/min: %6 DEA-X: FC: %1 PA: %2/%3 SpO2: %4 ETCo2: %5 Respirações/min: %6 + AED-X: HR %1 BD: %2/%3 SpO2: %4 ETCo2: %5 Ademhalingen/min: %6 AED-X Vitals Monitor Sounds @@ -2793,6 +3054,7 @@ Sonidos del monitor DEA-X AUD-X terveysmonitorin ääni Звуки монитора жизненно важных функций AED-X + Geluiden van de AED-X vitale waarde monitor Original @@ -2804,6 +3066,7 @@ Original Alkuperäinen Оригинал + Origineel Default @@ -2815,6 +3078,7 @@ Por defecto Oletus По умолчанию + Standaard AED-X alarm SpO2 threshold @@ -2828,6 +3092,7 @@ Limiar de alarme de SpO2 do DEA-X SpO2-taso, joka laukaisee AUD-X-hälytyksen Порог сигнала тревоги SpO2 AED-X + Drempelwaarde voor AED-X alarm van SpO2 AED-X Vitals Monitor BP Measurement Interval @@ -2839,6 +3104,7 @@ Intervalo de medición de la PS en el monitor DEA-X. AUD-X terveysmonitorin verenpaineen mittausväli Интервал измерения артериального давления на мониторе AED-X + AED-X vitale waarden monitor BD metingsinterval Automatic Instant @@ -2850,6 +3116,7 @@ Automático Instantaneo Automaattinen (välitön) Автоматический постоянный + Automatisch direct Automatic (Interval) @@ -2861,6 +3128,7 @@ Automático (Intervalo) Automaattinen (väli) Автоматический (интервал) + Automatisch (interval) Manual @@ -2872,6 +3140,7 @@ Manual Manuaalinen Инструкция + Handmatig AED-X Vitals Monitor BP Measurement Interval Time @@ -2883,6 +3152,7 @@ Tiempo de medición de PS en el monitor DEA-X AUD-X terveysmittarin verenpaineen mittausvälin aika Интервал измерения артериального давления на мониторе AED-X + Tijd van de AED-X vitale waarde monitor BD metingsinterval Cardiac Arrest Bleed Rate @@ -2894,6 +3164,7 @@ Tasa de sangrado en paro cardíaco Verenvuoto sydämenpysähdyksen aikana Частота кровотечений после остановки сердца + Bloedingsnelheid bij hartstilstand Chance for tamponade in penetrating wounds @@ -2902,6 +3173,7 @@ 穿通創におけるタンポナーデの可能性 Chance de tamponnade au cours d'une blessure pénétrante Probabilidade de tamponamento em ferimentos penetrantes + Kans voor tamponade door penetrerende wonden Tamponade progression timer @@ -2910,6 +3182,7 @@ タンポナーデ進行タイマー Timer de progression de la tamponnade Temporizador de progresso de tamponamento + Tamponade progressie timer Tamponade progression chance @@ -2918,6 +3191,7 @@ タンポナーデ進行確率 Chance de progression de la tamponnade Probabilidade de progressão de tamponamento + Tamponade progressie kans diff --git a/addons/feedback/$PBOPREFIX$ b/addons/feedback/$PBOPREFIX$ new file mode 100644 index 000000000..7327aa4c5 --- /dev/null +++ b/addons/feedback/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\feedback \ No newline at end of file diff --git a/addons/feedback/CfgEventHandlers.hpp b/addons/feedback/CfgEventHandlers.hpp new file mode 100644 index 000000000..286874df3 --- /dev/null +++ b/addons/feedback/CfgEventHandlers.hpp @@ -0,0 +1,12 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + disableModuload = "true"; + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/feedback/XEH_PREP.hpp b/addons/feedback/XEH_PREP.hpp new file mode 100644 index 000000000..42df1399d --- /dev/null +++ b/addons/feedback/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(effectLowSpO2); +PREP(effectOpioid); +PREP(handleEffects); +PREP(initEffects); \ No newline at end of file diff --git a/addons/feedback/XEH_postInit.sqf b/addons/feedback/XEH_postInit.sqf new file mode 100644 index 000000000..d10f16232 --- /dev/null +++ b/addons/feedback/XEH_postInit.sqf @@ -0,0 +1,12 @@ +#include "script_component.hpp" + +[false] call FUNC(initEffects); +[true] call FUNC(handleEffects); +[LINKFUNC(handleEffects), 1, false] call CBA_fnc_addPerFrameHandler; + +// Update effects for featureCamera (curator, arsenal, etc) +["featureCamera", { + params ["_unit", "_newCamera"]; + + [true] call FUNC(handleEffects); +}] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/feedback/XEH_preInit.sqf b/addons/feedback/XEH_preInit.sqf new file mode 100644 index 000000000..9e766b44e --- /dev/null +++ b/addons/feedback/XEH_preInit.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#define CBA_SETTINGS_CAT "KAT - ADV Medical: Feedback" + +//low SPO2 Warning Level +[ + QGVAR(effectLowSpO2), + "SLIDER", + [LLSTRING(SETTING_lowSpO2_display), LLSTRING(SETTING_lowSpO2_DESC)], + CBA_SETTINGS_CAT, + [5, 100, 90, 1], + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(enableOpioidEffect), + "CHECKBOX", + [LLSTRING(SETTING_OpioidEffect_display), LLSTRING(SETTING_OpioidEffect_DESC)], + CBA_SETTINGS_CAT, + [true], + true +] call CBA_Settings_fnc_init; + +ADDON = true; diff --git a/addons/feedback/config.cpp b/addons/feedback/config.cpp new file mode 100644 index 000000000..7403adeb2 --- /dev/null +++ b/addons/feedback/config.cpp @@ -0,0 +1,32 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + units[] = {}; + weapons[] = {}; + magazines[] = {}; + requiredAddons[] = { + "ace_medical", + "ace_medical_ai", + "ace_medical_blood", + "ace_medical_damage", + "ace_medical_engine", + "ace_medical_feedback", + "ace_medical_gui", + "ace_medical_statemachine", + "ace_medical_status", + "ace_medical_treatment", + "ace_medical_vitals", + "ace_dogtags", + "cba_settings" + }; + author = "MiszczuZPolski"; + authors[] = {"MiszczuZPolski"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" \ No newline at end of file diff --git a/addons/feedback/functions/fnc_effectLowSpO2.sqf b/addons/feedback/functions/fnc_effectLowSpO2.sqf new file mode 100644 index 000000000..be7398eb1 --- /dev/null +++ b/addons/feedback/functions/fnc_effectLowSpO2.sqf @@ -0,0 +1,44 @@ +#include "..\script_component.hpp" +/* + * Author: Miss Heda, Digii + * Modified by MiszczuZPolski + * Triggers the low SPO2 visual effect. + * +* Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [true, 0.5] call kat_feedback_fnc_effectLowSpO2; + * + * Public: No + */ + +params ["_enable", "_intensity"]; + +if ((!_enable) || {_intensity == 0}) exitWith { + if (GVAR(lowSpO2) != -1) then { GVAR(lowSpO2) ppEffectEnable true; }; +}; +if (GVAR(lowSpO2) != -1) then { GVAR(lowSpO2) ppEffectEnable true; }; + +// Trigger effect every 2s +private _showNextTick = missionNamespace getVariable [QGVAR(showLowSpO2NextTick), true]; +GVAR(showLowSpO2NextTick) = !_showNextTick; +if (_showNextTick) exitWith {}; + +private _initialAdjust = []; +private _delayedAdjust = []; + +_initialAdjust = [1, 1, 0, [0, 0, 0, 0.9], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]; +_delayedAdjust = [1, 1, 0, [0, 0, 0, 0.1], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]; + +GVAR(lowSpO2) ppEffectAdjust _initialAdjust; +GVAR(lowSpO2) ppEffectCommit FX_SPO2_FADE_IN; +[{ + params ["_adjust"]; + GVAR(lowSpO2) ppEffectAdjust _adjust; + GVAR(lowSpO2) ppEffectCommit FX_SPO2_FADE_OUT; +}, [_delayedAdjust], FX_SPO2_FADE_IN] call CBA_fnc_waitAndExecute; diff --git a/addons/feedback/functions/fnc_effectOpioid.sqf b/addons/feedback/functions/fnc_effectOpioid.sqf new file mode 100644 index 000000000..4d7b4e71f --- /dev/null +++ b/addons/feedback/functions/fnc_effectOpioid.sqf @@ -0,0 +1,44 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Triggers the opiod effect. + * + * Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [true, 0.5] call kat_feedback_fnc_effectOpiod; + * + * Public: No + */ + +params ["_enable", "_intensity"]; +if !GVAR(enableOpioidEffect) exitWith {}; +if (!_enable || {_intensity < 0.15}) exitWith { + if (GVAR(opioidEffect) != -1) then { GVAR(opioidEffect) ppEffectEnable false; }; +}; +if (GVAR(opioidEffect) != -1) then { GVAR(opioidEffect) ppEffectEnable true; }; + +// Trigger effect every 2s +private _showNextTick = missionNamespace getVariable [QGVAR(showOpioidNextTick), true]; +GVAR(showOpioidNextTick) = !_showNextTick; +if (_showNextTick) exitWith {}; + +private _initialAdjust = []; +private _delayedAdjust = []; + +_intensity = linearConversion [0, 1, _intensity, 0, 1, true]; +_initialAdjust = [_intensity , _intensity , true]; +_delayedAdjust = [_intensity * 0.15, _intensity * 0.15, true]; + +GVAR(opioidEffect) ppEffectAdjust _initialAdjust; +GVAR(opioidEffect) ppEffectCommit FX_OPIOD_FADE_IN; +[{ + params ["_adjust"]; + GVAR(opioidEffect) ppEffectAdjust _adjust; + GVAR(opioidEffect) ppEffectCommit FX_OPIOD_FADE_OUT; +}, [_delayedAdjust], FX_OPIOD_FADE_IN] call CBA_fnc_waitAndExecute; diff --git a/addons/feedback/functions/fnc_handleEffects.sqf b/addons/feedback/functions/fnc_handleEffects.sqf new file mode 100644 index 000000000..a178e9c77 --- /dev/null +++ b/addons/feedback/functions/fnc_handleEffects.sqf @@ -0,0 +1,41 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Handles any visual effects of medical. + * + * Arguments: + * 0: Manual, instant update (optional, default false) + * + * Return Value: + * None + * + * Example: + * [] call kat_feedback_fnc_handleEffects + * + * Public: No + */ +params [["_manualUpdate", false]]; + +if (ACEGVAR(common,OldIsCamera) || {!alive ACE_player}) exitWith { + [false] call FUNC(effectOpioid); + [false] call FUNC(effectLowSpO2); +}; + +BEGIN_COUNTER(handleEffects); + +// - Current state info ------------------------------------------------------- +private _opioid = GET_PP(ACE_player); +private _spO2 = GET_SPO2(ACE_player); +private _unconscious = IS_UNCONSCIOUS(ACE_player); + +// - Visual effects ----------------------------------------------------------- + +[!_unconscious, _opioid] call FUNC(effectOpioid); + +[ + !_unconscious, + linearConversion [GVAR(effectLowSpO2), EGVAR(breathing,SpO2_dieValue), _spO2, 0, 1, true] +] call FUNC(effectLowSpO2); + + +END_COUNTER(handleEffects); diff --git a/addons/feedback/functions/fnc_initEffects.sqf b/addons/feedback/functions/fnc_initEffects.sqf new file mode 100644 index 000000000..ff0cbe28b --- /dev/null +++ b/addons/feedback/functions/fnc_initEffects.sqf @@ -0,0 +1,47 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Initializes visual effects of medical. + * + * Arguments: + * 0: Update pain and low blood volume effects only + * + * Return Value: + * None + * + * Example: + * [false] call ace_medical_feedback_fnc_initEffects + * + * Public: No + */ + +params [["_updateOnly", false]]; + +TRACE_1("initEffects",_updateOnly); + +private _fnc_createEffect = { + params ["_type", "_layer", "_default"]; + + private _effect = ppEffectCreate [_type, _layer]; + _effect ppEffectForceInNVG true; + _effect ppEffectAdjust _default; + _effect ppEffectCommit 0; + + _effect +}; + +if (_updateOnly) exitWith {}; + +// - Opioid ----------------------------------------------------------- +GVAR(opioidEffect) = [ + "ChromAberration", + 213701, + [0, 0, true ] +] call _fnc_createEffect; + +// - Low SpO2 ----------------------------------------------------------- +GVAR(lowSpO2) = [ + "ColorCorrections", + 21370, + [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]] +] call _fnc_createEffect; diff --git a/addons/feedback/script_component.hpp b/addons/feedback/script_component.hpp new file mode 100644 index 000000000..334ceebe7 --- /dev/null +++ b/addons/feedback/script_component.hpp @@ -0,0 +1,23 @@ +#define COMPONENT feedback +#define COMPONENT_BEAUTIFIED KAT - Feedback +#include "\x\kat\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_FEEDBACK + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_FEEDBACK + #define DEBUG_SETTINGS DEBUG_SETTINGS_FEEDBACK +#endif + +#include "\x\kat\addons\main\script_macros.hpp" + +#define FX_OPIOD_FADE_IN 0.3 +#define FX_OPIOD_FADE_OUT 0.7 + +#define FX_SPO2_FADE_IN 0.7 +#define FX_SPO2_FADE_OUT 1.6 \ No newline at end of file diff --git a/addons/feedback/stringtable.xml b/addons/feedback/stringtable.xml new file mode 100644 index 000000000..87b1e7830 --- /dev/null +++ b/addons/feedback/stringtable.xml @@ -0,0 +1,41 @@ + + + + + Low SpO2 warning level + Nivel de Sp02 bajo para aviso + Schwellwert für niedrigen SpO2 + Niveau d'alerte de SpO2 basse + 低SpO2警告のレベル + 낮은 산소포화도 경고 수준 + Livello di allerta bassa SPO2 + Nível de alerta de SpO2 baixo + Ostrzeżenie o niskim SpO2 + Hodnota SpO2 pro varování o nízkém SpO2 + Matala SpO2-varoitustaso + Низкий уровень предупреждения SpO2 + + + Lets you change the SpO2 Value at which you get the Flashing warning indicator and stamina loss effect + Te permite bajar el nivel de Sp02 a partir del cual se empiezan a efectuar flashazos negros y se pierde resistencia + Definiert den SpO2 Wert, bei welchem der Ausdauerverlust und der visuelle Effekt (dunkle, pulsierende Vignettierung) eintritt + Règle la valeur de SpO2 à laquelle les flashs d'alerte et la perte d'endurance apparaissent + 画面点滅による警告とスタミナ損失効果が発生するSpO2の値を変更できます + 깜빡임 경고 표시 및 스태미나 손실 효과를 얻게 되는 산소포화도 값을 변경합니다. + Ti permette di cambiare il valore di SPO2 al quale ricevi l'indicatore lampeggiante d'allerta e l'effetto di perdita della stamina + Permite alterar o valor SpO2 no qual você é avisado e sofre perda de stamina + Pozwala zmienić poziom SpO2, poniżej którego będzie widać ostrzeżenie w postaci migotania ekranu i zmniejszonej staminy + Nastavení hodnoty SpO2 při které se aktivují varovné efekty problikávání obrazovky a ztráta staminy + Voit muuttaa SpO2-arvoa, jolla saat vilkkuvan varoituksen ja kestävyyden heikkenemisen + Позволяет изменить значение SpO2, при котором вы получаете мигающий предупреждающий индикатор и эффект потери выносливости + + + Enable opioid effect + オピオイド効果を有効化 + + + Enables opioid effect on ketamine, fentanyl and pervitin + ケタミン、フェンタニル、ペルビチンなどでオピオイドの効果を有効にします + + + diff --git a/addons/gui/CfgFunctions.hpp b/addons/gui/CfgFunctions.hpp index 751d0352a..a9e6c4cd1 100644 --- a/addons/gui/CfgFunctions.hpp +++ b/addons/gui/CfgFunctions.hpp @@ -2,6 +2,9 @@ class CfgFunctions { class overwrite_medical_gui { tag = "ace_medical_gui"; class ace_medical_gui { + class menuPFH { + file = QPATHTOF(functions\fnc_menuPFH.sqf); + }; class onMenuClose { file = QPATHTOF(functions\fnc_onMenuClose.sqf); }; diff --git a/addons/gui/XEH_PREP.hpp b/addons/gui/XEH_PREP.hpp index 4c42ae836..330c8f51c 100644 --- a/addons/gui/XEH_PREP.hpp +++ b/addons/gui/XEH_PREP.hpp @@ -1,6 +1,13 @@ +PREP(dumpBloodGas); +PREP(handleIVAdjust); +PREP(handleIVShow); +PREP(handleABGShow); PREP(logListAppended); +PREP(menuPFH); PREP(onMenuClose); PREP(onMenuOpen); PREP(updateCategories); PREP(updateInjuryList); -PREP(updateBodyImage); \ No newline at end of file +PREP(updateBodyImage); +PREP(updateIVStatus); +PREP(updateABGStatus); \ No newline at end of file diff --git a/addons/gui/functions/fnc_dumpBloodGas.sqf b/addons/gui/functions/fnc_dumpBloodGas.sqf new file mode 100644 index 000000000..a0250af6b --- /dev/null +++ b/addons/gui/functions/fnc_dumpBloodGas.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinksi + * Removes blood gas testing values + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [_target] call kat_medical_gui_fnc_dumpBloodGas; + * + * Public: No + */ + +params ["_target"]; + + _target setVariable [QEGVAR(circulation,testedBloodGas), [0,0,0,0,0,0], true]; \ No newline at end of file diff --git a/addons/gui/functions/fnc_handleABGShow.sqf b/addons/gui/functions/fnc_handleABGShow.sqf new file mode 100644 index 000000000..6890202fb --- /dev/null +++ b/addons/gui/functions/fnc_handleABGShow.sqf @@ -0,0 +1,21 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinksi + * Changes the visibility of the ABG Menu + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [_target] call kat_medical_gui_fnc_handleABGShow; + * + * Public: No + */ + +params ["_target"]; + +private _ABGMenu = [true, false] select (_target getVariable [QEGVAR(pharma,ABGmenuShow), false]); +_target setVariable [QEGVAR(pharma,ABGmenuShow), _ABGMenu, true]; \ No newline at end of file diff --git a/addons/gui/functions/fnc_handleIVAdjust.sqf b/addons/gui/functions/fnc_handleIVAdjust.sqf new file mode 100644 index 000000000..5bc50112c --- /dev/null +++ b/addons/gui/functions/fnc_handleIVAdjust.sqf @@ -0,0 +1,25 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinksi + * Adjusts IV flow rates from GUI + * + * Arguments: + * 0: Target + * 1: Body Part + * 2: Adjust Value + * + * Return Value: + * None + * + * Example: + * [_target, 2, 0.5] call kat_medical_gui_fnc_handleIVAdjust; + * + * Public: No + */ + +params ["_target", "_bodyPartN", "_adjust"]; + +private _ivFlow = _target getVariable [QEGVAR(pharma,IVFlow),[0,0,0,0,0,0]]; + +_ivFlow set [_bodyPartN, ((((_ivFlow select _bodyPartN) + _adjust) max 0) min 1.5)]; +_target setVariable [QEGVAR(pharma,IVFlow), _ivFlow, true]; \ No newline at end of file diff --git a/addons/gui/functions/fnc_handleIVShow.sqf b/addons/gui/functions/fnc_handleIVShow.sqf new file mode 100644 index 000000000..210371436 --- /dev/null +++ b/addons/gui/functions/fnc_handleIVShow.sqf @@ -0,0 +1,21 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinksi + * Changes the visibility of the IV Menu + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [_target] call kat_medical_gui_fnc_handleIVShow; + * + * Public: No + */ + +params ["_target"]; + +private _IVMenu = [true, false] select (_target getVariable [QEGVAR(pharma,IVmenuActive), false]); +_target setVariable [QEGVAR(pharma,IVmenuActive), _IVMenu, true]; \ No newline at end of file diff --git a/addons/gui/functions/fnc_menuPFH.sqf b/addons/gui/functions/fnc_menuPFH.sqf new file mode 100644 index 000000000..ee3949318 --- /dev/null +++ b/addons/gui/functions/fnc_menuPFH.sqf @@ -0,0 +1,66 @@ +#include "..\script_component.hpp" +/* + * Author: mharis001 + * Modified: Mazinski + * 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, ACEGVAR(medical_gui,target), ["isNotInside", "isNotSwimming"]] call ACEFUNC(common,canInteractWith) || {!isNull findDisplay 312}) && // Allow player to look at himself when unconsious and in Zeus + {[ACE_player, ACEGVAR(medical_gui,target)] call ACEFUNC(medical_gui,canOpenMenu)} +) then { + closeDialog 0; + // Show hint if distance condition failed + if ((ACE_player distance ACEGVAR(medical_gui,target) > ACEGVAR(medical_gui,maxDistance)) && {vehicle ACE_player != vehicle ACEGVAR(medical_gui,target)}) then { + if (((getPosATL ACEGVAR(medical_gui,target)) # 2) < -9) exitWith {}; // handle dragging corpse/clone + [[ACELSTRING(medical,DistanceToFar), ACEGVAR(medical_gui,target) call ACEFUNC(common,getName)], 2] call ACEFUNC(common,displayTextStructured); + }; +}; + +// Get the Medical Menu display +private _display = uiNamespace getVariable [QACEGVAR(medical_gui,menuDisplay), displayNull]; +if (isNull _display) exitWith {}; + +// Update treatment category buttons +[_display] call ACEFUNC(medical_gui,updateCategories); + +// Update treatment actions for current category +[_display] call ACEFUNC(medical_gui,updateActions); + +// Update IV Status +[ACEGVAR(medical_gui,target)] call FUNC(updateIVStatus); + +// Update Blood Gas +[ACEGVAR(medical_gui,target)] call FUNC(updateABGStatus); + +// Update injury list +private _ctrlInjuries = _display displayCtrl IDC_INJURIES; +[_ctrlInjuries, ACEGVAR(medical_gui,target), ACEGVAR(medical_gui,selectedBodyPart)] call ACEFUNC(medical_gui,updateInjuryList); + +// Update body image +private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP; +[_ctrlBodyImage, ACEGVAR(medical_gui,target), ACEGVAR(medical_gui,selectedBodyPart)] call ACEFUNC(medical_gui,updateBodyImage); + +// Update activity and quick view logs +private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY; +private _activityLog = ACEGVAR(medical_gui,target) getVariable [MED_LOG_VARNAME("activity"), []]; +[_ctrlActivityLog, _activityLog] call ACEFUNC(medical_gui,updateLogList); + +private _ctrlQuickView = _display displayCtrl IDC_QUICKVIEW; +private _quickView = ACEGVAR(medical_gui,target) getVariable [MED_LOG_VARNAME("quick_view"), []]; +[_ctrlQuickView, _quickView] call ACEFUNC(medical_gui,updateLogList); + +// Update triage status +[_display, ACEGVAR(medical_gui,target)] call ACEFUNC(medical_gui,updateTriageStatus); diff --git a/addons/gui/functions/fnc_onMenuOpen.sqf b/addons/gui/functions/fnc_onMenuOpen.sqf index f04f8f3f3..59742a629 100644 --- a/addons/gui/functions/fnc_onMenuOpen.sqf +++ b/addons/gui/functions/fnc_onMenuOpen.sqf @@ -94,6 +94,10 @@ if (GVAR(showPatientSideLabels)) then { (_display displayCtrl IDC_SIDE_LABEL_RIGHT) ctrlShow true; }; +if (EGVAR(pharma,RequireInsIV) && EGVAR(pharma,IVflowControl)) then { + (_display displayCtrl IDC_IV_FLOW_SHOWBUTTON) ctrlShow true; +}; + // Set toggle button icon and tooltip private _ctrl = _display displayCtrl IDC_TOGGLE; if (ACEGVAR(medical_gui,target) == ACE_player) then { diff --git a/addons/gui/functions/fnc_updateABGStatus.sqf b/addons/gui/functions/fnc_updateABGStatus.sqf new file mode 100644 index 000000000..eea6d0861 --- /dev/null +++ b/addons/gui/functions/fnc_updateABGStatus.sqf @@ -0,0 +1,51 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinksi + * Updates ABG status GUI + * + * Arguments: + * 0: Target + * + * Return Value: + * None + * + * Example: + * [_target] call kat_medical_gui_fnc_updateABGStatus; + * + * Public: No + */ + +params ["_target"]; + +// Get tourniquets, damage, and blood loss for target +private _bloodGasTest = _target getVariable [QEGVAR(circulation,testedBloodGas), [0,0,0,0,0,0]]; +private _activeBlood = 0; +private _ABGmenuShow = _target getVariable [QEGVAR(pharma,ABGmenuShow), false]; + +if (_ABGmenuShow) then { + ctrlShow [IDC_ABG_TITLE, true]; + ctrlShow [IDC_ABG_BACKGROUND, true]; + ctrlShow [IDC_TEST_RESET, true]; +} else { + ctrlShow [IDC_ABG_TITLE, false]; + ctrlShow [IDC_ABG_BACKGROUND, false]; + ctrlShow [IDC_TEST_RESET, false]; +}; + +{ + _x params ["_watchIDC"]; + + if !(_ABGmenuShow) then { + ctrlShow [_x, false]; + } else { + ctrlShow [_x, true]; + _activeBlood = _bloodGasTest select _forEachIndex; + + if (_activeBlood != 0) then { + ctrlSetText [_watchIDC, (_activeBlood toFixed 2)]; + } else { + ctrlSetText [_watchIDC, "--.-"]; + }; + }; + +} forEach [IDC_TEST_PACO2, IDC_TEST_PAO2, IDC_TEST_SPO2, IDC_TEST_HCO3, IDC_TEST_PH]; \ No newline at end of file diff --git a/addons/gui/functions/fnc_updateIVStatus.sqf b/addons/gui/functions/fnc_updateIVStatus.sqf new file mode 100644 index 000000000..68d7401ab --- /dev/null +++ b/addons/gui/functions/fnc_updateIVStatus.sqf @@ -0,0 +1,90 @@ +#include "..\script_component.hpp" +/* + * Author: Glowbal, kymckay, mharis001 + * Updates the body image for given target. + * + * Arguments: + * 0: Body image controls group + * 1: Target + * 2: Body part + * + * Return Value: + * None + * + * Example: + * [CONTROL, _target, 0] call ace_medical_gui_fnc_updateBodyImage + * + * Public: No + */ + +params ["_target"]; + +// Get tourniquets, damage, and blood loss for target +private _IV = _target getVariable [QEGVAR(pharma,IV), [0,0,0,0,0,0]]; +private _ivFlow = _target getVariable [QEGVAR(pharma,IVflow), [0,0,0,0,0,0]]; +private _ivMenuShow = _target getVariable [QEGVAR(pharma,IVmenuActive), false]; + +if (_ivMenuShow) then { + ctrlShow [IDC_IV_FLOW_BACKGROUND, true]; + ctrlShow [IDC_IV_FLOW_TITLE, true]; +} else { + ctrlShow [IDC_IV_FLOW_BACKGROUND, false]; + ctrlShow [IDC_IV_FLOW_TITLE, false]; +}; + +{ + _x params ["_coverIDC", "_titleIDC", "_typeIDC", "_valueIDC", "_buttonIDCArray", "_bodyPartN"]; + + private _activeIV = _IV select _bodyPartN; + private _activeFlow = _ivFlow select _bodyPartN; + + if !(_ivMenuShow) then { + _activeIV = -1; + }; + + switch (true) do { + case (_activeIV == 0): { + ctrlShow [_coverIDC, true]; + ctrlShow [_titleIDC, false]; + ctrlShow [_typeIDC, false]; + ctrlShow [_valueIDC, false]; + _buttonIDCArray apply {ctrlShow [_x, false]}; + _buttonIDCArray apply {ctrlEnable [_x, false]}; + }; + case (_activeIV == 1): { + ctrlShow [_coverIDC, false]; + ctrlShow [_titleIDC, true]; + ctrlShow [_typeIDC, true]; + ctrlShow [_valueIDC, true]; + _buttonIDCArray apply {ctrlShow [_x, true]}; + _buttonIDCArray apply {ctrlEnable [_x, true]}; + ctrlSetText [_typeIDC, "IO"]; + ctrlSetText [_valueIDC, (_activeFlow toFixed 1)]; + }; + case (_activeIV > 1): { + ctrlShow [_coverIDC, false]; + ctrlShow [_titleIDC, true]; + ctrlShow [_typeIDC, true]; + ctrlShow [_valueIDC, true]; + _buttonIDCArray apply {ctrlShow [_x, true]}; + _buttonIDCArray apply {ctrlEnable [_x, true]}; + ctrlSetText [_typeIDC, "IV"]; + ctrlSetText [_valueIDC, (_activeFlow toFixed 1)]; + }; + case (_activeIV == -1): { + ctrlShow [_coverIDC, false]; + ctrlShow [_titleIDC, false]; + ctrlShow [_typeIDC, false]; + ctrlShow [_valueIDC, false]; + _buttonIDCArray apply {ctrlShow [_x, false]}; + _buttonIDCArray apply {ctrlEnable [_x, false]}; + }; + }; +} forEach [ + [IDC_IV_FLOW_HEADCOVER, IDC_IV_FLOW_HEADTITLE, IDC_IV_FLOW_HEADTYPE, IDC_IV_FLOW_HEADIV_VALUE, [IDC_IV_FLOW_HEADSUBTRACTFULL, IDC_IV_FLOW_HEADSUBTRACT, IDC_IV_FLOW_HEADADD, IDC_IV_FLOW_HEADADDFULL], 0], + [IDC_IV_FLOW_CHESTCOVER, IDC_IV_FLOW_CHESTTITLE, IDC_IV_FLOW_CHESTTYPE, IDC_IV_FLOW_CHESTTEST, [IDC_IV_FLOW_CHESTSUBTRACTFULL, IDC_IV_FLOW_CHESTSUBTRACT, IDC_IV_FLOW_CHESTADD, IDC_IV_FLOW_CHESTADDFULL], 1], + [IDC_IV_FLOW_LARMCOVER, IDC_IV_FLOW_LARMTITLE, IDC_IV_FLOW_LARMTYPE, IDC_IV_FLOW_LARMIVVALUE, [IDC_IV_FLOW_LARMSUBTRACTFULL, IDC_IV_FLOW_LARMSUBTRACT, IDC_IV_FLOW_LARMADD, IDC_IV_FLOW_LARMADDFULL], 2], + [IDC_IV_FLOW_RARMCOVER, IDC_IV_FLOW_RARMTITLE, IDC_IV_FLOW_RARMTYPE, IDC_IV_FLOW_RARMIVVALUE, [IDC_IV_FLOW_RARMSUBTRACTFULL, IDC_IV_FLOW_RARMSUBTRACT, IDC_IV_FLOW_RARMADD, IDC_IV_FLOW_RARMADDFULL], 3], + [IDC_IV_FLOW_LLEGCOVER, IDC_IV_FLOW_LLEGTITLE, IDC_IV_FLOW_LLEGTYPE, IDC_IV_FLOW_LLEGIVVALUE, [IDC_IV_FLOW_LLEGSUBTRACTFULL, IDC_IV_FLOW_LLEGSUBTRACT, IDC_IV_FLOW_LLEGADD, IDC_IV_FLOW_LLEGADDFULL], 4], + [IDC_IV_FLOW_RLEGCOVER, IDC_IV_FLOW_RLEGTITLE, IDC_IV_FLOW_RLEGTYPE, IDC_IV_FLOW_RLEGIVVALUE, [IDC_IV_FLOW_RLEGSUBTRACTFULL, IDC_IV_FLOW_RLEGSUBTRACT, IDC_IV_FLOW_RLEGADD, IDC_IV_FLOW_RLEGADDFULL], 5] +]; \ No newline at end of file diff --git a/addons/gui/functions/fnc_updateInjuryList.sqf b/addons/gui/functions/fnc_updateInjuryList.sqf index 64e029206..55511183e 100644 --- a/addons/gui/functions/fnc_updateInjuryList.sqf +++ b/addons/gui/functions/fnc_updateInjuryList.sqf @@ -199,7 +199,13 @@ if (ACEGVAR(medical_gui,showDamageEntry)) then { // Indicate if a tourniquet is applied if (HAS_TOURNIQUET_ACTUAL(_target,_selectionN)) then { - _entries pushBack [localize ACELSTRING(medical_gui,Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; + _entries pushBack [format ["%1 [%2]", localize ACELSTRING(medical_gui,Status_Tourniquet_Applied), _target getVariable [QEGVAR(circulation,tourniquetTime), [0,0,0,0,0,0]] select _selectionN], [0.77, 0.51, 0.08, 1]]; +}; + +private _warmerPlaced = _target getVariable [QEGVAR(hypothermia,fluidWarmer), [0,0,0,0,0,0]]; + +if (_warmerPlaced select _selectionN == 1) then { + _entries pushBack [LELSTRING(hypothermia,LineWarmer), [1, 0.75, 0.18, 1]]; }; // Indicate current body part fracture status diff --git a/addons/gui/gui.hpp b/addons/gui/gui.hpp index 47d2e2751..5c94d09f8 100644 --- a/addons/gui/gui.hpp +++ b/addons/gui/gui.hpp @@ -1,4 +1,5 @@ class RscText; +class RscStructuredText; class RscButton; class RscPicture; class RscListBox; @@ -105,7 +106,514 @@ class ACEGVAR(medical_gui,BodyImage): RscControlsGroupNoScrollbars { }; class ACE_Medical_Menu { - class Controls { + class controlsBackground { + class IVFlowBackground: RscText { + idc = IDC_IV_FLOW_BACKGROUND; // LOOK HERE + x = QUOTE(POS_X(-8.5)); + y = QUOTE(POS_Y(1.1)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(16.3)); + colorBackground[] = {0, 0, 0, 0.7}; + }; + class IVFlowTitle: RscText { + idc = IDC_IV_FLOW_TITLE; // LOOK HERE + text = CSTRING(IVFlowTitle); + x = QUOTE(POS_X(-8.5)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(1)); + colorBackground[] = GUI_BCG_COLOR; // LOOK HERE + show = 1; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "true"; + }; + }; + class ABGBackground: IVFlowBackground { + idc = IDC_ABG_BACKGROUND; // LOOK HERE + x = QUOTE(POS_X(39.6)); + y = QUOTE(POS_Y(1.1)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(3.3)); + }; + class ABGTitle: IVFlowTitle { + idc = IDC_ABG_TITLE; // LOOK HERE + text = CSTRING(ABGTitle); + x = QUOTE(POS_X(39.6)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(9)); + h = QUOTE(POS_H(1)); + show = 1; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "true"; + }; + }; + class AdditionalTitle: IVFlowTitle { + idc = IDC_ADD_MENUS; // LOOK HERE + text = "Additional Menus"; + x = QUOTE(POS_X(30.6)); + y = QUOTE(POS_Y(-1)); + w = QUOTE(POS_W(5.5)); + h = QUOTE(POS_H(1)); + colorBackground[] = GUI_BCG_COLOR; // LOOK HERE + show = 1; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "true"; + }; + }; + }; + class controls { + class IVbutton: RscButton { + idc = IDC_IV_FLOW_SHOWBUTTON; // LOOK HERE + onButtonClick = QUOTE([ARR_2(ACEGVAR(medical_gui,target),1)] call FUNC(handleIVShow)); + text = "IV Flow Control"; + x = QUOTE(POS_X(28.7)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(4.4)); + h = QUOTE(POS_H(1)); + show = 0; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {1, 1, 1, 0.4}; + colorBackgroundDisabled[] = {0, 0, 0, 0}; + colorBorder[] = {0,0,0,0}; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "true"; + }; + }; + class HeadCover: RscStructuredText { + idc = IDC_IV_FLOW_HEADCOVER; // LOOK HERE + text = CSTRING(HeadCover); + x = QUOTE(POS_X(-8)); + y = QUOTE(POS_Y(2.3)); + w = QUOTE(POS_W(8)); + h = QUOTE(POS_H(1.3)); + colorBackground[] = {0, 0, 0, 0.5}; + show = 0; + class Attributes { + align = "center"; + valign = "bottom"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + class HeadTitle: RscStructuredText { + idc = IDC_IV_FLOW_HEADTITLE; // LOOK HERE + text = CSTRING(HeadTitle); + x = QUOTE(POS_X(-6.6)); + y = QUOTE(POS_Y(1.5)); + w = QUOTE(POS_W(2.2)); + h = QUOTE(POS_H(0.8)); + colorBackground[] = {0, 0, 0, 0}; + show = 0; + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + size = 0.9; + }; + }; + class HeadType: RscStructuredText { + idc = IDC_IV_FLOW_HEADTYPE; // LOOK HERE + x = QUOTE(POS_X(-3.6)); + y = QUOTE(POS_Y(1.5)); + w = QUOTE(POS_W(2)); + h = QUOTE(POS_H(0.8)); + colorBackground[] = {0, 0, 0, 0}; + show = 0; + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + size = 0.9; + }; + }; + class HeadSubtractFull: RscButton { + idc = IDC_IV_FLOW_HEADSUBTRACTFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),0,-0.5)] call FUNC(handleIVAdjust)); + text = "<<"; + x = QUOTE(POS_X(-7.5)); + y = QUOTE(POS_Y(2.5)); + w = QUOTE(POS_W(1)); + h = QUOTE(POS_H(1)); + show = 0; + colorBackground[] = {0, 0, 0, 0.7}; + colorBackgroundActive[] = {1, 1, 1, 1}; + colorBackgroundDisabled[] = {0, 0, 0, 0.7}; + colorBorder[] = {0,0,0,0}; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + class HeadSubtract: RscButton { + idc = IDC_IV_FLOW_HEADSUBTRACT; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),0,-0.1)] call FUNC(handleIVAdjust)); + text = "<"; + x = QUOTE(POS_X(-6)); + y = QUOTE(POS_Y(2.5)); + w = QUOTE(POS_W(1)); + h = QUOTE(POS_H(1)); + show = 0; + colorBackground[] = {0, 0, 0, 0.7}; + colorBackgroundActive[] = {1, 1, 1, 1}; + colorBackgroundDisabled[] = {0, 0, 0, 0.7}; + colorBorder[] = {0,0,0,0}; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + class HeadIVValue: RscStructuredText { + idc = IDC_IV_FLOW_HEADIV_VALUE; // LOOK HERE + text = CSTRING(IVValue); + x = QUOTE(POS_X(-5)); + y = QUOTE(POS_Y(2.5)); + w = QUOTE(POS_W(2)); + h = QUOTE(POS_H(1)); + colorBackground[] = {0, 0, 0, 0.2}; + show = 0; + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + size = 1; + }; + }; + class HeadAdd: RscButton { + idc = IDC_IV_FLOW_HEADADD; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),0,0.1)] call FUNC(handleIVAdjust)); + text = ">"; + x = QUOTE(POS_X(-3)); + y = QUOTE(POS_Y(2.5)); + w = QUOTE(POS_W(1)); + h = QUOTE(POS_H(1)); + show = 0; + colorBackground[] = {0, 0, 0, 0.7}; + colorBackgroundActive[] = {1, 1, 1, 1}; + colorBackgroundDisabled[] = {0, 0, 0, 0.7}; + colorBorder[] = {0,0,0,0}; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + class HeadAddFull: RscButton { + idc = IDC_IV_FLOW_HEADADDFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),0,0.5)] call FUNC(handleIVAdjust)); + text = ">>"; + x = QUOTE(POS_X(-1.5)); + y = QUOTE(POS_Y(2.5)); + w = QUOTE(POS_W(1)); + h = QUOTE(POS_H(1)); + show = 0; + colorBackground[] = {0, 0, 0, 0.7}; + colorBackgroundActive[] = {1, 1, 1, 1}; + colorBackgroundDisabled[] = {0, 0, 0, 0.7}; + colorBorder[] = {0,0,0,0}; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + + class ChestCover: HeadCover { + idc = IDC_IV_FLOW_CHESTCOVER; + text = CSTRING(ChestCover); // LOOK HERE + y = QUOTE(POS_Y(4.8)); + }; + class ChestTitle: HeadTitle { + idc = IDC_IV_FLOW_CHESTTITLE; // LOOK HERE + text = CSTRING(ChestTitle); + y = QUOTE(POS_Y(4.1)); + }; + class ChestType: HeadType { + idc = IDC_IV_FLOW_CHESTTYPE; // LOOK HERE + y = QUOTE(POS_Y(4.1)); + }; + class ChestSubtractFull: HeadSubtractFull { + idc = IDC_IV_FLOW_CHESTSUBTRACTFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),1,-0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(5)); + }; + class ChestSubtract: HeadSubtract { + idc = IDC_IV_FLOW_CHESTSUBTRACT; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),1,-0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(5)); + }; + class ChestIVValue: HeadIVValue { + idc = IDC_IV_FLOW_CHESTTEST; // LOOK HERE + y = QUOTE(POS_Y(5)); + }; + class ChestAdd: HeadAdd { + idc = IDC_IV_FLOW_CHESTADD; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),1,0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(5)); + }; + class ChestAddFull: HeadAddFull { + idc = IDC_IV_FLOW_CHESTADDFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),1,0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(5)); + }; + + class LArmCover: HeadCover { + idc = IDC_IV_FLOW_LARMCOVER; // LOOK HERE + text = CSTRING(LArmCover); + y = QUOTE(POS_Y(7.4)); + }; + class LArmTitle: HeadTitle { + idc = IDC_IV_FLOW_LARMTITLE; // LOOK HERE + text = CSTRING(LArmTitle); + y = QUOTE(POS_Y(6.6)); + }; + class LArmType: HeadType { + idc = IDC_IV_FLOW_LARMTYPE; // LOOK HERE + y = QUOTE(POS_Y(6.6)); + }; + class LArmSubtractFull: HeadSubtractFull { + idc = IDC_IV_FLOW_LARMSUBTRACTFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),2,-0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(7.6)); + }; + class LArmSubtract: HeadSubtract { + idc = IDC_IV_FLOW_LARMSUBTRACT; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),2,-0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(7.6)); + }; + class LArmIVValue: HeadIVValue { + idc = IDC_IV_FLOW_LARMIVVALUE; // LOOK HERE + y = QUOTE(POS_Y(7.6)); + }; + class LArmAdd: HeadAdd { + idc = IDC_IV_FLOW_LARMADD; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),2,0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(7.6)); + }; + class LArmAddFull: HeadAddFull { + idc = IDC_IV_FLOW_LARMADDFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),2,0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(7.6)); + }; + + class RArmCover: HeadCover { + idc = IDC_IV_FLOW_RARMCOVER; // LOOK HERE + text = CSTRING(RArmCover); + y = QUOTE(POS_Y(10.1)); + }; + class RArmTitle: HeadTitle { + idc = IDC_IV_FLOW_RARMTITLE; // LOOK HERE + text = CSTRING(RArmTitle); + y = QUOTE(POS_Y(9.3)); + }; + class RArmType: HeadType { + idc = IDC_IV_FLOW_RARMTYPE; // LOOK HERE + y = QUOTE(POS_Y(9.3)); + }; + class RArmSubtractFull: HeadSubtractFull { + idc = IDC_IV_FLOW_RARMSUBTRACTFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),3,-0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(10.3)); + }; + class RArmSubtract: HeadSubtract { + idc = IDC_IV_FLOW_RARMSUBTRACT; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),3,-0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(10.3)); + }; + class RArmIVValue: HeadIVValue { + idc = IDC_IV_FLOW_RARMIVVALUE; // LOOK HERE + y = QUOTE(POS_Y(10.3)); + }; + class RArmAdd: HeadAdd { + idc = IDC_IV_FLOW_RARMADD; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),3,0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(10.3)); + }; + class RArmAddFull: HeadAddFull { + idc = IDC_IV_FLOW_RARMADDFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),3,0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(10.3)); + }; + + class LLegCover: HeadCover { + idc = IDC_IV_FLOW_LLEGCOVER; // LOOK HERE + text = CSTRING(LLegCover); + y = QUOTE(POS_Y(12.8)); + }; + class LLegTitle: HeadTitle { + idc = IDC_IV_FLOW_LLEGTITLE; // LOOK HERE + text = CSTRING(LLegTitle); + y = QUOTE(POS_Y(12)); + }; + class LLegType: HeadType { + idc = IDC_IV_FLOW_LLEGTYPE; // LOOK HERE + y = QUOTE(POS_Y(12)); + }; + class LLegSubtractFull: HeadSubtractFull { + idc = IDC_IV_FLOW_LLEGSUBTRACTFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),4,-0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(12.9)); + }; + class LLegSubtract: HeadSubtract { + idc = IDC_IV_FLOW_LLEGSUBTRACT; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),4,-0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(12.9)); + }; + class LLegIVValue: HeadIVValue { + idc = IDC_IV_FLOW_LLEGIVVALUE; // LOOK HERE + y = QUOTE(POS_Y(12.9)); + }; + class LLegAdd: HeadAdd { + idc = IDC_IV_FLOW_LLEGADD; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),4,0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(12.9)); + }; + class LLegAddFull: HeadAddFull { + idc = IDC_IV_FLOW_LLEGADDFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),4,0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(12.9)); + }; + + class RLegCover: HeadCover { + idc = IDC_IV_FLOW_RLEGCOVER; // LOOK HERE + text = CSTRING(RLegCover); + y = QUOTE(POS_Y(15.4)); + }; + class RLegTitle: HeadTitle { + idc = IDC_IV_FLOW_RLEGTITLE; // LOOK HERE + text = CSTRING(RLegTitle); + y = QUOTE(POS_Y(14.6)); + }; + class RLegType: HeadType { + idc = IDC_IV_FLOW_RLEGTYPE; // LOOK HERE + y = QUOTE(POS_Y(14.6)); + }; + class RLegSubtractFull: HeadSubtractFull { + idc = IDC_IV_FLOW_RLEGSUBTRACTFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),5,-0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(15.5)); + }; + class RLegSubtract: HeadSubtract { + idc = IDC_IV_FLOW_RLEGSUBTRACT; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),5,-0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(15.5)); + }; + class RLegIVValue: HeadIVValue { + idc = IDC_IV_FLOW_RLEGIVVALUE; // LOOK HERE + y = QUOTE(POS_Y(15.5)); + }; + class RLegAdd: HeadAdd { + idc = IDC_IV_FLOW_RLEGADD; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),5,0.1)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(15.5)); + }; + class RLegAddFull: HeadAddFull { + idc = IDC_IV_FLOW_RLEGADDFULL; // LOOK HERE + onButtonClick = QUOTE([ARR_3(ACEGVAR(medical_gui,target),5,0.5)] call FUNC(handleIVAdjust)); + y = QUOTE(POS_Y(15.5)); + }; + + class ABGbutton: RscButton + { + idc = IDC_TEST_SHOWBUTTON; + onButtonClick = QUOTE([ARR_2(ACEGVAR(medical_gui,target),1)] call FUNC(handleABGShow)); + text = "ABG Results"; + x = QUOTE(POS_X(33.8)); + y = QUOTE(POS_Y(0)); + w = QUOTE(POS_W(4.2)); + h = QUOTE(POS_H(1)); + show = 1; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {1, 1, 1, 0.4}; + colorBackgroundDisabled[] = {0, 0, 0, 0}; + colorBorder[] = {0,0,0,0}; + class Attributes { + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "true"; + }; + }; + class PaCO2_Output: RscStructuredText { + idc = IDC_TEST_PACO2; // LOOK HERE + text = CSTRING(BGBlank); + x = QUOTE(POS_X(40)); + y = QUOTE(POS_Y(1.5)); + w = QUOTE(POS_W(2.2)); + h = QUOTE(POS_H(1)); + colorBackground[] = {0, 0, 0, 0.5}; + show = 0; + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + size = 1; + }; + }; + class PaO2_Output: PaCO2_Output { + idc = IDC_TEST_PAO2; // LOOK HERE + x = QUOTE(POS_X(43)); + }; + class SpO2_Output: PaCO2_Output { + idc = IDC_TEST_SPO2; // LOOK HERE + x = QUOTE(POS_X(46)); + }; + class HCO3_Output: RscStructuredText { + idc = IDC_TEST_HCO3; // LOOK HERE + text = CSTRING(BGBlank); + x = QUOTE(POS_X(40)); + y = QUOTE(POS_Y(3)); + w = QUOTE(POS_W(2.2)); + h = QUOTE(POS_H(1)); + colorBackground[] = {0, 0, 0, 0.5}; + show = 0; + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + size = 1; + }; + }; + class PH_Output: HCO3_Output { + idc = IDC_TEST_PH; // LOOK HERE + x = QUOTE(POS_X(43)); + }; + class Test_Reset: RscButton { + idc = IDC_TEST_RESET; // LOOK HERE + onButtonClick = QUOTE([ACEGVAR(medical_gui,target)] call FUNC(dumpBloodGas)); + text = CSTRING(TestReset); + x = QUOTE(POS_X(46)); + y = QUOTE(POS_Y(3)); + w = QUOTE(POS_W(2.1)); + h = QUOTE(POS_H(1)); + colorText[] = {1, 1, 1, 0.9}; + colorActive[] = {0, 0, 0, 0.7}; + colorBackground[] = {0, 0, 0, 0.7}; + colorBackgroundActive[] = {1, 1, 1, 1}; + colorBorder[] = {0,0,0,0}; + show = 0; + class Attributes { + align = "center"; + font = "RobotoCondensed"; + shadow = "false"; + }; + }; + + class Triage: RscActivePicture {}; class Surgery: Triage { idc = IDC_SURGERY; diff --git a/addons/gui/gui_defines.hpp b/addons/gui/gui_defines.hpp index d0185fecb..6192eb7b2 100644 --- a/addons/gui/gui_defines.hpp +++ b/addons/gui/gui_defines.hpp @@ -71,3 +71,76 @@ #define IDC_BODY_RIGHTLEG_IV 70141 #define IDC_BODY_LEFTLEG_IV 70142 + +#define IDC_ADD_MENUS 71099 + +#define IDC_IV_FLOW_TITLE 71101 +#define IDC_IV_FLOW_HEADCOVER 71102 +#define IDC_IV_FLOW_HEADTITLE 71103 +#define IDC_IV_FLOW_HEADTYPE 71104 +#define IDC_IV_FLOW_HEADSUBTRACT 71105 +#define IDC_IV_FLOW_HEADIV_VALUE 71106 +#define IDC_IV_FLOW_HEADADD 71107 +#define IDC_IV_FLOW_HEADSUBTRACTFULL 71108 +#define IDC_IV_FLOW_HEADADDFULL 71109 + +#define IDC_IV_FLOW_CHESTCOVER 71110 +#define IDC_IV_FLOW_CHESTTITLE 71111 +#define IDC_IV_FLOW_CHESTTYPE 71112 +#define IDC_IV_FLOW_CHESTSUBTRACT 71113 +#define IDC_IV_FLOW_CHESTTEST 71114 +#define IDC_IV_FLOW_CHESTADD 71115 +#define IDC_IV_FLOW_CHESTSUBTRACTFULL 71116 +#define IDC_IV_FLOW_CHESTADDFULL 71117 + +#define IDC_IV_FLOW_LARMCOVER 71118 +#define IDC_IV_FLOW_LARMTITLE 71119 +#define IDC_IV_FLOW_LARMTYPE 71120 +#define IDC_IV_FLOW_LARMSUBTRACT 71121 +#define IDC_IV_FLOW_LARMIVVALUE 71122 +#define IDC_IV_FLOW_LARMADD 71123 +#define IDC_IV_FLOW_LARMSUBTRACTFULL 71124 +#define IDC_IV_FLOW_LARMADDFULL 71125 + +#define IDC_IV_FLOW_LLEGCOVER 71126 +#define IDC_IV_FLOW_LLEGTITLE 71127 +#define IDC_IV_FLOW_LLEGTYPE 71128 +#define IDC_IV_FLOW_LLEGSUBTRACT 71129 +#define IDC_IV_FLOW_LLEGIVVALUE 71130 +#define IDC_IV_FLOW_LLEGADD 71131 +#define IDC_IV_FLOW_LLEGSUBTRACTFULL 71132 +#define IDC_IV_FLOW_LLEGADDFULL 71133 + +#define IDC_IV_FLOW_RLEGCOVER 71134 +#define IDC_IV_FLOW_RLEGTITLE 71135 +#define IDC_IV_FLOW_RLEGTYPE 71136 +#define IDC_IV_FLOW_RLEGSUBTRACT 71137 +#define IDC_IV_FLOW_RLEGIVVALUE 71138 +#define IDC_IV_FLOW_RLEGADD 71139 +#define IDC_IV_FLOW_RLEGSUBTRACTFULL 71140 +#define IDC_IV_FLOW_RLEGADDFULL 71141 + +#define IDC_IV_FLOW_RARMCOVER 71142 +#define IDC_IV_FLOW_RARMTITLE 71143 +#define IDC_IV_FLOW_RARMTYPE 71144 +#define IDC_IV_FLOW_RARMSUBTRACT 71145 +#define IDC_IV_FLOW_RARMIVVALUE 71146 +#define IDC_IV_FLOW_RARMADD 71147 +#define IDC_IV_FLOW_RARMSUBTRACTFULL 71148 +#define IDC_IV_FLOW_RARMADDFULL 71149 + +#define IDC_IV_FLOW_SHOWBUTTON 71150 + +#define IDC_IV_FLOW_BACKGROUND 71199 + +#define IDC_ABG_TITLE 71201 +#define IDC_TEST_PACO2 71202 +#define IDC_TEST_PAO2 71203 +#define IDC_TEST_SPO2 71204 +#define IDC_TEST_HCO3 71205 +#define IDC_TEST_PH 71206 +#define IDC_TEST_RESET 71207 + +#define IDC_TEST_SHOWBUTTON 71208 + +#define IDC_ABG_BACKGROUND 71299 diff --git a/addons/gui/stringtable.xml b/addons/gui/stringtable.xml index 3a0e8a762..056595910 100644 --- a/addons/gui/stringtable.xml +++ b/addons/gui/stringtable.xml @@ -15,6 +15,8 @@ Configurações básicas Perus asetukset Основные настройки + 基础设置 + Basisinstellingen Colored activitylogs (AED-X/Pulseoximeter) @@ -29,9 +31,10 @@ Renkli aktivite günlükleri (AED-X / Pulseoximeter) Logs di attività colorati (AED-X/Pulsossimetro) Цветные журналы активности (AED-X/пульсоксиметр) - 色付きの活動ログ(AED-X /パルスオキシメーター) + 色付きの活動ログ (AED-X / パルスオキシメーター) Registros de atividade colorizados (DEA-X\Oxímetro) Värilliset aktiivisuuslokit (AUD-X/pulssioksimetri) + Gekleurde activiteitslogs (AED-X/Pulseoximeter) Colors the Activitylogs of AED-X or Pulseoximeter red, if any value is critical @@ -49,9 +52,11 @@ 重大値の場合、AED-Xやパルスオキシメーターの活動ログを赤色にします Exibe os registros de atividade em vermelhos se algum valor for crítico Lisää punaista väriä AUD-X:n tai pulssioksimetrin aktiivisuuslokeihin, jos jokin arvo on tappava + Kleurt de activiteitlog van de AED-X of de Pulsoximeter rood, wanneer een waarde kritiek is No pushed fluids + 无法进行输液 주입된 액체 없음 点滴中の輸液なし Keine verabreichten Flüssigkeiten @@ -60,9 +65,11 @@ No se administraron fluidos Ei lisätty nesteitä Никаких переливаний + Geen toegediende vloeistoffen Overlay Selected Body Part + 突出显示选定的身体部位 선택한 신체 부위 오버레이 選択した身体部位のオーバーレイ表示 Ausgewähltes Körperteil überlagern @@ -71,9 +78,11 @@ Resaltar parte del cuerpo seleccionada Korosta valittu kehon osa Показать выбранную часть тела + Omtrekking geselecteerd lichaamsdeel Label Patient Sides + 查看患者标签 환자 측면에 라벨 붙이기 患者の向きのラベル表示 Beschriftung der Patientenseiten @@ -82,6 +91,145 @@ Señalar lados del paciente Merkitse potilaan sivut Маркировка сторон пациента + Label zijden van patiënt + + + HEAD - NO LINE + HOOFD - GEEN LIJN + CABEZA - SIN LINEA + 頭部 - ライン無し + + + CHEST - NO LINE + TORSO - GEEN LIJN + TORSO - SIN LINEA + 胸部 - ライン無し + + + RIGHT ARM - NO LINE + RECHTERARM - GEEN LIJN + BRAZO DERECHO - SIN LINEA + 右腕 - ライン無し + + + LEFT ARM - NO LINE + LINKERARM - GEEN LIJN + BRAZO IZQUIERDO - SIN LINEA + 左腕 - ライン無し + + + RIGHT LEG - NO LINE + RECHTERBEEN - GEEN LIJN + PIERNA DERECHA - SIN LINEA + 右脚 - ライン無し + + + LEFT LEG - NO LINE + LINKERBEEN - GEEN LIJN + PIERNA IZQUIERDA - SIN LINEA + 左脚 - ライン無し + + + IV Flow Control + IV-Stroomregeling + Control de Flujo IV + IV流量操作 + + + ABG Results + ABG resultaten + Resultados ABG + ABG 結果 + + + 0.0 + 0.0 + 0.0 + 0.0 + + + Head + Hoofd + Cabeza + 頭部 + + + IV + IV + IV + IV + + + Chest + Torso + Torso + 胸部 + + + IV + IV + IV + IV + + + LA + LA + BI + 左腕 + + + IV + IV + IV + IV + + + RA + RA + BD + 右腕 + + + IV + IV + IV + IV + + + LL + LB + PI + 左脚 + + + IV + IV + IV + IV + + + RL + RB + PD + 右脚 + + + IV + IV + IV + IV + + + --.- + --.- + --.- + --.- + + + Reset + Reset + Restaurar + リセット diff --git a/addons/hypothermia/$PBOPREFIX$ b/addons/hypothermia/$PBOPREFIX$ new file mode 100644 index 000000000..db7fe72be --- /dev/null +++ b/addons/hypothermia/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\hypothermia \ No newline at end of file diff --git a/addons/hypothermia/ACE_Medical_Treatment_Actions.hpp b/addons/hypothermia/ACE_Medical_Treatment_Actions.hpp new file mode 100644 index 000000000..0cc85314e --- /dev/null +++ b/addons/hypothermia/ACE_Medical_Treatment_Actions.hpp @@ -0,0 +1,45 @@ +class ACE_Medical_Treatment_Actions { + class CheckPulse; + class BasicBandage; + class ApplyHandWarmers: BasicBandage { + displayName = CSTRING(Use_Handwarmer); + displayNameProgress = CSTRING(Using); + condition = "true"; + treatmentLocations = 0; + treatmentTime = 5; + allowedSelections[] = {"Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + items[] = {"kat_handWarmer"}; + callbackSuccess = QFUNC(useHandWarmer); + }; + class ApplyFluidWarmer: BasicBandage { + displayName = CSTRING(Apply_Warmer); + displayNameProgress = CSTRING(perform); + category = "advanced"; + allowedSelections[] = {"Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + medicRequired = QACEGVAR(medical_treatment,medicIV); + treatmentTime = 10; + items[] = {"kat_fluidWarmer"}; + condition = QUOTE(([ARR_3(_medic,_patient,_bodyPart)] call EFUNC(pharma,removeIV)) && !([ARR_2(_patient,_bodyPart)] call FUNC(removeWarmer))); + callbackSuccess = QFUNC(applyFluidWarmer); + }; + class RemoveFluidWarmer: BasicBandage { + displayName = CSTRING(Remove_Warmer); + displayNameProgress = CSTRING(perform); + category = "advanced"; + allowedSelections[] = {"Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + medicRequired = QACEGVAR(medical_treatment,medicIV); + treatmentTime = 10; + items[] = {}; + condition = QUOTE([ARR_2(_patient,_bodyPart)] call FUNC(removeWarmer)); + callbackSuccess = QFUNC(removeFluidWarmer); + }; + class CheckTemperature: CheckPulse { + displayName = CSTRING(Check_Temperature); + displayNameProgress = CSTRING(Check_Temperature_Progress); + category = "examine"; + allowedSelections[] = {"Head"}; + treatmentTime = 3; + condition = "true"; + callbackSuccess = QFUNC(checkTemperature); + }; +}; diff --git a/addons/hypothermia/CfgEventHandlers.hpp b/addons/hypothermia/CfgEventHandlers.hpp new file mode 100644 index 000000000..4551ce282 --- /dev/null +++ b/addons/hypothermia/CfgEventHandlers.hpp @@ -0,0 +1,20 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + disableModuload = "true"; + }; +}; + +class Extended_Init_EventHandlers { + class CAManBase { + class ADDON { + init = QUOTE([ARR_2((_this select 0),false)] call FUNC(init)); + }; + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/hypothermia/CfgVehicles.hpp b/addons/hypothermia/CfgVehicles.hpp new file mode 100644 index 000000000..6ede5b41d --- /dev/null +++ b/addons/hypothermia/CfgVehicles.hpp @@ -0,0 +1,27 @@ +class CfgVehicles { + class Man; + + class CAManBase: Man { + class ACE_Actions { + class ACE_MainActions { + class KAT_CheckHandWarmers { + displayName = CSTRING(Check_Hand_Warmers); + condition = "true"; + statement = QUOTE([ARR_2(_player,_target)] call FUNC(checkHandWarmers)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + + class ACE_SelfActions { + class KAT_Equipment { + class KAT_CheckHandWarmersSelf { + displayName = CSTRING(Check_Hand_Warmers); + condition = "true"; + statement = QUOTE([ARR_2(_player,_player)] call FUNC(checkHandWarmers)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/hypothermia/CfgWeapons.hpp b/addons/hypothermia/CfgWeapons.hpp new file mode 100644 index 000000000..25bb1d750 --- /dev/null +++ b/addons/hypothermia/CfgWeapons.hpp @@ -0,0 +1,27 @@ +class CfgWeapons { + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + + class kat_handWarmer: ACE_ItemCore { + scope = 2; + displayName = CSTRING(HandWarmer_displayName); + picture = QPATHTOF(ui\warmers.paa); + model = "\A3\Structures_F_EPA\Items\Medical\HeatPack_F.p3d"; + descriptionShort = CSTRING(HandWarmer_DescShort); + ACE_isMedicalItem = 1; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 0.2; + }; + }; + class kat_fluidWarmer: ACE_ItemCore { + scope = 2; + displayName = CSTRING(FluidWarmer_displayName); + picture = QPATHTOF(ui\fluidWarmer.paa); + model = "\A3\Structures_F_EPA\Items\Tools\ButaneTorch_F.p3d"; + descriptionShort = CSTRING(FluidWarmer_DescShort); + ACE_isMedicalItem = 1; + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; +}; diff --git a/addons/hypothermia/XEH_PREP.hpp b/addons/hypothermia/XEH_PREP.hpp new file mode 100644 index 000000000..7469488a6 --- /dev/null +++ b/addons/hypothermia/XEH_PREP.hpp @@ -0,0 +1,12 @@ +PREP(applyFluidWarmer); +PREP(applyFluidWarmerLocal); +PREP(checkHandWarmers); +PREP(checkTemperature); +PREP(fullHealLocal); +PREP(handleRespawn); +PREP(init); +PREP(removeFluidWarmer); +PREP(removeFluidWarmerLocal); +PREP(removeWarmer); +PREP(useHandWarmer); +PREP(useHandWarmerLocal); \ No newline at end of file diff --git a/addons/hypothermia/XEH_postInit.sqf b/addons/hypothermia/XEH_postInit.sqf new file mode 100644 index 000000000..db2503afa --- /dev/null +++ b/addons/hypothermia/XEH_postInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +[QGVAR(useHandWarmer), LINKFUNC(useHandWarmerLocal)] call CBA_fnc_addEventHandler; +[QGVAR(applyFluidWarmer), LINKFUNC(applyFluidWarmerLocal)] call CBA_fnc_addEventHandler; +[QGVAR(removeFluidWarmer), LINKFUNC(removeFluidWarmerLocal)] call CBA_fnc_addEventHandler; + +[QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler; +[QACEGVAR(medical_treatment,fullHealLocalMod), LINKFUNC(fullHealLocal)] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/hypothermia/XEH_preInit.sqf b/addons/hypothermia/XEH_preInit.sqf new file mode 100644 index 000000000..351cb6f8b --- /dev/null +++ b/addons/hypothermia/XEH_preInit.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// Decrease of 0.7C for each degree of lattitude gained. Middle lattitudes between 20N and 20S have average temperatures of 27C, everything decreases from there. +private _mapPosition = if (count([worldName] call ACEFUNC(common,getMapData)) != 0) then { abs([worldName] call ACEFUNC(common,getMapData) select 0) } else { 25 }; +private _mapHighTemperature = if ((_mapPosition - 20) > 0) then { 27 + (-0.7 * (_mapPosition - 27)) } else { 27 }; + +GVAR(positionTemperature) = [_mapPosition, _mapHighTemperature]; + +#define CBA_SETTINGS_CAT "KAT - ADV Medical: Hypothermia" + +[ + QGVAR(hypothermiaActive), + "CHECKBOX", + LLSTRING(ENABLE_HYPOTHERMIA), + [CBA_SETTINGS_CAT, LSTRING(SubCategory_Hypothermia)], + [true], + true +] call CBA_Settings_fnc_init; + +ADDON = true; diff --git a/addons/hypothermia/config.cpp b/addons/hypothermia/config.cpp new file mode 100644 index 000000000..861f2a6a3 --- /dev/null +++ b/addons/hypothermia/config.cpp @@ -0,0 +1,39 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + units[] = { + }; + weapons[] = { + "kat_handWarmer", + "kat_fluidWarmer" + }; + magazines[] = { }; + requiredAddons[] = { + "ace_medical", + "ace_medical_ai", + "ace_medical_blood", + "ace_medical_damage", + "ace_medical_engine", + "ace_medical_feedback", + "ace_medical_gui", + "ace_medical_statemachine", + "ace_medical_status", + "ace_medical_treatment", + "ace_medical_vitals", + "ace_dogtags", + "cba_settings" + }; + author = "Mazinski"; + authors[] = {"Mazinski"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "ACE_Medical_Treatment_Actions.hpp" \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_applyFluidWarmer.sqf b/addons/hypothermia/functions/fnc_applyFluidWarmer.sqf new file mode 100644 index 000000000..0f1cfc863 --- /dev/null +++ b/addons/hypothermia/functions/fnc_applyFluidWarmer.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Begins Fluid Warmer Treatment + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "RightArm", "FluidWarmer", objNull, "kat_fluidWarmer"] call kat_hypothermia_fnc_applyFluidWarmer; + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[QGVAR(applyFluidWarmer), [_patient, _bodyPart], _patient] call CBA_fnc_targetEvent; + diff --git a/addons/hypothermia/functions/fnc_applyFluidWarmerLocal.sqf b/addons/hypothermia/functions/fnc_applyFluidWarmerLocal.sqf new file mode 100644 index 000000000..42f58b8d6 --- /dev/null +++ b/addons/hypothermia/functions/fnc_applyFluidWarmerLocal.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Local call for applying fluid warmers + * + * Arguments: + * 0: Patient + * 1: Body Part + * + * Return Value: + * None + * + * Example: + * [cursorObject, "LeftLeg"] call kat_hypothermia_fnc_applyFluidWarmerLocal; + * + * Public: No + */ +params ["_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _warmerArray = _patient getVariable [QGVAR(fluidWarmer), [0,0,0,0,0,0]]; +_warmerArray set [_partIndex, 1]; +_patient setVariable [QGVAR(fluidWarmer), _warmerArray]; \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_checkHandWarmers.sqf b/addons/hypothermia/functions/fnc_checkHandWarmers.sqf new file mode 100644 index 000000000..c28466271 --- /dev/null +++ b/addons/hypothermia/functions/fnc_checkHandWarmers.sqf @@ -0,0 +1,51 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks handwarmer status + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [patient] call kat_hypothermia_fnc_checkHandWarmers; + * + * Public: No + */ + +params ["_target"]; + +private _warmers = _target getVariable [QGVAR(handWarmers), [0,0,0,0,0,0]]; +_warmers params ["_head", "_body", "_larm", "_rarm", "_lleg", "_rleg"]; + +if (_player == _target) exitWith { + if (({_x == 0} count _warmers) == 6) exitWith { + [LLSTRING(HandWarmer_None), 1.5, _target] call ACEFUNC(common,displayTextStructured); + }; + + private _output = format [LLSTRING(Self_Handwarmer_Output), + [(format [LLSTRING(HandWarmer_Body), (random [10, _body, 60]) toFixed 0]), LLSTRING(HandWarmer_Body_None)] select (_body < 10), + [(format [LLSTRING(HandWarmer_LArm), (random [10, _larm, 60]) toFixed 0]), LLSTRING(HandWarmer_LArm_None)] select (_larm < 10), + [(format [LLSTRING(HandWarmer_RArm), (random [10, _rarm, 60]) toFixed 0]), LLSTRING(HandWarmer_RArm_None)] select (_rarm < 10), + [(format [LLSTRING(HandWarmer_LLeg), (random [10, _lleg, 60]) toFixed 0]), LLSTRING(HandWarmer_LLeg_None)] select (_lleg < 10), + [(format [LLSTRING(HandWarmer_RLeg), (random [10, _rleg, 60]) toFixed 0]), LLSTRING(HandWarmer_RLeg_None)] select (_rleg < 10) + ]; + + [_output, 5, _target] call ACEFUNC(common,displayTextStructured); +}; + +if (({_x == 0} count _warmers) == 6) exitWith { + [LLSTRING(HandWarmer_None), 1.5, _target] call ACEFUNC(common,displayTextStructured); +}; + +private _output = format [LLSTRING(Other_Handwarmer_Output), + [(format [LLSTRING(HandWarmer_Body), (random [10, _body, 60]) toFixed 0]), LLSTRING(HandWarmer_Body_None)] select (_body < 10), + [(format [LLSTRING(HandWarmer_LArm), (random [10, _larm, 60]) toFixed 0]), LLSTRING(HandWarmer_LArm_None)] select (_larm < 10), + [(format [LLSTRING(HandWarmer_RArm), (random [10, _rarm, 60]) toFixed 0]), LLSTRING(HandWarmer_RArm_None)] select (_rarm < 10), + [(format [LLSTRING(HandWarmer_LLeg), (random [10, _lleg, 60]) toFixed 0]), LLSTRING(HandWarmer_LLeg_None)] select (_lleg < 10), + [(format [LLSTRING(HandWarmer_RLeg), (random [10, _rleg, 60]) toFixed 0]), LLSTRING(HandWarmer_RLeg_None)] select (_rleg < 10) +]; + +[_output, 5, _player] call ACEFUNC(common,displayTextStructured); \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_checkTemperature.sqf b/addons/hypothermia/functions/fnc_checkTemperature.sqf new file mode 100644 index 000000000..7ecc90422 --- /dev/null +++ b/addons/hypothermia/functions/fnc_checkTemperature.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks patient temperature + * + * Arguments: + * 0: Medic + * 1: Patient + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call kat_hypothermia_fnc_checkTemperature; + * + * Public: No + */ +params ["_medic", "_patient"]; + +private _unitTemperature = _patient getVariable [QGVAR(unitTemperature), 37]; + +switch (true) do { + case (!(alive _patient)) : { [LLSTRING(temperature_dead), 1.5, _medic] call ACEFUNC(common,displayTextStructured); }; + case (_unitTemperature < 29) : { [LLSTRING(temperature_cold), 1.5, _medic] call ACEFUNC(common,displayTextStructured); }; + case (_unitTemperature < 32) : { [LLSTRING(temperature_cool), 1.5, _medic] call ACEFUNC(common,displayTextStructured); }; + case (_unitTemperature < 36) : { [LLSTRING(temperature_mild), 1.5, _medic] call ACEFUNC(common,displayTextStructured); }; + default {[LLSTRING(temperature_warm), 1.5, _medic] call ACEFUNC(common,displayTextStructured); }; +}; \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_fullHealLocal.sqf b/addons/hypothermia/functions/fnc_fullHealLocal.sqf new file mode 100644 index 000000000..f0570e08d --- /dev/null +++ b/addons/hypothermia/functions/fnc_fullHealLocal.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Local callback for fully healing a patient. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_hypothermia_fnc_fullHealLocal + * + * Public: No + */ + +params ["_patient"]; +TRACE_1("fullHealLocal",_patient); + +_patient setVariable [QGVAR(unitTemperature), 37, true]; +_patient setVariable [QGVAR(warmingImpact), 0, true]; +_patient setVariable [QGVAR(handWarmers), [0,0,0,0,0,0], true]; +_patient setVariable [QGVAR(fluidWarmer), [0,0,0,0,0,0], true]; \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_handleRespawn.sqf b/addons/hypothermia/functions/fnc_handleRespawn.sqf new file mode 100644 index 000000000..453e4db2f --- /dev/null +++ b/addons/hypothermia/functions/fnc_handleRespawn.sqf @@ -0,0 +1,53 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Handles the player respawn for Hypothermia. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_hypothermia_fnc_handleRespawn + * + * Public: No + */ + +params ["_patient"]; +TRACE_1("fullHealLocal",_patient); + +[_patient] call FUNC(fullHealLocal); + +if (GVAR(hypothermiaActive)) then { + [{ + params ["_args", "_idPFH"]; + _args params ["_patient"]; + + private _alive = alive _patient; + + if (!_alive) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _handWarmers = _patient getVariable [QGVAR(handWarmers), [0,0,0,0,0,0]]; + + { + _x params ["_timeRemaining"]; + + if (_x > 0) then { + _handWarmers set [_forEachIndex, _timeRemaining - 1]; + }; + } forEach (_handWarmers); + + _patient setVariable [QGVAR(handWarmers), _handWarmers, true]; + + if (GET_BLOOD_VOLUME_LITERS(_patient) > 4) then { + private _impact = (_patient getVariable [QGVAR(warmingImpact), 0]); + [(_impact - 100) max 0, (_impact + 200) min 0] select (_impact < 0); + _patient setVariable [QGVAR(warmingImpact), _impact, true]; + }; + + }, 60, [_patient]] call CBA_fnc_addPerFrameHandler; +}; \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_init.sqf b/addons/hypothermia/functions/fnc_init.sqf new file mode 100644 index 000000000..7e6953ea8 --- /dev/null +++ b/addons/hypothermia/functions/fnc_init.sqf @@ -0,0 +1,56 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Initializes unit variables. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_hypothermia_fnc_init; + * + * Public: No + */ + +params ["_unit", ["_isRespawn", true]]; + +if (!local _unit) exitWith {}; + +[_unit] call FUNC(fullHealLocal); + +if (GVAR(hypothermiaActive)) then { + [{ + params ["_args", "_idPFH"]; + _args params ["_unit"]; + + private _alive = alive _unit; + + if (!_alive) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _handWarmers = _unit getVariable [QGVAR(handWarmers), [0,0,0,0,0,0]]; + + { + _x params ["_timeRemaining"]; + + if (_x > 0) exitWith { + _handWarmers set [_forEachIndex, _timeRemaining - 1]; + }; + + _handWarmers set [_forEachIndex, 0]; + } forEach (_handWarmers); + + _unit setVariable [QGVAR(handWarmers), _handWarmers, true]; + + if (GET_BLOOD_VOLUME_LITERS(_unit) > 4) then { + private _impact = (_unit getVariable [QGVAR(warmingImpact), 0]); + [(_impact - 100) max 0, (_impact + 200) min 0] select (_impact < 0); + _unit setVariable [QGVAR(warmingImpact), _impact, true]; + }; + + }, 60, [_unit]] call CBA_fnc_addPerFrameHandler; +}; \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_removeFluidWarmer.sqf b/addons/hypothermia/functions/fnc_removeFluidWarmer.sqf new file mode 100644 index 000000000..b8b92ec32 --- /dev/null +++ b/addons/hypothermia/functions/fnc_removeFluidWarmer.sqf @@ -0,0 +1,25 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski.H + * Begins Remove Fluid Warmer treatment + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "RightArm", "Fluid Warmer", objNull, "kat_FluidWarmer"] call kat_hypothermia_fnc_removeFluidWarmer; + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[QGVAR(removeFluidWarmer), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/hypothermia/functions/fnc_removeFluidWarmerLocal.sqf b/addons/hypothermia/functions/fnc_removeFluidWarmerLocal.sqf new file mode 100644 index 000000000..359d55932 --- /dev/null +++ b/addons/hypothermia/functions/fnc_removeFluidWarmerLocal.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Local call for removing a fluid warmer + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg"] call kat_hypothermia_fnc_removeFluidWarmerLocal; + * + * Public: No + */ +params ["_medic", "_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _warmerArray = _patient getVariable [QGVAR(fluidWarmer), [0,0,0,0,0,0]]; +_warmerArray set [_partIndex, 0]; +_patient setVariable [QGVAR(fluidWarmer), _warmerArray]; + +[_medic, "kat_fluidWarmer"] call ACEFUNC(common,addToInventory); \ No newline at end of file diff --git a/addons/hypothermia/functions/fnc_removeWarmer.sqf b/addons/hypothermia/functions/fnc_removeWarmer.sqf new file mode 100644 index 000000000..f9207ab6a --- /dev/null +++ b/addons/hypothermia/functions/fnc_removeWarmer.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Check for fluid warmers present + * + * Arguments: + * 0: Patient + * 1: Body Part + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg"] call kat_hypothermia_fnc_removeWarmer; + * + * Public: No + */ +params ["_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _warmerArray = _patient getVariable [QGVAR(fluidWarmer), [0,0,0,0,0,0]]; + +if (_warmerArray select _partIndex == 0) exitWith { + false +}; + +true diff --git a/addons/hypothermia/functions/fnc_useHandWarmer.sqf b/addons/hypothermia/functions/fnc_useHandWarmer.sqf new file mode 100644 index 000000000..ee12251d6 --- /dev/null +++ b/addons/hypothermia/functions/fnc_useHandWarmer.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Begins Hand Warmer treatment + * + * Arguments: + * 0: Medic + * 1: Patient + * 2: Body Part + * 3: Treatment + * 4: Item User (not used) + * 5: Used Item + * + * Return Value: + * None + * + * Example: + * [player, cursorObject, "LeftLeg", "HandWarmer", objNull, "kat_handWarmer"] call kat_hypothermia_fnc_useHandWarmer; + * + * Public: No + */ +params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"]; + +[_patient, _classname] call ACEFUNC(medical_treatment,addToTriageCard); +[_patient, "activity", ACELSTRING(medical_treatment,Activity_usedItem), [[_medic] call ACEFUNC(common,getName), _classname]] call ACEFUNC(medical_treatment,addToLog); + +[QGVAR(useHandWarmer), [_patient, _bodyPart], _patient] call CBA_fnc_targetEvent; diff --git a/addons/hypothermia/functions/fnc_useHandWarmerLocal.sqf b/addons/hypothermia/functions/fnc_useHandWarmerLocal.sqf new file mode 100644 index 000000000..e167c6c90 --- /dev/null +++ b/addons/hypothermia/functions/fnc_useHandWarmerLocal.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Local call for applying hand warmers + * + * Arguments: + * 0: Patient + * 1: Body Part + * + * Return Value: + * None + * + * Example: + * [cursorObject, "LeftLeg"] call kat_hypothermia_fnc_useHandWarmerLocal; + * + * Public: No + */ +params ["_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _warmerArray = _patient getVariable [QGVAR(handWarmers), [0,0,0,0,0,0]]; +_warmerArray set [_partIndex, 60]; + +_patient setVariable [QGVAR(handWarmers), _warmerArray]; \ No newline at end of file diff --git a/addons/hypothermia/script_component.hpp b/addons/hypothermia/script_component.hpp new file mode 100644 index 000000000..4d2776626 --- /dev/null +++ b/addons/hypothermia/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT hypothermia +#define COMPONENT_BEAUTIFIED KAT - Hypothermia +#include "\x\kat\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_HYPOTHERMIA + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_HYPOTHERMIA + #define DEBUG_SETTINGS DEBUG_SETTINGS_Hypothermia +#endif + +#include "\x\kat\addons\main\script_macros.hpp" diff --git a/addons/hypothermia/stringtable.xml b/addons/hypothermia/stringtable.xml new file mode 100644 index 000000000..ec71e7779 --- /dev/null +++ b/addons/hypothermia/stringtable.xml @@ -0,0 +1,251 @@ + + + + + Using + Verwenden + Używanie + Usando + 服用中 + 使用中 + Používám + 사용 중 + Utilisation + Kullanılıyor + Usando + 使用中 + Usando + Käytetään + С помощью + Wordt gebruikt + + + Enable Hypothermia + Schakel hypothermie in + Habilitar hipotermia + 低体温症を有効化 + + + Hand Warmer Impact + Handwarmer impact + Impacto de Calentador de Manos + ハンドウォーマーの影響 + + + Multipler for impact of hand warmers on heat gain + Vermenigvuldiger voor de impact die handwarmers hebben op de stijging van temperatuur + Multiplicador del impacto del calentador de manos en la ganancia de calor + ハンドウォーマーが熱獲得に与える影響の乗数 + + + Fluid Warmer Impact + Vloeistofverwarmer impact + Impacto del Calentador de Fluidos + 輸液ウォーマーの影響 + + + Multipler for impact of fluid warmer on heat gain + Vermenigvuldiger voor de impact die vloeistofverwarmers hebben op de stijging van temperatuur + Multiplicador del impacto del calentador de fluidos en la ganancia de calor + 輸液ウォーマーが熱獲得に与える影響の乗数 + + + Warm Uniforms + Warme uniformen + Uniformes Calientes + 暖かいユニフォーム + + + List of clothing marked that reduces heat loss + Lijst van kleding die temperatuurdalingen verminderen + Listado de ropa marcada como reductora de la pérdida de calor + 熱損失を減らすことが出来るとマークされた衣類のリスト + + + Check Hand Warmers + Check handwarmers + Comprobar Calentadores de Manos + ハンドウォーマーを確認する + + + Hand Warmer + Handwarmers + Calentador de Manos + ハンドウォーマー + + + Small hand warmers to provide warmth in colder climates + Kleine handwarmers die warmte bieden in koude klimaten + Pequeños calentadores de manos para dar calor en climas fríos + 寒冷地でも体を温めることが出来る小さなハンドウォーマー (懐炉) + + + Use Hand Warmer + Gebruik handwarmer + Usar Calentador de Manos + ハンドウォーマーを使用する + + + This is where you have handwarmers and how much longer you think they have in minutes: %1, %2, %3, %4, %5 + Dit is waar je handwarmers hebt en hoelang je denkt dat ze nog werken in minuten: %1, %2, %3, %4, %5 + Aquí es donde tienes calentadores de manos y cuanto piensas que les queda de duración en minutos: %1, %2, %3, %4, %5 + あなたが使用中の ハンドウォーマーの 位置と残り持続時間は 次の通りです (分単位): %1, %2, %3, %4, %5 + + + This patient has handwarmers and they will probably last this many more minutes at this locations: %1, %2, %3, %4, %5 + Deze patient heeft handwarmers op deze locaties en dit is hoelang ze ongeveer nog werken: %1, %2, %3, %4, %5 + Este paciente tiene calentadores de manos y probablemente le duren muchos mas minutos en esos sitios: %1, %2, %3, %4, %5 + この患者が使用中の ハンドウォーマーの 位置と残り持続時間は 次の通りです (分単位): %1, %2, %3, %4, %5 + + + Fluid Line Warmer + IV-lijn verwarmers + Calentador de Línea de Fluidos + 輸液ラインウォーマー + + + Provides heating to IV fluids. Must be placed on an already existing line + Verwarmt IV-vloeistoffen. Moet geplaatst worden op een al aangelegde lijn. + Provee calor a los fluidos IV. Deben ser colocados en una línea ya existentes + IVの輸液を温めます。既存のライン上に配置する必要があります + + + Attach Fluid Warmer + Maak vloeistofverwarmer vast + Poner Calentador de Fluidos + 輸液ウォーマーを取り付ける + + + Remove Fluid Warmer + Maak vloeistofverwarmer los + Quitar Calentador de Fluidos + 輸液ウォーマーを取り外す + + + Patient feels frigid + Patiënt voelt ijskoud aan + El paciente se siente frígido + 患者は凍ったように冷たく感じます + + + Patient feels remarkably cold + Patiënt voel opmerkelijk koud aan + El paciente se siente realmente frío + 患者は著しく冷たく感じます + + + Patient feels moderately cold + Patiënt voelt redelijk koud aan + El paciente se siente moderadamente frío + 患者は少し冷たく感じます + + + Patient feels mildly cool + Patiënt voelt een klein beetje koud aan + El paciente se siente algo frío + 患者は少しひんやりと感じます + + + Patient feels warm + Patiënt voelt warm aan + El paciente se siente cálido + 患者は暖かく感じます + + + Check Temperature + Check temperatuur + Comprobar Temperatura + 体温を確認 + + + Checking Temperature + Temperatuur wordt gecheckt + ComprobandoTemperatura + 体温をチェックしています + + + Check Hand Warmers + Check handwarmers + Comprobar Calentadores de Mano + ハンドウォーマーをチェックします + + + Performing + Wordt uitgevoerd + Realizando + 適用中 + + + Line Warmer Active + Lijnwarmer actief + Calentador de Línea Activo + ラインウォーマーを利用中 + + + No Hand Warmers are active at this time + Momenteel zijn er geen handwarmers actief + No hay calentadores de mano activos actualmente + 現在ハンドウォーマーは使っていません + + + Body: %1 + Torso: %1 + Cuerpo: %1 + 胴体: %1 + + + Body: None + Torso: Geen + Cuerpo: Ninguno + 胴体: なし + + + Left Arm: %1 + Linkerarm: %1 + Brazo Izquierdo: %1 + 左腕: %1 + + + Left Arm: None + Linkerarm: Geen + Brazo Izquierdo: Ninguno + 左腕: なし + + + Right Arm: %1 + Rechterarm: %1 + Brazo Derecho: %1 + 右腕: %1 + + + Right Arm: None + Rechterarm: Geen + Brazo Derecho: Ninguno + 右腕: なし + + + Left Leg: %1 + Linkerbeen: %1 + Pierna Izquierda: %1 + 左脚: %1 + + + Left Leg: None + Linkerbeen: Geen + Pierna Izquierda: Ninguno + 左脚: なし + + + Right Leg: %1 + Rechterbeen: %1 + Pierna Derecha: %1 + 右脚: %1 + + + Right Leg: None + Rechterbeen: Geen + Pierna Derecha: Ninguno + 右脚: なし + + + diff --git a/addons/hypothermia/ui/fluidWarmer.paa b/addons/hypothermia/ui/fluidWarmer.paa new file mode 100644 index 0000000000000000000000000000000000000000..f5311b67750aae244a46d3b029b9b2dbdb0d8b17 GIT binary patch literal 117103 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

kkdDmmYNXA>>8D- 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://github.com/KAT-Advanced-Medical/KAM https://github.com/KAT-Advanced-Medical/KAM https://github.com/KAT-Advanced-Medical/KAM + https://github.com/KAT-Advanced-Medical/KAM diff --git a/addons/misc/CfgFunctions.hpp b/addons/misc/CfgFunctions.hpp index 3e014a03b..b1b6edfb4 100644 --- a/addons/misc/CfgFunctions.hpp +++ b/addons/misc/CfgFunctions.hpp @@ -40,14 +40,6 @@ class CfgFunctions { }; }; }; - class overwrite_ace_medical_status { - tag = "ace_medical_status"; - class ace_medical_status { - class hasStableVitals { - file = QPATHTOF(functions\fnc_hasStableVitals.sqf); - }; - }; - }; class overwrite_dogtags { tag = "ace_dogtags"; class ace_dogtags { diff --git a/addons/misc/CfgVehicles.hpp b/addons/misc/CfgVehicles.hpp index 0e0c992fb..f81c601ea 100644 --- a/addons/misc/CfgVehicles.hpp +++ b/addons/misc/CfgVehicles.hpp @@ -1,6 +1,4 @@ -class CBA_Extended_EventHandlers_base; class CfgVehicles { - #include "vehicle_stretcher.hpp" class Land_IntravenStand_01_base_F; class Land_IntravenStand_01_empty_F: Land_IntravenStand_01_base_F { @@ -46,128 +44,6 @@ class CfgVehicles { ace_dragging_carryDirection = 0; }; - class weapon_bag_base; - class kat_stretcherBag: weapon_bag_base { - class assembleInfo { - displayName = CSTRING(Stretcher_Display); - assembleTo = "kat_stretcher"; - base = ""; - primary = 1; - dissasembleTo[] = {}; - }; - author = "Katalam"; - scope = 2; - editorCategory = "EdCat_Equipment"; - editorSubcategory = "EdSubcat_DismantledWeapons"; - displayName = CSTRING(StretcherPacked_Display); - mass = 60; - }; - - class Tank_F; - class kat_stretcher: Tank_F { - explosionEffect = ""; - fuelExplosionPower = 0; - editorForceEmpty = 1; - editorSubcategory = "edSubcat_Storage"; - crew = "C_man_1"; - icon = "iconObject_1x1"; - hasDriver = 0; - scope = 2; - side = 3; - faction = "CIV_F"; - accuracy = 0.001; - camouflage = 10; - armor = 20; - displayName = CSTRING(Stretcher_Display); - model = QPATHTOF(models\stretcher\vurtual_stretcher.p3d); - simulation = "tankX"; - crewVulnerable = 1; - explosionShielding = 0; - irTarget = 0; - allowTabLock = 0; - memoryPointsGetInCargo = "pos cargo"; - memoryPointsGetInCargoDir = "pos cargo dir"; - cargoAction[] = {"kat_stretcher"}; - tf_isolatedAmount = 0; - numberPhysicalWheels = 0; - hideProxyInCombat = 0; - hideWeaponsCargo = "true"; - ejectDeadCargo = 0; - class Damage { - tex[] = {}; - mat[] = { - QPATHTOF(models\stretcher\seat.rvmat), - QPATHTOF(models\stretcher\seat_destruct.rvmat) - }; - }; - class animationSources { - class seat_hide { - source = "user"; - initPhase = 0; - animPeriod = 0.1; - displayName = "Hide Stretcher"; - forceAnimatePhase = 1; - forceAnimate[] = {"legs_hide", 1}; - }; - }; - maximumLoad = 0; - transportMaxBackpacks = 0; - transportMaxMagazines = 64; - class TransportItems; - class Turrets {}; - transportSoldier = 1; - ace_cargo_canLoad = 0; - ace_Cargo_hasCargo = 0; - ace_dragging_canDrag = 1; - ace_dragging_canCarry = 1; - ace_dragging_dragPosition[] = {0,1.7,0}; - ace_dragging_carryPosition[] = {0, 1.7, 0}; - ace_dragging_dragDirection = 0; - ace_Carry_carryDirection = 0; - ace_cookoff_probability = 0; - slingLoadCargoMemoryPoints[] = {"SlingLoadCargo1", "SlingLoadCargo2", "SlingLoadCargo3", "SlingLoadCargo4"}; - destrType = "destructDefault"; - fuelCapacity = 0; - - //pretend static weapon since some mods don't like unconscious people in static weapons - nameSound = "veh_static_s"; - vehicleClass = "static"; - unitInfoType = "RscUnitInfoStatic"; - crewExplosionProtection = 0; - class DestructionEffects {}; - class VehicleTransport { - class Cargo { - parachuteClass = "B_Parachute_02_F"; - parachuteHeightLimit = 5; - canBeTransported = 1; - dimensions[] = {"VTV_Cargo_Base", "VTV_Cargo_Corner"}; - }; - }; - class EventHandlers { - init = QUOTE(_this call FUNC(stretcher)); - class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers_base {}; - }; - }; - class Land_Stretcher_01_base_F; - class Land_Stretcher_01_olive_F: Land_Stretcher_01_base_F { - ace_cargo_canLoad = 1; - ace_Cargo_hasCargo = 0; - ace_dragging_canDrag = 1; - ace_dragging_canCarry = 1; - ace_dragging_dragPosition[] = {0,1.7,0}; - ace_dragging_carryPosition[] = {0, 1.7, 0}; - ace_dragging_dragDirection = 0; - ace_Carry_carryDirection = 0; - ace_cookoff_probability = 0; - class VehicleTransport { - class Cargo { - parachuteClass = "B_Parachute_02_F"; - parachuteHeightLimit = 5; - canBeTransported = 1; - dimensions[] = {"VTV_Cargo_Base", "VTV_Cargo_Corner"}; - }; - }; - }; class Items_base_F; class kat_Armband_Red_Cross_Object: Items_base_F { scope = 2; @@ -1383,8 +1259,6 @@ class CfgVehicles { class Car_F: Car {}; class Quadbike_01_base_F: Car_F { - stretcherPos[] = {0,0.8,-0.56}; - stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions { class KAT_UnloadAndCarryPatient { @@ -1483,4 +1357,4 @@ class CfgVehicles { }; }; }; -}; +}; \ No newline at end of file diff --git a/addons/misc/CfgWeapons.hpp b/addons/misc/CfgWeapons.hpp index f9b9fd610..26f802a6d 100644 --- a/addons/misc/CfgWeapons.hpp +++ b/addons/misc/CfgWeapons.hpp @@ -1,22 +1,8 @@ class CfgWeapons { - class ToolKit; class ACE_ItemCore; class ACE_NVGoggles_WP; class CBA_MiscItem_ItemInfo; - class Attachable_Helistretcher: ToolKit { - author = "Battlekeeper"; - picture = QPATHTOF(ui\stretcher.paa); - displayName = CSTRING(Helistretcher_Display); - descriptionShort = CSTRING(Helistretcher_Desc); - class ItemInfo { - mass = 20; - uniformModel = "\A3\Weapons_F\Items\Toolkit"; - type = 620; - allowedSlots[] = {801,701,901}; - scope = 0; - }; - }; class kat_Armband_Red_Cross_Item: ACE_ItemCore { author = "Miss Heda, vccv9040 (Swedish Forces Pack)"; diff --git a/addons/misc/XEH_PREP.hpp b/addons/misc/XEH_PREP.hpp index b59d9a0a8..05244afb9 100644 --- a/addons/misc/XEH_PREP.hpp +++ b/addons/misc/XEH_PREP.hpp @@ -1,9 +1,6 @@ -PREP(actionLowerBy10); -PREP(addActionRaise); PREP(addIVbag); PREP(addVehicleCarryLoadActions); PREP(addVehicleUnloadCarryPatientActions); -PREP(attachStretcher); PREP(BubbleWrap); PREP(canCheckDogtag); PREP(canStitchFullBody); @@ -29,16 +26,14 @@ PREP(groupID); PREP(handleRespawn); PREP(handleTourniquetEffects); PREP(handleUnconscious); -PREP(hasStableVitals); -PREP(heliAddActionDeploy); -PREP(heliStretcherAttach); PREP(incompatibilityWarning); PREP(init); PREP(removeIVbag); PREP(setUnconscious); +PREP(setTourniquetTime); +PREP(removeTourniquetTime); PREP(slingArmband); PREP(stopCarryingPrompt); -PREP(stretcher); PREP(stringToArray); PREP(surgicalKitProgressFullBody); PREP(switchMagItems); diff --git a/addons/misc/XEH_postInit.sqf b/addons/misc/XEH_postInit.sqf index a0c9c7aa4..6084ed4a2 100644 --- a/addons/misc/XEH_postInit.sqf +++ b/addons/misc/XEH_postInit.sqf @@ -24,15 +24,13 @@ [QGVAR(addIV_2), LLSTRING(Action_add_IV_Display_250), "", {[_target, _player, 250] call FUNC(addIVbag)}, {[_player, "ACE_salineIV_250"] call FUNC(conditionIVstand)}] call ACEFUNC(interact_menu,createAction) ] call ACEFUNC(interact_menu,addActionToClass); -["Attachable_Helistretcher", ["CONTAINER","CLOTHES"], [LLSTRING(helistretcher_attach)], [], "", [{true},{params ["_unit", "_container", "_item", "_slot", "_params"];_unit == vehicle _unit}], { - params ["_unit", "_container", "_item", "_slot", "_params"]; - [_unit,_item] call kat_misc_fnc_heliStretcherAttach; -},true] call CBA_fnc_addItemContextMenuOption; - if (GVAR(incompatibilityWarning)) then { call FUNC(incompatibilityWarning); }; +[QACEGVAR(medical_treatment,tourniquetLocal), LINKFUNC(setTourniquetTime)] call CBA_fnc_addEventHandler; +[QACEGVAR(medical_treatment,tourniquetRemove), LINKFUNC(removeTourniquetTime)] call CBA_fnc_addEventHandler; + ["kat_Armband_Red_Cross_Item", "kat_Armband_Red_Cross_Goggles"] call ACEFUNC(common,registerItemReplacement); ["kat_Armband_Medic_Item", "kat_Armband_Medic_Goggles"] call ACEFUNC(common,registerItemReplacement); ["kat_Armband_Doctor_Item", "kat_Armband_Doctor_Goggles"] call ACEFUNC(common,registerItemReplacement); diff --git a/addons/misc/config.cpp b/addons/misc/config.cpp index 559c35f76..bc5d59b38 100644 --- a/addons/misc/config.cpp +++ b/addons/misc/config.cpp @@ -4,11 +4,8 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; requiredVersion = REQUIRED_VERSION; - units[] = { - "kat_stretcher", - "kat_stretcherBag" - }; - weapons[] = { "Attachable_Helistretcher" }; + units[] = {}; + weapons[] = {}; magazines[] = { }; requiredAddons[] = { "kat_main", @@ -34,7 +31,6 @@ class CfgPatches { }; }; -#include "CfgMoves.hpp" #include "CfgFunctions.hpp" #include "CfgGlasses.hpp" #include "CfgEventHandlers.hpp" diff --git a/addons/misc/functions/fnc_BubbleWrap.sqf b/addons/misc/functions/fnc_BubbleWrap.sqf index bb1d69e35..1680bdef2 100644 --- a/addons/misc/functions/fnc_BubbleWrap.sqf +++ b/addons/misc/functions/fnc_BubbleWrap.sqf @@ -15,5 +15,6 @@ params ["_unit"]; [_unit, 'kat_Bubble_Wrap'] call ACEFUNC(common,adjustMagazineAmmo); + [QEGVAR(pharma,medicationLocal), [_unit, "Head", "BubbleWrap"], _unit] call CBA_fnc_targetEvent; -playsound3D [selectRandom [QPATHTOF_SOUND(sounds\bubble_wrap_1.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_2.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_3.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_4.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_5.ogg)], _unit, false, getPosASL _unit, 30, 1, 10]; +playSound3D [selectRandom [QPATHTOF_SOUND(sounds\bubble_wrap_1.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_2.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_3.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_4.ogg),QPATHTOF_SOUND(sounds\bubble_wrap_5.ogg)], _unit, false, getPosASL _unit, 30, 1, 10]; diff --git a/addons/misc/functions/fnc_FAK_checkRepack.sqf b/addons/misc/functions/fnc_FAK_checkRepack.sqf index 4998a9440..3232dab69 100644 --- a/addons/misc/functions/fnc_FAK_checkRepack.sqf +++ b/addons/misc/functions/fnc_FAK_checkRepack.sqf @@ -86,9 +86,9 @@ private _fnc_getTargetItemCount = { private _requiredItems = []; switch (_type) do { - case 0: {_requiredItems = missionNameSpace getVariable [QGVAR(IFAKContents), []];}; // IFAK - case 1: {_requiredItems = missionNameSpace getVariable [QGVAR(AFAKContents), []];}; // AFAK - default {_requiredItems = missionNameSpace getVariable [QGVAR(MFAKContents), []];}; // MFAK + case 0: {_requiredItems = missionNamespace getVariable [QGVAR(IFAKContents), []];}; // IFAK + case 1: {_requiredItems = missionNamespace getVariable [QGVAR(AFAKContents), []];}; // AFAK + default {_requiredItems = missionNamespace getVariable [QGVAR(MFAKContents), []];}; // MFAK }; { diff --git a/addons/misc/functions/fnc_FAK_displayContent.sqf b/addons/misc/functions/fnc_FAK_displayContent.sqf index 9f1b5b628..9dbafb1b8 100644 --- a/addons/misc/functions/fnc_FAK_displayContent.sqf +++ b/addons/misc/functions/fnc_FAK_displayContent.sqf @@ -29,7 +29,7 @@ private _firstnline = ""; private _nline = "
"; private _itemColor = ""; private _slotColor = ""; -private _slotNameArray = missionNameSpace getVariable [QGVAR(FAKSlotNames), []]; +private _slotNameArray = missionNamespace getVariable [QGVAR(FAKSlotNames), []]; private _slotName = ""; private _fnc_arrayToHexCode = { @@ -53,19 +53,19 @@ private _fnc_arrayToHexCode = { switch (_fakType) do { case 0: { - _fakContent = missionNameSpace getVariable [QGVAR(IFAKContents), []]; - _slotColor = [(missionNameSpace getVariable [QGVAR(IFAK_Slot_Color), []])] call _fnc_arrayToHexCode; - _itemColor = [(missionNameSpace getVariable [QGVAR(IFAK_Item_Color), []])] call _fnc_arrayToHexCode; + _fakContent = missionNamespace getVariable [QGVAR(IFAKContents), []]; + _slotColor = [(missionNamespace getVariable [QGVAR(IFAK_Slot_Color), []])] call _fnc_arrayToHexCode; + _itemColor = [(missionNamespace getVariable [QGVAR(IFAK_Item_Color), []])] call _fnc_arrayToHexCode; }; case 1: { - _fakContent = missionNameSpace getVariable [QGVAR(AFAKContents), []]; - _slotColor = [(missionNameSpace getVariable [QGVAR(AFAK_Slot_Color), []])] call _fnc_arrayToHexCode; - _itemColor = [(missionNameSpace getVariable [QGVAR(AFAK_Item_Color), []])] call _fnc_arrayToHexCode; + _fakContent = missionNamespace getVariable [QGVAR(AFAKContents), []]; + _slotColor = [(missionNamespace getVariable [QGVAR(AFAK_Slot_Color), []])] call _fnc_arrayToHexCode; + _itemColor = [(missionNamespace getVariable [QGVAR(AFAK_Item_Color), []])] call _fnc_arrayToHexCode; }; default { - _fakContent = missionNameSpace getVariable [QGVAR(MFAKContents), []]; - _slotColor = [(missionNameSpace getVariable [QGVAR(MFAK_Slot_Color), []])] call _fnc_arrayToHexCode; - _itemColor = [(missionNameSpace getVariable [QGVAR(MFAK_Item_Color), []])] call _fnc_arrayToHexCode; + _fakContent = missionNamespace getVariable [QGVAR(MFAKContents), []]; + _slotColor = [(missionNamespace getVariable [QGVAR(MFAK_Slot_Color), []])] call _fnc_arrayToHexCode; + _itemColor = [(missionNamespace getVariable [QGVAR(MFAK_Item_Color), []])] call _fnc_arrayToHexCode; }; }; diff --git a/addons/misc/functions/fnc_FAK_repack.sqf b/addons/misc/functions/fnc_FAK_repack.sqf index 84c67ca4d..ea9d73a6b 100644 --- a/addons/misc/functions/fnc_FAK_repack.sqf +++ b/addons/misc/functions/fnc_FAK_repack.sqf @@ -28,7 +28,7 @@ private _fnc_arrayToRemoveInvItem = { { _unit removeItem (_x select 0); } - } foreach _array; + } forEach _array; }; private _fnc_getUnitContainer = { @@ -65,17 +65,17 @@ private _max = 0; switch (_type) do { case 0: { // IFAK _FAKToAdd = "kat_IFAK"; - _itemList = missionNameSpace getVariable [QGVAR(IFAKContents), []]; + _itemList = missionNamespace getVariable [QGVAR(IFAKContents), []]; _max = 15; }; case 1: { // AFAK _FAKToAdd = "kat_AFAK"; - _itemList = missionNameSpace getVariable [QGVAR(AFAKContents), []]; + _itemList = missionNamespace getVariable [QGVAR(AFAKContents), []]; _max = 63; }; default { // MFAK _FAKToAdd = "kat_MFAK"; - _itemList = missionNameSpace getVariable [QGVAR(MFAKContents), []]; + _itemList = missionNamespace getVariable [QGVAR(MFAKContents), []]; _max = 255; }; }; diff --git a/addons/misc/functions/fnc_FAK_unpack.sqf b/addons/misc/functions/fnc_FAK_unpack.sqf index 65b758940..1d55c73d7 100644 --- a/addons/misc/functions/fnc_FAK_unpack.sqf +++ b/addons/misc/functions/fnc_FAK_unpack.sqf @@ -28,7 +28,7 @@ private _fnc_arrayToInvItem = { { [_unit, _x select 0, _container] call ACEFUNC(common,addToInventory); } - } foreach _array; + } forEach _array; }; private _fnc_getContainer = { @@ -66,21 +66,21 @@ switch (_type) do { _FAKToAdd = "kat_IFAK_Magazine"; _slotArray = [true,true,true,true,false,false,false,false]; _container = [(missionNamespace getVariable [QGVAR(IFAK_Container), 0])] call _fnc_getContainer; - _itemList = missionNameSpace getVariable [QGVAR(IFAKContents), []]; + _itemList = missionNamespace getVariable [QGVAR(IFAKContents), []]; _removeOnEmptyCondition = GVAR(IFAK_RemoveWhenEmpty); }; case 1: { // AFAK _FAKToAdd = "kat_AFAK_Magazine"; _slotArray = [true,true,true,true,true,true,false,false]; _container = [(missionNamespace getVariable [QGVAR(AFAK_Container), 0])] call _fnc_getContainer; - _itemList = missionNameSpace getVariable [QGVAR(AFAKContents), []]; + _itemList = missionNamespace getVariable [QGVAR(AFAKContents), []]; _removeOnEmptyCondition = GVAR(AFAK_RemoveWhenEmpty); }; default { // MFAK _FAKToAdd = "kat_MFAK_Magazine"; _slotArray = [true,true,true,true,true,true,true,true]; _container = [(missionNamespace getVariable [QGVAR(MFAK_Container), 0])] call _fnc_getContainer; - _itemList = missionNameSpace getVariable [QGVAR(MFAKContents), []]; + _itemList = missionNamespace getVariable [QGVAR(MFAKContents), []]; _removeOnEmptyCondition = GVAR(MFAK_RemoveWhenEmpty); }; }; diff --git a/addons/misc/functions/fnc_FAK_updateContents.sqf b/addons/misc/functions/fnc_FAK_updateContents.sqf index d03fd7e8f..f1d8afcb5 100644 --- a/addons/misc/functions/fnc_FAK_updateContents.sqf +++ b/addons/misc/functions/fnc_FAK_updateContents.sqf @@ -16,14 +16,14 @@ */ // IFAK -missionNameSpace setVariable [QGVAR(IFAKContents), +missionNamespace setVariable [QGVAR(IFAKContents), [(missionNamespace getVariable [QGVAR(IFAKFirstSlotItem), []]), (missionNamespace getVariable [QGVAR(IFAKSecondSlotItem), []]), (missionNamespace getVariable [QGVAR(IFAKThirdSlotItem), []]), (missionNamespace getVariable [QGVAR(IFAKFourthSlotItem), []])]]; // AFAK -missionNameSpace setVariable [QGVAR(AFAKContents), +missionNamespace setVariable [QGVAR(AFAKContents), [(missionNamespace getVariable [QGVAR(AFAKFirstSlotItem), []]), (missionNamespace getVariable [QGVAR(AFAKSecondSlotItem), []]), (missionNamespace getVariable [QGVAR(AFAKThirdSlotItem), []]), @@ -32,7 +32,7 @@ missionNameSpace setVariable [QGVAR(AFAKContents), (missionNamespace getVariable [QGVAR(AFAKSixthSlotItem), []])]]; // MFAK -missionNameSpace setVariable [QGVAR(MFAKContents), +missionNamespace setVariable [QGVAR(MFAKContents), [(missionNamespace getVariable [QGVAR(MFAKFirstSlotItem), []]), (missionNamespace getVariable [QGVAR(MFAKSecondSlotItem), []]), (missionNamespace getVariable [QGVAR(MFAKThirdSlotItem), []]), @@ -43,7 +43,7 @@ missionNameSpace setVariable [QGVAR(MFAKContents), (missionNamespace getVariable [QGVAR(MFAKEighthSlotItem), []])]]; // Get Slot Names (didn't wanna create a new file for this) -missionNameSpace setVariable [QGVAR(FAKSlotNames), +missionNamespace setVariable [QGVAR(FAKSlotNames), [(LLSTRING(FAK_Slot_1_Hint)), (LLSTRING(FAK_Slot_2_Hint)), (LLSTRING(FAK_Slot_3_Hint)), diff --git a/addons/misc/functions/fnc_actionLowerBy10.sqf b/addons/misc/functions/fnc_actionLowerBy10.sqf deleted file mode 100644 index 765e3dbba..000000000 --- a/addons/misc/functions/fnc_actionLowerBy10.sqf +++ /dev/null @@ -1,74 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Author: Battlekeeper, modified by YetheSamartaka and Tomcat - * Handles the behaviour of Helistretcher - unwind/rewind the ropes. - * - * - * Example: - * ["_s","_h","_rope1","_rope2","_rope3","_rope4"] call kat_misc_fnc_actionLowerBy10; - * - * Public: No - */ - - params ["_s","_h","_rope1","_rope2","_rope3","_rope4"]; - -_lowerby10 = _h addAction [ - format [" %1", LLSTRING(helistretcher_lower10m)], - { - params ["_target", "_caller", "_actionId", "_arguments"]; - _rope1 = _arguments select 2; - _rope2 = _arguments select 3; - _rope3 = _arguments select 4; - _rope4 = _arguments select 5; - if (ropeLength _rope1 < 50) then { - ropeUnwind [_rope1, 2, 10, true]; - ropeUnwind [_rope2, 2, 10, true]; - ropeUnwind [_rope3, 2, 10, true]; - ropeUnwind [_rope4, 2, 10, true]; - }; - }, - [_s,_h,_rope1,_rope2,_rope3,_rope4], // arguments - 4, // priority - true, // showWindow - true, // hideOnUse - "", // shortcut - "true", // condition - 10, // radius - false, // unconscious - "", // selection - "" // memoryPoint -]; - -_raiseby10 = _h addAction -[ - format [" %1", LLSTRING(helistretcher_raise10m)], - { - params ["_target", "_caller", "_actionId", "_arguments"]; - _rope1 = _arguments select 2; - _rope2 = _arguments select 3; - _rope3 = _arguments select 4; - _rope4 = _arguments select 5; - if (ropeLength _rope1 > 10) then { - ropeUnwind [_rope1, 2, -10, true]; - ropeUnwind [_rope2, 2, -10, true]; - ropeUnwind [_rope3, 2, -10, true]; - ropeUnwind [_rope4, 2, -10, true]; - }; - }, - [_s,_h,_rope1,_rope2,_rope3,_rope4], // arguments - 4, // priority - true, // showWindow - true, // hideOnUse - "", // shortcut - "true", // condition - 10, // radius - false, // unconscious - "", // selection - "" // memoryPoint -]; - -waitUntil {isNull _rope1}; - -_h removeAction _lowerby10; -_h removeAction _raiseby10; diff --git a/addons/misc/functions/fnc_addActionRaise.sqf b/addons/misc/functions/fnc_addActionRaise.sqf deleted file mode 100644 index 60153256c..000000000 --- a/addons/misc/functions/fnc_addActionRaise.sqf +++ /dev/null @@ -1,77 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Author: Battlekeeper, modified by YetheSamartaka and Tomcat - * Handles the behaviour of Helistretcher - unwind/rewind the ropes. - * - * - * Example: - * ["_s","_h","_rope1","_rope2","_rope3","_rope4"] call kat_misc_fnc_addActionRaise; - * - * Public: No - */ - -params ["_s","_h","_rope1","_rope2","_rope3","_rope4"]; - -_h addAction [ - format [" %1", LLSTRING(helistretcher_raise)], - { - params ["_target", "_caller", "_actionId", "_arguments"]; - _caller removeAction _actionId; - _target removeAction _actionId; - _s = _arguments select 0; - _h = _arguments select 1; - _rope1 = _arguments select 2; - _rope2 = _arguments select 3; - _rope3 = _arguments select 4; - _rope4 = _arguments select 5; - - ropeUnwind [_rope1, 10, 3]; - ropeUnwind [_rope2, 10, 3]; - ropeUnwind [_rope3, 10, 3]; - ropeUnwind [_rope4, 10, 3]; - - waitUntil {ropeUnwound _rope1}; - - _u = crew _s; - if (count _u > 0) then { - _patient = _u select 0; - - sleep 8; - deleteVehicle _s; - - [_patient, _h] remoteExec ["moveInCargo", 0]; - - ropeDestroy _rope1; - ropeDestroy _rope2; - ropeDestroy _rope3; - ropeDestroy _rope4; - - _s = createVehicle ["kat_stretcher", (_h modelToWorld [0,0,-5])]; - _s attachTo [_h,[0,0,-.1],"slingload0"]; - [_s,_h] call kat_misc_fnc_heliAddActionDeploy; - } else { - sleep 8; - deleteVehicle _s; - - ropeDestroy _rope1; - ropeDestroy _rope2; - ropeDestroy _rope3; - ropeDestroy _rope4; - - _s = createVehicle ["kat_stretcher", (_h modelToWorld [0,0,-5])]; - _s attachTo [_h,[0,0,-.1],"slingload0"]; - [_s,_h] call kat_misc_fnc_heliAddActionDeploy; - }; - }, - [_s,_h,_rope1,_rope2,_rope3,_rope4], - 4, // priority - true, // showWindow - true, // hideOnUse - "", // shortcut - "!(isNull objectParent player)", // condition - 10, // radius - false, // unconscious - "", // selection - "" // memoryPoint -]; diff --git a/addons/misc/functions/fnc_canCheckDogtag.sqf b/addons/misc/functions/fnc_canCheckDogtag.sqf index b05f43fe5..14ce1235c 100644 --- a/addons/misc/functions/fnc_canCheckDogtag.sqf +++ b/addons/misc/functions/fnc_canCheckDogtag.sqf @@ -20,6 +20,7 @@ params ["", "_target"]; if (isNull _target) exitWith {false}; -// check if disabled for faction -if ([ACEGVAR(dogtags,disabledFactions) getVariable faction _target] param [0, false]) exitWith {false}; -true +// Check if disabled for faction +if ((faction _target) in ACEGVAR(dogtags,disabledFactions)) exitWith {false}; + +!(_target call ACEFUNC(common,isAwake)) diff --git a/addons/misc/functions/fnc_carryObject.sqf b/addons/misc/functions/fnc_carryObject.sqf index d76d38b90..b6a2a0b30 100644 --- a/addons/misc/functions/fnc_carryObject.sqf +++ b/addons/misc/functions/fnc_carryObject.sqf @@ -20,6 +20,12 @@ params ["_unit", "_target"]; TRACE_2("params",_unit,_target); +// If in ViV cargo, unload it first +// Warn user if it failed to unload (shouldn't happen) +if (!isNull isVehicleCargo _target && {!(objNull setVehicleCargo _target)}) then { + WARNING_1("ViV Unload Failed %1",_target); +}; + // Get attachTo offset and direction private _position = _target getVariable [QACEGVAR(dragging,carryPosition), [0, 0, 0]]; private _direction = _target getVariable [QACEGVAR(dragging,carryDirection), 0]; @@ -47,9 +53,6 @@ if (_target isKindOf "CAManBase") then { [QACEGVAR(common,setDir), [_target, _direction], _target] call CBA_fnc_targetEvent; -_unit setVariable [QACEGVAR(dragging,isCarrying), true, true]; -_unit setVariable [QACEGVAR(dragging,carriedObject), _target, true]; - // Add drop action _unit setVariable [QACEGVAR(dragging,releaseActionID), [ _unit, "DefaultAction", @@ -60,19 +63,18 @@ _unit setVariable [QACEGVAR(dragging,releaseActionID), [ // Add anim changed EH [_unit, "AnimChanged", ACEFUNC(dragging,handleAnimChanged), [_unit]] call CBA_fnc_addBISEventHandler; -// Check everything -[ACEFUNC(dragging,carryObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; - -// Reset current dragging height -ACEGVAR(dragging,currentHeightChange) = 0; - // Prevent UAVs from firing private _UAVCrew = _target call ACEFUNC(common,getVehicleUAVCrew); if (_UAVCrew isNotEqualTo []) then { { - _target deleteVehicleCrew _x; + [_x, true] call ACEFUNC(common,disableAiUAV); } forEach _UAVCrew; - _target setVariable [QACEGVAR(dragging,isUAV), true, true]; + _target setVariable [QACEGVAR(dragging,isUAV), _UAVCrew, true]; }; + +// Check everything +[ACEFUNC(cdragging,carryObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; + +[QACEGVAR(dragging,startedCarry), [_unit, _target]] call CBA_fnc_localEvent; diff --git a/addons/misc/functions/fnc_heliAddActionDeploy.sqf b/addons/misc/functions/fnc_heliAddActionDeploy.sqf deleted file mode 100644 index 9c5313358..000000000 --- a/addons/misc/functions/fnc_heliAddActionDeploy.sqf +++ /dev/null @@ -1,70 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Author: Battlekeeper, modified by YetheSamartaka and Tomcat - * Handles the behaviour of Helistretcher - unwind the ropes. - * - * - * Example: - * [_stretcher,_heli] call kat_misc_fnc_heliAddActionDeploy; - * - * Public: No - */ - - params ["_s","_h"]; //_s == Stretcher (Object) | _h == Heli (Object) - -_h addAction [ - format [" %1", LLSTRING(helistretcher_lower)], - { - params ["_target", "_caller", "_actionId", "_arguments"]; - _caller removeAction _actionId; - _target removeAction _actionId; - _s = _arguments select 0; - _h = _arguments select 1; - deleteVehicle _s; - _s = createVehicle ["kat_stretcher", (_h modelToWorld [0,0,-3])]; - - _s addAction [ - format [" %1", LLSTRING(helistretcher_flip)], - { - params ["_target", "_caller", "_actionId", "_arguments"]; - _target setVectorUp [0,0,1]; - _target setPosATL [(getPosATL _target) select 0, (getPosATL _target) select 1, 0]; - }, - nil, // arguments - 5, // priority - true, // showWindow - true, // hideOnUse - "", // shortcut - "true", // condition - 3, // radius - false, // unconscious - "", // selection - "" // memoryPoint - ]; - - _rope1 = ropeCreate [_h, "slingload0", _s, [.25,1,0], 5]; - _rope2 = ropeCreate [_h, "slingload0", _s, [-.25,1,0], 5]; - _rope3 = ropeCreate [_h, "slingload0", _s, [-.25,-1,0], 5]; - _rope4 = ropeCreate [_h, "slingload0", _s, [.25,-1,0], 5]; - - ropeUnwind [_rope1, 2, 20]; - ropeUnwind [_rope2, 2, 20]; - ropeUnwind [_rope3, 2, 20]; - ropeUnwind [_rope4, 2, 20]; - - waitUntil {ropeUnwound _rope1}; - [_s,_h,_rope1,_rope2,_rope3,_rope4] call kat_misc_fnc_addActionRaise; - [_s,_h,_rope1,_rope2,_rope3,_rope4] call kat_misc_fnc_actionLowerBy10; - }, - [_s,_h], - 1, // priority - true, // showWindow - true, // hideOnUse - "", // shortcut - "!(isNull objectParent player)", // condition - 10, // radius - false, // unconscious - "", // selection - "" // memoryPoint -]; diff --git a/addons/misc/functions/fnc_heliStretcherAttach.sqf b/addons/misc/functions/fnc_heliStretcherAttach.sqf deleted file mode 100644 index 8abadb396..000000000 --- a/addons/misc/functions/fnc_heliStretcherAttach.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Author: Battlekeeper, modified by YetheSamartaka and Tomcat - * Handles the behaviour of Helistretcher - attaching it and using it. - * - * - * Example: - * [_unit,_item] call kat_misc_fnc_heliStretcherAttach; - * - * Public: No - */ - - if !(_h isKindOf "Helicopter") exitWith { - [LLSTRING(helistretcher_attention1), 2, ace_player, 10] call ACEFUNC(common,displayTextStructured); - player addItem "Attachable_Helistretcher" - }; - - if !(player distance2D _h <= 15) exitWith { - [LLSTRING(helistretcher_attention2), 2, ace_player, 10] call ACEFUNC(common,displayTextStructured); - player addItem "Attachable_Helistretcher" - }; - -_h = cursorObject; -_s = createVehicle ["kat_stretcher", (_h modelToWorld [0,0,-5])]; -_s attachTo [_h,[0,0,-.1],"slingload0"]; - -[_s,_h] call kat_misc_fnc_heliAddActionDeploy; diff --git a/addons/misc/functions/fnc_removeTourniquetTime.sqf b/addons/misc/functions/fnc_removeTourniquetTime.sqf new file mode 100644 index 000000000..42071f0c8 --- /dev/null +++ b/addons/misc/functions/fnc_removeTourniquetTime.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Removes in game time when tourniquet was applied + * + * Arguments: + * 0: The Unit + * 1: Temperature Adjustments + * 2: Body Part + * + * ReturnValue: + * None + * + * Example: + * [player, cursorObject, "LeftLeg"] call kat_misc_fnc_removeTourniquetTime; + * + * Public: No + */ + +params ["_medic", "_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _tourniquetsDisplay = _patient getVariable [QEGVAR(circulation,tourniquetTime), [0,0,0,0,0,0]]; + +_tourniquetsDisplay set [_partIndex, 0]; + +_patient setVariable [QEGVAR(circulation,tourniquetTime), _tourniquetsDisplay, true]; \ No newline at end of file diff --git a/addons/misc/functions/fnc_setTourniquetTime.sqf b/addons/misc/functions/fnc_setTourniquetTime.sqf new file mode 100644 index 000000000..ddf6def4b --- /dev/null +++ b/addons/misc/functions/fnc_setTourniquetTime.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Records in game time when tourniquet was applied + * + * Arguments: + * 0: The Unit + * 1: Body Part + * + * ReturnValue: + * None + * + * Example: + * [cursorObject, "LeftLeg"] call kat_misc_fnc_setTourniquetTime; + * + * Public: No + */ + +params ["_patient", "_bodyPart"]; + +private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; +private _tourniquetsDisplay = _patient getVariable [QEGVAR(circulation,tourniquetTime), [0,0,0,0,0,0]]; + +_tourniquetsDisplay set [_partIndex, ([dayTime, "HH:MM"] call BIS_fnc_timeToString)]; + +_patient setVariable [QEGVAR(circulation,tourniquetTime), _tourniquetsDisplay, true]; \ No newline at end of file diff --git a/addons/misc/functions/fnc_stretcher.sqf b/addons/misc/functions/fnc_stretcher.sqf deleted file mode 100644 index d3f2db0b8..000000000 --- a/addons/misc/functions/fnc_stretcher.sqf +++ /dev/null @@ -1,40 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: Katalam - * Init function for stretcher - * - * Arguments: - * 0: Stretcher - * - * Return Value: - * None - * - * Example: - * [cursorTarget] call kat_misc_fnc_stretcher; - * - * Public: No - */ - -params [["_object", objNull, [objNull]]]; - -if !(_object isKindOf "kat_stretcher") exitWith {false}; - -[_object] call ACEFUNC(dragging,initObject); - -[_object, 0, ["ACE_MainActions"], - [QGVAR(disassemble), LLSTRING(disassemble_stretcher_display), "", { - params [["_object", objNull, [objNull]]]; - "kat_stretcherBag" createVehicle (getPos _object); // TODO create at exact position - deleteVehicle _object; - }, { - params [["_object", objNull, [objNull]]]; - if ((count crew _object > 0) || !(isNull attachedTo _object)) exitWith {false}; - true; - }] call ACEFUNC(interact_menu,createAction) -] call ACEFUNC(interact_menu,addActionToObject); - -[_object, 0, ["ACE_MainActions"], - [QGVAR(attach), LLSTRING(disassemble_attach_display), "", {}, {true}, {[_target] call FUNC(attachStretcher)}] call ACEFUNC(interact_menu,createAction) -] call ACEFUNC(interact_menu,addActionToObject); - -true diff --git a/addons/misc/functions/fnc_stringToArray.sqf b/addons/misc/functions/fnc_stringToArray.sqf index eac5c59f2..a5389c8c3 100644 --- a/addons/misc/functions/fnc_stringToArray.sqf +++ b/addons/misc/functions/fnc_stringToArray.sqf @@ -23,7 +23,7 @@ if (typeName _str == "ARRAY") exitWith { _str }; -private _clipstring = _str splitstring _spliter; +private _clipstring = _str splitString _spliter; private _array = []; if (_returnNumber) exitWith diff --git a/addons/misc/functions/fnc_treatment.sqf b/addons/misc/functions/fnc_treatment.sqf index dd3a927cb..8fb36e982 100644 --- a/addons/misc/functions/fnc_treatment.sqf +++ b/addons/misc/functions/fnc_treatment.sqf @@ -97,7 +97,7 @@ if (_medic isNotEqualTo player || {!_isInZeus}) then { }; // Determine the animation length - private _animDuration = ACEGVAR(medical_treatment,animDurations) getVariable _medicAnim; + private _animDuration = ACEGVAR(medical_treatment,animDurations) get toLowerANSI _medicAnim; if (isNil "_animDuration") then { WARNING_2("animation [%1] for [%2] has no duration defined",_medicAnim,_classname); _animDuration = 10; diff --git a/addons/misc/functions/fnc_unSlingArmband.sqf b/addons/misc/functions/fnc_unSlingArmband.sqf index f451f6eae..b90276ff2 100644 --- a/addons/misc/functions/fnc_unSlingArmband.sqf +++ b/addons/misc/functions/fnc_unSlingArmband.sqf @@ -18,30 +18,30 @@ params ["_unit", "_limbNumber"]; -private _armbandObject = ObjNull; +private _armbandObject = objNull; private _originalArmband = ""; switch (_limbNumber) do { case 0: { - _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedLA), ObjNull]; + _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedLA), objNull]; _originalArmband = _unit getVariable [QGVAR(armbandVersionLA), _armbandVersion]; _unit setVariable [QGVAR(isLeftArmFree), true, true]; }; case 1: { - _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedRA), ObjNull]; + _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedRA), objNull]; _originalArmband = _unit getVariable [QGVAR(armbandVersionRA), _armbandVersion]; _unit setVariable [QGVAR(isRightArmFree), true, true]; }; case 2: { - _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedLL), ObjNull]; + _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedLL), objNull]; _originalArmband = _unit getVariable [QGVAR(armbandVersionLL), _armbandVersion]; _unit setVariable [QGVAR(isLeftLegFree), true, true]; }; case 3: { - _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedRL), ObjNull]; + _armbandObject = _unit getVariable [QGVAR(whichArmabndisSlingedRL), objNull]; _originalArmband = _unit getVariable [QGVAR(armbandVersionRL), _armbandVersion]; _unit setVariable [QGVAR(isRightLegFree), true, true]; }; diff --git a/addons/misc/functions/fnc_unloadAndCarryPatient.sqf b/addons/misc/functions/fnc_unloadAndCarryPatient.sqf index c6106966e..c34ebe274 100644 --- a/addons/misc/functions/fnc_unloadAndCarryPatient.sqf +++ b/addons/misc/functions/fnc_unloadAndCarryPatient.sqf @@ -34,7 +34,7 @@ if (!GETVAR(_patient,ACEGVAR(dragging,ignoreWeightCarry),false) && { private _timer = CBA_missionTime; // add a primary weapon if the unit has none. -if (primaryWeapon _medic isEqualto "") then { +if (primaryWeapon _medic isEqualTo "") then { _medic addWeapon "ACE_FakePrimaryWeapon"; }; diff --git a/addons/misc/functions/fnc_updateDamageEffects.sqf b/addons/misc/functions/fnc_updateDamageEffects.sqf index 8459acf35..a7aac87ee 100644 --- a/addons/misc/functions/fnc_updateDamageEffects.sqf +++ b/addons/misc/functions/fnc_updateDamageEffects.sqf @@ -71,7 +71,7 @@ if (!_isLimping && {ACEGVAR(medical,limping) > 0}) then { (_xAmountOf > 0) && {_xDamage > LIMPING_DAMAGE_THRESHOLD_DEFAULT} // select _causeLimping from woundDetails - && {(ACEGVAR(medical_damage,woundDetails) get (_xClassID / 10)) select 3} + && {(ACEGVAR(medical_damage,woundDetails) get (floor (_xClassID / 10))) select 3} ) exitWith { TRACE_1("limping because of wound",_x); _isLimping = true; diff --git a/addons/misc/functions/fnc_useItem.sqf b/addons/misc/functions/fnc_useItem.sqf index 05dd798e3..74abae626 100644 --- a/addons/misc/functions/fnc_useItem.sqf +++ b/addons/misc/functions/fnc_useItem.sqf @@ -70,20 +70,22 @@ if (GVAR(allowSharedVehicleEquipment) > 0 && _vehicleCondition) then { { private _origin = _x; - if(_forEachIndex != _vehicleIndex) then { // Remove unit item + if (_forEachIndex != _vehicleIndex) then { // Remove unit item private _originItems = [_origin, 0] call ACEFUNC(common,uniqueItems); // Item { if (_x in _originItems) then { _origin removeItem _x; - [_origin, _x] breakOut "Main"; + [_origin, _x, true] breakOut "Main"; }; } forEach _items; _originItems = [_origin, 2] call ACEFUNC(common,uniqueItems); // Magazine { if (_x in _originItems) then { + private _magsStart = count magazines _unit; [_origin, _x] call ACEFUNC(common,adjustMagazineAmmo); - [_origin, _x] breakOut "Main"; + private _magsEnd = count magazines _unit; + [_unit, _x, (_magsEnd < _magsStart)] breakOut "Main"; }; } forEach _items; } else { // Remove vehicle item @@ -91,7 +93,7 @@ if (GVAR(allowSharedVehicleEquipment) > 0 && _vehicleCondition) then { { if (_x in _originItems) then { _origin addItemCargoGlobal [_x, -1]; - [_origin, _x] breakOut "Main"; + [_origin, _x, false] breakOut "Main"; }; } forEach _items; @@ -99,7 +101,7 @@ if (GVAR(allowSharedVehicleEquipment) > 0 && _vehicleCondition) then { { if (_x in _originItems) then { [_origin, _x] call ACEFUNC(common,adjustMagazineAmmo); - [_origin, _x] breakOut "Main"; + [_origin, _x, false] breakOut "Main"; }; } forEach _items; }; diff --git a/addons/misc/licence.txt b/addons/misc/licence.txt index e4d6b39be..4dd142f90 100644 --- a/addons/misc/licence.txt +++ b/addons/misc/licence.txt @@ -1,4 +1,4 @@ -This addon is made by Katalam. +This addon is made by Katalam. This file must not be removed from the folder and must be contained in every work based on this addon or parts of it. diff --git a/addons/misc/models/stretcher/vurtual_stretcher.p3d b/addons/misc/models/stretcher/vurtual_stretcher.p3d deleted file mode 100644 index f4fa092c0a6e5724fa432925937d95a9742e0756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369457 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

@sOzQwbX_}{srXC(3l@97;xGL#So&AmEB!B6 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≀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 diff --git a/addons/misc/stringtable.xml b/addons/misc/stringtable.xml index b06b8dab0..dcdc9bfaf 100644 --- a/addons/misc/stringtable.xml +++ b/addons/misc/stringtable.xml @@ -9,6 +9,7 @@ Оборудование KAT Equipement KAT Equipamento KAT + KAT apparatuur ACE-Misc activated? @@ -26,6 +27,7 @@ KAMその他モジュールを有効化 ACE - Miscelâneo ativado? ACE-Sekalaista aktivoitu? + ACE-Misc geactiveerd? Attaching IV @@ -43,6 +45,7 @@ IVを取り付けています Colocando IV Kiinnitys IV + IV wordt aangehangen Attach IV (1000ml) @@ -60,6 +63,7 @@ IVを取り付ける (1000ml) Administrar IV (1000ml) Kiinnitys IV (1000ml) + Hang IV aan (1000ml) Attach IV (500ml) @@ -77,6 +81,7 @@ IVを取り付ける (500ml) Administrar IV (500ml) Kiinnitys IV (500ml) + Hang IV aan (500ml) Attach IV (250ml) @@ -94,6 +99,7 @@ IVを取り付ける (250ml) Administrar IV (250ml) Kiinnitys IV (250ml) + Hang IV aan (250ml) Stand: Saline IV (1000ml) @@ -111,6 +117,7 @@ スタンド: 生理食塩水IV (1000ml) Suporte: Soro fisiológico IV (1000ml) Suolaliuosteline IV: (1000ml) + Stand: Saline IV (1000ml) Stand: Saline IV (500ml) @@ -128,6 +135,7 @@ スタンド: 生理食塩水IV (500ml) Suporte: Soro fisiológico IV (500ml) Suolaliuosteline IV: (500ml) + Stand: Saline IV (500ml) Stand: Saline IV (250ml) @@ -145,210 +153,7 @@ スタンド: 生理食塩水IV (250ml) Suporte: Soro fisiológico IV (250ml) Suolaliuosteline IV: (250ml) - - - Disassemble stretcher - Trage einklappen - Złóż nosze - Desarmar camilla - 拆卸式擔架 - 可拆卸式担架 - Rozložit nosítka - 들것 분리 - Désassembler la civière - Sedyeyi sökün - Smonta la barella - Разобрать носилки - 担架を分解する - Desmontar maca - Pura paarit - - - Attach to - Anhängen an - Przyczep do - Adjuntar a - 掛在 - 附加到 - Připevnit k - 에 부착 - Attacher à - Şuna Bağla - Collega a - Приложить к - 取り付ける - Anexar a - Kiinnitä se - - - Attach Stretcher - Przyczep nosze - Trage befestigen - Adjuntar camilla - 附加担架 - 连接担架 - Připevnit nosítka - 들것 부착 - Attacher la civière - Sedyeyi Takın - Attacca la barella - Прикрепить носилки - 担架を取り付ける - Anexar maca - Kiinnitä paarit - - - Lower Stretcher By 10m - Opuść nosze o 10m - Trage um 10m absenken - Bajar la camilla 10m - 下担架 10m - 担架下降 10m - Snížit nosítka o 10m - 들것을 10m 낮추기 - Abaisser la civière de 10 m - Alt Sedye 10m - Barella inferiore di 10 m - Нижние носилки на 10 м - 担架を10m下げる - Abaixar a maca em 10m - Laske paarit 10 m - - - Raise Stretcher By 10m - Wciągnij nosze o 10m - Trage um 10m anheben - Subir la camilla 10m - 将担架抬高 10m - 担架抬高 10m - Vytáhnout nosítka o 10m - 들것을 10m 높이기 - Élever la civière de 10 m - Sedyeyi 10m Yükselt - Alzare la barella di 10 m - Поднимите носилки на 10 м - 担架を10m上げる - Elevar a maca em 10m - Nosta paareja 10 m - - - Raise Stretcher - Wciągnij nosze - Trage anheben - Subir la camilla - AA抬起担架AA - 抬起担架 - Vytáhnout nosítka - 들것 올리기 - Elever la civière - Kaldırma Sedyesi - Alzare la barella - Поднимите носилки - 担架を引き上げる - Elevar a maca - Nosta paarit - - - Lower Stretcher - Opuść nosze - Trage absenken - Bajar la camilla - 下担架 - 放下担架 - Snížit nosítka - 들것 내리기 - Baisser la civière - Alt Sedye - Barella inferiore - Нижние носилки - 担架を降ろす - Abaixar a maca - Laske paarit - - - Flip Stretcher - Obróć nosze - Trage flippen - Voltear camilla - 翻转担架 - 翻转担架 - Otočit nosítka - 들것 뒤집기 - Retourner la civière - Flip Sedye - Flip Barella - Флип носилки - 担架をひっくり返す - Virar a maca - Kääntöpaarit - - - The vehicle you are looking at is not a helicopter! - Pojazd na który patrzysz nie jest śmigłowcem! - Dieses Fahrzeug ist kein Helikopter! - ¡El vehículo al que estás mirando no es un helicóptero! - 您正在查看的车辆不是直升机! - 您正在注视的载具不是直升机! - Vozidlo na které se díváte není helikoptéra! - 당신이 보고 있는 차량은 헬리콥터가 아닙니다! - Le véhicule que vous regardez n'est pas un hélicoptère ! - Baktığınız araç helikopter değil! - Il veicolo che stai guardando non è un elicottero! - Транспортное средство, на которое вы смотрите, не является вертолетом! - 視点を合わせている車両はヘリではありません! - O veículo que você está olhando não é um helicóptero! - Katsomasi ajoneuvo ei ole helikopteri! - - - You must be within 15m of the helicopter and look at it! - Musisz być w zasięgu 15m od śmigłowca i patrzeć w jego kierunku! - Sie müssen sich in einem Umkreis von 15 Metern um den Hubschrauber aufhalten und ihn anschauen! - ¡Debes estar a menos de 15m del helicóptero y viéndolo! - 你必须在直升机 15m 以内并看它! - 你必须在直升机 15m 以内并注视它! - Musíte být v rámci 15m od helikoptéry a dívat se na ni! - 헬리콥터에서 15m 이내에 있어야 하며 헬리콥터를 살펴보세요! - Vous devez être à moins de 15 m de l'hélicoptère et le regarder ! - Helikopterin 15m yakınında olmalı ve ona bakmalısın! - Devi essere a meno di 15 metri dall'elicottero e guardarlo! - Вы должны находиться в пределах 15 м от вертолета и смотреть на него! - ヘリから15m以内で視点を合わせる必要があります! - Você deve estar a 15m do helicóptero e olhando para ele! - Sinun on oltava 15 metrin säteellä helikopterista ja katsottava sitä! - - - Attachable Helistretcher - Nosze śmigłowcowe - Anbringbare Helitrage - Camilla de helicóptero adjuntable - 可连接直升机 - 可连接担架 - Připevnitelná helinosítka - 부착형 헬기용 들것 - Hélicivière amovible - Helitakılabilir sedye - Elibarella agganciabile - Вы должны находиться в пределах 15 м от вертолета и посмотри на это! - ヘリコプター用担架 - Maca de helicóptero acoplável - Kiinnitettävä paarit helikoptereille - - - Allows you to attach a stretcher to a helicopter(Double click) - Pozwala podczepić nosze do śmigłowca(Podwójne kliknięcie) - Ermöglicht das Anbringen einer Trage am Hubschrauber (Doppelklick) - Le permite adjuntar una camilla a un helicóptero (doble clic) - 允许您在直升机上附加担架(双击) - 允许您在直升机上附加担架(双击) - Umožňuje připevnit nosítka na helikoptéru(Dvojtým kliknutím) - 헬기에 들것을 부착할 수 있습니다(더블 클릭) - Vous permet d'attacher une civière sur hélicoptère (double clic) - Helikoptere sedye takmanızı sağlar(Çift tıklama) - Consente di collegare una barella sull'elicottero (doppio clic) - Позволяет прикрепить носилки к вертолету (двойной щелчок) - ヘリコプターに担架を取り付けることができます (ダブルクリック) - Permite anexar uma maca a um helicóptero (clique duplo) - Mahdollistaa paareiden kiinnittämisen helikopteriin (klikkaa kahdesti) + Stand: Saline IV (250ml) Incompatible addon warning @@ -363,6 +168,7 @@ Aviso de addon incompatível Yhteensopimaton lisäosien varoitus Предупреждение о несовместимом дополнении + Waarschuwing voor onverenigbare mods Throws a warning and add line to RPT log if incompatible addons(Listed by us - developers) that could negatively affect correct functionality of KAT are used. \nWarning disappears after 60 seconds. @@ -377,6 +183,7 @@ Mostra um aviso e adiciona uma linha ao log do RPT se forem usados ​​complementos incompatíveis (listados por nós - desenvolvedores) que podem afetar negativamente a funcionalidade correta do KAT. \nO aviso desaparece após 60 segundos. Lähettää varoituksen ja lisää rivin RPT-lokiin, jos käytössä on yhteensopimattomia lisäosia (me, kehittäjät ovat luetteloineet), jotka voivat vaikuttaa negatiivisesti KAT:n oikeaan toimintaan. \nVaroitus häviää 60 sekunnin kuluttua. Выдает предупреждение и добавляет строку в журнал RPT, если используются несовместимые дополнения (перечисленные нами - разработчиками), которые могут негативно повлиять на корректную функциональность KAT. \nПредупреждение исчезает через 60 секунд. + Gooit een waarschuwing op en voegt een lijn toe aan de RPT als er onverenigbare mods (Genoemd door ons, de developers) die KAM negatief kunnen beïnvloeden worden gebruikt. \nWaarschuwing verdwijnt na 60 seconden. [KAM WARNING] Incompatible addon(s) that could negatively affect correct functionality detected. KAT - Advanced Medical REWRITE Development Team strongly advises to remove these addons: %1 @@ -391,6 +198,7 @@ [AVISO DO KAM] Detectados addons incompatíveis que podem afetar negativamente a funcionalidade correta. KAT - A equipe de desenvolvimento do Advanced Medical REWRITE recomenda fortemente a remoção destes complementos: %1 [KAM WARNING] Havaittiin yhteensopimattomia lisäosia, jotka voivat vaikuttaa oikeaan toimintaan. KAT - Advanced Medical REWRITE -kehitystiimi suosittelee näiden lisäosien poistamista: %1 [ПРЕДУПРЕЖДЕНИЕ KAM] Обнаружены несовместимые дополнения, которые могут негативно повлиять на корректную функциональность. Команда разработчиков KAT - Advanced Medical REWRITE настоятельно рекомендует удалить эти дополнения: %1 + [KAM WAARSCHUWING] Onverenigbare mods die de ervaring negatief kunnen beïnvloeden gedetecteerd. KAT - Advanced Medical REWRITE development team raadt je sterk aan om de volgende mods te verwijderen: %1 Tourniquet Settings @@ -400,6 +208,7 @@ Tourniquet Einstellungen Настройки жгута Configurações de torniquete + Tourniquet instellingen Enable tourniquet effects @@ -409,6 +218,7 @@ Erlaube Tourniquet Effekte Включить эффект наложения жгута Habilitar efeitos de torniquete + Schakel tourniquet effecten in Tourniquet effects positive multiplier @@ -418,6 +228,7 @@ Tourniquet Effekt positiver Multiplikator Положительный множитель эффекта жгута Multiplicador positivo de efeitos de torniquete + Positieve multiplicator voor tourniquet effecten Tourniquet effects negative multiplier @@ -428,6 +239,7 @@ Tourniquet Effekt negativer Multiplikator Отрицательный множитель эффекта жгута Multiplicador negativo de efeitos de torniquete + Negatieve multiplicator voor tourniquet effecten Time to take off tourniquet @@ -442,40 +254,7 @@ Tempo para retirar o torniquete Aika ottaa kiristysside pois Никаких переливаний - - - Stretcher - 担架 - 擔架 - 担架 - Nosítka - Civière - Krankentrage - Barella - 들것 - Nosze - Носилки - Camilla - Sedye - Maca - Paarit - - - Stretcher (Packed) - 担架 (折り畳み) - 擔架(打包) - 担架(打包) - Nosítka (Zabalená) - Civière (Emballée) - Krankentrage (Gepackt) - Barella (Imballo) - 들것 (포장되다) - Nosze (Zapakowane) - Носилки (упакованные) - Camilla (Plegada) - Sedye (Paketli) - Maca (Embalada) - Paarit (pakattu) + Benodigde tijd om een tourniquet af te nemen Allow Shared Vehicle Equipment @@ -488,6 +267,7 @@ Permitir equipamento compartilhado no veículo Salli jaetut ajoneuvovarusteet Разрешить совместное использование транспортного оборудования + Sta het delen van apparatuur in voertuigen toe Sets whether vehicle's medical supplies can be used while treating and in which order @@ -500,6 +280,7 @@ Define se os suprimentos médicos do veículo podem ser usados durante o tratamento e em qual ordem Asettaa, voidaanko ajoneuvon lääketieteellisiä tarvikkeita käyttää hoidon aikana ja missä järjestyksessä Определяет, можно ли использовать медицинские принадлежности транспортного средства во время лечения и в каком порядке + Bepaald of de medische middelen in een voertuig gebruikt kan worden voor behandelingen en in welke volgorde Vehicle's Equipment First (No self-treatment) @@ -512,6 +293,7 @@ Priorizar equipamento no veículo (sem autotratamento) Ajoneuvon varusteet käytetään ensin (ei itsehoitoa) Сначала оборудование автомобиля (без самолечения) + Voertuigsmiddelen eerst (geen zelfbehandeling) Vehicle's Equipment First (Except self-treatment) @@ -524,6 +306,7 @@ Priorizar equipamento no veículo (exceto autotratamento) Ajoneuvon varusteet käytetään ensin (paitsi itsehoito) Сначала оборудование автомобиля (кроме самолечения) + Voertuigsmiddelen eers (behalve bij zelfbehandeling) Vehicle's Equipment First (Always) @@ -536,6 +319,7 @@ Priorizar equipamento no veículo (sempre) Ajoneuvon varusteita käytetään ensin (aina) Сначала оборудование автомобиля (всегда) + Voertuigsmiddelen eerst (altijd) Armband @@ -548,6 +332,7 @@ Braçadeira Käsivarsinauha Повязка на руку + Armband Armband position left arm @@ -560,6 +345,7 @@ Posição da braçadeira no braço esquerdo Käsivarsinauhan asento vasen käsi Положение повязки на левой руке + Armband positie linkerarm Defines the position (x, y, z) where the armband is slung to the left arm. @@ -572,6 +358,7 @@ Define a posição (x, y, z) onde a braçadeira é colocada no braço esquerdo. Määrittää paikan (x, y, z), jossa käsivarsinauha on ripustettu vasempaan käsivarteen. Определяет положение (x, y, z), в котором повязка надевается на левую руку. + Bepaald de positie (x, y, z) waar de armband om de linkerarm zit. Armband rotation left arm @@ -584,6 +371,7 @@ Rotação da braçadeira no braço esquerdo Käsivarsinauhan kierto vasemmassa kädessä Вращение повязки на левой руке + Armband rotatie linkerarm Defines the rotation (yaw, pitch, roll) of the armband that is slung to the left arm. @@ -596,6 +384,7 @@ Define a rotação (guinada, arfagem, rolagem) da braçadeira que é colocada no braço esquerdo. Määrittää vasempaan käsivarteen ripustetun käsivarsinauhan kiertoliikkeen (kääntö, kallistus, rullaus). Определяет вращение (рыскание, тангаж, крен) нарукавной повязки, которая надевается на левую руку. + Bepaald de rotatie (draaiing, helling en kanteling) van de armband die om de linkerarm zit Armband position right arm @@ -608,6 +397,7 @@ Posição da braçadeira no braço direito Käsivarsinauhan asento oikea käsi Положение повязки на правой руке + Armbandpositie rechterarm Defines the position (x, y, z) where the armband is slung to the right arm. @@ -620,6 +410,7 @@ Define a posição (x, y, z) onde a braçadeira é colocada no braço direito. Määrittää paikan (x, y, z), jossa käsivarsinauha on ripustettu oikeaan käsivarteen. Определяет положение (x, y, z), в котором повязка надевается на правую руку. + Bepaald de positie (x, y, z) waar de armband om de rechterarm zit. Armband rotation right arm @@ -632,6 +423,7 @@ Rotação da braçadeira no braço direito Käsivarsinauhan kierto oikealla kädellä. Вращение повязки на правой руке + Armband rotatie rechterarm Defines the rotation (yaw, pitch, roll) of the armband that is slung to the right arm. @@ -644,6 +436,7 @@ Define a rotação (guinada, arfagem, rolagem) da braçadeira que é colocada no braço direito. Määrittää oikeaan käsivarteen kiinnitetyn käsivarsinauhan kiertoliikkeen (kääntö, nousu, rullaus). Определяет вращение (рыскание, тангаж, крен) нарукавной повязки, которая надевается на правую руку. + Bepaald de rotatie (draaiing, helling en kanteling) van de armband die om de rechterarm zit Armband position left leg @@ -656,6 +449,7 @@ Posição da braçadeira na perna esquerda Käsivarsinauhan asento vasemmalla jalalla Положение повязки на левой ноге + Armband positie linkerbeen Defines the position (x, y, z) where the armband is slung to the left leg. @@ -668,6 +462,7 @@ Define a posição (x, y, z) onde a braçadeira é colocada na perna esquerda. Määrittää vasempaan jalkaan kiinnitetyn käsivarsinauhan kiertoliikkeen (kääntö, nousu, rullaus). Определяет положение (x, y, z), в котором повязка крепится к левой ноге. + Bepaald de positie (x, y, z) waar de armband om de linkerbeen zit. Armband rotation left leg @@ -680,6 +475,7 @@ Rotação da braçadeira na perna esquerda Käsivarsinauhan kierto vasen jalka Вращение повязки на левой ноге + Armband rotatie linkerbeen Defines the rotation (yaw, pitch, roll) of the armband that is slung to the left leg. @@ -692,6 +488,7 @@ Define a rotação (guinada, arfagem, rolagem) da braçadeira que é colocada na perna esquerda. Määrittää vasempaan jalkaan kiinnitetyn käsivarsinauhan kiertoliikkeen (kääntö, nousu, rullaus). Определяет вращение (рыскание, тангаж, крен) нарукавной повязки, прикрепленной к левой ноге. + Bepaald de rotatie (draaiing, helling en kanteling) van de armband die om de linkerbeen zit Armband position right leg @@ -704,6 +501,7 @@ Posição da braçadeira na perna direita Käsivarsinauhan asento oikea jalka. Положение повязки на правой ноге + Armbandpositie rechterbeen Defines the position (x, y, z) where the armband is slung to the right leg. @@ -716,6 +514,7 @@ Define a posição (x, y, z) onde a braçadeira é colocada na perna direita. Määrittää paikan (x, y, z), jossa käsivarsinauha on ripustettu oikeaan jalkaan Определяет положение (x, y, z), в котором повязка крепится к правой ноге. + Bepaald de rotatie (draaiing, helling en kanteling) van de armband die om de rechterbeen zit Armband rotation right leg @@ -728,6 +527,7 @@ Rotação da braçadeira na perna direita Käsivarsinauhan kierto oikealla jalalla Вращение повязки на правой ноге + Armband rotatie rechterbeen Defines the rotation (yaw, pitch, roll) of the armband that is slung to the right leg. @@ -740,6 +540,7 @@ Define a rotação (guinada, arfagem, rolagem) da braçadeira que é colocada na perna direita. Määrittää oikeaan jalkaan kiinnitetyn käsivarsinauhan kiertoliikkeen (kääntö, nousu, rullaus). Определяет вращение (рыскание, тангаж, крен) нарукавной повязки, прикрепленной к правой ноге. + Bepaald de positie (x, y, z) waar de armband om de rechterbeen zit. Armband Red Cross @@ -752,6 +553,7 @@ Braçadeira da Cruz Vermelha Käsivarsinauha punainen risti Повязка с Красным Крестом + Armband Rode kruiz Armband Medic @@ -764,6 +566,7 @@ Braçadeira de médico Käsivarsinauha taistelulääkärille Повязка медика + Armband medici Armband Doctor @@ -776,6 +579,7 @@ Braçadeira de doutor Käsivarsinauha lääkärille Повязка доктора + Armband doktor Armband KAT @@ -788,6 +592,7 @@ Braçadeira do KAT Käsivarsinauha KAT Повязка КАТ + Armband KAT Armband @@ -800,6 +605,7 @@ Braçadeira Käsivarsinauha Повязка + Armband Sling to left arm @@ -812,6 +618,7 @@ Colocar no braço esquerdo Ripusta vasempaan käsivarteen Повязать на левую руку + Bind aan linkerarm Sling to right arm @@ -824,6 +631,7 @@ Colocar no braço direito Ripusta oikeaan käsivarteen Повзать на правую руку + Bind aan rechterarm Sling to left leg @@ -836,6 +644,7 @@ Colocar na perna esquerda Ripusta vasemmassa jalassa Повязать на левую ногу + Bind aan linkerbeen Sling to right leg @@ -848,6 +657,7 @@ Colocar na perna direita Ripusta oikeaan jalkaan Повзать на правую ногу + Bind aan rechterbeen Unsling left arm @@ -860,6 +670,7 @@ Remover do braço esquerdo Irrotus vasemmasta kädestä Снять с левой руки + Van linkerarm losmaken Unsling right arm @@ -872,6 +683,7 @@ Remover do braço direito Irrotus oikeasta kädestä Снять с правой руки + Van rechterarm losmaken Unsling left leg @@ -884,6 +696,7 @@ Remover da perna esquerda Irrotus vasemmasta jalasta Снять с левой ноги + Van linkerbeen losmaken Unsling right leg @@ -896,6 +709,7 @@ Remover da perna direita Irrotus oikeasta jalasta Снять с правой ноги + Van rechterbeen losmaken Pop a Bubble @@ -908,6 +722,7 @@ Estourar uma bolha Poksauta Лопни пузырь + Pop een luchtbel Bubble Wrap @@ -920,6 +735,7 @@ Plástico Bolha Kuplamuovia Пузырчатая пленка + Noppenfolie A Bubble Wrap that you can squeeze to relive some pain @@ -932,6 +748,7 @@ Um plástico bolha que você pode apertar para aliviar um pouco a dor Kuplakääre, jota voit puristaa lievittääksesi kipua Пузырчатая пленка, которую вы можете сжать, чтобы немного облегчить боль + Noppenfolie, wat je kan gebruiken om pijn te verlichten Blood Group Patch A+ @@ -944,6 +761,7 @@ Sutache de grupo sanguíneo A+ Veriryhmälaastari A+ Патч группы крови А+ + Bloedgroep lapje A+ Blood Group Patch A- @@ -956,6 +774,7 @@ Sutache de grupo sanguíneo A- Veriryhmälaastari A- Патч группы крови А- + Bloedgroep lapje A- Blood Group Patch B+ @@ -968,6 +787,7 @@ Sutache de grupo sanguíneo B+ Veriryhmälaastari B+ Патч группы крови B+ + Bloedgroep lapje B+ Blood Group Patch B- @@ -980,6 +800,7 @@ Sutache de grupo sanguíneo B- Veriryhmälaastari B- Патч группы крови B- + Bloedgroep lapje B- Blood Group Patch 0+ @@ -992,6 +813,7 @@ Sutache de grupo sanguíneo O+ Veriryhmälaastari O+ Патч группы крови 0+ + Bloedgroep lapje 0+ Blood Group Patch 0- @@ -1004,6 +826,7 @@ Sutache de grupo sanguíneo O- Veriryhmälaastari O- Патч группы крови 0- + Bloedgroep lapje 0- Blood Group Patch AB+ @@ -1016,6 +839,7 @@ Sutache de grupo sanguíneo AB+ Veriryhmälaastari AB+ Патч группы крови АB+ + Bloedgroep lapje AB+ Blood Group Patch AB- @@ -1028,6 +852,7 @@ Sutache de grupo sanguíneo AB- Veriryhmälaastari AB- Патч группы крови АB- + Bloedgroep lapje AB- (IFAK) Individual First Aid Kit @@ -1038,6 +863,7 @@ (IFAK) Yksilöllinen ensiapulaukku (IFAK) Индивидуальная аптечка первой помощи (KPSI) Kit de Primeiros Socorros Individual + (IFAK) Individuele Eerste hulpkit (MFAK) Multiple First Aid Kit @@ -1048,6 +874,7 @@ (MFAK) Useita ensiapulaukkuja (MFAK) Многофункциональная аптечка первой помощи (KPSM) Kit de Primeiros Socorros Múltiplo + (MFAK) Meervoudige Eerste hulpkit (AFAK) Advanced First Aid Kit @@ -1058,6 +885,7 @@ (AFAK) Edistyksellinen ensiapulaukku (AFAK) Усовершенствованная аптечка первой помощи (KPSA) Kit de Primeiros Socorros Avançado + (AFAK) Geadvanceerde Eerste hulpkit Items unload Container @@ -1067,6 +895,7 @@ Conteneur de stockage des objets Säiliö tavaroiden purkamiseen Предметы выгружаются с контейнера + Items ontlaad container Defines where the items from the First Aid Kit are added into. If there is no space left they will be dropped on the ground. \n Default: Items are added where space is left. @@ -1076,6 +905,7 @@ Définie où les objets de la trousse de secours seront ajoutés. S'il n'y a pas assez de place ils seront placés au sol.\n Par défaut : les objets sont rajoutés là où il reste de la place. Määrittää, mihin ensiapulaukun tuotteet lisätään. jos tilaa ei ole jäljellä, ne pudotetaan maahan. \n Oletus: kohteet lisätään sinne, missä on vielä tilaa. Определяет, куда складываются предметы из аптечки первой помощи. Если не останется свободного места, они будут брошены на землю. \n По умолчанию: Предметы добавляются туда, где осталось свободное место. + Bepaald waar de items van een Eerste hulpkit worden geplaatst. Als er geen plek is, worden ze op de grond geplaatst. \n Standaard: Items worden geplaatst waar plek is. Default @@ -1085,6 +915,7 @@ Par défaut Oletus По умолчанию + Standaard Uniform @@ -1094,6 +925,7 @@ Uniforme Univormu Униформа + Uniform Vest @@ -1103,6 +935,7 @@ Veste Liivi Жилет + Vest Backpack @@ -1112,6 +945,7 @@ Sac à dos Reppu Рюкзак + Rugzak The items & quantity that is given to the player.\n If you want to add/change items remove existing entry & insert item name-tag & quantity you want. \n Example: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] TO [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] @@ -1121,6 +955,7 @@ Les objets et la quantité donnés aux joueurs.\n Si vous voulez ajouter/changer des objets, retirez l'entrée existante & ajoutez le nom de l'objet & la quantité désirée.\n Exemple : [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] TO [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] Pelaajalle annetut tuotteet ja määrä. \n Jos haluat lisätä/muuttaa kohteita, poista olemassa oleva merkintä ja lisää haluamasi nimikkeen nimilappu ja nimikemäärä. \n Esimerkki: [[`ACE_packingBandage`, 10]. Предметы и количество, которые выдаются игроку.\n Если вы хотите добавить / изменить предметы, удалите существующую запись и вставьте название предмета-тег и количество, которое вы хотите. \n Пример: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] В [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] + De items en de hoeveelheid dat gegeven wordt aan de speler. \n Als je items wilt toevoegen of veranderen, verwijder dan de bestaande entree en voeg item naam en de hoeveelheid die je wilt in. \n Voorbeeld: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] NAAR [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] Trauma Section Items & Quantity @@ -1129,6 +964,7 @@ 外傷枠のアイテムと数量 Предметы и количество травматологического раздела Objets et quantité de la section de traumatologie + Trauma sectie items & hoeveelheden Bandage Section Items & Quantity @@ -1137,6 +973,7 @@ 包帯枠のアイテムと数量 Предметы и количество в разделе бинтов Objets et quantité de la section de bandages + Verbandssectie items & hoeveelheden Pain Management Section Items & Quantity @@ -1145,6 +982,7 @@ 鎮痛枠のアイテムと数量 Предметы и количество раздела обезболивающих Objets et quantité de la section de régulation de la douleur + Pijnbestrijdingssectie items & hoeveelheden Breathing Section Items & Quantity @@ -1153,6 +991,7 @@ 呼吸枠のアイテムと数量 Предметы и количество раздела дыхательной системы Objets et quantité de la section d'articles respiratoires + Ademhalingssectie items & hoeveelheden Airway Section Items & Quantity @@ -1161,6 +1000,7 @@ 気道枠のアイテムと数量 Предметы и количество раздела дыхательных путей Objets et quantité de la section des voies aériennes + Luchtweg sectie items & hoeveelheden Pharmaceutical Section Items & Quantity @@ -1169,6 +1009,7 @@ 薬品枠のアイテムと数量 Предметы и количество раздела фармацевтики Objets et quantités de la section pharmaceutique + Pharmaceutische sectie items & hoeveelheden Fluid Section Items & Quantity @@ -1177,6 +1018,7 @@ 輸液枠のアイテムと数量 Предметы и количество раздела жидкостей Objets et quantités de la section des fluides + Vloeistofsectie items & hoeveelheden Miscellaneous Section Items & Quantity @@ -1185,6 +1027,7 @@ 雑多枠のアイテムと数量 Предметы и количества прочего раздела Objets et quantités de la section autres + Overige sectie items & hoeveelheden Individual First Aid Kit @@ -1195,6 +1038,7 @@ Yksilöllinen ensiapulaukku Индивидуальная аптечка первой помощи Kit de Primeiros Socorros Individual + Individuele Eerste hulpskit The IFAK can be unpacked to provide useful medical items @@ -1205,6 +1049,7 @@ IFAK voidaan purkaa pakkauksesta hyödyllisten lääketieteellisten tarvikkeiden saamiseksi IFAK можно распаковать, чтобы получить полезные медицинские принадлежности O KPSI pode ser desembalado para prover itens médicos úteis + De IFAK kan uitgepakt worden om nuttige producten te verschaffen Multiple First Aid Kit @@ -1215,6 +1060,7 @@ Useita ensiapulaukkuja Многофункциональная аптечка первой помощи Kit de Primeiros Socorros Múltiplo + Meervoudige Eerste hulpskit The MFAK can be unpacked to provide useful medical items @@ -1225,6 +1071,7 @@ MFAK voidaan purkaa pakkauksesta hyödyllisten lääketieteellisten tarvikkeiden saamiseksi MFAK можно распаковать, чтобы получить полезные медицинские принадлежности O KPSM pode ser desembalado para prover itens médicos úteis + De MFAK kan uitgepakt worden om nuttige producten te verschaffen Advanced First Aid Kit @@ -1235,6 +1082,7 @@ Edistyksellinen ensiapulaukku Усовершенствованная аптечка первой помощи Kit de Primeiros Socorros Avançado + Geadvanceerde Eerste hulpskit The AFAK can be unpacked to provide useful medical items @@ -1245,6 +1093,7 @@ AFAK voidaan purkaa pakkauksestaan hyödyllisten lääketieteellisten tarvikkeiden saamiseksi AFAK можно распаковать, чтобы получить полезные медицинские принадлежности O KPSA pode ser desembalado para prover itens médicos úteis + de AFAK kan uitgepakt worden om nuttige producten te verschaffen IFAK @@ -1255,6 +1104,7 @@ IFAK IFAK KPSI + IFAK MFAK @@ -1265,6 +1115,7 @@ MFAK MFAK KPSM + MFAK AFAK @@ -1275,247 +1126,302 @@ AFAK AFAK KPSA + AFAK View Packing List + 查看装箱清单 Ver lista Packliste ansehen 内容物リストを見る Просмотреть упаковочный лист Voir la liste de remplissage Ver lista + Zie paklijst Trauma Section: + 创伤部分: Sección de trauma: Trauma Sektion: 外傷枠: Раздел травм: Section de traumatologie : Seção de trauma: + Trauma sectie: Bandage Section: + 绷带部分: Sección de vendaje: Bandagen Sektion: 包帯枠: Раздел перевязок: Section de bandages : Seção de bandagens: + Verbandssectie: Pain Management Section: + 疼痛管理部分: Sección de analgesicos: Schmerzmittel Sektion: 鎮痛枠: Раздел обезбаливающих: Section de régulation de la douleur : Seção de gerenciamento de dor: + Pijnbestrijdingssectie: Breathing Section: + 呼吸部分: Sección de respiración: Beatmungs Sektion: 呼吸枠: Раздел дыхательной системы: Section d'articles respiratoires : Seção de respiração: + Ademhalingssectie: Airway Section: + 气道部分: Sección de vías respiratorias: Atemwege Sektion: 気道枠: Раздел дыхательных путей: Section des voies aériennes : Seção de vias aéreas: + Luchtweg sectie: Pharmaceutical Section: + 药物部分: Sección de farmacia: Arzneimittel Sektion: 薬品枠: Раздел фармацевтики: Section pharmaceutique : Seção farmacêutica: + Pharmaceutische sectie: Fluid Section: + 液体部分: Sección de fluidos: Flüssigkeits Sektion: 輸液枠: Раздел жидкостей: Section des fluides : Seção de flúidos: + Vloeistofsectie: Miscellaneous Section: + 杂项部分: Sección de miscelaneos: Vermischte Sektion: 雑多枠: Раздел прочего: Sections autres : Seção miscelânea: + Overige sectie: Unpack Trauma Section + 打开创伤部分 Desempaquetar sección de traumas: Entpacke Trauma Sektion 外傷枠を 開梱する Распаковать раздел травм Déballer la section de traumatologie Descompactar seção de trauma + Pak trauma sectie uit Unpack Bandage Section + 拆包绷带部分 Desempaquetar sección de vendaje: Entpacke Bandagen Sektion 包帯枠を 開梱する Распаковать раздел перевязок Déballer la section de bandages Descompactar seção de bandagem + Pak verbandssectie uit Unpack Pain Management Section + 打开疼痛管理部分 Desempaquetar sección de analgesicos: Entpacke Schmerzmittel Sektion 鎮痛枠を 開梱する Распаковать раздел обезбаливающих Déballer la section de régulation de la douleur Descompactar seção de gerenciamento de dor + Pak pijnbestrijdingssectie uit Unpack Breathing Section + 打开呼吸部分 Desempaquetar sección de respiración: Entpacke Beatmungs Sektion 呼吸枠を 開梱する Распаковать разде дыхательной системы Déballer la section d'articles respiratoires Descompactar seção de respiração + Pak ademhalingssectie uit Unpack Airway Section + 打开气道部分 Desempaquetar sección de vías respiratorias: Entpacke Atemwege Sektion 気道枠を 開梱する Распаковать раздел дыхательных путей Déballer la section des voies aériennes Descompactar seção de vias aéreas + Pak luchtweg sectie uit Unpack Pharmaceutical Section + 拆包药剂部分 Desempaquetar sección de farmacia: Entpacke Arzneimittel Sektion 薬品枠を 開梱する Распаковатьраздел фармацевтики Déballer la section pharmaceutique Descompactar seção farmacêutica + Pak pharmaceutische sectie uit Unpack Fluid Section + 解封流体部分 Desempaquetar sección de fluidos: Entpacke Flüssigkeit Sektion 輸液枠を 開梱する Распаковать раздел жидкостей Déballer la section des fluides Descompactar seção de fluidos + Pak vloeistoffen sectie uit Unpack Miscellaneous Section + 拆包杂项部分 Desempaquetar sección de miscelaneos: Entpacke Vermischte Sektion 雑多枠を 開梱する Распаковать раздел прочего Déballer la section autres Descompactar seção miscelânea + Pak overige sectie uit Repack Trauma Section + 重装创伤部分 Empaquetar sección de trauma: Packe Trauma Sektion 外傷枠を 再梱包する Перепаковать раздел травм Remballer la section de traumatologie Compactar seção de trauma + Herpak trauma sectie Repack Bandage Section + 重装绷带部分 Empaquetar sección de vendaje: Packe Bandagen Sektion 包帯枠を 再梱包する Перепаковать раздел перевязок Remballer la section de bandages Compactar seção de bandagem + Herpak verbandssectie Repack Pain Management Section + 重装疼痛管理部分 Empaquetar sección de analgesicos: Packe Schmerzmittel Sektion 鎮痛枠を 再梱包する Перепаковать раздел обезбаливающих Remballer la section de régulation de la douleur Compactar seção de gerenciamento de dor + Herpack pijnbestrijdingssectie Repack Breathing Section + 重新包装呼吸部分 Empaquetar sección de respiración: Packe Beatmungs Sektion 呼吸枠を 再梱包する Перепаковать раздел дыхательной системы Remballer la section d'articles respiratoires Compactar seção de respiração + Herpack ademhalingssectie Repack Airway Section + 重新包装气道部分 Empaquetar sección de vías respiratorias: Packe Atemwege Sektion 気道枠を 再梱包する Перепаковать раздел дыхательных путей Remballer la section des voies aériennes Compactar seção de vias aéreas + Herpack luchtweg sectie Repack Pharmaceutical Section + 再包装药剂部分 Empaquetar sección de vendaje: Packe Arzneimittel Sektion 薬品枠を 再梱包する Перепаковать раздел фармацевтики Remballer la section pharmaceutique Compactar seção farmacêutica + Herpak pharmaceutische sectie Repack Fluid Section + 重新充填流体部分 Empaquetar sección de fluidos: Packe Flüssigkeit Sektion 輸液枠を 再梱包する Перепаковать раздел жидкостей Remballer la section des fluides Compactar seção de fluidos + Herpak vloeistoffen sectie Repack Miscellaneous Section + 重新包装及杂项部分 Empaquetar sección de miscelaneos: Packe Vermischte Sektion 雑多枠を 再梱包する Перепаковать раздел прочего Remballer la section autres Compactar seção miscelânea + Herpak overige sectie Hint Item Color + 提示项目颜色 Color del objeto en la nota Hinweis Gegenstand Farbe ヒントのアイテムの文字色 Подсказка по цвету элемента Couleur d'indice de l'objet + kleur van itemhint The item color of the text that is displayed via a hint + 通过提示显示的文本的项目颜色 El color del elemento que aparece en el texto de la nota. Die Farbe der Gegenstände die über einen Hinweis angezeigt werden ヒントで表示されるポケット内アイテムの文章の文字色 Цвет элемента текста, отображаемого с помощью подсказки La couleur de l'objet du texte affiché via un indice + De kleur van de tekstitem die weergeven wordt via een hint Hint Section Color @@ -1524,6 +1430,7 @@ ヒントの種類枠の文字色 Цвет раздела подсказок Couleur d'indice de la section + Hint sectie kleur The Section color of the text that is displayed via a hint @@ -1532,6 +1439,7 @@ ヒントで表示されるポケット種類枠の文章の文字色 Цвет раздела текста, отображаемого с помощью подсказки La couleur de la section du texte affiché via un indice + De kleur van de sectie die weergeven wordt met een hint Remove when empty @@ -1541,6 +1449,7 @@ Retirer lorsque vide Poista tyhjänä Удалить, когда опустеет + Verwijder wanneer leeg Carry Patient @@ -1552,6 +1461,7 @@ Portar paciente Kanna potilasta Нести пациента + Draag patiënt Cancel Carrying @@ -1563,6 +1473,7 @@ Soltar paciente Peruuta potilaan kuljettaminen Прекратить нести + Dragen annuleren Stopped carrying %1 @@ -1574,14 +1485,17 @@ Solto al paciente %1 Lakkasi kantamisen %1 Прекратил нести %1 + Gestopt met het dragen van %1 Use Surgical Kit (Full Body) + 全身缝合 手術キットを使う (全身縫合) Использвать хир.набор (на всё тело) Utilizar kit quirúrgico (cuerpo completo) Utiliser la trousse chirurgicale (Corps complet) Utilizar kit cirúrgico (corpo inteiro) + Gebruik chirurgische kit (volledig lichaam) Enable Full Body Stitching @@ -1589,6 +1503,7 @@ Habilitar Cosido en el Cuerpo Completo 全身縫合を有効化 Activer la suture complète du corps + Schakel hechten van het volledige lichaam in Adds a full-body stitching option alongside the individual body part stitching, using ACE's established settings and values for consistency @@ -1596,6 +1511,7 @@ Añade la opción de coser el cuerpo al completo junto al cosido de partes del cuerpo individuales, usando los valores establecidos en ACE y sus valores, para que sea consistente 身体部位毎に縫合するアクションに加え、ACEの設定値と同様の動きを保ったままの、全身を一括で縫合するオプションを追加します。 Ajoute une option de suture complète du corps à côté de la suture de chaque partie du corps, en utilisant les paramètres et les valeurs établis par ACE pour plus de cohérence + Voegt een hechtingsactie toe voor het gehele lichaam, naast de standaard individuele hechtingsopties, die de waarden en instellingen van ACE gebruikt voor consistentie diff --git a/addons/pharma/ACE_Medical_Treatment.hpp b/addons/pharma/ACE_Medical_Treatment.hpp index e59bfb257..fbdd40c60 100644 --- a/addons/pharma/ACE_Medical_Treatment.hpp +++ b/addons/pharma/ACE_Medical_Treatment.hpp @@ -27,6 +27,8 @@ class ACE_ADDON(Medical_Treatment) { // Reduction of damage from wounds opioidRelief = 1; + opioidEffect = 0; + class Epinephrine { painReduce = 0; hrIncreaseLow[] = {10, 20}; @@ -37,7 +39,7 @@ class ACE_ADDON(Medical_Treatment) { maxDose = 6; maxDoseDeviation = 4; incompatibleMedication[] = {}; - alphaFactor = 0.15; + alphaFactor = -0.15; onOverDose = ""; }; class EpinephrineIV { @@ -50,7 +52,7 @@ class ACE_ADDON(Medical_Treatment) { maxDose = 4; maxDoseDeviation = 2; incompatibleMedication[] = {}; - alphaFactor = 0.3; + alphaFactor = -0.3; onOverDose = ""; }; class Morphine { @@ -157,6 +159,7 @@ class ACE_ADDON(Medical_Treatment) { viscosityChange = -10; onOverDose = ""; opioidRelief = 1.5; + opioidEffect = 0.18; }; class Ketamine { painReduce = 0.8; @@ -170,6 +173,7 @@ class ACE_ADDON(Medical_Treatment) { incompatibleMedication[] = {}; viscosityChange = 10; onOverDose = ""; + opioidEffect = 0.17; }; class Nalbuphine { painReduce = 0.6; @@ -296,6 +300,7 @@ class ACE_ADDON(Medical_Treatment) { incompatibleMedication[] = {}; viscosityChange = 5; onOverDose = ""; + opioidEffect = 0.2; }; class Caffeine { painReduce = 0; diff --git a/addons/pharma/ACE_Medical_Treatment_Actions.hpp b/addons/pharma/ACE_Medical_Treatment_Actions.hpp index b9e8ebf31..66c4ee124 100644 --- a/addons/pharma/ACE_Medical_Treatment_Actions.hpp +++ b/addons/pharma/ACE_Medical_Treatment_Actions.hpp @@ -11,31 +11,31 @@ class ACE_Medical_Treatment_Actions { allowedSelections[] = {"Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"}; medicRequired = QUOTE(ace_medical_treatment_medicIV); condition = QUOTE(!(GVAR(RequireInsIV)) || FUNC(removeIV)); - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 800, 16] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -800, 16] call kat_pharma_fnc_fluid;"; }; class BloodIV_500: BloodIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 400, 8] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -400, 8] call kat_pharma_fnc_fluid;"; }; class BloodIV_250: BloodIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 200, 4] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -200, 4] call kat_pharma_fnc_fluid;"; }; class SalineIV: BloodIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -750, 0] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 750, 0] call kat_pharma_fnc_fluid;"; }; class SalineIV_500: SalineIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -350, 0] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 350, 0] call kat_pharma_fnc_fluid;"; }; class SalineIV_250: SalineIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -150, 0] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 150, 0] call kat_pharma_fnc_fluid;"; }; class PlasmaIV: BloodIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 500, 20] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -500, 20] call kat_pharma_fnc_fluid;"; }; class PlasmaIV_500: PlasmaIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 250, 10] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -250, 10] call kat_pharma_fnc_fluid;"; }; class PlasmaIV_250: PlasmaIV { - callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, 100, 5] call kat_pharma_fnc_fluid;"; + callbackSuccess = "[_medic, _patient, _bodyPart, _className, _itemUser, _usedItem] call ace_medical_treatment_fnc_ivBag; [_patient, -100, 5] call kat_pharma_fnc_fluid;"; }; class Epinephrine: Morphine { callbackSuccess = QFUNC(medication); diff --git a/addons/pharma/CfgWeapons.hpp b/addons/pharma/CfgWeapons.hpp index 35c66fdd1..82b7bd0bf 100644 --- a/addons/pharma/CfgWeapons.hpp +++ b/addons/pharma/CfgWeapons.hpp @@ -217,10 +217,10 @@ class CfgWeapons { author = "Miss Heda"; displayName = CSTRING(Coag_Sense_Display); picture = QPATHTOF(ui\icon_Coag_Sense.paa); - descriptionShort = CSTRING(Coag_Sense_DescShort); + descriptionShort = CSTRING(Coag_Sense_Display_DESC); ACE_isMedicalItem = 1; class ItemInfo: CBA_MiscItem_ItemInfo { mass = 1; - }; + }; }; }; diff --git a/addons/pharma/XEH_PREP.hpp b/addons/pharma/XEH_PREP.hpp index 362e50ce7..5072c12df 100644 --- a/addons/pharma/XEH_PREP.hpp +++ b/addons/pharma/XEH_PREP.hpp @@ -1,4 +1,3 @@ -PREP(alphaAction); PREP(applyIV); PREP(checkIV); PREP(clotWound); @@ -34,7 +33,6 @@ PREP(treatmentAdvanced_FentanylLocal); PREP(treatmentAdvanced_FlumazenilLocal); PREP(treatmentAdvanced_Flush); PREP(treatmentAdvanced_FlushLocal); -PREP(treatmentAdvanced_KetamineLocal); PREP(treatmentAdvanced_LorazepamLocal); PREP(treatmentAdvanced_MorphineLocal); PREP(treatmentAdvanced_NalbuphineLocal); @@ -46,4 +44,4 @@ PREP(treatmentAdvanced_PervitinLocal); PREP(treatmentAdvanced_Reorientation); PREP(treatmentAdvanced_ReorientationLocal); PREP(treatmentAdvanced_TXALocal); -PREP(vehicleCheckDialysis); \ No newline at end of file +PREP(vehicleCheckDialysis); diff --git a/addons/pharma/XEH_preInit.sqf b/addons/pharma/XEH_preInit.sqf index b4542263b..f8ca35430 100644 --- a/addons/pharma/XEH_preInit.sqf +++ b/addons/pharma/XEH_preInit.sqf @@ -36,6 +36,15 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +[ + QGVAR(IVflowControl), + "CHECKBOX", + [LLSTRING(SETTING_IV_FLOW_CONTROL),LLSTRING(SETTING_IV_FLOW_CONTROL_DESC)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [false], + true +] call CBA_Settings_fnc_init; + [ QGVAR(IVdropEnable), "CHECKBOX", @@ -290,24 +299,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -[ - QGVAR(chromatic_aberration_checkbox_pervitin), - "CHECKBOX", - [LLSTRING(SETTING_Chromatic_Aberration_Checkbox_Pervitin), LLSTRING(SETTING_Chromatic_Aberration_Checkbox_Pervitin_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Pervitin)], - [true], - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(chromatic_aberration_slider_pervitin), - "SLIDER", - [LLSTRING(SETTING_Chromatic_Aberration_Slider_Pervitin), LLSTRING(SETTING_Chromatic_Aberration_Slider_Pervitin_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Pervitin)], - [0.1, 10, 1, 1], - true -] call CBA_Settings_fnc_init; - [ QGVAR(pervitinSpeed), "SLIDER", @@ -572,24 +563,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -[ - QGVAR(chromatic_aberration_checkbox_ketamine), - "CHECKBOX", - [LLSTRING(SETTING_Chromatic_Aberration_Checkbox_Ketamine), LLSTRING(SETTING_Chromatic_Aberration_Checkbox_Ketamine_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Ketamine)], - [true], - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(chromatic_aberration_slider_ketamine), - "SLIDER", - [LLSTRING(SETTING_Chromatic_Aberration_Slider_Ketamine), LLSTRING(SETTING_Chromatic_Aberration_Slider_Ketamine_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Ketamine)], - [0.1, 10, 0.8, 1], - true -] call CBA_Settings_fnc_init; - //Fentanyl Settings Category [ QGVAR(medLvl_Fentanyl), @@ -609,24 +582,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -[ - QGVAR(chromatic_aberration_checkbox_fentanyl), - "CHECKBOX", - [LLSTRING(SETTING_Chromatic_Aberration_Checkbox_Fentanyl), LLSTRING(SETTING_Chromatic_Aberration_Checkbox_Fentanyl_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Fentanyl)], - [true], - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(chromatic_aberration_slider_fentanyl), - "SLIDER", - [LLSTRING(SETTING_Chromatic_Aberration_Slider_Fentanyl), LLSTRING(SETTING_Chromatic_Aberration_Slider_Fentanyl_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_Fentanyl)], - [0.1, 10, 1, 1], - true -] call CBA_Settings_fnc_init; - //Nalbuphine Settings Category [ QGVAR(medLvl_Nalbuphine), @@ -885,7 +840,7 @@ PREP_RECOMPILE_END; "LIST", LLSTRING(SETTING_CheckCoag_Location), [CBA_SETTINGS_CAT, LSTRING(SubCategory_Coag_Sense)], - [[0, 1, 2], ["STR_ACE_Medical_Treatment_Anyone", "STR_ACE_Medical_Treatment_Medics", "STR_ACE_Medical_Treatment_Doctors"], 0], + [[0,1,2,3],["STR_ACE_Common_Anywhere", "STR_ACE_Common_Vehicle", "STR_ACE_Medical_Treatment_MedicalFacilities", "STR_ACE_Medical_Treatment_VehiclesAndFacilities"],0], true ] call CBA_Settings_fnc_init; diff --git a/addons/pharma/functions/fnc_alphaAction.sqf b/addons/pharma/functions/fnc_alphaAction.sqf deleted file mode 100644 index 71d2bac97..000000000 --- a/addons/pharma/functions/fnc_alphaAction.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: Mazinski - * Adds the alpha factor value from medications to the patient. - * - * Arguments: - * 0: Patient - * 1: Alpha Value - * - * Example: - * [player, 0.5] call kat_pharma_fnc_alphaAction; - * - * Public: No - */ - -params ["_patient", "_value"]; - -private _alphaAction = _patient getVariable [QGVAR(alphaAction), 1]; - -_alphaAction = _alphaAction + _value; - -_alphaAction = (_alphaAction min 2) max 0.5; - -_patient setVariable [QGVAR(alphaAction), _alphaAction, true]; \ No newline at end of file diff --git a/addons/pharma/functions/fnc_clotWound.sqf b/addons/pharma/functions/fnc_clotWound.sqf index 5c0dc53e9..9152bdbe4 100644 --- a/addons/pharma/functions/fnc_clotWound.sqf +++ b/addons/pharma/functions/fnc_clotWound.sqf @@ -110,16 +110,16 @@ private _fnc_clotWound = { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _openWounds = _unit getVariable [VAR_OPEN_WOUNDS, createHashmap]; + private _openWounds = _unit getVariable [VAR_OPEN_WOUNDS, createHashMap]; private _pulse = _unit getVariable [VAR_HEART_RATE, 80]; private _coagulationFactor = _unit getVariable [QGVAR(coagulationFactor), 30]; private _countTXA = [_unit, "TXA"] call ACEFUNC(medical_status,getMedicationCount); private _countEACA = [_unit, "EACA"] call ACEFUNC(medical_status,getMedicationCount); private _hasWoundToBandageArray = []; - if (_openWounds isEqualTo createHashmap) exitWith {}; // Exit when hashmap not initialized (Will not work when hashmap is set, cause ace only changes value of "woundCount" to 0) + if (_openWounds isEqualTo createHashMap) exitWith {}; // Exit when hashmap not initialized (Will not work when hashmap is set, cause ace only changes value of "woundCount" to 0) if (_coagulationFactor <= 0) exitWith {}; // Exit when no coagFactors left - if (_unit getVariable [QACEGVAR(medical,bloodVolume), 6.0] < GVAR(coagulation_requireBV)) exitWith {}; // Blood volume check + if (GET_BLOOD_VOLUME_LITERS(_unit) < GVAR(coagulation_requireBV)) exitWith {}; // Blood volume check if ((_pulse < 20) && GVAR(coagulation_requireHR)) exitWith {}; // Has pulse & require setting private _shuffledKeys = keys _openWounds call BIS_fnc_arrayShuffle; // Shuffel Keys to switch bodypart after each bandage for on_all_Bodyparts setting diff --git a/addons/pharma/functions/fnc_coagRegen.sqf b/addons/pharma/functions/fnc_coagRegen.sqf index a64bf46cd..c6ffeccaf 100644 --- a/addons/pharma/functions/fnc_coagRegen.sqf +++ b/addons/pharma/functions/fnc_coagRegen.sqf @@ -33,7 +33,7 @@ if !(GVAR(coagulation)) exitWith {}; [_idPFH] call CBA_fnc_removePerFrameHandler; }; - if (_unit getVariable [QACEGVAR(medical,bloodVolume), 6.0] < GVAR(coagulation_requireBV)) exitWith {}; // Blood volume check + if (GET_BLOOD_VOLUME_LITERS(_unit) < GVAR(coagulation_requireBV)) exitWith {}; // Blood volume check if ((_pulse < 20) && GVAR(coagulation_requireHR)) exitWith {}; // Has pulse & require setting private _currentCoagFactors = _unit getVariable [QGVAR(coagulationFactor), 30]; diff --git a/addons/pharma/functions/fnc_fluidLocal.sqf b/addons/pharma/functions/fnc_fluidLocal.sqf index 09151eaf4..e2609a96e 100644 --- a/addons/pharma/functions/fnc_fluidLocal.sqf +++ b/addons/pharma/functions/fnc_fluidLocal.sqf @@ -19,12 +19,10 @@ params ["_patient", "_ph", "_coagulation"]; -private _current = _patient getVariable [QGVAR(pH), 1500]; -private _final = (_current + _ph) max 0; -_final min 1500; -_patient setVariable [QGVAR(pH), (_final), true]; +private _current = _patient getVariable [QGVAR(externalPh), 0]; +_patient setVariable [QGVAR(externalPh), ((_current + _ph) max 0), true]; private _coagFactorMax = missionNamespace getVariable [QGVAR(coagulation_factor_limit), 60]; private _factor = _patient getVariable [QGVAR(coagulationFactor), 30]; private _final2 = (_factor + _coagulation) min _coagFactorMax; -_patient setVariable [QGVAR(coagulationFactor), (_final2), true]; +_patient setVariable [QGVAR(coagulationFactor), (_final2), true]; \ No newline at end of file diff --git a/addons/pharma/functions/fnc_fullHealLocal.sqf b/addons/pharma/functions/fnc_fullHealLocal.sqf index 7e3af217b..9e6d969f3 100644 --- a/addons/pharma/functions/fnc_fullHealLocal.sqf +++ b/addons/pharma/functions/fnc_fullHealLocal.sqf @@ -28,14 +28,28 @@ TRACE_1("fullHealLocal",_patient); GVAR(cardiacArrestBleedRate) = ACEGVAR(medical,const_minCardiacOutput) * EGVAR(circulation,cardiacArrestBleedRate); _patient setVariable [QGVAR(alphaAction), 1, true]; + _patient setVariable [QGVAR(IV), [0,0,0,0,0,0], true]; + +if (GVAR(RequireInsIV) && GVAR(IVflowControl)) then { + _patient setVariable [QGVAR(IVflow), [0,0,0,0,0,0], true]; +} else { + _patient setVariable [QGVAR(IVflow), [1,1,1,1,1,1], true]; +}; + _patient setVariable [QGVAR(IVpfh), [0,0,0,0,0,0], true]; _patient setVariable [QGVAR(active), false, true]; _patient setVariable [QGVAR(IVPharma_PFH), nil, true]; -_patient setVariable [QGVAR(pH), 1500, true]; + +_patient setVariable [QGVAR(IVmenuActive), false, true]; + +_patient setVariable [QGVAR(externalPh), 0, true]; +_patient setVariable [QGVAR(pH), 0, true]; + _patient setVariable [QGVAR(kidneyFail), false, true]; _patient setVariable [QGVAR(kidneyArrest), false, true]; _patient setVariable [QGVAR(kidneyPressure), false, true]; + _patient setVariable [QGVAR(coagulationFactor), missionNamespace getVariable [QGVAR(coagulation_factor_count), 30], true]; /// Clear Stamina & weapon sway @@ -54,29 +68,6 @@ if (ACEGVAR(advanced_fatigue,enabled)) then { /// Clear chroma effect & camera shake if (hasInterface) then { resetCamShake; - ["ChromAberration", 200, [ 0, 0, true ]] spawn { - params["_name", "_priority", "_effect", "_handle"]; - while { - _handle = ppEffectCreate[_name, _priority]; - _handle < 0 - } do { - _priority = _priority + 1; - }; - _handle ppEffectEnable true; - _handle ppEffectAdjust _effect; - _handle ppEffectCommit 0; - [ - { - params["_handle"]; - ppEffectCommitted _handle - }, - { - params["_handle"]; - _handle ppEffectEnable false; - ppEffectDestroy _handle; - }, - [_handle]] call CBA_fnc_waitUntilAndExecute; - }; }; // Reenable ace fatige animationspeed override diff --git a/addons/pharma/functions/fnc_getBloodVolumeChange.sqf b/addons/pharma/functions/fnc_getBloodVolumeChange.sqf index 7e1aacb93..0892d77b4 100644 --- a/addons/pharma/functions/fnc_getBloodVolumeChange.sqf +++ b/addons/pharma/functions/fnc_getBloodVolumeChange.sqf @@ -12,7 +12,7 @@ * Blood volume change (liters per second) * * Example: - * [player, 1, true] call ace_medical_status_fnc_getBloodVolumeChange + * [player, 1, true] call kat_pharma_fnc_getBloodVolumeChange * * Public: No */ @@ -21,25 +21,56 @@ params ["_unit", "_deltaT", "_syncValues"]; private _bloodLoss = [_unit] call ACEFUNC(medical_status,getBloodLoss); private _internalBleeding = GET_INTERNAL_BLEEDING(_unit); -private _bloodVolumeChange = -_deltaT * (_bloodLoss + _internalBleeding); +private _lossVolumeChange = (-_deltaT * ((_bloodLoss + _internalBleeding * (GET_HEART_RATE(_unit) / DEFAULT_HEART_RATE)) / GET_VASOCONSTRICTION(_unit))); +private _fluidVolume = GET_BODY_FLUID(_unit); +private _SRBCChange = 0; +_fluidVolume params ["_ECP","_ECB","_SRBC","_ISP","_fullVolume"]; + +_ECP = _ECP + (_lossVolumeChange * LITERS_TO_ML) / 2; +_ECB = _ECB + (_lossVolumeChange * LITERS_TO_ML) / 2; + +_SRBCChange = if (_SRBC > 100 && _ECB < DEFAULT_ECB) then { ((DEFAULT_ECB - _ECB) min (abs ((_lossVolumeChange * LITERS_TO_ML)) / 2 + 1)) } else { 0 }; +_ECB = _ECB + _SRBCChange; if (!isNil {_unit getVariable [QACEGVAR(medical,ivBags),[]]}) then { private _bloodBags = _unit getVariable [QACEGVAR(medical,ivBags), []]; - private _tourniquets = GET_TOURNIQUETS(_unit); private _IVarray = _unit getVariable [QGVAR(IV), [0,0,0,0,0,0]]; - private _flowCalculation = ACEGVAR(medical,ivFlowRate) * (_unit getVariable [QGVAR(alphaAction), 1]) * _deltaT * 4.16; + private _flowCalculation = (ACEGVAR(medical,ivFlowRate) * _deltaT * 4.16); + private _hypothermia = EGVAR(hypothermia,hypothermiaActive); if (GET_HEART_RATE(_unit) < 20) then { _flowCalculation = _flowCalculation / 1.5; }; + private _incomingVolumeChange = [0,0,0,0,0,0]; + private _fluidWarmer = _unit getVariable [QEGVAR(hypothermia,fluidWarmer), [0,0,0,0,0,0]]; + private _fluidHeat = 0; + _bloodBags = _bloodBags apply { _x params ["_bagVolumeRemaining", "_type", "_bodyPart"]; + private _tourniquets = GET_TOURNIQUETS(_unit); + if ((_tourniquets select _bodyPart isEqualTo 0) && (_IVarray select _bodyPart isNotEqualTo 3)) then { - private _bagChange = _flowCalculation min _bagVolumeRemaining; // absolute value of the change in miliLiters + private _IVflow = _unit getVariable [QGVAR(IVflow), [0,0,0,0,0,0]]; + private _bagChange = (_flowCalculation * (_IVflow select _bodyPart)) min _bagVolumeRemaining; // absolute value of the change in miliLiters _bagVolumeRemaining = _bagVolumeRemaining - _bagChange; - _bloodVolumeChange = _bloodVolumeChange + (_bagChange / 1000); + + if (_hypothermia) then { + // If fluid warmers are on the line, fluids are "warmed" and added to the warmer. If there is no fluid warmer on the line, the fluids stayed cooled + if (_fluidWarmer select _bodyPart == 1) then { + _incomingVolumeChange set [_bodyPart, ((_incomingVolumeChange select _bodyPart) + _bagChange)]; + } else { + _incomingVolumeChange set [_bodyPart, ((_incomingVolumeChange select _bodyPart) - _bagChange)]; + }; + }; + + // Plasma adds to ECP. Saline splits between the ECP and ISP. Blood adds to ECB + switch (true) do { + case(_type == "Plasma"): { _ECP = _ECP + _bagChange; _lossVolumeChange = _lossVolumeChange + (_bagChange / ML_TO_LITERS); }; + case(_type == "Saline"): { _ECP = _ECP + _bagChange / 2; _ISP = _ISP + _bagChange / 2; _lossVolumeChange = _lossVolumeChange + (_bagChange / 2000); }; + case(_type == "Blood"): { _ECB = _ECB + _bagChange; _lossVolumeChange = _lossVolumeChange + (_bagChange / ML_TO_LITERS); }; + }; }; if (_bagVolumeRemaining < 0.01) then { @@ -56,6 +87,42 @@ if (!isNil {_unit getVariable [QACEGVAR(medical,ivBags),[]]}) then { } else { _unit setVariable [QACEGVAR(medical,ivBags), _bloodBags, _syncValues]; }; + + // Incoming fluids impacting internal temperature + if (_hypothermia) then { + { _fluidHeat = _fluidHeat + _x; } forEach _incomingVolumeChange; + + if (_fluidHeat > 0) then { + private _totalHeat = _unit getVariable [QEGVAR(hypothermia,warmingImpact), 0]; + _unit setVariable [QEGVAR(hypothermia,warmingImpact), _totalHeat + _fluidHeat, _syncValues]; + } else { + private _totalCooling = _unit getVariable [QEGVAR(hypothermia,warmingImpact), 0]; + _unit setVariable [QEGVAR(hypothermia,warmingImpact), _totalCooling + _fluidHeat, _syncValues]; + }; + }; +}; + +// Movement and recovery of interstital fluid +private _shiftValue = 0; +switch (true) do { + case (((_ECB + _ECP) > (_ISP * 0.6)) && ((_ECB + _ECP) > 4500)): { + // Negative shifts only happen above 4500ml of blood volume, to prevent issues with falling back into arrest/unconsciousness + _shiftValue = (2 min ((_ECP + _ECB) - (_ISP * 0.6))); + _ECP = _ECP - _shiftValue; + _ISP = _ISP + _shiftValue; + }; + case ((_ECB + _ECP) < (_ISP * 0.6)): { + _shiftValue = (2 min ((_ISP * 0.6) - (_ECP + _ECB))); + _ECP = _ECP + _shiftValue; + _ISP = _ISP - _shiftValue; + }; + default { + // If no shift is required, fluids begin returning to baseline in both ISP and SRBC volumes + _ISP = _ISP + ((DEFAULT_ISP - _ISP) min 2); + _SRBC = _SRBC + ((DEFAULT_SRBC - _SRBC) min 1); + }; }; -_bloodVolumeChange +_unit setVariable [QEGVAR(circulation,bodyFluid), [_ECP, _ECB, (_SRBC - _SRBCChange), _ISP, (_ECP + _ECB)], _syncValues]; + +((_lossVolumeChange + GET_BLOOD_VOLUME_LITERS(_unit)) max 0.01) \ No newline at end of file diff --git a/addons/pharma/functions/fnc_handleRespawn.sqf b/addons/pharma/functions/fnc_handleRespawn.sqf index 8a2b99bd9..6c5f1e970 100644 --- a/addons/pharma/functions/fnc_handleRespawn.sqf +++ b/addons/pharma/functions/fnc_handleRespawn.sqf @@ -36,7 +36,7 @@ params ["_unit","_dead"]; { _x params ["_medication"]; - if (_medication in ["Epinephrine", "Phenylephrine", "Nitroglycerin", "Lidocaine", "Norepinephrine"]) exitWith { + if (_medication in ["Epinephrine", "EpinephrineIV", "Phenylephrine", "Nitroglycerin", "Lidocaine", "Norepinephrine"]) exitWith { _action = true; }; } forEach (_medicationArray); @@ -57,37 +57,43 @@ if (GVAR(kidneyAction)) then { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _ph = _unit getVariable [QGVAR(pH), 1500]; - if (_ph == 1500) exitWith {}; - + private _ph = _unit getVariable [QGVAR(externalPh), 0]; private _kidneyFail = _unit getVariable [QGVAR(kidneyFail), false]; private _kidneyArrest = _unit getVariable [QGVAR(kidneyArrest), false]; private _kidneyPressure = _unit getVariable [QGVAR(kidneyPressure), false]; - if (_ph <= 0) exitWith { - _unit setVariable [QGVAR(kidneyFail), true, true]; - - if !(_kidneyArrest) then { - private _random = random 1; - - if (_random >= 0.5) then { - [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + switch true do { + case(_ph == 3000): { + if (_ph == 3000) exitWith { + _unit setVariable [QGVAR(kidneyFail), true, true]; _unit setVariable [QGVAR(kidneyArrest), true, true]; }; }; - }; - - if (_ph < 750) exitWith { - _ph = (_ph + 25) min 1500; - _unit setVariable [QGVAR(pH), _ph, true]; - - if !(_kidneyPressure) then { - _unit setVariable [QGVAR(kidneyPressure), true, true]; - [_unit, "KIDNEY", 15, 1200, 30, 0, 15] call ACEFUNC(medical_status,addMedicationAdjustment); + case (_ph >= 2000): { + _unit setVariable [QGVAR(kidneyFail), true, true]; + + if !(_kidneyArrest) then { + private _random = random 1; + + if (_random >= 0.75) then { + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + _unit setVariable [QGVAR(kidneyArrest), true, true]; + }; + }; + }; + case (_ph >= 1000): { + _ph = (_ph - 30) max 0; + _unit setVariable [QGVAR(externalPh), _ph, true]; + + if !(_kidneyPressure) then { + _unit setVariable [QGVAR(kidneyPressure), true, true]; + [_unit, "KIDNEY", 15, 1200, 30, 0, 15] call ACEFUNC(medical_status,addMedicationAdjustment); + }; + }; + default { + _ph = (_ph - 60) max 0; + _unit setVariable [QGVAR(externalPh), _ph, true]; }; }; - - _ph = (_ph + 50) min 1500; - _unit setVariable [QGVAR(pH), _ph, true]; }, 20, [_unit]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/pharma/functions/fnc_init.sqf b/addons/pharma/functions/fnc_init.sqf index bfdd09d48..c4194367b 100644 --- a/addons/pharma/functions/fnc_init.sqf +++ b/addons/pharma/functions/fnc_init.sqf @@ -38,7 +38,7 @@ if (!local _unit) exitWith {}; { _x params ["_medication"]; - if (_medication in ["Epinephrine", "Phenylephrine", "Nitroglycerin", "Lidocaine", "Norepinephrine"]) exitWith { + if (_medication in ["Epinephrine", "EpinephrineIV", "Phenylephrine", "Nitroglycerin", "Lidocaine", "Norepinephrine"]) exitWith { _alpha = true; }; } forEach (_medicationArray); @@ -71,42 +71,43 @@ if (GVAR(kidneyAction)) then { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _ph = _unit getVariable [QGVAR(pH), 1500]; - if (_ph == 1500) exitWith { - _unit setVariable [QGVAR(kidneyArrest), false, true]; - _unit setVariable [QGVAR(kidneyPressure), false, true]; - _unit setVariable [QGVAR(kidneyFail), false, true]; - }; - + private _ph = _unit getVariable [QGVAR(externalPh), 0]; private _kidneyFail = _unit getVariable [QGVAR(kidneyFail), false]; private _kidneyArrest = _unit getVariable [QGVAR(kidneyArrest), false]; private _kidneyPressure = _unit getVariable [QGVAR(kidneyPressure), false]; - if (_ph <= 0) exitWith { - _unit setVariable [QGVAR(kidneyFail), true, true]; - _unit setVariable [QGVAR(pH), 0, true]; - - if !(_kidneyArrest) then { - private _random = random 1; - - if (_random >= 0.5) then { - [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + switch true do { + case(_ph == 3000): { + if (_ph == 3000) exitWith { + _unit setVariable [QGVAR(kidneyFail), true, true]; _unit setVariable [QGVAR(kidneyArrest), true, true]; }; }; - }; - - if (_ph < 750) exitWith { - _ph = (_ph + 25) min 1500; - _unit setVariable [QGVAR(pH), _ph, true]; - - if !(_kidneyPressure) then { - _unit setVariable [QGVAR(kidneyPressure), true, true]; - [_unit, "KIDNEY", 15, 1200, 30, 0, 15] call ACEFUNC(medical_status,addMedicationAdjustment); + case (_ph >= 2000): { + _unit setVariable [QGVAR(kidneyFail), true, true]; + + if !(_kidneyArrest) then { + private _random = random 1; + + if (_random >= 0.75) then { + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + _unit setVariable [QGVAR(kidneyArrest), true, true]; + }; + }; + }; + case (_ph >= 1000): { + _ph = (_ph - 30) max 0; + _unit setVariable [QGVAR(externalPh), _ph, true]; + + if !(_kidneyPressure) then { + _unit setVariable [QGVAR(kidneyPressure), true, true]; + [_unit, "KIDNEY", 15, 1200, 30, 0, 15] call ACEFUNC(medical_status,addMedicationAdjustment); + }; + }; + default { + _ph = (_ph - 60) max 0; + _unit setVariable [QGVAR(externalPh), _ph, true]; }; }; - - _ph = (_ph + 50) min 1500; - _unit setVariable [QGVAR(pH), _ph, true]; }, 20, [_unit]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/pharma/functions/fnc_medicationLocal.sqf b/addons/pharma/functions/fnc_medicationLocal.sqf index 78dcfc1cd..6d78425ae 100644 --- a/addons/pharma/functions/fnc_medicationLocal.sqf +++ b/addons/pharma/functions/fnc_medicationLocal.sqf @@ -20,6 +20,9 @@ // todo: move this macro to script_macros_medical.hpp? #define MORPHINE_PAIN_SUPPRESSION 0.6 +// 0.2625 = 0.6/0.8 * 0.35 +// 0.6 = basic medication morph. pain suppr., 0.8 = adv. medication morph. pain suppr., 0.35 = adv. medication painkillers. pain suppr. +#define PAINKILLERS_PAIN_SUPPRESSION 0.2625 params ["_patient", "_bodyPart", "_classname"]; TRACE_3("medicationLocal",_patient,_bodyPart,_classname); @@ -40,15 +43,16 @@ if !(ACEGVAR(medical_treatment,advancedMedication)) exitWith { [QACEGVAR(medical,WakeUp), _patient] call CBA_fnc_localEvent; }; - [_patient, -0.15] call FUNC(alphaAction); }; case "EpinephrineIV": { private _sedated = _patient getVariable [QEGVAR(surgery,sedated), false]; if !(_sedated) then { [QACEGVAR(medical,WakeUp), _patient] call CBA_fnc_localEvent; }; - - [_patient, -0.30] call FUNC(alphaAction); + }; + case "Painkillers": { + private _painSuppress = GET_PAIN_SUPPRESS(_patient); + _patient setVariable [VAR_PAIN_SUPP, (_painSuppress + PAINKILLERS_PAIN_SUPPRESSION) min 1, true]; }; }; }; @@ -88,6 +92,7 @@ private _incompatibleMedication = GET_ARRAY(_medicationConfig >> "incompatibleMe private _alphaFactor = GET_NUMBER(_medicationConfig >> "alphaFactor",getNumber (_defaultConfig >> "alphaFactor")); private _maxRelief = GET_NUMBER(_medicationConfig >> "maxRelief",getNumber (_defaultConfig >> "maxRelief")); private _opioidRelief = GET_NUMBER(_medicationConfig >> "opioidRelief",getNumber (_defaultConfig >> "opioidRelief")); +private _opioidEffect = GET_NUMBER(_medicationConfig >> "opioidEffect",getNumber (_defaultConfig >> "opioidEffect")); private _heartRate = GET_HEART_RATE(_patient); private _hrIncrease = [_hrIncreaseLow, _hrIncreaseNormal, _hrIncreaseHigh] select (floor ((0 max _heartRate min 110) / 55)); @@ -104,19 +109,15 @@ if (_maxRelief > 0) then { // Adjust the medication effects and add the medication to the list TRACE_3("adjustments",_heartRateChange,_painReduce,_viscosityChange); -[_patient, _className, _timeTillMaxEffect, _timeInSystem, _heartRateChange, _painReduce, _viscosityChange] call ACEFUNC(medical_status,addMedicationAdjustment); +[_patient, _className, _timeTillMaxEffect, _timeInSystem, _heartRateChange, _painReduce, _viscosityChange, _alphaFactor, _opioidEffect] call EFUNC(vitals,addMedicationAdjustment); // Check for medication compatiblity [_patient, _className, _maxDose, _maxDoseDeviation, _incompatibleMedication] call ACEFUNC(medical_treatment,onMedicationUsage); -//Change Alpha Factor -[_patient, _alphaFactor] call FUNC(alphaAction); - - -if (_className in ["Lorazepam","Ketamine","EACA","TXA","Atropine","Amiodarone","Flumazenil"]) then { +if (_className in ["Lorazepam","EACA","TXA","Atropine","Amiodarone","Flumazenil"]) then { [format ["kat_pharma_%1Local", toLower _className], [_patient, _bodyPart], _patient] call CBA_fnc_targetEvent; }; if (_className in ["Fentanyl","Morphine","Nalbuphine"]) then { [format ["kat_pharma_%1Local", toLower _className], [_patient, _bodyPart, _opioidRelief], _patient] call CBA_fnc_targetEvent; -}; \ No newline at end of file +}; diff --git a/addons/pharma/functions/fnc_pervitinPP.sqf b/addons/pharma/functions/fnc_pervitinPP.sqf index edbdf506d..620e90325 100644 --- a/addons/pharma/functions/fnc_pervitinPP.sqf +++ b/addons/pharma/functions/fnc_pervitinPP.sqf @@ -17,53 +17,6 @@ params ["_target"]; -if !(alive _target) exitWith {}; -if (ACE_Player != _target) exitWith {}; - -if (GVAR(chromatic_aberration_checkbox_pervitin)) then { - [{ - params ["_target"]; - - ["ChromAberration", 200, [ (GVAR(chromatic_aberration_slider_pervitin)/100), (GVAR(chromatic_aberration_slider_pervitin)/100), true ], "", _target] spawn { - - params ["_name", "_priority", "_effect", "_handle", "_target"]; - while { - _handle = ppEffectCreate[_name, _priority]; - _handle < 0 - } do { - _priority = _priority + 1; - }; - _handle ppEffectEnable true; - _handle ppEffectAdjust _effect; - _handle ppEffectCommit 120; // 2m for max chroma - [LLSTRING(Pervitin_chrom), 2, _target] call ACEFUNC(common,displayTextStructured); - - [{ params["_handle"]; - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectAdjust [0.005, 0.005, false]; - _handle ppEffectCommit 257.5; // lowering until 9m - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectEnable false; - ppEffectDestroy _handle; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - }, - [_handle], 257.5] call CBA_fnc_waitAndExecute; // wait until 4:30m for change to lower again - }; - }, - [_target], 25] call CBA_fnc_waitAndExecute; // chroma start after 25s -}; - // CamShake effect [{ if !(alive _target) exitWith {}; diff --git a/addons/pharma/functions/fnc_tourniquetRemove.sqf b/addons/pharma/functions/fnc_tourniquetRemove.sqf index 135824569..e15a5e54b 100644 --- a/addons/pharma/functions/fnc_tourniquetRemove.sqf +++ b/addons/pharma/functions/fnc_tourniquetRemove.sqf @@ -26,7 +26,9 @@ private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; private _tourniquets = GET_TOURNIQUETS(_patient); if (_tourniquets select _partIndex == 0) exitWith { - [ACELSTRING(medical_treatment,noTourniquetOnBodyPart), 1.5] call ACEFUNC(common,displayTextStructured); + if (_medic == ACE_player) then { + [ACELSTRING(medical_treatment,noTourniquetOnBodyPart), 1.5] call ACEFUNC(common,displayTextStructured); + }; }; _tourniquets set [_partIndex, 0]; @@ -39,8 +41,15 @@ TRACE_1("clearConditionCaches: tourniquetRemove",_nearPlayers); [QACEGVAR(interact_menu,clearConditionCaches), [], _nearPlayers] call CBA_fnc_targetEvent; // Add tourniquet item to medic or patient -private _receiver = [_patient, _medic, _medic] select ACEGVAR(medical_treatment,allowSharedEquipment); -[_receiver, "ACE_tourniquet"] call ACEFUNC(common,addToInventory); +if (_medic call ACEFUNC(common,isPlayer)) then { + private _receiver = [_patient, _medic, _medic] select ACEGVAR(medical_treatment,allowSharedEquipment); + [_receiver, "ACE_tourniquet"] call ACEFUNC(common,addToInventory); +} else { + // If the medic is AI, only return tourniquet if enabled + if (missionNamespace getVariable [QACEGVAR(medical_ai,requireItems), 0] > 0) then { + [_medic, "ACE_tourniquet"] call ACEFUNC(common,addToInventory); + }; +}; // Handle occluded medications that were blocked due to tourniquet private _occludedMedications = _patient getVariable [QACEGVAR(medical,occludedMedications), []]; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_CarbonateLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_CarbonateLocal.sqf index e7b60c77d..f6ffcc142 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_CarbonateLocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_CarbonateLocal.sqf @@ -23,6 +23,6 @@ if (_sedated) exitWith {}; private _bloodPressureH = GET_BLOOD_PRESSURE(_patient) select 1; -if ((floor (random 100) < ((linearConversion [50, 100, _bloodPressureH, 0, GVAR(carbonateChance), true]) min (linearConversion [140, 200, _bloodPressureH, GVAR(carbonateChance), 0, true]))) && {[_patient] call EFUNC(misc,hasStableVitals)}) then { +if ((floor (random 100) < ((linearConversion [50, 100, _bloodPressureH, 0, GVAR(carbonateChance), true]) min (linearConversion [140, 200, _bloodPressureH, GVAR(carbonateChance), 0, true]))) && {[_patient] call EFUNC(vitals,hasStableVitals)}) then { [_patient, false] call ACEFUNC(medical,setUnconscious); }; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_CheckCoag.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_CheckCoag.sqf index 374effac4..771d25a77 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_CheckCoag.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_CheckCoag.sqf @@ -29,8 +29,8 @@ private _output = ""; switch (true) do { case (_coagFactors < _slowINR && _coagFactors > _hlowINR): { _output = LLSTRING(CheckCoag_slightly_lowINR)}; case (_coagFactors > _shighINR && _coagFactors < _hhighINR): { _output = LLSTRING(CheckCoag_slightly_aboveINR)}; - case (_coagFactors < _hlowINR): { _output = LLSTRING(CheckCoag_highly_lowINR)}; - case (_coagFactors > _hhighINR): { _output = LLSTRING(CheckCoag_highly_aboveINR)}; + case (_coagFactors <= _hlowINR): { _output = LLSTRING(CheckCoag_highly_lowINR)}; + case (_coagFactors >= _hhighINR): { _output = LLSTRING(CheckCoag_highly_aboveINR)}; default { _output = LLSTRING(CheckCoag_normalINR)}; }; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_DialysisLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_DialysisLocal.sqf index a817dd662..d3f69e4ef 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_DialysisLocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_DialysisLocal.sqf @@ -19,7 +19,7 @@ params ["_medic", "_patient"]; _patient setVariable [QACEGVAR(medical,medications), [], true]; -_patient setVariable [QGVAR(pH), 1000, true]; +_patient setVariable [QGVAR(externalPh), 0, true]; _patient setVariable [QGVAR(kidneyFail), false, true]; _patient setVariable [QGVAR(kidneyArrest), false, true]; _patient setVariable [QGVAR(kidneyPressure), false, true]; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_EACALocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_EACALocal.sqf index 502b608c9..2a815a6df 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_EACALocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_EACALocal.sqf @@ -49,7 +49,6 @@ if (_IVactual > 1) then { if (!(GVAR(coagulation)) || GVAR(coagulation_allow_EACA_script)) then { if (_IVactual != 3) then { - if (_countEACA > 1 && !(_allowStack)) exitWith {}; [{ @@ -59,8 +58,8 @@ if (!(GVAR(coagulation)) || GVAR(coagulation_allow_EACA_script)) then { private _alive = alive _patient; private _exit = true; - private _random = random 750; - private _ph = (_patient getVariable [QGVAR(pH), 1500]) - 750; + private _random = random [6.4, 6.8, 7.2]; + private _ph = GET_PH(_patient); if !(_alive) exitWith { [_idPFH] call CBA_fnc_removePerFrameHandler; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_FentanylLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_FentanylLocal.sqf index a927fbdfd..e2090ec8c 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_FentanylLocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_FentanylLocal.sqf @@ -20,54 +20,7 @@ /// ChromAberration effect params ["_target", "_bodyPart", "_opioidRelief"]; -if !(alive _target) exitWith {}; -if (ACE_Player != _target) exitWith {}; - private _opioidFactor = _target getVariable [QGVAR(opioidFactor), 1]; if (_opioidFactor == 1) then { _target setVariable [QGVAR(opioidFactor), _opioidRelief, true]; -}; - -// ChromAberration effect -if (GVAR(chromatic_aberration_checkbox_fentanyl)) then { - [{ - params ["_target"]; - - ["ChromAberration", 200, [(GVAR(chromatic_aberration_slider_fentanyl)/100), (GVAR(chromatic_aberration_slider_fentanyl)/100), true ], "", _target] spawn { - - params ["_name", "_priority", "_effect", "_handle", "_target"]; - while { - _handle = ppEffectCreate[_name, _priority]; - _handle < 0 - } do { - _priority = _priority + 1; - }; - _handle ppEffectEnable true; - _handle ppEffectAdjust _effect; - _handle ppEffectCommit 180; // 3m for max chroma - - [{ params["_handle"]; - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectAdjust [0.005, 0.005, false]; - _handle ppEffectCommit 480; // lowering until 15m - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectEnable false; - ppEffectDestroy _handle; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - }, - [_handle], 360] call CBA_fnc_waitAndExecute; // wait until 7m for change to lower again - }; - }, - [_target], 60] call CBA_fnc_waitAndExecute; // chroma start after 60s -}; +}; \ No newline at end of file diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_KetamineLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_KetamineLocal.sqf deleted file mode 100644 index f9686086b..000000000 --- a/addons/pharma/functions/fnc_treatmentAdvanced_KetamineLocal.sqf +++ /dev/null @@ -1,66 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: Miss Heda - * Triggers the ketamine visual effect. - * - * Arguments: - * 0: Patient - * - * Return Value: - * None - * - * Example: - * [player] call kat_pharma_fnc_ketaminePP; - * - * Public: No - */ - - -/// ChromAberration effect -params ["_target"]; - -if !(alive _target) exitWith {}; -if (ACE_Player != _target) exitWith {}; - -if (GVAR(chromatic_aberration_checkbox_ketamine)) then { - [{ - params ["_target"]; - - ["ChromAberration", 200, [(GVAR(chromatic_aberration_slider_ketamine)/100), (GVAR(chromatic_aberration_slider_ketamine)/100), true ], "", _target] spawn { - - params ["_name", "_priority", "_effect", "_handle", "_target"]; - while { - _handle = ppEffectCreate[_name, _priority]; - _handle < 0 - } do { - _priority = _priority + 1; - }; - _handle ppEffectEnable true; - _handle ppEffectAdjust _effect; - _handle ppEffectCommit 360; // 6m for max chroma - - [{ params["_handle"]; - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectAdjust [0.005, 0.005, false]; - _handle ppEffectCommit 480; // lowering until 15m - - [{ params["_handle"]; - ppEffectCommitted _handle - }, - { params["_handle"]; - _handle ppEffectEnable false; - ppEffectDestroy _handle; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - - }, [_handle]] call CBA_fnc_waitUntilAndExecute; - }, - [_handle], 360] call CBA_fnc_waitAndExecute; // wait until 7m for change to lower again - }; - }, - [_target], 60] call CBA_fnc_waitAndExecute; // chroma start after 60s -}; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_MorphineLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_MorphineLocal.sqf index 3ca57dc32..221dbe1eb 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_MorphineLocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_MorphineLocal.sqf @@ -17,9 +17,6 @@ params ["_patient", "_bodyPart", "_opioidRelief"]; -if !(alive _patient) exitWith {}; -if (ACE_Player != _patient) exitWith {}; - private _opioidFactor = _patient getVariable [QGVAR(opioidFactor), 1]; if (_opioidFactor == 1) then { _patient setVariable [QGVAR(opioidFactor), _opioidRelief, true]; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_NalbuphineLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_NalbuphineLocal.sqf index 27b76d60d..14ecda81f 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_NalbuphineLocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_NalbuphineLocal.sqf @@ -17,9 +17,6 @@ params ["_patient", "_bodyPart", "_opioidRelief"]; -if !(alive _patient) exitWith {}; -if (ACE_Player != _patient) exitWith {}; - private _opioidFactor = _patient getVariable [QGVAR(opioidFactor), 1]; if (_opioidFactor == 1) then { _patient setVariable [QGVAR(opioidFactor), _opioidRelief, true]; diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_ReorientationLocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_ReorientationLocal.sqf index b820cf563..2d686d841 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_ReorientationLocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_ReorientationLocal.sqf @@ -20,7 +20,7 @@ params ["_medic", "_patient"]; private _pulse = GET_HEART_RATE(_patient); -if ((floor (random 100) < ((linearConversion [40, 79, _pulse, 0, GVAR(reorientationChance), true]) min (linearConversion [80, 220, _pulse, GVAR(reorientationChance), 0, true]))) && {[_patient] call EFUNC(misc,hasStableVitals)}) then { +if ((floor (random 100) < ((linearConversion [40, 79, _pulse, 0, GVAR(reorientationChance), true]) min (linearConversion [80, 220, _pulse, GVAR(reorientationChance), 0, true]))) && {[_patient] call EFUNC(vitals,hasStableVitals)}) then { [_patient, false] call ACEFUNC(medical,setUnconscious); _output = LLSTRING(ReorientingSuccess); [_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured); diff --git a/addons/pharma/functions/fnc_treatmentAdvanced_TXALocal.sqf b/addons/pharma/functions/fnc_treatmentAdvanced_TXALocal.sqf index 7f74eec37..c52d0a4be 100644 --- a/addons/pharma/functions/fnc_treatmentAdvanced_TXALocal.sqf +++ b/addons/pharma/functions/fnc_treatmentAdvanced_TXALocal.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* - * Author: 2LT.Mazinski + * Author: Mazinski * Begins TXA bandaging process * * Arguments: @@ -58,18 +58,13 @@ if (!(GVAR(coagulation)) || GVAR(coagulation_allow_TXA_script)) then { private _alive = alive _patient; private _exit = true; + private _random = random [6.4, 6.8, 7.2]; + private _ph = GET_PH(_patient); if !(_alive) exitWith { [_idPFH] call CBA_fnc_removePerFrameHandler; }; - if !(GVAR(kidneyAction)) then { - _patient setVariable [QGVAR(pH), 1500, true]; - }; - - private _random = random 1000; - private _ph = (_patient getVariable [QGVAR(pH), 1500]) - 500; - if (_random <= _ph) then { { _x params ["_targetBodyPart"]; diff --git a/addons/pharma/licence.txt b/addons/pharma/licence.txt index c24e6514b..a368a248b 100644 --- a/addons/pharma/licence.txt +++ b/addons/pharma/licence.txt @@ -1,4 +1,4 @@ -This addon is made by Mazinski.H. +This addon is made by Mazinski.H. This file must not be removed from the folder and must be contained in every work based on this addon or parts of it. diff --git a/addons/pharma/stringtable.xml b/addons/pharma/stringtable.xml index 91e134670..592dfb1c0 100644 --- a/addons/pharma/stringtable.xml +++ b/addons/pharma/stringtable.xml @@ -15,6 +15,7 @@ Permitir aplicar IV Salli hakeminen IV Разрешить внутривенное введение + IV plaatsing niveau Changes what medical level is required to set IVs @@ -32,6 +33,7 @@ Изменяет медицинский уровень, необходимый для установки IV. Muda qual nível médico é necessário para aplicar IVs Muuttaa, mitä lääketieteen koulutustasoa tarvitaan IV:n lisäämiseen + Bepaald welk medisch niveau benodigd is om IV's aan te kunnen leggen Allow applying IO @@ -47,6 +49,7 @@ Permitir aplicar IO Salli IO:n käyttö Разрешить применение IO + IO plaatsing niveau Changes what medical level is required to set IOs @@ -62,6 +65,7 @@ Muda qual nível médico é necessário para aplicar IOs Muuttaa IO:iden asettamiseen vaadittavaa lääketieteellistä tasoa Изменяет, какой медицинский уровень требуется для установки IO + Bepaald welk medisch niveau benodigd is om IO's aan te kunnen leggen Enables IV/IO drop times @@ -79,6 +83,7 @@ Включает время сброса IV/IO Habilita tempo de queda de IV/IO Mahdollistaa IV/IO-pudotusajat + Schakel IV/IO uitvaltijd in IV/IO drop time @@ -93,6 +98,7 @@ Čas vypadnutí IV/IO IV/IO pudotusaika Время выпадения IV/IO + IV/IO uitvaltijd Changes the time at which IVs/IOs fall out of a patient @@ -110,6 +116,7 @@ Изменяет время выпадения IV/IO капельниц у пациента Altera o tempo em que IVs/IOs caem de um paciente Muuttaa aikaa, jolloin IVs/IO + Veranderd de benodigde uitvaltijd voor IV's/IO's Sets if IV/IO needles are reusable @@ -127,6 +134,7 @@ Устанавливает, можно ли использовать иглы IV/IO повторно Define se as agulhas IV/IO são reutilizáveis Asettaa, jos IV/IO-neulat ovat uudelleenkäytettäviä + Bepaald of IV/IO naalden herbruikbaar zijn Time to establish IVs @@ -144,6 +152,7 @@ Время установки IV Tempo de estabelecimento de IV IV lisäämiseen tarvittava aika + Aanbrengtijd voor IV's Time to establish IOs @@ -161,23 +170,31 @@ Время установки IO Tempo de estabelecimento de IO Aika luoda IO:t + Aanbrengtijd voor IO's Combat Wound Medication Pill Pack<br/>Used to suppress minor pain and relieve blood incompatibility symptoms 戦闘傷病治療薬パック<br/>軽度の痛みを抑え、血液不適合による症状を緩和するために使用される Paquete de medicación para heridas de combate. Se utiliza para suprimir el dolor leve y aliviar los síntomas de incompatibilidad sanguínea + Gevechts wond medicatie pil pak<br/>Wordt gebruikt om milde pijn en bloed incompatibiliteit op te lossen + Pack de Pilules Médicales pour Blessures de Combat </br> Utilisé pour supprimer les douleurs mineures et soulager les symptômes d'incompatibilité sanguine. Combat Pill Pack 戦闘治療薬パック Paquete de Comprimidos de Combate Comprimidos de Combate + Gevechtspillendoosje + Pack de Pilules de combat Use CWMP + 使用 CWMP*(战斗药物) 戦闘傷病治療薬を投与 Usar Comprimidos de Combate Utilizar Comprimidos de Combate + Gebruik Gevechtspillendoosje + Utiliser le PMBC Used to restore consciousness @@ -195,6 +212,7 @@ Используется для восстановления сознания Usado para restaurar a consciência Käytetään tajunnan palauttamiseen + Wordt gebruikt om bewustzijn te herstellen Ammonium Carbonate @@ -212,6 +230,7 @@ Карбонат аммония Carbonato de Amônio Ammoniumkarbonaatti + Ammoniumcarbonaat Use Carbonate @@ -229,6 +248,7 @@ Ввести Карбонат Administrar Carbonato de Amônio Käytä karbonaattia + Gebruik carbonaat Penthrox Inhaler @@ -240,9 +260,11 @@ Inhalador Penthrox Penthrox inhalaattori Ингалятор Пентрокс + Penthrox inhalator Use Penthrox Inhaler + 使用“绿哨”吸入式止痛药物 ペンスロックス吸入器を使う Utiliser l'inhalateur de Penthrox 펜트록스 흡입기 사용 @@ -251,11 +273,14 @@ Usar inhalador Penthrox Käytä penthrox-inhalaattoria Использовать ингалятор Пентрокс + Gebruik Penthrox inhalator Volatile anesthetic, used to suppress moderate pain 揮発性麻酔薬、 中程度の痛みを抑えるのに使用される Anestésico inhalable, utilizado para suprimir el dolor moderado + volatiel anestheticum, wordt gebruik om stevige pijn te onderdrukken + Anesthésique volatil, utilisé pour supprimer les douleurs modérées Used to reverse opioid overdoses @@ -273,6 +298,7 @@ Используется для устранения передозировок опиоидами. Usado para reverter overdoses de opioides Käytetään opioidien yliannostusten kumoamiseen + Wordt gebruikt om opïode overdossisen tegen te gaan Naloxone @@ -290,6 +316,7 @@ Налоксон Naloxona naloksoni + Naloxone Use Naloxone @@ -307,6 +334,7 @@ Ввести Налоксон Administrar Naloxona Käytä naloksonia + Gebruik Naloxone Used to combat cardiac arrest @@ -324,6 +352,7 @@ Используется для борьбы с остановкой сердца Usado para combater a parada cardíaca Käytetään sydämenpysähdyksen torjuntaan + Wordt gebruikt om hartstilstand te bestrijden Amiodarone @@ -341,6 +370,7 @@ Амиодарон Amiodarona Amiodaroni + Amiodaron Push Amiodarone @@ -358,6 +388,7 @@ Ввести Амиодарон Injetar Amiodarona Työnnä amiodaria + Injecteer Amiodaron Used to combat cardiac arrest @@ -375,6 +406,7 @@ Используется для борьбы с остановкой сердца Usado para combater a parada cardíaca Käytetään sydämenpysähdyksen torjuntaan + Wordt gebruikt om hartstilstand te bestrijden Lidocaine @@ -392,6 +424,7 @@ Лидокаин Lidocaína Lidokaiini + Lidocaïne Push Lidocaine @@ -409,6 +442,7 @@ Ввести Лидокаин Injetar Lidocaína Paina lidokaiinia + Injecteer Lidocaïne Used to treat chemical exposure @@ -426,6 +460,7 @@ Используется для лечения брадикардии Usado para tratar bradicardia Käytetään bradykardian hoitoon + Wordt gebruikt om chemische blootstelling en bradycardie te behandelen Atropine Autoinjector @@ -443,6 +478,7 @@ Атропин Autoinjetor de Atropina Atropiini + Atropine autoinjector Inject Atropine @@ -460,6 +496,7 @@ Ввести Атропин Injetar Atropina Työnnä atropiinia + Injecteer Atropine Encourages clot formation @@ -477,6 +514,7 @@ Способствует образованию тромбов Intensifica a coagulação Edistää verihyytymien muodostumista + Bevorderd bloedstolling TXA @@ -494,6 +532,7 @@ TXA TXA TXA + TXA Push TXA @@ -511,6 +550,7 @@ Ввести TXA Injetar TXA Paina TXA + Injecteer TXA Used to raise blood pressure @@ -528,6 +568,7 @@ Используется для повышения артериального давления Usado para aumentar a pressão arterial Käytetään verenpaineen nostamiseen + Wordt gebruikt om de bloeddruk te verhogen Norepinephrine @@ -545,6 +586,7 @@ Норадреналин Norepinefrina Norepinefriini + Noradrenaline Push Norepinephrine @@ -562,6 +604,7 @@ Ввести Норадреналин Injetar Norepinefrina Työnnä norepinefriiniä + Injecteer Noradrenaline Used to raise blood pressure @@ -579,6 +622,7 @@ Используется для повышения артериального давления Usado para aumentar a pressão arterial Käytetään verenpaineen nostamiseen + Wordt gebruikt om de bloeddruk te verhogen Phenylephrine @@ -596,6 +640,7 @@ Фенилэфрин Fenilefrina Fenyyliefriini + Fenylefrine Push Phenylephrine @@ -613,6 +658,7 @@ Ввести Фенилэфрин Injetar Fenilefrina Työnnä fenyyliefriiniä + Injecteer Fenylefrine (IV) Phenylephrine Autoinjector @@ -621,6 +667,7 @@ フェニレフリン自動注射器 Autoinjecteur de Phényléphrine Autoinjetor de Fenilefrina + Fenylefrine autoinjector Inject Phenylephrine @@ -637,6 +684,7 @@ フェニレフリンを注射 Ввести Фенилэфрин Injetar Fenilefrina + Injecteer Fenylefrine Used to lower blood pressure @@ -654,6 +702,7 @@ Используется для снижения артериального давления Usado para baixar a pressão arterial Käytetään alentamaan verenpainetta + Wordt gebruikt om de bloeddruk te laten dalen Nitroglycerin @@ -671,6 +720,7 @@ Нитроглицерин Nitroglicerina Nitroglyseriini + Nitroglycerine Push Nitroglycerin @@ -688,6 +738,7 @@ Ввести Нитроглицерин Injetar Nitroglicerina Paina nitroglyseriiniä + Injecteer Nitroglycerine Reorient Patient @@ -704,6 +755,7 @@ Переориентация пациента Reorientar Paciente Suuntaa potilas uudelleen + Heroriënteer patiënt Reorienting @@ -721,6 +773,7 @@ Переориентация Reorientando Suuntaa uudelleen + Aan het heroriënteren You hit the cheek, but patient still asleep! @@ -738,6 +791,7 @@ あなたは頬を叩いたが、 患者はまだ眠っている! Após a bofetada, o paciente continua desacordado! Lyöt poskelle, mutta potilas nukkuu edelleen! + Je hebt de wang geraakt, maar de patiënt slaapt nog! Patient woke up with a hard hit! @@ -755,6 +809,7 @@ 患者は強打で飛び起きた! O bofetão acorda o paciente! Potilas heräsi kovalla iskulla! + Patiënt werd wakker na een harde klap! Using @@ -772,6 +827,7 @@ С использованием Usando Käyttämällä + Wordt gebruikt Pushing @@ -789,6 +845,7 @@ Ввести Administrando Työntää + Wordt geïnjecteerd %1 pushed %2 @@ -806,6 +863,7 @@ %1 нажал %2 %1 administrou %2 %1 työnnettiin %2 + %1 injecteerde %2 %1 injected %2 @@ -823,6 +881,7 @@ %1 введено %2 %1 injetou %2 %1 pistetään %2 + %1 injecteerde %2 %1 used %2 @@ -840,6 +899,7 @@ %1 использует %2 %1 usou %1 %1 käytetty %2 + %1 gebruikte %2 16g IV @@ -857,6 +917,7 @@ 16г IV 16g IV 16g IV + 16g IV Intravenous Needle @@ -874,6 +935,7 @@ Внутривенная игла Cateter Intravenoso Laskimonsisäinen neula + intraveneuze canule FAST IO @@ -891,6 +953,7 @@ FAST IO FAST IO FAST IO + FAST IO Intraosseous Needle @@ -908,6 +971,7 @@ Внутривенная игла Infusão Intraóssea Luonsisäinen neula + Intraossale canule Establish 16g IV @@ -925,6 +989,7 @@ Установить 16г IV Inserir 16g IV Aseta 16g IV + Leg 16g IV aan Establish FAST IO @@ -942,6 +1007,7 @@ Установить FAST IO Inserir FAST IO Perusta FAST IO + Leg FAST IO aan Establishing IV/IO @@ -959,6 +1025,7 @@ Установить IV Inserindo IV IV/IO:n perustaminen + IV/IO wordt aangelegd Establishing IO @@ -976,6 +1043,7 @@ Установить IO Inserindo IO IO:n perustaminen + IO wordt aangelegd %1 established a %2 @@ -993,6 +1061,7 @@ %1 ввёл %2 %1 inseriu %2 %1 perusti %2 + %1 heeft een %2 aangelegd Remove IV/IO @@ -1010,6 +1079,7 @@ Удалить IV/IO Remover IV/IO Poista IV/IO + Verwijder IV/IO Removing IV/IO @@ -1027,6 +1097,7 @@ Удаление IV/IO Removendo IV/IO poisto + IV/IO wordt verwijderd Fluid Require inserted IV/IO @@ -1036,6 +1107,7 @@ Los Fluidos requieren que se inserte la IV/IO Les fluides nécessitent une IV/IO insérée Fluido necessita de inserção IV/IO + Vloeistoffen vereisen een aangelegde IV/IO Default false. If true, you will need to insert IV/IO first before being able to give someone saline/blood/plasma. \nIf false, it retains standard ACE behaviour for using saline/blood/plasma. @@ -1053,6 +1125,7 @@ Истина по умолчанию. Если это правда, вам нужно будет сначала ввести IV/IO, прежде чем вы сможете дать кому-то физиологический раствор/кровь/плазму. \nЕсли false, он сохраняет стандартное поведение ACE для использования физиологического раствора/крови/плазмы. Falso, por padrão. Se verdadeiro, você precisará inserir IV/IO primeiro antes de poder administrar solução salina/sangue/plasma a alguém. \nSe falso, mantém o comportamento padrão do ACE para uso de solução salina/sangue/plasma. Oletusarvo epätosi. Jos totta, sinun on lisättävä IV/IO ensin, ennen kuin voit antaa jollekulle suolaliuosta/verta/plasmaa \nJos väärin, se säilyttää normaalin ACE-käyttäytymisen suolaliuoksen/veren/plasman käytössä. + Standaard vals. Wanneer waar moet er eerst een IV/IO aangelegd worden voordat je vloeistoffen kan toedienen.\nWanneer vals, wordt standaard ACE gedrag gebruikt voor vloeistoffen Medications Require IV/IO @@ -1068,6 +1141,7 @@ Medicamentos requerem IV/IO Lääkkeet vaativat IV/IO:n Лекарства требуют внутривенного введения + Medicaties vereisen IV/IO Default false. If true, you will need to insert IV/IO first before being able to give someone medications. \nIf false, you can give them without it. @@ -1083,6 +1157,7 @@ Falso, por padrão. Se verdadeiro, você precisará inserir IV/IO primeiro antes de poder administrar medicamentos a alguém. \nSe falso, você pode administrá-los sem ele. Oletusarvo epätosi. Jos totta, sinun on lisättävä IV/IO ensin, ennen kuin voit antaa jollekin lääkkeitä. \nJos vääriä, voit antaa ne ilman sitä. По умолчанию false. Если true, вам нужно будет сначала ввести IV/IO, прежде чем вы сможете давать кому-либо лекарства. n\Если false, вы можете давать их без этого. + Standaard vals. Wanneer waar moet er eerst een IV/IO aangelegd worden voordat medicatie toegedient kan worden. \nWanneer vals kunnen medicijnen gegeven worden zonder IV/IO Blood Drawing Require IV/IO @@ -1092,6 +1167,7 @@ La Extracción de Sangre Requiere la IV/IO La prise de sang nécessite une IV/IO Extração de sangue necessita de IV/IO + Bloedoptrekken vereist IV/IO Default false. If true, you will need to insert IV/IO first before being able to draw blood from someone. \nIf false, you can draw without it. @@ -1101,6 +1177,15 @@ Falso por defecto. Si se habilita, necesitarás insertar primero la IV/IO para poder extraer sangre de alguien. \nSi falso, puedes extraer sangre sin ello. Désactivé par défaut. Si activé, vous devrez d’abord insérer une IV/IO avant de pouvoir prélever du sang sur quelqu’un. \nSi désactivé, vous pouvez effectuer une prise de sang sans IV/IO. Desativado, por padrão. Quando ativado, você precisará inserir IV/IO primeiro antes de poder retirar sangue de alguém. \nSe desativado, você pode retirar sem ele. + Standaard vals. Wanneer waar moet er eerst een IV/IO toegediend worden voordat je bloed kan optrekken. \nWanneer vals is dit niet vereist. + + + Enable IV/IO Flow Control + IV/IO流量操作を有効化 + + + Enables the IV/IO flow control menu which gives the medic fine control over the volume running through the active line + IV/IO流量操作メニューを有効にし、輸液がラインを流れる液量を衛生兵が細かく制御できるようにします。 Reorientation slap sound @@ -1114,10 +1199,11 @@ Son claque stimulation Yönlendirme tokat sesi Suono schiaffo stimolazione - 刺激時に音を鳴らす + 患者を刺激するアクションで音を鳴らす Звук пощечины при переориентации Som de tapa durante reorientação Lyöksytysääni potilaan suunnan muuttamiseen + Heroriëntatie klapgeluid Enables slap sound for reorientation @@ -1131,10 +1217,11 @@ Activer son de la claque Yeniden yönlendirme için tokat sesini etkinleştirir Abilita il suono dello schiaffo per la stimolazione - 患者を刺激する際に平手打ちする音を鳴らします + 患者を刺激した際に平手打ちするような音を鳴らします Включает звук пощечины для переориентации Ativa o som de tapa durante reorientação Sallii iskuäänen uudelleensuuntaamista varten + Schakelt het klapgeluid in voor heroriëntatie Reorientation enabled? @@ -1148,10 +1235,11 @@ Stimulation activé? Yeniden yönlendirme etkin mi? Stimolazione abilitata? - 患者を刺激出来るようにしますか? + 患者を刺激するアクションを有効化しますか? Переориентация включена? Reorientação habilitada? Uudelleensuuntaus käytössä? + Heroriëntatie ingeschakeld? Enables reorientation @@ -1165,10 +1253,11 @@ Activer stimulation Yeniden yönlendirmeyi etkinleştirir Stimolazione abilitata - 患者を刺激する機能を有効化します(患者の安定時に平手打ちで叩き起こす) + 安定化している患者を刺激(平手打ち)することで、目覚めさせる機能を有効化します Включает переориентация Habilita a reorientação Mahdollistaa suunnanmuutoksen + Schakelt heroriëntatie in Allow reorientation @@ -1182,10 +1271,11 @@ Autoriser stimulation Yeniden yönlendirmeye izin ver Autorizza stimolazione - 患者を刺激する許可 + 患者を刺激するアクションの許可 Разрешить переориентацию Permitir reorientação Salli suunnanmuutos + Trainingsniveau voor heroriëntatie Medical level required for reorientation @@ -1203,68 +1293,13 @@ Медицинский уровень, необходимый для переориентации Nível médico necessário para reorientação Uudelleensuuntautumiseen vaadittava lääketieteellinen koulutustaso - - - Enable Chromatic Aberration - Aktiviere Chromatische Abweichungen - Activer l'aberration chromatique - 色収差を有効にする - 색수차 활성화(페르피틴) - Attiva aberrazione cromatica - Ativar Aberração Cromática - Włącz Aberrację Chromatyczną - Habilitar aberración cromatica - Povolit Chromatickou Aberaci - Ota kromaattinen aberraatio käyttöön - Включить хроматическую аберрацию - - - Enables if pervitin should influance your vision with chromatic aberration - Aktiviert, ob Pervitin deine Sicht mit chromatischen Abweichungen beeinflussen soll - Définie si la pervitine devrait influancer la vision avec une aberration chromatique - ペルビチン服用時に色収差で視覚に影響を与えるかどうかを有効にします - 페르피틴이 색수차로 시력에 영향을 미치는지의 여부를 활성화합니다. - Attiva se il pervitin debba influenzare la tua visuale con l'aberrazione cromatica - Ativa se o Pervitin deve influenciar sua visão com Aberração Cromática - Włącza efekt wizualny po zażyciu pervitinu - Habilitar si la pervitina influye en la vision con aberración cromatica - Povoluje, zda pervitin ovlivní Vaše vidění chromatickou aberací - Mahdollistaa, jos pervitiini vaikuttaa näköön kromaattisen aberraation avulla - Включает, если Первитин должен повлиять на ваше зрение с помощью хроматической аберрации - - - Chromatic Aberration Strength - Chromatische Abweichung-Stärke - Intensité de l'aberration chromatique - 色収差強度 - 색수차 강도(페르피틴) - Intensità dell'aberrazione cromatica - Intensidade de Aberração Cromática - Siła Aberracji Chromatycznej - Intensidad de la aberración cromatica - Síla Chromatické Aberace - Kromaattisen aberraation vahvuus - Сила хроматической аберрации - - - Changes the strength of the chromatic aberration - Bestimmt die Stärke von den chromatischen Abweichungen - Définie l'intensité de l'aberration chromatique - 色収差の強さを変更します - 페르피틴의 색수차의 강도를 변경합니다. - Cambia l'intensità dell'aberrazione cromatica - Altera a intensidade da Aberração Cromática - Zmienia siłę efektu - Cambia la intensidad de la aberración cromatica - Mění sílu chromatické aberace - Muuttaa kromaattisen aberraation voimakkuutta - Изменяет силу хроматической аберрации + Benodigd trainingsniveau voor heroriëntatie Enable Weapon Sway Aktiviere Waffen Schwanken Activer l'oscillation de l'arme - 武器の揺れを有効にする + 武器の揺れを有効化 무기 흔들림 사용(페르피틴) Abilita l'oscillazione dell'arma Ativar balanço da arma @@ -1273,12 +1308,13 @@ Povolit Houpání Zbraně Ota aseen heiluminen käyttöön Включить раскачивание оружия + Schakel wapenbeweging in Enables if pervitin should influance your weapon sway Aktiviert, ob Pervitin das Schwanken deiner Waffen beeinflussen soll Définie si la pervitine influance l'oscillation de l'arme - ペルビチンが武器の揺れに影響を与えるかどうかを有効にします + ペルビチンが武器の揺れに影響を与える機能を有効にします 페르피틴이 무기의 흔들림에 영향을 미치는지의 여부를 활성화합니다. Attiva se il pervitin debba influenzare l'oscillazione dell'arma Ativa se o Pervitin influenciar o balanço da sua arma @@ -1287,6 +1323,7 @@ Povoluje, zda pervitin ovlivní Vaše houpání zbraně Mahdollistaa pervitiinin vaikutuksen aseen heilumiseen. Включается, если Первитин должен повлиять на раскачивание вашего оружия + Bepaald of pervitin invloed heeft op wapenbewegingen Pervitin Speed Boost @@ -1301,6 +1338,7 @@ Boost velocità Pervitin Pervitiini nopeuden lisääminen Повышение скорости Первитином + Pervitin snelheidsboost The animation speed that gets set in Stage 1 of Pervitin. (1 = normal, 2 = twice) @@ -1315,118 +1353,7 @@ La velocità di animazione impostata nella Fase 1 di Pervitin. (1 = normale, 2 = due volte) Animaationopeus, joka asetetaan pervitiinin vaiheessa 1. (1 = normaali, 2 = kahdesti) Скорость анимации, которая устанавливается на этапе 1 Первитина. (1 = обычная, 2 = двойная) - - - Enable Chromatic Aberration - Aktiviere chromatische Abweichungen - Activer l'aberration chromatique - 色収差を有効にする - 색수차 활성화(케타민) - Attiva aberrazione cromatica - Ativar Aberração Cromática - Włącz Aberrację Chromatyczną - Habilita aberracion cromatica - Povolit Chromatickou Aberaci - Ota kromaattinen aberraatio käyttöön - Включить хроматическую аберрацию - - - Enables if ketamine should influance your vision with chromatic aberration - Aktiviert, ob Ketamin deine Sicht, mit chromatischen Abweichungen beeinflussen soll - Définie si la kétamine devrait influancer la vision avec une aberration chromatique - ケタミン服用時に色収差で視覚に影響を与えるかどうかを有効にします - 케타민이 색수차로 시력에 영향을 미치는 지의 여부를 활성화합니다. - Attiva se la ketamina debba influenzare la tua visuale con l'aberrazione cromatica - Ativa se a Cetamina deve influenciar sua visão com Aberração Cromática - Włącza efekt wizualny po zażyciu ketaminy - Habilita si la ketamina influye tu vision con aberracion cromatica - Povoluje, zda ketamin ovlivní Vaše vidění chromatickou aberací - Mahdollistaa, jos ketamiini vaikuttaa näköisi kromaattisen poikkeaman vuoksi - Включает, если Кетамин должен влиять на ваше зрение с помощью хроматической аберрации - - - Chromatic Aberration Strength - Chromatische Abweichung-Stärke - Intensité de l'aberration chromatique - 色収差強度 - 색수차 강도(케타민) - Intensità dell'aberrazione cromatica - Intensidade de Aberração Cromática - Siła Aberracji Chromatycznej - Intensidad de la aberracion cromatica - Síla Chromatické Aberace - Kromaattisen aberraation vahvuus - Сила хроматической аберрации - - - Changes the strength of the chromatic aberration - Bestimmt die Stärke von den chromatischen Abweichungen - Définie l'intensité de l'aberration chromatique - 色収差の強さを変更します - 케타민의 색수차의 강도를 변경합니다. - Cambia l'intensità dell'aberrazione cromatica - Altera a intensidade da Aberração Cromática - Zmienia siłę efektu - Cambia la intensidad de la aberracion cromatica - Mění sílu chromatické aberace - Muuttaa kromaattisen aberraation voimakkuutta - Изменяет силу хроматической аберрации - - - Enable Chromatic Aberration - Aktiviere chromatische Abweichungen - Activer l'aberration chromatique - 色収差を有効にする - 색수차 활성화(펜타닐) - Attiva aberrazione cromatica - Ativar Aberração Cromática - Włącz Aberrację Chromatyczną - Habilita la aberracion cromatica - Povolit Chromatickou Aberaci - Ota kromaattinen aberraatio käyttöön - Включить хроматическую аберрацию - - - Enables if fentanyl should influance your vision with chromatic aberration - Aktiviert, ob Fentanyl deine Sicht mit chromatischen Abweichungen beeinflussen soll - Définie si le fentanyl devrait influancer la vision avec une aberration chromatique - フェンタニル服用時に色収差で視覚に影響を与えるかどうかを有効にします - 펜타닐이 색수차로 시력에 영향을 미치는지의 여부를 활성화합니다. - Attiva se il fentanil debba influenzare la tua visuale con l'aberrazione cromatica - Ativa se o Fentanil deve influenciar sua visão com Aberração Cromática - Włącza efekt wizualny po zażyciu fentanylu - Habilita si el fentanilo influye tu vision con aberracion cromatica - Povoluje, zda fentanyl ovlivní Vaše vidění chromatickou aberací - Mahdollistaa, jos fentanyyli vaikuttaa näköön kromaattisen poikkeaman vuoksi - Включает, если Фентанил должен повлиять на ваше зрение с помощью хроматической аберрации - - - Chromatic Aberration Strength - Chromatische Abweichung-Stärke - Intensité de l'aberration chromatique - 色収差強度 - 색수차 강도(펜타닐) - Attiva aberrazione cromatica - Intensidade de Aberração Cromática - Siła Aberracji Chromatycznej - Intensidad de la aberracion cromatica - Síla Chromatické Aberace - Kromaattisen aberraation vahvuus - Сила хроматической аберрации - - - Changes the strength of the chromatic aberration - Bestimmt die Stärke von den chromatischen Abweichungen - Définie l'intensité de l'aberration chromatique - 色収差の強さを変更します - 펜타닐의 색수차의 강도를 변경합니다. - Cambia l'intensità dell'aberrazione cromatica - Altera a intensidade da Aberração Cromática - Zmienia siłę efektu - Cambia la intensidad de la aberracion cromatica - Mění sílu chromatické aberace - Muuttaa kromaattisen aberraation voimakkuutta - Изменяет силу хроматической аберрации + Animatiesnelheid van fase 1 van pervitin. (1 = normaal, 2 = dubbel) Treatment time for reorientation @@ -1442,6 +1369,7 @@ Tempo de tratamento para reorientação Hoitoaika uudelleensuuntautumiseen Время обработки для переориентации + Behandelingstijd voor heroriëntatie Etomidate @@ -1457,6 +1385,7 @@ Etomidato Etomidaatti Этомидат + Etomidaat General Anesthetic @@ -1472,6 +1401,7 @@ Anestésico Geral Yleinen anestesia Общий анестетик + Algemeen anestheticum Used as a general anesthetic for surgical procedures @@ -1487,6 +1417,7 @@ Usado como um anestésico geral para procedimentos cirúrgicos Käytetään yleisanestesiana kirurgisissa toimenpiteissä Используется в качестве общего анестетика при хирургических процедурах + Wordt gebruikt als algemeen anestheticum voor chirurgische procedures Push Etomidate @@ -1502,6 +1433,7 @@ Injetar Etomidato Työnnä etomidaattia Ввести Этомидат + Injecteer Etomidaat Lorazepam @@ -1517,6 +1449,7 @@ Lorazepam Loratsepaami Лоразепам + Lorazepam Sedtation medication @@ -1532,6 +1465,7 @@ Medicamento sedativo Rauhoittava lääkitys Седативное средство + Sedatiemiddel Used to sedate patients and prepare them for surgery @@ -1547,6 +1481,7 @@ Usado para sedar pacientes e prepará-los para a cirurgia Käytetään potilaiden rauhoittamiseen ja valmistelemiseen leikkausta varten Используется для успокоения пациентов и подготовки их к операции + Wordt gebruikt om patiënten te sederen en ze voor te bereiden voor een operatie Push Lorazepam @@ -1562,6 +1497,7 @@ Injetar Lorazepam Paina loratsepaamia Ввести Лоразепам + Injecteer Lorazepam Flumazenil @@ -1577,6 +1513,7 @@ Flumazenil Flumatseniili Флумазенил + Flumazenil Counter to Lorazepam @@ -1592,6 +1529,7 @@ Antídoto para Lorazepam Loratsepaamin vastainen Противодействие к Лоразепаму + Antagonist van Lorazepam Used to bring patients out of sedation @@ -1607,6 +1545,7 @@ Usado para tirar os pacientes da sedação Käytetään potilaiden poistamiseen sedaatiosta Используется для выведения пациентов из состояния комы + Wordt gebruikt om patiënten uit sedatie te halen Push Flumazenil @@ -1622,6 +1561,7 @@ Injetar Flumazenil Paina flumatseniiliä Ввести Флумазенил + Injecteer Flumazenil Push Ketamine @@ -1637,6 +1577,7 @@ Injetar Cetamina Paina ketamiinia Ввести Кетамин + Injecteer Ketamine Ketamine @@ -1652,11 +1593,14 @@ Cetamina Ketamiini Кетамин + Ketamine Dissociative anesthetics, used to suppress severe pain 解離性麻酔薬、 重度の痛みを抑えるのに使用される Anestésico disociativo, utilizado para suprimir el dolor severo + Dissociatieve anestheticum, wordt gebruikt om ernstige pijn te onderdrukken + Anesthésiques dissociatifs, utilisés pour supprimer les douleurs sévères Push Fentanyl @@ -1672,6 +1616,7 @@ Injetar Fentanil Työnnä fentanyyliä Ввести Фентанил + Injecteer Fentanyl Fentanyl @@ -1687,12 +1632,15 @@ Fentanil fentanyyli Фентанил + Fentanyl Opioid analgesic, used to suppress severe pain Opioidowy środek przeciwbólowy, stosowany do tłumienia silnego bólu オピオイド鎮痛薬、 重度の痛みを抑えるのに使用される Analgésico opioide, utilizado para suprimir el dolor severo + Opïode analgeticum, wordt gebruikt om ernstige pijn te onderdrukken + Analgésique opioïde, utilisé pour supprimer les douleurs sévères Push Nalbuphine @@ -1708,6 +1656,7 @@ Injetar Nalbufina Paina nalbufiinia Ввести Налбуфин + Injecteer Nalbufine Nalbuphine @@ -1723,12 +1672,15 @@ Nalbufina Nalbufiini Налбуфин + Nalbufine Opioid analgesic, used to suppress moderate pain Opioidowy środek przeciwbólowy, stosowany do tłumienia umiarkowanego bólu オピオイド鎮痛薬、 中程度の痛みを抑えるのに使用される Analgésico opioide, utilizado para suprimir el dolor moderador + Opïode analgeticum, wordt gebruikt om matige pijn te onderdrukken + Analgésique opioïde, utilisé pour supprimer les douleurs modérées Maximum Reorientation Success Chance @@ -1744,6 +1696,7 @@ Chance de reorientação bem-sucedida Suurin mahdollisuus uudelleenorientoitumiseen Максимальный шанс на успех переориентации + Maximale heroriëntatie succeskans Maximum Carbonate Success Chance @@ -1759,6 +1712,7 @@ Possibilidade de uso bem-sucedido de Carbonato Suurin karbonaatin onnistumismahdollisuus Максимальный шанс успеха Карбоната + Maximale succeskans van carbonaat Allow using Carbonate @@ -1774,6 +1728,7 @@ Permitir o uso de Carbonato Salli karbonaatin käyttö Разрешить использование Карбоната + Sta gebruik van carbonaat toe Treatment time for Carbonate @@ -1789,6 +1744,7 @@ Tempo de uso de Carbonato Karbonaatin käsittelyaika Время обработки Карбонатом + Behandeltijd van carbonaat Medical level required for Naloxone @@ -1804,6 +1760,7 @@ Nível médico exigido para administrar Naloxona Naloksonille vaaditaan lääketieteen koulutustaso Медицинский уровень, необходимый для использования Налоксона + Medisch niveau benodigd voor gebruik van Naloxone Treatment time for Naloxone @@ -1819,6 +1776,7 @@ Tempo de uso de Naloxona Naloksonin hoitoaika Время обработки Налоксоном + Behandeltijd van Naloxone Treatment time for Pervitin @@ -1833,6 +1791,7 @@ Doba podání Pervitinu Pervitiinin hoitoaika Время лечения Первитином + Behandeltijd van Pervitin Medical level required for Pervitin @@ -1847,6 +1806,7 @@ Zdravotnická úroveň potřebná k použití Pervitinu Pervitiini vaatii lääketieteellisen koulutustason Медицинский уровень, необходимый для использования Первитина + Medisch niveau benodigd voor het gebruik van Pervitin Medical level required for TXA @@ -1862,6 +1822,7 @@ Nível médico exigido para administrar TXA Lääketieteellinen koulutustaso vaaditaan TXA:n käyttöön Медицинский уровень, необходимый для TXA + Medisch niveau benodigd voor het gebruik van TXA Treatment time for TXA @@ -1877,6 +1838,7 @@ Tempo de uso de TXA TXA:n hoitoaika Время обработки для TXA + Behandeltijd van TXA Medical level required for Norepinephrine @@ -1892,6 +1854,7 @@ Nível médico exigido para uso de Norepinefrina Norepinefriinin käytön edellyttämä lääketieteellinen taso Медицинский уровень, необходимый для использования Норадреналина + Medisch niveau benodigd voor het gebruik van Noradrenaline Treatment time for Norepinephrine @@ -1907,6 +1870,7 @@ Tempo de uso de Norepinefrina Hoitoaika norepinefriinille Время обработки Норадреналином + Behandeltijd van Noradrenaline Medical level required for Phenylephrine @@ -1922,6 +1886,7 @@ Nível médico exigido para uso de Fenilefrina Lääketieteellinen taso vaaditaan fenyyliefriinille Медицинский уровень, необходимый для использования Фенилэфрина + Medisch niveau benodigd voor het gebruik van Fenylefrine Treatment time for Phenylephrine @@ -1937,6 +1902,7 @@ Tempo de uso de Fenilefrina Käsittelyaika fenyylille Время обработки Фенилэфрином + Behandeltijd van Fenylefrine Medical level required for Nitroglycerin @@ -1952,6 +1918,7 @@ Nível médico exigido para uso de Nitroglicerina Nitroglyseriinille vaadittu lääketieteellinen koulutustaso Медицинский уровень, необходимый для использования Нитроглицерина + Medisch niveau benodigd voor het gebruik van Nitroglycerine Treatment time for Nitroglycerin @@ -1967,6 +1934,7 @@ Tempo de uso de Nitroglicerina Nitroglyseriinin hoitoaika Время обработки Нитроглицерином + Behandeltijd van Nitroglycerine Medical level required for Amiodarone @@ -1982,6 +1950,7 @@ Nível médico exigido para uso de Amiodarona Amiodaronille vaadittu lääketieteellinen koulutustaso Медицинский уровень, необходимый для использования Амиодарона + Medisch niveau benodigd voor het gebruik van Amiodaron Treatment time for Amiodarone @@ -1997,6 +1966,7 @@ Tempo de uso de Amiodarona Amiodaronin hoitoaika Время обработки Амиодароном + Behandeltijd van Amiodaron Medical level required for Lidocaine @@ -2012,6 +1982,7 @@ Nível médico exigido para uso de Lidocaína Lääketieteellinen koulutustaso vaaditaan lidokaiinin käyttöön Медицинский уровень, необходимый для применения Лидокаина + Medisch niveau benodigd voor het gebruik van Lidocaïne Treatment time for Lidocaine @@ -2027,6 +1998,7 @@ Tempo de uso de Lidocaína Lidokaiinin hoitoaika Время обработки Лидокаином + Behandeltijd van Lidocaïne Medical level required for Atropine @@ -2042,6 +2014,7 @@ Nível médico exigido para uso de Atropina Atropiinia varten vaadittava lääketieteellinen koulutustaso Медицинский уровень, необходимый для использования Атропина + Medisch niveau benodigd voor het gebruik van Atropine Treatment time for Atropine @@ -2057,6 +2030,7 @@ Tempo de uso de Atropina Atropiinin hoitoaika Время обратки Атропином + Behandeltijd van Atropine Medical level required for EACA @@ -2072,6 +2046,7 @@ Nível médico exigido para uso de EACA Lääketieteellinen koulutustaso vaaditaan EACA:lle Медицинский уровень, необходимый для EACA + Medisch niveau benodigd voor het gebruik van EACA Treatment time for EACA @@ -2087,6 +2062,7 @@ Tempo de uso de EACA Hoitoaika EACA:lle Время обработки для EACA + Behandeltijd van EACA Medical level required for Flumazenil @@ -2102,6 +2078,7 @@ Nível médico exigido para uso de Flumazenil Flumatseniilin edellyttämä lääketieteellinen koulutustaso Медицинский уровень, необходимый для использования Флумазенила + Medisch niveau benodigd voor het gebruik van Flumazenil Treatment time for Flumazenil @@ -2117,6 +2094,7 @@ Tempo de uso de Flumazenil Flumatseniilin hoitoaika Время обработки Флумазенилом + Behandeltijd van Flumazenil Medical level required for Lorazepam @@ -2132,6 +2110,7 @@ Nível médico exigido para uso de Lorazepam Lääketieteellinen koulutustaso vaaditaan loratsepaamia varten Медицинский уровень, необходимый для применения Лоразепама + Medisch niveau benodigd voor het gebruik van Lorazepam Treatment time for Lorazepam @@ -2147,6 +2126,7 @@ Tempo de uso de Lorazepam Loratsepaamin hoitoaika Время обработки Лоразепамом + Behandeltijd van Lorazepam Medical level required for Etomidate @@ -2162,6 +2142,7 @@ Nível médico exigido para uso de Etomidato Etomidaatille vaadittava lääketieteellisen hoidon taso Медицинский уровень, необходимый для применения Этомидата + Medisch niveau benodigd voor het gebruik van Etomidaat Treatment time for Etomidate @@ -2177,6 +2158,7 @@ Tempo de uso de Etomidato Etomidatin hoitoaika Время обработки Этомидатом + Behandeltijd van Etomidaat Medical level required for Ketamine @@ -2192,6 +2174,7 @@ Nível médico exigido para uso de Cetamina Lääketieteellinen koulutustaso vaaditaan ketamiinille Медицинский уровень, необходимый для использования Кетамина + Medisch niveau benodigd voor het gebruik van Ketamine Treatment time for Ketamine @@ -2207,6 +2190,7 @@ Tempo de uso de Cetamina Ketamiinin hoitoaika Время обработки Кетамином + Behandeltijd van Ketamine Medical level required for Fentanyl @@ -2222,6 +2206,7 @@ Nível médico exigido para uso de Fentanil Fentanyylille vaadittu lääketieteellinen koulutustaso Медицинский уровень, необходимый для использования Фентанила + Medisch niveau benodigd voor het gebruik van Fentanyl Treatment time for Fentanyl @@ -2237,6 +2222,7 @@ Tempo de uso de Fentanil Fentanyylin hoitoaika Время обработки Фентанилом + Behandeltijd van Fentanyl Medical level required for Nalbuphine @@ -2252,6 +2238,7 @@ Nível médico exigido para uso de Nalbufina Lääketieteellinen koulutustaso vaaditaan nalbufiinille Медицинский уровень, необходимый для использования Налбуфина + Medisch niveau benodigd voor het gebruik van Nalbufine Treatment time for Nalbuphine @@ -2267,6 +2254,7 @@ Tempo de uso de Nalbufina Nalbufiinin hoitoaika Время обработки Налбуфином + Behandeltijd van Nalbufine Medical level required for Penthrox Inhaler @@ -2278,6 +2266,7 @@ Nivel médico requerido para el Penthrox Lääketieteellinen koulutustaso vaatii penthrox-inhalaattorin Медицинский уровень, необходимый для использования ингалятора Пентрокс + Medisch niveau benodigd voor het gebruik van Penthrox inhalators Treatment time for Penthrox Inhaler @@ -2289,6 +2278,7 @@ Tiempo de tratamiento para el Penthrox Penthrox-inhalaattorin hoitoaika Время обработки ингалятором Пентрокс + Behandeltijd van Penthrox inhalators Basic Settings @@ -2304,6 +2294,7 @@ Configurações básicas Perus asetukset Основные настройки + Basis instellingen IV Settings @@ -2319,6 +2310,7 @@ Configurações de IV IV asetukset Настройки IV + IV instellingen IO Settings @@ -2334,6 +2326,7 @@ Configurações de IO IO-asetukset Настройки IO + IO instellingen Reorientation Settings @@ -2349,6 +2342,7 @@ Configurações de reorientação Uudelleensuuntausasetukset Настройки переориентации + Heroriëntatie instellingen Carbonate Settings @@ -2364,6 +2358,7 @@ Configurações de Carbonato Karbonaattiasetukset Настройки Карбоната + Carbonaat instellingen Naloxone Settings @@ -2379,6 +2374,7 @@ Configurações de Naloxona Naloksonin asetukset Настройки Налоксона + Naloxone instellingen Pervitin Settings @@ -2393,6 +2389,7 @@ Nastavení Pervitinu Pervitiinin asetukset Настройки Перфитина + Pervitin instellingen Caffeine Settings @@ -2407,6 +2404,7 @@ Nastavení Kofeinu Kofeiiniasetukset Настройки Кофеина + Caffeïne instellingen TXA Settings @@ -2422,6 +2420,7 @@ Configurações de TXA TXA-asetukset Настройки TXA + TXA instellingen Norepinephrine Settings @@ -2437,6 +2436,7 @@ Configurações de Norepinefrina Norepinefriinin asetukset Настройки Нореадреналин + Noradrenaline instellingen Phenylephrine Settings @@ -2452,6 +2452,7 @@ Configurações de Fenilefrina Fenyyliefriinin asetukset Настройки Фенилэфрина + Fenylefrine instellingen Nitroglycerin Settings @@ -2467,6 +2468,7 @@ Configurações de Nitroglicerina Nitroglyseriiniasetukset Настройки Нитроглицерина + Nitroglycerine instellingen Amiodarone Settings @@ -2482,6 +2484,7 @@ Configurações de Amiodarona Amiodaronin asetukset Настройки Амиодарона + Amiodaron instellingen Lidocaine Settings @@ -2497,6 +2500,7 @@ Configurações de Lidocaína Lidokaiiniasetukset Настройки Лидокаина + Lidocaïne instellingen Atropine Settings @@ -2512,6 +2516,7 @@ Configurações de Atropina Atropiiniasetukset Настройки Атропина + Atropine instellingen EACA Settings @@ -2527,6 +2532,7 @@ Configurações de EACA EACA-asetukset Настройки EACA + EACA instellingen Ketamine Settings @@ -2542,6 +2548,7 @@ Configurações de Cetamina Ketamiinin asetukset Настройки Кетамина + Ketamine instellingen Fentanyl Settings @@ -2557,6 +2564,7 @@ Configurações de Fentanil Fentanyyliasetukset Настройки Фентанила + Fentanyl instellingen Nalbuphine Settings @@ -2572,6 +2580,7 @@ Configurações de Nalbufina Nalbuphine-asetukset Настройки Налбуфина + Nalbufine instellingen Flumazenil Settings @@ -2587,6 +2596,7 @@ Configurações de Flumazenil Flumazenilin asetukset Настройки Флумазенила + Flumazenil instellingen Lorazepam Settings @@ -2602,6 +2612,7 @@ Configurações de Lorazepam Loratsepamin asetukset Настройки Лоразепама + Lorazepam instellingen Etomidate Settings @@ -2617,6 +2628,7 @@ Configurações de Etomidato Etomidatin asetukset Настройки Этомидата + Etomidaat instellingen Penthrox Inhaler Settings @@ -2628,6 +2640,7 @@ Configuracion del inhalador Penthrox Penthrox-inhalaattorin asetukset Настройки ингалятора Пентрокс + Penthrox inhalator instellingen %1 performed a saline flush @@ -2639,6 +2652,7 @@ %1 realizó un enjuague con salino %1 suoritti suolaliuoksen huuhtelun %1 провел промывание физиологическим раствором + %1 voerde een salinespoeling uit Patient's IV is blocked @@ -2654,6 +2668,7 @@ IV do paciente está bloqueado Potilaan IV on tukossa Капельница пациента заблокирована + Patiënt's IV is geblokkeerd Patient's IV is clear @@ -2669,6 +2684,7 @@ IV do paciente está funcionando corretamente Potilaan IV on selvä Капельница пациента чиста + Patiënt's IV is niet geblokkeerd Kidney damage/failure @@ -2684,6 +2700,7 @@ Dano/insuficiência renal Munuaisvaurio/munuaisten vajaatoiminta Повреждение/недостаточность почек + Nierschade/-falen Enables kidney damage caused by overuse of saline @@ -2699,6 +2716,7 @@ Permite dano renal causado pelo uso excessivo de solução salina Mahdollistaa suolaliuoksen liiallisen käytön aiheuttaman munuaisvaurion Предотвращает повреждение почек, вызванное чрезмерным употреблением физиологического раствора + Schakelt nierschade veroorzaakt door overgebruik van saline in IV Block Chance @@ -2714,6 +2732,7 @@ Chance de Bloqueio IV Mahdollisuus estää IV:t Шанс закупорить капельницу + IV blokkade kans Chance of IV blockage due to medication pushes without saline flush @@ -2729,6 +2748,7 @@ Probabilidade de bloqueio intravenoso devido a injeções de medicamentos sem solução salina IV-tukoksen mahdollisuus lääkityksen painamisesta ilman suolaliuosta Вероятность закупорки капельницы из-за введения лекарств без промывания физиологическим раствором + Kans voor blokkade van IV's door medicaties zonder salinespoeling Maximum Fluid Bag Stack @@ -2744,6 +2764,7 @@ Pilha Máxima de Sacos de Fluidos Suurin nestepussipino Максимальный объем пакета с жидкостью + Maximale vloeistofzak stapel The maximum amount of fluid bags that can be stacked to increase IV flow rate @@ -2759,10 +2780,11 @@ A quantidade máxima de bolsas de fluido que podem ser empilhadas para aumentar a taxa de fluxo IV Suurin määrä nestepusseja, jotka voidaan pinota IV-virtausnopeuden lisäämiseksi Максимальное количество пакетов с жидкостью, которое можно сложить в стопку для увеличения скорости внутривенного вливания + De maximale hoeveelheid vloeistofzakken die gestapeld kunnen worden om de IV vloeisnelheid te verhogen Enable Coagulation - 血液凝固を有効にする + 血液凝固を有効化 Abilita sistema di coagulazione Włącz krzepnięcie Povolit Koagulaci @@ -2773,6 +2795,7 @@ Habilitar coagulación Ota koagulaatio käyttöön Включить Коагуляцию + Schakel coagulatie in Enables advanced coagulation features and modifies TXA and EACA behaviour accordingly. @@ -2787,6 +2810,7 @@ Habilita la coagulación avanzada, modificando los efectos del ATX y del EACA. Ottaa käyttöön edistyneet koagulaatioominaisuudet ja muuttaa TXA- ja EACA-käyttäytymistä vastaavasti Включает расширенные функции коагуляции и соответствующим образом изменяет поведение TXA и EACA. + Schakelt geadvanceerde coagulatie functies in, en veranderd het gedrag van TXA en EACA naar behoren EACA @@ -2802,6 +2826,7 @@ EACA EACA EACA + EACA Push EACA @@ -2817,6 +2842,7 @@ Injetar EACA Paina EACA Ввести EACA + Injecteer EACA Pervitin capsule @@ -2831,15 +2857,19 @@ Pervitinová kapsle Pervitiini kapseli Капсула Первитина + Pervitin capsule Performance enhancing drug, used to suppress moderate pain 疲労の防止と回復に! 疲労をポンと取ってくれます。 中程度の鎮痛作用がある。 Środek zwiększający wydolność, stosowany do tłumienia umiarkowanego bólu Fármaco para mejorar el rendimiento, utilizado para suprimir el dolor moderado + Prestatieverhogend medicijn, wordt gebruikt om matige pijn te onderdrukken + Drogue améliorant les performances, utilisée pour supprimer les douleurs modérées Take Pervitin + 使用 柏飞丁 Pervitin einnehmen Prendre la pervitine ペルビチンを服用する @@ -2851,6 +2881,7 @@ Vzít si Pervitin Ota pervitiini Принять Первитин + Neem Pervitin The pervitin makes you feel awake and full of endless POWER @@ -2865,6 +2896,7 @@ Díky pervitinu se cítíš bdělý a plný nekonečné SÍLY Pervitiini saa sinut tuntemaan olosi hereille ja täynnä loputonta VOIMAA Первитин заставляет вас чувствовать себя бодрым и полным бесконечной СИЛЫ + De Pervitin geeft je een wakker gevoel vol met oneinde ENERGIE You begin to lose your breath... @@ -2879,6 +2911,7 @@ Ztrácíš dech... Alkaa menettää hengitystä... У тебя начинает перехватывать дыхание... + Je begint je adem te verliezen... You gain a sudden rush! @@ -2893,6 +2926,7 @@ Dostal jsi se do rauše! Saat äkillisen kiireen! Ты получаешь внезапный прилив сил! + Je krijgt een spontane boost! You gain another rush! @@ -2907,6 +2941,7 @@ Dostal jsi se do dalšího rauše! Saat uuden kiireen! Ты получаешь еще один прилив сил! + Je krijgt nog een boost! The exhaustion starts to settle in... @@ -2921,6 +2956,7 @@ Začíná se projevovat vyčerpání... Väsymys alkaa laskeutua... Усталость начинает наваливаться на меня... + Je begint in te zakken You start to feel normal again @@ -2935,6 +2971,7 @@ Opět se začínáš cítit normálně Alkaa taas tuntua normaalilta Ты снова начинаешь чувствовать себя нормально + Je begint je weer normaal te voelen You start to see everything twice. @@ -2949,6 +2986,7 @@ Začínáš vše vidět dvojitě Alat nähdä kaiken kahdesti. Ты начинаешь видеть все дважды. + Je begint met alles dubbelzien You start to twitch... @@ -2963,6 +3001,7 @@ Začínáš sebou škubat... Alkaa nykimään Ты начинаешь дергаться... + Je begint te trillen Your head starts to clear up and you stop twitching... @@ -2977,6 +3016,7 @@ Začíná se ti vyjasňovat a přestáváš sebou škubat... Pääsi alkaa selkiytyä ja lopetat nykimisen Твоя голова начинает проясняться, и ты перестаешь дергаться... + Je hoofd begint zich op te helderen, en je stopt met trillen Caffeine bottle @@ -2991,15 +3031,19 @@ Kofeinová lahev Kofeiinipullo Бутылка с Кофеином + Caffeïne doosje Stimulates the central nervous system and energizes 中枢神経を刺激し、活力を与える Stymuluje centralny układ nerwowy i dodaje energii Estimula el sistema nervioso central y aporta energía. + Stimuleert het centraal zenuwstelsel en geeft energie + Stimule le système nerveux central et revitalise Take Caffeine + 服用 咖啡因 Koffein einnehmen Prendre la caféine カフェインを服用する @@ -3011,6 +3055,7 @@ Dát si Kofein Ota kofeiinia Выпить Кофеин + Neem Caffeïne Encourages clot formation @@ -3026,6 +3071,7 @@ Intensifica a coagulação Edistää hyytymien muodostumista Способствует образованию тромбов + Bevorderd bloedstolling Inspect Catheter @@ -3041,6 +3087,7 @@ Inspecionar cateter Tarkista katetri Осмотрите катетер + Inspecteer canule Saline Flush @@ -3056,6 +3103,7 @@ Lavagem salina suolainen flunssa Промывание физиологическим раствором + Salinespoeling IV Check limb damage @@ -3071,6 +3119,7 @@ Verificação dos danos ao membro para o IV IV tarkista raajan vauriot Проверьте повреждение IV + IV checkt voor ledemaatschade Whether or not you can apply the IV to the too damaged limb. In default, this is disabled. @@ -3086,6 +3135,7 @@ Se você pode ou não aplicar o IV ao membro muito danificado. Por padrão, isto é desativado. Voitko laittaa IV vaurioituneeseen raajaan vai et. Tämä on oletuksena pois käytöstä. Независимо от того, можете ли вы применить капельницу. По умолчанию это отключено. + Of je wel of niet een IV kan plaatsen op een te beschadigd ledemaat. standaard staat dit uit. Perform Dialysis @@ -3100,6 +3150,7 @@ Efectuar dialisis Suorita dialyysi Провести Диализ + Voer dialyse uit Performing @@ -3114,6 +3165,7 @@ Efectuando esiintymässä Провожу + Wordt uitgevoerd %1 performed dialysis @@ -3129,6 +3181,7 @@ %1 realizou diálise %1 suoritettu dialyysi %1 провел диализ + %1 heeft een dialyse uitgevoerd [KAM] Medicines crate @@ -3143,6 +3196,7 @@ [KAM] Caja de medicina [KAM] Lääkelaatikko [КАМ] Ящик с лекарствами + [KAM] Medijnenkrat Medication Modifies Stamina @@ -3154,6 +3208,7 @@ Medicación modifica la resistencia Lääkitys muuttaa kestävyyttä Лекарства изменяют выносливость + Medicatie heeft invloed op uithoudingsvermogen Allow certain medications to modify (vanilla/advanced fatigue) stamina as a side effect @@ -3165,6 +3220,7 @@ Permitir que ciertos medicamentos modifiquen la resistencia (fatiga convencional/avanzada) como efecto secundario Salli tiettyjen lääkkeiden muuttaa kestävyyttä (vanilja/edistynyt väsymys) sivuvaikutuksena Позволяют определенным лекарствам изменять выносливость (ваниль/повышенная утомляемость) в качестве побочного эффекта + Bepaald of sommige medicijnen het uithoudingsvermogen (vanilla/geadvanceerde uitputting) beïnvloeden als een bijwerking EACA Clears Trauma @@ -3173,6 +3229,7 @@ EACAによる外傷の除去 L'EACA soigne les traumatismes EACA Remove Traumas + EACA verwijderd trauma Allows Trauma to be cleared by EACA in addition to stitching @@ -3181,224 +3238,311 @@ EACAによる効果として縫合に加え、外傷の除去を可能にします。 Autorise le soin complet des traumatismes par l'EACA en plus de la suture Permite que o EACA remova traumas além de suturar + Staat toe dat EACA trauma verwijderd, als additie van hechten Allow Stacking 重複の許可 Permitir acumulación + Sta stapelen toe + Autoriser l'empilage If enabled TXA will be stackable and double it's efficiency - 有効にすると、TXAの重複が可能になり、効率が2倍になる。 + 有効にすると、TXAの重複が可能になり、効率が2倍になります。 Si el ATX esta permitido, se podrá acumular y duplicará su eficiencia + Wanneer ingeschakeld: sta het stapelen van TXA toe, wat de effectiviteit verdubbeld) + Si activé, le TXA sera empilable et doublera son efficacité Keep Bandaging Until Out Of System 体内に効果が無くなるまで"包帯"を適用する Mantiene el Vendaje hasta que desaparezca del organismo + Blijf verbinden tot uit het systeem + Continuer à bander jusqu'à ce que le produit soit éliminé du système If enabled TXA will keep bandaging until it's out of your system\nIf disabled TXA will stop working after bandaging the last wound it can find 有効にすると、TXAが体内から無くなるまで傷口に"包帯"を巻きます。 \n無効にすると、TXAが判定済の最後の創傷に"包帯"を適用した後に、その作用を終了します。 Si el ATX esta permitido, seguirá vendando hasta que desaparezca del organismo\nSi el ATX no esta permitido, dejará de funcionar después de vendar la última herida que pueda encontrar + Wanneer ingeschakeld: TXA blijft verbinden tot het uit jouw systeem is.\nWanneer uitgeschakeld: TXA Stopt met werken wanneer alle wonden gedicht zijn. + Si activé, le TXA continuera à bander jusqu'à ce qu'il soit éliminé du système.\nSi désactivé, le TXA cessera de fonctionner après avoir bandé la dernière plaie qu'il peut trouver. TXA Cycle Time TXAサイクル時間 Ciclo de tiempo del ATX + TXA cyclustijd + Temps de cycle du TXA The time it takes for TXA to close a wound TXAが創傷を塞ぐのに掛かる時間 El tiempo que tarda el ATX en cerrar una herida + Hoe lang het duurt voordat TXA een wond dicht + Temps requis pour permettre au TXA de refermer une blessure Coagulation Settings 凝固設定 Configuración de la coagulación Configurações de coagulação + Coagulatie instellingen + Paramètres de coagulation Require Heart Rate 心拍を要求する Requiere Ritmo Cardiaco + Vereist hartslag + Fréquence cardiaque requise Should coagulation require a heart rate above 20BPM? (Doing CPR will keep HR above 20BPM) 凝固が作用するのに20BPM以上の心拍数を必要とさせます (CPRを行うことで心拍数は20BPM以上を保つことが出来ます) La coagulación requerirá de un ritmo cardiaco superior a 20 PPM (Hacer RCP mantendrá el RC por encima de 20 PPM) + Is een hartslag van meer dan 20SPM benodigt voor coagulatie? (Het uitvoeren van CPR houdt de hartslag boven 20SPM) + La coagulation nécessite-elle un fréquence cardiaque supérieure à 20 BPM ? (Effectuer la RCP gardera le FC au dessus de 20 BPM) Required Blood Volume 血液量を要求する Volumen de sangre requerido + Benodigd bloedvolume + Volume sanguin requis Minimum volume of blood required for coagulation to work 凝固の作用に最低限必要な血液の量 Volumen de sangre necesario para que la coagulación funcione + Het minimale bloedvolume dat vereist is voor coagulatie om te werken + Volume de sang minimal requis pour permettre à la coagulation de fonctionner Coagulation Factors 凝固因子 Factores de Coagulación + Stollingsfactoren + Facteurs de coagulation The amount of coagulation factors that get set on unit spawn & be kept as limit for factor regeneration ユニットのスポーン時に定義される凝固因子の量と、因子の再生限界値 La cantidad de factores de coagulación que se establecen al spawnear y se mantienen como límite para la regeneración de factores + De hoeveelheid stollingsfactoren dat een eenheid krijgt op spawn en als limiet wordt gebruik voor hergeneratie + La quantité de facteurs de coagulation définie lors de l’apparition de l'unité et conservée comme limite pour la régénération des facteurs. Clotting Cycle Time 凝血サイクル時間 Duración del ciclo de coagulación + Stollingscyclustijd + Temps de cycle de coagulation The time between each wound clotting cycle that start wound clotting. (low number may cause lag) 創傷の凝血を開始する各凝血サイクル間の時間の長さ。(低い数値はラグを招く恐れがあります) El tiempo entre cada ciclo de coagulación de la herida que inicia la coagulación. (Un número bajo puede causar lag) + De hoeveelheid tijd tussen elke wondstollingscyclus. (een laag nummer kan leiden tot lag) + Le temps entre chaque cycle de coagulation des plaies qui déclenche la coagulation. (Un nombre bas peut entraîner du lag) Minor Wounds Clotting Time 小さな創傷の凝血時間 Tiempo de coagulación de Heridas Leves + Kleine wonden stollingstijd + Temps de coagulation des blessures mineures Medium Wounds Clotting Time 中くらいの創傷の凝血時間 Tiempo de coagulación de Heridas Medias + Middelgrote wonden stollingstijd + Temps de coagulation des blessures moyennes Large Wounds Clotting Time 大きな創傷の凝血時間 Tiempo de coagulación de Heridas Severas + Grote wonden stollingstijd + Temps de coagulation des blessures larges - This time gets divided by 2, randomized & added with the same value devided by 2. \n For example, if the value was set to 10s this would be one possible varriation: (random (10 / 2)) + (10 / 2) = 8s + This time gets divided by 2, randomized & added with the same value devided by 2.\nFor example, if the value was set to 10s this would be one possible varriation: (random (10 / 2)) + (10 / 2) = 8s この時間を2で割って、同じ値を2で割った値をランダムに加算する。\n例えば、値を10秒に設定した場合、次のようなバリエーションが考えられる: (ランダム値 (10秒 / 2)) + (10秒 / 2) = 8秒 Este tiempo se divide entre 2, se aleatoriza y se suma con el mismo valor dividido por 2.\n Por ejemplo, si el valor se establece en 10 esto sería un posible resultado: ("al azar del 0 al" (10/2)) + (10/2) = 8s + Deze tijd wordt door 2 gedeeld, gerandomiseerd en dan met dezelfde waarde gedeeld door 2 opgeteld. \nBijvoorbeeld: als deze waarde op 10 seconden ingesteld staat dan is één mogelijke variatie:(random(10/2))+(10/2) = 8s + Ce temps est divisé par 2, randomisé et additionné à la même valeur divisée par 2. \nPar exemple, si une valeur est fixée à 10 secondes, une variation possible serait : (aléatoire (10 / 2)) + (10 / 2) = 8s Coagulation Factor Regeneration Cycle 凝固因子再生サイクル Ciclo de Regeneración del Factor de Coagulación + Stollingsfactor hergeneratiecyclus + Cycle de régénération des facteurs de coagulation The time between coagulation factor regeneration checks. Will add +1 factor on successful check. Uses Setting: "Coagulation Factors" as limit.\n Note: If the limit is exceeded, this time will be used and then remove -1 factor until Setting: "Coagulation Factors" is reached. Tipp: TXA or EACA stop losing factors\nRequirements for regeneration to work:\n- No wound being clotted in the last cycle check from this setting\n- Setting: "Require Heart Rate"\n- Setting: "Required Blood Volume" 凝固因子再生チェックの間隔。チェックに成功すると因子が+1されます。設定 "凝固因子の限界値" を限界値として使用します。 \n注:制限を超えた場合、この時間が経過した後、設定"凝固因子の限界値"に達するまで因子を1つ取り除きます。 \nヒント: TXAまたはEACAは因子の消失を止めます。\n因子再生が機能するための条件: \n-ここで設定されたサイクル時間の最後のチェックで傷口が凝血していないこと \n-設定: "心拍を要求する" \n-設定: "血液量を要求する" Tiempo que transcurre entre cada revisión de la regeneración del factor de coagulación. Añade +1 factor si la revisión ha tenido éxito. Utiliza el ajuste "Factores de Coagulación" como límite.\n Nota: Si el limite es excedido, el tiempo será usado para retirar -1 factor hasta que el ajuste "Factor de Coagulación" se alcance. Consejo: ATX o EACA dejan de perder factores.\n Requisitos para que la regeneración funcione:\n- Ninguna herida coagulada en la última revisión del ciclo de este ajuste.\n- Ajuste: "Requiere Ritmo Cardíaco"\n- Ajuste: "Volumen de Sangre requerido" + De tijd tussen stollingsfactor hergeneratie checks. Geeft +1 factor op een succesvolle check. Gebruikt instelling: "Stollingsfactoren" als limiet. \n Wees alert: als het limiet overschreden is, dan zal na deze check 1 factor verwijderd worden (-1 factoren) tot het limiet weer bereikt is. Tip: TXA en EACA stoppen het verlies van factoren.\nVereisten voor hergeneratie:\n- Geen wond gestold in de laaste cyclus van deze instelling,\n- Instelling: "Vereist hartslag"\n- "Benodigd bloedvolume" + Le temps entre les vériofications de régénération des facteurs de coagulation. Ajoute +1 facteur en cas de vérification réussie. Utilise le paramètres : "Facteurs de coagulation" comme limite. \nRemarque : si la limite est dépassée, ce temps sera utilisé, puis -1 facteur sera retiré jusqu'à ce que le paramètre : "Facteurs de coagulation" soit atteint. Conseil :TXA ou EACA arrêtent la perte de facteurs.\nConditions nécessaires pour que la régénération fonctionne :\n- Aucune plaie en cours de coagulation au cours du dernier cycle de vérification de ce paramètres.\n- Paramètre : "Fréquence cardiaque requise"\n- Paramètre : "Volume sanguin requis" Affect AI AIへの影響 Afecta a la IA + Beïnvloed AI/KI + Affecte l'IA - Allow coagulation to affect AI units. \nEvery other value will still be required if turned on. (May cause lag if many AI is present) + Allow coagulation to affect AI units.\nEvery other value will still be required if turned on. (May cause lag if many AI is present) 凝固がAIに影響するようにします。\nONにしても他の値は必要です。(多くのAIが存在する場合、ラグが発生する可能性があります。) Permitir que la coaguación afecte a las unidades de IA. Todos los demás valores seguirán siendo necesarios si se activan. (Puede causar lag si hay muchas IA presentes) + Laat coagulatie AI/KI beïnvloeden.\nElke andere waarde wordt ook voor AI/KI gecheckt wanneer dit aanstaat. (Kan prestatieproblemen opleveren als er veel AI's/KI's aanwezig zijn.) + Autoriser la coagulation à affecter les unités IA.\nTous les autres paramètres seront toujours nécessaires si cette option est activée. (Peut entraîner un lag si de nombreuses IA sont présentes.) Tournique Blocks Blood Clotting 止血帯による血液凝固の妨げ Torniquete Bloquea la Coagulación de la Sangre + Tourniquets blokkeren wondstolling + Le garrot bloque la coagulation If enabled a applied tourniquet will stop wounds from being closed from coagulation on that bodypart 有効にすると、止血帯を適用中の部位で凝固によって傷口が塞がらないようになります。 Si se activa, el torniquete aplicado impedirá que las heridas se cierren por coagulación en esa parte del cuerpo + Tourniquets voorkomen dat wonden op hetzelfde ledemaat dichtgemaakt worden door coagulatie wanneer deze instelling actief is + Si activé, un garrot appliqué empêchera les plaies de se fermer par coagulation sur cette partie du corps. Affect Minor Wounds 小さな創傷への影響 Afecta a Heridas Menores + Beïnvloed kleine wonden + Affecter les blessures mineures Allow coagulation to affect minor wounds when clotting 小さな創傷に対して凝固が影響することを許可する Permitir que la coagulación afecte a heridas leves al coagularse + Staat toe dat coagulatie kleine wonden beïnvloed tijdens het stollen + Permettre à la coagulation d'affecter les blessures mineures lors de la coagulation Affect Medium Wounds 中くらいの創傷への影響 Afecta a Heridas Medias + Beïnvloed middelgrote wonden + Affecter les blessures moyennes Allow coagulation to affect medium wounds when clotting 中くらいの創傷に対して凝固が影響することを許可する Permitir que la coagulación afecte a heridas medias al coagularse + Staat toe dat coagulatie middelgrote wonden beïnvloed tijdens het stollen + Permettre à la coagulation d'affecter les blessures moyennes lors de la coagulation Affect Large Wounds 大きな創傷への影響 Afecta a Heridas Severas + Beïnvloed grote wonden + Affecter les blessures larges Allow coagulation to affect large wounds when clotting 大きな創傷に対して凝固が影響することを許可する Permite que la coagulación afecte a heridas severas al coagularse + Staat toe dat coagulatie grote wonden beïnvloed tijdens het stollen + Permettre à la coagulation d'affecter les blessures larges lors de la coagulation Allow Additional TXA Bandaging TXAによる追加の"包帯"を許可する Permitir el Vendaje ATX Adicional + Sta additionele TXA dichtingen toe + Permettre l'apport de bandages par le TXA If enabled TXA will keep all functionality and start bandaging wounds itself 有効にすると、TXAがすべての機能を保持し、自身に"包帯"を適用するようになります。 Si el ATX esta permitido, mantendrá toda la funcionalidad y empezará a vendar las heridas por si mismo + TXA houdt zijn functionaliteit en zal wonden dichten wanneer deze instelling actief is. + Si activé, le TXA gardera toutes ses fonctionnalités et bandera les plaies par lui-même Allow Additional EACA Stiching EACAによる追加の"縫合"を許可する Permitir la Sutura EACA Adicional + Sta additionele EACA hechtingen toe + Permettre la suture par l'EACA If enabled EACA will keep all functionality and start stitching bandaged wounds 有効にすると、EACAがすべての機能を保持し、自身に"縫合"を適用するようになります。 Si el EACA esta permitido, mantendrá la funcionalidad y empezará a suturar las heridas vendadas + EACA houdt zijn functionaliteit en zal wonden hechten wanneer deze instelling actief is. + Si activé, l'EACA gardera toutes ses fonctionnalités et suturera les plaies par lui-même Simultaneous Bodypart Coagulation 身体部位の同時凝固 Coagulación Simultanea de las Partes del Cuerpo + Gelijktijdige coagulatie + Coagulation simultanée de plusieurs membres If enabled each bodypart will be treated simultaneously by coagulation.\nMeaning if you have a wound on the head and body they will both be treated in the same coagulation cycle. 有効にすると、各部位が同時に凝固処理されます。\nつまり、頭部と胴体に傷がある場合、同じ凝固サイクルで両方が治癒されます。 Si se permite, cada parte del cuerpo se tratará simultáneamente mediante coagulación. \nEs decir, si tiene una herida en la cabeza y otra en el torso, ambas se tratarán en el mismo ciclo de coagulación. + Als dit ingeschakeld is, zal elk lichaamsdeel tegelijkertijd behandeld worden door coagulatie. \nWat betekent dat als je een wond aan je arm en been hebt, dat deze in dezelfde coagulatiecyclus behandeld worden + Si activé, chaque membre sera affecté simultanément par la coagulation.\nCela signifie que si une plaie est présente sur la tête et le torse, elles seront toutes deux traitées lors du même cycle de coagulation. Coagulation Factor Limit 凝固因子の限界値 Limite del Factor de Coagulación + Stollingsfactor limiet + Limite de facteurs de coagulation The limit for how many coagulation factors can be present inside a units body at once. Meaning if you administer plasma this is the maximum attainable value. 血液凝固因子が一度にどれだけ体内に存在できるかの限界値。つまり、血漿を投与した場合における保持可能な因子の最大値。 Limite del número de factores de coagulación que pueden estar presentes a la vez en el organismo de una unidad. Es decir, si administras plasma, éste es el valor máximo alcanzable. + Het limiet voor hoeveel stollingsfactoren er in een eenheids lichaam tegelijkertijd aanwezig kan zijn. Wat betekent dat dit de waarde is waar zelfs plasma geen extra factoren meer toevoegd + La limite du nombre de facteurs de coagulation pouvant être présents dans le corps d'une unité. Cela signifie que si du plasma est administré, il s'agira de la valeur maximale atteignable. Allow Clots To Be Shown in Menu メニューに血栓を表示する Permitir que los Coágulos se muestren en el Menú + Sta toe dat stollingen worden weergeven in het menu + Autoriser l'affichage des caillots dans le menu If enabled, when coagulation is bandaging a wound it will add a interaction log to the medical menu. 有効にすると、凝固が傷に包帯を適用しているときに、医療メニューのログに追加されます。 Si se activa, cuando la coagulación esté vendando una herida añadirá un registro de interacción al menú médico. + Wanneer dit is ingeschakeld is worden gestolde wonden toegevoegd aan de interactie log van het medisch menu. + Si activé, lorsque la coagulation bandera une plaie, une ligne sera ajoutée dans le journal des interactions du menu médical. Blood clotting temporarily closed a wound on %1 血液凝固が一時的に %1 の創傷を塞いだ La coagulación sanguínea cerró temporalmente una herida en %1 Coagulação estancou temporariamente um ferimento em %1 + Wondstolling heeft een wond op %1 tijdelijk gedicht + La coagulation a temporairement fermé une plaie sur %1 Blood clotting permanently closed a wound on %1 血液凝固が完全に %1 の創傷を塞いだ La coagulación sanguínea cerro permanentemente una herida en %1 Coagulação estancou permanentemente um ferimento em %1 + Wondstolling heeft een wond op %1 permanent gedicht + La coagulation a définitivement fermé une plaie sur %1 Head @@ -3415,6 +3559,7 @@ 头部 頭部 Kafa + Hoofd Torso @@ -3431,6 +3576,7 @@ 躯干 身體 Gövde + Torso Left Arm @@ -3447,6 +3593,7 @@ 左臂 左手 Sol Kol + Linkerarm Right Arm @@ -3463,6 +3610,7 @@ 右臂 右手 Sağ Kol + Rechterarm Left Leg @@ -3479,6 +3627,7 @@ 左腿 左腳 Sol Bacak + Linkerbeen Right Leg @@ -3495,156 +3644,209 @@ 右腿 右腳 Sağ Bacak + Rechterbeen Coag-Sense Coag-Sense Coag-Sense Medidor de Coagulação + Coag-Sense + Coag-Sense The Coag-Sense is a PT/INR monitoring system that can measure the efficiency of your blood clotting Coag-Senseは血液凝固の効率を測定できる PT/INR モニタリングシステムです。 El Coag-Sense es un sistema de monitorización PT/INR que puede medir la eficiencia de su coagulación sanguínea O Medidor de Coagulação é um sistema de monitoramento PT/INR que pode mensurar a eficiência da sua coagulação sanguínea + De Coag-Sense is een PT-INR monitoringssysteem dat de effectiviteit van jouw wondstolling kan bepalen + Le Coag-Sense est un système de surveillance PT/INR qui permet de mesurer l'efficacité de la coagulation sanguine Coag-Sense concludes: %1 Coag-Senseの結果: %1 Coag-Sense concluye: %1 Medidor de Coagulação conlui: %1 + Coag-Sense concludeerd: %1 + Le Coag-Sense a conclu : %1 Measure PT/INR PT/INRを測定する Medir PT/INR Medir PT/INR + Meet PT-INR + Mesurer le PT/INR Taking Blood Sample, 血液サンプルを取っています、 Tomar muestra de sangre, Coletando amostra sanguínea, + Bloedstaal wordt genomen + Prélè¨vement de sang, - slightly below normal INR + Slightly Below Normal INR 正常INRより少し低い ligeramente por debajo del INR normal INR ligeiramente abaixo do normal + Lichtelijk onder normaal INR + légèrement inférieur à l'INR normal - sligtly above normal INR + Sligtly Above normal INR 正常INRより少し高い ligeramente por encima de INR normal INR ligeiramente acima do normal + Lichtelijk boven normaal INR + légèrement supérieur à l'INR normal Very Low INR 正常INRよりかなり低い INR muy bajo INR bem abaixo do normal + Zeer laag INR + INR très bas Very high INR 正常INRよりかなり高い INR muy alto INR bem acima do normal + Zeer hoog INR + INR très élevé Normal INR 正常INR INR normal INR normal + Normaal INR + INR normal Coag-Sense Settings Coag-Sense設定 Ajustes de Coag-Sense Configuração do Medidor de Coagulação + Coag-Sense instellingen + Paramètres du Coag-Sense Medical level required for Coag-Sense Coag-Senseの許可 Nivel médico requerido para Coag-Sense Nível médico necessário para uso do Medidor de Coagulação + Vereist medisch niveau voor gebruik Coag-Sense + Niveau médical requis du Coag-Sense Locations Coag-Sense Coag-Senseが使用できる場所 Ubicaciones Coag-Sense Localizações de uso do Medidor de Coagulação + Locaties voor gebruik Coag-Sense + Emplacements du Coag-Sense Treatment time for measuring PT/INR PT/INR測定の所要時間 Tiempo de tratamiento para medir PT/INR Tempo para mensurar PT/INR + Onderzoekstijd voor bepalen PT-INR + Temps pour mesurer le PT/INR Allow Stacking 重複の許可 Permitir acumulación Permitir somatória de efeito + Sta stapelen toe + Autoriser l'empilage - If enabled EACA will be stackable and doubble it's efficiency - 有効にすると、EACAの重複が可能になり、効率が2倍になる。 + If enabled EACA will be stackable and double its efficiency + 有効にすると、EACAの重複が可能になり、効率が2倍になります。 Si el EACA esta permitido, se podrá acumular y duplicará su eficiencia Se habilitado, o efeito do EACA será somável e sua eficiência será dobrada + Staat het stapelen van EACA toe wanneer ingeschakeld, wat leidt tot een verdubbeling van de effectiviteit + Si activé, l'EACA sera empilable et doublera son efficacité Keep Stiching Until Out Of System 体内に効果が無くなるまで"縫合"を適用する Mantiene la Sutura hasta que desaparezca del Organismo Sutura contínua enquanto presente no sistema + Blijf hechten tot uit systeem + Continuer de suturer jusqu'à ce que le produit soit éliminé du système If enabled EACA will keep stichinng until it's out of your system\nIf disabled EACA will stop working after stiching the last bandaged wound it can find 有効にすると、EACAが体内から無くなるまで"縫合"をします。 \n無効にすると、EACAが判定済の最後の包帯創傷に"縫合"を適用した後に、その作用を終了します。 Si el EACA esta permitido, seguirá suturando hasta que desaparezca del organismo.\n Si el EACA no está permitido, dejará de funcionar después de suturar la última herida que pueda encontrar Se habilitado, o EACA continuará suturando até que esteja fora do seu sistema\nSe desabilitado, o funcionamento do EACA será interrompido assim que suturar o último ferimento + Als dit ingeschakeld is, EACA blijft hechten tot het uit je systeem is.\nEACA zal stoppen na de laatste hechtbare wond die hij kan vinden wanneer uitgeschakeld + Si activé, l'EACA continuera de suturer jusqu'à ce qu'il soit éliminé du système.\nSi désactivé, l'EACA cessera de fonctionner après avoir suturé le dernier bandage qu'il peut trouver. EACA Cycle Time EACAサイクル時間 Duración del Ciclo del EACA Tempo de Ciclo do EACA + EACA cyclustimer + Temps de cycle de l'EACA The time it takes for EACA to close a stich a wound EACAが創傷を縫合するのに掛かる時間 El tiempo que tarda EACA en suturar una herida O intervalo entre suturas do EACA + Hoe lang het duurt voor EACA om een wond te hechten + Temps requis à l'EACA pour suturer une plaie IV Epinephrine Settings EACAが創傷を縫合するのに掛かる時間 Ajustes de Epinefrina IV + IV Adrenaline Instellingen + Paramètres de l'épinéphrine IV Medical level required for IV Epinephrine アドレナリン静脈注射 (IV)の許可 Nivel médico requerido para Epinefrina IV + Vereist medisch niveau voor gebruik van IV Adrenaline + Niveau médical requis pour l'épinéphrine IV Treatment time for IV Epinephrine アドレナリン静脈注射 (IV)の所要時間 Tiempo de tratamiento para Epinefrina IV + Toedieningstijd voor IV Adrenaline + Temps de traitement pour l'épinéphrine IV IV Epinephrine アドレナリン静脈注射 (IV) Epinefrina IV + IV Adrenaline + Epinéphrine IV IV Epinephrine アドレナリン静脈注射 (IV) Epinefrina IV + IV Adrenaline + Epinéphrine IV Push Epinephrine アドレナリンを注入 Administrar Epinefrina + Injecteer IV Adrenaline + Administrer l'épinéphrine diff --git a/addons/stretcher/$PBOPREFIX$ b/addons/stretcher/$PBOPREFIX$ new file mode 100644 index 000000000..6901033c0 --- /dev/null +++ b/addons/stretcher/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\stretcher \ No newline at end of file diff --git a/addons/stretcher/CfgEventHandlers.hpp b/addons/stretcher/CfgEventHandlers.hpp new file mode 100644 index 000000000..cb999fcc9 --- /dev/null +++ b/addons/stretcher/CfgEventHandlers.hpp @@ -0,0 +1,12 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + disableModuload = "true"; + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; \ No newline at end of file diff --git a/addons/misc/CfgMoves.hpp b/addons/stretcher/CfgMoves.hpp similarity index 100% rename from addons/misc/CfgMoves.hpp rename to addons/stretcher/CfgMoves.hpp diff --git a/addons/stretcher/CfgVehicles.hpp b/addons/stretcher/CfgVehicles.hpp new file mode 100644 index 000000000..e655deb79 --- /dev/null +++ b/addons/stretcher/CfgVehicles.hpp @@ -0,0 +1,224 @@ +class CBA_Extended_EventHandlers_base; +class CfgVehicles { + #include "vehicle_stretcher.hpp" + + class weapon_bag_base; + class kat_stretcherBag: weapon_bag_base { + class assembleInfo { + displayName = CSTRING(Stretcher_Display); + assembleTo = "kat_stretcher"; + base = ""; + primary = 1; + dissasembleTo[] = {}; + }; + author = "Katalam"; + scope = 2; + editorCategory = "EdCat_Equipment"; + editorSubcategory = "EdSubcat_DismantledWeapons"; + displayName = CSTRING(StretcherPacked_Display); + mass = 60; + }; + + class Tank: LandVehicle {}; + class Tank_F: Tank { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class kat_stretcher: Tank_F { + explosionEffect = ""; + fuelExplosionPower = 0; + editorForceEmpty = 1; + editorSubcategory = "edSubcat_Storage"; + crew = "C_man_1"; + icon = "iconObject_1x1"; + hasDriver = 0; + scope = 2; + side = 3; + faction = "CIV_F"; + accuracy = 0.001; + camouflage = 10; + armor = 20; + displayName = CSTRING(Stretcher_Display); + model = QPATHTOF(models\stretcher\vurtual_stretcher.p3d); + simulation = "tankX"; + crewVulnerable = 1; + explosionShielding = 0; + irTarget = 0; + allowTabLock = 0; + cargoAction[] = {"kat_stretcher"}; + tf_isolatedAmount = 0; + numberPhysicalWheels = 0; + hideProxyInCombat = 0; + hideWeaponsCargo = "true"; + ejectDeadCargo = 0; + class Damage { + tex[] = {}; + mat[] = { + QPATHTOF(models\stretcher\seat.rvmat), + QPATHTOF(models\stretcher\seat_destruct.rvmat) + }; + }; + class animationSources { + class seat_hide { + source = "user"; + initPhase = 0; + animPeriod = 0.1; + displayName = "Hide Stretcher"; + forceAnimatePhase = 1; + forceAnimate[] = {"legs_hide", 1}; + }; + }; + maximumLoad = 0; + transportMaxBackpacks = 0; + transportMaxMagazines = 64; + class TransportItems; + class Turrets {}; + transportSoldier = 1; + ACEGVAR(cargo,canLoad) = 1; + ACEGVAR(cargo,hasCargo) = 0; + ACEGVAR(dragging,canDrag) = 1; + ACEGVAR(dragging,canCarry) = 1; + ACEGVAR(dragging,dragPosition[]) = {0,1.7,0}; + ACEGVAR(dragging,carryPosition[]) = {0, 1.7, 0}; + ACEGVAR(dragging,dragDirection) = 0; + ACEGVAR(dragging,carryDirection) = 0; + ace_cookoff_probability = 0; + slingLoadCargoMemoryPoints[] = {"SlingLoadCargo1", "SlingLoadCargo2", "SlingLoadCargo3", "SlingLoadCargo4"}; + destrType = "destructDefault"; + fuelCapacity = 0; + + //pretend static weapon since some mods don't like unconscious people in static weapons + nameSound = "veh_static_s"; + vehicleClass = "static"; + unitInfoType = "RscUnitInfoStatic"; + crewExplosionProtection = 0; + class DestructionEffects {}; + class VehicleTransport { + class Cargo { + parachuteClass = "B_Parachute_02_F"; + parachuteHeightLimit = 5; + canBeTransported = 1; + dimensions[] = {"VTV_Cargo_Base", "VTV_Cargo_Corner"}; + }; + }; + + class EventHandlers { + class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers_base {}; + }; + + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class KAT_PackIntoBackpack { + displayName = CSTRING(PackIntoBackpack); + condition = QUOTE(_target call FUNC(canPackIntoBackpack)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(packIntoBackpack)); + icon = QPATHTOF(ui\stretcher.paa); + }; + class KAT_PackIntoBag { + displayName = CSTRING(PackIntoBag); + condition = QUOTE(call FUNC(canPackIntoBag)); + statement = QUOTE(call FUNC(packIntoBag)); + icon = QPATHTOF(ui\stretcher.paa); + }; + class KAT_AttachToVehicle { + displayName = CSTRING(AttachHeliStretcher); + condition = QUOTE(true); + insertChildren = QUOTE(_target call FUNC(attachStretcher)); + icon = QPATHTOF(ui\stretcher.paa); + }; + }; + }; + }; + + class Land_Stretcher_01_base_F; + class Land_Stretcher_01_olive_F: Land_Stretcher_01_base_F { + ACEGVAR(cargo,canLoad) = 1; + ACEGVAR(cargo,hasCargo) = 0; + ACEGVAR(dragging,canDrag) = 1; + ACEGVAR(dragging,canCarry) = 1; + ACEGVAR(dragging,dragPosition[]) = {0,1.7,0}; + ACEGVAR(dragging,carryPosition[]) = {0, 1.7, 0}; + ACEGVAR(dragging,dragDirection) = 0; + ACEGVAR(dragging,carryDirection) = 0; + ace_cookoff_probability = 0; + class VehicleTransport { + class Cargo { + parachuteClass = "B_Parachute_02_F"; + parachuteHeightLimit = 5; + canBeTransported = 1; + dimensions[] = {"VTV_Cargo_Base", "VTV_Cargo_Corner"}; + }; + }; + }; + + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class KAT_Equipment { + class KAT_DeployStretcher { + displayName = CSTRING(UnpackStretcher); + condition = QUOTE(call FUNC(assemble_canDeployStretcher)); + statement = QUOTE(call FUNC(assemble_deployStretcher)); + exceptions[] = {}; + }; + }; + }; + }; + + class Air; + class Helicopter: Air { + class ACE_Actions { + class ACE_MainActions { + class KAT_AttachHeliStretcher { + displayName = CSTRING(AttachHeliStretcher); + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canAttachHeliStretcher)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(attachHeliStretcher)); + icon = QPATHTOF(ui\stretcher.paa); + }; + class KAT_DetachHeliStretcher { + displayName = CSTRING(DetachHeliStretcher); + condition = QUOTE(_target call FUNC(canDetachHeliStretcher)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(detachHeliStretcher)); + icon = QPATHTOF(ui\stretcher.paa); + }; + }; + }; + class ACE_SelfActions { + class KAT_HeliStretcher { + + displayName = CSTRING(KAT_HeliStretcher); + icon = QPATHTOF(ui\stretcher.paa); + + class KAT_DeployStretcher { + displayName = CSTRING(DeployHeliStretcher); + condition = QUOTE(_player call FUNC(canDeployHeliStretcher)); + statement = QUOTE(_target call FUNC(deployHeliStretcher)); + icon = QPATHTOF(ui\downarrow.paa); + }; + + class KAT_LowerStretcher { + displayName = CSTRING(LowerHeliStretcher); + condition = QUOTE(_target call FUNC(canAdjustRopes)); + statement = QUOTE(_target call FUNC(lowerHeliStretcher)); + icon = QPATHTOF(ui\downarrow.paa); + }; + + class KAT_RaiseStretcher { + displayName = CSTRING(RaiseHeliStretcher); + condition = QUOTE(_target call FUNC(canAdjustRopes)); + statement = QUOTE(_target call FUNC(raiseHeliStretcher)); + icon = QPATHTOF(ui\uparrow.paa); + }; + + class KAT_RetractStretcher { + displayName = CSTRING(RetractHeliStretcher); + condition = QUOTE(_target call FUNC(canAdjustRopes)); + statement = QUOTE(_target call FUNC(retractHeliStretcher)); + icon = QPATHTOF(ui\uparrow.paa); + }; + }; + + }; + }; +}; diff --git a/addons/stretcher/CfgWeapons.hpp b/addons/stretcher/CfgWeapons.hpp new file mode 100644 index 000000000..3250b9fbc --- /dev/null +++ b/addons/stretcher/CfgWeapons.hpp @@ -0,0 +1,35 @@ +class CfgWeapons +{ + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + class kat_helistretcher: ACE_ItemCore { + scope = 2; + author = "Battlekeeper"; + picture = QPATHTOF(ui\stretcher.paa); + displayName = CSTRING(Helistretcher_Display); + descriptionShort = CSTRING(Helistretcher_Desc); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 20; + }; + }; + + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class kat_CarryStretcherBag: Launcher_Base_F { + class ADDON { + type = "placeable"; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 40; + }; + displayName = CSTRING(Stretcher_Display); + author = "MiszczuZPolski"; + scope = 2; + model = QACEPATHTOF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = QPATHTOF(ui\stretcher.paa); + }; +}; \ No newline at end of file diff --git a/addons/stretcher/XEH_PREP.hpp b/addons/stretcher/XEH_PREP.hpp new file mode 100644 index 000000000..cc3c9bce0 --- /dev/null +++ b/addons/stretcher/XEH_PREP.hpp @@ -0,0 +1,17 @@ +PREP(assemble_deployStretcher); +PREP(assemble_canDeployStretcher); +PREP(attachHeliStretcher); +PREP(attachStretcher); +PREP(canAdjustRopes); +PREP(canAttachHeliStretcher); +PREP(canDeployHeliStretcher); +PREP(canDetachHeliStretcher); +PREP(canPackIntoBackpack); +PREP(canPackIntoBag); +PREP(deployHeliStretcher); +PREP(detachHeliStretcher); +PREP(lowerHeliStretcher); +PREP(packIntoBackpack); +PREP(packIntoBag); +PREP(raiseHeliStretcher); +PREP(retractHeliStretcher); \ No newline at end of file diff --git a/addons/stretcher/XEH_postInit.sqf b/addons/stretcher/XEH_postInit.sqf new file mode 100644 index 000000000..cf7da7d85 --- /dev/null +++ b/addons/stretcher/XEH_postInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +["kat_stretcher", "Init", { + params ["_vehicle"]; + + [_vehicle] call ACEFUNC(dragging,initObject); +}] call CBA_fnc_addClassEventHandler; \ No newline at end of file diff --git a/addons/stretcher/XEH_preInit.sqf b/addons/stretcher/XEH_preInit.sqf new file mode 100644 index 000000000..fe4debe5c --- /dev/null +++ b/addons/stretcher/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#define CBA_SETTINGS_CAT "KAT - ADV Medical: Stretcher" + +ADDON = true; diff --git a/addons/stretcher/config.cpp b/addons/stretcher/config.cpp new file mode 100644 index 000000000..f9e8eb7cc --- /dev/null +++ b/addons/stretcher/config.cpp @@ -0,0 +1,40 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + units[] = { + "kat_stretcher", + "kat_stretcherBag" + }; + weapons[] = { "kat_helistretcher", "kat_CarryStretcherBag" }; + magazines[] = { }; + requiredAddons[] = { + "kat_main", + "ace_medical", + "ace_medical_ai", + "ace_medical_blood", + "ace_medical_damage", + "ace_medical_engine", + "ace_medical_feedback", + "ace_medical_gui", + "ace_medical_statemachine", + "ace_medical_status", + "ace_medical_treatment", + "ace_medical_vitals", + "ace_dogtags", + "cba_settings", + "A3_Static_F" + }; + author = "Katalam"; + authors[] = {"Katalam", "MiszczuZPolski"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgMoves.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/stretcher/functions/fnc_assemble_canDeployStretcher.sqf b/addons/stretcher/functions/fnc_assemble_canDeployStretcher.sqf new file mode 100644 index 000000000..f9db6b1e9 --- /dev/null +++ b/addons/stretcher/functions/fnc_assemble_canDeployStretcher.sqf @@ -0,0 +1,22 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Checks if the player can deploy the stretcher. + * + * Arguments: + * 0: Player + * + * Return Value: + * Can deploy + * + * Example: + * [player] call kat_stretcher_fnc_assemble_canDeployStretcher; + * + * Public: No + */ + +params ["_player"]; + +private _secondaryWeapon = secondaryWeapon _player; + +_secondaryWeapon != "" && {getText (configFile >> "CfgWeapons" >> _secondaryWeapon >> QUOTE(ADDON) >> "type") == "placeable"} // return diff --git a/addons/stretcher/functions/fnc_assemble_deployStretcher.sqf b/addons/stretcher/functions/fnc_assemble_deployStretcher.sqf new file mode 100644 index 000000000..b3db60f16 --- /dev/null +++ b/addons/stretcher/functions/fnc_assemble_deployStretcher.sqf @@ -0,0 +1,73 @@ +#include "..\script_component.hpp" +/* + * Author: tcvm + * Deploys the stretcher + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * player call kat_stretcher_fnc_assemble_deployStretcher + * + * Public: No + */ + +[{ + params ["_player"]; + TRACE_1("assemble_deployStretcher",_player); + + // Save magazines and attachments (handle loaded launchers which can become csw like CUP Metis) + private _secondaryWeaponInfo = (getUnitLoadout _player) select 1; + private _secondaryWeaponClassname = _secondaryWeaponInfo deleteAt 0; + + + // Remove empty entries + _secondaryWeaponInfo = _secondaryWeaponInfo select {_x isNotEqualTo "" && {_x isNotEqualTo []}}; + + // Remove the tripod from the launcher slot + _player removeWeaponGlobal _secondaryWeaponClassname; + + private _onFinish = { + params ["_args"]; + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponInfo"]; + TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponInfo); + + private _tripodClassname = "kat_stretcher"; + + // Create a tripod + private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"]; + + private _posATL = _player getRelPos [2, 0]; + _posATL set [2, ((getPosATL _player) select 2) + 0.5]; + + _cswTripod setDir (direction _player); + _cswTripod setPosATL _posATL; + _cswTripod setVectorUp (surfaceNormal _posATL); + + [_player, "PutDown"] call ACEFUNC(common,doGesture); + + // drag after deploying + if ((missionNamespace getVariable [QACEGVAR(csw,dragAfterDeploy), false]) && {["ace_dragging"] call ACEFUNC(common,isModLoaded)}) then { + if ([_player, _cswTripod] call ACEFUNC(dragging,canCarry)) then { + TRACE_1("starting carry",_cswTripod); + [_player, _cswTripod] call ACEFUNC(dragging,startCarry); + } else { + TRACE_1("cannot carry",_cswTripod); + }; + }; + }; + + private _onFailure = { + params ["_args"]; + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponInfo"]; + TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponInfo); + + // Add stretcher back + [_player, _secondaryWeaponClassname] call CBA_fnc_addWeaponWithoutItems; + }; + + [TIME_PROGRESSBAR(4), [_player, _secondaryWeaponClassname, _secondaryWeaponInfo], _onFinish, _onFailure, LLSTRING(PlaceStretcher_progressBar)] call ACEFUNC(common,progressBar); +}, _this] call CBA_fnc_execNextFrame; diff --git a/addons/stretcher/functions/fnc_attachHeliStretcher.sqf b/addons/stretcher/functions/fnc_attachHeliStretcher.sqf new file mode 100644 index 000000000..7043093aa --- /dev/null +++ b/addons/stretcher/functions/fnc_attachHeliStretcher.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Attaches helistretcher to helicopter + * + * Arguments: + * 0: Player + * 1: Helicopter + * + * Example: + * [player, cursorObject] call kat_stretcher_fnc_attachHeliStretcher; + * + * Public: No + */ + +params ["_player","_target"]; + +_player removeItem "kat_helistretcher"; +private _stretcher = createVehicle ["kat_stretcher", (_target modelToWorld [0,0,-5])]; +_stretcher attachTo [_target, [0,0,-.1], "slingload0"]; +[_stretcher, false] call ACEFUNC(dragging,setCarryable); +[_stretcher, false] call ACEFUNC(dragging,setDraggable); +_target setVariable [QGVAR(isStretcherAttached), true, true]; +_target setVariable [QGVAR(stretcher), _stretcher, true]; + + diff --git a/addons/misc/functions/fnc_attachStretcher.sqf b/addons/stretcher/functions/fnc_attachStretcher.sqf similarity index 92% rename from addons/misc/functions/fnc_attachStretcher.sqf rename to addons/stretcher/functions/fnc_attachStretcher.sqf index 0fcd99625..3924e372a 100644 --- a/addons/misc/functions/fnc_attachStretcher.sqf +++ b/addons/stretcher/functions/fnc_attachStretcher.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [cursorTarget] call kat_misc_fnc_attachStretcher; + * [cursorTarget] call kat_stretcher_fnc_attachStretcher; * * Public: No */ @@ -24,7 +24,7 @@ private _actions = []; { private _type = typeOf _x; private _name = getText (configFile >> "CfgVehicles" >> _type >> "displayName"); - private _uniqueName = format ["kat_misc_%1", _type]; + private _uniqueName = format ["kat_stretcher_%1", _type]; if (isArray (configFile >> "CfgVehicles" >> _type >> "stretcherPos")) then { _actions pushBack [ [ diff --git a/addons/stretcher/functions/fnc_canAdjustRopes.sqf b/addons/stretcher/functions/fnc_canAdjustRopes.sqf new file mode 100644 index 000000000..bdaa2aee1 --- /dev/null +++ b/addons/stretcher/functions/fnc_canAdjustRopes.sqf @@ -0,0 +1,19 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Checks if ropes can be adjusted + * + * Arguments: + * 0: Helicopter + * + * Example: + * [cursorObject] call kat_stretcher_fnc_canAdjustRopes; + * + * Public: No + */ + +params ["_target"]; + +_target getVariable [QGVAR(isStretcherAttached), false] +&& (_target getVariable [QGVAR(stretcherDeployed), false]) +&& (ropeUnwound (_target getVariable [QGVAR(ropes), []] param [0, objNull])) \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_canAttachHeliStretcher.sqf b/addons/stretcher/functions/fnc_canAttachHeliStretcher.sqf new file mode 100644 index 000000000..b95f701d4 --- /dev/null +++ b/addons/stretcher/functions/fnc_canAttachHeliStretcher.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Checks if player can attach helistretcher to helicopter + * + * Arguments: + * 0: Player + * 1: Helicopter + * + * Example: + * [player, cursorObject] call kat_stretcher_fnc_canAttachHeliStretcher; + * + * Public: No + */ + +params ["_player","_target"]; + +[_player, "kat_helistretcher"] call ACEFUNC(common,hasItem) +&& !(_target getVariable [QGVAR(isStretcherAttached), false]) \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_canDeployHeliStretcher.sqf b/addons/stretcher/functions/fnc_canDeployHeliStretcher.sqf new file mode 100644 index 000000000..00d1682ee --- /dev/null +++ b/addons/stretcher/functions/fnc_canDeployHeliStretcher.sqf @@ -0,0 +1,18 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Checks if attached helistretcher can be deployed + * + * Arguments: + * 0: Player + * + * Example: + * [player] call kat_stretcher_fnc_canDeployStretcher; + * + * Public: No + */ + +params ["_player"]; + +objectParent _player getVariable [QGVAR(isStretcherAttached), false] && !(objectParent _player getVariable [QGVAR(stretcherDeployed), false]) \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_canDetachHeliStretcher.sqf b/addons/stretcher/functions/fnc_canDetachHeliStretcher.sqf new file mode 100644 index 000000000..04aa1cc34 --- /dev/null +++ b/addons/stretcher/functions/fnc_canDetachHeliStretcher.sqf @@ -0,0 +1,18 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Checks if player can detach helistretcher to helicopter + * + * Arguments: + * 0: Helicopter + * + * Example: + * [player, cursorObject] call kat_stretcher_fnc_canDetachHeliStretcher; + * + * Public: No + */ + +params ["_target"]; + +(_target getVariable [QGVAR(isStretcherAttached), false]) \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_canPackIntoBackpack.sqf b/addons/stretcher/functions/fnc_canPackIntoBackpack.sqf new file mode 100644 index 000000000..f9b303d7e --- /dev/null +++ b/addons/stretcher/functions/fnc_canPackIntoBackpack.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuPolski + * Checks if stretcher can be packed into backpack + * + * Arguments: + * 0: Stretcher + * + * Return Value: + * + * + * Example: + * [cursorTarget] call kat_stretcher_fnc_canPackIntoBag; + * + * Public: No + */ + +params ["_target"]; + +[true, false] select ((count crew _target > 0) || !(isNull attachedTo _target)) diff --git a/addons/stretcher/functions/fnc_canPackIntoBag.sqf b/addons/stretcher/functions/fnc_canPackIntoBag.sqf new file mode 100644 index 000000000..eb85af6d9 --- /dev/null +++ b/addons/stretcher/functions/fnc_canPackIntoBag.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Checks if stretcher can be packed into bag + * + * Arguments: + * 0: Stretcher + * + * Return Value: + * + * + * Example: + * [cursorTarget] call kat_stretcher_fnc_canPackIntoBag; + * + * Public: No + */ + +params ["_stretcher"]; + +alive _stretcher && {((crew _stretcher) findIf {alive _x && {!unitIsUAV _x}}) == -1} // return \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_deployHeliStretcher.sqf b/addons/stretcher/functions/fnc_deployHeliStretcher.sqf new file mode 100644 index 000000000..f405a9fde --- /dev/null +++ b/addons/stretcher/functions/fnc_deployHeliStretcher.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Deploys helistretcher attached below helicopter + * + * Arguments: + * 0: Helicopter + * + * Example: + * [cursorObject] call kat_stretcher_fnc_deployHeliStretcher; + * + * Public: No + */ + +params ["_target"]; + +private _stretcher = _target getVariable [QGVAR(stretcher), objNull]; +detach _stretcher; + +[_stretcher, true] call ACEFUNC(dragging,setCarryable); +[_stretcher, true] call ACEFUNC(dragging,setDraggable); + +private _rope1 = ropeCreate [_target, "slingload0", _stretcher, [.25,1,0], 5]; +private _rope2 = ropeCreate [_target, "slingload0", _stretcher, [-.25,1,0], 5]; +private _rope3 = ropeCreate [_target, "slingload0", _stretcher, [-.25,-1,0], 5]; +private _rope4 = ropeCreate [_target, "slingload0", _stretcher, [.25,-1,0], 5]; + +ropeUnwind [_rope1, 2, 10]; +ropeUnwind [_rope2, 2, 10]; +ropeUnwind [_rope3, 2, 10]; +ropeUnwind [_rope4, 2, 10]; + +_target setVariable [QGVAR(stretcherDeployed), true, true]; +_target setVariable [QGVAR(ropes), [_rope1,_rope2,_rope3,_rope4], true]; diff --git a/addons/stretcher/functions/fnc_detachHeliStretcher.sqf b/addons/stretcher/functions/fnc_detachHeliStretcher.sqf new file mode 100644 index 000000000..17cdbfb3c --- /dev/null +++ b/addons/stretcher/functions/fnc_detachHeliStretcher.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Detaches helistretcher from helicopter + * + * Arguments: + * 0: Player + * 1: Helicopter + * + * Example: + * [player, cursorObject] call kat_stretcher_fnc_detachHeliStretcher; + * + * Public: No + */ + +params ["_player","_target"]; + +[_player, "kat_helistretcher"] call ACEFUNC(common,addToInventory); + +private _stretcher = _target getVariable [QGVAR(stretcher), objNull]; +deleteVehicle _stretcher; +_target setVariable [QGVAR(stretcher), objNull, true]; + +private _ropes = _target getVariable [QGVAR(ropes), []]; +{ + if (!isNull _x) then { + deleteVehicle _x; + }; +} forEach _ropes; +_target setVariable [QGVAR(ropes), [], true]; + +_target setVariable [QGVAR(isStretcherAttached), false, true]; + + + diff --git a/addons/stretcher/functions/fnc_lowerHeliStretcher.sqf b/addons/stretcher/functions/fnc_lowerHeliStretcher.sqf new file mode 100644 index 000000000..0cce8dcbe --- /dev/null +++ b/addons/stretcher/functions/fnc_lowerHeliStretcher.sqf @@ -0,0 +1,28 @@ +#include "..\script_component.hpp" + +/* + * Author: MiszczuZPolski + * Lowers helistretcher by 10m + * + * Arguments: + * 0: Helicopter + * + * Example: + * [cursorObject] call kat_stretcher_fnc_lowerHeliStretcher; + * + * Public: No + */ + +params ["_target"]; + +#define MAX_LENGTH 50 + +private _stretcher = _target getVariable [QGVAR(stretcher), objNull]; +private _ropes = _target getVariable [QGVAR(ropes), []]; + +{ + private _rope = _x; + if (!isNull _rope && ropeLength _rope <= MAX_LENGTH) then { + ropeUnwind [_rope, 2, 10, true]; + }; +} forEach _ropes; diff --git a/addons/stretcher/functions/fnc_packIntoBackpack.sqf b/addons/stretcher/functions/fnc_packIntoBackpack.sqf new file mode 100644 index 000000000..0ecc32012 --- /dev/null +++ b/addons/stretcher/functions/fnc_packIntoBackpack.sqf @@ -0,0 +1,25 @@ +#include "..\script_component.hpp" +/* + * Author: Katalam + * Children action for attaching stretcher + * + * Arguments: + * 0: Player + * 1: Stretcher + * + * Return Value: + * None + * + * Example: + * [cursorTarget] call kat_stretcher_fnc_packIntoBackpack; + * + * Public: No + */ + +params ["_player", "_target"]; + +private _posATL = _player getRelPos [2, 0]; +_posATL set [2, ((getPosATL _player) select 2) + 0.5]; + +"kat_stretcherBag" createVehicle _posATL; // TODO create at exact position +deleteVehicle _target; \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_packIntoBag.sqf b/addons/stretcher/functions/fnc_packIntoBag.sqf new file mode 100644 index 000000000..b5217e748 --- /dev/null +++ b/addons/stretcher/functions/fnc_packIntoBag.sqf @@ -0,0 +1,74 @@ +#include "..\script_component.hpp" +/* + * Author: tcvm + * Modified by MiszczuZPolski + * Picks up the stretcher and adds it to the player launcher slot. + * + * Arguments: + * 0: Tripod + * 1: Player + * + * Return Value: + * None + * + * Example: + * [cursorObject, player] call kat_stretcher_fnc_packIntoBag; + * + * Public: No + */ + +[{ + params ["_stretcher", "_player"]; + TRACE_2("assemble_pickupTripod",_stretcher,_player); + + private _classname = "kat_CarryStretcherBag"; + + private _onFinish = { + params ["_args"]; + _args params ["_stretcher", "_player", "_classname"]; + TRACE_3("assemble_pickupTripod finish",_stretcher,_player,_classname); + + // Save tripod position before it's deleted + private _stretcherPos = getPosATL _stretcher; + + // Eject dead units (all crew are dead at this point, otherwise condition would have failed), but ignore UAV units + { + if (unitIsUAV _x) then { + _stretcher deleteVehicleCrew _x; + } else { + moveOut _x; + }; + } forEach (crew _stretcher); + + deleteVehicle _stretcher; + + [_player, "PutDown"] call ACEFUNC(common,doGesture); + + // If the player has space, give it to him + if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { + [_player, _classname] call CBA_fnc_addWeaponWithoutItems; + }; + + // Try to find existing weapon holders + private _weaponHolder = nearestObject [_stretcherPos, "WeaponHolder"]; + + // If there are none or too far away, make a new one + if (isNull _weaponHolder || {_stretcherPos distance _weaponHolder > 2}) then { + _weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "CAN_COLLIDE"]; + _weaponHolder setDir random [0, 180, 360]; + _weaponHolder setVehiclePosition [_stretcherPos, [], 0, "CAN_COLLIDE"]; // Places object on surface below + }; + + _weaponHolder addWeaponCargoGlobal [_classname, 1]; + }; + + private _condition = { + params ["_args"]; + _args params ["_stretcher"]; + + _stretcher call FUNC(canPackIntoBag) + }; + + TRACE_3("",4,typeOf _stretcher,_classname); + [TIME_PROGRESSBAR(4), [_stretcher, _player, _classname], _onFinish, {}, LLSTRING(PickupStretcher_progressBar), _condition] call ACEFUNC(common,progressBar); +}, _this] call CBA_fnc_execNextFrame; \ No newline at end of file diff --git a/addons/stretcher/functions/fnc_raiseHeliStretcher.sqf b/addons/stretcher/functions/fnc_raiseHeliStretcher.sqf new file mode 100644 index 000000000..a45b49654 --- /dev/null +++ b/addons/stretcher/functions/fnc_raiseHeliStretcher.sqf @@ -0,0 +1,25 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Raises helistretcher by 10m + * + * Arguments: + * 0: Helicopter + * + * Example: + * [cursorObject] call kat_stretcher_fnc_raiseHeliStretcher; + * + * Public: No + */ + +params ["_target"]; + +private _stretcher = _target getVariable [QGVAR(stretcher), objNull]; +private _ropes = _target getVariable [QGVAR(ropes), []]; + +{ + private _rope = _x; + if (!isNull _rope) then { + ropeUnwind [_rope, 2, -10, true]; + }; +} forEach _ropes; diff --git a/addons/stretcher/functions/fnc_retractHeliStretcher.sqf b/addons/stretcher/functions/fnc_retractHeliStretcher.sqf new file mode 100644 index 000000000..2b4149b3c --- /dev/null +++ b/addons/stretcher/functions/fnc_retractHeliStretcher.sqf @@ -0,0 +1,62 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Retracts helistretcher back to heli, and moves crew back to heli + * + * Arguments: + * 0: Helicopter + * + * Example: + * [cursorObject] call kat_stretcher_fnc_retractHeliStretcher; + * + * Public: No + */ +params ["_target"]; + +private _stretcher = _target getVariable [QGVAR(stretcher), objNull]; +private _ropes = _target getVariable [QGVAR(ropes), []]; + +{ + private _rope = _x; + if (!isNull _rope) then { + ropeUnwind [_rope, 2, -(ropeLength _rope), true]; + }; +} forEach _ropes; + +[{ + params ["_target", "_stretcher", "_ropes"]; + + private _rope = _ropes select 0; + ropeUnwound _rope; +}, +{ + params ["_target", "_stretcher", "_ropes"]; + + private _crew = crew _stretcher; + if (count _crew > 0) then { + { + _x leaveVehicle _stretcher; + moveOut _x; + + _x assignAsCargo _target; + _x moveInCargo _target; + } forEach _crew; + }; + + { + if (!isNull _x) then { + ropeDestroy _x; + }; + } forEach _ropes; + + deleteVehicle _stretcher; + + private _stretcher = createVehicle ["kat_stretcher", (_target modelToWorld [0,0,-5])]; + _stretcher attachTo [_target, [0,0,-.1], "slingload0"]; + [_stretcher, false] call ACEFUNC(dragging,setCarryable); + [_stretcher, false] call ACEFUNC(dragging,setDraggable); + _target setVariable [QGVAR(isStretcherAttached), true, true]; + _target setVariable [QGVAR(stretcher), _stretcher, true]; + _target setVariable [QGVAR(stretcherDeployed), false, true]; + +}, [_target, _stretcher, _ropes]] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/misc/models/stretcher/Model.cfg b/addons/stretcher/models/stretcher/Model.cfg similarity index 100% rename from addons/misc/models/stretcher/Model.cfg rename to addons/stretcher/models/stretcher/Model.cfg diff --git a/addons/misc/models/stretcher/env_land_co.paa b/addons/stretcher/models/stretcher/env_land_co.paa similarity index 100% rename from addons/misc/models/stretcher/env_land_co.paa rename to addons/stretcher/models/stretcher/env_land_co.paa diff --git a/addons/misc/models/stretcher/seat.rvmat b/addons/stretcher/models/stretcher/seat.rvmat similarity index 80% rename from addons/misc/models/stretcher/seat.rvmat rename to addons/stretcher/models/stretcher/seat.rvmat index 209e7ac18..a541c7bd5 100644 --- a/addons/misc/models/stretcher/seat.rvmat +++ b/addons/stretcher/models/stretcher/seat.rvmat @@ -8,7 +8,7 @@ PixelShaderID = "NormalMapSpecularMap"; VertexShaderID = "NormalMap"; class Stage1 { - texture = "x\kat\addons\misc\models\stretcher\seat_nohq.paa"; + texture = "x\kat\addons\stretcher\models\stretcher\seat_nohq.paa"; uvSource = "tex"; class uvTransform { @@ -20,7 +20,7 @@ class Stage1 { }; class Stage2 { - texture = "x\kat\addons\misc\models\stretcher\seat_smdi.paa"; + texture = "x\kat\addons\stretcher\models\stretcher\seat_smdi.paa"; uvSource = "tex"; class uvTransform { diff --git a/addons/misc/models/stretcher/seat_destruct.rvmat b/addons/stretcher/models/stretcher/seat_destruct.rvmat similarity index 81% rename from addons/misc/models/stretcher/seat_destruct.rvmat rename to addons/stretcher/models/stretcher/seat_destruct.rvmat index e2073da53..5d843e5e8 100644 --- a/addons/misc/models/stretcher/seat_destruct.rvmat +++ b/addons/stretcher/models/stretcher/seat_destruct.rvmat @@ -8,7 +8,7 @@ PixelShaderID = "NormalMapMacroASSpecularDIMap"; VertexShaderID = "NormalMapAS"; class Stage1 { - texture = "x\kat\addons\misc\models\stretcher\seat_nohq.paa"; + texture = "x\kat\addons\stretcher\models\stretcher\seat_nohq.paa"; uvSource = "tex"; class uvTransform { @@ -20,7 +20,7 @@ class Stage1 { }; class Stage2 { - texture = "x\kat\addons\misc\models\stretcher\seat_destruct_mc.paa"; + texture = "x\kat\addons\stretcher\models\stretcher\seat_destruct_mc.paa"; uvSource = "tex"; class uvTransform { @@ -44,7 +44,7 @@ class Stage3 { }; class Stage4 { - texture = "x\kat\addons\misc\models\stretcher\seat_destruct_smdi.paa"; + texture = "x\kat\addons\stretcher\models\stretcher\seat_destruct_smdi.paa"; uvSource = "tex"; class uvTransform { diff --git a/addons/misc/models/stretcher/seat_destruct_mc.paa b/addons/stretcher/models/stretcher/seat_destruct_mc.paa similarity index 100% rename from addons/misc/models/stretcher/seat_destruct_mc.paa rename to addons/stretcher/models/stretcher/seat_destruct_mc.paa diff --git a/addons/misc/models/stretcher/seat_destruct_smdi.paa b/addons/stretcher/models/stretcher/seat_destruct_smdi.paa similarity index 100% rename from addons/misc/models/stretcher/seat_destruct_smdi.paa rename to addons/stretcher/models/stretcher/seat_destruct_smdi.paa diff --git a/addons/misc/models/stretcher/seat_nohq.paa b/addons/stretcher/models/stretcher/seat_nohq.paa similarity index 100% rename from addons/misc/models/stretcher/seat_nohq.paa rename to addons/stretcher/models/stretcher/seat_nohq.paa diff --git a/addons/misc/models/stretcher/seat_smdi.paa b/addons/stretcher/models/stretcher/seat_smdi.paa similarity index 100% rename from addons/misc/models/stretcher/seat_smdi.paa rename to addons/stretcher/models/stretcher/seat_smdi.paa diff --git a/addons/misc/models/stretcher/stretcher.rvmat b/addons/stretcher/models/stretcher/stretcher.rvmat similarity index 94% rename from addons/misc/models/stretcher/stretcher.rvmat rename to addons/stretcher/models/stretcher/stretcher.rvmat index 7e097be4a..a90a682ec 100644 --- a/addons/misc/models/stretcher/stretcher.rvmat +++ b/addons/stretcher/models/stretcher/stretcher.rvmat @@ -8,7 +8,7 @@ PixelShaderID="Super"; VertexShaderID="Super"; class Stage1 { - texture="x\kat\addons\misc\models\stretcher\stretcher_nohq.tga"; + texture="x\kat\addons\stretcher\models\stretcher\stretcher_nohq.tga"; uvSource="tex"; class uvTransform { @@ -80,7 +80,7 @@ class Stage6 }; class Stage7 { - texture="x\kat\addons\misc\models\stretcher\env_land_co.tga"; + texture="x\kat\addons\stretcher\models\stretcher\env_land_co.tga"; uvSource="tex"; class uvTransform { diff --git a/addons/misc/models/stretcher/stretcher_co.paa b/addons/stretcher/models/stretcher/stretcher_co.paa similarity index 100% rename from addons/misc/models/stretcher/stretcher_co.paa rename to addons/stretcher/models/stretcher/stretcher_co.paa diff --git a/addons/misc/models/stretcher/stretcher_nohq.paa b/addons/stretcher/models/stretcher/stretcher_nohq.paa similarity index 100% rename from addons/misc/models/stretcher/stretcher_nohq.paa rename to addons/stretcher/models/stretcher/stretcher_nohq.paa diff --git a/addons/stretcher/models/stretcher/vurtual_stretcher.p3d b/addons/stretcher/models/stretcher/vurtual_stretcher.p3d new file mode 100644 index 0000000000000000000000000000000000000000..1e14574306bb46339f9229830141bf4b52e5d7f8 GIT binary patch literal 380526 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 literal 0 HcmV?d00001 diff --git a/addons/stretcher/script_component.hpp b/addons/stretcher/script_component.hpp new file mode 100644 index 000000000..fb8970be8 --- /dev/null +++ b/addons/stretcher/script_component.hpp @@ -0,0 +1,24 @@ +#define COMPONENT stretcher +#define COMPONENT_BEAUTIFIED KAT - STRETCHER +#include "\x\kat\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_STRETCHER + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_STRETCHER + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISC +#endif + +#ifdef FAST_PROGRESSBARS + #define TIME_PROGRESSBAR(X) ((X) * 0.075) +#else + #define TIME_PROGRESSBAR(X) ((X) * ACEGVAR(csw,progressBarTimeCoefficent)) +#endif + + +#include "\x\kat\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/stretcher/stringtable.xml b/addons/stretcher/stringtable.xml new file mode 100644 index 000000000..d7e55e471 --- /dev/null +++ b/addons/stretcher/stringtable.xml @@ -0,0 +1,229 @@ + + + + + Disassemble Stretcher + Trage einklappen + Złóż nosze + Desarmar Camilla + 拆卸式擔架 + 可拆卸式担架 + Rozložit nosítka + 들것 분리 + Désassembler la civière + Sedyeyi sökün + Smonta la barella + Разобрать носилки + 担架を分解する + Desmontar maca + Pura paarit + Ontmantel brancard + + + Attach to + Anhängen an + Przyczep do + Adjuntar a + 掛在 + 附加到 + Připevnit k + 에 부착 + Attacher à + Şuna Bağla + Collega a + Приложить к + 取り付ける + Anexar a + Kiinnitä se + Verbind aan + + + Attach Stretcher + Przyczep nosze + Trage befestigen + Adjuntar Camilla + 附加担架 + 连接担架 + Připevnit nosítka + 들것 부착 + Attacher la civière + Sedyeyi Takın + Attacca la barella + Прикрепить носилки + 担架を取り付ける + Anexar maca + Kiinnitä paarit + Brancard bevestigen + + + Raise Stretcher + Wciągnij nosze + Trage anheben + Subir la Camilla + AA抬起担架AA + 抬起担架 + Vytáhnout nosítka + 들것 올리기 + Elever la civière + Kaldırma Sedyesi + Alzare la barella + Поднимите носилки + 担架を上げる + Elevar a maca + Nosta paarit + Til de brancard op + + + Lower Stretcher + Opuść nosze + Trage absenken + Bajar la Camilla + 下担架 + 放下担架 + Snížit nosítka + 들것 내리기 + Baisser la civière + Alt Sedye + Barella inferiore + Нижние носилки + 担架を下げる + Abaixar a maca + Laske paarit + Laat de brancard zakken + + + Deploy Stretcher + Wypuść nosze + Ontplooi brancard + Desplegar Camilla + 担架を展開する + + + Retract Stretcher + Przywołaj nosze + Trek brancard terug + Recoger Camilla + 担架を収容する + + + Detach Stretcher + Odczep nosze + Maak brancard los + Desanclar Camilla + 担架を取り外す + + + Attachable Helistretcher + Nosze śmigłowcowe + Anbringbare Helitrage + Camilla de helicóptero adjuntable + 可连接直升机 + 可连接担架 + Připevnitelná helinosítka + 부착형 헬기용 들것 + Hélicivière amovible + Helitakılabilir sedye + Elibarella agganciabile + Вы должны находиться в пределах 15 м от вертолета и посмотри на это! + ヘリコプター用担架 + Maca de helicóptero acoplável + Kiinnitettävä paarit helikoptereille + Bevestigbare helibrancard + + + Allows you to attach a Stretcher to a helicopter (Double click) + Pozwala podczepić nosze do śmigłowca(Podwójne kliknięcie) + Ermöglicht das Anbringen einer Trage am Hubschrauber (Doppelklick) + Le permite adjuntar una camilla a un helicóptero (doble clic) + 允许您在直升机上附加担架(双击) + 允许您在直升机上附加担架(双击) + Umožňuje připevnit nosítka na helikoptéru(Dvojtým kliknutím) + 헬기에 들것을 부착할 수 있습니다(더블 클릭) + Vous permet d'attacher une civière sur hélicoptère (double clic) + Helikoptere sedye takmanızı sağlar(Çift tıklama) + Consente di collegare una barella sull'elicottero (doppio clic) + Позволяет прикрепить носилки к вертолету (двойной щелчок) + ヘリコプターに担架を取り付けることができます (ダブルクリック) + Permite anexar uma maca a um helicóptero (clique duplo) + Mahdollistaa paareiden kiinnittämisen helikopteriin (klikkaa kahdesti) + Staat je toe om een brancard aan een heli te bevestigen (dubbel klik) + + + Stretcher + 担架 + 擔架 + 担架 + Nosítka + Civière + Krankentrage + Barella + 들것 + Nosze + Носилки + Camilla + Sedye + Maca + Paarit + Brancard + + + Stretcher (Packed) + 担架 (折り畳み) + 擔架(打包) + 担架(打包) + Nosítka (Zabalená) + Civière (Emballée) + Krankentrage (Gepackt) + Barella (Imballo) + 들것 (포장되다) + Nosze (Zapakowane) + Носилки (упакованные) + Camilla (Plegada) + Sedye (Paketli) + Maca (Embalada) + Paarit (pakattu) + Brancard (verpakt) + + + Pack into bag + Spakuj jako torba + Verpak naar een tas + Empaquetar en bolsa + ランチャーとして畳む + + + Pack into backpack + Spakuj jako plecak + Verpak naar een rugzak + Empaquetar en mochila + バックパックとして畳む + + + Deploy Stretcher + Rozstaw nosze + Ontplooi brancard + Desplegar Camilla + 担架を展開する + + + Placing Stretcher... + Rozkładanie noszy... + Brancard wordt geplaatst + Colocando Camilla... + 担架を設置しています・・・ + + + Packing Stretcher... + Pakowanie noszy... + Brancard wordt verpakt + Empaquetando Camilla... + 担架を折り畳んでいます・・・ + + + KAT Helistretcher + KAT helibrancard + KAT Camilla de Helicóptero + KAT ヘリコプター用担架 + + + diff --git a/addons/misc/ui/downarrow.paa b/addons/stretcher/ui/downarrow.paa similarity index 100% rename from addons/misc/ui/downarrow.paa rename to addons/stretcher/ui/downarrow.paa diff --git a/addons/misc/ui/fliparrow.paa b/addons/stretcher/ui/fliparrow.paa similarity index 100% rename from addons/misc/ui/fliparrow.paa rename to addons/stretcher/ui/fliparrow.paa diff --git a/addons/misc/ui/stretcher.paa b/addons/stretcher/ui/stretcher.paa similarity index 100% rename from addons/misc/ui/stretcher.paa rename to addons/stretcher/ui/stretcher.paa diff --git a/addons/misc/ui/uparrow.paa b/addons/stretcher/ui/uparrow.paa similarity index 100% rename from addons/misc/ui/uparrow.paa rename to addons/stretcher/ui/uparrow.paa diff --git a/addons/misc/vehicle_stretcher.hpp b/addons/stretcher/vehicle_stretcher.hpp similarity index 82% rename from addons/misc/vehicle_stretcher.hpp rename to addons/stretcher/vehicle_stretcher.hpp index de8d52b69..2434507ad 100644 --- a/addons/misc/vehicle_stretcher.hpp +++ b/addons/stretcher/vehicle_stretcher.hpp @@ -23,3 +23,11 @@ class B_Heli_Transport_03_F: Heli_Transport_03_base_F { stretcherPos[] = {0,-0.4,-2.08}; stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; }; + +class LandVehicle; +class Car: LandVehicle {}; +class Car_F: Car {}; +class Quadbike_01_base_F: Car_F { + stretcherPos[] = {0,0.8,-0.56}; + stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; +}; diff --git a/addons/surgery/ACE_Medical_Treatment_Actions.hpp b/addons/surgery/ACE_Medical_Treatment_Actions.hpp index 1115934d3..da72a3a70 100644 --- a/addons/surgery/ACE_Medical_Treatment_Actions.hpp +++ b/addons/surgery/ACE_Medical_Treatment_Actions.hpp @@ -45,7 +45,7 @@ class ACE_Medical_Treatment_Actions { items[] = {"kat_plate"}; consumeItem = 1; condition = QUOTE([ARR_4(_medic,_patient,_bodyPart,3.5)] call FUNC(openReductionCheck)); - callbackSuccess = QFUNC(openReduction); + callbackSuccess = QUOTE([ARR_4(_medic,_patient,_bodyPart,false)] call FUNC(openReduction)); }; class Expose: BasicBandage { displayName = CSTRING(Retractor_Use); @@ -101,6 +101,20 @@ class ACE_Medical_Treatment_Actions { condition = QUOTE([ARR_4(_medic,_patient,_bodyPart,2.3)] call FUNC(openReductionCheck)); callbackSuccess = QUOTE([ARR_4(_medic,_patient,_bodyPart,2.3)] call FUNC(openReductionProgress)); }; + class ResetSurgery: CheckFracture { + displayName = CSTRING(Reset_Surgery); + displayNameProgress = CSTRING(perform); + category = "surgery"; + treatmentLocations = QGVAR(surgicalLocation); + allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; + allowSelfTreatment = 0; + medicRequired = QGVAR(surgicalAction_MedLevel); + treatmentTime = QGVAR(openTime); + items[] = {"ACE_surgicalKit"}; + consumeItem = 1; + condition = QUOTE(([ARR_4(_medic,_patient,_bodyPart,2)] call FUNC(openReductionCheck)) && (GVAR(enable_fracture))); + callbackSuccess = QUOTE([ARR_4(_medic,_patient,_bodyPart,true)] call FUNC(openReduction)); + }; class NPWT: BasicBandage { displayName = CSTRING(Vacuum_Use); displayNameProgress = CSTRING(Vacuum_Action); diff --git a/addons/surgery/functions/fnc_closedReductionLocal.sqf b/addons/surgery/functions/fnc_closedReductionLocal.sqf index 7eef9f9a2..9446413f6 100644 --- a/addons/surgery/functions/fnc_closedReductionLocal.sqf +++ b/addons/surgery/functions/fnc_closedReductionLocal.sqf @@ -32,7 +32,7 @@ if (_lidocaineCount <= 0.6 && _morphineCount <= 0.8 && _nalbuphineCount <= 0. [_patient, _pain] call ACEFUNC(medical_status,adjustPainLevel); }; -playsound3D [QPATHTOF_SOUND(sounds\reduction.wav), _patient, false, getPosASL _patient, 8, 1, 15]; +playSound3D [QPATHTOF_SOUND(sounds\reduction.wav), _patient, false, getPosASL _patient, 8, 1, 15]; if (random 100 < GVAR(closedReductionFailChance)) exitWith { private _output = LLSTRING(fracture_fail); diff --git a/addons/surgery/functions/fnc_openReduction.sqf b/addons/surgery/functions/fnc_openReduction.sqf index 90c6cc62e..b585e3562 100644 --- a/addons/surgery/functions/fnc_openReduction.sqf +++ b/addons/surgery/functions/fnc_openReduction.sqf @@ -17,6 +17,6 @@ * Public: No */ -params ["_medic", "_patient", "_bodyPart"]; +params ["_medic", "_patient", "_bodyPart", "_exit"]; -[QGVAR(openReduction), [_medic, _patient, _bodyPart], _patient] call CBA_fnc_targetEvent; +[QGVAR(openReduction), [_medic, _patient, _bodyPart, _exit], _patient] call CBA_fnc_targetEvent; diff --git a/addons/surgery/functions/fnc_openReductionLocal.sqf b/addons/surgery/functions/fnc_openReductionLocal.sqf index 2fd8a9c46..13f72e9f4 100644 --- a/addons/surgery/functions/fnc_openReductionLocal.sqf +++ b/addons/surgery/functions/fnc_openReductionLocal.sqf @@ -17,13 +17,27 @@ * Public: No */ -params ["_medic", "_patient", "_bodyPart"]; +params ["_medic", "_patient", "_bodyPart", "_exit"]; private _part = ALL_BODY_PARTS find toLower _bodyPart; private _activeFracture = GET_FRACTURES(_patient); private _fractureArray = _patient getVariable [QGVAR(fractures), [0,0,0,0,0,0]]; private _liveFracture = _fractureArray select _part; +if (_exit) exitWith { + if (_liveFracture < 2.5) then { + _liveFracture = 2; + } else { + _liveFracture = 3; + }; + + _fractureArray set [_part, _liveFracture]; + _patient setVariable [QGVAR(fractures), _fractureArray, true]; + + [_patient, true] call ACEFUNC(dragging,setCarryable); + [_patient, true] call ACEFUNC(dragging,setDraggable); +}; + if ((_liveFracture == 2.5) || (_liveFracture == 3.5)) exitWith { _liveFracture = 0; diff --git a/addons/surgery/stringtable.xml b/addons/surgery/stringtable.xml index 4ad7ae813..313d879da 100644 --- a/addons/surgery/stringtable.xml +++ b/addons/surgery/stringtable.xml @@ -17,6 +17,7 @@ Usando Käytetään С помощью + Gebruiken Pushing @@ -34,6 +35,7 @@ Administrando Työntää Принять + Toedienen %1 pushed %2 @@ -51,6 +53,7 @@ %1 administrou %2 %1 työnnettiin %2 %1 дал %2 + %1 diende %2 toe %1 injected %2 @@ -68,6 +71,7 @@ %1 injetou %2 %1 pistetään %2 %1 ввел %2 + %1 injecteerde %2 %1 used %2 @@ -85,6 +89,7 @@ %1 usou %2 %1 käytetty %2 %1 использовал %2 + %1 gebruikte %2 Patient's breath is harsh and metallic @@ -100,6 +105,7 @@ O hálito do paciente é áspero e metálico Potilaan hengitys on kovaa ja metallista Дыхание пациента резкое и металлическое + Patiënts adem is ruw en metallisch Patient's breath is harsh and metallic @@ -115,6 +121,7 @@ O hálito do paciente é áspero e metálico Potilaan hengitys on kovaa ja metallista Дыхание пациента резкое и металлическое + Patiënts adem is ruw en metallisch Patient's breath is slightly fruity @@ -130,6 +137,7 @@ O hálito do paciente é ligeiramente frutado Potilaan hengitys on hieman hedelmäistä Дыхание пациента слегка фруктовое + Patiënts adem is licht fruitig Patient's breath is ok @@ -145,6 +153,7 @@ O hálito do paciente é normal Potilaan hengitys on hyvä Дыхание пациента в норме + Patiënts adem is ok Perform Dialysis @@ -160,6 +169,7 @@ Realizar diálise Suorita dialyysi Провести диализ + Voer dialyse uit Performing @@ -175,6 +185,7 @@ Realizando Suorietaan Проведение + Wordt uitgevoerd Check Fracture @@ -190,6 +201,7 @@ Verificar fratura Tarkista murtuma Проверить переломы + Check fractuur Checking @@ -205,6 +217,7 @@ Verificando Tarkistetaan Проверка + Checking Perform Closed Reduction @@ -220,6 +233,7 @@ Realizar redução fechada Suorita suljettu pienennys Выполнить замкнутое сокращение + Voer gesloten reductie uit Perform Open Reduction @@ -235,6 +249,7 @@ Realizar redução aberta Suorita avoin pienennys Выполнить открытое сокращение + Voer open reductie uit %1 present on %2 @@ -250,6 +265,7 @@ %1 presente em %2 %1 läsnä %2 %1 присутствует на%2 + %1 aanwezig op %2 %1 %2 the fracture on the %3 @@ -265,6 +281,7 @@ %1 %2 a fratura sobre %3 %1 %2 murtuma %3 %1 %2 перелом на%3 + %1 %2 de breuk op %3 %1 made an incision on the %2 @@ -280,6 +297,7 @@ %1 fez uma incisão em %2 %1 teki viillon %2 %1 сделал надрез на %2 + %1 heeft een incisie gemaakt op %2 Surgical Action Failed @@ -295,6 +313,7 @@ Falha na ação cirúrgica Kirurginen toimenpide: epäonnistunut Хирургическое вмешательство не удалось + Chirurgische actie is gefaald Scalpel @@ -310,6 +329,7 @@ Bisturi Skalpelli Скальпель + Scalpel Used for creating incisions @@ -325,6 +345,7 @@ Usado para criar incisões e desbridar feridas Käytetään viiltojen tekemiseen Используется для создания разрезов + Wordt gebruikt om incisies te maken Perform Incision @@ -340,6 +361,7 @@ Realizar incisão Suorita viilto Выполнить разрез + Maak incisie Retractor @@ -355,6 +377,7 @@ Retrator Kelauslaite Втягивающее устройство + Retractor Used to expand and expose fractures @@ -370,6 +393,7 @@ Usado para expandir e expor fraturas Käytetään murtumien laajentamiseen ja paljastamiseen Используется для расширения и обнажения трещин + Wordt gebruikt om incisies te spreiden en fracturen vrij te leggen Expose Fracture @@ -385,6 +409,7 @@ Expor fratura Paljasta murtuma Раскрыть перелом + Leg fractuur vrij Exposing @@ -400,6 +425,7 @@ Expondo Paljastaminen Раскрытие + Vrijleggen Clamp @@ -415,6 +441,7 @@ Pinça Puristin Зажим + Klem Used to clamp comminuted fractures @@ -430,6 +457,7 @@ Usado para pinçar fraturas cominutivas Käytetään murtumien kiinnittämiseen Используется для фиксации оскольчатых переломов + Wordt gebruikt om verbrijzelde fracturen vast te klemmen Clamp Fracture @@ -445,6 +473,7 @@ Pinçar fratura Puristimen murtuma Зажать перелом + Klem fractuur vast Clamping @@ -460,6 +489,7 @@ Pinçando Kiinnitys Зажат + Vast klemmen Irrigate Wound @@ -475,6 +505,7 @@ Irrigar ferida Huuhtele haava Промыть рану + Irrigeer wond Irrigating @@ -490,6 +521,13 @@ Irrigando Kastelu Промывание + Irrigeren + + + Close Incision + Sluit incisie + Cerrar Incisión + 切開口を閉じる Bone Plate @@ -505,6 +543,7 @@ Placa de fixação óssea Luulevy Костная пластина + Botplaat Used to complete all complex fracture types @@ -520,6 +559,7 @@ Usado para corrigir todas as fraturas avançadas Käytetään viimeistelemään kaikki monimutkaiset fraktit Используется для завершения всех сложных типов трещин + Wordt gebruikt om alle complexe fracturen te voltooien Dressing Vacuum (NPWT) @@ -535,6 +575,7 @@ Curativo a vácuo Pukeutumistyhjiö Вакуумная повязка (NPWT) + Vacuümverband (NPWT) Used to completely dress and seal wounds @@ -550,6 +591,7 @@ Usado para enfaixar e selar feridas completamente Käytetään haavojen täydelliseen pukemiseen ja sulkemiseen Используется для полной перевязки и герметизации ран + Wordt gebruikt om alle wonden te dichten en verbinden Apply Vacuum Dressing @@ -565,6 +607,7 @@ Aplicar curativo a vácuo Levitä NPWT-sidosta Использовать NPWT + Vacuümverband aanleggen Applying @@ -580,6 +623,7 @@ Aplicando Hakeminen Использование + Wordt aangelegd Handheld Ultrasound @@ -588,6 +632,7 @@ 手持ち式超音波スキャナー Échographie portable Ultrassom Portátil + Mobiele echograaf Used to assess internal injuries @@ -596,6 +641,7 @@ 内損傷の評定に使用 Utilisé pour contrôlé les blessures internes Utilizado para verificar lesões internas + Wordt gebruikt om interne verwondingen te evalueren Conduct Ultrasound Assessment @@ -604,6 +650,7 @@ 超音波評定を実施 Effectuer une évaluation échographique Realizar verificação com ultrassom + Voer echo evaluatie uit Assessing @@ -612,6 +659,7 @@ 評定中 Evaluation Verificando + Aan het evalueren Airway Status: %1 @@ -620,6 +668,7 @@ 気道の状態: %1 Statut des voies aériennes : %1 Estado das vias aéreas: %1 + Luchtwegstatus: %1 Lung Status: %1 @@ -628,6 +677,7 @@ 肺の状態: %1 Statut des poumons :%1 Estado do pulmão: %1 + Longstatus: %1 Cardiac Status: %1 @@ -636,6 +686,7 @@ 心臓の状態: %1 Statut cardiaque :%1 Estado cardíaco: %1 + Cardiale status: %1 Normal @@ -644,6 +695,7 @@ 正常 Normal Normal + Normaal Pneumothorax @@ -652,6 +704,7 @@ 気胸 Pneumothorax Pneumotórax + Pneumothorax Hemopneumothorax @@ -660,6 +713,7 @@ 血気胸 Hémopneumothorax Hemotórax + Hemopneumothorax Tension Pneumothorax @@ -668,6 +722,7 @@ 緊張性気胸 Pneumothorax sous tension Pneumotórax Hipertensivo + Tensiepneumothorax Arrest - Shockable @@ -676,6 +731,7 @@ 心停止 - ショック可能 Arrêt cardiaque - Choquable Parada - Chocável + Hartstilstand - Schokbaar Arrest - Not Shockable @@ -684,6 +740,7 @@ 心停止 - ショック不要 Arrêt cardiaque - Non choquable Parada - Não Chocável + Hartstilstand - Niet schokbaar Tamponade @@ -692,6 +749,7 @@ タンポナーデ Tamponnade cardiaque Tamponado + Harttamponade REBOA Unit @@ -700,6 +758,7 @@ REBOAユニット Unité REBOA Unidade REBOA + ROBOA eenheid Used to block the aorta and prevent bleeding below the heart @@ -708,6 +767,7 @@ 大動脈を遮断し、心臓より下の出血を防ぐために使用される Utilisé pour bloquer l'aorte et empêcher le saignement en dessous du coeur Utilizada para bloquear a aorta e prevenir sangramento abaixo do coração + Wordt gebruikt om de aorta te blokkeren, en bloedingen onder het hart te stelpen Place REBOA Unit @@ -716,6 +776,7 @@ REBOAユニットを挿入 Placé l'unité REBOA Colocar Unidade REBOA + Plaats REBOA eenheid Placing @@ -724,6 +785,7 @@ 挿入中 Placement Colocando + Wordt geplaatst Advance REBOA Unit @@ -732,6 +794,7 @@ REBOAユニットを奥へ送る Avancer l'unité REBOA Avançar Unidade REBOA + Voer REBOA eenheid op Advancing @@ -740,6 +803,7 @@ 奥へと送っています Déplacement Avançando + Wordt opgevoerd Remove REBOA Unit @@ -748,6 +812,7 @@ REBOAユニットを抜去 Retirer l'unité REBOA Remover Unidade REBOA + Verwijder REBOA eenheid Removing @@ -756,6 +821,7 @@ 抜去中 Retrait Removendo + Wordt verwijderd REBOA @@ -764,6 +830,7 @@ REBOA REBOA REBOA + REBOA Pericardial Tap @@ -772,6 +839,7 @@ 心膜穿刺術 Péricardiocentèse Pericardiocentese + Pericard drainage Performing @@ -780,6 +848,7 @@ 施術中 Opération Realizando + Wordt uitgevoerd %1 performed a pericardial tap @@ -788,6 +857,7 @@ %1 が心膜穿刺を施術 %1 a effectué une péricardiocentèse %1 realizou uma pericardiocentese + %1 heeft een pericard drainage uitgevoerd Kidney damage/failure @@ -803,6 +873,7 @@ Dano/falha renal Munuaisvaurio/munuaisten vajaatoiminta Повреждение/недостаточность почек + Nierschade/-falen Enables kidney damage caused by overuse of saline @@ -818,6 +889,7 @@ Permite dano renal causado pelo uso excessivo de soro fisiológico Mahdollistaa suolaliuoksen liiallisen käytön aiheuttaman munuaisvaurion Предотвращает повреждение почек, вызванное чрезмерным употреблением физиологического раствора + Schakelt nierschade bij een te hoog gebruik saline in Time to perform dialysis @@ -833,6 +905,7 @@ Duração de diálise Dialyysin suorittamisen aika Время для проведения диализа + Tijd benodigd om dialyse uit te voeren Enables advanced fractures @@ -848,6 +921,7 @@ Permite fraturas avançadas Mahdollistaa pitkälle edenneet murtumat Включает расширенные переломы + Activeert geadvanceerde breuken Simple fracture chance @@ -863,6 +937,7 @@ Probabilidade de fratura simples Yksinkertainen murtuman mahdollisuus Вероятность простого перелома + Kans op een simpel fractuur Sets the chance for simple fractures. Also sets the chance for complex fractures (60% Simple = 40% Complex) @@ -878,6 +953,7 @@ Define a probabilidade de fraturas simples. Também estabelece a probabilidade de fraturas complexas (60% Simples - 40% Complexas) Asettaa mahdollisuuden yksinkertaisiin murtumiin. Asettaa myös mahdollisuuden monimutkaisiin murtumiin (60 % yksinkertainen = 40 % monimutkainen) Задает вероятность простых переломов. Также задает вероятность сложных переломов (60% простых = 40% сложных) + Bepaald de kans voor simpele fracturen. Bepaald ook de kans voor geadvanceerde fracturen (60% simpel = 40% geadvanceerd). Closed reduction fail chance @@ -892,6 +968,7 @@ Possibilità di fallimento di riduzione ortopedica chiusa Suljettu vähennys epäonnistuu Вероятность неудачи закрытой репозиции + Kans dat een gesloten reductie faalt Chance that closed reduction will fail. Default value 10% @@ -906,6 +983,7 @@ Probabilità che la riduzione ortopedica chiusa fallisca. Default 10% Mahdollisuus, että suljettu vähennys epäonnistuu. Oletusarvo 10 % Вероятность того, что закрытая репозиция завершится неудачей. Значение по умолчанию 10% + Kans dat een gesloten reductie faalt. Standaard waarde is 10% Compound fracture chance @@ -921,6 +999,7 @@ Probabilidade de fratura composta Yhdistelmämurtuman mahdollisuus Вероятность сложного перелома + Waarschijnlijkheid van een open fractuur Sets the chance for compound fractures. Also sets the chance for comminuted fractures (60% Compound = 40% Comminuted) @@ -936,6 +1015,7 @@ Define a probabilidade de fraturas compostas. Também estabelece a probabilidade de fraturas cominutivas (60% Composite - 40% Cominutive) Asettaa yhdistelmämurtumien mahdollisuuden. Asettaa myös murtumien mahdollisuuden (60 % yhdiste = 40 % hienonnettu) Задает вероятность сложных переломов. Также задает вероятность оскольчатых переломов (60% сложных = 40% оскольчатых) + Bepaald de kans voor open botbreuken. Bepaald ook de kans op een verbrijzeld fractuur vast (60% open = 40% verbrijzeld) Etomidate cycle timer @@ -951,6 +1031,7 @@ Tempo de ciclo do Etomidato Etomidaattisyklin ajastin Таймер цикла Этомидации + Etomidaat cyclus timer Determines how long each dose of etomidate stays in a patient @@ -966,6 +1047,7 @@ Determina a duração de cada dose de Etomidato no paciente Määrittää, kuinka kauan kukin etomidaattiannos pysyy potilaassa Определяет, как долго каждая доза Этомидата остается в организме пациента + Bepaald hoe lang elke dosis etomidaat in een patiënt blijft Closed Reduction Time @@ -981,6 +1063,7 @@ Duração de reduções fechadas Suljettu vähennysaika Время закрытой репозиции + Benodigde tijd om een gesloten reductie uit te voeren Open Reduction Time @@ -996,6 +1079,7 @@ Duração de reduções abertas Avoin vähennysaika Время открытой репозиции + Benodigde tijd om een open reductie uit te voeren Surgical Action Time @@ -1011,6 +1095,7 @@ Duração de ações cirúrgicas Kirurgisen toiminnan aika Время хирургического вмешательства + Benodigde tijd om een chirurgische actie uit te voeren Perform Incision Time @@ -1026,6 +1111,7 @@ Duração de incisões Suorita viiltoaika Время выполнения разреза + Benodigde tijd om een incisie te maken Breath Check Time @@ -1041,6 +1127,7 @@ Duração da verificação de hálito Hengityksen tarkistusaika Время проверки дыхания + Benodigde tijd om ademhaling te controleren Time to perform intermediate actions @@ -1056,6 +1143,7 @@ Duração de ações intermediárias Aika suorittaa välitoimia Время для выполнения промежуточных действий + Benodigde tijd om tussenliggende acties uit te voeren Sets how long it takes to perform intermediate surgical actions such as exposing and irrigation @@ -1071,6 +1159,7 @@ Estabelece quanto tempo leva para realizar ações cirúrgicas, como expor ou irrigar. Asettaa, kuinka kauan kirurgisten välitoimenpiteiden, kuten valotuksen ja kastelun, suorittaminen kestää Устанавливает, сколько времени требуется для выполнения промежуточных хирургических действий, таких как раскрытие и орошение + Bepaald hoe lang het doet om tussentijdse chirurgische acties uit te voeren, zoals het vrijleggen en irrigeren van een fractuur Fracture Check Time @@ -1086,6 +1175,7 @@ Duração da análise de fratura Murtuman tarkistusaika Время проверки перелома + Benodigde tijd om een fractuur te controleren Allow Check Fracture @@ -1101,6 +1191,7 @@ Nível médico necessário para analisar a fratura de alguém Salli murtuman tarkistaminen Разрешить проверку перелома + Benodigde training om een fractuur te controleren Allow Closed Reduction @@ -1116,6 +1207,7 @@ Nível médico necessário para realizar uma redução fechada Salli suljettu pienennys Разрешить закрытую репозицию + Benodigde training om een gesloten reductie uit te voeren Allow Surgery @@ -1131,54 +1223,91 @@ Nível médico exigido para realizar uma ação cirúrgica Salli leikkaus Разрешить хирургическое вмешательство + Benodigde training om chirurgische acties uit te voeren - Allow Reboa + Allow REBOA REBOAの許可 + Benodigde Training om een REBOA toe te dienen + Niveau médical requis pour le REBOA + Permitir REBOA Locations for REBOA REBOAが使用できる場所 + Locaties waar een REBOA toegediend kan worden + Emplacements du REBOA + Zonas para REBOA Time to perform REBOA actions REBOA各動作の所要時間 + Benodigde tijd om REBOA acties uit te voeren + Temps nécessaire pour effectuer les actions du REBOA + Tiempo para realizar acciones de REBOA - Sets how long it takes to perform REBOA actions (Placing, advancing, Removing) + Sets how long it takes to perform REBOA actions (Placing, Advancing, Removing) REBOAの各動作(挿入、前進、抜去)にかかる時間を設定します + Bepaald hoe lang het duurt om REBOA acties uit te voeren (Plaatsen, doorvoeren en verwijderen) + Défini le temps nécessaire pour effectuer les actions du REBOA (placement, avancée, retrait) + Establece cuanto tiempo lleva realizar las acciones de REBOA (Colocar, Avanzar, Quitar) Allow Ultrasound 超音波スキャナーの許可 + Benodigde training voor gebruik mobiele echograaf + Niveau médical requis pour effectuer un ultrason + Permitir Ultrasonido Locations for Ultrasound 超音波スキャナーが使用できる場所 + Locaties waar een mobiele echograaf gebruikt kan worden + Emplacements de l'ultrason + Zonas para Ultrasonido Time to perform Ultrasound actions 超音波スキャナーの所要時間 + Benodigde tijd voor het gebruik van een mobiele echograaf + Temps nécessaire pour effectuer les actions de l'ultrason + Tiempo para realizar acciones de Ultrasonidos Sets how long it takes to perform an ultrasound exam 超音波スキャナーの動作にかかる時間を設定します + Bepaald hoe lang het gebruik van een mobiele echograaf duurt + Défini le temps nécessaire pour effectuer une examination à l'ultrason + Establece cuánto tiempo lleva realizar un examen de Ultrasonidos Allow Pericardial Tap 心膜穿刺術の許可 + Benodigde training voor pericardiale drainage + Niveau médical requis pour le prélèvement péricardique + Permitir realizar Pericardiocentesis Locations for Pericardial Tap 心膜穿刺術が使用できる場所 + Locaties waar een pericardiale drainage uitgevoerd kan worden + Emplacements du prélèvement péricardique + Zonas para Pericardiocentesis Time to perform Pericardial Tap 心膜穿刺術の所要時間 + Benodigde tijd om een pericard drainage uit te voeren + Temps nécessaire pour effectuer le prélèvement péricardique + Tiempo para realizar Pericardiocentesis - Sets how long it takes to perform a pericardial tap + Sets how long it takes to perform a Pericardial Tap 心膜穿刺術にかかる時間を設定します + Bepaald hoe lang het uitvoeren van een pericard drainage duurt + Défini le temps nécessaire pour effectuer le prélèvement péricardique + Establece cuanto tiempo lleva realizar una Pericardiocentesis Allow Breath Check @@ -1194,6 +1323,7 @@ Nível médico necessário para analisar a o hálito Salli tarkistaa hengitys Разрешить проверку дыхания + Benodigde training om de adem te kunnen controleren Allow NPWT @@ -1203,6 +1333,7 @@ Permitir NPWT Autoriser le NPWT Permitir curativo a vácuo + Benodigde training voor het gebruik van een vacuümverband Locations NPWT @@ -1212,6 +1343,7 @@ Localizaciones para NPWT Lieux du NPWT Locais para curativo a vácuo + Locaties waar een vacuümverband aangelegd kan worden Locations Closed Reduction @@ -1227,6 +1359,7 @@ Locação para reduções fechadas Suljettujen paikkojen vähennys Места закрытых репозиций + Locaties waar een gesloten reductie uitgevoerd kan worden Locations Surgery @@ -1242,6 +1375,7 @@ Locação para reduções abertas/cirúrgicas Paikkakirurgia Места проведения операции + Locaties waar chirurgische acties uitgevoerd kan worden Allow self check fracture @@ -1257,6 +1391,7 @@ Permitir verificar as próprias fraturas Salli itsetarkastuksen murtuma Разрешить самому проверить перелом + Sta zelfcontrole van fracturen toe exposed @@ -1272,6 +1407,7 @@ exposto(a) paljastettu подвергнутый + Vrijgelegd irrigated @@ -1287,6 +1423,7 @@ irrigado(a) Kasteltu орошаемый + Geïrrigeerd clamped @@ -1302,6 +1439,7 @@ pinçado(a) Kiinnitetty защемленный + Vastgeklemd Comminuted Fracture @@ -1317,6 +1455,7 @@ Fratura cominutiva Hienonnettu murtuma Оскольчатый перелом + Verbrijzeld fractuur Compound Fracture @@ -1332,6 +1471,7 @@ Fratura composta Avomurtuma Сложный перелом + Open fractuur Simple Fracture @@ -1347,6 +1487,7 @@ Fratura simples Yksinkertainen murtuma Простой перелом + Simpel fractuur Apply NPWT Dressing Time @@ -1362,6 +1503,7 @@ Duração do aplique de curativo a vácuo Levitä NPWT-sidos tu Время, необходимое для нанесения вакуумной повязки (NPWT) + Benodigde tijd om een vacuümverband aan te leggen Surgical actions Settings @@ -1377,6 +1519,7 @@ Configurações de ações cirúrgicas Kirurgisten toimien asetukset Настройки хирургических действий + Instellingen voor chirurgische acties Fractures Settings @@ -1392,6 +1535,7 @@ Configurações de fraturas Murtumien asetukset Настройки переломов + Instellingen voor fracturen Kidney Settings @@ -1407,6 +1551,7 @@ Configurações do rim Munuaisten asetukset Настройки почек + Instellingen voor nieren Dressing Vacuum (NPWT) Settings @@ -1416,6 +1561,7 @@ Opciones para Vendado de Vacío (NPWT) Paramètres du pansement sous vide (NPWT) Configurações do curativo a vácuo + Vacuümverband instellingen [KAM] Surgery Box @@ -1430,6 +1576,7 @@ [KAM] Caja quirurgica [KAM] Leikkauslaatikko [КАМ] Хирургический бокс + [KAM] Chirurgiedoos Surgery Consciousness Controls @@ -1441,6 +1588,7 @@ Controles de consciência durante a cirurgia Kirurginen tajunta Контроль сознания во время операции + Operatie bewustzijninstellingen Surgery Causes Unconsciousness: Surgery without anesthesia and sedation results in unconsciousness from CA. \nUnconsciousness Required for Surgery: Surgery requires patient to be unconscious. \nNo Unconsciousness from Surgery: Surgery doesn't induce unconsciousness, causes pain. \nSurgery Anesthesia: Patient stays awake during surgery if given Etomidate, if not they will go into CA. @@ -1452,6 +1600,7 @@ A cirurgia causa inconsciência: A cirurgia sem anestesia e sedação resulta em inconsciência. \nInconsciência necessária para a cirurgia: A cirurgia requer que o paciente esteja inconsciente. \nSem inconsciência por cirurgia: A cirurgia não induz inconsciência, causa dor. \nAnestesia cirúrgica: O paciente permanece acordado durante a cirurgia se receber etomidato. Leikkaus aiheuttaa tajuttomuuden: leikkaus ilman anestesiaa ja sedaatiota johtaa tajuttomuuteen sydämenpysähdyksestä. \nLeikkaukseen tarvitaan tajuttomuus: leikkaus ei aiheuta tajuttomuutta, aiheuttaa kipua. \nLeikkauksen anestesia: Potilas pysyy hereillä leikkauksen aikana, jos hänelle annetaan etomidaattia, jos ei, hän menettää sydämenpysähdyksen. Операция вызывает потерю сознания: операция без анестезии или седативного средства приводит к потере сознания из-за остановки сердца. \nбессознательное состояние, необходимое для операции: операция требует, чтобы пациент был без сознания. \nнет бессознательного состояния из-за операции: операция не вызывает бессознательного состояния, она вызывает боль. \nхирургическая анестезия: пациент не спит во время операции, если ему вводят этомидат. + Operatie veroorzaakt bewustzijnsverlies: Operaties zonder anesthesie en sedatie lijdt tot bewustzijnsverlies door hartstilstand. \n Bewusteloosheid benodigd voor operatie: Operaties vereisen dat de patiënt bewusteloos is. \n Geen bewustzijnsverlies door operaties: Operaties lijden niet tot bewustzijnsverlies, maar veroorzaken pijn. \n Operatie met anesthesie: Patiënt blijft wakker tijdens de operatie als etomidaat gegeven is, anders lijdt de operatie tot een hartstilstand. Surgery Causes Unconsciousness @@ -1463,6 +1612,7 @@ A cirurgia causa inconsciência Leikkaus aiheuttaa tajuttomuuden Хирургическое вмешательство приводит к потере сознания + Operatie veroorzaakt bewustijnsverlies Unconsciousness Required for Surgery @@ -1474,6 +1624,7 @@ Inconsciência necessária para a cirurgia Leikkaukseen tarvitaan tajuttomuus Потеря сознания, необходимая для хирургического вмешательства + Bewusteloosheid No Unconsciousness from Surgery @@ -1485,9 +1636,11 @@ Inconsciência não necessária para a cirurgia Ei tajuttomuutta leikkauksesta После операции никто не теряет сознание + Geen Bewustzijnsverlies door operaties Surgery Anesthesia + 手术麻醉 手術を麻酔下で行う Anestesia quirúrgica Anesthésie chirurgicale @@ -1496,6 +1649,7 @@ Anestesia cirúrgica Leikkauksen anestesia Хирургическая анестезия + Operatie met anesthesie diff --git a/addons/vitals/$PBOPREFIX$ b/addons/vitals/$PBOPREFIX$ new file mode 100644 index 000000000..49f81db89 --- /dev/null +++ b/addons/vitals/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\vitals \ No newline at end of file diff --git a/addons/vitals/CfgEventHandlers.hpp b/addons/vitals/CfgEventHandlers.hpp new file mode 100644 index 000000000..4551ce282 --- /dev/null +++ b/addons/vitals/CfgEventHandlers.hpp @@ -0,0 +1,20 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + disableModuload = "true"; + }; +}; + +class Extended_Init_EventHandlers { + class CAManBase { + class ADDON { + init = QUOTE([ARR_2((_this select 0),false)] call FUNC(init)); + }; + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/vitals/CfgFunctions.hpp b/addons/vitals/CfgFunctions.hpp new file mode 100644 index 000000000..9797e53ea --- /dev/null +++ b/addons/vitals/CfgFunctions.hpp @@ -0,0 +1,21 @@ +class CfgFunctions { + class overwrite_ace_medical_status { + tag = "ace_medical_status"; + class ace_medical_status { + class hasStableVitals { + file = QPATHTOF(functions\fnc_hasStableVitals.sqf); + }; + class addMedicationAdjustment { + file = QPATHTOF(functions\fnc_addMedicationAdjustment.sqf); + }; + }; + }; + class overwrite_ace_medical_vitals { + tag = "ace_medical_vitals"; + class ace_medical_vitals { + class handleUnitVitals { + file = QPATHTOF(functions\fnc_handleUnitVitals.sqf); + }; + }; + }; +}; diff --git a/addons/vitals/XEH_PREP.hpp b/addons/vitals/XEH_PREP.hpp new file mode 100644 index 000000000..df304c6e8 --- /dev/null +++ b/addons/vitals/XEH_PREP.hpp @@ -0,0 +1,10 @@ +PREP(addMedicationAdjustment); +PREP(handleUnitVitals); +PREP(handleSimpleVitals); +PREP(handleCardiacFunction); +PREP(handleTemperatureFunction); +PREP(handleRespawn); +PREP(handleOxygenFunction); +PREP(hasStableVitals); +PREP(init); +PREP(updateOpioidEffect); \ No newline at end of file diff --git a/addons/vitals/XEH_postInit.sqf b/addons/vitals/XEH_postInit.sqf new file mode 100644 index 000000000..b98c22217 --- /dev/null +++ b/addons/vitals/XEH_postInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +[QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler; diff --git a/addons/vitals/XEH_preInit.sqf b/addons/vitals/XEH_preInit.sqf new file mode 100644 index 000000000..1f942547e --- /dev/null +++ b/addons/vitals/XEH_preInit.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#define CBA_SETTINGS_CAT "KAT - ADV Medical: Vitals" + +[ + QGVAR(simpleMedical), + "CHECKBOX", + LLSTRING(SIMPLEMED_ENABLE), + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [false], + true +] call CBA_Settings_fnc_init; + +ADDON = true; diff --git a/addons/vitals/config.cpp b/addons/vitals/config.cpp new file mode 100644 index 000000000..87fc7dfe7 --- /dev/null +++ b/addons/vitals/config.cpp @@ -0,0 +1,33 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + units[] = {}; + weapons[] = {}; + magazines[] = {}; + requiredAddons[] = { + "ace_medical", + "ace_medical_ai", + "ace_medical_blood", + "ace_medical_damage", + "ace_medical_engine", + "ace_medical_feedback", + "ace_medical_gui", + "ace_medical_statemachine", + "ace_medical_status", + "ace_medical_treatment", + "ace_medical_vitals", + "ace_dogtags", + "cba_settings" + }; + author = "Mazinski"; + authors[] = {"Mazinski"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFunctions.hpp" \ No newline at end of file diff --git a/addons/vitals/functions/fnc_addMedicationAdjustment.sqf b/addons/vitals/functions/fnc_addMedicationAdjustment.sqf new file mode 100644 index 000000000..47b3a4cf9 --- /dev/null +++ b/addons/vitals/functions/fnc_addMedicationAdjustment.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: BaerMitUmlaut, PabstMirror + * Adds a medication and it's effects + * + * Arguments: + * 0: The Unit + * 1: Medication + * 2: Time in system for the adjustment to reach its peak + * 3: Duration the adjustment will have an effect + * 4: Heart Rate Adjust + * 5: Pain Suppress Adjust + * 6: Flow Adjust + * + * Return Value: + * None + * + * Example: + * [player, "Morphine", 120, 60, -10, 0.8, -10] call ace_medical_status_fnc_addMedicationAdjustment + * + * Public: No + */ +params ["_unit", "_medication", "_timeToMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust", "_alphaFactor", "_opioidAdjust"]; +TRACE_7("addMedicationAdjustment",_unit,_medication,_timeToMaxEffect,_maxTimeInSystem,_hrAdjust,_painAdjust,_flowAdjust); + +if (_maxTimeInSystem <= 0) exitWith { WARNING_1("bad value for _maxTimeInSystem - %1",_this); }; +_timeToMaxEffect = _timeToMaxEffect max 1; + + +private _adjustments = _unit getVariable [VAR_MEDICATIONS, []]; + +_adjustments pushBack [_medication, CBA_missionTime, _timeToMaxEffect, _maxTimeInSystem, _hrAdjust, _painAdjust, _flowAdjust, _alphaFactor, _opioidAdjust]; + +_unit setVariable [VAR_MEDICATIONS, _adjustments, true]; diff --git a/addons/vitals/functions/fnc_handleCardiacFunction.sqf b/addons/vitals/functions/fnc_handleCardiacFunction.sqf new file mode 100644 index 000000000..c23341803 --- /dev/null +++ b/addons/vitals/functions/fnc_handleCardiacFunction.sqf @@ -0,0 +1,71 @@ +#include "..\script_component.hpp" +/* + * Author: Glowbal, Mazinski + * Update heart rate + + * Arguments: + * 0: The Unit + * 1: Heart Rate Adjustments + * 2: Heart Rate Target + * 3: Blood Volume + * 4: Time since last update + * 5: Sync value? + * + * ReturnValue: + * Current Heart Rate + * + * Example: + * [player, 0, 80, 6, 1, false] call kat_vitals_handleCardiacFunction; + * + * Public: No + */ + +params ["_unit", "_hrTargetAdjustment", "_hrTarget", "_bloodVolume", "_deltaT", "_syncValue"]; + +#define HEART_RATE_CO2_MULTIPLIER 60 +#define CO2_TO_DEMAND_DIVISOR 37894.7367424 +#define BLOOD_VOLUME_TO_STROKE_DIVISOR 3789.47371 +#define DEFAULT_STROKE_VOLUME 0.001583333323 + +private _actualHeartRate = _hrTarget; +private _actualReturn = 0; + +if IN_CRDC_ARRST(_unit) then { + if (alive (_unit getVariable [QEGVAR(medical,CPR_provider), objNull])) then { + if (_actualHeartRate == 0) then { _syncValue = true }; // always sync on large change + _actualHeartRate = random [100, 110, 120]; + } else { + if (_actualHeartRate != 0) then { _syncValue = true }; // always sync on large change + _actualHeartRate = 0 + }; +} else { + private _painLevel = GET_PAIN_PERCEIVED(_unit); + + // Adjustments and Pain Levels are taken off of last cycle HR to prevent any spiraling vitials + private _lastCycleHeartRate = GET_HEART_RATE(_unit) - _hrTargetAdjustment - (10 * _painLevel); + private _lastCycleCO2 = _lastCycleHeartRate * HEART_RATE_CO2_MULTIPLIER; + private _demandReturn = _lastCycleCO2 / CO2_TO_DEMAND_DIVISOR; + private _strokeVolume = (_bloodVolume / BLOOD_VOLUME_TO_STROKE_DIVISOR); + + // As HR increases, pressure is taken off decreasing stroke volume. However, this effect decreases at higher heart rates and lower SVs + private _strokeVolumeDifference = [ _strokeVolume / (DEFAULT_STROKE_VOLUME * 0.66), DEFAULT_STROKE_VOLUME / _strokeVolume ] select (DEFAULT_STROKE_VOLUME / _strokeVolume < 1.22); + private _volumeSupportHR = DEFAULT_HEART_RATE * _strokeVolumeDifference; + _strokeVolume = _strokeVolume * _strokeVolumeDifference; + + // Model HR driven by demandReturn divided by stroke volume with pressure applied by volume shortage. 40 point baseline applied to keep movements more stable + private _modelHeartRate = 40 + ((_demandReturn / _strokeVolume) / 2) + (_volumeSupportHR - DEFAULT_HEART_RATE); + + // Actual Heart Rate increases stepwise under the target model + _actualHeartRate = switch (true) do { + case (_modelHeartRate > _lastCycleHeartRate): { (_lastCycleHeartRate + (1 * _deltaT)) min _modelHeartRate }; + case (_modelHeartRate < _lastCycleHeartRate): { (_lastCycleHeartRate - (1 * _deltaT)) max _modelHeartRate }; + default { _modelHeartRate }; + }; + + // All additional adjustments are added back + _actualHeartRate = _actualHeartRate + _hrTargetAdjustment + (10 * _painLevel); +}; + +_unit setVariable [VAR_HEART_RATE, _actualHeartRate, _syncValue]; + +_actualHeartRate \ No newline at end of file diff --git a/addons/vitals/functions/fnc_handleOxygenFunction.sqf b/addons/vitals/functions/fnc_handleOxygenFunction.sqf new file mode 100644 index 000000000..2ff90dfcc --- /dev/null +++ b/addons/vitals/functions/fnc_handleOxygenFunction.sqf @@ -0,0 +1,95 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Updates the respiratory variables + * + * Arguments: + * 0: The Unit + * 1: Heart Rate + * 2: Anerobic Pressure + * 3: Blood Gas Array + * 4: Temperature + * 5: Barometric Pressure + * 6: Opioid Depression + * 7: Time since last update + * 8: Sync value? + * + * ReturnValue: + * Current O2 Saturation + * + * Example: + * [player, 80, 0.8, [40,90,0.96,24,7.4], 37, 760, 0, 1, true] call kat_vitals_fnc_handleOxygenFunction; + * + * Public: No + */ + +params ["_unit", "_actualHeartRate", "_anerobicPressure", "_bloodGas", "_temperature", "_baroPressure", "_opioidDepression", "_deltaT", "_syncValues"]; + +#define MAXIMUM_RR 40 +#define HEART_RATE_CO2_MULTIPLIER 60 +#define MINIMUM_VENTILATION 2000 +#define PACO2_MAX_CHANGE 0.05 +#define PAO2_MAX_CHANGE 0.1 +#define DEFAULT_FIO2 0.21 + +private _respiratoryRate = 0; +private _demandVentilation = 0; +private _actualVentilation = 0; +private _previousCyclePaco2 = (_bloodGas select 0); +private _previousCyclePao2 = (_bloodGas select 1); + +if (IN_CRDC_ARRST(_unit)) then { + // When in arrest, there should be no effecive breaths but still a minimum O2 demand. Zero O2 demand would mean a dead patient. Actual ventilation is 1 to prevent issues in the gas tension functions + _demandVentilation = MINIMUM_VENTILATION; + _respiratoryRate = 0; + _actualVentilation = 1; +} else { + // Ventilatory Demand comes from Heart Rate with increase demand from PaCO2 levels + _demandVentilation = ((((_actualHeartRate * HEART_RATE_CO2_MULTIPLIER) / _anerobicPressure) + ((_previousCyclePaco2 - DEFAULT_PACO2) * 200)) max MINIMUM_VENTILATION); + private _tidalVolume = GET_KAT_SURFACE_AREA(_unit); + + // Respiratory Rate is supressed by Opioids + _respiratoryRate = [((_demandVentilation / _tidalVolume) - (_opioidDepression * 10)) min MAXIMUM_RR, 20] select (_unit getVariable [QEGVAR(breathing,BVMInUse), false]); + _actualVentilation = _tidalVolume * _respiratoryRate; +}; + +// The greater the imbalance between CO2 explusion and O2 intake, the higher PaCO2 gets +private _paco2 = if ((_demandVentilation / _actualVentilation) == 1) then { _previousCyclePaco2 + (PACO2_MAX_CHANGE min (-PACO2_MAX_CHANGE max ((DEFAULT_PACO2 + ((_anerobicPressure max 1) - 1) * 150) - _previousCyclePaco2))) } else { [ _previousCyclePaco2 - (PACO2_MAX_CHANGE * _deltaT), _previousCyclePaco2 + (PACO2_MAX_CHANGE * _deltaT)] select ((_demandVentilation / _actualVentilation) > 0) }; +// Generated ETCO2 quadratic. Ensures ETCO2 moves with Respiratory Rate and is constantly below PaCO2 +private _etco2 = [((_paco2 - 3) - ((-0.0416667 * (_respiratoryRate^2)) + (3.09167 * (_respiratoryRate)) - DEFAULT_ETCO2) max 10), 0] select (IN_CRDC_ARRST(_unit)); + +private _externalPh = 0; +private _pH = 7.4; + +if (EGVAR(pharma,kidneyAction)) then { + // Extenal pH impacts from saline is included + _externalPh = _unit getVariable [QEGVAR(pharma,externalPh), 0]; + + // pH is from the Henderson-Hasselbalch equation + _pH = (6.1 + log(24 / ((0.03 - 0.001 * (_temperature - DEFAULT_TEMPERATURE)) * _paco2))) - ((_externalPh max 1) / 2000); +}; + +// Fractional Oxygen when breathing normal air is 0.21, 1 when breathing 100% Oxygen, and 0 when no air is being brought into the lungs +private _fio2 = switch (true) do { + case ((_unit getVariable [QEGVAR(airway,occluded), false]) || (_unit getVariable [QEGVAR(airway,obstruction), false])): { 0 }; + case ((_unit getVariable [QEGVAR(chemical,airPoisoning), false]) || (_unit getVariable [QEGVAR(breathing,tensionpneumothorax), false]) || (_unit getVariable [QEGVAR(breathing,hemopneumothorax), false])): { 0 }; + case (_unit getVariable [QEGVAR(breathing,oxygenTankConnected), false]): { 1 }; + default { DEFAULT_FIO2 }; +}; + +// Alveolar Gas equation. PALVO2 is largely impacted by Barometric Pressure and FiO2 +private _pALVo2 = ((_fio2 * (_baroPressure - 47)) - (_paco2 / _anerobicPressure)) max 1; + +// PaO2 cannot be higher than PALVO2 and comes from ventilation shortage multipled by RBC volume +private _pao2 = (DEFAULT_PAO2 - ((DEFAULT_ECB / ((GET_BODY_FLUID(_unit) select 0) max 100)) * ((_demandVentilation - _actualVentilation) / 120))) min _pALVo2; + +// PaO2 moves in controlled steps to prevent hard movements when Ventilation Demand spikes +_pao2 = if (_previousCyclePao2 != _pao2) then { ([ _previousCyclePao2 - (PAO2_MAX_CHANGE * _deltaT) , _previousCyclePao2 + (PAO2_MAX_CHANGE * _deltaT)] select ((_previousCyclePao2 - _pao2) < 0)) } else { _pao2 }; + +// Oxy-Hemo Dissociation Curve, driven by PaO2 with shaping done by pH +private _o2Sat = ((_pao2 max 1)^2.7 / ((25 - (((_pH / DEFAULT_PH) - 1) * 150))^2.7 + _pao2^2.7)) min 0.999; + +_unit setVariable [VAR_BREATHING_RATE, _respiratoryRate, _syncValues]; +_unit setVariable [VAR_BLOOD_GAS, [_paco2, _pao2, _o2Sat, 24, _pH, _etco2], _syncValues]; + +_o2Sat * 100 diff --git a/addons/vitals/functions/fnc_handleRespawn.sqf b/addons/vitals/functions/fnc_handleRespawn.sqf new file mode 100644 index 000000000..9b7280d2f --- /dev/null +++ b/addons/vitals/functions/fnc_handleRespawn.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Local callback for fully healing a patient. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_vitals_fnc_handleRespawn + * + * Public: No + */ + +params ["_patient"]; + +if (!(isPlayer _unit) && GVAR(simpleMedical)) then { _patient setVariable [QGVAR(simpleMedical), true, true] }; \ No newline at end of file diff --git a/addons/vitals/functions/fnc_handleSimpleVitals.sqf b/addons/vitals/functions/fnc_handleSimpleVitals.sqf new file mode 100644 index 000000000..4903a9b14 --- /dev/null +++ b/addons/vitals/functions/fnc_handleSimpleVitals.sqf @@ -0,0 +1,121 @@ +#include "..\script_component.hpp" +/* + * Author: Glowbal, Mazinski + * Updates the vitals for simple AI. Called from the statemachine's onState functions. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Update Ran (at least 1 second between runs) + * + * Example: + * [player] call kat_vitals_fnc_handleSimpleVitals; + * + * Public: No + */ + +params ["_unit"]; + +private _lastTimeUpdated = _unit getVariable [QACEGVAR(medical_vitals,lastTimeUpdated), 0]; +private _deltaT = (CBA_missionTime - _lastTimeUpdated) min 10; +if (_deltaT < 1) exitWith { false }; // state machines could be calling this very rapidly depending on number of local units + +BEGIN_COUNTER(Vitals); + +_unit setVariable [QACEGVAR(medical_vitals,lastTimeUpdated), CBA_missionTime]; +private _lastTimeValuesSynced = _unit getVariable [QACEGVAR(medical_vitals,lastMomentValuesSynced), 0]; +private _syncValues = (CBA_missionTime - _lastTimeValuesSynced) >= (10 + floor(random 10)); + +if (_syncValues) then { + _unit setVariable [QACEGVAR(medical_vitals,lastMomentValuesSynced), CBA_missionTime]; +}; + +//Get Blood Loss and Blood Volume from previous cycle +private _bloodVolume = GET_SIMPLE_BLOOD_VOLUME(_unit); +private _woundBloodLoss = GET_WOUND_BLEEDING(_unit); + +private _bloodVolume = _bloodVolume - (_woundBloodLoss / 100); +_unit setVariable [VAR_BLOOD_VOL, _bloodVolume, _syncValues]; + +private _inPain = GET_PAIN_PERCEIVED(_unit) > 0; +if !(_inPain isEqualTo IS_IN_PAIN(_unit)) then { + _unit setVariable [VAR_IN_PAIN, _inPain, true]; +}; + +// Get Medication Adjustments: +private _hrTargetAdjustment = 0; +private _painSupressAdjustment = 0; +private _adjustments = _unit getVariable [VAR_MEDICATIONS,[]]; + +if !(_adjustments isEqualTo []) then { + private _deleted = false; + { + _x params ["_medication", "_timeAdded", "_timeTillMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust", "_alphaFactor"]; + private _timeInSystem = CBA_missionTime - _timeAdded; + if (_timeInSystem >= _maxTimeInSystem) then { + _deleted = true; + _adjustments set [_forEachIndex, objNull]; + } else { + private _effectRatio = (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + if (_hrAdjust != 0) then { _hrTargetAdjustment = _hrTargetAdjustment + _hrAdjust * _effectRatio; }; + if (_painAdjust != 0) then { _painSupressAdjustment = _painSupressAdjustment + _painAdjust * _effectRatio; }; + }; + } forEach _adjustments; + + if (_deleted) then { + _unit setVariable [VAR_MEDICATIONS, _adjustments - [objNull], true]; + _syncValues = true; + }; +}; + +private _heartRate = [_unit, _hrTargetAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updateHeartRate); //Rename +[_unit, _painSupressAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updatePainSuppress); //Leave alone + +private _bloodPressure = [120,80]; +_unit setVariable [VAR_BLOOD_PRESS, _bloodPressure, _syncValues]; + +// Statements are ordered by most lethal first. +switch (true) do { + case (IN_CRDC_ARRST(_unit)): {}; // if in cardiac arrest just break now to avoid throwing unneeded events + case (_heartRate < 20 || {_heartRate > 220}): { + TRACE_2("heartRate Fatal",_unit,_heartRate); + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodVolume < 5): { + TRACE_2("bloodVolume Fatal",_unit,_heartRate); + [QACEGVAR(medical,Bleedout), _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 [QACEGVAR(medical_vitals,nextCheckCriticalHeartRate), 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 [QACEGVAR(medical_vitals,nextCheckCriticalHeartRate), CBA_missionTime + 5]; + }; + if (_enterCardiacArrest) then { + TRACE_2("Heart rate critical. Cardiac arrest",_unit,_heartRate); + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + } else { + TRACE_2("Heart rate critical. Critical vitals",_unit,_heartRate); + [QACEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + }; + case (_inPain): { + [QACEGVAR(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(_woundBloodLoss * 1000) / 1000, round((_woundBloodLoss / (0.001 max _cardiacOutput)) * 100) / 100, round(_heartRate), _bloodPressure, round(_painLevel * 100) / 100]; +}; +#endif + +END_COUNTER(Vitals); + +//placed outside the counter as 3rd-party code may be called from this event +[QACEGVAR(medical,handleUnitVitals), [_unit, _deltaT]] call CBA_fnc_localEvent; + +true \ No newline at end of file diff --git a/addons/vitals/functions/fnc_handleTemperatureFunction.sqf b/addons/vitals/functions/fnc_handleTemperatureFunction.sqf new file mode 100644 index 000000000..2d00d6a83 --- /dev/null +++ b/addons/vitals/functions/fnc_handleTemperatureFunction.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Update the temperature of the patient + * + * Arguments: + * 0: The Unit + * 1: Temperature Adjustments + * 2: Blood Volume + * 3: Time since last update + * 4: Sync value? + * + * ReturnValue: + * Current Temperature + * + * Example: + * [player, 0, 6, 1, false] call kat_vitals_fnc_handleTemperatureFunction; + * + * Public: No + */ + +params ["_unit", "_altitudeAdjustment", "_bloodVolume", "_deltaT", "_syncValue"]; + +private _positionTemperature = EGVAR(hypothermia,positionTemperature); +_positionTemperature params ["_lattitude", "_projectedTemperature"]; + +// Diurnal Width increases as lattitudes increase, generally +private _mapTemperature = _projectedTemperature - ((linearConversion [0, 90, _lattitude, 15, 5, true]) * (linearConversion [0, 1, sunOrMoon, 1, 0, true])); + +private _warmingImpact = (_unit getVariable [QEGVAR(hypothermia,warmingImpact), 0]) / ML_TO_LITERS; +private _pointTemperature = -3.5 * (0.95 ^ _mapTemperature + _altitudeAdjustment); +private _currentTemperature = DEFAULT_TEMPERATURE min (((-0.3392 * (_bloodVolume^2)) + (6.00357 * _bloodVolume) + (13.3 + _warmingImpact - (_pointTemperature / 20)))); + +_unit setVariable [QEGVAR(hypothermia,unitTemperature), _currentTemperature, _syncValue]; + +_currentTemperature \ No newline at end of file diff --git a/addons/vitals/functions/fnc_handleUnitVitals.sqf b/addons/vitals/functions/fnc_handleUnitVitals.sqf new file mode 100644 index 000000000..f854d1c95 --- /dev/null +++ b/addons/vitals/functions/fnc_handleUnitVitals.sqf @@ -0,0 +1,200 @@ +#include "..\script_component.hpp" +/* + * Author: Glowbal, Mazinski + * Updates the vitals. Called from the statemachine's onState functions. + * + * Arguments: + * 0: The Unit + * + * Return Value: + * Update Ran (at least 1 second between runs) + * + * Example: + * [player] call ace_medical_vitals_fnc_handleUnitVitals + * + * Public: No + */ + +params ["_unit"]; + +if (!(isPlayer _unit) && (_unit getVariable [QEGVAR(circulation,simpleMedical), false])) exitWith { [_unit] call FUNC(handleSimpleVitals) }; + +private _lastTimeUpdated = _unit getVariable [QACEGVAR(medical_vitals,lastTimeUpdated), 0]; +private _deltaT = (CBA_missionTime - _lastTimeUpdated) min 10; +if (_deltaT < 1) exitWith { false }; // state machines could be calling this very rapidly depending on number of local units + +BEGIN_COUNTER(Vitals); + +_unit setVariable [QACEGVAR(medical_vitals,lastTimeUpdated), CBA_missionTime]; +private _lastTimeValuesSynced = _unit getVariable [QACEGVAR(medical_vitals,lastMomentValuesSynced), 0]; +private _syncValues = (CBA_missionTime - _lastTimeValuesSynced) >= (10 + floor(random 10)); + +if (_syncValues) then { + _unit setVariable [QACEGVAR(medical_vitals,lastMomentValuesSynced), CBA_missionTime]; +}; + +//Get Blood Volume from previous cycle +private _bloodVolume = ([_unit, _deltaT, _syncValues] call EFUNC(pharma,getBloodVolumeChange)); +_unit setVariable [VAR_BLOOD_VOL, _bloodVolume, _syncValues]; + +private _temperature = 37; +private _baroPressure = 760; + +if (EGVAR(hypothermia,hypothermiaActive)) then { + // Enviromental Impact (Altitude, Temperature, Pressure) + private _altitude = (getPosASL _unit) select 2; + private _altitudeTempImpact = switch (true) do { + case (_altitude >= 10): { abs(_altitude/153) * -1 }; //For every 1000 meters of elevation gain, temperature decreases by ~6.5 degrees celsius + case (_altitude <= -1): { -35 max((abs(_altitude/50) * -1) - 17) }; //Average water temperature is 20 degrees celsius. Decreases to 2 degrees celsius at 1000 meters + default { 0 }; + }; + + _baroPressure = 760 * exp((-(_altitude)) / 8400); + _temperature = [_unit, _altitudeTempImpact, _bloodVolume, _deltaT, _syncValues] call FUNC(handleTemperatureFunction); +}; + +// 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 _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 ACEFUNC(medical_status,adjustPainLevel); +}; + +// Get Medication Adjustments: +private _hrTargetAdjustment = 0; +private _painSupressAdjustment = 0; +private _peripheralResistanceAdjustment = 0; +private _alphaFactorAdjustment = 0; +private _opioidAdjustment = 0; +private _adjustments = _unit getVariable [VAR_MEDICATIONS,[]]; + +if !(_adjustments isEqualTo []) then { + private _deleted = false; + { + _x params ["_medication", "_timeAdded", "_timeTillMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust", "_alphaFactor", "_opioidAdjust"]; + private _timeInSystem = CBA_missionTime - _timeAdded; + if (_timeInSystem >= _maxTimeInSystem) then { + _deleted = true; + _adjustments set [_forEachIndex, objNull]; + } else { + private _effectRatio = (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem; + if (_hrAdjust != 0) then { _hrTargetAdjustment = _hrTargetAdjustment + _hrAdjust * _effectRatio; }; + if (_painAdjust != 0) then { _painSupressAdjustment = _painSupressAdjustment + _painAdjust * _effectRatio; }; + if (_flowAdjust != 0) then { _peripheralResistanceAdjustment = _peripheralResistanceAdjustment + _flowAdjust * _effectRatio; }; + if (_alphaFactor != 0) then { _alphaFactorAdjustment = _alphaFactorAdjustment + _alphaFactor * _effectRatio; }; + if (_opioidAdjust != 0) then {_opioidAdjustment = _opioidAdjustment + _opioidAdjust * _effectRatio; }; + }; + } forEach _adjustments; + + if (_deleted) then { + _unit setVariable [VAR_MEDICATIONS, _adjustments - [objNull], true]; + _syncValues = true; + }; +}; + +[_unit, _painSupressAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updatePainSuppress); //Leave alone +[_unit, _peripheralResistanceAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updatePeripheralResistance); +[_unit, _opioidAdjustment, _deltaT, _syncValues] call FUNC(updateOpioidEffect); + +private _heartRate = [_unit, _hrTargetAdjustment, 0, _bloodVolume, _deltaT, _syncValues] call FUNC(handleCardiacFunction); + +private _spo2 = 97; +if (EGVAR(breathing,enable)) then { + // Additional variables for Respiration functions + private _bloodGas = GET_BLOOD_GAS(_unit); + private _opioidDepression = (GET_OPIOID_FACTOR(_unit) - 1); + private _anerobicPressure = (DEFAULT_ANEROBIC_EXCHANGE * (6 / _bloodVolume) - 0) min 1.2; + + _spo2 = [_unit, _heartRate, _anerobicPressure, _bloodGas, _temperature, _baroPressure, _opioidDepression, _deltaT, _syncValues] call FUNC(handleOxygenFunction); +}; + +// Vasoconstriction from Wound Blood Loss and Alpha Adjustment +_vasoconstriction = 1 + (0.5 * _woundBloodLoss) + _alphaFactorAdjustment; +_unit setVariable [VAR_VASOCONSTRICTION, (1.8 min (0.2 max _vasoconstriction)), _syncValues]; + +private _woundBloodLoss = GET_WOUND_BLEEDING(_unit); + +private _bloodPressure = [_unit] call EFUNC(circulation,getBloodPressure); +_unit setVariable [VAR_BLOOD_PRESS, _bloodPressure, _syncValues]; + +_bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; + +// Statements are ordered by most lethal first. +// Add SpO2 reactions to switch statement --------------------------------------------------------------------- + switch (true) do { + case (_spo2 < EGVAR(breathing,SpO2_dieValue) && EGVAR(breathing,SpO2_dieActive)): { + TRACE_3("O2 Fatal",_unit,EGVAR(breathing,SpO2_dieValue),_spo2); + [QACEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + case (_bloodVolume < BLOOD_VOLUME_FATAL): { + TRACE_3("BloodVolume Fatal",_unit,BLOOD_VOLUME_FATAL,_bloodVolume); + [QACEGVAR(medical,Bleedout), _unit] call CBA_fnc_localEvent; + }; + case (IN_CRDC_ARRST(_unit)): {}; // if in cardiac arrest just break now to avoid throwing unneeded events + case (_spo2 < EGVAR(breathing,SpO2_cardiacValue) && EGVAR(breathing,SpO2_cardiacActive)): { + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_hemorrhage == 4): { + TRACE_3("Class IV Hemorrhage",_unit,_hemorrhage,_bloodVolume); + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_heartRate < 20 || {_heartRate > 220}): { + TRACE_2("heartRate Fatal",_unit,_heartRate); + [QACEGVAR(medical,FatalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_bloodPressureL < 20 || {_bloodPressureL > 180}): { + TRACE_2("bloodPressure L above or below limits",_unit,_bloodPressureL); + [QACEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_spo2 < EGVAR(breathing,SpO2_unconscious)): { + [QACEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_woundBloodLoss > BLOOD_LOSS_KNOCK_OUT_THRESHOLD): { + [QACEGVAR(medical,CriticalVitals), _unit] call CBA_fnc_localEvent; + }; + case (_woundBloodLoss > 0): { + [QACEGVAR(medical,LoweredVitals), _unit] call CBA_fnc_localEvent; + }; + case (_inPain): { + [QACEGVAR(medical,LoweredVitals), _unit] call CBA_fnc_localEvent; + }; +}; + +#ifdef DEBUG_MODE_FULL +private _cardiacOutput = [_unit] call ACEFUNC(medical_status,getCardiacOutput); +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(_woundBloodLoss * 1000) / 1000, round((_woundBloodLoss / (0.001 max _cardiacOutput)) * 100) / 100, round(_heartRate), _bloodPressure, round(_painLevel * 100) / 100]; +}; +#endif + +END_COUNTER(Vitals); + +//placed outside the counter as 3rd-party code may be called from this event +[QACEGVAR(medical,handleUnitVitals), [_unit, _deltaT]] call CBA_fnc_localEvent; + +true diff --git a/addons/misc/functions/fnc_hasStableVitals.sqf b/addons/vitals/functions/fnc_hasStableVitals.sqf similarity index 91% rename from addons/misc/functions/fnc_hasStableVitals.sqf rename to addons/vitals/functions/fnc_hasStableVitals.sqf index a1cf4a4e2..f4a1e74a5 100644 --- a/addons/misc/functions/fnc_hasStableVitals.sqf +++ b/addons/vitals/functions/fnc_hasStableVitals.sqf @@ -17,7 +17,7 @@ params ["_unit"]; -private _bloodVolume = GET_BLOOD_VOLUME(_unit); +private _bloodVolume = GET_BLOOD_VOLUME_LITERS(_unit); if (_bloodVolume < ACEGVAR(medical,const_stableVitalsBloodThreshold)) exitWith { false }; if IN_CRDC_ARRST(_unit) exitWith { false }; @@ -35,7 +35,7 @@ if (_bloodPressureL < 50 || {_bloodPressureH < 60}) exitWith { false }; private _heartRate = GET_HEART_RATE(_unit); if (_heartRate < 40) exitWith { false }; -private _o2 = _unit getVariable [QEGVAR(breathing,airwayStatus), 100]; +private _o2 = GET_SPO2(_unit); if (_o2 < EGVAR(breathing,Stable_spo2)) exitWith { false }; private _CMR = _unit getVariable [QEGVAR(brain,CMR),100]; diff --git a/addons/vitals/functions/fnc_init.sqf b/addons/vitals/functions/fnc_init.sqf new file mode 100644 index 000000000..3679e66e3 --- /dev/null +++ b/addons/vitals/functions/fnc_init.sqf @@ -0,0 +1,20 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Initializes unit variables. + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_vitals_fnc_init + * + * Public: No + */ + +params ["_patient"]; + +if (!(isPlayer _unit) && GVAR(simpleMedical)) then { _patient setVariable [QGVAR(simpleMedical), true, true] }; \ No newline at end of file diff --git a/addons/vitals/functions/fnc_updateOpioidEffect.sqf b/addons/vitals/functions/fnc_updateOpioidEffect.sqf new file mode 100644 index 000000000..9df2dceb6 --- /dev/null +++ b/addons/vitals/functions/fnc_updateOpioidEffect.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Glowbal + * Update the opioid effect + * + * Arguments: + * 0: The Unit + * 1: Opioid Effect Adjustments + * 2: Time since last update + * 3: Sync value? + * + * Return Value: + * None + * + * Example: + * [player, 0, 1, false] call kat_vitals_fnc_updateOpioidEffect + * + * Public: No + */ + +params ["_unit", "_opioidAdjustment", "_deltaT", "_syncValue"]; + +_unit setVariable [VAR_PP, 0 max _opioidAdjustment, _syncValue]; + diff --git a/addons/vitals/script_component.hpp b/addons/vitals/script_component.hpp new file mode 100644 index 000000000..2fbccf669 --- /dev/null +++ b/addons/vitals/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT vitals +#define COMPONENT_BEAUTIFIED KAT - Vitals +#include "\x\kat\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_VITALS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_VITALS + #define DEBUG_SETTINGS DEBUG_SETTINGS_VITALS +#endif + +#include "\x\kat\addons\main\script_macros.hpp" diff --git a/addons/vitals/stringtable.xml b/addons/vitals/stringtable.xml new file mode 100644 index 000000000..bc823a806 --- /dev/null +++ b/addons/vitals/stringtable.xml @@ -0,0 +1,11 @@ + + + + + Activate AI Simple Medical + Activeer AI/KI versimpeld medisch + Activar Médico Simple para IA + AI用単純化医療を有効化 + + + diff --git a/addons/watch/$PBOPREFIX$ b/addons/watch/$PBOPREFIX$ new file mode 100644 index 000000000..373f26c47 --- /dev/null +++ b/addons/watch/$PBOPREFIX$ @@ -0,0 +1,2 @@ +x\kat\addons\watch + diff --git a/addons/watch/CfgEventHandlers.hpp b/addons/watch/CfgEventHandlers.hpp new file mode 100644 index 000000000..0f6222843 --- /dev/null +++ b/addons/watch/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +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/watch/CfgWeapons.hpp b/addons/watch/CfgWeapons.hpp new file mode 100644 index 000000000..dec68cac0 --- /dev/null +++ b/addons/watch/CfgWeapons.hpp @@ -0,0 +1,10 @@ +class CfgWeapons { + class ItemWatch; + class KAT_Katmin: ItemWatch { + ACE_hideItemType = "Watch"; + author = "Mazinski"; + descriptionShort = CSTRING(KatminDescription); + displayName = CSTRING(KatminDisplayName); + picture = QPATHTOF(UI\watch_katmin.paa); + }; +}; diff --git a/addons/watch/RscTitles.hpp b/addons/watch/RscTitles.hpp new file mode 100644 index 000000000..6e57d6c6c --- /dev/null +++ b/addons/watch/RscTitles.hpp @@ -0,0 +1,194 @@ +#define KAT_WATCH_GRID_WAbs (((safezoneW / safezoneH) min 0.7)) +#define KAT_WATCH_GRID_HAbs ((((safezoneW / safezoneH) min 1.2) / 1.6)) +#define KAT_WATCH_GRID_W ((((safeZoneW / safeZoneH) min 0.7) / 40)) +#define KAT_WATCH_GRID_H (((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)) +#define KAT_WATCH_GRID_X ((safeZoneX + (safeZoneW - ((safeZoneW / safeZoneH) min 1.2)) / 11)) +#define KAT_WATCH_GRID_Y ((safeZoneY + (safeZoneH - (((safeZoneW / safeZoneH) min 1.2) / 1.2)) / 0.8)) + +#define KAT_POS_H(N) ((N) * KAT_WATCH_GRID_H) + +#define ST_LEFT 0 +#define ST_CENTER 2 +#define ST_RIGHT 1 + +class RscText; +class RscPicture; +class RscButton; +class RscTitles +{ + class KAT_Katmin + { + idd = 19935; + enableSimulation = 1; + movingEnable = 0; + fadeIn=0; + fadeOut=1; + duration = 10e10; + onLoad = "uiNamespace setVariable ['KAT_Katmin', _this select 0];"; + class controls + { + class KatminImage: RscPicture + { + idc = 19800; + text = "\x\kat\addons\watch\UI\watch_katmin.paa"; + x = "0.0328437 * safezoneW + safezoneX"; + y = "0.652 * safezoneH + safezoneY"; + w = "0.225 * safezoneW"; + h = "0.4 * safezoneH"; + }; + class KatminIcon: KatminImage + { + idc = 19802; + text = "\x\kat\addons\watch\UI\watch_icon.paa"; + }; + class KatminSun: KatminImage + { + idc = 19803; + text = "\x\kat\addons\watch\UI\watch_sun.paa"; + show = 0; + }; + class KatminOvercast: KatminImage + { + idc = 19804; + text = "\x\kat\addons\watch\UI\watch_overcast.paa"; + show = 0; + }; + class KatminRain: KatminImage + { + idc = 19805; + text = "\x\kat\addons\watch\UI\watch_rain.paa"; + show = 0; + }; + class KatminCompass: KatminImage + { + idc = 19806; + text = "\x\kat\addons\watch\UI\watch_katmin_direction.paa"; + }; + class KatminTime: RscText + { + idc = 22000; + style = ST_CENTER; + shadow = 0; + font = "PuristaBold"; + text = "12:00"; //--- ToDo: Localize; + x = "0.104 * safezoneW + safezoneX"; + y = "0.8328 * safezoneH + safezoneY"; + w = "0.061875 * safezoneW"; + h = "0.033 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(2)); + }; + class KatminMonth: RscText + { + idc = 22001; + style = ST_RIGHT; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "JAN"; //--- ToDo: Localize; + x = "0.157316 * safezoneW + safezoneX"; + y = "0.8394 * safezoneH + safezoneY"; + w = "0.0257812 * safezoneW"; + h = "0.013 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(0.8)); + }; + class KatminDay: RscText + { + idc = 22002; + style = ST_RIGHT; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "01"; //--- ToDo: Localize; + x = "0.157316 * safezoneW + safezoneX"; + y = "0.8525 * safezoneH + safezoneY"; + w = "0.0257812 * safezoneW"; + h = "0.013 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(0.8)); + }; + class KatminBaro: RscText + { + idc = 22003; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "760"; //--- ToDo: Localize; + x = "0.158625 * safezoneW + safezoneX"; + y = "0.80844 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.022 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(0.95)); + }; + class KatminHR: RscText + { + idc = 22004; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "80"; //--- ToDo: Localize; + x = "0.149375 * safezoneW + safezoneX"; + y = "0.8732 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.022 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(1.2)); + }; + class KatminO2: RscText + { + idc = 22005; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "97"; //--- ToDo: Localize; + x = "0.118469 * safezoneW + safezoneX"; + y = "0.8732 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.022 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(1.2)); + }; + class KatminTemp: RscText + { + idc = 22006; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "76F"; //--- ToDo: Localize; + x = "0.134937 * safezoneW + safezoneX"; + y = "0.8094 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.022 * safezoneH"; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + sizeEx = QUOTE(KAT_POS_H(1)); + }; + class KatminAltitude: RscText + { + idc = 22007; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "PuristaBold"; + text = "1000"; + x = "0.111219 * safezoneW + safezoneX"; + y = "0.80844 * safezoneH + safezoneY"; + w = "0.020625 * safezoneW"; + h = "0.022 * safezoneH"; + sizeEx = QUOTE(KAT_POS_H(0.95)); + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/watch/UI/watch_icon.paa b/addons/watch/UI/watch_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..e2d3de3cf9bc71fc405438419b6411a7f6a48a30 GIT binary patch literal 32487 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 a)rcta_z&?k;m^v>+L=lMm^yXL*#7~u`V|%c literal 0 HcmV?d00001 diff --git a/addons/watch/UI/watch_katmin.paa b/addons/watch/UI/watch_katmin.paa new file mode 100644 index 0000000000000000000000000000000000000000..c14e307079f9e52630d2a70edbbecf3a87d1b44c GIT binary patch literal 211769 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

P(3MEwP{fH7a^f5eP)WO`f? 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%0AN$8m%w6~f= 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

DgS`<&ftD_YQ5p<}|0X7w@Zr{SHPZn! z#PzEsK0wl}M{PhEqm)_lH%nq8JU)g!pF~DwP%^uNM@z zAr$a~I6>gqiY&3*H4L!}P=-nLNTfI#?^0=8(&OCg#vU>&l+;leD$O@BRZ6bO06~JNic| zYF*vEcjcUZ_m25slnnJA<(Rq{h^*|E_oa#{!NvAl?N8nu>1
L*elM(a_iQHO6-IeQXAcSbnhtx3iN$v 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	u&)#%y-Lz!)5aY@L
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

literal 0
HcmV?d00001

diff --git a/addons/watch/UI/watch_katmin_direction.paa b/addons/watch/UI/watch_katmin_direction.paa
new file mode 100644
index 0000000000000000000000000000000000000000..7727dc720179630ff7592363a8710c19905df886
GIT binary patch
literal 37989
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

literal 0
HcmV?d00001

diff --git a/addons/watch/XEH_PREP.hpp b/addons/watch/XEH_PREP.hpp
new file mode 100644
index 000000000..9ac1eb16d
--- /dev/null
+++ b/addons/watch/XEH_PREP.hpp
@@ -0,0 +1,2 @@
+PREP(hideKWatch);
+PREP(showKWatch);
\ No newline at end of file
diff --git a/addons/watch/XEH_postInit.sqf b/addons/watch/XEH_postInit.sqf
new file mode 100644
index 000000000..cfc39f94d
--- /dev/null
+++ b/addons/watch/XEH_postInit.sqf
@@ -0,0 +1,16 @@
+#include "script_component.hpp"
+
+if (!hasInterface) exitWith {};
+
+["KAT Watch", QGVAR(showKatmin), "Show Katmin", {
+    // Conditions: canInteract
+    if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_Katmin' in assignedItems ACE_player)}) exitWith { false };
+
+    if !(GETMVAR(GVAR(KatminActive),false)) then {
+        [ACE_player] call FUNC(showKWatch);
+    } else {
+        call FUNC(hideKWatch);
+    };
+
+    true
+}, { false }, [24, [false, false, false]], false] call CBA_fnc_addKeybind;
diff --git a/addons/watch/XEH_preInit.sqf b/addons/watch/XEH_preInit.sqf
new file mode 100644
index 000000000..c46ce305a
--- /dev/null
+++ b/addons/watch/XEH_preInit.sqf
@@ -0,0 +1,38 @@
+#include "script_component.hpp"
+
+ADDON = false;
+
+PREP_RECOMPILE_START;
+#include "XEH_PREP.hpp"
+PREP_RECOMPILE_END;
+
+ADDON = true;
+
+#define CBA_SETTINGS_CAT "KAT - ADV Medical: Watch"
+
+[
+    QGVAR(temperatureUnit),
+    "LIST",
+    [LLSTRING(SETTING_TemperatureForm), LLSTRING(SETTING_TemperatureForm_Desc)],
+    [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
+    [[0, 1], [LLSTRING(SETTING_TemperatureForm_Celcius), LLSTRING(SETTING_TemperatureForm_Fahrenheit)], 0],
+    true
+] call CBA_Settings_fnc_init;
+
+[
+    QGVAR(pressureUnit),
+    "LIST",
+    [LLSTRING(SETTING_PressureForm), LLSTRING(SETTING_PressureForm_Desc)],
+    [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
+    [[0, 1], [LLSTRING(SETTING_PressureForm_mmHg), LLSTRING(SETTING_PressureForm_hPa)], 0],
+    true
+] call CBA_Settings_fnc_init;
+
+[
+    QGVAR(altitudeUnit),
+    "LIST",
+    [LLSTRING(SETTING_AltitudeForm), LLSTRING(SETTING_AltitudeForm_Desc)],
+    [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
+    [[0, 1], [LLSTRING(SETTING_AltitudeForm_meters), LLSTRING(SETTING_AltitudeForm_feet)], 0],
+    true
+] call CBA_Settings_fnc_init;
\ No newline at end of file
diff --git a/addons/watch/config.cpp b/addons/watch/config.cpp
new file mode 100644
index 000000000..630a14c34
--- /dev/null
+++ b/addons/watch/config.cpp
@@ -0,0 +1,37 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+    class ADDON    {
+        name = COMPONENT_NAME;
+        requiredVersion = REQUIRED_VERSION;
+        units[] = { };
+        weapons[] = {
+            "KAT_Katmin"
+        };
+        magazines[] = { };
+        requiredAddons[] = {
+            "kat_main",
+            "ace_medical",
+            "ace_medical_ai",
+            "ace_medical_blood",
+            "ace_medical_damage",
+            "ace_medical_engine",
+            "ace_medical_feedback",
+            "ace_medical_gui",
+            "ace_medical_statemachine",
+            "ace_medical_status",
+            "ace_medical_treatment",
+            "ace_medical_vitals",
+            "ace_dogtags",
+            "cba_settings"
+        };
+        author = "Mazinski";
+        authors[] = {"Mazinski"};
+        url = ECSTRING(main,URL);
+        VERSION_CONFIG;
+    };
+};
+
+#include "CfgEventHandlers.hpp"
+#include "CfgWeapons.hpp"
+#include "RscTitles.hpp"
\ No newline at end of file
diff --git a/addons/watch/functions/fnc_hideKWatch.sqf b/addons/watch/functions/fnc_hideKWatch.sqf
new file mode 100644
index 000000000..795c75d35
--- /dev/null
+++ b/addons/watch/functions/fnc_hideKWatch.sqf
@@ -0,0 +1,19 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Garth 'L-H' de Wet
+ * Modified: Mazinski
+ * Removes the KWatch from the screen.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call kat_watch_fnc_hideKWatch
+ *
+ * Public: No
+ */
+GVAR(KatminActive) = false;
+"KAT_Katmin" cutText ["","PLAIN",0,true];
\ No newline at end of file
diff --git a/addons/watch/functions/fnc_showKWatch.sqf b/addons/watch/functions/fnc_showKWatch.sqf
new file mode 100644
index 000000000..2d13cb56c
--- /dev/null
+++ b/addons/watch/functions/fnc_showKWatch.sqf
@@ -0,0 +1,127 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Garth 'L-H' de Wet
+ * Modified: Mazinski
+ * Displays the KWatch on screen.
+ *
+ * Arguments:
+ * 0: unit 
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [player] call kat_watch_fnc_showKWatch
+ *
+ * Public: Yes
+ */
+
+params ["_unit"];
+
+"KAT_Katmin" cutRsc ["KAT_Katmin", "PLAIN", 0, true];
+
+if (isNull (uiNamespace getVariable ["KAT_Katmin", displayNull])) exitWith {};
+
+GVAR(KatminActive) = true;
+
+private _display = uiNamespace getVariable ["KAT_Katmin", displayNull];
+private _background = _display displayCtrl 19800;
+private _compass = _display displayCtrl 19806;
+private _sun = _display displayCtrl 19803;
+private _overcast = _display displayCtrl 19804;
+private _rain = _display displayCtrl 19805;
+private _time = _display displayCtrl 22000;
+private _month = _display displayCtrl 22001;
+private _day = _display displayCtrl 22002;
+private _baro = _display displayCtrl 22003;
+private _hr = _display displayCtrl 22004;
+private _o2 = _display displayCtrl 22005;
+private _temp = _display displayCtrl 22006;
+private _altitude = _display displayCtrl 22007;
+
+// We seperate this into two PFHs because the compass PFH needs to be run much faster in order to rotate smoothly, but vitals only need an update every second because thats how fast handleUnitVitals runs.
+[{
+    _this params ["_args", "_pfhID"];
+    _args params ["_unit", "_compass"];
+
+    if !(GVAR(KatminActive)) exitWith {
+        _pfhID call CBA_fnc_removePerFrameHandler;
+    };
+
+    _compass ctrlSetAngle [(getDirVisual _unit), 0.5, 0.5, true];
+    _compass ctrlCommit 0.1;
+}, 0.05, [
+    _unit,
+    _compass
+]] call CBA_fnc_addPerFrameHandler;
+
+[{
+    _this params ["_args", "_pfhID"];
+    _args params ["_unit", "_time", "_month", "_day", "_baro", "_hr", "_o2", "_temp", "_altitude", "_rain", "_overcast", "_sun"];
+
+    if !(GVAR(KatminActive)) exitWith {
+        _pfhID call CBA_fnc_removePerFrameHandler;
+    };
+
+    if !(alive _unit) exitWith {
+        call FUNC(hideKWatch);
+        _pfhID call CBA_fnc_removePerFrameHandler;
+    };
+
+    if !("KAT_Katmin" in assignedItems _unit) exitWith {
+        call FUNC(hideKWatch);
+        _pfhID call CBA_fnc_removePerFrameHandler;
+    };
+
+    date params ["_yearNum", "_monthNum", "_dayNum"];
+
+    private _hour = floor dayTime;
+    private _minute = floor ((dayTime - _hour) * 60);
+
+    _time ctrlSetText (format ["%1:%2", [_hour, 2] call CBA_fnc_formatNumber, [_minute, 2] call CBA_fnc_formatNumber]);    
+    _month ctrlSetText (["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"] select (_monthNum - 1));
+    _day ctrlSetText (str(_dayNum));
+
+    private _altitudeValue = (getPosASL _unit) select 2;
+
+    if (GVAR(altitudeUnit) == 1) then {
+        _altitude ctrlSetText ([(_altitudeValue * 3.281), 1, 0] call CBA_fnc_formatNumber)
+    } else {
+        _altitude ctrlSetText ([_altitudeValue, 1, 0] call CBA_fnc_formatNumber)
+    };
+
+    if (GVAR(pressureUnit) == 1) then {
+        _baro ctrlSetText ([(_altitudeValue call ACEFUNC(weather,calculateBarometricPressure)), 1, 0] call CBA_fnc_formatNumber);
+    } else {
+        _baro ctrlSetText ([((_altitudeValue call ACEFUNC(weather,calculateBarometricPressure)) / 1.3), 1, 0] call CBA_fnc_formatNumber);
+    };
+
+    if (GVAR(temperatureUnit) == 1) then {
+        _temp ctrlSetText (format ["%1F", ([((_altitudeValue call ACEFUNC(weather,calculateTemperatureAtHeight)) * (9/5) + 32), 1, 0] call CBA_fnc_formatNumber)]);
+    } else {
+        _temp ctrlSetText (format ["%1C", ([(_altitudeValue call ACEFUNC(weather,calculateTemperatureAtHeight)), 1, 0] call CBA_fnc_formatNumber)]);
+    };
+
+    _hr ctrlSetText ([GET_HEART_RATE(_unit), 1, 0] call CBA_fnc_formatNumber);
+    _o2 ctrlSetText ([GET_SPO2(_unit), 1, 0] call CBA_fnc_formatNumber);
+
+    switch (true) do {
+        case(rain != 0): { _rain ctrlShow true; _overcast ctrlShow false; _sun ctrlShow false; };
+        case(overcast > 0.4): { _rain ctrlShow false; _overcast ctrlShow true; _sun ctrlShow false; };
+        default { _rain ctrlShow false; _overcast ctrlShow false; _sun ctrlShow true; };
+    };
+
+}, 1, [
+    _unit,
+    _time,
+    _month,
+    _day,
+    _baro,
+    _hr,
+    _o2,
+    _temp,
+    _altitude,
+    _rain,
+    _overcast,
+    _sun
+]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/watch/script_component.hpp b/addons/watch/script_component.hpp
new file mode 100644
index 000000000..c58974353
--- /dev/null
+++ b/addons/watch/script_component.hpp
@@ -0,0 +1,17 @@
+#define COMPONENT watch
+#define COMPONENT_BEAUTIFIED KAT Watch
+#include "\x\kat\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#ifdef DEBUG_ENABLED_WATCH
+  #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_WATCH
+  #define DEBUG_SETTINGS DEBUG_SETTINGS_WATCH
+#endif
+
+#include "\x\kat\addons\main\script_macros.hpp"
\ No newline at end of file
diff --git a/addons/watch/stringtable.xml b/addons/watch/stringtable.xml
new file mode 100644
index 000000000..d2cf017dd
--- /dev/null
+++ b/addons/watch/stringtable.xml
@@ -0,0 +1,89 @@
+
+
+    
+        
+            Select temperature form
+            Selecteer temperatuur vorm
+            Seleccionar temperatura de
+            温度単位を選択
+        
+        
+            Selects which temperature unit is used for the KATMIN watch display
+            Selecteert welke temperatuur eenheid gebruikt wordt voor de KATMIN horloge
+            Seleccionar qué unidad de temperatura es usada para la pantalla del reloj KATMIN
+            Katmin ウォッチで表示される温度の単位を選択します
+        
+        
+            Celcius
+            Celcius
+            Celsius
+            摂氏 (C)
+        
+        
+            Fahrenheit
+            Fahrenheit
+            Fahrenheit
+            華氏 (F)
+        
+        
+            Select pressure form
+            Selecteer drukvorm
+            Seleccionar presión de
+            圧力単位を選択
+        
+        
+            Selects which pressure unit is used for the KATMIN watch display
+            Selecteerd welke drukeenheden gebruikt worden voor de KATMIN horloge
+            Selecciona qué unidad de presión es usada para la pantalla del reloj KATMIN
+            Katmin ウォッチで表示される圧力の単位を選択します
+        
+        
+            mmHg
+            mmHg
+            mmHg
+            mmHg
+        
+        
+            hPa
+            hPa
+            hPa
+            hPa
+        
+        
+            Select altitude form
+            Selecteer hoogte vorm
+            Seleccionar altitud de
+            高度単位を選択
+        
+        
+            Selects which altitude unit is used for the KATMIN watch display
+            Selecteerd welk hoogte eenheid gebruikt wordt voor de KATMIN horloge
+            Selecciona qué unidad de altitud es usada para la pantalla del reloj KATMIN
+            Katmin ウォッチで表示される高度の単位を選択します
+        
+        
+            Meters
+            Meters
+            Metros
+            メートル
+        
+        
+            Feet
+            Voet
+            Pies
+            フィート
+        
+        
+            Watch with Vital Monitoring Capabilities
+            Horloge met ingebouwde vitale waarden monitor
+            Reloj con Capacidad de Monitorización de Constantes Vitales
+            バイタル監視機能を持った腕時計
+        
+        
+            Katmin K500
+            Katmin k500
+            Katmin K500
+            Katmin K500
+        
+    
+
diff --git a/addons/zeus/functions/fnc_openMedicalMenu.sqf b/addons/zeus/functions/fnc_openMedicalMenu.sqf
index bd95371e7..9aa005c37 100644
--- a/addons/zeus/functions/fnc_openMedicalMenu.sqf
+++ b/addons/zeus/functions/fnc_openMedicalMenu.sqf
@@ -24,7 +24,7 @@ private _mouseOver = GETMVAR(bis_fnc_curatorObjectPlaced_mouseOver,[""]);
 if ((_mouseOver select 0) != "OBJECT") then {
     [ACELSTRING(zeus,NothingSelected)] call FUNC(showMessage);
 } else {
-    private _unit = effectivecommander (_mouseOver select 1);
+    private _unit = effectiveCommander (_mouseOver select 1);
 
     if !(_unit isKindOf "CAManBase") then {
         [ACELSTRING(zeus,OnlyInfantry)] call FUNC(showMessage);
diff --git a/addons/zeus/functions/fnc_toggleAIDeathModule.sqf b/addons/zeus/functions/fnc_toggleAIDeathModule.sqf
index 99bd96870..f03a82e02 100644
--- a/addons/zeus/functions/fnc_toggleAIDeathModule.sqf
+++ b/addons/zeus/functions/fnc_toggleAIDeathModule.sqf
@@ -24,7 +24,7 @@ private _mouseOver = GETMVAR(bis_fnc_curatorObjectPlaced_mouseOver,[""]);
 if ((_mouseOver select 0) != "OBJECT") then {
     [ACELSTRING(zeus,NothingSelected)] call FUNC(showMessage);
 } else {
-    private _unit = effectivecommander (_mouseOver select 1);
+    private _unit = effectiveCommander (_mouseOver select 1);
     if !(_unit isKindOf "CAManBase") then {
         [ACELSTRING(zeus,OnlyInfantry)] call FUNC(showMessage);
     } else {
diff --git a/addons/zeus/functions/fnc_ui_changeBloodType.sqf b/addons/zeus/functions/fnc_ui_changeBloodType.sqf
index 46b1f55ce..8c488d0fb 100644
--- a/addons/zeus/functions/fnc_ui_changeBloodType.sqf
+++ b/addons/zeus/functions/fnc_ui_changeBloodType.sqf
@@ -56,14 +56,14 @@ private _fnc_sliderMove = {
     private _idc = ctrlIDC _slider;
     private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull);
     private _unit = attachedTo _logic;
-    private _curVal = _unit getVariable [QACEGVAR(medical,bloodvolume), 6.0];
+    private _curVal = GET_BLOOD_VOLUME_LITERS(_unit);
     _slider ctrlSetTooltip format [LLSTRING(sliderFormat13was23), parseNumber((sliderPosition _slider) toFixed 2), (parseNumber (_curVal toFixed 2)), "L"];
 };
 
 private _slider = _display displayCtrl 26423;
 _slider sliderSetRange [0, 6];
 _slider sliderSetSpeed [1,0.5];
-private _curBloodVol = _unit getVariable [QACEGVAR(medical,bloodvolume), 6.0];
+private _curBloodVol = GET_BLOOD_VOLUME_LITERS(_unit);
 _slider sliderSetPosition (parseNumber (_curBloodVol toFixed 2));
 _slider ctrlAddEventHandler ["SliderPosChanged", _fnc_sliderMove];
 [_slider,_curBloodVol] call _fnc_sliderMove;
@@ -88,10 +88,10 @@ private _select = switch (_playerBloodyType) do
 private _fnc_onConfirm = {
     params [["_ctrlButtonOK", controlNull, [controlNull]]];
 
-    private _display = ctrlparent _ctrlButtonOK;
+    private _display = ctrlParent _ctrlButtonOK;
     if (isNull _display) exitWith {};
 
-    private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull);
+    private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull);
     if (isNull _logic) exitWith {};
 
     private _unit = attachedTo _logic;
@@ -113,9 +113,10 @@ private _fnc_onConfirm = {
         _dogtagData set [1, _bloodtype];
     };
 
-    private _curBloodVol = _unit getVariable [QACEGVAR(medical,bloodvolume), 6.0];
+    private _curBloodVol = GET_BLOOD_VOLUME_LITERS(_unit);
     private _sliderValue = sliderPosition (_display displayCtrl 26423);
-    _unit setVariable [QACEGVAR(medical,bloodvolume), ( parseNumber (_sliderValue toFixed 2)), true];
+    _sliderValue = parseNumber (_sliderValue toFixed 2);
+    REDUCE_TOTAL_BLOOD_VOLUME(_unit,((_curBloodVol - _sliderValue) * 1000)); 
 };
 
 _display displayAddEventHandler ["Unload", _fnc_onUnload];
diff --git a/addons/zeus/functions/fnc_ui_changeCardiacState.sqf b/addons/zeus/functions/fnc_ui_changeCardiacState.sqf
index ccdf74963..360c0184d 100644
--- a/addons/zeus/functions/fnc_ui_changeCardiacState.sqf
+++ b/addons/zeus/functions/fnc_ui_changeCardiacState.sqf
@@ -55,10 +55,10 @@ private _fnc_onUnload = {
 private _fnc_onConfirm = {
     params [["_ctrlButtonOK", controlNull, [controlNull]]];
 
-    private _display = ctrlparent _ctrlButtonOK;
+    private _display = ctrlParent _ctrlButtonOK;
     if (isNull _display) exitWith {};
 
-    private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull);
+    private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull);
     if (isNull _logic) exitWith {};
 
     private _unit = attachedTo _logic;
diff --git a/addons/zeus/functions/fnc_ui_manageAirway.sqf b/addons/zeus/functions/fnc_ui_manageAirway.sqf
index 9fa82b5c5..248c8f498 100644
--- a/addons/zeus/functions/fnc_ui_manageAirway.sqf
+++ b/addons/zeus/functions/fnc_ui_manageAirway.sqf
@@ -56,7 +56,7 @@ private _fnc_sliderMove_ptx = {
     private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull);
     private _unit = attachedTo _logic;
     private _curVal = _unit getVariable [QEGVAR(breathing,pneumothorax), 0];
-    _slider ctrlSetTooltip format [LLSTRING(sliderFormat13was23), round(sliderPosition _slider), round _curVal];
+    _slider ctrlSetTooltip format [LLSTRING(sliderFormat13was23), round(sliderPosition _slider), round _curVal, " "];
 };
 
 private _sliderPTX = _display displayCtrl 16105;
@@ -72,14 +72,14 @@ private _fnc_sliderMove_SPO2 = {
     private _idc = ctrlIDC _slider;
     private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull);
     private _unit = attachedTo _logic;
-    private _curVal = _unit getVariable [QEGVAR(breathing,airwayStatus), 50];
+    private _curVal = GET_PAO2(_unit);
     _slider ctrlSetTooltip format [LLSTRING(sliderFormat13was23), round(sliderPosition _slider), round _curVal, "%"];
 };
 
 private _sliderSPO2 = _display displayCtrl 16106;
 _sliderSPO2 sliderSetRange [0, 100];
 _sliderSPO2 sliderSetSpeed [1,10];
-private _curSpO2Val = _unit getVariable [QEGVAR(breathing,airwayStatus), 50];
+private _curSpO2Val = GET_PAO2(_unit);
 _sliderSPO2 sliderSetPosition (round _curSpO2Val);
 _sliderSPO2 ctrlAddEventHandler ["SliderPosChanged", _fnc_sliderMove_SPO2];
 [_sliderSPO2,_curSpO2Val] call _fnc_sliderMove_SPO2;
@@ -92,10 +92,10 @@ _sliderSPO2 ctrlAddEventHandler ["SliderPosChanged", _fnc_sliderMove_SPO2];
 private _fnc_onConfirm = {
     params [["_ctrlButtonOK", controlNull, [controlNull]]];
 
-    private _display = ctrlparent _ctrlButtonOK;
+    private _display = ctrlParent _ctrlButtonOK;
     if (isNull _display) exitWith {};
 
-    private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull);
+    private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull);
     if (isNull _logic) exitWith {};
 
     private _unit = attachedTo _logic;
@@ -118,17 +118,15 @@ private _fnc_onConfirm = {
 
         _unit setVariable [_x, _targetState, true];
     } forEach [QEGVAR(airway,obstruction), QEGVAR(airway,occluded), QEGVAR(breathing,hemopneumothorax), QEGVAR(breathing,tensionpneumothorax)];
-
-    private _curSpO2Val = _unit getVariable [QEGVAR(breathing,airwayStatus), 50];
-
+    
+    private _curSpO2Val = GET_PAO2(_unit);    
     private _pneumothorax = round(sliderPosition (_display displayCtrl 16105));
 
     _unit setVariable [QEGVAR(breathing,pneumothorax), _pneumothorax, true];
-    _unit setVariable [QEGVAR(breathing,airwayStatus), round(sliderPosition (_display displayCtrl 16106)), true];
+    private _o2Sat = round(sliderPosition (_display displayCtrl 16106)); 
 
-    if (_curSpO2Val isEqualTo 100 || _initBreathing) then {
-        [_unit] call EFUNC(breathing,handleBreathing);
-    };
+    private _bloodGas = GET_BLOOD_GAS(_unit);
+    _unit setVariable [QEGVAR(circulation,bloodGas),[_bloodGas select 0, _o2Sat, _bloodGas select 2, _bloodGas select 3, _bloodGas select 4], true];
 
     if (_pneumothorax isEqualTo 0 && !(_valueArr select 2) && !(_valueArr select 3)) then {
         [_unit, 0, 0, "ptx_tension", true] call EFUNC(circulation,updateBloodPressureChange);
diff --git a/addons/zeus/script_component.hpp b/addons/zeus/script_component.hpp
index 7102ee07f..9e920b86a 100644
--- a/addons/zeus/script_component.hpp
+++ b/addons/zeus/script_component.hpp
@@ -22,4 +22,4 @@
 #define W_PART(num) (num * (SIZEX / 40))
 #define H_PART(num) (num * (SIZEY / 25))
 #define X_PART(num) (W_PART(num) + (safeZoneX + (safeZoneW - SIZEX) / 2))
-#define Y_PART(num) (H_PART(num) + (safeZoneY + (safeZoneH - SIZEY) / 2))
+#define Y_PART(num) (H_PART(num) + (safeZoneY + (safeZoneH - SIZEY) / 2))
\ No newline at end of file
diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml
index 11095bca7..79a9a49c0 100644
--- a/addons/zeus/stringtable.xml
+++ b/addons/zeus/stringtable.xml
@@ -17,6 +17,7 @@
             气道闭塞:
             Obstrução de vias aéreas:
             Hengitysteiden tukos: 
+            Luchtwegobstructie: 
         
         
             Airway occlusion: 
@@ -34,6 +35,7 @@
             气道阻塞:
             Oclusão das vias aéreas:
             Hengitysteiden likaantuminen: 
+            Luchtwegverstopping: 
         
         
             Pneumothorax: 
@@ -51,15 +53,18 @@
             气胸:
             Pneumotórax:
             Lohistunut keuhko: 
+            Pneumothorax: 
         
         
             Pneumothorax deteriorate:
+            气胸恶化:
             気胸の悪化:
             Пневмоторакс ухудшается:
             Pneumothorax verschlechtert sich:
             Deterioro de pneumotórax:
             Détérioration du pneumothorax :
             Deterioração do pneumotórax
+            Verslechterende pneumothorax: 
         
         
             Hemopneumothorax: 
@@ -77,6 +82,7 @@
             血气胸:
             Hemopneumotórax:
             Verenvuoto paisunut keuhko: 
+            Hemopneumothorax: 
         
         
             Tension pneumothorax: 
@@ -94,23 +100,25 @@
             张力性气胸:
             Pneumotórax hipertensivo:
             Lamannut keuhko jännityksen alaisena: 
+            Spanningspneumothorax: 
         
         
-            SpO2 value: 
-            SpO2-Wert: 
-            Hodnota SpO2: 
-            Valeur Sp02: 
-            Wartość SpO2: 
-            Valor SpO2: 
-            SpO2 값: 
-            SpO2值。
-            SpO2 değeri: 
-            SpO2値:
-            Значение SpO2:
-            Valore di SpO2
-            SpO2值:
-            Valor de SpO2:
-            Veren happitaso (SpO2): 
+            PaO2 value: 
+            PaO2-Wert: 
+            Hodnota PaO2: 
+            Valeur PaO2: 
+            Wartość PaO2: 
+            Valor PaO2: 
+            PaO2 값: 
+            PaO2值。
+            PaO2 değeri: 
+            PaO2:
+            Значение PaO2:
+            Valore di PaO2
+            PaO2值:
+            Valor de PaO2:
+            Veren happitaso (PaO2): 
+            PaO2 waarde: 
         
         
             Blood group: 
@@ -128,6 +136,7 @@
             血型:
             Tipo sanguíneo:
             Veriryhmä: 
+            Bloedgroep: 
         
         
             Blood volume: 
@@ -145,6 +154,7 @@
             血液量:
             Volume de sangue:
             Veren määrä
+            Bloedvolume: 
         
         
             Manage Airway
@@ -162,6 +172,7 @@
             气道管理:
             Gerenciar vias aéreas
             Hallitse hengitysteitä
+            Manage luchtweg
         
         
             Change blood group / volume
@@ -179,9 +190,11 @@
             改变血型/血液量:
             Alterar tipo sanguíneo/volume
             Muuta verityyppiä/tilavuutta
+            Verander bloedgroep / -volume
         
         
             Change Cardiac State
+            改变心脏状态
             心臓の状態を変更
             Changer de condition cardiaque
             심장 상태 변경
@@ -190,6 +203,7 @@
             Cambiar estado cardíaco
             Muuta sydämen tilaa
             Изменить состояние сердца
+            Verander cardiale staat
         
         
             Open unit medical menu
@@ -207,6 +221,7 @@
             打开单位医疗菜单
             Abra o menu médico da unidade
             Avaa laitteen lääketieteellinen valikko
+            Open eenheids medisch menu
         
         
             State:
@@ -224,9 +239,11 @@
             状态:
             Estado:
             Olotila:
+            staat: 
         
         
             Ventricular Tachycardia
+            室性心动过速(VT)
             心室頻拍(VT)
             Tachycardie ventriculaire
             심실빈맥(VT)
@@ -235,9 +252,11 @@
             Taquicardia ventricular
             Ventrikulaarinen takykardia: 
             Желудочковая тахикардия
+            Ventriculaire tachycardie
         
         
             Ventricular Fibrillation
+            心室颤动(VF)
             心室細動(VF)
             Fibrillation ventriculaire
             심실세동(VF)
@@ -246,9 +265,11 @@
             Fibrilación ventricular
             Kammiovärinä:
             Фибрилляция желудочков
+            Ventriculaire fibrillatie
         
         
             Pulseless Electrical Activity
+            无脉冲电活动(PEA)
             無脈性電気活動(PEA)
             Activité électrique sans impulsion (PEA)
             무맥박 전기활동(PEA)
@@ -257,6 +278,7 @@
             Actividad eléctrica sin pulso
             Pulssiton sähköinen toiminta:
             Безимпульсная электрическая активность
+            Polsloze electrische activiteit (PEA)
         
         
             Asystole
@@ -274,9 +296,11 @@
             心搏停止
             Assistolia
             Sydämenpysähdys
+            Asystole
         
         
             Unit must be an AI
+            单位必须是AI
             L'unité doit être une IA
             유닛은 반드시 AI여야 합니다
             ユニットはAIである必要があります
@@ -285,6 +309,7 @@
             La unidad debe ser una IA
             Yksikön on oltava AI
             Юнит должен быть ИИ
+            Eenheid moet een KI / AI zijn
         
         
             %1%3 (was %2%3)
@@ -302,9 +327,11 @@
             %1%3 (以前是 %2%3)
             %1%3 (era %2%3)
             %1%2(oli %2%3)
+            %1%3 (was %2%3)
         
         
             Toggle Instant AI Death
+            切换AI即时死亡
             Activer/Désactiver la mort instantanée de l'IA
             인공지능 즉사 토글
             AIの即死を切り替え
@@ -313,9 +340,11 @@
             Alternar muerte instantánea de la IA
             Valitse välitön AI-kuolema
             Переключить мгновенную смерть ИИ
+            Schakel onmiddelijke KI / AI dood om
         
         
             Instant AI Death %1 for unit
+            AI单位即时死亡 %1 
             Mort instantanée de l'IA %1 pour l'unité
             유닛에 AI 즉사 %1
             このAIユニットの即死は %1 になりました
@@ -324,6 +353,7 @@
             Muerte instantánea de la IA al %1 para la unidad
             Välitön AI-kuolema %1 yksikölle
             Мгновенная смерть ИИ %1 для юнита
+            Onmiddelijke dood voor KI / AI %1 voor eenheid
         
     
 

From 5c29aacf95b8c7774c060e36d384089b53469ed2 Mon Sep 17 00:00:00 2001
From: WishaWoshi 
Date: Sun, 13 Oct 2024 21:25:45 +0100
Subject: [PATCH 34/37] Remove ICP floors for saline bags

---
 addons/brain/XEH_preInit.sqf                  |  2 +-
 addons/brain/functions/fnc_findSaline.sqf     | 33 +++++++++++++++++++
 .../functions/fnc_handleBrainActivity.sqf     | 10 +++---
 3 files changed, 40 insertions(+), 5 deletions(-)
 create mode 100644 addons/brain/functions/fnc_findSaline.sqf

diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf
index d9c035938..97d80df67 100644
--- a/addons/brain/XEH_preInit.sqf
+++ b/addons/brain/XEH_preInit.sqf
@@ -109,7 +109,7 @@ PREP_RECOMPILE_END;
     true
 ] call CBA_Settings_fnc_init;
 
-// Number of ticks required until tissue necrosis begins to occur
+// Number of ticks required until tissue necrosis begins to occur, ticks occuring every 15 seconds
 [
 	QGVAR(necrosisTicks),
     "SLIDER",
diff --git a/addons/brain/functions/fnc_findSaline.sqf b/addons/brain/functions/fnc_findSaline.sqf
new file mode 100644
index 000000000..6862b6ac7
--- /dev/null
+++ b/addons/brain/functions/fnc_findSaline.sqf
@@ -0,0 +1,33 @@
+#include "..\script_component.hpp"
+/*
+ * Author: apo_tle, from _pharma_fnc_salineCheck
+ * Check for any active saline IV
+ *
+ * Arguments:
+ * 0: Patient 
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [_patient] call kat_pharma_fnc_findSaline;
+ *
+ * Public: No
+ */
+
+params ["_patient"];
+
+private _fluidCheck = _patient getVariable [QACEGVAR(medical,ivBags), []];
+private _check = false;
+
+{
+    _x params ["_bagVolumeRemaining", "_type"];
+
+    if (_type isEqualTo "Saline" && _bagVolumeRemaining >= 30) exitWith {
+        _check = true;
+    };
+} forEach _fluidCheck;
+
+if (_check) exitWith {true};
+
+false
diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf
index 100b1d6d1..cfaef91ec 100644
--- a/addons/brain/functions/fnc_handleBrainActivity.sqf
+++ b/addons/brain/functions/fnc_handleBrainActivity.sqf
@@ -58,7 +58,7 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith {
 	private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0];
 
 	//Finally, calculate total brain metabolic rate
-	private _CMR = 100 * (_rO2/80) * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100);
+	private _CMR = 100 * ((100-_necrosis)/100) * ((100-_reversibleDamage)/100);
 
 	_unit setVariable [QGVAR(necrosis),_necrosis,true];
 	_unit setVariable [QGVAR(CMR),_CMR,true];
@@ -69,8 +69,10 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith {
 		
 		private _newICP = _ICP - GVAR(ICPreduction);
 		
-		// Set "floors" for ICP, preventing ICP from returning to normal levels without pain suppression
-		if (GET_PAIN_SUPPRESS(_unit) < 0.6) then {
+		// Set "floors" for ICP, preventing ICP from returning to normal levels without saline
+		private _hasSaline = [_unit] call FUNC(findSaline);
+		private _hasMaxBlood = (GET_SIMPLE_BLOOD_VOLUME(_unit) >= 6); // We cannot put more than 6L of fluid into a patient, so saline cannot transfuse above this
+		if (!(_hasSaline || _hasMaxblood) ) then {
 			switch (true) do {
 				case (ICP >= 45): {
 					_newICP = 45 max _newICP;
@@ -78,7 +80,7 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith {
 				case (ICP >= 38): {
 					_newICP = 38 max _newICP;
 				};
-				default { //Prevent ICP from returning to normal without medication
+				default { //Prevent ICP from returning to normal without saline
 					_newICP = 25 max _newICP;
 				};
 			};

From c477676de99ea2693602d0b7193933101645c431 Mon Sep 17 00:00:00 2001
From: WishaWoshi 
Date: Sun, 13 Oct 2024 21:38:46 +0100
Subject: [PATCH 35/37] Add ICP loss multiplier during saline transfusion

---
 addons/brain/XEH_preInit.sqf                       | 10 ++++++++++
 addons/brain/functions/fnc_handleBrainActivity.sqf |  8 +++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf
index 97d80df67..02b2f3c3d 100644
--- a/addons/brain/XEH_preInit.sqf
+++ b/addons/brain/XEH_preInit.sqf
@@ -28,6 +28,16 @@ PREP_RECOMPILE_END;
     true
 ] call CBA_Settings_fnc_init;
 
+//Multiplier for ICP reduction if saline is being transfused
+[
+	QGVAR(ICPreductionMult),
+    "SLIDER",
+    [LLSTRING(SETTING_ICPreductionMult)],
+    [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
+    [1, 3, 1.3, 1],
+    true
+] call CBA_Settings_fnc_init;
+
 // Minimum CMR to sustain consciousness. Not achieving will prevent awakening
 [
 	QGVAR(stableCMR),
diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf
index cfaef91ec..38d094530 100644
--- a/addons/brain/functions/fnc_handleBrainActivity.sqf
+++ b/addons/brain/functions/fnc_handleBrainActivity.sqf
@@ -67,11 +67,13 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith {
 	//Reduce ICP if no longer swelling
 	if (_unit getVariable [QGVAR(concussionPFH),0] isEqualTo 0) then {
 		
-		private _newICP = _ICP - GVAR(ICPreduction);
+		private _hasSaline = [_unit] call FUNC(findSaline);
+		private _hasMaxBlood = (GET_SIMPLE_BLOOD_VOLUME(_unit) >= 6); // Workaround for not being able to overfill with fluids (no saline ivs can be started if no blood loss)
+		
+		private _icpReduction = [GVAR(ICPreduction),GVAR(ICPreduction)*GVAR(ICPreductionMult)] select _hasSaline; // Multiply ICP reduction if saline present
+		private _newICP = _ICP - _icpReduction;
 		
 		// Set "floors" for ICP, preventing ICP from returning to normal levels without saline
-		private _hasSaline = [_unit] call FUNC(findSaline);
-		private _hasMaxBlood = (GET_SIMPLE_BLOOD_VOLUME(_unit) >= 6); // We cannot put more than 6L of fluid into a patient, so saline cannot transfuse above this
 		if (!(_hasSaline || _hasMaxblood) ) then {
 			switch (true) do {
 				case (ICP >= 45): {

From 871028e015ef625a2d889170fd600f28d3506e6c Mon Sep 17 00:00:00 2001
From: WishaWoshi 
Date: Mon, 14 Oct 2024 21:32:19 +0100
Subject: [PATCH 36/37] Reduce reversible damage while not swelling

---
 addons/brain/XEH_preInit.sqf                  | 41 +++++++++++--------
 addons/brain/functions/fnc_concussion.sqf     |  4 +-
 .../functions/fnc_handleBrainActivity.sqf     |  8 ++--
 .../functions/fnc_setSeizureState.sqf         |  1 -
 4 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf
index 02b2f3c3d..2cc5a4600 100644
--- a/addons/brain/XEH_preInit.sqf
+++ b/addons/brain/XEH_preInit.sqf
@@ -68,6 +68,26 @@ PREP_RECOMPILE_END;
     true
 ] call CBA_Settings_fnc_init;
 
+// Minimum ICP required for bradycardia to occur as a result
+[
+	QGVAR(ICPbradycardiaThreshold),
+    "SLIDER",
+    [LLSTRING(SETTING_ICPbradycardiaThreshold)],
+    [CBA_SETTINGS_CAT, LSTRING(SubCategory_Basic)],
+    [20, 70, 50, 1],
+    true
+] call CBA_Settings_fnc_init;
+
+//Chance of bradycardia occuring
+[
+	QGVAR(ICPbradycardiaChance),
+    "SLIDER",
+    [LLSTRING(SETTING_ICPbradycardiaChance)],
+    [CBA_SETTINGS_CAT, LSTRING(SubCategory_Basic)],
+    [0, 100, 15, 1],
+    true
+] call CBA_Settings_fnc_init;
+
 //Chance of a concussion occuring
 [
 	QGVAR(concussionChance),
@@ -98,24 +118,13 @@ PREP_RECOMPILE_END;
     true
 ] call CBA_Settings_fnc_init;
 
-// Minimum ICP required for bradycardia to occur as a result
+//How much reversible damage will decrease by every tick
 [
-	QGVAR(ICPbradycardiaThreshold),
+	QGVAR(reversibleDamageLoss),
     "SLIDER",
-    [LLSTRING(SETTING_ICPbradycardiaThreshold)],
-    [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)],
-    [20, 70, 50, 1],
-    true
-] call CBA_Settings_fnc_init;
-
-
-//Chance of bradycardia occuring
-[
-	QGVAR(ICPbradycardiaChance),
-    "SLIDER",
-    [LLSTRING(SETTING_ICPbradycardiaChance)],
-    [CBA_SETTINGS_CAT, LSTRING(SubCategory_Concussions)],
-    [0, 100, 15, 1],
+    [LLSTRING(SETTING_reversibleDamageLoss)],
+    [CBA_SETTINGS_CAT, LSTRING(SubCategory_BrainDeath)],
+    [0, 2, 0.4, 1],
     true
 ] call CBA_Settings_fnc_init;
 
diff --git a/addons/brain/functions/fnc_concussion.sqf b/addons/brain/functions/fnc_concussion.sqf
index 0d2a7fee5..32b6243ea 100644
--- a/addons/brain/functions/fnc_concussion.sqf
+++ b/addons/brain/functions/fnc_concussion.sqf
@@ -40,14 +40,14 @@ if (floor (random 100) <= _concussionChance) then {
 		// Add instantaneous effects from concussions
 		if (_damage > GVAR(necrosisImpactDamage)) then { // Cause instant necrosis if threshold is surpassed
 			private _necrosis = _unit getVariable [QGVAR(necrosis),0];
-			private _newNecrosis = linearConversion [0, 1,_damage,0,4,true]; //Increase tissue necrosis by 1% max on impact
+			private _newNecrosis = linearConversion [0, 1,_damage,0,7,true]; //Increase tissue necrosis by 7% max on impact
 			if (_newNecrosis > _necrosis) then { // Prevent reverting existing necrosis levels
 				_unit setVariable [QGVAR(necrosis),_newNecrosis,true]; 
 			};
 		};
 		if (_damage > GVAR(tissueImpactDamage)) then { // Cause reversible tissue damage if threshold is surpassed
 			private _reversibleDamage = _unit getVariable [QGVAR(reversibleDamage),0];
-			_reversibleDamage = _reversibleDamage + (linearConversion [0,1,_damage,0,15,true]); //Increase reversible damage by max 5% on impact
+			_reversibleDamage = _reversibleDamage + (linearConversion [0,1,_damage,0,25,true]); //Increase reversible damage by max 25% on impact
 			_unit setVariable [QGVAR(reversibleDamage),_reversibleDamage,true];
 		};
 
diff --git a/addons/brain/functions/fnc_handleBrainActivity.sqf b/addons/brain/functions/fnc_handleBrainActivity.sqf
index 38d094530..b24364ba7 100644
--- a/addons/brain/functions/fnc_handleBrainActivity.sqf
+++ b/addons/brain/functions/fnc_handleBrainActivity.sqf
@@ -64,15 +64,14 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith {
 	_unit setVariable [QGVAR(CMR),_CMR,true];
 
 	private _ICP = _unit getVariable [QGVAR(ICP),15];
-	//Reduce ICP if no longer swelling
+	
 	if (_unit getVariable [QGVAR(concussionPFH),0] isEqualTo 0) then {
 		
+		//Reduce ICP if no longer swelling
 		private _hasSaline = [_unit] call FUNC(findSaline);
 		private _hasMaxBlood = (GET_SIMPLE_BLOOD_VOLUME(_unit) >= 6); // Workaround for not being able to overfill with fluids (no saline ivs can be started if no blood loss)
-		
 		private _icpReduction = [GVAR(ICPreduction),GVAR(ICPreduction)*GVAR(ICPreductionMult)] select _hasSaline; // Multiply ICP reduction if saline present
 		private _newICP = _ICP - _icpReduction;
-		
 		// Set "floors" for ICP, preventing ICP from returning to normal levels without saline
 		if (!(_hasSaline || _hasMaxblood) ) then {
 			switch (true) do {
@@ -89,6 +88,9 @@ if (!GVAR(enable) || _unit getVariable [QGVAR(activityPFH),false]) exitWith {
 		};
 		_newICP = 15 max _newICP;
 		_unit setVariable [QGVAR(ICP),_newICP,true];
+
+		//Reduce reversible tissue damage
+		_unit setVariable [QGVAR(reversibleDamage),_reversibleDamage-GVAR(reversibleDamageLoss),true];
 	};
 
 	//Chance to cause bradycardia if ICP is too high
diff --git a/addons/statemachine/functions/fnc_setSeizureState.sqf b/addons/statemachine/functions/fnc_setSeizureState.sqf
index afe7b4547..37c68da2b 100644
--- a/addons/statemachine/functions/fnc_setSeizureState.sqf
+++ b/addons/statemachine/functions/fnc_setSeizureState.sqf
@@ -23,5 +23,4 @@
 
  _unit setVariable [VAR_SEIZURE, _active, true];
 
- //TODO play seizure animation
  [_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); //temporary, switch to seizure anim later
\ No newline at end of file

From 183cad29d1091197771d5ecb79374cd044ccf0ec Mon Sep 17 00:00:00 2001
From: WishaWoshi 
Date: Mon, 14 Oct 2024 23:06:46 +0100
Subject: [PATCH 37/37] Add low cmr effect (non functional)

---
 addons/brain/XEH_preInit.sqf                  |  4 +-
 addons/feedback/XEH_PREP.hpp                  |  1 +
 addons/feedback/XEH_preInit.sqf               |  9 ++++
 .../feedback/functions/fnc_effectLossCMR.sqf  | 44 +++++++++++++++++++
 .../feedback/functions/fnc_handleEffects.sqf  |  3 ++
 addons/feedback/functions/fnc_initEffects.sqf |  7 +++
 addons/feedback/script_component.hpp          |  5 ++-
 addons/main/script_macros.hpp                 | 16 +++++++
 .../functions/fnc_setSeizureState.sqf         |  2 +-
 9 files changed, 87 insertions(+), 4 deletions(-)
 create mode 100644 addons/feedback/functions/fnc_effectLossCMR.sqf

diff --git a/addons/brain/XEH_preInit.sqf b/addons/brain/XEH_preInit.sqf
index 2cc5a4600..b34d46a6a 100644
--- a/addons/brain/XEH_preInit.sqf
+++ b/addons/brain/XEH_preInit.sqf
@@ -73,7 +73,7 @@ PREP_RECOMPILE_END;
 	QGVAR(ICPbradycardiaThreshold),
     "SLIDER",
     [LLSTRING(SETTING_ICPbradycardiaThreshold)],
-    [CBA_SETTINGS_CAT, LSTRING(SubCategory_Basic)],
+    [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
     [20, 70, 50, 1],
     true
 ] call CBA_Settings_fnc_init;
@@ -83,7 +83,7 @@ PREP_RECOMPILE_END;
 	QGVAR(ICPbradycardiaChance),
     "SLIDER",
     [LLSTRING(SETTING_ICPbradycardiaChance)],
-    [CBA_SETTINGS_CAT, LSTRING(SubCategory_Basic)],
+    [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
     [0, 100, 15, 1],
     true
 ] call CBA_Settings_fnc_init;
diff --git a/addons/feedback/XEH_PREP.hpp b/addons/feedback/XEH_PREP.hpp
index 42df1399d..168d4c257 100644
--- a/addons/feedback/XEH_PREP.hpp
+++ b/addons/feedback/XEH_PREP.hpp
@@ -1,4 +1,5 @@
 PREP(effectLowSpO2);
+PREP(effectLossCMR);
 PREP(effectOpioid);
 PREP(handleEffects);
 PREP(initEffects);
\ No newline at end of file
diff --git a/addons/feedback/XEH_preInit.sqf b/addons/feedback/XEH_preInit.sqf
index 9e766b44e..71ec6aaa8 100644
--- a/addons/feedback/XEH_preInit.sqf
+++ b/addons/feedback/XEH_preInit.sqf
@@ -27,4 +27,13 @@ PREP_RECOMPILE_END;
     true
 ] call CBA_Settings_fnc_init;
 
+[
+    QGVAR(enableBrainEffect),
+    "CHECKBOX",
+    [LLSTRING(SETTING_BrainEffect_display), LLSTRING(SETTING_BrainEffect_DESC)],
+    CBA_SETTINGS_CAT,
+    [true],
+    true
+] call CBA_Settings_fnc_init;
+
 ADDON = true;
diff --git a/addons/feedback/functions/fnc_effectLossCMR.sqf b/addons/feedback/functions/fnc_effectLossCMR.sqf
new file mode 100644
index 000000000..213958ee7
--- /dev/null
+++ b/addons/feedback/functions/fnc_effectLossCMR.sqf
@@ -0,0 +1,44 @@
+#include "..\script_component.hpp"
+/*
+ * Author: apo_tle, MiszczuZPolski
+ * Triggers the minor CMR effect, radial blur.
+ *
+* Arguments:
+ * 0: Enable 
+ * 1: Current CMR 
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [true, 0.5] call kat_feedback_fnc_effectMinorLossCMR;
+ *
+ * Public: No
+ */
+
+params ["_enable", "_cmr"];
+
+if !GVAR(enableBrainEffect) exitWith {};
+if ((!_enable) || {_cmr > 200}) exitWith {
+    if (GVAR(minorLossCMR) != -1) then { GVAR(minorLossCMR) ppEffectEnable false; };
+};
+if (GVAR(minorLossCMR) != -1) then { GVAR(minorLossCMR) ppEffectEnable true; };
+
+// Trigger effect every 2s
+private _showNextTick = missionNamespace getVariable [QGVAR(showBrainNextTick), true];
+GVAR(showBrainNextTick) = !_showNextTick;
+if (_showNextTick) exitWith {};
+
+private _initialAdjust = [];
+private _delayedAdjust = [];
+
+_initialAdjust = [1.5];
+_delayedAdjust = [0];
+
+GVAR(minorLossCMR) ppEffectAdjust _initialAdjust;
+GVAR(minorLossCMR) ppEffectCommit FX_MINOR_CMR_FADE_IN;
+[{
+    params ["_adjust"];
+    GVAR(minorLossCMR) ppEffectAdjust _adjust;
+    GVAR(minorLossCMR) ppEffectCommit FX_MINOR_CMR_FADE_OUT;
+}, [_delayedAdjust], FX_MINOR_CMR_FADE_IN] call CBA_fnc_waitAndExecute;
diff --git a/addons/feedback/functions/fnc_handleEffects.sqf b/addons/feedback/functions/fnc_handleEffects.sqf
index a178e9c77..dd5ff7b46 100644
--- a/addons/feedback/functions/fnc_handleEffects.sqf
+++ b/addons/feedback/functions/fnc_handleEffects.sqf
@@ -19,6 +19,7 @@ params [["_manualUpdate", false]];
 if (ACEGVAR(common,OldIsCamera) || {!alive ACE_player}) exitWith {
     [false]    call FUNC(effectOpioid);
     [false]    call FUNC(effectLowSpO2);
+    [false]    call FUNC(effectLossCMR);
 };
 
 BEGIN_COUNTER(handleEffects);
@@ -27,6 +28,7 @@ BEGIN_COUNTER(handleEffects);
 private _opioid          = GET_PP(ACE_player);
 private _spO2             = GET_SPO2(ACE_player);
 private _unconscious      = IS_UNCONSCIOUS(ACE_player);
+private _cmr             = GET_CMR(ACE_player);
 
 // - Visual effects -----------------------------------------------------------
 
@@ -37,5 +39,6 @@ private _unconscious      = IS_UNCONSCIOUS(ACE_player);
     linearConversion [GVAR(effectLowSpO2), EGVAR(breathing,SpO2_dieValue), _spO2, 0, 1, true]
 ] call FUNC(effectLowSpO2);
 
+[!_unconscious, _cmr] call FUNC(effectLossCMR);
 
 END_COUNTER(handleEffects);
diff --git a/addons/feedback/functions/fnc_initEffects.sqf b/addons/feedback/functions/fnc_initEffects.sqf
index ff0cbe28b..e31a2e64f 100644
--- a/addons/feedback/functions/fnc_initEffects.sqf
+++ b/addons/feedback/functions/fnc_initEffects.sqf
@@ -45,3 +45,10 @@ GVAR(lowSpO2) = [
     21370,
     [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]
 ] call _fnc_createEffect;
+
+// - Low CMR (brain addon) ---------------------------------------------
+GVAR(minorLossCMR) = [
+    "DynamicBlur",
+    213702,
+    [0]
+] call _fnc_createEffect;
diff --git a/addons/feedback/script_component.hpp b/addons/feedback/script_component.hpp
index 334ceebe7..7627cccb7 100644
--- a/addons/feedback/script_component.hpp
+++ b/addons/feedback/script_component.hpp
@@ -20,4 +20,7 @@
 #define FX_OPIOD_FADE_OUT  0.7
 
 #define FX_SPO2_FADE_IN   0.7
-#define FX_SPO2_FADE_OUT  1.6
\ No newline at end of file
+#define FX_SPO2_FADE_OUT  1.6
+
+#define FX_MINOR_CMR_FADE_IN  0.5
+#define FX_MINOR_CMR_FADE_OUT  1.8
\ No newline at end of file
diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp
index e9857f75c..f3d6b067d 100644
--- a/addons/main/script_macros.hpp
+++ b/addons/main/script_macros.hpp
@@ -298,6 +298,22 @@
 #define OXYGEN_PERCENTAGE_ARREST 80
 #define OXYGEN_PERCENTAGE_FATAL 75
 
+// Brain
+#define VAR_CMR                 QEGVAR(brain,CMR) // Cerebral Metabolic Rate (%)
+#define VAR_CBF                 QEGVAR(brain,CBF) // Cerebral Blood Flow
+#define VAR_CVR                 QEGVAR(brain,CVR) // Cerebral Vascular Resistance
+#define VAR_ICP                 QEGVAR(brain,ICP) // Intracranial Pressure
+#define VAR_CPR                 QEGVAR(brain,CPR) // Cerebral Perfusion Rate
+#define VAR_RO2                 QEGVAR(brain,rO2) // Brain O2 saturation
+
+
+#define GET_CMR(unit)                  (unit getVariable [VAR_CMR, 100])
+#define GET_CBF(unit)                  (unit getVariable [VAR_CBF, 800])
+#define GET_CVR(unit)                  (unit getVariable [VAR_CVR, 0.1])
+#define GET_ICP(unit)                  (unit getVariable [VAR_ICP, 15])
+#define GET_CPR(unit)                  (unit getVariable [VAR_CPR, 100])
+#define GET_RO2(unit)                  (unit getVariable [VAR_RO2, 80])
+
 // Breathing
 #define VAR_SURFACE_AREA                400
 #define GET_KAT_SURFACE_AREA(unit)      (VAR_SURFACE_AREA - (((unit getVariable [QEGVAR(breathing,pneumothorax), 0]) * 75)))
diff --git a/addons/statemachine/functions/fnc_setSeizureState.sqf b/addons/statemachine/functions/fnc_setSeizureState.sqf
index 37c68da2b..f719dbab6 100644
--- a/addons/statemachine/functions/fnc_setSeizureState.sqf
+++ b/addons/statemachine/functions/fnc_setSeizureState.sqf
@@ -23,4 +23,4 @@
 
  _unit setVariable [VAR_SEIZURE, _active, true];
 
- [_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); //temporary, switch to seizure anim later
\ No newline at end of file
+ [_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); //temporary, switch to seizure anim later maybe
\ No newline at end of file