Врата в игры
| Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Gansalas, Unknow 
Форум » Online Game » Форум RF online » Исследование алгоритма заточки предметов
Исследование алгоритма заточки предметов
UnknowДата: Понедельник, 30.06.2008, 21:46 | Сообщение # 1
Генерал-майор
Группа: Шериф
Сообщений: 355
Награды: 0
Репутация: 31
Статус: Offline
Итак, благодаря одному из участников форума(а конкретнее Airsimer, за что ему большое спасибо) мне в руки попались исходники сервера RF Online Giga3. Скажу сразу - версия старая, серверов на ее основе сейчас практически нет и современная ситуация может сильно отличаться от описанной. Тем более, исходники неполные и в рабочий сервер скомпилировать их мне не удалось.

Но зато появилась возможность посмотреть и выяснить давно мучавший меня вопрос, а именно - алгоритм работы Великого Корейского Рандома, вокруг которого ходило много мифов и легенд и сломано немало копий в спорах. И хотя версия устарела, не думаю, что принцип работы Giga3 будет сильно отличаться от современных версий.

Хочу сразу разочаровать любителей рецептов типа "убить флема в новолуние, забрать лут и выкинуть перед Героем помахав рукой - 100% точка!" - таких алгоритмов в исходниках мне обнаружить не удалось. Конечно, тут могут возразить - "а как же точатся на +7, я сам видел!". Точатся. Но не обычным способом, а с помощью одного финта, о котором я расскажу ниже.

Итак, главный вывод, который я вынес из просмотра исходников - Корейский Рандом существует!
Именно так - основная функция, с помощью которой оценивается успешная заточка и последствия неуспешной - стандартная функция С rand(). Вообще по стандарту эта функция возвращает случайное число типа float в промежутке от 0 до 1. Единственное, что влияет на ее значение - так называемое начальное значение, задаваемое функцией srand(). Так вот, начальное значение этой функции является текущее время, вернее, его преобразованное числовое значение

PHP код:
srand((unsigned)time(NULL));
Но это знание ничего нам не дает, кроме того, что рецепты типа "точись в полночь!" не так уж и необоснованы.

Идем дальше.

За заточку предмета отвечает функция pc_UpgradeItem, находящаяся в файле player.cpp. Рассмотрим ее подробнее.

С самого начала идут многочисленные проверки на соответствие предметов, слотов, таликов, камней и прочей. Кстати, все несоотвествия логируются по умолчанию, так что пакетчики - будьте осторожны!

Дальше начинается самое интересное.

1. Устанавливается рейт на основании использованных камней. Рейты каждого камня берутся из базы и суммируются. Рейт без камня - 0,125.
PHP код:
for(int i = 0; i < upgrade_jewel_num; i++)
{
if(!pJewelFld[i])
fRate += 0.125;
else
fRate += pJewelFld[i];
}
2. Далее вычисляется рейт вещи в зависимости от ее уровня

PHP код:
BYTE GetItemUpgedLv(DWORD dwLvBit)
{
BYTE byLv = 0;
for(int g = 0; g < MAX_ITEM_LV; g++)
{
BYTE byTemp = (BYTE)((dwLvBit>>(g*4))&0x0000000F);
if(byTemp == __NO_TALIK)
break;
byLv++;
}
return byLv;
}
конструкция не совсем ясна, но насколько я понял, вычисляемый левел - количество УЖЕ вставленных таликов - каждый бит переменной dwLvBit соответствует вставленному талику. Левелов всего 7, что вполне естественно. Похоже, от типа вставленных таликов зависимости нет.
Небольшое дополнение - рейт вещи вычисляется на основании вставленных таликов + учитывается вставляемый талик. Т.е. при расчете вещь считается уже проталеной, поэтому далее в конструкциях switch - case есть число 7.

3. Вычисляется общий, базовый рейт
PHP код:
dwTotalRate = s_dwItemUpgSucRate[byLv]*fRate/upgrade_jewel_num)*1000;
значение s_dwItemUpgSucRate зависит от левела и является массивом
s_dwItemUpgSucRate[] = {100, 75, 50, 25, 10, 5, 1};

4. Берется рандом.

PHP код:
DWORD dwR1 = rand();
DWORD dwRand = (dwR1<<16)+rand();
5. Первая проверка - талик вставится или сгорит

