ACE3/addons/medical_treatment/functions/fnc_findMostEffectiveWounds.sqf

93 lines
3.4 KiB
Plaintext
Raw Normal View History

#include "..\script_component.hpp"
/*
* Author: kymckay, LinkIsGrim
* Finds the most effective wounds to bandage on the given bodypart of the patient for the given bandage type and remaining overall bandage effectiveness.
*
* Arguments:
Medical Treatment - Modernize and Cleanup (#6933) * Modernize and cleanup medical_treatment * One line for each old public function * Fix litterCleanupDelay name * Improve adjustment calcs / wound blood loss / medications fix func descriptions Calc wound blood loss on events reorder includes so scritpmacroMed has global effect trivial optimization for getCardiacOutput Fix var Fix wounds not reopening (nil _category) Fix surgical kit inherting canBandage conditional debug hitpoints Update ACE_Medical_Treatment_Actions.hpp Use woundBleeding for IS_BLEEDING macro rework medication vars comments Reset var in init / fullHeal Update addons/medical_treatment/functions/fnc_onMedicationUsage.sqf Co-Authored-By: PabstMirror <pabstmirror@gmail.com> * Change wound data array Drop unique id and merge classId and category * Splinting and treatment and gui * Add arm fractures and aim effects * localizations and event * fix * fix merge for renamed files * Fixes and code review changes * Move medical logs clearing to treatment * More cleanup work * cleanup * Apply suggestions from code review Co-Authored-By: PabstMirror <pabstmirror@gmail.com> * formating, rename bone images * Fix args for setDead call in actionPlaceInBodyBag * Apply suggestions from code review Co-Authored-By: PabstMirror <pabstmirror@gmail.com> * disable calls to extension * Update fnc_onMedicationUsage.sqf * Medical - Skip unneeded setVars on initUnit (#6949) * Medical - Transfer state machine state on locality (#6950) * Medical - Transfer state machine state on locality * Fix feedback isUnconscious var * Exclude AI * Make UAV excludes consistant, formating * Update fnc_treatmentFullHealLocal.sqf * reset fractures on respawn * Fix merge * Add PAK time coefficient setting * Fix medication * Add ace_medical_replacementItems config array * checkItems performance improvement * Treatment - cap max animation speed (#6995) * Treatment - cap max animation speed and add lock to prevent AF from reseting anim * Update fnc_getBandageTime.sqf * Use local version of setAnimSpeedCoef * Revert "Use local version of setAnimSpeedCoef" This reverts commit 36c22a90473fd0670ab97f3a373e4ae08493ff52. * Move replacementItems compiling to preInit * Improve replacementItems compiling * Cleanup splint functions, use macros for fractures * Rename splintCondition to canSplint * Add cprCreatesPulse setting * Cleanup remaining functions * Capitalize stringtable entry names * getStitchTime function and fix treatment locations * Update addons/medical_treatment/functions/fnc_getHealTime.sqf Co-Authored-By: SilentSpike <silentspike100+Github@gmail.com>
2019-06-03 15:31:46 +00:00
* 0: Patient <OBJECT>
* 1: Treatment classname <STRING>
* 2: Body part <STRING>
* 3: Amount of bandage remaining <NUMBER> (default: 1)
* 4: Wounds found from prior runs of the function <HASHMAP> (default: Empty Hashmap)
*
* Return Value:
* [Wound, [Effectiveness, Index, Impact]] <HASHMAP> of <ARRAY>:<NUMBER, NUMBER, NUMBER>
*
* Example:
* [cursorObject, "FieldDressing", "rightleg"] call ace_medical_treatment_fnc_findMostEffectiveWounds
*
* Public: No
*/
params ["_patient", "_bandage", "_bodyPart", ["_bandageRemaining", 1], ["_foundWounds", createHashMap]];
TRACE_1("findMostEffectiveWounds",count _foundWounds);
// Get the default effectiveness for the used bandage
private _config = configFile >> QUOTE(ADDON) >> "Bandaging";
private _effectiveness = getNumber (_config >> "effectiveness");
if (isClass (_config >> _bandage)) then {
_config = (_config >> _bandage);
if (isNumber (_config >> "effectiveness")) then {
_effectiveness = getNumber (_config >> "effectiveness");
};
};
// Iterate over open wounds to find the most effective target
private _openWounds = GET_OPEN_WOUNDS(_patient) getOrDefault [_bodyPart, []];
if (_openWounds isEqualTo []) exitWith {_foundWounds};
private _wound = EMPTY_WOUND;
private _woundIndex = -1;
private _effectivenessFound = -1;
private _impactFound = -1;
{
// Ignore iterated wounds
if (_x in _foundWounds) then {continue};
_x params ["_classID", "_amountOf", "_bleeding", "_damage"];
private _woundEffectiveness = _effectiveness;
// Select the classname from the wound classname storage
private _className = EGVAR(medical_damage,woundClassNamesComplex) select _classID;
// Get the effectiveness of the bandage on this wound type
if (isClass (_config >> _className)) then {
private _woundTreatmentConfig = _config >> _className;
if (isNumber (_woundTreatmentConfig >> "effectiveness")) then {
_woundEffectiveness = getNumber (_woundTreatmentConfig >> "effectiveness");
};
} else {
// Basic medical bandage just has a base level config (same effectiveness for all wound types)
if (_bandage != "BasicBandage") then {
WARNING_2("No config for wound type [%1] config base [%2]",_className,_config);
};
};
// Multiply by bandageRemaining in case this is a rollover
_woundEffectiveness = _woundEffectiveness * _bandageRemaining;
// Track most effective found so far
if ((_woundEffectiveness * _amountOf * _bleeding) > (_effectivenessFound * (_wound select 1) * (_wound select 2))) then {
_effectivenessFound = _woundEffectiveness;
_impactFound = _amountOf min _effectivenessFound;
_woundIndex = _forEachIndex;
_wound = _x;
};
} forEach _openWounds;
if (_woundIndex isEqualTo -1) exitWith {_foundWounds};
_bandageRemaining = _bandageRemaining - (_impactFound/_effectivenessFound);
_foundWounds set [_wound, [_effectivenessFound, _woundIndex, _impactFound]];
// recursion, run function again to find next most effective wound
if (GVAR(bandageRollover) && {_bandageRemaining > 0}) then {
[_patient, _bandage, _bodyPart, _bandageRemaining, _foundWounds] call FUNC(findMostEffectiveWounds);
};
_foundWounds // return