Блог ☯

вторник, 22 ноября 2016 г.

Навыки и ролевая система в TDS, как это сделать в GameMaker?

Собрался с силами и сделал еще одно видео по TDS на моём канале:



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

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

Хотя кто знает, может быть и усложню RPG часть позже. 

Навыки и ролевая система в TDS, как сделать?
Миссия 4. Создание миссий и левел дизайн еще только начинается. 

За небольшое обновление графики спасибо Глебу Квасиновичу, он нарисовал спрайты деревьев, оружия и некоторые другие, но работа с графикой и её обновление не закончено.

Однако, спрайты и графика пока не требуется, спасибо всем кто предлагал помощь и присылал, просто хочу сконцентрироваться сейчас на коде и уровнях. 

Я добавил простую механику навыков для моей игры. 

Навыки тренируются после удачных попаданий по врагам. 

Высокое значение навыка увеличивает шанс критического урона (200%). Сделать всё это в game maker не сложно, в видео я почти всё показал, однако тут я раскрою вопрос более полно и выложу некоторый код, что-бы вы его могли просто скопировать. 

По большей части всё легко и очевидно, но на всякий, что вам нужно сделать?

  • Комната с навыками. Картинка фона и написать там значения навыков;
  • Основные и базовые переменные навыков равные нулю со старта;
  • Прокачка. Я сделал в момент попадания по врагу;
  • Крит. То есть, как этот навык будет давать шанс крита;
  • Записать все навыки в отдельный файл и сохранять вечно.

В видео есть все эти моменты, но вот тут, допустим, мои модификаторы прокачки:

if global.weapon=1 then global.hero_s1+=3 // ПИСТОЛЕТ
if global.weapon=2 then global.hero_s2+=2 // ДРОБОВИК
if global.weapon=3 then global.hero_s3+=1 // МП5
if global.weapon=4 then global.hero_s4+=1.5 // КАЛАШ
if global.weapon=5 then global.hero_s5+=8 // ВИНТОВКА
if global.weapon=7 then global.hero_s7+=0.25 // КРУТОЙ АВТОМАТ
if global.weapon=9 then global.hero_s9+=0.1 // ПУЛЕМЁТ 
// БАЗУКУ ТАК КАЧАТЬ НЕ БУДЕМ, ДРУГАЯ МЕХАНИКА
// ТАК-ЖЕ МОЖНО СДЕЛАТЬ НАВЫК МЕТАНИЯ ГРАНАТ, НО НЕ ТУТ
// ОГНЕМЁТ ТУТ ТОЖЕ НЕ ДЕЛАЕМ, ИЗ-ЗА УБИЙСТВА С 1-ГО ВЫСТРЕЛА

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

Можете лучше? Делайте лучше, кто-же мешает :)

Три вида оружия у меня выходят без навыков, так-как убивают с одного раза (огнемёт, базука, граната), но для них можно будет навык который будет увеличивать область взрыва, скорострельность и что-то еще. Не обязательно что навык только даёт шанс крита, он может увеличивать дальность, точность и т.д. 

Что там в коде? В зависимости от того, какое оружие выбрано, мы, при попадании пули по врагу (коллизия), увеличиваем соответствующую переменную - навык. 

Почему значения разные и как определить эти значения? 

Вот это на самом деле очень интересный вопрос!

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

Так не нужно было-бы копировать этот код для каждого конкретного врага (хотя можно сделать всем врагам одного родителя). Не обязательно качать навык при попадании пули по врагу, можно совместить это с фактом создания пули. 

Например +3 у пистолета если попал по врагу, +0.25 если ты просто выстрелил, +0.5 если ты перезарядился. Такая система будет более гибкая. 

Механика прокачки навыков при их использовании сейчас устарела. 

Но я же обожаю всё что устарело :))) Такая система была в Ультима Онлайн в серии игр The Elders Scrolls. Система, на самом деле, наиболее реалистична, но она плохо вяжется с современной моделью игр "стимул = реакция". 

Игроку приятнее когда есть какие-то чёткие границы, например звёздочки. Хотя и тут их можно делать, например навык 0-100 это одна звёздочка и т.д. 

