From 1ba330e853f55916e6c3d640ee4dd6713ea10d3b Mon Sep 17 00:00:00 2001 From: Josuan Albin Date: Thu, 21 Sep 2017 20:43:35 +0200 Subject: [PATCH] Add toggle flashlight and NVG zeus modules (#4556) * Add toggle flashlight and NVG modules * Remove excessive spaces in moduleToggleNvg * Fix indentation and typos to fit review * Add an option to add gear, fix headers * Change category to utility * Add QOL improvement suggested by pabst * Fix locality issues * Remove locality check before enableFlashlight targetEvent * Remove locality check before addWeaponItem targetEvent * Add a player check in moduleToggleNVG, change modules category * Add the same QOL in toggleNVG than in toggleFlashlight --- addons/common/XEH_postInit.sqf | 1 + addons/zeus/CfgVehicles.hpp | 12 ++ addons/zeus/XEH_PREP.hpp | 4 + addons/zeus/XEH_postInit.sqf | 4 + addons/zeus/config.cpp | 3 + .../functions/fnc_moduleToggleFlashlight.sqf | 64 ++++++++ addons/zeus/functions/fnc_moduleToggleNvg.sqf | 69 +++++++++ addons/zeus/functions/fnc_ui_ToggleNvg.sqf | 126 +++++++++++++++ .../functions/fnc_ui_toggleFlashlight.sqf | 143 ++++++++++++++++++ addons/zeus/stringtable.xml | 36 +++++ addons/zeus/ui/RscAttributes.hpp | 122 ++++++++++++++- 11 files changed, 583 insertions(+), 1 deletion(-) create mode 100644 addons/zeus/functions/fnc_moduleToggleFlashlight.sqf create mode 100644 addons/zeus/functions/fnc_moduleToggleNvg.sqf create mode 100644 addons/zeus/functions/fnc_ui_ToggleNvg.sqf create mode 100644 addons/zeus/functions/fnc_ui_toggleFlashlight.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 7ddf76d68e..0e5b578362 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -123,6 +123,7 @@ if (isServer) then { [QGVAR(switchMove), {(_this select 0) switchMove (_this select 1)}] call CBA_fnc_addEventHandler; [QGVAR(setVectorDirAndUp), {(_this select 0) setVectorDirAndUp (_this select 1)}] call CBA_fnc_addEventHandler; [QGVAR(setVanillaHitPointDamage), {(_this select 0) setHitPointDamage (_this select 1)}] call CBA_fnc_addEventHandler; +[QGVAR(addWeaponItem), {(_this select 0) addWeaponItem [(_this select 1), (_this select 2)]}] call CBA_fnc_addEventHandler; // Request framework [QGVAR(requestCallback), FUNC(requestCallback)] call CBA_fnc_addEventHandler; diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index d123684648..748e8ebf67 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -221,6 +221,18 @@ class CfgVehicles { function = QFUNC(moduleUnconscious); icon = QPATHTOF(UI\Icon_Module_Zeus_Unconscious_ca.paa); }; + class GVAR(moduleToggleNvg): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(AI); + displayName = CSTRING(moduleToggleNVG_DisplayName); + curatorInfoType = QGVAR(RscToggleNvg); + }; + class GVAR(moduleToggleFlashlight): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(AI); + displayName = CSTRING(moduleToggleFlashlight_DisplayName); + curatorInfoType = QGVAR(RscToggleFlashlight); + }; class GVAR(AddFullArsenal): GVAR(moduleBase) { curatorCanAttach = 1; category = QGVAR(Utility); diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 263b5e60b9..627be9846d 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -24,6 +24,8 @@ PREP(moduleSuppressiveFire); PREP(moduleSuppressiveFireLocal); PREP(moduleSurrender); PREP(moduleTeleportPlayers); +PREP(moduleToggleFlashlight); +PREP(moduleToggleNvg); PREP(moduleUnconscious); PREP(moduleZeusSettings); PREP(showMessage); @@ -37,4 +39,6 @@ PREP(ui_groupSide); PREP(ui_patrolArea); PREP(ui_searchArea); PREP(ui_teleportPlayers); +PREP(ui_toggleFlashlight); +PREP(ui_toggleNvg); PREP(zeusAttributes); diff --git a/addons/zeus/XEH_postInit.sqf b/addons/zeus/XEH_postInit.sqf index adf3d75a9b..5929e8664e 100644 --- a/addons/zeus/XEH_postInit.sqf +++ b/addons/zeus/XEH_postInit.sqf @@ -16,6 +16,10 @@ QGVAR(GlobalSkillAI) addPublicVariableEventHandler FUNC(moduleGlobalSetSkill); [QGVAR(moduleSearchNearby), CBA_fnc_searchNearby] call CBA_fnc_addEventHandler; [QGVAR(moduleSearchArea), CBA_fnc_taskSearchArea] call CBA_fnc_addEventHandler; [QGVAR(suppressiveFire), LINKFUNC(moduleSuppressiveFireLocal)] call CBA_fnc_addEventHandler; +[QGVAR(enableFlashlight), { + params ["_unit", "_mode"]; + _unit enableGunLights _mode; +}] call CBA_fnc_addEventHandler; // Editable object commands must be ran on server, this events are used in the respective module if (isServer) then { diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 16a2e6a678..d5ec434c34 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -12,6 +12,9 @@ class CfgPatches { QGVAR(modulePatrolArea), QGVAR(moduleSearchArea), QGVAR(moduleSearchNearby), + QGVAR(moduleTeleportPlayers), + QGVAR(moduleToggleNvg), + QGVAR(moduleToggleFlashlight), QGVAR(moduleSimulation), QGVAR(moduleSuppressiveFire), QGVAR(AddFullArsenal), diff --git a/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf b/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf new file mode 100644 index 0000000000..4ebfd5a1c0 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf @@ -0,0 +1,64 @@ +/* + * Author: alganthe + * Zeus module function to toggle Flashlights + * + * Arguments: + * 0: Logic object + * 1: Toggle mode + * 2: Add gear + * 3: Target of the toggle 0: blufor; 1: opfor; 2: indep; 3: civ; 4: selected group + * + * Return Value: + * None + * + * Example: + * [LOGIC, true, true, 4] call ace_zeus_fnc_moduleToggleFlashlight + * + * Public: No +*/ + +#include "script_component.hpp" + +params ["_logic", "_toggle", "_addGear", "_target"]; + +private _units = []; + +if (_target == 4) then { + _units = units (attachedTo _logic); +} else { + _units = allUnits select {alive _x && {side _x == ([blufor, opfor, independent, civilian] select _target)}}, +}; + +if (_toggle) then { + { + // enableGunLights doesn't work on players + if !(isPlayer _x || {(currentWeapon _x) isEqualTo ""}) then { + private _pointer = (_x weaponAccessories (currentWeapon _x)) select 1; + + if (!(_pointer isEqualTo "") && {isNull (configfile >> "CfgWeapons" >> _pointer >> "ItemInfo" >> "Pointer")}) then { + [QGVAR(enableFlashlight), [_x, "forceOn"], _x] call CBA_fnc_targetEvent; + + } else { + if (_addGear) then { + // Retrieve compatible items for the pointer slot + private _pointerSlotCompatible = [currentWeapon _x, "pointer"] call CBA_fnc_compatibleItems; + + // Get flashlights from the array above and select the first one + private _flashlight = (_pointerSlotCompatible select {isNull (configfile >> "CfgWeapons" >> _x >> "ItemInfo" >> "Pointer")}) select 0; + + [QEGVAR(common,addWeaponItem), [_x, (currentWeapon _x), _flashlight], _x] call CBA_fnc_targetEvent; + [QGVAR(enableFlashlight), [_x, "forceOn"], _x] call CBA_fnc_targetEvent; + }; + }; + }; + } foreach _units; + +} else { + { + if !(isPlayer _x || {(currentWeapon _x) isEqualTo ""}) then { + [QGVAR(enableFlashlight), [_x, "forceOff"], _x] call CBA_fnc_targetEvent; + }; + } foreach _units; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/functions/fnc_moduleToggleNvg.sqf b/addons/zeus/functions/fnc_moduleToggleNvg.sqf new file mode 100644 index 0000000000..16511063fe --- /dev/null +++ b/addons/zeus/functions/fnc_moduleToggleNvg.sqf @@ -0,0 +1,69 @@ +/* + * Author: alganthe + * Zeus module function to toggle NVGs + * + * Arguments: + * 0: Logic object + * 1: Toggle mode + * 2: Target of the toggle 0: blufor; 1: opfor; 2: indep; 3: civ; 4: selected group + * + * Return Value: + * None + * + * Example: + * [LOGIC, true, 4] call ace_zeus_fnc_moduleToggleNvg + * + * Public: No +*/ + +#include "script_component.hpp" + +params ["_logic", "_toggle", "_target"]; + +private _units = []; + +if (_target == 4) then { + _units = units (attachedTo _logic); +} else { + _units = allUnits select {alive _x && {side _x == ([blufor, opfor, independent, civilian] select _target)}}, +}; + +if (_toggle) then { + { + if (!isplayer _x && {hmd _x isEqualTo ""}) then { + private _cfgArray = getArray (configFile >> 'CfgVehicles' >> typeOf _x >>'linkedItems'); + + private _nvgClass = _cfgArray select {_x isKindOf ["NVGoggles",(configFile >> "CfgWeapons")]}; + private _nvgHelmet =_cfgArray select {count (getArray (configFile >> "CfgWeapons" >> _x >> "subItems")) > 0}; + + // Can't have more than 1 assigned by default + if (count _nvgClass == 1 || {count _nvgHelmet == 1}) then { + if (count _nvgHelmet == 1) then { + _x addHeadgear (_nvgHelmet select 0); + } else { + _x linkItem (_nvgClass select 0); + }; + + } else { + _x linkItem "NVGoggles"; + }; + }; + } foreach _units; + +} else { + { + if (!isplayer _x) then { + private _cfgArray = getArray (configFile >> 'CfgVehicles' >> typeOf _x >>'linkedItems'); + + private _nvgHelmet =_cfgArray select {count (getArray (configFile >> "CfgWeapons" >> _x >> "subItems")) > 0}; + + if (count _nvgHelmet == 1) then { + removeHeadgear _x; + } else { + _x unlinkItem (hmd _x); + }; + }; + } foreach _units; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/functions/fnc_ui_ToggleNvg.sqf b/addons/zeus/functions/fnc_ui_ToggleNvg.sqf new file mode 100644 index 0000000000..414c8f886a --- /dev/null +++ b/addons/zeus/functions/fnc_ui_ToggleNvg.sqf @@ -0,0 +1,126 @@ +/* + * Author: alganthe + * Initalises the `Toggle NVGs` zeus module display + * + * Arguments: + * 0: Nvg toggle controls group + * + * Return Value: + * None + * + * Example: + * onSetFocus = "_this call ace_zeus_fnc_ui_toggleNvg" + * + * Public: No +*/ + +#include "script_component.hpp" + +disableSerialization; + +params ["_control"]; + +//Generic Init: +private _display = ctrlparent _control; +private _ctrlButtonOK = _display displayctrl 1; //IDC_OK +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +TRACE_1("logicObject",_logic); + +_control ctrlRemoveAllEventHandlers "setFocus"; + +private _unit = effectiveCommander (attachedTo _logic); + +// Handles errors +scopeName "Main"; +private _fnc_errorAndClose = { + params ["_msg"]; + _display closeDisplay 0; + deleteVehicle _logic; + [_msg] call EFUNC(common,displayTextStructured); + breakOut "Main"; +}; + +if !(isNull _unit) then { + switch (false) do { + case (_unit isKindOf "CAManBase"): { + [LSTRING(OnlyInfantry)] call _fnc_errorAndClose; + }; + case (alive _unit): { + [LSTRING(OnlyAlive)] call _fnc_errorAndClose; + }; + }; +}; + +//Specific on-load stuff: +private _comboBox = _display displayCtrl 92855; +private _comboBox2 = _display displayCtrl 92856; + +{ + _comboBox lbSetValue [_comboBox lbAdd (_x select 0), _x select 1]; +} forEach [ + [localize ELSTRING(common,Disabled), 0], + [localize ELSTRING(common,Enabled), 1] +]; + +if (isNull _unit) then { + { + _comboBox2 lbSetValue [_comboBox2 lbAdd (_x select 0), _x select 1]; + } forEach [ + ["BLUFOR", 0], + ["OPFOR", 1], + ["INDEP", 2], + ["CIV", 3] + ]; +} else { + { + _comboBox2 lbSetValue [_comboBox2 lbAdd (_x select 0), _x select 1]; + } forEach [ + [localize LSTRING(moduleToggleNVG_SelectedGroup), 4], + ["BLUFOR", 0], + ["OPFOR", 1], + ["INDEP", 2], + ["CIV", 3] + ]; +}; + + +private _enabledDefault = false; +if (!isNull _unit) then { + _enabledDefault = !(hmd _unit isEqualTo ""); +}; +_comboBox lbSetCurSel ([0,1] select _enabledDefault); +_comboBox2 lbSetCurSel 0; + +private _fnc_onUnload = { + params ["_display"]; + + private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); + if (isNull _logic) exitWith {}; + +}; + +private _fnc_onConfirm = { + params [["_ctrlButtonOK", controlNull, [controlNull]]]; + + private _display = ctrlparent _ctrlButtonOK; + if (isNull _display) exitWith {}; + + private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); + if (isNull _logic) exitWith {}; + + private _combo1 = _display displayCtrl 92855; + private _combo2 = _display displayCtrl 92856; + + private _toggle = _combo1 lbValue (lbCurSel _combo1); + private _target = _combo2 lbValue (lbCurSel _combo2); + + private _toggle = [ + false, + true + ] select (_toggle == 1); + + [_logic, _toggle, _target] call FUNC(moduleToggleNvg); +}; + +_display displayAddEventHandler ["unload", _fnc_onUnload]; +_ctrlButtonOK ctrlAddEventHandler ["buttonclick", _fnc_onConfirm]; diff --git a/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf b/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf new file mode 100644 index 0000000000..74c0da150f --- /dev/null +++ b/addons/zeus/functions/fnc_ui_toggleFlashlight.sqf @@ -0,0 +1,143 @@ +/* + * Author: alganthe + * Initalises the `Toggle Flashlights` zeus module display + * + * Arguments: + * 0: Flashlight toggle controls group + * + * Return Value: + * None + * + * Example: + * onSetFocus = "_this call ace_zeus_fnc_ui_toggleFLashlight" + * + * Public: No +*/ + +#include "script_component.hpp" + +disableSerialization; + +params ["_control"]; + +//Generic Init: +private _display = ctrlparent _control; +private _ctrlButtonOK = _display displayctrl 1; //IDC_OK +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +TRACE_1("logicObject",_logic); + +_control ctrlRemoveAllEventHandlers "setFocus"; + +private _unit = effectiveCommander (attachedTo _logic); + +// Handles errors +scopeName "Main"; +private _fnc_errorAndClose = { + params ["_msg"]; + _display closeDisplay 0; + deleteVehicle _logic; + [_msg] call EFUNC(common,displayTextStructured); + breakOut "Main"; +}; + +if !(isNull _unit) then { + switch (false) do { + case (_unit isKindOf "CAManBase"): { + [LSTRING(OnlyInfantry)] call _fnc_errorAndClose; + }; + case (alive _unit): { + [LSTRING(OnlyAlive)] call _fnc_errorAndClose; + }; + }; +}; + +//Specific on-load stuff: +private _comboBox = _display displayCtrl 56218; +private _comboBox2 = _display displayCtrl 56219; +private _comboBox3 = _display displayCtrl 56220; + +{ + _comboBox lbSetValue [_comboBox lbAdd (_x select 0), _x select 1]; +} forEach [ + [localize ELSTRING(common,Disabled), 0], + [localize ELSTRING(common,Enabled), 1] +]; + +if (isNull _unit) then { + { + _comboBox2 lbSetValue [_comboBox2 lbAdd (_x select 0), _x select 1]; + } forEach [ + ["BLUFOR", 0], + ["OPFOR", 1], + ["INDEP", 2], + ["CIV", 3] + ]; +} else { + { + _comboBox2 lbSetValue [_comboBox2 lbAdd (_x select 0), _x select 1]; + } forEach [ + [localize LSTRING(moduleToggleNVG_SelectedGroup), 4], + ["BLUFOR", 0], + ["OPFOR", 1], + ["INDEP", 2], + ["CIV", 3] + ]; +}; + +{ + _comboBox3 lbSetValue [_comboBox3 lbAdd (_x select 0), _x select 1]; +} foreach [ + [localize ELSTRING(common,Disabled), 0], + [localize ELSTRING(common,Enabled), 1] +]; + + +private _enabledDefault = false; +if (!isNull _unit) then { + _enabledDefault = _unit isFlashlightOn (currentWeapon _unit); +}; +_comboBox lbSetCurSel ([0,1] select _enabledDefault); +_comboBox2 lbSetCurSel 0; +_comboBox3 lbSetCurSel 0; + +private _fnc_onUnload = { + params ["_display"]; + + private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); + if (isNull _logic) exitWith {}; + +}; + +private _fnc_onConfirm = { + params [["_ctrlButtonOK", controlNull, [controlNull]]]; + + private _display = ctrlparent _ctrlButtonOK; + if (isNull _display) exitWith {}; + + private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); + if (isNull _logic) exitWith {}; + + private _combo1 = _display displayCtrl 56218; + private _combo2 = _display displayCtrl 56219; + private _combo3 = _display displayCtrl 56220; + + private _toggle = _combo1 lbValue (lbCurSel _combo1); + private _target = _combo2 lbValue (lbCurSel _combo2); + private _gear = _combo3 lbValue (lbCurSel _combo3); + + + _toggle = [ + false, + true + ] select (_toggle == 1); + + _gear = [ + false, + true + ] select (_gear == 1); + + [_logic, _toggle, _gear, _target] call FUNC(moduleToggleFlashlight); +}; + +_display displayAddEventHandler ["unload", _fnc_onUnload]; +_ctrlButtonOK ctrlAddEventHandler ["buttonclick", _fnc_onConfirm]; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index f528ff7a80..35bb0a392e 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -1038,5 +1038,41 @@ Load into Cargo + + Toggle NVGs + Basculer JVN + + + NVG equipment + Equipment de vision nocturne + + + Add or remove NVGs from units + Ajouter ou retirer JVN des unités + + + Toggle NVG target + Cible du basculement + + + Selected group + Groupe sélectionné + + + Toggle flashlights + Basculer lampes torches + + + Toggle flashlight target + Cible du basculement + + + Flashlight + Lampe torche + + + Add gear + Ajouter équipement + diff --git a/addons/zeus/ui/RscAttributes.hpp b/addons/zeus/ui/RscAttributes.hpp index 27f89d89c0..4ee2a099c6 100644 --- a/addons/zeus/ui/RscAttributes.hpp +++ b/addons/zeus/ui/RscAttributes.hpp @@ -417,7 +417,6 @@ class GVAR(RscTeleportPlayers): RscDisplayAttributes { }; }; - class GVAR(AttributeCargo): RscControlsGroupNoScrollbars { onSetFocus = QUOTE(_this call FUNC(ui_attributeCargo)); idc = -1; @@ -473,3 +472,124 @@ class RscDisplayAttributesVehicleEmpty: RscDisplayAttributes { }; }; }; + +class GVAR(RscToggleNvg): RscDisplayAttributes { + onLoad = QUOTE([ARR_3('onLoad', _this, QUOTE(QGVAR(RscToggleNvg)))] call FUNC(zeusAttributes)); + onUnload = QUOTE([ARR_3('onUnload', _this, QUOTE(QGVAR(RscToggleNvg)))] call FUNC(zeusAttributes)); + class Controls: Controls { + class Background: Background {}; + class Title: Title {}; + class Content: Content { + class Controls { + class ToggleNvg: RscControlsGroupNoScrollbars { + onSetFocus = QUOTE(_this call FUNC(ui_toggleNvg)); + idc = 92854; + x = 0; + y = 0; + w = W_PART(26); + h = H_PART(3); + class controls { + class ToggleNvgTitle: Title { + idc = -1; + text = CSTRING(moduleToggleNVG_ToggleNvgTitle); + toolTip = CSTRING(moduleToggleNVG_ToggleNvgTitleTooltip); + x = H_PART(0); + y = H_PART(0); + w = W_PART(7); + }; + class ToggleNvgCombo: RscCombo { + idc = 92855; + x = H_PART(6); + y = H_PART(0); + w = W_PART(10.1); + h = H_PART(1); + }; + class ToggleNvgSideTitle: Title { + idc = -1; + text = CSTRING(moduleToggleNVG_ToggleNvgSide); + x = H_PART(0); + y = H_PART(1.2); + w = W_PART(7); + }; + class ToggleNvgSideCombo: RscCombo { + idc = 92856; + x = H_PART(6); + y = H_PART(1.2); + w = W_PART(10.1); + h = H_PART(1); + }; + }; + }; + }; + }; + class ButtonOK: ButtonOK {}; + class ButtonCancel: ButtonCancel {}; + }; +}; + +class GVAR(RscToggleFlashlight): RscDisplayAttributes { + onLoad = QUOTE([ARR_3('onLoad', _this, QUOTE(QGVAR(RscToggleFlashlight)))] call FUNC(zeusAttributes)); + onUnload = QUOTE([ARR_3('onUnload', _this, QUOTE(QGVAR(RscToggleFlashlight)))] call FUNC(zeusAttributes)); + class Controls: Controls { + class Background: Background {}; + class Title: Title {}; + class Content: Content { + class Controls { + class ToggleFlashlight: RscControlsGroupNoScrollbars { + onSetFocus = QUOTE(_this call FUNC(ui_toggleFlashlight)); + idc = 56217; + x = 0; + y = 0; + w = W_PART(26); + h = H_PART(5); + class controls { + class ToggleFlashlightTitle: Title { + idc = -1; + text = CSTRING(moduleToggleFlashlight_ToggleFlashlightTitle); + x = H_PART(0); + y = H_PART(0); + w = W_PART(7); + }; + class ToggleFlashlightCombo: RscCombo { + idc = 56218; + x = H_PART(6); + y = H_PART(0); + w = W_PART(10.1); + h = H_PART(1); + }; + class ToggleFlashlightSideTitle: Title { + idc = -1; + text = CSTRING(moduleToggleFlashlight_ToggleFlashlightSide); + x = H_PART(0); + y = H_PART(1.2); + w = W_PART(7); + }; + class ToggleFlashlightSideCombo: RscCombo { + idc = 56219; + x = H_PART(6); + y = H_PART(1.2); + w = W_PART(10.1); + h = H_PART(1); + }; + class ToggleFlashlightGearTitle: Title { + idc = -1; + text = CSTRING(moduleToggleFlashlight_ToggleFlashlightGear); + x = H_PART(0); + y = H_PART(2.4); + w = W_PART(7); + }; + class ToggleFlashlightGearCombo: RscCombo { + idc = 56220; + x = H_PART(6); + y = H_PART(2.4); + w = W_PART(10.1); + h = H_PART(1); + }; + }; + }; + }; + }; + class ButtonOK: ButtonOK {}; + class ButtonCancel: ButtonCancel {}; + }; +};