Гайд: Апгрейд

Апгрейд - улучшение параметров вещей путем применения на них наборов для апгрейда (далее для краткости "набор").

Улучшать моно только броню и оружие. Шлемы улучшать нельзя.

**Целевая вещь** - это то оружие или та броня, которую вы хотите улучшить.

Для того, чтобы начать апгрейд вещи, нужно:

* Купить набор
* Кликнуть правой кнопкой мыши по набору
* Кликнуть левой кнопкой мыши по целевой вещи

После этого откроется **простой диалог апгрейда**.

В левом верхнем углу простого диалога пишется шанс успеха улучшения.
Он зависит только от используемого набора.
Слева можно увидеть текущие параметры вещи, а справа - параметры после улучшения.
После нажатия кнопки "Улучшить", сервер выберет случайное число от 0 до 100.
Если число будет меньше шанса успеха, то вы получите улучшенный предмет.
Если число будет больше - вы потеряете всю прочность целевой вещи и все улучшения, накопленные на ней.

Если нажать на кнопку "Ещё", то откроется **расширенный диалог апгрейда**.
В нем есть два поля для ввода:

* Количество наборов
* Целевой уровень

После нажатия кнопки "Улучшить", игра будет автоматически улучшать предмет пока не выполнится одно из условий:

* Израсходуется указанное количество наборов
* Целевая вещь достигает нужного уровня

Использование расширенного диалога апгейрда обычно называют **автоточка**. Когда говорят "заточил автоточкой на +6", это значит: "был использован расширенный диалог апгрейда, в котором целевой уровень был равен 6 и у игрока было достаточное количество наборов".

## Примерный алгоритм работы заточки

Для иллюстрации процесса заточки будет использоваться абстрактный предмет.

Свойства предмета:

* level - Текущий уровень заточки
* cost - Стоимость заточки до текущего уровня

Апгрейд производится функцией upgrade.

Ее аргументы:

* chanceToSuccess - шанс успешно заточить вещь. Зависит от набора.
* additionalCost - стоимость набора

```
function Item() {
    this.level = 0;
    this.lastLevel = 0;
    this.cost = 0;
    this.upgrade = function (chanceToSuccess, additionalCost) {
        //Если уровень предмета 0 или 1, то просто точим
        if (this.level < 2) {
            this.level ++;
            this.cost += additionalCost;
            return true; // Возвращаем "точка успешна"
        }
        // Если уровень предмета 15, то точить не надо
        if (this.level == 15) {
            this.lastLevel = this.level;
            return false; // Возвращаем "точка провалилась"
        }
        // Бросаем кубик для выбора числа от 0 до 100
        var roll = Math.floor(Math.random() * 100);
        // Сравниваем случайное число и шанс успеха
        if (roll < chanceToSuccess) {
            // Если число в пределах успешных значений, значит точим
            this.level++;
            this.cost += additionalCost;
            return true; // Возвращаем "точка успешна"
        } else {
            // Иначе ломаем и запоминаем на каком уровне точки сломалось
            this.lastLevel = this.level;
            this.level = 0; //Ломаем предмет
            this.cost += additionalCost;
            return false; // Возвращаем "точка провалилась"
        }
    }
}
```

## Шансы заточить вещь автоточкой

* Автор: Взюх
* Источник: сообщение на форуме

* Расчеты были подтверждены игроками
	+ nightmarish в сообщении на форуме
	+ Xudo в сообщении на форуме

Первая мысль: а зачем вообще нужны Продвинутые наборы для апгрейда? за 2000 кредитов они увеличивают шанс апгрейда всего на 3%.

Для иллюстрации разницы между ними была создана программная модель апгрейда, которая действовала по определенным правилам.

Средние статистические данные на 100 000 попыток заточить.

Первый столбик это уровень шмотки, второй это приблизительная цена заточки до этого уровня

### Точка наборами по 67%

Правило программной модели:

* Используются только
 наборы с шансом 67%

Результаты моделирования:

