Оригинал в нашем сообществе в ВК Компьютерные игры - своего рода магия, а хороший магический трюк не обходится без дыма, зеркал, спрятанных люков и очаровательных идентичных близнецов-ассистенток. Но иногда дым засасывает в люк, а ассистентка в потёмках врезается головой в зеркало. В случае игр, это обычно приводит к появлению очередного сообщения об ошибке в нашей системе управления задачами. В этой серии постов, я бы хотел рассказать о некоторых примечательных ошибках в Pathfinder: Wrath of the Righteous, и о том, как мы их исправляем.
Система правил настольного Pathfinder крайне сложна. В ней множество правил, которые взаимодействуют друг с другом, а также специальных исключений, созданных во имя уникальных предметов, заклинаний или существ. Поэтому даже ответ на простой вопрос вроде "сколько урона может нанести этот персонаж" требует сложных вычислений. Конечно, мы их производим всякий раз, когда один персонаж атакует другого, но это не единственный момент, когда нам нужно знать значение урона.
Когда вы смотрите на статистику врага, вы видите разброс урона, который он может нанести. Чтобы показать это значение, мы должны сделать те же самые вычисления, что и в случае, когда этот враг атакует. Дублировать их, но так, чтобы при этом не делать атаки было бы сложно и чревато ошибками, поэтому мы используем простой трюк - создаём невидимого временного персонажа, и используем обычный код для боя, чтобы сделать по нему атаку.
Конечно, эта атака никогда не должна появляться в журнале, да и вообще делать что-нибудь видимое игроку. Поэтому код, ответственный за вычисление урона имеет особую настройку, которая говорит ему всё посчитать, но ничего с этим не делать - он не тратит всякие ресурсы, не наносит реального урона и не порождает никаких сторонних эффектов. Но. Чтобы нанести урон, сначала надо рассчитать результат броска на атаку, который говорит попали мы, или промахнулись. Конечно, в данном случае мы всегда должны попадать по нашему "болванчику", поэтому этот бросок - поддельный. Вот только код, который вычислял результаты броска, не до конца правильно учитывал то, что бросок не настоящий. И в отличие от кода нанесения урона, он посылал всем заинтересованным сигналы о том, что произошло попадание по цели! А у Пещерного умертвия есть такое милое маленькое умение под названием Energy Drain, которое добавляет этой нежити временных очков здоровья каждый раз, когда она попадает по цели, если цель провалит спасбросок (даже если не были нанесены повреждения).
И как вы можете догадаться, наш "болванчик" свои спасброски всегда проваливал. Таким образом, каждый раз когда вы наводили курсор на Пещерное умертвие, монстр получал на халяву дополнительные очки здоровья, которые делали его убийство практически невозможным. Баг присутствовал как в походовом боевом режиме, так и в режиме реального времени, но хорошо заметен был только в первом, поскольку там гораздо проще удержать курсор на цели, да и наводиться приходится для каждой атаки!
Починка ошибки вышла достаточно тривиальной - мы научили наш поддельный бросок на атаку не посылать сигналы о своих результатах, и Пещерные умертвия начали умирать как и положено.