function Admin_Queue() { global $session; global $db_prefix; global $GlobalUser; // Обработка POST-запросов. $player_id = 0; if (method() === "POST") { if (key_exists("player", $_POST)) { // Фильтр по имени игрока $query = "SELECT * FROM " . $db_prefix . "users WHERE oname LIKE '" . $_POST['player'] . "%'"; $result = dbquery($query); if (dbrows($result) > 0) { $user = dbarray($result); $player_id = $user['player_id']; } } if (key_exists("order_end", $_POST) && $GlobalUser['admin'] >= 2) { // Завершить задание $id = intval($_POST['order_end']); $now = time(); $query = "UPDATE " . $db_prefix . "queue SET end={$now} WHERE task_id={$id}"; dbquery($query); } if (key_exists("order_remove", $_POST) && $GlobalUser['admin'] >= 2) { // Удалить задание RemoveQueue(intval($_POST['order_remove'])); } } if ($player_id > 0) { $query = "SELECT * FROM " . $db_prefix . "queue WHERE (type <> 'Fleet' AND type <> 'CommanderOff') AND owner_id={$player_id} ORDER BY end ASC, prio DESC"; } else { $query = "SELECT * FROM " . $db_prefix . "queue WHERE (type <> 'Fleet' AND type <> 'CommanderOff') ORDER BY end ASC, prio DESC LIMIT 50"; } $result = dbquery($query); $now = time(); AdminPanel(); echo "<table>\n"; echo "<tr><td class=c>Время окончания</td><td class=c>Игрок</td><td class=c>Тип задания</td><td class=c>Описание</td><td class=c>Приоритет</td><td class=c>ID</td><td class=c>Управление</td></tr>\n"; $anz = $rows = dbrows($result); $bxx = 1; while ($rows--) { $queue = dbarray($result); $user = LoadUser($queue['owner_id']); $pid = $user['player_id']; echo "<tr><th> <table><tr><th><div id='bxx" . $bxx . "' title='" . ($queue['end'] - $now) . "' star='" . $queue['start'] . "'></th>"; echo "<tr><th>" . date("d.m.Y H:i:s", $queue['end']) . "</th></tr></table></th><th><a href=\"index.php?page=admin&session={$session}&mode=Users&player_id={$pid}\">" . $user['oname'] . "</a></th><th>" . $queue['type'] . "</th><th>" . QueueDesc($queue) . "</th><th>" . $queue['prio'] . "</th><th>" . $queue['task_id'] . "</th>\n"; ?> <th> <form action="index.php?page=admin&session=<?php echo $session; ?> &mode=Queue" method="POST"> <input type="hidden" name="order_end" value="<?php echo $queue['task_id']; ?> " /> <input type="submit" value="Завершить" /> </form> <form action="index.php?page=admin&session=<?php echo $session; ?> &mode=Queue" method="POST" style="border: 1px solid red"> <input type="hidden" name="order_remove" value="<?php echo $queue['task_id']; ?> " /> <input type="submit" value="Удалить" /> </form> </th> </tr> <?php $bxx++; } echo "<script language=javascript>anz={$anz};t();</script>\n"; echo "</table>\n"; $playername = ""; if ($player_id > 0) { $user = LoadUser($player_id); $playername = $user['name']; } ?> <br/> <form action="index.php?page=admin&session=<?php echo $session; ?> &mode=Queue" method="POST"> Показать задания игрока : <input size=15 name="player" value="<?php echo $playername; ?> "> <input type="submit" value="Отправить"> </form> <?php }
function Queue_Fleet_End($queue) { global $GlobalUser; $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $fleet_obj = LoadFleet($queue['sub_id']); if ($fleet_obj['m'] < 0) { $fleet_obj['m'] = 0; } if ($fleet_obj['k'] < 0) { $fleet_obj['k'] = 0; } if ($fleet_obj['d'] < 0) { $fleet_obj['d'] = 0; } if ($fleet_obj == null) { return; } $fleet = array(); foreach ($fleetmap as $i => $gid) { $fleet[$gid] = $fleet_obj["ship{$gid}"]; } // Обновить выработку ресурсов на планетах $origin = GetPlanet($fleet_obj['start_planet']); $target = GetPlanet($fleet_obj['target_planet']); $target = ProdResources($target, $target['lastpeek'], $queue['end']); $origin = ProdResources($origin, $origin['lastpeek'], $queue['end']); switch ($fleet_obj['mission']) { case 1: AttackArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 101: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 2: AttackArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 102: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 3: TransportArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 103: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 4: DeployArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 104: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 5: HoldingArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 205: HoldingHold($queue, $fleet_obj, $fleet, $origin, $target); break; case 105: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 6: SpyArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 106: SpyReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 7: ColonizationArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 107: ColonizationReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 8: RecycleArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 108: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 9: DestroyArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 109: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 15: ExpeditionArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 215: ExpeditionHold($queue, $fleet_obj, $fleet, $origin, $target); break; case 115: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; case 20: RocketAttackArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 21: AttackArrive($queue, $fleet_obj, $fleet, $origin, $target); break; case 121: CommonReturn($queue, $fleet_obj, $fleet, $origin, $target); break; //default: Error ( "Неизвестное задание для флота: " . $fleet_obj['mission'] ); break; } if ($fleet_obj['union_id'] && $fleet_obj['mission'] < 100) { $union_id = $fleet_obj['union_id']; $result = EnumUnionFleets($union_id); $rows = dbrows($result); while ($rows--) { $fleet_obj = dbarray($result); $queue = GetFleetQueue($fleet_obj['fleet_id']); DeleteFleet($fleet_obj['fleet_id']); // удалить флот RemoveQueue($queue['task_id']); // удалить задание } RemoveUnion($union_id); // удалить союз } else { DeleteFleet($fleet_obj['fleet_id']); // удалить флот RemoveQueue($queue['task_id']); // удалить задание } $player_id = $fleet_obj['owner_id']; if ($GlobalUser['player_id'] == $player_id) { InvalidateUserCache(); $GlobalUser = LoadUser($player_id); // обновить данные текущего пользователя } }
function Queue_Coupon_End($queue) { global $db_prefix; $now = $queue['end']; $ip = $_SERVER['REMOTE_ADDR']; // Выбрать пользователей согласно критериям. $inactive_days = $queue['obj_id'] >> 16 & 0xffff; $ingame_days = $queue['obj_id'] & 0xffff; $query = "SELECT * FROM " . $db_prefix . "users WHERE regdate < " . ($now - $ingame_days * 24 * 60 * 60) . " AND lastclick >= " . ($now - $inactive_days * 24 * 60 * 60); $result = dbquery($query); while ($user = dbarray($result)) { $code = AddCoupon($queue['sub_id']); SendCoupon($user, $code); } // Продлить или завершить задание. $seconds = $queue['level'] * 24 * 60 * 60; if ($seconds > 0) { ProlongQueue($queue['task_id'], $seconds); } else { RemoveQueue($queue['task_id']); } }
function Queue_Debug_End($queue) { RemoveQueue($queue['task_id']); }
function WritebackBattleResults($a, $d, $res, $repaired, $cm, $ck, $cd, $sum_cargo) { $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); global $db_prefix; // Бой с раундами. $rounds = count($res['rounds']); if ($rounds > 0) { $last = $res['rounds'][$rounds - 1]; foreach ($last['attackers'] as $i => $attacker) { $fleet_obj = LoadFleet($attacker['id']); $queue = GetFleetQueue($fleet_obj['fleet_id']); $origin = GetPlanet($fleet_obj['start_planet']); $target = GetPlanet($fleet_obj['target_planet']); $ships = 0; foreach ($fleetmap as $ii => $gid) { $ships += $attacker[$gid]; } if ($sum_cargo == 0) { $cargo = 0; } else { $cargo = (FleetCargoSummary($attacker) - ($fleet_obj['m'] + $fleet_obj['k'] + $fleet_obj['d']) - $fleet_obj['fuel']) / $sum_cargo; } if ($ships > 0) { if ($fleet_obj['mission'] == 9 && $res['result'] === "awon") { $result = GravitonAttack($fleet_obj, $attacker, $queue['end']); } else { $result = 0; } if ($result < 2) { DispatchFleet($attacker, $origin, $target, $fleet_obj['mission'] + 100, $fleet_obj['flight_time'], $fleet_obj['m'] + $cm * $cargo, $fleet_obj['k'] + $ck * $cargo, $fleet_obj['d'] + $cd * $cargo, $fleet_obj['fuel'] / 2, $queue['end']); } } } foreach ($last['defenders'] as $i => $defender) { if ($i == 0) { AdjustResources($cm, $ck, $cd, $defender['id'], '-'); $objects = array(); foreach ($fleetmap as $ii => $gid) { $objects["f{$gid}"] = $defender[$gid] ? $defender[$gid] : 0; } foreach ($defmap as $ii => $gid) { $objects["d{$gid}"] = $repaired[$gid] ? $repaired[$gid] : 0; $objects["d{$gid}"] += $defender[$gid]; } SetPlanetFleetDefense($defender['id'], $objects); } else { $ships = 0; foreach ($fleetmap as $ii => $gid) { $ships += $defender[$gid]; } if ($ships > 0) { SetFleet($defender['id'], $defender); } else { $queue = GetFleetQueue($defender['id']); DeleteFleet($defender['id']); // удалить флот RemoveQueue($queue['task_id']); // удалить задание } } } } else { foreach ($a as $i => $attacker) { $fleet_obj = LoadFleet($attacker['id']); $queue = GetFleetQueue($fleet_obj['fleet_id']); $origin = GetPlanet($fleet_obj['start_planet']); $target = GetPlanet($fleet_obj['target_planet']); $ships = 0; foreach ($fleetmap as $ii => $gid) { $ships += $attacker['fleet'][$gid]; } if ($sum_cargo == 0) { $cargo = 0; } else { $cargo = (FleetCargoSummary($attacker['fleet']) - ($fleet_obj['m'] + $fleet_obj['k'] + $fleet_obj['d']) - $fleet_obj['fuel']) / $sum_cargo; } if ($ships > 0) { if ($fleet_obj['mission'] == 9 && $res['result'] === "awon") { $result = GravitonAttack($fleet_obj, $attacker['fleet'], $queue['end']); } else { $result = 0; } if ($result < 2) { DispatchFleet($attacker['fleet'], $origin, $target, $fleet_obj['mission'] + 100, $fleet_obj['flight_time'], $fleet_obj['m'] + $cm * $cargo, $fleet_obj['k'] + $ck * $cargo, $fleet_obj['d'] + $cd * $cargo, $fleet_obj['fuel'] / 2, $queue['end']); } } } foreach ($d as $i => $defender) { if ($i == 0) { AdjustResources($cm, $ck, $cd, $defender['id'], '-'); $objects = array(); foreach ($fleetmap as $ii => $gid) { $objects["f{$gid}"] = $defender[$gid] ? $defender[$gid] : 0; } foreach ($defmap as $ii => $gid) { $objects["d{$gid}"] = $repaired[$gid] ? $repaired[$gid] : 0; $objects["d{$gid}"] += $defender[$gid]; } SetPlanetFleetDefense($defender['id'], $objects); } else { $ships = 0; foreach ($fleetmap as $ii => $gid) { $ships += $defender[$gid]; } if ($ships > 0) { SetFleet($defender['id'], $defender); } else { $queue = GetFleetQueue($defender['id']); DeleteFleet($defender['id']); // удалить флот RemoveQueue($queue['task_id']); // удалить задание } } } } }
function ExecuteBlock($queue, $block, $childs) { global $db_prefix, $BotID, $BotNow; $BotNow = $queue['end']; $BotID = $queue['owner_id']; $strat_id = $queue['sub_id']; # Debug ( "Bot trace : " . $block['category'] . "(".$block['key']."): " . $block['text'] ); switch ($block['category']) { case "Start": $block_id = $childs[0]['to']; AddBotQueue($BotID, $strat_id, $block_id, $BotNow, 0); RemoveQueue($queue['task_id']); break; case "End": RemoveQueue($queue['task_id']); // Просто удалить блок, тем самым в очереди не остается ни одного задания AI исполняемой стратегии break; case "Label": // Начать выполнение новой цепочки // Выбрать из всех потомков тот, который выходит снизу блока (fromPort="B") $block_id = $childs[0]['to']; foreach ($childs as $i => $child) { if ($child['fromPort'] === "B") { $block_id = $child['to']; break; } } AddBotQueue($BotID, $strat_id, $block_id, $BotNow, 0); RemoveQueue($queue['task_id']); break; case "Branch": // Переход на другую метку с указанным текстом. $query = "SELECT * FROM " . $db_prefix . "botstrat WHERE id = {$strat_id} LIMIT 1"; $result = dbquery($query); if ($result) { $row = dbarray($result); $strat = json_decode($row['source'], true); $done = false; foreach ($strat['nodeDataArray'] as $i => $arr) { if ($arr['text'] === $block['text'] && $arr['category'] === "Label") { AddBotQueue($BotID, $strat_id, $arr['key'], $BotNow, 0); $done = true; break; } } if (!$done) { Debug("Не удалось найти метку перехода \"" . $block['text'] . "\""); } } else { Debug("Не удалось загрузить текущую стратегию при обработке перехода."); } RemoveQueue($queue['task_id']); break; case "Cond": // Проверка условия $result = eval("return ( " . $block['text'] . " );"); $block_id = $block_no = 0xdeadbeef; $prefix = ""; foreach ($childs as $i => $child) { if (strtolower($child['text']) === "no") { if ($result == false) { # Debug ($block['text'] . " : ".$prefix."NO"); $block_id = $child['to']; break; } else { $block_no = $child['to']; } } if (strtolower($child['text']) === "yes" && $result == true) { # Debug ($block['text'] . " : YES"); $block_id = $child['to']; break; } if (preg_match('/([0-9]{1,2}|100)%/', $child['text'], $matches) && $result == true) { // случайный переход $prc = str_replace("%", "", $matches[0]); $roll = mt_rand(1, 100); if ($roll <= $prc) { # Debug ($block['text'] . " : PROBABLY($roll/$prc) YES"); $block_id = $child['to']; break; } else { if ($block_no == 0xdeadbeef) { $prefix = "PROBABLY({$roll}/{$prc}) "; $result = false; } else { # Debug ($block['text'] . " : PROBABLY($roll/$prc) NO"); $block_id = $block_no; break; } } } // случайный переход } if ($block_id != 0xdeadbeef) { AddBotQueue($BotID, $strat_id, $block_id, $BotNow, 0); } else { Debug("Не удалось выбрать условный переход."); } RemoveQueue($queue['task_id']); break; default: // Обычный блок (квадрат), выход один. $sleep = eval($block['text'] . ";"); if ($sleep == NULL) { $sleep = 0; } $block_id = $childs[0]['to']; AddBotQueue($BotID, $strat_id, $block_id, $BotNow, $sleep); RemoveQueue($queue['task_id']); break; } }
function Admin_Coupons() { global $session; global $db_prefix; global $GlobalUser; global $AdminMessage, $AdminError; // Обработка POST-запроса. if (method() === "POST" && $GlobalUser['admin'] >= 2) { $action = $_GET['action']; if ($action === "add_one") { $code = AddCoupon(intval($_POST['dm'])); if ($code == NULL) { $AdminError = "<font color=red>Ошибка добавления купона!</font>"; } else { $AdminMessage = "<font color=lime>Купон добавлен : {$code}</font>"; } } if ($action === "add_date") { $ddmm = explode('.', $_POST['ddmm']); $hhmm = explode(':', $_POST['hhmm']); $now = time(); $end = mktime($hhmm[0], $hhmm[1], 0, $ddmm[1], $ddmm[0]); $inactive_days = intval($_POST['inactive_days']); $ingame_days = intval($_POST['ingame_days']); $darkmatter = intval($_POST['darkmatter']); $periodic = intval($_POST['periodic']); $queue = array(null, 99999, "Coupon", $darkmatter, $inactive_days << 16 | $ingame_days, $periodic, $now, $end, 520); AddDBRow($queue, "queue"); } } // Обработка GET-запроса. if (method() === "GET" && $GlobalUser['admin'] >= 2) { $action = $_GET['action']; if ($action === "remove_one") { DeleteCoupon($_GET['item_id']); } if ($action === "remove_date") { RemoveQueue($_GET['item_id']); } } ?> <?php echo AdminPanel(); ?> <?php // Вывести список купонов. $count = 15; // количество купонов на страницу $from = intval($_GET['from']); $total = TotalCoupons(); $result = EnumCoupons($from, $count); $rows = MDBRows($result); ?> <table border="0" cellpadding="2" cellspacing="1"> <tr height="20"> <td class="c">Код</td> <td class="c">Тёмная материя</td> <td class="c">Активирован</td> <td class="c">Вселенная</td> <td class="c">Имя игрока</td> <td class="c">Действие</td> </tr> <?php while ($rows--) { $entry = MDBArray($result); echo " <tr height=\"20\">\n"; echo " <th>" . $entry['code'] . "</th>\n"; echo " <th>" . nicenum($entry['amount']) . "</th>\n"; echo " <th>" . ($entry['used'] ? "<font color=red>Да</font>" : "<font color=lime>Нет</font>") . "</th>\n"; echo " <th>" . ($entry['used'] ? $entry['user_uni'] : '-') . "</th>\n"; echo " <th>" . $entry['user_name'] . "</th>\n"; echo " <th><a href=\"index.php?page=admin&session={$session}&mode=Coupons&action=remove_one&item_id=" . $entry['id'] . "\">Удалить</a></th>\n"; echo " </tr>\n"; } ?> <tr> <th colspan="6"> <?php $url = "index.php?page=admin&session={$session}&mode=Coupons&from"; if ($from >= $count) { echo " <a href=\"" . $url . "=" . ($from - $count) . "\"><< Предыдущие {$count}</a> \n"; } if ($from < $total && $from + $count < $total) { echo " <a href=\"" . $url . "=" . ($from + $count) . "\">Следующие {$count} >></a>\n"; } ?> </th> </tr> </table> <table> <tr><td class="c">Добавить один купон</td></tr> <tr><td> <form action="index.php?page=admin&session=<?php echo $session; ?> &mode=Coupons&action=add_one" method="POST"> Темная материя <input type="text" size="10" name="dm"> <input type="submit"> </form> </td></tr> </table> <?php // Вывести активные задания начисления купонов. $query = "SELECT * FROM " . $db_prefix . "queue WHERE type = 'Coupon' ORDER BY end ASC"; $result = dbquery($query); while ($queue = dbarray($result)) { print_r($queue); echo "<br>"; } ?> <form action="index.php?page=admin&session=<?php echo $session; ?> &mode=Coupons&action=add_date" method="POST"> <table> <tr><td class="c"colspan=2>Купоны по праздникам</td></tr> <tr><td>День в формате ДД.ММ <input type="text" size="10" name="ddmm"></td><td>Время в формате ЧЧ:ММ <input type="text" size="10" name="hhmm" value="10:00"></td></tr> <tr><td>Темной материи на купон</td><td><input type="text" size="10" name="darkmatter" value="100000"> </td></tr> <tr><td>Отправлять игрокам неактивным не менее</td><td><input type="text" size="10" name="inactive_days" value="7"> дней</td></tr> <tr><td>Игроки должны играть не менее</td><td><input type="text" size="10" name="ingame_days" value="365"> дней</td></tr> <tr><td>Периодичность дней (0-без периодичности)</td><td><input type="text" size="10" name="periodic" value="365"> </td></tr> <tr><td colspan=2><input type="submit"></td></tr> </table> </form> <?php }