Заточка и ItemUpgrade.dat в 2.2.3

Перейти вниз

Заточка и ItemUpgrade.dat в 2.2.3

Сообщение  Admin в Пн Дек 06, 2010 12:53 pm

Структура
Код:

[filemask="ItemUpgrade.dat",tableview = 1]

struct ItemUpgradeFile
{
u32 nBlocks;
u32 nColumns;
u32 nSize;
child ItemUpgradeBlock [count=nBlocks];
}

struct ItemUpgradeBlock [preload=1]
{
u32 nCount;
cstr [len=64] ItemCode;
cstr [len=64] ItemName;
u32 [tag="Номер Т1-5 камня"] DWORD;
float [tag="Увеличение шанса заточки"] DWORD;
u32 [tag="Торс"] DWORD;
u32 [tag="Ноги"] DWORD;
u32 [tag="Руки"] DWORD;
u32 [tag="Ступни"] DWORD;
u32 [tag="Голова"] DWORD;
u32 [tag="Щит"] DWORD;
u32 [tag="Оружие ББ"] DWORD;
u32 [tag="Оружие ДБ"] DWORD;
u32 [tag="Неизвестно", hidden=1] DWORD;
u32 [tag="Антиграв"] DWORD;
u32 [tag="Номер талики"] DWORD;
u32 [tag="Тип значения эффекта"] DWORD;
float [tag="Эффект заточки +1"] DWORD;
float [tag="Эффект заточки +2"] DWORD;
float [tag="Эффект заточки +3"] DWORD;
float [tag="Эффект заточки +4"] DWORD;
float [tag="Эффект заточки +5"] DWORD;
float [tag="Эффект заточки +6"] DWORD;
float [tag="Эффект заточки +7"] DWORD;
}


Номер Т1-5 камня - Талика - 0. А с камнями модификации немного по другому:


Шанс заточки - Берем калькулятор и считаем
Базовые шансы заточки
Код:

100% = 10000

/// Успешная Заточка

Белое {1000, 750, 500, 250, 100, 50, 0},
Интовое {1000, 750, 500, 250, 100, 50, 0},
Фиолетовое {1000, 750, 500, 250, 100, 50, 0},
Спринт {1000, 750, 500, 250, 100, 50, 0},
Синий Реликт {328, 246, 164, 82, 49, 16, 0},
Антиграв {640, 480, 320, 160, 96, 32, 0},
Голубой Реликт {512, 384, 256, 128, 77, 26, 0},
Зеленый Реликт {410, 307, 205, 102, 61, 20, 0},
Леон {800, 600, 400, 200, 120, 40, 0},
PvP оружие {262, 197, 131, 66, 39, 13, 0}

/// Предмет Уничтожен

Белое {0, 0, 0, 0, 1600, 3200, 6400},
Интовое {0, 0, 1200, 1600, 3000, 6800},
Фиолетовое {0, 0, 0, 1000, 2250, 3500, 5750},
Стринт {0, 750, 1125, 1500, 2375, 3250, 4625},
Синий Реликт {2400, 3940, 6170, 6790, 7470, 8220, 9040},
Антиграв {7000, 7700, 8470, 9320, 10000, 10000, 10000},
Голубой Реликт {4900, 6160, 7620, 8390, 9220, 10000, 10000},
Зеленый Реликт {3420, 4930, 6860, 7550, 8300, 9130, 10000},
Леон {10000, 10000, 10000, 10000, 10000, 10000, 10000},
PvP оружие {1680, 3150, 5560, 6110, 6720, 7400, 8140}

/// Талика Уничтожена

Белое {0, 0, 0, 0, 2000, 4000, 8000},
Интовое {0, 0, 2400, 3200, 6000, 8800, 9500},
Фиолетовое {0, 0, 0, 2000, 4500, 7000, 9500},
Стринт {0, 3000, 4500, 6000, 9500, 9500, 9500},
Синий Реликт {0, 7300, 9500, 9500, 9500, 9500, 9500},
Антиграв {0, 4300, 6400, 8600, 9500, 9500, 9500},
Голубой Реликт {0, 5100, 7600, 9500, 9500, 9500, 9500},
Зеленый Реликт {0, 6100, 9100, 9500, 9500, 9500, 9500},
Леон {0, 3600, 5400, 7200, 9500, 9500, 9500},
PvP оружие {0, 8700, 9500, 9500, 9500, 9500, 9500}

