Если есть желающие, тут эта формула заныкана. Мне облом этот корявый жаваскрипт читать:
function sim_ip_attack()
{
var i, j, abm, ipm;
var el;
var pri_target = 0;
var life_fac;
var worth_ipm = Array(12500, 2500, 10000);
var worth_abm = Array(8000, 0, 2000);
var loss_a = Array(12500, 2500, 10000);
var loss_d = Array(0, 0, 0);
var res_ship = Array(8);
if(document.getElementById('ipm_b').value != '')
ipm = parseInt(document.getElementById('ipm_b').value);
else
ipm = 0;
if(document.getElementById('abm_b').value != '')
abm = parseInt(document.getElementById('abm_b').value);
else
abm = 0;
save_data(0);
life_fac = techs[1][0][2] / 10 + 1;
var needed_dam = 0, needed_miss = 0;
// calculate needed damage
for(i = 0; i < 8; i++)
{
var e = document.getElementById('ipm_check_' + i);
if(e.checked)
pri_target = i;
// get needed dam
cost = get_def_cost(i);
needed_dam += (cost[0] + cost[1]) / 10 * ships[1][0][i + 14] * life_fac;
}
life_fac_a = 12000 * (techs[0][0][0] / 10 + 1);
needed_miss = Math.ceil(needed_dam / life_fac_a) + abm;
document.getElementById('needed_ipm').innerHTML = '[' + needed_miss + ']';
//alert("needed miss: " + needed_miss);
// losses attcker
for(i = 0; i < 3; i++)
loss_a[i] *= ipm;
// simulate
if(ipm <= abm)
{
for(i = 0; i < 3; i++)
loss_d[i] = worth_abm[i] * ipm;
abm -= ipm;
ipm = 0;
}
else
{
ipm -= abm;
for(i = 0; i < 3; i++)
loss_d[i] = worth_abm[i] * abm;
abm = 0;
var max_dam = ipm * life_fac_a;
i = 0;
for(i = 0; i < 8; i++)
{
var target;
if(i == 0)
target = pri_target;
else if(i <= pri_target)
target = i - 1;
else
target = i;
var p = target + 14;
cost = get_def_cost(target);
var Dam = max_dam - (cost[0] + cost[1]) / 10 * ships[1][0][p] * life_fac;
var dest = 0;
if(Dam > 0)
{
dest = ships[1][0][p];
ship_res[1][0][p] = 0;
}
else
{
// not enough damage for all items
dest = Math.floor(max_dam / ((cost[0] + cost[1]) / 10 * life_fac));
ship_res[1][0][p] = ships[1][0][p] - dest;
}
max_dam -= dest * Math.round((cost[0] + cost[1]) / 10 * life_fac);
for(j = 0; j < 3; j++)
loss_d[j] += cost[j] * dest;
//alert
// output result
el = document.getElementById('ship_d_' + p + '_e');
if(ships[1][0][p] != 0)
el.innerHTML = ship_res[1][0][p];
else
el.innerHTML = '';
}
}
// hide useless stuff
document.getElementById('result_table').getElementsByTagName("tr")[0].style.display = 'none';
document.getElementById('result_table').getElementsByTagName("tr")[1].style.display = 'none';
document.getElementById('result_table').getElementsByTagName("tr")[2].style.display = 'none';
document.getElementById('result_table').getElementsByTagName("tr")[3].style.display = 'none';
document.getElementById('result_table').getElementsByTagName("tr")[6].style.display = 'none';
document.getElementById('result_table').getElementsByTagName("tr")[7].style.display = 'none';
document.getElementById('result_table').getElementsByTagName("tr")[8].style.display = 'none';
document.getElementById('ipm_e').innerHTML = '0';
document.getElementById('abm_e').innerHTML = abm;
last_combat = false;
// losses attacker / defender...
txt = sprintf(res_txt, loss_a[0], loss_a[1], loss_a[2]);
document.getElementById('result_table').getElementsByTagName("td")[9].innerHTML = txt;
txt = sprintf(res_txt, loss_d[0], loss_d[1], loss_d[2]);
document.getElementById('result_table').getElementsByTagName("td")[11].innerHTML = txt;
// get system difference
var start_p, end_p, diff;
var display_time = false;
var str = document.getElementById('start_pos').value;
start_p = get_all_nums(str);
str = document.getElementById('enemy_pos').value;
end_p = get_all_nums(str);
if(start_p.length == 3 && end_p.length == 3)
{
el = document.getElementById('result_table').getElementsByTagName("tr")[9].lastChild;
if(start_p[0] - end_p[0] == 0)
{
var s, m, h;
diff = Math.abs(start_p[1] - end_p[1]);
display_time = true;
s = 30 + (60 * diff);
h = Math.floor(s / 3600);
s -= h * 3600;
m = Math.floor(s / 60);
s -= m * 60;
el.innerHTML = sprintf("%02d:%02d:%02d h", h, m, s);
}
else
el.innerHTML = "00:00:00 h";
}
else
document.getElementById('result_table').getElementsByTagName("tr")[9].style.display = 'none';
//alert(txt);
}
function get_def_cost(def_id)
{
switch(def_id)
{
case 0:
return Array(2000, 0, 0);
case 1:
return Array(1500, 500, 0);
case 2:
return Array(6000, 2000, 0);
case 3:
return Array(20000, 15000, 2000);
case 4:
return Array(2000, 6000, 0);
case 5:
return Array(50000, 50000, 30000);
case 6:
return Array(10000, 10000, 0);
case 7:
return Array(50000, 50000, 0);
}
}