Короче, для того чтобы понять зачем такая структура cfg, то смотрите "Диаграму".
Главная идея чтобы был точный процент выпадания подарка, неважно какого, а потом уже определяется какой будет подарок по шансу каждого.
Если есть ещё вопросы, то просто покажу логику компилятора:
1. Создается рандомно число (GetURandomFloat() в итоге сразу процент).
2. Рандомное сохраняется и дальше будет использоваться (чтобы не делать кучу рандомов что противоречит логики рулетки(крутануть рулетку надо один раз)).
3. Рандомное число сравнивается с All_Chance, если истинна то функция идет дальше.
Тут немного остановимся и представим что у нас 3 одинаковых шанса подарков к примеру 33.33, в итоге процент выпадание подарка даже при All_Chance 100, равно 33,33. В пункте 4 решаем эту проблему
4. Добавляем переменную lastChance которая пока равна нулю, она нужна будет, для того чтобы хранить сумму последних шансов которые не создали подарок
5. После перебирается конфиг и сравнивает рандом с шансом каждого подарка + сумма последних шансов которые не вызвали создание подарка * на константу (All_Chance/100(переводим All_Chance в процент)/100(переводим Chance подарка в процент)). В итоге получается процент как на диаграмме.
6. При вхождении в условие if(curChance <= (KvGetNum(g_hKeyValues, "Chance", 20)*g_iAllChanceMultiplier)+lastChance) создается подарок и возвращает ничего (return;) чтобы дальше функция не шла.