function sn_user_birthday_celebrate()
{
    global $config, $lang;
    sn_db_transaction_start();
    $query = db_user_list_to_celebrate($config->user_birthday_range);
    while ($row = db_fetch($query)) {
        $row['username'] = db_escape($row['username']);
        rpg_points_change($row['id'], RPG_BIRTHDAY, $config->user_birthday_gift, "Birthday gift for user {$row['username']} ID {$row['id']} on his birthday on {$row['user_birthday']}. Gift last gaved at {$row['user_birthday_celebrated']}");
        db_user_set_by_id($row['id'], "`user_birthday_celebrated` = '{$row['current_birthday']}'");
        msg_send_simple_message($row['id'], 0, SN_TIME_NOW, MSG_TYPE_ADMIN, $lang['sys_administration'], $lang['sys_birthday'], sprintf($lang['sys_birthday_message'], $row['username'], $row['current_birthday'], $config->user_birthday_gift, $lang['sys_dark_matter_sh']), true, true);
    }
    $config->db_saveItem('user_birthday_celebrate', SN_TIME_NOW);
    sn_db_transaction_commit();
}
Example #2
0
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;
}
Example #3
0
        */
        if (sys_get_param_str('prize_calculate') && $blitz_prize_players_active && ($blitz_prize_dark_matter_actual = sys_get_param_int('blitz_prize_dark_matter'))) {
            // $blitz_prize_dark_matter_actual = sys_get_param_int('blitz_prize_dark_matter');
            $blitz_prize_places_actual = sys_get_param_int('blitz_prize_places');
            sn_db_transaction_start();
            $query = doquery("SELECT * FROM {{blitz_registrations}} WHERE `round_number` = {$current_round} ORDER BY `blitz_place` FOR UPDATE;");
            while ($row = db_fetch($query)) {
                if (!$row['blitz_place']) {
                    continue;
                }
                $blitz_prize_dark_matter_actual = round($blitz_prize_dark_matter_actual / 2);
                $blitz_prize_places_actual--;
                $reward = $blitz_prize_dark_matter_actual - $row['blitz_reward_dark_matter'];
                pdump("{{$row['id']}} {$row['blitz_name']}, Place {$row['blitz_place']}, Prize places {$blitz_prize_places_actual}, Prize {$reward}", $row['id']);
                if ($reward) {
                    rpg_points_change($row['user_id'], RPG_BLITZ, $reward, sprintf($lang['sys_blitz_reward_log_message'], $row['blitz_place'], $row['blitz_name']));
                    doquery("UPDATE {{blitz_registrations}} SET blitz_reward_dark_matter = blitz_reward_dark_matter + ({$reward}) WHERE id = {$row['id']} AND `round_number` = {$current_round};");
                }
                if (!$blitz_prize_places_actual || $blitz_prize_dark_matter_actual < 1000) {
                    break;
                }
            }
            sn_db_transaction_commit();
        }
    }
}
$template = gettemplate('blitz_register', true);
$player_registered = false;
$query = doquery("SELECT u.*, br.blitz_name, br.blitz_password, br.blitz_place, br.blitz_status, br.blitz_points, br.blitz_reward_dark_matter\n    FROM {{blitz_registrations}} AS br\n    JOIN {{users}} AS u ON u.id = br.user_id\n  WHERE br.`round_number` = {$current_round}\n  order by `blitz_place`, `timestamp`;");
while ($row = db_fetch($query)) {
    $tpl_player_data = array('NAME' => player_nick_render_to_html($row, array('icons' => true, 'color' => true, 'ally' => true)));
Example #4
0
    }
    $uni_row = doquery("select * from `{{universe}}` where `universe_galaxy` = {$uni_galaxy} and `universe_system` = {$uni_system} limit 1;", '', true);
    $uni_row['universe_price'] += $uni_system ? $config->uni_price_system : $config->uni_price_galaxy;
    $uni_row['universe_name'] = strip_tags($uni_row['universe_name'] ? $uni_row['universe_name'] : ($uni_system ? "{$lang['sys_system']} [{$uni_galaxy}:{$uni_system}]" : "{$lang['sys_galaxy']} {$uni_galaxy}"));
    if (sys_get_param_str('uni_name_submit')) {
        $uni_row['universe_name'] = strip_tags(sys_get_param_str('uni_name'));
        $uni_price = sys_get_param_float('uni_price');
        if ($uni_price < $uni_row['universe_price']) {
            throw new exception($lang['uni_msg_error_low_price'], ERR_ERROR);
        }
        $uni_row['universe_price'] = $uni_price;
        sn_db_transaction_start();
        $user = db_user_by_id($user['id'], true);
        // if($user[get_unit_param(RES_DARK_MATTER, P_NAME)] < $uni_price)
        if (mrc_get_level($user, null, RES_DARK_MATTER) < $uni_price) {
            throw new exception($lang['uni_msg_error_no_dm'], ERR_ERROR);
        }
        if (!rpg_points_change($user['id'], RPG_RENAME, -$uni_price, "Renaming [{$uni_galaxy}:{$uni_system}] to " . sys_get_param_str_unsafe('uni_name'))) {
            throw new exception($lang['sys_msg_err_update_dm'], ERR_ERROR);
        }
        doquery("replace {{universe}} set `universe_galaxy` = {$uni_galaxy}, `universe_system` = {$uni_system}, `universe_name` = '{$uni_row['universe_name']}', `universe_price` = {$uni_row['universe_price']};");
        $debug->warning(sprintf($lang['uni_msg_admin_rename'], $user['id'], $user['username'], $uni_price, $uni_system ? $lang['uni_system_of'] : $lang['uni_galaxy_of'], $uni_galaxy, $uni_system ? ":{$uni_system}" : '', strip_tags(sys_get_param_str_unsafe('uni_name'))), $lang['uni_naming'], LOG_INFO_UNI_RENAME);
        sn_db_transaction_commit();
        sys_redirect("galaxy.php?mode=name&galaxy={$uni_galaxy}&system={$uni_system}");
    }
} catch (exception $e) {
    sn_db_transaction_rollback();
    $template->assign_block_vars('result', array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage()));
}
$template->assign_vars(array('GALAXY' => $uni_galaxy, 'SYSTEM' => $uni_system, 'NAME' => sys_safe_output($uni_row['universe_name']), 'PRICE' => $uni_row['universe_price'], 'PAGE_HINT' => $lang['uni_name_page_hint']));
display($template, $lang['sys_universe'] . ' - ' . $lang['uni_naming'], true, '', false);
Example #5
0
// Конвертация ММ в ТМ
if (sys_get_param('mm_convert_do')) {
    try {
        if (!($mm_convert = sys_get_param_id('mm_convert'))) {
            throw new exception($lang['pay_msg_mm_convert_wrong_amount'], ERR_ERROR);
        }
        sn_db_transaction_start();
        $user = db_user_by_id($user['id'], true);
        if ($mm_convert > mrc_get_level($user, null, RES_METAMATTER)) {
            throw new exception($lang['pay_msg_mm_convert_not_enough'], ERR_ERROR);
        }
        $payment_comment = sprintf("Игрок сконвертировал %d Метаматерии в Тёмную Материю", $mm_convert);
        if (!mm_points_change($user['id'], RPG_CONVERT_MM, -$mm_convert, $payment_comment)) {
            throw new exception($lang['pay_msg_mm_convert_mm_error'], ERR_ERROR);
        }
        if (!rpg_points_change($user['id'], RPG_CONVERT_MM, $mm_convert, $payment_comment)) {
            throw new exception($lang['pay_msg_mm_convert_dm_error'], ERR_ERROR);
        }
        $template->assign_block_vars('result', array('STATUS' => ERR_NONE, 'MESSAGE' => sprintf('Конвертация %1$s единиц Метаматерии в %1$s единиц Тёмной Материи успешно произведена', pretty_number($mm_convert))));
        sn_db_transaction_commit();
    } catch (exception $e) {
        sn_db_transaction_rollback();
        $template->assign_block_vars('result', $response = array('STATUS' => $e->getCode(), 'MESSAGE' => $e->getMessage()));
    }
}
// Таблица скидок
$prev_discount = 0;
if (isset(sn_module_payment::$bonus_table) && is_array(sn_module_payment::$bonus_table)) {
    foreach (sn_module_payment::$bonus_table as $sum => $discount) {
        if ($discount && $discount != $prev_discount) {
            $template->assign_block_vars('discount', array('SUM' => $sum, 'DISCOUNT' => $discount * 100, 'DISCOUNT_ONE' => 1 + $discount, 'TEXT' => sprintf($lang['pay_mm_bonus_each'], pretty_number($sum), round($discount * 100))));
Example #6
0
 } elseif (($hire = sys_get_param_int('hire')) && in_array($hire, sn_get_groups('governors')) && (!get_unit_param($hire, P_MAX_STACK) || $planetrow['PLANET_GOVERNOR_ID'] != $hire || $planetrow['PLANET_GOVERNOR_ID'] == $hire && $planetrow['PLANET_GOVERNOR_LEVEL'] < get_unit_param($hire, P_MAX_STACK))) {
     sn_db_transaction_start();
     $user = db_user_by_id($user['id'], true);
     $planetrow = db_planet_by_id($planetrow['id'], true);
     $build_data = eco_get_build_data($user, $planetrow, $hire, $planetrow['PLANET_GOVERNOR_ID'] == $hire ? $planetrow['PLANET_GOVERNOR_LEVEL'] : 0);
     if ($build_data['CAN'][BUILD_CREATE]) {
         if ($planetrow['PLANET_GOVERNOR_ID'] == $hire) {
             $planetrow['PLANET_GOVERNOR_LEVEL']++;
             $query = '`PLANET_GOVERNOR_LEVEL` + 1';
         } else {
             $planetrow['PLANET_GOVERNOR_LEVEL'] = 1;
             $planetrow['PLANET_GOVERNOR_ID'] = $hire;
             $query = '1';
         }
         db_planet_set_by_id($planetrow['id'], "`PLANET_GOVERNOR_ID` = {$hire}, `PLANET_GOVERNOR_LEVEL` = {$query}");
         rpg_points_change($user['id'], RPG_GOVERNOR, -$build_data[BUILD_CREATE][RES_DARK_MATTER], sprintf($lang['ov_governor_purchase'], $lang['tech'][$hire], $hire, $planetrow['PLANET_GOVERNOR_LEVEL'], uni_render_planet_full($planetrow, '', false, true)));
         //  => 'Игрок купил Губернатора %1$s ID %2$d уровня %3$d на планету %4$s',
         // die();
     }
     sn_db_transaction_commit();
     sys_redirect('overview.php?mode=manage');
     die;
 }
 lng_include('mrc_mercenary');
 int_planet_pretemplate($planetrow, $template);
 foreach (sn_get_groups('governors') as $governor_id) {
     if ($planetrow['planet_type'] == PT_MOON && $governor_id == MRC_TECHNOLOGIST) {
         continue;
     }
     $governor_level = $planetrow['PLANET_GOVERNOR_ID'] == $governor_id ? $planetrow['PLANET_GOVERNOR_LEVEL'] : 0;
     $build_data = eco_get_build_data($user, $planetrow, $governor_id, $governor_level);
if ($user['authlevel'] < 3) {
    AdminMessage($lang['adm_err_denied']);
}
$template = gettemplate("admin/admin_darkmatter", true);
$message = '';
$message_status = ERR_ERROR;
if ($points = sys_get_param_float('points')) {
    // If points not empty...
    if ($username = sys_get_param_str_unsafe('id_user')) {
        $row = db_user_by_id($username, false, 'id, username', true, true);
        if (!isset($row['id'])) {
            $row = db_user_by_username($username, false, 'id, username', true, true);
        }
        if (is_array($row) && isset($row['id'])) {
            // Does anything post to DB?
            if (rpg_points_change($row['id'], RPG_ADMIN, $points, sprintf($lang['adm_matter_change_log_record'], $row['id'], db_escape($row['username']), $user['id'], db_escape($user['username']), db_escape(sys_get_param_str('reason'))))) {
                $message = sprintf($lang['adm_dm_user_added'], $row['username'], $row['id'], $points);
                $isNoError = true;
                $message_status = ERR_NONE;
            } else {
                // No? We will say it to user...
                $message = $lang['adm_dm_add_err'];
            }
        }
    } else {
        // Points not empty but destination is not set - this means error
        $message = $lang['adm_dm_no_dest'];
    }
} elseif ($id_user) {
    // Points is empty but destination is set - this again means error
    $message = $lang['adm_dm_no_quant'];
Example #8
0
function sn_sys_planet_core_transmute(&$user, &$planetrow)
{
    if (!sys_get_param_str('transmute')) {
        return array();
    }
    global $lang;
    try {
        if ($planetrow['planet_type'] != PT_PLANET) {
            throw new exception($lang['ov_core_err_not_a_planet'], ERR_ERROR);
        }
        if ($planetrow['density_index'] == ($new_density_index = sys_get_param_id('density_type'))) {
            throw new exception($lang['ov_core_err_same_density'], ERR_WARNING);
        }
        sn_db_transaction_start();
        $user = db_user_by_id($user['id'], true, '*');
        $planetrow = db_planet_by_id($planetrow['id'], true, '*');
        //    $global_data = sys_o_get_updated($user, $planetrow['id'], SN_TIME_NOW);
        //    $user = $global_data['user'];
        //    $planetrow = $global_data['planet'];
        $planet_density_index = $planetrow['density_index'];
        $density_price_chart = planet_density_price_chart($planet_density_index);
        if (!isset($density_price_chart[$new_density_index])) {
            // Hack attempt
            throw new exception($lang['ov_core_err_denisty_type_wrong'], ERR_ERROR);
        }
        $user_dark_matter = mrc_get_level($user, false, RES_DARK_MATTER);
        $transmute_cost = get_unit_param(UNIT_PLANET_DENSITY, 'cost');
        $transmute_cost = $transmute_cost[RES_DARK_MATTER] * $density_price_chart[$new_density_index];
        if ($user_dark_matter < $transmute_cost) {
            throw new exception($lang['ov_core_err_no_dark_matter'], ERR_ERROR);
        }
        $sn_data_planet_density = sn_get_groups('planet_density');
        foreach ($sn_data_planet_density as $key => $value) {
            if ($key == $new_density_index) {
                break;
            }
            $prev_density_index = $key;
        }
        $new_density = round(($sn_data_planet_density[$new_density_index][UNIT_PLANET_DENSITY] + $sn_data_planet_density[$prev_density_index][UNIT_PLANET_DENSITY]) / 2);
        rpg_points_change($user['id'], RPG_PLANET_DENSITY_CHANGE, -$transmute_cost, array('Planet %1$s ID %2$d at coordinates %3$s changed density type from %4$d "%5$s" to %6$d "%7$s". New density is %8$d kg/m3', $planetrow['name'], $planetrow['id'], uni_render_coordinates($planetrow), $planet_density_index, $lang['uni_planet_density_types'][$planet_density_index], $new_density_index, $lang['uni_planet_density_types'][$new_density_index], $new_density));
        db_planet_set_by_id($planetrow['id'], "`density` = {$new_density}, `density_index` = {$new_density_index}");
        sn_db_transaction_commit();
        $planetrow['density'] = $new_density;
        $planetrow['density_index'] = $new_density_index;
        $result = array('STATUS' => ERR_NONE, 'MESSAGE' => sprintf($lang['ov_core_err_none'], $lang['uni_planet_density_types'][$planet_density_index], $lang['uni_planet_density_types'][$new_density_index], $new_density));
    } catch (exception $e) {
        sn_db_transaction_rollback();
        $result = array('STATUS' => $e->getCode(), 'MESSAGE' => $e->getMessage());
    }
    return $result;
}
Example #9
0
function rpg_level_up(&$user, $type, $xp_to_add = 0)
{
    $q = 1.03;
    switch ($type) {
        case RPG_STRUCTURE:
            $field_level = 'lvl_minier';
            $field_xp = 'xpminier';
            $xp =& $user['xpminier'];
            $b1 = 50;
            $comment = 'Level Up For Structure Building';
            break;
        case RPG_RAID:
            $field_level = 'lvl_raid';
            $field_xp = 'xpraid';
            $xp =& $user['xpraid'];
            $b1 = 10;
            $comment = 'Level Up For Raiding';
            break;
    }
    if ($xp_to_add) {
        $xp += $xp_to_add;
        doquery("UPDATE `{{users}}` SET `{$field_xp}` = `{$field_xp}` + '{$xp_to_add}' WHERE `id` = '{$user['id']}' LIMIT 1;");
    }
    $level = $user[$field_level];
    while ($xp >= rpg_xp_for_level($level, $b1, $q)) {
        $level++;
    }
    $level -= $user[$field_level];
    if ($level > 0) {
        doquery("UPDATE `{{users}}` SET `{$field_level}` = `{$field_level}` + '{$level}' WHERE `id` = '{$user['id']}' LIMIT 1;");
        rpg_points_change($user['id'], $type, $level, $comment);
        $user[$field_level] += $level;
        $user[$sn_data_dark_matter_db_name] += $level;
    }
}
Example #10
0
$sn_group_artifacts = sn_get_groups('artifacts');
if (($action = sys_get_param_int('action')) && in_array($unit_id = sys_get_param_int('unit_id'), $sn_group_artifacts)) {
    switch ($action) {
        case ACTION_BUY:
            sn_db_transaction_start();
            $user = db_user_by_id($user['id'], true);
            $artifact_level = mrc_get_level($user, array(), $unit_id, true);
            $build_data = eco_get_build_data($user, $planetrow, $unit_id, $artifact_level, true);
            $darkmater_cost = $build_data[BUILD_CREATE][RES_DARK_MATTER];
            // TODO: more correct check - with "FOR UPDATE"
            if (mrc_get_level($user, null, RES_DARK_MATTER) >= $darkmater_cost) {
                $unit_max_stack = get_unit_param($unit_id, P_MAX_STACK);
                if (!isset($unit_max_stack) || $unit_max_stack > mrc_get_level($user, $planetrow, $unit_id)) {
                    $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, 1, $user);
                    db_changeset_apply($db_changeset);
                    rpg_points_change($user['id'], RPG_ARTIFACT, -$darkmater_cost, "Spent for artifact {$lang['tech'][$unit_id]} ID {$unit_id}");
                    sn_db_transaction_commit();
                    header("Location: artifacts.php#{$unit_id}");
                    ob_end_flush();
                    die;
                } else {
                    $Message = $lang['off_maxed_out'];
                }
            } else {
                $Message = $lang['sys_no_points'];
            }
            sn_db_transaction_rollback();
            break;
        case ACTION_USE:
            art_use($user, $planetrow, $unit_id);
            header("Location: artifacts.php#{$unit_id}");
Example #11
0
function mrc_mercenary_hire($mode, $user, $mercenary_id)
{
    global $config, $lang, $sn_powerup_buy_discounts;
    try {
        $is_permanent = $mode == UNIT_PLANS || !$config->empire_mercenary_temporary;
        $cost_alliance_multiplyer = SN_IN_ALLY === true && $mode == UNIT_PLANS ? $config->ali_bonus_members : 1;
        $cost_alliance_multiplyer = $cost_alliance_multiplyer >= 1 ? $cost_alliance_multiplyer : 1;
        if (!in_array($mercenary_id, sn_get_groups($mode == UNIT_PLANS ? 'plans' : 'mercenaries'))) {
            throw new Exception($lang['mrc_msg_error_wrong_mercenary'], ERR_ERROR);
        }
        if (!mrc_officer_accessible($user, $mercenary_id)) {
            throw new Exception($lang['mrc_msg_error_requirements'], ERR_ERROR);
        }
        $mercenary_level = sys_get_param_int('mercenary_level');
        if ($mercenary_level < 0 || $mercenary_level > get_unit_param($mercenary_id, P_MAX_STACK)) {
            throw new Exception($lang['mrc_msg_error_wrong_level'], ERR_ERROR);
        }
        if ($mercenary_level && !array_key_exists($mercenary_period = sys_get_param_int('mercenary_period'), $sn_powerup_buy_discounts)) {
            throw new Exception($lang['mrc_msg_error_wrong_period'], ERR_ERROR);
        }
        sn_db_transaction_start();
        $mercenary_level_old = mrc_get_level($user, $planetrow, $mercenary_id, true, true);
        if ($config->empire_mercenary_temporary && $mercenary_level_old && $mercenary_level) {
            throw new Exception($lang['mrc_msg_error_already_hired'], ERR_ERROR);
            // Can't hire already hired temp mercenary - dismiss first
        } elseif ($config->empire_mercenary_temporary && !$mercenary_level_old && !$mercenary_level) {
            throw new Exception('', ERR_NONE);
            // Can't dismiss (!$mercenary_level) not hired (!$mercenary_level_old) temp mercenary. But no error
        }
        if ($mercenary_level) {
            $darkmater_cost = eco_get_total_cost($mercenary_id, $mercenary_level);
            if (!$config->empire_mercenary_temporary && $mercenary_level_old) {
                $darkmater_cost_old = eco_get_total_cost($mercenary_id, $mercenary_level_old);
                $darkmater_cost[BUILD_CREATE][RES_DARK_MATTER] -= $darkmater_cost_old[BUILD_CREATE][RES_DARK_MATTER];
            }
            $darkmater_cost = ceil($darkmater_cost[BUILD_CREATE][RES_DARK_MATTER] * $mercenary_period * $sn_powerup_buy_discounts[$mercenary_period] / $config->empire_mercenary_base_period);
        } else {
            $darkmater_cost = 0;
        }
        $darkmater_cost *= $cost_alliance_multiplyer;
        if (mrc_get_level($user, null, RES_DARK_MATTER) < $darkmater_cost) {
            throw new Exception($lang['mrc_msg_error_no_resource'], ERR_ERROR);
        }
        if ($darkmater_cost && $mercenary_level || !$is_permanent) {
            $unit_row = db_unit_by_location($user['id'], LOC_USER, $user['id'], $mercenary_id);
            if (is_array($unit_row) && ($dismiss_left_days = floor((strtotime($unit_row['unit_time_finish']) - SN_TIME_NOW) / PERIOD_DAY))) {
                $dismiss_full_cost = eco_get_total_cost($mercenary_id, $unit_row['unit_level']);
                $dismiss_full_cost = $dismiss_full_cost[BUILD_CREATE][RES_DARK_MATTER];
                $dismiss_full_days = round((strtotime($unit_row['unit_time_finish']) - strtotime($unit_row['unit_time_start'])) / PERIOD_DAY);
                /*
                        print(sprintf($lang['mrc_mercenary_dismissed_log'], $lang['tech'][$mercenary_id], $mercenary_id, $dismiss_full_cost, $dismiss_full_days,
                          $unit_row['unit_time_start'], $unit_row['unit_time_finish'], $dismiss_left_days, floor($dismiss_full_cost * $dismiss_left_days / $dismiss_full_days)
                          ));
                */
                rpg_points_change($user['id'], RPG_MERCENARY_DISMISSED, 0, sprintf($lang['mrc_mercenary_dismissed_log'], $lang['tech'][$mercenary_id], $mercenary_id, $dismiss_full_cost, $dismiss_full_days, $unit_row['unit_time_start'], $unit_row['unit_time_finish'], $dismiss_left_days, floor($dismiss_full_cost * $dismiss_left_days / $dismiss_full_days)));
            }
            db_unit_list_delete($user['id'], LOC_USER, $user['id'], $mercenary_id);
        }
        if ($darkmater_cost && $mercenary_level) {
            db_unit_set_insert("unit_player_id = {$user['id']},\n        unit_location_type = " . LOC_USER . ",\n        unit_location_id = {$user['id']},\n        unit_type = {$mode},\n        unit_snid = {$mercenary_id},\n        unit_level = {$mercenary_level},\n        unit_time_start = " . (!$is_permanent ? 'FROM_UNIXTIME(' . SN_TIME_NOW . ')' : 'null') . ",\n        unit_time_finish = " . (!$is_permanent ? 'FROM_UNIXTIME(' . (SN_TIME_NOW + $mercenary_period) . ')' : 'null'));
            rpg_points_change($user['id'], $mode == UNIT_PLANS ? RPG_PLANS : RPG_MERCENARY, -$darkmater_cost, sprintf($lang[$mode == UNIT_PLANS ? 'mrc_plan_bought_log' : 'mrc_mercenary_hired_log'], $lang['tech'][$mercenary_id], $mercenary_id, $darkmater_cost, round($mercenary_period / PERIOD_DAY)));
        }
        sn_db_transaction_commit();
        sys_redirect($_SERVER['REQUEST_URI']);
    } 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());
    }
    return $operation_result;
}
function flt_mission_explore(&$mission_data)
{
    if (!isset($mission_data['fleet_event']) || $mission_data['fleet_event'] != EVENT_FLT_ACOMPLISH) {
        return CACHE_NONE;
    }
    global $lang, $config;
    static $ship_data, $rates;
    $result = array('$mission_data' => $mission_data, '$outcome_list' => array(), '$mission_outcome' => FLT_EXPEDITION_OUTCOME_NONE, '$outcome_value' => 0, '$outcome_percent' => 0, '$outcome_mission_sub' => -1, '$fleet' => array(), '$fleet_lost' => array(), '$found_dark_matter' => 0, '$fleet_metal_points' => 0);
    $fleet =& $result['$fleet'];
    //  $fleet_left = &$result['$fleet_left'];
    $fleet_lost =& $result['$fleet_lost'];
    $outcome_mission_sub =& $result['$outcome_mission_sub'];
    $outcome_percent =& $result['$outcome_percent'];
    $found_dark_matter =& $result['$found_dark_matter'];
    $mission_outcome =& $result['$mission_outcome'];
    $outcome_value =& $result['$outcome_value'];
    $outcome_list =& $result['$outcome_list'];
    $fleet_metal_points =& $result['$fleet_metal_points'];
    if (!$ship_data) {
        foreach (sn_get_groups('fleet') as $unit_id) {
            $unit_info = get_unit_param($unit_id);
            if ($unit_info[P_UNIT_TYPE] != UNIT_SHIPS || !isset($unit_info['engine'][0]['speed']) || !$unit_info['engine'][0]['speed']) {
                continue;
            }
            $ship_data[$unit_id][P_COST_METAL] = get_unit_cost_in($unit_info[P_COST]);
        }
        $rates = get_resource_exchange();
    }
    $fleet_row = $mission_data['fleet'];
    $fleet = sys_unit_str2arr($fleet_row['fleet_array']);
    $fleet_capacity = 0;
    $fleet_metal_points = 0;
    foreach ($fleet as $ship_id => $ship_amount) {
        $unit_info = get_unit_param($ship_id);
        $fleet_capacity += $ship_amount * $unit_info[P_CAPACITY];
        $fleet_metal_points += $ship_amount * $ship_data[$ship_id][P_COST_METAL];
    }
    $fleet_capacity = max(0, $fleet_capacity - $fleet_row['fleet_resource_metal'] + $fleet_row['fleet_resource_crystal'] + $fleet_row['fleet_resource_deuterium']);
    $flt_stay_hours = ($fleet_row['fleet_end_stay'] - $fleet_row['fleet_start_time']) / 3600 * ($config->game_speed_expedition ? $config->game_speed_expedition : 1);
    $outcome_list = sn_get_groups('mission_explore_outcome_list');
    $outcome_list[FLT_EXPEDITION_OUTCOME_NONE]['chance'] = ceil(200 / pow($flt_stay_hours, 1 / 1.7));
    $chance_max = 0;
    foreach ($outcome_list as $key => &$value) {
        if (!$value['chance']) {
            unset($outcome_list[$key]);
            continue;
        }
        $value['value'] = $chance_max = $value['chance'] + $chance_max;
    }
    $outcome_value = mt_rand(0, $chance_max);
    // $outcome_value = 409;
    $outcome_description =& $outcome_list[$mission_outcome = FLT_EXPEDITION_OUTCOME_NONE];
    foreach ($outcome_list as $key => &$value) {
        if (!$value['chance']) {
            continue;
        }
        $mission_outcome = $key;
        $outcome_description = $value;
        if ($outcome_value <= $outcome_description['value']) {
            break;
        }
    }
    // Вычисляем вероятность выпадения данного числа в общем пуле
    $msg_sender = $lang['flt_mission_expedition']['msg_sender'];
    $msg_title = $lang['flt_mission_expedition']['msg_title'];
    $outcome_percent = ($outcome_description['value'] - $outcome_value) / $outcome_description['chance'];
    $msg_text = '';
    $msg_text_addon = '';
    $found_dark_matter = 0;
    //  $outcome_mission_sub = -1;
    switch ($mission_outcome) {
        //  switch(FLT_EXPEDITION_OUTCOME_LOST_FLEET) { // TODO DEBUG!
        case FLT_EXPEDITION_OUTCOME_LOST_FLEET:
            flt_mission_explore_outcome_lost_fleet($result);
            //      // $fleet_left = 1 - mt_rand(1, 3) * 0.25;// * 0.25;
            //      $fleet_left = 1 - mt_rand(1, 3) * mt_rand(200000, 300000) / 1000000;
            //      $fleet_lost = array();
            //      foreach($fleet as $unit_id => &$unit_amount) {
            //        $ships_left = floor($unit_amount * $fleet_left);
            //        $fleet_lost[$unit_id] = $unit_amount - $ships_left;
            //        $unit_amount = $ships_left;
            //        if(!$unit_amount) {
            //          unset($fleet[$unit_id]);
            //        }
            //      }
            break;
        case FLT_EXPEDITION_OUTCOME_LOST_FLEET_ALL:
            flt_mission_explore_outcome_lost_fleet_all($result);
            //      $fleet_lost = $fleet;
            //      $fleet = array();
            break;
        case FLT_EXPEDITION_OUTCOME_FOUND_FLEET:
            $outcome_mission_sub = $outcome_percent >= 0.99 ? 0 : ($outcome_percent >= 0.9 ? 1 : 2);
            $outcome_percent = $outcome_description['percent'][$outcome_mission_sub];
            // Рассчитываем эквивалент найденного флота в метале
            // $found_in_metal = min($outcome_percent * $fleet_metal_points, $config->resource_multiplier * 10000000); // game_speed
            $found_in_metal = min($outcome_percent * $fleet_metal_points, game_resource_multiplier(true) * 10000000);
            // game_speed
            //  13 243 754 000 g x1
            //  60 762 247 000 a x10
            // 308 389 499 488 000 b x500
            // Рассчитываем стоимость самого дорого корабля в металле
            $max_metal_cost = 0;
            foreach ($fleet as $ship_id => $ship_amount) {
                $max_metal_cost = max($max_metal_cost, $ship_data[$ship_id]['metal_cost']);
            }
            // Ограничиваем корабли только теми, чья стоимость в металле меньше или равно стоимости самого дорогого корабля
            $can_be_found = array();
            foreach ($ship_data as $ship_id => $ship_info) {
                if ($ship_info['metal_cost'] < $max_metal_cost) {
                    $can_be_found[$ship_id] = $ship_info['metal_cost'];
                }
            }
            // Убираем колонизаторы и шпионов - миллиарды шпионов и колонизаторов нам не нужны
            unset($can_be_found[SHIP_COLONIZER]);
            unset($can_be_found[SHIP_SPY]);
            $fleet_found = array();
            while (count($can_be_found) && $found_in_metal >= max($can_be_found)) {
                $found_index = mt_rand(1, count($can_be_found)) - 1;
                $found_ship = array_slice($can_be_found, $found_index, 1, true);
                $found_ship_cost = reset($found_ship);
                $found_ship_id = key($found_ship);
                if ($found_ship_cost > $found_in_metal) {
                    unset($can_be_found[$found_ship_id]);
                } else {
                    $found_ship_count = mt_rand(1, floor($found_in_metal / $found_ship_cost));
                    $fleet_found[$found_ship_id] += $found_ship_count;
                    $found_in_metal -= $found_ship_count * $found_ship_cost;
                }
            }
            if (empty($fleet_found)) {
                $msg_text_addon = $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['no_result'];
            } else {
                foreach ($fleet_found as $unit_id => $unit_amount) {
                    $fleet[$unit_id] += $unit_amount;
                }
            }
            break;
        case FLT_EXPEDITION_OUTCOME_FOUND_RESOURCES:
            $outcome_mission_sub = $outcome_percent >= 0.99 ? 0 : ($outcome_percent >= 0.9 ? 1 : 2);
            $outcome_percent = $outcome_description['percent'][$outcome_mission_sub];
            // Рассчитываем количество найденных ресурсов
            $found_in_metal = ceil(min($outcome_percent * $fleet_metal_points, game_resource_multiplier(true) * 10000000, $fleet_capacity) * mt_rand(950000, 1050000) / 1000000);
            // game_speed
            $resources_found[RES_METAL] = floor(mt_rand(300000, 700000) / 1000000 * $found_in_metal);
            $found_in_metal -= $resources_found[RES_METAL];
            $found_in_metal = floor($found_in_metal * $rates[RES_METAL] / $rates[RES_CRYSTAL]);
            $resources_found[RES_CRYSTAL] = floor(mt_rand(500000, 1000000) / 1000000 * $found_in_metal);
            $found_in_metal -= $resources_found[RES_CRYSTAL];
            $found_in_metal = floor($found_in_metal * $rates[RES_CRYSTAL] / $rates[RES_DEUTERIUM]);
            $resources_found[RES_DEUTERIUM] = $found_in_metal;
            $fleet_row['fleet_resource_metal'] += $resources_found[RES_METAL];
            $fleet_row['fleet_resource_crystal'] += $resources_found[RES_CRYSTAL];
            $fleet_row['fleet_resource_deuterium'] += $resources_found[RES_DEUTERIUM];
            if (array_sum($resources_found) == 0) {
                $msg_text_addon = $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['no_result'];
            }
            break;
        case FLT_EXPEDITION_OUTCOME_FOUND_DM:
            $outcome_mission_sub = $outcome_percent >= 0.99 ? 0 : ($outcome_percent >= 0.9 ? 1 : 2);
            $outcome_percent = $outcome_description['percent'][$outcome_mission_sub];
            // Рассчитываем количество найденной ТМ
            $found_dark_matter = floor(min($outcome_percent * $fleet_metal_points / $rates[RES_DARK_MATTER], 10000) * mt_rand(750000, 1000000) / 1000000);
            if (!$found_dark_matter) {
                $msg_text_addon = $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['no_result'];
            }
            break;
        case FLT_EXPEDITION_OUTCOME_FOUND_ARTIFACT:
            break;
        default:
            break;
    }
    flt_mission_explore_addon($result);
    $query_data = array();
    if ($found_dark_matter) {
        rpg_points_change($fleet_row['fleet_owner'], RPG_EXPEDITION, $found_dark_matter, 'Expedition Bonus');
        $msg_text_addon = sprintf($lang['flt_mission_expedition']['found_dark_matter'], $found_dark_matter);
    }
    if (!empty($fleet_lost)) {
        $msg_text_addon = $lang['flt_mission_expedition']['lost_fleet'];
        foreach ($fleet_lost as $ship_id => $ship_amount) {
            $msg_text_addon .= $lang['tech'][$ship_id] . ' - ' . $ship_amount . "\r\n";
        }
    }
    $fleet_row['fleet_amount'] = array_sum($fleet);
    if (!empty($fleet) && $fleet_row['fleet_amount']) {
        if (!empty($fleet_found)) {
            $msg_text_addon = $lang['flt_mission_expedition']['found_fleet'];
            foreach ($fleet_found as $ship_id => $ship_amount) {
                $msg_text_addon .= $lang['tech'][$ship_id] . ' - ' . $ship_amount . "\r\n";
            }
        }
        if (!empty($resources_found) && array_sum($resources_found) > 0) {
            $msg_text_addon = $lang['flt_mission_expedition']['found_resources'];
            foreach ($resources_found as $ship_id => $ship_amount) {
                $msg_text_addon .= $lang['tech'][$ship_id] . ' - ' . $ship_amount . "\r\n";
            }
            $query_data[] = "`fleet_resource_metal` = `fleet_resource_metal` + {$resources_found[RES_METAL]}";
            $query_data[] = "`fleet_resource_crystal` = `fleet_resource_crystal` + {$resources_found[RES_CRYSTAL]}";
            $query_data[] = "`fleet_resource_deuterium` = `fleet_resource_deuterium` + {$resources_found[RES_DEUTERIUM]}";
        }
        if (!empty($fleet_lost) || !empty($fleet_found)) {
            $fleet_row['fleet_array'] = sys_unit_arr2str($fleet);
            $query_data[] = "`fleet_amount` = {$fleet_row['fleet_amount']}";
            $query_data[] = "`fleet_array` = '{$fleet_row['fleet_array']}'";
        }
        $query_data[] = '`fleet_mess` = 1';
        $query_data = "UPDATE {{fleets}} SET " . implode(',', $query_data);
    } else {
        // Удалить флот
        $query_data = "DELETE FROM {{fleets}}";
    }
    $query_data .= " WHERE `fleet_id` = {$fleet_row['fleet_id']} LIMIT 1";
    doquery($query_data);
    db_user_set_by_id($fleet_row['fleet_owner'], "`player_rpg_explore_xp` = `player_rpg_explore_xp` + 1");
    if (!$msg_text) {
        $messages =& $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['messages'];
        if ($outcome_mission_sub >= 0 && is_array($messages)) {
            $messages =& $messages[$outcome_mission_sub];
        }
        $msg_text = is_string($messages) ? $messages : (is_array($messages) ? $messages[mt_rand(0, count($messages) - 1)] : '');
    }
    $msg_text = sprintf($msg_text, $fleet_row['fleet_id'], uni_render_coordinates($fleet_row, 'fleet_end_')) . ($msg_text_addon ? "\r\n" . $msg_text_addon : '');
    msg_send_simple_message($fleet_row['fleet_owner'], '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $msg_sender, $msg_title, $msg_text);
    return CACHE_FLEET | CACHE_USER_SRC;
}
Example #13
0
 public function metamatter_change($change_type, $metamatter, $comment = false, $already_changed = false)
 {
     global $debug, $mm_change_legit, $config;
     if (!$this->is_exists || !($metamatter = round(floatval($metamatter)))) {
         $debug->error('Ошибка при попытке манипуляции с ММ');
         return false;
     }
     $account_id_safe = $this->db->db_escape($this->account_id);
     $mm_change_legit = true;
     // $sn_data_metamatter_db_name = pname_resource_name(RES_METAMATTER);
     if ($already_changed) {
         $metamatter_total_delta = 0;
         $result = -1;
     } else {
         $metamatter_total_delta = $metamatter > 0 ? $metamatter : 0;
         $result = $this->db->doquery("UPDATE {{account}}\n        SET\n          `account_metamatter` = `account_metamatter` + '{$metamatter}'" . ($metamatter_total_delta ? ", `account_immortal` = IF(`account_metamatter_total` + '{$metamatter_total_delta}' >= {$config->player_metamatter_immortal}, NOW(), `account_immortal`), `account_metamatter_total` = `account_metamatter_total` + '{$metamatter_total_delta}'" : '') . " WHERE `account_id` = {$account_id_safe}");
         if (!$result) {
             $debug->error("Error adjusting Metamatter for player ID {$this->account_id} (Player Not Found?) with {$metamatter}. Reason: {$comment}", 'Metamatter Change', 402);
         }
         $result = classSupernova::$db->db_affected_rows();
     }
     if (empty(core_auth::$user['id'])) {
         $user_list = PlayerToAccountTranslate::db_translate_get_users_from_account_list(core_auth::$main_provider->provider_id, $this->account_id);
         reset($user_list);
         $user_id_unsafe = key($user_list);
     } else {
         $user_id_unsafe = core_auth::$user['id'];
     }
     $user_id_safe = $this->db->db_escape($user_id_unsafe);
     if (!$result) {
         $debug->error("Error adjusting Metamatter for player ID {$this->account_id} (Player Not Found?) with {$metamatter}. Reason: {$comment}", 'Metamatter Change', 402);
     }
     if (!$already_changed) {
         $this->account_metamatter += $metamatter;
         $this->account_metamatter_total += $metamatter_total_delta;
     }
     if (is_array($comment)) {
         $comment = call_user_func_array('sprintf', $comment);
     }
     $result = $this->db_mm_log_insert($comment, $change_type, $metamatter, $user_id_unsafe);
     if ($metamatter > 0 && !empty($user_id_safe)) {
         $old_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id_safe} LIMIT 1 FOR UPDATE;", '', true);
         if ($old_referral['id']) {
             $dark_matter_from_metamatter = $metamatter * AFFILIATE_MM_TO_REFERRAL_DM;
             doquery("UPDATE {{referrals}} SET dark_matter = dark_matter + '{$dark_matter_from_metamatter}' WHERE `id` = {$user_id_safe} LIMIT 1;");
             $new_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id_safe} 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_BOUGHT_MM, $partner_bonus, "Incoming MM From Referral ID {$user_id_safe}");
             }
         }
     }
     $mm_change_legit = false;
     return $result;
 }
