Medical GUI - Show number of available treatment items in medical menu (#9474)

* Initial implementation of item count display

* Put everything inside function, add padding

* Extract and explain null string

* Fix tab in config file

* Add function header

* Use ACE item counting function

* Extract column width to variable

* Move constants declaration closer to usage

* Add special case for sutures

* Add setting to enable/disable

* Expand to allow showing in tooltip

* Split into counting and formatting function

* Fix incorrect check for case with no items

* Remove ineffective padding from tooltip

* Check for surgical kit item instead of display name

* Update return description in header

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Add `private` keyword for inline functions

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* capitalization/vars

Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com>

* nil checks, localize macro

Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com>

* Remove button text mode and setting

* possessive

* Update addons/medical_gui/functions/fnc_formatItemCounts.sqf

---------

Co-authored-by: PabstMirror <pabstmirror@gmail.com>
Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>
Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com>
This commit is contained in:
amsteadrayle 2023-10-12 22:39:23 -04:00 committed by GitHub
parent e52594112d
commit 1e3d9cc22a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 109 additions and 2 deletions

View File

@ -2,9 +2,11 @@ PREP(addTreatmentActions);
PREP(bloodLossToRGBA); PREP(bloodLossToRGBA);
PREP(canOpenMenu); PREP(canOpenMenu);
PREP(collectActions); PREP(collectActions);
PREP(countTreatmentItems);
PREP(damageToRGBA); PREP(damageToRGBA);
PREP(displayPatientInformation); PREP(displayPatientInformation);
PREP(displayTriageCard); PREP(displayTriageCard);
PREP(formatItemCounts);
PREP(handleToggle); PREP(handleToggle);
PREP(handleTriageSelect); PREP(handleTriageSelect);
PREP(menuPFH); PREP(menuPFH);

View File

@ -24,8 +24,9 @@ GVAR(actions) = [];
private _category = getText (_x >> "category"); private _category = getText (_x >> "category");
private _condition = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,canTreatCached)), ALL_BODY_PARTS, _configName]; private _condition = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,canTreatCached)), ALL_BODY_PARTS, _configName];
private _statement = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,treatment)), ALL_BODY_PARTS, _configName]; private _statement = compile format [QUOTE([ARR_4(ACE_player, GVAR(target), %1 select GVAR(selectedBodyPart), '%2')] call DEFUNC(medical_treatment,treatment)), ALL_BODY_PARTS, _configName];
private _items = getArray (_x >> "items");
GVAR(actions) pushBack [_displayName, _category, _condition, _statement]; GVAR(actions) pushBack [_displayName, _category, _condition, _statement, _items];
} forEach configProperties [configFile >> QEGVAR(medical_treatment,actions), "isClass _x"]; } forEach configProperties [configFile >> QEGVAR(medical_treatment,actions), "isClass _x"];

View File

@ -0,0 +1,53 @@
#include "..\script_component.hpp"
/*
* Author: AmsteadRayle
* Counts how many of the given items are present between the medic and patient.
* If medic or patient are in a vehicle then vehicle's inventory will also be checked.
*
* Arguments:
* 0: Items <ARRAY>
*
* Return Value:
* Counts (can be nil) <ARRAY>
*
* Example:
* [items] call ace_medical_gui_fnc_countTreatmentItems
*
* Public: No
*/
params ["_items"];
private _medicCount = 0;
private _patientCount = nil;
private _vehicleCount = nil;
// Medic
{
_medicCount = _medicCount + ([ACE_player, _x] call EFUNC(common,getCountOfItem));
} forEach _items;
// Patient
if (ACE_player != GVAR(target)) then {
_patientCount = 0;
{
_patientCount = _patientCount + ([GVAR(target), _x] call EFUNC(common,getCountOfItem));
} forEach _items;
};
// Vehicle
private _medicVehicle = objectParent ACE_player;
private _patientVehicle = objectParent GVAR(target);
private _vehicle = if (!isNull _medicVehicle) then {_medicVehicle} else {_patientVehicle};
if (!isNull _vehicle) then {
_vehicleCount = 0;
(getItemCargo _vehicle) params ["_itemTypes", "_itemCounts"];
{
private _item = _x;
private _index = _itemTypes find _item;
_vehicleCount = _vehicleCount + (_itemCounts param [_index, 0]);
} forEach _items;
};
[_medicCount, _patientCount, _vehicleCount]

View File

@ -0,0 +1,32 @@
#include "..\script_component.hpp"
/*
* Author: AmsteadRayle
* Format item counts to be shown in the tooltip.
*
* Arguments:
* 0: Medic count <NUMBER>
* 1: Patient count <NUMBER>
* 2: Vehicle count <NUMBER>
*
* Return Value:
* Item count string <STRING>
*
* Example:
* [medicCount, patientCount, vehicleCount] call ace_medical_gui_fnc_formatItemCounts
*
* Public: No
*/
params ["_medicCount", "_patientCount", "_vehicleCount"];
private _countStrings = [format ["%1 %2", _medicCount, LLSTRING(TreatmentItemCount_Medic)]];
if ((EGVAR(medical_treatment,allowSharedEquipment) != 2) && {!isNil "_patientCount"}) then {
_countStrings pushBack format ["%1 %2", _patientCount, LLSTRING(TreatmentItemCount_Patient)];
};
if (!isNil "_vehicleCount") then {
_countStrings pushBack format ["%1 %2", _vehicleCount, LLSTRING(TreatmentItemCount_Vehicle)];
};
_countStrings joinString "\n"

View File

@ -38,7 +38,7 @@ if (_showTriage) exitWith {
// Show treatment options on action buttons // Show treatment options on action buttons
private _shownIndex = 0; private _shownIndex = 0;
{ {
_x params ["_displayName", "_category", "_condition", "_statement"]; _x params ["_displayName", "_category", "_condition", "_statement", "_items"];
// Check action category and condition // Check action category and condition
if (_category == _selectedCategory && {call _condition}) then { if (_category == _selectedCategory && {call _condition}) then {
@ -50,6 +50,16 @@ private _shownIndex = 0;
_ctrl ctrlSetPositionY POS_H(1.1 * _shownIndex); _ctrl ctrlSetPositionY POS_H(1.1 * _shownIndex);
_ctrl ctrlCommit 0; _ctrl ctrlCommit 0;
private _countText = "";
if (_items isNotEqualTo []) then {
if ("ACE_surgicalKit" in _items && {EGVAR(medical_treatment,consumeSurgicalKit) == 2}) then {
_items = ["ACE_suture"];
};
private _counts = [_items] call FUNC(countTreatmentItems);
_countText = _counts call FUNC(formatItemCounts);
};
_ctrl ctrlSetTooltip _countText;
_ctrl ctrlSetText _displayName; _ctrl ctrlSetText _displayName;
_ctrl ctrlShow true; _ctrl ctrlShow true;

View File

@ -1349,5 +1349,14 @@
<Key ID="STR_ACE_Medical_GUI_BodyLabelRight"> <Key ID="STR_ACE_Medical_GUI_BodyLabelRight">
<English>R</English> <English>R</English>
</Key> </Key>
<Key ID="STR_ACE_Medical_GUI_TreatmentItemCount_Medic">
<English>in your inventory</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_TreatmentItemCount_Patient">
<English>in patient's inventory</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_TreatmentItemCount_Vehicle">
<English>in vehicle's inventory</English>
</Key>
</Package> </Package>
</Project> </Project>