Показать сообщение отдельно
Старый 13.04.2005, 10:30   #142
Vam

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

По умолчанию 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;
* *};
};

Функция вызова заклинания здесь отсутствует, вызов выполняется экзешником напрямую.
Ответить с цитированием