Показать сообщение отдельно
Старый 11.04.2005, 11:44   #141
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Уроки скриптологии

16. Заклинания.

Все файлы заклинаний расположены в директории ..\AI\Magic\Spells\
Все заклинания мы рассматривать не будем, разберем только основные типы и принципы работы.

Все заклинания состоят из следующих частей:
1. Объявление самого заклинания типа INSTANCE Spell_ххх(C_Spell_Proto) с инициализацией требуемых переменных, где ххх - название заклинания.
2. Функция, управляющая процессом инвестирования маны int Spell_Logic_ххх(var int manaInvested). Аргумент int manaInvested определяет кол-во инвестированной маны, функция возвращает одну из констант управления процессом инвестирования маны.
3. Функция вызова самого заклинания void Spell_Cast_ххх() (вызывается только экзешником). Имя ххх должно строго соответствовать ххх при объявлении инстанции.

// *******************************************
// Заклинание Свет
// *******************************************

const int SPL_Cost_LIGHT * * * *= 10; * // кол-во требуемой маны

const int SPL_Duration_LIGHT * *= 5; * *// время действия заклинания в минутах

// объявление заклинания с инициализацией
INSTANCE Spell_Light(C_Spell_Proto)
{
* *time_per_mana * * * * * = 500;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_NONE;
* *targetCollectRange * * *= 0;
* *targetCollectAzi * * * *= 0;
* *targetCollectElev * * * = 0;
};

// функция инвестирования маны
func int Spell_Logic_Light(var int manaInvested)
{
* *// если активное заклинание свиток и есть требуемое кол-во маны
* *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *// старт заклинания
* * * *return SPL_SENDCAST;
* *}
* *// иначе, если руна и есть требуемое кол-во маны
* *else if (self.attribute[ATR_MANA] >= SPL_Cost_Light)
* *{ *
* * * *// старт заклинания
* * * *return SPL_SENDCAST;
* *}
* *else // мало маны
* *{
* * * *// отмена заклинания
* * * *return SPL_SENDSTOP;
* *};
};

// вызов заклинания
func void Spell_Cast_Light()
{
* *// если свиток
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *// уменьшение маны на стоимость свитков
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else // руна
* *{
* * * *// уменьшение маны на фактическую стоимость заклинания
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Light;
* *};
* *// изменить случайное число выбора заклинаний
* *self.aivar[AIV_SelectSpell] += 1;
};

По такому принципу работают большинство заклинаний, это:


