function RecalcStats($player_id) { global $db_prefix; $m = $k = $d = $e = 0; $points = $fpoints = $rpoints = 0; // Планеты/луны + стоящие флоты $query = "SELECT * FROM " . $db_prefix . "planets WHERE owner_id = '" . $player_id . "'"; $result = dbquery($query); $rows = dbrows($result); while ($rows--) { $planet = dbarray($result); if ($planet['type'] >= 10000) { continue; } // считать только планеты и луны. $pp = PlanetPrice($planet); $points += $pp['points']; $fpoints += $pp['fpoints']; } // Исследования $resmap = array(106, 108, 109, 110, 111, 113, 114, 115, 117, 118, 120, 121, 122, 123, 124, 199); $user = LoadUser($player_id); if ($user != null) { foreach ($resmap as $i => $gid) { $level = $user["r{$gid}"]; $rpoints += $level; if ($level > 0) { for ($lv = 1; $lv <= $level; $lv++) { $res = ResearchPrice($gid, $lv); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points += $m + $k + $d; } } } } // Летящие флоты $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $result = EnumOwnFleetQueue($player_id, 1); $rows = dbrows($result); while ($rows--) { $queue = dbarray($result); $fleet = LoadFleet($queue['sub_id']); foreach ($fleetmap as $i => $gid) { // Флот $level = $fleet["ship{$gid}"]; if ($level > 0) { $res = ShipyardPrice($gid); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points += ($m + $k + $d) * $level; $fpoints += $level; } } if ($fleet['ipm_amount'] > 0) { // МПР $res = ShipyardPrice(503); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points += ($m + $k + $d) * $fleet['ipm_amount']; } } $query = "UPDATE " . $db_prefix . "users SET "; $query .= "score1={$points}, score2={$fpoints}, score3={$rpoints} WHERE player_id = {$player_id} AND (banned <> 1 OR admin > 0);"; dbquery($query); }
if (key_exists('aktion', $_POST)) { $amount1 = min($aktplanet['d502'], intval($_POST['ab502'])); if ($amount1 > 0) { $aktplanet['d502'] -= $amount1; $res = ShipyardPrice(502); $m = $res['m']; $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>
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']); }
echo "<tr> \t\t\t"; if ($GlobalUser['useskin']) { echo " <td class=l>\n"; echo " \t\t\t<a href=index.php?page=infos&session={$session}&gid={$id}>\n"; echo " \t\t\t<img border='0' src=\"" . UserSkin() . "gebaeude/{$id}.gif\" align='top' width='120' height='120'>\n"; echo " \t\t\t</a>\n"; echo " \t\t\t</td>\n"; echo " <td class=l >"; } else { echo " <td class=l colspan=2>"; } echo "<a href=index.php?page=infos&session={$session}&gid={$id}>" . loca("NAME_{$id}") . "</a>"; if ($aktplanet['d' . $id]) { echo "</a> (в наличии " . $aktplanet['d' . $id] . ")"; } $res = ShipyardPrice($id); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; echo "<br>" . loca("SHORT_{$id}") . "<br>Стоимость:"; if ($m) { echo " Металл: <b>" . nicenum($m) . "</b>"; } if ($k) { echo " Кристалл: <b>" . nicenum($k) . "</b>"; } if ($d) { echo " Дейтерий: <b>" . nicenum($d) . "</b>"; } if ($e) {
function FleetPrice($fleet_obj) { $fleetmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $m = $k = $d = $e = 0; $points = $fpoints = 0; $price = array(); foreach ($fleetmap as $i => $gid) { // Флот $level = $fleet_obj["ship{$gid}"]; if ($level > 0) { $res = ShipyardPrice($gid); $m = $res['m']; $k = $res['k']; $d = $res['d']; $e = $res['e']; $points += ($m + $k + $d) * $level; $fpoints += $level; } } $price['points'] = $points; $price['fpoints'] = $fpoints; return $price; }
foreach ($plist as $j => $planet) { $sum += $planet["d{$def}"]; } if ($sum == 0) { continue; } echo " <tr height=\"20\">\n"; echo " <th width=\"75\">\n"; echo " <a href=\"index.php?page=infos&session={$session}&gid={$def}&planettype={$planettype}\">\n\n"; echo " " . loca("NAME_{$def}") . " </a>\n"; echo " </th>\n\n"; foreach ($plist as $j => $planet) { $amount = $planet["d{$def}"]; echo " <th width=\"75\" >\n"; if ($amount > 0) { $cost = ShipyardPrice($def); $m = $cost['m']; $k = $cost['k']; $d = $cost['d']; $e = $cost['e']; $meet = IsEnoughResources($planet, $m, $k, $d, $e); $color = $meet ? "lime" : "red"; echo " <a href=\"index.php?page=buildings&session={$session}&cp=" . $planet['planet_id'] . "&mode=Verteidigung&planettype={$planettype}\">\n"; echo " <font color =\"{$color}\">\n"; echo " " . nicenum($amount) . " </font>\n"; echo " </a> \n"; } else { echo " <font color=\"white\">-</font>\n"; } } echo " <th width=\"75\">" . nicenum($sum) . "</th>\n\n";
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 Queue_Shipyard_End($queue, $when = 0) { global $db_prefix, $GlobalUser; if ($when == 0) { $now = time(); } else { $now = $when; } $gid = $queue['obj_id']; $planet_id = $queue['sub_id']; $planet = GetPlanet($planet_id); $player_id = $planet['owner_id']; // Старые значения $s = $queue['start']; $e = $queue['end']; $n = $queue['level']; $one = $e - $s; // Новые значения $done = min($n, floor(($now - $s) / $one)); $news = $s + $done * $one; $newe = $e + $done * $one; // Добавить флот на планете if ($gid > 400) { $query = "UPDATE " . $db_prefix . "planets SET d{$gid} = d{$gid} + {$done} WHERE planet_id = {$planet_id}"; } else { $query = "UPDATE " . $db_prefix . "planets SET f{$gid} = f{$gid} + {$done} WHERE planet_id = {$planet_id}"; } dbquery($query); // Добавить очки. $res = ShipyardPrice($gid); $m = $res['m']; $k = $res['k']; $d = $res['d']; $enrg = $res['e']; $points = ($m + $k + $d) * $done; if ($gid < 400) { $fpoints = $done; } else { $fpoints = 0; } AdjustStats($queue['owner_id'], $points, $fpoints, 0, '+'); // Обновить задание или удалить его, если всё построено. if ($done < $n) { $query = "UPDATE " . $db_prefix . "queue SET start = {$news}, end = {$newe}, level = level - {$done} WHERE task_id = " . $queue['task_id']; dbquery($query); //Debug ( "На верфи [".$planet['g'].":".$planet['s'].":".$planet['p']."] ".$planet['name']." построено ".loca("NAME_$gid")." ($done), осталось достроить (".($n-$done).")" ); if ($one > 60) { RecalcRanks(); } } else { //Debug ( "На верфи [".$planet['g'].":".$planet['s'].":".$planet['p']."] ".$planet['name']." завершена постройка ".loca("NAME_$gid")." ($done)" ); RemoveQueue($queue['task_id']); RecalcRanks(); } if ($GlobalUser['player_id'] == $player_id) { InvalidateUserCache(); $GlobalUser = LoadUser($player_id); // обновить данные текущего пользователя } }
function CalcLosses($a, $d, $res, $repaired) { $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); $amap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215); $dmap = array(202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 401, 402, 403, 404, 405, 406, 407, 408); $aprice = $dprice = 0; // Стоимость юнитов до боя. foreach ($a as $i => $attacker) { foreach ($fleetmap as $n => $gid) { $amount = $attacker['fleet'][$gid]; if ($amount > 0) { $cost = ShipyardPrice($gid); $aprice += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $a[$i]['points'] += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $a[$i]['fpoints'] += $amount; } } } foreach ($d as $i => $defender) { foreach ($fleetmap as $n => $gid) { $amount = $defender['fleet'][$gid]; if ($amount > 0) { $cost = ShipyardPrice($gid); $dprice += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $d[$i]['points'] += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $d[$i]['fpoints'] += $amount; } } foreach ($defmap as $n => $gid) { $amount = $defender['defense'][$gid]; if ($amount > 0) { $cost = ShipyardPrice($gid); $dprice += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $d[$i]['points'] += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; } } } // Стоимость юнитов в последнем раунде. $rounds = count($res['rounds']); if ($rounds > 0) { $last = $res['rounds'][$rounds - 1]; $alast = $dlast = 0; foreach ($last['attackers'] as $i => $attacker) { foreach ($amap as $n => $gid) { $amount = $attacker[$gid]; if ($amount > 0) { $cost = ShipyardPrice($gid); $alast += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $a[$i]['points'] -= ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $a[$i]['fpoints'] -= $amount; } } } foreach ($last['defenders'] as $i => $defender) { foreach ($dmap as $n => $gid) { if ($gid > 400 && $i == 0) { $amount = $defender[$gid] + $repaired[$gid]; } else { $amount = $defender[$gid]; } if ($amount > 0) { $cost = ShipyardPrice($gid); $dlast += ($cost['m'] + $cost['k'] + $cost['d']) * $amount; $d[$i]['points'] -= ($cost['m'] + $cost['k'] + $cost['d']) * $amount; if ($gid < 400) { $d[$i]['fpoints'] -= $amount; } } } } $aloss = $aprice - $alast; $dloss = $dprice - $dlast; } else { foreach ($a as $i => $attacker) { $a[$i]['points'] = $a[$i]['fpoints'] = 0; } foreach ($d as $i => $defender) { $d[$i]['points'] = $d[$i]['fpoints'] = 0; } $aloss = $dloss = 0; } return array('a' => $a, 'd' => $d, 'aloss' => $aloss, 'dloss' => $dloss); }