Example #1
0
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;
}
Example #3
0
/**
* 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']);
}
Example #4
0
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;
}
Example #5
0
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]);
}
Example #6
0
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;
}
Example #7
0
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]);
}