Страница 1 из 1

Ошибка ловли монстров

Добавлено: 28 янв 2017, 00:40
jim fire
Ошибка обозначения красной полосы ХП монстра в браузере и в системе ловли на сервере, из-за чего, когда у монстра приблезительно 30% хп(уже красная полоса светится), монстробол не срабатывает так как на сервере даное хп определяется как желтое (30%++)
С етим имел дело уже не 1 раз.
Живой пример: Ловим Шелтера (до 3 раунда фулл хп)
3 Фундион ⇢ Блуждающие огни.
Шелтер загорелся.
Монстр терпит ранения от огня -3 HP

4Jim Fire: Реамунон, в бой!
Монстр терпит ранения от огня -3 HP

5Jim Fire: Фундион, в бой!
Монстр терпит ранения от огня -3 HP

6Jim Fire: Реамунон, в бой!
Монстр терпит ранения от огня -3 HP

7Jim Fire: Фундион, в бой!
Монстр терпит ранения от огня -3 HP

8Jim Fire: Реамунон, в бой!
Монстр терпит ранения от огня -3 HP
(здесь уже красная полоса ХП у Шелтера)

9Jim Fire ⇢ Гритбол
Монстр не пойман!
Монстр терпит ранения от огня -3 HP

10Jim Fire ⇢ Гритбол
Монстр пойман.
Осталось хп: 5 из 26
Монстр использовал атаки ультразвук, лобовая атака, Каменный панцирь
Просьба разобратся.

Re: Ошибка ловли монстров

Добавлено: 01 июл 2018, 17:45
Pocket Tiger
АП. Только что произошла аналогичная ситуация. На меня напал с максимальным здоровьем 36 и категорией силы 5. Монстр находился под статусом "Отравлен". Полоска здоровья была красной (что согласно Лигапедии означает 30% здровья).
Рассчитываем шанс поимки, опять же ссылаясь на Лигапедию, где power=5 - наша категория силы.
Chanse=((6*(power-1)^2)/2-20)/5-10=-4.4
Шанс меньше 1, поэтому - 100%.
Но на деле происходит иначе.
На скриншоте видно, что попытка поимки происходила, когда у монстра было 11 хп (на следующий ход яд отнял еще 5).
Спойлер: Скриншот ПОКАЗАТЬ
Изображение
Игрок реагирует на красный цвет линии здоровья, пытаясь поймать монстра, что произошло и со мной. В моём случае был потрачен гритбол, но ведь аналогичная ситуация могла произойти и при использовании более дорогих монстроболов.

Функция, которую вы используете, округляет дробное число до целого в меньшую сторону.
Т.е. имеем Math.floor(100*11/36)=30
А на деле 100*11/36=30.55(5)

Подозреваю, что проблема в расчете шанса поимки на сервере. Там или используется число без округления, либо для округления учитываются знаки после запятой.
Как решение, думаю, куда сделать изменения на фронте.
Почему бы не использовать Math.ceil(100*11/36)=31 (которая будет округлять в большую сторону) при таком исходе? Или пересмотреть границы, т.е. сравнивать не с 30 хп, а с 29, к примеру.

Спасибо

Re: Ошибка ловли монстров

Добавлено: 01 июл 2018, 19:25
Evangelion
В формулах там всё верно происходит, а вот в визуальной части - не всегда, отсюда и возникают такие "траблы".
30% от 36 хп это 10.8, оно округляется в большую сторону (всё по математическим правилам) и окрашивает хп уже на 11 в красный цвет.
Так как до 30% ещё не дошло, соответственно и поймать монстра не получается, приходится кидать второй бол который уже и ловит (так как % уже даже меньше 30).

Re: Ошибка ловли монстров

Добавлено: 01 июл 2018, 22:59
Pocket Tiger
Сложно разбирать минифицированный код, но что-то примерно такое
Спойлер: Код ПОКАЗАТЬ

Код: Выделить всё

function set() {
    let MaxHp = 36, CurrentHp = 11; //получили с сервера
    let hpBar = document.getElementById('divFightH').querySelectorAll('.barHP');
    if (MaxHp) {
        HpPercents = Math.floor(100 * CurrentHp / MaxHp);
    }
    else {
        HpPercents = 0;
    }
    hpBar[0].removeClassName("min");
    hpBar[0].removeClassName("max");
    hpBar[0].removeClassName("mid");
    if (70 <= HpPercents) hpBar[0].addClassName("max");
    if ((30 < HpPercents)&&(HpPercents < 70)) hpBar[0].addClassName("mid");
    if (30 >= HpPercents) hpBar[0].addClassName("min");
    hpBar[0].firstElementChild.setStyle({
        width: HpPercents + "%"
    });
    console.log(HpPercents);
}
Я был неправ, когда ранее писал про изменить округление в большую сторону, это тоже не есть правильно, могут получиться аналогичные ситуации. Стоит округлять до той же степени, которая используется на сервере при подсчете шанса.
Но можно даже поступить куда проще. Зачем вообще округлять? Могу ошибаться, но эта переменная уходит только в ширину дива, который отвечает за цвет полоски здоровья.
При данном раскладе (используя Floor) мы получим width: 30% - красный цвет. (HpPercents = Math.floor(100 * CurrentHp / MaxHp))
Если вообще не округлять - получим width: 30.5556% - желтый цвет. (HpPercents = 100 * CurrentHp / MaxHp)

Еще раз спасибо

P.S. Попробуйте со значениями здоровья в 10.8 и 11.

Re: Ошибка ловли монстров

Добавлено: 29 авг 2018, 00:44
Pocket Tiger
АП
Спойлер: ПОКАЗАТЬ
Изображение

Re: Ошибка ловли монстров

Добавлено: 02 апр 2020, 17:19
Артикуно
Ну, апну темку на всякий случай. Авось поправят. Изображение