diff --git a/addons/microdagr/$PBOPREFIX$ b/addons/microdagr/$PBOPREFIX$ new file mode 100644 index 0000000000..e2de546eaf --- /dev/null +++ b/addons/microdagr/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\microdagr \ No newline at end of file diff --git a/addons/microdagr/CfgEventHandlers.hpp b/addons/microdagr/CfgEventHandlers.hpp new file mode 100644 index 0000000000..6d1d3b6dfb --- /dev/null +++ b/addons/microdagr/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); + }; +}; diff --git a/addons/microdagr/CfgVehicles.hpp b/addons/microdagr/CfgVehicles.hpp new file mode 100644 index 0000000000..f892c9aaab --- /dev/null +++ b/addons/microdagr/CfgVehicles.hpp @@ -0,0 +1,58 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(openMicroDAGR) { + displayName = "$STR_ACE_microdagr_openUnit"; + condition = QUOTE(('ACE_microDAGR' in (items _player))); + statement = QUOTE([] call FUNC(openDisplay)); + showDisabled = 0; + priority = 0.1; + icon = QUOTE(PATHTOF(data\icon_microDAGR.paa)); + hotkey = "G"; + }; + class GVAR(closeMicroDAGR) { + displayName = "$STR_ACE_microdagr_closeUnit"; + condition = QUOTE(GVAR(currentShowMode) != DISPLAY_MODE_CLOSED); + statement = QUOTE([DISPLAY_MODE_CLOSED] call FUNC(openDisplay)); + showDisabled = 0; + priority = 0; + icon = QUOTE(PATHTOF(data\icon_microDAGR.paa)); + // hotkey = "G"; + }; + }; + }; + }; + + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits {}; + class ModuleDescription {}; + }; + class GVAR(dagrModule): Module_F { + author = "$STR_ACE_Common_ACETeam"; + category = "ACE"; + displayName = "MicroDAGR Map Fill"; + function = QFUNC(moduleMapFill); + scope = 2; + isGlobal = 1; + // icon = QUOTE(PATHTOF(ui\IconLock_ca.paa)); + functionPriority = 0; + class Arguments { + class MapDataAvailable { + displayName = "MicroDAGR Map Fill"; // Argument label + description = "How much map data is filled on MicroDAGRs "; // Tooltip description + typeName = "NUMBER"; // Value type, can be "NUMBER", "STRING" or "BOOL" + class values { + class None {name = "Full Satellite + Buildings"; value = MAP_DETAIL_SAT; default = 1;}; + class Side {name = "Topographical + Roads"; value = MAP_DETAIL_TOPOROADS;}; + class Unique {name = "None (Cannot use map view)"; value = MAP_DETAIL_NONE;}; + }; + }; + }; + class ModuleDescription: ModuleDescription { + description = "Controls how muchdata is filled in the microDAGR items. Less data restricts the map view to show less on the minimap.
Source: microDAGR.pbo"; + }; + }; +}; diff --git a/addons/microdagr/CfgWeapons.hpp b/addons/microdagr/CfgWeapons.hpp new file mode 100644 index 0000000000..73615ea6b6 --- /dev/null +++ b/addons/microdagr/CfgWeapons.hpp @@ -0,0 +1,15 @@ +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_microDAGR: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; + displayName = "$STR_ACE_microdagr_itemName"; + descriptionShort = "$STR_ACE_microdagr_itemDescription"; + picture = QUOTE(PATHTOF(images\microDAGR_item.paa)); + class ItemInfo: InventoryItem_Base_F { + mass = 2; + }; + }; +}; diff --git a/addons/microdagr/XEH_clientInit.sqf b/addons/microdagr/XEH_clientInit.sqf new file mode 100644 index 0000000000..347c1b01de --- /dev/null +++ b/addons/microdagr/XEH_clientInit.sqf @@ -0,0 +1,74 @@ +//XEH_clientInit.sqf +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +//Add Keybinds: +["ACE3", QGVAR(openGPS), (localize "STR_ACE_microdagr_openUnit"), +{ + // Conditions: canInteract + _exceptions = []; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if (!("ACE_microDAGR" in (items ace_player))) exitWith {false}; + [] call FUNC(openDisplay); + true; +}, +{false}, +[0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key + +["ACE3", QGVAR(closeGPS), (localize "STR_ACE_microdagr_closeUnit"), +{ + // Conditions: canInteract + _exceptions = []; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if (!("ACE_microDAGR" in (items ace_player))) exitWith {false}; + if (GVAR(currentShowMode) == DISPLAY_MODE_CLOSED) exitWith {false}; + + [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); + true; +}, +{false}, +[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key + +//Add Eventhandler: +["RangerfinderData", {_this call FUNC(recieveRangefinderData)}] call EFUNC(common,addEventHandler); + +//Global Variables to default: +GVAR(gpsPositionASL) = [0,0,0]; +GVAR(mapAutoTrackPosition) = true; +GVAR(mapShowTexture) = false; +GVAR(mapPosition) = [-999, -999]; +GVAR(mapZoom) = 0.075; +GVAR(currentApplicationPage) = APP_MODE_NULL; +GVAR(currentShowMode) = DISPLAY_MODE_CLOSED; + +//User Settings +GVAR(settingUseMils) = false; +GVAR(settingShowAllWaypointsOnMap) = true; + +GVAR(newWaypointPosition) = []; +GVAR(currentWaypoint) = -1; +GVAR(rangeFinderPositionASL) = []; + + +GVAR(mapAltitude) = getNumber (configFile >> "CfgWorlds" >> worldName >> "elevationOffset"); + +//Calculate the map's MGRS: +_worldMapLong = getNumber (configFile >> "CfgWorlds" >> worldName >> "longitude"); +_worldMapLat = getNumber (configFile >> "CfgWorlds" >> worldName >> "latitude"); +//Pull UTM grid from world's long/lat +_zone = 1 + (floor ((_worldMapLong + 180) / 6)); +_band = "Z"; +if (_worldMapLat <= -80) then { + _band = "A"; +} else { + if (_worldMapLat < 84) then { + _band = "CDEFGHJKLMNPQRSTUVWXX" select [(floor ((_worldMapLat / 8) + 10)), 1]; + }; +}; +//calculating square ID from long/lat is a pain in the ass, just fake it unless someone wants to actualy do this +_squareID = if ((count worldName) > 2) then {toUpper(worldName select [0,2])} else {"XG"}; +GVAR(mgrsGridZoneDesignator) = format ["%1%2 %3", _zone, _band, _squareID]; + diff --git a/addons/microdagr/XEH_preInit.sqf b/addons/microdagr/XEH_preInit.sqf new file mode 100644 index 0000000000..a0ea1a538e --- /dev/null +++ b/addons/microdagr/XEH_preInit.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(appMarkKeypadEntry); +PREP(appMenuButtonConnectRangefinder); +PREP(appSettingsLBClick); +PREP(appWaypointsButtonDeleteWP); +PREP(appWaypointsButtonSetWP); +PREP(canShow); +PREP(deviceAddWaypoint); +PREP(deviceDeleteWaypoint); +PREP(deviceGetWaypoints); +PREP(dialogClosedEH); +PREP(mapDoubleTapEH); +PREP(mapOnDrawEH); +PREP(modeMapButtons); +PREP(moduleMapFill); +PREP(openDisplay); +PREP(recieveRangefinderData); +PREP(saveCurrentAndSetNewMode); +PREP(showApplicationPage); +PREP(updateDisplay); + +ADDON = true; diff --git a/addons/microdagr/config.cpp b/addons/microdagr/config.cpp new file mode 100644 index 0000000000..39380d7a2e --- /dev/null +++ b/addons/microdagr/config.cpp @@ -0,0 +1,26 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"PabstMirror"}; + authorUrl = "https://github.com/PabstMirror/"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" +#include "gui.hpp" + +class ACE_Settings { + class GVAR(MapDataAvailable) { + value = 2; + typeName = "SCALAR"; + isClientSetable = 0; + }; +}; diff --git a/addons/microdagr/data/icon_microDAGR.paa b/addons/microdagr/data/icon_microDAGR.paa new file mode 100644 index 0000000000..04307ec581 Binary files /dev/null and b/addons/microdagr/data/icon_microDAGR.paa differ diff --git a/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf b/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf new file mode 100644 index 0000000000..066b44508d --- /dev/null +++ b/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf @@ -0,0 +1,57 @@ +/* + * Author: PabstMirror + * Handles the keypad entries from the "Mark" Application + * + * Arguments: + * 0: String version of Keypad entry ["ok","del","1",...] + * + * Return Value: + * Nothing + * + * Example: + * ["ok"] call ace_microdagr_fnc_appMarkKeypadEntry + * + * Public: No + */ +#include "script_component.hpp" + +private ["_display", "_editText", "_gridPosTuple", "_actualPos"]; +PARAMS_1(_keypadButton); + +disableSerialization; +_display = displayNull; +if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { + _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); +} else { + _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); +}; +if (isNull _display) exitWith {ERROR("No Display");}; + +if (GVAR(currentApplicationPage) != APP_MODE_MARK) exitWith {}; + +_editText = ctrlText (_display displayCtrl IDC_MODEMARK_CORDSEDIT); + +switch (_keypadButton) do { +case ("ok"): { + if ((count GVAR(newWaypointPosition)) == 0) then { + _gridPosTuple = [_editText] call BIS_fnc_gridToPos; + _actualPos = [(((_gridPosTuple select 0) select 0) + 0.5 * ((_gridPosTuple select 1) select 0)), (((_gridPosTuple select 0) select 1) + 0.5 * ((_gridPosTuple select 1) select 1))]; + _actualPos set [2, (getTerrainHeightASL _actualPos)]; + GVAR(newWaypointPosition) = _actualPos; + [APP_MODE_MARK] call FUNC(saveCurrentAndSetNewMode); + } else { + [_editText, GVAR(newWaypointPosition)] call FUNC(deviceAddWaypoint); + [APP_MODE_WAYPOINTS] call FUNC(saveCurrentAndSetNewMode); + }; + }; +case ("del"): { + _editText = _editText select [0, (((count _editText) - 1) max 0)]; + (_display displayCtrl IDC_MODEMARK_CORDSEDIT) ctrlSetText _editText; + ctrlSetFocus (_display displayCtrl IDC_MODEMARK_CORDSEDIT); + }; + default { + _editText = _editText + _keypadButton; + (_display displayCtrl IDC_MODEMARK_CORDSEDIT) ctrlSetText _editText; + ctrlSetFocus (_display displayCtrl IDC_MODEMARK_CORDSEDIT); + }; +}; diff --git a/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf b/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf new file mode 100644 index 0000000000..1cf81963f5 --- /dev/null +++ b/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf @@ -0,0 +1,20 @@ +/* + * Author: PabstMirror + * Handles the "Connect To" button from the menu application + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_appMenuButtonConnectRangefinder + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(currentWaypoint) = if (GVAR(currentWaypoint) == -2) then {-1} else {-2}; +GVAR(rangeFinderPositionASL) = []; +[APP_MODE_INFODISPLAY] call FUNC(saveCurrentAndSetNewMode); diff --git a/addons/microdagr/functions/fnc_appSettingsLBClick.sqf b/addons/microdagr/functions/fnc_appSettingsLBClick.sqf new file mode 100644 index 0000000000..bc6779c10a --- /dev/null +++ b/addons/microdagr/functions/fnc_appSettingsLBClick.sqf @@ -0,0 +1,27 @@ +/* + * Author: PabstMirror + * Handles double clicking on the setting listbox + * + * Arguments: + * 0: Setting List box (not used) + * 1: Index + * + * Return Value: + * Nothing + * + * Example: + * [settingList, 1] call ace_microdagr_fnc_appSettingsLBClick + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; +PARAMS_2(_control,_itemClicked); + +switch (_itemClicked) do { + case (0): { GVAR(settingUseMils) = ! GVAR(settingUseMils)}; + case (1): { GVAR(settingShowAllWaypointsOnMap) = ! GVAR(settingShowAllWaypointsOnMap)}; +}; + +[] call FUNC(updateDisplay); diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf new file mode 100644 index 0000000000..1acd936370 --- /dev/null +++ b/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf @@ -0,0 +1,37 @@ +/* + * Author: PabstMirror + * Handles clicking the delete button from the waypoint application + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_appWaypointsButtonDeleteWP + * + * Public: No + */ +#include "script_component.hpp" + +private ["_display", "_wpIndex"]; + +disableSerialization; +_display = displayNull; +if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { + _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); +} else { + _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); +}; +if (isNull _display) exitWith {ERROR("No Display");}; + +_wpIndex = lbCurSel (_display displayCtrl IDC_MODEWAYPOINTS_LISTOFWAYPOINTS); + +//If it's our currentWP then deactivate +if (GVAR(currentWaypoint) == _wpIndex) then {GVAR(currentWaypoint) = -1}; + +//Delete from list: +[_wpIndex] call FUNC(deviceDeleteWaypoint); +//Update list now: +[] call FUNC(updateDisplay); diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf new file mode 100644 index 0000000000..1836e50da2 --- /dev/null +++ b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf @@ -0,0 +1,33 @@ +/* + * Author: PabstMirror + * Handles clicking the setWP button from the waypoint application + * + * Arguments: + * The "SetWP" button + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_appWaypointsButtonSetWP + * + * Public: No + */ +#include "script_component.hpp" + +private ["_wpListBox", "_newWpIndex", "_waypoints"]; + +disableSerialization; +PARAMS_1(_wpButton); + +_wpListBox = (ctrlParent _wpButton) displayCtrl 144501; +_newWpIndex = lbCurSel _wpListBox; +_waypoints = [] call FUNC(deviceGetWaypoints); + +if ((_newWpIndex < 0) || (_newWpIndex > ((count _waypoints) - 1))) exitWith { + GVAR(currentWaypoint) = -1; + ERROR("out of bounds wp"); +}; + +GVAR(currentWaypoint) = _newWpIndex; +[APP_MODE_COMPASS] call FUNC(saveCurrentAndSetNewMode); diff --git a/addons/microdagr/functions/fnc_canShow.sqf b/addons/microdagr/functions/fnc_canShow.sqf new file mode 100644 index 0000000000..62fb7f01ed --- /dev/null +++ b/addons/microdagr/functions/fnc_canShow.sqf @@ -0,0 +1,29 @@ +/* + * Author: PabstMirror + * Tests if the dagr can be shown in a mode + * + * Arguments: + * The display mode to test showing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_canShow + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_showType); + +//Can always do closed or hidden +if (_showType in [DISPLAY_MODE_CLOSED, DISPLAY_MODE_HIDDEN]) exitWith {true}; + +//Can't interact then hide gps: TODO: any exceptions? +if (!([ACE_player, objNull, []] call EGVAR(common,canInteractWith))) exitWith {false}; + + //Can't have minimap up while zoomed in +if ((_showType == DISPLAY_MODE_DISPLAY) && {cameraview == "GUNNER"}) exitWith {false}; + +true diff --git a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf new file mode 100644 index 0000000000..6912810f58 --- /dev/null +++ b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf @@ -0,0 +1,24 @@ +/* + * Author: PabstMirror + * Adds a waypoint to the "device" + * Device saving not implemented yet, just save to player object + * + * Arguments: + * 0: Waypoint name + * 1: Waypoint Position ASL + * + * Return Value: + * Nothing + * + * Example: + * ["Hill 55", [41,324, 12]] call ace_microdagr_fnc_deviceAddWaypoint + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_waypointName,_waypointPosASL); + +_waypoints = ace_player getVariable [QGVAR(waypoints), []]; +_waypoints pushBack [_waypointName, _waypointPosASL]; +ace_player setVariable [QGVAR(waypoints), _waypoints]; diff --git a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf new file mode 100644 index 0000000000..3d1e8ec852 --- /dev/null +++ b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf @@ -0,0 +1,26 @@ +/* + * Author: PabstMirror + * Deletes a waypoint from the "device" + * Device saving not implemented yet, just save to player object + * + * Arguments: + * 0: Waypoint Index + * + * Return Value: + * Nothing + * + * Example: + * ["Hill 55", [41,324, 12]] call ace_microdagr_fnc_deviceDeleteWaypoint + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_wpIndex); + +_waypoints = ace_player getVariable [QGVAR(waypoints), []]; + +if ((_wpIndex < 0) || (_wpIndex > ((count _waypoints) - 1))) exitWith {ERROR("out of bounds wp");}; + +_waypoints deleteAt _wpIndex; +ace_player setVariable [QGVAR(waypoints), _waypoints]; diff --git a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf new file mode 100644 index 0000000000..f90ecb06be --- /dev/null +++ b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf @@ -0,0 +1,19 @@ +/* + * Author: PabstMirror + * Gets all waypoints from the "device" + * Device saving not implemented yet, just save to player object + * + * Arguments: + * Nothing + * + * Return Value: + * Waypoints + * + * Example: + * [["Hill 55", [41,324, 12]]] = [] call ace_microdagr_fnc_deviceGetWaypoint + * + * Public: No + */ +#include "script_component.hpp" + +(ace_player getVariable [QGVAR(waypoints), []]) diff --git a/addons/microdagr/functions/fnc_dialogClosedEH.sqf b/addons/microdagr/functions/fnc_dialogClosedEH.sqf new file mode 100644 index 0000000000..0a7e5e5115 --- /dev/null +++ b/addons/microdagr/functions/fnc_dialogClosedEH.sqf @@ -0,0 +1,21 @@ +/* + * Author: PabstMirror + * Handles the dialog closeing, switches back to display mode + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_dialogClosedEH + * + * Public: No + */ +#include "script_component.hpp" + +if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { + [-1] call FUNC(saveCurrentAndSetNewMode); + [DISPLAY_MODE_DISPLAY] call FUNC(openDisplay); +}; diff --git a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf new file mode 100644 index 0000000000..1fd4c4c4d2 --- /dev/null +++ b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf @@ -0,0 +1,30 @@ +/* + * Author: PabstMirror + * Handles the double tapping either of the 2 mini-maps + * + * Arguments: + * 0: The Map + * 1: MouseButton + * 2: MousePosX + * 3: MousePosY + * + * Return Value: + * Nothing + * + * Example: + * [minimap,0,0.5,0.5] call ace_microdagr_fnc_mapOnDrawEH + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_4(_theMap,_mouseButton,_xPos,_yPos); + +//Only handle LMB +if (_mouseButton != 0) exitWith {}; + +_worldPos = _theMap ctrlMapScreenToWorld [_xPos, _yPos]; +_worldPos set [2, (getTerrainHeightASL _worldPos)]; + +GVAR(newWaypointPosition) = _worldPos; +[APP_MODE_MARK] call FUNC(saveCurrentAndSetNewMode); diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf new file mode 100644 index 0000000000..3acf3e889c --- /dev/null +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -0,0 +1,65 @@ +/* + * Author: PabstMirror + * Handles the draw event from all 3 maps (compass + 2 minimaps) + * + * Arguments: + * 0: The Map + * + * Return Value: + * Nothing + * + * Example: + * [compassMap] call ace_microdagr_fnc_mapOnDrawEH + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_theMap); + +_theMap = _this select 0; +_mapSize = (ctrlPosition _theMap) select 3; + +_waypoints = [] call FUNC(deviceGetWaypoints); + +if (GVAR(currentApplicationPage) == 1) then { + _theMap ctrlMapAnimAdd [0, DUMMY_ZOOM, DUMMY_POS]; + ctrlMapAnimCommit _theMap; + _size = 412 * _mapSize; + _theMap drawIcon [QUOTE(PATHTO_R(images\compass_starInverted.paa)), [1,1,1,1], DUMMY_POS, _size, _size, (-1 * (getDir ace_player)), '', 0 ]; + _theMap drawIcon [QUOTE(PATHTO_R(images\compass_needle.paa)), [0.533,0.769,0.76,1], DUMMY_POS, _size, _size, 0, '', 0 ]; + + if (GVAR(currentWaypoint) != -1) then { + _targetPos = []; + if (GVAR(currentWaypoint) == -2) then { + if ((count GVAR(rangeFinderPositionASL)) == 3) then { + _targetPos = GVAR(rangeFinderPositionASL); + }; + } else { + if (GVAR(currentWaypoint) < (count _waypoints)) then { + _targetPos = (_waypoints select GVAR(currentWaypoint)) select 1; + }; + }; + if ((count _targetPos) == 3) then { + _relBearing = [ace_player, _targetPos] call BIS_fnc_relativeDirTo; + _theMap drawIcon [QUOTE(PATHTO_R(images\compass_needle.paa)), [1,0.564,0.564,1], DUMMY_POS, _size, _size, _relBearing, '', 0 ]; + }; + }; + +} else { //Map Mode: + if (GVAR(mapAutoTrackPosition)) then { + _theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), GVAR(gpsPositionASL)]; + ctrlMapAnimCommit _theMap; + }; + _size = 48 * _mapSize; + _theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], GVAR(gpsPositionASL), _size, _size, (getDir ace_player), '', 0 ]; + + if (GVAR(settingShowAllWaypointsOnMap)) then { + _size = 32 * _mapSize; + { + EXPLODE_2_PVT(_x,_wpName,_wpPos); + _alpha = if (_forEachIndex == GVAR(currentWaypoint)) then {1} else {0.5}; + _theMap drawIcon [QUOTE(PATHTO_R(images\icon_mapWaypoints.paa)), [1,1,1,_alpha], _wpPos, _size, _size, 0, '', 0 ]; + } forEach _waypoints; + }; +}; diff --git a/addons/microdagr/functions/fnc_modeMapButtons.sqf b/addons/microdagr/functions/fnc_modeMapButtons.sqf new file mode 100644 index 0000000000..5de4bf9ca7 --- /dev/null +++ b/addons/microdagr/functions/fnc_modeMapButtons.sqf @@ -0,0 +1,31 @@ +/* + * Author: PabstMirror + * Takes some arguments and returns something or other. + * + * Arguments: + * 0: String of the map button pressed + * + * Return Value: + * Nothing + * + * Example: + * ["autotrack"] call ace_microdagr_fnc_modeMapButtons + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_mode); + +[-1] call FUNC(saveCurrentAndSetNewMode); //backup current draw pos/zoom + +if (_mode == "autotrack") then { + GVAR(mapAutoTrackPosition) = !GVAR(mapAutoTrackPosition); +} else { + if (_mode == "zoomin") then { + GVAR(mapZoom) = GVAR(mapZoom) * (10/11); + } else { + GVAR(mapZoom) = GVAR(mapZoom) * (11/10); + }; +}; +[] call FUNC(showApplicationPage); diff --git a/addons/microdagr/functions/fnc_moduleMapFill.sqf b/addons/microdagr/functions/fnc_moduleMapFill.sqf new file mode 100644 index 0000000000..d07b0bc518 --- /dev/null +++ b/addons/microdagr/functions/fnc_moduleMapFill.sqf @@ -0,0 +1,26 @@ +/* + * Author: PabstMirror + * Function for the module (handles the map fill level) + * + * Arguments: + * 0: logic + * 1: synced units-not used + * 2: Module Activated + * + * Return Value: + * Nothing + * + * Example: + * [module, [], true] call ace_microdagr_fnc_moduleMapFill + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_logic,_syncedUnits,_activated); + +if (!_activated) exitWith {WARNING("Module Placed but not active");}; + +if (isServer) then { + [_logic, QGVAR(MapDataAvailable), "MapDataAvailable"] call EFUNC(common,readSettingFromModule); +}; diff --git a/addons/microdagr/functions/fnc_openDisplay.sqf b/addons/microdagr/functions/fnc_openDisplay.sqf new file mode 100644 index 0000000000..14aa58f92b --- /dev/null +++ b/addons/microdagr/functions/fnc_openDisplay.sqf @@ -0,0 +1,98 @@ +/* + * Author: PabstMirror + * Changes the display mode of the microDAGR + * + * Arguments: + * 0: Display Mode to show the microDAGR in + * + * Return Value: + * Nothing + * + * Example: + * [1] call ace_microdagr_fnc_openDisplay + * + * Public: No + */ +#include "script_component.hpp" + +private ["_oldShowMode", "_args", "_pfID", "_player"]; + +DEFAULT_PARAM(0,_newDisplayShowMode,-1); +_oldShowMode = GVAR(currentShowMode); + +if (_newDisplayShowMode == -1) then { + if (_oldShowMode in [DISPLAY_MODE_DISPLAY, DISPLAY_MODE_HIDDEN]) then {_newDisplayShowMode = DISPLAY_MODE_DIALOG}; + if (_oldShowMode in [DISPLAY_MODE_DIALOG, DISPLAY_MODE_CLOSED]) then {_newDisplayShowMode = DISPLAY_MODE_DISPLAY}; +}; + +if ((_newDisplayShowMode == DISPLAY_MODE_DISPLAY) && {!([DISPLAY_MODE_DISPLAY] call FUNC(canShow))}) then {_newDisplayShowMode = DISPLAY_MODE_HIDDEN}; +if ((_newDisplayShowMode == DISPLAY_MODE_DIALOG) && {!([DISPLAY_MODE_DIALOG] call FUNC(canShow))}) then {_newDisplayShowMode = DISPLAY_MODE_HIDDEN}; + + + +//On first-startup +if (GVAR(currentApplicationPage) == APP_MODE_NULL) then { + GVAR(currentApplicationPage) = APP_MODE_INFODISPLAY; + GVAR(mapPosition) = getPos ace_player; +}; + +if (_newDisplayShowMode in [DISPLAY_MODE_CLOSED, DISPLAY_MODE_HIDDEN]) then { + + //If Dialog is open, back it up before closing: + if (dialog && {!isNull (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull])}) then { + [-1] call FUNC(saveCurrentAndSetNewMode); + closeDialog 0; + }; + + //Close the display: + (QGVAR(TheRscTitleDisplay) call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; +} else { + if (_newDisplayShowMode == DISPLAY_MODE_DISPLAY) then { + //If Dialog is open, back it up before closing: + if (dialog && {!isNull (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull])}) then { + [-1] call FUNC(saveCurrentAndSetNewMode); + closeDialog 0; + }; + //Open the display: + (QGVAR(TheRscTitleDisplay) call BIS_fnc_rscLayer) cutRsc [QGVAR(TheRscTitleDisplay), "PLAIN", 0, true]; + } else { //DISPLAY_MODE_DIALOG + //Close the display: + (QGVAR(TheRscTitleDisplay) call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; + //Open the dialog: + createDialog QGVAR(TheDialog); + }; +}; + +GVAR(currentShowMode) = _newDisplayShowMode; +//Update display applicaiton if open: +if (GVAR(currentShowMode) in [DISPLAY_MODE_DIALOG, DISPLAY_MODE_DISPLAY]) then { + [] call FUNC(showApplicationPage); +}; + +if ((_oldShowMode == DISPLAY_MODE_CLOSED) && {GVAR(currentShowMode) != DISPLAY_MODE_CLOSED}) then { + //Start a pfeh to update display and handle hiding display + + [{ + PARAMS_2(_args,_pfID); + EXPLODE_1_PVT(_args,_player); + + if ((ace_player != _player) || {!("ACE_microDAGR" in (items ace_player))} || {GVAR(currentShowMode) == DISPLAY_MODE_CLOSED}) then { + GVAR(currentShowMode) = DISPLAY_MODE_CLOSED; + [_pfID] call CBA_fnc_removePerFrameHandler; + } else { + GVAR(gpsPositionASL) = getPosAsl ace_player; + if (GVAR(currentShowMode) == DISPLAY_MODE_HIDDEN) then { + //If display is hidden, and we can show, then swithc modes: + if ([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) then { + [DISPLAY_MODE_DISPLAY] call FUNC(openDisplay); + }; + } else { + if ([GVAR(currentShowMode)] call FUNC(canShow)) then { + [] call FUNC(updateDisplay); + } else { + [DISPLAY_MODE_HIDDEN] call FUNC(openDisplay); + }; + }; + }; + }, 0.1, [ace_player]] call CBA_fnc_addPerFrameHandler; +}; diff --git a/addons/microdagr/functions/fnc_recieveRangefinderData.sqf b/addons/microdagr/functions/fnc_recieveRangefinderData.sqf new file mode 100644 index 0000000000..154dfff94a --- /dev/null +++ b/addons/microdagr/functions/fnc_recieveRangefinderData.sqf @@ -0,0 +1,34 @@ +/* + * Author: PabstMirror + * Recieves the data packet from the vector rangefinder + * + * Arguments: + * 0: Slope distance (Meters) + * 1: Azimuth (Degrees) + * 2: Inclination (Degrees) + * + * Return Value: + * Nothing + * + * Example: + * [1000, 45, 1] call ace_microdagr_fnc_recieveRangefinderData + * + * Public: No + */ +#include "script_component.hpp" + +private ["_horizontalDistance", "_verticleDistance", "_targetOffset", "_targetPosASL"]; + +PARAMS_3(_slopeDistance,_azimuth,_inclination); + +if (GVAR(currentWaypoint) != -2) exitWith {}; //Only take waypoint when "connected" +if (_slopeDistance < 0) exitWith {}; //Bad Data + +_horizontalDistance = (cos _inclination) * _slopeDistance; +_verticleDistance = (sin _inclination) * _slopeDistance; + +_targetOffset = [((sin _azimuth) * _horizontalDistance), ((cos _azimuth) * _horizontalDistance), _verticleDistance]; +//This assumes the "rangefinder view" pos is very close to player, at worst the turret should only be a few meters different +_targetPosASL = (getPosASL ace_player) vectorAdd _targetOffset; + +GVAR(rangeFinderPositionASL) = _targetPosASL; diff --git a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf new file mode 100644 index 0000000000..1f4982d87f --- /dev/null +++ b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf @@ -0,0 +1,62 @@ +/* + * Author: PabstMirror + * Saves the current mode and sets a new mode + * Used to backup display when switching display modes + * + * Arguments: + * 0: New Mode + * + * Return Value: + * Nothing + * + * Example: + * [2] call ace_microdagr_fnc_saveCurrentAndSetNewMode + * + * Public: No + */ +#include "script_component.hpp" + +private ["_display", "_theMap", "_mapSize", "_centerPos"]; + +PARAMS_1(_newMode); + +disableSerialization; +_display = displayNull; +if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { + _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); +} else { + _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); +}; +if (isNull _display) exitWith {ERROR("No Display");}; + +if (GVAR(currentApplicationPage) == 2) then { + _theMap = if (!GVAR(mapShowTexture)) then {_display displayCtrl IDC_MAPPLAIN} else {_display displayCtrl IDC_MAPDETAILS}; + _mapCtrlPos = ctrlPosition _theMap; + _mapSize = _mapCtrlPos select 3; + _centerPos = [((_mapCtrlPos select 0) + (_mapCtrlPos select 2) / 2), ((_mapCtrlPos select 1) + (_mapCtrlPos select 3) / 2)]; + GVAR(mapPosition) = _theMap ctrlMapScreenToWorld _centerPos; + GVAR(mapZoom) = (ctrlMapScale _theMap) * _mapSize; + + //Hit button again, toggle map modes: + if (_newMode == 2) then { + if (GVAR(mapShowTexture)) then { + GVAR(mapShowTexture) = false; + } else { + if (GVAR(MapDataAvailable) == MAP_DETAIL_SAT) then { + GVAR(mapShowTexture) = true; + }; + }; + }; +}; + +//Can't switch to map if no map loaded +if (_newMode == APP_MODE_MAP) then { + if (GVAR(MapDataAvailable) == MAP_DETAIL_NONE) then { + _newMode = -1; + }; +}; + +if (_newMode != -1) then { + GVAR(currentApplicationPage) = _newMode; + [] call FUNC(showApplicationPage); +}; diff --git a/addons/microdagr/functions/fnc_showApplicationPage.sqf b/addons/microdagr/functions/fnc_showApplicationPage.sqf new file mode 100644 index 0000000000..a9e6d10db7 --- /dev/null +++ b/addons/microdagr/functions/fnc_showApplicationPage.sqf @@ -0,0 +1,127 @@ +/* + * Author: PabstMirror + * Changes the "application page" shown on the microDAGR + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_showApplicationPage + * + * Public: No + */ +#include "script_component.hpp" + +private ["_display", "_daylight", "_theMap", "_mapSize"]; + +disableSerialization; + +_display = displayNull; +if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { + _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); +} else { + _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); +}; +if (isNull _display) exitWith {ERROR("No Display");}; + +//Fade "shell" at night +_daylight = 0.05 max (((1 - overcast)/2 + ((1 - cos (daytime * 360/24)) / 4)) * (linearConversion [0, 1, sunOrMoon, (0.25 * moonIntensity), 1])); +(_display displayCtrl IDC_MICRODAGRSHELL) ctrlSetTextColor [_daylight, _daylight, _daylight, 1]; + +//TopBar +(_display displayCtrl IDC_RANGEFINDERCONNECTEDICON) ctrlShow (GVAR(currentWaypoint) == -2); + +//Mode: Info: +(_display displayCtrl IDC_MODEDISPLAY) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_INFODISPLAY); + +if (GVAR(currentApplicationPage) == APP_MODE_INFODISPLAY) then { + (_display displayCtrl IDC_MODEDISPLAY_UTMGRID) ctrlSetText GVAR(mgrsGridZoneDesignator); + if (GVAR(currentWaypoint) == -1) then { + (_display displayCtrl IDC_MODEDISPLAY_MODEPOSTIMECG) ctrlShow true; + (_display displayCtrl IDC_MODEDISPLAY_MODEPOSTARGETCG) ctrlShow false; + } else { + (_display displayCtrl IDC_MODEDISPLAY_MODEPOSTIMECG) ctrlShow false; + (_display displayCtrl IDC_MODEDISPLAY_MODEPOSTARGETCG) ctrlShow true; + if (GVAR(currentWaypoint) == -2) then { + (_display displayCtrl IDC_MODEDISPLAY_TARGETICON) ctrlSetText "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa" + } else { + (_display displayCtrl IDC_MODEDISPLAY_TARGETICON) ctrlSetText QUOTE(PATHTOF(images\icon_menuMark.paa)); + }; + }; +}; + +//Mode: Compass: +(_display displayCtrl IDC_MODECOMPASS) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_COMPASS); +(_display displayCtrl IDC_MAPCOMPASS) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_COMPASS); + + +//Mode: Map +(_display displayCtrl IDC_MODEMAP_MAPTRACKBUTTON) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_MAP); +(_display displayCtrl IDC_MODEMAP_MAPZOOMIN) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_MAP); +(_display displayCtrl IDC_MODEMAP_MAPZOOMOUT) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_MAP); + +(_display displayCtrl IDC_MAPPLAIN) ctrlShow ((GVAR(currentApplicationPage) == APP_MODE_MAP) && {!GVAR(mapShowTexture)}); +(_display displayCtrl IDC_MAPDETAILS) ctrlShow ((GVAR(currentApplicationPage) == APP_MODE_MAP) && {GVAR(mapShowTexture)}); + +if (GVAR(currentApplicationPage) == APP_MODE_MAP) then { + _theMap = if (!GVAR(mapShowTexture)) then {_display displayCtrl IDC_MAPPLAIN} else {_display displayCtrl IDC_MAPDETAILS}; + _mapSize = (ctrlPosition _theMap) select 3; + _theMap ctrlMapAnimAdd [0, (GVAR(mapZoom) / _mapSize), GVAR(mapPosition)]; + ctrlMapAnimCommit _theMap; + if (GVAR(mapAutoTrackPosition)) then { + (_display displayCtrl IDC_MODEMAP_MAPTRACKBUTTON) ctrlSetTextColor [1,1,1,0.8]; + } else { + (_display displayCtrl IDC_MODEMAP_MAPTRACKBUTTON) ctrlSetTextColor [1,1,1,0.4]; + }; +}; + +//Mode: Menu +(_display displayCtrl IDC_MODEMENU) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_MENU); + +//Mode: Mark +if (GVAR(currentApplicationPage) == APP_MODE_MARK) then { + (_display displayCtrl IDC_MODEMARK) ctrlShow true; + //not backed up for displayMode swap, not a big deal + + + if ((count GVAR(newWaypointPosition)) == 0) then { + (_display displayCtrl IDC_MODEMARK_HEADER) ctrlSetText (localize "STR_ACE_microdagr_wpEnterCords"); + (_display displayCtrl IDC_MODEMARK_CORDSEDIT) ctrlSetText ""; + } else { + (_display displayCtrl IDC_MODEMARK_HEADER) ctrlSetText format [(localize "STR_ACE_microdagr_wpEnterName"), mapGridPosition GVAR(newWaypointPosition)]; + (_display displayCtrl IDC_MODEMARK_CORDSEDIT) ctrlSetText format ["[%1]", mapGridPosition GVAR(newWaypointPosition)]; + }; + ctrlSetFocus (_display displayCtrl IDC_MODEMARK_CORDSEDIT); +} else { + (_display displayCtrl IDC_MODEMARK) ctrlShow false; + GVAR(newWaypointPosition) = []; +}; + +//Mode: Waypoints +(_display displayCtrl IDC_MODEWAYPOINTS) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_WAYPOINTS); + +//Mode: Setting +(_display displayCtrl IDC_MODESETTINGS) ctrlShow (GVAR(currentApplicationPage) == APP_MODE_SETUP); + +//Buttons pushed: +if (GVAR(currentApplicationPage) == APP_MODE_INFODISPLAY) then { + (_display displayCtrl IDC_BUTTONBG0) ctrlSetText QUOTE(PATHTOF(images\button_pushedDown.paa)); +} else { + (_display displayCtrl IDC_BUTTONBG0) ctrlSetText QUOTE(PATHTOF(images\button_pushedUp.paa)); +}; +if (GVAR(currentApplicationPage) == APP_MODE_COMPASS) then { + (_display displayCtrl IDC_BUTTONBG1) ctrlSetText QUOTE(PATHTOF(images\button_pushedDown.paa)); +} else { + (_display displayCtrl IDC_BUTTONBG1) ctrlSetText QUOTE(PATHTOF(images\button_pushedUp.paa)); +}; +if (GVAR(currentApplicationPage) == APP_MODE_MAP) then { + (_display displayCtrl IDC_BUTTONBG2) ctrlSetText QUOTE(PATHTOF(images\button_pushedDown.paa)); +} else { + (_display displayCtrl IDC_BUTTONBG2) ctrlSetText QUOTE(PATHTOF(images\button_pushedUp.paa)); +}; + +//Update the page now: +[] call FUNC(updateDisplay); diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf new file mode 100644 index 0000000000..af577049a0 --- /dev/null +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -0,0 +1,198 @@ +/* + * Author: PabstMirror + * Updates the display (several times a second) called from the pfeh + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_microdagr_fnc_updateDisplay + * + * Public: No + */ +#include "script_component.hpp" + +private ["_display", "_waypoints", "_posString", "_eastingText", "_northingText", "_numASL", "_aboveSeaLevelText", "_compassAngleText", "_targetPosName", "_targetPosLocationASL", "_bearingText", "_rangeText", "_targetName", "_bearing", "_2dDistanceKm", "_SpeedText", "_playerPos2d", "_wpListBox", "_currentIndex", "_wpName", "_wpPos", "_settingListBox", "_yearString", "_monthSring", "_dayString"]; + +disableSerialization; +_display = displayNull; +if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { + _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); +} else { + _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); +}; +if (isNull _display) exitWith {ERROR("No Display");}; + +(_display displayCtrl IDC_CLOCKTEXT) ctrlSetText ([daytime, "HH:MM"] call bis_fnc_timeToString); + +_waypoints = [] call FUNC(deviceGetWaypoints); + +switch (GVAR(currentApplicationPage)) do { +case (APP_MODE_INFODISPLAY): { + //Easting/Northing: + _posString = mapGridPosition ACE_player; + _eastingText = ""; + _northingText = ""; + if (count _posString > 0) then { + _eastingText = (_posString select [0, ((count _posString)/2)]) + "e"; + _northingText = (_posString select [(count _posString)/2, (count _posString - 1)]) + "n"; + }; + (_display displayCtrl IDC_MODEDISPLAY_EASTING) ctrlSetText _eastingText; + (_display displayCtrl IDC_MODEDISPLAY_NORTHING) ctrlSetText _northingText; + + //Elevation: + _numASL = (GVAR(gpsPositionASL) select 2) + GVAR(mapAltitude); + _aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber; + _aboveSeaLevelText = if (_numASL > 0) then {"+" + _aboveSeaLevelText + " MSL"} else {_aboveSeaLevelText + " MSL"}; + (_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText; + + //Heading: + _compassAngleText = if (GVAR(settingUseMils)) then { + [(floor ((6400 / 360) * (getDir ace_player))), 4, 0] call CBA_fnc_formatNumber; + } else { + ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 + }; + (_display displayCtrl IDC_MODEDISPLAY_HEADINGNUM) ctrlSetText _compassAngleText; + + //Speed: + (_display displayCtrl IDC_MODEDISPLAY_SPEEDNUM) ctrlSetText format ["%1kph", (round (speed (vehicle ace_player)))];; + + + if (GVAR(currentWaypoint) == -1) then { + _yearString = (date select 0); + _monthSring = localize (["error","str_january","str_february","str_march","str_april","str_may","str_june","str_july","str_august","str_september","str_october","str_november","str_december"] select (date select 1)); + _dayString = if ((date select 2) < 10) then {"0" + str (date select 2)} else {str (date select 2)}; + + (_display displayCtrl IDC_MODEDISPLAY_TIMEDISPLAYGREEN1) ctrlSetText format ["%1-%2-%3", _yearString, _monthSring, _dayString]; //"18-Feb-2010"; + (_display displayCtrl IDC_MODEDISPLAY_TIMEDISPLAYGREEN2) ctrlSetText ([daytime, "HH:MM:SS"] call bis_fnc_timeToString); + } else { + _targetPosName = ""; + _targetPosLocationASL = []; + _bearingText = "----"; + _rangeText = "----"; + _aboveSeaLevelText = "----"; + _targetName = "----"; + + if (GVAR(currentWaypoint) == -2) then { + if (!(GVAR(rangeFinderPositionASL) isEqualTo [])) then { + _targetPosName = format ["[%1]", (mapGridPosition GVAR(rangeFinderPositionASL))]; + _targetPosLocationASL = GVAR(rangeFinderPositionASL); + }; + } else { + if (GVAR(currentWaypoint) > ((count _waypoints) - 1)) exitWith {ERROR("bounds");}; + _targetPosName = (_waypoints select GVAR(currentWaypoint)) select 0; + _targetPosLocationASL = (_waypoints select GVAR(currentWaypoint)) select 1; + }; + + if (!(_targetPosLocationASL isEqualTo [])) then { + _bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo; + _bearingText = if (GVAR(settingUseMils)) then { + [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; + } else { + ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 + }; + _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; + _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; + _numASL = (_targetPosLocationASL select 2) + GVAR(mapAltitude); + _aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber; + _aboveSeaLevelText = if (_numASL > 0) then {"+" + _aboveSeaLevelText + " MSL"} else {_aboveSeaLevelText + " MSL"}; + }; + + (_display displayCtrl IDC_MODEDISPLAY_TRACKNUM) ctrlSetText _bearingText; + (_display displayCtrl IDC_MODEDISPLAY_TARGETRANGENUM) ctrlSetText _rangeText; + (_display displayCtrl IDC_MODEDISPLAY_TARGETELEVATIONNUM) ctrlSetText _aboveSeaLevelText; + (_display displayCtrl IDC_MODEDISPLAY_TARGETNAME) ctrlSetText _targetPosName; + }; + }; +case (APP_MODE_COMPASS): { + //Heading: + _compassAngleText = if (GVAR(settingUseMils)) then { + [(floor ((6400 / 360) * (getDir ace_player))), 4, 0] call CBA_fnc_formatNumber; + } else { + ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "°M" //degree symbol is in UTF-8 + }; + (_display displayCtrl IDC_MODECOMPASS_HEADING) ctrlSetText _compassAngleText; + + //Speed: + _SpeedText = format ["%1kph", (round (speed (vehicle ace_player)))];; + (_display displayCtrl IDC_MODECOMPASS_SPEED) ctrlSetText _SpeedText; + + if (GVAR(currentWaypoint) == -1) then { + (_display displayCtrl IDC_MODECOMPASS_BEARING) ctrlSetText ""; + (_display displayCtrl IDC_MODECOMPASS_RANGE) ctrlSetText ""; + (_display displayCtrl IDC_MODECOMPASS_TARGET) ctrlSetText ""; + } else { + _playerPos2d = GVAR(gpsPositionASL) select [0,2]; + + _targetPosName = ""; + _targetPosLocationASL = []; + + if (GVAR(currentWaypoint) == -2) then { + if (!(GVAR(rangeFinderPositionASL) isEqualTo [])) then { + _targetPosName = format ["[%1]", (mapGridPosition GVAR(rangeFinderPositionASL))]; + _targetPosLocationASL = GVAR(rangeFinderPositionASL); + }; + } else { + if (GVAR(currentWaypoint) > ((count _waypoints - 1))) exitWith {ERROR("bounds");}; + _targetPosName = (_waypoints select GVAR(currentWaypoint)) select 0; + _targetPosLocationASL = (_waypoints select GVAR(currentWaypoint)) select 1; + }; + + _bearing = "---"; + _rangeText = "---"; + + if (!(_targetPosLocationASL isEqualTo [])) then { + _bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo; + _bearingText = if (GVAR(settingUseMils)) then { + [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; + } else { + ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°M" //degree symbol is in UTF-8 + }; + _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; + _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; + }; + + (_display displayCtrl IDC_MODECOMPASS_BEARING) ctrlSetText _bearingText; + (_display displayCtrl IDC_MODECOMPASS_RANGE) ctrlSetText _rangeText; + (_display displayCtrl IDC_MODECOMPASS_TARGET) ctrlSetText _targetPosName; + }; + }; + +case (APP_MODE_WAYPOINTS): { + _wpListBox = _display displayCtrl IDC_MODEWAYPOINTS_LISTOFWAYPOINTS; + _currentIndex = lbCurSel _wpListBox; + + lbClear _wpListBox; + { + EXPLODE_2_PVT(_x,_wpName,_wpPos); + _wpListBox lbAdd _wpName; + _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_wpPos select [0,2])) / 1000; + _wpListBox lbSetTextRight [_forEachIndex, (format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)])]; + } forEach _waypoints; + + _currentIndex = (_currentIndex max 0) min (count _waypoints); + _wpListBox lbSetCurSel _currentIndex; + }; + +case (APP_MODE_SETUP): { + _settingListBox = _display displayCtrl IDC_MODESETTINGS; + lbClear _settingListBox; + + _settingListBox lbAdd (localize "STR_ACE_microdagr_settingUseMils"); + if (GVAR(settingUseMils)) then { + _settingListBox lbSetTextRight [0, (localize "STR_ACE_microdagr_settingMils")]; + } else { + _settingListBox lbSetTextRight [0, (localize "STR_ACE_microdagr_settingDegrees")]; + }; + + _settingListBox lbAdd (localize "STR_ACE_microdagr_settingShowWP"); + if (GVAR(settingShowAllWaypointsOnMap)) then { + _settingListBox lbSetTextRight [1, (localize "STR_ACE_microdagr_settingOn")]; + } else { + _settingListBox lbSetTextRight [1, (localize "STR_ACE_microdagr_settingOff")]; + }; + }; +}; diff --git a/addons/microdagr/functions/script_component.hpp b/addons/microdagr/functions/script_component.hpp new file mode 100644 index 0000000000..13fbbcf5fe --- /dev/null +++ b/addons/microdagr/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\microdagr\script_component.hpp" \ No newline at end of file diff --git a/addons/microdagr/gui.hpp b/addons/microdagr/gui.hpp new file mode 100644 index 0000000000..2eeb99563c --- /dev/null +++ b/addons/microdagr/gui.hpp @@ -0,0 +1,83 @@ +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 + +class RscActiveText; +class RscText; +class RscPicture; +class RscMapControl { + class hospital; + class church; + class lighthouse; + class power; + class fuelstation; + class transmitter; +}; +class RscMapControlEmpty; +class RscControlsGroupNoScrollbars; +class RscEdit; +class RscButton; +class RscListBox; + + +class GVAR(RscActiveTextPicture): RscActiveText { + style = 48; + colorText[] = {1,1,1,1}; + colorActive[] = {1,1,1,1}; + color[] = {1,1,1,1}; + color2[] = {1,1,1,1}; + colorFocused[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,1}; + colorBackground[] = {1,1,1,1}; + colorBackground2[] = {1,1,1,1}; + colorBackgroundFocused[] = {1,1,1,1}; +}; + +class GVAR(RscText): RscText { + font = "EtelkaMonospacePro"; + //Design note: I think less contrast in font color makes it look more natural and less "eye catching" + colorText[] = {0.75,0.75,0.75,1}; +}; + +//Redfine Scaling for the Dialog +#define X_PART(num) QUOTE((((60 - 25)/2) + (num)) * (safeZoneH / 64) + (safezoneX + (safezoneW - safeZoneH)/2)) +#define Y_PART(num) QUOTE((0 + (num)) * (safeZoneH / 36) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)) +#define W_PART(num) QUOTE((num) * (safeZoneH / 64)) +#define H_PART(num) QUOTE((num) * (safeZoneH / 36)) + +class GVAR(TheDialog) { + idd = -1; + movingEnable = 1; + duration = 9999999; + fadein = 0; + fadeout = 0; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(DialogDisplay)),_this select 0)];); + onUnload = QUOTE([] call FUNC(dialogClosedEH)); + + #include "gui_controls.hpp" +}; + + +//Redfine Scaling for the RscTitle +#define PROFILE_X (profilenamespace getvariable ['IGUI_GRID_GPS_X', 0]) +#define PROFILE_Y (profilenamespace getvariable ['IGUI_GRID_GPS_Y', 0]) +#define PROFILE_W (profilenamespace getvariable ['IGUI_GRID_GPS_W', 1]) +#define PROFILE_H ((16/9) * (profilenamespace getvariable ['IGUI_GRID_GPS_W', 1])) + +#define X_PART(num) QUOTE((num) / 25 * PROFILE_W + PROFILE_X) +#define Y_PART(num) QUOTE((num) / 25 * PROFILE_H + PROFILE_Y) +#define W_PART(num) QUOTE((num) / 25 * PROFILE_W) +#define H_PART(num) QUOTE((num) / 25 * PROFILE_H) + +class RscTitles { + class GVAR(TheRscTitleDisplay) { + idd = -1; + movingEnable = 1; + duration = 9999999; + fadein = 0; + fadeout = 0; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RscTitleDisplay)),_this select 0)];); + + #include "gui_controls.hpp" + }; +}; diff --git a/addons/microdagr/gui_controls.hpp b/addons/microdagr/gui_controls.hpp new file mode 100644 index 0000000000..5d6d9395fd --- /dev/null +++ b/addons/microdagr/gui_controls.hpp @@ -0,0 +1,769 @@ +class controlsBackground { + class BackgroundBlackScreen: GVAR(RscText) { + idc = -1; + x = X_PART(-1); + y = Y_PART(-1); + //Cover the "seams" and make it bigger + w = W_PART(27); + h = H_PART(27); + colorBackground[] = {0,0,0,1}; + }; + class StatusBarBS: RscPicture { + idc = -1; + text = QUOTE(PATHTOF(images\microDAGR_topBar.paa)); + x = X_PART(0); + y = Y_PART(0); + w = W_PART(25); + h = H_PART(2); + }; + class RangefinderConnectedIcon: RscPicture { + idc = IDC_RANGEFINDERCONNECTEDICON; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; + x = X_PART(6.35); + y = Y_PART(0.1); + w = W_PART(2.7); + h = H_PART(1.8); + }; + class ClockText: GVAR(RscText) { + idc = IDC_CLOCKTEXT; + style = ST_RIGHT; + // text = "12:00"; + x = X_PART(0); + y = Y_PART(0.2); + w = W_PART(15); + h = H_PART(1.8); + sizeEx = H_PART(1.5); + colorText[] = {0,0.67,0.22,1}; + }; + class ClockText2: GVAR(RscText) { + idc = -1; + style = ST_LEFT; + text = "L"; + x = X_PART(14.75); + y = Y_PART(0.2); + w = W_PART(2); + h = H_PART(1.8); + sizeEx = H_PART(1.5); + }; + class MapPlain: RscMapControl { + idc = IDC_MAPPLAIN; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + onDraw = QUOTE(_this call FUNC(mapOnDrawEH)); + onMouseButtonDblClick = QUOTE(_this call FUNC(mapDoubleTapEH)); + + scaleMin = 0.005; + scaleMax = 10; //Lets the mini display zoom out far enough + drawObjects = 0; + text = "#(argb,8,8,3)color(1,1,1,1)"; + maxSatelliteAlpha = 0; + alphaFadeStartScale = 100; + alphaFadeEndScale = 100; + colorSea[] = {0.467,0.631,0.851,0.25}; + colorCountlinesWater[] = {0.491,0.577,0.702,0.3}; + colorMainCountlinesWater[] = {0.491,0.577,0.702,0.6}; + colorGrid[] = {0,0,0,0.15}; + colorGridMap[] = {0,0,0,0.2}; + + //Text sizes: + sizeExLabel = 0; + sizeExGrid = H_PART(0.5); + sizeExUnits = 0; + sizeExNames = H_PART(2); //Marker's Text + sizeExInfo = 0; + sizeExLevel = 0; + sizeEx = H_PART(1); + + ptsPerSquareSea = 5; + ptsPerSquareTxt = 20; + ptsPerSquareRoad = 0.01; + ptsPerSquareObj = 2000; //don't show buildings + ptsPerSquareCLn = 100; + ptsPerSquareCost = 200; + ptsPerSquareFor = 9; + ptsPerSquareForEdge = 9; + + showCountourInterval = 0; + + //Copy style from ace_map's config.cpp: + colorTracks[] = {1.0,0.0,0.0,1}; + colorTracksFill[] = {1.0,1.0,0.0,1}; + colorRoads[] = {0.0,0.0,0.0,1}; + colorRoadsFill[] = {1,1,0,1}; + colorMainRoads[] = {0.0,0.0,0.0,1}; + colorMainRoadsFill[] = {1,0.6,0.4,1}; + colorRailWay[] = {0.8,0.2,0,1}; + + colorBackground[] = {0.929412, 0.929412, 0.929412, 1.0}; + colorOutside[] = {0.929412, 0.929412, 0.929412, 1.0}; + colorCountlines[] = {0.647059, 0.533333, 0.286275, 0.5}; + colorMainCountlines[] = {0.858824, 0, 0,0.5}; + colorForest[] = {0.6, 0.8, 0.2, 0.1}; + colorForestBorder[] = {0,1,0,0.25}; + colorLevels[] = {0.0, 0.0, 0.0, 0.5}; + colorRocks[] = {0.50, 0.50, 0.50, 0}; + }; + class MapDetails: MapPlain { + idc = IDC_MAPDETAILS; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + onDraw = QUOTE(_this call FUNC(mapOnDrawEH)); + onMouseButtonDblClick = QUOTE(_this call FUNC(mapDoubleTapEH)); + + // ptsPerSquareSea = 5; + // ptsPerSquareTxt = 20; + // ptsPerSquareRoad = 0.01; + ptsPerSquareObj = 9; + // ptsPerSquareCLn = 100; + // ptsPerSquareCost = 200; + // ptsPerSquareFor = 9; + // ptsPerSquareForEdge = 9; + + maxSatelliteAlpha = 0.5; + + colorRocks[] = {0.50, 0.50, 0.50, 0.50}; + + class hospital: Hospital {color[] = {0,0,0,0.25};}; + class church: Church {color[] = {0,0,0,0.25};}; + class lighthouse: Lighthouse {color[] = {0,0,0,0.25};}; + class power: power {color[] = {0,0,0,0.25};}; + class fuelstation: Fuelstation {color[] = {0,0,0,0.25};}; + class transmitter: Transmitter {color[] = {0,0,0,0.25};}; + + }; + class MapCompass: RscMapControlEmpty { + idc = IDC_MAPCOMPASS; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + onDraw = QUOTE(_this call FUNC(mapOnDrawEH)); + + colorBackground[] = {0,0,0,1}; + colorOutside[] = {0,0,0,1}; + moveOnEdges = 0; + }; +}; + +class controls { + class TopMenuClick: GVAR(RscActiveTextPicture) { + idc = -1; + text = "#(argb,8,8,3)color(0,0,0,0)"; + x = X_PART(0); + y = Y_PART(0); + w = W_PART(25); + h = H_PART(2); + onbuttonclick = QUOTE([3] call FUNC(saveCurrentAndSetNewMode)); + }; + + //Mode: Display + class ModeDisplay: RscControlsGroupNoScrollbars { + idc = IDC_MODEDISPLAY; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + class Controls { + class MGRSNew: GVAR(RscText) { + idc = -1; + text = "$STR_ACE_microdagr_controlMGRS"; + x = W_PART(0.5); + y = H_PART(0); + w = W_PART(10); + h = H_PART(1); + sizeEx = H_PART(1); + }; + class WGD: GVAR(RscText) { + idc = -1; + style = ST_RIGHT; + text = "$STR_ACE_microdagr_controlWGD"; + x = W_PART(14.5); + y = H_PART(0); + w = W_PART(10); + h = H_PART(1); + sizeEx = H_PART(1); + }; + class UTMGrid: GVAR(RscText) { + idc = IDC_MODEDISPLAY_UTMGRID; + // text = "15T XG"; + x = W_PART(4.5); + y = H_PART(1.5); + w = W_PART(10); + h = H_PART(2); + sizeEx = H_PART(2); + }; + class selfIcon: RscPicture { + idc = -1; + text = QUOTE(PATHTOF(images\icon_self.paa)); + x = W_PART(0.5); + y = H_PART(2); + w = W_PART(4); + h = H_PART(3); + }; + class Easting: GVAR(RscText) { + idc = IDC_MODEDISPLAY_EASTING; + // text = "11994e"; //--- ToDo: Localize; + style = ST_RIGHT; + x = W_PART(14.5); + y = H_PART(1.5); + w = W_PART(10); + h = H_PART(2); + sizeEx = H_PART(2); + }; + class Northing: GVAR(RscText) { + idc = IDC_MODEDISPLAY_NORTHING; + // text = "11994n"; //--- ToDo: Localize; + style = ST_RIGHT; + x = W_PART(14.5); + y = H_PART(3.5); + w = W_PART(10); + h = H_PART(2); + sizeEx = H_PART(2); + }; + class ElevationText: GVAR(RscText) { + idc = -1; + text = "$STR_A3_disp_editor_elevation"; + x = W_PART(0.5); + y = H_PART(6); + w = W_PART(10); + h = H_PART(1.5); + sizeEx = H_PART(1.25); + }; + class ElevationNum: GVAR(RscText) { + idc = IDC_MODEDISPLAY_ELEVATIONNUM; + // text = "+000232 MSL"; //--- ToDo: Localize; + style = ST_RIGHT; + x = W_PART(12); + y = H_PART(6); + w = W_PART(12.5); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class RscPicture_1201: RscPicture { + idc = -1; + text = "#(argb,8,8,3)color(1,1,1,0.75)"; + x = W_PART(0.5); + y = H_PART(8.115); + w = W_PART(24); + h = H_PART(0.05); + }; + class CompasIcon: RscPicture { + idc = -1; + text = QUOTE(PATHTOF(images\icon_infoCompass.paa)); + x = W_PART(0.5); + y = H_PART(8.5); + w = W_PART(2); + h = H_PART(1.5); + }; + class HeadingNum: GVAR(RscText) { + idc = IDC_MODEDISPLAY_HEADINGNUM; + // text = "097.2oM"; //--- ToDo: Localize; + x = W_PART(4); + y = H_PART(8.5); + w = W_PART(10); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class SpeedNum: GVAR(RscText) { + idc = IDC_MODEDISPLAY_SPEEDNUM; + // text = "34kph"; //--- ToDo: Localize; + style = ST_RIGHT; + x = W_PART(14.5); + y = H_PART(8.5); + w = W_PART(7.5); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class RscPicture_1204: RscPicture { + idc = -1; + text = "#(argb,8,8,3)color(1,1,1,0.75)"; + x = W_PART(0.5); + y = H_PART(10.45); + w = W_PART(24); + h = H_PART(0.05); + }; + class modePosTimeCG: RscControlsGroupNoScrollbars { + idc = IDC_MODEDISPLAY_MODEPOSTIMECG; + x = W_PART(0); + y = H_PART(10.5); + w = W_PART(25); + h = H_PART(8.5); + class controls { + class TimeIcon: RscPicture { + idc = -1; + text = QUOTE(PATHTOF(images\icon_infoClock.paa)); + x = W_PART(0.5); + y = H_PART(3.5); + w = W_PART(2); + h = H_PART(1.5); + }; + class TimeDisplayGreen1: GVAR(RscText) { + idc = IDC_MODEDISPLAY_TIMEDISPLAYGREEN1; + x = W_PART(5); + y = H_PART(2.75); + w = W_PART(15); + h = H_PART(1.5); + style = ST_CENTER; + sizeEx = H_PART(1.5); + colorText[] = {0,0.67,0.22,1}; + }; + class TimeDisplayGreen2: TimeDisplayGreen1 { + idc = IDC_MODEDISPLAY_TIMEDISPLAYGREEN2; + y = H_PART(4.25); + }; + }; + }; + class modePosTargetCG: RscControlsGroupNoScrollbars { + idc = IDC_MODEDISPLAY_MODEPOSTARGETCG; + x = W_PART(0); + y = H_PART(10.5); + w = W_PART(25); + h = H_PART(8.5); + class controls { + class TargetIcon: RscPicture { + idc = IDC_MODEDISPLAY_TARGETICON; + text = QUOTE(PATHTOF(images\icon_menuMark.paa)); + x = W_PART(0.5); + y = H_PART(0.5); + w = W_PART(2); + h = H_PART(1.5); + }; + class TrackNum: GVAR(RscText) { + idc = IDC_MODEDISPLAY_TRACKNUM; + // text = "097.2oM"; //--- ToDo: Localize; + x = W_PART(4); + y = H_PART(0.5); + w = W_PART(10); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class TargetRangeText: GVAR(RscText) { + idc = -1; + text = "$STR_ACE_microdagr_controlRange"; + x = W_PART(0.5); + y = H_PART(2); + w = W_PART(7.5); + h = H_PART(1.5); + sizeEx = H_PART(1.25); + }; + class TargetRangeNum: GVAR(RscText) { + idc = IDC_MODEDISPLAY_TARGETRANGENUM; + // text = "1250 m"; + style = ST_RIGHT; + x = W_PART(14.5); + y = H_PART(2); + w = W_PART(10); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class TargetElevationText: GVAR(RscText) { + idc = -1; + text = "$STR_A3_disp_editor_elevation"; //--- ToDo: Localize; + x = W_PART(0.5); + y = H_PART(3.5); + w = W_PART(10); + h = H_PART(1.5); + sizeEx = H_PART(1.25); + }; + class TargetElevationNum: GVAR(RscText) { + idc = IDC_MODEDISPLAY_TARGETELEVATIONNUM; + // text = "+000232 MSL"; //--- ToDo: Localize; + style = ST_RIGHT; + x = W_PART(12); + y = H_PART(3.5); + w = W_PART(12.5); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class TargetName: GVAR(RscText) { + idc = IDC_MODEDISPLAY_TARGETNAME; + // text = "43243 33432"; //--- ToDo: Localize; + style = ST_CENTER; + x = W_PART(1); + y = H_PART(5.5); + w = W_PART(23); + h = H_PART(2); + sizeEx = H_PART(2); + }; + }; + }; + }; + }; + + //Mode: Compass + class ModeCompass: RscControlsGroupNoScrollbars { + idc = IDC_MODECOMPASS; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + class Controls { + + class CompassHeader: GVAR(RscText) { + idc = -1; + style = ST_CENTER; + text = "$STR_ACE_microdagr_compasDirection"; + x = W_PART(0); + y = H_PART(0); + w = W_PART(25); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + }; + class CompassHeading: GVAR(RscText) { + idc = IDC_MODECOMPASS_HEADING; + style = ST_LEFT; + x = W_PART(0); + y = H_PART(1.5); + w = W_PART(25); + h = H_PART(1.25); + sizeEx = H_PART(1.25); + colorText[] = {0.533,0.769,0.76,1}; + }; + class CompassSpeed: CompassHeading { + idc = IDC_MODECOMPASS_SPEED; + style = ST_RIGHT; + }; + class CompassBearing: CompassHeading { + idc = IDC_MODECOMPASS_BEARING; + y = H_PART(16.25); + style = ST_LEFT; + colorText[] = {1,0.564,0.564,1}; + }; + class CompassRange: CompassHeading { + idc = IDC_MODECOMPASS_RANGE; + y = H_PART(16.25); + style = ST_RIGHT; + colorText[] = {1,0.564,0.564,1}; + }; + class CompassTARGET: CompassHeader { + idc = IDC_MODECOMPASS_TARGET; + y = H_PART(17.5); + }; + }; + }; + + + //Mode: Map + class mapTrackButton: GVAR(RscActiveTextPicture) { + onbuttonclick = QUOTE(['autotrack'] call FUNC(modeMapButtons)); + idc = IDC_MODEMAP_MAPTRACKBUTTON; + text = QUOTE(PATHTOF(images\icon_mapTrack.paa)); + x = X_PART(11); + y = Y_PART(18.75); + w = W_PART(3); + h = H_PART(2.25); + }; + class mapZoomIn: mapTrackButton { + onbuttonclick = QUOTE(['zoomin'] call FUNC(modeMapButtons)); + idc = IDC_MODEMAP_MAPZOOMIN; + text = QUOTE(PATHTOF(images\icon_mapPlus.paa)); + color[] = {1,1,1,0.4}; + x = X_PART(4); + }; + class mapZoomOut: mapTrackButton { + onbuttonclick = QUOTE(['zoomout'] call FUNC(modeMapButtons)); + idc = IDC_MODEMAP_MAPZOOMOUT; + text = QUOTE(PATHTOF(images\icon_mapMinus.paa)); + color[] = {1,1,1,0.4}; + x = X_PART(18); + }; + + + // Mode: Menu + class ModeMenu: RscControlsGroupNoScrollbars { + idc = IDC_MODEMENU; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + class Controls { + class ButtonTL: GVAR(RscActiveTextPicture) { + idc = -1; + text = QUOTE(PATHTOF(images\icon_menuMark.paa)); + x = W_PART(3); + y = H_PART(1.5); + w = W_PART(8); + h = H_PART(6); + onbuttonclick = QUOTE([4] call FUNC(saveCurrentAndSetNewMode)); + }; + class ButtonTR: ButtonTL { + text = QUOTE(PATHTOF(images\icon_menuWaypoints.paa)); + x = W_PART(14); + y = H_PART(1.5); + onbuttonclick = QUOTE([5] call FUNC(saveCurrentAndSetNewMode)); + }; + class ButtonBL: ButtonTL { + text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; + x = W_PART(3); + y = H_PART(10.5); + onbuttonclick = QUOTE(_this call FUNC(appMenuButtonConnectRangefinder)); + }; + class ButtonBR: ButtonTL { + text = QUOTE(PATHTOF(images\icon_menuSettings.paa)); + x = W_PART(14); + y = H_PART(10.5); + onbuttonclick = QUOTE([6] call FUNC(saveCurrentAndSetNewMode)); + }; + class TextTL: GVAR(RscText) { + idc = -1; + style = ST_CENTER; + text = "$STR_ACE_microdagr_menuMark"; + x = W_PART(0); + y = H_PART(7.5); + w = W_PART(14); + h = H_PART(1.2); + sizeEx = H_PART(1.2); + }; + class TextTR: TextTL { + text = "$STR_ACE_microdagr_menuWaypoints"; + x = W_PART(11); + y = H_PART(7.5); + }; + class TextBL: TextTL { + text = "$STR_ACE_microdagr_menuConnectTo"; + x = W_PART(0); + y = H_PART(16.5); + }; + class TextBR: TextTL { + text = "$STR_ACE_microdagr_menuSettings"; + x = W_PART(11); + y = H_PART(16.5); + }; + }; + }; + + // Mode: Mark + class ModeMark: RscControlsGroupNoScrollbars { + idc = IDC_MODEMARK; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + class Controls { + class InfoText: GVAR(RscText) { + idc = IDC_MODEMARK_HEADER; + x = W_PART(3); + y = H_PART(1); + w = W_PART(19); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + colorText[] = {0.95,0.95,0.95,1}; + }; + class RscEdit_1400: RscEdit { + idc = IDC_MODEMARK_CORDSEDIT; + x = W_PART(3); + y = H_PART(2.75); + w = W_PART(17); + h = H_PART(1.5); + size = H_PART(1.5); + sizeEx = H_PART(1.5); + colorText[] = {0.95,0.95,0.95,1}; + font = "EtelkaMonospacePro"; + }; + class DeleteButton: GVAR(RscActiveTextPicture) { + idc = -1; + text = QUOTE(PATHTOF(images\icon_deleteButton.paa)); + x = W_PART(20); + y = H_PART(2.75); + w = W_PART(2); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + onbuttonclick = QUOTE(['del'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad1: RscButton { + idc = -1; + text = "1"; + x = W_PART(3); + y = H_PART(5); + w = W_PART(6); + h = H_PART(3); + sizeEx = H_PART(3); + colorText[] = {0.95,0.95,0.95,1}; + colorBackground[] = {0.3,0.3,0.3,1}; + colorBackgroundDisabled[] = {0.3,0.3,0.3,1}; + colorBackgroundActive[] = {0.3,0.3,0.3,1}; + colorFocused[] = {0.3,0.3,0.3,1}; + onbuttonclick = QUOTE(['1'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad2: Keypad1 { + text = "2"; + x = W_PART(9.5); + onbuttonclick = QUOTE(['2'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad3: Keypad1 { + text = "3"; + x = W_PART(16); + onbuttonclick = QUOTE(['3'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad4: Keypad1 { + text = "4"; + x = W_PART(3); + y = H_PART(8.5); + onbuttonclick = QUOTE(['4'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad5: Keypad4 { + text = "5"; + x = W_PART(9.5); + onbuttonclick = QUOTE(['5'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad6: Keypad4 { + text = "6"; + x = W_PART(16); + onbuttonclick = QUOTE(['6'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad7: Keypad1 { + text = "7"; + x = W_PART(3); + y = H_PART(12); + onbuttonclick = QUOTE(['7'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad8: Keypad7 { + text = "8"; + x = W_PART(9.5); + onbuttonclick = QUOTE(['8'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad9: Keypad7 { + text = "9"; + x = W_PART(16); + onbuttonclick = QUOTE(['9'] call FUNC(appMarkKeypadEntry)); + }; + class Keypad0: Keypad1 { + text = "0"; + x = W_PART(3); + y = H_PART(15.5); + w = W_PART(12.5) + onbuttonclick = QUOTE(['0'] call FUNC(appMarkKeypadEntry)); + }; + class KeypadEnter: Keypad1 { + text = "OK"; + x = W_PART(16); + y = H_PART(15.5); + onbuttonclick = QUOTE(['ok'] call FUNC(appMarkKeypadEntry)); + }; + }; + }; + + // Mode: Waypoints + class ModeWaypoints: RscControlsGroupNoScrollbars { + idc = IDC_MODEWAYPOINTS; + x = X_PART(0); + y = Y_PART(2); + w = W_PART(25); + h = H_PART(19); + class Controls { + class ListOfWaypoints: RscListBox { + idc = IDC_MODEWAYPOINTS_LISTOFWAYPOINTS; + sizeEx = H_PART(1.5); + sizeEx2 = H_PART(1.5); + rowHeight = H_PART(1.75); + colorText[] = {0.75,0.75,0.75,1}; + colorSelect[] = {0.75,0.75,0.75,1}; + colorSelect2[] = {0.75,0.75,0.75,1}; + colorBackground[] = {0,0,0,1}; + colorSelectBackground[] = {0.3,0.3,0.3,1}; + colorSelectBackground2[] = {0.3,0.3,0.3,1}; + + itemSpacing = 0.001; + x = W_PART(0.2); + y = H_PART(0.5); + w = W_PART(24.6); + h = H_PART(16.5); + }; + + class ButtonSetWP: RscButton { + idc = -1; + text = "$STR_ACE_microdagr_waypointsSet"; + x = W_PART(1); + y = H_PART(17); + w = W_PART(7); + h = H_PART(1.5); + sizeEx = H_PART(1.5); + font = "EtelkaMonospacePro"; + colorText[] = {0.95,0.95,0.95,1}; + colorBackground[] = {0.3,0.3,0.3,1}; + colorBackgroundDisabled[] = {0.3,0.3,0.3,1}; + colorBackgroundActive[] = {0.3,0.3,0.3,1}; + colorFocused[] = {0.3,0.3,0.3,1}; + onbuttonclick = QUOTE(_this call FUNC(appWaypointsButtonSetWP)); + }; + class ButtonAdd: ButtonSetWP { + text = "$STR_ACE_microdagr_waypointsAdd"; + x = W_PART(9); + onbuttonclick = QUOTE([APP_MODE_MARK] call FUNC(saveCurrentAndSetNewMode)); + }; + class ButtonDelete: ButtonSetWP { + text = "$STR_ACE_microdagr_waypointsDelete"; + x = W_PART(17); + onbuttonclick = QUOTE(_this call FUNC(appWaypointsButtonDeleteWP)); + }; + }; + }; + + class SettingsMenu: RscListBox { + idc = IDC_MODESETTINGS; + x = X_PART(0.2); + y = Y_PART(2); + w = W_PART(24.6); + h = H_PART(19); + onLBDblClick = QUOTE(_this call FUNC(appSettingsLBClick)); + sizeEx = H_PART(1.5); + sizeEx2 = H_PART(1.5); + rowHeight = H_PART(1.75); + itemSpacing = 0.001; + colorText[] = {0.75,0.75,0.75,1}; + colorSelect[] = {0.75,0.75,0.75,1}; + colorSelect2[] = {0.75,0.75,0.75,1}; + colorBackground[] = {0.05,0.05,0.05,1}; + colorSelectBackground[] = {0.05,0.05,0.05,1}; + colorSelectBackground2[] = {0.05,0.05,0.05,1}; + }; + + class ButtonBG0: RscPicture { + idc = IDC_BUTTONBG0; + text = QUOTE(PATHTOF(images\button_pushedDown.paa)); + x = X_PART(0 * (25/3)); + y = Y_PART(21); + w = W_PART((25/3)); + h = H_PART(4); + }; + class ButtonBG1: ButtonBG0 { + idc = IDC_BUTTONBG1; + x = X_PART(1 * (25/3)); + }; + class ButtonBG2: ButtonBG0 { + idc = IDC_BUTTONBG2; + x = X_PART(2 * (25/3)); + }; + class ButtonIcon0: GVAR(RscActiveTextPicture) { + idc = -1; + text = QUOTE(PATHTOF(images\icon_info.paa)); + x = X_PART(0 * (25/3)); + y = Y_PART(21); + w = W_PART((25/3)); + h = H_PART(4); + onbuttonclick = QUOTE([APP_MODE_INFODISPLAY] call FUNC(saveCurrentAndSetNewMode)); + }; + class ButtonIcon1: ButtonIcon0 { + text = QUOTE(PATHTOF(images\icon_compass.paa)); + x = X_PART(1 * (25/3)); + onbuttonclick = QUOTE([APP_MODE_COMPASS] call FUNC(saveCurrentAndSetNewMode)); + }; + class ButtonIcon2: ButtonIcon0 { + text = QUOTE(PATHTOF(images\icon_map.paa)); + x = X_PART(2 * (25/3)); + onbuttonclick = QUOTE([APP_MODE_MAP] call FUNC(saveCurrentAndSetNewMode)); + }; + //At the end: The Big Shell overlay + class MicroDagrShell: RscPicture { + idc = IDC_MICRODAGRSHELL; + text = QUOTE(PATHTOF(images\microDAGR_shellPicture.paa)); + x = X_PART(-14.77); + y = Y_PART(-5.875); + w = W_PART(53.62); + h = H_PART(39.9); + }; +}; diff --git a/addons/microdagr/images/button_pushedDown.paa b/addons/microdagr/images/button_pushedDown.paa new file mode 100644 index 0000000000..fc519a3235 Binary files /dev/null and b/addons/microdagr/images/button_pushedDown.paa differ diff --git a/addons/microdagr/images/button_pushedUp.paa b/addons/microdagr/images/button_pushedUp.paa new file mode 100644 index 0000000000..5aa18986be Binary files /dev/null and b/addons/microdagr/images/button_pushedUp.paa differ diff --git a/addons/microdagr/images/compass_needle.paa b/addons/microdagr/images/compass_needle.paa new file mode 100644 index 0000000000..048518c8ad Binary files /dev/null and b/addons/microdagr/images/compass_needle.paa differ diff --git a/addons/microdagr/images/compass_starInverted.paa b/addons/microdagr/images/compass_starInverted.paa new file mode 100644 index 0000000000..cc911848e3 Binary files /dev/null and b/addons/microdagr/images/compass_starInverted.paa differ diff --git a/addons/microdagr/images/icon_compass.paa b/addons/microdagr/images/icon_compass.paa new file mode 100644 index 0000000000..777eaffde4 Binary files /dev/null and b/addons/microdagr/images/icon_compass.paa differ diff --git a/addons/microdagr/images/icon_deleteButton.paa b/addons/microdagr/images/icon_deleteButton.paa new file mode 100644 index 0000000000..a1af618ea7 Binary files /dev/null and b/addons/microdagr/images/icon_deleteButton.paa differ diff --git a/addons/microdagr/images/icon_info.paa b/addons/microdagr/images/icon_info.paa new file mode 100644 index 0000000000..5dc94a444c Binary files /dev/null and b/addons/microdagr/images/icon_info.paa differ diff --git a/addons/microdagr/images/icon_infoClock.paa b/addons/microdagr/images/icon_infoClock.paa new file mode 100644 index 0000000000..292cf29afb Binary files /dev/null and b/addons/microdagr/images/icon_infoClock.paa differ diff --git a/addons/microdagr/images/icon_infoCompass.paa b/addons/microdagr/images/icon_infoCompass.paa new file mode 100644 index 0000000000..8390a24509 Binary files /dev/null and b/addons/microdagr/images/icon_infoCompass.paa differ diff --git a/addons/microdagr/images/icon_map.paa b/addons/microdagr/images/icon_map.paa new file mode 100644 index 0000000000..52c3931c68 Binary files /dev/null and b/addons/microdagr/images/icon_map.paa differ diff --git a/addons/microdagr/images/icon_mapMinus.paa b/addons/microdagr/images/icon_mapMinus.paa new file mode 100644 index 0000000000..8c9be4fb7d Binary files /dev/null and b/addons/microdagr/images/icon_mapMinus.paa differ diff --git a/addons/microdagr/images/icon_mapPlus.paa b/addons/microdagr/images/icon_mapPlus.paa new file mode 100644 index 0000000000..5272bce099 Binary files /dev/null and b/addons/microdagr/images/icon_mapPlus.paa differ diff --git a/addons/microdagr/images/icon_mapTrack.paa b/addons/microdagr/images/icon_mapTrack.paa new file mode 100644 index 0000000000..f16ccbfe86 Binary files /dev/null and b/addons/microdagr/images/icon_mapTrack.paa differ diff --git a/addons/microdagr/images/icon_mapWaypoints.paa b/addons/microdagr/images/icon_mapWaypoints.paa new file mode 100644 index 0000000000..89f167f4c1 Binary files /dev/null and b/addons/microdagr/images/icon_mapWaypoints.paa differ diff --git a/addons/microdagr/images/icon_menuMark.paa b/addons/microdagr/images/icon_menuMark.paa new file mode 100644 index 0000000000..2c77aac04b Binary files /dev/null and b/addons/microdagr/images/icon_menuMark.paa differ diff --git a/addons/microdagr/images/icon_menuSettings.paa b/addons/microdagr/images/icon_menuSettings.paa new file mode 100644 index 0000000000..cfb340247e Binary files /dev/null and b/addons/microdagr/images/icon_menuSettings.paa differ diff --git a/addons/microdagr/images/icon_menuWaypoints.paa b/addons/microdagr/images/icon_menuWaypoints.paa new file mode 100644 index 0000000000..74ca3a59c1 Binary files /dev/null and b/addons/microdagr/images/icon_menuWaypoints.paa differ diff --git a/addons/microdagr/images/icon_self.paa b/addons/microdagr/images/icon_self.paa new file mode 100644 index 0000000000..79c41eaa69 Binary files /dev/null and b/addons/microdagr/images/icon_self.paa differ diff --git a/addons/microdagr/images/microDAGR_item.paa b/addons/microdagr/images/microDAGR_item.paa new file mode 100644 index 0000000000..ce6336c8a6 Binary files /dev/null and b/addons/microdagr/images/microDAGR_item.paa differ diff --git a/addons/microdagr/images/microDAGR_shellPicture.paa b/addons/microdagr/images/microDAGR_shellPicture.paa new file mode 100644 index 0000000000..93a14c3c11 Binary files /dev/null and b/addons/microdagr/images/microDAGR_shellPicture.paa differ diff --git a/addons/microdagr/images/microDAGR_topBar.paa b/addons/microdagr/images/microDAGR_topBar.paa new file mode 100644 index 0000000000..c4c28307f0 Binary files /dev/null and b/addons/microdagr/images/microDAGR_topBar.paa differ diff --git a/addons/microdagr/readme.md b/addons/microdagr/readme.md new file mode 100644 index 0000000000..f2dc25a656 --- /dev/null +++ b/addons/microdagr/readme.md @@ -0,0 +1,24 @@ +ace_microdagr +=============== + +Adds a microDAGR infentry GPS device. +Press home to open. Then home again to toggle an interactive version. Press CTRL+Home to close. +Info/Compass/Minimap modes are selectable by the bottom buttons. Tap the top bar to open the menu and access Mark/Waypoints/Connect To/Settings modes. +Tap the minimap button again to toggle map modes (if available). +Enter waypoints from the menu or double tapping on the minimap. +Can interface with the `ace_vector`. Hold Azimuth+Range and release (see page 14 of vector's manual) + +#### Items Added: + +`ACE_microDAGR` + +## For Mission Makers: + +#### Modules: +* MicroDAGR Map Fill - Controls the amount of map data avaialbe for the minimap. Can limit to just roads/topographical or disable entirely. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/microdagr/script_component.hpp b/addons/microdagr/script_component.hpp new file mode 100644 index 0000000000..72c5c125bc --- /dev/null +++ b/addons/microdagr/script_component.hpp @@ -0,0 +1,83 @@ +#define COMPONENT microdagr +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MICRODAGR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MICRODAGR + #define DEBUG_SETTINGS DEBUG_SETTINGS_MICRODAGR +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define DUMMY_POS [-1,-1] +#define DUMMY_ZOOM 0.1 + +#define MAP_DETAIL_NONE 0 +#define MAP_DETAIL_TOPOROADS 1 +#define MAP_DETAIL_SAT 2 + +#define APP_MODE_NULL -1 +#define APP_MODE_INFODISPLAY 0 +#define APP_MODE_COMPASS 1 +#define APP_MODE_MAP 2 +#define APP_MODE_MENU 3 +#define APP_MODE_MARK 4 +#define APP_MODE_WAYPOINTS 5 +#define APP_MODE_SETUP 6 + +#define DISPLAY_MODE_CLOSED 0 +#define DISPLAY_MODE_DISPLAY 1 +#define DISPLAY_MODE_DIALOG 2 +#define DISPLAY_MODE_HIDDEN 3 + +#define IDC_RANGEFINDERCONNECTEDICON 77700 +#define IDC_CLOCKTEXT 77701 +#define IDC_MAPPLAIN 77702 +#define IDC_MAPDETAILS 77703 +#define IDC_MAPCOMPASS 77704 + +#define IDC_MODEDISPLAY 144000 +#define IDC_MODEDISPLAY_UTMGRID 144001 +#define IDC_MODEDISPLAY_EASTING 144002 +#define IDC_MODEDISPLAY_NORTHING 144003 +#define IDC_MODEDISPLAY_ELEVATIONNUM 144004 +#define IDC_MODEDISPLAY_HEADINGNUM 144005 +#define IDC_MODEDISPLAY_SPEEDNUM 144006 +#define IDC_MODEDISPLAY_MODEPOSTIMECG 144010 +#define IDC_MODEDISPLAY_TIMEDISPLAYGREEN1 144011 +#define IDC_MODEDISPLAY_TIMEDISPLAYGREEN2 144012 +#define IDC_MODEDISPLAY_MODEPOSTARGETCG 144020 +#define IDC_MODEDISPLAY_TARGETICON 144021 +#define IDC_MODEDISPLAY_TRACKNUM 144022 +#define IDC_MODEDISPLAY_TARGETRANGENUM 144023 +#define IDC_MODEDISPLAY_TARGETELEVATIONNUM 144024 +#define IDC_MODEDISPLAY_TARGETNAME 144025 + +#define IDC_MODECOMPASS 144100 +#define IDC_MODECOMPASS_HEADING 144110 +#define IDC_MODECOMPASS_SPEED 144111 +#define IDC_MODECOMPASS_BEARING 144112 +#define IDC_MODECOMPASS_RANGE 144113 +#define IDC_MODECOMPASS_TARGET 144114 + +#define IDC_MODEMAP_MAPTRACKBUTTON 144211 +#define IDC_MODEMAP_MAPZOOMIN 144212 +#define IDC_MODEMAP_MAPZOOMOUT 144213 + +#define IDC_MODEMENU 144300 + +#define IDC_MODEMARK 144400 +#define IDC_MODEMARK_HEADER 144411 +#define IDC_MODEMARK_CORDSEDIT 144412 + +#define IDC_MODEWAYPOINTS 144500 +#define IDC_MODEWAYPOINTS_LISTOFWAYPOINTS 144501 + +#define IDC_MODESETTINGS 144600 + +#define IDC_BUTTONBG0 77710 +#define IDC_BUTTONBG1 77711 +#define IDC_BUTTONBG2 77712 +#define IDC_MICRODAGRSHELL 77713 diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml new file mode 100644 index 0000000000..99c4495732 --- /dev/null +++ b/addons/microdagr/stringtable.xml @@ -0,0 +1,103 @@ + + + + + + MicroDAGR GPS + + + MicroDAGR advanced GPS receiver + + + Angular Unit: + + + Mils + + + Show Waypoints On Map: + + + Degrees + + + On + Zapnuto + Oui + Ein + Sì + WÅ‚. + Ativar + Вкл. + Sí + + + Off + Vypnuto + Non + Aus + No + WyÅ‚. + Desativar + Выкл. + No + + + Open MicroDAGR + + + Close MicroDAGR + + + Enter Grid Cords: + + + Name of [%1] + + + MGRS-New + + + WGD + + + Range: + Reichweite: + + + Compass Direction + + + Mark + + + Waypoints + Wegpunkte + + + Connect To + + + Settings + Einstellungen + Configuración + + + SetWP + + + Add + + + Delete + Smazat + Supprimer + Löschen + Elimina + UsuÅ„ + Excluir + Удалить + Suprimir + + + \ No newline at end of file diff --git a/addons/vector/XEH_preInit.sqf b/addons/vector/XEH_preInit.sqf index a0a20d3315..21ca573118 100644 --- a/addons/vector/XEH_preInit.sqf +++ b/addons/vector/XEH_preInit.sqf @@ -6,6 +6,7 @@ PREP(clearDisplay); PREP(convertToTexturesDegree); PREP(convertToTexturesDistance); PREP(convertToTexturesFOS); +PREP(dataTransfer); PREP(showCenter); PREP(showP1); PREP(onKeyDown); diff --git a/addons/vector/functions/fnc_dataTransfer.sqf b/addons/vector/functions/fnc_dataTransfer.sqf new file mode 100644 index 0000000000..25403b82ee --- /dev/null +++ b/addons/vector/functions/fnc_dataTransfer.sqf @@ -0,0 +1,25 @@ +/* + * Author: PabstMirror + * Data transfer over a connected cable. Based on page 14 of pdf. + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_vector_fnc_dataTransfer + * + * Public: No + */ +#include "script_component.hpp" + +private ["_distance", "_direction", "_azimuth", "_inclination"]; + +_distance = call FUNC(getDistance); +_direction = call FUNC(getDirection); +_azimuth = _direction select 0; +_inclination = _direction select 1; +//Send Data to connected GPS +["RangerfinderData", [_distance, _azimuth, _inclination]] call EFUNC(common,localEvent); \ No newline at end of file diff --git a/addons/vector/functions/fnc_onKeyHold.sqf b/addons/vector/functions/fnc_onKeyHold.sqf index 57e76d57ea..aca31d95a5 100644 --- a/addons/vector/functions/fnc_onKeyHold.sqf +++ b/addons/vector/functions/fnc_onKeyHold.sqf @@ -74,6 +74,7 @@ switch (_this select 0) do { if (_isReady) then { call FUNC(showDistance); [false] call FUNC(showCenter); + [] call FUNC(dataTransfer); }; [_this select 1] call CBA_fnc_removePerFrameHandler; diff --git a/extras/assets/icons/icon_microDAGR.png b/extras/assets/icons/icon_microDAGR.png new file mode 100644 index 0000000000..47bb75a146 Binary files /dev/null and b/extras/assets/icons/icon_microDAGR.png differ