```
[ 1.0] med. price: 1000.0
[ 2.0] med. price: 2000.0
[ 3.0] med. price: 4472.82
[ 4.0] med. price: 8166.31
[ 5.0] med. price: 13722.07
[ 6.0] med. price: 21974.2
[ 7.0] med. price: 34140.18
[ 8.0] med. price: 52677.96
[ 9.0] med. price: 79633.44
[ 10.0] med. price: 120337.54
[ 11.0] med. price: 181395.35
[ 12.0] med. price: 273024.35
[ 13.0] med. price: 409306.16
[ 14.0] med. price: 610761.89
[ 15.0] med. price: 910271.7281518446

```

Алгоритм моделирования:

```
var items = [];
var itemsCount = 1000000;
// Создаем много предметов
for (var i = 0; i < itemsCount; i++) {
    items.push(new Item());
}
// Точим каждый предмет, пока он не сломается, или пока не доточится
for (var i = 0; i < items.length; i++) {
    var temp = items[i].upgrade(67, 1000);
    while (temp) {
        //Пока точка успешна, точим
        temp = items[i].upgrade(67, 1000);
    }
}
```

### Точка разными наборами

Правила программной модели:

* До 10 уровня заточки используются
 наборы с шансом 67%
* С 10-го уровня заточки используются
 наборы с шансом 70%

Результаты моделирования:

```
[ 1.0] med. price: 1000.0
[ 2.0] med. price: 2000.0
[ 3.0] med. price: 4473.27
[ 4.0] med. price: 8205.93
[ 5.0] med. price: 13664.04
[ 6.0] med. price: 21897.42
[ 7.0] med. price: 34203.78
[ 8.0] med. price: 52355.94
[ 9.0] med. price: 79772.42
[ 10.0] med. price: 120824.69
[ 11.0] med. price: 176418.45
[ 12.0] med. price: 257927.55
[ 13.0] med. price: 370259.55
[ 14.0] med. price: 534486.68
[ 15.0] med. price: 766853.4685346853

```

Алгоритм моделирования:

```
var items = [];
var itemsCount = 1000000;
// Создаем много предметов
for (var i = 0; i < itemsCount; i++) {
    items.push(new Item());
}
// Точим каждый предмет, пока он не сломается, или пока не доточится
for (var i = 0; i < items.length; i++) {
    var temp = items[i].upgrade(67, 1000);
    while (temp) {
        //Пока точка успешна, точим
        // Пока предмет меньше некоторого уровня, точим простыми точками
        if (items[i].level < 10) {
            temp = items[i].upgrade(67, 1000);
        } else {
            // Все, что круче - точим улучшенными
            temp = items[i].upgrade(70, 3000);
        }
    }
}
```

## Использование болванок

Если просто использовать автоточку, то расходы на апгрейд одной вещи до +15 будут выглядеть практически заоблачными. 910 и 766 тысяч кредитов. И это только в среднем.

Чтобы оптимизировать затраты, воспользуемся Теорией Вероятности.

Если шанс сломать вещь равен 33%, значит по Теории Вероятности шанс сломать две вещи подряд равен 33% \* 33% = 10.89%.
Следовательно, в целевую вещь нужно вкладывать заточки только когда сломается ненужная.

Ненужную вещь назовем **Болванка** и она использует обычную модель предмета.
Для упрощения, в модель предмета был добавлен метод для "сброса" параметров болванки до "готового" состояния.

```
this.resetIngot = function() {
    this.level = 2;
    this.cost = 2000;
    this.lastLevel = 0;
    }

```

Алгоритм моделирования выглядит следующим образом:

```
var items = [];
var itemsCount = 100000;
// Болванка для точки
var ingot = new Item();
// Создаем много предметов
for (var i = 0; i < itemsCount; i++) {
    items.push(new Item());
}
// Точим каждый предмет, пока он не сломается, или пока не доточится
for (var i = 0; i < items.length; i++) {

    var temp = items[i].upgrade(67, 1000);
    while (temp) {
        //До некоторого уровня точим автоматически
        if (items[i].level < 8) {
            temp = items[i].upgrade(67, 1000);
        } else {
            break;
        }
    }
    while (temp) {
        // Точим болванку пока не сломается
        ingot.resetIngot();
        var ingotSuccess = ingot.upgrade(67, 1000);
        while (ingotSuccess) {
            ingotSuccess = ingot.upgrade(67, 1000);
        }
        // Когда сломалась, кидаем точку в целевую вещь
        items[i].cost += ingot.cost;
        temp = items[i].upgrade(70, 3000);
    }
}
```

