2015-02-21 20:11:03 +00:00
|
|
|
/*
|
2015-03-24 04:18:00 +00:00
|
|
|
* Author: NouberNou and esteldunedain
|
2015-03-03 02:29:57 +00:00
|
|
|
* Render an interaction menu and it's children recursively
|
2015-02-21 20:11:03 +00:00
|
|
|
*
|
|
|
|
* Argument:
|
2015-03-17 03:37:28 +00:00
|
|
|
* 0: Parent path <ARRAY>
|
2015-02-21 20:11:03 +00:00
|
|
|
* 1: Action data <ARRAY>
|
2015-03-23 21:08:31 +00:00
|
|
|
* 2: 2D position <ARRAY>
|
2015-02-21 20:11:03 +00:00
|
|
|
* 3: Angle range available for rendering <ARRAY>
|
|
|
|
*
|
|
|
|
* Return value:
|
2015-03-03 02:29:57 +00:00
|
|
|
* None
|
2015-02-21 20:11:03 +00:00
|
|
|
*
|
|
|
|
* Public: No
|
|
|
|
*/
|
2015-01-18 18:38:27 +00:00
|
|
|
#include "script_component.hpp"
|
|
|
|
|
2015-04-29 06:26:13 +00:00
|
|
|
private ["_menuInSelectedPath", "_path", "_menuDepth", "_x", "_offset", "_newPos", "_forEachIndex", "_player", "_pos", "_shadowColor", "_target", "_textColor"];
|
2015-01-18 18:38:27 +00:00
|
|
|
|
2015-03-23 21:08:31 +00:00
|
|
|
EXPLODE_4_PVT(_this,_parentPath,_action,_sPos,_angles);
|
2015-03-17 03:37:28 +00:00
|
|
|
EXPLODE_3_PVT(_action,_actionData,_activeChildren,_actionObject);
|
2015-02-27 04:55:16 +00:00
|
|
|
EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan);
|
2015-02-19 13:38:09 +00:00
|
|
|
|
2015-03-19 18:04:48 +00:00
|
|
|
_menuDepth = (count GVAR(menuDepthPath));
|
2015-02-27 04:55:16 +00:00
|
|
|
|
2015-03-23 21:08:31 +00:00
|
|
|
//BEGIN_COUNTER(constructing_paths);
|
|
|
|
|
2015-02-27 04:55:16 +00:00
|
|
|
// Store path to action
|
2015-03-17 03:37:28 +00:00
|
|
|
_path = +_parentPath;
|
2015-03-20 02:32:44 +00:00
|
|
|
_path pushBack [_actionData select 0,_actionObject];
|
2015-02-27 04:55:16 +00:00
|
|
|
|
|
|
|
// Check if the menu is on the selected path
|
|
|
|
_menuInSelectedPath = true;
|
|
|
|
{
|
|
|
|
if (_forEachIndex >= (count GVAR(menuDepthPath))) exitWith {
|
|
|
|
_menuInSelectedPath = false;
|
|
|
|
};
|
2015-03-17 03:37:28 +00:00
|
|
|
if !(_x isEqualTo (GVAR(menuDepthPath) select _forEachIndex)) exitWith {
|
2015-02-27 04:55:16 +00:00
|
|
|
_menuInSelectedPath = false;
|
2015-02-19 13:49:36 +00:00
|
|
|
};
|
2015-02-27 04:55:16 +00:00
|
|
|
} forEach _path;
|
2015-01-18 18:38:27 +00:00
|
|
|
|
2015-03-23 21:08:31 +00:00
|
|
|
//END_COUNTER(constructing_paths);
|
|
|
|
//BEGIN_COUNTER(constructing_colors);
|
|
|
|
|
2015-02-27 04:55:16 +00:00
|
|
|
// Render icon
|
|
|
|
// ARGB Color (First Hex Pair is transparancy)
|
2015-04-20 23:28:01 +00:00
|
|
|
_textColor = GVAR(colorSelected);
|
|
|
|
_shadowColor = GVAR(colorSelectedShadow);
|
2015-03-23 21:08:31 +00:00
|
|
|
if(!_menuInSelectedPath) then {
|
2015-04-20 23:28:01 +00:00
|
|
|
_textColor = (GVAR(colorNotSelectedMatrix) select (count _path)) select _menuDepth;
|
|
|
|
_shadowColor = (GVAR(colorShadowNotSelectedMatrix) select (count _path)) select _menuDepth;
|
2015-02-27 04:55:16 +00:00
|
|
|
};
|
2015-03-23 21:08:31 +00:00
|
|
|
|
|
|
|
//END_COUNTER(constructing_colors);
|
|
|
|
//BEGIN_COUNTER(fnc_renderIcons);
|
|
|
|
|
2015-04-20 23:28:01 +00:00
|
|
|
[_actionData select 1, _actionData select 2, _sPos, _textColor, _shadowColor, "#FFFFFFFF"] call FUNC(renderIcon);
|
2015-03-23 21:08:31 +00:00
|
|
|
|
|
|
|
//END_COUNTER(fnc_renderIcons);
|
|
|
|
|
|
|
|
//BEGIN_COUNTER(currentOptions);
|
2015-02-27 04:55:16 +00:00
|
|
|
|
|
|
|
// Add the action to current options
|
2015-03-23 21:08:31 +00:00
|
|
|
GVAR(currentOptions) pushBack [_this, _sPos, _path];
|
|
|
|
|
|
|
|
//END_COUNTER(currentOptions);
|
2015-02-27 04:55:16 +00:00
|
|
|
|
|
|
|
// Exit without rendering children if it isn't
|
2015-02-28 20:48:46 +00:00
|
|
|
if !(_menuInSelectedPath) exitWith {true};
|
2015-02-27 04:55:16 +00:00
|
|
|
|
2015-03-23 21:08:31 +00:00
|
|
|
//BEGIN_COUNTER(children);
|
|
|
|
|
2015-03-23 17:01:38 +00:00
|
|
|
private ["_numChildren","_angleSpan","_angle","_angleInterval","_scale","_offset"];
|
|
|
|
_numChildren = count _activeChildren;
|
|
|
|
_angleSpan = _maxAngleSpan min (55 * ((_numChildren) - 1));
|
2015-02-27 04:55:16 +00:00
|
|
|
if (_angleSpan >= 305) then {
|
|
|
|
_angleSpan = 360;
|
2015-01-18 18:38:27 +00:00
|
|
|
};
|
2015-03-19 18:04:48 +00:00
|
|
|
_angleInterval = 55;
|
|
|
|
if (_angleSpan < 360) then {
|
2015-03-23 17:01:38 +00:00
|
|
|
if (_numChildren > 1) then {
|
|
|
|
_angleInterval = _angleSpan / (_numChildren - 1);
|
2015-03-19 18:04:48 +00:00
|
|
|
};
|
|
|
|
} else {
|
2015-03-24 03:15:22 +00:00
|
|
|
_angleInterval = _angleSpan / (_numChildren);
|
2015-03-19 18:04:48 +00:00
|
|
|
};
|
2015-03-23 17:01:38 +00:00
|
|
|
if (_numChildren == 1) then {
|
2015-03-24 03:15:22 +00:00
|
|
|
_angleInterval = 55;
|
2015-03-19 18:04:48 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Scale menu based on the amount of children
|
2015-04-12 04:15:38 +00:00
|
|
|
_scale = if (GVAR(UseListMenu)) then {
|
|
|
|
0.17
|
|
|
|
} else {
|
|
|
|
0.17 * (((0.8 * (0.46 / sin (0.5 * _angleInterval))) min 1.1) max 0.5)
|
|
|
|
};
|
|
|
|
|
2015-03-19 18:04:48 +00:00
|
|
|
// Animate menu scale
|
|
|
|
if (_menuInSelectedPath && (_menuDepth == count _path)) then {
|
|
|
|
_scale = _scale * (0.3 + 0.7 * (((diag_tickTime - GVAR(expandedTime)) * 8) min 1));
|
|
|
|
};
|
2015-02-27 04:55:16 +00:00
|
|
|
|
2015-03-23 17:01:38 +00:00
|
|
|
_target = _actionObject;
|
|
|
|
_player = ACE_player;
|
2015-03-23 21:08:31 +00:00
|
|
|
|
|
|
|
//END_COUNTER(children);
|
2015-02-27 04:55:16 +00:00
|
|
|
_angle = _centerAngle - _angleSpan / 2;
|
|
|
|
{
|
2015-03-23 21:08:31 +00:00
|
|
|
//BEGIN_COUNTER(children);
|
2015-03-23 17:01:38 +00:00
|
|
|
private ["_offset","_newPos"];
|
2015-04-12 04:15:38 +00:00
|
|
|
_newPos = if (GVAR(UseListMenu)) then {
|
|
|
|
[(_sPos select 0) + _scale * 1.10,
|
|
|
|
(_sPos select 1) + _scale * 0.30 * 4/3 * (_foreachindex - _numChildren/2 + 0.5)];
|
|
|
|
} else {
|
|
|
|
[(_sPos select 0) -_scale * cos _angle,
|
|
|
|
(_sPos select 1) +_scale * (sin _angle) * 4/3];
|
|
|
|
};
|
2015-02-27 04:55:16 +00:00
|
|
|
|
2015-03-19 18:04:48 +00:00
|
|
|
//drawLine3D [_pos, _newPos, [1,0,0,0.8]];
|
2015-03-23 21:08:31 +00:00
|
|
|
//END_COUNTER(children);
|
2015-03-24 03:15:22 +00:00
|
|
|
[_path, _x, _newPos, [_angle, 150]] call FUNC(renderMenu);
|
2015-02-27 04:55:16 +00:00
|
|
|
|
2015-03-23 17:01:38 +00:00
|
|
|
_angle = _angle + _angleInterval;
|
2015-02-27 04:55:16 +00:00
|
|
|
} forEach _activeChildren;
|
2015-02-28 20:48:46 +00:00
|
|
|
|
|
|
|
true
|