dwTotalRate <= dwRand%100000

сравнивается базовый рейт и рандом.

6. если первая проверка прошла(базовый рейт меньше либо равен рандому) идет проверка - сгорят ли уже вставленные талики
PHP код:
switch(byLv)
{
case 5:
if(125 > ::rand()%1000)
bTalikBreak = true;
break;
case 6:
if(250 > ::rand()%1000)
bTalikBreak = true;
break;
case 7:
if(500 > ::rand()%1000)
bTalikBreak = true;
break;
}
это зависит от рейта вещи, т.е. уже вставленных таликов и.... заново вычиляемого рандома.

7. Если талики не сгорают, то вычисляется поломка вещи

PHP код:
bool bItemBreak = false;
switch(byLv)
{
case 5:
if(125 > ::rand()%1000)
bItemBreak = true;
break;
case 6:
if(250 > ::rand()%1000)
bItemBreak = true;
break;
case 7:
if(500 > ::rand()%1000)
bItemBreak = true;
break;
Опять же, зависит от рейта вещи и заново вычисляемого рандома.

После этого выполняются необходимые действия - уничтожение вещи, таликов или помещение в слот успешно модифицированного оружия.

Ниже расположена ссылка на исходный код программы, которая реализует описанный алгоритм. Можете сами попробовать ее скомпилировать и поэкспериментировать с различными комбинациями - вставленными таликами и камнями.

Да, насчет точки +7. В исходнике имеется следующая конструкция:

if(m_bCheat_100SuccMake)
dwTotalRate = 0xFFFFFFFF;

эта переменная при установке ее в значение true дает 100% шанс создания и модификации предмета.
переменная является параметром чара и устанавливается владельцем базы. возможно, GM имеют такой флаг и без проблем делают пухи +7. Обычным методом заточить на +7 очень маловероятно.

Любые дополнения и исправления к статье приветствуются. Все вопросы в ПМ либо тут.


Помог?тык на спасибку)
 
GansalasДата: Понедельник, 30.06.2008, 22:28 | Сообщение # 2
Генерал-майор
Группа: Шериф
Сообщений: 422
Награды: 0
Репутация: 28
Статус: Offline
И ты уже раздуплился лично я не вдупляю uhm uhm uhm


 
UnknowДата: Понедельник, 30.06.2008, 22:42 | Сообщение # 3
Генерал-майор
Группа: Шериф
Сообщений: 355
Награды: 0
Репутация: 31
Статус: Offline
Лол ет язык програмера cool

Помог?тык на спасибку)
 
fuflikДата: Вторник, 09.09.2008, 19:13 | Сообщение # 4
Рядовой
Группа: Гражданин
Сообщений: 13
Награды: 0
Репутация: 0
Статус: Offline
Quote (Unknow)
Лол ет язык програмера

это написал Stim со старчитс а ты скопировал,хотьбы копирайты ставил...
 
UnknowДата: Среда, 10.09.2008, 10:47 | Сообщение # 5
Генерал-майор
Группа: Шериф
Сообщений: 355
Награды: 0
Репутация: 31
Статус: Offline
Я не понял,я сказал што ето я написал сам?=\

Помог?тык на спасибку)
 
fuflikДата: Среда, 10.09.2008, 11:12 | Сообщение # 6
Рядовой
Группа: Гражданин
Сообщений: 13
Награды: 0
Репутация: 0
Статус: Offline
Quote (Unknow)
мне в руки попались исходники

что значит мне?ладно не буду пресовать...
 
antarijДата: Четверг, 18.09.2008, 00:15 | Сообщение # 7
Генерал-лейтенант
Группа: Гражданин
Сообщений: 640
Награды: 0
Репутация: 0
Статус: Offline
cool biggrin <_< angry

КИДАЙТЕСЬ В МНЯ ПЛЮСАМИ
 
UnknowДата: Вторник, 23.09.2008, 13:44 | Сообщение # 8
Генерал-майор
Группа: Шериф
Сообщений: 355
Награды: 0
Репутация: 31
Статус: Offline
бгг пресовать happy
омг ты злой тип)))

Помог?тык на спасибку)
 
Форум » Online Game » Форум RF online » Исследование алгоритма заточки предметов
Страница 1 из 11
Поиск:


Copyright MyCorp © 2012

Создать сайт бесплатно