Ошибки Геймдизайна на примере игр.

(Только для группы "MOSC ДизДок") Здесь идёт написание Дизайн Документа для игры "Master of Star Control".
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Ошибки Геймдизайна на примере игр.

Сообщение Vasaka »

Вероятность срабатывания события.

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

Ошибка эта появляется когда для какого-то события в игре есть вероятность его срабатывания.

Пример1: Jagged Alliance 2. (1.13)

Надёжность.

В игре, у оружия есть такая характеристика как "надёжность". Предполагается что надёжное оружие заклинивает значительно реже. Вот только выражается это именно в вероятности срабатывания события заклинивания. Так чем же это плохо?

Вроде бы всё правильно. Вероятность заклинивания надёжного ствола 0.1% на каждый выстрел, а ненадёжного 2% (цифры условны). Ненадёжный ствол заклинит быстрее и чаще будет заклинивать. Вот только на деле получается совсем по другому. В тот момент, когда ствол заклинило, игрок нажимает "Загрузить игру" и грузит ближайший сейв. И продолжает стрелять и этого ствола ещё очень, очень долго. Ну а если вдруг его опять заклинило? Мы уже знаем что делать. Сейв/Лоад наш друг.

К чему это приводит? 1. Это приводит к разрушению атмосферы игры. (Любой Сейв/Лоад - это враг атмосферности.)
2. Это приводит к тому, что эта характеристика в игре не играет никакой роли.
  • Она сама абсолютна бессмысленна.
  • Много времени и сил на её реализацию потрачено в просто впустую.
  • А весь баланс, который выстраивался с учётом этой характеристики летит в тар-тарары и мы получаем супер стволы в виде ненадёжных орудий (остальные-то характеристики были завышены, чтобы компенсировать ненадёжность).

Пример2: Jagged Alliance 2.

Вероятность попадания.

В данном случае это довольно сложная формула, но в конце, на выходе мы имеем тот же процент попадания сделанного выстрела.

К чему это приводит, мы уже знаем. Сейв/Лоад, наш великий друг и по совместительству великий враг - убийца игры. Мы просто перезагружаем сейв столько раз, сколько понадобится для удачного попадания по врагу.
Вот только кому будет интересно играть в игру, где каждый выстрел может быть удачным? Всё зависит только от количества перезагрузок.
Естественно геймплей убит напрочь. Не воспользоваться этим игрок не может, потому, что потом на него обрушатся проблемы, а воспользоваться, это значит перезагружать игру порой по 30-40 раз и тратить на этот один выстрел минут 5-10 реального времени.

Как же решаются эти проблемы?

Пример1. Ответ очевиден. Не должно быть единичного процента срабатывания события. Достаточно вместо типа данных "bool" для переменной "заклинивания" использовать тип "byte", где заклинивание будет накапливаться постепенно, и оно уже не сбросится одной загрузкой сейва. А последние шаги можно вообще отвязать от вероятности накопления и начислять счётчиком. Это сделает характеристику "заклинивание" работающей и актуальной. Придётся очень серьёзно учитывать насколько надёжен ствол при его выборе.

Пример2. Конечное решение должно выглядеть так, чтобы каждый сделанный выстрел после загрузки сейва, был идентичен предыдущему.
В JA2 (оигинале) попытались решить эту проблему. Исход выстрела зависел от положения бойцов на карте и ещё каких-то мелочей. И получалось, что после загрузки сейва результат выстрела не менялся, но стоило повернуть другого своего бойца, даже если он совсем на другом конце карты, на пол оборота, или посадить его, или ещё какое-то действие сделать и результат выстрела чудесным образом менялся, при том, что тот кто стреляет, и тот по кому стреляют не совершали вообще никаких движений. И при такой системе, всё повторялось, но только в несколько усложнённом варианте. Делаем выстрел, если не попали, загружаем сейв, поворачиваем другого бойца на 45 градусов, и пробуем опять. Если промах, опять сейв и теперь пробуем повернуть его в другую сторону на 45 градусов. Если промах, на 90 градусов влево, потом вправо, посадить, повторить все повороты сидя, потом сделать шаг в сторону и повторить все повороты и так далее. Расходуем 1-3 очка действия у персонажа который к боевым действиям не имеет отношения, и тем самым добиваемся нужного результата.

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

