Размышления о навыках в FFII

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

Это больше технический пост, рассчитанный на разработчиков.

Так вот. У каждого персонажа есть восемь навыков, связанных с использованием разнообразного оружия (6 навыков), а также щита или своих кулаков (рукопашный бой без оружия). При использовании оружия, навык, связанный с ним повышается и дает некоторые прибавки к статам при использовании этого типа оружия.

И вот тут начинается первый интересный момент.

1.

 Нельзя просто взять и назначить всем героям какой-нибудь один класс со всеми этими восемью навыками для начала, потому что в массив навыков персонажа войдут только указатели на навыки. Это выясняется довольно просто - в классе RPG::Actor идет только номер класса персонажа, хранящийся в RPG::Class. В последнем есть параметр learnings, являющийся массивом из экземпляров класс RPG::Class::Learning, в одной из переменных которого (а именно - в skill_id) хранится номер навыка из базы данных.

Что это значит и в чем здесь проблема? Если просто взять и прописать к классу RPG::Skill дополнительно характеристику experience (опыт), то при повышении навыка у одного персонажа, будет изменяться навык из базы данных, из которой берут свои навыки все персонажи. А это значит - один бьет, качаются все! Для ленивых игроков это, конечно, безудержная радость и веселье, но это рвет всю логику и нарушает игровой баланс.

Выводы:

  • В класс RPG::Actor следует добавить параметр skills, массив для хранения всех навыков персонажа.
  • Вместо записи номеров навыков из базы, будут хранится экземпляры класса RPG::Skill, дополненные характеристикой experience.
  • Вместо самих навыков из базы будут хранится их клоны, базирующиеся на том, что есть в базе. Таким образом, в коде можно будет встретить нечто наподобие RPG::Actor.skills << RPG::Skill.clone. Так и только так все навыки будут начинаться от базы данных и развиваться далее независимо друг от друга.
Сразу же за последним утверждением вытекает новый интересный момент.

2.

Эти "первичные" восемь навыков можно "изучить" с помощью скриптов и записать в инициализацию Game_Actor. Но как же быть с навыками, которые можно получить в ходе игры? В данный момент под навыками я понимаю магические способности.

Чтобы изучить навык, нужно купить у торговца книгу, применение которой в инвентаре на персонажа приведет к изучению последним базового навыка. Поясню на примере стихийной магии, что есть базовый навык: чтобы освоить использование стихии огня в совершенстве, нужно для начала научиться кидаться огненными шарами, со временем они будут становиться мощнее, нанося противнику больше повреждений. С ростом навыка герою может открыться понимание о том, как управлять стихией более эффективно и он получит еще один навык, связанный со стихией (в итоге, у него будет один старый и сильный и один новый, еще сильнее). Но началось все с одного навыка, который был, благодаря прошлому пункту, скопирован из базы данных.

Чтобы получить этот навык, нужно отловить тот момент, когда персонаж "читает книгу".
Как это сделать? После долгих поисков, вернулся к самому очевидному решению - дополнить меню предметов, добавив в применение на персонажа учебников изучение базового навыка.
В названии предмета-учебника я добавил номер базового навыка из базы данных, чтобы было проще его искать.



Разобравшись с этим делом, перейдем к следующему.

3.

А как же эти самые навыки развивать? Через общие события, десятки переменных под каждый навык каждого персонажа или долгий и вдумчивый кодинг классов RPG::Actor и иже с ними?

Думаю, проще всего будет добавить в RPG::Skill такие параметры как:
  • exp - собственный "опыт" навыка
  • max_level - чтобы ни один навык не развивался бесконечно
  • exp_inflation и exp_basis - для создания "кривой опыта" как у RPG::Actor
Ничего не забыл? А нет, забыл, дописываю еще:
  • str_basis и str_inflation - для развития силы навыка с каждый уровнем "прокачки" 
В увеличении остальных характеристик пока не вижу никакого смысла, посмотрим потом на деле.

Как это будет работать? При использовании оружия повышается его навык (exp у навыка), уровень повышается при расчетах по связке exp_inflation и exp_basis, мощь навыка растет соответственно со связкой str_basis и str_inflation. Так же, у навыков оружия, в отличие от навыков, при уровне выше первого увеличивается количество ударов. Это значит, что владея мечом на уровне эдак одиннадцатом, вы будете наносить не один удар с уроном N, а одиннадцать ударов с уроном N!
Тут мы переходим к следующей проблеме, но она связана с боевой системой, которая существует только в оригинале и у меня в блокноте, так что оставим ее на потом.

Заключение:

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


Сноски:

*   Напомню, что так называемая "сила" (STR) - параметр, который целиком и полностью отвечает за силу атаки, из которого при применении вычитается значение брони (PDEF или MDEF) противника. Никаких ATK, которые есть в RPG Maker, я применять не собираюсь и вообще считаю этот параметр лишним.

Комментарии

Популярные сообщения из этого блога

Генератор названий оружия

Создание компонента Delphi

Идеи: Генератор сказки