Можно было сделать другую систему с уровнем героя и очками опыта которые игрок бы тратил на навыки потом уже сам, как например в fallout 2, но такая система устарела еще больше, да и это менее реалистично. 

Схожую модель привыкания и прокачки я предлагал сделать в 12 is better than 6

Кстати, качаться и работать навыки будут в том числе и в режиме выживания.

Из чего я исхожу в выборе модификаторов скорости прокачки?

  • Сложность получения оружия и боеприпасов;
  • Скорость стрельбы и урон (ДПС - damage per second).

По науке, можно было-бы рассчитать модификаторы скорости прокачки очень точно и сбалансировано, сделав специальную формулу, но блин, не всё-же идеально делать? Потом просто при тесте будет понятно что качается быстро, а что нет.

И что нужно править.

Если я сделаю +1 очко навыка при выстреле из автомата, пуль к которому везде навалом и который стреляет 10 раз в секунду, и сделаю +1 очко навыка для редкой и очень медленной снайперки, то игрок может чутка приуныть, пытаясь прокачать снайпера.

Этот модификатор прокачки можно использовать еще и как отличительную особенность оружия. Допустим, я планирую сделать медленную прокачку для самых эффективных вооружений (пулемёт и улучшенный автомат). 

Можно даже делать таким образом что оружие будет конкурентным только при условии что вы его прокачаете. То есть его эффективность растёт очень существенно с прокачкой. Это может быть какое-то скорострельное точное оружие с большим разбросом урона. 

А можно делать оружие где прокачка не будет сильно вилять. 

Никто кстати не мешает сделать модификатор урона от крита не 200% для всех оружий, а разный для каждого. 

Чуток отвлекусь, сделал плато

Навыки и ролевая система в TDS, как сделать?

Это как всё выглядит изнутри

Три зоны:

  • Розовая зона замедления (будет еще и над болотом);
  • Красная зона: нельзя ходить, но можно стрелять;
  • Чёрная зона: нельзя ходить и стрелять (пули не пролетают).

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

Как навык качается понятно, а как наносится критический урон?

Можно вот так:

if global.weapon=1 // тип оружия из которого стреляем 
if random(100)>100-(global.hero_s1/100){ // шанс крита 
effect_create_above(ef_firework,x,y,0,c_red) // эффект 
hp-=other.dmg // наносим урон еще раз, итог - 200% урона 
}

Это когда пуля касается врага. Я так прописал для каждого вида оружия, меняем в тут только то что я подчеркнул жирным и просто копируем.

При коллизии пули и врага мы это пишем в other (применяется не к себе, а к другому), именно поэтому other.dmg. Эта переменная, dmg - урон пули, она локальная у меня, с этим иногда есть проблемы. Она у меня локальная потому-что я планировал этот урон модифицировать, например исходя из дальности полёта (урон меньше если пуля летит долго), 

Как сохранять вечно и что я имел в виду? 

Нам нужно 2 скрипта. Где и когда их запускать решайте сами, можно например сохранение сделать каждую минуту, или например в момент смерти героя, или в момент прохождения уровня. А загрузку в момент старта игры. 


Загрузка
if file_exists("save.ini"){ // если файл существует
ini_open("save.ini"); // открываем файл
//
global.score_record=ini_read_real( 'save_0', 'global.score_record', 0 );
//
ini_close();
}

Красным это какую переменную мы грузим из файла (например, навык стрельбы из пистолета global.hero_s1), синим это функция чтения из файла. 


Сохранение
ini_open("save.ini" );
ini_write_real( 'save_0', 'global.score_record', global.score_record );
ini_close(); 

Тут мы записывает переменную во внешний файл. 

Вообще, эта система сохранения и загрузки (чтения данных из внешнего файла) неплоха. Я раньше вообще использовал только её, но с ней проблема что положение объектов сохранить там нереально (реально, но сложно). 

Есть и стандартная функции game maker: game_save и game_load которые нормально всё сохраняют, но они сохраняют только текущую комнату. Короче с ними одними тоже можно всё сделать, но иногда требуется другая система. 

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

Всем еще раз спасибо за просмотр видео и за чтения статьи, вступайте в мою группу в ВК и читайте этот блог! 

Всем добра!