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

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

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

    Athe1st Игрок

    На форуме с:
    12 апр 2008
    Сообщения:
    1,693
    мб потому что я не играю в ро уже как пол года?)
  2. Сибиряк

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

    На форуме с:
    2 июн 2008
    Сообщения:
    3,971
    Адрес:
    Иркутск
    А зря, зря. Возвращайся
  3. Rumpelshtilski

    Rumpelshtilski Игрок

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

    Mr Эго Игрок

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

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

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

    *вздохнул*

    Давайте проанализируем код "дропа". Она располагается в 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 другим нравится это.
Статус темы:
Закрыта.