Mass Effect.
Вскрытие ящичков.

Существует ручное вскрытие, где нужно сыграть в мини игру и автоматическое, где расходуется какой-то там гель.
Так вот ошибка геймдмзайна в данном случае, это дать игроку всего одну попытку для ручного вскрытия. Дальше остаётся возможность только автоматического вскрытия за ...гель...
Ну и что вы думаете, она действительно единственная? :haha: Нет конечно.

Но что приходится делать игроку, чтобы совершить вторую, третью и так далее попытку?
1. Обязательно сохраниться перед ящичком, ->
2. нажать эскейп после неудачной попытки, ->
3. выбрать сейв на который была сохранена игра перед попыткой, ->
4. дождаться загрузки игры.

И что, куча лишних действий и какое-то количество потраченного времени на ожидание загрузки сейва это хороший геймдизайн? :imp:

Создание игроку проблем для затыкания ущербности геймплея, это самое плохое, что может придумать геймдизайнер.
Надо или изменять геймплей, или уже оставить как есть, а не чинить игроку препятствий.

Fallout - Olympus
Способность "Воровство". (Причём, кое где в стремлении исправить геймплейные огрехи оригинала, разработчики Олимпуса только усугубили ситуацию.)

Раньше при воровстве открывался инвентарь NPC и можно было попробовать переложить вещь из его инвентаря в свой. Если вещь перемещалась в инвентарь персонажа, то воровство удалось, если нет, то NPC атаковал персонажа или ворчал. И это пример плохого геймдизайна.

Не было никакого смысла качать навык воровства, ибо даже с начальным уровнем можно было обчистить любые карманы, просто сейв/лоад нужно было делать больше раз.

Разработчики Олимпуса попробовали решить эту проблему добавив ещё одну проверку вероятности. Теперь ещё нужно много раз жать воровство - применить к NPC, пока не откроется инвентарь. То есть теперь мы ещё и инвентарь не с первого раза открываем, а тыкаем, тыкаем, тыкаем... А потом ещё и с инвентарём по той же схеме. Просто издевательство какое-то.

На самом деле проблема решается просто. Для каждого NPC устанавливается порог навыка вовровства, при котором персонаж может заглянуть в карманы и беспрепятственно всё оттуда забрать. Один раз тыкнули на NPC и знаем хватает у нас навыка или нет.

Ну, и конечно, возможность беконечно качаться. Кладём в рюкзак NPC десяток монеток, а потом по одной их крадём. Упёрли одну монетку - 10 опыта. Сохранились, продолжили...
Тоже можно было решить эту проблему просто. Если воровство у этого персонажа возможно, то получили опыт (10), и возможность взять вещи. Повторное заглядывание опыта не даёт.

:thanks:
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Ошибки Геймдизайна на примере игр.

Сообщение AndreyKl »

В теме по событиям я это описывал приведя пару вариантов реального обхода. линк
Для краткости приведу варианты:
-инициализация генератора случайных чисел из сейва (генерировать вектор инициализации можно при создании игры)
-хранить последовательность случайных чисел на несколько минут вперед
-написать свой генератор случайных чисел
-использование нескольких случайных последовательностей
-просчет и сохранение событий заранее (к примеру четко нахначить взрыв звезды на такое-то число)

P.S. конкретно для JA решением бы было использование нескольких случайных последовательностей - потребуется для каждого ствола своя с привязкой инициализации к числу из сейва (но очень уж ресурсоемко)
В JA использовались не значения bool (помоему ни один рандомайзер так не работает), всегда использовался int. В том же JA использование рандомайзера оптимизировано и код не в скрыть, но по тому, что обращение к функции рандомайзера идет только один раз на пулю(пытался я эту штуку дизасемблировать, хотя могу ошибаться), следует вывод, что формула считающая попадания (если шел расчет именно попал/промазал) сразу считала осечки, урон и т п. Все с одного случайного числа +- (разумется со всякими учетами местности и позиций). Если там был метод обеспечивающий повтор тех же случайных чисел, то достаточно дать противнику вызвать случайное событие первым или вызвать лишнее самому и последовательность будет сбита (к примеру расчет обнаружения противника/ом).
В 7.62 вроде использовался расчет траектории по Гаусовому закону распределения и случайному числу, попадание и урон уже расчитывались исходя из полученной траектории.