SPL_PalLight * * * * * *//Святой свет, * * * * * * * * * * *// файл Spell_Light_Alle.d
SPL_PalLightHeal * * * *//Малое лечение паладина * * * * * *// файл Spell_Heal_Alle.d
SPL_PalMediumHeal * * * //Среднее лечение паладина
SPL_PalFullHeal * * * * //Сильное лечение паладина
SPL_LightHeal * * * * * //Лечить легкое ранение
SPL_MediumHeal * * * * *//Лечить среднее ранение
SPL_FullHeal * * * * * *//Лечить сильное ранение
SPL_PalHolyBolt * * * * //Святая стрела * * * * * * * * * * // файл Spell_PalHolyBolt.d
SPL_PalRepelEvil * * * *//Разогнать дьяволов * * * * * * * *// файл Spell_PalRepelEvil.d
SPL_PalDestroyEvil * * *//Уничтожить дьяволов * * * * * * * // файл Spell_PalDestroyEvil.d
SPL_Firebolt * * * * * *//Огненная стрела * * * * * * * * * // файл Spell_FireBolt.d
SPL_Zap * * * * * * * * //Молния * * * * * * * * * * * * * *// файл Spell_Zap.d
SPL_Icebolt * * * * * * //Ледяная стрела * * * * * * * * * *// файл Spell_IceBolt.d
SPL_InstantFireball * * //Огненный шар * * * * * * * * * * *// файл Spell_InstantFireball.d
SPL_LightningFlash * * *//Удар молнии * * * * * * * * * * * // файл Spell_LightningFlash.d
SPL_IceCube * * * * * * //Ледяная глыба * * * * * * * * * * // файл Spell_IceCube.d
SPL_DestroyUndead * * * //Уничтожить нежить * * * * * * * * // файл Spell_DestroyUndead.d
SPL_Firestorm * * * * * //Малая огненная буря * * * * * * * // файл Spell_Firestorm.d
SPL_IceWave * * * * * * //Ледяная волна * * * * * * * * * * // файл Spell_IceWave.d
SPL_Firerain * * * * * *//Огненный дождь * * * * * * * * * *// файл Spell_Firerain.d
SPL_BreathOfDeath * * * //Дым смерти * * * * * * * * * * * *// файл Spell_BreathOfDeath.d
SPL_MassDeath * * * * * //Волна смерти * * * * * * * * * * *// файл Spell_MassDeath.d
SPL_MasterOfDisaster * *//Святой удар * * * * * * * * * * * // файл Spell_MasterOfDisaster.d
SPL_Deathbolt * * * * * //Стрела смерти * * * * * * * * * * // файл Spell_DeathBolt.d
SPL_Deathball * * * * * //Шар смерти * * * * * * * * * * * *// файл Spell_DeathBall.d
SPL_ConcussionBolt * * *//Стрела сотрясения * * * * * * * * // файл Spell_ConcussionBolt.d
SPL_Thunderstorm * * * *//Шторм * * * * * * * * * * * * * * // файл Spell_Thunderstorm.d
SPL_Whirlwind * * * * * //Смерч * * * * * * * * * * * * * * // файл Spell_Whirlwind.d
SPL_WaterFist * * * * * //Кулак воды * * * * * * * * * * * *// файл Spell_WaterFist.d
SPL_IceLance * * * * * *//Ледяное копье * * * * * * * * * * // файл Spell_IceLance.d
SPL_Geyser * * * * * * *//Гейзер * * * * * * * * * * * * * *// файл Spell_Geyser.d
SPL_Swarm * * * * * * * //Рой * * * * * * * * * * * * * * * // файл Spell_Swarm.d
SPL_GreenTentacle * * * //Зеленые щупальца * * * * * * * * *// файл Spell_GreenTentacle.d
SPL_Energyball * * * * *//Шар энергии * * * * * * * * * * * // файл Spell_EnergyBall.d
SPL_SuckEnergy * * * * *//Украсть энергию * * * * * * * * * // файл Spell_SuckEnergy.d
SPL_Skull * * * * * * * //Крик мертвых * * * * * * * * * * *// файл Spell_Skull.d


Телепортация.
// *************************
// Заклинания телепортации
// *************************

// стоимость заклинаний
const int SPL_Cost_Teleport * * = 10;

// Вывод сообщения о недоступности телепорта
// -------------------------------------------------------
// Level - уровень на котором находится телепорт прибытия
func void B_PrintTeleportTooFarAway(var int Level)
{
* *// если телепортация на другой уровень
* *if(Level != CurrentLevel)
* *{
* * * *// вывод сообщения "Слишком далеко"
* * * *PrintScreen(PRINT_TeleportTooFarAway,-1,YPOS_LevelUp,FONT_ScreenSmall,2);
* *};
};

// Инициализация заклинаний
INSTANCE Spell_Teleport(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_CASTER;
* *canTurnDuringInvest * * = 0;
* *targetCollectRange * * *= 0;
* *targetCollectAzi * * * *= 0;
* *targetCollectElev * * * = 0;
};

// Функции инвестирования маны для всех заклинаний телепортации идентичны ранее рассмотренной
func int Spell_Logic_PalTeleportSecret(var int manaInvested)
{
* *if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *return SPL_SENDCAST;
* *}
* *else if (self.attribute[ATR_MANA] >= SPL_Cost_Teleport)
* *{
* * * *return SPL_SENDCAST;
* *};
* *return SPL_NEXTLEVEL;
};