Example #14
0
function qst_reward(&$user, &$planet, &$rewards, &$quest_list)
{
    global $lang, $sn_data;
    foreach ($rewards as $quest_id => $rewards_list_string) {
        $comment_reward = array();
        $planet_reward = array();
        $user_reward = array();
        $user_reward_dm = 0;
        $comment = sprintf($lang['qst_msg_complete_body'], $quest_list[$quest_id]['quest_name']);
        $rewards_list_array = explode(';', $rewards_list_string);
        foreach ($rewards_list_array as $reward_string) {
            list($reward_id, $reward_amount) = explode(',', $reward_string);
            $reward_db_name = $sn_data[$reward_id]['name'];
            $reward_db_string = "`{$reward_db_name}` = `{$reward_db_name}` + {$reward_amount}";
            if ($reward_id == RES_DARK_MATTER) {
                $user_reward_dm = $reward_amount;
            }
            if ($sn_data[$reward_id]['location'] == LOC_USER) {
                $user[$reward_db_name] += $reward_amount;
                $user_reward[] = $reward_db_string;
            } elseif ($sn_data[$reward_id]['location'] == LOC_PLANET) {
                $planet[$reward_db_name] += $reward_amount;
                $planet_reward[] = $reward_db_string;
            } else {
                continue;
            }
            $comment_reward[] = $reward_amount . ' ' . $lang['tech'][$reward_id];
        }
        if (!empty($comment_reward)) {
            $comment .= " {$lang['qst_msg_your_reward']} " . implode(',', $comment_reward);
            if (!empty($user_reward)) {
                $user_reward = implode(',', $user_reward);
                doquery("UPDATE {{users}} SET {$user_reward} WHERE `id` = {$user['id']} LIMIT 1;");
                if ($user_reward_dm) {
                    rpg_points_change($user['id'], RPG_QUEST, $user_reward_dm, $comment, true);
                }
            }
            if (!empty($planet_reward)) {
                $planet_reward = implode(',', $planet_reward);
                doquery("UPDATE {{planets}} SET {$planet_reward} WHERE `id` = {$planet['id']} LIMIT 1;");
            }
        }
        sn_db_perform('{{quest_status}}', array('quest_status_quest_id' => $quest_id, 'quest_status_user_id' => $user['id'], 'quest_status_status' => QUEST_STATUS_COMPLETE));
        msg_send_simple_message($user['id'], 0, $time_now, MSG_TYPE_ADMIN, $lang['msg_from_admin'], $lang['qst_msg_complete_subject'], $comment);
    }
}
Example #15
0
function sn_options_model()
{
    global $user, $user_option_list, $lang, $template_result, $config;
    $language_new = sys_get_param_str('langer', $user['lang']);
    if ($language_new != $user['lang']) {
        $lang->lng_switch($language_new);
    }
    lng_include('options');
    lng_include('messages');
    $FMT_DATE = preg_replace(array('/d/', '/m/', '/Y/'), array('DD', 'MM', 'YYYY'), FMT_DATE);
    if (sys_get_param_str('mode') == 'change') {
        if ($user['authlevel'] > 0) {
            $planet_protection = sys_get_param_int('adm_pl_prot') ? $user['authlevel'] : 0;
            db_planet_set_by_owner($user['id'], "`id_level` = '{$planet_protection}'");
            db_user_set_by_id($user['id'], "`admin_protection` = '{$planet_protection}'");
            $user['admin_protection'] = $planet_protection;
        }
        if (sys_get_param_int('vacation') && !$config->user_vacation_disable) {
            sn_db_transaction_start();
            if ($user['authlevel'] < 3) {
                if ($user['vacation_next'] > SN_TIME_NOW) {
                    message($lang['opt_vacation_err_timeout'], $lang['Error'], 'index.php?page=options', 5);
                    die;
                }
                $is_building = doquery("SELECT * FROM `{{fleets}}` WHERE `fleet_owner` = '{$user['id']}' LIMIT 1;", true);
                if ($is_building) {
                    message($lang['opt_vacation_err_your_fleet'], $lang['Error'], 'index.php?page=options', 5);
                    die;
                }
                $que = que_get($user['id'], false);
                if (!empty($que)) {
                    message($lang['opt_vacation_err_que'], $lang['Error'], 'index.php?page=options', 5);
                    die;
                }
                $query = classSupernova::db_get_record_list(LOC_PLANET, "`id_owner` = {$user['id']}");
                foreach ($query as $planet) {
                    // $planet = sys_o_get_updated($user, $planet, SN_TIME_NOW);
                    // $planet = $planet['planet'];
                    db_planet_set_by_id($planet['id'], "last_update = " . SN_TIME_NOW . ", energy_used = '0', energy_max = '0',\n            metal_perhour = '{$config->metal_basic_income}', crystal_perhour = '{$config->crystal_basic_income}', deuterium_perhour = '{$config->deuterium_basic_income}',\n            metal_mine_porcent = '0', crystal_mine_porcent = '0', deuterium_sintetizer_porcent = '0', solar_plant_porcent = '0',\n            fusion_plant_porcent = '0', solar_satelit_porcent = '0', ship_sattelite_sloth_porcent = 0");
                }
                $user['vacation'] = SN_TIME_NOW + $config->player_vacation_time;
            } else {
                $user['vacation'] = SN_TIME_NOW;
            }
            sn_db_transaction_commit();
        }
        foreach ($user_option_list as $option_group_id => $option_group) {
            foreach ($option_group as $option_name => $option_value) {
                if ($user[$option_name] !== null) {
                    $user[$option_name] = sys_get_param_str($option_name);
                } else {
                    $user[$option_name] = $option_value;
                }
            }
        }
        $options = sys_user_options_pack($user);
        $player_options = sys_get_param('options');
        if (!empty($player_options)) {
            array_walk($player_options, function (&$value) {
                // TODO - Когда будет больше параметров - сделать больше проверок
                $value = intval($value);
            });
            classSupernova::$user_options->offsetSet($player_options);
            // pdump($player_options);die();
            //      player_save_option_array($user, $player_options);
        }
        $username = substr(sys_get_param_str_unsafe('username'), 0, 32);
        $username_safe = db_escape($username);
        if ($username && $user['username'] != $username && $config->game_user_changename != SERVER_PLAYER_NAME_CHANGE_NONE && sys_get_param_int('username_confirm') && !strpbrk($username, LOGIN_REGISTER_CHARACTERS_PROHIBITED)) {
            // проверка на корректность
            sn_db_transaction_start();
            $name_check = doquery("SELECT * FROM {{player_name_history}} WHERE `player_name` LIKE \"{$username_safe}\" LIMIT 1 FOR UPDATE;", true);
            if (!$name_check || $name_check['player_id'] == $user['id']) {
                $user = db_user_by_id($user['id'], true);
                switch ($config->game_user_changename) {
                    case SERVER_PLAYER_NAME_CHANGE_PAY:
                        if (mrc_get_level($user, $planetrow, RES_DARK_MATTER) < $config->game_user_changename_cost) {
                            $template_result['.']['result'][] = array('STATUS' => ERR_ERROR, 'MESSAGE' => $lang['opt_msg_name_change_err_no_dm']);
                            break;
                        }
                        rpg_points_change($user['id'], RPG_NAME_CHANGE, -$config->game_user_changename_cost, sprintf('Пользователь ID %d сменил имя с "%s" на "%s"', $user['id'], $user['username'], $username));
                    case SERVER_PLAYER_NAME_CHANGE_FREE:
                        db_user_set_by_id($user['id'], "`username` = '{$username_safe}'");
                        doquery("REPLACE INTO {{player_name_history}} SET `player_id` = {$user['id']}, `player_name` = '{$username_safe}'");
                        // TODO: Change cookie to not force user relogin
                        // sn_setcookie(SN_COOKIE, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE);
                        $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_name_changed']);
                        $user['username'] = $username;
                        break;
                }
            } else {
                $template_result['.']['result'][] = array('STATUS' => ERR_ERROR, 'MESSAGE' => $lang['opt_msg_name_change_err_used_name']);
            }
            sn_db_transaction_commit();
        }
        if ($new_password = sys_get_param('newpass1')) {
            try {
                if ($new_password != sys_get_param('newpass2')) {
                    throw new Exception($lang['opt_err_pass_unmatched'], ERR_WARNING);
                }
                if (!classSupernova::$auth->password_change(sys_get_param('db_password'), $new_password)) {
                    throw new Exception($lang['opt_err_pass_wrong'], ERR_WARNING);
                }
                throw new Exception($lang['opt_msg_pass_changed'], ERR_NONE);
            } catch (Exception $e) {
                $template_result['.']['result'][] = array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage());
            }
        }
        $user['email'] = sys_get_param_str('db_email');
        //    if(!$template_result[F_ACCOUNT]['account_email'] && ($email_2 = sys_get_param_str('db_email2'))) {
        //      core_auth::email_set($email_2);
        //    }
        $user['dpath'] = sys_get_param_str('dpath');
        $user['lang'] = sys_get_param_str('langer', $user['lang']);
        //    if($lang->lng_switch($user['lang'])) {
        //      lng_include('options');
        //      lng_include('messages');
        //    }
        $user['design'] = sys_get_param_int('design');
        $user['noipcheck'] = sys_get_param_int('noipcheck');
        // $user['spio_anz'] = sys_get_param_int('spio_anz');
        // $user['settings_fleetactions'] = sys_get_param_int('settings_fleetactions', 1);
        // $user['settings_tooltiptime'] = sys_get_param_int('settings_tooltiptime');
        // $user['settings_esp'] = sys_get_param_int('settings_esp');
        // $user['settings_wri'] = sys_get_param_int('settings_wri');
        // $user['settings_bud'] = sys_get_param_int('settings_bud');
        // $user['settings_mis'] = sys_get_param_int('settings_mis');
        // $user['settings_statistics'] = sys_get_param_int('settings_statistics');
        // $user['settings_info'] = sys_get_param_int('settings_info');
        // $user['settings_rep'] = sys_get_param_int('settings_rep');
        // $user['planet_sort']  = sys_get_param_int('settings_sort');
        // $user['planet_sort_order'] = sys_get_param_int('settings_order');
        $user['deltime'] = !sys_get_param_int('deltime') ? 0 : ($user['deltime'] ? $user['deltime'] : SN_TIME_NOW + $config->player_delete_time);
        $gender = sys_get_param_int('gender', $user['gender']);
        !isset($lang['sys_gender_list'][$gender]) ? $gender = $user['gender'] : false;
        $user['gender'] = $user['gender'] == GENDER_UNKNOWN ? $gender : $user['gender'];
        try {
            if ($user['birthday']) {
                throw new exception();
            }
            $user_birthday = sys_get_param_str_unsafe('user_birthday');
            if (!$user_birthday || $user_birthday == $FMT_DATE) {
                throw new exception();
            }
            // Some black magic to parse any valid date format - those that contains all three "d", "m" and "Y" and any of the delimeters "\", "/", ".", "-"
            $pos['d'] = strpos(FMT_DATE, 'd');
            $pos['m'] = strpos(FMT_DATE, 'm');
            $pos['Y'] = strpos(FMT_DATE, 'Y');
            asort($pos);
            $i = 0;
            foreach ($pos as &$position) {
                $position = ++$i;
            }
            $regexp = "/" . preg_replace(array('/\\\\/', '/\\//', '/\\./', '/\\-/', '/d/', '/m/', '/Y/'), array('\\\\\\', '\\/', '\\.', '\\-', '(\\d?\\d)', '(\\d?\\d)', '(\\d{4})'), FMT_DATE) . "/";
            if (!preg_match($regexp, $user_birthday, $match)) {
                throw new exception();
            }
            if (!checkdate($match[$pos['m']], $match[$pos['d']], $match[$pos['Y']])) {
                throw new exception();
            }
            $user['user_birthday'] = db_escape("{$match[$pos['Y']]}-{$match[$pos['m']]}-{$match[$pos['d']]}");
            // EOF black magic! Now we have valid SQL date in $user['user_birthday'] - independent of date format
            $year = date('Y', SN_TIME_NOW);
            if (mktime(0, 0, 0, $match[$pos['m']], $match[$pos['d']], $year) > SN_TIME_NOW) {
                $year--;
            }
            $user['user_birthday_celebrated'] = db_escape("{$year}-{$match[$pos['m']]}-{$match[$pos['d']]}");
            $user_birthday = ", `user_birthday` = '{$user['user_birthday']}', `user_birthday_celebrated` = '{$user['user_birthday_celebrated']}'";
        } catch (exception $e) {
            $user_birthday = '';
        }
        require_once 'includes/includes/sys_avatar.php';
        $avatar_upload_result = sys_avatar_upload($user['id'], $user['avatar']);
        $template_result['.']['result'][] = $avatar_upload_result;
        $user_time_diff = playerTimeDiff::user_time_diff_get();
        if (sys_get_param_int('PLAYER_OPTION_TIME_DIFF_FORCED')) {
            playerTimeDiff::user_time_diff_set(array(PLAYER_OPTION_TIME_DIFF => sys_get_param_int('PLAYER_OPTION_TIME_DIFF'), PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => 0, PLAYER_OPTION_TIME_DIFF_FORCED => 1, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL));
        } elseif (sys_get_param_int('opt_time_diff_clear') || $user_time_diff[PLAYER_OPTION_TIME_DIFF_FORCED]) {
            playerTimeDiff::user_time_diff_set(array(PLAYER_OPTION_TIME_DIFF => '', PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => 0, PLAYER_OPTION_TIME_DIFF_FORCED => 0, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL));
        }
        $user_options_safe = db_escape($user['options']);
        db_user_set_by_id($user['id'], "`email` = '{$user['email']}', `lang` = '{$user['lang']}', `avatar` = '{$user['avatar']}',\n      `dpath` = '{$user['dpath']}', `design` = '{$user['design']}', `noipcheck` = '{$user['noipcheck']}',\n      `deltime` = '{$user['deltime']}', `vacation` = '{$user['vacation']}', `options` = '{$user_options_safe}', `gender` = {$user['gender']}\n      {$user_birthday}");
        $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_saved']);
    } elseif (sys_get_param_str('result') == 'ok') {
        $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_saved']);
    }
    $user = db_user_by_id($user['id']);
    $options = sys_user_options_unpack($user);
}
Example #16
0
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);
    }
}
Example #17
0
/**
 * MissionCaseExpedition.php
 *
 * version 2.0 returns results for new fleet handler
 * @version 1.0
 * @copyright 2008 By Chlorel for XNova
 */
