Support per mag air friction

This commit is contained in:
PabstMirror 2019-03-15 20:11:15 -05:00
parent c6d7df3770
commit 1d2ecdd3ff
4 changed files with 65 additions and 71 deletions

View File

@ -8,43 +8,37 @@ class GVAR(rangeTableDialog) {
class TableBackground: RscPicture { class TableBackground: RscPicture {
idc = -1; idc = -1;
text = QPATHTOF(UI\RangeTable_background.paa); text = QPATHTOF(UI\RangeTable_background.paa);
x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
w = "16.2634559672906 * (safeZoneH / 40)"; w = "16.2634559672906 * (safeZoneH / 40)";
h = "23 * ((safeZoneH / 1.2) / 25)"; h = "23 * ((safeZoneH / 1.2) / 25)";
colorBackground[] = {1,1,1,1}; colorBackground[] = {1,1,1,1};
}; };
class ChargeBackground: RscText { class LeftSideBackground: RscText {
idc = -1; idc = -1;
x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
w = "4 * (safeZoneH / 40)"; w = "5 * (safeZoneH / 40)";
h = "8 * ((safeZoneH / 1.2) / 25)"; h = "23 * ((safeZoneH / 1.2) / 25)";
colorBackground[] = {0,0,0,0.9}; colorBackground[] = {0,0,0,0.8};
}; };
}; };
class controls { class controls {
class TheTable: RscListNBox { class TheTable: RscListNBox {
idc = IDC_TABLE; idc = IDC_TABLE;
// style = ST_CENTER + ST_MULTI + LB_TEXTURES; x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
// style = ST_LEFT + ST_MULTI + LB_TEXTURES; y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
// style = LB_MULTI + ST_LEFT; // Style
x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)";
y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)";
w = "16.2634559672906 * (safeZoneH / 40)"; w = "16.2634559672906 * (safeZoneH / 40)";
h = "20.24 * ((safeZoneH / 1.2) / 25)"; h = "20.24 * ((safeZoneH / 1.2) / 25)";
columns[] = {(10/867),(86/867),(171/867),(238/867),(320/867),(405/867), columns[] = {(10/867),(86/867),(171/867),(238/867),(320/867),(405/867),(485/867),(546/867),(607/867),(668/867),(729/867),(790/867)};
(485/867),(546/867),(607/867),(668/867),(729/867),(790/867)};
rowHeight = 0.015 * safeZoneH; rowHeight = 0.015 * safeZoneH;
sizeEx = "0.014 * safeZoneH"; sizeEx = "0.014 * safeZoneH";
font = "EtelkaMonospacePro"; font = "EtelkaMonospacePro";
drawSideArrows = 1; drawSideArrows = 1;
idcLeft = 14124; idcLeft = -1;
idcRight = 412343243; idcRight = -1;
colorText[] = {0, 0, 0, 1}; colorText[] = {0, 0, 0, 1};
shadow = "0"; shadow = "0";
// colorBorder[] = {1,0,0,1};
// colorBackground[] = {1, 0, 0, 1};
colorSelectBackground[] = {0, 0, 0, 0.025}; colorSelectBackground[] = {0, 0, 0, 0.025};
colorSelectBackground2[] = {0, 0, 0, 0.025}; colorSelectBackground2[] = {0, 0, 0, 0.025};
colorScrollbar[] = {0.95,0,0.95,1}; colorScrollbar[] = {0.95,0,0.95,1};
@ -55,31 +49,31 @@ class GVAR(rangeTableDialog) {
class ChargeListBox: RscListbox { class ChargeListBox: RscListbox {
idc = IDC_CHARGELIST; idc = IDC_CHARGELIST;
style = ST_RIGHT; style = ST_RIGHT;
x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
y = "2 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; y = "2 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
w = "4 * (safeZoneH / 40)"; w = "5 * (safeZoneH / 40)";
h = "7 * ((safeZoneH / 1.2) / 25)"; h = "22 * ((safeZoneH / 1.2) / 25)";
onLBSelChanged = QUOTE([] call FUNC(rangeTableUpdate)); onLBSelChanged = QUOTE([] call FUNC(rangeTableUpdate));
}; };
class elevationHigh: ctrlButton { class elevationHigh: ctrlButton {
idc = IDC_BUTTON_ELEV_HIGH; idc = IDC_BUTTON_ELEV_HIGH;
text = "High"; text = "High";
onButtonClick = QUOTE([true] call FUNC(rangeTableUpdate)); onButtonClick = QUOTE([true] call FUNC(rangeTableUpdate));
x = "14.1 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "13.1 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
y = "1.1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; y = "1.1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
w = "1.8 * (safeZoneH / 40)"; w = "2.3 * (safeZoneH / 40)";
h = "0.8 * ((safeZoneH / 1.2) / 25)"; h = "0.8 * ((safeZoneH / 1.2) / 25)";
}; };
class elevationLow: elevationHigh { class elevationLow: elevationHigh {
idc = IDC_BUTTON_ELEV_LOW; idc = IDC_BUTTON_ELEV_LOW;
text = "Low"; text = "Low";
onButtonClick = QUOTE([false] call FUNC(rangeTableUpdate)); onButtonClick = QUOTE([false] call FUNC(rangeTableUpdate));
x = "16.1 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "15.6 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
}; };
class CloseBackground: RscText { class CloseBackground: RscText {
idc = -1; idc = -1;
x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
w = "0.5 * (safeZoneH / 40)"; w = "0.5 * (safeZoneH / 40)";
h = "0.5 * ((safeZoneH / 1.2) / 25)"; h = "0.5 * ((safeZoneH / 1.2) / 25)";
colorBackground[] = {0,0,0,0.5}; colorBackground[] = {0,0,0,0.5};
@ -89,8 +83,8 @@ class GVAR(rangeTableDialog) {
style = 48; style = 48;
color[] = {1,1,1,0.7}; color[] = {1,1,1,0.7};
text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa";
x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
w = "0.5 * (safeZoneH / 40)"; w = "0.5 * (safeZoneH / 40)";
h = "0.5 * ((safeZoneH / 1.2) / 25)"; h = "0.5 * ((safeZoneH / 1.2) / 25)";
colorText[] = {1,1,1,0.7}; colorText[] = {1,1,1,0.7};

View File

@ -68,7 +68,6 @@ TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown);
private _turretRot = [vectorDir _vehicle, vectorUp _vehicle, (180 / PI) * _currentTraverseRad] call FUNC(rotateVector3d); private _turretRot = [vectorDir _vehicle, vectorUp _vehicle, (180 / PI) * _currentTraverseRad] call FUNC(rotateVector3d);
private _neutralX = (acos (_turretRot vectorCos _weaponDir)) - ((180 / PI) * _currentElevRad); private _neutralX = (acos (_turretRot vectorCos _weaponDir)) - ((180 / PI) * _currentElevRad);
_neutralX = (round (_neutralX * 10)) / 10; // minimize floating point errors _neutralX = (round (_neutralX * 10)) / 10; // minimize floating point errors
private _minElev = _neutralX + getNumber (_turretCfg >> "minElev"); private _minElev = _neutralX + getNumber (_turretCfg >> "minElev");
private _maxElev = _neutralX + getNumber (_turretCfg >> "maxElev"); private _maxElev = _neutralX + getNumber (_turretCfg >> "maxElev");
@ -79,7 +78,8 @@ TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown);
}; };
private _advCorrection = GVAR(advancedCorrections) && {_applyCorrections == 1}; private _advCorrection = GVAR(advancedCorrections) && {_applyCorrections == 1};
private _info = [_weapon, _minElev, _maxElev, _advCorrection]; // in case multiple vehicle types use the same weapon // check weapon and limits in case different vehicles use the same weapon (cammo variants should still produce the same array)
private _info = [_weapon, _minElev, _maxElev, _advCorrection];
_vehicleAdded pushBack _vehicle; _vehicleAdded pushBack _vehicle;
ace_player setVariable [QGVAR(vehiclesAdded), _vehicleAdded]; ace_player setVariable [QGVAR(vehiclesAdded), _vehicleAdded];
@ -90,9 +90,7 @@ TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown);
private _statement = { private _statement = {
params ["", "", "_info"]; params ["", "", "_info"];
TRACE_1("interaction statement",_info); TRACE_1("interaction statement",_info);
[{ [FUNC(rangeTableOpen), _info] call CBA_fnc_execNextFrame; // delay a frame because of interaction menu closing dialogs
_this call FUNC(rangeTableOpen); // delay a frame because of interaction menu closing dialogs
}, _info] call CBA_fnc_execNextFrame;
}; };
private _condition = { private _condition = {
//IGNORE_PRIVATE_WARNING ["_player"]; //IGNORE_PRIVATE_WARNING ["_player"];

View File

@ -4,7 +4,10 @@
* Opens the rangetable and fills the charge listbox. * Opens the rangetable and fills the charge listbox.
* *
* Arguments: * Arguments:
* None * 0: Weapon configname <STRING>
* 1: Elevation Min (Deg) <NUMBER>
* 2: Elevation Max (Deg) <NUMBER>
* 3: Advanced Corrections Enabled <BOOL>
* *
* Return Value: * Return Value:
* None * None
@ -18,6 +21,8 @@
params ["_weaponName", "_elevMin", "_elevMax", "_advCorrection"]; params ["_weaponName", "_elevMin", "_elevMax", "_advCorrection"];
TRACE_3("rangeTableOpen",_weaponName,_elevMin,_elevMax); TRACE_3("rangeTableOpen",_weaponName,_elevMin,_elevMax);
BEGIN_COUNTER(rangeTableOpen);
createDialog QGVAR(rangeTableDialog); createDialog QGVAR(rangeTableDialog);
private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull]; private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
if (isNull _dialog) exitWith{ERROR("Dialog failed to open");}; if (isNull _dialog) exitWith{ERROR("Dialog failed to open");};
@ -31,48 +36,52 @@ TRACE_2("created dialog",_dialog,_ctrlChargeList);
private _mags = [_weaponName] call CBA_fnc_compatibleMagazines; private _mags = [_weaponName] call CBA_fnc_compatibleMagazines;
if (_mags isEqualTo []) exitWith {WARNING_1("No Mags",_weaponName);}; if (_mags isEqualTo []) exitWith {WARNING_1("No Mags",_weaponName);};
private _magCfg = configFile >> "CfgMagazines"; private _magCfg = configFile >> "CfgMagazines";
private _firstSpeed = getNumber (_magCfg >> (_mags select 0) >> "initSpeed"); private _magParamsArray = [];
private _allSame = true;
_mags = _mags apply { _mags = _mags apply {
private _initSpeed = getNumber (_magCfg >> _x >> "initSpeed"); private _initSpeed = getNumber (_magCfg >> _x >> "initSpeed");
if (_initSpeed != _firstSpeed) then {_allSame = false}; _magParamsArray pushBackUnique _initSpeed;
[getText (_magCfg >> _x >> "displayNameShort"), _initSpeed] private _airFriction = 0;
if (_advCorrection) then {
_airFriction = if (isNumber (_magCfg >> _x >> QGVAR(airFriction))) then { getNumber (_magCfg >> _x >> QGVAR(airFriction)) } else { -0.00005 };
};
_magParamsArray pushBackUnique _airFriction;
[getText (_magCfg >> _x >> "displayNameShort"), getText (_magCfg >> _x >> "displayName"), _initSpeed, _airFriction]
};
TRACE_2("",_magParamsArray,_mags);
if ((count _magParamsArray) == 2) then { // test if all magazines share the parameters
_mags = [["", "", (_mags select 0) select 2, (_mags select 0) select 3]]; // simplify
}; };
if (_allSame) then { _mags = [["-", _firstSpeed]]; };
TRACE_2("",_allSame,_mags);
// Get Firemodes: // Get Firemodes:
private _fireModes = getArray (configFile >> "CfgWeapons" >> _weaponName >> "modes"); private _fireModes = getArray (configFile >> "CfgWeapons" >> _weaponName >> "modes");
_fireModes = (_fireModes apply {configFile >> "CfgWeapons" >> _weaponName >> _x}) select {1 == getNumber (_x >> "showToPlayer")}; _fireModes = (_fireModes apply {configFile >> "CfgWeapons" >> _weaponName >> _x}) select {1 == getNumber (_x >> "showToPlayer")};
_fireModes = _fireModes apply {[getNumber (_x >> "artilleryCharge"), configName _x]}; _fireModes = _fireModes apply {[getNumber (_x >> "artilleryCharge"), configName _x]};
_fireModes sort true; _fireModes sort true;
private _allSameCharge = ((count _fireModes) == 1); private _allSameCharge = ((count _fireModes) == 1) && {((_fireModes select 0) select 0) == 1};
TRACE_2("",_allSameCharge,_fireModes); TRACE_2("",_allSameCharge,_fireModes);
private _index = 0; GVAR(magModeData) = [];
{ {
_x params ["_xMagName", "_xMagInitSpeed"]; _x params ["_xDisplayNameShort", "_xDisplayName", "_xInitSpeed", "_xAirFriction"];
if (_allSameCharge) then { if (_allSameCharge) then {
_ctrlChargeList lbAdd format ["%1", _xMagName]; _ctrlChargeList lbAdd format ["%1", _xDisplayNameShort];
_ctrlChargeList lbSetTooltip [_index, format ["%1 m/s",_xMagInitSpeed toFixed 1]]; _ctrlChargeList lbSetTooltip [count GVAR(magModeData), format ["%1 m/s\n%2",_xInitSpeed toFixed 1, _xDisplayName]];
_ctrlChargeList lbSetData [_index, str (_xMagInitSpeed)]; GVAR(magModeData) pushBack [_xInitSpeed, _xAirFriction];
_index = _index + 1;
} else { } else {
{ {
_x params ["_xArtilleryCharge"]; _x params ["_xModeCharge"];
_ctrlChargeList lbAdd format ["%1 Charge: %2", _xMagName, _forEachIndex]; // forEachIndex is for firemodes _ctrlChargeList lbAdd format ["[Charge %1] %2", _forEachIndex, _xDisplayNameShort]; // forEachIndex is from firemodes
_ctrlChargeList lbSetTooltip [_index, format ["%1 m/s", (_xMagInitSpeed * _xArtilleryCharge) toFixed 1]]; _ctrlChargeList lbSetTooltip [count GVAR(magModeData), format ["%1 m/s\n%2", (_xInitSpeed * _xModeCharge) toFixed 1, _xDisplayName]];
_ctrlChargeList lbSetData [_index, str (_xMagInitSpeed * _xArtilleryCharge)]; GVAR(magModeData) pushBack [_xInitSpeed * _xModeCharge, _xAirFriction];
_index = _index + 1;
} forEach _fireModes; } forEach _fireModes;
}; };
} forEach _mags; } forEach _mags;
if (_index == 0) exitWith {ERROR_1("no modes %1",_weaponName);};
if (isNil QGVAR(lastElevationMode)) then {GVAR(lastElevationMode) = true;}; if (isNil QGVAR(lastElevationMode)) then {GVAR(lastElevationMode) = true;};
if (isNil QGVAR(lastCharge)) then {GVAR(lastCharge) = 0;}; if (isNil QGVAR(lastTablePage)) then {GVAR(lastTablePage) = 0;};
if ((GVAR(lastCharge) >= _index) || {GVAR(lastCharge) < 0}) then { GVAR(lastCharge) = 0; }; if ((GVAR(lastTablePage) >= (count GVAR(magModeData))) || {GVAR(lastTablePage) < 0}) then { GVAR(lastTablePage) = 0; };
TRACE_2("",GVAR(lastElevationMode),GVAR(lastCharge)); END_COUNTER(rangeTableOpen);
_ctrlChargeList lbSetCurSel GVAR(lastCharge); // triggers call to FUNC(rangeTableUpdate) TRACE_2("trigger update",GVAR(lastElevationMode),GVAR(lastTablePage));
_ctrlChargeList lbSetCurSel GVAR(lastTablePage); // triggers call to FUNC(rangeTableUpdate)

View File

@ -15,32 +15,25 @@
* Public: No * Public: No
*/ */
private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull]; private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE; private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
private _ctrlChargeList = _dialog displayCtrl IDC_CHARGELIST; private _ctrlChargeList = _dialog displayCtrl IDC_CHARGELIST;
private _ctrlElevationHigh = _dialog displayCtrl IDC_BUTTON_ELEV_HIGH; private _ctrlElevationHigh = _dialog displayCtrl IDC_BUTTON_ELEV_HIGH;
private _ctrlElevationLow = _dialog displayCtrl IDC_BUTTON_ELEV_LOW; private _ctrlElevationLow = _dialog displayCtrl IDC_BUTTON_ELEV_LOW;
GVAR(lastElevationMode) = param [0, GVAR(lastElevationMode)]; GVAR(lastElevationMode) = param [0, GVAR(lastElevationMode)]; // update if passed a new value
GVAR(lastCharge) = lbCurSel _ctrlChargeList; GVAR(lastCharge) = lbCurSel _ctrlChargeList;
private _listBoxData = _ctrlChargeList lbData GVAR(lastCharge); // get data for currently selected mag/mode combo:
if (isNil "_listBoxData" || {_listBoxData == ""}) exitWith {ERROR("lbCurSel out of bounds or no data");}; (GVAR(magModeData) select GVAR(lastCharge)) params [["_muzzleVelocity", -1], ["_airFriction", 0]];
private _muzzleVelocity = parseNumber _listBoxData;
private _elevMin = _dialog getVariable [QGVAR(elevMin), 0]; private _elevMin = _dialog getVariable [QGVAR(elevMin), 0];
private _elevMax = _dialog getVariable [QGVAR(elevMax), 0]; private _elevMax = _dialog getVariable [QGVAR(elevMax), 0];
_ctrlElevationHigh ctrlSetTextColor ([[0.25,0.25,0.25,1],[1,1,1,1]] select GVAR(lastElevationMode)); _ctrlElevationHigh ctrlSetTextColor ([[0.25,0.25,0.25,1],[1,1,1,1]] select GVAR(lastElevationMode));
_ctrlElevationLow ctrlSetTextColor ([[1,1,1,1],[0.25,0.25,0.25,1]] select GVAR(lastElevationMode)); _ctrlElevationLow ctrlSetTextColor ([[1,1,1,1],[0.25,0.25,0.25,1]] select GVAR(lastElevationMode));
private _advCorrection = _dialog getVariable [QGVAR(advCorrection), false];
private _airFriction = if (_advCorrection) then {-0.00005} else {0};
TRACE_4("",_muzzleVelocity,_elevMin,_elevMax,_airFriction);
lnbClear _ctrlRangeTable; lnbClear _ctrlRangeTable;
// Call extension with current data and start workers
TRACE_5("callExtension:start",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)); TRACE_5("callExtension:start",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode));
private _ret = "ace_artillerytables" callExtension ["start", [_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)]]; private _ret = "ace_artillerytables" callExtension ["start", [_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)]];
TRACE_1("",_ret); TRACE_1("",_ret);