Увидеть демо и умереть

«Я уже говорил тебе, что такое ДЕБАГ? ДЕБАГ — это точное повторение одного и того же действия, раз за разом, в надежде на изменение. Это есть ДЕБАГ. Когда впервые я это услышал, не помню, кто мне это сказал, я — продолжил говнокодить. Смысл в том — окей? — Он был прав. И тогда я стал видеть это везде, везде, куда ни глянь, эти ебаные баги… Куда ни глянь, постоянно ломают мою программу. Снова и снова и снова и снова и снова, и я думаю — с новым дебагом сейчас все изменится.» © Ваас Коденегро

Увидеть демо и умереть

Я ненавижу программирование. Я люблю программирование. Я ненавижу программирование. Между этими состояниями я перехожу чаще, чем проститутка между номерами в борделе. Потому что сегодня я легенда, которая ввела миллион новых фич, а завтра — конченный имбецил, вынужденный исправлять созданные этим баги. Хотя, по правде говоря, «завтрашний« я совершает куда больше работы, чем »сегодняшний».

Я делаю свою игру, отвечая одновременно за сценарий, код и управление проектом. Амбициозненько, ничего не скажешь, особенно если это — твой первый проект, да и к тому же является «экранизацией» книжного шедевра. Но это моя сраная мечта, потому что я детства хотел заниматься подобным: создавать, творить, быть Автором с большой буквы. Но любые амбиции всегда упираются в ресурсы.

Увидеть демо и умереть

Кто сказал, что делать JRPG-визуальную новеллу про Российскую империю будет просто? Да никто не говорил, в принципе, хоть я и знаю — кто-то так думает. Но я давно убедился в обратном. Потому что не существует для программиста испытания сильнее, чем сделать что-то с нуля. Диалоговую систему, сохранения, настройки, боевую систему, искусственный интеллект для противника. Приходится на максимум использовать все свои навыки, креативность и усидчивость. Мне очень понравилось то, как я нашёл решение для создания скриншотов на экране загрузки.

Увидеть демо и умереть

Если вызывать функцию создания скриншота после того, как игрок откроет окно, то на нём будет не текущий геймплей, а, собственно… Экран загрузки. А если делать скриншот по нажатию из экрана меню, то на этой вырезке будет экран меню. Поэтому игра делает скриншот после каждого нажатия на escape, и только после этого открывает меню. Потом, если игрок захочет сохраниться, скриншот из «буфера» кочует в вечную переменную двоичным кодом, где и хранится. И я прекрасно понимаю, что если бы делал игру на Renpy, эта функция шла бы нативно, и мне вообще не пришлось бы делать ни экран загрузки, ни прописывать интерактивность кнопок, ни изменение текста при наведении на него мыши, ни… Видеть ебаные баги.

Увидеть демо и умереть
Увидеть демо и умереть
Увидеть демо и умереть

Это вообще далеко не всё — просто те баги, которые можно показать. Куда сложнее было вылавливать всё, что при обычном геймплее даже было непонятно, как выражается и как вызывается. Например, в какой-то момент игрок (только он) становился неуязвимым к врагу. Вне зависимости от того, в каком состоянии его броня, чем его бьют и сколько у него ХП. А потом, внезапно, он снова получал возможность получать урон. Мы убили на это около десяти часов, создавая разные ситуации и комментируя разные куски кода. В какой-то момент нам начинало казаться, что всё, вот она — закономерность, но потом всё снова утекало сквозь наши пальцы, и баг оставался неуловим. И только потом, каким-то чудом, повторяя результаты тестера, я наткнулся на одну переменную…

У нас есть травмы. Нет, я имею в виду не после разработки, а в игре. Если тебе нанесли больше определенного процента ХП, персонаж получает на бой дебафф, который уменьшает его эффективность в любых действиях, кроме нанесения урона (чтобы не затягивать бои) . Среди них была и травма, которая уменьшает эффективность щитов. На 1%, 10%, 20%… И так далее. А как это вообще работало?
Формула урона была такова:
Пока Урон>0 и Щиты > 0, то:
Урон--
Щиты--
Далее шел следующий кусок проверок:
Пока Урон >0 и Щиты = 0, то:
Урон--
Хп персонажа--
Вы поняли, что произошло?

Увидеть демо и умереть

Если персонаж получал травму, мешающую ему ставить щиты, то их количество становилось дробным, и после того, как из дробного числа отнималась единица, оно становилось отрицательным и перескакивало через 0! Поэтому этот баг было практически невозможно уловить, хотя всего лишь стоило поменять знак "равно" на "меньше или равно", или вообще удалить ебаную проверку щитов, когда код и так их обнуляет.
Также интересны и случаи, когда ты три часа пытаешься понять, почему у тестера крашится стимовская версия игры, а у тебя нет, и вообще никакие версии у него не запускаются, и чтобы скинуть ему новую версию нужно экспортировать проект 10 минут и ещё 5 грузить на облако, работая в слепую и наугад, чтобы в конце концов узнать, что…

Увидеть демо и умереть

Да, моя игра не запускается, если у вас 0 байтов свободного места на диске. Простите.
В общем, проблем была куча, но я все равно благодарен своему тестеру, что он помог мне выстрадать демо на свет — да ещё и в таком виде, что его можно пройти до конца. Опробовать я игру не прошу, скорее, просто захотел выпустить предостережение для будущих разработчиков, чтобы они заранее продумывали все особенности и структуру программы, потому что рефакторинг спагетти-кода, написанного 3 года назад, не приносит ничего, кроме боли… Ну и навыка программирования, как ни странно. В конце концов, я уверен, что стал гораздо опытнее, и больше не буду совершать старых ошибок, а если и буду, то уже с умением их исправлять.Но в любом случае, я надеюсь, что все мои труды были не напрасны. Я — единственный разработчик, а амбиций имею чуть ли не на игру категории Б. Но мне же самому хочется, чтобы мой первый проект стал особенным, чем-то, через что я смог осуществить свою мечту прикосновения к прекрасному, даже если в неё никто в итоге не поиграет.

1717
9 комментариев

JRPG-визуальная новелла про Российскую империю? Хммм звучит как сумасшествие. Мне нравится

1

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

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