Interact menu:

- Allow dynamically adding children actions just-in-time
- Added optional custom parameters for actions
This commit is contained in:
Nicolás Badano 2015-03-19 13:00:10 -03:00
parent 3030b78ea2
commit acd3ca0d56
9 changed files with 124 additions and 14 deletions

View File

@ -7,6 +7,7 @@ PREP(addClassAction);
PREP(compileMenu); PREP(compileMenu);
PREP(compileMenuSelfAction); PREP(compileMenuSelfAction);
PREP(collectActiveActionTree); PREP(collectActiveActionTree);
PREP(createAction);
PREP(keyDown); PREP(keyDown);
PREP(keyDownSelfAction); PREP(keyDownSelfAction);
PREP(keyUp); PREP(keyUp);

View File

@ -14,6 +14,8 @@
* 7: Condition <CODE> * 7: Condition <CODE>
* 8: Distance <NUMBER> * 8: Distance <NUMBER>
* 9: Other parameters <ARRAY> (Optional) * 9: Other parameters <ARRAY> (Optional)
* 10: Insert children code <CODE> (Optional)
* 11: Action parameters <ANY> (Optional)
* *
* Return value: * Return value:
* The entry full path, which can be used to remove the entry, or add children entries <ARRAY>. * The entry full path, which can be used to remove the entry, or add children entries <ARRAY>.
@ -27,7 +29,7 @@
EXPLODE_9_PVT(_this,_object,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance); EXPLODE_9_PVT(_this,_object,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance);
private ["_varName","_actions","_params","_entry"]; private ["_varName","_actions","_params","_insertChildren","_parameters","_entry"];
_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; _varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum;
_actions = _object getVariable [_varName, []]; _actions = _object getVariable [_varName, []];
@ -40,6 +42,16 @@ if (count _this > 9) then {
_params = _this select 9; _params = _this select 9;
}; };
_insertChildren = {};
if (count _this > 10) then {
_insertChildren = _this select 10;
};
_parameters = [];
if (count _this > 11) then {
_parameters = _this select 11;
};
_entry = [ _entry = [
[ [
_displayName, _displayName,
@ -49,7 +61,9 @@ _entry = [
_condition, _condition,
_distance, _distance,
_params, _params,
+ _fullPath + _fullPath,
_insertChildren,
_parameters
], ],
[] []
]; ];

View File

@ -14,6 +14,8 @@
* 7: Condition <CODE> * 7: Condition <CODE>
* 8: Distance <NUMBER> * 8: Distance <NUMBER>
* 9: Other parameters <ARRAY> (Optional) * 9: Other parameters <ARRAY> (Optional)
* 10: Insert children code <CODE> (Optional)
* 11: Action parameters <ANY> (Optional)
* *
* Return value: * Return value:
* The entry full path, which can be used to remove the entry, or add children entries <ARRAY>. * The entry full path, which can be used to remove the entry, or add children entries <ARRAY>.
@ -34,7 +36,7 @@ if (_typeNum == 0) then {
[_objectType] call FUNC(compileMenuSelfAction); [_objectType] call FUNC(compileMenuSelfAction);
}; };
private ["_varName","_actions","_params","_entry", "_parentLevel", "_foundParentLevel", "_fnc_findFolder"]; private ["_varName","_actions","_params","_insertChildren","_parameters","_entry", "_parentLevel", "_foundParentLevel", "_fnc_findFolder"];
_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType]; _varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType];
_actions = missionNamespace getVariable [_varName, []]; _actions = missionNamespace getVariable [_varName, []];
@ -47,6 +49,16 @@ if (count _this > 9) then {
_params = _this select 9; _params = _this select 9;
}; };
_insertChildren = {};
if (count _this > 10) then {
_insertChildren = _this select 10;
};
_parameters = [];
if (count _this > 11) then {
_parameters = _this select 11;
};
// Search the class action trees and find where to insert the entry // Search the class action trees and find where to insert the entry
_parentLevel = _actions; _parentLevel = _actions;
_foundParentLevel = false; _foundParentLevel = false;
@ -84,7 +96,9 @@ _entry = [
_condition, _condition,
_distance, _distance,
_params, _params,
+ _fullPath + _fullPath,
_insertChildren,
_parameters
], ],
[] []
]; ];

View File