Не зависимо от "умного рандома" игрок всегда может загрузиться и поступить иначе (к примеру не напасть вообще). Правильные случайные последовательности просто не дадут возможности переигрывать одну и туже ситуацию до бесконечности, но не решат проблемы в целом. Эти проблемы не стоит поднимать сразу, рандомайзер можно подменить и позже.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Ошибки Геймдизайна на примере игр.

Сообщение Vasaka »

AndreyKl писал(а): 14 мар 2012, 01:21В JA использовались не значения bool (помоему ни один рандомайзер так не работает), всегда использовался int.

Да ну. Нет никакого смысла использовать ИНТ тип данных, если возможных вариантов поведения всего 2 (заклинено/не заклинено)


AndreyKl писал(а): 14 мар 2012, 01:21P.S. конкретно для JA решением бы было использование нескольких случайных последовательностей - потребуется для каждого ствола своя с привязкой инициализации к числу из сейва (но очень уж ресурсоемко)

Гораздо проще было сделать:
1. вместо БУЛ переменной, переменную БАЙТ.
2. Увеличить в 230 раз вероятность срабатывания заклинивания и при каждом срабатывании прибавлять к этому значению единичку.
3. По достижении 230, прибавлять единичку после каждого выстрела.

Игрок никак не сможет отследить увеличение этой характеристики, так как она нигде не отображается. Он столкнётся уже только с результатом: "Ствол заклинило". А дальше лечится только починкой. Всё просто.

Относительно остальных способов вряд ли что-то могу сказать. :pardon: Не имею большого опыта в программировании. :D
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Ошибки Геймдизайна на примере игр.

Сообщение AndreyKl »

Vasaka писал(а): 14 мар 2012, 10:43Да ну. Нет никакого смысла использовать ИНТ тип данных, если возможных вариантов поведения всего 2 (заклинено/не заклинено)
Просто отнесись как к факту: рандомайзера на bool нет. Все рандомайзеры работают одинаково - просто выдают случайное интовое значение. причины: случайный бул получить сложнее чем целый инт, все остальные значения вычисляются преобразованием. Компьюер оперирует 16-64 битами, логика рандмайзеров работает тем лучше, чем больше разрядность (ровнее распределение), а получить из большей разрядности меньшую можно всегда, вот пример rand()%2 - самый простой да/нет рандомайзер с вероятностью 50 на 50 сделанный из инта.
заклинило не заклинило - свершившийся факт, расчет идет отнюдь не да/нет. rand()%10000>10?выстрел:заклинило; (в идеале после % должны использоваться только числа вляющиеся степенью двойки, но для обьяснения и так сойдет)
Кроме того вариантов отнюдь не два: заклинило, промахнулся, попал = rand()%3 если для вероятностей по 33%, а так как вероятности не равные, то будет опять вариант с больше/меньше (на самом деле в JA2 около 10-20 событий проверяется одним вызовом).
Разумеется все пишут свою оболочку для рандомайзера типа bool событие=myrand(вероятность) или тип событие = myrand(коэффициенты, события) но внутри все тот же завуалированный интовый ранд из стандартной системной библиотеки.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Ошибки Геймдизайна на примере игр.

Сообщение Vasaka »

AndreyKl писал(а): 14 мар 2012, 11:26Просто отнесись как к факту: рандомайзера на bool нет.

Это понятно. Речь о другом.
Рандомайзер выдаст ноль или единицу, а потом мы уже припишем нужному стволу БУЛ переменную которая либо ТРУ, либо ФАЛС.

Речь о другом. Оно или сработало случайным образом или нет. Нет стадии накопления.
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Ошибки Геймдизайна на примере игр.

Сообщение AndreyKl »

