|
огромный респект тому кто пожет разобраться вот с этим:
.....Хочу сразу разочаровать любителей рецептов типа "убить флема в новолуние, забрать лут и выкинуть перед Героем помахав рукой - 100% точка!" - таких алгоритмов в исходниках мне обнаружить не удалось. Конечно, тут могут возразить - "а как же точатся на +7, я сам видел!". Точатся. Но не обычным способом, а с помощью одного финта, о котором я расскажу ниже.
Итак, главный вывод, который я вынес из просмотра исходников - Корейский Рандом существует! Именно так - основная функция, с помощью которой оценивается успешная заточка и последствия неуспешной - стандартная функция С rand(). Вообще по стандарту эта функция возвращает случайное число типа float в промежутке от 0 до 1. Единственное, что влияет на ее значение - так называемое начальное значение, задаваемое функцией srand(). Так вот, начальное значение этой функции является текущее время, вернее, его преобразованное числовое значение
Код: srand((unsigned)time(NULL)); Но это знание ничего нам не дает, кроме того, что рецепты типа "точись в полночь!" не так уж и необоснованы.
Идем дальше.
За заточку предмета отвечает функция pc_UpgradeItem, находящаяся в файле player.cpp. Рассмотрим ее подробнее.
С самого начала идут многочисленные проверки на соответствие предметов, слотов, таликов, камней и прочей. Кстати, все несоотвествия логируются по умолчанию, так что пакетчики - будьте осторожны!
Дальше начинается самое интересное.
1. Устанавливается рейт на основании использованных камней. Рейты каждого камня берутся из базы и суммируются. Рейт без камня - 0,125.
Код: for(int i = 0; i < upgrade_jewel_num; i++) { if(!pJewelFld[i]) fRate += 0.125; else fRate += pJewelFld[i]; } 2. Далее вычисляется рейт вещи в зависимости от ее уровня
Код: 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. Вычисляется общий, базовый рейт
Код: dwTotalRate = s_dwItemUpgSucRate[byLv]*fRate/upgrade_jewel_num)*1000;
значение s_dwItemUpgSucRate зависит от левела и является массивом s_dwItemUpgSucRate[] = {100, 75, 50, 25, 10, 5, 1}; 4. Берется рандом. Код: DWORD dwR1 = rand(); DWORD dwRand = (dwR1<<16)+rand(); 5. Первая проверка - талик вставится или сгорит
Код: dwTotalRate <= dwRand%100000 сравнивается базовый рейт и рандом.
6. если первая проверка прошла(базовый рейт меньше либо равен рандому) идет проверка - сгорят ли уже вставленные талики
Код: 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. Если талики не сгорают, то вычисляется поломка вещи
Код: 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 очень маловероятно. ___________________________________________
Собственно мне нужна прога для редактирования edf/cw файлов. если кто найдет-отпишитесь тут плииз)
--------------------

|