function flt_mission_explore($mission_data)
{
    global $lang, $sn_data;
    $fleet_row = $mission_data['fleet'];
    $FleetOwner = $fleet_row['fleet_owner'];
    $MessSender = $lang['sys_mess_qg'];
    $MessTitle = $lang['sys_expe_report'];
    // La Flotte vient de finir son exploration
    // Table de ratio de points par type de vaisseau
    $PointsFlotte = array(SHIP_CARGO_SMALL => 1.0, SHIP_CARGO_BIG => 1.5, SHIP_CARGO_SUPER => 1.0, SHIP_FIGHTER_LIGHT => 0.5, SHIP_FIGHTER_HEAVY => 1.5, SHIP_FIGHTER_ASSAULT => 3.0, SHIP_DESTROYER => 2.0, SHIP_CRUISER => 2.5, SHIP_COLONIZER => 0.5, SHIP_RECYCLER => 1.0, SHIP_SPY => 0.0, SHIP_BOMBER => 3.0, SHIP_SATTELITE_SOLAR => 0.0, SHIP_DESTRUCTOR => 3.5, SHIP_DEATH_STAR => 5.0, SHIP_BATTLESHIP => 3.2, SHIP_SUPERNOVA => 9.9);
    // Table de ratio de gains en nombre par type de vaisseau
    $RatioGain = array(SHIP_CARGO_SMALL => 0.1, SHIP_CARGO_BIG => 0.1, SHIP_FIGHTER_LIGHT => 0.1, SHIP_FIGHTER_HEAVY => 0.05, SHIP_FIGHTER_ASSAULT => 0.0125, SHIP_DESTROYER => 0.25, SHIP_CRUISER => 0.125, SHIP_COLONIZER => 0.05, SHIP_CARGO_SUPER => 0.05, SHIP_RECYCLER => 0.1, SHIP_SPY => 0.1, SHIP_BOMBER => 0.0625, SHIP_SATTELITE_SOLAR => 0.0, SHIP_DESTRUCTOR => 0.0625, SHIP_DEATH_STAR => 0.03125, SHIP_BATTLESHIP => 0.0625, SHIP_SUPERNOVA => 0.00125);
    $FleetStayDuration = ($fleet_row['fleet_end_stay'] - $fleet_row['fleet_start_time']) / 3600;
    // Initialisation du contenu de la Flotte
    $farray = explode(';', $fleet_row['fleet_array']);
    foreach ($farray as $Item => $Group) {
        if ($Group != '') {
            $Class = explode(',', $Group);
            $TypeVaisseau = $Class[0];
            $NbreVaisseau = $Class[1];
            $LaFlotte[$TypeVaisseau] = $NbreVaisseau;
            //On calcul les ressources maximum qui peuvent être récupéré
            $FleetCapacity += $sn_data[$TypeVaisseau]['capacity'];
            // Maintenant on calcul en points toute la flotte
            $FleetPoints += $NbreVaisseau * $PointsFlotte[$TypeVaisseau];
        }
    }
    // Espace deja occupé dans les soutes si ce devait etre le cas
    $FleetUsedCapacity = $fleet_row['fleet_resource_metal'] + $fleet_row['fleet_resource_crystal'] + $fleet_row['fleet_resource_deuterium'];
    $FleetCapacity -= $FleetUsedCapacity;
    //On récupère le nombre total de vaisseaux
    $FleetCount = $fleet_row['fleet_amount'];
    // Bon on les mange comment ces explorateurs ???
    $Hasard = mt_rand(0, 10);
    $MessSender = "{$lang['sys_mess_qg']} ({$Hasard})";
    if ($Hasard < 3) {
        // Pas de bol, on les mange tout crus
        $Hasard += 1;
        $LostAmount = ($Hasard * 33 + 1) / 100;
        // Message pour annoncer la bonne mauvaise nouvelle
        if ($LostAmount == 100) {
            // Supprimer effectivement la flotte
            msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_blackholl_2']);
            doquery("DELETE FROM {{fleets}} WHERE `fleet_id` = {$fleet_row['fleet_id']}");
        } else {
            foreach ($LaFlotte as $Ship => $Count) {
                $LostShips[$Ship] = intval($Count * $LostAmount);
                $NewFleetArray .= $Ship . ',' . ($Count - $LostShips[$Ship]) . ';';
            }
            doquery("UPDATE {{fleets}} SET `fleet_array` = '{$NewFleetArray}', `fleet_mess` = '1' WHERE `fleet_id` = '{$fleet_row['fleet_id']}';");
            msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_blackholl_1']);
        }
    } elseif ($Hasard == 3) {
        // Ah un tour pour rien
        doquery("UPDATE {{fleets}} SET `fleet_mess` = '1' WHERE `fleet_id` = {$fleet_row['fleet_id']}");
        rpg_points_change($fleet_row['fleet_owner'], RPG_EXPEDITION, 1, 'Expedition Bonus');
        msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_nothing_1']);
    } elseif ($Hasard >= 4 && $Hasard < 7) {
        // Gains de ressources
        if ($FleetCapacity > 5000) {
            $MinCapacity = $FleetCapacity - 5000;
            $MaxCapacity = $FleetCapacity;
            $FoundGoods = rand($MinCapacity, $MaxCapacity);
            $FoundMetal = intval($FoundGoods / 2);
            $FoundCrist = intval($FoundGoods / 4);
            $FoundDeute = intval($FoundGoods / 6);
            $QryUpdateFleet = "UPDATE {{fleets}} SET ";
            $QryUpdateFleet .= "`fleet_resource_metal` = `fleet_resource_metal` + '{$FoundMetal}', ";
            $QryUpdateFleet .= "`fleet_resource_crystal` = `fleet_resource_crystal` + '{$FoundCrist}', ";
            $QryUpdateFleet .= "`fleet_resource_deuterium` = `fleet_resource_deuterium` + '{$FoundDeute}', ";
            $QryUpdateFleet .= "`fleet_mess` = '1'  ";
            $QryUpdateFleet .= "WHERE `fleet_id` = '{$fleet_row['fleet_id']}';";
            doquery($QryUpdateFleet);
            $Message = sprintf($lang['sys_expe_found_goods'], pretty_number($FoundMetal), $lang['Metal'], pretty_number($FoundCrist), $lang['Crystal'], pretty_number($FoundDeute), $lang['Deuterium']);
            msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $Message);
        }
    } elseif ($Hasard == 7) {
        // Ah un tour pour rien
        doquery("UPDATE {{fleets}} SET `fleet_mess` = '1' WHERE `fleet_id` = {$fleet_row['fleet_id']}");
        msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_nothing_2']);
    } elseif ($Hasard >= 8 && $Hasard < 11) {
        // Gain de vaisseaux
        $FoundChance = $FleetPoints / $FleetCount;
        foreach ($sn_data['groups']['fleet'] as $Ship) {
            if ($LaFlotte[$Ship] != 0) {
                $FoundShip[$Ship] = round($LaFlotte[$Ship] * $RatioGain[$Ship]);
                if ($FoundShip[$Ship] > 0) {
                    $LaFlotte[$Ship] += $FoundShip[$Ship];
                }
            }
        }
        $NewFleetArray = '';
        $FoundShipMess = '';
        foreach ($LaFlotte as $Ship => $Count) {
            if ($Count > 0) {
                $NewFleetArray .= "{$Ship},{$Count};";
            }
        }
        if ($FoundShip) {
            foreach ($FoundShip as $Ship => $Count) {
                if ($Count != 0) {
                    $FoundShipMess .= "{$Count} {$lang['tech'][$Ship]},";
                }
            }
        }
        doquery("UPDATE {{fleets}} SET `fleet_array` = '{$NewFleetArray}', `fleet_mess` = '1' WHERE `fleet_id` = '{$fleet_row['fleet_id']}' LIMIT 1;");
        $Message = "{$lang['sys_expe_found_ships']}{$FoundShipMess}";
        msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $Message);
    }
    return CACHE_FLEET | CACHE_USER_SRC;
}
Example #18
0
            $error_id = 'adm_dm_planet_conflict_id';
        }
        if (preg_match(PLANET_COORD_PREG, $id_planet, $preg)) {
            $queryPart = " or (`galaxy` = {$preg[1]} and `system` = {$preg[2]} and `planet` = {$preg[3]} and `planet_type` = 1)";
            $error_id = 'adm_dm_planet_conflict_coords';
        }
        $query = doquery("SELECT id, name, id_owner, galaxy, system, planet FROM {{planets}} WHERE `name` like '{$id_planet}'" . $queryPart);
        switch (mysql_num_rows($query)) {
            case 0:
                // Error - no such planet ID or name or coordinates
                $message = sprintf($lang['adm_dm_planet_none'], $id_planet);
                break;
            case 1:
                // Proceeding normal - only one user exists
                $row = mysql_fetch_assoc($query);
                if (rpg_points_change($row['id_owner'], RPG_ADMIN, $points, "Through admin interface to planet '{$row['name']} ID: {$row['id']} for user ID: {$row['id_owner']} " . $reason)) {
                    $message = sprintf($lang['adm_dm_planet_added'], $row['id_owner'], $row['name'], $row['id'], uni_render_coordinates($row), $points);
                    $isNoError = true;
                } else {
                    $message = $lang['adm_dm_add_err'];
                }
                break;
            default:
                // There too much results - can't apply
                $message = $lang['adm_dm_planet_conflict'] . sprintf($lang[$error_id], mb_strtoupper($id_planet));
                break;
        }
    } else {
        $message = $lang['adm_dm_no_dest'];
    }
} elseif ($id_user || $id_planet) {
Example #19
0
function rpg_level_up(&$user, $type, $xp_to_add = 0)
{
    $q = 1.03;
    switch ($type) {
        case RPG_STRUCTURE:
            $field_level = 'lvl_minier';
            $field_xp = 'xpminier';
            $b1 = 50;
            $comment = 'Level Up For Structure Building';
            break;
        case RPG_RAID:
            $field_level = 'lvl_raid';
            $field_xp = 'xpraid';
            $b1 = 10;
            $comment = 'Level Up For Raiding';
            break;
        case RPG_TECH:
            $field_level = 'player_rpg_tech_level';
            $field_xp = 'player_rpg_tech_xp';
            $b1 = 50;
            $comment = 'Level Up For Research';
            break;
        case RPG_EXPLORE:
            $field_level = 'player_rpg_explore_level';
            $field_xp = 'player_rpg_explore_xp';
            $b1 = 10;
            $comment = 'Level Up For Exploration';
            $q = 1.05;
            break;
        default:
            break;
    }
    $xp =& $user[$field_xp];
    if ($xp_to_add) {
        $xp += $xp_to_add;
        db_user_set_by_id($user['id'], "`{$field_xp}` = `{$field_xp}` + '{$xp_to_add}'");
    }
    $level = $user[$field_level];
    while ($xp > rpg_xp_for_level($level + 1, $b1, $q)) {
        $level++;
    }
    $level -= $user[$field_level];
    if ($level > 0) {
        db_user_set_by_id($user['id'], "`{$field_level}` = `{$field_level}` + '{$level}'");
        rpg_points_change($user['id'], $type, $level * 1000, $comment);
        $user[$field_level] += $level;
    }
}
Example #20
0
lng_include('infos');
//darkmater constant
$darkmater_cost = $config->rpg_officer;
$sn_data_dark_matter_db_name = $sn_data[RES_DARK_MATTER]['name'];
// Si recrutement d'un officier
if ($mode == 2) {
    if ($user[$sn_data_dark_matter_db_name] >= $darkmater_cost) {
        $Selected = $offi;
        if (in_array($Selected, $sn_data['groups']['mercenaries'])) {
            $Result = IsOfficierAccessible($user, $Selected);
            if ($Result == 1) {
                $selected_db_name = $sn_data[$Selected]['name'];
                $user[$selected_db_name] += 1;
                $user[$sn_data_dark_matter_db_name] -= $darkmater_cost;
                doquery("UPDATE {{users}} SET `{$selected_db_name}` = `{$selected_db_name}` + 1 WHERE `id` = '{$user['id']}';");
                rpg_points_change($user['id'], RPG_MERCENARY, -$darkmater_cost, "Spent for officer {$lang['tech'][$Selected]} ID {$Selected}");
                $Message = $lang['off_recruited'];
                header("Location: officer.php");
                ob_end_flush();
                die;
            } elseif ($Result == -1) {
                $Message = $lang['off_maxed_out'];
            } elseif ($Result == 0) {
                $Message = $lang['off_not_available'];
            }
        }
    } else {
        $Message = $lang['off_no_points'];
    }
    message($Message, $lang['tech'][600], 'officer.' . PHP_EX, 5);
} else {