Vasaka писал(а): 14 мар 2012, 12:19Оно или сработало случайным образом или нет. Нет стадии накопления.
примеры обходя этой проблемы я описал выше. Я бы не заморачивался этой проблемой раньше времени, позже заменить вызов рандома собственным класом с необходимыми поправками не проблема.

Идея накопления не очень удачна, так как её сложно подстроить под реальную вероятность - если так.
При любой реализации рандома с памятью или постоянной последовательностью игрок может отойти в сторонку и вволю пострелять (конечно если это возможно в игре).
Можно конечно вести гибкий счетчик удачных и неудачных выстрелов (временами счетчик нужно подчищать) и когда отношение достигает критического отклонения от допустимой границы, возможно "Удачи", взвинчивать шанс провала с каждым выстрелом, но в такой ситуации игроки часто загружающиеся получат на старте игры белую полосу, затем всё время черную.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Ошибки Геймдизайна на примере игр.

Сообщение Vasaka »

AndreyKl писал(а): 15 мар 2012, 00:03примеры обходя этой проблемы я описал выше. Я бы не заморачивался этой проблемой раньше времени, позже заменить вызов рандома собственным класом с необходимыми поправками не проблема.

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

Скажем так, заметки в помощь начинающим геймдизайнерам.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Ошибки Геймдизайна на примере игр.

Сообщение Vasaka »

Mass Effect.
Вскрытие ящичков.

Существует ручное вскрытие, где нужно сыграть в мини игру и автоматическое, где расходуется какой-то там гель.
Так вот ошибка геймдмзайна в данном случае, это дать игроку всего одну попытку для ручного вскрытия. Дальше остаётся возможность только автоматического вскрытия за ...гель...
Ну и что вы думаете, она действительно единственная? :haha: Нет конечно.

Но что приходится делать игроку, чтобы совершить вторую, третью и так далее попытку?
1. Обязательно сохраниться перед ящичком, ->
2. нажать эскейп после неудачной попытки, ->
3. выбрать сейв на который была сохранена игра перед попыткой, ->
4. дождаться загрузки игры.

И что, куча лишних действий и какое-то количество потраченного времени на ожидание загрузки сейва это хороший геймдизайн? :imp:

Создание игроку проблем для затыкания ущербности геймплея, это самое плохое, что может придумать геймдизайнер.
Надо или изменять геймплей, или уже оставить как есть, а не чинить игроку препятствий.
Аватара пользователя
Malin
Сообщения: 2020
Регистрация: 28 май 2023

Ошибки Геймдизайна на примере игр.

Сообщение Malin »

Mass Effect.
Вскрытие ящичков.


Да, ребята из Bioware это поняли и во второй части сделали более интересную версию вскрывания "ящичков". На мой взгляд куда более интересную!) Хотя проблема сейв\лоад всё равно осталась.

Ребята из Bioware вновь это поняли и, к моему глубочайшему сожалению , просто выпилили взлом вообще в третьей части. То есть взламывать ничего не надо.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Ошибки Геймдизайна на примере игр.

Сообщение Vasaka »

Я бы не сказал, что именно эта система взлома ящичков плоха. Мне даже нравится. :mosking:
Но зачем так не уважать игрока? Это же игра. Она должна приносить радость, а не зубовный скрежет. Они же не запретили игроку вскрывать ящики много раз. Они просто создали большие препятствия для этого на ровном месте. Не понимаю, зачем так издеваться над игроками.

Я небольшое отступление сделаю, в тему.
Давным давно, я рисовал карты для варкрафта 2 и героев меча и магии 2. Выдумывал всякие сложности: "Чтобы тут пройти, придётся догадаться, что надо сбегать туда, потом туда, потом всё это соединить и путём титанических усилий... - победа." Зачасту это был вообще единственный возможный путь к победе. Я представлял как будет гордиться собой игрок, когда пройдёт все эти трудности.
А потом я никак не мог понять, почему никому не нравятся мои карты?!

Да всё просто. Не нужно создавать игрокам запредельные трудности. Не нужно игрокам оставлять единственный путь. Это игра, она должна приносить радость, а не зубовный скрежет. Оффтоп
Закрыто