function eco_bld_tech($que_type, &$user, &$planet) { global $config, $lang; lng_include('buildings'); lng_include('infos'); if (!mrc_get_level($user, $planet, STRUC_LABORATORY)) { message($lang['no_laboratory'], $lang['tech'][UNIT_TECHNOLOGIES]); } if (eco_unit_busy($user, $planet, UNIT_TECHNOLOGIES)) { message($lang['eco_bld_msg_err_laboratory_upgrading'], $lang['tech'][UNIT_TECHNOLOGIES]); } switch ($action = sys_get_param_escaped('action')) { case 'build': $operation_result = que_build($user, $planet); break; case 'trim': que_delete(QUE_RESEARCH, $user, $planet, false); break; case 'clear': que_delete(QUE_RESEARCH, $user, $planet, true); break; //case 'build':$operation_result = eco_bld_tech_research($user, $planet);break; } $template = gettemplate('buildings_research', true); if (!empty($operation_result)) { $template->assign_block_vars('result', $operation_result); } $fleet_list = flt_get_fleets_to_planet($planet); $ques = que_get($user['id'], QUE_RESEARCH); $que =& $ques['ques'][QUE_RESEARCH][$user['id']][0]; que_tpl_parse($template, QUE_RESEARCH, $user, null, $que); $in_que =& $ques['in_que'][QUE_RESEARCH][$user['id']][0]; foreach (sn_get_groups('tech') as $unit_id) { if (eco_can_build_unit($user, $planet, $unit_id) != BUILD_ALLOWED) { continue; } $level_base = mrc_get_level($user, '', $unit_id, false, true); $level_effective = mrc_get_level($user, '', $unit_id); $level_in_que = $in_que[$unit_id]; $level_bonus = max(0, $level_effective - $level_base); $level_base_and_que = $level_base + $level_in_que; $build_data = eco_get_build_data($user, $planet, $unit_id, $level_base_and_que); $temp[RES_METAL] = floor($planet['metal'] - $build_data[BUILD_CREATE][RES_METAL]); $temp[RES_CRYSTAL] = floor($planet['crystal'] - $build_data[BUILD_CREATE][RES_CRYSTAL]); $temp[RES_DEUTERIUM] = floor($planet['deuterium'] - $build_data[BUILD_CREATE][RES_DEUTERIUM]); $template->assign_block_vars('production', array('ID' => $unit_id, 'NAME' => $lang['tech'][$unit_id], 'DESCRIPTION' => $lang['info'][$unit_id]['description_short'], 'LEVEL_OLD' => $level_base, 'LEVEL_BONUS' => $level_bonus, 'LEVEL_NEXT' => $level_base + $level_in_que + 1, 'LEVEL_QUED' => $level_in_que, 'LEVEL' => $level_base_and_que, 'BUILD_CAN' => $build_data['CAN'][BUILD_CREATE], 'TIME' => pretty_time($build_data[RES_TIME][BUILD_CREATE]), 'METAL' => $build_data[BUILD_CREATE][RES_METAL], 'CRYSTAL' => $build_data[BUILD_CREATE][RES_CRYSTAL], 'DEUTERIUM' => $build_data[BUILD_CREATE][RES_DEUTERIUM], 'METAL_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_METAL], true, $planet['metal']), 'CRYSTAL_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_CRYSTAL], true, $planet['crystal']), 'DEUTERIUM_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_DEUTERIUM], true, $planet['deuterium']), 'METAL_REST' => pretty_number($temp[RES_METAL], true, true), 'CRYSTAL_REST' => pretty_number($temp[RES_CRYSTAL], true, true), 'DEUTERIUM_REST' => pretty_number($temp[RES_DEUTERIUM], true, true), 'METAL_REST_NUM' => $temp[RES_METAL], 'CRYSTAL_REST_NUM' => $temp[RES_CRYSTAL], 'DEUTERIUM_REST_NUM' => $temp[RES_DEUTERIUM], 'METAL_FLEET' => pretty_number($temp[RES_METAL] + $fleet_list['own']['total'][RES_METAL], true, true), 'CRYSTAL_FLEET' => pretty_number($temp[RES_CRYSTAL] + $fleet_list['own']['total'][RES_CRYSTAL], true, true), 'DEUTERIUM_FLEET' => pretty_number($temp[RES_DEUTERIUM] + $fleet_list['own']['total'][RES_DEUTERIUM], true, true), 'BUILD_CAN2' => $build_data['CAN'][BUILD_CREATE])); } // if(count($que['ques'][$que_id][$user['id']][$planet_id]) >= que_get_max_que_length($user, $planet, $que_id, $que_data)) $template->assign_vars(array('QUE_ID' => QUE_RESEARCH, 'FLEET_OWN_COUNT' => $fleet_list['own']['count'], 'ARTIFACT_ID' => ART_HEURISTIC_CHIP, 'ARTIFACT_LEVEL' => mrc_get_level($user, array(), ART_HEURISTIC_CHIP), 'ARTIFACT_NAME' => $lang['tech'][ART_HEURISTIC_CHIP], 'REQUEST_URI' => $_SERVER['REQUEST_URI'], 'PAGE_HEADER' => $page_header = $lang['tech'][UNIT_TECHNOLOGIES] . ($user['user_as_ally'] ? " {$lang['sys_of_ally']} {$user['username']}" : ''), 'CONFIG_RESEARCH_QUE' => $config->server_que_length_research)); display(parsetemplate($template), $page_header); }
function eco_get_build_data(&$user, $planet, $unit_id, $unit_level = 0, $only_cost = false) { global $config; $rpg_exchange_deuterium = $config->rpg_exchange_deuterium; $unit_data = get_unit_param($unit_id); // $unit_db_name = &$unit_data[P_NAME]; $unit_factor = $unit_data[P_COST][P_FACTOR] ? $unit_data[P_COST][P_FACTOR] : 1; $price_increase = pow($unit_factor, $unit_level); $can_build = isset($unit_data[P_MAX_STACK]) && $unit_data[P_MAX_STACK] ? $unit_data[P_MAX_STACK] : 1000000000000.0; $can_destroy = 1000000000000.0; $time = 0; $only_dark_matter = 0; foreach ($unit_data[P_COST] as $resource_id => $resource_amount) { if ($resource_id === P_FACTOR || !($resource_cost = $resource_amount * $price_increase)) { continue; } $cost[BUILD_CREATE][$resource_id] = round($resource_cost); $cost[BUILD_DESTROY][$resource_id] = round($resource_cost / 2); $resource_db_name = pname_resource_name($resource_id); if (in_array($resource_id, sn_get_groups('resources_loot'))) { $time += $resource_cost * $config->__get("rpg_exchange_{$resource_db_name}") / $rpg_exchange_deuterium; $resource_got = mrc_get_level($user, $planet, $resource_id); } elseif ($resource_id == RES_DARK_MATTER) { $resource_got = mrc_get_level($user, null, $resource_id); } elseif ($resource_id == RES_ENERGY) { $resource_got = max(0, $planet['energy_max'] - $planet['energy_used']); } else { $resource_got = 0; } $only_dark_matter = $only_dark_matter ? $only_dark_matter : $resource_id; $can_build = min($can_build, $resource_got / $cost[BUILD_CREATE][$resource_id]); $can_destroy = min($can_destroy, $resource_got / $cost[BUILD_DESTROY][$resource_id]); } $can_build = $can_build > 0 ? floor($can_build) : 0; $cost['CAN'][BUILD_CREATE] = $can_build; $can_destroy = $can_destroy > 0 ? floor($can_destroy) : 0; $cost['CAN'][BUILD_DESTROY] = $can_destroy; $cost[P_OPTIONS][P_ONLY_DARK_MATTER] = $only_dark_matter = $only_dark_matter == RES_DARK_MATTER; $cost[P_OPTIONS][P_TIME_RAW] = $time = $time * 60 * 60 / get_game_speed() / 2500; // TODO - Вынести в отдельную процедуру расчёт стоимости if ($only_cost) { return $cost; } $cost['RESULT'][BUILD_CREATE] = eco_can_build_unit($user, $planet, $unit_id); $cost['RESULT'][BUILD_CREATE] = $cost['RESULT'][BUILD_CREATE] == BUILD_ALLOWED ? $cost['CAN'][BUILD_CREATE] ? BUILD_ALLOWED : BUILD_NO_RESOURCES : $cost['RESULT'][BUILD_CREATE]; $mercenary = 0; $cost['RESULT'][BUILD_DESTROY] = BUILD_INDESTRUCTABLE; if (in_array($unit_id, sn_get_groups('structures'))) { $time = $time * pow(0.5, mrc_get_level($user, $planet, STRUC_FACTORY_NANO)) / (mrc_get_level($user, $planet, STRUC_FACTORY_ROBOT) + 1); $mercenary = MRC_ENGINEER; $cost['RESULT'][BUILD_DESTROY] = mrc_get_level($user, $planet, $unit_id, false, true) ? $cost['CAN'][BUILD_DESTROY] ? $cost['RESULT'][BUILD_CREATE] == BUILD_UNIT_BUSY ? BUILD_UNIT_BUSY : BUILD_ALLOWED : BUILD_NO_RESOURCES : BUILD_NO_UNITS; } elseif (in_array($unit_id, sn_get_groups('tech'))) { $lab_level = eco_get_lab_max_effective_level($user, intval($unit_data['require'][STRUC_LABORATORY])); $time = $time / $lab_level; $mercenary = MRC_ACADEMIC; } elseif (in_array($unit_id, sn_get_groups('defense'))) { $time = $time * pow(0.5, mrc_get_level($user, $planet, STRUC_FACTORY_NANO)) / (mrc_get_level($user, $planet, STRUC_FACTORY_HANGAR) + 1); $mercenary = MRC_FORTIFIER; } elseif (in_array($unit_id, sn_get_groups('fleet'))) { $time = $time * pow(0.5, mrc_get_level($user, $planet, STRUC_FACTORY_NANO)) / (mrc_get_level($user, $planet, STRUC_FACTORY_HANGAR) + 1); $mercenary = MRC_ENGINEER; } if ($mercenary) { $time = $time / mrc_modify_value($user, $planet, $mercenary, 1); } if (in_array($unit_id, sn_get_groups('governors')) || $only_dark_matter) { $cost[RES_TIME][BUILD_CREATE] = $cost[RES_TIME][BUILD_DESTROY] = 0; } else { $cost[RES_TIME][BUILD_CREATE] = round($time >= 1 ? $time : 1); $cost[RES_TIME][BUILD_DESTROY] = round($time / 2 <= 1 ? 1 : $time / 2); } return $cost; }
/** * eco_build.php * * @version 1.5 - Using PTE (not everywhere) by Gorlum for http://supernova.ws * @version 1.4 - Complying with PCG by Gorlum for http://supernova.ws * @version 1.3 - Security checked for SQL-injection by Gorlum for http://supernova.ws // 1.0 Mise en module initiale (creation) // 1.1 FIX interception cheat +1 // 1.2 FIX interception cheat destruction a -1 * @version 1.1 * @copyright 2008 by Chlorel for XNova */ function eco_build($que_type, $user, &$planet, $que) { global $sn_data, $lang, $config, $time_now; // start transaction here $template = gettemplate('buildings_builds', true); // Caching values that used more then one time into local variables $config_resource_multiplier = $config->resource_multiplier; $planet_type_structs = $sn_data['groups']['build_allow'][$planet['planet_type']]; // Getting parameters $action = sys_get_param_escaped('action'); $unit_id = sys_get_param_int('unit_id'); $unit_level = sys_get_param_int('unit_level'); $GET_listid = $_GET['listid']; $que_type = $que_type == SUBQUE_FLEET || $que_type == SUBQUE_DEFENSE ? QUE_HANGAR : $que_type; CheckPlanetUsedFields($planet); if ($action) { switch ($action) { case 'create': // Add unit to que for build $que = eco_que_add($user, $planet, $que, QUE_STRUCTURES, $unit_id); break; case 'destroy': // Add unit to que for remove $que = eco_que_add($user, $planet, $que, QUE_STRUCTURES, $unit_id, 1, BUILD_DESTROY); break; case 'trim': // Cancel unit from que $que = eco_que_clear($user, $planet, $que, QUE_STRUCTURES, true); break; case 'clear': // Clear que $que = eco_que_clear($user, $planet, $que, QUE_STRUCTURES); break; } header("Location: {$_SERVER['PHP_SELF']}?mode={$que_type}"); } /* // Code for fully working new que system $hangar_busy = count($que['que'][QUE_HANGAR]); $lab_busy = count($que['que'][QUE_RESEARCH]) && !$config->BuildLabWhileRun; */ $que_length = count($que['que'][$que_type]); $can_que_element = $que_length < MAX_BUILDING_QUEUE_SIZE; $fleet_list = flt_get_fleets_to_planet($planet); $caps = ECO_getPlanetCaps($user, &$planet); $planet_fields_max = eco_planet_fields_max($planet); $planet_fields_current = $planet['field_current']; $planet_fields_que = -$que['amounts'][$que_type]; $planet_fields_free = max(0, $planet_fields_max - $planet_fields_current + $planet_fields_que); $planet_fields_queable = $planet_fields_free > 0; $planet_temp_max = $planet['temp_max']; $GLOBALS['user_tech_energy'] = $user['energy_tech']; foreach ($planet_type_structs as $Element) { if (eco_can_build_unit($user, $planet, $Element)) { $element_name = $lang['tech'][$Element]; $element_sn_data =& $sn_data[$Element]; $element_level = $planet[$sn_data[$Element]['name']] + $que['in_que'][$Element]; // show energy on BuildingPage //================================ if ($element_sn_data['production']) { $element_production_energy = $element_sn_data['production'][RES_ENERGY]; $energy_current = floor($element_production_energy($element_level, 10, $planet_temp_max)); $energy_next = floor($element_production_energy($element_level + 1, 10, $planet_temp_max)); if ($Element == STRUC_MINE_SOLAR || $Element == STRUC_MINE_FUSION) { $energy_current = floor(mrc_modify_value($user, $planet, array(MRC_POWERMAN), $energy_current)); $energy_next = floor(mrc_modify_value($user, $planet, array(MRC_POWERMAN), $energy_next)); } $energy_balance = floor($energy_next - $energy_current); } else { $energy_balance = 0; } //================================ $build_data = eco_get_build_data($user, $planet, $Element, $element_level); $temp[RES_METAL] = floor($planet['metal'] + $fleet_list['own']['total'][RES_METAL] - $build_data[BUILD_CREATE][RES_METAL]); $temp[RES_CRYSTAL] = floor($planet['crystal'] + $fleet_list['own']['total'][RES_CRYSTAL] - $build_data[BUILD_CREATE][RES_CRYSTAL]); $temp[RES_DEUTERIUM] = floor($planet['deuterium'] + $fleet_list['own']['total'][RES_DEUTERIUM] - $build_data[BUILD_CREATE][RES_DEUTERIUM]); $template->assign_block_vars('production', array('ID' => $Element, 'NAME' => $element_name, 'DESCRIPTION' => $lang['info'][$Element]['description_short'], 'LEVEL' => $element_level, 'LEVEL_OLD' => $planet[$sn_data[$Element]['name']], 'LEVEL_CHANGE' => $que['in_que'][$Element], 'BUILD_CAN' => $build_data['CAN'][BUILD_CREATE], 'TIME' => pretty_time($build_data[BUILD_CREATE][RES_TIME]), 'METAL' => $build_data[BUILD_CREATE][RES_METAL], 'CRYSTAL' => $build_data[BUILD_CREATE][RES_CRYSTAL], 'DEUTERIUM' => $build_data[BUILD_CREATE][RES_DEUTERIUM], 'DESTROY_CAN' => $build_data['CAN'][BUILD_DESTROY], 'DESTROY_TIME' => pretty_time($build_data[BUILD_DESTROY][RES_TIME]), 'DESTROY_METAL' => $build_data[BUILD_DESTROY][RES_METAL], 'DESTROY_CRYSTAL' => $build_data[BUILD_DESTROY][RES_CRYSTAL], 'DESTROY_DEUTERIUM' => $build_data[BUILD_DESTROY][RES_DEUTERIUM], 'METAL_REST' => pretty_number($temp[RES_METAL], true, true), 'CRYSTAL_REST' => pretty_number($temp[RES_CRYSTAL], true, true), 'DEUTERIUM_REST' => pretty_number($temp[RES_DEUTERIUM], true, true), 'METAL_REST_NUM' => $temp[RES_METAL], 'CRYSTAL_REST_NUM' => $temp[RES_CRYSTAL], 'DEUTERIUM_REST_NUM' => $temp[RES_DEUTERIUM], 'METAL_BALANCE' => $caps['metal_perhour'][$Element], 'CRYSTAL_BALANCE' => $caps['crystal_perhour'][$Element], 'DEUTERIUM_BALANCE' => $caps['deuterium_perhour'][$Element], 'ENERGY_BALANCE' => $energy_balance, 'UNIT_BUSY' => eco_unit_busy($user, $planet, $que, $Element))); } } if (is_array($que['que'][$que_type])) { foreach ($que['que'][$que_type] as $que_element) { $template->assign_block_vars('que', $que_element); } } $template->assign_vars(array('TIME_NOW' => $time_now, 'QUE_ID' => $que_type, 'METAL' => $planet['metal'], 'CRYSTAL' => $planet['crystal'], 'DEUTERIUM' => $planet['deuterium'], 'METAL_INCOMING' => $fleet_list['own']['total'][RES_METAL], 'CRYSTAL_INCOMING' => $fleet_list['own']['total'][RES_CRYSTAL], 'DEUTERIUM_INCOMING' => $fleet_list['own']['total'][RES_DEUTERIUM], 'FIELDS_CURRENT' => $planet_fields_current, 'FIELDS_MAX' => $planet_fields_max, 'FIELDS_FREE' => $planet_fields_free, 'FIELDS_QUE' => $planet_fields_que == 0 ? '' : $planet_fields_que > 0 ? "+{$planet_fields_que}" : $planet_fields_que, 'QUE_HAS_PLACE' => $can_que_element, 'QUE_HAS_FIELDS' => $planet_fields_queable, 'FLEET_OWN' => $fleet_list['own']['count'], 'PAGE_HINT' => $lang['eco_bld_page_hint'])); display(parsetemplate($template), $lang['Builds']); }
function que_build($user, $planet, $build_mode = BUILD_CREATE, $redirect = true) { global $lang; $unit_amount_qued = 0; try { if (!$user['id']) { throw new exception('{Нет идентификатора пользователя - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } $unit_id = sys_get_param_int('unit_id'); /* if(!$unit_id && is_array($unit_list = sys_get_param('fmenge'))) { foreach($unit_list as $unit_id => $unit_amount) if($unit_amount) break; } */ if (!$unit_id) { throw new exception('{Нет идентификатора юнита - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } $que_id = que_get_unit_que($unit_id); if (!$que_id) { throw new exception('{Неправильный тип очереди - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } if ($build_mode == BUILD_DESTROY && $que_id != QUE_STRUCTURES) { throw new exception('{Уничтожать можно только здания на планете}', ERR_ERROR); // TODO EXCEPTION } $que_data = sn_get_groups('ques'); $que_data = $que_data[$que_id]; // die(); // TODO Переделать под подочереди if ($que_id == QUE_STRUCTURES) { $sn_groups_build_allow = sn_get_groups('build_allow'); $que_data['unit_list'] = $sn_groups_build_allow[$planet['planet_type']]; if (!isset($que_data['unit_list'][$unit_id])) { throw new exception('{Это здание нельзя строить на ' . ($planet['planet_type'] == PT_PLANET ? 'планете' : 'луне'), ERR_ERROR); // TODO EXCEPTION } } /* // TODO Разделить очереди для Верфи и Обороны elseif($que_id == QUE_HANGAR) { $que_data['mercenary'] = in_array($unit_id, sn_get_groups('defense')) ? MRC_FORTIFIER : MRC_ENGINEER; } elseif($que_id == QUE_HANGAR) { $que_data['mercenary'] = in_array($unit_id, sn_get_groups('defense')) ? MRC_FORTIFIER : MRC_ENGINEER; } */ sn_db_transaction_start(); // Это нужно, что бы заблокировать пользователя и работу с очередями $user = db_user_by_id($user['id']); // Это нужно, что бы заблокировать планету от списания ресурсов if (isset($planet['id']) && $planet['id']) { $planet = db_planet_by_id($planet['id'], true); } else { $planet['id'] = 0; } $planet_id = $que_id == QUE_RESEARCH ? 0 : intval($planet['id']); $que = que_get($user['id'], $planet['id'], $que_id, true); $in_que =& $que['in_que'][$que_id][$user['id']][$planet_id]; $que_max_length = que_get_max_que_length($user, $planet, $que_id, $que_data); // TODO Добавить вызовы функций проверок текущей и максимальной длин очередей if (count($in_que) >= $que_max_length) { throw new exception('{Все слоты очереди заняты}', ERR_ERROR); // TODO EXCEPTION } // TODO Отдельно посмотреть на уничтожение зданий - что бы можно было уничтожать их без планов switch (eco_can_build_unit($user, $planet, $unit_id)) { case BUILD_ALLOWED: break; case BUILD_UNIT_BUSY: throw new exception('{Строение занято}', ERR_ERROR); break; // TODO EXCEPTION eco_bld_msg_err_laboratory_upgrading // case BUILD_REQUIRE_NOT_MEET: // TODO EXCEPTION eco_bld_msg_err_laboratory_upgrading // case BUILD_REQUIRE_NOT_MEET: default: if ($build_mode == BUILD_CREATE) { throw new exception('{Требования не удовлетворены}', ERR_ERROR); } break; // TODO EXCEPTION eco_bld_msg_err_requirements_not_meet } $unit_amount = floor(sys_get_param_float('unit_amount', 1)); $unit_amount_qued = $unit_amount; $units_qued = isset($in_que[$unit_id]) ? $in_que[$unit_id] : 0; $unit_level = mrc_get_level($user, $planet, $unit_id, true, true) + $units_qued; if ($unit_max = get_unit_param($unit_id, P_MAX_STACK)) { if ($unit_level >= $unit_max) { throw new exception('{Максимальное количество юнитов данного типа уже достигнуто или будет достигнуто по окончанию очереди}', ERR_ERROR); // TODO EXCEPTION } $unit_amount = max(0, min($unit_amount, $unit_max - $unit_level)); } if ($unit_amount < 1) { throw new exception('{Неправильное количество юнитов - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } /* if($unit_max && $unit_level + $unit_amount > $unit_max) { throw new exception("Постройка {$unit_amount} {$lang['tech'][$unit_id]} приведет к привышению максимально возможного количества юнитов данного типа", ERR_ERROR); // TODO EXCEPTION } */ // TODO Переделать eco_unit_busy для всех типов зданий // if(eco_unit_busy($user, $planet, $que, $unit_id)) // { // die('Unit busy'); // TODO EXCEPTION // } if (get_unit_param($unit_id, P_STACKABLE)) { // TODO Поле 'max_Lot_size' для ограничения размера стэка в очереди - то ли в юниты, то ли в очередь if (in_array($unit_id, $group_missile = sn_get_groups('missile'))) { // TODO Поле 'container' - указывает на родительску структуру, в которой хранится данный юнит и по вместительности которой нужно применять размер юнита $used_silo = 0; foreach ($group_missile as $missile_id) { $missile_qued = isset($in_que[$missile_id]) ? $in_que[$missile_id] : 0; $used_silo += (mrc_get_level($user, $planet, $missile_id, true, true) + $missile_qued) * get_unit_param($missile_id, P_UNIT_SIZE); } $free_silo = mrc_get_level($user, $planet, STRUC_SILO) * get_unit_param(STRUC_SILO, P_CAPACITY) - $used_silo; if ($free_silo <= 0) { throw new exception('{Ракетная шахта уже заполнена или будет заполнена по окончанию очереди}', ERR_ERROR); // TODO EXCEPTION } $unit_size = get_unit_param($unit_id, P_UNIT_SIZE); if ($free_silo < $unit_size) { throw new exception("{В ракетной шахте нет места для {$lang['tech'][$unit_id]}}", ERR_ERROR); // TODO EXCEPTION } $unit_amount = max(0, min($unit_amount, floor($free_silo / $unit_size))); } $unit_level = $new_unit_level = 0; } else { $unit_amount = 1; if ($que_id == QUE_STRUCTURES) { // if($build_mode == BUILD_CREATE && eco_planet_fields_max($planet) - $planet['field_current'] - $que['sectors'][$planet['id']] <= 0) $sectors_qued = is_array($in_que) ? array_sum($in_que) : 0; if ($build_mode == BUILD_CREATE && eco_planet_fields_max($planet) - $planet['field_current'] - $sectors_qued <= 0) { throw new exception('{Не хватает секторов на планете}', ERR_ERROR); // TODO EXCEPTION } // И что это я такое написал? Зачем? //if($build_mode == BUILD_DESTROY && $planet['field_current'] <= $que['amounts'][$que_id]) //{ // die('Too much buildings'); // TODO EXCEPTION //} } $build_multiplier = $build_mode == BUILD_CREATE ? 1 : -1; $new_unit_level = $unit_level + $unit_amount * $build_multiplier; } $build_data = eco_get_build_data($user, $planet, $unit_id, $unit_level); $unit_amount = min($build_data['CAN'][$build_mode], $unit_amount); if ($unit_amount < 0) { throw new exception('{Не хватает ресурсов}', ERR_ERROR); // TODO EXCEPTION } if ($new_unit_level < 0) { throw new exception('{Нельзя уничтожить больше юнитов, чем есть}', ERR_ERROR); // TODO EXCEPTION } if ($build_data['RESULT'][$build_mode] != BUILD_ALLOWED) { throw new exception('{Строительство блокировано}', ERR_ERROR); // TODO EXCEPTION } // $unit_amount = min($unit_amount, MAX_FLEET_OR_DEFS_PER_ROW); $unit_amount_qued = 0; while ($unit_amount > 0 && count($que['ques'][$que_id][$user['id']][$planet_id]) < $que_max_length) { $place = min($unit_amount, MAX_FLEET_OR_DEFS_PER_ROW); que_add_unit($unit_id, $user, $planet, $build_data, $new_unit_level, $place, $build_mode); $unit_amount -= $place; $que = que_get($user['id'], $planet['id'], $que_id, true); $unit_amount_qued += $place; } // pdump($que); /* pdump($que = que_get($user['id'], $planet['id'], $que_id, true)); */ // die(); // if(count($que['ques'][$que_id][$user['id']][$planet_id]) >= $que_max_length) sn_db_transaction_commit(); if ($redirect) { sys_redirect("{$_SERVER['PHP_SELF']}?mode=" . sys_get_param_str('mode') . "&ally_id=" . sys_get_param_id('ally_id')); die; } $operation_result = array('STATUS' => ERR_NONE, 'MESSAGE' => '{Строительство начато}'); } catch (exception $e) { sn_db_transaction_rollback(); $operation_result = array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage()); } if (!empty($operation_result['MESSAGE'])) { $operation_result['MESSAGE'] .= ' ' . ($unit_amount_qued ? $unit_amount_qued : $unit_amount) . 'x[' . $lang['tech'][$unit_id] . ']' . (isset($planet['id']) ? ' на ' . $planet['name'] : '') . '}'; } return $operation_result; }
function eco_build_hangar($que_type, $user, &$planet, $que) { global $sn_data, $lang, $dpath, $debug, $time_now; $GET_action = sys_get_param_str('action'); $GET_mode = sys_get_param_str('mode'); $POST_fmenge = $_POST['fmenge']; if (isset($GET_action)) { switch ($GET_action) { case 'trim': $ElementQueue = explode(';', $planet['b_hangar_id']); while (!empty($ElementQueue) && $ElementLine == '') { $ElementIndex = count($ElementQueue) - 1; $ElementLine = $ElementQueue[$ElementIndex]; unset($ElementQueue[$ElementIndex]); } if ($ElementLine) { $Element = explode(',', $ElementLine); $ResourcesToUpd[metal] += floor($sn_data[$Element[0]]['metal'] * $Element[1]); $ResourcesToUpd[crystal] += floor($sn_data[$Element[0]]['crystal'] * $Element[1]); $ResourcesToUpd[deuterium] += floor($sn_data[$Element[0]]['deuterium'] * $Element[1]); doquery("UPDATE `{{planets}}` SET\r\n `metal` = metal + '{$ResourcesToUpd['metal']}', `crystal` = crystal + '{$ResourcesToUpd['crystal']}', `deuterium` = deuterium + '{$ResourcesToUpd['deuterium']}'," . (empty($ElementQueue) ? '`b_hangar` = 0,' : '') . "`b_hangar_id` = '" . implode(';', $ElementQueue) . "' WHERE `id` = '{$planet['id']}' LIMIT 1;"); } // PREVENT SUBMITS? header("location: {$_SERVER['PHP_SELF']}?mode={$GET_mode}"); exit; break; case 'clear': $ElementQueue = explode(';', $planet['b_hangar_id']); foreach ($ElementQueue as $ElementLine => $Element) { if ($Element != '') { $Element = explode(',', $Element); $ResourcesToUpd[metal] += floor($sn_data[$Element[0]]['metal'] * $Element[1]); $ResourcesToUpd[crystal] += floor($sn_data[$Element[0]]['crystal'] * $Element[1]); $ResourcesToUpd[deuterium] += floor($sn_data[$Element[0]]['deuterium'] * $Element[1]); } } doquery("UPDATE `{{planets}}` SET\r\n `metal` = metal + '{$ResourcesToUpd['metal']}', `crystal` = crystal + '{$ResourcesToUpd['crystal']}', `deuterium` = deuterium + '{$ResourcesToUpd['deuterium']}',\r\n `b_hangar` = '', `b_hangar_id` = '' WHERE `id` = '{$planet['id']}' LIMIT 1;"); // PREVENT SUBMITS? header("location: {$_SERVER['PHP_SELF']}?mode={$GET_mode}"); exit; break; } } $page_error = ''; $page_mode = $que_type == SUBQUE_FLEET ? 'fleet' : 'defense'; $sn_data_group = $sn_data['groups'][$page_mode]; if (isset($POST_fmenge) && !eco_hangar_is_building($que)) { doquery('START TRANSACTION;'); $planet = doquery("SELECT * FROM {{planets}} WHERE `id` = '{$planet['id']}' LIMIT 1 FOR UPDATE;", '', true); $units_cost = array(); $hangar = $planet['b_hangar_id']; $built = GetRestrictedConstructionNum($planet); $SiloSpace = max(0, $planet[$sn_data[44]['name']] * 10 - $built[502] - $built[503] * 2); foreach ($POST_fmenge as $Element => $Count) { $Element = intval($Element); $Count = min(max(0, intval($Count)), MAX_FLEET_OR_DEFS_PER_ROW); if (!($Count && $Element && in_array($Element, $sn_data_group) && eco_can_build_unit($user, $planet, $Element))) { continue; } // On verifie combien on sait faire de cet element au max $MaxElements = GetMaxConstructibleElements($Element, $planet); switch ($Element) { case 502: $Count = min($SiloSpace, $Count, $MaxElements); $SiloSpace -= $Count; break; case 503: $Count = min(floor($SiloSpace / 2), $Count, $MaxElements); $SiloSpace -= $Count * 2; break; case 407: case 408: case 409: $Count = $built[$Element] >= 1 ? 0 : 1; break; default: $Count = min($Count, $MaxElements); break; } $unit_resources = GetElementRessources($Element, $Count); foreach ($unit_resources as $res_name => $res_amount) { $units_cost[$res_name] += $res_amount; } $hangar .= "{$Element},{$Count};"; } if ($hangar != $planet['b_hangar_id']) { $new_planet_data = $planet; $can_build_def = true; $query_string = ''; foreach ($units_cost as $res_name => $res_amount) { if ($res_amount <= 0) { continue; } if ($planet[$res_name] < $res_amount) { $can_build_def = false; $page_error = $lang['eco_bld_resources_not_enough']; break; } $new_planet_data[$res_name] -= $res_amount; $query_string .= "`{$res_name}` = `{$res_name}` - {$res_amount},"; } if ($can_build_def && $query_string) { $planet = $new_planet_data; $planet['b_hangar_id'] = $hangar; $query_string .= "`b_hangar_id` = '{$hangar}'"; doquery("UPDATE {{planets}} SET {$query_string} WHERE `id` = '{$planet['id']}' LIMIT 1;"); } } doquery('COMMIT'); } // ------------------------------------------------------------------------------------------------------- // S'il n'y a pas de Chantier ... if ($planet[$sn_data[21]['name']] == 0) { // Veuillez avoir l'obligeance de construire le Chantier Spacial !! message($lang['need_hangar'], $lang['tech'][21]); } $built = GetRestrictedConstructionNum($planet); $SiloSpace = max(0, $planet[$sn_data[44]['name']] * 10 - $built[502] - $built[503] * 2); $template = gettemplate("buildings_hangar", true); // ------------------------------------------------------------------------------------------------------- // Construction de la page du Chantier (car si j'arrive ici ... c'est que j'ai tout ce qu'il faut pour ... $TabIndex = 0; foreach ($sn_data_group as $Element) { $unit_message = ''; if (eco_can_build_unit($user, $planet, $Element)) { // On regarde si on peut en acheter au moins 1 $CanBuildOne = IsElementBuyable($user, $planet, $Element, false); // Disponibilité actuelle $ElementCount = $planet[$sn_data[$Element]['name']]; // On affiche le temps de construction (c'est toujours tellement plus joli) $baubar = GetMaxConstructibleElements($Element, $planet); switch ($Element) { case 502: $baubar = min($SiloSpace, $baubar); $restrict = 1; break; case 503: $baubar = min(floor($SiloSpace / 2), $baubar); $restrict = 1; break; case 407: case 408: case 409: $baubar = $built[$Element] >= 1 ? 0 : min(1, $baubar); $restrict = 2; break; default: $restrict = 0; break; } // Case nombre d'elements a construire if ($CanBuildOne) { if (!eco_hangar_is_building($que)) { if ($restrict == 2 and $baubar == 0) { $unit_message .= $lang['only_one']; } elseif ($restrict == 1 and !$baubar) { $unit_message .= $lang['b_no_silo_space']; } else { $TabIndex++; } } else { $unit_message = $lang['fleet_on_update']; } } $build_data = eco_get_build_data($user, $planet, $Element, 0); $temp[RES_METAL] = floor($planet['metal'] - $build_data[BUILD_CREATE][RES_METAL]); // + $fleet_list['own']['total'][RES_METAL] $temp[RES_CRYSTAL] = floor($planet['crystal'] - $build_data[BUILD_CREATE][RES_CRYSTAL]); // + $fleet_list['own']['total'][RES_CRYSTAL] $temp[RES_DEUTERIUM] = floor($planet['deuterium'] - $build_data[BUILD_CREATE][RES_DEUTERIUM]); // + $fleet_list['own']['total'][RES_DEUTERIUM] $template->assign_block_vars('production', array('ID' => $Element, 'NAME' => $lang['tech'][$Element], 'DESCRIPTION' => $lang['info'][$Element]['description_short'], 'LEVEL' => $ElementCount, 'LEVEL_OLD' => $CurentPlanet[$sn_data[$Element]['name']], 'LEVEL_CHANGE' => $que['in_que'][$Element], 'BUILD_CAN' => min($baubar, $build_data['CAN'][BUILD_CREATE]), 'TIME' => pretty_time($build_data[BUILD_CREATE][RES_TIME]), 'METAL' => $build_data[BUILD_CREATE][RES_METAL], 'CRYSTAL' => $build_data[BUILD_CREATE][RES_CRYSTAL], 'DEUTERIUM' => $build_data[BUILD_CREATE][RES_DEUTERIUM], 'METAL_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_METAL], true, $planet['metal']), 'CRYSTAL_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_CRYSTAL], true, $planet['crystal']), 'DEUTERIUM_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_DEUTERIUM], true, $planet['deuterium']), 'DESTROY_CAN' => $build_data['CAN'][BUILD_DESTROY], 'DESTROY_TIME' => pretty_time($build_data[BUILD_DESTROY][RES_TIME]), 'DESTROY_METAL' => $build_data[BUILD_DESTROY][RES_METAL], 'DESTROY_CRYSTAL' => $build_data[BUILD_DESTROY][RES_CRYSTAL], 'DESTROY_DEUTERIUM' => $build_data[BUILD_DESTROY][RES_DEUTERIUM], 'METAL_REST' => pretty_number($temp[RES_METAL], true, true), 'CRYSTAL_REST' => pretty_number($temp[RES_CRYSTAL], true, true), 'DEUTERIUM_REST' => pretty_number($temp[RES_DEUTERIUM], true, true), 'METAL_REST_NUM' => $temp[RES_METAL], 'CRYSTAL_REST_NUM' => $temp[RES_CRYSTAL], 'DEUTERIUM_REST_NUM' => $temp[RES_DEUTERIUM], 'METAL_BALANCE' => $caps['metal_perhour'][$Element], 'CRYSTAL_BALANCE' => $caps['crystal_perhour'][$Element], 'DEUTERIUM_BALANCE' => $caps['deuterium_perhour'][$Element], 'ENERGY_BALANCE' => $energy_balance, 'ARMOR' => pretty_number($sn_data[$Element]['armor']), 'SHIELD' => pretty_number($sn_data[$Element]['shield']), 'WEAPON' => pretty_number($sn_data[$Element]['attack']), 'TABINDEX' => $TabIndex, 'MESSAGE' => $unit_message)); } } $template->assign_vars(array('noresearch' => $NoFleetMessage, 'error_msg' => $page_error, 'MODE' => $que_type, 'QUE_ID' => $que_type, 'TIME_NOW' => $time_now)); tpl_assign_hangar($que_type, $planet, $template); display(parsetemplate($template), $lang[$page_mode]); }
function eco_que_add($user, &$planet, $que, $que_id, $unit_id, $unit_amount = 1, $build_mode = BUILD_CREATE) { global $lang, $time_now, $sn_data; $que_types = $sn_data['groups']['ques']; $que_types[QUE_STRUCTURES]['unit_list'] = $sn_data['groups']['build_allow'][$planet['planet_type']]; $que_data =& $que_types[$que_id]; // We do not work with negaitve unit_amounts - hack or cheat if ($unit_amount < 1 || !in_array($unit_id, $que_data['unit_list']) || count($que['que'][$que_id]) >= $que_data['length']) { return $que; } doquery('START TRANSACTION;'); $planet = doquery("SELECT * FROM `{{planets}}` WHERE `id` = {$planet['id']} LIMIT 1 FOR UPDATE;", '', true); if (!eco_can_build_unit($user, $planet, $unit_id) || eco_unit_busy($user, $planet, $que, $unit_id) || $que_id == QUE_STRUCTURES && ($build_mode == BUILD_CREATE && max(0, eco_planet_fields_max($planet) - $planet['field_current'] - $que['amounts'][$que_id]) <= 0 || $build_mode == BUILD_DESTROY && $planet['field_current'] <= $que['amounts'][$que_id])) { doquery('ROLLBACK;'); return $que; } if ($que === false) { $que = array(); } $build_mode = $build_mode == BUILD_CREATE ? 1 : -1; $unit_db_name = $sn_data[$unit_id]['name']; $unit_level = ($planet[$unit_db_name] ? $planet[$unit_db_name] : 0) + $que['in_que'][$unit_id]; $build_data = eco_get_build_data($user, $planet, $unit_id, $unit_level); $unit_level += $build_mode * $unit_amount; if ($build_data['CAN'][$build_mode] >= $unit_amount && $unit_level >= 0) { $unit_time = $build_data[$build_mode][RES_TIME]; $que_item_string = "{$unit_id},{$unit_amount},{$unit_time},{$build_mode},{$que_id};"; $que['que'][$que_id][] = array('ID' => $unit_id, 'AMOUNT' => $unit_amount, 'TIME' => $unit_time, 'TIME_FULL' => $unit_time, 'MODE' => $build_mode, 'NAME' => $lang['tech'][$unit_id], 'QUE' => $que_id, 'STRING' => $que_item_string, 'LEVEL' => $unit_level); $que['in_que'][$unit_id] += $unit_amount * $build_mode; $que['in_que_abs'][$unit_id] += $unit_amount; $que['amounts'][$que_id] += $unit_amount * $build_mode; $que['string'] .= $que_item_string; $que['query'] = "`que` = '{$que['string']}'"; $planet['que'] = $que['string']; foreach ($sn_data['groups']['resources_loot'] as $resource_id) { $resource_db_name = $sn_data[$resource_id]['name']; $resource_change = $build_data[$build_mode][$resource_id] * $unit_amount; $planet[$resource_db_name] -= $resource_change; $que['query'] = "`{$resource_db_name}` = `{$resource_db_name}` - '{$resource_change}',{$que['query']}"; } doquery("UPDATE {{planets}} SET {$que['query']} WHERE `id` = '{$planet['id']}' LIMIT 1;"); } doquery('COMMIT'); return $que; }
function ResearchBuildingPage(&$user, &$planet, $que) { global $config, $sn_data, $lang, $time_now; if (!$planet[$sn_data[31]['name']]) { message($lang['no_laboratory'], $lang['tech'][TECH_TECHNOLOGY]); } $build_planet = !$user['b_tech_planet'] || $user['b_tech_planet'] == $planet['id'] ? $planet : doquery("SELECT * FROM {{planets}} WHERE `id` = {$user['b_tech_planet']} LIMIT 1;", '', true); $message = ''; switch (sys_get_param_str('action')) { case 'clear': case 'trim': $tech_id = $build_planet['b_tech_id']; if ($tech_id) { $build_data = eco_get_build_data($user, $build_planet, $tech_id, $user[$sn_data[$tech_id]['name']]); doquery("UPDATE {{planets}} SET `b_tech_id` = '0', `b_tech` = '0', \r\n `metal` = `metal` + {$build_data[BUILD_CREATE][RES_METAL]}, `crystal` = `crystal` + '{$build_data[BUILD_CREATE][RES_CRYSTAL]}', `deuterium` = `deuterium` + '{$build_data[BUILD_CREATE][RES_DEUTERIUM]}' \r\n WHERE `id` = '{$build_planet['id']}' LIMIT 1;"); doquery("UPDATE {{users}} SET `b_tech_planet` = '0' WHERE `id` = '{$user['id']}' LIMIT 1;"); header("Location: {$_SERVER['PHP_SELF']}?mode=" . QUE_RESEARCH); die; } break; case 'build': $tech_id = sys_get_param_int('tech'); if ($build_planet['b_tech_id']) { $message = $lang['build_research_in_progress']; } elseif (!eco_lab_is_building($que) && in_array($tech_id, $sn_data['groups']['tech']) && eco_can_build_unit($user, $planet, $tech_id) && IsElementBuyable($user, $planet, $tech_id)) { $build_data = eco_get_build_data($user, $planet, $tech_id, $user[$sn_data[$tech_id]['name']]); $build_time_end = $build_data[BUILD_CREATE][RES_TIME] + $time_now; doquery("UPDATE {{planets}} SET `b_tech_id` = '{$tech_id}', `b_tech` = '{$build_time_end}', \r\n `metal` = `metal` - {$build_data[BUILD_CREATE][RES_METAL]}, `crystal` = `crystal` - '{$build_data[BUILD_CREATE][RES_CRYSTAL]}', `deuterium` = `deuterium` - '{$build_data[BUILD_CREATE][RES_DEUTERIUM]}' \r\n WHERE `id` = '{$planet['id']}' LIMIT 1;"); doquery("UPDATE {{users}} SET `b_tech_planet` = '{$planet['id']}' WHERE `id` = '{$user['id']}' LIMIT 1;"); header("Location: {$_SERVER['PHP_SELF']}?mode=" . QUE_RESEARCH); die; } break; } $message = $message ? $message : (eco_lab_is_building($que) ? $lang['labo_on_update'] : ''); $template = gettemplate('buildings_research', true); $fleet_list = flt_get_fleets_to_planet($planet); foreach ($sn_data['groups']['tech'] as $Tech) { if (!eco_can_build_unit($user, $planet, $Tech)) { continue; } $building_level = $user[$sn_data[$Tech]['name']]; $build_data = eco_get_build_data($user, $planet, $Tech, $building_level); $temp[RES_METAL] = floor($planet['metal'] - $build_data[BUILD_CREATE][RES_METAL]); // + $fleet_list['own']['total'][RES_METAL] $temp[RES_CRYSTAL] = floor($planet['crystal'] - $build_data[BUILD_CREATE][RES_CRYSTAL]); // + $fleet_list['own']['total'][RES_CRYSTAL] $temp[RES_DEUTERIUM] = floor($planet['deuterium'] - $build_data[BUILD_CREATE][RES_DEUTERIUM]); // + $fleet_list['own']['total'][RES_DEUTERIUM] $template->assign_block_vars('production', array('ID' => $Tech, 'NAME' => $lang['tech'][$Tech], 'LEVEL' => $building_level, 'LEVEL_NEXT' => $building_level + 1, 'DESCRIPTION' => $lang['info'][$Tech]['description_short'], 'BUILD_CAN' => $build_data['CAN'][BUILD_CREATE], 'TIME' => pretty_time($build_data[BUILD_CREATE][RES_TIME]), 'METAL' => $build_data[BUILD_CREATE][RES_METAL], 'CRYSTAL' => $build_data[BUILD_CREATE][RES_CRYSTAL], 'DEUTERIUM' => $build_data[BUILD_CREATE][RES_DEUTERIUM], 'ENERGY' => $build_data[BUILD_CREATE][RES_ENERGY], 'METAL_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_METAL], true, $planet['metal']), 'CRYSTAL_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_CRYSTAL], true, $planet['crystal']), 'DEUTERIUM_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_DEUTERIUM], true, $planet['deuterium']), 'ENERGY_PRINT' => pretty_number($build_data[BUILD_CREATE][RES_ENERGY], true, $planet['energy_max']), 'METAL_REST' => pretty_number($temp[RES_METAL], true, true), 'CRYSTAL_REST' => pretty_number($temp[RES_CRYSTAL], true, true), 'DEUTERIUM_REST' => pretty_number($temp[RES_DEUTERIUM], true, true), 'METAL_REST_NUM' => $temp[RES_METAL], 'CRYSTAL_REST_NUM' => $temp[RES_CRYSTAL], 'DEUTERIUM_REST_NUM' => $temp[RES_DEUTERIUM], 'METAL_FLEET' => pretty_number($temp[RES_METAL] + $fleet_list['own']['total'][RES_METAL], true, true), 'CRYSTAL_FLEET' => pretty_number($temp[RES_CRYSTAL] + $fleet_list['own']['total'][RES_CRYSTAL], true, true), 'DEUTERIUM_FLEET' => pretty_number($temp[RES_DEUTERIUM] + $fleet_list['own']['total'][RES_DEUTERIUM], true, true), 'BUILD_CAN2' => IsElementBuyable($user, $planet, $Tech) && !eco_lab_is_building($que))); } $que_length = 0; if ($build_planet['b_tech_id']) { $unit_id = $build_planet['b_tech_id']; $unit_data = eco_get_build_data($user, $build_planet, $unit_id, $user[$sn_data[$unit_id]['name']]); $template->assign_block_vars('que', array('ID' => $unit_id, 'QUE' => QUE_RESEARCH, 'NAME' => $lang['tech'][$unit_id], 'TIME' => $build_planet['b_tech'] - $time_now, 'TIME_FULL' => $unit_data[BUILD_CREATE][RES_TIME], 'AMOUNT' => 1, 'LEVEL' => $user[$sn_data[$unit_id]['name']] + 1)); $que_length++; } $template->assign_vars(array('PAGE_HEADER' => $lang['tech'][TECH_TECHNOLOGY], 'MESSAGE' => $message, 'FLEET_OWN_COUNT' => $fleet_list['own']['count'], 'QUE_ID' => QUE_RESEARCH, 'RESEARCH_ONGOING' => $build_planet['b_tech_id'], 'RESEARCH_TECH' => $build_planet['b_tech_id'], 'RESEARCH_TIME' => $build_planet['b_tech'] - $time_now, 'RESEARCH_HOME_ID' => $build_planet['id'], 'RESEARCH_HOME_NAME' => $build_planet['id'] != $planet['id'] ? $build_planet['name'] : '')); display(parsetemplate($template), $lang['tech'][TECH_TECHNOLOGY]); }