По итогам моделирования выяснилось:

* Из 100000 попыток успешными оказываются около 720-760
* Средняя стоимость заточки составляет 900-950 тысяч кредитов.

Результат методов точки **разными наборами** и **с болванками** получается одинаковый, но метод **с болванками** расходует больше кредитов.

## Рефинансирование болванок

Автор: debud

Этот метод продолжает идею метода заточки **с болванками** и основывается на наблюдении за стоимостью болванок при продаже обратно торговцу.

В расчет берутся предметы, требующие 13 уровень. Это топовая классовая броня, которую можно купить на Базе Сопротивления за 3000 кредитов.

Стоимость продажи брони на 13 уровень обратно торговцам:

* апгрейд: +0, цена: 1625
* апгрейд: +1, цена: 1828 (+203)
* апгрейд: +2, цена: 3656 (+1828)
* апгрейд: +3, цена: 5484 (+1828)
* апгрейд: +4, цена: 7312 (+1828)

Если допустить, что апгрейд прошел без порчи, то продажа вещи начиная с уровня апгрейда +4 окупает себя.
Ремонт предмета стоит около 200 кредитов.

Для того, чтобы использовать этот метод апгрейда, нужен максимально расширенный инвентарь и банк. Все свободное место заполняется болванками. Все болванки сначала затачиваются на +2.

После того, как болванки подготовлены, начинается заточка основной вещи. Сначала она автоточкой доводится до некоторого уровня.
Затем начинают затачиваться болванки. Если болванка сломалась, то вкладывается заточка в основную вещь. Если болванка не сломалась до +4, то болванка продается вендору.

Для упрощения модели, была создана функция, которая сбрасывала параметры болванки.

```
function resetIngot(ingot) {
    ingot.lastLevel = 0;
    ingot.level = 0;
    ingot.cost = 3000;
    ingot.upgrade(67, 1000);
    ingot.upgrade(67, 1000);
}
```

Алгоритм моделирования выглядит следующим образом:

```
var targetLevel = 4;
//var ingotLevel = 3;
//var costAtLevel = 5484;
var ingotLevel = 4;
var costAtLevel = 7312;

var items = [];
var itemsCount = 1000000;
// Создаем много предметов
for (var i = 0; i < itemsCount; i++) {
    items.push(new Item());
}
// Болванка для точки
var ingot = new Item();
resetIngot(ingot);
// Точим каждый предмет, пока он не сломается, или пока не доточится
for (var i = 0; i < items.length; i++) {

    var temp = items[i].upgrade(67, 1000);
    while (temp) {
        //До некоторого уровня точим автоматически
        if (items[i].level < targetLevel) {
            temp = items[i].upgrade(67, 1000);
        } else {
            break;
        }
    }
    while (temp) {
        // Точим болванку пока не сломается или пока не заточится на +4
        var ingotSuccess = ingot.upgrade(67, 1000);
        while (ingotSuccess) {
            ingotSuccess = ingot.upgrade(67, 1000);
            //Если заточится до порогового уровня
            if (ingot.level == ingotLevel) {
                //то продаем ее
                items[i].cost += ingot.cost;
                items[i].cost -= costAtLevel;
                resetIngot(ingot);
                //и точим другую болванку
                ingot.upgrade(67, 1000);
            }
        }
        // Когда сломалась, кидаем точку в целевую вещь
        temp = items[i].upgrade(70, 3000);
        resetIngot(ingot);
    }
}
```

Основные параметры алгоритма:

* ingotLevel - Целевой уровень болванки. Как только он достигается, болванка продается
* targetLevel - Начальный уровень целевого предмета. Целевой предмет предварительно точится до определенного уровня. А потом в действие вступает основной алгоритм заточки.

Алгоритм запускался с различными параметрами.
Количество попыток = 1 000 000.

Последняя строка - контрольный запуск. Если целевой уровень вещи равен 15, значит весь алгоритм работает по принципу **автоточки**.

Данный алгоритм показывает самые лучшие результаты среди других алгоритмов и по результатам и по средним затратам на точку при любых параметрах. При этом болванку можно продавать даже если она заточилась на +3.