ACE3/TO_MERGE/ace/arty_range_tables/generateTable.sqf

199 lines
6.1 KiB
Plaintext

#define MILPREC 17.7777777777778
#define DEG2MIL(deg) (((deg*MILPREC)) min 6400)
#define MIL2DEG(mil) mil/MILPREC
/*
input
_ownPos = _this select 0;
_targetPos = _this select 1;
_vehicle = _this select 2;
_weapon = _this select 3;
_magazine = _this select 4;
_charge = _this select 5;
*/
// "ace_arty_105mm_m1_m782_pd_chg1"
_m119Data = [
45, // min elevation
70, // max elevation
"m782", // fuze
[
[
"HE", // name
"m1", // classname
0, // burst height
[ // charges: name, class
["charge 1", "chg1"], ["charge 2", "chg2"], ["charge 3", "chg3"], ["charge 4", "chg4"], ["charge 5", "chg5"], ["charge 6", "chg6"], ["charge 7", "chg7"], ["charge 8", "chg8"]
]
],
[
"WP",
"m84a1",
0,
[
["charge 1", "chg1"], ["charge 2", "chg2"], ["charge 3", "chg3"], ["charge 4", "chg4"], ["charge 5", "chg5"], ["charge 6", "chg6"], ["charge 7", "chg7"], ["charge 8", "chg8"]
]
],
[
"Illum",
"m314a3",
500,
[
["charge 1", "chg1"], ["charge 2", "chg2"], ["charge 3", "chg3"], ["charge 4", "chg4"], ["charge 5", "chg5"], ["charge 6", "chg6"], ["charge 7", "chg7"], ["charge 8", "chg8"]
]
],
[
"DPICM",
"m916",
0,
[
["charge 1", "chg1"], ["charge 2", "chg2"], ["charge 3", "chg3"], ["charge 4", "chg4"], ["charge 5", "chg5"], ["charge 6", "chg6"], ["charge 7", "chg7"], ["charge 8", "chg8"]
]
]
]
];
_data = _m119Data;
// start making table
//_mags = [];
//_charges = [];
_tables = [];
_minElevation = _data select 0;
_maxElevation = _data select 1;
_fuze = _data select 2;
_rounds = _data select 3;
{ // foreach rounds
_roundArray = _x;
_roundName = _roundArray select 0;
_round = _roundArray select 1;
_roundBurstingHeight = _roundArray select 2;
_charges = _roundArray select 3;
diag_log (_roundName); // debug
_tables_round = [_roundName, _round, []]; // building tables array
{ // foreach charge
_chargeArray = _x;
_chargeName = _chargeArray select 0;
_charge = _chargeArray select 1;
diag_log (_chargeName); // debug
_mag = format ["ace_arty_105mm_%1_%2_time_%3", _round, _fuze, _charge];
if (isClass (configFile >> "cfgMagazines" >> _mag)) then { // valid mag class
// make btab
diag_log (_roundBurstingHeight); // debug
_btab = [_mag, _minElevation, _maxElevation +2, 1, -200, _roundBurstingHeight +100, 100] call DEMO_fnc_getBTable;
// make range table
_tables_table = [];
_range = 100;
_belowMinRange = true;
_belowMaxRange = true;
while {_belowMaxRange} do {
diag_log (str _range); // debug
_fs = [_range, _roundBurstingHeight, _btab] call DEMO_fnc_calcFiringSolution;
_fsAltitude = [_range, _roundBurstingHeight -100, _btab] call DEMO_fnc_calcFiringSolution;
if (count _fs > 0) then { // valid result
if (_fs select 0 <= _maxElevation) then { // within elevation limit
_belowMinRange = false;
//save range table
_elevation = _fs select 0;
_elevation = round(DEG2MIL(_elevation));
_flightTime = _fs select 2;
_flightTime = (round (_flightTime * 10)) / 10;
_elevationAltitude = (_fsAltitude select 0) - (_fs select 0);
_elevationAltitude = round(DEG2MIL(_elevationAltitude));
_tables_table = _tables_table + [[_range, _elevation, _elevationAltitude, _flightTime]];
};
} else { // invalid result
if (!_belowMinRange) then { // if past min range
_belowMaxRange = false; // end loop
};
};
_range = _range + 100;
}; // end ranges loop
_tables_charge = [_chargeName, _charge, _tables_table]; // building tables array
_tables_round set [2, (_tables_round select 2) + [_tables_charge]]; // building tables array
} else { // invalid class
diag_log ("ace_sys_arty generate tables; error: invalid magazine "+_mag); // error log
};
} foreach _charges;
_tables = _tables + [_tables_round];
} foreach _rounds;
// output, need to add newlines
_tablesString = "_tables = [" + toString[10];
_roundIndex = 1;
{ // foreach round
_roundArray = _x;
_tablesString = _tablesString + format ['["%1","%2",[', _roundArray select 0, _roundArray select 1] + toString[10];
_charges = _x select 2;
_chargeIndex = 1;
{ // foreach charge
_chargeArray = _x;
if (_chargeIndex < count _charges) then {
_tablesString = _tablesString + (str _chargeArray) + "," + toString[10];
} else {
_tablesString = _tablesString + (str _chargeArray) + toString[10];
};
_chargeIndex = _chargeIndex + 1;
} foreach _charges;
if (_roundIndex < count _tables) then {
_tablesString = _tablesString + "]]," + toString[10];
} else {
_tablesString = _tablesString + "]]" + toString[10];
};
_roundIndex = _roundIndex + 1;
} foreach _tables;
_tablesString = _tablesString + "];" + toString[10];
diag_log _tablesString;
copyToClipboard _tablesString;
hint "table generation done";
/*
hint "generate 1";
_mags = ["ace_arty_105mm_m1_m782_pd_chg1", "ace_arty_105mm_m1_m782_pd_chg2", "ace_arty_105mm_m1_m782_pd_chg3", "ace_arty_105mm_m1_m782_pd_chg4", "ace_arty_105mm_m1_m782_pd_chg5", "ace_arty_105mm_m1_m782_pd_chg6", "ace_arty_105mm_m1_m782_pd_chg7", "ace_arty_105mm_m1_m782_pd_chg8"];
{
_mag = _x;
//hint format ["%1", DEMO_fnc_calcBallistics];
_btab = [_mag, 45, 70, 1, -200, 100, 100] call DEMO_fnc_getBTable;
//copyToClipboard format ["%1", _btab];
diag_log "btab:";
diag_log (format ["%1", _btab]);
diag_log "ranges:";
_range = 0;
for "_range" from 25 to 20000 step 25 do {
hintSilent format ["%1", _range];
_fs = [_range, 0, _btab] call DEMO_fnc_calcFiringSolution;
_fsAltitude = [_range, -100, _btab] call DEMO_fnc_calcFiringSolution;
diag_log (format ["%1", _fs]);
diag_log (format ["%1", _fsAltitude]);
if (count _fs > 0) then {
_elevation = _fs select 0;
_flightTime = _fs select 2;
_elevationAltitude = (_fsAltitude select 0) - (_fs select 0);
diag_log (format ["[%1,%2,%3,%4]", _range, _elevation, _elevationAltitude, _flightTime]);
};
};
} foreach _mags;
//copyToClipboard format ["%1", _table];
*/