Выкладываю все инструкции и нужные скрипты. Я решил пока ограничить количество предложенных навыков самыми слабыми версиями. Их появление точно никак особо не повлияет на баланс Амена. О более сильных версиях этих навыков можно подумать потом. Остаётся тогда всего 13 разных навыков.
Flashstep (-> Trickstep -> Mist Flashstep)
Focus (-> Concentration -> Meditation)
Float (-> Hover -> Levitation)
Resilience (-> Vigorous -> Superhuman)
Peace (-> Calm -> Tranquility)
Improved Sense (-> Mind's Eye -> Premonition)
Energy Guard (-> Energy Wall -> Energy Barrier)
Quickstep (-> Faststep -> Speedstep)
Strong (-> Powerful -> Unstoppable)
Toughness (-> Resistance -> Immunity)
Break (-> Shatter -> Crush)
Weaken (-> Crack -> Crumble)
Jinx (-> Curse -> Hexism)
Позже можно добавить ещё некоторые особые индивидуальные навыки с "EP" для вампиров, певиц, тайных разбойников и всяких других чудиков населяющих Амен. (IMG:
style_emoticons/default/tongue.gif)
Нужные скрипты:
---------------------
epenergy.uti
---------------
Сначала создаётся камень с тэгом "epenergy". Камень должен выдаваться в инвентарь персонажа, как мешочек с кубиками и посох эмоций, и при первой выдаче имеет 25 зарядов (charges). Камень работает в качестве батарейки для очков EP.
Этот камень помогает вам следить за регенерацией энергии. Поставив его в квикслот вы можете всегда увидеть сколько энергии у вас на данный момент. Камень регенерирует 1 очко энергии за каждые 12 секундДалее идут два скрипта связанные с регенерацией очков EP в камень "epenergy".
epregen1.nss
----------------
void main()
{
object oItem = GetItemPossessedBy(OBJECT_SELF, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges + 1;
if (nNewCharge > (10 + GetHitDice(OBJECT_SELF)))
{nNewCharge = (10 + GetHitDice(OBJECT_SELF));}
float fNum = 12.0;
if (GetItemPossessedBy(OBJECT_SELF, "epfocus")!= OBJECT_INVALID)
fNum = 10.0;
if (GetItemPossessedBy(OBJECT_SELF, "epconcentration")!= OBJECT_INVALID)
fNum = 9.0;
if (GetItemPossessedBy(OBJECT_SELF, "epmeditation")!= OBJECT_INVALID)
fNum = 8.0;
SetItemCharges(oItem, nNewCharge);
DelayCommand(fNum, ExecuteScript("epregen2", OBJECT_SELF));
}
epregen2.nss
-----------------
void main()
{
object oItem = GetItemPossessedBy(OBJECT_SELF, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges + 1;
if (nNewCharge > (10 + GetHitDice(OBJECT_SELF)))
{nNewCharge = (10 + GetHitDice(OBJECT_SELF));}
float fNum = 12.0;
if (GetItemPossessedBy(OBJECT_SELF, "epfocus")!= OBJECT_INVALID)
fNum = 10.0;
if (GetItemPossessedBy(OBJECT_SELF, "epconcentration")!= OBJECT_INVALID)
fNum = 9.0;
if (GetItemPossessedBy(OBJECT_SELF, "epmeditation")!= OBJECT_INVALID)
fNum = 8.0;
SetItemCharges(oItem, nNewCharge);
DelayCommand(fNum, ExecuteScript("epregen1", OBJECT_SELF));
}
epfocus.uti
-----------------------
Для навыка "Focus" надо только создать камень с тэгом "epfocus", названием "Focus". Скрипт по регенерации EP проверяет есть ли у персонажа такой камень. При наличии камня очки EP регенерируются быстрей на 2 секунды.
Ваш персонаж научился фокусировать свои силы на регенерации энергии. Персонаж регенерирует энергию быстрее обычного, 1 EP за 10 секунд. epflashstep.uti
------------------
Создаётся камень с тэгом "epflashstep", названием "Flashstep".
4 EP
Ваш персонаж научился мгновенно пересекать открытое пространство между двумя точками. Этот метод короткой телепортации не срабатавает, если на пути оказывается какой-то предмет.Скрипт срабатывающий когда используется камень (навык):
epflashstep.nss
------------------
void main()
{
object oPC = GetItemActivator();
object oTarget = GetItemActivatedTarget();
location lTarget = GetItemActivatedTargetLocation();
location lPC = GetLocation(oPC);
effect eVis = EffectVisualEffect(VFX_IMP_DUST_EXPLOSION);
vector vPC = GetPosition(oPC);
vector vTarget = GetPositionFromLocation(lTarget);
if (LineOfSightVector(vPC, vTarget) != TRUE)
{FloatingTextStringOnCreature("Can't pass through objects", oPC);
return;}
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 4;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 3)
{FloatingTextStringOnCreature ("Not enough EP!", oPC, FALSE);
return;}
effect eBad = GetFirstEffect(oPC);
while(GetIsEffectValid(eBad))
{if (GetEffectType(eBad) == EFFECT_TYPE_INVISIBILITY ||
GetEffectType(eBad) == EFFECT_TYPE_SANCTUARY ||
GetEffectType(eBad) == EFFECT_TYPE_ETHEREAL)
{RemoveEffect(oPC, eBad);}
eBad = GetNextEffect(oPC);}
SetItemCharges(oItem, nNewCharge);
JumpToLocation(lTarget);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lTarget);
}
epfloat.uti
------------
Камень с тэгом "epfloat", название "Float".
5 EP
Персонаж слегка приподнимается и парит над землей, получает иммунитеты от магий опутывания и замедления скорости на несколько минут.Скрипт срабатывающий когда используется камень (навык):
epfloat.nss
-------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 5;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 4)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
object oTarget = GetItemActivator();
effect eParal = EffectImmunity(IMMUNITY_TYPE_ENTANGLE);
effect eEntangle = EffectImmunity(IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE);
effect eLink = EffectLinkEffects(eParal, eEntangle);
effect eLook = GetFirstEffect(oTarget);
while(GetIsEffectValid(eLook))
{
if(GetEffectType(eLook) == EFFECT_TYPE_MOVEMENT_SPEED_DECREASE ||
GetEffectType(eLook) == EFFECT_TYPE_ENTANGLE)
{
RemoveEffect(oTarget, eLook);
}
eLook = GetNextEffect(oTarget);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 30.0);
}
epresilience.uti
------------------
Камень с тэгом "epresilience", название "Resilience".
5 EP
Персонаж умеет использовать энергию для повышения своего иммунитета от болезней и ядов на несколько минут.
Скрипт срабатывающий когда используется камень (навык):
epresilience.nss
-------------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 5;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 4)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
object oTarget = GetItemActivator();
effect eParal = EffectImmunity(IMMUNITY_TYPE_DISEASE);
effect eEntangle = EffectImmunity(IMMUNITY_TYPE_POISON);
effect eLink = EffectLinkEffects(eParal, eEntangle);
effect eLook = GetFirstEffect(oTarget);
while(GetIsEffectValid(eLook))
{
if(GetEffectType(eLook) == EFFECT_TYPE_POISON ||
GetEffectType(eLook) == EFFECT_TYPE_DISEASE)
{
RemoveEffect(oTarget, eLook);
}
eLook = GetNextEffect(oTarget);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 30.0);
}
eppeace.uti
-------------
Камень с тэгом "eppeace", название "Peace".
4 EP
Персонаж регенерирует 1 хит поинт за каждые 3 секунды в течении 10 раундов.Скрипт срабатывающий когда используется камень (навык):
eppeace.nss
--------------
#include "x2_inc_spellhook"
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 4;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 3)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
object oTarget = oPC;
effect eRegen = EffectRegenerate(1, 6.0);
effect eVis = EffectVisualEffect(VFX_IMP_MAGIC_PROTECTION);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eRegen, eDur);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(10));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
epimprovedsense.uti
------------------------
Камень с тэгом "epimprovedsense" и названием "Improved Sense".
6 EP
Персонаж способен ощущать окружающую среду намного более тоньше направляя в неё свою энергию. Персонаж получает +1 ко всем спасам и +5 к навыкам Spot, Listen и Search на 10 раундов.Скрипт срабатывающий когда используется камень (навык):
epimprovedsense.nss
-------------------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 6;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 5)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
object oTarget = GetItemActivator();
effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
effect eAC1, eAC2, eAC3, eAC4;
eAC1 = EffectSavingThrowIncrease(SAVING_THROW_ALL, 1);
eAC2 = EffectSkillIncrease(SKILL_LISTEN, 5);
eAC3 = EffectSkillIncrease(SKILL_SPOT, 5);
eAC4 = EffectSkillIncrease(SKILL_SEARCH, 5);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eAC1, eDur);
eLink = EffectLinkEffects(eLink, eAC2);
eLink = EffectLinkEffects(eLink, eAC3);
eLink = EffectLinkEffects(eLink, eAC4);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 60.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
epenergyguard.uti
---------------------
Камень с тэгом "epenergyguard" и названием "Energy Guard".
6 EP
Вокруг персонажа материализуется защитная энергетическая оболочка, которая поглощает 2 очка физического урона до 20 очков в течении 10 раундов.Скрипт срабатывающий когда используется камень (навык):
epenergyguard.nss
----------------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 6;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 5)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
object oTarget = GetItemActivator();
int nDuration = GetCasterLevel(oTarget);
int nResistance = 2;
int nMetaMagic = GetMetaMagicFeat();
effect eCold = EffectDamageResistance(DAMAGE_TYPE_SLASHING, nResistance, 20);
effect eFire = EffectDamageResistance(DAMAGE_TYPE_PIERCING, nResistance, 20);
effect eAcid = EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, nResistance, 20);
effect eDur = EffectVisualEffect(VFX_DUR_PARALYZED);
effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eCold, eFire);
eLink = EffectLinkEffects(eLink, eAcid);
eLink = EffectLinkEffects(eLink, eDur);
eLink = EffectLinkEffects(eLink, eDur2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 60.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
epquickstep.uti
-----------------
Камень с тэгом "epquickstep" и названием "Quick Step".
6 EP
Этот навык помогает персонажу моментально достичь своего максимального физического потенциала. Персонаж получает +15% скорость и +1 додж АС на 10 раундов.Скрипт срабатывающий когда используется камень (навык):
epquickstep.nss
------------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 6;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 5)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
effect eHaste = EffectMovementSpeedIncrease(15);
effect eDodge = EffectACIncrease(1, AC_DODGE_BONUS);
effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
effect eLink = EffectLinkEffects(eHaste, eDodge);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 60.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
}
epstrong.uti
--------------
Камень с тэгом "epstrong" и названием "Strong".
6 EP
Этот навык поднимает физическую силу персонажа до полного потенциала. Персонаж получает +1 атаку и +1 силу на 10 раундов.Скрипт срабатывающий когда используется камень (навык):
epstrong.nss
---------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 6;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 5)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
object oTarget = GetItemActivator();
effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_10);
effect eAttack = EffectAttackIncrease(1);
effect eSave = EffectAbilityIncrease(ABILITY_STRENGTH, 1);
effect eLink = EffectLinkEffects(eAttack, eSave);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetLocation(oTarget));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 10.0);
}
eptoughness.uti
------------------
Камень с тэгом "eptoughness" и названием "Toughness".
14 EP
Организм персонажа становится более закаленным против всех видов урона. В течении 5 раундов персонаж получает только 90% урона.Скрипт срабатывающий когда используется камень (навык):
eptoughness.nss
-------------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 14;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 13)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
effect eImp = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
effect eVis = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
object oTarget = OBJECT_SELF;
effect eCold = EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 10);
effect eFire = EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 10);
effect eElec = EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 10);
effect eSoni = EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 10);
effect eAcid = EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 10);
effect eSlash = EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, 10);
effect ePierce = EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, 10);
effect eBludge = EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, 10);
effect eLink = EffectLinkEffects(eElec, eCold);
eLink = EffectLinkEffects(eLink, eFire);
eLink = EffectLinkEffects(eLink, eVis);
eLink = EffectLinkEffects(eLink, eSoni);
eLink = EffectLinkEffects(eLink, eAcid);
eLink = EffectLinkEffects(eLink, eSlash);
eLink = EffectLinkEffects(eLink, ePierce);
eLink = EffectLinkEffects(eLink, eBludge);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 30.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, oTarget);
}
epbreak.uti
--------------
Камень с тэгом "epbreak" и названием "Break".
4 EP
Персонаж превращает свою энергию в силы телекинезиса, которые физически бросают жертву в разные стороны. Цель получает 5 очков магического урона.Скрипт срабатывающий когда используется камень (навык):
epbreak.nss
---------------
#include "epdc"
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 4;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 3)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
effect eBad = GetFirstEffect(oPC);
while(GetIsEffectValid(eBad))
{if (GetEffectType(eBad) == EFFECT_TYPE_INVISIBILITY ||
GetEffectType(eBad) == EFFECT_TYPE_SANCTUARY ||
GetEffectType(eBad) == EFFECT_TYPE_ETHEREAL)
{RemoveEffect(oPC, eBad);}
eBad = GetNextEffect(oPC);}
SetItemCharges(oItem, nNewCharge);
if (iDefend > iAttack)
{FloatingTextStringOnCreature("Saved!", oPC, TRUE);
return;}
object oTarget = GetItemActivatedTarget();
int nCasterLevel = GetCasterLevel(oPC);
effect eVis = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
if(!GetIsReactionTypeFriendly(oTarget))
{
{
effect eBad = EffectDamage(5, DAMAGE_TYPE_MAGICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBad, oTarget);
}
}
}
epweaken.uti
----------------
Камень с тэгом "epweaken" и названием "Weaken".
14 EP
Персонаж изменяет поток энергии в жертве, делая её более хрупкой к повреждению. Иммунитет жертвы ко всем видам урона понижается на 10% на 5 раундов.Скрипт срабатывающий когда используется камень (навык):
epweaken.nss
-----------------
#include "x2_inc_spellhook"
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 14;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 13)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
int iDn = 10;
object oTarget = GetItemActivatedTarget();
effect eAcid = EffectDamageImmunityDecrease(DAMAGE_TYPE_ACID, iDn);
effect eSonic = EffectDamageImmunityDecrease(DAMAGE_TYPE_SONIC, iDn);
effect eFire = EffectDamageImmunityDecrease(DAMAGE_TYPE_FIRE, iDn);
effect eCold = EffectDamageImmunityDecrease(DAMAGE_TYPE_COLD, iDn);
effect eElec = EffectDamageImmunityDecrease(DAMAGE_TYPE_ELECTRICAL, iDn);
effect eSlas = EffectDamageImmunityDecrease(DAMAGE_TYPE_SLASHING, iDn);
effect ePier = EffectDamageImmunityDecrease(DAMAGE_TYPE_PIERCING, iDn);
effect eBlud = EffectDamageImmunityDecrease(DAMAGE_TYPE_BLUDGEONING, iDn);
effect ePosi = EffectDamageImmunityDecrease(DAMAGE_TYPE_POSITIVE, iDn);
effect eVis = EffectVisualEffect(VFX_IMP_BREACH);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eAcid, eDur);
eLink = EffectLinkEffects(eLink, eSonic);
eLink = EffectLinkEffects(eLink, eFire);
eLink = EffectLinkEffects(eLink, eCold);
eLink = EffectLinkEffects(eLink, eElec);
eLink = EffectLinkEffects(eLink, eSlas);
eLink = EffectLinkEffects(eLink, ePier);
eLink = EffectLinkEffects(eLink, eBlud);
eLink = EffectLinkEffects(eLink, ePosi);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 30.0);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
epjinx.uti
-----------
Камень с тэгом "epjinx" и названием "Jinx".
8 EP
Изменяя поток энергии вокруг жертвы персонаж приносит ей "неудачу". Все спасы жертвы понижаются на -1 на 5 раундов.Скрипт срабатывающий когда используется камень (навык):
epjinx.nss
------------
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemPossessedBy(oPC, "epenergy");
int nCharges = GetItemCharges(oItem);
int nNewCharge = nCharges - 8;
{if (nNewCharge < 1)
nNewCharge = 1;}
if (nCharges < 7)
{FloatingTextStringOnCreature("Not enough EP!", oPC, TRUE);
return;}
SetItemCharges(oItem, nNewCharge);
effect eAOE = EffectSavingThrowDecrease(SAVING_THROW_ALL, 1, SAVING_THROW_TYPE_ALL);
object oTarget = GetItemActivatedTarget();
effect eImpact = EffectVisualEffect(VFX_IMP_DOOM);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, 30.0);
}