// Функции вызова заклинаний телепортации
func void Spell_Cast_PalTeleportSecret()
{
* *// вывод сообщения о недоступности телепорта
* *B_PrintTeleportTooFarAway(NEWWORLD_ZEN);
* *if (Npc_GetActiveSpellIsScroll(self))
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Teleport;
* *};
* *// телепортация в нужную точку
* *AI_Teleport(self,"NW_PAL_SECRETCHAMBER");
* *// анимация телепортации
* *AI_PlayAni(self,"T_HEASHOOT_2_STAND" );
};

// Остальные функции вызова заклинаний телепортации идентичны приведенной

// Вызов соответствующей функции телепортации в зависимости от активного заклинания
func void Spell_Cast_Teleport()
{
* *if (Npc_GetActiveSpell(self) == SPL_PalTeleportSecret * ) * { * Spell_Cast_PalTeleportSecret * *(); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportSeaport * * ) * { * Spell_Cast_TeleportSeaport * * *(); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportMonastery * ) * { * Spell_Cast_TeleportMonastery * *(); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportFarm * * * *) * { * Spell_Cast_TeleportFarm * * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportXardas * * *) * { * Spell_Cast_TeleportXardas * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportPassNW * * *) * { * Spell_Cast_TeleportPassNW * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportPassOW * * *) * { * Spell_Cast_TeleportPassOW * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportOC * * * * *) * { * Spell_Cast_TeleportOC * * * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportOWDemonTower) * { * Spell_Cast_TeleportOWDemonTower (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportTaverne * * ) * { * Spell_Cast_TeleportTaverne * * *(); };
};

Заклинания вызова монстров рассмотрим на примере вызова Волка

// **************
// Вызов Волка
// **************

// стоимость заклинания
const int SPL_Cost_SummonWolf * = 40;

// Инициализация заклинания
INSTANCE Spell_SummonWolf(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *targetCollectAlgo * * * = TARGET_COLLECT_NONE;
};

// Функция инвестирования маны идентична ранее рассмотренным
func int Spell_Logic_SummonWolf(var int manaInvested)
{
* *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *return SPL_SENDCAST;
* *}
* *else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonWolf)
* *{ * * *
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
* *
};

// Вызов заклинания
func void Spell_Cast_SummonWolf()
{
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonWolf;
* *};
* *// если заклинание применяет ГГ
* *if(Npc_IsPlayer(self))
* *{
* * * *// рождение Вызванного волка (1 штука на 5 минут)
* * * *Wld_SpawnNpcRange(self,Summoned_Wolf,1,500);
* *}
* *else
* *{
* * * *// рождение Волка
* * * *Wld_SpawnNpcRange(self,Wolf,1,500);
* *};
* *self.aivar[AIV_SelectSpell] += 1;
};

По такому принципу работают заклинания:

SPL_SummonGoblinSkeleton * *//Вызвать скелет гоблина * * * *// файл Spell_SummonGoblinSkeleton.d
SPL_SummonSkeleton * * * * *//Вызвать скелет * * * * * * * *// файл Spell_SummonSkeleton.d
SPL_SummonGolem * * * * * * //Вызвать голема * * * * * * * *// файл Spell_SummonGolem.d
SPL_SummonDemon * * * * * * //Вызвать демона * * * * * * * *// файл Spell_SummonDemon.d
SPL_ArmyOfDarkness * * * * *//Армия мрака * * * * * * * * * // файл Spell_ArmyOfDarkness.d
SPL_SummonGuardian * * * * *//Создать стража * * * * * * * *// файл Spell_SummonGuardian.d
SPL_SummonZombie * * * * * *//Создать зомби * * * * * * * * // файл Spell_SummonZombie.d
SPL_SummonMud * * * * * * * //Вызвать Муда * * * * * * * * *// файл Spell_SummonMud.d

Ответить с цитированием