[2.2.3]очистка руды

Перейти вниз

[2.2.3]очистка руды

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

nCount - порядковый номер блока.
OreName - руда которую чистим.
Recource_Item - предмет получаемый при очистке.
Cutting_probability - шанс что выпадет именно этот предмет.
1000 = 100% - автоподсчёт значения "Cutting_probability" , где 1000 = 1%
______________________________________________________________________________________________________
сама структура
Код:

[filemask="OreCutting.dat"]struct OreCuttingFile{u32 nBlocks;u32 nColumns;u32 nSize;child OreCuttingBlock [count=nBlocks];}struct OreCuttingBlock [preload=1]{u32 nCount;cstr [len=64] OreName;cstr [len=64] Resource_Item;u32 [tag="Cutting_probability"] DWORD;calc "1000 = 1%" [value=Cutting_probability/21474];}
______________________________________________________________________________________________________
Чуть расскажу о механике очистки из гига 3 сурсов. Думаю она не очень то изменилась.
Создаётся таблица очистки руды
для каждой руды по принципу:
Руда-Итем1-cuttingProb1-DwCumRate1
-------Итем2-cuttingProb2-DwCumRate2
-------Итем3-cuttingProb3-DwCumRate3
Где DwCumRate1 = cuttingProb1
DwCumRate2 = cuttingProb1+cuttingProb2
и так далее. Т.е. следующий кам рейт равен предыдущему + шанс для данной вещи
Притом что Сумма всех рейтов предмета в 1 руде не должна превышать 0x7fff7fff Так как это максимальное число которое получается по формуле расчёта рандомного числа для сравнения:
DwRand= Rand()*65536+Rand()
Далее этот DwRand последовательно сравнивается с каждым DwCumRate для каждой вещи из списка очистки
И в тот момент когда он оказывается меньше чем dwCumRate
Эта вещь выпадает игроку в буфер Очищеной руды.
____________________________________________________________________________________________________
Еще кусочек о процессе очистки:
Все знаю что с +1 падает мало а с +3 побольше и повкуснее.
Это зависит от Мин и Макс CRandoma в таблице руды. (см топик структыры руды)
Рассмотрим цикл из сервера
Код:

for(i = 0; i < byProcessNum; i++) //Количество единиц руды которые вы засунули в обработку
{
nKindNum = ::rand()%(pOreFld->m_nmax_C_random - pOreFld->m_nmin_C_random + 1)+pOreFld->m_nmin_C_random; //Это сколько раз будет обработана 1 единица руды.
for(int k = 0; k < nKindNum; k++)
{
//0x7FFF7FFF Максимальная сумма шансов листа очистки
DWORD dwR1 = ::rand();
DWORD dwRand = (dwR1<<16)+::rand(); //Собственно формула описанная в топике выше

DWORD dwResIndex = g_Main.m_tblOreCutting.GetOreIndexFromRate(pOreFld->m_dwIndex, dwRand); //Это запрос в таблицу очистки на поиск итема из листа очистки для данного случайного шанса
if(m_Param.m_wCuttingResBuffer[dwResIndex] < 0xFF) //Количество 1 выпавшей вещи не может превышать 256 единиц
m_Param.m_wCuttingResBuffer[dwResIndex]++;
}
}

Остановимся на nKindNum
значение минимума и максимума после вычислений для руды +1 +2 и +3 принимают значения 3 4 5
Это делитель для рандомного числа. Так как нам нужен только остаток изза % деления
то для руды +1 остаток и значение nKindNum будет 1 2 ,для +2 - 1 2 3, для +3 - 1 2 3 4
Это число определяет будет ли из списка лута выпадать ресурс (если 0 но 0 невозможен так как складывается с минимальным шансом а он всегда 1 но можете переписать сами) то фиг упадёт что
и если будет, то сколько раз (1 2 3 4)
Надеюсь понятно написал

Admin
Admin

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

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

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

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


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