При закрытии подписчики были переданы в рассылку "Особенности национального бизнеса" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Разработка ролевой игры24) Стрельба из лука
case k of
...
' a ' : HeroShot(-1,0); Процедуру HeroShot разместим в модуле Combat (ссылку на него надо добавить в uses-перечень главного модуля, а заголовок новой процедуры - в интерфейсный раздел Combat):
{ --------------------------- }
end; Далее нам надо определить, как далеко будет лететь пущенная из лука стрела. Это расстояние должно зависеть в первую очередь от самого лука, а во вторую - от ловкости героя. Поэтому условимся, что в структуре TGameItem, описывающей дальнобойное оружие, второй элемент вложенного массива Ints будет хранить число тайлов, на которое лук может послать стрелу:
const Как правило, это расстояние в подобных играх составляет от 3-5 до 15-25 тайлов. Пусть наш единственный лук стреляет на пять клеток:
(ID:6;
Как будет проходить процесс выстрела? Надо сымитировать движение стрелы в заданном направлении, и прекратить полет либо успешным поражением объекта, либо неуспешным - если на пути встретилось непроходимое препятствие, или же стрела исчерпала летный ресурс. А предварительно, конечно, надо убедиться, что у героя в руках лук и стрелы. Ну и, как обычно, проверим навык дальнобойной стрельбы. Однако навыка такого у нас пока нету. Реализацией его мы сейчас и займемся. Добавим в список констант-навыков модуля Hero новое значение, и одновременно откорректируем новое максимальное число навыков:
const Надо также увеличить MaxSkills в модуле Texts и дополнить соответствующий массив новым названием навыка:
MaxSkills = 4; Если теперь вызвать компилятор, то выдастся ошибка о неполном массиве соотношений класс-навык - ее мы исправим, например, так:
const ClassSkill_Table: Кроме того, дополнения потребует и массив BaseSkillTable (впрочем, реально этот массив уже не используется):
const BaseSkill_Table: array[1..MaxSkills] of Integer = Далее, добавим обработку нового навыка в процедуру SkillTest (модуль Hero):
...
skillHandWeapon, и SuccessSkillTest:
case skl of Текстовую константу опишем так:
STR_RANGEDWEAPONSKILL_OK= ' Навык стрельбы повышен! ' ; Вернемся к процедуре HeroShot. Добавим в нее проверку того, имеется ли в руках у героя дальнобойное оружие (кстати, эту проверку надо сделать первой, до анализа/проверки навыка, причем как в этой процедуре, так и в HeroAttack), и есть ли в этом оружии заряды:
{ --------------------------- }
if not SkillTest(Heroes[CurHero], skillRangedWeapon) then
end; Следующий шаг - снижение числа боеприпасов:
dec(Heroes[CurHero].Slots[slotHands].Ints[intRangedAmmo]); Теперь начинается собственно полет стрелы:
n := Heroes[CurHero].Slots[slotHands].Ints[intRangedRange];
m := IsMonsterOnTile(x,y);
// атакуем монстра...
MonstersStep;
dec(n) Обратите внимание, что после выстрела, который попал в монстра, вызывается процедура ответного удара разъяренных тварей MonstersStep. Сам процесс атаки будет похож на соответствующие действия в ходе ручной схватки. Пока мы не определились, какой будет поражающая способность выстрела. Пусть эта способность определяется луком. Тогда в массиве Ints для предметов-луков задействуем еще два элемента, хранящих общеизвестную пару чисел "число кубиков - число граней на каждом кубике":
const Наш единственный лук теперь будет выглядеть так (исправлен массив Ints):
(ID:6; Бросается один четырехгранный кубик, что не очень много, но не забудем, что стрельба ведется с расстояния, почти без ущерба. С учетем вышесказанного величина поражения будет рассчитываться так:
dam := RollDice( Heroes[CurHero].Slots[slotHands].Ints[intRangedDices], Следующие действия по использованию этой величины совпадут с действиями из процедуры HeroAttack, поэтому желательно выделить их в отдельный блок:
{ --------------------------- }
skin := RollDice( Monsters[m].dd1, Monsters[m].dd2 );
dec( Monsters[m].HP, dam-skin );
if Monsters[m].HP <= 0 then
end; Тогда изменим старый код HeroAttack - в конце:
...
HeroAttackFin( H, m, dam );
end; И новый код:
m := IsMonsterOnTile(x,y);
dam := RollDice( Heroes[CurHero].Slots[slotHands].Ints[intRangedDices],
HeroAttackFin( Heroes[CurHero], m, dam );
MonstersStep; Проверим программу и убедимся, что стрельба ведется нормально. Дополним теперь код двумя дополнительными возможностями. Во-первых, в зависимости от навыка ловкости будем повышать дальность полета стрелы, а во-вторых, в зависимости от силы персонажа будем давать бонус на поражающую способность. Сделаем это уже известным способом. Сначала попробуем добавить бонус на дальность стрельбы - допустим, на 30%:
... После чего - бонус на силу выстрела:
...
d := RollDice(3,6); Данный механизм бонусов, конечно, сильно несовершенен - в профессионально сделанных ролевых системах нет такого гладкого изменения способностей. Так, уровень навыка 13 и ниже может вообще никогда не приносить никаких бонусов, а уровень 17 наоборот может внести уже очень существенный вклад. Но мы используем его в основном для наглядности, чтобы программа была работоспособна. Читатель сам может придумать произвольные системы начисления бонусов, главное - как следует сбалансировать игру. Правда, стрелы у нашего героя в ходе тестирования класса "лучник" будут быстро кончаться, поэтому лучше будет все же разместить в пакете со стрелами не 15, как сейчас, а хотя бы 100 стрел:
... а также сотню боеприпасов придать персонажу в момент его генерации (процедура GenerateHero):
if Heroes[CurHero].Class = classRanger then Далее - обучаем Героя Магии. Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas): http://russianenterprisesolutions.com/sbo/download/1116.zip 11841 байт (c) 2004-2006 Сергей Бобровский bobrovsky@russianenterprisesolutions.com
Школа программирования с нуля
Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование |
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull.game Архив рассылки |
Отписаться
Вебом
Почтой
Вспомнить пароль |
В избранное | ||