|
Re: Уроки скриптологии
Заклинания, требующие несколько уровней инвестирования маны, рассмотрим на примере заклинания "Порыв ветра"
// ************************ // Заклинание Порыв ветра // ************************
const int SPL_Cost_WindFist * * = 80; * // полная стоимость заклинания const int STEP_WindFist * * * * = 20; * // стоимость одного уровня заклинания const int SPL_Damage_WindFist * = 50; * // ущерб наносимый заклинанием на уровень
// объявление заклинания с инициализацией INSTANCE Spell_WindFist(C_Spell_Proto) { * *time_per_mana * * * * * = 30; * *damage_per_level * * * *= SPL_Damage_WindFist; * *damageType * * * * * * *= DAM_FLY; * *canTurnDuringInvest * * = TRUE; * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS_FALLBACK_NONE; * *targetCollectRange * * *= 1000; * *targetCollectType * * * = TARGET_TYPE_NPCS; };
// функция инвестирования маны func int Spell_Logic_WindFist(var int manaInvested) { * *// если недостаточно маны на уровень заклинания * *if(self.attribute[ATR_MANA] < STEP_WindFist) * *{ * * * *// инвестирование маны невозможно * * * *return SPL_DONTINVEST; * *}; * *// если инвестировано маны < 1 уровня * *if(manaInvested <= STEP_WindFist*1) * *{ * * * *// установить уровень 1 * * * *self.aivar[AIV_SpellLevel] = 1; * * * *// инвестированной маны недостаточно для перехода на следующий уровень * * * *return SPL_STATUS_CANINVEST_NO_MANADEC; * *} * *// если инвестировано маны > требуемой для 1 уровня и уровень не выше первого * *else if(manaInvested > (STEP_WindFist*1)) && (self.aivar[AIV_SpellLevel] <= 1) * *{ * * * *// уменьшение маны на уровень * * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist); * * * *// если мана < 0 * * * *if(self.attribute[ATR_MANA] < 0) * * * *{ * * * * * *// мана = 0 * * * * * *self.attribute[ATR_MANA] = 0; * * * *}; * * * *// установить уровень 2 * * * *self.aivar[AIV_SpellLevel] = 2; * * * *// переход на следующий уровень * * * *return SPL_NEXTLEVEL; * *} * *// аналогично приведенному выше для следующих уровней заклинания * *else if(manaInvested > (STEP_WindFist*2)) && (self.aivar[AIV_SpellLevel] <= 2) * *{ * * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist); * * * *if(self.attribute[ATR_MANA] < 0) * * * *{ * * * * * *self.attribute[ATR_MANA] = 0; * * * *}; * * * *self.aivar[AIV_SpellLevel] = 3; * * * *return SPL_NEXTLEVEL; * *} * *else if(manaInvested > (STEP_WindFist*3)) && (self.aivar[AIV_SpellLevel] <= 3) * *{ * * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist); * * * *if(self.attribute[ATR_MANA] < 0) * * * *{ * * * * * *self.attribute[ATR_MANA] = 0; * * * *}; * * * *self.aivar[AIV_SpellLevel] = 4; * * * *return SPL_NEXTLEVEL; * *} * *// если достигнут последний уровень * *else if(manaInvested > (STEP_WindFist*3)) && (self.aivar[AIV_SpellLevel] == 4) * *{ * * * *// дальнейшее инвестирование маны невозможно * * * *return SPL_DONTINVEST; * * *}; * *// инвестированной маны недостаточно для перехода на следующий уровень * *return SPL_STATUS_CANINVEST_NO_MANADEC; };
// вызов заклинания // где spellLevel - достигнутый уровень заклинания func void Spell_Cast_WindFist(var int spellLevel) { * *// уменьшение маны для последнего уровня * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist); * *if(self.attribute[ATR_MANA] < 0) * *{ * * * *self.attribute[ATR_MANA] = 0; * *}; * * *// изменить случайное число выбора заклинаний * *self.aivar[AIV_SelectSpell] += 1; };
По такому принципу работают следующие заклинания:
SPL_ChargeFireball * * *//Большой огненный шар * * * * * * *// файл Spell_ChargeFireball.d SPL_ChargeZap * * * * * //Шаровая молния * * * * * * * * * *// файл Spell_ChargeZap.d SPL_Pyrokinesis * * * * //Большая огненная буря * * * * * * // файл Spell_Pyrokinesis.d
Трансформация
// ************************** // Заклинания трансформации // **************************
// стоимости заклинаний const int SPL_Cost_TrfSheep * * * * = 10; const int SPL_Cost_TrfScavenger * * = 10; const int SPL_Cost_TrfGiantRat * * *= 10; const int SPL_Cost_TrfGiantBug * * *= 10; const int SPL_Cost_TrfWolf * * * * *= 10; const int SPL_Cost_TrfWaran * * * * = 10; const int SPL_Cost_TrfSnapper * * * = 10; const int SPL_Cost_TrfWarg * * * * *= 10; const int SPL_Cost_TrfFireWaran * * = 10; const int SPL_Cost_TrfLurker * * * *= 10; const int SPL_Cost_TrfShadowbeast * = 10; const int SPL_Cost_TrfDragonSnapper = 10;
// общая инициализация для всех заклинаний INSTANCE Spell_Transform(C_Spell_Proto) { * *time_per_mana * * * * * = 0; * *spelltype * * * * * * * = SPELL_NEUTRAL; * *targetCollectAlgo * * * = TARGET_COLLECT_NONE; * *canTurnDuringInvest * * = 0; };
// Функции инвестирования маны у всех заклинаний трансформации практически одинаковы, рассмотрим одну их них func int Spell_Logic_TrfSheep(var int manaInvested) { * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны * *if((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))) * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_TrfSheep) * *{ * * * *// уменьшить ману на стоимость заклинания для руны * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_TrfSheep; * * * *// ссылка на объявление (инстанцию) зверюшки, в которую превращаемся * * * *Npc_SetActiveSpellInfo(self,Sheep); * * * *// старт заклинания * * * *return SPL_SENDCAST; * *} * *else * *{ * * * *// заклинание невозможно * * * *return SPL_SENDSTOP; * *}; };
Функция вызова заклинания здесь отсутствует, вызов выполняется экзешником напрямую.
|