$k = $res['k']; $d = $res['d']; $e = $res['e']; $points = ($m + $k + $d) * $amount1; AdjustStats($aktplanet['owner_id'], $points, 0, 0, '-'); } $amount2 = min($aktplanet['d503'], intval($_POST['ab503'])); if ($amount2 > 0) { $aktplanet['d503'] -= $amount2; $res = ShipyardPrice(503); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points = ($m + $k + $d) * $amount2; AdjustStats($aktplanet['owner_id'], $points, 0, 0, '-'); } if ($amount1 + $amount2 > 0) { SetPlanetDefense($aktplanet['planet_id'], $aktplanet); RecalcRanks(); } } ?> </th> </tr> </table> Ваше хранилище может вмещать <?php echo $rak_space / 2; ?> межпланетных ракет или <?php echo $rak_space;
function ColonizationArrive($queue, $fleet_obj, $fleet, $origin, $target) { global $db_prefix; $text = "\nФлот достигает заданных координат\n" . "<a href=\"javascript:showGalaxy(" . $target['g'] . "," . $target['s'] . "," . $target['p'] . ")\">[" . $target['g'] . ":" . $target['s'] . ":" . $target['p'] . "]</a>\n"; if (!HasPlanet($target['g'], $target['s'], $target['p'])) { // если количество планет империи больше максимума, то не основывать новую колонию. $query = "SELECT * FROM " . $db_prefix . "planets WHERE owner_id = '" . $fleet_obj['owner_id'] . "' AND (type > 0 AND type < 10000);"; $result = dbquery($query); $num_planets = dbrows($result); if ($num_planets >= 9) { $text .= ", и устанавливает, что эта планета пригодна для колонизации. Вскоре после начала освоения планеты поступает сообщение о беспорядках на главной планете, так как империя становится слишком большой и люди возвращаются обратно.\n"; // Добавить покинутую колонию. $id = CreateAbandonedColony($target['g'], $target['s'], $target['p'], $queue['end']); } else { $text .= ", находит там новую планету и сразу же начинает её освоение.\n"; // Создать новую колонию. $id = CreatePlanet($target['g'], $target['s'], $target['p'], $fleet_obj['owner_id'], 1, 0, 0, $queue['end']); Debug("Игроком " . $origin['owner_id'] . " колонизирована планета {$id} [" . $target['g'] . ":" . $target['s'] . ":" . $target['p'] . "]"); // Отнять от флота 1 колонизатор if ($fleet[208] > 0) { $fleet[208]--; $met = $kris = $deut = $energy = 0; $cost = ShipyardPrice(208); AdjustStats($origin['owner_id'], $cost['m'] + $cost['k'] + $cost['d'], 1, 0, '-'); RecalcRanks(); } } // Вернуть флот, если что-то осталось. $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $num_ships = 0; foreach ($fleetmap as $i => $gid) { $num_ships += $fleet[$gid]; } if ($num_ships > 0) { if ($target['type'] == 10002) { DestroyPlanet($target['planet_id']); } $target = GetPlanet($id); DispatchFleet($fleet, $origin, $target, 107, $fleet_obj['flight_time'], $fleet_obj['m'], $fleet_obj['k'], $fleet_obj['d'], $fleet_obj['fuel'] / 2, $queue['end']); } else { if ($target['type'] == 10002) { DestroyPlanet($target['planet_id']); } } } else { $text .= ", но не находит там пригодной для колонизации планеты. В подавленном состоянии поселенцы возвращаются обратно.\n"; // Вернуть флот. DispatchFleet($fleet, $origin, $target, 107, $fleet_obj['flight_time'], $fleet_obj['m'], $fleet_obj['k'], $fleet_obj['d'], $fleet_obj['fuel'] / 2, $queue['end']); } SendMessage($fleet_obj['owner_id'], "Поселенцы", "Доклад поселенцев", $text, 5, $queue['end']); }
function Queue_Research_End($queue) { global $db_prefix, $GlobalUser; $id = $queue['obj_id']; $lvl = $queue['level']; $planet_id = $queue['sub_id']; $player_id = $queue['owner_id']; // Рассчитать производство планеты с момента последнего обновления. $planet = GetPlanet($planet_id); $planet = ProdResources($planet, $planet['lastpeek'], $queue['end']); // Обновить уровень исследования в базе данных. $query = "UPDATE " . $db_prefix . "users SET " . ('r' . $id) . " = {$lvl} WHERE player_id = {$player_id}"; dbquery($query); RemoveQueue($queue['task_id']); // Добавить очки. $res = ResearchPrice($id, $lvl); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points = $m + $k + $d; AdjustStats($queue['owner_id'], $points, 0, 1, '+'); RecalcRanks(); Debug("Исследование " . loca("NAME_{$id}") . " уровня {$lvl} для пользователя {$player_id} завершено."); if ($GlobalUser['player_id'] == $player_id) { InvalidateUserCache(); $GlobalUser = LoadUser($player_id); // обновить данные текущего пользователя } }
function Exp_FleetFound($queue, $fleet_obj, $fleet, $origin, $target) { global $UnitParam; $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $small = array(loca("EXP_FLEET_SMALL_1"), loca("EXP_FLEET_SMALL_2"), loca("EXP_FLEET_SMALL_3"), loca("EXP_FLEET_SMALL_4")); $medium = array(loca("EXP_FLEET_MED_1"), loca("EXP_FLEET_MED_2")); $large = array(loca("EXP_FLEET_LARGE_1"), loca("EXP_FLEET_LARGE_2")); $footer = array(loca("EXP_FLEET_LOGBOOK_1"), loca("EXP_FLEET_LOGBOOK_2"), loca("EXP_FLEET_LOGBOOK_3")); $points = $fpoints = 0; $found = array(); // Рассчитать количество найденного флота $chance = mt_rand(0, 99); if ($chance >= 99) { // крупный $roll = mt_rand(101, 200); $n = mt_rand(0, count($large) - 1); $msg = $large[$n]; } else { if ($chance >= 90) { // средний $roll = mt_rand(51, 100); $n = mt_rand(0, count($medium) - 1); $msg = $medium[$n]; } else { // маленький $roll = mt_rand(2, 50); $n = mt_rand(0, count($small) - 1); $msg = $small[$n]; } } // Рассчитать структуру найденного флота. $epoints = min(ExpPoints($fleet), ExpUpperLimit()); $structure = max(7000, floor($roll * $epoints / 2)); $no_structure = false; // Возможные типы найденных кораблей if ($fleet[210] > 0) { $found = array(210, 202); } // шпик if ($fleet[202] > 0) { $found = array(210, 202, 203); } // мт if ($fleet[204] > 0) { $found = array(210, 202, 204, 203); } // ли if ($fleet[203] > 0) { $found = array(210, 202, 204, 203, 205); } // бт if ($fleet[205] > 0) { $found = array(210, 202, 204, 203, 205, 206); } // ти if ($fleet[206] > 0) { $found = array(210, 202, 204, 203, 205, 206, 207); } // крейсер if ($fleet[207] > 0) { $found = array(210, 202, 204, 203, 205, 206, 207, 215); } // линкор if ($fleet[215] > 0) { $found = array(210, 202, 204, 203, 205, 206, 207, 215, 211); } // линейка if ($fleet[211] > 0) { $found = array(210, 202, 204, 203, 205, 206, 207, 215, 211, 213); } // бомбер if ($fleet[213] > 0) { $found = array(210, 202, 204, 203, 205, 206, 207, 215, 211, 213); } // уник // Составить список найденных типов кораблей, каждый тип корабля может быть найден с равной вероятностью. $found_ids = array(); if (count($found) > 0) { shuffle($found); $chance = floor(1 / count($found) * 100); foreach ($found as $i => $id) { $roll = mt_rand(0, 99); if ($roll < $chance) { $found_ids[] = $id; } } } // Соcтавить список найденного флота. $found_fleet = array(); foreach ($found_ids as $i => $id) { $max = floor($structure / $UnitParam[$id][0]); if ($max > 0) { $amount = mt_rand(1, $max); } else { $amount = 0; } if ($amount == 0) { $no_structure = true; break; } // не хватило структуры для остального флота $found_fleet[$id] = $amount; $structure -= $amount * $UnitParam[$id][0]; } // Вывести список найденного флота и посчитать его стоимость. if (count($found_fleet) > 0) { $msg .= loca("EXP_FLEET_FOUND"); foreach ($found_fleet as $id => $amount) { $res = ShipyardPrice($id); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points += ($m + $k + $d) * $amount; $fpoints += $amount; $msg .= "<br>" . loca("NAME_{$id}") . " " . nicenum($amount); $fleet[$id] += $amount; // Добавить корабли к экспедиционному флоту } } // Зачислить очки, если найден хотя бы один корабль if ($fpoints > 0) { AdjustStats($fleet_obj['owner_id'], $points, $fpoints, 0, '+'); RecalcRanks(); } if ($no_structure) { $n = mt_rand(0, count($footer) - 1); $msg .= "<br><br>" . $footer[$n]; } // Вернуть флот. // В качестве времени полёта используется время удержания. DispatchFleet($fleet, $origin, $target, 115, $fleet_obj['deploy_time'], $fleet_obj['m'], $fleet_obj['k'], $fleet_obj['d'], 0, $queue['end']); return $msg; }
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; }