function db_change_units(&$user, &$planet, $unit_list = array(), $query = null) { $query = is_array($query) ? $query : array(LOC_USER => array(), LOC_PLANET => array()); $group = sn_get_groups('resources_loot'); foreach ($unit_list as $unit_id => $unit_amount) { if (!in_array($unit_id, $group)) { // TODO - remove later print '<h1>СООБЩИТЕ ЭТО АДМИНУ: db_change_units() вызван для не-ресурсов!</h1>'; pdump(debug_backtrace()); die('db_change_units() вызван для не-ресурсов!'); } if (!$unit_amount) { continue; } $unit_db_name = pname_resource_name($unit_id); $unit_location = sys_get_unit_location($user, $planet, $unit_id); // Changing value in object switch ($unit_location) { case LOC_USER: $user[$unit_db_name] += $unit_amount; break; case LOC_PLANET: $planet[$unit_db_name] += $unit_amount; break; } $unit_amount = $unit_amount < 0 ? $unit_amount : "+{$unit_amount}"; // Converting positive unit_amount to string '+unit_amount' $query[$unit_location][$unit_id] = "`{$unit_db_name}`=`{$unit_db_name}`{$unit_amount}"; } db_change_units_perform($query[LOC_USER], 'users', $user['id']); db_change_units_perform($query[LOC_PLANET], 'planets', $planet['id']); }
function int_calc_storage_bar($resource_id) { global $lang, $template, $caps_real, $planetrow, $user; $totalProduction = $caps_real['total'][$resource_id]; $storage_fill = $caps_real['total_storage'][$resource_id] ? floor(mrc_get_level($user, $planetrow, $resource_id) / $caps_real['total_storage'][$resource_id] * 100) : 0; $template->assign_block_vars('resources', array('NAME' => $lang["sys_" . pname_resource_name($resource_id)], 'HOURLY' => pretty_number($totalProduction, true, true), 'WEEKLY' => pretty_number($totalProduction * 24 * 7, true, true), 'DAILY' => pretty_number($totalProduction * 24, true, true), 'MONTHLY' => pretty_number($totalProduction * 24 * 30, true, true), 'STORAGE' => intval($storage_fill), 'BAR' => min($storage_fill, 100))); }
/** * * This function changes rpg_points for user * You should ALWAYS use this function and NEVER directly change rpg_points by yourself * Otherwise refferal system wouldn't work and no logs would be made * "No logs" means you can never check if the user cheating with DM * * @package rpg * */ function rpg_points_change($user_id, $change_type, $dark_matter, $comment = false, $already_changed = false) { global $debug, $config, $dm_change_legit, $user; if (!$user_id) { return false; } $dm_change_legit = true; $sn_data_dark_matter_db_name = pname_resource_name(RES_DARK_MATTER); if ($already_changed) { $rows_affected = 1; } else { $dark_matter_total = $dark_matter > 0 ? $dark_matter : 0; db_user_set_by_id($user_id, "`{$sn_data_dark_matter_db_name}` = `{$sn_data_dark_matter_db_name}` + '{$dark_matter}', `dark_matter_total` = `dark_matter_total` + '{$dark_matter_total}'"); $rows_affected = db_affected_rows(); } if ($rows_affected || !$dark_matter) { $page_url = db_escape($_SERVER['SCRIPT_NAME']); if (is_array($comment)) { $comment = call_user_func_array('sprintf', $comment); } $comment = db_escape($comment); $row = db_user_by_id($user_id, false, 'username'); $row['username'] = db_escape($row['username']); doquery("INSERT INTO {{log_dark_matter}} (`log_dark_matter_username`, `log_dark_matter_reason`,\n `log_dark_matter_amount`, `log_dark_matter_comment`, `log_dark_matter_page`, `log_dark_matter_sender`)\n VALUES (\n '{$row['username']}', {$change_type},\n {$dark_matter}, '{$comment}', '{$page_url}', {$user_id}\n );"); if ($user['id'] == $user_id) { $user['dark_matter'] += $dark_matter; } if ($dark_matter > 0) { $old_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1 FOR UPDATE;", '', true); if ($old_referral['id']) { doquery("UPDATE {{referrals}} SET dark_matter = dark_matter + '{$dark_matter}' WHERE `id` = {$user_id} LIMIT 1;"); $new_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1;", '', true); $partner_bonus = floor($new_referral['dark_matter'] / $config->rpg_bonus_divisor) - ($old_referral['dark_matter'] >= $config->rpg_bonus_minimum ? floor($old_referral['dark_matter'] / $config->rpg_bonus_divisor) : 0); if ($partner_bonus > 0 && $new_referral['dark_matter'] >= $config->rpg_bonus_minimum) { rpg_points_change($new_referral['id_partner'], RPG_REFERRAL, $partner_bonus, "Incoming From Referral ID {$user_id}"); } } } } else { $debug->warning("Error adjusting Dark Matter for player ID {$user_id} (Player Not Found?) with {$dark_matter}. Reason: {$comment}", 'Dark Matter Change', 402); } $dm_change_legit = false; return $rows_affected; }
/** * * This function changes rpg_points for user * You should ALWAYS use this function and NEVER directly change rpg_points by yourself * Otherwise refferal system wouldn't work and no logs would be made * "No logs" means you can never check if the user cheating with DM * * @package rpg * */ function rpg_points_change($user_id, $change_type, $dark_matter, $comment = false, $already_changed = false) { global $debug, $config, $dm_change_legit, $user; if (!$user_id) { return false; } $dm_change_legit = true; $sn_data_dark_matter_db_name = pname_resource_name(RES_DARK_MATTER); if ($already_changed) { $rows_affected = 1; } else { $changeset = array(); $a_user = db_user_by_id($user_id, true); if ($dark_matter < 0) { $dark_matter_exists = mrc_get_level($a_user, null, RES_DARK_MATTER, false, true); $dark_matter_exists < 0 ? $dark_matter_exists = 0 : false; $metamatter_to_reduce = -$dark_matter - $dark_matter_exists; if ($metamatter_to_reduce > 0) { $metamatter_exists = mrc_get_level($a_user, null, RES_METAMATTER); if ($metamatter_exists < $metamatter_to_reduce) { $debug->error('Ошибка снятия ТМ - ММ+ТМ меньше, чем сумма для снятия!', 'Ошибка снятия ТМ', LOG_ERR_INT_NOT_ENOUGH_DARK_MATTER); } if (is_array($comment)) { $comment = call_user_func_array('sprintf', $comment); } // mm_points_change($user_id, $change_type, -$metamatter_to_reduce, 'ММ в ТМ: ' . (-$dark_matter) . ' ТМ = ' . $dark_matter_exists . ' ТМ + ' . $metamatter_to_reduce . ' ММ. ' . $comment); classSupernova::$auth->account->metamatter_change($change_type, -$metamatter_to_reduce, 'ММ в ТМ: ' . -$dark_matter . ' ТМ = ' . $dark_matter_exists . ' ТМ + ' . $metamatter_to_reduce . ' ММ. ' . $comment); $dark_matter = -$dark_matter_exists; } } else { $changeset[] = "`dark_matter_total` = `dark_matter_total` + '{$dark_matter}'"; } $dark_matter ? $changeset[] = "`{$sn_data_dark_matter_db_name}` = `{$sn_data_dark_matter_db_name}` + '{$dark_matter}'" : false; !empty($changeset) ? db_user_set_by_id($user_id, implode(',', $changeset)) : false; $rows_affected = classSupernova::$db->db_affected_rows(); } if ($rows_affected || !$dark_matter) { $page_url = db_escape($_SERVER['SCRIPT_NAME']); if (is_array($comment)) { $comment = call_user_func_array('sprintf', $comment); } $comment = db_escape($comment); $row = db_user_by_id($user_id, false, 'username'); $row['username'] = db_escape($row['username']); doquery("INSERT INTO {{log_dark_matter}} (`log_dark_matter_username`, `log_dark_matter_reason`,\n `log_dark_matter_amount`, `log_dark_matter_comment`, `log_dark_matter_page`, `log_dark_matter_sender`)\n VALUES (\n '{$row['username']}', {$change_type},\n {$dark_matter}, '{$comment}', '{$page_url}', {$user_id}\n );"); if ($user['id'] == $user_id) { $user['dark_matter'] += $dark_matter; } if ($dark_matter > 0) { $old_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1 FOR UPDATE;", '', true); if ($old_referral['id']) { doquery("UPDATE {{referrals}} SET dark_matter = dark_matter + '{$dark_matter}' WHERE `id` = {$user_id} LIMIT 1;"); $new_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1;", '', true); $partner_bonus = floor($new_referral['dark_matter'] / $config->rpg_bonus_divisor) - ($old_referral['dark_matter'] >= $config->rpg_bonus_minimum ? floor($old_referral['dark_matter'] / $config->rpg_bonus_divisor) : 0); if ($partner_bonus > 0 && $new_referral['dark_matter'] >= $config->rpg_bonus_minimum) { rpg_points_change($new_referral['id_partner'], RPG_REFERRAL, $partner_bonus, "Incoming From Referral ID {$user_id}"); } } } } else { $debug->warning("Error adjusting Dark Matter for player ID {$user_id} (Player Not Found?) with {$dark_matter}. Reason: {$comment}", 'Dark Matter Change', 402); } $dm_change_legit = false; return $rows_affected; }
} if (!empty($errors)) { foreach ($errors as $error) { $template->assign_block_vars('error', array('TEXT' => $error)); } } else { $template->assign_var('CHECK', 1); killer_add_planet($planet); $moon = db_planet_by_gspt($galaxy_src, $system_src, $planet_src, PT_MOON, true); if ($moon) { $moon = sys_o_get_updated($owner, $moon, SN_TIME_NOW); $moon = $moon['planet']; killer_add_planet($moon); } foreach (sn_get_groups('resources_loot') as $resource_id) { $resource_name = pname_resource_name($resource_id); $template->assign_var("{$resource_name}_cost", $final_cost[$resource_id]); $final_cost[$resource_id] = floor($final_cost[$resource_id] * $bonus); $template->assign_var("{$resource_name}_bonus", $final_cost[$resource_id]); } if ($_GET['btn_confirm']) { $time = SN_TIME_NOW + PERIOD_DAY; db_unit_list_delete($planet['id_owner'], LOC_PLANET, $planet['id']); db_planet_set_by_id($planet['id'], "id_owner = 0, destruyed = {$time}"); if ($moon) { db_unit_list_delete($planet['id_owner'], LOC_PLANET, $moon['id']); db_planet_set_by_id($moon['id'], "id_owner = 0, destruyed = {$time}"); } db_planet_set_by_id($destination['id'], "metal = metal + '{$final_cost[RES_METAL]}', crystal = crystal + '{$final_cost[RES_CRYSTAL]}', deuterium = deuterium + '{$final_cost[RES_DEUTERIUM]}'"); $template->assign_var('CHECK', 2); }
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; }
function que_build($user, $planet, $build_mode = BUILD_CREATE, $redirect = true) { global $lang, $config; $is_autoconvert = false; if ($build_mode == BUILD_AUTOCONVERT || sys_get_param_int('auto_convert')) { $build_mode = BUILD_CREATE; $is_autoconvert = true; } $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]; // 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); $exchange = array(); $market_get_autoconvert_cost = market_get_autoconvert_cost(); if ($is_autoconvert && $build_data[BUILD_AUTOCONVERT]) { $dark_matter = mrc_get_level($user, null, RES_DARK_MATTER); if (mrc_get_level($user, null, RES_DARK_MATTER) < $market_get_autoconvert_cost) { throw new exception("{Нет хватает " . ($market_get_autoconvert_cost - $dark_matter) . "ТМ на постройки с автоконвертацией ресурсов}", ERR_ERROR); // TODO EXCEPTION } !get_unit_param($unit_id, P_STACKABLE) ? $unit_amount = 1 : false; $resources_loot = sn_get_groups('resources_loot'); $resource_got = array(); $resource_exchange_rates = array(); $resource_diff = array(); $all_positive = true; foreach ($resources_loot as $resource_id) { $resource_db_name = pname_resource_name($resource_id); $resource_got[$resource_id] = floor(mrc_get_level($user, $planet, $resource_id)); $resource_exchange_rates[$resource_id] = $config->__get("rpg_exchange_{$resource_db_name}"); $resource_diff[$resource_id] = $resource_got[$resource_id] - $build_data[BUILD_CREATE][$resource_id] * $unit_amount; $all_positive = $all_positive && $resource_diff[$resource_id] > 0; } // Нужна автоконвертация if ($all_positive) { $is_autoconvert = false; } else { foreach ($resource_diff as $resource_diff_id => &$resource_diff_amount) { if ($resource_diff_amount >= 0) { continue; } foreach ($resource_diff as $resource_got_id => &$resource_got_amount) { if ($resource_got_amount <= 0) { continue; } $current_exchange = $resource_exchange_rates[$resource_got_id] / $resource_exchange_rates[$resource_diff_id]; $will_exchage_to = min(-$resource_diff_amount, floor($resource_got_amount * $current_exchange)); $will_exchage_from = $will_exchage_to / $current_exchange; $resource_diff_amount += $will_exchage_to; $resource_got_amount -= $will_exchage_from; $exchange[$resource_diff_id] += $will_exchage_to; $exchange[$resource_got_id] -= $will_exchage_from; } } $is_autoconvert_ok = true; foreach ($resource_diff as $resource_diff_amount2) { if ($resource_diff_amount2 < 0) { $is_autoconvert_ok = false; break; } } if ($is_autoconvert_ok) { $build_data['RESULT'][$build_mode] = BUILD_ALLOWED; $build_data['CAN'][$build_mode] = $unit_amount; } else { $unit_amount = 0; } } } $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 } if ($is_autoconvert) { ksort($exchange); ksort($resource_got); db_change_units($user, $planet, array(RES_METAL => !empty($exchange[RES_METAL]) ? $exchange[RES_METAL] : 0, RES_CRYSTAL => !empty($exchange[RES_CRYSTAL]) ? $exchange[RES_CRYSTAL] : 0, RES_DEUTERIUM => !empty($exchange[RES_DEUTERIUM]) ? $exchange[RES_DEUTERIUM] : 0)); rpg_points_change($user['id'], RPG_BUILD_AUTOCONVERT, -$market_get_autoconvert_cost, sprintf($lang['bld_autoconvert'], $unit_id, $unit_amount, uni_render_planet_full($planet, '', false, true), $lang['tech'][$unit_id], sys_unit_arr2str($build_data[BUILD_CREATE]), sys_unit_arr2str($resource_got), sys_unit_arr2str($exchange))); } $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; } 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] . ']'; } return $operation_result; }
function flt_t_send_fleet($user, &$from, $to, $fleet, $mission, $options = array()) { //ini_set('error_reporting', E_ALL); $internal_transaction = !sn_db_transaction_check(false) ? sn_db_transaction_start() : false; //pdump($internal_transaction); // TODO Потенциальный дедлок - если успела залочится запись пользователя - хозяина планеты $user = db_user_by_id($user['id'], true); $from = sys_o_get_updated($user, $from['id'], SN_TIME_NOW); $from = $from['planet']; $can_attack = flt_can_attack($from, $to, $fleet, $mission, $options); if ($can_attack != ATTACK_ALLOWED) { $internal_transaction ? sn_db_transaction_rollback() : false; return $can_attack; } $fleet_group = isset($options['fleet_group']) ? floatval($options['fleet_group']) : 0; $travel_data = flt_travel_data($user, $from, $to, $fleet, $options['fleet_speed_percent']); $fleet_start_time = SN_TIME_NOW + $travel_data['duration']; if ($mission == MT_EXPLORE || $mission == MT_HOLD) { $stay_duration = $options['stay_time'] * 3600; $stay_time = $fleet_start_time + $stay_duration; } else { $stay_duration = 0; $stay_time = 0; } $fleet_end_time = $fleet_start_time + $travel_data['duration'] + $stay_duration; $fleet_ship_count = 0; $fleet_string = ''; $db_changeset = array(); $planet_fields = array(); foreach ($fleet as $unit_id => $amount) { if (!$amount || !$unit_id) { continue; } if (in_array($unit_id, sn_get_groups('fleet'))) { $fleet_ship_count += $amount; $fleet_string .= "{$unit_id},{$amount};"; $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, -$amount, $user, $from['id']); } elseif (in_array($unit_id, sn_get_groups('resources_loot'))) { $planet_fields[pname_resource_name($unit_id)]['delta'] -= $amount; } } $to['id_owner'] = intval($to['id_owner']); $QryInsertFleet = "INSERT INTO {{fleets}} SET "; $QryInsertFleet .= "`fleet_owner` = '{$user['id']}', "; $QryInsertFleet .= "`fleet_mission` = '{$mission}', "; $QryInsertFleet .= "`fleet_amount` = '{$fleet_ship_count}', "; $QryInsertFleet .= "`fleet_array` = '{$fleet_string}', "; $QryInsertFleet .= "`fleet_start_time` = '{$fleet_start_time}', "; if ($from['id']) { $QryInsertFleet .= "`fleet_start_planet_id` = '{$from['id']}', "; } $QryInsertFleet .= "`fleet_start_galaxy` = '{$from['galaxy']}', "; $QryInsertFleet .= "`fleet_start_system` = '{$from['system']}', "; $QryInsertFleet .= "`fleet_start_planet` = '{$from['planet']}', "; $QryInsertFleet .= "`fleet_start_type` = '{$from['planet_type']}', "; $QryInsertFleet .= "`fleet_end_time` = '{$fleet_end_time}', "; $QryInsertFleet .= "`fleet_end_stay` = '{$stay_time}', "; if ($to['id']) { $QryInsertFleet .= "`fleet_end_planet_id` = '{$to['id']}', "; } $QryInsertFleet .= "`fleet_end_galaxy` = '{$to['galaxy']}', "; $QryInsertFleet .= "`fleet_end_system` = '{$to['system']}', "; $QryInsertFleet .= "`fleet_end_planet` = '{$to['planet']}', "; $QryInsertFleet .= "`fleet_end_type` = '{$to['planet_type']}', "; $QryInsertFleet .= "`fleet_resource_metal` = " . floatval($fleet[RES_METAL]) . ", "; $QryInsertFleet .= "`fleet_resource_crystal` = " . floatval($fleet[RES_CRYSTAL]) . ", "; $QryInsertFleet .= "`fleet_resource_deuterium` = " . floatval($fleet[RES_DEUTERIUM]) . ", "; $QryInsertFleet .= "`fleet_target_owner` = '{$to['id_owner']}', "; $QryInsertFleet .= "`fleet_group` = '{$fleet_group}', "; $QryInsertFleet .= "`start_time` = " . SN_TIME_NOW . ";"; doquery($QryInsertFleet); $planet_fields[pname_resource_name(RES_DEUTERIUM)]['delta'] -= $travel_data['consumption']; $db_changeset['planets'][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array('id' => $from['id']), 'fields' => $planet_fields); db_changeset_apply($db_changeset); $internal_transaction ? sn_db_transaction_commit() : false; $from = db_planet_by_id($from['id']); return ATTACK_ALLOWED; //ini_set('error_reporting', E_ALL ^ E_NOTICE); }
function qst_reward(&$user, &$rewards, &$quest_list) { if (empty($rewards)) { return; } global $lang; $db_changeset = array(); $total_rewards = array(); $comment_dm = ''; foreach ($rewards as $quest_id => $user_data) { foreach ($user_data as $user_id => $planet_data) { foreach ($planet_data as $planet_id => $reward_list) { $comment = sprintf($lang['qst_msg_complete_body'], $quest_list[$quest_id]['quest_name']); $comment_dm .= isset($reward_list[RES_DARK_MATTER]) ? $comment : ''; $comment_reward = array(); foreach ($reward_list as $unit_id => $unit_amount) { $comment_reward[] = $unit_amount . ' ' . $lang['tech'][$unit_id]; $total_rewards[$user_id][$planet_id][$unit_id] += $unit_amount; } $comment .= " {$lang['qst_msg_your_reward']} " . implode(',', $comment_reward); msg_send_simple_message($user['id'], 0, SN_TIME_NOW, MSG_TYPE_ADMIN, $lang['msg_from_admin'], $lang['qst_msg_complete_subject'], $comment); sn_db_perform('{{quest_status}}', array('quest_status_quest_id' => $quest_id, 'quest_status_user_id' => $user_id, 'quest_status_status' => QUEST_STATUS_COMPLETE)); } } } $group_resources = sn_get_groups('resources_loot'); $quest_rewards_allowed = sn_get_groups('quest_rewards'); if (!empty($total_rewards)) { foreach ($total_rewards as $user_id => $planet_data) { $user_row = classSupernova::db_get_record_by_id(LOC_USER, $user_id); foreach ($planet_data as $planet_id => $unit_data) { $local_changeset = array(); foreach ($unit_data as $unit_id => $unit_amount) { if (!isset($quest_rewards_allowed[$unit_id])) { continue; } if ($unit_id == RES_DARK_MATTER) { rpg_points_change($user['id'], RPG_QUEST, $unit_amount, $comment_dm); } elseif (isset($group_resources[$unit_id])) { $local_changeset[pname_resource_name($unit_id)] = array('delta' => $unit_amount); } else { $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, $unit_amount, $user_row, $planet_id); } // unit } if (!empty($local_changeset)) { $planet_id = $planet_id == 0 && isset($user_row['id_planet']) ? $user_row['id_planet'] : $planet_id; $db_changeset[$planet_id ? 'planets' : 'users'][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array("id" => $planet_id ? $planet_id : $user_id), 'fields' => $local_changeset); } } } classSupernova::db_changeset_apply($db_changeset); } }
function sn_ube_combat_result_apply(&$combat_data) { // TODO: Поменять все отладки на запросы $destination_user_id = $combat_data[UBE_FLEETS][0][UBE_OWNER]; $outcome =& $combat_data[UBE_OUTCOME]; $planet_info =& $outcome[UBE_PLANET]; $planet_id = $planet_info[PLANET_ID]; // Обновляем поле обломков на планете if (!$combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] && !empty($outcome[UBE_DEBRIS])) { db_planet_set_by_gspt($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], PT_PLANET, "`debris_metal` = `debris_metal` + " . floor($outcome[UBE_DEBRIS][RES_METAL]) . ", `debris_crystal` = `debris_crystal` + " . floor($outcome[UBE_DEBRIS][RES_CRYSTAL])); } $db_save = array(UBE_FLEET_GROUP => array()); $fleets_outcome =& $outcome[UBE_FLEETS]; foreach ($combat_data[UBE_FLEETS] as $fleet_id => &$fleet_info) { if ($fleet_info[UBE_FLEET_GROUP]) { $db_save[UBE_FLEET_GROUP][$fleet_info[UBE_FLEET_GROUP]] = $fleet_info[UBE_FLEET_GROUP]; } $fleet_info[UBE_COUNT] = $fleet_info[UBE_COUNT] ? $fleet_info[UBE_COUNT] : array(); $fleets_outcome[$fleet_id][UBE_UNITS_LOST] = $fleets_outcome[$fleet_id][UBE_UNITS_LOST] ? $fleets_outcome[$fleet_id][UBE_UNITS_LOST] : array(); $fleet_query = array(); $db_changeset = array(); $old_fleet_count = array_sum($fleet_info[UBE_COUNT]); $new_fleet_count = $old_fleet_count - array_sum($fleets_outcome[$fleet_id][UBE_UNITS_LOST]); // Перебираем юниты если во время боя количество юнитов изменилось и при этом во флоту остались юниты или это планета if ($new_fleet_count != $old_fleet_count && (!$fleet_id || $new_fleet_count)) { // Просматриваем результаты изменения флотов foreach ($fleet_info[UBE_COUNT] as $unit_id => $unit_count) { // Перебираем аутком на случай восстановления юнитов $units_lost = (double) $fleets_outcome[$fleet_id][UBE_UNITS_LOST][$unit_id]; $units_left = $unit_count - $units_lost; if ($fleet_id) { // Не планета - всегда сразу записываем строку итогов флота $fleet_query[$unit_id] = "{$unit_id},{$units_left}"; } elseif ($units_lost) { // Планета - записываем в ИД юнита его потери только если есть потери // $unit_db_name = get_unit_param($unit_id, P_NAME); // $fleet_query[$unit_id] = "`{$unit_db_name}` = `{$unit_db_name}` - {$units_lost}"; // pdump($fleet_info); // die(); $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, -$units_lost, $combat_data[UBE_PLAYERS][$destination_user_id][UBE_PLAYER_DATA], $planet_id); } } if ($fleet_id) { // Для флотов перегенерируем массив как одно вхождение в SET SQL-запроса $fleet_query = implode(';', $fleet_query); $fleet_query = array("`fleet_array` = '{$fleet_query}'"); } } // Если во флоте остались юниты или это планета - генерируем изменение ресурсов if ($new_fleet_count || !$fleet_id) { foreach (sn_get_groups('resources_loot') as $resource_id) { $resource_change = (double) $fleets_outcome[$fleet_id][UBE_RESOURCES_LOOTED][$resource_id] + (double) $fleets_outcome[$fleet_id][UBE_CARGO_DROPPED][$resource_id]; if ($resource_change) { $resource_db_name = ($fleet_id ? 'fleet_resource_' : '') . pname_resource_name($resource_id); $fleet_query[] = "`{$resource_db_name}` = `{$resource_db_name}` - ({$resource_change})"; } } } /* if(empty($fleet_query)) { continue; } */ if ($fleet_id && $new_fleet_count) { // Если защитник и не РМФ - отправляем флот назад if ($fleet_info[UBE_FLEET_TYPE] == UBE_DEFENDERS && !$outcome[UBE_SFR] || $fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS) { $fleet_query[] = '`fleet_mess` = 1'; } // Если флот в группе - помечаем нулем // if($fleet_info[UBE_FLEET_GROUP]) // { // $fleet_query[] = '`fleet_group` = 0'; // } } //global $debug; $fleet_query = implode(',', $fleet_query); if ($fleet_id) { if ($fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS && $outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_DIED) { $new_fleet_count = 0; } if ($new_fleet_count) { if ($fleet_query) { doquery("UPDATE {{fleets}} SET {$fleet_query}, `fleet_amount` = '{$new_fleet_count}' WHERE `fleet_id` = {$fleet_id} LIMIT 1"); } } else { // Удаляем пустые флоты doquery("DELETE FROM {{fleets}} WHERE `fleet_id` = {$fleet_id} LIMIT 1"); db_unit_list_delete(0, LOC_FLEET, $fleet_id, 0); } } else { // Сохраняем изменения ресурсов - если они есть if ($fleet_query) { db_planet_set_by_id($planet_id, $fleet_query); } if (!empty($db_changeset)) { db_changeset_apply($db_changeset); } } } // TODO: Связать сабы с флотами констраинтами ON DELETE SET NULL // $db_save[UBE_FLEET_GROUP][$fleet_info[UBE_FLEET_GROUP]] = $fleet_info[UBE_FLEET_GROUP]; if (!empty($db_save[UBE_FLEET_GROUP])) { $db_save[UBE_FLEET_GROUP] = implode(',', $db_save[UBE_FLEET_GROUP]); doquery("DELETE FROM {{aks}} WHERE `id` IN ({$db_save[UBE_FLEET_GROUP]})"); } if ($outcome[UBE_MOON] == UBE_MOON_CREATE_SUCCESS) { $moon_row = uni_create_moon($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], $destination_user_id, $outcome[UBE_MOON_SIZE], '', false); $outcome[UBE_MOON_NAME] = $moon_row['name']; unset($moon_row); } elseif ($outcome[UBE_MOON] == UBE_MOON_DESTROY_SUCCESS) { db_planet_delete_by_id($planet_id); } $bashing_list = array(); foreach ($combat_data[UBE_PLAYERS] as $player_id => $player_info) { if ($player_info[UBE_ATTACKER]) { if ($outcome[UBE_MOON] != UBE_MOON_DESTROY_SUCCESS) { $bashing_list[] = "({$player_id}, {$planet_id}, {$combat_data[UBE_TIME]})"; } if ($combat_data[UBE_OPTIONS][UBE_MISSION_TYPE] == MT_ATTACK && $combat_data[UBE_OPTIONS][UBE_DEFENDER_ACTIVE]) { $str_loose_or_win = $outcome[UBE_COMBAT_RESULT] == UBE_COMBAT_RESULT_WIN ? 'raidswin' : 'raidsloose'; db_user_set_by_id($player_id, "`xpraid` = `xpraid` + 1, `raids` = `raids` + 1, `{$str_loose_or_win}` = `{$str_loose_or_win}` + 1"); } } } $bashing_list = implode(',', $bashing_list); if ($bashing_list) { doquery("INSERT INTO {{bashing}} (bashing_user_id, bashing_planet_id, bashing_time) VALUES {$bashing_list};"); } }
function sn_sys_sector_buy($redirect = 'overview.php') { global $lang, $user, $planetrow; if (!sys_get_param_str('sector_buy') || $planetrow['planet_type'] != PT_PLANET) { return; } sn_db_transaction_start(); $user = db_user_by_id($user['id'], true, '*'); $planetrow = db_planet_by_id($planetrow['id'], true, '*'); // Тут не надо делать обсчет - ресурсы мы уже посчитали, очередь (и количество зданий) - тоже // $planetrow = sys_o_get_updated($user, $planetrow, SN_TIME_NOW); // $user = $planetrow['user']; // $planetrow = $planetrow['planet']; $sector_cost = eco_get_build_data($user, $planetrow, UNIT_SECTOR, mrc_get_level($user, $planetrow, UNIT_SECTOR), true); $sector_cost = $sector_cost[BUILD_CREATE][RES_DARK_MATTER]; if ($sector_cost <= $user[get_unit_param(RES_DARK_MATTER, P_NAME)]) { $planet_name_text = uni_render_planet($planetrow); if (rpg_points_change($user['id'], RPG_SECTOR, -$sector_cost, sprintf($lang['sys_sector_purchase_log'], $user['username'], $user['id'], $planet_name_text, $lang['sys_planet_type'][$planetrow['planet_type']], $planetrow['id'], $sector_cost))) { $sector_db_name = pname_resource_name(UNIT_SECTOR); db_planet_set_by_id($planetrow['id'], "{$sector_db_name} = {$sector_db_name} + 1"); } else { sn_db_transaction_rollback(); } } sn_db_transaction_commit(); sys_redirect($redirect); }
function sys_o_get_updated($user, $planet, $UpdateTime, $simulation = false, $no_user_update = false) { sn_db_transaction_check(true); $no_data = array('user' => false, 'planet' => false, 'que' => false); if (!$planet) { return $no_data; } if (!$no_user_update) { $user = intval(is_array($user) && $user['id'] ? $user['id'] : $user); if (!$user) { // TODO - Убрать позже print '<h1>СООБЩИТЕ ЭТО АДМИНУ: sys_o_get_updated() - USER пустой!</h1>'; $backtrace = debug_backtrace(); array_shift($backtrace); pdump($backtrace); die; } $user = db_user_by_id($user, !$simulation, '*', true); } if (empty($user['id'])) { return $no_data; } if (is_array($planet) && isset($planet['galaxy']) && $planet['galaxy']) { $planet = db_planet_by_vector($planet, '', !$simulation); } else { $planet = intval(is_array($planet) && isset($planet['id']) ? $planet['id'] : $planet); $planet = db_planet_by_id($planet, !$simulation); } if (!is_array($planet) || !isset($planet['id'])) { return $no_data; } $que = que_process($user, $planet, $UpdateTime); $ProductionTime = max(0, $UpdateTime - $planet['last_update']); $planet['prev_update'] = $planet['last_update']; $planet['last_update'] += $ProductionTime; /* $que = eco_que_process($user, $planet, $ProductionTime); $hangar_built = $ProductionTime && !$simulation ? eco_bld_que_hangar($user, $planet, $ProductionTime) : array(); */ // TODO ЭТО НАДО ДЕЛАТЬ ТОЛЬКО ПРИ СПЕЦУСЛОВИЯХ $caps_real = eco_get_planet_caps($user, $planet, $ProductionTime); $resources_increase = array(RES_METAL => 0, RES_CRYSTAL => 0, RES_DEUTERIUM => 0); switch ($planet['planet_type']) { case PT_PLANET: foreach ($resources_increase as $resource_id => &$increment) { $resource_name = pname_resource_name($resource_id); $increment = $caps_real['total'][$resource_id] * $ProductionTime / 3600; $store_free = $caps_real['total_storage'][$resource_id] - $planet[$resource_name]; $increment = min($increment, max(0, $store_free)); if ($planet[$resource_name] + $increment < 0 && !$simulation) { global $debug; $debug->warning("Player ID {$user['id']} have negative resources on ID {$planet['id']}.{$planet['planet_type']} [{$planet['galaxy']}:{$planet['system']}:{$planet['planet']}]. Difference {$planet[$resource_name]} of {$resource_name}", 'Negative Resources', 501); } $planet[$resource_name] += $increment; $planet[$resource_name . '_perhour'] = $caps_real['total'][$resource_id]; } break; case PT_MOON: default: $planet['metal_perhour'] = 0; $planet['crystal_perhour'] = 0; $planet['deuterium_perhour'] = 0; $planet['energy_used'] = 0; $planet['energy_max'] = 0; break; } // TODO пересчитывать размер планеты только при постройке чего-нибудь и при покупке сектора $planet['field_current'] = 0; $sn_group_build_allow = sn_get_groups('build_allow'); if (is_array($sn_group_build_allow[$planet['planet_type']])) { foreach ($sn_group_build_allow[$planet['planet_type']] as $building_id) { $planet['field_current'] += mrc_get_level($user, $planet, $building_id, !$simulation, true); } } if ($simulation) { return array('user' => $user, 'planet' => $planet, 'que' => $que); } db_planet_set_by_id($planet['id'], "`last_update` = '{$planet['last_update']}', `field_current` = {$planet['field_current']},\n `metal` = `metal` + '{$resources_increase[RES_METAL]}', `crystal` = `crystal` + '{$resources_increase[RES_CRYSTAL]}', `deuterium` = `deuterium` + '{$resources_increase[RES_DEUTERIUM]}',\n `metal_perhour` = '{$planet['metal_perhour']}', `crystal_perhour` = '{$planet['crystal_perhour']}', `deuterium_perhour` = '{$planet['deuterium_perhour']}',\n `energy_used` = '{$planet['energy_used']}', `energy_max` = '{$planet['energy_max']}'"); return array('user' => $user, 'planet' => $planet, 'que' => $que); }