Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming / GameProg / RPG_Programming_2ed.pdf
Скачиваний:
240
Добавлен:
12.02.2016
Размер:
12.06 Mб
Скачать

Глава 12. Управление игроками и персонажами

Использование правил сражения для атаки

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

Набор правил сражения (combat rule set, CRS) вашей игры отталкивается от способностей, атрибутов и умений персонажа, которые вы уже видели в этой главе. Помните, как этим способностям, умениям и атрибутам назначались числовые значения? Догадываетесь зачем? Эти значения используются для генерации нескольких значений, определяющих исход боевых действий.

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

После принятия решения об атаке, результат определяют несколько шагов.

Нанесение удара

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

Значение меткости может находиться в диапазоне от 0 (всегда промахивается) до 999 (всегда попадает). Взяв случайное число и сравнив его со значением меткости вы можете быстро определить, произошло ли попадание. Если случайное число меньше или равно значению атрибута меткости, удар попал в цель. Следующий код показывает, как определить успешность удара:

// ToHit = значение атрибута меткости персонажа long RandomValue = rand() % 1000;

BOOL HitFlag = (RandomValue <= ToHit) ? TRUE : FALSE;

В показанном выше коде HitFlag устанавливается в TRUE, если удар

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

574

netlib.narod.ru

Джим Адамс

меткость на 25 процентов, а орлиный глаз повышает шансы попасть в цель на 50 процентов.

Чтобы применить любой модификатор дополнительного статуса, умножьте на него определенное значение меткости:

if(Ailments & AILMENT_BLIND)

ToHit = (long)((float)ToHit * 0.75f);

if(Ailments & AILMENT_HAWKEYE)

ToHit = (long)((float)ToHit * 1.5f);

long RandomValue = rand() % 999;

BOOL HitFlag = (RandomValue <= ToHit) ? TRUE : FALSE;

Отклонение атаки

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

// Agility = значение проворности персонажа

RandomValue = rand() % 999;

BOOL DodgeFlag = (RandomValue <= Agility) ? TRUE : FALSE;

ВНИМАНИЕ! Вы можете определить из вычислений способности

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

Для увеличения или уменьшения шансов отклонения атаки вы можете использовать дополнительные статусы неуклюжести и устойчивости. Неуклюжесть уменьшает шансы отклонить атаку на 25 процентов, а устойчивость повышает шансы на 50 процентов (это значит, что персонаж, у которого установлены оба эти дополнительные статусы, увеличивает свои шансы отклонить атаку на 25 процентов):

if(Ailments & AILMENT_CLUMSY)

Agility = (long)((float)Agility * 0.75f);

if(Ailments & AILMENT_SUREFOOTED)

Agility = (long)((float)Agility * 1.5f);

long RandomValue = rand() % 999;

BOOL DodgeFlag = (RandomValue <= Agility) ? TRUE : FALSE;

Обработка ущерба

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

netlib.narod.ru

575

Глава 12. Управление игроками и персонажами

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

Чтобы все осталось простым, вы можете взять значение способности атаковать атакующего (или, по крайней мере, от 90 до 110 процентов ее) и вычесть значение способности защищаться жертвы (от 80 до 100 процентов ее). Обратите внимание, что здесь также оказывают влияние дополнительные статусы и, наряду с ними, использование предметов увеличивающих способности атаковать и защищаться.

Верно. Предметы экипировки добавляют множители к способностям атаковать и защищаться. Ключом является значение модификатора предмета. Это значение представляет собой величину от 0 и больше, которая делится на 100 и увеличивается на единицу, что дает значение множителя, используемого совместно со значением способности. Например, оружие со значением модификатора 150 увеличивает способность атаковать на 50 процентов:

//Attack = значение способности атаковать персонажа

//Item[] = массив главного списка предметов

long Attack = (long)((float)Attack *

(((float)Item[Weapon].Value / 100.0f) + 1.0f));

Возвращаясь к дополнительным статусам, на атаку и защиту влияют два из них — усиление и слабость. Слабость уменьшает атаку и защиту наполовину, в то время как усиление увеличивает значения на 50 процентов. Вот как работает все вместе для определения применяемого количества ущерба:

//Attack = значение способности атаковать атакующего

//Defense = значение способности защищаться обороняющегося

//Item[] = массив главного списка предметов

//Weapon = номер оружия в списке предметов (или -1, если его нет)

//Armor = номер доспехов в списке предметов (или -1, если их нет)

//Shield = номер щита в списке предметов (или -1, если его нет)

//Определяем количество атаки

//Начинаем с добавления модификатора имеющегося оружия

if(Weapon != -1)

long Attack = (long)((float)Attack *

(((float)Item[Weapon].Value / 100.0f) + 1.0f));

// Подстраиваем в соответствии с дополнительными статусами if(Ailments & AILMENT_WEAK)

Attack = (long)((float)Attack * 0.5f); if(Ailments & AILMENT_STRONG)

Attack = (long)((float)Attack * 1.5f);

//Определяем количество защиты

//Применяем модификаторы доспехов и щита if(Armor != -1)

Defense = (long)((float)Defense *

(((float)Item[Armor].Value / 100.0f) + 1.0f);

576

netlib.narod.ru

Соседние файлы в папке GameProg