function ExpeditionBattle($fleet_id, $pirates, $level, $when) { global $db_prefix; global $GlobalUni; $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $defmap = array(401, 402, 403, 404, 405, 406, 407, 408); $a_result = array(0 => "combatreport_ididattack_iwon", 1 => "combatreport_ididattack_ilost", 2 => "combatreport_ididattack_draw"); global $db_host, $db_user, $db_pass, $db_name, $db_prefix; $a = array(); $d = array(); $unitab = LoadUniverse(); $fid = $unitab['fid']; $did = $unitab['did']; $rf = $unitab['rapid']; // *** Союзные атаки не должны вступать битву. Игнорировать их. $f = LoadFleet($fleet_id); // *** Сгенерировать исходные данные // Список атакующих $anum = 0; $a[0] = LoadUser($f['owner_id']); $a[0]['fleet'] = array(); foreach ($fleetmap as $i => $gid) { $a[0]['fleet'][$gid] = abs($f["ship{$gid}"]); } $start_planet = GetPlanet($f['start_planet']); $a[0]['g'] = $start_planet['g']; $a[0]['s'] = $start_planet['s']; $a[0]['p'] = $start_planet['p']; $a[0]['id'] = $fleet_id; $a[0]['points'] = $a[0]['fpoints'] = 0; $anum++; // Список обороняющихся $dnum = 0; $d[0] = LoadUser(99999); if ($pirates) { $d[0]['oname'] = "Piraten"; $d[0]['r109'] = max(0, $a[0]['r109'] - 3); $d[0]['r110'] = max(0, $a[0]['r110'] - 3); $d[0]['r111'] = max(0, $a[0]['r111'] - 3); } else { $d[0]['oname'] = "Aliens"; $d[0]['r109'] = $a[0]['r109'] + 3; $d[0]['r110'] = $a[0]['r110'] + 3; $d[0]['r111'] = $a[0]['r111'] + 3; } $d[0]['fleet'] = array(); $d[0]['defense'] = array(); foreach ($fleetmap as $i => $gid) { // Определить состав флота пиратов / чужих if ($pirates) { // Пиратский флот, Округление состава флота вниз. // Нормальный - 30% +/- 3% от количества кораблей вашего флота + 5 ЛИ // Сильный - 50% +/- 5% от количества кораблей вашего флота + 3 Крейсера // Оч. Сильный - 80% +/- 8% от количества кораблей вашего флота + 2 Линка if ($a[0]['fleet'][$gid] > 0) { if ($level == 0) { $ratio = mt_rand(27, 33) / 100; } else { if ($level == 1) { $ratio = mt_rand(45, 55) / 100; } else { if ($level == 2) { $ratio = mt_rand(72, 88) / 100; } } } $d[0]['fleet'][$gid] = floor($a[0]['fleet'][$gid] * $ratio); } else { $d[0]['fleet'][$gid] = 0; } } else { // Флот Чужих, Округление состава флота вверх. // Нормальный - 40% +/- 4% от количества кораблей вашего флота + 5 ТИ // Сильный - 60% +/- 6% от количества кораблей вашего флота + 3 Линейки // Оч. Сильный - 90% +/- 9% от количества кораблей вашего флота + 2 Уника if ($a[0]['fleet'][$gid] > 0) { if ($level == 0) { $ratio = mt_rand(36, 44) / 100; } else { if ($level == 1) { $ratio = mt_rand(54, 66) / 100; } else { if ($level == 2) { $ratio = mt_rand(81, 99) / 100; } } } $d[0]['fleet'][$gid] = ceil($a[0]['fleet'][$gid] * $ratio); } else { $d[0]['fleet'][$gid] = 0; } } } if ($pirates) { if ($level == 0) { $d[0]['fleet'][204] += 5; } else { if ($level == 1) { $d[0]['fleet'][206] += 3; } else { if ($level == 2) { $d[0]['fleet'][207] += 2; } } } } else { if ($level == 0) { $d[0]['fleet'][205] += 5; } else { if ($level == 1) { $d[0]['fleet'][215] += 3; } else { if ($level == 2) { $d[0]['fleet'][213] += 2; } } } } foreach ($defmap as $i => $gid) { $d[0]['defense'][$gid] = 0; } $target_planet = GetPlanet($f['target_planet']); $d[0]['g'] = $target_planet['g']; $d[0]['s'] = $target_planet['s']; $d[0]['p'] = $target_planet['p']; $d[0]['id'] = $target_planet['planet_id']; $d[0]['points'] = $d[0]['fpoints'] = 0; $dnum++; $source .= "Rapidfire = {$rf}\n"; $source .= "FID = {$fid}\n"; $source .= "DID = {$did}\n"; $source .= "Attackers = " . $anum . "\n"; $source .= "Defenders = " . $dnum . "\n"; foreach ($a as $num => $attacker) { $source .= "Attacker" . $num . " = (<" . $attacker['oname'] . "> "; $source .= $attacker['id'] . " "; $source .= $attacker['g'] . " " . $attacker['s'] . " " . $attacker['p'] . " "; $source .= $attacker['r109'] . " " . $attacker['r110'] . " " . $attacker['r111'] . " "; foreach ($fleetmap as $i => $gid) { $source .= $attacker['fleet'][$gid] . " "; } $source .= ")\n"; } foreach ($d as $num => $defender) { $source .= "Defender" . $num . " = (<" . $defender['oname'] . "> "; $source .= $defender['id'] . " "; $source .= $defender['g'] . " " . $defender['s'] . " " . $defender['p'] . " "; $source .= $defender['r109'] . " " . $defender['r110'] . " " . $defender['r111'] . " "; foreach ($fleetmap as $i => $gid) { $source .= $defender['fleet'][$gid] . " "; } foreach ($defmap as $i => $gid) { $source .= $defender['defense'][$gid] . " "; } $source .= ")\n"; } $battle = array(null, $source, "", "", $when); $battle_id = AddDBRow($battle, "battledata"); $bf = fopen("battledata/battle_" . $battle_id . ".txt", "w"); fwrite($bf, $source); fclose($bf); // *** Передать данные боевому движку $arg = "\"battle_id={$battle_id}\""; system($unitab['battle_engine'] . " {$arg}"); // *** Обработать выходные данные $battleres = file_get_contents("battleresult/battle_" . $battle_id . ".txt"); $res = unserialize($battleres); // Определить исход битвы. if ($res['result'] === "awon") { $battle_result = 0; } else { if ($res['result'] === "dwon") { $battle_result = 1; } else { $battle_result = 2; } } // Рассчитать общие потери (учитывать дейтерий и восстановленную оборону) $aloss = $dloss = 0; $loss = CalcLosses($a, $d, $res, array()); $a = $loss['a']; $d = $loss['d']; $aloss = $loss['aloss']; $dloss = $loss['dloss']; // Сгенерировать боевой доклад. loca_add("battlereport", $GlobalUni['lang']); loca_add("technames", $GlobalUni['lang']); $text = ShortBattleReport($res, $when); // Разослать сообщения $mailbox = array(); // Если флот уничтожен за 1 или 2 раунда - не показывать лог боя для атакующих. if (count($res['rounds']) <= 2 && $battle_result == 1) { $text = "Контакт с флотом потерян. <br> Это означает, что его уничтожили первым же залпом <!--A:{$aloss},W:{$dloss}-->"; } foreach ($a as $i => $user) { if ($mailbox[$user['player_id']] == true) { continue; } $bericht = SendMessage($user['player_id'], "Командование флотом", "Боевой доклад", $text, 6, $when); MarkMessage($user['player_id'], $bericht); $subj = "<a href=\"#\" onclick=\"fenster(\\'index.php?page=bericht&session={PUBLIC_SESSION}&bericht={$bericht}\\', \\'Bericht_Kampf\\');\" ><span class=\"" . $a_result[$battle_result] . "\">Боевой доклад [" . $target_planet['g'] . ":" . $target_planet['s'] . ":" . $target_planet['p'] . "] (V:" . nicenum($dloss) . ",A:" . nicenum($aloss) . ")</span></a>"; SendMessage($user['player_id'], "Командование флотом", $subj, "", 2, $when); $mailbox[$user['player_id']] = true; } // Обновить лог боевого доклада $subj = "<a href=\"#\" onclick=\"fenster(\\'index.php?page=admin&session={PUBLIC_SESSION}&mode=BattleReport&bericht={$battle_id}\\', \\'Bericht_Kampf\\');\" ><span class=\"" . $a_result[$battle_result] . "\">Боевой доклад [" . $target_planet['g'] . ":" . $target_planet['s'] . ":" . $target_planet['p'] . "] (V:" . nicenum($dloss) . ",A:" . nicenum($aloss) . ")</span></a>"; $query = "UPDATE " . $db_prefix . "battledata SET title = '" . $subj . "', report = '" . $text . "' WHERE battle_id = {$battle_id};"; dbquery($query); // Почистить старые боевые доклады $ago = $when - 2 * 7 * 24 * 60 * 60; $query = "DELETE FROM " . $db_prefix . "battledata WHERE date < {$ago};"; dbquery($query); // Модифицировать флот WritebackBattleResultsExpedition($a, $d, $res); // Изменить статистику игроков foreach ($a as $i => $user) { AdjustStats($user['player_id'], $user['points'], $user['fpoints'], 0, '-'); } RecalcRanks(); // Чистим промежуточные данные боевого движка unlink("battledata/battle_" . $battle_id . ".txt"); unlink("battleresult/battle_" . $battle_id . ".txt"); return $battle_result; }
while ($num--) { $msg = dbarray($result); $pm = $msg['pm']; if ($pm == 6) { continue; } // Пропускать тексты боевых докладов. $msg['msgfrom'] = str_replace("{PUBLIC_SESSION}", $_GET['session'], $msg['msgfrom']); $msg['subj'] = str_replace("{PUBLIC_SESSION}", $_GET['session'], $msg['subj']); $msg['text'] = str_replace("{PUBLIC_SESSION}", $_GET['session'], $msg['text']); echo "<tr><th><input type=\"checkbox\" name=\"delmes" . $msg['msg_id'] . "\"/></th><th>" . date("m-d H:i:s", $msg['date']) . "</th><th>" . $msg['msgfrom'] . " </th><th>" . $msg['subj'] . " </th></tr>\n"; echo "<tr><td class=\"b\"> </td><td class=\"b\" colspan=\"3\">" . $msg['text'] . "</td></tr>\n"; if ($pm == 0) { echo "<tr><th colspan=\"4\"><input type=\"checkbox\" name=\"sneak" . $msg['msg_id'] . "\"/><input type=\"submit\" value=\"Сообщить оператору\"/></th></tr>\n"; } MarkMessage($msg['owner_id'], $msg['msg_id']); } // Низ таблицы echo "<tr><th colspan=\"4\" style='padding:0px 105px;'></th></tr>\n"; echo "<tr><th colspan=\"4\"><input type=\"checkbox\" name=\"fullreports\" /> Разведданные показывать частично </th></tr>\n"; echo "<tr><th colspan=\"4\">\n"; echo "<select name=\"deletemessages\">\n"; echo "<option value=\"deletemarked\">Удалить выделенные сообщения</option> \n"; echo "<option value=\"deletenonmarked\">Удалить все невыделенные сообщения</option>\n"; echo "<option value=\"deleteallshown\">Удалить все показанные сообщения </option>\n"; echo "<option value=\"deleteall\">Удалить все сообщения</option> \n"; echo "</select><input type=\"submit\" value=\"ok\" /></th></tr>\n"; echo "<tr><td colspan=\"4\"><center> </center></td></tr>\n"; echo "<input type=\"hidden\" name=\"messages\" value=\"1\" />\n"; echo "</form>\n"; echo "<tr><td class=\"c\" colspan=\"4\">Операторы</td></tr>\n";
function Admin_BattleSim() { global $session; global $db_prefix; global $GlobalUser; $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $defmap = array(401, 402, 403, 404, 405, 406, 407, 408); $unitab = LoadUniverse(); $rf = $unitab['rapid']; $fid = $unitab['fid']; $did = $unitab['did']; $debug = false; $maxslot = $unitab['acs'] * $unitab['acs']; $BattleReport = ""; $aloss = $dloss = 0; // -------------------------------------------------------------------------------------------------------------------------- // Обработка POST-запроса. if (method() === "POST" && $GlobalUser['admin'] >= 2) { //print_r ( $_POST ); //echo "<hr>"; // Сформировать список атакующих и обороняющихся $a = array(); $d = array(); $anum = intval($_POST['anum']); $dnum = intval($_POST['dnum']); // Атакующие for ($i = 0; $i < $anum; $i++) { if ($_POST["a" . $i . "_weap"] === "") { $_POST["a" . $i . "_weap"] = 0; } if ($_POST["a" . $i . "_shld"] === "") { $_POST["a" . $i . "_shld"] = 0; } if ($_POST["a" . $i . "_armor"] === "") { $_POST["a" . $i . "_armor"] = 0; } $a[$i]['r109'] = intval($_POST["a" . $i . "_weap"]); $a[$i]['r110'] = intval($_POST["a" . $i . "_shld"]); $a[$i]['r111'] = intval($_POST["a" . $i . "_armor"]); $a[$i]['oname'] = "Attacker{$i}"; $a[$i]['g'] = mt_rand(1, 9); $a[$i]['s'] = mt_rand(1, 499); $a[$i]['p'] = mt_rand(1, 15); $a[$i]['fleet'] = array(); foreach ($fleetmap as $n => $gid) { if ($_POST["a" . $i . "_{$gid}"] === "") { $_POST["a" . $i . "_{$gid}"] = 0; } $a[$i]['fleet'][$gid] = intval($_POST["a" . $i . "_{$gid}"]); } } // Обороняющиеся for ($i = 0; $i < $dnum; $i++) { if ($_POST["d" . $i . "_weap"] === "") { $_POST["d" . $i . "_weap"] = 0; } if ($_POST["d" . $i . "_shld"] === "") { $_POST["d" . $i . "_shld"] = 0; } if ($_POST["d" . $i . "_armor"] === "") { $_POST["d" . $i . "_armor"] = 0; } $d[$i]['r109'] = intval($_POST["d" . $i . "_weap"]); $d[$i]['r110'] = intval($_POST["d" . $i . "_shld"]); $d[$i]['r111'] = intval($_POST["d" . $i . "_armor"]); $d[$i]['oname'] = "Defender{$i}"; $d[$i]['g'] = mt_rand(1, 9); $d[$i]['s'] = mt_rand(1, 499); $d[$i]['p'] = mt_rand(1, 15); $d[$i]['fleet'] = array(); foreach ($fleetmap as $n => $gid) { if ($_POST["d" . $i . "_{$gid}"] === "") { $_POST["d" . $i . "_{$gid}"] = 0; } $d[$i]['fleet'][$gid] = intval($_POST["d" . $i . "_{$gid}"]); } $d[$i]['defense'] = array(); foreach ($defmap as $n => $gid) { if ($_POST["d" . $i . "_{$gid}"] === "") { $_POST["d" . $i . "_{$gid}"] = 0; } $d[$i]['defense'][$gid] = intval($_POST["d" . $i . "_{$gid}"]); } } // Симулировать битву $battle_result = 0; if ($_POST['debug'] === "on") { $debug = true; } else { $debug = false; } if ($_POST['rapid'] === "on") { $rf = true; } else { $rf = 0; } if ($_POST['fid'] === "") { $fid = 0; } else { $fid = intval($_POST['fid']); } if ($_POST['did'] === "") { $did = 0; } else { $did = intval($_POST['did']); } $BattleReport = SimBattle($a, $d, $rf, $fid, $did, $debug, &$battle_result, &$aloss, &$dloss); } // -------------------------------------------------------------------------------------------------------------------------- // Таблица ввода параметров симуляции. function getval($name) { if ($_POST[$name] != "") { return "value=\"" . $_POST[$name] . "\" "; } } function getval2($arr, $id) { if ($_POST[$arr][$id] != 0) { return "value=\"" . $_POST[$arr][$id] . "\" "; } else { return ""; } } ?> <script language="JavaScript"> var maxslot = <?php echo $maxslot; ?> ; function toint (num) { if ( typeof (num) == "undefined" ) num = 0; return parseInt (num); } // Пересчитать количество атакующих и обороняющихся. function RecalcAttackersDefendersNum () { var anum = dnum = 1; var fleet = [ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215 ]; var defense = [ 401, 402, 403, 404, 405, 406, 407, 408 ]; for ( n=0; n<maxslot; n++ ) // Атакующие { sum = 0; for (var i in fleet) { value = toint (document.getElementById ( "a"+n+"_" + fleet[i] ).value); if ( value ) sum += value; } if ( sum > 0 ) anum = n + 1; } for ( n=0; n<maxslot; n++ ) // Обороняющиеся { sum = 0; for (var i in fleet) { value = toint (document.getElementById ( "d"+n+"_" + fleet[i] ).value); if ( value ) sum += value; } for (var i in defense) { value = toint (document.getElementById ( "d"+n+"_" + defense[i] ).value); if ( value ) sum += value; } if ( sum > 0 ) dnum = n + 1; } document.getElementById ( "anum" ).value = anum; document.getElementById ( "dnum" ).value = dnum; //alert ( "Атакующих : " + anum + ", Обороняющихся : " + dnum ); } // При смене слота - занести данные из массива слотов в ячейки ввода function OnChangeSlot (attacker) { var fleet = [ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215 ]; var defense = [ 401, 402, 403, 404, 405, 406, 407, 408 ]; if (attacker) { slot = document.simForm.aslot.value - 1; for (var i in fleet) { value = toint (document.getElementById ( "a"+slot+"_" + fleet[i] ).value); if (value) document.getElementById ( "a_" + fleet[i] ).value = value; else document.getElementById ( "a_" + fleet[i] ).value = ""; } } else { slot = document.simForm.dslot.value - 1; for (var i in fleet) { value = toint (document.getElementById ( "d"+slot+"_" + fleet[i] ).value); if ( value ) document.getElementById ( "d_" + fleet[i] ).value = value; else document.getElementById ( "d_" + fleet[i] ).value = ""; } for (var i in defense) { value = toint (document.getElementById ( "d"+slot+"_" + defense[i] ).value); if (value) document.getElementById ( "d_" + defense[i] ).value = value; else document.getElementById ( "d_" + defense[i] ).value = ""; } } } // При изменении ячейки - внести данные из неё в массив слотов function OnChangeValue (attacker, id) { if (attacker) { slot = document.simForm.aslot.value - 1; document.getElementById ( "a"+slot+"_" + id ).value = document.getElementById ( "a_" + id ).value; } else { slot = document.simForm.dslot.value - 1; document.getElementById ( "d"+slot+"_" + id ).value = document.getElementById ( "d_" + id ).value; } RecalcAttackersDefendersNum (); } RecalcAttackersDefendersNum (); </script> <?php echo AdminPanel(); ?> <table cellpadding=0 cellspacing=0> <form name="simForm" action="index.php?page=admin&session=<?php echo $session; ?> &mode=BattleSim" method="POST" > <?php for ($n = 0; $n < $maxslot; $n++) { foreach ($fleetmap as $i => $gid) { echo "<input type=\"hidden\" id=\"a" . $n . "_{$gid}\" name=\"a" . $n . "_{$gid}\" value=\"0\"> \n"; } foreach ($fleetmap as $i => $gid) { echo "<input type=\"hidden\" id=\"d" . $n . "_{$gid}\" name=\"d" . $n . "_{$gid}\" value=\"0\"> \n"; } foreach ($defmap as $i => $gid) { echo "<input type=\"hidden\" id=\"d" . $n . "_{$gid}\" name=\"d" . $n . "_{$gid}\" value=\"0\"> \n"; } echo "<input type=\"hidden\" id=\"a" . $n . "_weap\" name=\"a" . $n . "_weap\" size=2 > <input type=\"hidden\" id=\"a" . $n . "_shld\" name=\"a" . $n . "_shld\" size=2 > <input type=\"hidden\" id=\"a" . $n . "_armor\" name=\"a" . $n . "_armor\" size=2 > \n"; echo "<input type=\"hidden\" id=\"d" . $n . "_weap\" name=\"d" . $n . "_weap\" size=2 > <input type=\"hidden\" id=\"d" . $n . "_shld\" name=\"d" . $n . "_shld\" size=2 > <input type=\"hidden\" id=\"d" . $n . "_armor\" name=\"d" . $n . "_armor\" size=2 > \n"; } ?> <input type="hidden" id="anum" name="anum" value="1" /> <input type="hidden" id="anum" name="dnum" value="1" /> <tr> <td class=c>Атакующий</td> <td class=c>Оборояющийся</td> </tr> <tr> <td> Вооружение: <input id="a_weap" size=2 > Щиты: <input id="a_shld" size=2 > Броня: <input id="a_armor" size=2 ></td> <td> Вооружение: <input id="d_weap" size=2 > Щиты: <input id="d_shld" size=2 > Броня: <input id="d_armor" size=2 ></td> </tr> <tr> <th valign=top> <table> <?php echo "<tr><td class=c><b>Флот</b></td> "; if ($maxslot > 0) { echo "<td>Слот: <select name=\"aslot\" onchange=\"OnChangeSlot(1);\">\n"; for ($n = 1; $n <= $maxslot; $n++) { echo "<option value=\"{$n}\">{$n}</option>\n"; } echo "</select> </td> "; } echo " </tr>\n"; foreach ($fleetmap as $i => $gid) { ?> <tr><td> <?php echo loca("NAME_{$gid}"); ?> </td> <td> <input id="a_<?php echo $gid; ?> " size=5 onKeyUp="OnChangeValue(1, <?php echo $gid; ?> );"> </td> </tr> <?php } ?> <tr><td colspan=2> <table> <tr><td class=c colspan=2>Настройки</td></tr> <tr><td>Отладочная информация</td><td><input type="checkbox" name="debug" <? if($debug) echo "checked"; ?> ></td></tr> <tr><td>Скорострел</td><td><input type="checkbox" name="rapid" <? if($rf) echo "checked"; ?> ></td></tr> <tr><td>Флот в обломки</td><td><input name="fid" size=3 value="<?php echo $fid; ?> "> </td></tr> <tr><td>Оборона в обломки</td><td><input name="did" size=3 value="<?php echo $did; ?> "></td></tr> </table> </td></tr> </table> </th> <th valign=top> <table> <?php echo "<tr><td class=c><b>Флот</b></td>"; if ($maxslot > 0) { echo "<td>Слот: <select name=\"dslot\" onchange=\"OnChangeSlot(0);\">\n"; for ($n = 1; $n <= $maxslot; $n++) { echo "<option value=\"{$n}\">{$n}</option>\n"; } echo "</select> </td> "; } echo "</tr>\n"; foreach ($fleetmap as $i => $gid) { ?> <tr><td> <?php echo loca("NAME_{$gid}"); ?> </td> <td> <input id="d_<?php echo $gid; ?> " size=5 onKeyUp="OnChangeValue(0, <?php echo $gid; ?> );"> </td> </tr> <?php } echo "<tr><td class=c><b>Оборона</b></td></tr>\n"; foreach ($defmap as $i => $gid) { ?> <tr><td> <?php echo loca("NAME_{$gid}"); ?> </td> <td> <input id="d_<?php echo $gid; ?> " size=5 onKeyUp="OnChangeValue(0, <?php echo $gid; ?> );"> </td> </tr> <?php } ?> </table> </th></tr> <tr><td colspan=2><center><input type="submit" value="Начать бой"></center></td></tr> </form> </table> <?php if ($BattleReport !== "") { $a_result = array(0 => "combatreport_ididattack_iwon", 1 => "combatreport_ididattack_ilost", 2 => "combatreport_ididattack_draw"); $bericht = SendMessage($GlobalUser['player_id'], "Командование флотом", "Боевой доклад", $BattleReport, 6); MarkMessage($GlobalUser['player_id'], $bericht); $subj = "<a href=\"#\" onclick=\"fenster('index.php?page=bericht&session={$session}&bericht={$bericht}', 'Bericht_Kampf');\" ><span class=\"" . $a_result[$battle_result] . "\">Боевой доклад [" . $d[0]['g'] . ":" . $d[0]['s'] . ":" . $d[0]['p'] . "] (V:" . nicenum($dloss) . ",A:" . nicenum($aloss) . ")</span></a>"; echo "{$subj}<br>"; } ?> <?php }