Нам нужна "Успешная Заточка". Возьмем за пример Стринт оружие и шанс заточки на +5 (100).

1). Умножаем базовый шанс на сумму камней или на 0,125 вместо шанса камня если камень отсутствует. (В данном случае умножаю на сумму камней Т2). (Шанс 1 т2 камня = 0.5 4 камня = 2) (Если камней нет то 0.125*4=0.5)
100 * 2 = 200

2). Умножаем получившиеся число на 100 и делим на 4.
200 * 100 / 4 = 5000

3). Умножаем на соотношение 30 к уровню предмета. Возьмем для примера 45 уровень:
30/45 = 0.666667 (30/30=1 30/60=0.5 т.е. шанс заточить предмет 30 уровня в 2 раза больше чем 60-го.).

5000 * 0,666667 = 3333

Всё, шанс заточки на +5 45 стринта с камнями т2 = 33,33%.

Если значение наше (3333) больше случайного 4 значного числа, то успешная заточка если меньше, то рассчитываем шанс на слёт таликов и на сжигание оружия согласно таблицам шансов.
С этим проще. Число из таблицы сразу сравнивается с 4 значным случайным числом.
Сначала проверка на уничтожение предмета. Если предмет выжил то на слёт таликов.
0 в таблице шансов означает что предмет никогда не заточится камнями.
любые шансы которые после вычисления превысят 4 значеное число будет считаться 100% заточкой.
0 в таблице сгорания или слётся означает что талики никогда не слетят и вещь никогда не сгорит (безопасная заточка) 10000 означает сто вещь сгорит или талики слетят со 100% шансом. (как у леона)
Если вещь цела и талики не слетели, то у вас просто сгорят камни и талика а вещь не пострадает.

* - умножение
/ - деление

Торс, Ноги, Руки, Ступни, Голова, Щит, Оружие ББ, Оружие ДБ, Антиграв - Кол-во возможных модификаций:
0 - нельзя модифицировать.
1 - можно модифицировать на +1.
7 - можно модифицировать на +7 и т.д.

Тип Значения Эффекта - Тут все просто, 1 это эффект в процентах, 2 это эффект в простых единицах.

Эффект заточки +1-7 - Думаю и так понятно. Эффект заточки от +1 до +7 для талик.

Гайд по эффектам заточки в клиенте (Item.edf) - Клиент нету

По умолчанию
100% имитатор заточки РФО. Из закрытого выложил.

Разработано мной на основе кода сервера 2.2.3
Код:

// RFOUpgradeGen.cpp : Defines the entry point for the console application.
//by TriRozhka

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "time.h"
using namespace std;

