|
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
|