Урок 25. Магия – начинаем
Последний из нереализованных нами классов, и важная область игры - магия. На первый взгляд может показаться, что ее реализация потребует большого объема работы, однако мы уже хорошо продумали и отладили механизмы расширения навыков героя, и введение новых навыков и умений не потребует каких-либо кардинальных переделок и улучшений. Под магией мы будем понимать способность игрока к выполнению так называемых заклинаний - магических действий, а также к использованию магических предметов. Чтобы выполнить заклинание, персонажу потребуется специальная магическая энергия, в большинстве игр называемая маной.
Добавим персонажу две новые характеристики - по аналогии с уровнем здоровья, Маnа и МахМаnа:
type THero = record
Chars : array[1..MaxChars] of Integer;
Skills: array[1..MaxSkills] of Integer;
Items : array[1..MaxHeroIterns] of TGameltem;
Slots : array[1..MaxSlots] of TGameltem;
x,y,
HP, MaxHP,
Mana, MaxMana,
EXP,MaxExp,
level, VisLong: Integer;
Class, Race: Integer;
Name: String[20];
end;
Магия должна формироваться и расти вместе с показателями здоровья, хотя для некоторых характеристик (в нашем случае - для класса воина) способность к магии должна быть запрещена, так требуют классические ролевые системы. А у стрелка она должна быть развита. В ходе анализа соответствующего кода мы выясним, что у нас пока не реализована магия и здоровье для персонажей разных классов. Для уровня здоровья задействован один из HP_Level_Table, в котором нет дополнительного деления на классы (впрочем, он создан когда о классах мы еще не задумывались). Давайте такое дополнение введем:
Const Hplevel_Table: array
[classWarrior..classMage, 0..MaxPlayerLevel] of Integer =
(
(10, 20, 30, 50, 80, 130, 210, 340),
(6, 12, 20, 30, 50, 100, 150, 250),
(3, 7, 10, 15, 30, 50, 100, 175)
);
Также заполним модуль Tables и массивом уровней маны в зависимости от классов:
Const ManaLevel_Table: array
[CassWarrior..classMage, 0..MaxPlayerLevel] of Integer =
(
(0, 0, 0, 0, 0, 0, 0, 0),
(0, 7, 10, 25, 30, 50, 100, 175),
(0, 12, 20, 30, 50, 100, 150, 250)
);
Поговорим о местах, которые теперь будут компилироваться с ошибками, нам надо будет реализовать обращение к массиву уровней здоровья на уточненный вызов с указанием класса и добавить код работы с уровнем маны. Часть команд из процедуры InitHero заполним Hp и MaxHP) перенесем для удобства в конец GenerateHero, так как теперь нужно знать выбранный класс героя. Тут же разместим инициализацию уровня маны:
While Heroes[curHero] do
begin
MaxHp:=HPLEVEL_TABLE[Class,Level];
HP:=MAXHP;
Mana:=ManaLEVEL_TABLE[Class,Level];
MaxMana:=Mana;
EXP:=0;
MaxExp:=EXP_Level_TABLE[level];
VisLong:=2;
End;
End;
Данные направим и откорректируем в процедуре IncXP (модуль Него):
Procedure IncXP( var H: THero; axp: Integer );
Begin
…Exp,axp);
…:=Str_ADD_EXP + IntToStr (axp));
if H.Exp > H.MaxExp then
begin
H.Exp := 0;
if H.Level < MaxPlayerLevel then
begin
Showlnfo(STR_NEXTLEVEL);
inc(H.Level);
end;
H.MaxExp := ExpLevel_Table[H.Level];
H.MaxHP := HPLevelJTable[H.Class,H.Level];
H.MaxMana := ManaLevelJTable[H.Class,H.Level];
H.HP := H.MaxHP;
end;
end;
Также добавим строку вывода уровня маны в процедуру динамического отображения информации о герое ShowHeroInfo:
procedure ShowHeroInfo(HeroNum: Integer);
begin
TextColor( LightGray );
GoToXY(40, 2);
Write(STR_HERO_HP,Heroes[HeroNum].HP, ' / ' ,Heroes[HeroNum].MaxHP);
GoToXY(40, 3);
Write(STR_HERO_MANA,Heroes[HeroNum].Mana, ' / ' ,Heroes[HeroNum].M
axMana);
GoToXY(40, 4);
Write(STR_HERO_XY,Heroes[HeroNum].x, ' , ' ,Heroes[HeroNum].y);
end; Константа STR_HHRO_MANA:
STR_HERO_MANA = ' Мана/Макс.Мана: ' ;
Как мана будет расходоваться? Расходоваться она будет на заклинания. А заклинания -товар штучный, их сложно уложить в прокрустово ложе описания структуры. Работа заклинания - процесс оригинальный и будет реализовываться непосредственно в программном коде.
Для демонстрации возможностей магической системы создадим два заклинания. Первое, назовем его "Огненный шторм", будет наносить повреждения от 1 до 4 единиц каждому монстру, находящемуся на любой соседней с героем клеток, а второе - "Самоисцеление", позволит быстро восстановить собственное здоровье. За счет маны, конечно. По какому принципу будут вызываться заклинания? В крупных ролевых проектах список доступных герою заклинаний формируется постепенно. Например, для этого надо пройти обучение в школе или у какого-нибудь мастера, учителя. Существует также концепция "метания заклинаний", когда у героя имеется некий универсальный навык "метания" -выполнения любого заклинания, и если он срабатывает, персонаж уже выбирает нужное из списка выученных на данный момент. Далее - создаем заклинание "Огненный шторм".
Источник: delgame.at.ua
|