% ыпадения карт

Тема в разделе "Общий", создана пользователем Naruto DX, 14 окт 2008.

Статус темы:
Закрыта.
  1. Athe1st

    Athe1st Игрок

    мб потому что я не играю в ро уже как пол года?)
  2. Сибиряк

    Сибиряк Игрок

    А зря, зря. Возвращайся
  3. Rumpelshtilski

    Rumpelshtilski Игрок

    Я понимаю что ты пишеш. Нет понятия "Китайский рандом" есть "Корейский рандом", которое пошло как раз с онлайн игр созданых в Корее. Китайцы тут вообще ниочем.
  4. Mr Эго

    Mr Эго Игрок

    бывало что за 100 СВ падала карта.
    Вообще все эти потуги похожи на то, как обмануть судьбу..
    Если представить, что дроп Ро аналогичен рулетке, то шанс 0.03 в моем понимании равен с первой попытки выиграть бинго у колеса с 3333 чисел.
    вот а сколько раз его крутить нужно?
    да этой основе и построены все казино, что никто не знает что выпадет.
    Это еще с древних времен люди пытаются обмануть судьбу и фортуну.
  5. X

    X Играет за мобов
    Команда форума

    Я не люблю детально разбирать аспекты игры вместе с игроками. Это убивает интерес к ним, и сводит "на нет" существующие легенды, которыми пользователи Рун-Мидгарда время от времени то и дело утешали себя, или пытались по ним выяснить истину.

    *вздохнул*

    Давайте проанализируем код "дропа". Она располагается в mob.c, поскольку используется в большинстве случаев при смерти монстра.
    http://svn.eathena.ws/svn/ea/trunk/src/map/mob.c

    Код:
    // Item Drop
             struct item_drop_list *dlist = ers_alloc(item_drop_list_ers, struct item_drop_list);
             struct item_drop *ditem;
             int drop_rate;
             dlist->m = md->bl.m;
             dlist->x = md->bl.x;
             dlist->y = md->bl.y;
             dlist->first_charid = (mvp_sd ? mvp_sd->status.char_id : 0);
             dlist->second_charid = (second_sd ? second_sd->status.char_id : 0);
             dlist->third_charid = (third_sd ? third_sd->status.char_id : 0);
             dlist->item = NULL;
    Инициализация переменных и массивов, необходимых для работы кода.

    Код:
            for (i = 0; i < MAX_MOB_DROP; i++)
     {
    Инициализация цикла, который зависит от значения MAX_MOB_DROP. Он определяет, сколько раз цикл будет запущен. Цикл, вычисляющий вероятность падения после смерти монстра.
    MAX_MOB_DROP - максимальное количество предметов, которые монстр может "дропать" при своей смерти.
    По умолчанию, в mob.h MAX_MOB_DROP = 10.
    Например: Poring может "дропнуть" один или несколько предметов. Jellopy, Knife, Sticky Mucus, Apple, Empty Bottle, Unripe Apple, Poring Box, Poring Coin или Poring Card. Всего 9 предметов, которые он может "дропнуть".
    MAX_MOB_DROP устанавливает значение, сколько таких "слотов" для "дропаемых" предметов у монстра может быть максимум. Т.е. монстр не может "дропнуть" более 10 разновидностей предметов (включая карту).
    Итог: В соответствии с MAX_MOB_DROP, данный цикл будет запущен 10 раз. Для выяснения вероятности упасть одному\нескольким из 10 предметов.

    Код:
                if (md->db->dropitem[i].nameid <= 0)
                     continue;
                 if (!itemdb_exists(md->db->dropitem[i].nameid))
                     continue;
    Две проверки.
    1. На наличие предмета в соответствующем слоте у монстра в соответствии с mob_db.txt. Вы можете убедиться сами, что у многих монстров Drop6id, Drop7id, Drop8id и Drop9id слоты = 0, т.е. предметов в них нет.
      continue;
      - пропускает данный предмет, и заставляет запустить цикл снова, для перехода к следующему слоту по порядку из 10.
    2. На существование указанного в слоте ID предмета в item_db.
    Код:
    drop_rate = md->db->dropitem[i].p;
    Установка переменной drop_rate = указанному в mod_db.txt Drop№per, т.е. установка вероятности, в соответствии с базовой, которая заложена в БД (которая отображается у монстров в Библиотеке).
    Код:
                if (drop_rate <= 0) {
                     if (battle_config.drop_rate0item)
                         continue;
                     drop_rate = 1;
                 }
    Проверка на положительность переменной drop_rate. Если переменная = 0 (т.е. если в БД монстров вероятность "дропа" этого предмета = 0), то переменная меняется на = 1.
    Если в настройках сервера включен режим drop_rate0item, то если drop_rate = 0, то предмет не будет иметь вероятности "дропнуться", т.е. выбить его будет невозможно.
    N.B. По умолчанию, этот режим отключён. Как и у нас, в нашем Игровом Мире. Его использование актуально например в случае, если вы (администратор) определились с тем, какой предмет будет падать, но не знаете, с каким шансом - вы не указываете шанс в БД. И тогда, предмет не будет "дропаться" до тех пор, пока вы не укажете шанс в БД, но предмет будет расцениваться, как "падающий вот с этого монстра".
    Код:
                // change drops depending on monsters size [Valaris]
                 if(md->special_state.size==1 && drop_rate >= 2)
                     drop_rate/=2;
                 else if(md->special_state.size==2)
                     drop_rate*=2;
    Эта часть кода изменяет вероятность в зависимости от размера монстра. Обратите внимание:
    • Если монстр маленький (small), и вероятность падения предмета > или = 2 (0.02%, т.е. это не может быть карта), то вероятность падения предмета делится на 2.
    • Если монстр большой (big), то вероятность падения предмета умножается на два.
    Код:
                if (src) {
                    //Drops affected by luk as a fixed increase [Valaris]
                    if (battle_config.drops_by_luk)
                        drop_rate += status_get_luk(src)*battle_config.drops_by_luk/100;
                    //Drops affected by luk as a % increase [Skotlex] 
                    if (battle_config.drops_by_luk2)
                        drop_rate += (int)(0.5+drop_rate*status_get_luk(src)*battle_config.drops_by_luk2/10000.);
                }
    Если один из режимов, drops_by_luk или drops_by_luk2, запущен, то по их формуле происходит изменение вероятности. У нас этот режим не актуален, да и создавался он лишь для эксперимента, поэтому подробнее эту часть рассматривать не будем.
    Код:
                if (sd && battle_config.pk_mode &&
                    (int)(md->level - sd->status.base_level) >= 20)
                    drop_rate = (int)(drop_rate*1.25); // pk_mode increase drops if 20 level difference [Valaris]
    Если сервер запущен в PK-режиме (как правило, PVP-серверы, хайрейты и т.п.), то по определённой формуле происходит изменение вероятности. У нас этот режим тоже не актуален, поэтому мы тоже опустим этот момент.

    Код:
                // attempt to drop the item
                if (rand() % 10000 >= drop_rate)
    Момент истины.
    Сервер генерирует псевдослучайное число от 0 до 10000 (100%).
    Если сгенерированное число меньше значения drop_rate, который мы получили ранее, то...
    Код:
                {    // Double try by Bubble Gum
                    if (!(mvp_sd && mvp_sd->sc.data[SC_ITEMBOOST] && rand() % 10000 < drop_rate))
                        continue;
                }
    ...в случае, если у Вас активирован Bubble Gum(увеличивает вероятность "дропа"), сервер попробует ещё раз сгенерировать вероятность "дропа", предварительно увеличив её под воздействием эффекта Bubble Gum.

    - Если сгенерированное число меньше значения drop_rate, то цикл прекращает свою работу, и переходит к следующему предмету у монстра, ничего не отдавая пользователю.
    - Если сгенерированное число больше или равно значения drop_rate, то сервер...
    Код:
                ditem = mob_setdropitem(md->db->dropitem[i].nameid, 1);
    ... вносит в кэш факт о том, что этот монстр после окончании обработки всех 10ти циклов должен будет выбросить предмет этого цикла.

    Код:
                //A Rare Drop Global Announce by Lupus
                if( drop_rate <= battle_config.rare_drop_announce )
                {
                    struct item_data *i_data;
                    char message[128];
                    i_data = itemdb_search(ditem->item_data.nameid);
                    sprintf (message, msg_txt(541), (mvp_sd?mvp_sd->status.name:"???"), md->name, i_data->jname, (float)drop_rate/100);
                    //MSG: "'%s' won %s's %s (chance: %0.02f%%)"
                    intif_GMmessage(message,strlen(message)+1,0);
                }
    Если сервер настроен так, что после падения предмета он должен воспроизводить публичное объявление, он делает публичное объявление (он же броадкаст).

    Ну и наконец, завершение:
    Код:
    // Announce first, or else ditem will be freed. [Lance]
                // By popular demand, use base drop rate for autoloot code. [Skotlex]
                mob_item_drop(md, dlist, ditem, 0, md->db->dropitem[i].p, flaghom);
            }
    Вызов функции mod_item_drop, который достанет из кэша информацию о недавно занесённым в него предмете, о том что он должен упасть. И далее, функция выполняет инициализацию "дропа", т.е. в буквальном смысле роняет предмет на землю.

    На этом, цикл вычисления вероятности дропа по каждому из 10 слотов завершается, и переходит к следующему слоту. Далее идёт код, который не относится к поставленному вопросу, поэтому рассматривать его мы не будем.

    Вывод:
    Вероятность падения предмета вычисляется каждый раз заного. Закономерности - нет.
    Есть только удача, и неудача. 50\50.
    seregas, Восемь, Garrett и 16 другим нравится это.
Статус темы:
Закрыта.