@ -22,12 +22,17 @@ _target = _object;
_player = ACE_player; _player = ACE_player;
// Return nothing if the action itself is not active // Return nothing if the action itself is not active
if !([_target, ACE_player] call (_origActionData select 4)) exitWith { if !([_target, ACE_player, _origActionData select 9] call (_origActionData select 4)) exitWith {
[] []
}; };
_activeChildren = []; _activeChildren = [];
// If there's a statement to dynamically insert children then execute it
if (count _origActionData > 8 && {!({} isEqualTo (_origActionData select 8))}) then {
_activeChildren = [_target, ACE_player, _origActionData select 9] call (_origActionData select 8);
};
// Collect children class actions // Collect children class actions
{ {
_action = [_object, _x] call FUNC(collectActiveActionTree); _action = [_object, _x] call FUNC(collectActiveActionTree);
@ -64,9 +69,12 @@ _activeChildren = [];
// If the original action has no statement, and no children, don't display it // If the original action has no statement, and no children, don't display it
/*
if ((count _activeChildren) == 0 && ((_origActionData select 3) isEqualTo {})) exitWith { if ((count _activeChildren) == 0 && ((_origActionData select 3) isEqualTo {})) exitWith {
// @todo: Account for showDisabled? // @todo: Account for showDisabled?
[] []
}; };
*/
//diag_log [_origActionData, _activeChildren, _object];
[_origActionData, _activeChildren, _object] [_origActionData, _activeChildren, _object]

View File

@ -27,7 +27,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {};
private "_recurseFnc"; private "_recurseFnc";
_recurseFnc = { _recurseFnc = {
private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled",
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath"]; "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath", "_insertChildren"];
EXPLODE_2_PVT(_this,_actionsCfg,_parentPath); EXPLODE_2_PVT(_this,_actionsCfg,_parentPath);
_actions = []; _actions = [];
@ -46,7 +46,9 @@ _recurseFnc = {
if (_condition == "") then {_condition = "true"}; if (_condition == "") then {_condition = "true"};
// Add canInteract (including exceptions) and canInteractWith to condition // Add canInteract (including exceptions) and canInteractWith to condition
_condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EGVAR(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")];
_insertChildren = compile (getText (_entryCfg >> "insertChildren"));
_showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
_enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
@ -68,7 +70,9 @@ _recurseFnc = {
_condition, _condition,
_distance, _distance,
[_showDisabled,_enableInside,_canCollapse,_runOnHover], [_showDisabled,_enableInside,_canCollapse,_runOnHover],
_fullPath _fullPath,
_insertChildren,
[]
], ],
_children _children
]; ];

View File

@ -27,7 +27,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {};
private "_recurseFnc"; private "_recurseFnc";
_recurseFnc = { _recurseFnc = {
private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled",
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath"]; "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath", "_insertChildren"];
EXPLODE_2_PVT(_this,_actionsCfg,_parentPath); EXPLODE_2_PVT(_this,_actionsCfg,_parentPath);
_actions = []; _actions = [];
@ -43,7 +43,9 @@ _recurseFnc = {
if (_condition == "") then {_condition = "true"}; if (_condition == "") then {_condition = "true"};
// Add canInteract (including exceptions) and canInteractWith to condition // Add canInteract (including exceptions) and canInteractWith to condition
_condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, objNull, %1)] call EGVAR(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, objNull, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")];
_insertChildren = compile (getText (_entryCfg >> "insertChildren"));
_showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
_enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
@ -65,7 +67,9 @@ _recurseFnc = {
_condition, _condition,
10, //distace 10, //distace
[_showDisabled,_enableInside,_canCollapse,_runOnHover], [_showDisabled,_enableInside,_canCollapse,_runOnHover],
_fullPath _fullPath,
_insertChildren,
[]
], ],
_children _children
]; ];
@ -89,7 +93,9 @@ _actions = [
{ true }, { true },
10, 10,
[false,true,false], [false,true,false],
["ACE_SelfActions"] ["ACE_SelfActions"],
{},
[]
], ],
[_actionsCfg, ["ACE_SelfActions"]] call _recurseFnc [_actionsCfg, ["ACE_SelfActions"]] call _recurseFnc
] ]

View File

@ -0,0 +1,63 @@
/*
* Author: CAA-Picard
* Creates an isolated ACE action
* Note: This function is NOT global.
*
* Argument:
* 0: Action name <STRING>
* 1: Name of the action shown in the menu <STRING>
* 2: Icon <STRING>
* 3: Position (Position or Selection Name) <POSITION> or <STRING>
* 4: Statement <CODE>
* 5: Condition <CODE>
* 6: Distance <NUMBER>
* 7: Other parameters <ARRAY> (Optional)
* 8: Insert children code <CODE> (Optional)
* 9: Action parameters <ANY> (Optional)
*
* Return value:
* Action
*
* Example:
* [[VulcanPinch"],"Vulcan Pinch","",[0,0,0],{_target setDamage 1;},{true},100,{},[parameters]] call ace_interact_menu_fnc_addAction;
*
* Public: No
*/
#include "script_component.hpp"
EXPLODE_7_PVT(_this,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance);
private ["_actions","_params","_insertChildren","_parameters","_entry"];
_params = [false,false,false,false];
if (count _this > 7) then {
_params = _this select 7;
};
_insertChildren = {};
if (count _this > 8) then {
_insertChildren = _this select 8;
};
_parameters = [];
if (count _this > 9) then {
_parameters = _this select 9;
};
_entry = [
[
_displayName,
_icon,
_position,
_statement,
_condition,
_distance,
_params,
+ _fullPath,
_insertChildren,
_parameters
],
[]
];
_entry

View File

@ -16,7 +16,7 @@ if(GVAR(actionSelected)) then {
this = GVAR(selectedTarget); this = GVAR(selectedTarget);
_player = ACE_Player; _player = ACE_Player;
_target = GVAR(selectedTarget); _target = GVAR(selectedTarget);
[GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement); [GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 9] call GVAR(selectedStatement);
}; };
if (GVAR(keyDown)) then { if (GVAR(keyDown)) then {

View File

@ -20,7 +20,7 @@ if(GVAR(actionSelected)) then {
this = GVAR(selectedTarget); this = GVAR(selectedTarget);
_player = ACE_Player; _player = ACE_Player;
_target = GVAR(selectedTarget); _target = GVAR(selectedTarget);
[GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement); [GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 9] call GVAR(selectedStatement);
}; };
if (GVAR(keyDownSelfAction)) then { if (GVAR(keyDownSelfAction)) then {