#include "script_component.hpp" /* * Author: Glowbal, commy2 * Parse the ACE_Medical_Advanced config for all injury types. * * Arguments: * None * * ReturnValue: * None * * Example: * [] call ace_medical_damage_fnc_parseConfigForInjuries * * Public: No */ private _injuriesConfigRoot = configFile >> "ACE_Medical_Injuries"; // --- parse wounds GVAR(woundClassNames) = []; GVAR(woundClassNamesComplex) = []; // index = 10 * classID + category; [will contain nils] e.g. ["aMinor", "aMed", "aLarge", nil, nil..."bMinor"] GVAR(woundDetails) = createHashMap; private _woundsConfig = _injuriesConfigRoot >> "wounds"; private _classID = 0; { private _entry = _x; private _className = configName _entry; private _selections = GET_ARRAY(_entry >> "selections",["All"]); private _bleeding = GET_NUMBER(_entry >> "bleeding",0); private _pain = GET_NUMBER(_entry >> "pain",0); private _causeLimping = GET_NUMBER(_entry >> "causeLimping",0) == 1; private _causeFracture = GET_NUMBER(_entry >> "causeFracture",0) == 1; private _details = [_selections, _bleeding, _pain, _causeLimping, _causeFracture]; GVAR(woundDetails) set [_className, _details]; GVAR(woundDetails) set [_classID, _details]; GVAR(woundClassNames) pushBack _className; { GVAR(woundClassNamesComplex) set [10 * _classID + _forEachIndex, format ["%1%2", _className, _x]]; } forEach ["Minor", "Medium", "Large"]; _classID = _classID + 1; } forEach configProperties [_woundsConfig, "isClass _x"]; // --- parse damage types GVAR(damageTypeDetails) = createHashMap; // cache for ammunition -> damageType GVAR(damageTypeCache) = createHashMap; // minimum lethal damage collection, mapped to damageTypes private _damageTypesConfig = _injuriesConfigRoot >> "damageTypes"; private _thresholdsDefault = getArray (_damageTypesConfig >> "thresholds"); private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionSpecific"); private _defaultWoundHandlers = []; if (isClass (_damageTypesConfig >> "woundHandlers")) then { _defaultWoundHandlers = [_damageTypesConfig >> "woundHandlers"] call FUNC(parseWoundHandlersCfg); reverse _defaultWoundHandlers; }; TRACE_1("Found default wound handlers", count _defaultWoundHandlers); // Collect all available damage types from the config { private _entry = _x; private _className = configName _entry; if (_className == "woundHandlers") then {continue}; GVAR(damageTypeCache) set [_className, _className]; GVAR(damageTypeCache) set ["#"+_className, _className]; private _damageTypeSubClassConfig = _damageTypesConfig >> _className; private _thresholds = GET_ARRAY(_damageTypeSubClassConfig >> "thresholds",_thresholdsDefault); private _selectionSpecific = GET_NUMBER(_damageTypeSubClassConfig >> "selectionSpecific",_selectionSpecificDefault); private _woundHandlers = []; if (isClass (_damageTypeSubClassConfig >> "woundHandlers")) then { _woundHandlers = [_damageTypeSubClassConfig >> "woundHandlers"] call FUNC(parseWoundHandlersCfg); reverse _woundHandlers; TRACE_2("Damage type found wound handlers", _className, count _woundHandlers); } else { _woundHandlers = _defaultWoundHandlers; TRACE_1("Damage type has no wound handlers, using default", _className); }; /* // extension loading private _minDamageThresholds = (_thresholds apply {str (_x select 0)}) joinString ":"; private _amountThresholds = (_thresholds apply {str (_x select 1)}) joinString ":"; // load in the damage types into the medical extension private _extensionArgs = format [ "addDamageType,%1,%2,%3,%4,%5", _className, 1, //@todo remove 'minLethalDamage' from extension _minDamageThresholds, _amountThresholds, _selectionSpecific ]; TRACE_1("",_extensionArgs); // private _extensionRes = "ace_medical" callExtension _extensionArgs; // TRACE_1("",_extensionRes); */ // parse config for each wound this damage type can cause private _damageWoundDetails = []; { private _woundType = configName _x; if (_woundType == "woundHandlers") then {continue}; if (_woundType in GVAR(woundDetails)) then { private _weighting = GET_ARRAY(_x >> "weighting",[[ARR_2(0,1)]]); private _dmgMulti = GET_NUMBER(_x >> "damageMultiplier", 1); private _bleedMulti = GET_NUMBER(_x >> "bleedingMultiplier", 1); private _sizeMulti = GET_NUMBER(_x >> "sizeMultiplier", 1); private _painMulti = GET_NUMBER(_x >> "painMultiplier", 1); private _fractureMulti = GET_NUMBER(_x >> "fractureMultiplier", 1); _damageWoundDetails pushBack [_woundType, _weighting, _dmgMulti, _bleedMulti, _sizeMulti, _painMulti, _fractureMulti]; } else { WARNING_2("Damage type %1 refers to wound %2, but it doesn't exist: skipping.",_className,configName _x); }; } forEach configProperties [_damageTypeSubClassConfig, "isClass _x"]; GVAR(damageTypeDetails) set [_className, [_thresholds, _selectionSpecific, _woundHandlers, _damageWoundDetails]]; } forEach configProperties [_damageTypesConfig, "isClass _x"]; /* // extension loading { _x params ["_classID", "_selections", "_bleedingRate", "_pain", "_damageExtrema", "_causes", "_displayName"]; _damageExtrema params ["_minDamage", "_maxDamage"]; private _className = GVAR(woundClassNames) select _forEachIndex; if (_displayName isEqualTo "") then { _displayName = _className; }; private _selections = _selections joinString ":"; private _causes = _causes joinString ":"; private _extensionArgs = format [ "addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _selections, _bleedingRate, _pain, _minDamage, _maxDamage, _causes, _displayName ]; TRACE_1("",_extensionArgs); // private _extensionRes = "ace_medical" callExtension _extensionArgs; // TRACE_1("",_extensionRes); } forEach GVAR(woundsData); // "ace_medical" callExtension "ConfigComplete"; */