diff --git a/_removed/70_spellhook.ncs b/_removed/70_spellhook.ncs new file mode 100644 index 0000000..c93fae0 Binary files /dev/null and b/_removed/70_spellhook.ncs differ diff --git a/_removed/70_spellhook.nss b/_removed/70_spellhook.nss new file mode 100644 index 0000000..6dec0bc --- /dev/null +++ b/_removed/70_spellhook.nss @@ -0,0 +1,257 @@ +//:://///////////////////////////////////////////// +//:: Community Patch 1.71: Improve Spell Hook Include File +//:: 70_spellhook +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + + This file acts as a hub for all code that + is hooked into the nwn spellscripts' + + If you want to implement material components + into spells or add restrictions to certain + spells, this is the place to do it. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Shadooow +//:: Created On: 2012-01-17 +//::////////////////////////////////////////////// + +#include "x2_inc_spellhook" + +int MusicalInstrumentsCheck(object oItem) +{ + int bRulesApply = GetGameDifficulty() >= GAME_DIFFICULTY_CORE_RULES; + if(bRulesApply) + { + switch(GetLocalInt(GetModule(),"71_RESTRICT_MUSICAL_INSTRUMENTS")) + { + case 1://perform based + if(GetSkillRank(SKILL_PERFORM) > -1) + { + int nDC = GetLocalInt(oItem,"MUSICAL_INSTRUMENT_DC"); + if(!nDC) + { + nDC = 7+3*StringToInt(Get2DAString("des_crft_spells","Level",GetSpellId())); + } + if(!GetIsSkillSuccessful(OBJECT_SELF, SKILL_PERFORM, nDC)) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE), OBJECT_SELF); + return FALSE; + } + } + else + { + FloatingTextStrRefOnCreature(8288,OBJECT_SELF,FALSE);//you cannot use this skill + return FALSE; + } + break; + case 2://song feat based + if(GetHasFeat(FEAT_BARD_SONGS)) + { + DecrementRemainingFeatUses(OBJECT_SELF,FEAT_BARD_SONGS); + } + else + { + FloatingTextStrRefOnCreature(40063,OBJECT_SELF,FALSE); + return FALSE; + } + break; + } + } + int bDeaf; + effect e1 = GetNextEffect(OBJECT_SELF);//part1 check for silence effect + while(GetIsEffectValid(e1)) + { + switch(GetEffectType(e1)) + { + case EFFECT_TYPE_SILENCE: + FloatingTextStrRefOnCreature(85764,OBJECT_SELF); // not useable when silenced + return FALSE; + case EFFECT_TYPE_DEAF: + bDeaf = TRUE; + break; + } + e1 = GetNextEffect(OBJECT_SELF); + } + if(bDeaf && bRulesApply && d100() < 21)// 20% chance to fail under deafness + { + FloatingTextStrRefOnCreature(83576,OBJECT_SELF); //* You can not concentrate on using this ability effectively * + return FALSE; + } + string music = GetLocalString(oItem,"MUSICAL_INSTRUMENT_SOUND"); + if(music == "") + { + music = "sdr_bardsong"; + } + PlaySound(music); + return TRUE; +} + +//------------------------------------------------------------------------------ +// if X2_EXECUTE_SCRIPT_END is set by this script, the original spell will not be cast +// the order in which the functions are called here DOES MATTER, changing it +// WILL break the crafting subsystems +//------------------------------------------------------------------------------ +void main() +{ + object oTarget = GetSpellTargetObject(); + object oItem = GetSpellCastItem(); + + if(oItem != OBJECT_INVALID) + { + int spellOverride = GetLocalInt(oItem,"ITEM_SPELL_OVERRIDE"); + if(spellOverride != 0 && !GetLocalInt(GetModule(),"SPELL_OVERRIDE_FINISHED")) + { + SetLocalInt(GetModule(),"SPELL_OVERRIDE_FINISHED",TRUE); + ExecuteScript(Get2DAString("spells","ImpactScript",spellOverride < 0 ? 0 : spellOverride),OBJECT_SELF); + SetLocalInt(GetModule(),"SPELL_OVERRIDE_FINISHED",FALSE); + SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END); + return; + } + } + else//metamagic exploit handling + { + int nMeta = GetMetaMagicFeat(); + if((nMeta == METAMAGIC_EMPOWER && !GetHasFeat(FEAT_EMPOWER_SPELL)) || (nMeta == METAMAGIC_MAXIMIZE && !GetHasFeat(FEAT_MAXIMIZE_SPELL))) + { + effect e = GetFirstEffect(OBJECT_SELF); + nMeta = -1; + while(GetIsEffectValid(e)) + { + if(GetEffectType(e) == EFFECT_TYPE_POLYMORPH)//if used in polymorph nothing happens, CP fixes this exploit in engine + { + nMeta = 0; + break; + } + } + } + else if((nMeta == METAMAGIC_EXTEND && !GetHasFeat(FEAT_EXTEND_SPELL)) || (nMeta == METAMAGIC_QUICKEN && !GetHasFeat(FEAT_QUICKEN_SPELL)) || + (nMeta == METAMAGIC_SILENT && !GetHasFeat(FEAT_SILENCE_SPELL)) || (nMeta == METAMAGIC_STILL && !GetHasFeat(FEAT_STILL_SPELL))) + { + nMeta = -1; + } + if(nMeta < 0) + { + //block the spell for exploit abuse + FloatingTextStrRefOnCreature(3734,OBJECT_SELF,FALSE);//prints "Spell failed!" + SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END); + return; + } + } + //--------------------------------------------------------------------------- + // This small addition will check to see if the target is mounted and the + // spell is therefor one that should not be permitted. + //--------------------------------------------------------------------------- + if(!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // do check for abort due to being mounted check + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(X3ShapeShiftSpell(oTarget)) + { + SetLocalInt(oTarget, "Polymorphed", TRUE); + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END); + return; + }// shape shifting not allowed while mounted + break; + } + } // do check for abort due to being mounted check + + + //--------------------------------------------------------------------------- + // This stuff is only interesting for player characters we assume that use + // magic device always works and NPCs don't use the crafting feats or + // sequencers anyway. Thus, any NON PC spellcaster always exits this script + // with TRUE (unless they are DM possessed or in the Wild Magic Area in + // Chapter 2 of Hordes of the Underdark. + //--------------------------------------------------------------------------- + /*if (!GetIsPC(OBJECT_SELF)) + { + if( !GetIsDMPossessed(OBJECT_SELF) && !GetLocalInt(GetArea(OBJECT_SELF), "X2_L_WILD_MAGIC")) + { + return; + } + }*/ + + //--------------------------------------------------------------------------- + // Break any spell require maintaining concentration (only black blade of + // disaster) + // /*REM*/ X2BreakConcentrationSpells(); + //--------------------------------------------------------------------------- + + //--------------------------------------------------------------------------- + // Run use magic device skill check + //--------------------------------------------------------------------------- + int nContinue = X2UseMagicDeviceCheck(); + + if (nContinue) + { + //----------------------------------------------------------------------- + // run any user defined spellscript here + //----------------------------------------------------------------------- + nContinue = X2RunUserDefinedSpellScript(); + } + + //--------------------------------------------------------------------------- + // The following code is only of interest if an item was targeted + //--------------------------------------------------------------------------- + if (GetIsObjectValid(oTarget) && GetObjectType(oTarget) == OBJECT_TYPE_ITEM) + { + //----------------------------------------------------------------------- + // Check if spell was used to trigger item creation feat + //----------------------------------------------------------------------- + if (nContinue) + { + nContinue = !ExecuteScriptAndReturnInt("x2_pc_craft",OBJECT_SELF); + } + + //----------------------------------------------------------------------- + // Check if spell was used for on a sequencer item + //----------------------------------------------------------------------- + if (nContinue) + { + nContinue = !X2GetSpellCastOnSequencerItem(oTarget); + } + + //----------------------------------------------------------------------- + // * Execute item OnSpellCast At routing script if activated + //----------------------------------------------------------------------- + if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS)) + { + SetUserDefinedItemEventNumber(X2_ITEM_EVENT_SPELLCAST_AT); + int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oTarget),OBJECT_SELF); + if (nRet == X2_EXECUTE_SCRIPT_END) + { + SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END); + return; + } + } + + //----------------------------------------------------------------------- + // Prevent any spell that has no special coding to handle targetting of items + // from being cast on items. We do this because we can not predict how + // all the hundreds spells in NWN will react when cast on items + //----------------------------------------------------------------------- + if (nContinue) + { + nContinue = X2CastOnItemWasAllowed(oTarget); + } + } + + if(GetLocalInt(oItem,"MUSICAL_INSTRUMENT"))//variable indicating musical instrument + { + nContinue = MusicalInstrumentsCheck(oItem); + } + + + SetExecutedScriptReturnValue(!nContinue); +} diff --git a/_removed/druid_air.ncs b/_removed/druid_air.ncs new file mode 100644 index 0000000..a07942a Binary files /dev/null and b/_removed/druid_air.ncs differ diff --git a/_removed/druid_air.nss b/_removed/druid_air.nss new file mode 100644 index 0000000..b1c053a --- /dev/null +++ b/_removed/druid_air.nss @@ -0,0 +1,162 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +/* #include "x2_inc_itemprop" +#include "70_inc_itemprop" */ +#include "prc_x2_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_HUGE_AIR_ELEMENTAL; + } + else + { + nPoly = POLYMORPH_TYPE_ELDER_AIR_ELEMENTAL; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_badger.ncs b/_removed/druid_badger.ncs new file mode 100644 index 0000000..3977337 Binary files /dev/null and b/_removed/druid_badger.ncs differ diff --git a/_removed/druid_badger.nss b/_removed/druid_badger.nss new file mode 100644 index 0000000..e9ab270 --- /dev/null +++ b/_removed/druid_badger.nss @@ -0,0 +1,164 @@ +//:://///////////////////////////////////////////// +//:: Wild Shape +//:: NW_S2_WildShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into animal forms. + + Updated: Sept 30 2003, Georg Z. + * Made Armor merge with druid to make forms + more useful. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nMetaMagic = GetMetaMagicFeat(); + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + nPoly = POLYMORPH_TYPE_BADGER; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_BADGER; + } + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oShield,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + +} diff --git a/_removed/druid_bear.ncs b/_removed/druid_bear.ncs new file mode 100644 index 0000000..09378ea Binary files /dev/null and b/_removed/druid_bear.ncs differ diff --git a/_removed/druid_bear.nss b/_removed/druid_bear.nss new file mode 100644 index 0000000..9738dd4 --- /dev/null +++ b/_removed/druid_bear.nss @@ -0,0 +1,164 @@ +//:://///////////////////////////////////////////// +//:: Wild Shape +//:: NW_S2_WildShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into animal forms. + + Updated: Sept 30 2003, Georg Z. + * Made Armor merge with druid to make forms + more useful. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nMetaMagic = GetMetaMagicFeat(); + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + nPoly = POLYMORPH_TYPE_BROWN_BEAR; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_BROWN_BEAR; + } + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oShield,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + +} diff --git a/_removed/druid_blued.ncs b/_removed/druid_blued.ncs new file mode 100644 index 0000000..9ce00b7 Binary files /dev/null and b/_removed/druid_blued.ncs differ diff --git a/_removed/druid_blued.nss b/_removed/druid_blued.nss new file mode 100644 index 0000000..2c52e56 --- /dev/null +++ b/_removed/druid_blued.nss @@ -0,0 +1,161 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_ANCIENT_BLUE_DRAGON; + } + else + { + nPoly = POLYMORPH_TYPE_ANCIENT_BLUE_DRAGON; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_boar.ncs b/_removed/druid_boar.ncs new file mode 100644 index 0000000..cce40a8 Binary files /dev/null and b/_removed/druid_boar.ncs differ diff --git a/_removed/druid_boar.nss b/_removed/druid_boar.nss new file mode 100644 index 0000000..cb6b0d2 --- /dev/null +++ b/_removed/druid_boar.nss @@ -0,0 +1,164 @@ +//:://///////////////////////////////////////////// +//:: Wild Shape +//:: NW_S2_WildShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into animal forms. + + Updated: Sept 30 2003, Georg Z. + * Made Armor merge with druid to make forms + more useful. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nMetaMagic = GetMetaMagicFeat(); + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + nPoly = POLYMORPH_TYPE_BOAR; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_BOAR; + } + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oShield,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + +} diff --git a/_removed/druid_earth.ncs b/_removed/druid_earth.ncs new file mode 100644 index 0000000..93df9fa Binary files /dev/null and b/_removed/druid_earth.ncs differ diff --git a/_removed/druid_earth.nss b/_removed/druid_earth.nss new file mode 100644 index 0000000..9427bdf --- /dev/null +++ b/_removed/druid_earth.nss @@ -0,0 +1,161 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_HUGE_EARTH_ELEMENTAL; + } + else + { + nPoly = POLYMORPH_TYPE_ELDER_EARTH_ELEMENTAL; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_fire.ncs b/_removed/druid_fire.ncs new file mode 100644 index 0000000..0630bae Binary files /dev/null and b/_removed/druid_fire.ncs differ diff --git a/_removed/druid_fire.nss b/_removed/druid_fire.nss new file mode 100644 index 0000000..f8bb608 --- /dev/null +++ b/_removed/druid_fire.nss @@ -0,0 +1,161 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_HUGE_FIRE_ELEMENTAL; + } + else + { + nPoly = POLYMORPH_TYPE_ELDER_FIRE_ELEMENTAL; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_greend.ncs b/_removed/druid_greend.ncs new file mode 100644 index 0000000..d354c73 Binary files /dev/null and b/_removed/druid_greend.ncs differ diff --git a/_removed/druid_greend.nss b/_removed/druid_greend.nss new file mode 100644 index 0000000..8871743 --- /dev/null +++ b/_removed/druid_greend.nss @@ -0,0 +1,161 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_ANCIENT_GREEN_DRAGON; + } + else + { + nPoly = POLYMORPH_TYPE_ANCIENT_GREEN_DRAGON; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_panther.ncs b/_removed/druid_panther.ncs new file mode 100644 index 0000000..9b3fb4f Binary files /dev/null and b/_removed/druid_panther.ncs differ diff --git a/_removed/druid_panther.nss b/_removed/druid_panther.nss new file mode 100644 index 0000000..2d7290d --- /dev/null +++ b/_removed/druid_panther.nss @@ -0,0 +1,164 @@ +//:://///////////////////////////////////////////// +//:: Wild Shape +//:: NW_S2_WildShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into animal forms. + + Updated: Sept 30 2003, Georg Z. + * Made Armor merge with druid to make forms + more useful. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nMetaMagic = GetMetaMagicFeat(); + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + nPoly = POLYMORPH_TYPE_PANTHER; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_PANTHER; + } + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oShield,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + +} diff --git a/_removed/druid_redd.ncs b/_removed/druid_redd.ncs new file mode 100644 index 0000000..36eb006 Binary files /dev/null and b/_removed/druid_redd.ncs differ diff --git a/_removed/druid_redd.nss b/_removed/druid_redd.nss new file mode 100644 index 0000000..48cd844 --- /dev/null +++ b/_removed/druid_redd.nss @@ -0,0 +1,161 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_ANCIENT_RED_DRAGON; + } + else + { + nPoly = POLYMORPH_TYPE_ANCIENT_RED_DRAGON; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_water.ncs b/_removed/druid_water.ncs new file mode 100644 index 0000000..9be42e7 Binary files /dev/null and b/_removed/druid_water.ncs differ diff --git a/_removed/druid_water.nss b/_removed/druid_water.nss new file mode 100644 index 0000000..9b77500 --- /dev/null +++ b/_removed/druid_water.nss @@ -0,0 +1,161 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shape +//:: NW_S2_ElemShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into elemental forms. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); //GetCasterLevel(OBJECT_SELF); + int bElder = FALSE; + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + if(GetLevelByClass(CLASS_TYPE_DRUID) >= 20) + { + bElder = TRUE; + } + //Determine Polymorph subradial type + if(bElder == FALSE) + { + nPoly = POLYMORPH_TYPE_HUGE_WATER_ELEMENTAL; + } + else + { + nPoly = POLYMORPH_TYPE_ELDER_WATER_ELEMENTAL; + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_ELEMENTAL_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + + +} diff --git a/_removed/druid_wolf.ncs b/_removed/druid_wolf.ncs new file mode 100644 index 0000000..21754d3 Binary files /dev/null and b/_removed/druid_wolf.ncs differ diff --git a/_removed/druid_wolf.nss b/_removed/druid_wolf.nss new file mode 100644 index 0000000..bddd70e --- /dev/null +++ b/_removed/druid_wolf.nss @@ -0,0 +1,164 @@ +//:://///////////////////////////////////////////// +//:: Wild Shape +//:: NW_S2_WildShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into animal forms. + + Updated: Sept 30 2003, Georg Z. + * Made Armor merge with druid to make forms + more useful. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70, fix by Shadooow + +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "x2_inc_itemprop" +#include "70_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nMetaMagic = GetMetaMagicFeat(); + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + nPoly = POLYMORPH_TYPE_WOLF; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_WOLF; + } + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + if (GetIsObjectValid(oShield)) + { + if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD && + GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD) + { + oShield = OBJECT_INVALID; + } + } + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70 patch fix by Shadooow: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "X2_L_STOPCASTING", 10); + SetLocalInt(OBJECT_SELF, "POLYMORPHED", 1); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oShield,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + +} diff --git a/_removed/nw_s0_animdead.ncs b/_removed/nw_s0_animdead.ncs new file mode 100644 index 0000000..ea216ea Binary files /dev/null and b/_removed/nw_s0_animdead.ncs differ diff --git a/_removed/nw_s0_animdead.nss b/_removed/nw_s0_animdead.nss new file mode 100644 index 0000000..ac7d807 --- /dev/null +++ b/_removed/nw_s0_animdead.nss @@ -0,0 +1,89 @@ +//:://///////////////////////////////////////////// +//:: Animate Dead +//:: NW_S0_AnimDead.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Summons a powerful skeleton or zombie depending + on caster level. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: April 11, 2001 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = 24; + //effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); + effect eSummon; + //Metamagic extension if needed + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; //Duration is +100% + } + //Summon the appropriate creature based on the summoner level + if (spell.Level <= 5) + { + //Tyrant Fog Zombie + eSummon = EffectSummonCreature("NW_S_ZOMBTYRANT",VFX_FNF_SUMMON_UNDEAD); + } + else if ((spell.Level >= 6) && (spell.Level <= 9)) + { + //Skeleton Warrior + eSummon = EffectSummonCreature("NW_S_SKELWARR",VFX_FNF_SUMMON_UNDEAD); + } + else + { + //Skeleton Chieftain + eSummon = EffectSummonCreature("NW_S_SKELCHIEF",VFX_FNF_SUMMON_UNDEAD); + } + //Apply the summon visual and summon the two undead. + //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation()); + + //Apply better summons instead if a caster is a level 11 or better Pale Master and the spell is not cast from an item. + if ( GetLevelByClass(CLASS_TYPE_PALE_MASTER, OBJECT_SELF) > 29 ) + { + switch(d3()) + { + case 1: eSummon = EffectSummonCreature("s_skelhero2",VFX_FNF_SUMMON_UNDEAD);break; + case 2: eSummon = EffectSummonCreature("S_SKELMAGE",VFX_FNF_SUMMON_UNDEAD);break; + case 3: eSummon = EffectSummonCreature("S_SKELPRIEST",VFX_FNF_SUMMON_UNDEAD);break; + } + } + else if ( GetLevelByClass(CLASS_TYPE_PALE_MASTER, OBJECT_SELF) > 10 ) + { + switch(d3()) + { + case 1: eSummon = EffectSummonCreature("S_SKELHERO",VFX_FNF_SUMMON_UNDEAD);break; + case 2: eSummon = EffectSummonCreature("S_SKELMAGE",VFX_FNF_SUMMON_UNDEAD);break; + case 3: eSummon = EffectSummonCreature("S_SKELPRIEST",VFX_FNF_SUMMON_UNDEAD);break; + } + } + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, HoursToSeconds(nDuration)); +} + + diff --git a/_removed/nw_s0_circdeath.ncs b/_removed/nw_s0_circdeath.ncs new file mode 100644 index 0000000..48cef3c Binary files /dev/null and b/_removed/nw_s0_circdeath.ncs differ diff --git a/_removed/nw_s0_circdeath.nss b/_removed/nw_s0_circdeath.nss new file mode 100644 index 0000000..778dd4f --- /dev/null +++ b/_removed/nw_s0_circdeath.nss @@ -0,0 +1,128 @@ +//:://///////////////////////////////////////////// +//:: Circle of Death +//:: NW_S0_CircDeath +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + The caster slays a number of HD worth of creatures + equal to 1d4 times level. The creature gets a + Fort Save or dies. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: June 1, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Aidan Scanlan +//:: VFX Pass By: Preston W, On: June 20, 2001 +//:: Update Pass By: Preston W, On: July 25, 2001 + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + object oTarget; + object oLowest; + effect eDeath = EffectDeath(); + effect eVis = EffectVisualEffect(VFX_IMP_DEATH); + effect eFNF = EffectVisualEffect(VFX_FNF_LOS_EVIL_20); + int bContinueLoop = FALSE; //Used to determine if we have a next valid target + int nHD = MaximizeOrEmpower(4,spell.Level,spell.Meta); + int nDC; + + int nCurrentHD; + int bAlreadyAffected; + int nMax = 40;// maximun hd creature affected, set this to 9 so that a lower HD creature is chosen automatically + //Also 9 is the maximum HD a creature can have and still be affected by the spell + float fDelay; + string sIdentifier = GetTag(spell.Caster); + + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, spell.Loc); + //Check for at least one valid object to start the main loop + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc); + if (GetIsObjectValid(oTarget)) + { + bContinueLoop = TRUE; + } + // The above checks to see if there is at least one valid target. If no value target exists we do not enter + // the loop. + + while ((nHD > 0) && (bContinueLoop)) + { + int nLow = nMax; //Set nLow to the lowest HD creature in the last pass through the loop + bContinueLoop = FALSE; //Set this to false so that the loop only continues in the case of new low HD creature + //Get first target creature in loop + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc); + while (GetIsObjectValid(oTarget)) + { + //Make sure the currect target is not an enemy + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster) && oTarget != spell.Caster) + { + //Get a local set on the creature that checks if the spell has already allowed them to save + bAlreadyAffected = GetLocalInt(oTarget, "bDEATH" + sIdentifier); + if (!bAlreadyAffected) + { + nCurrentHD = GetHitDice(oTarget); + //If the selected creature is of lower HD then the current nLow value and + //the HD of the creature is of less HD than the number of HD available for + //the spell to affect then set the creature as the currect primary target + if(nCurrentHD < nLow && nCurrentHD <= nHD) + { + nLow = nCurrentHD; + oLowest = oTarget; + bContinueLoop = TRUE; + } + } + } + //Get next target in shape to test for a new + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc); + } + //Check to make sure that oLowest has changed + if(bContinueLoop == TRUE) + { + //Fire cast spell at event for the specified target + SignalEvent(oLowest, EventSpellCastAt(spell.Caster, spell.Id)); + fDelay = GetRandomDelay(); + if(!MyResistSpell(spell.Caster, oLowest, fDelay)) + { + if (GetHitDice(oLowest) > 10) nDC = spell.DC - 5; + else nDC = spell.DC; + //Make a Fort Save versus death effects + if(!MySavingThrow(SAVING_THROW_FORT, oLowest, nDC, SAVING_THROW_TYPE_DEATH, spell.Caster, fDelay)) + { + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oLowest)); + //DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oLowest)); + } + } + //Even if the target made their save mark them as having been affected by the spell + SetLocalInt(oLowest, "bDEATH" + sIdentifier, TRUE); + //Destroy the local after 1/4 of a second in case other Circles of Death are cast on + //the creature laster + DelayCommand(fDelay + 0.25, DeleteLocalInt(oLowest, "bDEATH" + sIdentifier)); + //Adjust the number of HD that have been affected by the spell + nHD = nHD - GetHitDice(oLowest); + oLowest = OBJECT_INVALID; + } + } +} diff --git a/_removed/nw_s0_circevil.ncs b/_removed/nw_s0_circevil.ncs new file mode 100644 index 0000000..30c71aa Binary files /dev/null and b/_removed/nw_s0_circevil.ncs differ diff --git a/_removed/nw_s0_circevil.nss b/_removed/nw_s0_circevil.nss new file mode 100644 index 0000000..fddb800 --- /dev/null +++ b/_removed/nw_s0_circevil.nss @@ -0,0 +1,72 @@ +//:://///////////////////////////////////////////// +//:: Magic Circle Against Evil +//:: NW_S0_CircEvil.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +//:: [Description of File] +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: March 18, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001 +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +- moving bug fixed, now caster gains benefit of aura all the time, (cannot guarantee the others, +thats module-related) +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "nw_i0_spells" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables including Area of Effect Object + spellsDeclareMajorVariables(); + + effect eAOE = EffectAreaOfEffect(AOE_MOB_CIRCGOOD); + effect eVis = EffectVisualEffect(VFX_IMP_AURA_HOLY); + effect eLink = CreateProtectionFromAlignmentLink(ALIGNMENT_EVIL); + + eLink = EffectLinkEffects(eLink, eVis); + eLink = EffectLinkEffects(eLink, eAOE); + + + int nDuration = spell.Level; + //Check Extend metamagic feat. + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + eVis = EffectVisualEffect(VFX_IMP_GOOD_HELP); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + + //Create an instance of the AOE Object using the Apply Effect function + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, HoursToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_CIRCGOOD"); +} diff --git a/_removed/nw_s0_circgood.ncs b/_removed/nw_s0_circgood.ncs new file mode 100644 index 0000000..36e5b52 Binary files /dev/null and b/_removed/nw_s0_circgood.ncs differ diff --git a/_removed/nw_s0_circgood.nss b/_removed/nw_s0_circgood.nss new file mode 100644 index 0000000..54a30ed --- /dev/null +++ b/_removed/nw_s0_circgood.nss @@ -0,0 +1,70 @@ +//:://///////////////////////////////////////////// +//:: Magic Circle Against Good +//:: NW_S0_CircGood.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: April 18, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +- moving bug fixed, now caster gains benefit of aura all the time, (cannot guarantee the others, +thats module-related) +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "nw_i0_spells" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables including Area of Effect Object + spellsDeclareMajorVariables(); + + effect eAOE = EffectAreaOfEffect(AOE_MOB_CIRCEVIL); + effect eVis = EffectVisualEffect(VFX_DUR_AURA_ODD); + effect eLink = CreateProtectionFromAlignmentLink(ALIGNMENT_GOOD); + + eLink = EffectLinkEffects(eLink, eVis); + eLink = EffectLinkEffects(eLink, eAOE); + + int nDuration = spell.Level; + + //Check Extend metamagic feat. + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + eVis = EffectVisualEffect(VFX_IMP_EVIL_HELP); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + + //Create an instance of the AOE Object using the Apply Effect function + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, HoursToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_CIRCEVIL"); +} diff --git a/_removed/nw_s0_contagion.ncs b/_removed/nw_s0_contagion.ncs new file mode 100644 index 0000000..6678b7f Binary files /dev/null and b/_removed/nw_s0_contagion.ncs differ diff --git a/_removed/nw_s0_contagion.nss b/_removed/nw_s0_contagion.nss new file mode 100644 index 0000000..1092862 --- /dev/null +++ b/_removed/nw_s0_contagion.nss @@ -0,0 +1,92 @@ +//:://///////////////////////////////////////////// +//:: Contagion +//:: NW_S0_Contagion.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + The target must save or be struck down with + Blidning Sickness, Cackle Fever, Filth Fever + Mind Fire, Red Ache, the Shakes or Slimy Doom. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: June 6, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.71 + +- disease made extraordinary +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + int nRand = Random(7)+1; + int nDisease; + //Use a random seed to determine the disease that will be delivered. + switch (nRand) + { + case 1: + nDisease = DISEASE_BLINDING_SICKNESS; + break; + case 2: + nDisease = DISEASE_CACKLE_FEVER; + break; + case 3: + nDisease = DISEASE_FILTH_FEVER; + break; + case 4: + nDisease = DISEASE_MINDFIRE; + break; + case 5: + nDisease = DISEASE_RED_ACHE; + break; + case 6: + nDisease = DISEASE_SHAKES; + break; + case 7: + nDisease = DISEASE_SLIMY_DOOM; + break; + } + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + effect eDisease = EffectDisease(nDisease); + effect ePenalty = EffectAbilityDecrease(ABILITY_STRENGTH, 4); + ePenalty = EffectLinkEffects(EffectAbilityDecrease(ABILITY_CONSTITUTION, 2), ePenalty); + eDisease = ExtraordinaryEffect(eDisease); + //Make SR check + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //The effect is permament because the disease subsystem has its own internal resolution + //system in place. + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDisease, spell.Target); + if ( !FortitudeSave(spell.Target, GetCasterLevel(OBJECT_SELF), SAVING_THROW_TYPE_DISEASE) ) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePenalty, spell.Target, 60.0); + } + } +} + diff --git a/_removed/nw_s0_daze.ncs b/_removed/nw_s0_daze.ncs new file mode 100644 index 0000000..993f77a Binary files /dev/null and b/_removed/nw_s0_daze.ncs differ diff --git a/_removed/nw_s0_daze.nss b/_removed/nw_s0_daze.nss new file mode 100644 index 0000000..7ba7b64 --- /dev/null +++ b/_removed/nw_s0_daze.nss @@ -0,0 +1,77 @@ +//:://///////////////////////////////////////////// +//:: [Daze] +//:: [NW_S0_Daze.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Will save or the target is dazed for 1 round +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 15, 2001 +//::////////////////////////////////////////////// +//:: Update Pass By: Preston W, On: July 27, 2001 + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE); + effect eDaze = EffectDazed(); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + + effect eLink = EffectLinkEffects(eMind, eDaze); + eLink = EffectLinkEffects(eLink, eDur); + + effect eVis = EffectVisualEffect(VFX_IMP_DAZED_S); + int nDuration = 2; + //check meta magic for extend + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = 4; + } + + //Make sure the target is a humaniod + if (AmIAHumanoid(spell.Target) == TRUE) + { + if(GetHitDice(spell.Target) <= 40) + { + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make SR check + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //Make Will Save to negate effect + if (!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster)) + { + //Apply VFX Impact and daze effect + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + } + } + } + } + } +} diff --git a/_removed/nw_s0_dismagic.ncs b/_removed/nw_s0_dismagic.ncs new file mode 100644 index 0000000..e2336d1 Binary files /dev/null and b/_removed/nw_s0_dismagic.ncs differ diff --git a/_removed/nw_s0_dismagic.nss b/_removed/nw_s0_dismagic.nss new file mode 100644 index 0000000..bc1453e --- /dev/null +++ b/_removed/nw_s0_dismagic.nss @@ -0,0 +1,88 @@ +//:://///////////////////////////////////////////// +//:: Dispel Magic +//:: NW_S0_DisMagic.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +//:: Attempts to dispel all magic on a targeted +//:: object, or simply the most powerful that it +//:: can on every object in an area if no target +//:: specified. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//:: Updated On: Oct 20, 2003, Georg Zoeller +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + + //-------------------------------------------------------------------------- + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + */ + //-------------------------------------------------------------------------- + if (!X2PreSpellCastCode()) + { + return; + } + // End of Spell Cast Hook + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_IMP_BREACH); + effect eImpact = EffectVisualEffect(VFX_FNF_DISPEL); + int nCasterLevel = spell.Level; + + //-------------------------------------------------------------------------- + // Dispel Magic is capped at caster level 10 + //-------------------------------------------------------------------------- + if(nCasterLevel > 10) + { + //High-level shifter version - caster level artificially set to shifter levels + 3 + if(GetLevelByClass(CLASS_TYPE_SHIFTER) > 10 && GetRacialType(OBJECT_SELF) == RACIAL_TYPE_OUTSIDER) + nCasterLevel = GetLevelByClass(CLASS_TYPE_SHIFTER)+3; + else nCasterLevel = 10; + } + + if (GetIsObjectValid(spell.Target)) + { + //---------------------------------------------------------------------- + // Targeted Dispel - Dispel all + //---------------------------------------------------------------------- + spellsDispelMagic(spell.Target, nCasterLevel, eVis, eImpact); + } + else + { + //---------------------------------------------------------------------- + // Area of Effect - Only dispel best effect + //---------------------------------------------------------------------- + + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, spell.Loc); + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT | OBJECT_TYPE_PLACEABLE ); + while (GetIsObjectValid(oTarget)) + { + if(GetObjectType(oTarget) == OBJECT_TYPE_AREA_OF_EFFECT) + { + //-------------------------------------------------------------- + // Handle Area of Effects + //-------------------------------------------------------------- + spellsDispelAoE(oTarget, spell.Caster, nCasterLevel); + } + else if (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE) + { + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + } + else + { + spellsDispelMagic(oTarget, nCasterLevel, eVis, eImpact, FALSE); + } + + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE,spell.Loc, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT | OBJECT_TYPE_PLACEABLE); + } + } +} diff --git a/_removed/nw_s0_dismissal.ncs b/_removed/nw_s0_dismissal.ncs new file mode 100644 index 0000000..8a32304 Binary files /dev/null and b/_removed/nw_s0_dismissal.ncs differ diff --git a/_removed/nw_s0_dismissal.nss b/_removed/nw_s0_dismissal.nss new file mode 100644 index 0000000..d0b57c0 --- /dev/null +++ b/_removed/nw_s0_dismissal.nss @@ -0,0 +1,81 @@ +//:://///////////////////////////////////////////// +//:: Dismissal +//:: NW_S0_Dismissal.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All summoned creatures within 30ft of caster + make a save and SR check or be banished +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Oct 22, 2001 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 20, 2001 + +#include "X0_I0_SPELLS" +#include "x2_inc_spellhook" +#include "hench_i0_generic" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + object oMaster; + effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON); + effect eImpact = EffectVisualEffect(VFX_FNF_LOS_EVIL_30); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation()); + int nSpellDC; + //Get the first object in the are of effect + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + while(GetIsObjectValid(oTarget)) + { + //does the creature have a master. + oMaster = GetMaster(oTarget); + //Is that master valid and is he an enemy + if(GetIsObjectValid(oMaster) && spellsIsTarget(oMaster,SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF )) + { + //Is the creature a summoned associate + if(GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster) == oTarget || + GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster) == oTarget || + GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oMaster) == oTarget || + GetLocalInt(oTarget, sHenchPseudoSummon)) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DISMISSAL)); + //Determine correct save + nSpellDC = GetSpellSaveDC() + 6; + //Make SR and will save checks + if (!MyResistSpell(OBJECT_SELF, oTarget) && !MySavingThrow(SAVING_THROW_WILL, oTarget, nSpellDC)) + { + //OnDeath script... so lets kill it. + effect eKill = EffectDamage(GetCurrentHitPoints(oTarget)); + //just to be extra-sure... :) + effect eDeath = EffectDeath(FALSE, FALSE); + DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eKill, oTarget)); + DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget)); + + DestroyObject(oTarget, 0.3); + } + } + } + //Get next creature in the shape. + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + } +} diff --git a/_removed/nw_s0_divpower.ncs b/_removed/nw_s0_divpower.ncs new file mode 100644 index 0000000..304e0b9 Binary files /dev/null and b/_removed/nw_s0_divpower.ncs differ diff --git a/_removed/nw_s0_divpower.nss b/_removed/nw_s0_divpower.nss new file mode 100644 index 0000000..71e8ee2 --- /dev/null +++ b/_removed/nw_s0_divpower.nss @@ -0,0 +1,127 @@ +//:://///////////////////////////////////////////// +//:: Divine Power +//:: NW_S0_DivPower.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Improves the Clerics attack to be the + equivalent of a Fighter's BAB of the same level, + +1 HP per level and raises their strength to + 18 if is not already there. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Oct 21, 2001 +//::////////////////////////////////////////////// +/* +bugfix by Kovi 2002.07.22 +- temporary hp was stacked +- loosing temporary hp resulted in loosing the other bonuses +- number of attacks was not increased (should have been a BAB increase) +still problem: +~ attacks are better still approximation (the additional attack is at full BAB) +~ attack/ability bonuses count against the limits + +Patch 1.71 + +- was removing temporary hitpoits even from other sources +- the strength increase will always be calculated from base strength +*/ + +#include "70_inc_spells" +#include "nw_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + + RemoveEffectsFromSpell(spell.Target, spell.Id); + + int nCasterLevel = GetCasterLevel(spell.Caster); + int nTotalCharacterLevel = nCasterLevel; //Modification - we want this spell to use caster level, not character level + + //int nTotalCharacterLevel = GetHitDice(spell.Caster); + int nBAB = GetBaseAttackBonus(spell.Caster); + int nEpicPortionOfBAB = (nTotalCharacterLevel - 19)/2; + + if (nEpicPortionOfBAB < 0) + { + nEpicPortionOfBAB = 0; + } + + int nExtraAttacks = 0; + int nAttackIncrease = 0; + + if (nTotalCharacterLevel > 20 ) + { + nAttackIncrease = 20 + nEpicPortionOfBAB; + if(nBAB - nEpicPortionOfBAB < 11) + { + nExtraAttacks = 2; + } + else if(nBAB - nEpicPortionOfBAB > 10 && nBAB - nEpicPortionOfBAB < 16) + { + nExtraAttacks = 1; + } + } + else + { + nAttackIncrease = nTotalCharacterLevel; + nExtraAttacks = ((nTotalCharacterLevel - 1)/5) - ((nBAB - 1)/5); + } + nAttackIncrease -= nBAB; + + if (nAttackIncrease < 0) + { + nAttackIncrease = 0; + } + + int nStrengthIncrease = 18-GetAbilityScore(spell.Target, ABILITY_STRENGTH, TRUE); + + effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM); + effect eStrength = EffectAbilityIncrease(ABILITY_STRENGTH, nStrengthIncrease); + effect eHP = EffectTemporaryHitpoints(nCasterLevel); + effect eAttack = EffectAttackIncrease(nAttackIncrease); + effect eAttackMod = EffectModifyAttacks(nExtraAttacks); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eLink = EffectLinkEffects(eAttack, eAttackMod); + eLink = EffectLinkEffects(eLink, eDur); + + //Make sure that the strength modifier is a bonus + if(nStrengthIncrease > 0) + { + eLink = EffectLinkEffects(eLink, eStrength); + } + + //Meta-Magic + if(spell.Meta == METAMAGIC_EXTEND) + { + nCasterLevel *= 2; + } + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + //Apply Link and VFX effects to the target + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nCasterLevel)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, spell.Target, RoundsToSeconds(nCasterLevel)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); +} diff --git a/_removed/nw_s0_doom.ncs b/_removed/nw_s0_doom.ncs new file mode 100644 index 0000000..da60278 Binary files /dev/null and b/_removed/nw_s0_doom.ncs differ diff --git a/_removed/nw_s0_doom.nss b/_removed/nw_s0_doom.nss new file mode 100644 index 0000000..d16aa65 --- /dev/null +++ b/_removed/nw_s0_doom.nss @@ -0,0 +1,98 @@ +//:://///////////////////////////////////////////// +//:: Doom +//:: NW_S0_Doom.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + If the target fails a save they recieve a -2 + penalty to all saves, attack rolls, damage and + skill checks for the duration of the spell. + + July 22 2002 (BK): Made it mind affecting. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Oct 22, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- missing saving throw VFX added +- immunity feedback corrected +- SR check moved before saving throw check +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +effect CreateDoomEffectsLink3() +{ +//Declare major variables +effect eSaves = EffectSavingThrowDecrease(SAVING_THROW_ALL,3); +effect eAttack = EffectAttackDecrease(3); +effect eDamage = EffectDamageDecrease(3,DAMAGE_TYPE_SLASHING); +effect eSkill = EffectSkillDecrease(SKILL_ALL_SKILLS,3); +effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + +effect eLink = EffectLinkEffects(eAttack,eDamage); +eLink = EffectLinkEffects(eLink,eSaves); +eLink = EffectLinkEffects(eLink,eSkill); +return EffectLinkEffects(eLink,eDur); +} + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_IMP_DOOM); + effect eLink = CreateDoomEffectsLink3(); + + float fDuration = TurnsToSeconds(spell.Level); + //Meta-Magic checks + if(spell.Meta == METAMAGIC_EXTEND) + { + fDuration *= 2; + } + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Spell Resistance check + if(!MyResistSpell(spell.Caster, spell.Target)) + { + //will saving throw + if(!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster)) + { + //* Engine workaround for mind affecting spell without mind effect + if(GetIsImmune(spell.Target, IMMUNITY_TYPE_MIND_SPELLS, spell.Caster)) + { + eLink = EffectDazed();//force target to overcome the spell effect and print immunity feedback instead + fDuration = 1.0;//for safety + } + else + { + //apply doom VFX only if not immune + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + } + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, fDuration); + } + } + } +} diff --git a/_removed/nw_s0_fireshld.ncs b/_removed/nw_s0_fireshld.ncs new file mode 100644 index 0000000..82353e1 Binary files /dev/null and b/_removed/nw_s0_fireshld.ncs differ diff --git a/_removed/nw_s0_fireshld.nss b/_removed/nw_s0_fireshld.nss new file mode 100644 index 0000000..11e0d4b --- /dev/null +++ b/_removed/nw_s0_fireshld.nss @@ -0,0 +1,72 @@ +//:://///////////////////////////////////////////// +//:: Elemental Shield +//:: NW_S0_FireShld.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Caster gains 50% cold and fire immunity. Also anyone + who strikes the caster with melee attacks takes + 1d6 + 1 per caster level in damage. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// +//:: Created On: Aug 28, 2003, GZ: Fixed stacking issue + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_DUR_ELEMENTAL_SHIELD); + int nDuration = spell.Level; + int nDamage = spell.Level/2; + effect eShield = EffectDamageShield(nDamage, DAMAGE_BONUS_1d6, DAMAGE_TYPE_FIRE); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eCold = EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 50); + effect eFire = EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 50); + + //Link effects + effect eLink = EffectLinkEffects(eShield, eCold); + eLink = EffectLinkEffects(eLink, eFire); + eLink = EffectLinkEffects(eLink, eDur); + eLink = EffectLinkEffects(eLink, eVis); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + // *GZ: No longer stack this spell + if (GetHasSpellEffect(spell.Id,spell.Target)) + { + RemoveSpellEffects(spell.Id, spell.Caster, spell.Target); + } + + //Enter Metamagic conditions + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); +} diff --git a/_removed/nw_s0_flmlash.ncs b/_removed/nw_s0_flmlash.ncs new file mode 100644 index 0000000..e3b16e6 Binary files /dev/null and b/_removed/nw_s0_flmlash.ncs differ diff --git a/_removed/nw_s0_flmlash.nss b/_removed/nw_s0_flmlash.nss new file mode 100644 index 0000000..3746535 --- /dev/null +++ b/_removed/nw_s0_flmlash.nss @@ -0,0 +1,72 @@ +//:://///////////////////////////////////////////// +//:: Flame Lash +//:: NW_S0_FlmLash.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Creates a whip of fire that targets a single + individual +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Nov 21, 2001 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nCasterLevel = spell.Level; + + if(nCasterLevel > 3) + { + nCasterLevel = (nCasterLevel-3)/3; + } + else + { + nCasterLevel = 0; + } + int nDamage = MaximizeOrEmpower(8,2 + nCasterLevel,spell.Meta); + + effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S); + effect eRay = EffectBeam(VFX_BEAM_FIRE_LASH, spell.Caster, BODY_NODE_HAND); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRay, spell.Target, 1.7); + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + if (!MyResistSpell(spell.Caster, spell.Target, 1.0)) + { + nDamage = GetReflexAdjustedDamage(nDamage, spell.Target, spell.DC, SAVING_THROW_TYPE_FIRE, spell.Caster); + effect eDam = EffectDamage(nDamage, DAMAGE_TYPE_FIRE); + if(nDamage > 0) + { + //Apply the VFX impact and effects + DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target)); + DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target)); + } + } + } +} diff --git a/_removed/nw_s0_gate.ncs b/_removed/nw_s0_gate.ncs new file mode 100644 index 0000000..bcc2367 Binary files /dev/null and b/_removed/nw_s0_gate.ncs differ diff --git a/_removed/nw_s0_gate.nss b/_removed/nw_s0_gate.nss new file mode 100644 index 0000000..464ea41 --- /dev/null +++ b/_removed/nw_s0_gate.nss @@ -0,0 +1,76 @@ +//:://///////////////////////////////////////////// +//:: Gate +//:: NW_S0_Gate.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +//:: Summons a Balor to fight for the caster. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: April 12, 2001 +//::////////////////////////////////////////////// +void CreateBalor(location lLoc); + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + effect eSummon; + effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE); + //Make metamagic extend check + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Summon the Balor and apply the VFX impact + //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation()); + + if(GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL) || + GetHasSpellEffect(SPELL_MAGIC_CIRCLE_AGAINST_EVIL) || + GetHasSpellEffect(SPELL_HOLY_AURA) || + GetLocalInt(OBJECT_SELF, "cleric_henchman") == 1 || + GetLocalInt(OBJECT_SELF, "X4_CASTER_CLERIC") == 1) + { + if (GetCasterLevel(OBJECT_SELF) >= 35 ) + eSummon = EffectSummonCreature("NW_S_BALOR2",VFX_FNF_SUMMON_GATE,3.0); + else + { eSummon = EffectSummonCreature("NW_S_BALOR",VFX_FNF_SUMMON_GATE,3.0); } + float fSeconds = RoundsToSeconds(nDuration); + DelayCommand(3.0, ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, fSeconds)); + + } + else + { + + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, spell.Loc); + DelayCommand(3.0, CreateBalor(spell.Loc)); + } +} + +void CreateBalor(location lLoc) +{ + if (GetCasterLevel(OBJECT_SELF) >= 35 ) + CreateObject(OBJECT_TYPE_CREATURE, "NW_S_BALOR2_EVIL", lLoc); + else + CreateObject(OBJECT_TYPE_CREATURE, "NW_S_BALOR_EVIL", lLoc); +} diff --git a/_removed/nw_s0_grplanar.ncs b/_removed/nw_s0_grplanar.ncs new file mode 100644 index 0000000..5ac6bfb Binary files /dev/null and b/_removed/nw_s0_grplanar.ncs differ diff --git a/_removed/nw_s0_grplanar.nss b/_removed/nw_s0_grplanar.nss new file mode 100644 index 0000000..1d21b0a --- /dev/null +++ b/_removed/nw_s0_grplanar.nss @@ -0,0 +1,114 @@ +//:://///////////////////////////////////////////// +//:: Greater Planar Binding +//:: NW_S0_GrPlanar.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Summons an outsider dependant on alignment, or + holds an outsider if the creature fails a save. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: April 12, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70, fix by Shadooow + +- added saving throw subtype (paralyse) +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + effect eSummon; + effect eGate; + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZED); + effect eDur3 = EffectVisualEffect(VFX_DUR_PARALYZE_HOLD); + + effect eLink = EffectLinkEffects(eDur, EffectParalyze()); + eLink = EffectLinkEffects(eLink, eDur2); + eLink = EffectLinkEffects(eLink, eDur3); + + int nRacial = GetRacialType(spell.Target); + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Check to see if a valid target has been chosen + if (GetIsObjectValid(spell.Target)) + { + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Check for racial type + if(nRacial == RACIAL_TYPE_OUTSIDER) + { + //Allow will save to negate hold effect + if(!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC+5,SAVING_THROW_TYPE_PARALYSE, spell.Caster)) + { + //Apply the hold effect + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration/2)); + } + } + } + } + else + { + //If the ground was clicked on summon an outsider based on alignment + int nAlign = GetAlignmentGoodEvil(spell.Caster); + float fDelay = 3.0; + switch (nAlign) + { + case ALIGNMENT_EVIL: + if (GetCasterLevel(OBJECT_SELF) >= 28) + eSummon = EffectSummonCreature("NW_S_VROCK2", VFX_FNF_SUMMON_GATE, 3.0); + else + eSummon = EffectSummonCreature("NW_S_VROCK", VFX_FNF_SUMMON_GATE, 3.0); + //eGate = EffectVisualEffect(VFX_FNF_SUMMON_GATE); + break; + case ALIGNMENT_GOOD: + if (GetCasterLevel(OBJECT_SELF) >= 28) + eSummon = EffectSummonCreature("NW_S_CTRUMPET2", VFX_FNF_SUMMON_CELESTIAL, 3.0); + else + eSummon = EffectSummonCreature("NW_S_CTRUMPET", VFX_FNF_SUMMON_CELESTIAL, 3.0); + //eGate = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL); + break; + case ALIGNMENT_NEUTRAL: + if (GetCasterLevel(OBJECT_SELF) >= 28) + eSummon = EffectSummonCreature("NW_S_SLAADDETH2", VFX_FNF_SUMMON_MONSTER_3, 1.0); + else + eSummon = EffectSummonCreature("NW_S_SLAADDETH", VFX_FNF_SUMMON_MONSTER_3, 1.0); + //eGate = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3); + fDelay = 1.0; + break; + } + //Apply the VFX impact and summon effect + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, RoundsToSeconds(nDuration)); + } +} diff --git a/_removed/nw_s0_hammgods.ncs b/_removed/nw_s0_hammgods.ncs new file mode 100644 index 0000000..e6cf891 Binary files /dev/null and b/_removed/nw_s0_hammgods.ncs differ diff --git a/_removed/nw_s0_hammgods.nss b/_removed/nw_s0_hammgods.nss new file mode 100644 index 0000000..2a9acaf --- /dev/null +++ b/_removed/nw_s0_hammgods.nss @@ -0,0 +1,99 @@ +//:://///////////////////////////////////////////// +//:: Hammer of the Gods +//:: [NW_S0_HammGods.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Does 1d8 damage to all enemies within the +//:: spells 20m radius and dazes them if a +//:: Will save is failed. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 12, 2001 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 21, 2001 +//:: Update Pass By: Preston W, On: Aug 1, 2001 + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eDam; + effect eDaze = EffectDazed(); + effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + + effect eLink = EffectLinkEffects(eMind, eDaze); + eLink = EffectLinkEffects(eLink, eDur); + + effect eVis = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY); + effect eStrike = EffectVisualEffect(VFX_FNF_STRIKE_HOLY); + float fDelay; + int nDamageDice = spell.Level/2; + if(nDamageDice < 1) + { + nDamageDice = 1; + } + //Limit caster level + if (nDamageDice > 10) + { + nDamageDice = 10; + } + int nDamage; + //Apply the holy strike VFX + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eStrike, spell.Loc); + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, spell.Loc); + while (GetIsObjectValid(oTarget)) + { + //Make faction checks + if (spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + //Make SR Check + if (!MyResistSpell(spell.Caster, oTarget)) + { + fDelay = GetRandomDelay(0.6, 1.3); + //Roll damage + nDamage = MaximizeOrEmpower(8,nDamageDice,spell.Meta); + //Make a will save for half damage and negation of daze effect + if (MySavingThrow(SAVING_THROW_WILL, oTarget, spell.DC, SAVING_THROW_TYPE_DIVINE, spell.Caster, 0.5)) + { + nDamage = nDamage / 2; + } + else + { + //Apply daze effect + DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(d6()))); + } + //Set damage effect + eDam = EffectDamage(nDamage, DAMAGE_TYPE_DIVINE ); + //Apply the VFX impact and damage effect + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } + } + //Get next target in shape + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, spell.Loc); + } +} diff --git a/_removed/nw_s0_harm.ncs b/_removed/nw_s0_harm.ncs new file mode 100644 index 0000000..2dcae9d Binary files /dev/null and b/_removed/nw_s0_harm.ncs differ diff --git a/_removed/nw_s0_harm.nss b/_removed/nw_s0_harm.nss new file mode 100644 index 0000000..768f2d5 --- /dev/null +++ b/_removed/nw_s0_harm.nss @@ -0,0 +1,84 @@ +//:://///////////////////////////////////////////// +//:: [Harm] +//:: [NW_S0_Harm.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Reduces target to 1d4 HP on successful touch +//:: attack. If the target is undead it is healed. +//::////////////////////////////////////////////// +//:: Created By: Keith Soleski +//:: Created On: Jan 18, 2001 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 20, 2001 +//:: Update Pass By: Preston W, On: Aug 1, 2001 +//:: Last Update: Georg Zoeller On: Oct 10, 2004 +//::////////////////////////////////////////////// +/* +Patch 1.70, fix by Shadooow + +> touch attack removed if cast on undead (roll wasn't used in this case anyway) +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDamage, nHeal; + effect eVis = EffectVisualEffect(246); + effect eVis2 = EffectVisualEffect(VFX_IMP_HEALING_G); + effect eHeal, eDam; + //Check that the target is undead + if (GetRacialType(spell.Target) == RACIAL_TYPE_UNDEAD) + { + //Figure out the amount of damage to heal + nHeal = GetMaxHitPoints(spell.Target) - GetCurrentHitPoints(spell.Target); + //Set the heal effect + eHeal = EffectHeal(nHeal); + //Apply heal effect and VFX impact + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, spell.Target); + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + } //if cast from onhit, feedback won't show + else if (TouchAttackMelee(spell.Target,spell.Item == OBJECT_INVALID) != FALSE) //GZ: Fixed boolean check to work in NWScript. 1 or 2 are valid return numbers from TouchAttackMelee + { + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, SPELL_HARM)); + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //nDamage = GetCurrentHitPoints(spell.Target) - d4(1); + int nCasterLevel = GetCasterLevel(spell.Caster); + if (nCasterLevel > 20) nCasterLevel = 20; + nDamage = MaximizeOrEmpower(6, nCasterLevel, spell.Meta); + + eDam = EffectDamage(nDamage,DAMAGE_TYPE_NEGATIVE); + //Apply the VFX impact and effects + DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + } + } + } +} diff --git a/_removed/nw_s0_heal.ncs b/_removed/nw_s0_heal.ncs new file mode 100644 index 0000000..e7821ff Binary files /dev/null and b/_removed/nw_s0_heal.ncs differ diff --git a/_removed/nw_s0_heal.nss b/_removed/nw_s0_heal.nss new file mode 100644 index 0000000..15cbbe9 --- /dev/null +++ b/_removed/nw_s0_heal.nss @@ -0,0 +1,74 @@ +//:://///////////////////////////////////////////// +//:: Heal +//:: [NW_S0_Heal.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Heals the target to full unless they are undead. +//:: If undead they reduced to 1d4 HP. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 12, 2001 +//:: Modified 69MEH69 JUL2003 +//::////////////////////////////////////////////// +//:: Update Pass By: Preston W, On: Aug 1, 2001 +#include "69_hench_lib" +#include "NW_I0_SPELLS" +void main() +{ + //Declare major variables + object oTarget = GetSpellTargetObject(); + effect eKill, eHeal; + int nDamage, nHeal, nModify, nMetaMagic, nTouch; + effect eSun = EffectVisualEffect(VFX_IMP_SUNSTRIKE); + effect eHealVis = EffectVisualEffect(VFX_IMP_HEALING_X); + string sTag = GetTag(oTarget); + object oArea = GetArea(oTarget); + //Check to see if the target is an undead + if (GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + if(!GetIsReactionTypeFriendly(oTarget)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_HEAL)); + //Make a touch attack + if (TouchAttackMelee(oTarget)) + { + //Make SR check + if (!MyResistSpell(OBJECT_SELF, oTarget)) + { + //Roll damage + nModify = d4(); + nMetaMagic = GetMetaMagicFeat(); + //Make metamagic check + if (nMetaMagic == METAMAGIC_MAXIMIZE) + { + nModify = 1; + } + //Figure out the amount of damage to inflict + nDamage = GetCurrentHitPoints(oTarget) - nModify; + //Set damage + eKill = EffectDamage(nDamage, DAMAGE_TYPE_POSITIVE); + //Apply damage effect and VFX impact + ApplyEffectToObject(DURATION_TYPE_INSTANT, eKill, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eSun, oTarget); + } + } + } + } + else + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_HEAL, FALSE)); + //Figure out how much to heal + nHeal = GetMaxHitPoints(oTarget); + //Set the heal effect + eHeal = EffectHeal(nHeal); + //Apply the heal effect and the VFX impact + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHealVis, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); + if(GetIsHenchmanDying(oTarget)) + { + SetLocalInt(oArea, "nCHP" +sTag, 21); + } + } +} diff --git a/_removed/nw_s0_healcirc.ncs b/_removed/nw_s0_healcirc.ncs new file mode 100644 index 0000000..a8de043 Binary files /dev/null and b/_removed/nw_s0_healcirc.ncs differ diff --git a/_removed/nw_s0_healcirc.nss b/_removed/nw_s0_healcirc.nss new file mode 100644 index 0000000..d580016 --- /dev/null +++ b/_removed/nw_s0_healcirc.nss @@ -0,0 +1,115 @@ +//:://///////////////////////////////////////////// +//:: Healing Circle +//:: NW_S0_HealCirc +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +// Positive energy spreads out in all directions +// from the point of origin, curing 1d8 points of +// damage plus 1 point per caster level (maximum +20) +// to nearby living allies. +// +// Like cure spells, healing circle damages undead in +// its area rather than curing them. +*/ +//::////////////////////////////////////////////// +//:: Created By: Noel Borstad +//:: Created On: Oct 18,2000 +//:: Modified 69MEH69 JUL2003 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 20, 2001 +//:: Update Pass By: Preston W, On: Aug 1, 2001 +#include "69_hench_lib" +#include "NW_I0_SPELLS" +void main() +{ + //Declare major variables + object oTarget; + int nCasterLvl = GetCasterLevel(OBJECT_SELF); + int nDamagen, nModify, nHurt, nHP; + int nMetaMagic = GetMetaMagicFeat(); + effect eKill; + effect eHeal; + effect eVis = EffectVisualEffect(VFX_IMP_SUNSTRIKE); + effect eVis2 = EffectVisualEffect(VFX_IMP_HEALING_M); + effect eImpact = EffectVisualEffect(VFX_FNF_LOS_HOLY_20); + float fDelay; + string sTag = GetTag(oTarget); + object oArea = GetArea(oTarget); + int nCHP = GetLocalInt(oArea, "nCHP" +sTag); + //Limit caster level + if (nCasterLvl > 20) + { + nCasterLvl = 20; + } + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation()); + //Get first target in shape + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetSpellTargetLocation()); + while (GetIsObjectValid(oTarget)) + { + fDelay = GetRandomDelay(); + //Check if racial type is undead + if (GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD ) + { + if(!GetIsReactionTypeFriendly(oTarget)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_HEALING_CIRCLE)); + //Make SR check + if (!MyResistSpell(OBJECT_SELF, oTarget, fDelay)) + { + nModify = d8() + nCasterLvl; + //Make metamagic check + if (nMetaMagic == METAMAGIC_MAXIMIZE) + { + nModify = 8 + nCasterLvl; + } + //Make Fort save + if (MySavingThrow(SAVING_THROW_FORT, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_NONE, OBJECT_SELF, fDelay)) + { + nModify /= 2; + } + //Calculate damage + nHurt = nModify; + //Set damage effect + eKill = EffectDamage(nHurt, DAMAGE_TYPE_POSITIVE); + //Apply damage effect and VFX impact + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eKill, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } + } + } + else + { + // * May 2003: Heal Neutrals as well + if(!GetIsReactionTypeHostile(oTarget) || GetFactionEqual(oTarget)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_HEALING_CIRCLE, FALSE)); + nHP = d8(); + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_MAXIMIZE) + { + nHP =8;//Damage is at max + } + if (nMetaMagic == METAMAGIC_EMPOWER) + { + nHP = nHP + (nHP/2); //Damage/Healing is +50% + } + //Set healing effect + nHP = nHP + nCasterLvl; + eHeal = EffectHeal(nHP); + //Apply heal effect and VFX impact + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget)); + if(GetIsHenchmanDying(oTarget)) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nHP); + } + } + + } + //Get next target in the shape + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetSpellTargetLocation()); + } +} diff --git a/_removed/nw_s0_holdanim.ncs b/_removed/nw_s0_holdanim.ncs new file mode 100644 index 0000000..df660f6 Binary files /dev/null and b/_removed/nw_s0_holdanim.ncs differ diff --git a/_removed/nw_s0_holdanim.nss b/_removed/nw_s0_holdanim.nss new file mode 100644 index 0000000..bc1d8eb --- /dev/null +++ b/_removed/nw_s0_holdanim.nss @@ -0,0 +1,83 @@ +//:://///////////////////////////////////////////// +//:: Hold Animal +//:: S_HoldAnim +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +//:: Description: As hold person, except the spell +//:: affects an animal instead. Hold animal does not +//:: work on beasts, magical beasts, or vermin. +*/ +//::////////////////////////////////////////////// +//:: Created By: Keith Soleski +//:: Created On: Jan 18, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 10, 2001 +//:: VFX Pass By: Preston W, On: June 20, 2001 +/* +Patch 1.71 + +- added missing saving throw subtype as per spell's descriptor +- added duration scaling per game difficulty +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + nDuration = 5; //GetScaledDuration(nDuration, spell.Target); + effect eParal = EffectParalyze(); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZED); + effect eDur3 = EffectVisualEffect(VFX_DUR_PARALYZE_HOLD); + + effect eLink = EffectLinkEffects(eDur2, eDur); + eLink = EffectLinkEffects(eLink, eParal); + eLink = EffectLinkEffects(eLink, eDur3); + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Check racial type + if (GetRacialType(spell.Target) == RACIAL_TYPE_ANIMAL) + { + //Make SR check + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //Make Will Save + if (!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC+4, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster)) + { + //Check metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; + } + //Apply paralyze and VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + } + } + } + } +} diff --git a/_removed/nw_s0_holdmon.ncs b/_removed/nw_s0_holdmon.ncs new file mode 100644 index 0000000..22855b3 Binary files /dev/null and b/_removed/nw_s0_holdmon.ncs differ diff --git a/_removed/nw_s0_holdmon.nss b/_removed/nw_s0_holdmon.nss new file mode 100644 index 0000000..e2a066a --- /dev/null +++ b/_removed/nw_s0_holdmon.nss @@ -0,0 +1,77 @@ +//:://///////////////////////////////////////////// +//:: Hold Monster +//:: NW_S0_HoldMon +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Will hold any monster in place for 1 + round per caster level. +*/ +//::////////////////////////////////////////////// +//:: Created By: Keith Soleski +//:: Created On: Jan 18, 2001 +//::////////////////////////////////////////////// +//:: Update Pass By: Preston W, On: Aug 1, 2001 +/* +Patch 1.71 + +- added missing saving throw subtype as per spell's descriptor +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + nDuration = 5; //GetScaledDuration(nDuration, spell.Target); + effect eParal = EffectParalyze(); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZED); + effect eDur3 = EffectVisualEffect(VFX_DUR_PARALYZE_HOLD); + + effect eLink = EffectLinkEffects(eDur2, eDur); + eLink = EffectLinkEffects(eLink, eParal); + eLink = EffectLinkEffects(eLink, eDur3); + + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make SR check + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //Make Will save + if (!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster)) + { + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; + } + //Apply the paralyze effect and the VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + } + } + } +} diff --git a/_removed/nw_s0_holdpers.ncs b/_removed/nw_s0_holdpers.ncs new file mode 100644 index 0000000..53f93a1 Binary files /dev/null and b/_removed/nw_s0_holdpers.ncs differ diff --git a/_removed/nw_s0_holdpers.nss b/_removed/nw_s0_holdpers.nss new file mode 100644 index 0000000..8e54829 --- /dev/null +++ b/_removed/nw_s0_holdpers.nss @@ -0,0 +1,86 @@ +//:://///////////////////////////////////////////// +//:: Hold Person +//:: NW_S0_HoldPers +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +//:: The target freezes in place, standing helpless. +//:: He is aware and breathes normally but cannot take any physical +//:: actions, even speech. He can, however, execute purely mental actions. +//:: winged creature that is held cannot flap its wings and falls. +//:: A swimmer can't swim and may drown. +*/ +//::////////////////////////////////////////////// +//:: Created By: Keith Soleski +//:: Created On: Jan 18, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 10, 2001 +//:: VFX Pass By: Preston W, On: June 20, 2001 +/* +Patch 1.71 + +- added missing saving throw subtype as per spell's descriptor +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + nDuration = 5; //GetScaledDuration(nDuration, spell.Target); + effect eParal = EffectParalyze(); + effect eVis = EffectVisualEffect(82); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZED); + effect eDur3 = EffectVisualEffect(VFX_DUR_PARALYZE_HOLD); + + effect eLink = EffectLinkEffects(eDur2, eDur); + eLink = EffectLinkEffects(eLink, eParal); + eLink = EffectLinkEffects(eLink, eVis); + eLink = EffectLinkEffects(eLink, eDur3); + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make sure the target is a humanoid + if(AmIAHumanoid(spell.Target)) + { + //Make SR Check + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //Make Will save + if (!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster)) + { + //Make metamagic extend check + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; + } + //Apply paralyze effect and VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + } + } + } + } +} diff --git a/_removed/nw_s0_icestorm.ncs b/_removed/nw_s0_icestorm.ncs new file mode 100644 index 0000000..b626c9c Binary files /dev/null and b/_removed/nw_s0_icestorm.ncs differ diff --git a/_removed/nw_s0_icestorm.nss b/_removed/nw_s0_icestorm.nss new file mode 100644 index 0000000..a37c795 --- /dev/null +++ b/_removed/nw_s0_icestorm.nss @@ -0,0 +1,84 @@ +//:://///////////////////////////////////////////// +//:: Ice Storm +//:: NW_S0_IceStorm +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Everyone in the area takes 3d6 Bludgeoning + and 2d6 Cold damage. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Sept 12, 2001 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDamage, nDamage2, nDamage3; + int nVariable = spell.Level/3; + float fDelay; + effect eExplode = EffectVisualEffect(VFX_FNF_ICESTORM); //USE THE ICESTORM FNF + effect eVis = EffectVisualEffect(VFX_IMP_FROST_S); + effect eDam,eDam2, eDam3; + //Apply the ice storm VFX at the location captured above. + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, spell.Loc); + //Declare the spell shape, size and the location. Capture the first target object in the shape. + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, spell.Loc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + //Cycle through the targets within the spell shape until an invalid object is captured. + while (GetIsObjectValid(oTarget)) + { + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster)) + { + fDelay = GetRandomDelay(0.75, 2.25); + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + if (!MyResistSpell(spell.Caster, oTarget, fDelay)) + { + //Roll damage for each target + nDamage = MaximizeOrEmpower(6,3,spell.Meta); + nDamage2 = MaximizeOrEmpower(6,2,spell.Meta); + nDamage3 = MaximizeOrEmpower(6,nVariable,spell.Meta); + + //High-level shifter version - damage increases + if(GetLevelByClass(CLASS_TYPE_SHIFTER) > 20 && GetRacialType(OBJECT_SELF) == RACIAL_TYPE_OUTSIDER) + nDamage3 = (GetLevelByClass(CLASS_TYPE_SHIFTER) - 17)*d6(); + + nDamage2 = nDamage2 + nDamage3; + //Set the damage effect + eDam = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING); + eDam2 = EffectDamage(nDamage2, DAMAGE_TYPE_COLD); + // Apply effects to the currently selected target. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam2, oTarget)); + //This visual effect is applied to the target object not the location as above. This visual effect + //represents the impact that erupts on the target not on the ground. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } + } + //Select the next target within the spell shape. + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, spell.Loc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + } +} diff --git a/_removed/nw_s0_identify.ncs b/_removed/nw_s0_identify.ncs new file mode 100644 index 0000000..4d7e6d3 Binary files /dev/null and b/_removed/nw_s0_identify.ncs differ diff --git a/_removed/nw_s0_identify.nss b/_removed/nw_s0_identify.nss new file mode 100644 index 0000000..b8057e0 --- /dev/null +++ b/_removed/nw_s0_identify.nss @@ -0,0 +1,64 @@ +//:://///////////////////////////////////////////// +//:: Identify +//:: NW_S0_Identify.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Gives the caster a boost to Lore skill of +25 + plus caster level. Lasts for 2 rounds. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Oct 22, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.71 + +- the spell couldn't be recast if caster had also legend lore effect +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nBonus = 5; + effect eLore = EffectSkillIncrease(SKILL_LORE, nBonus); + effect eVis = EffectVisualEffect(VFX_IMP_MAGICAL_VISION); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eLink = EffectLinkEffects(eVis, eDur); + eLink = EffectLinkEffects(eLink, eLore); + + int nDuration = 2; + + //Meta-Magic checks + if(spell.Meta == METAMAGIC_EXTEND) + { + nDuration = 4; + } + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + //Apply linked and VFX effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); +} diff --git a/_removed/nw_s0_invpurge.ncs b/_removed/nw_s0_invpurge.ncs new file mode 100644 index 0000000..bdda747 Binary files /dev/null and b/_removed/nw_s0_invpurge.ncs differ diff --git a/_removed/nw_s0_invpurge.nss b/_removed/nw_s0_invpurge.nss new file mode 100644 index 0000000..0e9760c --- /dev/null +++ b/_removed/nw_s0_invpurge.nss @@ -0,0 +1,63 @@ +//:://///////////////////////////////////////////// +//:: Invisibility Purge +//:: NW_S0_InvPurge.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All invisible creatures become invisible in the + area of effect even if they leave the AOE. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "nw_i0_spells" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables including Area of Effect Object + spellsDeclareMajorVariables(); + effect eAOE = EffectAreaOfEffect(35); + int nDuration = spell.Level; + effect eDur1 = EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT); + effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eLink = EffectLinkEffects(eDur1, eDur2); + + //Check Extend metamagic feat. + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Create an instance of the AOE Object using the Apply Effect function + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, spell.Target, TurnsToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, TurnsToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_INVISIBILITY_PURGE"); +} diff --git a/_removed/nw_s0_invsph.ncs b/_removed/nw_s0_invsph.ncs new file mode 100644 index 0000000..5db8bc5 Binary files /dev/null and b/_removed/nw_s0_invsph.ncs differ diff --git a/_removed/nw_s0_invsph.nss b/_removed/nw_s0_invsph.nss new file mode 100644 index 0000000..b1d7f54 --- /dev/null +++ b/_removed/nw_s0_invsph.nss @@ -0,0 +1,72 @@ +//:://///////////////////////////////////////////// +//:: Invisibility Sphere +//:: NW_S0_InvSph.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All allies within 15ft are rendered invisible. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +- moving bug fixed, now caster gains benefit of aura all the time, (cannot guarantee the others, +thats module-related) +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "nw_i0_spells" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables including Area of Effect Object + spellsDeclareMajorVariables(); + effect eAOE = EffectAreaOfEffect(AOE_PER_INVIS_SPHERE); + + effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_NORMAL); + effect eVis = EffectVisualEffect(VFX_DUR_INVISIBILITY); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + + effect eLink = EffectLinkEffects(eInvis, eVis); + eLink = EffectLinkEffects(eLink, eDur); + eLink = EffectLinkEffects(eLink, eAOE); + int nDuration = spell.Level; + + //Check Extend metamagic feat. + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Create an instance of the AOE Object using the Apply Effect function + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, TurnsToSeconds(nDuration)); + spellsSetupNewAOE("VFX_PER_INVIS_SPHERE"); +} diff --git a/_removed/nw_s0_knock.ncs b/_removed/nw_s0_knock.ncs new file mode 100644 index 0000000..098066e Binary files /dev/null and b/_removed/nw_s0_knock.ncs differ diff --git a/_removed/nw_s0_knock.nss b/_removed/nw_s0_knock.nss new file mode 100644 index 0000000..c8a0a23 --- /dev/null +++ b/_removed/nw_s0_knock.nss @@ -0,0 +1,64 @@ +//:://///////////////////////////////////////////// +//:: Knock +//:: NW_S0_Knock +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Opens doors not locked by magical means. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Nov 29, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Georg 2003/07/31 - Added signal event and custom door flags +//:: VFX Pass By: Preston W, On: June 22, 2001 + +#include "70_inc_spells" +#include "nw_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + spellsDeclareMajorVariables(); + object oTarget; + effect eVis = EffectVisualEffect(VFX_IMP_KNOCK); + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 50.0, spell.Loc, FALSE, OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + float fDelay; + int nResist; + + while(GetIsObjectValid(oTarget)) + { + SignalEvent(oTarget,EventSpellCastAt(spell.Caster,spell.Id)); + fDelay = GetRandomDelay(0.5, 2.5); + if(!GetPlotFlag(oTarget) && GetLocked(oTarget)) + { + nResist = GetDoorFlag(oTarget,DOOR_FLAG_RESIST_KNOCK); + if ((nResist == 0) && (GetLockUnlockDC(oTarget) < 31)) + { + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + AssignCommand(oTarget, ActionUnlockObject(oTarget)); + } + else if (nResist == 1) + { + FloatingTextStrRefOnCreature(83887,spell.Caster); // + } + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, 50.0, spell.Loc, FALSE, OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + } +} diff --git a/_removed/nw_s0_lore.ncs b/_removed/nw_s0_lore.ncs new file mode 100644 index 0000000..ae54da7 Binary files /dev/null and b/_removed/nw_s0_lore.ncs differ diff --git a/_removed/nw_s0_lore.nss b/_removed/nw_s0_lore.nss new file mode 100644 index 0000000..816701b --- /dev/null +++ b/_removed/nw_s0_lore.nss @@ -0,0 +1,63 @@ +//:://///////////////////////////////////////////// +//:: Legend Lore +//:: NW_S0_Lore.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Gives the caster a boost to Lore skill of 10 + plus 1 / 2 caster levels. Lasts for 1 Turn per + caster level. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Oct 22, 2001 +//::////////////////////////////////////////////// +//:: 2003-10-29: GZ: Corrected spell target object +//:: so potions work wit henchmen now +/* +Patch 1.71 + +- the spell couldn't be recast if caster had also identify effect +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nLevel = spell.Level; + int nBonus = 10; + effect eLore = EffectSkillIncrease(SKILL_LORE, nBonus); + effect eVis = EffectVisualEffect(VFX_IMP_MAGICAL_VISION); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eLink = EffectLinkEffects(eLore, eDur); + + //Meta-Magic checks + if(spell.Meta == METAMAGIC_EXTEND) + { + nLevel *= 2; + } + + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Apply linked and VFX effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, TurnsToSeconds(nLevel)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); +} diff --git a/_removed/nw_s0_magearm.ncs b/_removed/nw_s0_magearm.ncs new file mode 100644 index 0000000..4f9e3ba Binary files /dev/null and b/_removed/nw_s0_magearm.ncs differ diff --git a/_removed/nw_s0_magearm.nss b/_removed/nw_s0_magearm.nss new file mode 100644 index 0000000..201d486 --- /dev/null +++ b/_removed/nw_s0_magearm.nss @@ -0,0 +1,77 @@ +//:://///////////////////////////////////////////// +//:: Mage Armor +//:: [NW_S0_MageArm.nss] +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Gives the target +1 AC Bonus to Deflection, + Armor Enchantment, Natural Armor and Dodge. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 12, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 10, 2001 +//:: VFX Pass By: Preston W, On: June 22, 2001 +/* +bugfix by Kovi 2002.07.23 +- dodge bonus was stacking + +Patch 1.70 +- fixed stacking the shadow conjuration variant with itself +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + + effect eVis = EffectVisualEffect(VFX_IMP_AC_BONUS); + effect eAC1, eAC2, eAC3, eAC4; + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + { + nDuration = nDuration * 2; + } + //Set the four unique armor bonuses + eAC1 = EffectACIncrease(1, AC_ARMOUR_ENCHANTMENT_BONUS); + eAC2 = EffectACIncrease(1, AC_SHIELD_ENCHANTMENT_BONUS); + eAC3 = EffectACIncrease(1, AC_DODGE_BONUS); + eAC4 = EffectACIncrease(1, AC_NATURAL_BONUS); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + + effect eLink = EffectLinkEffects(eAC1, eAC2); + eLink = EffectLinkEffects(eLink, eAC3); + eLink = EffectLinkEffects(eLink, eAC4); + eLink = EffectLinkEffects(eLink, eDur); + + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Apply the armor bonuses and the VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, HoursToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); +} diff --git a/_removed/nw_s0_metswarm.ncs b/_removed/nw_s0_metswarm.ncs new file mode 100644 index 0000000..2c158cc Binary files /dev/null and b/_removed/nw_s0_metswarm.ncs differ diff --git a/_removed/nw_s0_metswarm.nss b/_removed/nw_s0_metswarm.nss new file mode 100644 index 0000000..79421eb --- /dev/null +++ b/_removed/nw_s0_metswarm.nss @@ -0,0 +1,83 @@ +//:://///////////////////////////////////////////// +//:: Meteor Swarm +//:: NW_S0_MetSwarm +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Everyone in a 50ft radius around the caster + takes 20d6 fire damage. Those within 6ft of the + caster will take no damage. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 24 , 2001 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 22, 2001 + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nMetaMagic; + int nDamage; + effect eFire; + effect eMeteor = EffectVisualEffect(VFX_FNF_METEOR_SWARM); + effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); + //Apply the meteor swarm VFX area impact + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eMeteor, spell.Loc); + //Get first object in the spell area + float fDelay; + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, spell.Loc); + while(GetIsObjectValid(oTarget)) + { + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster) && oTarget != spell.Caster) + { + fDelay = GetRandomDelay(); + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + //Make sure the target is outside the 2m safe zone + if (GetDistanceBetween(oTarget, spell.Caster) > 2.0) + { + //Make SR check + if (!MyResistSpell(spell.Caster, oTarget, 0.5)) + { + //Roll damage + nDamage = MaximizeOrEmpower(12,20,spell.Meta); + + nDamage = GetReflexAdjustedDamage(nDamage, oTarget, spell.DC,SAVING_THROW_TYPE_FIRE,spell.Caster); + //Set the damage effect + eFire = EffectDamage(nDamage, DAMAGE_TYPE_FIRE); + if(nDamage > 0) + { + //Apply damage effect and VFX impact. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eFire, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } + } + } + } + //Get next target in the spell area + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, spell.Loc); + } +} diff --git a/_removed/nw_s0_mscharm.ncs b/_removed/nw_s0_mscharm.ncs new file mode 100644 index 0000000..843cbf8 Binary files /dev/null and b/_removed/nw_s0_mscharm.ncs differ diff --git a/_removed/nw_s0_mscharm.nss b/_removed/nw_s0_mscharm.nss new file mode 100644 index 0000000..2a6970c --- /dev/null +++ b/_removed/nw_s0_mscharm.nss @@ -0,0 +1,109 @@ +//:://///////////////////////////////////////////// +//:: [Mass Charm] +//:: [NW_S0_MsCharm.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +/* + The caster attempts to charm a group of individuals + who's HD can be no more than his level combined. + The spell starts checking the area and those that + fail a will save are charmed. The affected persons + are Charmed for 1 round per 2 caster levels. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 29, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 10, 2001 +//:: VFX Pass By: Preston W, On: June 22, 2001 +/* +Patch 1.71 + +- was doing charm effect even for players (replaced for daze in this case) +- HD pool check corrected (if found target with HD matching HD pool) +- HD pool decreased also in case of spell being resisted +- added scaling by difficulty into duration +- added delay into SR and saving throw's VFX +- extended duration corrected to calculate twice of normal duration as usual +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + spellsDeclareMajorVariables(); + effect eCharm = EffectCharmed(); + effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE); + effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + + effect eLink = EffectLinkEffects(eMind, eDur); + + effect eVis = EffectVisualEffect(VFX_IMP_CHARM); + int nDuration = spell.Level; + float fDelay; + int nAmount = spell.Level * 2; + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; + } + + effect scaledEffect; + int scaledDuration; + + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, spell.Loc); + + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc); + while (GetIsObjectValid(oTarget) && nAmount > 0) + { + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster)) + { + fDelay = GetRandomDelay(); + //Check that the target is humanoid + if(AmIAHumanoid(oTarget) && nAmount >= GetHitDice(oTarget)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Make an SR check + if (!MyResistSpell(spell.Caster, oTarget, fDelay)) + { + //Make a Will save to negate + if (!MySavingThrow(SAVING_THROW_WILL, oTarget, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster, fDelay)) + { + scaledEffect = GetScaledEffect(eCharm, oTarget); + scaledEffect = EffectLinkEffects(eLink, scaledEffect); + scaledDuration = GetScaledDuration(nDuration, oTarget); + + //Apply the linked effects and the VFX impact + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, scaledEffect, oTarget, RoundsToSeconds(scaledDuration))); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } + //Add the creatures HD to the count of affected creatures + //nCnt = nCnt + GetHitDice(oTarget); + } + nAmount = nAmount - GetHitDice(oTarget); + } + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc); + } +} diff --git a/_removed/nw_s0_phankill.ncs b/_removed/nw_s0_phankill.ncs new file mode 100644 index 0000000..552f72e Binary files /dev/null and b/_removed/nw_s0_phankill.ncs differ diff --git a/_removed/nw_s0_phankill.nss b/_removed/nw_s0_phankill.nss new file mode 100644 index 0000000..846b541 --- /dev/null +++ b/_removed/nw_s0_phankill.nss @@ -0,0 +1,93 @@ +//:://///////////////////////////////////////////// +//:: Phantasmal Killer +//:: NW_S0_PhantKill +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Target of the spell must make 2 saves or die. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Dec 14 , 2001 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 22, 2001 +//:: Update Pass By: Preston W, On: Aug 3, 2001 +/* +Patch 1.70, fix by Shadooow + +- second saving throw subtype changed to fear (as per spell's descriptors) +- missing feedback when target was fear immune +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDamage = MaximizeOrEmpower(6,3,spell.Meta); + effect eDam; + effect eVis = EffectVisualEffect(VFX_IMP_DEATH); + effect eVis2 = EffectVisualEffect(VFX_IMP_SONIC); + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make an SR check + if(!MyResistSpell(spell.Caster, spell.Target)) + { + // Immunity to fear or mind spells, makes you immune to Phantasmal Killer. + if (!GetIsImmune(spell.Target, IMMUNITY_TYPE_FEAR, spell.Caster) && !GetIsImmune(spell.Target, IMMUNITY_TYPE_MIND_SPELLS, spell.Caster)) + { + //Make a Will save //1.70 - removed, the immunity and feedback is now handled differently + if (!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster)) + { + //Make a Fort save + if (MySavingThrow(SAVING_THROW_FORT, spell.Target, spell.DC, SAVING_THROW_TYPE_FEAR, spell.Caster)) + { + //Set the damage property + eDam = EffectDamage(nDamage, DAMAGE_TYPE_MAGICAL); + //Apply the damage effect and VFX impact + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, spell.Target); + } + else + { + //Apply the death effect and VFX impact + // Immunity to death magic, should not make you immune to Phantasmal Killer. + // So we need to make the effect supernatural. + ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), spell.Target); + //uncommented because of save subtype changed + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + } + } + } + else//fear or mind spells immune + { + //engine workaround to get proper feedback and VFX + eVis = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectFrightened(), spell.Target, 1.0); + } + } + } +} diff --git a/_removed/nw_s0_raisdead.ncs b/_removed/nw_s0_raisdead.ncs new file mode 100644 index 0000000..ea3dae1 Binary files /dev/null and b/_removed/nw_s0_raisdead.ncs differ diff --git a/_removed/nw_s0_raisdead.nss b/_removed/nw_s0_raisdead.nss new file mode 100644 index 0000000..9b03e35 --- /dev/null +++ b/_removed/nw_s0_raisdead.nss @@ -0,0 +1,35 @@ +//:://///////////////////////////////////////////// +//:: [Raise Dead] +//:: [NW_S0_RaisDead.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Brings a character back to life with 1 HP. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 31, 2001 +//:: Modified 69MEH69 July2003 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001 +//:: VFX Pass By: Preston W, On: June 22, 2001 +#include "69_hench_lib" +void main() +{ + //Declare major variables + object oTarget = GetSpellTargetObject(); + effect eRaise = EffectResurrection(); + effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD); + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_RAISE_DEAD, FALSE)); + if(GetIsDead(oTarget) && GetIsHenchmanDying(oTarget) == FALSE) + { + //Apply raise dead effect and VFX impact + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, oTarget); + if(GetDidDie(oTarget)) //Added for henchman + { + PostRespawnCleanup69(oTarget); + } + } +} + diff --git a/_removed/nw_s0_rayfrost.ncs b/_removed/nw_s0_rayfrost.ncs new file mode 100644 index 0000000..e625f68 Binary files /dev/null and b/_removed/nw_s0_rayfrost.ncs differ diff --git a/_removed/nw_s0_rayfrost.nss b/_removed/nw_s0_rayfrost.nss new file mode 100644 index 0000000..0f3b821 --- /dev/null +++ b/_removed/nw_s0_rayfrost.nss @@ -0,0 +1,72 @@ +//:://///////////////////////////////////////////// +//:: Ray of Frost +//:: [NW_S0_RayFrost.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +/* + If the caster succeeds at a ranged touch attack + the target takes 1d4 damage. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: feb 4, 2001 +//::////////////////////////////////////////////// +//:: Bug Fix: Andrew Nobbs, April 17, 2003 +//:: Notes: Took out ranged attack roll. +//::////////////////////////////////////////////// +/* +Patch 1.70, by Shadooow + +- empower metamagic empowered total value not just dice part +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + //1 additional damage for every 2 caster levels. + int cMultiplier = GetCasterLevel(OBJECT_SELF) / 2; + if (cMultiplier <= 1) cMultiplier = 1; + if (cMultiplier >= 15) cMultiplier = 15; + int nDam = MaximizeOrEmpower(4,1,spell.Meta,cMultiplier); + effect eDam; + effect eVis = EffectVisualEffect(VFX_IMP_FROST_S); + effect eRay = EffectBeam(VFX_BEAM_COLD, spell.Caster, BODY_NODE_HAND); + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make SR Check + if(!MyResistSpell(spell.Caster, spell.Target)) + { + //Set damage effect + eDam = EffectDamage(nDam, DAMAGE_TYPE_COLD); + //Apply the VFX impact and damage effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target); + } + } + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRay, spell.Target, 1.7); +} diff --git a/_removed/nw_s0_resserec.ncs b/_removed/nw_s0_resserec.ncs new file mode 100644 index 0000000..3b34522 Binary files /dev/null and b/_removed/nw_s0_resserec.ncs differ diff --git a/_removed/nw_s0_resserec.nss b/_removed/nw_s0_resserec.nss new file mode 100644 index 0000000..b6d3b38 --- /dev/null +++ b/_removed/nw_s0_resserec.nss @@ -0,0 +1,40 @@ +//:://///////////////////////////////////////////// +//:: [Ressurection] +//:: [NW_S0_Ressurec.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Brings a character back to life with full +//:: health. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 31, 2001 +//:: Modified 69MEH69 July2003 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001 +//:: VFX Pass By: Preston W, On: June 22, 2001 +#include "69_hench_lib" +void main() +{ + //Get the spell target + object oTarget = GetSpellTargetObject(); + //Check to make sure the target is dead first + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_RESURRECTION, FALSE)); + if (GetIsDead(oTarget) && GetIsHenchmanDying(oTarget) == FALSE) + { + //Declare major variables + int nHealed = GetMaxHitPoints(oTarget); + effect eRaise = EffectResurrection(); + effect eHeal = EffectHeal(nHealed + 10); + effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD); + //Apply the heal, raise dead and VFX impact effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); + if(GetDidDie(oTarget)) //Added for henchman + { + PostRespawnCleanup69(oTarget); + } + } +} + diff --git a/_removed/nw_s0_sanctuary.ncs b/_removed/nw_s0_sanctuary.ncs new file mode 100644 index 0000000..384521b Binary files /dev/null and b/_removed/nw_s0_sanctuary.ncs differ diff --git a/_removed/nw_s0_sanctuary.nss b/_removed/nw_s0_sanctuary.nss new file mode 100644 index 0000000..bcad3c7 --- /dev/null +++ b/_removed/nw_s0_sanctuary.nss @@ -0,0 +1,58 @@ +//:://///////////////////////////////////////////// +//:: Sanctuary +//:: NW_S0_Sanctuary.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Makes the target creature invisible to hostile + creatures unless they make a Will Save to ignore + the Sanctuary Effect +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_DUR_SANCTUARY); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eSanc = EffectSanctuary(spell.DC); + + effect eLink = EffectLinkEffects(eVis, eSanc); + eLink = EffectLinkEffects(eLink, eDur); + + int nDuration = spell.Level; + if(nDuration > 20) nDuration = 20; + //Enter Metamagic conditions + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); +} diff --git a/_removed/nw_s0_silence.ncs b/_removed/nw_s0_silence.ncs new file mode 100644 index 0000000..e8ea49f Binary files /dev/null and b/_removed/nw_s0_silence.ncs differ diff --git a/_removed/nw_s0_silence.nss b/_removed/nw_s0_silence.nss new file mode 100644 index 0000000..beff713 --- /dev/null +++ b/_removed/nw_s0_silence.nss @@ -0,0 +1,93 @@ +//:://///////////////////////////////////////////// +//:: Silence +//:: NW_S0_Silence.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + The target is surrounded by a zone of silence + that allows them to move without sound. Spell + casters caught in this area will be unable to cast + spells. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +- if cast on ally the effect bypass spell resistance/immunity properly +- moving bug fixed, now caster gains benefit of aura all the time, (cannot guarantee the others, +thats module-related) +*/ + +#include "70_inc_spells" +#include "nw_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } +// End of Spell Cast Hook + + //Declare major variables including Area of Effect Object + spellsDeclareMajorVariables(); + + effect eAOE = EffectAreaOfEffect(AOE_MOB_SILENCE); + effect eVis = EffectVisualEffect(VFX_DUR_AURA_SILENCE); + effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eSilence = EffectSilence(); + effect eImmune = EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 100); + + effect eLink = EffectLinkEffects(eDur2, eSilence); + eLink = EffectLinkEffects(eLink, eImmune); + eLink = EffectLinkEffects(eLink, eVis); + eLink = EffectLinkEffects(eLink, eAOE); + + int nDuration = spell.Level; + //Check Extend metamagic feat. + if(spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + if(!GetIsFriend(spell.Target)) + { + if(!MyResistSpell(spell.Caster, spell.Target)) + { + if(!MySavingThrow(SAVING_THROW_WILL, spell.Target, spell.DC, SAVING_THROW_TYPE_NONE, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + + //Create an instance of the AOE Object using the Apply Effect function + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_SILENCE"); + } + } + } + else + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Create an instance of the AOE Object using the Apply Effect function + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_SILENCE"); + } +} diff --git a/_removed/nw_s0_summon.ncs b/_removed/nw_s0_summon.ncs new file mode 100644 index 0000000..c2b7e9a Binary files /dev/null and b/_removed/nw_s0_summon.ncs differ diff --git a/_removed/nw_s0_summon.nss b/_removed/nw_s0_summon.nss new file mode 100644 index 0000000..d28f770 --- /dev/null +++ b/_removed/nw_s0_summon.nss @@ -0,0 +1,354 @@ +//:://///////////////////////////////////////////// +//:: Summon Creature Series +//:: NW_S0_Summon +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Carries out the summoning of the appropriate + creature for the Summon Monster Series of spells + 1 to 9 +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 8, 2002 +//::////////////////////////////////////////////// + +effect SetSummonEffect(int nSpellID); + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = 24; + + effect eSummon = SetSummonEffect(spell.Id); + + //Make metamagic check for extend + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Apply the VFX impact and summon effect + + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, HoursToSeconds(nDuration)); +} + + +effect SetSummonEffect(int nSpellID) +{ + int nFNF_Effect; + int nRoll = d4(); + string sSummon; + if(GetHasFeat(FEAT_ANIMAL_DOMAIN_POWER)) //WITH THE ANIMAL DOMAIN + { + if(nSpellID == SPELL_SUMMON_CREATURE_I) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1; + sSummon = "NW_S_BOARDIRE"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_II) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1; + sSummon = "NW_S_WOLFDIRE"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_III) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1; + sSummon = "NW_S_SPIDDIRE"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_IV) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2; + sSummon = "NW_S_beardire"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_V) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2; + sSummon = "NW_S_diretiger"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_VI) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRHUGE"; + break; + + case 2: + sSummon = "NW_S_WATERHUGE"; + break; + + case 3: + sSummon = "NW_S_FIREHUGE"; + break; + + case 4: + sSummon = "NW_S_EARTHHUGE"; + break; + } + } + else if(nSpellID == SPELL_SUMMON_CREATURE_VII) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRGREAT"; + break; + + case 2: + sSummon = "NW_S_WATERGREAT"; + break; + + case 3: + sSummon = "NW_S_FIREGREAT"; + break; + + case 4: + sSummon = "NW_S_EARTHGREAT"; + break; + } + } + else if(nSpellID == SPELL_SUMMON_CREATURE_VIII) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + if (GetCasterLevel(OBJECT_SELF) >= 33) + { + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRELDER2"; + break; + + case 2: + sSummon = "NW_S_WATERELDER2"; + break; + + case 3: + sSummon = "NW_S_FIREELDER2"; + break; + + case 4: + sSummon = "NW_S_EARTHELDER2"; + break; + } + } + else + { + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRELDER"; + break; + + case 2: + sSummon = "NW_S_WATERELDER"; + break; + + case 3: + sSummon = "NW_S_FIREELDER"; + break; + + case 4: + sSummon = "NW_S_EARTHELDER"; + break; + } + } + } + else if(nSpellID == SPELL_SUMMON_CREATURE_IX) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + if (GetCasterLevel(OBJECT_SELF) >= 28) + { + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRELDER2"; + break; + + case 2: + sSummon = "NW_S_WATERELDER2"; + break; + + case 3: + sSummon = "NW_S_FIREELDER2"; + break; + + case 4: + sSummon = "NW_S_EARTHELDER2"; + break; + } + } + else + { + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRELDER"; + break; + + case 2: + sSummon = "NW_S_WATERELDER"; + break; + + case 3: + sSummon = "NW_S_FIREELDER"; + break; + + case 4: + sSummon = "NW_S_EARTHELDER"; + break; + } + } + } + } + else //WITOUT THE ANIMAL DOMAIN + { + if(nSpellID == SPELL_SUMMON_CREATURE_I) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1; + sSummon = "NW_S_badgerdire"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_II) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1; + sSummon = "NW_S_BOARDIRE"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_III) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1; + sSummon = "NW_S_WOLFDIRE"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_IV) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2; + sSummon = "NW_S_SPIDDIRE"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_V) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2; + sSummon = "NW_S_beardire"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_VI) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2; + sSummon = "NW_S_diretiger"; + } + else if(nSpellID == SPELL_SUMMON_CREATURE_VII) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRHUGE"; + break; + + case 2: + sSummon = "NW_S_WATERHUGE"; + break; + + case 3: + sSummon = "NW_S_FIREHUGE"; + break; + + case 4: + sSummon = "NW_S_EARTHHUGE"; + break; + } + } + else if(nSpellID == SPELL_SUMMON_CREATURE_VIII) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRGREAT"; + break; + + case 2: + sSummon = "NW_S_WATERGREAT"; + break; + + case 3: + sSummon = "NW_S_FIREGREAT"; + break; + + case 4: + sSummon = "NW_S_EARTHGREAT"; + break; + } + } + else if(nSpellID == SPELL_SUMMON_CREATURE_IX) + { + nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3; + if (GetCasterLevel(OBJECT_SELF) >= 30) + { + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRELDER2"; + break; + + case 2: + sSummon = "NW_S_WATERELDER2"; + break; + + case 3: + sSummon = "NW_S_FIREELDER2"; + break; + + case 4: + sSummon = "NW_S_EARTHELDER2"; + break; + } + } + else + { + switch (nRoll) + { + case 1: + sSummon = "NW_S_AIRELDER"; + break; + + case 2: + sSummon = "NW_S_WATERELDER"; + break; + + case 3: + sSummon = "NW_S_FIREELDER"; + break; + + case 4: + sSummon = "NW_S_EARTHELDER"; + break; + } + } + } + } + //effect eVis = EffectVisualEffect(nFNF_Effect); + //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation()); + effect eSummonedMonster = EffectSummonCreature(sSummon, nFNF_Effect); + return eSummonedMonster; +} diff --git a/_removed/nw_s0_timestop.ncs b/_removed/nw_s0_timestop.ncs new file mode 100644 index 0000000..7deed45 Binary files /dev/null and b/_removed/nw_s0_timestop.ncs differ diff --git a/_removed/nw_s0_timestop.nss b/_removed/nw_s0_timestop.nss new file mode 100644 index 0000000..4e182c8 --- /dev/null +++ b/_removed/nw_s0_timestop.nss @@ -0,0 +1,83 @@ +//:://///////////////////////////////////////////// +//:: Time Stop +//:: NW_S0_TimeStop.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All persons in the Area are frozen in time + except the caster. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.70, by Shadoow + +- in MP environment, spell affect only current area +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + int nRoll = 1 + d4(); + + effect eTime, eVis = EffectVisualEffect(VFX_FNF_TIME_STOP); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(spell.Caster)); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Caster, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + if (GetLocalInt(spell.Caster, "tscooldown") == 1 && GetIsPC(OBJECT_SELF) == TRUE) + { + FloatingTextStringOnCreature("The spell has failed!", spell.Caster, FALSE); + return; + } + if(GetPCPublicCDKey(GetFirstPC(),FALSE) == "")//SP environment, keep default effect + { + eTime = EffectTimeStop(); + //Apply the VFX impact and effects + DelayCommand(0.75, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTime, spell.Caster, IntToFloat(d6())+2.0 )); + SetLocalInt(spell.Caster, "tscooldown", 1); + DelayCommand(18.0, SetLocalInt(spell.Caster, "tscooldown", 0)); + } + else//MP environment, use cutscene paralyse for all creatures in caster's area + { + eTime = ExtraordinaryEffect(EffectLinkEffects(EffectCutsceneParalyze(), EffectVisualEffect(VFX_DUR_BLUR))); + int nTh = 1; + object oTarget = GetNearestObject(OBJECT_TYPE_CREATURE, spell.Caster, nTh); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != spell.Caster && !GetIsDM(oTarget)) + { + DelayCommand(0.75, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTime, oTarget, IntToFloat(d6())+2.0 )); + SetLocalInt(spell.Caster, "tscooldown", 1); + DelayCommand(18.0, SetLocalInt(spell.Caster, "tscooldown", 0)); + } + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + oTarget = GetNearestObject(OBJECT_TYPE_CREATURE, spell.Caster, ++nTh); + } + } +} diff --git a/_removed/nw_s0_wallfirea.ncs b/_removed/nw_s0_wallfirea.ncs new file mode 100644 index 0000000..f4a4e98 Binary files /dev/null and b/_removed/nw_s0_wallfirea.ncs differ diff --git a/_removed/nw_s0_wallfirea.nss b/_removed/nw_s0_wallfirea.nss new file mode 100644 index 0000000..ba1eef3 --- /dev/null +++ b/_removed/nw_s0_wallfirea.nss @@ -0,0 +1,52 @@ +//:://///////////////////////////////////////////// +//:: Wall of Fire: On Enter +//:: NW_S0_WallFireA.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Person within the AoE take 4d6 fire damage + per round. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 17, 2001 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + //Declare major variables + aoesDeclareMajorVariables(); + int nDamage; + effect eDam; + //Declare and assign personal impact visual effect. + effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); + //Capture the first target object in the shape. + object oTarget = GetEnteringObject(); + + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, aoe.Creator)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id)); + //Make SR check, and appropriate saving throw(s). + if(!MyResistSpell(aoe.Creator, oTarget)) + { + //Roll damage. + int nDice = GetCasterLevel(aoe.Creator) / 5; + if (nDice < 4) nDice = 4; + if (nDice > 7) nDice = 7; + nDamage = MaximizeOrEmpower(6,nDice,spell.Meta); + nDamage = GetReflexAdjustedDamage(nDamage, oTarget, spell.DC, SAVING_THROW_TYPE_FIRE, aoe.Creator); + if(nDamage > 0) + { + // Apply effects to the currently selected target. + eDam = EffectDamage(nDamage, DAMAGE_TYPE_FIRE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + } + } + } +} diff --git a/_removed/nw_s0_wallfirec.ncs b/_removed/nw_s0_wallfirec.ncs new file mode 100644 index 0000000..8ddd9f0 Binary files /dev/null and b/_removed/nw_s0_wallfirec.ncs differ diff --git a/_removed/nw_s0_wallfirec.nss b/_removed/nw_s0_wallfirec.nss new file mode 100644 index 0000000..d606a02 --- /dev/null +++ b/_removed/nw_s0_wallfirec.nss @@ -0,0 +1,71 @@ +//:://///////////////////////////////////////////// +//:: Wall of Fire: Heartbeat +//:: NW_S0_WallFireA.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Person within the AoE take 4d6 fire damage + per round. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 17, 2001 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + //Declare major variables + aoesDeclareMajorVariables(); + int nDamage; + effect eDam; + //Declare and assign personal impact visual effect. + effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); + //Capture the first target object in the shape. + + //-------------------------------------------------------------------------- + // GZ 2003-Oct-15 + // When the caster is no longer there, all functions calling + // GetAreaOfEffectCreator will fail. Its better to remove the barrier then + //-------------------------------------------------------------------------- + if (!GetIsObjectValid(aoe.Creator)) + { + DestroyObject(aoe.AOE); + return; + } + + object oTarget = GetFirstInPersistentObject(aoe.AOE,OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + //Declare the spell shape, size and the location. + while(GetIsObjectValid(oTarget)) + { + if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, aoe.Creator)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id)); + //Make SR check, and appropriate saving throw(s). + if(!MyResistSpell(aoe.Creator, oTarget)) + { + //Roll damage. + int nDice = GetCasterLevel(aoe.Creator) / 5; + if (nDice < 4) nDice = 4; + if (nDice > 7) nDice = 7; + nDamage = MaximizeOrEmpower(6,nDice,spell.Meta); + //Enter Metamagic conditions + + nDamage = GetReflexAdjustedDamage(nDamage, oTarget, spell.DC, SAVING_THROW_TYPE_FIRE, aoe.Creator); + if(nDamage > 0) + { + // Apply effects to the currently selected target. + eDam = EffectDamage(nDamage, DAMAGE_TYPE_FIRE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, 1.0); + } + } + } + //Select the next target within the spell shape. + oTarget = GetNextInPersistentObject(aoe.AOE,OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + } +} diff --git a/_removed/nw_s0_weird.ncs b/_removed/nw_s0_weird.ncs new file mode 100644 index 0000000..cde19ff Binary files /dev/null and b/_removed/nw_s0_weird.ncs differ diff --git a/_removed/nw_s0_weird.nss b/_removed/nw_s0_weird.nss new file mode 100644 index 0000000..5cbceeb --- /dev/null +++ b/_removed/nw_s0_weird.nss @@ -0,0 +1,115 @@ +//:://///////////////////////////////////////////// +//:: Weird +//:: NW_S0_Weird +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All enemies in LOS of the spell must make 2 saves or die. + Even IF the fortitude save is succesful, they will still take + 4d10 damage. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: DEc 14 , 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 10, 2001 +//:: VFX Pass By: Preston W, On: June 27, 2001 +/* +Patch 1.70, fix by Shadooow + +- had double death VFX +- missing death VFX when spell killed creature lower than 7HD +- second saving throw subtype changed to fear (as per spell's descriptors) +- missing feedback when target was fear or mind spells immune +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eDam; + effect eVis = EffectVisualEffect(VFX_IMP_SONIC); + effect eVis2 = EffectVisualEffect(VFX_IMP_DEATH); + effect eWeird = EffectVisualEffect(VFX_FNF_WEIRD); + effect eAbyss = EffectVisualEffect(VFX_DUR_ANTI_LIGHT_10); + int nDamage; + float fDelay; + + //Apply the FNF VFX impact + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eWeird, spell.Loc); + //Get the first target in the spell area + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, spell.Loc, TRUE); + while (GetIsObjectValid(oTarget)) + { + //Make a faction check + if (spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, spell.Caster)) + { + fDelay = GetRandomDelay(3.0, 4.0); + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + //Make an SR Check + if(!MyResistSpell(spell.Caster, oTarget, fDelay)) + { + if ( !GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS,spell.Caster) && + !GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR,spell.Caster)) + { + if(GetHitDice(oTarget) >= 7) + { + //Make a Will save against mind-affecting + if(!MySavingThrow(SAVING_THROW_WILL, oTarget, spell.DC, SAVING_THROW_TYPE_MIND_SPELLS, spell.Caster, fDelay)) + { + // * I failed the saving throw. Now I die. + //Apply VFX impact and death effect + //DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget)); + effect eDeath = EffectDeath(); + // Need to make this supernatural, so that it ignores death immunity. + eDeath = SupernaturalEffect( eDeath ); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget)); + } // Will save + } + else + { + // * I have less than 7HD, I die. + + //Apply VFX impact and death effect + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget)); + effect eDeath = EffectDeath(); + // Need to make this supernatural, so that it ignores death immunity. + eDeath = SupernaturalEffect( eDeath ); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget)); + } + } + else + {//fear or mind spells immune + //engine workaround to get proper feedback and VFX + eVis = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectFrightened(), oTarget, 1.0)); + } + } + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, spell.Loc, TRUE); + } +} diff --git a/_removed/nw_s1_dragacid.ncs b/_removed/nw_s1_dragacid.ncs new file mode 100644 index 0000000..334f791 Binary files /dev/null and b/_removed/nw_s1_dragacid.ncs differ diff --git a/_removed/nw_s1_dragacid.nss b/_removed/nw_s1_dragacid.nss new file mode 100644 index 0000000..68ff6cb --- /dev/null +++ b/_removed/nw_s1_dragacid.nss @@ -0,0 +1,113 @@ +//:://///////////////////////////////////////////// +//:: Dragon Breath Acid +//:: NW_S1_DragAcid +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Calculates the proper damage and DC Save for the + breath weapon based on the HD of the dragon. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 9, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- wrong target check (could affect other NPCs) +- damage was the same for all creatures in AoE +- damage dice calculation wasn't correct for some HDs +- old evasion behaviour (now that evasion is applied will appear in log) +> breath weapon damage and DC calculation changed in order to allow higher values +for custom content dragons with 40+ HD. DC calculation is now 10+1/2 dragon's HD+ +dragon's constitution modifier. +*/ + +#include "70_inc_dragons" +#include "x0_i0_spells" + +void main() +{ + //Declare major variables + int nDamage = GetDragonBreathNumDice(); + int nDC = GetDragonBreathDC(); + + //When used by a dragon disciple, calculate DC and damage based on their DD levels + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1 ) + { + int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE, OBJECT_SELF); + nDamage = 2*nLevel / 3; + //if (nLevel == 29) nDamage = 25; + //if (nLevel == 30) nDamage = 30; + + switch (nLevel) + { + case 1: nDC = 15; break; + case 2: nDC = 15; break; + case 3: nDC = 15; break; + case 4: nDC = 15; break; + case 5: nDC = 16; break; + case 6: nDC = 16; break; + case 7: nDC = 17; break; + case 8: nDC = 17; break; + case 9: nDC = 18; break; + case 10: nDC = 18; break; + case 11: nDC = 19; break; + case 12: nDC = 20; break; + case 13: nDC = 21; break; + case 14: nDC = 22; break; + case 15: nDC = 23; break; + case 16: nDC = 24; break; + case 17: nDC = 25; break; + case 18: nDC = 26; break; + case 19: nDC = 27; break; + case 20: nDC = 28; break; + case 21: nDC = 29; break; + case 22: nDC = 30; break; + case 23: nDC = 31; break; + case 24: nDC = 32; break; + case 25: nDC = 33; break; + case 26: nDC = 34; break; + case 27: nDC = 35; break; + case 28: nDC = 36; break; + case 29: nDC = 37; break; + case 30: nDC = 38; break; + } + } + //Done + + int nDamStrike; + float fDelay; + effect eVis = EffectVisualEffect(VFX_IMP_ACID_S); + effect eBreath; + + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) PlayDragonBattleCry(); + //Get first target in spell area + object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_ACID)); + //Determine effect delay + fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + //randomize damage for each creature in AoE + nDamStrike = d10(nDamage); + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) nDamStrike = d4(nDamage); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. + nDamStrike = GetReflexAdjustedDamage(nDamStrike, oTarget, nDC, SAVING_THROW_TYPE_ACID, OBJECT_SELF); + if (nDamStrike > 0) + { + //Set Damage + eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_ACID); + //Apply the VFX impact and effects + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget)); + } + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + } + SetLocalInt(OBJECT_SELF, "ddbreath", 0); +} diff --git a/_removed/nw_s1_dragcold.ncs b/_removed/nw_s1_dragcold.ncs new file mode 100644 index 0000000..f511d75 Binary files /dev/null and b/_removed/nw_s1_dragcold.ncs differ diff --git a/_removed/nw_s1_dragcold.nss b/_removed/nw_s1_dragcold.nss new file mode 100644 index 0000000..3199e50 --- /dev/null +++ b/_removed/nw_s1_dragcold.nss @@ -0,0 +1,111 @@ +//:://///////////////////////////////////////////// +//:: Dragon Breath Cold +//:: NW_S1_DragCold +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Calculates the proper damage and DC Save for the + breath weapon based on the HD of the dragon. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 9, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- wrong target check (could affect other NPCs) +- damage was the same for all creatures in AoE +- old evasion behaviour (now that evasion is applied will appear in log) +> breath weapon damage and DC calculation changed in order to allow higher values +for custom content dragons with 40+ HD. DC calculation is now 10+1/2 dragon's HD+ +dragon's constitution modifier. +*/ + +#include "70_inc_dragons" +#include "x0_i0_spells" + +void main() +{ + //Declare major variables + int nDamage = GetDragonBreathNumDice()/2; + int nDC = GetDragonBreathDC(); + + //When used by a dragon disciple, calculate DC and damage based on their DD levels + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1 ) + { + int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE, OBJECT_SELF); + nDamage = 2*nLevel / 3; + //if (nLevel == 29) nDamage = 25; + //if (nLevel == 30) nDamage = 30; + + switch (nLevel) + { + case 1: nDC = 15; break; + case 2: nDC = 15; break; + case 3: nDC = 15; break; + case 4: nDC = 15; break; + case 5: nDC = 16; break; + case 6: nDC = 16; break; + case 7: nDC = 17; break; + case 8: nDC = 17; break; + case 9: nDC = 18; break; + case 10: nDC = 18; break; + case 11: nDC = 19; break; + case 12: nDC = 20; break; + case 13: nDC = 21; break; + case 14: nDC = 22; break; + case 15: nDC = 23; break; + case 16: nDC = 24; break; + case 17: nDC = 25; break; + case 18: nDC = 26; break; + case 19: nDC = 27; break; + case 20: nDC = 28; break; + case 21: nDC = 29; break; + case 22: nDC = 30; break; + case 23: nDC = 31; break; + case 24: nDC = 32; break; + case 25: nDC = 33; break; + case 26: nDC = 34; break; + case 27: nDC = 35; break; + case 28: nDC = 36; break; + case 29: nDC = 37; break; + case 30: nDC = 38; break; + } + } + //Done + + int nDamStrike; + float fDelay; + effect eVis = EffectVisualEffect(VFX_IMP_FROST_S); + effect eBreath; + + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) PlayDragonBattleCry(); + //Get first target in spell area + object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_COLD)); + nDamStrike = d10(nDamage); + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) nDamStrike = d6(nDamage); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. + nDamStrike = GetReflexAdjustedDamage(nDamStrike, oTarget, nDC, SAVING_THROW_TYPE_COLD, OBJECT_SELF); + if (nDamStrike > 0) + { + //Set Damage + eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_COLD); + //Determine effect delay + fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + //Apply the VFX impact and effects + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget)); + } + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + } + SetLocalInt(OBJECT_SELF, "ddbreath", 0); +} diff --git a/_removed/nw_s1_dragfire.ncs b/_removed/nw_s1_dragfire.ncs new file mode 100644 index 0000000..ffe218d Binary files /dev/null and b/_removed/nw_s1_dragfire.ncs differ diff --git a/_removed/nw_s1_dragfire.nss b/_removed/nw_s1_dragfire.nss new file mode 100644 index 0000000..a11681f --- /dev/null +++ b/_removed/nw_s1_dragfire.nss @@ -0,0 +1,111 @@ +//:://///////////////////////////////////////////// +//:: Dragon Breath Fire +//:: NW_S1_DragFire +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Calculates the proper damage and DC Save for the + breath weapon based on the HD of the dragon. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 9, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- wrong target check (could affect other NPCs) +- damage was the same for all creatures in AoE +- old evasion behaviour (now that evasion is applied will appear in log) +> breath weapon damage and DC calculation changed in order to allow higher values +for custom content dragons with 40+ HD. DC calculation is now 10+1/2 dragon's HD+ +dragon's constitution modifier. +*/ + +#include "70_inc_dragons" +#include "x0_i0_spells" + +void main() +{ + //Declare major variables + int nDamage = GetDragonBreathNumDice(); + int nDC = GetDragonBreathDC(); + + //When used by a dragon disciple, calculate DC and damage based on their DD levels + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1 ) + { + int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE, OBJECT_SELF); + nDamage = 2*nLevel / 3; + //if (nLevel == 29) nDamage = 25; + //if (nLevel == 30) nDamage = 30; + + switch (nLevel) + { + case 1: nDC = 15; break; + case 2: nDC = 15; break; + case 3: nDC = 15; break; + case 4: nDC = 15; break; + case 5: nDC = 16; break; + case 6: nDC = 16; break; + case 7: nDC = 17; break; + case 8: nDC = 17; break; + case 9: nDC = 18; break; + case 10: nDC = 18; break; + case 11: nDC = 19; break; + case 12: nDC = 20; break; + case 13: nDC = 21; break; + case 14: nDC = 22; break; + case 15: nDC = 23; break; + case 16: nDC = 24; break; + case 17: nDC = 25; break; + case 18: nDC = 26; break; + case 19: nDC = 27; break; + case 20: nDC = 28; break; + case 21: nDC = 29; break; + case 22: nDC = 30; break; + case 23: nDC = 31; break; + case 24: nDC = 32; break; + case 25: nDC = 33; break; + case 26: nDC = 34; break; + case 27: nDC = 35; break; + case 28: nDC = 36; break; + case 29: nDC = 37; break; + case 30: nDC = 38; break; + } + } + //Done + + int nDamStrike; + float fDelay; + effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); + effect eBreath; + + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) PlayDragonBattleCry(); + //Get first target in spell area + object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_FIRE)); + //randomize damage for each creature in AoE + nDamStrike = d10(nDamage); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. + nDamStrike = GetReflexAdjustedDamage(nDamStrike, oTarget, nDC, SAVING_THROW_TYPE_FIRE, OBJECT_SELF); + if (nDamStrike > 0) + { + //Set Damage + eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE); + //Determine effect delay + fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + //Apply the VFX impact and effects + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget)); + } + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + } + SetLocalInt(OBJECT_SELF, "ddbreath", 0); +} diff --git a/_removed/nw_s1_draggas.ncs b/_removed/nw_s1_draggas.ncs new file mode 100644 index 0000000..54b1b20 Binary files /dev/null and b/_removed/nw_s1_draggas.ncs differ diff --git a/_removed/nw_s1_draggas.nss b/_removed/nw_s1_draggas.nss new file mode 100644 index 0000000..82bd9e8 --- /dev/null +++ b/_removed/nw_s1_draggas.nss @@ -0,0 +1,112 @@ +//:://///////////////////////////////////////////// +//:: Dragon Breath Gas Cloud +//:: NW_S1_DragGas +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Calculates the proper damage and DC Save for the + breath weapon based on the HD of the dragon. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 9, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- wrong target check (could affect other NPCs) +- damage was the same for all creatures in AoE +- old evasion behaviour (now that evasion is applied will appear in log) +> breath weapon damage and DC calculation changed in order to allow higher values +for custom content dragons with 40+ HD. DC calculation is now 10+1/2 dragon's HD+ +dragon's constitution modifier. +*/ + +#include "70_inc_dragons" +#include "x0_i0_spells" + +void main() +{ + //Declare major variables + int nDamage = GetDragonBreathNumDice(); + int nDC = GetDragonBreathDC(); + + //When used by a dragon disciple, calculate DC and damage based on their DD levels + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1 ) + { + int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE, OBJECT_SELF); + nDamage = 2*nLevel / 3; + //if (nLevel == 29) nDamage = 25; + //if (nLevel == 30) nDamage = 30; + + switch (nLevel) + { + case 1: nDC = 15; break; + case 2: nDC = 15; break; + case 3: nDC = 15; break; + case 4: nDC = 15; break; + case 5: nDC = 16; break; + case 6: nDC = 16; break; + case 7: nDC = 17; break; + case 8: nDC = 17; break; + case 9: nDC = 18; break; + case 10: nDC = 18; break; + case 11: nDC = 19; break; + case 12: nDC = 20; break; + case 13: nDC = 21; break; + case 14: nDC = 22; break; + case 15: nDC = 23; break; + case 16: nDC = 24; break; + case 17: nDC = 25; break; + case 18: nDC = 26; break; + case 19: nDC = 27; break; + case 20: nDC = 28; break; + case 21: nDC = 29; break; + case 22: nDC = 30; break; + case 23: nDC = 31; break; + case 24: nDC = 32; break; + case 25: nDC = 33; break; + case 26: nDC = 34; break; + case 27: nDC = 35; break; + case 28: nDC = 36; break; + case 29: nDC = 37; break; + case 30: nDC = 38; break; + } + } + //Done + + int nDamStrike; + float fDelay; + effect eVis = EffectVisualEffect(VFX_IMP_POISON_L); + effect eBreath; + + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) PlayDragonBattleCry(); + //Get first target in spell area + object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_GAS)); + //randomize damage for each creature in AoE + nDamStrike = d10(nDamage); + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) nDamStrike = d6(nDamage); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. + nDamStrike = GetReflexAdjustedDamage(nDamStrike, oTarget, nDC, SAVING_THROW_TYPE_ACID, OBJECT_SELF); + if (nDamStrike > 0) + { + //Set Damage and VFX + eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_ACID); + //Determine effect delay + fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + //Apply the VFX impact and effects + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget)); + } + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE); + } + SetLocalInt(OBJECT_SELF, "ddbreath", 0); +} diff --git a/_removed/nw_s1_draglight.ncs b/_removed/nw_s1_draglight.ncs new file mode 100644 index 0000000..bc69e87 Binary files /dev/null and b/_removed/nw_s1_draglight.ncs differ diff --git a/_removed/nw_s1_draglight.nss b/_removed/nw_s1_draglight.nss new file mode 100644 index 0000000..20169b4 --- /dev/null +++ b/_removed/nw_s1_draglight.nss @@ -0,0 +1,113 @@ +//:://///////////////////////////////////////////// +//:: Dragon Breath Lightning +//:: NW_S1_DragLightn +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Calculates the proper damage and DC Save for the + breath weapon based on the HD of the dragon. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: May 9, 2001 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- wrong target check (could affect other NPCs) +- damage was the same for all creatures in AoE +- old evasion behaviour (now that evasion is applied will appear in log) +- did signalized wrong spell id +> breath weapon damage and DC calculation changed in order to allow higher values +for custom content dragons with 40+ HD. DC calculation is now 10+1/2 dragon's HD+ +dragon's constitution modifier. +*/ + +#include "70_inc_dragons" +#include "x0_i0_spells" + +void main() +{ + //Declare major variables + int nDamage = GetDragonBreathNumDice(); + int nDC = GetDragonBreathDC(); + + //When used by a dragon disciple, calculate DC and damage based on their DD levels + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1 ) + { + int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE, OBJECT_SELF); + nDamage = 2*nLevel / 3; + //if (nLevel == 29) nDamage = 25; + //if (nLevel == 30) nDamage = 30; + + switch (nLevel) + { + case 1: nDC = 15; break; + case 2: nDC = 15; break; + case 3: nDC = 15; break; + case 4: nDC = 15; break; + case 5: nDC = 16; break; + case 6: nDC = 16; break; + case 7: nDC = 17; break; + case 8: nDC = 17; break; + case 9: nDC = 18; break; + case 10: nDC = 18; break; + case 11: nDC = 19; break; + case 12: nDC = 20; break; + case 13: nDC = 21; break; + case 14: nDC = 22; break; + case 15: nDC = 23; break; + case 16: nDC = 24; break; + case 17: nDC = 25; break; + case 18: nDC = 26; break; + case 19: nDC = 27; break; + case 20: nDC = 28; break; + case 21: nDC = 29; break; + case 22: nDC = 30; break; + case 23: nDC = 31; break; + case 24: nDC = 32; break; + case 25: nDC = 33; break; + case 26: nDC = 34; break; + case 27: nDC = 35; break; + case 28: nDC = 36; break; + case 29: nDC = 37; break; + case 30: nDC = 38; break; + } + } + //Done + + int nDamStrike; + float fDelay; + //effect eLightning = EffectBeam(VFX_BEAM_LIGHTNING, OBJECT_SELF,BODY_NODE_HAND); + effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_S); + effect eBreath; + + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) PlayDragonBattleCry(); + //Get first target in spell area + object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation()); + while (GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_LIGHTNING)); + //randomize damage for each creature in AoE + nDamStrike = d10(nDamage); + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) nDamStrike = d8(nDamage); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. + nDamStrike = GetReflexAdjustedDamage(nDamStrike, oTarget, nDC, SAVING_THROW_TYPE_ELECTRICITY, OBJECT_SELF); + if(nDamStrike > 0) + { + //Set the damage effect + eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_ELECTRICAL); + //Determine effect delay + fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + //Apply the VFX impact and effects + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eBreath,oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget)); + } + } + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation()); + } + SetLocalInt(OBJECT_SELF, "ddbreath", 0); +} diff --git a/_removed/nw_s2_animalcom.ncs b/_removed/nw_s2_animalcom.ncs new file mode 100644 index 0000000..d3ab5d6 Binary files /dev/null and b/_removed/nw_s2_animalcom.ncs differ diff --git a/_removed/nw_s2_animalcom.nss b/_removed/nw_s2_animalcom.nss new file mode 100644 index 0000000..a50a7ab --- /dev/null +++ b/_removed/nw_s2_animalcom.nss @@ -0,0 +1,24 @@ +//:://///////////////////////////////////////////// +//:: Summon Animal Companion +//:: NW_S2_AnimalComp +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This spell summons a Druid's animal companion +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Sept 27, 2001 +//:: Modified: 69MEH69 Sep2005 +//::////////////////////////////////////////////// +#include "69_hench_lib" +void main() +{ + if(!GetIsPC(OBJECT_SELF)) + { + HenchSummonCreature69(OBJECT_SELF); + return; + } + //Yep thats it + SummonAnimalCompanion(); +} diff --git a/_removed/nw_s2_bardsong.ncs b/_removed/nw_s2_bardsong.ncs new file mode 100644 index 0000000..a6a9afe Binary files /dev/null and b/_removed/nw_s2_bardsong.ncs differ diff --git a/_removed/nw_s2_bardsong.nss b/_removed/nw_s2_bardsong.nss new file mode 100644 index 0000000..2637e79 --- /dev/null +++ b/_removed/nw_s2_bardsong.nss @@ -0,0 +1,445 @@ +//:://///////////////////////////////////////////// +//:: Bard Song +//:: NW_S2_BardSong +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This spells applies bonuses to all of the + bard's allies within 30ft for a set duration of + 10 rounds. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Feb 25, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Georg Zoeller Oct 1, 2003 +/* +bugfix by Kovi 2002.07.30 +- loosing temporary hp resulted in loosing the other bonuses +*/ + +#include "x0_i0_spells" + +void main() +{ + if (GetHasEffect(EFFECT_TYPE_SILENCE,OBJECT_SELF)) + { + FloatingTextStrRefOnCreature(85764,OBJECT_SELF); // not useable when silenced + return; + } + string sTag = GetTag(OBJECT_SELF); + + if (sTag == "x0_hen_dee" || sTag == "x2_hen_deekin") + { + // * Deekin has a chance of singing a doom song + // * same effect, better tune + if (Random(100) + 1 > 80) + { + // the Xp2 Deekin knows more than one doom song + if (d3() ==1 && sTag == "x2_hen_deekin") + { + DelayCommand(0.0, PlaySound("vs_nx2deekM_050")); + } + else + { + DelayCommand(0.0, PlaySound("vs_nx0deekM_074")); + DelayCommand(5.0, PlaySound("vs_nx0deekM_074")); + } + } + } + + + //Declare major variables + int nLevel = GetLevelByClass(CLASS_TYPE_BARD); + int nRanks = GetSkillRank(SKILL_PERFORM); + int nChr = GetAbilityModifier(ABILITY_CHARISMA); + int nPerform = nRanks; + int nDuration = 10; //+ nChr; + + effect eAttack; + effect eDamage; + effect eWill; + effect eFort; + effect eReflex; + effect eHP; + effect eAC; + effect eSkill; + + int nAttack; + int nDamage; + int nWill; + int nFort; + int nReflex; + int nHP; + int nAC; + int nSkill; + + // lingering song + if(GetHasFeat(424)) // lingering song + { + nDuration += 5; + } + + //Check to see if the caster has Lasting Impression and increase duration. + if(GetHasFeat(870)) + { + nDuration *= 5; + } + + //SpeakString("Level: " + IntToString(nLevel) + " Ranks: " + IntToString(nRanks)); + + if(nPerform >= 100 && nLevel >= 40) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 48; + nAC = 7; + nSkill = 19; + } + else if(nPerform >= 95 && nLevel >= 38) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 46; + nAC = 6; + nSkill = 18; + } + else if(nPerform >= 90 && nLevel >= 36) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 44; + nAC = 6; + nSkill = 17; + } + else if(nPerform >= 85 && nLevel >= 34) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 42; + nAC = 6; + nSkill = 16; + } + else if(nPerform >= 80 && nLevel >= 32) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 40; + nAC = 6; + nSkill = 15; + } + else if(nPerform >= 75 && nLevel >= 30) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 38; + nAC = 6; + nSkill = 14; + } + else if(nPerform >= 70 && nLevel >= 28) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 36; + nAC = 5; + nSkill = 13; + } + else if(nPerform >= 65 && nLevel >= 26) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 34; + nAC = 5; + nSkill = 12; + } + else if(nPerform >= 60 && nLevel >= 24) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 32; + nAC = 5; + nSkill = 11; + } + else if(nPerform >= 55 && nLevel >= 22) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 30; + nAC = 5; + nSkill = 9; + } + else if(nPerform >= 50 && nLevel >= 20) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 28; + nAC = 5; + nSkill = 8; + } + else if(nPerform >= 45 && nLevel >= 19) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 26; + nAC = 5; + nSkill = 7; + } + else if(nPerform >= 40 && nLevel >= 18) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 24; + nAC = 5; + nSkill = 6; + } + else if(nPerform >= 35 && nLevel >= 17) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 22; + nAC = 5; + nSkill = 5; + } + else if(nPerform >= 30 && nLevel >= 16) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 20; + nAC = 5; + nSkill = 4; + } + else if(nPerform >= 24 && nLevel >= 15) + { + nAttack = 2; + nDamage = 3; + nWill = 2; + nFort = 2; + nReflex = 2; + nHP = 16; + nAC = 4; + nSkill = 3; + } + else if(nPerform >= 21 && nLevel >= 14) + { + nAttack = 2; + nDamage = 3; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 16; + nAC = 3; + nSkill = 2; + } + else if(nPerform >= 18 && nLevel >= 11) + { + nAttack = 2; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 8; + nAC = 2; + nSkill = 2; + } + else if(nPerform >= 15 && nLevel >= 8) + { + nAttack = 2; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 8; + nAC = 0; + nSkill = 1; + } + else if(nPerform >= 12 && nLevel >= 6) + { + nAttack = 1; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 0; + nAC = 0; + nSkill = 1; + } + else if(nPerform >= 9 && nLevel >= 3) + { + nAttack = 1; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 0; + nHP = 0; + nAC = 0; + nSkill = 0; + } + else if(nPerform >= 6 && nLevel >= 2) + { + nAttack = 1; + nDamage = 1; + nWill = 1; + nFort = 0; + nReflex = 0; + nHP = 0; + nAC = 0; + nSkill = 0; + } + else if(nPerform >= 3 && nLevel >= 1) + { + nAttack = 1; + nDamage = 1; + nWill = 0; + nFort = 0; + nReflex = 0; + nHP = 0; + nAC = 0; + nSkill = 0; + } + + //If the bard has Extra Music and is at least 12lvl, give a small random bonus to this song + if (nLevel >= 12 && GetHasFeat(FEAT_EXTRA_MUSIC, OBJECT_SELF) ) + { + switch(d10()) + { + case 1: nAttack = nAttack + 1;break; + case 2: nDamage = nDamage + 1;break; + case 3: nWill = nWill + 1;break; + case 4: nFort = nFort + 1;break; + case 5: nReflex = nReflex + 1;break; + case 6: nAC = nAC + 1;break; + case 7: nSkill = nSkill + 1;break; + case 8: nWill = nWill + 2;break; + case 9: nFort = nFort + 2;break; + case 10: nReflex = nReflex + 2;break; + } + } + //End of Extra Music bonus + + + effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG); + + eAttack = EffectAttackIncrease(nAttack); + eDamage = EffectDamageIncrease(nDamage, DAMAGE_TYPE_BLUDGEONING); + effect eLink = EffectLinkEffects(eAttack, eDamage); + + if(nWill > 0) + { + eWill = EffectSavingThrowIncrease(SAVING_THROW_WILL, nWill); + eLink = EffectLinkEffects(eLink, eWill); + } + if(nFort > 0) + { + eFort = EffectSavingThrowIncrease(SAVING_THROW_FORT, nFort); + eLink = EffectLinkEffects(eLink, eFort); + } + if(nReflex > 0) + { + eReflex = EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nReflex); + eLink = EffectLinkEffects(eLink, eReflex); + } + if(nHP > 0) + { + //SpeakString("HP Bonus " + IntToString(nHP)); + eHP = EffectTemporaryHitpoints(nHP); +// eLink = EffectLinkEffects(eLink, eHP); + } + if(nAC > 0) + { + eAC = EffectACIncrease(nAC, AC_DODGE_BONUS); + eLink = EffectLinkEffects(eLink, eAC); + } + if(nSkill > 0) + { + eSkill = EffectSkillIncrease(SKILL_ALL_SKILLS, nSkill); + eLink = EffectLinkEffects(eLink, eSkill); + } + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + eLink = EffectLinkEffects(eLink, eDur); + + effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_SONIC); + effect eFNF = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, GetLocation(OBJECT_SELF)); + + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + + eHP = ExtraordinaryEffect(eHP); + eLink = ExtraordinaryEffect(eLink); + + while(GetIsObjectValid(oTarget)) + { + if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(GetSpellId(),oTarget)) + { + // * GZ Oct 2003: If we are silenced, we can not benefit from bard song + if (!GetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !GetHasEffect(EFFECT_TYPE_DEAF,oTarget)) + { + if(oTarget == OBJECT_SELF) + { + effect eLinkBard = EffectLinkEffects(eLink, eVis); + eLinkBard = ExtraordinaryEffect(eLinkBard); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLinkBard, oTarget, RoundsToSeconds(nDuration)); + if (nHP > 0) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oTarget, RoundsToSeconds(nDuration)); + } + } + else if(GetIsFriend(oTarget)) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration)); + if (nHP > 0) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oTarget, RoundsToSeconds(nDuration)); + } + } + } + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + } +} + diff --git a/_removed/nw_s2_familiar.ncs b/_removed/nw_s2_familiar.ncs new file mode 100644 index 0000000..f576cb1 Binary files /dev/null and b/_removed/nw_s2_familiar.ncs differ diff --git a/_removed/nw_s2_familiar.nss b/_removed/nw_s2_familiar.nss new file mode 100644 index 0000000..77414a5 --- /dev/null +++ b/_removed/nw_s2_familiar.nss @@ -0,0 +1,33 @@ +//:://///////////////////////////////////////////// +//:: Summon Familiar +//:: NW_S2_Familiar +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This spell summons an Arcane casters familiar +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Sept 27, 2001 +//:: Modified: 69MEH69 Sep2005 +//::////////////////////////////////////////////// +#include "69_hench_lib" +void main() +{ + if(!GetIsPC(OBJECT_SELF)) + { + HenchSummonCreature69(OBJECT_SELF); + return; + } + //Yep thats it + SummonFamiliar(); + + //If the familiar has lockpicking higher than 10, set it to 10 + object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR); + if (GetSkillRank(SKILL_OPEN_LOCK, oFamiliar, TRUE) > 10) + { + effect eSkillNerf = EffectSkillDecrease(SKILL_OPEN_LOCK, GetSkillRank(SKILL_OPEN_LOCK, oFamiliar, TRUE)-10); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eSkillNerf), oFamiliar); + } + +} diff --git a/_removed/nw_s2_layonhand.ncs b/_removed/nw_s2_layonhand.ncs new file mode 100644 index 0000000..bd6aabc Binary files /dev/null and b/_removed/nw_s2_layonhand.ncs differ diff --git a/_removed/nw_s2_layonhand.nss b/_removed/nw_s2_layonhand.nss new file mode 100644 index 0000000..ed99be4 --- /dev/null +++ b/_removed/nw_s2_layonhand.nss @@ -0,0 +1,75 @@ +//:://///////////////////////////////////////////// +//:: Lay_On_Hands +//:: NW_S2_LayOnHand.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + The Paladin is able to heal his Chr Bonus times + his level. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Aug 15, 2001 +//:: Modified 69MEH69 JUL2003 +//::////////////////////////////////////////////// +#include "69_hench_lib" +#include "NW_I0_SPELLS" +void main() +{ + //Declare major variables + object oTarget = GetSpellTargetObject(); + int nChr = GetAbilityModifier(ABILITY_CHARISMA); + if (nChr < 0) + { + nChr = 0; + } + int nLevel = GetLevelByClass(CLASS_TYPE_PALADIN); + //Caluclate the amount to heal + int nHeal = nLevel * nChr; + if(nHeal <= 0) + { + nHeal = 1; + } + effect eHeal = EffectHeal(nHeal); + effect eVis = EffectVisualEffect(VFX_IMP_HEALING_M); + effect eVis2 = EffectVisualEffect(VFX_IMP_SUNSTRIKE); + effect eDam; + int nTouch; + string sTag = GetTag(oTarget); + object oArea = GetArea(oTarget); + int nCHP = GetLocalInt(oArea, "nCHP" +sTag); + //Check if the target is an undead + if(GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_LAY_ON_HANDS)); + //Make a ranged touch attack + nTouch = TouchAttackMelee(oTarget); + if(nTouch > 0) + { + if(nTouch == 2) + { + nHeal *= 2; + } + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_LAY_ON_HANDS)); + eDam = EffectDamage(nHeal, DAMAGE_TYPE_DIVINE); + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget); + } + } + else + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_LAY_ON_HANDS, FALSE)); + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + if(GetIsHenchmanDying(oTarget)) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nHeal); + } + } + +} + diff --git a/_removed/nw_s2_turndead.ncs b/_removed/nw_s2_turndead.ncs new file mode 100644 index 0000000..e878efa Binary files /dev/null and b/_removed/nw_s2_turndead.ncs differ diff --git a/_removed/nw_s2_turndead.nss b/_removed/nw_s2_turndead.nss new file mode 100644 index 0000000..68d22e6 --- /dev/null +++ b/_removed/nw_s2_turndead.nss @@ -0,0 +1,268 @@ +//:://///////////////////////////////////////////// +//:: Turn Undead +//:: NW_S2_TurnDead +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Checks domain powers and class to determine + the proper turning abilities of the casting + character. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Nov 2, 2001 +//:: Updated On: Jul 15, 2003 - Georg Zoeller +//::////////////////////////////////////////////// +//:: MODIFIED MARCH 5 2003 for Blackguards +//:: MODIFIED JULY 24 2003 for Planar Turning to include turn resistance hd +/* +Patch 1.70, by Shadooow + +- takes into account turn resistance of player character (but only from itemproperty) +*/ + +int GetPCTurnResistance(object oPC); + +void main() +{ + int nClericLevel = GetLevelByClass(CLASS_TYPE_CLERIC); + int nPaladinLevel = GetLevelByClass(CLASS_TYPE_PALADIN); + int nBlackguardlevel = GetLevelByClass(CLASS_TYPE_BLACKGUARD); + int nTotalLevel = GetHitDice(OBJECT_SELF); + + int nTurnLevel = nClericLevel; + int nClassLevel = nClericLevel; + + // GZ: Since paladin levels stack when turning, blackguard levels should stack as well + // GZ: but not with the paladin levels (thus else if). + if((nBlackguardlevel - 2) > 0 && (nBlackguardlevel > nPaladinLevel)) + { + nClassLevel += (nBlackguardlevel - 2); + nTurnLevel += (nBlackguardlevel - 2); + } + else if((nPaladinLevel - 2) > 0) + { + nClassLevel += (nPaladinLevel -2); + nTurnLevel += (nPaladinLevel - 2); + } + + //Flags for bonus turning types + int nElemental = GetHasFeat(FEAT_AIR_DOMAIN_POWER) + GetHasFeat(FEAT_EARTH_DOMAIN_POWER) + GetHasFeat(FEAT_FIRE_DOMAIN_POWER) + GetHasFeat(FEAT_WATER_DOMAIN_POWER); + int nVermin = GetHasFeat(FEAT_PLANT_DOMAIN_POWER);// + GetHasFeat(FEAT_ANIMAL_COMPANION); + int nConstructs = GetHasFeat(FEAT_DESTRUCTION_DOMAIN_POWER); + int nGoodOrEvilDomain = GetHasFeat(FEAT_GOOD_DOMAIN_POWER) + GetHasFeat(FEAT_EVIL_DOMAIN_POWER); + int nPlanar = GetHasFeat(854); + + //Flag for improved turning ability + int nSun = GetHasFeat(FEAT_SUN_DOMAIN_POWER); + + //Make a turning check roll, modify if have the Sun Domain + int nChrMod = GetAbilityModifier(ABILITY_CHARISMA); + int nTurnCheck = d20() + nChrMod; //The roll to apply to the max HD of undead that can be turned --> nTurnLevel + int nTurnHD = d6(2) + nChrMod + nClassLevel; //The number of HD of undead that can be turned. + + if(nSun == TRUE) + { + nTurnCheck += d4(); + nTurnHD += d6(); + } + //Determine the maximum HD of the undead that can be turned. + if(nTurnCheck <= 0) + { + nTurnLevel -= 4; + } + else if(nTurnCheck >= 1 && nTurnCheck <= 3) + { + nTurnLevel -= 3; + } + else if(nTurnCheck >= 4 && nTurnCheck <= 6) + { + nTurnLevel -= 2; + } + else if(nTurnCheck >= 7 && nTurnCheck <= 9) + { + nTurnLevel -= 1; + } + else if(nTurnCheck >= 10 && nTurnCheck <= 12) + { + //Stays the same + } + else if(nTurnCheck >= 13 && nTurnCheck <= 15) + { + nTurnLevel += 1; + } + else if(nTurnCheck >= 16 && nTurnCheck <= 18) + { + nTurnLevel += 2; + } + else if(nTurnCheck >= 19 && nTurnCheck <= 21) + { + nTurnLevel += 3; + } + else if(nTurnCheck >= 22) + { + nTurnLevel += 4; + } + + //Gets all creatures in a 20m radius around the caster and turns them or not. If the creatures + //HD are 1/2 or less of the nClassLevel then the creature is destroyed. + int nCnt = 1; + int nHD, nRacial, nHDCount, bValid, nDamage; + nHDCount = 0; + effect eVis = EffectVisualEffect(VFX_IMP_SUNSTRIKE); + effect eVisTurn = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR); + effect eDamage; + effect eTurned = EffectTurned(); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eLink = EffectLinkEffects(eVisTurn, eTurned); + eLink = EffectLinkEffects(eLink, eDur); + + effect eDeath = SupernaturalEffect(EffectDeath(TRUE)); + + effect eImpactVis = EffectVisualEffect(VFX_FNF_LOS_HOLY_30); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpactVis, GetLocation(OBJECT_SELF)); + + //Get nearest enemy within 20m (60ft) + //Why are you using GetNearest instead of GetFirstObjectInShape + object oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE , OBJECT_SELF, nCnt,CREATURE_TYPE_PERCEPTION , PERCEPTION_SEEN); + + while(GetIsObjectValid(oTarget) && nHDCount < nTurnHD && GetDistanceToObject(oTarget) <= 20.0) + { + if(!GetIsFriend(oTarget)) + { + nRacial = GetRacialType(oTarget); + + if (nRacial == RACIAL_TYPE_OUTSIDER ) + { + if (nPlanar) + { + //Planar turning decreases spell resistance against turning by 1/2 + nHD = GetHitDice(oTarget) + (GetSpellResistance(oTarget) /2) + GetTurnResistanceHD(oTarget); + } + else + { + nHD = GetHitDice(oTarget) + (GetSpellResistance(oTarget) + GetTurnResistanceHD(oTarget) ); + } + } + else //(full turn resistance) + { + nHD = GetHitDice(oTarget) + GetTurnResistanceHD(oTarget); + } + //1.70 by Shadooow: special workaround for player characters wearing custom items with turn resistance and shifter in spectre form + if(GetIsPC(oTarget) && !GetIsDMPossessed(oTarget) && !GetIsPossessedFamiliar(oTarget)) + { + nHD+= GetPCTurnResistance(oTarget); + } + + if(nHD <= nTurnLevel && nHD <= (nTurnHD - nHDCount)) + { + //Check the various domain turning types + if(nRacial == RACIAL_TYPE_UNDEAD) + { + bValid = TRUE; + } + else if (nRacial == RACIAL_TYPE_VERMIN && nVermin > 0) + { + bValid = TRUE; + } + else if (nRacial == RACIAL_TYPE_ELEMENTAL && nElemental > 0) + { + bValid = TRUE; + } + else if (nRacial == RACIAL_TYPE_CONSTRUCT && nConstructs > 0) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD)); + nDamage = d3(nTurnLevel); + eDamage = EffectDamage(nDamage, DAMAGE_TYPE_MAGICAL); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + DelayCommand(0.01, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget)); + nHDCount += nHD; + } + else if (nRacial == RACIAL_TYPE_OUTSIDER && (nGoodOrEvilDomain+nPlanar > 0) ) + { + bValid = TRUE; + } + // * if wearing gauntlets of the lich,then can be turned + else if (GetIsObjectValid(GetItemPossessedBy(oTarget, "x2_gauntletlich")) == TRUE) + { + if (GetTag(GetItemInSlot(INVENTORY_SLOT_ARMS)) == "x2_gauntletlich") + { + bValid = TRUE; + } + } + + //Apply results of the turn + if( bValid == TRUE) + { + + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + + if (nPlanar>0 && nRacial == RACIAL_TYPE_OUTSIDER) + { + effect ePlane = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY); + ApplyEffectToObject(DURATION_TYPE_INSTANT, ePlane, oTarget); + } + //if(IntToFloat(nClassLevel)/2.0 >= IntToFloat(nHD)) + //{ + + if((nClassLevel/2) >= nHD) + { + if (nPlanar>0 && nRacial == RACIAL_TYPE_OUTSIDER) + { + effect ePlane2 = EffectVisualEffect(VFX_IMP_UNSUMMON); + ApplyEffectToObject(DURATION_TYPE_INSTANT, ePlane2, oTarget); + } + + effect ePlane2 = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY); + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD)); + //Destroy the target + DelayCommand(0.1f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget)); + } + else + { + //Turn the target + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD)); + AssignCommand(oTarget, ActionMoveAwayFromObject(OBJECT_SELF, TRUE)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nClassLevel + 5)); + } + nHDCount = nHDCount + nHD; + } + } + bValid = FALSE; + } + nCnt++; + oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE, OBJECT_SELF, nCnt,CREATURE_TYPE_PERCEPTION , PERCEPTION_SEEN); + } +} + +int GetPCTurnResistance(object oPC) +{ + if(!GetIsPC(oPC) || GetIsDMPossessed(oPC) || GetIsPossessedFamiliar(oPC)) + { + return 0;//in these cases the default function works fine + } +int nTurnResistance; +object oItem; +int nSlot; +itemproperty ip; + for(;nSlot < NUM_INVENTORY_SLOTS;nSlot++) + { + oItem = GetItemInSlot(nSlot,oPC); + if(GetIsObjectValid(oItem)) + { + ip = GetFirstItemProperty(oItem); + while(GetIsItemPropertyValid(ip)) + { + if(GetItemPropertyType(ip) == ITEM_PROPERTY_TURN_RESISTANCE) + { + nTurnResistance+= GetItemPropertyCostTableValue(ip);//turn resistance stacks even on one item + } + ip = GetNextItemProperty(oItem); + } + } + } +return nTurnResistance; +} diff --git a/_removed/nw_s2_wildshape.ncs b/_removed/nw_s2_wildshape.ncs new file mode 100644 index 0000000..64e6981 Binary files /dev/null and b/_removed/nw_s2_wildshape.ncs differ diff --git a/_removed/nw_s2_wildshape.nss b/_removed/nw_s2_wildshape.nss new file mode 100644 index 0000000..62374b7 --- /dev/null +++ b/_removed/nw_s2_wildshape.nss @@ -0,0 +1,215 @@ +//:://///////////////////////////////////////////// +//:: Wild Shape +//:: NW_S2_WildShape +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the Druid to change into animal forms. + + Updated: Sept 30 2003, Georg Z. + * Made Armor merge with druid to make forms + more useful. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 22, 2002 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 15th-16th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.70 + +- allowed to merge any custom non-weapon in left hand slot such as flags or +musical instruments +- added optional feature to stack ability bonuses from multiple items together +- added optional feature to merge bracers (when items are allowed to merge) +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "70_inc_itemprop" +#include "x2_inc_itemprop" + +void main() +{ + //Declare major variables + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + effect ePoly; + int nPoly; + int nMetaMagic = GetMetaMagicFeat(); + int nDuration = GetLevelByClass(CLASS_TYPE_DRUID); + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + //Enter Metamagic conditions + if (nMetaMagic == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //Determine Polymorph subradial type + if(nSpell == 401) + { + nPoly = POLYMORPH_TYPE_BROWN_BEAR; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_BROWN_BEAR; + } + } + else if (nSpell == 402) + { + nPoly = POLYMORPH_TYPE_PANTHER; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_PANTHER; + } + } + else if (nSpell == 403) + { + nPoly = POLYMORPH_TYPE_WOLF; + + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_WOLF; + } + } + else if (nSpell == 404) + { + nPoly = POLYMORPH_TYPE_BOAR; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_BOAR; + } + } + else if (nSpell == 405) + { + nPoly = POLYMORPH_TYPE_BADGER; + if (nDuration >= 12) + { + nPoly = POLYMORPH_TYPE_DIRE_BADGER; + } + } + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE)); + + int bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1; + int bArmor = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1; + int bItems = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1; + int bArms = bItems && GetLocalInt(GetModule(),"71_POLYMORPH_MERGE_ARMS"); + + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oArmsOld = GetItemInSlot(INVENTORY_SLOT_ARMS,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + + if (GetIsObjectValid(oShield)) + { //1.71: this is now custom content compatible, polymorph will merge custom left-hand only items such as flags + if (GetWeaponRanged(oShield) || IPGetIsMeleeWeapon(oShield)) + { + oShield = OBJECT_INVALID; + } + } + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + if (bArms) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmsOld); + } + + //Apply the VFX impact and effects + ePoly = EffectPolymorph(nPoly); + if (nSpell == 402 && nDuration >= 12) ePoly = EffectLinkEffects(EffectMovementSpeedIncrease(50), ePoly); //A little extra for druids in dire panther form :) + if(nConBonus > 0) + {//1.70: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + ePoly = ExtraordinaryEffect(ePoly); + + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePoly, OBJECT_SELF, HoursToSeconds(nDuration)); + + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + if (bWeapon) + { + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + if (bArmor) + { + IPWildShapeCopyItemProperties(oShield,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + } + if (bItems) + { + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + if (bArms) + { + IPWildShapeCopyItemProperties(oArmsOld,oArmorNew); + } + if (GetLocalInt(GetModule(),"71_POLYMORPH_STACK_ABILITY_BONUSES")) + { + IPWildShapeStackAbilityBonuses(oArmorNew); + } +} diff --git a/_removed/x0_s0_acidsplash.ncs b/_removed/x0_s0_acidsplash.ncs new file mode 100644 index 0000000..eed85f5 Binary files /dev/null and b/_removed/x0_s0_acidsplash.ncs differ diff --git a/_removed/x0_s0_acidsplash.nss b/_removed/x0_s0_acidsplash.nss new file mode 100644 index 0000000..a638eb7 --- /dev/null +++ b/_removed/x0_s0_acidsplash.nss @@ -0,0 +1,60 @@ +//:://///////////////////////////////////////////// +//:: Acid Splash +//:: [X0_S0_AcidSplash.nss] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* +1d3 points of acid damage to one target. +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 17 2002 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_IMP_ACID_S); + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make SR Check + if(!MyResistSpell(spell.Caster, spell.Target)) + { + //Set damage effect + //1d3 of additional damage roughly for every 3 caster levels, but no more than 10d3. + int cMultiplier = GetCasterLevel(OBJECT_SELF) / 3; + if (cMultiplier <= 1) cMultiplier = 1; + if (cMultiplier >= 7) cMultiplier = 7; + int nDamage = MaximizeOrEmpower(3, cMultiplier, spell.Meta); + effect eBad = EffectDamage(nDamage, DAMAGE_TYPE_ACID); + //Apply the VFX impact and damage effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eBad, spell.Target); + } + } +} diff --git a/_removed/x0_s0_banishment.ncs b/_removed/x0_s0_banishment.ncs new file mode 100644 index 0000000..3ba1c89 Binary files /dev/null and b/_removed/x0_s0_banishment.ncs differ diff --git a/_removed/x0_s0_banishment.nss b/_removed/x0_s0_banishment.nss new file mode 100644 index 0000000..f7209f5 --- /dev/null +++ b/_removed/x0_s0_banishment.nss @@ -0,0 +1,119 @@ +//:://///////////////////////////////////////////// +//:: Banishment +//:: x0_s0_banishment.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All summoned creatures within 30ft of caster + make a save and SR check or be banished + + As well any Outsiders being must make a + save and SR check or be banished (up to + 2 HD creatures / level can be banished) +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Oct 22, 2001 +//::////////////////////////////////////////////// +//:: VFX Pass By: Preston W, On: June 20, 2001 + +#include "X0_I0_SPELLS" +#include "x2_inc_spellhook" +#include "hench_i0_generic" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + object oMaster; + effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON); + effect eImpact = EffectVisualEffect(VFX_FNF_LOS_EVIL_30); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation()); + int nSpellDC; + //Get the first object in the are of effect + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + + // * the pool is the number of hit dice of creatures that can be banished + int nPool = 2* GetCasterLevel(OBJECT_SELF); + + while(GetIsObjectValid(oTarget)) + { + //does the creature have a master. + oMaster = GetMaster(oTarget); + if (oMaster == OBJECT_INVALID) + { + oMaster = OBJECT_SELF; // TO prevent problems with invalid objects + // passed into GetAssociate + } + + // * BK: Removed the master check, only applys to Dismissal not banishment + //Is that master valid and is he an enemy + // if(GetIsObjectValid(oMaster) && GetIsEnemy(oMaster)) + { + // * Is the creature a summoned associate + // * or is the creature an outsider + // * and is there enough points in the pool + if( + (GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster) == oTarget || + GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster) == oTarget || + GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oMaster) == oTarget ) || + ((GetRacialType((oTarget)) == RACIAL_TYPE_OUTSIDER) && + (nPool > 0)) || + GetLocalInt(oTarget, sHenchPseudoSummon)) + { + // * March 2003. Added a check so that 'friendlies' will not be + // * unsummoned. + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, 430)); + //Determine correct save + nSpellDC = GetSpellSaveDC();// + 6; + // * Must be enough points in the pool to destroy target + if (nPool >= GetHitDice(oTarget)) + // * Make SR and will save checks + if (!MyResistSpell(OBJECT_SELF, oTarget) && !MySavingThrow(SAVING_THROW_WILL, oTarget, nSpellDC)) + { + //Apply the VFX and delay the destruction of the summoned monster so + //that the script and VFX can play. + + nPool = nPool - GetHitDice(oTarget); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); + if (CanCreatureBeDestroyed(oTarget) == TRUE) + { + //bugfix: Simply destroying the object won't fire it's OnDeath script. + //Which is bad when you have plot-specific things being done in that + //OnDeath script... so lets kill it. + effect eKill = EffectDamage(GetCurrentHitPoints(oTarget)); + //just to be extra-sure... :) + effect eDeath = EffectDeath(FALSE, FALSE); + DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eKill, oTarget)); + DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget)); + + DestroyObject(oTarget, 0.3); + } + } + } // rep check + } + } + //Get next creature in the shape. + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + } +} + + diff --git a/_removed/x0_s0_bigby1.ncs b/_removed/x0_s0_bigby1.ncs new file mode 100644 index 0000000..395a338 Binary files /dev/null and b/_removed/x0_s0_bigby1.ncs differ diff --git a/_removed/x0_s0_bigby1.nss b/_removed/x0_s0_bigby1.nss new file mode 100644 index 0000000..219da0a --- /dev/null +++ b/_removed/x0_s0_bigby1.nss @@ -0,0 +1,68 @@ +//:://///////////////////////////////////////////// +//:: Bigby's Interposing Hand +//:: [x0_s0_bigby1] +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Grants -10 to hit to target for 1 round / level +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: September 7, 2002 +//::////////////////////////////////////////////// +//:: VFX Pass By: + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = 5; + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, + spell.Id, + TRUE)); + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + { + nDuration = nDuration * 2; + } + if (!MyResistSpell(spell.Caster, spell.Target)) + { + + effect eAC1 = EffectAttackDecrease(5); + effect eVis = EffectVisualEffect(VFX_DUR_BIGBYS_INTERPOSING_HAND); + effect eLink = EffectLinkEffects(eAC1, eVis); + + + //Apply the TO HIT PENALTIES bonuses and the VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, + eLink, + spell.Target, + RoundsToSeconds(nDuration)); + } + } +} diff --git a/_removed/x0_s0_bigby2.ncs b/_removed/x0_s0_bigby2.ncs new file mode 100644 index 0000000..10eb9be Binary files /dev/null and b/_removed/x0_s0_bigby2.ncs differ diff --git a/_removed/x0_s0_bigby2.nss b/_removed/x0_s0_bigby2.nss new file mode 100644 index 0000000..bfa46b8 --- /dev/null +++ b/_removed/x0_s0_bigby2.nss @@ -0,0 +1,97 @@ +//:://///////////////////////////////////////////// +//:: Bigby's Forceful Hand +//:: [x0_s0_bigby2] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + dazed vs strength check (+14 on strength check); Target knocked down. + Target dazed down for 1 round per level of caster + +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: September 7, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs May 01, 2003 +/* +Patch 1.71 + +- disabled self-stacking +- added duration scaling per game difficulty +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + + //-------------------------------------------------------------------------- + // This spell no longer stacks. If there is one hand, that's enough + //-------------------------------------------------------------------------- + if (GetHasSpellEffect(spell.Id,spell.Target)) + { + FloatingTextStrRefOnCreature(100775,spell.Caster,FALSE); + return; + } + + int nDuration = 2; + nDuration = GetScaledDuration(nDuration, spell.Target); + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + { + nDuration = nDuration * 2; + } + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + // Apply the impact effect + effect eImpact = EffectVisualEffect(VFX_IMP_BIGBYS_FORCEFUL_HAND); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, spell.Target); + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, TRUE)); + if(!MyResistSpell(spell.Caster, spell.Target)) + { + int nCasterRoll = d20(1); + int nTargetRoll = d20(1) + GetAbilityModifier(ABILITY_STRENGTH, spell.Target) + GetSizeModifier(spell.Target); + // * bullrush succesful, knockdown target for duration of spell + if (nCasterRoll >= nTargetRoll) + { + effect eVis = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED); + effect eKnockdown = EffectDazed(); + effect eKnockdown2 = EffectKnockdown(); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + //Link effects + effect eLink = EffectLinkEffects(eKnockdown, eDur); + eLink = EffectLinkEffects(eLink, eKnockdown2); + //Apply the penalty + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, spell.Target, RoundsToSeconds(nDuration)); + // * Bull Rush succesful + FloatingTextStrRefOnCreature(8966,spell.Caster, FALSE); + } + else + { + FloatingTextStrRefOnCreature(8967,spell.Caster, FALSE); + } + } + } +} diff --git a/_removed/x0_s0_bigby3.ncs b/_removed/x0_s0_bigby3.ncs new file mode 100644 index 0000000..eb7c0e9 Binary files /dev/null and b/_removed/x0_s0_bigby3.ncs differ diff --git a/_removed/x0_s0_bigby3.nss b/_removed/x0_s0_bigby3.nss new file mode 100644 index 0000000..6619d21 --- /dev/null +++ b/_removed/x0_s0_bigby3.nss @@ -0,0 +1,136 @@ +//:://///////////////////////////////////////////// +//:: Bigby's Grasping Hand +//:: [x0_s0_bigby3] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + make an attack roll. If succesful target is held for 1 round/level + + +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: September 7, 2002 +//::////////////////////////////////////////////// +//:: VFX Pass By: +/* +Patch 1.71 + +- stunning visual effect removed if the target is mind/paralyse immune +- added duration scaling per game difficulty +- disabled self-stacking +- incorporeal creatures won't be grappled anymore +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + + //-------------------------------------------------------------------------- + // This spell no longer stacks. If there is one hand, that's enough + //-------------------------------------------------------------------------- + if (GetHasSpellEffect(spell.Id,spell.Target)) + { + FloatingTextStrRefOnCreature(100775,spell.Caster,FALSE); + return; + } + + int nDuration = 3; + nDuration = GetScaledDuration(nDuration, spell.Target); + effect eVis = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED); + + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + { + nDuration = nDuration * 2; + } + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, TRUE)); + + // Check spell resistance + if(!MyResistSpell(spell.Caster, spell.Target)) + { + // Check caster ability vs. target's AC + + int nCasterModifier = GetCasterAbilityModifier(spell.Caster); + int nCasterRoll = d20(1) + + nCasterModifier + + spell.Level/2 + 10 + -1; + + int nTargetRoll = GetAC(spell.Target) + d20(1); + + // * grapple HIT succesful, + if (nCasterRoll >= nTargetRoll) + { + // * now must make a GRAPPLE check to + // * hold target for duration of spell + // * check caster ability vs. target's size & strength + nCasterRoll = d20(1) + nCasterModifier + + spell.Level; + + nTargetRoll = d20(1) + + GetBaseAttackBonus(spell.Target) + + GetSizeModifier(spell.Target) + + GetAbilityModifier(ABILITY_STRENGTH, spell.Target) + GetSkillRank(SKILL_SPELLCRAFT, spell.Target)/2 + 10; + //1.71: incorporeal creatures cannot be grappled + if (nCasterRoll >= nTargetRoll && !GetCreatureFlag(spell.Target, CREATURE_VAR_IS_INCORPOREAL)) + { + // Hold the target paralyzed + effect eKnockdown = EffectParalyze(); + + // creatures immune to paralzation are still prevented from moving + if (GetIsImmune(spell.Target, IMMUNITY_TYPE_PARALYSIS, spell.Caster) || + GetIsImmune(spell.Target, IMMUNITY_TYPE_MIND_SPELLS, spell.Caster)) + { + eKnockdown = EffectCutsceneImmobilize(); + } + else + { + eKnockdown = EffectLinkEffects(eVis, eKnockdown); + } + + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eHand = EffectVisualEffect(VFX_DUR_BIGBYS_GRASPING_HAND); + effect eLink = EffectLinkEffects(eKnockdown, eDur); + eLink = EffectLinkEffects(eHand, eLink); + + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, + eLink, spell.Target, + RoundsToSeconds(nDuration)); + +// ApplyEffectToObject(DURATION_TYPE_TEMPORARY, +// eVis, oTarget,RoundsToSeconds(nDuration)); + FloatingTextStrRefOnCreature(2478, spell.Caster); + } + else + { + FloatingTextStrRefOnCreature(83309, spell.Caster); + } + } + } + } +} diff --git a/_removed/x0_s0_bigby4.ncs b/_removed/x0_s0_bigby4.ncs new file mode 100644 index 0000000..5643b66 Binary files /dev/null and b/_removed/x0_s0_bigby4.ncs differ diff --git a/_removed/x0_s0_bigby4.nss b/_removed/x0_s0_bigby4.nss new file mode 100644 index 0000000..a948e46 --- /dev/null +++ b/_removed/x0_s0_bigby4.nss @@ -0,0 +1,119 @@ +//:://///////////////////////////////////////////// +//:: Bigby's Clenched Fist +//:: [x0_s0_bigby4] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + Does an attack EACH ROUND for 1 round/level. + If the attack hits does + 1d8 +12 points of damage + + Any creature struck must make a FORT save or + be stunned for one round. + + GZ, Oct 15 2003: + Changed how this spell works by adding duration + tracking based on the VFX added to the character. + Makes the spell dispellable and solves some other + issues with wrong spell DCs, checks, etc. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: September 7, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Georg Zoeller October 15, 2003 + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "x2_i0_spells" + +void RunHandImpact(object oTarget, object oCaster, int nSpellID, int nMeta) +{ + //-------------------------------------------------------------------------- + // Check if the spell has expired (check also removes effects) + //-------------------------------------------------------------------------- + if (GZGetDelayedSpellEffectsExpired(nSpellID,oTarget,oCaster)) + { + return; + } + + int nCasterModifiers = GetCasterAbilityModifier(oCaster) + GetCasterLevel(oCaster)/2; + int nCasterRoll = d20(1) + nCasterModifiers + 11 + -1; + int nTargetRoll = GetAC(oTarget); + if (nCasterRoll >= nTargetRoll) + { + int nDC = GetLocalInt(oTarget,"XP2_L_SPELL_SAVE_DC_" + IntToString (nSpellID)); + + int nDam = MaximizeOrEmpower(8, 1, nMeta, 6); + effect eDam = EffectDamage(nDam, DAMAGE_TYPE_BLUDGEONING); + effect eVis = EffectVisualEffect(VFX_IMP_ACID_L); + + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + + if (!MySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_SPELL, oCaster)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oTarget, RoundsToSeconds(1)); + } + + DelayCommand(6.0,RunHandImpact(oTarget,oCaster,nSpellID,nMeta)); + } +} + +void main() +{ + + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + // End of Spell Cast Hook + + spellsDeclareMajorVariables(); + + //-------------------------------------------------------------------------- + // This spell no longer stacks. If there is one hand, that's enough + //-------------------------------------------------------------------------- + if (GetHasSpellEffect(spell.Id,spell.Target) || GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,spell.Target)) + { + FloatingTextStrRefOnCreature(100775,spell.Caster,FALSE); + return; + } + + int nDuration = 10; + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; + } + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, TRUE)); + int nResult = MyResistSpell(spell.Caster, spell.Target); + + if(nResult == 0) + { + int nCasterModifier = GetCasterAbilityModifier(spell.Caster); + effect eHand = EffectVisualEffect(VFX_DUR_BIGBYS_CLENCHED_FIST); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHand, spell.Target, RoundsToSeconds(nDuration)); + + //---------------------------------------------------------- + // GZ: 2003-Oct-15 + // Save the current save DC on the character because + // GetSpellSaveDC won't work when delayed + //---------------------------------------------------------- + SetLocalInt(spell.Target,"XP2_L_SPELL_SAVE_DC_" + IntToString (spell.Id), spell.DC); + + RunHandImpact(spell.Target,spell.Caster, spell.Id, spell.Meta); + } + } +} diff --git a/_removed/x0_s0_bigby5.ncs b/_removed/x0_s0_bigby5.ncs new file mode 100644 index 0000000..fd11e5e Binary files /dev/null and b/_removed/x0_s0_bigby5.ncs differ diff --git a/_removed/x0_s0_bigby5.nss b/_removed/x0_s0_bigby5.nss new file mode 100644 index 0000000..fd44890 --- /dev/null +++ b/_removed/x0_s0_bigby5.nss @@ -0,0 +1,146 @@ +//:://///////////////////////////////////////////// +//:: Bigby's Crushing Hand +//:: [x0_s0_bigby5] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + Similar to Bigby's Grasping Hand. + If Grapple succesful then will hold the opponent and do 2d6 + 12 points + of damage EACH round for 1 round/level + + + // Mark B's famous advice: + // Note: if the target is dead during one of these second-long heartbeats, + // the DelayCommand doesn't get run again, and the whole package goes away. + // Do NOT attempt to put more than two parameters on the delay command. They + // may all end up on the stack, and that's all bad. 60 x 2 = 120. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: September 7, 2002 +//::////////////////////////////////////////////// +//:: VFX Pass By: +/* +Patch 1.71 + +- added duration scaling per game difficulty +- incorporeal creatures won't be grappled anymore +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "x2_i0_spells" + +void RunHandImpact(object oTarget, object oCaster, int nSpellID, int nMeta) +{ + + //-------------------------------------------------------------------------- + // Check if the spell has expired (check also removes effects) + //-------------------------------------------------------------------------- + if (GZGetDelayedSpellEffectsExpired(nSpellID,oTarget,oCaster)) + { + return; + } + + int nDam = MaximizeOrEmpower(6,2,nMeta, 6); + effect eDam = EffectDamage(nDam, DAMAGE_TYPE_BLUDGEONING); + effect eVis = EffectVisualEffect(VFX_IMP_ACID_L); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + DelayCommand(6.0,RunHandImpact(oTarget,oCaster,nSpellID,nMeta)); +} + +void main() +{ + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + // End of Spell Cast Hook + + spellsDeclareMajorVariables(); + + //-------------------------------------------------------------------------- + // This spell no longer stacks. If there is one hand, that's enough + //-------------------------------------------------------------------------- + if (GetHasSpellEffect(spell.Id,spell.Target) || GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,spell.Target)) + { + FloatingTextStrRefOnCreature(100775,spell.Caster,FALSE); + return; + } + + int nDuration = 4; + nDuration = GetScaledDuration(nDuration, spell.Target); + + //Check for metamagic extend + if (spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + { + nDuration = nDuration * 2; + } + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, TRUE)); + + //SR + if(!MyResistSpell(spell.Caster, spell.Target)) + { + int nCasterModifier = GetCasterAbilityModifier(spell.Caster); + int nCasterRoll = d20(1) + + nCasterModifier + + GetCasterLevel(spell.Caster); + int nTargetRoll = GetAC(spell.Target); + + // * grapple HIT succesful, + if (nCasterRoll >= nTargetRoll) + { + // * now must make a GRAPPLE check + // * hold target for duration of spell + + nCasterRoll = d20(1) + nCasterModifier + + GetCasterLevel(spell.Caster); + + nTargetRoll = d20(1) + + GetBaseAttackBonus(spell.Target) + + GetSizeModifier(spell.Target) + + GetAbilityModifier(ABILITY_STRENGTH, spell.Target) + GetSkillRank(SKILL_SPELLCRAFT, spell.Target)/2 + 10; + //1.71: incorporeal creatures cannot be grappled + if (nCasterRoll >= nTargetRoll && !GetCreatureFlag(spell.Target, CREATURE_VAR_IS_INCORPOREAL)) + { + effect eKnockdown = EffectParalyze(); + + // creatures immune to paralzation are still prevented from moving + if (GetIsImmune(spell.Target, IMMUNITY_TYPE_PARALYSIS, spell.Caster) || + GetIsImmune(spell.Target, IMMUNITY_TYPE_MIND_SPELLS, spell.Caster)) + { + eKnockdown = EffectCutsceneImmobilize(); + } + + effect eHand = EffectVisualEffect(VFX_DUR_BIGBYS_CRUSHING_HAND); + effect eLink = EffectLinkEffects(eKnockdown, eHand); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, + eLink, spell.Target, + RoundsToSeconds(nDuration)); + + RunHandImpact(spell.Target, spell.Caster, spell.Id, spell.Meta); + FloatingTextStrRefOnCreature(2478, spell.Caster); + + } + else + { + FloatingTextStrRefOnCreature(83309, spell.Caster); + } + } + } + } +} diff --git a/_removed/x0_s0_clight.ncs b/_removed/x0_s0_clight.ncs new file mode 100644 index 0000000..bd6d08e Binary files /dev/null and b/_removed/x0_s0_clight.ncs differ diff --git a/_removed/x0_s0_clight.nss b/_removed/x0_s0_clight.nss new file mode 100644 index 0000000..771326b --- /dev/null +++ b/_removed/x0_s0_clight.nss @@ -0,0 +1,80 @@ +//:://///////////////////////////////////////////// +//:: Continual Flame +//:: x0_s0_clight.nss +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + Permanent Light spell + + XP2 + If cast on an item, item will get permanently + get the property "light". + Previously existing permanent light properties + will be removed! + +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent Knowles +//:: Created On: July 18, 2002 +//::////////////////////////////////////////////// +//:: VFX Pass By: +//:: Added XP2 cast on item code: Georg Z, 2003-06-05 +//::////////////////////////////////////////////// +/* +Patch 1.71 + +- any item that this spell is cast at is now marked as stolen to disable the cast/sell exploit +- spell can dispell the shadowblend effect +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run + // this spell. + if (!X2PreSpellCastCode()) + { + return; + } + int nDuration; + int nMetaMagic; + + spellsDeclareMajorVariables(); + + // Handle spell cast on item.... + if (GetObjectType(spell.Target) == OBJECT_TYPE_ITEM && ! CIGetIsCraftFeatBaseItem(spell.Target)) + { + // Do not allow casting on not equippable items + if (!IPGetIsItemEquipable(spell.Target)) + { + // Item must be equipable... + FloatingTextStrRefOnCreature(83326,spell.Caster); + return; + } + itemproperty ip = ItemPropertyLight (IP_CONST_LIGHTBRIGHTNESS_BRIGHT, IP_CONST_LIGHTCOLOR_WHITE); + IPSafeAddItemProperty(spell.Target, ip, 0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); + //casting this spell on every crap and then sell it is very well known exploit + //SetStolenFlag(spell.Target, TRUE);//sets item to be stolen, thus harder to sell //no need anymore - the value of light item property has been set to zero + } + else + { + if(GetHasSpellEffect(757, spell.Target)) + { + //Continual light effectively dispells shadowblend effect + RemoveEffectsFromSpell(spell.Target, 757); + } + //Declare major variables + effect eVis = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eLink = SupernaturalEffect(EffectLinkEffects(eVis, eDur)); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, spell.Target); + } +} diff --git a/_removed/x0_s0_dirge.ncs b/_removed/x0_s0_dirge.ncs new file mode 100644 index 0000000..3b277c0 Binary files /dev/null and b/_removed/x0_s0_dirge.ncs differ diff --git a/_removed/x0_s0_dirge.nss b/_removed/x0_s0_dirge.nss new file mode 100644 index 0000000..4613125 --- /dev/null +++ b/_removed/x0_s0_dirge.nss @@ -0,0 +1,77 @@ +//:://///////////////////////////////////////////// +//:: Dirge +//:: x0_s0_dirge.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All creatures within the AoE take 2 points of Strength + and Dexterity ability score damage. + Lasts 1 round/level +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 2002 +//::////////////////////////////////////////////// +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +- aoe signalized wrong spell ID +- moving bug fixed, now caster gains benefit of aura all the time, (cannot guarantee the others, +thats module-related) +*/ + +#include "70_inc_spells" +#include "x2_inc_spellhook" +#include "nw_i0_spells" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables including Area of Effect Object + spellsDeclareMajorVariables(); + //change from AOE_PER_FOGMIND to AOE_MOB_CIRCGOOD + effect eAOE = EffectAreaOfEffect(AOE_MOB_CIRCGOOD, "x0_s0_dirgeEN", "x0_s0_dirgeHB", "x0_s0_dirgeEX"); + effect eVis = EffectVisualEffect(VFX_DUR_AURA_ODD); + eAOE = EffectLinkEffects(eAOE, eVis); + int nDuration = spell.Level; + +// effect eCaster = EffectVisualEffect(VFX_DUR_BARD_SONG); //unused + + effect eFNF = EffectVisualEffect(VFX_FNF_SOUND_BURST); + //Apply the FNF to the spell location + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, spell.Loc); + + effect eImpact = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_ACID); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, spell.Loc); + + //Check Extend metamagic feat. + if(spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Create an instance of the AOE Object using the Apply Effect function + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, spell.Target, RoundsToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_CIRCGOOD","x0_s0_dirgehb"); +} diff --git a/_removed/x0_s0_earthquake.ncs b/_removed/x0_s0_earthquake.ncs new file mode 100644 index 0000000..ca0beb3 Binary files /dev/null and b/_removed/x0_s0_earthquake.ncs differ diff --git a/_removed/x0_s0_earthquake.nss b/_removed/x0_s0_earthquake.nss new file mode 100644 index 0000000..36514a0 --- /dev/null +++ b/_removed/x0_s0_earthquake.nss @@ -0,0 +1,93 @@ +//:://///////////////////////////////////////////// +//:: Earthquake +//:: X0_S0_Earthquake +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* +// Ground shakes. 1d6 damage, max 10d6 +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 22 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs May 01, 2003 + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + + //Declare major variables + spellsDeclareMajorVariables(); + int nCasterLvl = spell.Level; + int nDamage; + float fDelay; + float nSize = RADIUS_SIZE_COLOSSAL; + effect eExplode = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30); + effect eVis = EffectVisualEffect(VFX_IMP_HEAD_NATURE); + effect eDam; + effect eShake = EffectVisualEffect(356); + //Limit Caster level for the purposes of damage + if (nCasterLvl > 20) + { + nCasterLvl = 20; + } + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eShake, spell.Caster, RoundsToSeconds(6)); + + //Apply epicenter explosion on caster + //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, GetLocation(OBJECT_SELF)); + + + //Declare the spell shape, size and the location. Capture the first target object in the shape. + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, nSize, spell.Loc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + //Cycle through the targets within the spell shape until an invalid object is captured. + while (GetIsObjectValid(oTarget)) + { + if (oTarget != spell.Caster && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + //Get the distance between the explosion and the target to calculate delay + fDelay = GetDistanceBetweenLocations(spell.Loc, GetLocation(oTarget))/20; +// Earthquake does not allow spell resistance +// if (!MyResistSpell(OBJECT_SELF, oTarget, fDelay)) +// { + nDamage = MaximizeOrEmpower(6, nCasterLvl, spell.Meta); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. (Don't bother for caster) + nDamage = GetReflexAdjustedDamage(nDamage, oTarget, spell.DC, SAVING_THROW_TYPE_NONE, spell.Caster); + //Set the damage effect + eDam = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING); + // * caster can't be affected by the spell + if(nDamage > 0) + { + // Apply effects to the currently selected target. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); + //This visual effect is applied to the target object not the location as above. This visual effect + //represents the flame that erupts on the target not on the ground. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } +// } + } + //Select the next target within the spell shape. + oTarget = GetNextObjectInShape(SHAPE_SPHERE, nSize, spell.Loc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + } +} diff --git a/_removed/x0_s0_elecjolt.ncs b/_removed/x0_s0_elecjolt.ncs new file mode 100644 index 0000000..364d130 Binary files /dev/null and b/_removed/x0_s0_elecjolt.ncs differ diff --git a/_removed/x0_s0_elecjolt.nss b/_removed/x0_s0_elecjolt.nss new file mode 100644 index 0000000..3cd91c1 --- /dev/null +++ b/_removed/x0_s0_elecjolt.nss @@ -0,0 +1,61 @@ +//:://///////////////////////////////////////////// +//:: Electric Jolt +//:: [x0_s0_ElecJolt.nss] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* +1d3 points of electrical damage to one target. +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 17 2002 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + + effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_S); + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Make SR Check + if(!MyResistSpell(spell.Caster, spell.Target)) + { + //Set damage effect + + //1d3 of additional damage roughly for every 3 caster levels, but no more than 10d3. + int cMultiplier = GetCasterLevel(OBJECT_SELF) / 3; + if (cMultiplier <= 1) cMultiplier = 1; + if (cMultiplier >= 7) cMultiplier = 7; + int nDamage = MaximizeOrEmpower(3, cMultiplier, spell.Meta); + effect eBad = EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL); + //Apply the VFX impact and damage effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eBad, spell.Target); + } + } +} diff --git a/_removed/x0_s0_ether.ncs b/_removed/x0_s0_ether.ncs new file mode 100644 index 0000000..124ca02 Binary files /dev/null and b/_removed/x0_s0_ether.ncs differ diff --git a/_removed/x0_s0_ether.nss b/_removed/x0_s0_ether.nss new file mode 100644 index 0000000..a1322bd --- /dev/null +++ b/_removed/x0_s0_ether.nss @@ -0,0 +1,57 @@ +//:://///////////////////////////////////////////// +//:: Etherealness +//:: x0_s0_ether.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Like sanctuary except almost always guaranteed + to work. + Lasts one turn per level. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_DUR_SANCTUARY); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eSanc = EffectEthereal(); + + effect eLink = EffectLinkEffects(eVis, eSanc); + eLink = EffectLinkEffects(eLink, eDur); + + int nDuration = GetCasterLevel(spell.Caster); + //Enter Metamagic conditions + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); +} diff --git a/_removed/x0_s0_fleshsto.ncs b/_removed/x0_s0_fleshsto.ncs new file mode 100644 index 0000000..874f703 Binary files /dev/null and b/_removed/x0_s0_fleshsto.ncs differ diff --git a/_removed/x0_s0_fleshsto.nss b/_removed/x0_s0_fleshsto.nss new file mode 100644 index 0000000..487d204 --- /dev/null +++ b/_removed/x0_s0_fleshsto.nss @@ -0,0 +1,45 @@ +//:://///////////////////////////////////////////// +//:: Flesh to Stone +//:: x0_s0_fleshsto +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* +//:: The target freezes in place, standing helpless. +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent Knowles +//:: Created On: October 16, 2002 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + DoPetrification(spell.Level, spell.Caster, spell.Target, spell.Id, spell.DC+40); + } +} diff --git a/_removed/x0_s0_inflict.ncs b/_removed/x0_s0_inflict.ncs new file mode 100644 index 0000000..1bcd80f Binary files /dev/null and b/_removed/x0_s0_inflict.ncs differ diff --git a/_removed/x0_s0_inflict.nss b/_removed/x0_s0_inflict.nss new file mode 100644 index 0000000..e64c32c --- /dev/null +++ b/_removed/x0_s0_inflict.nss @@ -0,0 +1,63 @@ +//:://///////////////////////////////////////////// +//:: [Inflict Wounds] +//:: [X0_S0_Inflict.nss] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +//:: This script is used by all the inflict spells +//:: +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 2002 +//:: Modified: 69MEH69 JUL2003 +//::////////////////////////////////////////////// +//:: VFX Pass By: +#include "X0_I0_SPELLS" // * this is the new spells include for expansion packs + +void main() +{ + int nSpellID = GetSpellId(); + object oTarget = GetSpellTargetObject(); + string sTag = GetTag(oTarget); + object oArea = GetArea(oTarget); + int nCHP = GetLocalInt(oArea, "nCHP" +sTag); + int nCure; + switch (nSpellID) + { +/*Minor*/ case 431: spellsInflictTouchAttack(1, 0, 1, 246, VFX_IMP_HEALING_G, nSpellID); + nCure = 1; + if(GetIsHenchmanDying(oTarget) && GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nCure); + } + break; +/*Light*/ case 432: case 609: spellsInflictTouchAttack(d8(), 5, 8, 246, VFX_IMP_HEALING_G, nSpellID); + nCure = d8(1); + if(GetIsHenchmanDying(oTarget) && GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nCure); + } + break; +/*Moderate*/ case 433: case 610: spellsInflictTouchAttack(d8(2), 10, 16, 246, VFX_IMP_HEALING_G, nSpellID); + nCure = d8(2); + if(GetIsHenchmanDying(oTarget) && GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nCure); + } + break; +/*Serious*/ case 434: case 611: spellsInflictTouchAttack(d8(3), 15, 24, 246, VFX_IMP_HEALING_G, nSpellID); + nCure = d8(3); + if(GetIsHenchmanDying(oTarget) && GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nCure); + } + break; +/*Critical*/ case 435: case 612: spellsInflictTouchAttack(d8(4), 20, 32, 246, VFX_IMP_HEALING_G, nSpellID); + nCure = d8(4); + if(GetIsHenchmanDying(oTarget) && GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) + { + SetLocalInt(oArea, "nCHP" +sTag, nCHP + nCure); + } + break; + + } +} diff --git a/_removed/x0_s0_missstorm1.ncs b/_removed/x0_s0_missstorm1.ncs new file mode 100644 index 0000000..558156f Binary files /dev/null and b/_removed/x0_s0_missstorm1.ncs differ diff --git a/_removed/x0_s0_missstorm1.nss b/_removed/x0_s0_missstorm1.nss new file mode 100644 index 0000000..10975a2 --- /dev/null +++ b/_removed/x0_s0_missstorm1.nss @@ -0,0 +1,211 @@ +//:://///////////////////////////////////////////// +//:: Isaacs Lesser Missile Storm +//:: x0_s0_MissStorm1 +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Up to 10 missiles, each doing 1d6 damage to all + targets in area. +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 31, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +//This version of the spell applies all damage as a cumulated single hit instead of spreading it among all the missiles. +//This has been done because before that the spell used to be useless against any target with 15 magical resistance or more. +void DoMassMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_MAGICAL, int nONEHIT = FALSE, int nReflexSave = FALSE) +{ + if(spell.Caster == OBJECT_INVALID) spellsDeclareMajorVariables();//pre 1.70 spellscripts support + int nCasterLvl = spell.Level; + int i, nSAVETYPE, nCnt = 1; + effect eMissile = EffectVisualEffect(nMIRV); + effect eVis = EffectVisualEffect(nVIS); + float fDist = 0.0; + float fDelay = 0.0; + float fDelay2, fTime; + int nMissiles = nCasterLvl; + + if (nMissiles > nCap) + { + nMissiles = nCap; + } + + /* New Algorithm + 1. Count # of targets + 2. Determine number of missiles + 3. First target gets a missile and all Excess missiles + 4. Rest of targets (max nMissiles) get one missile + */ + int nEnemies = 0; + + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + //Cycle through the targets within the spell shape until an invalid object is captured. + while (GetIsObjectValid(oTarget)) + { + // * caster cannot be harmed by this spell + if (oTarget != spell.Caster && spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, spell.Caster)) + { + // GZ: You can only fire missiles on visible targets + // If the firing object is a placeable (such as a projectile trap), + // we skip the line of sight check as placeables can't "see" things. + if ( ( GetObjectType(spell.Caster) == OBJECT_TYPE_PLACEABLE ) || + GetObjectSeen(oTarget,spell.Caster)) + { + nEnemies++; + } + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + } + + if (nEnemies == 0) return; // * Exit if no enemies to hit + int nExtraMissiles = nMissiles / nEnemies; + + // April 2003 + // * if more enemies than missiles, need to make sure that at least + // * one missile will hit each of the enemies + if (nExtraMissiles <= 0) + { + nExtraMissiles = 1; + } + + switch(nDAMAGETYPE)//1.71: support for custom content missile storm spells with nonstandard damage type + { + case DAMAGE_TYPE_ACID: + nSAVETYPE = SAVING_THROW_TYPE_ACID; + break; + case DAMAGE_TYPE_ELECTRICAL: + nSAVETYPE = SAVING_THROW_TYPE_ELECTRICITY; + break; + case DAMAGE_TYPE_FIRE: + nSAVETYPE = SAVING_THROW_TYPE_FIRE; + break; + case DAMAGE_TYPE_COLD: + nSAVETYPE = SAVING_THROW_TYPE_COLD; + break; + case DAMAGE_TYPE_SONIC: + nSAVETYPE = SAVING_THROW_TYPE_SONIC; + break; + case DAMAGE_TYPE_POSITIVE: + nSAVETYPE = SAVING_THROW_TYPE_POSITIVE; + break; + case DAMAGE_TYPE_NEGATIVE: + nSAVETYPE = SAVING_THROW_TYPE_NEGATIVE; + break; + } + + // by default the Remainder will be 0 (if more than enough enemies for all the missiles) + int nRemainder = 0; + + if (nExtraMissiles >0) + nRemainder = nMissiles % nEnemies; + + if (nEnemies > nMissiles) + nEnemies = nMissiles; + + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + if (nSpell == SPELL_BALL_LIGHTNING)//1.71: ball lightning has a single target area of effect + { + oTarget = spell.Target; + nEnemies = 1; + nExtraMissiles = nMissiles; + nRemainder = 0; + } + //Cycle through the targets within the spell shape until an invalid object is captured. + while (GetIsObjectValid(oTarget) && nCnt <= nEnemies) + { + // * caster cannot be harmed by this spell + if (oTarget != spell.Caster && spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, spell.Caster) && + (GetObjectType(spell.Caster) == OBJECT_TYPE_PLACEABLE || GetObjectSeen(oTarget,spell.Caster))) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, nSpell)); + + // * recalculate appropriate distances + fDist = GetDistanceBetween(spell.Caster, oTarget); + fDelay = fDist/(3.0 * log(fDist) + 2.0); + + // Firebrand. + // It means that once the target has taken damage this round from the + // spell it won't take subsequent damage + if (nONEHIT) + { + nExtraMissiles = 1; + nRemainder = 0; + } + + //-------------------------------------------------------------- + // GZ: Moved SR check out of loop to have 1 check per target + // not one check per missile, which would rip spell mantels + // apart + //-------------------------------------------------------------- + if (!MyResistSpell(spell.Caster, oTarget, fDelay)) + { + nCap = nExtraMissiles + (nRemainder > 0);//1.71: this will distribute remainder missiles evenly amongs all targets + for (i=1; i <= nCap; i++) + { + //Roll damage + int nDam = MaximizeOrEmpower(6,nD6Dice,spell.Meta); + // if reflexsave allowed, make evasion check + if(nReflexSave) + { + nDam = GetReflexAdjustedDamage(nDam, oTarget, spell.DC, nSAVETYPE, spell.Caster); + } + + fDelay2 += 0.1; + fTime = fDelay + fDelay2; + + //Set damage effect + effect eDam = EffectDamage(nDam, nDAMAGETYPE); + //Apply the MIRV and damage effect + DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget)); + DelayCommand(fDelay2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget)); + //do not bother when no damage should happen anyway + SetLocalInt(oTarget, "msldmg", GetLocalInt(oTarget, "msldmg") + nDam ); + if(i == (nExtraMissiles + nRemainder)) + { + effect eDamage = EffectDamage(GetLocalInt(oTarget, "msldmg"), nDAMAGETYPE); + DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget)); + DelayCommand(fTime, SetLocalInt(oTarget, "msldmg", 0)); + } + } + } // for + else + { // * apply a dummy visual effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget); + } + nCnt++;// * increment count of missiles fired + nRemainder--; + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + } +} + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + spellsDeclareMajorVariables(); + //SpawnScriptDebugger(); + DoMassMissileStorm(1, 10, spell.Id); +} diff --git a/_removed/x0_s0_missstorm2.ncs b/_removed/x0_s0_missstorm2.ncs new file mode 100644 index 0000000..472e173 Binary files /dev/null and b/_removed/x0_s0_missstorm2.ncs differ diff --git a/_removed/x0_s0_missstorm2.nss b/_removed/x0_s0_missstorm2.nss new file mode 100644 index 0000000..bceac53 --- /dev/null +++ b/_removed/x0_s0_missstorm2.nss @@ -0,0 +1,211 @@ +//:://///////////////////////////////////////////// +//:: Isaacs Greater Missile Storm +//:: x0_s0_MissStorm2 +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + Up to 20 missiles, each doing 3d6 damage to each + target in area. +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 31, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +//This version of the spell applies all damage as a cumulated single hit instead of spreading it among all the missiles. +//This has been done because before that the spell used to be useless against any target with 15 magical resistance or more. +void DoMassMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_MAGICAL, int nONEHIT = FALSE, int nReflexSave = FALSE) +{ + if(spell.Caster == OBJECT_INVALID) spellsDeclareMajorVariables();//pre 1.70 spellscripts support + int nCasterLvl = spell.Level; + int i, nSAVETYPE, nCnt = 1; + effect eMissile = EffectVisualEffect(nMIRV); + effect eVis = EffectVisualEffect(nVIS); + float fDist = 0.0; + float fDelay = 0.0; + float fDelay2, fTime; + int nMissiles = nCasterLvl; + + if (nMissiles > nCap) + { + nMissiles = nCap; + } + + /* New Algorithm + 1. Count # of targets + 2. Determine number of missiles + 3. First target gets a missile and all Excess missiles + 4. Rest of targets (max nMissiles) get one missile + */ + int nEnemies = 0; + + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + //Cycle through the targets within the spell shape until an invalid object is captured. + while (GetIsObjectValid(oTarget)) + { + // * caster cannot be harmed by this spell + if (oTarget != spell.Caster && spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, spell.Caster)) + { + // GZ: You can only fire missiles on visible targets + // If the firing object is a placeable (such as a projectile trap), + // we skip the line of sight check as placeables can't "see" things. + if ( ( GetObjectType(spell.Caster) == OBJECT_TYPE_PLACEABLE ) || + GetObjectSeen(oTarget,spell.Caster)) + { + nEnemies++; + } + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + } + + if (nEnemies == 0) return; // * Exit if no enemies to hit + int nExtraMissiles = nMissiles / nEnemies; + + // April 2003 + // * if more enemies than missiles, need to make sure that at least + // * one missile will hit each of the enemies + if (nExtraMissiles <= 0) + { + nExtraMissiles = 1; + } + + switch(nDAMAGETYPE)//1.71: support for custom content missile storm spells with nonstandard damage type + { + case DAMAGE_TYPE_ACID: + nSAVETYPE = SAVING_THROW_TYPE_ACID; + break; + case DAMAGE_TYPE_ELECTRICAL: + nSAVETYPE = SAVING_THROW_TYPE_ELECTRICITY; + break; + case DAMAGE_TYPE_FIRE: + nSAVETYPE = SAVING_THROW_TYPE_FIRE; + break; + case DAMAGE_TYPE_COLD: + nSAVETYPE = SAVING_THROW_TYPE_COLD; + break; + case DAMAGE_TYPE_SONIC: + nSAVETYPE = SAVING_THROW_TYPE_SONIC; + break; + case DAMAGE_TYPE_POSITIVE: + nSAVETYPE = SAVING_THROW_TYPE_POSITIVE; + break; + case DAMAGE_TYPE_NEGATIVE: + nSAVETYPE = SAVING_THROW_TYPE_NEGATIVE; + break; + } + + // by default the Remainder will be 0 (if more than enough enemies for all the missiles) + int nRemainder = 0; + + if (nExtraMissiles >0) + nRemainder = nMissiles % nEnemies; + + if (nEnemies > nMissiles) + nEnemies = nMissiles; + + oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + if (nSpell == SPELL_BALL_LIGHTNING)//1.71: ball lightning has a single target area of effect + { + oTarget = spell.Target; + nEnemies = 1; + nExtraMissiles = nMissiles; + nRemainder = 0; + } + //Cycle through the targets within the spell shape until an invalid object is captured. + while (GetIsObjectValid(oTarget) && nCnt <= nEnemies) + { + // * caster cannot be harmed by this spell + if (oTarget != spell.Caster && spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, spell.Caster) && + (GetObjectType(spell.Caster) == OBJECT_TYPE_PLACEABLE || GetObjectSeen(oTarget,spell.Caster))) + { + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, nSpell)); + + // * recalculate appropriate distances + fDist = GetDistanceBetween(spell.Caster, oTarget); + fDelay = fDist/(3.0 * log(fDist) + 2.0); + + // Firebrand. + // It means that once the target has taken damage this round from the + // spell it won't take subsequent damage + if (nONEHIT) + { + nExtraMissiles = 1; + nRemainder = 0; + } + + //-------------------------------------------------------------- + // GZ: Moved SR check out of loop to have 1 check per target + // not one check per missile, which would rip spell mantels + // apart + //-------------------------------------------------------------- + if (!MyResistSpell(spell.Caster, oTarget, fDelay)) + { + nCap = nExtraMissiles + (nRemainder > 0);//1.71: this will distribute remainder missiles evenly amongs all targets + for (i=1; i <= nCap; i++) + { + //Roll damage + int nDam = MaximizeOrEmpower(6,nD6Dice,spell.Meta); + // if reflexsave allowed, make evasion check + if(nReflexSave) + { + nDam = GetReflexAdjustedDamage(nDam, oTarget, spell.DC, nSAVETYPE, spell.Caster); + } + + fDelay2 += 0.1; + fTime = fDelay + fDelay2; + + //Set damage effect + effect eDam = EffectDamage(nDam, nDAMAGETYPE); + //Apply the MIRV and damage effect + DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget)); + DelayCommand(fDelay2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget)); + //do not bother when no damage should happen anyway + SetLocalInt(oTarget, "msldmg", GetLocalInt(oTarget, "msldmg") + nDam ); + if(i == (nExtraMissiles + nRemainder)) + { + effect eDamage = EffectDamage(GetLocalInt(oTarget, "msldmg"), nDAMAGETYPE); + DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget)); + DelayCommand(fTime, SetLocalInt(oTarget, "msldmg", 0)); + } + } + } // for + else + { // * apply a dummy visual effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget); + } + nCnt++;// * increment count of missiles fired + nRemainder--; + } + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, spell.Loc, TRUE, OBJECT_TYPE_CREATURE); + } +} + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + spellsDeclareMajorVariables(); + //SpawnScriptDebugger(); + DoMassMissileStorm(1, 15, spell.Id); +} diff --git a/_removed/x0_s0_quillfire.ncs b/_removed/x0_s0_quillfire.ncs new file mode 100644 index 0000000..4ecfa5d Binary files /dev/null and b/_removed/x0_s0_quillfire.ncs differ diff --git a/_removed/x0_s0_quillfire.nss b/_removed/x0_s0_quillfire.nss new file mode 100644 index 0000000..d190e09 --- /dev/null +++ b/_removed/x0_s0_quillfire.nss @@ -0,0 +1,83 @@ +//:://///////////////////////////////////////////// +//:: Quillfire +//:: [x0_s0_quillfire.nss] +//:: Copyright (c) 2002 Bioware Corp. +//::////////////////////////////////////////////// +/* + Fires a cluster of quills at a target. Ranged Attack. + 2d8 + 1 point /2 levels (max 5) + +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 17 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs May 02, 2003 +/* +Patch 1.71 + +- poison made extraordinary +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables ( fDist / (3.0f * log( fDist ) + 2.0f) ) + spellsDeclareMajorVariables(); + int nCasterLvl = spell.Level; + int nDamage = 0; + int nCnt; + effect eVis = EffectVisualEffect(VFX_IMP_ACID_S); + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Apply a single damage hit for each missile instead of as a single mass + //Make SR Check +// { + // BK: No spell resistance for quillfire + //if(!MyResistSpell(OBJECT_SELF, oTarget, fDelay)) +// { + //eMissile = EffectVisualEffect(VFX_IMP_MIRV_FLAME); + //* apply bonus damage for level + int nBonus = spell.Level / 2; + if (nBonus > 5) + { + nBonus = 5; + } + //Roll damage + int nDam = MaximizeOrEmpower(8,nBonus,spell.Meta,nBonus); + effect eDam = EffectDamage(nDam, DAMAGE_TYPE_MAGICAL); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, spell.Target); + // * also applies poison damage + effect ePoison = EffectPoison(POISON_LARGE_SCORPION_VENOM); + ePoison = ExtraordinaryEffect(ePoison); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoison, spell.Target); + + //Apply the MIRV and damage effect + //ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget); +// } +// } + } +} diff --git a/_removed/x0_s0_spikegroen.ncs b/_removed/x0_s0_spikegroen.ncs new file mode 100644 index 0000000..5bc3814 Binary files /dev/null and b/_removed/x0_s0_spikegroen.ncs differ diff --git a/_removed/x0_s0_spikegroen.nss b/_removed/x0_s0_spikegroen.nss new file mode 100644 index 0000000..c121c41 --- /dev/null +++ b/_removed/x0_s0_spikegroen.nss @@ -0,0 +1,56 @@ +//:://///////////////////////////////////////////// +//:: Spike Growth: On Enter +//:: x0_s0_spikegroEN.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All creatures within the AoE take 1d4 acid damage + per round +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent Knowles +//:: Created On: September 6, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- flying and incorporeal creatures are immune +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + aoesDeclareMajorVariables(); + object oTarget = GetEnteringObject(); + float fDelay = GetRandomDelay(1.0, 2.2); + if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, aoe.Creator)) + { + //Fire cast spell at event for the target + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id)); + //Spell resistance check + if(!spellsIsFlying(oTarget) && !GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) && !MyResistSpell(aoe.Creator, oTarget, fDelay)) + { + int nDam = MaximizeOrEmpower(8, 1, spell.Meta); + + effect eDam = EffectDamage(nDam, DAMAGE_TYPE_PIERCING); + effect eVis = EffectVisualEffect(VFX_IMP_ACID_S); + //Apply damage and visuals + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); + + // * only apply a slow effect from this spell once + if(!GetHasSpellEffect(spell.Id, oTarget)) + { + //Make a Reflex Save to avoid the effects of the movement hit. + if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, spell.DC, SAVING_THROW_TYPE_NONE, aoe.Creator, fDelay)) + { + effect eSpeed = EffectMovementSpeedDecrease(50); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSpeed, oTarget, HoursToSeconds(24)); + } + } + } + } +} diff --git a/_removed/x0_s0_spikegrohb.ncs b/_removed/x0_s0_spikegrohb.ncs new file mode 100644 index 0000000..7407449 Binary files /dev/null and b/_removed/x0_s0_spikegrohb.ncs differ diff --git a/_removed/x0_s0_spikegrohb.nss b/_removed/x0_s0_spikegrohb.nss new file mode 100644 index 0000000..dcf4b7c --- /dev/null +++ b/_removed/x0_s0_spikegrohb.nss @@ -0,0 +1,78 @@ +//:://///////////////////////////////////////////// +//:: Spike Growth: On Heartbeat +//:: x0_s0_spikegroHB.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + All creatures within the AoE take 1d4 acid damage + per round +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent Knowles +//:: Created On: September 6, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- aoe will vanish with caster +- flying and incorporeal creatures are immune +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + aoesDeclareMajorVariables(); + //-------------------------------------------------------------------------- + // When the caster is no longer there, all functions calling + // GetAreaOfEffectCreator will fail. Its better to remove the barrier then + //-------------------------------------------------------------------------- + if(!GetIsObjectValid(aoe.Creator)) + { + DestroyObject(aoe.AOE); + return; + } + + spellsDeclareMajorVariables(); + effect eSpeed = EffectMovementSpeedDecrease(50); + effect eVis = EffectVisualEffect(VFX_IMP_ACID_S); + effect eDam; + float fDelay; + int nDamage; + + //Start cycling through the AOE Object for viable targets including doors and placable objects. + object oTarget = GetFirstInPersistentObject(aoe.AOE); + while(GetIsObjectValid(oTarget)) + { + if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, aoe.Creator)) + { + //Fire cast spell at event for the target + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id)); + fDelay = GetRandomDelay(1.0, 2.2); + //Spell resistance check + if(!spellsIsFlying(oTarget) && !GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) && !MyResistSpell(aoe.Creator, oTarget, fDelay)) + { + nDamage = MaximizeOrEmpower(8, 1, spell.Meta); + eDam = EffectDamage(nDamage, DAMAGE_TYPE_PIERCING); + + //Apply damage and visuals + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); + + // * only apply a slow effect from this spell once + if (!GetHasSpellEffect(spell.Id, oTarget)) + { + //Make a Reflex Save to avoid the effects of the movement hit. + if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, spell.DC, SAVING_THROW_TYPE_NONE, aoe.Creator, fDelay)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSpeed, oTarget, HoursToSeconds(24)); + } + } + } + } + //Get next target. + oTarget = GetNextInPersistentObject(aoe.AOE); + } +} diff --git a/_removed/x0_s0_woundwhis.ncs b/_removed/x0_s0_woundwhis.ncs new file mode 100644 index 0000000..3c3c993 Binary files /dev/null and b/_removed/x0_s0_woundwhis.ncs differ diff --git a/_removed/x0_s0_woundwhis.nss b/_removed/x0_s0_woundwhis.nss new file mode 100644 index 0000000..dcf1aff --- /dev/null +++ b/_removed/x0_s0_woundwhis.nss @@ -0,0 +1,74 @@ +//:://///////////////////////////////////////////// +//:: Wounding Whispers +//:: x0_s0_WoundWhis.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Magical whispers cause 1d8 sonic damage to attackers who hit you. + Made the damage slightly more than the book says because we cannot + do the +1 per level. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//::////////////////////////////////////////////// +//:: Modified for wounding whispers, July 30 2002, Brent +//::////////////////////////////////////////////// +//:: Last Update By: Andrew Nobbs May 01, 2003 +/* +Patch 1.70 + +- damage wasn't random +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE); + int nDuration = spell.Level; + int nBonus = spell.Level/2; + effect eShield = EffectDamageShield(nBonus, DAMAGE_BONUS_1d6, DAMAGE_TYPE_SONIC); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + + //Link effects + effect eLink = EffectLinkEffects(eShield, eDur); + eLink = EffectLinkEffects(eLink, eVis); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + if (GetHasSpellEffect(spell.Id, spell.Target)) + { + RemoveEffectsFromSpell(spell.Target,spell.Id);//the old function would allow stacking after changes i have done + } + + //Enter Metamagic conditions + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); +} diff --git a/_removed/x0_s1_petrbreath.ncs b/_removed/x0_s1_petrbreath.ncs new file mode 100644 index 0000000..8ae390c Binary files /dev/null and b/_removed/x0_s1_petrbreath.ncs differ diff --git a/_removed/x0_s1_petrbreath.nss b/_removed/x0_s1_petrbreath.nss new file mode 100644 index 0000000..8455ee0 --- /dev/null +++ b/_removed/x0_s1_petrbreath.nss @@ -0,0 +1,36 @@ +//:://///////////////////////////////////////////////// +//:: X0_S1_PETRBREATH +//:: Petrification breath monster ability. +//:: Fortitude save (DC 17) or be turned to stone permanently. +//:: This will be changed to a temporary effect. +//:: Copyright (c) 2002 Floodgate Entertainment +//:: Created By: Naomi Novik +//:: Created On: 11/14/2002 +//:://///////////////////////////////////////////////// + +#include "x0_i0_spells" + +void main() +{ + object oTarget = GetSpellTargetObject(); + int nHitDice = GetHitDice(OBJECT_SELF); + + location lTargetLocation = GetSpellTargetLocation(); + + //Get first target in spell area + oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 11.0, lTargetLocation, TRUE); + while(GetIsObjectValid(oTarget)) + { + if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + int nSpellID = GetSpellId(); + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID)); + float fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + + object oSelf = OBJECT_SELF; + DelayCommand(fDelay, DoPetrification(nHitDice, oSelf, oTarget, nSpellID, 17)); + } + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 11.0, lTargetLocation, TRUE); + } +} diff --git a/_removed/x0_s1_petrgaze.ncs b/_removed/x0_s1_petrgaze.ncs new file mode 100644 index 0000000..0eec807 Binary files /dev/null and b/_removed/x0_s1_petrgaze.ncs differ diff --git a/_removed/x0_s1_petrgaze.nss b/_removed/x0_s1_petrgaze.nss new file mode 100644 index 0000000..a47d221 --- /dev/null +++ b/_removed/x0_s1_petrgaze.nss @@ -0,0 +1,52 @@ +//:://///////////////////////////////////////////////// +//:: X0_S1_PETRGAZE +//:: Petrification gaze monster ability. +//:: Fortitude save (DC 15) or be turned to stone permanently. +//:: This will be changed to a temporary effect. +//:: Copyright (c) 2002 Floodgate Entertainment +//:: Created By: Naomi Novik +//:: Created On: 11/14/2002 +//:://///////////////////////////////////////////////// +//:: Used by Basilisk +/* +Patch 1.70, fix by Shadoow + +- was missing blinded check +*/ + +#include "x2_i0_spells" + +void main() +{ + //-------------------------------------------------------------------------- + // Make sure we are not blind + //-------------------------------------------------------------------------- + if( GZCanNotUseGazeAttackCheck(OBJECT_SELF)) + { + return; + } + + object oTarget = GetSpellTargetObject(); + int nHitDice = GetHitDice(OBJECT_SELF); + + + location lTargetLocation = GetSpellTargetLocation(); + + //Get first target in spell area + oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 11.0, lTargetLocation, TRUE); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) + { + int nSpellID = GetSpellId(); + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID)); + float fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + + object oSelf = OBJECT_SELF; + DelayCommand(fDelay, DoPetrification(nHitDice, oSelf, oTarget, nSpellID, 13)); + } + + //Get next target in spell area + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 11.0, lTargetLocation, TRUE); + } +} diff --git a/_removed/x0_s1_petrtouch.ncs b/_removed/x0_s1_petrtouch.ncs new file mode 100644 index 0000000..392a558 Binary files /dev/null and b/_removed/x0_s1_petrtouch.ncs differ diff --git a/_removed/x0_s1_petrtouch.nss b/_removed/x0_s1_petrtouch.nss new file mode 100644 index 0000000..36767ec --- /dev/null +++ b/_removed/x0_s1_petrtouch.nss @@ -0,0 +1,29 @@ +//:://///////////////////////////////////////////////// +//:: X0_S1_PETRGAZE +//:: Petrification touch attack monster ability. +//:: Fortitude save (DC 15) or be turned to stone permanently. +//:: Copyright (c) 2002 Floodgate Entertainment +//:: Created By: Naomi Novik +//:: Created On: 11/14/2002 +//:://///////////////////////////////////////////////// +/* +Patch 1.70, fix by Shadooow + +- duration corrected (was target's HD instead of caster's) +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" + +void main() +{ + object oTarget = GetSpellTargetObject(); + int nHitDice = GetHitDice(OBJECT_SELF); + + if(spellsIsTarget(oTarget, SPELL_TARGET_SINGLETARGET, OBJECT_SELF)) + { + int nSpellID = GetSpellId(); + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID)); + DoPetrification(nHitDice, OBJECT_SELF, oTarget, nSpellID, 15); + } +} diff --git a/_removed/x0_s2_blkdead.ncs b/_removed/x0_s2_blkdead.ncs new file mode 100644 index 0000000..e702bdf Binary files /dev/null and b/_removed/x0_s2_blkdead.ncs differ diff --git a/_removed/x0_s2_blkdead.nss b/_removed/x0_s2_blkdead.nss new file mode 100644 index 0000000..eab66ed --- /dev/null +++ b/_removed/x0_s2_blkdead.nss @@ -0,0 +1,33 @@ +//:://///////////////////////////////////////////// +//:: x0_s2_blkdead +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Level 3 - 6: Summons Ghast + Level 7 - 10: Doom Knight +*/ +//::////////////////////////////////////////////// +//:: Created By: +//:: Created On: +//::////////////////////////////////////////////// + +void main() +{ + + + + + int nLevel = GetLevelByClass(CLASS_TYPE_BLACKGUARD, OBJECT_SELF); + effect eSummon; + float fDelay = 3.0; + int nDuration = nLevel; + if (nLevel >= 21) + eSummon = EffectSummonCreature("NW_S_DOOMKGHT2",VFX_FNF_SUMMON_UNDEAD); + else if (nLevel >= 7) + eSummon = EffectSummonCreature("NW_S_DOOMKGHT",VFX_FNF_SUMMON_UNDEAD); + else + eSummon = EffectSummonCreature("NW_S_GHAST",VFX_FNF_SUMMON_UNDEAD); + + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration)); + +} diff --git a/_removed/x1_s2_deatharrow.ncs b/_removed/x1_s2_deatharrow.ncs new file mode 100644 index 0000000..af0ba05 Binary files /dev/null and b/_removed/x1_s2_deatharrow.ncs differ diff --git a/_removed/x1_s2_deatharrow.nss b/_removed/x1_s2_deatharrow.nss new file mode 100644 index 0000000..ecd6eda --- /dev/null +++ b/_removed/x1_s2_deatharrow.nss @@ -0,0 +1,70 @@ +//:://///////////////////////////////////////////// +//:: x1_s2_deatharrow +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Seeker Arrow + - creates an arrow that automatically hits target. + - At level 4 the arrow does +2 magic damage + - at level 5 the arrow does +3 magic damage + + - normal arrow damage, based on base item type + + - Must have shortbow or longbow in hand. +*/ +//::////////////////////////////////////////////// +//:: Created By: +//:: Created On: +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- critical hit damage corrected (damage was always even before) +- added death VFX +- signal event placed before hit check, so it now removes GS/invis every time +*/ + +#include "x0_i0_spells" +#include "x2_inc_itemprop" + +void main() +{ + int nBonus = ArcaneArcherCalculateBonus(); + object oTarget = GetSpellTargetObject(); + + if (GetIsObjectValid(oTarget)) + { + // * Roll Touch Attack + int nTouch = TouchAttackRanged(oTarget, TRUE); + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId())); + + if (nTouch > 0) + { + int nDamage = ArcaneArcherDamageDoneByBow(nTouch == 2); + if (nDamage > 0) + { + effect ePhysical = EffectDamage(nDamage, DAMAGE_TYPE_PIERCING,IPGetDamagePowerConstantFromNumber(nBonus)); + effect eMagic = EffectDamage(nBonus, DAMAGE_TYPE_MAGICAL); + ApplyEffectToObject(DURATION_TYPE_INSTANT, ePhysical, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eMagic, oTarget); + + int nSaveType = SAVING_THROW_TYPE_NONE; + if(GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH, OBJECT_SELF)) + { + nSaveType = SAVING_THROW_TYPE_DEATH;//workaround for action cancel bug without changing save type + } + // * if target fails a save DC20 they die + int nDC = GetCasterLevel(OBJECT_SELF)+10; + if (!MySavingThrow(SAVING_THROW_FORT, oTarget, nDC, nSaveType)) + { + effect eDeath = EffectDeath(); + effect eVis = EffectVisualEffect(VFX_IMP_DEATH); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget); + } + } + } + } +} diff --git a/_removed/x2_inc_craft.nss b/_removed/x2_inc_craft.nss new file mode 100644 index 0000000..ee53e44 --- /dev/null +++ b/_removed/x2_inc_craft.nss @@ -0,0 +1,1439 @@ +//:://///////////////////////////////////////////// +//:: x2_inc_craft +//:: Copyright (c) 2003 Bioare Corp. +//::////////////////////////////////////////////// +/* + + Central include for crafting feat and + crafting skill system. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: 2003-05-09 +//:: Last Updated On: 2003-10-14 +//::////////////////////////////////////////////// +#include "x2_inc_itemprop" +#include "x2_inc_switches" + +struct craft_struct +{ + int nRow; + string sResRef; + int nDC; + int nCost; + string sLabel; +}; + +struct craft_receipe_struct +{ + int nMode; + object oMajor; + object oMinor; +}; + +const string X2_CI_CRAFTSKILL_CONV ="x2_p_craftskills"; + +// Brew Potion related Constants + +const int X2_CI_BREWPOTION_FEAT_ID = 944; // Brew Potion feat simulation +const int X2_CI_BREWPOTION_MAXLEVEL = 9; // Max Level for potions +const int X2_CI_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier + +const string X2_CI_BREWPOTION_NEWITEM_RESREF = "x2_it_pcpotion"; // ResRef for new potion item + +// Scribe Scroll related constants +const int X2_CI_SCRIBESCROLL_FEAT_ID = 945; +const int X2_CI_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier +const string X2_CI_SCRIBESCROLL_NEWITEM_RESREF = "x2_it_pcscroll"; // ResRef for new scroll item + +// Craft Wand related constants +const int X2_CI_CRAFTWAND_FEAT_ID = 946; +const int X2_CI_CRAFTWAND_MAXLEVEL = 9; +const int X2_CI_CRAFTWAND_COSTMODIFIER = 750; +const string X2_CI_CRAFTWAND_NEWITEM_RESREF = "x2_it_pcwand"; + +// 2da for the craftskills +const string X2_CI_CRAFTING_WP_2DA = "des_crft_weapon" ; +const string X2_CI_CRAFTING_AR_2DA = "des_crft_armor" ; +const string X2_CI_CRAFTING_MAT_2DA = "des_crft_mat"; + + +// 2da for matching spells to properties +const string X2_CI_CRAFTING_SP_2DA = "des_crft_spells" ; +// Base custom token for item modification conversations (do not change unless you want to change the conversation too) +const int X2_CI_CRAFTINGSKILL_CTOKENBASE = 13220; + +// Base custom token for DC item modification conversations (do not change unless you want to change the conversation too) +const int X2_CI_CRAFTINGSKILL_DC_CTOKENBASE = 14220; + +// Base custom token for DC item modification conversations (do not change unless you want to change the conversation too) +const int X2_CI_CRAFTINGSKILL_GP_CTOKENBASE = 14320; + +// Base custom token for DC item modification conversations (do not change unless you want to change the conversation too) +const int X2_CI_MODIFYARMOR_GP_CTOKENBASE = 14420; + +//How many items per 2da row in X2_IP_CRAFTING_2DA, do not change>4 until you want to create more conversation condition scripts as well +const int X2_CI_CRAFTING_ITEMS_PER_ROW = 5; + +// name of the scroll 2da +const string X2_CI_2DA_SCROLLS = "des_crft_scroll"; + +const int X2_CI_CRAFTMODE_INVALID = 0; +const int X2_CI_CRAFTMODE_CONTAINER = 1; // no longer used, but left in for the community to reactivate +const int X2_CI_CRAFTMODE_BASE_ITEM = 2; +const int X2_CI_CRAFTMODE_ASSEMBLE = 3; + +const int X2_CI_MAGICTYPE_INVALID = 0; +const int X2_CI_MAGICTYPE_ARCANE = 1; +const int X2_CI_MAGICTYPE_DIVINE = 2; + +const int X2_CI_MODMODE_INVALID = 0; +const int X2_CI_MODMODE_ARMOR = 1; +const int X2_CI_MODMODE_WEAPON = 2; + +// * Returns TRUE if an item is a Craft Base Item +// * to be used in spellscript that can be cast on items - i.e light +int CIGetIsCraftFeatBaseItem( object oItem ); + +// * Checks if the last spell cast was used to brew potion and will do the brewing process. +// * Returns TRUE if the spell was indeed used to brew a potion (regardless of the actual outcome of the brewing process) +// * Meant to be used in spellscripts only +int CICraftCheckBrewPotion(object oSpellTarget, object oCaster); + +// * Checks if the last spell cast was used to scribe a scroll and handles the scribe scroll process +// * Returns TRUE if the spell was indeed used to scribe a scroll (regardless of the actual outcome) +// * Meant to be used in spellscripts only +int CICraftCheckScribeScroll(object oSpellTarget, object oCaster); + +// * Create a new potion item based on the spell nSpellID on the creator +object CICraftBrewPotion(object oCreator, int nSpellID ); + +// * Create a new scroll item based on the spell nSpellID on the creator +object CICraftScribeScroll(object oCreator, int nSpellID); + + +// * Checks if the caster intends to use his item creation feats and +// * calls appropriate item creation subroutine if conditions are met (spell cast on correct item, etc). +// * Returns TRUE if the spell was used for an item creation feat +int CIGetSpellWasUsedForItemCreation(object oSpellTarget); + + +// * Returns the innate level of a spell. If bDefaultZeroToOne is given +// * Level 0 spell will be returned as level 1 spells +int CIGetSpellInnateLevel(int nSpellID, int bDefaultZeroToOne = FALSE) +{ + int nRet = StringToInt(Get2DAString(X2_CI_CRAFTING_SP_2DA, "Level", nSpellID)); + if (nRet == 0) + nRet =1; + + return nRet; +} + +// * Makes oPC do a Craft check using nSkill to create the item supplied in sResRe +// * If oContainer is specified, the item will be created there. +// * Throwing weapons are created with stack sizes of 10, ammo with 20 +// * oPC - The player crafting +// * nSkill - SKILL_CRAFT_WEAPON or SKILL_CRAFT_ARMOR, +// * sResRef - ResRef of the item to be crafted +// * nDC - DC to beat to succeed +// * oContainer - if a container is specified, create item inside +object CIUseCraftItemSkill(object oPC, int nSkill, string sResRef, int nDC, object oContainer = OBJECT_INVALID); + +// * Returns TRUE if a spell is prevented from being used with one of the crafting feats +int CIGetIsSpellRestrictedFromCraftFeat(int nSpellID, int nFeatID); + +// * Return craftitemstructdata +struct craft_struct CIGetCraftItemStructFrom2DA(string s2DA, int nRow, int nItemNo); + +// * Return the type of magic as one of the following constants +// * const int X2_CI_MAGICTYPE_INVALID = 0; +// * const int X2_CI_MAGICTYPE_ARCANE = 1; +// * const int X2_CI_MAGICTYPE_DIVINE = 2; +// * Parameters: +// * nClass - CLASS_TYPE_* constant +int CI_GetClassMagicType(int nClass) +{ + switch (nClass) + { + case CLASS_TYPE_CLERIC: + return X2_CI_MAGICTYPE_DIVINE; break; + case CLASS_TYPE_DRUID: + return X2_CI_MAGICTYPE_DIVINE; break; + case CLASS_TYPE_PALADIN: + return X2_CI_MAGICTYPE_DIVINE; break; + case CLASS_TYPE_BARD: + return X2_CI_MAGICTYPE_ARCANE; break; + case CLASS_TYPE_SORCERER: + return X2_CI_MAGICTYPE_ARCANE; break; + case CLASS_TYPE_WIZARD: + return X2_CI_MAGICTYPE_ARCANE; break; + case CLASS_TYPE_RANGER: + return X2_CI_MAGICTYPE_DIVINE; break; + } + return X2_CI_MAGICTYPE_INVALID; +} + +string GetMaterialComponentTag(int nPropID) +{ + string sRet = Get2DAString("des_matcomp","comp_tag",nPropID); + return sRet; +} + + +// ----------------------------------------------------------------------------- +// Return true if oItem is a crafting target item +// ----------------------------------------------------------------------------- +int CIGetIsCraftFeatBaseItem(object oItem) +{ + int nBt = GetBaseItemType(oItem); + // blank scroll, empty potion, wand + if (nBt == 101 || nBt == 102 || nBt == 103) + return TRUE; + else + return FALSE; +} + + +// ----------------------------------------------------------------------------- +// Georg, 2003-06-12 +// Create a new playermade potion object with properties matching nSpellID and return it +// ----------------------------------------------------------------------------- +object CICraftBrewPotion(object oCreator, int nSpellID ) +{ + + int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellID); + + object oTarget; + // * GZ 2003-09-11: If the current spell cast is not acid fog, and + // * returned property ID is 0, bail out to prevent + // * creation of acid fog items. + if (nPropID == 0 && nSpellID != 0) + { + FloatingTextStrRefOnCreature(84544,oCreator); + return OBJECT_INVALID; + } + + if (nPropID != -1) + { + itemproperty ipProp = ItemPropertyCastSpell(nPropID,IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE); + oTarget = CreateItemOnObject(X2_CI_BREWPOTION_NEWITEM_RESREF,oCreator); + AddItemProperty(DURATION_TYPE_PERMANENT,ipProp,oTarget); + } + return oTarget; +} + +// ----------------------------------------------------------------------------- +// Wrapper for the crafting cost calculation, returns GP required +// ----------------------------------------------------------------------------- +int CIGetCraftGPCost(int nLevel, int nMod) +{ + int nLvlRow = IPGetIPConstCastSpellFromSpellID(GetSpellId()); + int nCLevel = StringToInt(Get2DAString("irpr_spells","CasterLvl",nLvlRow)); + + // ------------------------------------------------------------------------- + // in case we don't get a valid CLevel, use spell level instead + // ------------------------------------------------------------------------- + if (nCLevel ==0) + { + nCLevel = nLevel; + } + int nRet = nCLevel * nLevel * nMod; + return nRet; + +} + +// ----------------------------------------------------------------------------- +// Georg, 2003-06-12 +// Create a new playermade wand object with properties matching nSpellID +// and return it +// ----------------------------------------------------------------------------- +object CICraftCraftWand(object oCreator, int nSpellID ) +{ + int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellID); + + object oTarget; + // * GZ 2003-09-11: If the current spell cast is not acid fog, and + // * returned property ID is 0, bail out to prevent + // * creation of acid fog items. + if (nPropID == 0 && nSpellID != 0) + { + FloatingTextStrRefOnCreature(84544,oCreator); + return OBJECT_INVALID; + } + + + if (nPropID != -1) + { + itemproperty ipProp = ItemPropertyCastSpell(nPropID,IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE); + oTarget = CreateItemOnObject(X2_CI_CRAFTWAND_NEWITEM_RESREF,oCreator); + AddItemProperty(DURATION_TYPE_PERMANENT,ipProp,oTarget); + + + int nType = CI_GetClassMagicType(GetLastSpellCastClass()); + itemproperty ipLimit; + + if (nType == X2_CI_MAGICTYPE_DIVINE) + { + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_PALADIN); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_RANGER); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_DRUID); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_CLERIC); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + } + else if (nType == X2_CI_MAGICTYPE_ARCANE) + { + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_WIZARD); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_SORCERER); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + ipLimit = ItemPropertyLimitUseByClass(CLASS_TYPE_BARD); + AddItemProperty(DURATION_TYPE_PERMANENT,ipLimit,oTarget); + } + + int nCharges = GetLevelByClass(GetLastSpellCastClass(),OBJECT_SELF) + d10(); + + if (nCharges == 0) // stupi cheaters + { + nCharges = 10+d20(); + } + // Hard core rule mode enabled + if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_CRAFT_WAND_50_CHARGES)) + { + SetItemCharges(oTarget,50); + } + else + { + SetItemCharges(oTarget,nCharges); + } + // TODOL Add use restrictions there when item becomes available + } + return oTarget; +} + +// ----------------------------------------------------------------------------- +// Georg, 2003-06-12 +// Create and Return a magic wand with an item property +// matching nSpellID. Charges are set to d20 + casterlevel +// capped at 50 max +// ----------------------------------------------------------------------------- +object CICraftScribeScroll(object oCreator, int nSpellID) +{ + int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellID); + object oTarget; + // Handle optional material components + string sMat = GetMaterialComponentTag(nPropID); + if (sMat != "") + { + object oMat = GetItemPossessedBy(oCreator,sMat); + if (oMat== OBJECT_INVALID) + { + FloatingTextStrRefOnCreature(83374, oCreator); // Missing material component + return OBJECT_INVALID; + } + else + { + DestroyObject (oMat); + } + } + + // get scroll resref from scrolls lookup 2da + int nClass =GetLastSpellCastClass (); + string sClass = "Wiz_Sorc"; + switch (nClass) + { + case CLASS_TYPE_WIZARD: + sClass = "Wiz_Sorc"; + break; + + case CLASS_TYPE_SORCERER: + sClass = "Wiz_Sorc"; + break; + case CLASS_TYPE_CLERIC: + sClass = "Cleric"; + break; + case CLASS_TYPE_PALADIN: + sClass = "Paladin"; + break; + case CLASS_TYPE_DRUID: + sClass = "Druid"; + break; + case CLASS_TYPE_RANGER: + sClass = "Ranger"; + break; + case CLASS_TYPE_BARD: + sClass = "Bard"; + break; + } + + if (sClass != "") + { + string sResRef = Get2DAString(X2_CI_2DA_SCROLLS,sClass,nSpellID); + if (sResRef != "") + { + oTarget = CreateItemOnObject(sResRef,oCreator); + } + + if (oTarget == OBJECT_INVALID) + { + WriteTimestampedLogEntry("x2_inc_craft::CICraftScribeScroll failed - Resref: " + sResRef + " Class: " + sClass + "(" +IntToString(nClass) +") " + " SpellID " + IntToString (nSpellID)); + } + } + return oTarget; +} + +// ----------------------------------------------------------------------------- +// Returns TRUE if the player used the last spell to brew a potion +// ----------------------------------------------------------------------------- +int CICraftCheckBrewPotion(object oSpellTarget, object oCaster) +{ + + object oSpellTarget = GetSpellTargetObject(); + object oCaster = OBJECT_SELF; + int nID = GetSpellId(); + int nLevel = CIGetSpellInnateLevel(nID,TRUE); + + // ------------------------------------------------------------------------- + // check if brew potion feat is there + // ------------------------------------------------------------------------- + if (GetHasFeat(X2_CI_BREWPOTION_FEAT_ID, oCaster) != TRUE) + { + FloatingTextStrRefOnCreature(40487, oCaster); // Item Creation Failed - Don't know how to create that type of item + return TRUE; + } + + // ------------------------------------------------------------------------- + // check if spell is below maxlevel for brew potions + // ------------------------------------------------------------------------- + if (nLevel > X2_CI_BREWPOTION_MAXLEVEL) + { + FloatingTextStrRefOnCreature(76416, oCaster); + return TRUE; + } + + // ------------------------------------------------------------------------- + // Check if the spell is allowed to be used with Brew Potions + // ------------------------------------------------------------------------- + if (CIGetIsSpellRestrictedFromCraftFeat(nID, X2_CI_BREWPOTION_FEAT_ID)) + { + FloatingTextStrRefOnCreature(83450, oCaster); + return TRUE; + } + + // ------------------------------------------------------------------------- + // XP/GP Cost Calculation + // ------------------------------------------------------------------------- + int nCost = CIGetCraftGPCost(nLevel, X2_CI_BREWPOTION_COSTMODIFIER); + float nExperienceCost = 0.04 * nCost; // xp = 1/25 of gp value + int nGoldCost = nCost ; + + // ------------------------------------------------------------------------- + // Does Player have enough gold? + // ------------------------------------------------------------------------- + if (GetGold(oCaster) < nGoldCost) + { + FloatingTextStrRefOnCreature(3786, oCaster); // Item Creation Failed - not enough gold! + return TRUE; + } + + int nHD = GetHitDice(oCaster); + int nMinXPForLevel = ((nHD * (nHD - 1)) / 2) * 1000; + int nNewXP = FloatToInt(GetXP(oCaster) - nExperienceCost); + + + // ------------------------------------------------------------------------- + // check for sufficient XP to cast spell + // ------------------------------------------------------------------------- + if (nMinXPForLevel > nNewXP || nNewXP == 0 ) + { + FloatingTextStrRefOnCreature(3785, oCaster); // Item Creation Failed - Not enough XP + return TRUE; + } + + // ------------------------------------------------------------------------- + // Here we brew the new potion + // ------------------------------------------------------------------------- + object oPotion = CICraftBrewPotion(oCaster, nID); + + // ------------------------------------------------------------------------- + // Verify Results + // ------------------------------------------------------------------------- + if (GetIsObjectValid(oPotion)) + { + TakeGoldFromCreature(nGoldCost, oCaster, TRUE); + SetXP(oCaster, nNewXP); + DestroyObject (oSpellTarget); + FloatingTextStrRefOnCreature(8502, oCaster); // Item Creation successful + return TRUE; + } + else + { + FloatingTextStrRefOnCreature(76417, oCaster); // Item Creation Failed + return TRUE; + } + +} + + + +// ----------------------------------------------------------------------------- +// Returns TRUE if the player used the last spell to create a scroll +// ----------------------------------------------------------------------------- +int CICraftCheckScribeScroll(object oSpellTarget, object oCaster) +{ + int nID = GetSpellId(); + + // ------------------------------------------------------------------------- + // check if scribe scroll feat is there + // ------------------------------------------------------------------------- + if (GetHasFeat(X2_CI_SCRIBESCROLL_FEAT_ID, oCaster) != TRUE) + { + FloatingTextStrRefOnCreature(40487, oCaster); // Item Creation Failed - Don't know how to create that type of item + return TRUE; + } + + // ------------------------------------------------------------------------- + // Check if the spell is allowed to be used with Scribe Scroll + // ------------------------------------------------------------------------- + if (CIGetIsSpellRestrictedFromCraftFeat(nID, X2_CI_SCRIBESCROLL_FEAT_ID)) + { + FloatingTextStrRefOnCreature(83451, oCaster); // can not be used with this feat + return TRUE; + } + + // ------------------------------------------------------------------------- + // XP/GP Cost Calculation + // ------------------------------------------------------------------------- + int nLevel = CIGetSpellInnateLevel(nID,TRUE); + int nCost = CIGetCraftGPCost(nLevel, X2_CI_SCRIBESCROLL_COSTMODIFIER); + float fExperienceCost = 0.04 * nCost; + int nGoldCost = nCost ; + + // ------------------------------------------------------------------------- + // Does Player have enough gold? + // ------------------------------------------------------------------------- + if (GetGold(oCaster) < nGoldCost) // enough gold? + { + FloatingTextStrRefOnCreature(3786, oCaster); // Item Creation Failed - not enough gold! + return TRUE; + } + + int nHD = GetHitDice(oCaster); + int nMinXPForLevel = ((nHD * (nHD - 1)) / 2) * 1000; + int nNewXP = FloatToInt(GetXP(oCaster) - fExperienceCost); + + // ------------------------------------------------------------------------- + // check for sufficient XP to cast spell + // ------------------------------------------------------------------------- + if (nMinXPForLevel > nNewXP || nNewXP == 0 ) + { + FloatingTextStrRefOnCreature(3785, oCaster); // Item Creation Failed - Not enough XP + return TRUE; + } + + // ------------------------------------------------------------------------- + // Here we scribe the scroll + // ------------------------------------------------------------------------- + object oScroll = CICraftScribeScroll(oCaster, nID); + + // ------------------------------------------------------------------------- + // Verify Results + // ------------------------------------------------------------------------- + if (GetIsObjectValid(oScroll)) + { + //---------------------------------------------------------------------- + // Some scrollsare ar not identified ... fix that here + //---------------------------------------------------------------------- + SetIdentified(oScroll,TRUE); + ActionPlayAnimation (ANIMATION_FIREFORGET_READ,1.0); + TakeGoldFromCreature(nGoldCost, oCaster, TRUE); + SetXP(oCaster, nNewXP); + DestroyObject (oSpellTarget); + FloatingTextStrRefOnCreature(8502, oCaster); // Item Creation successful + return TRUE; + } + else + { + FloatingTextStrRefOnCreature(76417, oCaster); // Item Creation Failed + return TRUE; + } + + return FALSE; +} + + +// ----------------------------------------------------------------------------- +// Returns TRUE if the player used the last spell to craft a wand +// ----------------------------------------------------------------------------- +int CICraftCheckCraftWand(object oSpellTarget, object oCaster) +{ + + int nID = GetSpellId(); + + // ------------------------------------------------------------------------- + // check if craft wand feat is there + // ------------------------------------------------------------------------- + if (GetHasFeat(X2_CI_CRAFTWAND_FEAT_ID, oCaster) != TRUE) + { + FloatingTextStrRefOnCreature(40487, oCaster); // Item Creation Failed - Don't know how to create that type of item + return TRUE; // tried item creation but do not know how to do it + } + + // ------------------------------------------------------------------------- + // Check if the spell is allowed to be used with Craft Wand + // ------------------------------------------------------------------------- + if (CIGetIsSpellRestrictedFromCraftFeat(nID, X2_CI_CRAFTWAND_FEAT_ID)) + { + FloatingTextStrRefOnCreature(83452, oCaster); // can not be used with this feat + return TRUE; + } + + int nLevel = CIGetSpellInnateLevel(nID,TRUE); + + // ------------------------------------------------------------------------- + // check if spell is below maxlevel for brew potions + // ------------------------------------------------------------------------- + if (nLevel > X2_CI_CRAFTWAND_MAXLEVEL) + { + FloatingTextStrRefOnCreature(83623, oCaster); + return TRUE; + } + + // ------------------------------------------------------------------------- + // XP/GP Cost Calculation + // ------------------------------------------------------------------------- + int nCost = CIGetCraftGPCost( nLevel, X2_CI_CRAFTWAND_COSTMODIFIER); + float nExperienceCost = 0.04 * nCost; + int nGoldCost = nCost; + + // ------------------------------------------------------------------------- + // Does Player have enough gold? + // ------------------------------------------------------------------------- + if (GetGold(oCaster) < nGoldCost) // enough gold? + { + FloatingTextStrRefOnCreature(3786, oCaster); // Item Creation Failed - not enough gold! + return TRUE; + } + + // more calculations on XP cost + int nHD = GetHitDice(oCaster); + int nMinXPForLevel = ((nHD * (nHD - 1)) / 2) * 1000; + int nNewXP = FloatToInt(GetXP(oCaster) - nExperienceCost); + + // ------------------------------------------------------------------------- + // check for sufficient XP to cast spell + // ------------------------------------------------------------------------- + if (nMinXPForLevel > nNewXP || nNewXP == 0 ) + { + FloatingTextStrRefOnCreature(3785, oCaster); // Item Creation Failed - Not enough XP + return TRUE; + } + + // ------------------------------------------------------------------------- + // Here we craft the wand + // ------------------------------------------------------------------------- + object oWand = CICraftCraftWand(oCaster, nID); + + // ------------------------------------------------------------------------- + // Verify Results + // ------------------------------------------------------------------------- + if (GetIsObjectValid(oWand)) + { + TakeGoldFromCreature(nGoldCost, oCaster, TRUE); + SetXP(oCaster, nNewXP); + DestroyObject (oSpellTarget); + FloatingTextStrRefOnCreature(8502, oCaster); // Item Creation successful + return TRUE; + } + else + { + FloatingTextStrRefOnCreature(76417, oCaster); // Item Creation Failed + return TRUE; + } + + return FALSE; +} + +// ----------------------------------------------------------------------------- +// Georg, July 2003 +// Checks if the caster intends to use his item creation feats and +// calls appropriate item creation subroutine if conditions are met +// (spell cast on correct item, etc). +// Returns TRUE if the spell was used for an item creation feat +// ----------------------------------------------------------------------------- +int CIGetSpellWasUsedForItemCreation(object oSpellTarget) +{ + object oCaster = OBJECT_SELF; + + // ------------------------------------------------------------------------- + // Spell cast on crafting base item (blank scroll, etc) ? + // ------------------------------------------------------------------------- + if (!CIGetIsCraftFeatBaseItem(oSpellTarget)) + { + return FALSE; // not blank scroll baseitem + } + else + { + // --------------------------------------------------------------------- + // Check Item Creation Feats were disabled through x2_inc_switches + // --------------------------------------------------------------------- + if (GetModuleSwitchValue(MODULE_SWITCH_DISABLE_ITEM_CREATION_FEATS) == TRUE) + { + FloatingTextStrRefOnCreature(83612, oCaster); // item creation disabled + return FALSE; + } + + // --------------------------------------------------------------------- + // Ensure that item creation does not work one item was cast on another + // --------------------------------------------------------------------- + if (GetSpellCastItem() != OBJECT_INVALID) + { + FloatingTextStrRefOnCreature(83373, oCaster); // can not use one item to enchant another + return TRUE; + } + + // --------------------------------------------------------------------- + // Ok, what kind of feat the user wants to use by examining the base itm + // --------------------------------------------------------------------- + int nBt = GetBaseItemType(oSpellTarget); + int nRet = FALSE; + switch (nBt) + { + case 101 : + // ------------------------------------------------- + // Brew Potion + // ------------------------------------------------- + nRet = CICraftCheckBrewPotion(oSpellTarget,oCaster); + break; + + + case 102 : + // ------------------------------------------------- + // Scribe Scroll + // ------------------------------------------------- + nRet = CICraftCheckScribeScroll(oSpellTarget,oCaster); + break; + + + case 103 : + // ------------------------------------------------- + // Craft Wand + // ------------------------------------------------- + nRet = CICraftCheckCraftWand(oSpellTarget,oCaster); + break; + + // you could add more crafting basetypes here.... + } + + return nRet; + + } + +} + +// ----------------------------------------------------------------------------- +// Makes oPC do a Craft check using nSkill to create the item supplied in sResRe +// If oContainer is specified, the item will be created there. +// Throwing weapons are created with stack sizes of 10, ammo with 20 +// ----------------------------------------------------------------------------- +object CIUseCraftItemSkill(object oPC, int nSkill, string sResRef, int nDC, object oContainer = OBJECT_INVALID) +{ + int bSuccess = GetIsSkillSuccessful(oPC, nSkill, nDC); + object oNew; + if (bSuccess) + { + // actual item creation + // if a crafting container was specified, create inside + if (oContainer == OBJECT_INVALID) + { + oNew =CreateItemOnObject(sResRef,oPC); + + } + else + { + oNew =CreateItemOnObject(sResRef,oContainer); + } + + int nBase = GetBaseItemType(oNew); + if (nBase == BASE_ITEM_BOLT || nBase == BASE_ITEM_ARROW || nBase == BASE_ITEM_BULLET) + { + SetItemStackSize(oNew, 20); + } + else if (nBase == BASE_ITEM_THROWINGAXE || nBase == BASE_ITEM_SHURIKEN || nBase == BASE_ITEM_DART) + { + SetItemStackSize(oNew, 10); + } + } + else + { + oNew = OBJECT_INVALID; + } + + return oNew; +} + +// ----------------------------------------------------------------------------- +// georg, 2003-06-13 ( +// Craft an item. This is only to be called from the crafting conversation +// spawned by x2_s2_crafting!!! +// ----------------------------------------------------------------------------- +int CIDoCraftItemFromConversation(int nNumber) +{ + string sNumber = IntToString(nNumber); + object oPC = GetPCSpeaker(); + //object oMaterial = GetLocalObject(oPC,"X2_CI_CRAFT_MATERIAL"); + object oMajor = GetLocalObject(oPC,"X2_CI_CRAFT_MAJOR"); + object oMinor = GetLocalObject(oPC,"X2_CI_CRAFT_MINOR"); + int nSkill = GetLocalInt(oPC,"X2_CI_CRAFT_SKILL"); + int nMode = GetLocalInt(oPC,"X2_CI_CRAFT_MODE"); + string sResult; + string s2DA; + int nDC; + + + DeleteLocalObject(oPC,"X2_CI_CRAFT_MAJOR"); + DeleteLocalObject(oPC,"X2_CI_CRAFT_MINOR"); + + if (!GetIsObjectValid(oMajor)) + { + FloatingTextStrRefOnCreature(83374,oPC); //"Invalid target" + DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS"); + return FALSE; + } + else + { + if (GetItemPossessor(oMajor) != oPC) + { + FloatingTextStrRefOnCreature(83354,oPC); //"Invalid target" + DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS"); + return FALSE; + } + } + + // If we are in container mode, + if (nMode == X2_CI_CRAFTMODE_CONTAINER) + { + if (!GetIsObjectValid(oMinor)) + { + FloatingTextStrRefOnCreature(83374,oPC); //"Invalid target" + DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS"); + return FALSE; + } + else if (GetItemPossessor(oMinor) != oPC) + { + FloatingTextStrRefOnCreature(83354,oPC); //"Invalid target" + DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS"); + return FALSE; + } + } + + + if (nSkill == 26) // craft weapon + { + s2DA = X2_CI_CRAFTING_WP_2DA; + } + else if (nSkill == 25) + { + s2DA = X2_CI_CRAFTING_AR_2DA; + } + + int nRow = GetLocalInt(oPC,"X2_CI_CRAFT_RESULTROW"); + struct craft_struct stItem = CIGetCraftItemStructFrom2DA(s2DA,nRow,nNumber); + object oContainer = OBJECT_INVALID; + + // --------------------------------------------------------------------------- + // We once used a crafting container, but found it too complicated. Code is still + // left in here for the community + // --------------------------------------------------------------------------- + if (nMode == X2_CI_CRAFTMODE_CONTAINER) + { + oContainer = GetItemPossessedBy(oPC,"x2_it_craftcont"); + } + + // Do the crafting... + object oRet = CIUseCraftItemSkill( oPC, nSkill, stItem.sResRef, stItem.nDC, oContainer) ; + + // * If you made an item, it should always be identified; + SetIdentified(oRet,TRUE); + + if (GetIsObjectValid(oRet)) + { + // ----------------------------------------------------------------------- + // Copy all item properties from the major object on the resulting item + // Through we problably won't use this, its a neat thing to have for the + // community + // to enable magic item creation from the crafting system + // ----------------------------------------------------------------------- + if (GetGold(oPC)<stItem.nCost) + { + DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS"); + FloatingTextStrRefOnCreature(86675,oPC); + DestroyObject(oRet); + return FALSE; + } + else + { + TakeGoldFromCreature(stItem.nCost, oPC,TRUE); + IPCopyItemProperties(oMajor,oRet); + } + // set success variable for conversation + SetLocalInt(oPC,"X2_CRAFT_SUCCESS",TRUE); + } + else + { + TakeGoldFromCreature(stItem.nCost / 4, oPC,TRUE); + // make sure there is no success + DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS"); + } + + // Destroy first material component + DestroyObject (oMajor); + + // if we are running in a container, destroy the second material component as well + if (nMode == X2_CI_CRAFTMODE_CONTAINER || nMode == X2_CI_CRAFTMODE_ASSEMBLE) + { + DestroyObject (oMinor); + } + int nRet = (oRet != OBJECT_INVALID); + return nRet; +} + +// ----------------------------------------------------------------------------- +// Retrieve craft information on a certain item +// ----------------------------------------------------------------------------- +struct craft_struct CIGetCraftItemStructFrom2DA(string s2DA, int nRow, int nItemNo) +{ + struct craft_struct stRet; + string sNumber = IntToString(nItemNo); + + stRet.nRow = nRow; + string sLabel = Get2DAString(s2DA,"Label"+ sNumber, nRow); + if (sLabel == "") + { + return stRet; // empty, no need to read further + } + int nStrRef = StringToInt(sLabel); + if (nStrRef != 0) // Handle bioware StrRefs + { + sLabel = GetStringByStrRef(nStrRef); + } + stRet.sLabel = sLabel; + stRet.nDC = StringToInt(Get2DAString(s2DA,"DC"+ sNumber, nRow)); + stRet.nCost = StringToInt(Get2DAString(s2DA,"CostGP"+ sNumber, nRow)); + stRet.sResRef = Get2DAString(s2DA,"ResRef"+ sNumber, nRow); + + return stRet; +} + +// ----------------------------------------------------------------------------- +// Return the cost +// ----------------------------------------------------------------------------- +int CIGetItemPartModificationCost(object oOldItem, int nPart) +{ + int nRet = StringToInt(Get2DAString(X2_IP_ARMORPARTS_2DA,"CraftCost",nPart)); + nRet = (GetGoldPieceValue(oOldItem) / 100 * nRet); + + // minimum cost for modification is 1 gp + if (nRet == 0) + { + nRet =1; + } + return nRet; +} + +// ----------------------------------------------------------------------------- +// Return the DC for modifying a certain armor part on oOldItem +// ----------------------------------------------------------------------------- +int CIGetItemPartModificationDC(object oOldItem, int nPart) +{ + int nRet = StringToInt(Get2DAString(X2_IP_ARMORPARTS_2DA,"CraftDC",nPart)); + // minimum cost for modification is 1 gp + return nRet; +} + +// ----------------------------------------------------------------------------- +// returns the dc +// dc to modify oOlditem to look like oNewItem +// ----------------------------------------------------------------------------- +int CIGetArmorModificationCost(object oOldItem, object oNewItem) +{ + int nTotal = 0; + int nPart; + for (nPart = 0; nPart<ITEM_APPR_ARMOR_NUM_MODELS; nPart++) + { + + if (GetItemAppearance(oOldItem,ITEM_APPR_TYPE_ARMOR_MODEL, nPart) !=GetItemAppearance(oNewItem,ITEM_APPR_TYPE_ARMOR_MODEL, nPart)) + { + nTotal+= CIGetItemPartModificationCost(oOldItem,nPart); + } + } + + // Modification Cost should not exceed value of old item +1 GP + if (nTotal > GetGoldPieceValue(oOldItem)) + { + nTotal = GetGoldPieceValue(oOldItem)+1; + } + return nTotal; +} + +// ----------------------------------------------------------------------------- +// returns the cost in gold piece that it would +// cost to modify oOlditem to look like oNewItem +// ----------------------------------------------------------------------------- +int CIGetArmorModificationDC(object oOldItem, object oNewItem) +{ + int nTotal = 0; + int nPart; + int nDC =0; + for (nPart = 0; nPart<ITEM_APPR_ARMOR_NUM_MODELS; nPart++) + { + + if (GetItemAppearance(oOldItem,ITEM_APPR_TYPE_ARMOR_MODEL, nPart) !=GetItemAppearance(oNewItem,ITEM_APPR_TYPE_ARMOR_MODEL, nPart)) + { + nDC = CIGetItemPartModificationDC(oOldItem,nPart); + if (nDC>nTotal) + { + nTotal = nDC; + } + } + } + + nTotal = GetItemACValue(oOldItem) + nTotal + 5; + + return nTotal; +} + +// ----------------------------------------------------------------------------- +// returns TRUE if the spell matching nSpellID is prevented from being used +// with the CraftFeat matching nFeatID +// This is controlled in des_crft_spells.2da +// ----------------------------------------------------------------------------- +int CIGetIsSpellRestrictedFromCraftFeat(int nSpellID, int nFeatID) +{ + string sCol; + if (nFeatID == X2_CI_BREWPOTION_FEAT_ID) + { + sCol ="NoPotion"; + } + else if (nFeatID == X2_CI_SCRIBESCROLL_FEAT_ID) + { + sCol = "NoScroll"; + } + else if (nFeatID == X2_CI_CRAFTWAND_FEAT_ID) + { + sCol = "NoWand"; + } + + string sRet = Get2DAString(X2_CI_CRAFTING_SP_2DA,sCol,nSpellID); + int nRet = (sRet == "1") ; + + return nRet; +} + +// ----------------------------------------------------------------------------- +// Retrieve the row in des_crft_bmat too look up receipe +// ----------------------------------------------------------------------------- +int CIGetCraftingReceipeRow(int nMode, object oMajor, object oMinor, int nSkill) +{ + if (nMode == X2_CI_CRAFTMODE_CONTAINER || nMode == X2_CI_CRAFTMODE_ASSEMBLE ) + { + int nMinorId = StringToInt(Get2DAString("des_crft_amat",GetTag(oMinor),1)); + int nMajorId = StringToInt(Get2DAString("des_crft_bmat",GetTag(oMajor),nMinorId)); + return nMajorId; + } + else if (nMode == X2_CI_CRAFTMODE_BASE_ITEM) + { + int nLookUpRow; + string sTag = GetTag(oMajor); + switch (nSkill) + { + case 26: nLookUpRow =1 ; break; + case 25: nLookUpRow= 2 ; break; + } + int nRet = StringToInt(Get2DAString(X2_CI_CRAFTING_MAT_2DA,sTag,nLookUpRow)); + return nRet; + } + else + { + return 0; // error + } +} + +// ----------------------------------------------------------------------------- +// used to set all variable required for the crafting conversation +// (Used materials, number of choises, 2da row, skill and mode) +// ----------------------------------------------------------------------------- +void CISetupCraftingConversation(object oPC, int nNumber, int nSkill, int nReceipe, object oMajor, object oMinor, int nMode) +{ + + SetLocalObject(oPC,"X2_CI_CRAFT_MAJOR",oMajor); + if (nMode == X2_CI_CRAFTMODE_CONTAINER || nMode == X2_CI_CRAFTMODE_ASSEMBLE ) + { + SetLocalObject(oPC,"X2_CI_CRAFT_MINOR", oMinor); + } + SetLocalInt(oPC,"X2_CI_CRAFT_NOOFITEMS",nNumber); // number of crafting choises for this material + SetLocalInt(oPC,"X2_CI_CRAFT_SKILL",nSkill); // skill used (craft armor or craft waeapon) + SetLocalInt(oPC,"X2_CI_CRAFT_RESULTROW",nReceipe); // number of crafting choises for this material + SetLocalInt(oPC,"X2_CI_CRAFT_MODE",nMode); +} + +// ----------------------------------------------------------------------------- +// oItem - The item used for crafting +// ----------------------------------------------------------------------------- +struct craft_receipe_struct CIGetCraftingModeFromTarget(object oPC,object oTarget, object oItem = OBJECT_INVALID) +{ + struct craft_receipe_struct stStruct; + + + if (GetBaseItemType(oItem) == 112 ) // small + { + stStruct.oMajor = oItem; + stStruct.nMode = X2_CI_CRAFTMODE_BASE_ITEM; + return stStruct; + } + + if (!GetIsObjectValid(oTarget)) + { + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + } + + + // A small craftitem was used on a large one + if (GetBaseItemType(oItem) == 110 ) // small + { + if (GetBaseItemType(oTarget) == 109) // large + { + stStruct.nMode = X2_CI_CRAFTMODE_ASSEMBLE; // Mode is ASSEMBLE + stStruct.oMajor = oTarget; + stStruct.oMinor = oItem; + return stStruct; + } + else + { + FloatingTextStrRefOnCreature(84201,oPC); + } + + } + + // ----------------------------------------------------------------------------- + // *** CONTAINER IS NO LONGER USED IN OFFICIAL CAMPAIGN + // BUT CODE LEFT IN FOR COMMUNITY. + // THE FOLLOWING CONDITION IS NEVER TRUE FOR THE OC (no crafting container) + // To reactivate, create a container with tag x2_it_craftcont + int bCraftCont = (GetTag(oTarget) == "x2_it_craftcont"); + + + if (bCraftCont == TRUE) + { + // First item in container is baseitem .. mode = baseitem + if ( GetBaseItemType(GetFirstItemInInventory(oTarget)) == 112) + { + stStruct.nMode = X2_CI_CRAFTMODE_BASE_ITEM; + stStruct.oMajor = GetFirstItemInInventory(oTarget); + return stStruct; + } + else + { + object oTest = GetFirstItemInInventory(oTarget); + int nCount =1; + int bMajor = FALSE; + int bMinor = FALSE; + // No item in inventory ... mode = fail + if (!GetIsObjectValid(oTest)) + { + FloatingTextStrRefOnCreature(84200,oPC); + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + } + else + { + while (GetIsObjectValid(oTest) && nCount <3) + { + if (GetBaseItemType(oTest) == 109) + { + stStruct.oMajor = oTest; + bMajor = TRUE; + } + else if (GetBaseItemType(oTest) == 110) + { + stStruct.oMinor = oTest; + bMinor = TRUE; + } + else if ( GetBaseItemType(oTest) == 112) + { + stStruct.nMode = X2_CI_CRAFTMODE_BASE_ITEM; + stStruct.oMajor = oTest; + return stStruct; + } + oTest = GetNextItemInInventory(oTarget); + if (GetIsObjectValid(oTest)) + { + nCount ++; + } + } + + if (nCount >2) + { + FloatingTextStrRefOnCreature(84356,oPC); + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + } + else if (nCount <2) + { + FloatingTextStrRefOnCreature(84356,oPC); + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + } + + if (bMajor && bMinor) + { + stStruct.nMode = X2_CI_CRAFTMODE_CONTAINER; + return stStruct; + } + else + { + FloatingTextStrRefOnCreature(84356,oPC); + //FloatingTextStringOnCreature("Temp: Wrong combination of items in the crafting container",oPC); + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + } + + } + } + } + else + { + // not a container but a baseitem + if (GetBaseItemType(oTarget) == 112) + { + stStruct.nMode = X2_CI_CRAFTMODE_BASE_ITEM; + stStruct.oMajor = oTarget; + return stStruct; + + } + else + { + if (GetBaseItemType(oTarget) == 109 || GetBaseItemType(oTarget) == 110) + { + FloatingTextStrRefOnCreature(84357,oPC); + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + } + else + { + FloatingTextStrRefOnCreature(84357,oPC); + // not a valid item + stStruct.nMode = X2_CI_CRAFTMODE_INVALID; + return stStruct; + + } + } + } +} + +// ----------------------------------------------------------------------------- +// *** Crafting Conversation Functions *** +// ----------------------------------------------------------------------------- +int CIGetInModWeaponOrArmorConv(object oPC) +{ + return GetLocalInt(oPC,"X2_L_CRAFT_MODIFY_CONVERSATION"); +} + + +void CISetCurrentModMode(object oPC, int nMode) +{ + if (nMode == X2_CI_MODMODE_INVALID) + { + DeleteLocalInt(oPC,"X2_L_CRAFT_MODIFY_MODE"); + } + else + { + SetLocalInt(oPC,"X2_L_CRAFT_MODIFY_MODE",nMode); + } +} + +int CIGetCurrentModMode(object oPC) +{ + return GetLocalInt(oPC,"X2_L_CRAFT_MODIFY_MODE"); +} + + +object CIGetCurrentModBackup(object oPC) +{ + return GetLocalObject(GetPCSpeaker(),"X2_O_CRAFT_MODIFY_BACKUP"); +} + +object CIGetCurrentModItem(object oPC) +{ + return GetLocalObject(GetPCSpeaker(),"X2_O_CRAFT_MODIFY_ITEM"); +} + + +void CISetCurrentModBackup(object oPC, object oBackup) +{ + SetLocalObject(GetPCSpeaker(),"X2_O_CRAFT_MODIFY_BACKUP",oBackup); +} + +void CISetCurrentModItem(object oPC, object oItem) +{ + SetLocalObject(GetPCSpeaker(),"X2_O_CRAFT_MODIFY_ITEM",oItem); +} + + +// ----------------------------------------------------------------------------- +// * This does multiple things: +// - store the part currently modified +// - setup the custom token for the conversation +// - zoom the camera to that part +// ----------------------------------------------------------------------------- +void CISetCurrentModPart(object oPC, int nPart, int nStrRef) +{ + SetLocalInt(oPC,"X2_TAILOR_CURRENT_PART",nPart); + + if (CIGetCurrentModMode(oPC) == X2_CI_MODMODE_ARMOR) + { + + // * Make the camera float near the PC + float fFacing = GetFacing(oPC) + 180.0; + + if (nPart == ITEM_APPR_ARMOR_MODEL_LSHOULDER || nPart == ITEM_APPR_ARMOR_MODEL_LFOREARM || + nPart == ITEM_APPR_ARMOR_MODEL_LHAND || nPart == ITEM_APPR_ARMOR_MODEL_LBICEP) + { + fFacing += 80.0; + } + + if (nPart == ITEM_APPR_ARMOR_MODEL_RSHOULDER || nPart == ITEM_APPR_ARMOR_MODEL_RFOREARM || + nPart == ITEM_APPR_ARMOR_MODEL_RHAND || nPart == ITEM_APPR_ARMOR_MODEL_RBICEP) + { + fFacing -= 80.0; + } + + float fPitch = 75.0; + if (fFacing > 359.0) + { + fFacing -=359.0; + } + + float fDistance = 3.5f; + if (nPart == ITEM_APPR_ARMOR_MODEL_PELVIS || nPart == ITEM_APPR_ARMOR_MODEL_BELT ) + { + fDistance = 2.0f; + } + + if (nPart == ITEM_APPR_ARMOR_MODEL_LSHOULDER || nPart == ITEM_APPR_ARMOR_MODEL_RSHOULDER ) + { + fPitch = 50.0f; + fDistance = 3.0f; + } + else if (nPart == ITEM_APPR_ARMOR_MODEL_LFOREARM || nPart == ITEM_APPR_ARMOR_MODEL_LHAND) + { + fDistance = 2.0f; + fPitch = 60.0f; + } + else if (nPart == ITEM_APPR_ARMOR_MODEL_NECK) + { + fPitch = 90.0f; + } + else if (nPart == ITEM_APPR_ARMOR_MODEL_RFOOT || nPart == ITEM_APPR_ARMOR_MODEL_LFOOT ) + { + fDistance = 3.5f; + fPitch = 47.0f; + } + else if (nPart == ITEM_APPR_ARMOR_MODEL_LTHIGH || nPart == ITEM_APPR_ARMOR_MODEL_RTHIGH ) + { + fDistance = 2.5f; + fPitch = 65.0f; + } + else if ( nPart == ITEM_APPR_ARMOR_MODEL_RSHIN || nPart == ITEM_APPR_ARMOR_MODEL_LSHIN ) + { + fDistance = 3.5f; + fPitch = 95.0f; + } + + if (GetRacialType(oPC) == RACIAL_TYPE_HALFORC) + { + fDistance += 1.0f; + } + + SetCameraFacing(fFacing, fDistance, fPitch,CAMERA_TRANSITION_TYPE_VERY_FAST) ; + } + + int nCost = GetLocalInt(oPC,"X2_TAILOR_CURRENT_COST"); + int nDC = GetLocalInt(oPC,"X2_TAILOR_CURRENT_DC"); + + SetCustomToken(X2_CI_MODIFYARMOR_GP_CTOKENBASE,IntToString(nCost)); + SetCustomToken(X2_CI_MODIFYARMOR_GP_CTOKENBASE+1,IntToString(nDC)); + + + SetCustomToken(XP_IP_ITEMMODCONVERSATION_CTOKENBASE,GetStringByStrRef(nStrRef)); +} + +int CIGetCurrentModPart(object oPC) +{ + return GetLocalInt(oPC,"X2_TAILOR_CURRENT_PART"); +} + + +void CISetDefaultModItemCamera(object oPC) +{ + float fDistance = 3.5f; + float fPitch = 75.0f; + float fFacing; + + if (CIGetCurrentModMode(oPC) == X2_CI_MODMODE_ARMOR) + { + fFacing = GetFacing(oPC) + 180.0; + if (fFacing > 359.0) + { + fFacing -=359.0; + } + } + else if (CIGetCurrentModMode(oPC) == X2_CI_MODMODE_WEAPON) + { + fFacing = GetFacing(oPC) + 180.0; + fFacing -= 90.0; + if (fFacing > 359.0) + { + fFacing -=359.0; + } + } + + SetCameraFacing(fFacing, fDistance, fPitch,CAMERA_TRANSITION_TYPE_VERY_FAST) ; +} + +void CIUpdateModItemCostDC(object oPC, int nDC, int nCost) +{ + SetLocalInt(oPC,"X2_TAILOR_CURRENT_COST", nCost); + SetLocalInt(oPC,"X2_TAILOR_CURRENT_DC",nDC); + SetCustomToken(X2_CI_MODIFYARMOR_GP_CTOKENBASE,IntToString(nCost)); + SetCustomToken(X2_CI_MODIFYARMOR_GP_CTOKENBASE+1,IntToString(nDC)); +} + + +// dc to modify oOlditem to look like oNewItem +int CIGetWeaponModificationCost(object oOldItem, object oNewItem) +{ + int nTotal = 0; + int nPart; + for (nPart = 0; nPart<=2; nPart++) + { + if (GetItemAppearance(oOldItem,ITEM_APPR_TYPE_WEAPON_MODEL, nPart) !=GetItemAppearance(oNewItem,ITEM_APPR_TYPE_WEAPON_MODEL, nPart)) + { + nTotal+= (GetGoldPieceValue(oOldItem)/4)+1; + } + } + + // Modification Cost should not exceed value of old item +1 GP + if (nTotal > GetGoldPieceValue(oOldItem)) + { + nTotal = GetGoldPieceValue(oOldItem)+1; + } + return nTotal; +} + + + diff --git a/_removed/x2_s0_acidshth.ncs b/_removed/x2_s0_acidshth.ncs new file mode 100644 index 0000000..e9ae392 Binary files /dev/null and b/_removed/x2_s0_acidshth.ncs differ diff --git a/_removed/x2_s0_acidshth.nss b/_removed/x2_s0_acidshth.nss new file mode 100644 index 0000000..1e9d140 --- /dev/null +++ b/_removed/x2_s0_acidshth.nss @@ -0,0 +1,69 @@ +//:://///////////////////////////////////////////// +//:: Mestil's Acid Sheath +//:: X2_S0_AcidShth +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This spell creates an acid shield around your + person. Any creature striking you with its body + does normal damage, but at the same time the + attacker takes 1d6 points +2 points per caster + level of acid damage. Weapons with exceptional + reach do not endanger thier uses in this way. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 7, 2002 +//:: 2003-07-07: Stacking Spell Pass, Georg Zoeller +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + +/* + Spellcast Hook Code + Added 2003-07-07 by Georg Zoeller + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(448); + int nDuration = spell.Level; + int nDamage = spell.Level/2; + effect eShield = EffectDamageShield(nDamage, DAMAGE_BONUS_1d6, DAMAGE_TYPE_ACID); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + + //Link effects + effect eLink = EffectLinkEffects(eShield, eDur); + eLink = EffectLinkEffects(eLink, eVis); + + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + //Enter Metamagic conditions + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + // 2003-07-07: Stacking Spell Pass, Georg + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Apply the VFX impact and effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); +} diff --git a/_removed/x2_s0_batttide.ncs b/_removed/x2_s0_batttide.ncs new file mode 100644 index 0000000..1e911f9 Binary files /dev/null and b/_removed/x2_s0_batttide.ncs differ diff --git a/_removed/x2_s0_batttide.nss b/_removed/x2_s0_batttide.nss new file mode 100644 index 0000000..273371f --- /dev/null +++ b/_removed/x2_s0_batttide.nss @@ -0,0 +1,84 @@ +//:://///////////////////////////////////////////// +//:: Battletide +//:: X2_S0_BattTide +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + You create an aura that steals energy from your + enemies. Your enemies suffer a -2 circumstance + penalty on saves, attack rolls, and damage rolls, + once entering the aura. On casting, you gain a + +2 circumstance bonus to your saves, attack rolls, + and damage rolls. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Dec 04, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs 06/06/03 +/* +Patch 1.71, fix by Shadoow + +- disabled aura stacking +- moving bug fixed, now caster gains benefit of aura all the time, (cannot guarantee the others, +thats module-related) +*/ + +#include "70_inc_spells" +#include "x2_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-07-07 by Georg Zoeller + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eAOE = EffectAreaOfEffect(AOE_MOB_TIDE_OF_BATTLE); + effect eVis = EffectVisualEffect(VFX_IMP_AURA_UNEARTHLY); + effect eVis2 = EffectVisualEffect(VFX_IMP_HOLY_AID); + effect eSaves = EffectSavingThrowIncrease(SAVING_THROW_ALL,2); + effect eAttack = EffectAttackIncrease(2); + effect eDamage = EffectDamageIncrease(2,DAMAGE_TYPE_MAGICAL); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + //Link the effects + effect eLink = EffectLinkEffects(eAttack,eDamage); + eLink = EffectLinkEffects(eLink,eSaves); + eLink = EffectLinkEffects(eLink,eDur); + + eLink = EffectLinkEffects(eLink,eVis); + eLink = EffectLinkEffects(eLink,eAOE); + + int nDuration = spell.Level; + + //Make metamagic check for extend + if(spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration *2; //Duration is +100% + } + + //prevent stacking + RemoveEffectsFromSpell(spell.Target, spell.Id); + + //Apply the VFX impact and linked effects + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, spell.Target); + + //Create the AOE object at the selected location + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); + spellsSetupNewAOE("VFX_MOB_BATTLETIDE"); +} diff --git a/_removed/x2_s0_blckstff.ncs b/_removed/x2_s0_blckstff.ncs new file mode 100644 index 0000000..4cda8f6 Binary files /dev/null and b/_removed/x2_s0_blckstff.ncs differ diff --git a/_removed/x2_s0_blckstff.nss b/_removed/x2_s0_blckstff.nss new file mode 100644 index 0000000..a0e2f4a --- /dev/null +++ b/_removed/x2_s0_blckstff.nss @@ -0,0 +1,96 @@ +//:://///////////////////////////////////////////// +//:: Blackstaff +//:: X2_S0_Blckstff +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Adds +4 enhancement bonus, On Hit: Dispel. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Nov 29, 2002 +//::////////////////////////////////////////////// +//:: Updated by Andrew Nobbs May 07, 2003 +//:: 2003-07-07: Stacking Spell Pass, Georg Zoeller +//:: 2003-07-15: Complete Rewrite to make use of Item Property System +/* +Patch 1.70, fix by Shadooow + +- VFX added if cast on weapon on ground +*/ + +#include "70_inc_spells" +#include "x2_i0_spells" +#include "x2_inc_spellhook" + +void AddBlackStaffEffectOnWeapon (object oTarget, float fDuration) +{ + IPSafeAddItemProperty(oTarget, ItemPropertyEnhancementBonus(5), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE); + //IPSafeAddItemProperty(oTarget, ItemPropertyOnHitProps(IP_CONST_ONHIT_DISPELMAGIC, IP_CONST_ONHIT_SAVEDC_16), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING); + itemproperty pStaff = ItemPropertyOnHitCastSpell(125, 1); + IPSafeAddItemProperty(oTarget, pStaff, fDuration); + SetLocalInt(oTarget, "Blackstaff", 1); + DelayCommand(fDuration-0.1, SetLocalInt(oTarget, "Blackstaff", 0)); + IPSafeAddItemProperty(oTarget, ItemPropertyVisualEffect(ITEM_VISUAL_EVIL), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE); +} + +void main() +{ + /* + Spellcast Hook Code + Added 2003-07-07 by Georg Zoeller + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + + // End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_IMP_EVIL_HELP); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + int nDuration = spell.Level; + + object oMyWeapon = IPGetTargetedOrEquippedMeleeWeapon(spell.Target); + object oPossessor = GetItemPossessor(oMyWeapon); + + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; //Duration is +100% + } + + if(GetIsObjectValid(oMyWeapon)) + { + //if the possessor isn't valid, nothing should happen + SignalEvent(oPossessor, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + if (GetBaseItemType(oMyWeapon) == BASE_ITEM_QUARTERSTAFF) + { + if(GetIsObjectValid(oPossessor)) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPossessor); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oPossessor, RoundsToSeconds(nDuration)); + } + else + { + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, spell.Loc); + } + AddBlackStaffEffectOnWeapon(oMyWeapon, RoundsToSeconds(nDuration)); + } + else + { + FloatingTextStrRefOnCreature(83620, spell.Caster); // not a qstaff + } + } + else + { + FloatingTextStrRefOnCreature(83615, spell.Caster); + } +} diff --git a/_removed/x2_s0_bldethst.ncs b/_removed/x2_s0_bldethst.ncs new file mode 100644 index 0000000..f368561 Binary files /dev/null and b/_removed/x2_s0_bldethst.ncs differ diff --git a/_removed/x2_s0_bldethst.nss b/_removed/x2_s0_bldethst.nss new file mode 100644 index 0000000..d6fd98e --- /dev/null +++ b/_removed/x2_s0_bldethst.nss @@ -0,0 +1,91 @@ +//:://///////////////////////////////////////////// +//:: Blade Thrist +//:: X2_S0_BldeThst +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Grants a +3 enhancement bonus to a slashing weapon +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Nov 27, 2002 +//::////////////////////////////////////////////// +//:: Updated by Andrew Nobbs May 08, 2003 +//:: 2003-07-07: Stacking Spell Pass, Georg Zoeller +//:: 2003-07-21: Complete Rewrite to make use of Item Property System +/* +Patch 1.70 + +- signal event never fired +- VFX added if cast on weapon on ground +*/ + +#include "70_inc_spells" +#include "x2_i0_spells" +#include "x2_inc_spellhook" + +void AddEnhanceEffectToWeapon(object oMyWeapon, float fDuration) +{ + IPSafeAddItemProperty(oMyWeapon, ItemPropertyEnhancementBonus(3), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE); +} + +void main() +{ + /* + Spellcast Hook Code + Added 2003-07-07 by Georg Zoeller + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + int nDuration = 2 * spell.Level; + + object oMyWeapon = IPGetTargetedOrEquippedMeleeWeapon(); + object oPossessor = GetItemPossessor(oMyWeapon); + + if (spell.Meta == METAMAGIC_EXTEND) + { + nDuration = nDuration * 2; //Duration is +100% + } + + if(GetIsObjectValid(oMyWeapon)) + { + //if the possessor isn't valid, nothing should happen + SignalEvent(oPossessor, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + + //if (GetSlashingWeapon(oMyWeapon)) + //{ + if(GetIsObjectValid(oPossessor)) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPossessor); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oPossessor, RoundsToSeconds(nDuration)); + } + else + { + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, spell.Loc); + } + AddEnhanceEffectToWeapon(oMyWeapon, RoundsToSeconds(nDuration)); + /*} + else + { + FloatingTextStrRefOnCreature(83621, spell.Caster); // not a slashing weapon + } */ + } + else + { + FloatingTextStrRefOnCreature(83615, spell.Caster); + } +} diff --git a/_removed/x2_s0_crumble.ncs b/_removed/x2_s0_crumble.ncs new file mode 100644 index 0000000..4cbe299 Binary files /dev/null and b/_removed/x2_s0_crumble.ncs differ diff --git a/_removed/x2_s0_crumble.nss b/_removed/x2_s0_crumble.nss new file mode 100644 index 0000000..73f7c2a --- /dev/null +++ b/_removed/x2_s0_crumble.nss @@ -0,0 +1,118 @@ +//:://///////////////////////////////////////////// +//:: Crumble +//:: X2_S0_Crumble +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +// This spell inflicts 1d6 points of damage per +// caster level to Constructs to a maximum of 15d6. +// This spell does not affect living creatures. +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: Oct 2003/ +//:: 2004-01-02: GZ: Removed Spell resistance check +//::////////////////////////////////////////////// +/* +Patch 1.70, fix by Shadooow + +- was missing target check and could affect friendly tarets at no-pvp area +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void DoCrumble (int nDam, object oCaster, object oTarget); + +void main() +{ + + /* + Spellcast Hook Code + Added 2003-07-07 by Georg Zoeller + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + // End of Spell Cast Hook + + spellsDeclareMajorVariables(); + int nCasterLvl = spell.Level; + int nType = GetObjectType(spell.Target); + int nRacial = GetRacialType(spell.Target); + + //Maximum caster level of 15. //minimum safety check is handled in new engine + if (nCasterLvl > 12) + { + nCasterLvl = 12; + } + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster) && + (nType == OBJECT_TYPE_CREATURE || nType == OBJECT_TYPE_PLACEABLE || nType == OBJECT_TYPE_DOOR) && + (GetRacialType(spell.Target) == RACIAL_TYPE_CONSTRUCT || GetLevelByClass(CLASS_TYPE_CONSTRUCT,spell.Target))) + { + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + effect eCrumb = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eCrumb, spell.Target); + + int nDam = MaximizeOrEmpower(6,nCasterLvl,spell.Meta); + nDam = FloatToInt(nDam * 1.5); + if (nDam>0)//can't happen anyway + { + //---------------------------------------------------------------------- + // * Sever the tie between spellId and effect, allowing it to + // * bypass any magic resistance + //---------------------------------------------------------------------- + /*DelayCommand(0.1,*/DoCrumble(nDam, spell.Caster, spell.Target);//); + } + } + //Make it work on non-constructs + else if (spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster) && + (nType == OBJECT_TYPE_CREATURE || nType == OBJECT_TYPE_PLACEABLE || nType == OBJECT_TYPE_DOOR)) + { + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + effect eCrumb = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eCrumb, spell.Target); + + int nDam = MaximizeOrEmpower(6,nCasterLvl,spell.Meta); + if (nDam>0)//can't happen anyway + { + //---------------------------------------------------------------------- + // * Sever the tie between spellId and effect, allowing it to + // * bypass any magic resistance + //---------------------------------------------------------------------- + /*DelayCommand(0.1,*/DoCrumble(nDam, spell.Caster, spell.Target);//); + } + } +} + +//------------------------------------------------------------------------------ +// This part is moved into a delayed function in order to alllow it to bypass +// Golem Spell Immunity. Magic works by rendering all effects applied +// from within a spellscript useless. Delaying the creation and application of +// an effect causes it to loose it's SpellId, making it possible to ignore +// Magic Immunity. Hacktastic! //shadooow: BS, useless, it does work without delay +//------------------------------------------------------------------------------ +void DoCrumble (int nDam, object oCaster, object oTarget) +{ + float fDist = GetDistanceBetween(oCaster, oTarget); + float fDelay = fDist/(3.0 * log(fDist) + 2.0); + effect eDam = EffectDamage(nDam, DAMAGE_TYPE_SONIC); + effect eMissile = EffectVisualEffect(VFX_FNF_MYSTICAL_EXPLOSION); + effect eCrumb = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE); + effect eVis = EffectVisualEffect(135); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eCrumb, oTarget); + if (GetRacialType(oTarget) == RACIAL_TYPE_CONSTRUCT || GetLevelByClass(CLASS_TYPE_CONSTRUCT,oTarget)) + { + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget)); + } + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); + DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget)); +} diff --git a/_removed/x2_s0_icedagg.ncs b/_removed/x2_s0_icedagg.ncs new file mode 100644 index 0000000..8090b49 Binary files /dev/null and b/_removed/x2_s0_icedagg.ncs differ diff --git a/_removed/x2_s0_icedagg.nss b/_removed/x2_s0_icedagg.nss new file mode 100644 index 0000000..939d6db --- /dev/null +++ b/_removed/x2_s0_icedagg.nss @@ -0,0 +1,79 @@ +//:://///////////////////////////////////////////// +//:: Ice Dagger +//:: X2_S0_IceDagg +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +// You create a dagger shapped piece of ice that +// flies toward the target and deals 1d4 points of +// cold damage per level (maximum od 5d4) +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Nov 25 , 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs, 02/06/2003 +/* +Patch 1.70 + +- removed delay from VFX and effect applications +*/ +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-07-07 by Georg Zoeller + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + int nCasterLvl = spell.Level; + int nDamage; + effect eVis = EffectVisualEffect(VFX_IMP_FROST_S); + effect eDam; + + //Limit Caster level for the purposes of damage + if (nCasterLvl > 5) + { + nCasterLvl = 5; + } + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Get the distance between the explosion and the target to calculate delay +// fDelay = GetDistanceBetweenLocations(spell.Loc, GetLocation(spell.Target))/20;//there shouldn't be delay + if (!MyResistSpell(spell.Caster, spell.Target)) + { + //Roll damage for each target + nDamage = MaximizeOrEmpower(4,nCasterLvl,spell.Meta,2); + //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. + nDamage = GetReflexAdjustedDamage(nDamage, spell.Target, spell.DC, SAVING_THROW_TYPE_COLD, spell.Caster); + //Set the damage effect + eDam = EffectDamage(nDamage, DAMAGE_TYPE_COLD); + if(nDamage > 0) + { + // Apply effects to the currently selected target. + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target); + //This visual effect is applied to the target object not the location as above. This visual effect + //represents the flame that erupts on the target not on the ground. + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, spell.Target); + } + } + } +} diff --git a/_removed/x2_s0_vinemcama.ncs b/_removed/x2_s0_vinemcama.ncs new file mode 100644 index 0000000..11a9f61 Binary files /dev/null and b/_removed/x2_s0_vinemcama.ncs differ diff --git a/_removed/x2_s0_vinemcama.nss b/_removed/x2_s0_vinemcama.nss new file mode 100644 index 0000000..82113af --- /dev/null +++ b/_removed/x2_s0_vinemcama.nss @@ -0,0 +1,44 @@ +//:://///////////////////////////////////////////// +//:: Vine Mine, Camouflage: On Enter +//:: X2_S0_VineMCamA +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Friendly creatures entering the zone of Vine Mine, + Camouflage have a +4 added to hide checks. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Nov 25, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs, 02/06/2003 +/* +Patch 1.70 + +- aoe signalized wrong spell ID +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" + +void main() +{ + //Declare major variables + aoesDeclareMajorVariables(); + object oTarget = GetEnteringObject(); + if(spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, aoe.Creator)) + { + if(!GetHasSpellEffect(spell.Id, oTarget)) + { + //Fire cast spell at event for the target + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id, FALSE)); + + effect eVis = EffectVisualEffect(VFX_IMP_HEAD_NATURE); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + effect eSkill = EffectSkillIncrease(SKILL_HIDE, 8); + effect eLink = EffectLinkEffects(eDur, eSkill); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); + } + } +} diff --git a/_removed/x2_s0_vinemhmpa.ncs b/_removed/x2_s0_vinemhmpa.ncs new file mode 100644 index 0000000..fc78be7 Binary files /dev/null and b/_removed/x2_s0_vinemhmpa.ncs differ diff --git a/_removed/x2_s0_vinemhmpa.nss b/_removed/x2_s0_vinemhmpa.nss new file mode 100644 index 0000000..1e97b82 --- /dev/null +++ b/_removed/x2_s0_vinemhmpa.nss @@ -0,0 +1,47 @@ +//:://///////////////////////////////////////////// +//:: Vine Mine, Hamper Movement: On Enter +//:: X2_S0_VineMHmpA +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Creatures entering the zone of Vine Mine, Hamper + Movement have their movement reduced by 1/2. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Nov 25, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs, 02/06/2003 +/* +Patch 1.70 + +- aoe signalized wrong spell ID +- incorporeal creatures could been affected +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + //Declare major variables + aoesDeclareMajorVariables(); + object oTarget = GetEnteringObject(); + //float fDelay = GetRandomDelay(1.0, 2.2); //unused + if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, aoe.Creator)) + { + if(!GetHasFeat(FEAT_WOODLAND_STRIDE, oTarget) && !GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL)) + { + //Fire cast spell at event for the target + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id)); + + effect eVis = EffectVisualEffect(VFX_IMP_SLOW); + effect eSlow = EffectMovementSpeedDecrease(70); + effect eLink = EffectLinkEffects(eVis, eSlow); + + //Apply reduced movement effect and VFX_Impact + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); + } + } +} diff --git a/_removed/x2_s0_vinemhmpc.ncs b/_removed/x2_s0_vinemhmpc.ncs new file mode 100644 index 0000000..53d3e76 Binary files /dev/null and b/_removed/x2_s0_vinemhmpc.ncs differ diff --git a/_removed/x2_s0_vinemhmpc.nss b/_removed/x2_s0_vinemhmpc.nss new file mode 100644 index 0000000..c21e4c9 --- /dev/null +++ b/_removed/x2_s0_vinemhmpc.nss @@ -0,0 +1,63 @@ +//:://///////////////////////////////////////////// +//:: Vine Mine, Hamper Movement: Heartbeat +//:: X2_S0_VineMHmpC +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Creatures entering the zone of Vine Mine, Hamper + Movement have their movement reduced by 1/2. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Now 25, 2002 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs, 02/06/2003 +/* +Patch 1.70 + +- aoe signalized wrong spell ID +- incorporeal creatures could been affected +*/ + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + //Declare major variables + aoesDeclareMajorVariables(); + + //-------------------------------------------------------------------------- + // GZ 2003-Oct-15 + // When the caster is no longer there, all functions calling + // GetAreaOfEffectCreator will fail. Its better to remove the barrier then + //-------------------------------------------------------------------------- + if(!GetIsObjectValid(aoe.Creator)) + { + DestroyObject(aoe.AOE); + return; + } + + effect eVis = EffectVisualEffect(VFX_IMP_SLOW); + effect eSlow = EffectMovementSpeedDecrease(70); + effect eLink = EffectLinkEffects(eVis, eSlow); + float fDelay; + + //Get first target in spell area + object oTarget = GetFirstInPersistentObject(aoe.AOE); + while(GetIsObjectValid(oTarget)) + { + if(!GetHasFeat(FEAT_WOODLAND_STRIDE, oTarget) && !GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL)) + { + if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, aoe.Creator)) + { + SignalEvent(oTarget, EventSpellCastAt(aoe.AOE, spell.Id)); + fDelay = GetRandomDelay(0.0, 2.0); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget)); + } + } + //Get next target in spell area + oTarget = GetNextInPersistentObject(aoe.AOE); + } +} diff --git a/_removed/x2_s1_beholdatt.ncs b/_removed/x2_s1_beholdatt.ncs new file mode 100644 index 0000000..29fa555 Binary files /dev/null and b/_removed/x2_s1_beholdatt.ncs differ diff --git a/_removed/x2_s1_beholdatt.nss b/_removed/x2_s1_beholdatt.nss new file mode 100644 index 0000000..0280767 --- /dev/null +++ b/_removed/x2_s1_beholdatt.nss @@ -0,0 +1,30 @@ +//:://///////////////////////////////////////////// +//:: x2_s1_beholdatt +//:: Beholder Attack Spell Logic +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + + This spellscript is the core of the beholder's + attack logic. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: 2003-08-28 +//::////////////////////////////////////////////// +// Modified by Tony K for NWN2 2008-05-18 - only left +// for backward compatability +// Modified by Tony K for NWN1 2008-07-22 + + +#include "x2_inc_behai" + + +void main() +{ +// Jug_Debug(GetName(OBJECT_SELF) + " running special beholder ray AI"); + object oTarget = GetSpellTargetObject(); + + RunBeholderEyeAttacks(oTarget, TRUE); +} \ No newline at end of file diff --git a/_removed/x2_s1_beholdray.ncs b/_removed/x2_s1_beholdray.ncs new file mode 100644 index 0000000..97e4299 Binary files /dev/null and b/_removed/x2_s1_beholdray.ncs differ diff --git a/_removed/x2_s1_beholdray.nss b/_removed/x2_s1_beholdray.nss new file mode 100644 index 0000000..052a20a --- /dev/null +++ b/_removed/x2_s1_beholdray.nss @@ -0,0 +1,73 @@ +//:://///////////////////////////////////////////// +//:: Beholder Ray Attacks +//:: x2_s2_beholdray +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Implementation for the new version of the + beholder rays, using projectiles instead of + rays +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: 2003-09-16 +//::////////////////////////////////////////////// +// Modified by dirtywick and Tony K for NWN2 2008-04-06 +// Modified by Tony K for NWN1 2008-07-22 + +#include "x0_i0_spells" + +#include "x2_inc_beholder" + +void main() +{ + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + + int nRay; + + switch (nSpell) + { + case 776: + nRay = BEHOLDER_RAY_DEATH; + break; + + case 777: + nRay = BEHOLDER_RAY_TK_THRUST; + break; + + case 778: + nRay = BEHOLDER_RAY_PETRI; + break; + + case 779: + nRay = BEHOLDER_RAY_CHARM_MON; + break; + + case 780: + nRay = BEHOLDER_RAY_SLOW; + break; + + case 783: + nRay = BEHOLDER_RAY_WOUND; + break; + + case 784: + nRay = BEHOLDER_RAY_FEAR; + break; + + case 785: + nRay = BEHOLDER_RAY_CHARM_PER; + break; + + case 786: + nRay = BEHOLDER_RAY_SLEEP; + break; + + case 787: + nRay = BEHOLDER_RAY_DISINTEGRATE; + break; + } + + DoBeholderRayAttack(nRay, oTarget, FALSE); +} \ No newline at end of file diff --git a/_removed/x2_s1_petrgaze.ncs b/_removed/x2_s1_petrgaze.ncs new file mode 100644 index 0000000..1ce6e1d Binary files /dev/null and b/_removed/x2_s1_petrgaze.ncs differ diff --git a/_removed/x2_s1_petrgaze.nss b/_removed/x2_s1_petrgaze.nss new file mode 100644 index 0000000..eaf235d --- /dev/null +++ b/_removed/x2_s1_petrgaze.nss @@ -0,0 +1,81 @@ +//:://///////////////////////////////////////////// +//:: Gaze attack for shifter forms +//:: x2_s1_petrgaze +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + + Petrification gaze for polymorph type + basilisk and medusa + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: July, 09, 2003 +//::////////////////////////////////////////////// + +#include "x0_i0_spells" +#include "x2_inc_shifter" + +void main() +{ + //-------------------------------------------------------------------------- + // Enforce artifical use limit on that ability + //-------------------------------------------------------------------------- + if(ShifterDecrementGWildShapeSpellUsesLeft() < 1) + { + FloatingTextStrRefOnCreature(83576, OBJECT_SELF); + return; + } + + //-------------------------------------------------------------------------- + // Make sure we are not blind + //-------------------------------------------------------------------------- + if(GZCanNotUseGazeAttackCheck(OBJECT_SELF)) + { + return; + } + + //-------------------------------------------------------------------------- + // Calculate Save DC + //-------------------------------------------------------------------------- + int nDC = ShifterGetSaveDC(OBJECT_SELF,SHIFTER_DC_EASY_MEDIUM); + + float fDelay; + object oTarget = GetSpellTargetObject(); + int nHitDice = GetCasterLevel(OBJECT_SELF); + int nSpellID = GetSpellId(); + object oSelf = OBJECT_SELF; + + //-------------------------------------------------------------------------- + // Loop through all available targets in spellcone + //-------------------------------------------------------------------------- + location lFinalTarget = GetSpellTargetLocation(); + vector vFinalPosition; + if(lFinalTarget == GetLocation(OBJECT_SELF)) + { + // Since the target and origin are the same, we have to determine the + // direction of the spell from the facing of OBJECT_SELF (which is more + // intuitive than defaulting to East everytime). + + // In order to use the direction that OBJECT_SELF is facing, we have to + // instead we pick a point slightly in front of OBJECT_SELF as the target. + vector lTargetPosition = GetPositionFromLocation(lFinalTarget); + vFinalPosition.x = lTargetPosition.x + cos(GetFacing(OBJECT_SELF)); + vFinalPosition.y = lTargetPosition.y + sin(GetFacing(OBJECT_SELF)); + lFinalTarget = Location(GetAreaFromLocation(lFinalTarget),vFinalPosition,GetFacingFromLocation(lFinalTarget)); + } + oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 11.0, lFinalTarget, TRUE); + while(GetIsObjectValid(oTarget)) + { + if(spellsIsTarget(oTarget,SPELL_TARGET_STANDARDHOSTILE,OBJECT_SELF) && oTarget != OBJECT_SELF) + { + // Let target know the negative spell has been cast + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID)); + fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + DelayCommand(fDelay, DoPetrification(nHitDice, oSelf, oTarget, nSpellID, nDC)); + //Get next target in spell area + } + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 11.0, lFinalTarget, TRUE); + } +} diff --git a/_removed/x2_s2_cursesong.ncs b/_removed/x2_s2_cursesong.ncs new file mode 100644 index 0000000..102cfdd Binary files /dev/null and b/_removed/x2_s2_cursesong.ncs differ diff --git a/_removed/x2_s2_cursesong.nss b/_removed/x2_s2_cursesong.nss new file mode 100644 index 0000000..9daf11b --- /dev/null +++ b/_removed/x2_s2_cursesong.nss @@ -0,0 +1,431 @@ +//:://///////////////////////////////////////////// +//:: Curse Song +//:: X2_S2_CurseSong +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This spells applies penalties to all of the + bard's enemies within 30ft for a set duration of + 10 rounds. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: May 16, 2003 +//::////////////////////////////////////////////// +//:: Last Updated By: Andrew Nobbs May 20, 2003 + +#include "x2_i0_spells" + +void main() +{ + + if (!GetHasFeat(FEAT_BARD_SONGS, OBJECT_SELF)) + { + FloatingTextStrRefOnCreature(85587,OBJECT_SELF); // no more bardsong uses left + return; + } + + if (GetHasEffect(EFFECT_TYPE_SILENCE,OBJECT_SELF)) + { + FloatingTextStrRefOnCreature(85764,OBJECT_SELF); // not useable when silenced + return; + } + + + //Declare major variables + int nLevel = GetLevelByClass(CLASS_TYPE_BARD); + int nRanks = GetSkillRank(SKILL_PERFORM); + int nPerform = nRanks; + int nDuration = 10; //+ nChr; + + effect eAttack; + effect eDamage; + effect eWill; + effect eFort; + effect eReflex; + effect eHP; + effect eAC; + effect eSkill; + + int nAttack; + int nDamage; + int nWill; + int nFort; + int nReflex; + int nHP; + int nAC; + int nSkill; + + if(GetHasFeat(424)) // lingering song + { + nDuration += 5; + } + + //Check to see if the caster has Lasting Impression and increase duration. + if(GetHasFeat(870)) + { + nDuration *= 5; + } + + /*if(nPerform >= 100 && nLevel >= 30) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 48; + nAC = 7; + nSkill = 18; + } + else if(nPerform >= 95 && nLevel >= 29) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 46; + nAC = 6; + nSkill = 17; + } + else if(nPerform >= 90 && nLevel >= 28) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 44; + nAC = 6; + nSkill = 16; + } + else if(nPerform >= 85 && nLevel >= 27) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 42; + nAC = 6; + nSkill = 15; + } + else if(nPerform >= 80 && nLevel >= 26) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 40; + nAC = 6; + nSkill = 14; + } + else*/ + if(nPerform >= 100 && nLevel >= 40) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 38; + nAC = 5; + nSkill = 13; + } + else if(nPerform >= 90 && nLevel >= 36) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 36; + nAC = 5; + nSkill = 12; + } + else if(nPerform >= 80 && nLevel >= 32) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 34; + nAC = 5; + nSkill = 11; + } + else if(nPerform >= 70 && nLevel >= 28) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 32; + nAC = 5; + nSkill = 10; + } + else if(nPerform >= 60 && nLevel >= 24) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 30; + nAC = 5; + nSkill = 9; + } + else if(nPerform >= 50 && nLevel >= 20) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 28; + nAC = 5; + nSkill = 8; + } + else if(nPerform >= 45 && nLevel >= 19) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 26; + nAC = 5; + nSkill = 7; + } + else if(nPerform >= 40 && nLevel >= 18) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 24; + nAC = 5; + nSkill = 6; + } + else if(nPerform >= 35 && nLevel >= 17) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 22; + nAC = 5; + nSkill = 5; + } + else if(nPerform >= 30 && nLevel >= 16) + { + nAttack = 2; + nDamage = 3; + nWill = 3; + nFort = 2; + nReflex = 2; + nHP = 20; + nAC = 5; + nSkill = 4; + } + else if(nPerform >= 24 && nLevel >= 15) + { + nAttack = 2; + nDamage = 3; + nWill = 2; + nFort = 2; + nReflex = 2; + nHP = 16; + nAC = 4; + nSkill = 3; + } + else if(nPerform >= 21 && nLevel >= 14) + { + nAttack = 2; + nDamage = 3; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 16; + nAC = 3; + nSkill = 2; + } + else if(nPerform >= 18 && nLevel >= 11) + { + nAttack = 2; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 8; + nAC = 2; + nSkill = 2; + } + else if(nPerform >= 15 && nLevel >= 8) + { + nAttack = 2; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 8; + nAC = 0; + nSkill = 1; + } + else if(nPerform >= 12 && nLevel >= 6) + { + nAttack = 1; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 1; + nHP = 0; + nAC = 0; + nSkill = 1; + } + else if(nPerform >= 9 && nLevel >= 3) + { + nAttack = 1; + nDamage = 2; + nWill = 1; + nFort = 1; + nReflex = 0; + nHP = 0; + nAC = 0; + nSkill = 0; + } + else if(nPerform >= 6 && nLevel >= 2) + { + nAttack = 1; + nDamage = 1; + nWill = 1; + nFort = 0; + nReflex = 0; + nHP = 0; + nAC = 0; + nSkill = 0; + } + else if(nPerform >= 3 && nLevel >= 1) + { + nAttack = 1; + nDamage = 1; + nWill = 0; + nFort = 0; + nReflex = 0; + nHP = 0; + nAC = 0; + nSkill = 0; + } + + //If the bard has Extra Music and is at least 12lvl, give a small random bonus to this song + if (nLevel >= 12 && GetHasFeat(FEAT_EXTRA_MUSIC, OBJECT_SELF) ) + { + switch(d10()) + { + case 1: nAttack = nAttack + 1;break; + case 2: nDamage = nDamage + 1;break; + case 3: nWill = nWill + 1;break; + case 4: nFort = nFort + 1;break; + case 5: nReflex = nReflex + 1;break; + case 6: nAC = nAC + 1;break; + case 7: nSkill = nSkill + 1;break; + case 8: nWill = nWill + 2;break; + case 9: nFort = nFort + 2;break; + case 10: nReflex = nReflex + 2;break; + } + } + //End of Extra Music bonus + + effect eVis = EffectVisualEffect(VFX_IMP_DOOM); + + eAttack = EffectAttackDecrease(nAttack); + eDamage = EffectDamageDecrease(nDamage, DAMAGE_TYPE_SLASHING); + effect eLink = EffectLinkEffects(eAttack, eDamage); + + if(nWill > 0) + { + eWill = EffectSavingThrowDecrease(SAVING_THROW_WILL, nWill); + eLink = EffectLinkEffects(eLink, eWill); + } + if(nFort > 0) + { + eFort = EffectSavingThrowDecrease(SAVING_THROW_FORT, nFort); + eLink = EffectLinkEffects(eLink, eFort); + } + if(nReflex > 0) + { + eReflex = EffectSavingThrowDecrease(SAVING_THROW_REFLEX, nReflex); + eLink = EffectLinkEffects(eLink, eReflex); + } + if(nHP > 0) + { + //SpeakString("HP Bonus " + IntToString(nHP)); + eHP = EffectDamage(nHP, DAMAGE_TYPE_SONIC, DAMAGE_POWER_NORMAL); +// eLink = EffectLinkEffects(eLink, eHP); + } + if(nAC > 0) + { + eAC = EffectACDecrease(nAC, AC_DODGE_BONUS); + eLink = EffectLinkEffects(eLink, eAC); + } + if(nSkill > 0) + { + eSkill = EffectSkillDecrease(SKILL_ALL_SKILLS, nSkill); + eLink = EffectLinkEffects(eLink, eSkill); + } + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eDur2 = EffectVisualEffect(507); + eLink = EffectLinkEffects(eLink, eDur); + + effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_SONIC); + effect eFNF = EffectVisualEffect(VFX_FNF_LOS_EVIL_30); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, GetLocation(OBJECT_SELF)); + + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + + eHP = ExtraordinaryEffect(eHP); + eLink = ExtraordinaryEffect(eLink); + + if(!GetHasFeatEffect(871, oTarget)&& !GetHasSpellEffect(GetSpellId(),oTarget)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur2, OBJECT_SELF, RoundsToSeconds(nDuration)); + } + float fDelay; + while(GetIsObjectValid(oTarget)) + { + if(spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, OBJECT_SELF)) + { + // * GZ Oct 2003: If we are deaf, we do not have negative effects from curse song + if (!GetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !GetHasEffect(EFFECT_TYPE_DEAF,oTarget)) + { + if(!GetHasFeatEffect(871, oTarget)&& !GetHasSpellEffect(GetSpellId(),oTarget)) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId())); + if (nHP > 0) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SONIC), oTarget); + DelayCommand(0.01, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHP, oTarget)); + } + + if (!GetIsDead(oTarget)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration)); + DelayCommand(GetRandomDelay(0.1,0.5),ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + } + } + } + else + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE), oTarget); + } + } + + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + } + DecrementRemainingFeatUses(OBJECT_SELF, FEAT_BARD_SONGS); +} diff --git a/_removed/x2_s2_discbreath.ncs b/_removed/x2_s2_discbreath.ncs new file mode 100644 index 0000000..65f089d Binary files /dev/null and b/_removed/x2_s2_discbreath.ncs differ diff --git a/_removed/x2_s2_discbreath.nss b/_removed/x2_s2_discbreath.nss new file mode 100644 index 0000000..bbf703a --- /dev/null +++ b/_removed/x2_s2_discbreath.nss @@ -0,0 +1,63 @@ +//:://///////////////////////////////////////////// +//:: Breath Weapon for Dragon Disciple Class +//:: x2_s2_discbreath +//:: Copyright (c) 2003Bioware Corp. +//::////////////////////////////////////////////// +/* + + Damage Type is Fire + Save is Reflex + Shape is cone, 30' == 10m + + Level Damage Save + --------------------------- + 3 2d10 19 + 7 4d10 19 + 10 6d10 19 + + after 10: + damage: 6d10 + 1d10 per 3 levels after 10 + savedc: increasing by 1 every 4 levels after 10 + + + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: June, 17, 2003 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- wrong target check (could affect other NPCs) +- damage was the same for all creatures in AoE +- old evasion behaviour (now that evasion is applied will appear in log) +*/ + +#include "x0_i0_spells" + +void main() +{ + //This part is to avoid some weird stacking issues + if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1) + { + IncrementRemainingFeatUses(OBJECT_SELF, FEAT_DRAGON_DIS_BREATH); + return; + } + location lLocation = GetSpellTargetLocation(); + SetLocalInt(OBJECT_SELF, "ddbreath", 1); + switch (GetCreatureWingType(OBJECT_SELF)) + { + case 4: ActionCastSpellAtLocation(239, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //red dragon breathing fire + case 34: ActionCastSpellAtLocation(236, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //black dragon breathing acid + case 35: ActionCastSpellAtLocation(241, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //blue dragon breathing lightning + case 36: ActionCastSpellAtLocation(239, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //brass dragon breathing fire + case 37: ActionCastSpellAtLocation(241, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //bronze dragon breathing lightning + case 38: ActionCastSpellAtLocation(236, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //copper dragon breathing acid + case 39: ActionCastSpellAtLocation(239, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //gold dragon breathing fire + case 40: ActionCastSpellAtLocation(240, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //green dragon breathing gas + case 41: ActionCastSpellAtLocation(237, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //silver dragon breathing cold + case 42: ActionCastSpellAtLocation(237, lLocation, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);break; //white dragon breathing cold + } + +} diff --git a/_removed/x2_s2_divwrath.ncs b/_removed/x2_s2_divwrath.ncs new file mode 100644 index 0000000..d73405b Binary files /dev/null and b/_removed/x2_s2_divwrath.ncs differ diff --git a/_removed/x2_s2_divwrath.nss b/_removed/x2_s2_divwrath.nss new file mode 100644 index 0000000..3cbc785 --- /dev/null +++ b/_removed/x2_s2_divwrath.nss @@ -0,0 +1,142 @@ +//:://///////////////////////////////////////////// +//:: Divine Wrath +//:: x2_s2_DivWrath +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + The Divine Champion is able to channel a portion + of their gods power once per day giving them a +3 + bonus on attack rolls, damage, and saving throws + for a number of rounds equal to their Charisma + bonus. They also gain damage reduction of +1/5. + At 10th level, an additional +2 is granted to + attack rolls and saving throws. + + Epic Progression + Every five levels past 10 an additional +2 + on attack rolls, damage and saving throws is added. As well the damage + reduction increases by 5 and the damage power required to penetrate + damage reduction raises by +1 (to a maximum of /+5). +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Feb 05, 2003 +//:: Updated On: Jul 21, 2003 Georg Zoeller - +// Epic Level progession +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- did signalized wrong spell ID +*/ + +#include "nw_i0_spells" + +void main() +{ + //Declare major variables + object oTarget = OBJECT_SELF; + int nDuration = GetAbilityModifier(ABILITY_CHARISMA, OBJECT_SELF); + //Check that if nDuration is not above 0, make it 1. + if(nDuration <= 0) + { + FloatingTextStrRefOnCreature(100967,OBJECT_SELF); + return; + } + + effect eVis = EffectVisualEffect(VFX_IMP_HEAD_HOLY); + eVis = EffectLinkEffects(EffectVisualEffect(VFX_IMP_GOOD_HELP),eVis); + effect eAttack, eDamage, eSaving, eReduction; + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, 622, FALSE)); + + int nAttackB = 3; + int nDamageB = DAMAGE_BONUS_3; + int nSaveB = 3 ; + int nDmgRedB = 5; + int nDmgRedP = DAMAGE_POWER_PLUS_ONE; + + // --------------- Epic Progression --------------------------- + + int nLevelDiv = GetLevelByClass(CLASS_TYPE_DIVINECHAMPION,oTarget); + int nLevelPal = GetLevelByClass(CLASS_TYPE_PALADIN,oTarget)-10; + int nLevelBlg = GetLevelByClass(CLASS_TYPE_BLACKGUARD,oTarget); + int nLevel = nLevelDiv; + if (nLevelPal > nLevel) nLevel = nLevelPal; + if (nLevelBlg > nLevel) nLevel = nLevelBlg; + + int nLevelB = (nLevel / 5)-1; + if (nLevelB <=0) + { + nLevelB =0; + } + else + { + nAttackB += (nLevelB*2); // +2 to attack every 5 levels past 5 + nSaveB += (nLevelB*2); // +2 to saves every 5 levels past 5 + } + + if (nLevelB >6 ) + { + nDmgRedP = DAMAGE_POWER_PLUS_FIVE; + nDmgRedB = 7*5; + nDamageB = DAMAGE_BONUS_17; + } + else if (nLevelB >5 ) + { + nDmgRedP = DAMAGE_POWER_PLUS_FIVE; + nDmgRedB = 6*5; + nDamageB = DAMAGE_BONUS_15; + } + else if (nLevelB >4 ) + { + nDmgRedP = DAMAGE_POWER_PLUS_FIVE; + nDmgRedB = 5*5; + nDamageB = DAMAGE_BONUS_13; + } + else if (nLevelB >3) + { + nDmgRedP = DAMAGE_POWER_PLUS_FOUR; + nDmgRedB = 4*5; + nDamageB = DAMAGE_BONUS_11; + } + else if (nLevelB >2) + { + nDmgRedP = DAMAGE_POWER_PLUS_THREE; + nDmgRedB = 3*5; + nDamageB = DAMAGE_BONUS_9; + } + else if (nLevelB >1) + { + nDmgRedP = DAMAGE_POWER_PLUS_TWO; + nDmgRedB = 2*5; + nDamageB = DAMAGE_BONUS_7; + } + else if (nLevelB >0) + { + nDamageB = DAMAGE_BONUS_5; + } + //-------------------------------------------------------------- + // + //-------------------------------------------------------------- + + eAttack = EffectAttackIncrease(nAttackB,ATTACK_BONUS_MISC); + eDamage = EffectDamageIncrease(nDamageB, DAMAGE_TYPE_DIVINE); + eSaving = EffectSavingThrowIncrease(SAVING_THROW_ALL,nSaveB, SAVING_THROW_TYPE_ALL); + eReduction = EffectDamageReduction(nDmgRedB, nDmgRedP); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); + + effect eLink = EffectLinkEffects(eAttack, eDamage); + eLink = EffectLinkEffects(eSaving,eLink); + eLink = EffectLinkEffects(eReduction,eLink); + eLink = EffectLinkEffects(eDur,eLink); + eLink = SupernaturalEffect(eLink); + + // prevent stacking with self + RemoveEffectsFromSpell(oTarget, GetSpellId()); + + + //Apply the armor bonuses and the VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); +} diff --git a/_removed/x2_s2_dragknght.ncs b/_removed/x2_s2_dragknght.ncs new file mode 100644 index 0000000..43e3600 Binary files /dev/null and b/_removed/x2_s2_dragknght.ncs differ diff --git a/_removed/x2_s2_dragknght.nss b/_removed/x2_s2_dragknght.nss new file mode 100644 index 0000000..2f1c6ca --- /dev/null +++ b/_removed/x2_s2_dragknght.nss @@ -0,0 +1,74 @@ +//:://///////////////////////////////////////////// +//:: Dragon Knight +//:: X2_S2_DragKnght +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Summons an adult red dragon for you to + command. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Feb 07, 2003 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x2_inc_toollib" +#include "x2_inc_spellhook" + +void main() +{ + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + */ + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + + //Declare major variables + spellsDeclareMajorVariables(); + effect eVis = EffectVisualEffect(460); + + if (GetCasterLevel(OBJECT_SELF) >= 40) + { + int nDuration = 10; + SetLocalString(OBJECT_SELF, "summoned_dragon", "na_s_epicdk"); + effect eSummon = EffectSummonCreature(GetLocalString(OBJECT_SELF, "summoned_dragon"),481,0.0,TRUE); + + // * make it so dragon cannot be dispelled + eSummon = ExtraordinaryEffect(eSummon); + //Apply the summon visual and summon the dragon. + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, RoundsToSeconds(nDuration)); + DelayCommand(1.0,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, spell.Loc)); + } + else if (GetCasterLevel(OBJECT_SELF) >= 31) + { + int nDuration = 20; + SetLocalString(OBJECT_SELF, "summoned_dragon", "na_s_dkadult"); + effect eSummon = EffectSummonCreature(GetLocalString(OBJECT_SELF, "summoned_dragon"),481,0.0,TRUE); + + // * make it so dragon cannot be dispelled + eSummon = ExtraordinaryEffect(eSummon); + //Apply the summon visual and summon the dragon. + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, RoundsToSeconds(nDuration)); + DelayCommand(1.0,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, spell.Loc)); + } + else + { + int nDuration = 20; + SetLocalString(OBJECT_SELF, "summoned_dragon", "na_s_dkyoung"); + effect eSummon = EffectSummonCreature(GetLocalString(OBJECT_SELF, "summoned_dragon"),481,0.0,TRUE); + + // * make it so dragon cannot be dispelled + eSummon = ExtraordinaryEffect(eSummon); + //Apply the summon visual and summon the dragon. + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, RoundsToSeconds(nDuration)); + DelayCommand(1.0,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, spell.Loc)); + } + +} diff --git a/_removed/x2_s2_epicward.ncs b/_removed/x2_s2_epicward.ncs new file mode 100644 index 0000000..b928f9a Binary files /dev/null and b/_removed/x2_s2_epicward.ncs differ diff --git a/_removed/x2_s2_epicward.nss b/_removed/x2_s2_epicward.nss new file mode 100644 index 0000000..183336a --- /dev/null +++ b/_removed/x2_s2_epicward.nss @@ -0,0 +1,60 @@ +//:://///////////////////////////////////////////// +//:: Epic Ward +//:: X2_S2_EpicWard. +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Makes the caster invulnerable to damage + (equals damage reduction 50/+20) + Lasts 1 round per level + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: Aug 12, 2003 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "nw_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* + Spellcast Hook Code + Added 2003-06-23 by GeorgZ + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + +*/ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + +// End of Spell Cast Hook + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level / 2; + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + int nLimit = 50*nDuration; + //Check for metamagic extend + if(spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + {//1.70 added in order to allow metamagic override feature + nDuration = nDuration * 2; + } + effect eDur = EffectVisualEffect(495); + effect eProt = EffectDamageReduction(15, DAMAGE_POWER_PLUS_SIX, nLimit); + effect eLink = EffectLinkEffects(eDur, eProt); + eLink = EffectLinkEffects(eLink, eDur); + + // * Brent, Nov 24, making extraodinary so cannot be dispelled + eLink = ExtraordinaryEffect(eLink); + + RemoveEffectsFromSpell(spell.Target, spell.Id); + //Apply the armor bonuses and the VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, RoundsToSeconds(nDuration)); +} diff --git a/_removed/x2_s2_epmagearm.ncs b/_removed/x2_s2_epmagearm.ncs new file mode 100644 index 0000000..8e584bd Binary files /dev/null and b/_removed/x2_s2_epmagearm.ncs differ diff --git a/_removed/x2_s2_epmagearm.nss b/_removed/x2_s2_epmagearm.nss new file mode 100644 index 0000000..963e3cd --- /dev/null +++ b/_removed/x2_s2_epmagearm.nss @@ -0,0 +1,67 @@ +//:://///////////////////////////////////////////// +//:: Epic Mage Armor +//:: X2_S2_EpMageArm +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Gives the target +20 AC Bonus to Deflection, + Armor Enchantment, Natural Armor and Dodge. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Feb 07, 2003 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "nw_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = spell.Level; + effect eVis = EffectVisualEffect(495); + effect eAC1, eAC2, eAC3, eAC4; + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id, FALSE)); + //Check for metamagic extend + if(spell.Meta == METAMAGIC_EXTEND) //Duration is +100% + { + nDuration = nDuration * 2; + } + //Set the four unique armor bonuses + eAC1 = EffectACIncrease(3, AC_ARMOUR_ENCHANTMENT_BONUS); + eAC2 = EffectACIncrease(3, AC_SHIELD_ENCHANTMENT_BONUS); + eAC3 = EffectACIncrease(3, AC_DODGE_BONUS); + eAC4 = EffectACIncrease(3, AC_NATURAL_BONUS); + effect eDur = EffectVisualEffect(VFX_DUR_SANCTUARY); + + effect eLink = EffectLinkEffects(eAC1, eAC2); + eLink = EffectLinkEffects(eLink, eAC3); + eLink = EffectLinkEffects(eLink, eAC4); + eLink = EffectLinkEffects(eLink, eDur); + + RemoveEffectsFromSpell(spell.Target, spell.Id); + + // * Brent, Nov 24, making extraodinary so cannot be dispelled + eLink = ExtraordinaryEffect(eLink); + + //Apply the armor bonuses and the VFX impact + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, spell.Target, HoursToSeconds(nDuration)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, spell.Target, 1.0); +} diff --git a/_removed/x2_s2_gwildshp.ncs b/_removed/x2_s2_gwildshp.ncs new file mode 100644 index 0000000..9f80655 Binary files /dev/null and b/_removed/x2_s2_gwildshp.ncs differ diff --git a/_removed/x2_s2_gwildshp.nss b/_removed/x2_s2_gwildshp.nss new file mode 100644 index 0000000..e40b15f --- /dev/null +++ b/_removed/x2_s2_gwildshp.nss @@ -0,0 +1,621 @@ +//:://///////////////////////////////////////////// +//:: Greater Wild Shape, Humanoid Shape +//:: x2_s2_gwildshp +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Allows the character to shift into one of these + forms, gaining special abilities + + Credits must be given to mr_bumpkin from the NWN + community who had the idea of merging item properties + from weapon and armor to the creatures new forms. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: 2003-07-02 +//::////////////////////////////////////////////// +//:: Modified By: Deva Winblood +//:: Modified Date: January 26th, 2008 +//::////////////////////////////////////////////// +/* + Modified to insure no shapeshifting spells are castable upon + mounted targets. This prevents problems that can occur due + to dismounting after shape shifting, or other issues that can + occur due to preserved appearances getting out of synch. + + This can additional check can be disabled by setting the variable + X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this + variable is set then this script will function as it did prior to + this modification. + +Patch 1.71 + +- allowed to merge any custom non-weapon in left hand slot such as flags or +musical instruments +- added optional feature to stack ability bonuses from multiple items together +- added optional feature to merge bracers (when items are allowed to merge) +- added benefits of being incorporeal to the spectre shape (50% concealment and +the ability to walk through other creatures) +- a spectre polymorph now also release character from the effects of the grappling +- cured from horse include while retaining the shapeshifting horse check +- fixed dying when unpolymorphed as an result of sudden constitution bonus drop +which also could result to the server crash +*/ + +#include "70_inc_itemprop" +#include "x2_inc_itemprop" +#include "x2_inc_shifter" +#include "x3_inc_horse" + + +void main() +{ + //-------------------------------------------------------------------------- + // Declare major variables + //-------------------------------------------------------------------------- + int nSpell = GetSpellId(); + object oTarget = GetSpellTargetObject(); + effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH); + int nShifter = GetLevelByClass(CLASS_TYPE_SHIFTER); + effect ePoly; + int nPoly; + + if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK")) + { // check to see if abort due to being mounted + switch(GetPhenoType(oTarget)) + {// shape shifting not allowed while mounted + case 3: + case 5: + case 6: + case 8: + if(GetIsPC(oTarget)) + { + FloatingTextStrRefOnCreature(111982,oTarget,FALSE); + } + // shape shifting not allowed while mounted + return; + } + } // check to see if abort due to being mounted + + // Feb 13, 2004, Jon: Added scripting to take care of case where it's an NPC + // using one of the feats. It will randomly pick one of the shapes associated + // with the feat. + switch(nSpell) + { + // Greater Wildshape I + case 646: nSpell = Random(5)+658; break; + // Greater Wildshape II + case 675: switch(Random(3)) + { + case 0: nSpell = 672; break; + case 1: nSpell = 678; break; + case 2: nSpell = 680; + } + break; + // Greater Wildshape III + case 676: switch(Random(3)) + { + case 0: nSpell = 670; break; + case 1: nSpell = 673; break; + case 2: nSpell = 674; + } + break; + // Greater Wildshape IV + case 677: switch(Random(3)) + { + case 0: nSpell = 679; break; + case 1: nSpell = 691; break; + case 2: nSpell = 694; + } + break; + // Humanoid Shape + case 681: nSpell = Random(3)+682; break; + // Undead Shape + case 685: nSpell = Random(3)+704; break; + // Dragon Shape + case 725: nSpell = Random(3)+707; break; + // Outsider Shape + case 732: nSpell = Random(3)+733; break; + // Construct Shape + case 737: nSpell = Random(3)+738; break; + } + + //-------------------------------------------------------------------------- + // Determine which form to use based on spell id, gender and level + //-------------------------------------------------------------------------- + switch (nSpell) + { + + //----------------------------------------------------------------------- + // Greater Wildshape I - Wyrmling Shape + //----------------------------------------------------------------------- + case 658: nPoly = POLYMORPH_TYPE_WYRMLING_RED; break; + case 659: nPoly = POLYMORPH_TYPE_WYRMLING_BLUE; break; + case 660: nPoly = POLYMORPH_TYPE_WYRMLING_BLACK; break; + case 661: nPoly = POLYMORPH_TYPE_WYRMLING_WHITE; break; + case 662: nPoly = POLYMORPH_TYPE_WYRMLING_GREEN; break; + + //----------------------------------------------------------------------- + // Greater Wildshape II - Minotaur, Gargoyle, Harpy + //----------------------------------------------------------------------- + case 672: if (nShifter < X2_GW2_EPIC_THRESHOLD) + nPoly = POLYMORPH_TYPE_HARPY; + else + nPoly = 97; + break; + + case 678: if (nShifter < X2_GW2_EPIC_THRESHOLD) + nPoly = POLYMORPH_TYPE_GARGOYLE; + else + nPoly = 98; + break; + + case 680: if (nShifter < X2_GW2_EPIC_THRESHOLD) + nPoly = POLYMORPH_TYPE_MINOTAUR; + else + nPoly = 96; + break; + + //----------------------------------------------------------------------- + // Greater Wildshape III - Drider, Basilisk, Manticore + //----------------------------------------------------------------------- + case 670: if (nShifter < X2_GW3_EPIC_THRESHOLD) + nPoly = POLYMORPH_TYPE_BASILISK; + else + nPoly = 99; + break; + + case 673: if (nShifter < X2_GW3_EPIC_THRESHOLD) + nPoly = POLYMORPH_TYPE_DRIDER; + else + nPoly = 100; + break; + + case 674: if (nShifter < X2_GW3_EPIC_THRESHOLD) + nPoly = POLYMORPH_TYPE_MANTICORE; + else + nPoly = 101; + break; + + //----------------------------------------------------------------------- + // Greater Wildshape IV - Dire Tiger, Medusa, MindFlayer + //----------------------------------------------------------------------- + case 679: nPoly = POLYMORPH_TYPE_MEDUSA; break; + case 691: nPoly = 68; break; // Mindflayer + case 694: nPoly = 69; break; // DireTiger + + + //----------------------------------------------------------------------- + // Humanoid Shape - Kobold Commando, Drow, Lizard Crossbow Specialist + //----------------------------------------------------------------------- + case 682: + if(nShifter< 17) + { + if (GetGender(OBJECT_SELF) == GENDER_MALE) //drow + nPoly = 59; + else + nPoly = 70; + } + else + { + if (GetGender(OBJECT_SELF) == GENDER_MALE) //drow + nPoly = 105; + else + nPoly = 106; + } + break; + case 683: + if(nShifter< 17) + { + nPoly = 82; break; // Lizard + } + else + { + nPoly =104; break; // Epic Lizard + } + case 684: if(nShifter< 17) + { + nPoly = 83; break; // Kobold Commando + } + else + { + nPoly = 103; break; // Kobold Commando + } + + //----------------------------------------------------------------------- + // Undead Shape - Spectre, Risen Lord, Vampire + //----------------------------------------------------------------------- + case 704: nPoly = 75; break; // Risen lord + + case 705: if (GetGender(OBJECT_SELF) == GENDER_MALE) // vampire + nPoly = 74; + else + nPoly = 77; + break; + + case 706: nPoly = 76; break; /// spectre + + //----------------------------------------------------------------------- + // Dragon Shape - Red Blue and Green Dragons + //----------------------------------------------------------------------- + case 707: nPoly = 72; break; // Ancient Red Dragon + case 708: nPoly = 71; break; // Ancient Blue Dragon + case 709: nPoly = 73; break; // Ancient Green Dragon + + + //----------------------------------------------------------------------- + // Outsider Shape - Rakshasa, Azer Chieftain, Black Slaad + //----------------------------------------------------------------------- + case 733: if (GetGender(OBJECT_SELF) == GENDER_MALE) //azer + nPoly = 85; + else // anything else is female + nPoly = 86; + break; + + case 734: if (GetGender(OBJECT_SELF) == GENDER_MALE) //rakshasa + nPoly = 88; + else // anything else is female + nPoly = 89; + break; + + case 735: nPoly =87; break; // slaad + + //----------------------------------------------------------------------- + // Construct Shape - Stone Golem, Iron Golem, Demonflesh Golem + //----------------------------------------------------------------------- + case 738: nPoly =91; break; // stone golem + case 739: nPoly =92; break; // demonflesh golem + case 740: nPoly =90; break; // iron golem + + } + + + //-------------------------------------------------------------------------- + // Determine which items get their item properties merged onto the shifters + // new form. + //-------------------------------------------------------------------------- + int bWeapon = ShifterMergeWeapon(nPoly); + int bArmor = ShifterMergeArmor(nPoly); + int bItems = ShifterMergeItems(nPoly); + int bArms = bItems && GetLocalInt(GetModule(),"71_POLYMORPH_MERGE_ARMS"); + //-------------------------------------------------------------------------- + // Store the old objects so we can access them after the character has + // changed into his new form + //-------------------------------------------------------------------------- + object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF); + object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF); + object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF); + object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF); + object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF); + object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF); + object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF); + object oArmsOld = GetItemInSlot(INVENTORY_SLOT_ARMS,OBJECT_SELF); + object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF); + object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF); + + if (GetIsObjectValid(oShield)) + { //1.71: this is now custom content compatible, polymorph will merge custom left-hand only items such as flags + if (GetWeaponRanged(oShield) || IPGetIsMeleeWeapon(oShield)) + { + oShield = OBJECT_INVALID; + } + } + + int nConBonus; + if (bWeapon) + { + nConBonus = IPGetBestConBonus(nConBonus,oWeaponOld); + } + if (bArmor) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmorOld); + nConBonus = IPGetBestConBonus(nConBonus,oHelmetOld); + nConBonus = IPGetBestConBonus(nConBonus,oShield); + } + if (bItems) + { + nConBonus = IPGetBestConBonus(nConBonus,oRing1Old); + nConBonus = IPGetBestConBonus(nConBonus,oRing2Old); + nConBonus = IPGetBestConBonus(nConBonus,oAmuletOld); + nConBonus = IPGetBestConBonus(nConBonus,oCloakOld); + nConBonus = IPGetBestConBonus(nConBonus,oBeltOld); + nConBonus = IPGetBestConBonus(nConBonus,oBootsOld); + } + if (bArms) + { + nConBonus = IPGetBestConBonus(nConBonus,oArmsOld); + } + + //-------------------------------------------------------------------------- + // Here the actual polymorphing is done + //-------------------------------------------------------------------------- + ePoly = EffectPolymorph(nPoly); + if(nConBonus > 0) + {//1.70: this fixes dying when unpolymorphed issue as well as server crash related to this + ePoly = EffectLinkEffects(ePoly,EffectAbilityIncrease(ABILITY_CONSTITUTION,nConBonus)); + } + if(nPoly == 76) + {//1.71: added benefits of being incorporeal into polymorph effect for spectre shape + ePoly = EffectLinkEffects(ePoly,EffectConcealment(50)); + ePoly = EffectLinkEffects(ePoly,EffectCutsceneGhost()); + if(GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND))//in a spectre polymorph, player releases from any kind of grapple + { + RemoveEffectsFromSpell(OBJECT_SELF, SPELL_BIGBYS_CRUSHING_HAND); + } + if(GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND)) + { + RemoveEffectsFromSpell(OBJECT_SELF, SPELL_BIGBYS_GRASPING_HAND); + } + RemoveSpecificEffect(EFFECT_TYPE_ENTANGLE,OBJECT_SELF); + } + + + //This chunk of code makes outsider, undead and construct shapes stronger at shifter lvls 25, 27 and 30. + if (GetLevelByClass(CLASS_TYPE_SHIFTER) >= 25) + { + if (GetLevelByClass(CLASS_TYPE_SHIFTER) >= 30) + { + if (nSpell == 738) //Stone golem + { + ePoly = EffectLinkEffects(EffectACIncrease(20, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectACIncrease(3, AC_NATURAL_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 5), ePoly); + } + if (nSpell == 739) //Demonflesh golem + { + ePoly = EffectLinkEffects(EffectACIncrease(7, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(13), ePoly); + ePoly = EffectLinkEffects(EffectSpellResistanceIncrease(58), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 5), ePoly); + } + if (nSpell == 740) //Iron golem + { + ePoly = EffectLinkEffects(EffectACIncrease(5, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(13), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 3), ePoly); + } + if (nSpell == 733) //Azer + { + ePoly = EffectLinkEffects(EffectACIncrease(11, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(11), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 3), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(3, DAMAGE_TYPE_SLASHING), ePoly); + } + if (nSpell == 735) //Death slaad + { + ePoly = EffectLinkEffects(EffectACIncrease(5, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(17), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 3), ePoly); + } + if (nSpell == 704) //Risen Lord + { + ePoly = EffectLinkEffects(EffectACIncrease(11, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(11), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 3), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(6, DAMAGE_TYPE_SLASHING), ePoly); + } + if (nSpell == 705) //Vampire + { + ePoly = EffectLinkEffects(EffectACIncrease(3, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(15), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 3), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(6, DAMAGE_TYPE_BLUDGEONING), ePoly); + ePoly = EffectLinkEffects(EffectRegenerate(6, 6.0), ePoly); + } + if (nSpell == 706) //Spectre + { + ePoly = EffectLinkEffects(EffectACIncrease(16, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(13), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 5), ePoly); + } + } + else if (GetLevelByClass(CLASS_TYPE_SHIFTER) >= 27) + { + if (nSpell == 738) //Stone golem + { + ePoly = EffectLinkEffects(EffectACIncrease(16, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 4), ePoly); + } + if (nSpell == 739) //Demonflesh golem + { + ePoly = EffectLinkEffects(EffectACIncrease(5, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(7), ePoly); + ePoly = EffectLinkEffects(EffectSpellResistanceIncrease(56), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 4), ePoly); + } + if (nSpell == 740) //Iron golem + { + ePoly = EffectLinkEffects(EffectACIncrease(4, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(9), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + } + if (nSpell == 733) //Azer + { + ePoly = EffectLinkEffects(EffectACIncrease(8, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(8), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(2, DAMAGE_TYPE_SLASHING), ePoly); + } + if (nSpell == 735) //Death slaad + { + ePoly = EffectLinkEffects(EffectACIncrease(4, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(12), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + } + if (nSpell == 704) //Risen Lord + { + ePoly = EffectLinkEffects(EffectACIncrease(7, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(7), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(4, DAMAGE_TYPE_SLASHING), ePoly); + } + if (nSpell == 705) //Vampire + { + ePoly = EffectLinkEffects(EffectACIncrease(2, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(10), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(4, DAMAGE_TYPE_BLUDGEONING), ePoly); + ePoly = EffectLinkEffects(EffectRegenerate(4, 6.0), ePoly); + } + if (nSpell == 706) //Spectre + { + ePoly = EffectLinkEffects(EffectACIncrease(11, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(9), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 4), ePoly); + } + } + else + { + if (nSpell == 738) //Stone golem + { + ePoly = EffectLinkEffects(EffectACIncrease(8, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + } + if (nSpell == 739) //Demonflesh golem + { + ePoly = EffectLinkEffects(EffectACIncrease(3, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(4), ePoly); + ePoly = EffectLinkEffects(EffectSpellResistanceIncrease(54), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + } + if (nSpell == 740) //Iron golem + { + ePoly = EffectLinkEffects(EffectACIncrease(2, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(5), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 1), ePoly); + } + if (nSpell == 733) //Azer + { + ePoly = EffectLinkEffects(EffectACIncrease(4, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(4), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 1), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(1, DAMAGE_TYPE_SLASHING), ePoly); + } + if (nSpell == 735) //Death slaad + { + ePoly = EffectLinkEffects(EffectACIncrease(2, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(6), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 1), ePoly); + } + if (nSpell == 704) //Risen Lord + { + ePoly = EffectLinkEffects(EffectACIncrease(4, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(4), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 1), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(2, DAMAGE_TYPE_SLASHING), ePoly); + } + if (nSpell == 705) //Vampire + { + ePoly = EffectLinkEffects(EffectACIncrease(1, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(5), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 1), ePoly); + ePoly = EffectLinkEffects(EffectDamageIncrease(2, DAMAGE_TYPE_BLUDGEONING), ePoly); + ePoly = EffectLinkEffects(EffectRegenerate(2, 6.0), ePoly); + } + if (nSpell == 706) //Spectre + { + ePoly = EffectLinkEffects(EffectACIncrease(6, AC_SHIELD_ENCHANTMENT_BONUS), ePoly); + ePoly = EffectLinkEffects(EffectAttackIncrease(5), ePoly); + ePoly = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2), ePoly); + } + if ((nSpell == 707 || nSpell == 708 || nSpell == 709) && GetLevelByClass(CLASS_TYPE_SHIFTER, OBJECT_SELF) < 10) //Dragon nerf for pure druids + { + ePoly = EffectLinkEffects(EffectAttackDecrease(5), ePoly); + } + } + } + if (nSpell == 694) ePoly = EffectLinkEffects(EffectMovementSpeedIncrease(50), ePoly); //A little extra for shifters in dire tiger form :) + //The end of the shape boosts + + + ePoly = ExtraordinaryEffect(ePoly); + ClearAllActions(); // prevents an exploit + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF); + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE)); + + //-------------------------------------------------------------------------- + // This code handles the merging of item properties + //-------------------------------------------------------------------------- + object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); + object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF); + + //identify weapon + SetIdentified(oWeaponNew, TRUE); + + //-------------------------------------------------------------------------- + // ...Weapons + //-------------------------------------------------------------------------- + if (bWeapon) + { + //---------------------------------------------------------------------- + // GZ: 2003-10-20 + // Sorry, but I was forced to take that out, it was confusing people + // and there were problems with updating the stats sheet. + //---------------------------------------------------------------------- + /* if (!GetIsObjectValid(oWeaponOld)) + { + //------------------------------------------------------------------ + // If we had no weapon equipped before, remove the old weapon + // to allow monks to change into unarmed forms by not equipping any + // weapon before polymorphing + //------------------------------------------------------------------ + DestroyObject(oWeaponNew); + } + else*/ + { + //------------------------------------------------------------------ + // Merge item properties... + //------------------------------------------------------------------ + IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE); + } + } + + //-------------------------------------------------------------------------- + // ...Armor + //-------------------------------------------------------------------------- + if (bArmor) + { + //---------------------------------------------------------------------- + // Merge item properties from armor and helmet... + //---------------------------------------------------------------------- + IPWildShapeCopyItemProperties(oArmorOld,oArmorNew); + IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew); + IPWildShapeCopyItemProperties(oShield,oArmorNew); + } + + //-------------------------------------------------------------------------- + // ...Magic Items + //-------------------------------------------------------------------------- + if (bItems) + { + //---------------------------------------------------------------------- + // Merge item properties from from rings, amulets, cloak, boots, belt + //---------------------------------------------------------------------- + IPWildShapeCopyItemProperties(oRing1Old,oArmorNew); + IPWildShapeCopyItemProperties(oRing2Old,oArmorNew); + IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew); + IPWildShapeCopyItemProperties(oCloakOld,oArmorNew); + IPWildShapeCopyItemProperties(oBootsOld,oArmorNew); + IPWildShapeCopyItemProperties(oBeltOld,oArmorNew); + } + if (bArms) + { + IPWildShapeCopyItemProperties(oArmsOld,oArmorNew); + } + if (GetLocalInt(GetModule(),"71_POLYMORPH_STACK_ABILITY_BONUSES")) + { + IPWildShapeStackAbilityBonuses(oArmorNew); + } + + //-------------------------------------------------------------------------- + // Set artificial usage limits for special ability spells to work around + // the engine limitation of not being able to set a number of uses for + // spells in the polymorph radial + //-------------------------------------------------------------------------- + ShifterSetGWildshapeSpellLimits(nSpell); + +} diff --git a/_removed/x2_s2_hellball.ncs b/_removed/x2_s2_hellball.ncs new file mode 100644 index 0000000..3b3b823 Binary files /dev/null and b/_removed/x2_s2_hellball.ncs differ diff --git a/_removed/x2_s2_hellball.nss b/_removed/x2_s2_hellball.nss new file mode 100644 index 0000000..0d544bd --- /dev/null +++ b/_removed/x2_s2_hellball.nss @@ -0,0 +1,147 @@ +//:://///////////////////////////////////////////// +//:: Hellball +//:: X2_S2_HELLBALL +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Long range area of effect spell + 10d6 sonic, acid, fire and lightning damage to all + objects in the area + + 10d6 points of negative energy damage to caster + if MODULE_SWITCH_EPIC_SPELLS_HURT_CASTER switch + was enabled on the module. + + This spell is supposed to hurt the caster if he + is stupid enough to stand in the area of effect + when all hell breaks loose. It will hurt other + players allied with the caster as well. These + effects are dependent on your difficulty setting + + Save is 20 + relevant ability score, or, when cast + by a placeable, equal to the placeables WILL Save + + There is no benefit from the evasion feats here + as the are of the spell is too large to avoid it + + +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Noobs, Georg Zoeller +//:: Created On: 2003-08-20 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- if cast on self, caster wont be affected in order to make the spell bit more usefull +*/ + +#include "70_inc_spells" +#include "x2_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + + // End of Spell Cast Hook + //Declare major variables + spellsDeclareMajorVariables(); + int nDamage1, nDamage2, nDamage3, nDamage4; + float fDelay; + effect eExplode = EffectVisualEffect(464); + effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); + effect eVis2 = EffectVisualEffect(VFX_IMP_ACID_L); + effect eVis3 = EffectVisualEffect(VFX_IMP_SONIC); + + int nSpellDC = GetEpicSpellSaveDC(spell.Caster)+5; + + // if this option has been enabled, the caster will take damage for casting + // epic spells, as descripbed in the ELHB + if(GetModuleSwitchValue(MODULE_SWITCH_EPIC_SPELLS_HURT_CASTER)) + { + effect eCast = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); + int nDamage5 = d6(10); + effect eDam5 = EffectDamage(nDamage5, DAMAGE_TYPE_NEGATIVE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eCast, spell.Caster); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam5, spell.Caster); + } + + effect eDam1, eDam2, eDam3, eDam4, eDam5; + effect eKnock = EffectKnockdown(); + object oExclude = spell.Target == spell.Caster ? spell.Target : OBJECT_INVALID; + + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, spell.Loc); + + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 20.0, spell.Loc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + + int nTotalDamage; + while(GetIsObjectValid(oTarget)) + { + if(oTarget != oExclude && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster)) + { + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, spell.Id)); + + fDelay = GetDistanceBetweenLocations(spell.Loc, GetLocation(oTarget))/20 + 0.5; + //Roll damage for each target + nDamage1 = d6(30); + nDamage2 = d6(30); + nDamage3 = d6(30); + nDamage4 = d6(30); + // no we don't care about evasion. there is no evasion to hellball + if(spell.Caster == spell.Target) //the spell is weaker when cast on self + { + nDamage1 = d6(10); + nDamage2 = d6(10); + nDamage3 = d6(10); + nDamage4 = d6(10); + } + if(MySavingThrow(SAVING_THROW_REFLEX, oTarget, nSpellDC, SAVING_THROW_TYPE_SPELL, spell.Caster, fDelay)) + { + nDamage1 /=2; + nDamage2 /=2; + nDamage3 /=2; + nDamage4 /=2; + } + nTotalDamage = nDamage1+nDamage2+nDamage3+nDamage4; + //Set the damage effect + eDam1 = EffectDamage(nDamage1, DAMAGE_TYPE_ACID); + eDam2 = EffectDamage(nDamage2, DAMAGE_TYPE_ELECTRICAL); + eDam3 = EffectDamage(nDamage3, DAMAGE_TYPE_FIRE); + eDam4 = EffectDamage(nDamage4, DAMAGE_TYPE_SONIC); + + if(nTotalDamage > 0) + { + if(nTotalDamage > 50) + { + DelayCommand(fDelay+0.3, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget, 3.0)); + } + + // Apply effects to the currently selected target. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam1, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam2, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam3, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam4, oTarget)); + //This visual effect is applied to the target object not the location as above. This visual effect + //represents the flame that erupts on the target not on the ground. + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay+0.2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget)); + DelayCommand(fDelay+0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oTarget)); + } + } + //Select the next target within the spell shape. + oTarget = GetNextObjectInShape(SHAPE_SPHERE, 20.0, spell.Loc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); + } +} diff --git a/_removed/x2_s2_mumdust.ncs b/_removed/x2_s2_mumdust.ncs new file mode 100644 index 0000000..e1362d9 Binary files /dev/null and b/_removed/x2_s2_mumdust.ncs differ diff --git a/_removed/x2_s2_mumdust.nss b/_removed/x2_s2_mumdust.nss new file mode 100644 index 0000000..bd8f388 --- /dev/null +++ b/_removed/x2_s2_mumdust.nss @@ -0,0 +1,77 @@ +//:://///////////////////////////////////////////// +//:: Mummy Dust +//:: X2_S2_MumDust +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Summons a strong warrior mummy for you to + command. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Feb 07, 2003 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x2_inc_spellhook" + +const float cDist = 5.0; +const int cNumbersumm = 2; + +void main() +{ + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + + //Declare major variables + spellsDeclareMajorVariables(); + int nDuration = 24; + //effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); + //Summon the appropriate creature based on the summoner level + //Warrior Mummy + + //If PC is a powerful pale master, ignore the fact that he has low caster level and summon the strongest mummy + if ( GetLevelByClass(CLASS_TYPE_PALE_MASTER, OBJECT_SELF) > 19 ) + { + effect eSummon = EffectSummonCreature("NA_S_MUMMYDUST3",496,1.0); + eSummon = ExtraordinaryEffect(eSummon); + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, HoursToSeconds(nDuration)); + + } + else if (GetCasterLevel(OBJECT_SELF) >= 40) + { + effect eSummon = EffectSummonCreature("NA_S_MUMMYDUST3",496,1.0); + if (GetLevelByClass(CLASS_TYPE_DRUID, OBJECT_SELF) > 20) eSummon = EffectSummonCreature("NA_S_TREANTDUST3",496,1.0); + eSummon = ExtraordinaryEffect(eSummon); + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, HoursToSeconds(nDuration)); + + } + else if (GetCasterLevel(OBJECT_SELF) >= 31) + { + effect eSummon = EffectSummonCreature("NA_S_MUMMYDUST2",496,1.0); + if (GetLevelByClass(CLASS_TYPE_DRUID, OBJECT_SELF) > 20) eSummon = EffectSummonCreature("NA_S_TREANTDUST2",496,1.0); + eSummon = ExtraordinaryEffect(eSummon); + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, HoursToSeconds(nDuration)); + + } + else + { + effect eSummon = EffectSummonCreature("NA_S_MUMMYDUST1",496,1.0); + if (GetLevelByClass(CLASS_TYPE_DRUID, OBJECT_SELF) > 20) eSummon = EffectSummonCreature("NA_S_TREANTDUST1",496,1.0); + eSummon = ExtraordinaryEffect(eSummon); + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, spell.Loc, HoursToSeconds(nDuration)); + + } + +} diff --git a/_removed/x2_s2_poisonwp.ncs b/_removed/x2_s2_poisonwp.ncs new file mode 100644 index 0000000..09b5e1b Binary files /dev/null and b/_removed/x2_s2_poisonwp.ncs differ diff --git a/_removed/x2_s2_poisonwp.nss b/_removed/x2_s2_poisonwp.nss new file mode 100644 index 0000000..c58f7da --- /dev/null +++ b/_removed/x2_s2_poisonwp.nss @@ -0,0 +1,145 @@ +//:://///////////////////////////////////////////// +//:: Poison Weapon spellscript +//:: x2_s2_poisonwp +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Spell allows to add temporary poison properties + to a melee weapon or stack of arrows + + The exact details of the poison are loaded from + a 2da defined in x2_inc_itemprop X2_IP_POSIONWEAPON_2DA + taken from the row that matches the last three letters + of GetTag(GetSpellCastItem()) + + Example: if an item is given the poison weapon property + and its tag ending on 004, the 4th row of the + 2da will be used (1d2IntDmg DC14 18 seconds) + + Rows 0 to 99 are bioware reserved + + Non Assassins have a chance of poisoning themselves + when handling an item with this spell + + Restrictions + ... only weapons and ammo can be poisoned + ... restricted to piercing / slashing damage + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: 2003-05-11 +//:: Updated On: 2003-08-21 +//::////////////////////////////////////////////// +/* +Patch 1.70, fix by ILKAY + +- may now poison user if he fails in dexterity check +*/ + +#include "x2_inc_itemprop" +#include "x2_inc_switches" + +void main() +{ + + object oItem = GetSpellCastItem(); + object oPC = OBJECT_SELF; + object oTarget = GetSpellTargetObject(); + string sTag = GetTag(oItem); + + if (oTarget == OBJECT_INVALID || GetObjectType(oTarget) != OBJECT_TYPE_ITEM) + { + FloatingTextStrRefOnCreature(83359,oPC); //"Invalid target " + return; + } + int nType = GetBaseItemType(oTarget); + if (!IPGetIsMeleeWeapon(oTarget) && + !IPGetIsProjectile(oTarget) && + nType != BASE_ITEM_SHURIKEN && + nType != BASE_ITEM_DART && + nType != BASE_ITEM_THROWINGAXE) + { + FloatingTextStrRefOnCreature(83359,oPC); //"Invalid target " + return; + } + + if (IPGetIsBludgeoningWeapon(oTarget) && nType != BASE_ITEM_MORNINGSTAR) + { + FloatingTextStrRefOnCreature(83367,oPC); //"Weapon does not do slashing or piercing damage " + return; + } + + if (IPGetItemHasItemOnHitPropertySubType(oTarget, 19)) // 19 == itempoison + { + FloatingTextStrRefOnCreature(83407,oPC); // weapon already poisoned + return; + } + + // Get the 2da row to lookup the poison from the last three letters of the tag + int nRow = StringToInt(GetStringRight(sTag,3)); + + if (nRow ==0) + { + FloatingTextStrRefOnCreature(83360,oPC); //"Nothing happens + WriteTimestampedLogEntry ("Error: Item with tag " +GetTag(oItem) + " has the PoisonWeapon spellscript attached but tag does not contain 3 letter receipe code at the end!"); + return; + } + + int nSaveDC = StringToInt(Get2DAString(X2_IP_POISONWEAPON_2DA,"SaveDC",nRow)); + int nDuration = StringToInt(Get2DAString(X2_IP_POISONWEAPON_2DA,"Duration",nRow)); + int nPoisonType = StringToInt(Get2DAString(X2_IP_POISONWEAPON_2DA,"PoisonType",nRow)) ; + int nApplyDC = StringToInt(Get2DAString(X2_IP_POISONWEAPON_2DA,"ApplyCheckDC",nRow)) ; + + int bHasFeat = GetHasFeat(960, oPC); + if (!bHasFeat) // without handle poison feat, do ability check + { + // * Force attacks of opportunity + AssignCommand(oPC,ClearAllActions(TRUE)); + + + // Poison restricted to assassins and blackguards only? + if (GetModuleSwitchValue(MODULE_SWITCH_RESTRICT_USE_POISON_TO_FEAT) == TRUE) + { + FloatingTextStrRefOnCreature(84420,oPC); //"Failed" + return; + } + + int nDex = GetAbilityModifier(ABILITY_DEXTERITY,oPC) ; + int nCheck = d10(1)+10+nDex; + if (nCheck < nApplyDC) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectAbilityDecrease(nPoisonType, d2(1)), oPC, IntToFloat(nDuration)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POISON_S), oPC); + FloatingTextStrRefOnCreature(83368,oPC); //"Failed" + return; + } + else + { + FloatingTextStrRefOnCreature(83370,oPC); //"Success" + } + } + else + { + // some feedback to + FloatingTextStrRefOnCreature(83369,oPC); //"Auto success " + } + + itemproperty ip = ItemPropertyOnHitProps(IP_CONST_ONHIT_ITEMPOISON,nSaveDC,nPoisonType); + IPSafeAddItemProperty(oTarget, ip,IntToFloat(nDuration),X2_IP_ADDPROP_POLICY_KEEP_EXISTING,TRUE,TRUE); + + effect eVis = EffectVisualEffect(VFX_IMP_PULSE_NATURE); + //technically this is not 100% safe but since there is no way to retrieve the sub + //properties of an item (i.e. itempoison), there is nothing we can do about it + if (IPGetItemHasItemOnHitPropertySubType(oTarget, 19)) + { + FloatingTextStrRefOnCreature(83361,oPC); //"Weapon is coated with poison" + IPSafeAddItemProperty(oTarget, ItemPropertyVisualEffect(ITEM_VISUAL_ACID),IntToFloat(nDuration),X2_IP_ADDPROP_POLICY_KEEP_EXISTING,TRUE,FALSE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, GetItemPossessor(oTarget)); + } + else + { + FloatingTextStrRefOnCreature(83360,oPC); //"Nothing happens + } + +} diff --git a/_removed/x2_s2_ruin.ncs b/_removed/x2_s2_ruin.ncs new file mode 100644 index 0000000..1a15890 Binary files /dev/null and b/_removed/x2_s2_ruin.ncs differ diff --git a/_removed/x2_s2_ruin.nss b/_removed/x2_s2_ruin.nss new file mode 100644 index 0000000..89497b6 --- /dev/null +++ b/_removed/x2_s2_ruin.nss @@ -0,0 +1,70 @@ +//:://///////////////////////////////////////////// +//:: Greater Ruin +//:: X2_S2_Ruin +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* +// The caster deals 35d6 damage to a single target + fort save for half damage +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Nov 18, 2002 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- spell now same as any non-epic direct target spell can hurt even neutral target +*/ + +#include "70_inc_spells" +#include "x2_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ + /* + Spellcast Hook Code + Added 2003-06-20 by Georg + If you want to make changes to all spells, + check x2_inc_spellhook.nss to find out more + + */ + + if (!X2PreSpellCastCode()) + { + // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell + return; + } + + // End of Spell Cast Hook + + //Declare major variables + spellsDeclareMajorVariables(); + + float fDist = GetDistanceBetween(spell.Caster, spell.Target); + float fDelay = fDist/(3.0 * log(fDist) + 2.0); + + int nSpellDC = GetEpicSpellSaveDC(spell.Caster)+5; + + if(spellsIsTarget(spell.Target, SPELL_TARGET_SINGLETARGET, spell.Caster)) + { + //Fire cast spell at event for the specified target + SignalEvent(spell.Target, EventSpellCastAt(spell.Caster, spell.Id)); + //Roll damage + int nDam = d6(40); + //Set damage effect + + if(!MySavingThrow(SAVING_THROW_FORT, spell.Target, nSpellDC, SAVING_THROW_TYPE_SPELL, spell.Caster)) + { + nDam = d100(20); + } + + effect eDam = EffectDamage(nDam, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_PLUS_TWENTY); + ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), spell.Loc); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(487), spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_BLOOD_CRT_RED), spell.Target); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM), spell.Target); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, spell.Target)); + } +} diff --git a/_removed/x2_s2_shiftdom.ncs b/_removed/x2_s2_shiftdom.ncs new file mode 100644 index 0000000..f76af0c Binary files /dev/null and b/_removed/x2_s2_shiftdom.ncs differ diff --git a/_removed/x2_s2_shiftdom.nss b/_removed/x2_s2_shiftdom.nss new file mode 100644 index 0000000..a27edc4 --- /dev/null +++ b/_removed/x2_s2_shiftdom.nss @@ -0,0 +1,93 @@ +//:://///////////////////////////////////////////// +//:: Gaze: Dominate (Shifter) +//:: x2_s2_shiftdom +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Cone shape that affects all within the AoE if they + fail a Will Save. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Georg Zoeller +//:: Created On: Oct, 2003 +//::////////////////////////////////////////////// +/* +Patch 1.70 + +- ability could been wasted on mind immune target +*/ + +#include "x0_i0_spells" +#include "x2_inc_shifter" + +void main() +{ + //------------------------------------------------------------------------- + // If blinded, I am not able to use this attack + //-------------------------------------------------------------------------- + if( GZCanNotUseGazeAttackCheck(OBJECT_SELF)) + { + return; + } + + //-------------------------------------------------------------------------- + // Enforce artifical use limit on that ability + //-------------------------------------------------------------------------- + /*if (ShifterDecrementGWildShapeSpellUsesLeft() <1 ) + { + FloatingTextStrRefOnCreature(83576, OBJECT_SELF); + return; + }*/ + + //-------------------------------------------------------------------------- + // Set up save DC and duration + //-------------------------------------------------------------------------- + int nDuration = Random(GetAbilityModifier(ABILITY_WISDOM))+d4(); + int nDC = ShifterGetSaveDC(OBJECT_SELF,SHIFTER_DC_VERY_EASY) + GetAbilityModifier(ABILITY_WISDOM); + + location lTargetLocation = GetSpellTargetLocation(); + effect eGaze = EffectDominated(); + effect eVis = EffectVisualEffect(VFX_IMP_DOMINATE_S); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eVisDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED); + effect eLink = EffectLinkEffects(eDur, eVisDur); + + //Make it more useful for high-level shifters + int nBonus; + if (GetLevelByClass(CLASS_TYPE_SHIFTER) > 25) nBonus = GetLevelByClass(CLASS_TYPE_SHIFTER) - 25; + else nBonus = 0; + nDC = nDC + nBonus; + nDuration = nDuration + nBonus; + + //-------------------------------------------------------------------------- + // Loop through all targets in the cone, but only dominate one! + //-------------------------------------------------------------------------- + object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 10.0, lTargetLocation, TRUE); + while(GetIsObjectValid(oTarget)) + { + if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget,SPELL_TARGET_SELECTIVEHOSTILE,OBJECT_SELF)) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_GAZE_DOMINATE)); + float fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20; + if(!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS, OBJECT_SELF)) + { + if(!MySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS, OBJECT_SELF, fDelay)) + { + //-------------------------------------------------------------------------- + // Effects do not stack + //-------------------------------------------------------------------------- + if (!GetHasSpellEffect(GetSpellId(),oTarget)) + { + eGaze = GetScaledEffect(eGaze, oTarget); + eLink = EffectLinkEffects(eLink, eGaze); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration))); + break; + } + } + } + } + oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 10.0, lTargetLocation, TRUE); + } +} diff --git a/_removed/x2_s2_sumgrund.ncs b/_removed/x2_s2_sumgrund.ncs new file mode 100644 index 0000000..6e704da Binary files /dev/null and b/_removed/x2_s2_sumgrund.ncs differ diff --git a/_removed/x2_s2_sumgrund.nss b/_removed/x2_s2_sumgrund.nss new file mode 100644 index 0000000..e6e8269 --- /dev/null +++ b/_removed/x2_s2_sumgrund.nss @@ -0,0 +1,132 @@ +//:://///////////////////////////////////////////// +//:: Summon Greater Undead +//:: X2_S2_SumGrUnd +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + 2003-10-03 - GZ: Added Epic Progression + The level of the Pale Master determines the + type of undead that is summoned. + + Level 9 <= Mummy Warrior + Level 10 <= Spectre + Level 12 <= Vampire Rogue + Level 14 <= Bodak + Level 16 <= Ghoul King + Level 18 <= Vampire Mage + Level 20 <= Skeleton Blackguard + Level 22 <= Lich + Level 24 <= Lich Lord + Level 26 <= Alhoon + Level 28 <= Elder Alhoon + Level 30 <= Lesser Demi Lich + + Lasts 14 + Casterlevel rounds +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Feb 05, 2003 +//::////////////////////////////////////////////// + +void PMUpgradeSummon(object oSelf, string sScript) +{ + object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oSelf); + ExecuteScript ( sScript, oSummon); +} + +void main() +{ + + int nCasterLevel = GetLevelByClass(CLASS_TYPE_PALEMASTER,OBJECT_SELF); + int nDuration = 14 + nCasterLevel; + + effect eSummon; + + //-------------------------------------------------------------------------- + // Summon the appropriate creature based on the summoner level + //-------------------------------------------------------------------------- + if (nCasterLevel >= 30) + { + // * Dracolich + eSummon = EffectSummonCreature("S_DRACOLICH",496,0.0f,1); + } + else if (nCasterLevel >= 29) + { + // * Demi Lich + eSummon = EffectSummonCreature("X2_S_LICH_30",496,0.0f,1); + } + else if (nCasterLevel >= 28) + { + // * Mega Alhoon + eSummon = EffectSummonCreature("x2_s_lich_26",496,0.0f,1); + } + else if (nCasterLevel >= 26) + { + // * Alhoon + eSummon = EffectSummonCreature("X2_S_LICH_24",496,0.0f,1); + } + else if (nCasterLevel >= 24) + { + // * Lich + eSummon = EffectSummonCreature("X2_S_LICH_22",496,0.0f,0); + } + else if (nCasterLevel >= 22) + { + // * Lich + eSummon = EffectSummonCreature("X2_S_LICH_20",496,0.0f,0); + } + else if (nCasterLevel >= 20) + { + // * Skeleton Blackguard + eSummon = EffectSummonCreature("x2_s_bguard_18",VFX_IMP_HARM,0.0f,0); + } + else if (nCasterLevel >= 18) + { + // * Vampire Mage + eSummon = EffectSummonCreature("x2_s_vamp_18",VFX_FNF_SUMMON_UNDEAD,0.0f,1); + } + else if (nCasterLevel >= 16) + { + // * Ghoul King + eSummon = EffectSummonCreature("X2_S_GHOUL_16",VFX_IMP_HARM,0.0f,0); + } + else if (nCasterLevel >= 14) + { + // * Greater Bodak + eSummon = EffectSummonCreature("X2_S_BODAK_14",VFX_IMP_HARM,0.0f,0); + } + else if (nCasterLevel >= 12) + { + // * Vampire Rogue + eSummon = EffectSummonCreature("X2_S_VAMP_10",VFX_FNF_SUMMON_UNDEAD,0.0f,1); + } + else if (nCasterLevel >= 10) + { + eSummon = EffectSummonCreature("X2_S_SPECTRE_10",VFX_FNF_SUMMON_UNDEAD, 0.0f,1); + } + else + { + // * Mummy + eSummon = EffectSummonCreature("X2_S_MUMMY_9",VFX_IMP_HARM, 0.0f,0); + } + + + ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_LOS_EVIL_10),GetSpellTargetLocation()); + //Apply the summon visual and summon the two undead. + //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation()); + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration)); + + // * If the character has a special pale master item equipped (variable set via OnEquip) + // * run a script on the summoned monster. + string sScript = GetLocalString(OBJECT_SELF,"X2_S_PM_SPECIAL_ITEM"); + if (sScript != "") + { + object oSelf = OBJECT_SELF; + DelayCommand(1.0,PMUpgradeSummon(oSelf,sScript)); + } +} + + + + + diff --git a/_removed/x2_s2_sumundead.ncs b/_removed/x2_s2_sumundead.ncs new file mode 100644 index 0000000..fc0d929 Binary files /dev/null and b/_removed/x2_s2_sumundead.ncs differ diff --git a/_removed/x2_s2_sumundead.nss b/_removed/x2_s2_sumundead.nss new file mode 100644 index 0000000..0833efd --- /dev/null +++ b/_removed/x2_s2_sumundead.nss @@ -0,0 +1,78 @@ +//:://///////////////////////////////////////////// +//:: Summon Undead +//:: X2_S2_SumUndead +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + The level of the Pale Master determines the + type of undead that is summoned. +*/ +//::////////////////////////////////////////////// +//:: Created By: Andrew Nobbs +//:: Created On: Feb 05, 2003 +//:: Updated By: Georg Zoeller, Oct 2003 +//::////////////////////////////////////////////// + +void PMUpgradeSummon(object oSelf, string sScript) +{ + object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oSelf); + ExecuteScript ( sScript, oSummon); +} + +void main() +{ + //Declare major variables + int nCasterLevel = GetLevelByClass(CLASS_TYPE_PALEMASTER,OBJECT_SELF); + int nDuration = 14 + nCasterLevel; + + + //effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); + effect eSummon; + //Summon the appropriate creature based on the summoner level + if (nCasterLevel <= 5) + { + //Ghoul + eSummon = EffectSummonCreature("NW_S_GHOUL",VFX_IMP_HARM,0.0f,0); + } + else if (nCasterLevel == 6) + { + //Shadow + eSummon = EffectSummonCreature("NW_S_SHADOW",VFX_IMP_HARM,0.0f,0); + } + else if (nCasterLevel == 7) + { + //Ghast + eSummon = EffectSummonCreature("NW_S_GHAST",VFX_IMP_HARM,0.0f,1); + } + else if (nCasterLevel == 8) + { + //Wight + eSummon = EffectSummonCreature("NW_S_WIGHT",VFX_FNF_SUMMON_UNDEAD,0.0f,1); + } + else if (nCasterLevel >= 9) + { + //Wraith + eSummon = EffectSummonCreature("X2_S_WRAITH",VFX_FNF_SUMMON_UNDEAD,0.0f,1); + } + + if (nCasterLevel >= 20) + { + // * Soul Stealer + eSummon = EffectSummonCreature("S_STEALER",496,0.0f,1); + } + // * Apply the summon visual and summon the two undead. + // * ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation()); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_LOS_EVIL_10),GetSpellTargetLocation()); + ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration)); + + // * If the character has a special pale master item equipped (variable set via OnEquip) + // * run a script on the summoned monster. + string sScript = GetLocalString(OBJECT_SELF,"X2_S_PM_SPECIAL_ITEM"); + if (sScript != "") + { + object oSelf = OBJECT_SELF; + DelayCommand(1.0,PMUpgradeSummon(oSelf,sScript)); + } +} + + diff --git a/_removed/x2_s3_sequencer.ncs b/_removed/x2_s3_sequencer.ncs new file mode 100644 index 0000000..3412fc2 Binary files /dev/null and b/_removed/x2_s3_sequencer.ncs differ diff --git a/_removed/x2_s3_sequencer.nss b/_removed/x2_s3_sequencer.nss new file mode 100644 index 0000000..77eba8b --- /dev/null +++ b/_removed/x2_s3_sequencer.nss @@ -0,0 +1,73 @@ +//:://///////////////////////////////////////////// +//:: x2_s3_sequencer +//:: Copyright (c) 2003 Bioware Corp. +//::////////////////////////////////////////////// +/* + Fires the spells stored on this sequencer. + GZ: - Also handles clearing off spells if the + item has the clear sequencer property + - added feedback strings +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: July 31, 2003 +//:: Updated By: Georg +//::////////////////////////////////////////////// + +#include "x2_inc_itemprop" +void main() +{ + object oItem = GetSpellCastItem(); + object oPC = OBJECT_SELF; + + int i = 0; + int nSpellId = -1; + int nMode = GetSpellId(); + + int iMax = IPGetItemSequencerProperty(oItem); + + if (iMax ==0) // Should never happen unless you added clear sequencer to a non sequencer item + { + return; + } + if (nMode == 720 ) // clear seqencer + { + for (i = 1; i <= iMax; i++) + { + DeleteLocalInt(oItem, "X2_L_SPELLTRIGGER" + IntToString(i)); + } + DeleteLocalInt(oItem, "X2_L_NUMTRIGGERS"); + effect eClear = EffectVisualEffect(VFX_IMP_BREACH); + ApplyEffectToObject(DURATION_TYPE_INSTANT,eClear,OBJECT_SELF); + FloatingTextStrRefOnCreature(83882,OBJECT_SELF); // sequencer cleared + } + else + { + if (GetLocalInt(oPC, "SequencerUsed") == TRUE) + { + SendMessageToPC(oPC, "You can only use a single magic staff per day!"); + return; + } + int bSuccess = FALSE; + for (i = 1; i <= iMax; i++) + { + nSpellId = GetLocalInt(oItem, "X2_L_SPELLTRIGGER" + IntToString(i)); + if (nSpellId>0) + { + bSuccess = TRUE; + nSpellId --; // I added +1 to the spellID when the sequencer was created, so I have to remove it here + if (nSpellId == 636 || nSpellId == 637 || nSpellId == 638 || nSpellId == 639 || nSpellId == 640 || nSpellId == 695) + { + FloatingTextStringOnCreature("This spell is too powerful to be cast with your staff!",OBJECT_SELF); + return; + } + ActionCastSpellAtObject(nSpellId, oPC, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); + SetLocalInt(oPC, "SequencerUsed", TRUE); + } + } + if (!bSuccess) + { + FloatingTextStrRefOnCreature(83886,OBJECT_SELF); // no spells stored + } + } +} diff --git a/_removed/x3_s2_palmount.ncs b/_removed/x3_s2_palmount.ncs new file mode 100644 index 0000000..ec10f35 Binary files /dev/null and b/_removed/x3_s2_palmount.ncs differ diff --git a/_removed/x3_s2_palmount.nss b/_removed/x3_s2_palmount.nss new file mode 100644 index 0000000..b55046d --- /dev/null +++ b/_removed/x3_s2_palmount.nss @@ -0,0 +1,39 @@ +//:://///////////////////////////////////////////// +//:: Post Mount Script for a Paladin Mount +//:: x3_s2_palmount +//:: Copyright (c) 2007 Bioware Corp. +//::////////////////////////////////////////////// +/* + This script is fired by the rider after successfully mounting + a summoned paladin mount. It's primary duty is to make sure monitoring + for paladin mount unsummoning still occurs while the mount is mounted. + + X3_EXTEND_PALMOUNT = string variable that if set on the module object + will allow a person to extend this paladin mount script to call other + scripts in a daisy chain type situation such as saddle bag handling ones. + +*/ +//::////////////////////////////////////////////// +//:: Created By: Deva B. Winblood +//:: Created On: 2008-01-01 +//:: Last Update: March 29th, 2008 +//::////////////////////////////////////////////// + +#include "x3_inc_horse" +void main() +{ + + object oRider = OBJECT_SELF; + object oHorse = GetLocalObject(oRider, "oX3_TempHorse"); + string sScript = GetLocalString(GetModule(), "X3_EXTEND_PALMOUNT"); + SetLocalObject(oRider, "oX3_PALADIN_MOUNT", oRider); + HORSE_SupportIncreaseSpeed(oRider, OBJECT_INVALID); + HORSE_SupportAdjustMountedArcheryPenalty(oRider); + HORSE_SupportApplyACBonus(oRider, oHorse); + HORSE_SupportApplyHPBonus(oRider, oHorse); + DelayCommand(0.5, HORSE_SupportApplyMountedSkillDecreases(oRider)); + SetLocalInt(oRider, "bX3_HORSE_MODIFIERS", TRUE); + HORSE_SupportMonitorPaladinUnsummon(oRider); + if (GetStringLength(sScript) > 0) ExecuteScript(sScript, oRider); + +} diff --git a/_removed/x3_s2_pdk_fear.ncs b/_removed/x3_s2_pdk_fear.ncs new file mode 100644 index 0000000..1141644 Binary files /dev/null and b/_removed/x3_s2_pdk_fear.ncs differ diff --git a/_removed/x3_s2_pdk_fear.nss b/_removed/x3_s2_pdk_fear.nss new file mode 100644 index 0000000..b054a37 --- /dev/null +++ b/_removed/x3_s2_pdk_fear.nss @@ -0,0 +1,79 @@ +//:://///////////////////////////////////////////// +//:: Purple Dragon Knight - Fear ability +//:: x3_s2_pdk_fear.nss +//::////////////////////////////////////////////// +//:: Identical to the Fear Spell, except it uses +//:: the PDK's character level +//::////////////////////////////////////////////// +//:: Created By: Stratovarius +//:: Created On: Sept 22, 2005 +//::////////////////////////////////////////////// + +#include "70_inc_spells" +#include "x0_i0_spells" +#include "x2_inc_spellhook" + +void main() +{ +/* ----------------------------------------------------------------- +Spellcast Hook Code +Added 2003-06-20 by Georg +If you want to make changes to all spells, +check x2_inc_spellhook.nss to find out more */ + + if (!X2PreSpellCastCode()) + { +// If code within the PreSpellCastHook (i.e. UMD) +// reports FALSE, do not run this spell + return; + } +// End - Spell Cast Hook ------------------------------------------- + + // Declare/assign major variables + spellsDeclareMajorVariables(); + int nDamage;// Will hold damage value + float fDelay;// For delay value + int nCasterLevel = GetHitDice(spell.Caster);// Character level for caster level + float fDuration = RoundsToSeconds(nCasterLevel);// Determine duration based on level +// effect eVis = EffectVisualEffect(VFX_IMP_FEAR_S); //invalid vfx + effect eFear = EffectFrightened();// Get Frightened effect + effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);// Get VFX + effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);// Get VFX + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);// Get VFX + + // Link the fear and mind effects + effect eLink = EffectLinkEffects(eFear, eMind); + eLink = EffectLinkEffects(eLink, eDur); + + // Apply Impact + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, spell.Loc); + + // Get first target in the spell cone + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc, TRUE); + + // Keep processing targets until no valid ones left + int nDC = 5 + nCasterLevel/2 + GetAbilityModifier(ABILITY_STRENGTH, spell.Caster); + while(GetIsObjectValid(oTarget)) + { + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, spell.Caster)) + { + fDelay = GetRandomDelay(); + + // Cause the SpellCastAt event to be triggered on oTarget + SignalEvent(oTarget, EventSpellCastAt(spell.Caster, SPELL_FEAR));//direct ID here, well ok seems like intend + + // Make SR Check + if(!MyResistSpell(spell.Caster, oTarget, fDelay)) + { + //Make a will save + if(!MySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_FEAR, spell.Caster, fDelay)) + { + //Apply the linked effects and the VFX impact + DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration)); + } + } + } + //Get next target in the spell cone + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, spell.Loc, TRUE); + } +} diff --git a/_removed/x3_s2_pdk_inspir.ncs b/_removed/x3_s2_pdk_inspir.ncs new file mode 100644 index 0000000..77dfdae Binary files /dev/null and b/_removed/x3_s2_pdk_inspir.ncs differ diff --git a/_removed/x3_s2_pdk_inspir.nss b/_removed/x3_s2_pdk_inspir.nss new file mode 100644 index 0000000..d90c439 --- /dev/null +++ b/_removed/x3_s2_pdk_inspir.nss @@ -0,0 +1,75 @@ +//:://///////////////////////////////////////////// +//:: Purple Dragon Knight - Inspire Courage +//:: x3_s2_pdk_inspir.nss +//::////////////////////////////////////////////// +//:: Increase attack, damage, saving throws to +//:: friends in area of spell +//::////////////////////////////////////////////// +//:: Created By: Stratovarius +//:: Created On: Sept 22, 2005 +//::////////////////////////////////////////////// +/* + Modified By : gaoneng erick + Modified On : may 6, 2006 + added custom vfx +*/ + +#include "x0_i0_spells" + +void main() +{ + if (GetHasEffect(EFFECT_TYPE_SILENCE,OBJECT_SELF)) + { + // Not useable when silenced. Floating text to user + FloatingTextStrRefOnCreature(85764,OBJECT_SELF); + return; + } + + //Declare major variables + int nChr = GetAbilityModifier(ABILITY_CHARISMA,OBJECT_SELF); + int nDuration = 5+ nChr; + effect eAttack = EffectAttackIncrease(2);// Attack effect increased + effect eDamage = EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_BLUDGEONING);// Increased damage effect + effect eLink = EffectLinkEffects(eAttack, eDamage);// link effects + + effect eSave = EffectSavingThrowIncrease(SAVING_THROW_WILL, 3, SAVING_THROW_TYPE_MIND_SPELLS);// Saving throw increase + eLink = EffectLinkEffects(eLink, eSave);// link in saving throw + eLink = ExtraordinaryEffect(eLink);// make effects ExtraOrdinary + + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);// Get VFX + eLink = EffectLinkEffects(eLink, eDur);// link VFXs + + effect eImpact = EffectVisualEffect(VFX_IMP_PDK_GENERIC_HEAD_HIT);// Get VFX + + // Apply effect at location + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_INSPIRE_COURAGE), OBJECT_SELF); + DelayCommand(0.8, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_GENERIC_PULSE), OBJECT_SELF)); + + // Get first target + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + + // Keep processing while oTarget is valid + while(GetIsObjectValid(oTarget)) + { + // * GZ Oct 2003: If we are silenced, we can not benefit from bard song + if (!GetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !GetHasEffect(EFFECT_TYPE_DEAF,oTarget)) + { + if(oTarget == OBJECT_SELF) + { + // oTarget is caster, apply effects + DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eLink), oTarget, RoundsToSeconds(nDuration)); + + } + else if(GetIsNeutral(oTarget) || GetIsFriend(oTarget)) + { + // oTarget is a friend, apply effects + DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration)); + } + } + + // Get next object in the sphere + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + } +} diff --git a/_removed/x3_s2_pdk_rally.ncs b/_removed/x3_s2_pdk_rally.ncs new file mode 100644 index 0000000..d7546be Binary files /dev/null and b/_removed/x3_s2_pdk_rally.ncs differ diff --git a/_removed/x3_s2_pdk_rally.nss b/_removed/x3_s2_pdk_rally.nss new file mode 100644 index 0000000..0f9ec5e --- /dev/null +++ b/_removed/x3_s2_pdk_rally.nss @@ -0,0 +1,69 @@ +//:://///////////////////////////////////////////// +//:: Purple Dragon Knight - Rallying Cry +//:: x3_s2_pdk_rally.nss +//::////////////////////////////////////////////// +//:: Increase attack & movement for friends in +//:: area of spell +//::////////////////////////////////////////////// +//:: Created By: Stratovarius +//:: Created On: Sept 22, 2005 +//::////////////////////////////////////////////// +/* + Modified By : gaoneng erick + Modified On : may 6, 2006 + added custom vfx +*/ + +#include "x0_i0_spells" + +void main() +{ + if (GetHasEffect(EFFECT_TYPE_SILENCE,OBJECT_SELF)) + { +// Not useable when silenced. Floating text to user + FloatingTextStrRefOnCreature(85764,OBJECT_SELF); + return; + } + + //Declare major variables + int nChr = GetAbilityModifier(ABILITY_CHARISMA,OBJECT_SELF); + int nDuration = 1+ nChr; + effect eAttack = EffectAttackIncrease(2);// Increase attack by 1 + effect eSpeed = EffectMovementSpeedIncrease(25);// Increase movement + effect eLink = EffectLinkEffects(eAttack, eSpeed);// Link effects + eLink = ExtraordinaryEffect(eLink);// Make effects ExtraOrdinary + + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);// Get VFX + eLink = EffectLinkEffects(eLink, eDur);// Link effects + + effect eImpact = EffectVisualEffect(VFX_IMP_PDK_GENERIC_HEAD_HIT);// Get VFX + + // Apply effect at a location + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_RALLYING_CRY), OBJECT_SELF); + DelayCommand(0.8, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_GENERIC_PULSE), OBJECT_SELF)); + + // Get first object in sphere + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + // Keep processing until oTarget is not valid + while(GetIsObjectValid(oTarget)) + { + // * GZ Oct 2003: If we are silenced, we can not benefit from bard song + if (!GetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !GetHasEffect(EFFECT_TYPE_DEAF,oTarget)) + { + if(oTarget == OBJECT_SELF) + { + // oTarget is caster, apply effects + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eLink), oTarget, RoundsToSeconds(nDuration)); + + } + else if(GetIsNeutral(oTarget) || GetIsFriend(oTarget)) + { + // oTarget is a friend, apply effects + DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration)); + } + } + // Get next object in the sphere + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); + } +} diff --git a/_removed/x3_s2_pdk_shield.ncs b/_removed/x3_s2_pdk_shield.ncs new file mode 100644 index 0000000..18e30b0 Binary files /dev/null and b/_removed/x3_s2_pdk_shield.ncs differ diff --git a/_removed/x3_s2_pdk_shield.nss b/_removed/x3_s2_pdk_shield.nss new file mode 100644 index 0000000..ed4ea1f --- /dev/null +++ b/_removed/x3_s2_pdk_shield.nss @@ -0,0 +1,40 @@ +//:://///////////////////////////////////////////// +//:: Purple Dragon Knight - Heroic Shield +//:: x3_s2_pdk_shield.nss +//::////////////////////////////////////////////// +//:: Applies a temporary AC bonus to one ally +//::////////////////////////////////////////////// +//:: Created By: Stratovarius +//::////////////////////////////////////////////// +/* + Modified By : gaoneng erick + Modified On : may 6, 2006 + added custom vfx +*/ + + +void main() +{ + //Declare main variables. + object oPC = OBJECT_SELF; + object oTarget = GetSpellTargetObject(); + int nBonus = 4; + + if (GetLocalInt(oPC, "PDKHeroicTracking")) + { + FloatingTextStringOnCreature("You can only use this ability once a round", oPC, FALSE); + return; + } + if (!GetIsFriend(oTarget)) + { + FloatingTextStringOnCreature("You cannot aid an enemy using this ability", oPC, FALSE); + return; + } + + effect eAC = EffectACIncrease(nBonus); + effect eVFX = EffectVisualEffect(VFX_IMP_PDK_HEROIC_SHIELD); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAC, oTarget, RoundsToSeconds(2)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oTarget); + SetLocalInt(oPC, "PDKHeroicTracking", TRUE); + DelayCommand(10.0, DeleteLocalInt(oPC, "PDKHeroicTracking")); +} diff --git a/_removed/x3_s2_pdk_stand.ncs b/_removed/x3_s2_pdk_stand.ncs new file mode 100644 index 0000000..9650328 Binary files /dev/null and b/_removed/x3_s2_pdk_stand.ncs differ diff --git a/_removed/x3_s2_pdk_stand.nss b/_removed/x3_s2_pdk_stand.nss new file mode 100644 index 0000000..cc3f09c --- /dev/null +++ b/_removed/x3_s2_pdk_stand.nss @@ -0,0 +1,58 @@ +//:://///////////////////////////////////////////// +//:: Purple Dragon Knight - Final Stand +//:: x3_s2_pdk_stand.nss +//::////////////////////////////////////////////// +//:: Add temporary hitpoints to friends in spell +//:: sphere. +//::////////////////////////////////////////////// +//:: Created By: Stratovarius +//:: Created On: Sept 22, 2005 +//::////////////////////////////////////////////// +/* + Modified By : gaoneng erick + Modified On : may 6, 2006 + added custom vfx +*/ + + +void main() +{ + object oPDK = OBJECT_SELF; + int nCount = GetLevelByClass(CLASS_TYPE_PURPLE_DRAGON_KNIGHT, oPDK) + GetAbilityModifier(ABILITY_CHARISMA, oPDK); + + int nHP = d10(10); + effect eHP = EffectTemporaryHitpoints(nHP);// Increase hit points + eHP = ExtraordinaryEffect(eHP);// Make effect ExtraOrdinary + effect eVis = EffectVisualEffect(VFX_IMP_PDK_GENERIC_HEAD_HIT);// Get VFX + + DelayCommand(0.8, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_GENERIC_PULSE), oPDK)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_FINAL_STAND), oPDK); + + int nTargetsLeft = nCount;// Number of targets equals level + + // Declare the spell shape, size and the location. Capture the first target object in the shape. + object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_CREATURE); + + // Cycle through the targets within the spell shape until you run out of targets. + while (GetIsObjectValid(oTarget) && nTargetsLeft > 0) + { + if(oTarget == OBJECT_SELF) + { + DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oTarget, RoundsToSeconds(nCount)); + // Every time you apply effects, count down remaining targets + nTargetsLeft -= 1; + + } + else if(GetIsNeutral(oTarget) || GetIsFriend(oTarget)) + { + DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oTarget, RoundsToSeconds(nCount)); + // Every time you apply effects, count down + nTargetsLeft -= 1; + } + + // Select the next target within the spell shape. + oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_CREATURE); + } +} diff --git a/_removed/x3_s2_pdk_wrath.ncs b/_removed/x3_s2_pdk_wrath.ncs new file mode 100644 index 0000000..8368628 Binary files /dev/null and b/_removed/x3_s2_pdk_wrath.ncs differ diff --git a/_removed/x3_s2_pdk_wrath.nss b/_removed/x3_s2_pdk_wrath.nss new file mode 100644 index 0000000..8ee17d4 --- /dev/null +++ b/_removed/x3_s2_pdk_wrath.nss @@ -0,0 +1,60 @@ +//:://///////////////////////////////////////////// +//:: Purple Dragon Knight - Oath of Wrath +//:: x3_s2_pdk_wrath.nss +//::////////////////////////////////////////////// +//:: Applies a temporary Attack, Save, Damage, Skill bonus vs +//:: monsters of the targets racial type +//::////////////////////////////////////////////// +//:: Created By: Stratovarius +//:: Created On: Sept 22, 2005 +//::////////////////////////////////////////////// +/* + Modified By : gaoneng erick + Modified On : may 6, 2006 + added custom vfx +*/ + + +void main() +{ + //Declare main variables. + object oPC = OBJECT_SELF; + object oTarget = GetSpellTargetObject();// Target + + if (oPC == oTarget) + { + FloatingTextStringOnCreature("You cannot target yourself using this ability", oPC, FALSE); + return; + } + if (GetIsFriend(oTarget)) + { + FloatingTextStringOnCreature("You cannot target an ally using this ability", oPC, FALSE); + return; + } + + int nRace = GetRacialType(oTarget);// Get race of target + int nClass = GetLevelByClass(CLASS_TYPE_PURPLE_DRAGON_KNIGHT, oPC); + int nDur = nClass * 2;// Duration + int nBonus = 2;// Bonus value + + effect eAttack = EffectAttackIncrease(nBonus);// Increase attack + effect eDamage = EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_BLUDGEONING);// Increase damage + effect eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, nBonus);// Increase saving throws + effect eSkill = EffectSkillIncrease(SKILL_ALL_SKILLS, nBonus); // Increase skills + + // Create 'versis racial type' effects + eAttack = VersusRacialTypeEffect(eAttack, nRace); + eDamage = VersusRacialTypeEffect(eDamage, nRace); + eSave = VersusRacialTypeEffect(eSave, nRace); + eSkill = VersusRacialTypeEffect(eSkill, nRace); + + // Apply effects to caster + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAttack, oPC, RoundsToSeconds(nDur)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDamage, oPC, RoundsToSeconds(nDur)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSave, oPC, RoundsToSeconds(nDur)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSkill, oPC, RoundsToSeconds(nDur)); + + // apply fx + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_OATH), oPC); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PDK_WRATH), oTarget); +}