#include "X0_I0_SPELLS"
location Decalage(location lLoc, float fRayon = 10.0) //permet un decalage de 10 metre de rayon
{
vector vPos = GetPositionFromLocation(lLoc);
float fR = IntToFloat(Random(100)+1)/100 * fRayon; //Definition des coordonnes polaires du nouveau point
float fTheta = IntToFloat(Random(360));
vPos.x += fR*cos(fTheta); //Calcul des modifications faites aux coordonnes initiales
vPos.y += fR*sin(fTheta);
lLoc = Location(GetAreaFromLocation(lLoc), vPos, 0.0); //Redefinition de la location apres application du decalage
return lLoc;
}
//
//
// PREMIERE FONCTION TELEPORTATION BUGGEE
//
//
void tele_dime (object oMage)
{
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1); //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
effect eko = EffectKnockdown();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),oMage);
string sTag_dest = "WpTeleMage0"+IntToString(Random(6)+1); // TAG DE DESTINATION
AssignCommand(oMage, ClearAllActions(TRUE));
object oDest = GetObjectByTag(sTag_dest); //solution de Flumby mise en oeuvre RECHERCHE DE L'OBJET VIA LE TAG
AssignCommand(oMage,JumpToLocation(GetLocation(oDest))); //solution de Flumby mise en oeuvre TELEPORTATION ELLE MEME
//AssignCommand(oMage,JumpToObject(GetObjectByTag(sTag_dest))); //tous les anciens essais
//AssignCommand(oEntering,JumpToObject(GetObjectByTag(sWPTag)));
//DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,1.0)); //Application du ko en commentaire
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez dans un endroit lointaint. Heureusement vos esprit vous reviennent tres rapidement.";
}
//
//
// SECONDE FONCTION TELEPORTATION BUGGE
//
//
void tele_self (object oMage)
{
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1); //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
effect eko = EffectKnockdown();
AssignCommand(oMage, ClearAllActions(TRUE));
AssignCommand(oMage,JumpToLocation(Decalage(GetLocation(oMage),6.0))); TELEPORTATION PLUS OBTENTION DE LA LOCALISATION VIA LA FONCTION DECALAGE (QUI MARCHE) LA TELEPORTATION A LIEU SUR UNE LOCATION ALEATOIRE DANS UN RAYON DE 6 METRE AUTOUR DU MAGE
//DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,IntToFloat(d6(1)))); //Application du ko en commentaire
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez une courte distance, sonne sous le choc.";
}
//
//
// FIN DES TELEPORTATIONS BUGGE, LE RESTE EST FONCTIONEL (CES FONCTIONS SONT APELLE DANS LE SWITCH DE LA FONCTION MAIN DE CE SCRIPT. ELLES SONT APELLE PAR UNE DES DERNIERE CONDITIONS)
//
//
void degats(object oMage)
{
effect eDam;
int nMetaMagic = GetMetaMagicFeat();
switch (nMetaMagic)
{
case METAMAGIC_EMPOWER:
eDam = EffectDamage(d12(15),DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
break;
case METAMAGIC_MAXIMIZE:
eDam = EffectDamage(12*10,DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
break;
default:
eDam = EffectDamage(d12(10),DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
break;
}
effect eVis = EffectVisualEffect(234);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oMage);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous et vous la sentez parcourir et dechirer votre corps.";
}
void deat_soul(object oMage)
{
effect eVis = EffectVisualEffect(VFX_IMP_DEATH_L);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oMage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMage);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous, vous sentez votre ame s'etirer et se tordre comme si l'on vous l'arrachait avant de vous effondrer, mort.";
}
void deat_implo(object oMage)
{
object oTarget;
float fDelay;
//effect eDeath = EffectDeath();
//eDeath = SupernaturalEffect(eDeath);
effect eImplode= EffectVisualEffect(VFX_FNF_IMPLOSION);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImplode, GetLocation(oMage));
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage),FALSE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
fDelay = GetRandomDelay(0.4, 1.2);
//Make Constit save
if(!MySavingThrow(SAVING_THROW_FORT, oTarget, 30, SAVING_THROW_TYPE_CHAOS, OBJECT_SELF, fDelay))
{
//Apply death effect and the VFX impact
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage));
}
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous et dechiquete votre corps et tout ceux aleantours.";
}
void knoc_down(object oMage)
{
int nMetaMagic = GetMetaMagicFeat();
float fDuration;
switch (nMetaMagic)
{
case METAMAGIC_EMPOWER:
fDuration = (d6(3) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
case METAMAGIC_EXTEND:
fDuration = (d6(2)*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<6.0) fDuration = 6.0;
break;
case METAMAGIC_MAXIMIZE:
fDuration = (6*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<3.0) fDuration = 3.0;
break;
default:
fDuration = (d6(2) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
}
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe parcours votre corps et vous assome pour une courte duree (" +FloatToString(fDuration,2,0)+ " rounds)";
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectStunned(),oMage,fDuration*6.0);
}
void confused(object oMage)
{
int nMetaMagic = GetMetaMagicFeat();
float fDuration;
switch (nMetaMagic)
{
case METAMAGIC_EMPOWER:
fDuration = (d6(3) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
case METAMAGIC_EXTEND:
fDuration = (d6(2)*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<6.0) fDuration = 6.0;
break;
case METAMAGIC_MAXIMIZE:
fDuration = (6*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<3.0) fDuration = 3.0;
break;
default:
fDuration = (d6(2) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
}
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe parcours votre corps et vous rend confus pour une courte duree (" +FloatToString(fDuration,2,0)+ " rounds)";
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectConfused(),oMage,fDuration*6.0);
}
void aveugle(object oMage)
{
int nVfxGenreRace;
if (GetGender(oMage) == GENDER_FEMALE)
{
switch (GetRacialType(oMage))
{
case RACIAL_TYPE_HUMAN:
nVfxGenreRace = VFX_EYES_RED_FLAME_HUMAN_FEMALE;
break;
case RACIAL_TYPE_ELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_ELF_FEMALE;
break;
case RACIAL_TYPE_HALFORC:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFORC_FEMALE;
break;
case RACIAL_TYPE_HALFELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFELF_FEMALE;
break;
case RACIAL_TYPE_HALFLING:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFLING_FEMALE;
break;
case RACIAL_TYPE_DWARF:
nVfxGenreRace = VFX_EYES_RED_FLAME_DWARF_FEMALE;
break;
case RACIAL_TYPE_GNOME:
nVfxGenreRace = VFX_EYES_RED_FLAME_GNOME_FEMALE;
break;
default:
SendMessageToPC(OBJECT_SELF,"Une exception dans la determination de votre race eu lieu. Merci de prevenir le MD Arfost le plus vite possible.");
break;
}
}
else
{
switch (GetRacialType(oMage))
{
case RACIAL_TYPE_HUMAN:
nVfxGenreRace = VFX_EYES_RED_FLAME_HUMAN_MALE;
break;
case RACIAL_TYPE_ELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_ELF_MALE;
break;
case RACIAL_TYPE_HALFORC:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFORC_MALE;
break;
case RACIAL_TYPE_HALFELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFELF_MALE;
break;
case RACIAL_TYPE_HALFLING:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFLING_MALE;
break;
case RACIAL_TYPE_DWARF:
nVfxGenreRace = VFX_EYES_RED_FLAME_DWARF_MALE;
break;
case RACIAL_TYPE_GNOME:
nVfxGenreRace = VFX_EYES_RED_FLAME_GNOME_MALE;
break;
default:
SendMessageToPC(OBJECT_SELF,"Une exception dans la determination de votre race eu lieu. Merci de prevenir le MD Arfost le plus vite possible. C'est vrai quoi, ne pas avoir de race c'est le bordel.");
break;
}
}
effect eYeux = SupernaturalEffect(EffectVisualEffect(nVfxGenreRace));
effect eBlindness = SupernaturalEffect(EffectBlindness());
eBlindness = EffectLinkEffects(eYeux,eBlindness);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eBlindness,oMage);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "vous sentez vos yeux vous bruler soudainement, puis tout deviens sombre autours de vous.";
}
void invocation (object oMage)
{
effect eVis;
string sBlueprint;
location lLoc;
lLoc = GetLocation(oMage);
int iNbSpawn = d2(1);
int i;
for (i = 1; i <= iNbSpawn; i++)
{
switch (d10(1))
{
case 1:
sBlueprint = "NW_S_SUCCUBUS";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
break;
case 2:
sBlueprint = "NW_S_VROCK";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
break;
case 3:
sBlueprint = "NW_S_CTRUMPET";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
break;
case 4:
sBlueprint = "NW_S_SLAADDETH";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3,FALSE);
break;
case 5:
sBlueprint = "NW_S_BALOR";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE,FALSE);
break;
case 6:
sBlueprint = "NW_S_SUCCUBUS";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE,FALSE);
break;
default:
//
break;
}
lLoc = Decalage(lLoc,8.0);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVis,lLoc);
CreateObject(OBJECT_TYPE_CREATURE,sBlueprint,lLoc,TRUE);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "une legere faille s'ouvre sous vos yeux. Vous arrivez a la controler mais le temps que vous le fassiez quelques creatures en sont sortie.";
}
}
void effe_lampion (object oMage)
{
effect eVis = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE);
eVis = SupernaturalEffect(eVis);
int nDuration = GetCasterLevel(oMage);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eVis,oMage,TurnsToSeconds(nDuration));
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "la magie que vous tentiez de maitriser se concentre en vous et vous illumine d'une lueur etrange.";
}
void tele_self (object oMage)
{
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1); //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
effect eko = EffectKnockdown();
AssignCommand(oMage, ClearAllActions(TRUE));
AssignCommand(oMage,JumpToLocation(Decalage(GetLocation(oMage),6.0)));
//DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,IntToFloat(d6(1)))); //Application du ko en commentaire
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez une courte distance, sonne sous le choc.";
}
void lampion_disparition (object oMage)
{
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
effect eVis2 = EffectVisualEffect(VFX_FNF_PWKILL);
effect eInvi = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
effect eInvi2 = EffectInvisibility(INVISIBILITY_TYPE_NORMAL);
eInvi2 = EffectLinkEffects(eInvi,eInvi2);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oMage);
DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis2,oMage));
float fDelay;
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, GetLocation(oMage),FALSE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
fDelay = GetRandomDelay(0.4, 1.2);
if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, 30, SAVING_THROW_TYPE_CHAOS, OBJECT_SELF, fDelay))
{
//Apply death effect and the VFX impact
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oTarget, IntToFloat(d6(1))));
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage));
}
DelayCommand(4.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eInvi2,oMage,100.0+d100(1)));
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "... pouf";
}
void haunted (object oMage)
{
location lLoc = GetLocation(oMage);
string sFinTag = GetStringLeft(GetName(oMage),5);
int nNbGhost = d4(1);
int i;
for (i = 1; i <nNbGhost; i++)
{
CreateObject(OBJECT_TYPE_CREATURE,"ameenpeine",Decalage(lLoc,10.0),FALSE,"ghost_"+sFinTag);
}
AdjustFactionReputation(GetObjectByTag("ghost_"+sFinTag),oMage,-50);
SetLocalString(oMage,"sTagGhost","ghost_"+sFinTag);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "des creatures ethere viennent vous hanter.";
}
void coupure_magie (object oMage)
{
SetLocalInt(oMage,"nCoupMagi",1);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'etrange impression d'un manque vous envahis.";
}
string sMessageEffetMagiqueIncontrole;
void main()
{
int nEffet = GetLocalInt(OBJECT_SELF,"nEffet");
sMessageEffetMagiqueIncontrole = "Pendant l'incantation vous perdez le controle de votre magie et ";
if (nEffet == 0) nEffet = d12(1) + d10(1);
switch (nEffet)
{
case 0:
// statements ...
// condition would also evaluate as true if x == 0, which should not happen . . .
// but . . . lets put this in here just as a safety device
break;
case 1:
// statements ...
// condition would also evaluate as true if x == 0, which should not happen . . .
// but . . . lets put this in here just as a safety device
break;
case 2:
degats(OBJECT_SELF);
break;
case 3:
degats(OBJECT_SELF);
break;
case 4:
deat_soul(OBJECT_SELF);
break;
case 5:
deat_implo(OBJECT_SELF);
break;
case 6:
knoc_down(OBJECT_SELF);
break;
case 7:
knoc_down(OBJECT_SELF);
break;
case 8:
knoc_down(OBJECT_SELF);
break;
case 9:
knoc_down(OBJECT_SELF);
break;
case 10:
confused(OBJECT_SELF);
break;
case 11:
confused(OBJECT_SELF);
break;
case 12:
confused(OBJECT_SELF);
break;
case 13:
confused(OBJECT_SELF);
break;
case 14:
aveugle(OBJECT_SELF);
break;
case 15:
aveugle(OBJECT_SELF);
break;
case 16:
invocation(OBJECT_SELF);
break;
case 17:
invocation(OBJECT_SELF);
break;
case 18:
effe_lampion(OBJECT_SELF);
break;
case 19:
effe_lampion(OBJECT_SELF);
break;
case 20:
effe_lampion(OBJECT_SELF);
break;
case 21:
effe_lampion(OBJECT_SELF);
break;
case 22:
tele_dime(OBJECT_SELF);
break;
case 23:
lampion_disparition(OBJECT_SELF);
break;
case 24:
lampion_disparition(OBJECT_SELF);
break;
case 25:
haunted(OBJECT_SELF);
break;
case 26:
haunted(OBJECT_SELF);
break;
case 27:
tele_self(OBJECT_SELF);
break;
case 28:
//DelayCommand(1.8,tele_self(OBJECT_SELF));
tele_self(OBJECT_SELF)
break;
case 29:
//DelayCommand(1.8,tele_dime(OBJECT_SELF));
tele_dime(OBJECT_SELF)
break;
case 30:
coupure_magie(OBJECT_SELF);
break;
default:
break;
}
SendMessageToPC(OBJECT_SELF,sMessageEffetMagiqueIncontrole);
}