void main()
{
setlocale (LC_ALL,".1251");
int nStartValue = time(NULL);
srand(nStartValue);
int WeapType = 15;
int WeapLvl = 100;
int WeapUpgLv = 7;
int JewelType[3];
int a;
float fRate = 0.0f;
int Num = 0;
int Chanse[10][7] =
{
{1000, 750, 500, 250, 100, 50, 0},
{1000, 750, 500, 250, 100, 50, 0},
{1000, 750, 500, 250, 100, 50, 0},
{1000, 750, 500, 250, 100, 50, 0},
{328, 246, 164, 82, 49, 16, 0},
{640, 480, 320, 160, 96, 32, 0},
{512, 384, 256, 128, 77, 26, 0},
{410, 307, 205, 102, 61, 20, 0},
{800, 600, 400, 200, 120, 40, 0},
{262, 197, 131, 66, 39, 13, 0}
};
float JewelValue[6][2] = {{0, 0.125}, {1, 0.25}, {2, 0.5}, {3, 1}, {4, 1.5}, {5, 2}};
std::cout<<"Задайте число повторений операций с одинаковыми параметрами от 1 до 100\n";
while(Num > 100 || Num < 1)
{
std::cin>>Num;
}
std::cout<<"Задайте тип оружия или брони согласно списку:\n 0:Белое\n 1:Интовое\n 2:Фиолетовое\n 3:Стринт\n 4:Синий реликт\n 5:Антиграв\n 6:Голубой реликт\n 7:Зелёный реликт\n 8:Леон\n 9:Пвп оружие\n";
while(WeapType > 9)
{
std::cin>>WeapType;
}
std::cout<<"Задайте уровень оружия или брони от 1 до 65\n";
while(WeapLvl < 1 || WeapLvl > 65)
{
std::cin>>WeapLvl;
}
std::cout<<"Задайте число установленных талик от 0 до 6\n";
while(WeapUpgLv > 6)
{
std::cin>>WeapUpgLv;
}
for(int i = 1; i < 5; i++)
{
int JewelKind = 6;
while(JewelKind > 5)
{
a = i - 1;
std::cout<<"Задайте тип "<<i<<" камня\n 0:Без камня 1:Т1 2:Т2 3:Т3 4:Т4 5:Т5\n";
std::cin>>JewelKind;
}
fRate += JewelValue[JewelKind][1];
}
int count = 0;
while(count !=Num)
{
int dwR1 = ::rand();
int dwRand = (dwR1<<16)+::rand();
int TotalRate = (Chanse[WeapType][WeapUpgLv]*fRate*3000)/(4*WeapLvl);
if(TotalRate <= dwRand%100000)
{
int Miss[10][7] =
{
{0, 0, 0, 0, 1600, 3200, 6400},
{0, 0, 1200, 1600, 3000, 6800},
{0, 0, 0, 1000, 2250, 3500, 5750},
{0, 750, 1125, 1500, 2375, 3250, 4625},
{2400, 3940, 6170, 6790, 7470, 8220, 9040},
{7000, 7700, 8470, 9320, 10000, 10000, 10000},
{4900, 6160, 7620, 8390, 9220, 10000, 10000},
{3420, 4930, 6860, 7550, 8300, 9130, 10000},
{10000, 10000, 10000, 10000, 10000, 10000, 10000},
{1680, 3150, 5560, 6110, 6720, 7400, 8140}
};
int Lost[10][7] =
{
{0, 0, 0, 0, 2000, 4000, 8000},
{0, 0, 2400, 3200, 6000, 8800, 9500},
{0, 0, 0, 2000, 4500, 7000, 9500},
{0, 3000, 4500, 6000, 9500, 9500, 9500},
{0, 7300, 9500, 9500, 9500, 9500, 9500},
{0, 4300, 6400, 8600, 9500, 9500, 9500},
{0, 5100, 7600, 9500, 9500, 9500, 9500},
{0, 6100, 9100, 9500, 9500, 9500, 9500},
{0, 3600, 5400, 7200, 9500, 9500, 9500},
{0, 8700, 9500, 9500, 9500, 9500, 9500}
};
if(Miss[WeapType][WeapUpgLv] > ::rand()%10000)
{
std::cout<<"Предмет уничтожен\n";
count += 1;
}
else if(Lost[WeapType][WeapUpgLv] > ::rand()%10000)
{
std::cout<<"Талики уничтожены\n";
count += 1;
}
else
{
std::cout<<"Модификация неудачна\n";
count += 1;
}
}
else
{
std::cout<<"Модификация успешна\n";
count += 1;
}
}
std::cout<<"\n Вычисление завершено.\n Для выхода нажмите любую клавишу";
_getch();
}

Коротко поясню:
% дробная часть после деления на число
<< сдвиг эквивалентно умножению на 2 соответственно <<16 = * 2 в 16 степени то есть умножение на 65536
rand - псевдо-случайное число.
Формула ля тех кто совсем не смыслит :
Есть таблица шансов для каждого грейда вещи от 0 до 11 грейд это тип белое интв виолет тип С реликт.... в программе только 10 типов так как 11 в игре не используется.
та вот на каждый грейд прописан шанс на вставку каждой талики от 1 до 7
7 как вы заметили везде 0 так как серверно заточка руками отключена.
далее расчёт шанса:
базовый шанс относительно типа оружия и вставляемой талики, умножается на сумму шансов камней или 0.125 если камня нету, умножается на 100 и делится на 4
далее это всё умножается на отношение 30 к уровню оружия то есть 30 / 30 =1 а 30 / 60 = 0.5 то есть шанс вточить оружие 30 лвла в 2 раза больше чем 60
И всё это сравнивается с 5 значным рандомным числом.
Если значение наше больше то успешная заточка если меньше то расчитываем шанс на слёт таликов и на сжигание оружия согласно таблицам шансов Мисс на сжигание и Лост на слёт таликов если ни то ни сё то у вас просто сгорят камни и талика а вещь не пострадает.

Admin
Admin

Сообщения : 71
Дата регистрации : 2010-12-06
Возраст : 26
Откуда : Москва

Посмотреть профиль http://rf-moscow.2x2forumy.net

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения