Added updated ProjectQ troll chief model

Added updated ProjectQ troll chief model. Created encounter table for Great Northern Desert.  Created or imported several pnp creature UTCs: vampire spawn, spectre, mohrg, basilisk, monstrous scorpions, air & earth elementals, ankhegs.  Created pnp attacks for vampire & spectre.  Full compile.

Co-Authored-By: Draygoth <65428430+Draygoth@users.noreply.github.com>
This commit is contained in:
Jaysyn904
2022-12-17 23:51:16 -05:00
parent b511431250
commit 6b1ac72a5d
146 changed files with 16816 additions and 11389 deletions

View File

@@ -1,186 +0,0 @@
///////////////////////////////////
// Carcerian's BattleCry Script //
// "Evil Dead" Edition //
///////////////////////////////////
#include "NW_I0_GENERIC"
#include "prc_inc_racial"
const int BattleCryChance = 15;
const int CombatCryChance = 20;
const int DeathCryChance = 20;
const int CustomUndeadChance = 50;
const string COLOR_RED = "<c<> >";
const string COLOR_DARK = "<cSSS>";
const string COLOR_GREEN = "<c <20> >";
const string COLOR_WHITE = "<c<><63><EFBFBD>>";
const string COLOR_VIOLET = "<c<> <20>>";
const string COLOR_YELLOW = "<c<><63> >";
int HasSpoken()
{
if (GetLocalInt(OBJECT_SELF,"HASSPOKEN")) return 1;
SetLocalInt(OBJECT_SELF,"HASSPOKEN",1);
DelayCommand(IntToFloat(d10(4)),SetLocalInt(OBJECT_SELF,"HASSPOKEN",0));
return 0;
}
void DoUndeadChatter()
{
string sMyTag = GetTag(OBJECT_SELF);
if ((FindSubString(sMyTag,"SKEL")>-1)||(FindSubString(sMyTag,"MOHRG")>-1))
{
switch (d3()) // Skeletons
{
case 1 : ActionSpeakString(COLOR_WHITE+"I got a bone to pick with you!",TALKVOLUME_TALK); break;
case 2 : ActionSpeakString(COLOR_WHITE+"Forward, you worthless bags of bones!",TALKVOLUME_TALK); break;
case 3 : ActionSpeakString(COLOR_WHITE+"CHARGE!",TALKVOLUME_TALK); break;
}
}
else if (FindSubString(sMyTag,"ZOMB")>-1)
{
if (Random(2)) ActionSpeakString(COLOR_GREEN+"Brains!",TALKVOLUME_TALK);
else ActionSpeakString(COLOR_GREEN+"BRAINS!",TALKVOLUME_TALK);
// "More brains!"
}
else if ((FindSubString(sMyTag,"GHOUL")>-1)||(FindSubString(sMyTag,"GHAST")>-1)
||(FindSubString(sMyTag,"WIGHT")>-1))
{
switch (d4()) // Flesh Eaters
{
case 1 : ActionSpeakString(COLOR_GREEN+"I'll feast on your entrails!",TALKVOLUME_TALK); break;
case 2 : ActionSpeakString(COLOR_GREEN+"FOOD!",TALKVOLUME_TALK); break;
case 3 : ActionSpeakString(COLOR_GREEN+"Live ones!!",TALKVOLUME_TALK); break;
case 4 : ActionSpeakString(COLOR_GREEN+"FLESSSSHHHH!!!",TALKVOLUME_TALK); break;
}
}
else if ((FindSubString(sMyTag,"WRAITH")>-1)||(FindSubString(sMyTag,"ALLIP")>-1)
||(FindSubString(sMyTag,"Bodak")>-1)||(FindSubString(sMyTag,"SHADOW")>-1)
||(FindSubString(sMyTag,"SHFIEND")>-1)||(FindSubString(sMyTag,"SPECTRE")>-1))
{
switch (d4()) // Soul Eaters
{
case 1 : ActionSpeakString(COLOR_VIOLET+"I'll swallow your soul!",TALKVOLUME_TALK); break;
case 2 : ActionSpeakString(COLOR_VIOLET+"Your soul will be mine!",TALKVOLUME_TALK); break;
case 3 : ActionSpeakString(COLOR_VIOLET+"Mine!!!!",TALKVOLUME_TALK); break;
case 4 : ActionSpeakString(COLOR_VIOLET+"The darkness calls for you...",TALKVOLUME_TALK); break;
}
}
else switch (d6()) // Generic Undead
{
case 1 : ActionSpeakString(COLOR_RED+"I'll swallow your soul!",TALKVOLUME_TALK); break;
case 2 : ActionSpeakString(COLOR_RED+"Blood and souls!",TALKVOLUME_TALK); break;
case 3 : ActionSpeakString(COLOR_RED+"Joinnnn usssssssss!",TALKVOLUME_TALK); break;
case 4 : ActionSpeakString(COLOR_RED+"For the Master!",TALKVOLUME_TALK); break;
case 5 : ActionSpeakString(COLOR_RED+"For the Master!",TALKVOLUME_TALK); break;
case 6 : ActionSpeakString(COLOR_RED+"One by one we will take you!",TALKVOLUME_TALK); break;
}
}
// For use on perception
void DoBattleCry()
{ //if undead spotted "i see dead people!" "Dead ahead!"
if (d100()<=BattleCryChance)
{
if (HasSpoken()) return;
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
{
DoUndeadChatter();
}
else switch (d10())
{
case 1: PlayVoiceChat(VOICE_CHAT_ATTACK); break;
case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break;
case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break;
case 4: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break;
case 5: PlayVoiceChat(VOICE_CHAT_THREATEN); break;
case 6: PlayVoiceChat(VOICE_CHAT_TAUNT); break;
case 7: PlayVoiceChat(VOICE_CHAT_ENEMIES); break;
case 8: PlayVoiceChat(VOICE_CHAT_CHEER); break;
case 9: PlayVoiceChat(VOICE_CHAT_FOLLOWME); break;
case 10: PlayVoiceChat(VOICE_CHAT_LOOKHERE); break;
}
}
}
//For End of Combat Round
void DoCombatCry()
{
if (GetHasEffect(EFFECT_TYPE_FRIGHTENED))
{
if (d100()<=CombatCryChance)
{
if (HasSpoken()) return;
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
switch (d6()) //Turned undead :)
{
case 1 : ActionSpeakString(COLOR_YELLOW+"It Burns! It Burns!",TALKVOLUME_TALK); break;
case 2 : ActionSpeakString(COLOR_YELLOW+"Cursed Light!",TALKVOLUME_TALK); break;
case 3 : ActionSpeakString(COLOR_YELLOW+"Your faith is weak, I can feel your fear...",TALKVOLUME_TALK); break;
case 4 : ActionSpeakString(COLOR_YELLOW+"AAAIIIEEE!!!",TALKVOLUME_TALK); break;
case 5 : ActionSpeakString(COLOR_YELLOW+"NOOO!!!",TALKVOLUME_TALK); break;
case 6 : ActionSpeakString(COLOR_YELLOW+"It Burns!",TALKVOLUME_TALK); break;
}
else switch (d6())
{
case 1: PlayVoiceChat(VOICE_CHAT_FLEE); break;
case 2: PlayVoiceChat(VOICE_CHAT_HELP); break;
case 3: PlayVoiceChat(VOICE_CHAT_GUARDME); break;
case 4: PlayVoiceChat(VOICE_CHAT_CUSS); break;
case 5: PlayVoiceChat(VOICE_CHAT_BADIDEA); break;
case 6: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
}
}
}
else
{
if (d100()<=CombatCryChance)
{
if (HasSpoken()) return;
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
switch (d6())
{
DoUndeadChatter();
}
else switch (d6())
{
case 1: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break;
case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break;
case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break;
case 4: PlayVoiceChat(VOICE_CHAT_LAUGH); break;
case 5: PlayVoiceChat(VOICE_CHAT_TAUNT); break;
case 6: PlayVoiceChat(VOICE_CHAT_THREATEN); break;
}
}
}
}
//For Creature Death
void DoDeathCry()
{
if (d100()<=DeathCryChance)
{
if (HasSpoken()) return;
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
switch (d6())
{
case 1 : ActionSpeakString(COLOR_RED+"Dead by dawn! Dead by dawn!",TALKVOLUME_TALK); break;
case 2 : ActionSpeakString(COLOR_RED+"Death is only the beginning!",TALKVOLUME_TALK); break;
case 3 : ActionSpeakString(COLOR_RED+"Darkness take me...",TALKVOLUME_TALK); break;
case 4 : ActionSpeakString(COLOR_RED+"Free at last...",TALKVOLUME_TALK); break;
case 5 : ActionSpeakString(COLOR_RED+"Time to die...",TALKVOLUME_TALK); break;
case 6 : ActionSpeakString(COLOR_RED+"Thank you...",TALKVOLUME_TALK); break;
} // "No more tears..."
else switch (d6())
{
case 1: PlayVoiceChat(VOICE_CHAT_CUSS); break;
case 2: PlayVoiceChat(VOICE_CHAT_DEATH); break;
case 3: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
case 4: PlayVoiceChat(VOICE_CHAT_GOODBYE); break;
case 5: PlayVoiceChat(VOICE_CHAT_LAUGH); break;
case 6: PlayVoiceChat(VOICE_CHAT_HEALME); break;
}
}
}
//void main (){}

View File

@@ -1,202 +0,0 @@
#include "prc_inc_racial"
const float fUnlifespan = 300.0;
string SpawnOf(object oSpawnKiller = OBJECT_INVALID)
{
string sSpawn = "";
string sKiller = GetName(oSpawnKiller, FALSE);
object oLeft = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oSpawnKiller);
object oRight = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oSpawnKiller);
string sLeftTag = GetTag(oLeft);
string sRightTag = GetTag(oRight);
if (!(GetStringRight(sKiller, 6) ==" Spawn") ||
!(GetStringRight(sKiller, 6) ==" Rat"))
if ((GetIsPC(GetMaster(oSpawnKiller))||(GetIsPC(oSpawnKiller))))
{
if ((FindSubString(sKiller, "Morg")>-1)||
(sRightTag=="vampirespawner")||
(sLeftTag=="vampirespawner")) sSpawn = "namechspawn";
/* // No Vampires on Athas
if ((FindSubString(sKiller, "Vampire")>-1)||(sRightTag=="vampirespawner")||(sLeftTag=="vampirespawner"))
{
if (GetGender(OBJECT_SELF)==GENDER_FEMALE) sSpawn = "vampirespawn_f";
else sSpawn = "vampirespawn_m";
} */
else if ((FindSubString(sKiller, "Tyrantfog")>-1)||(sRightTag=="tyrantfogspawner")) sSpawn = "zombiespawn";
else if (FindSubString(sKiller, "Ghoul")>-1) sSpawn = "ghoulspawn";
else if (FindSubString(sKiller, "Ghast")>-1) sSpawn = "ghoulspawn";
else if ((FindSubString(sKiller, "Shadow")>-1)||(sRightTag=="shadowspawner")) sSpawn = "shadowspawn";
else if (FindSubString(sKiller, "Spectre")>-1) sSpawn = "spectrespawn";
else if (FindSubString(sKiller, "Wraith")>-1) sSpawn = "wraithspawn";
else if ((FindSubString(sKiller, "Wight")>-1)||(sRightTag=="wightspawner")) sSpawn = "wightspawn";
else if (FindSubString(sKiller, "Crypt Chanter")>-1) sSpawn = "wraithspawn";
else if (FindSubString(sKiller, "Bleakborn")>-1) sSpawn = "zombiespawn";
else if (FindSubString(sKiller, "Bodak")>-1) sSpawn = "zombiespawn";
else if (FindSubString(sKiller, "T'liz")>-1) sSpawn = "namechspawn";
else if ((FindSubString(sKiller, "Meorty")>-1) ||
(FindSubString(sKiller, "Amithrang")>-1)) sSpawn = "namechspawn";
}
else // Monster Killer
{
if (FindSubString(sKiller, "Tyrantfog")>-1) sSpawn = "zombiespawn";
else if (FindSubString(sKiller, "Ghast")>-1) sSpawn = "ghoulspawn";
else if (FindSubString(sKiller, "Ghoul")>-1) sSpawn = "ghoulspawn";
else if (((FindSubString(sKiller, "Meorty")>-1) ||
(FindSubString(sKiller, "Amithrang")>-1))) sSpawn = "namechspawn";
else if (FindSubString(sKiller, "Shadow")>-1) sSpawn = "shadowspawn";
else if (FindSubString(sKiller, "Spectre")>-1) sSpawn = "spectrespawn";
else if (FindSubString(sKiller, "Crypt Chanter")>-1) sSpawn = "wraithspawn";
else if (FindSubString(sKiller, "Bleakborn")>-1) sSpawn = "zombiespawn";
else if (FindSubString(sKiller, "Bodak")>-1) sSpawn = "zombiespawn";
else if (FindSubString(sKiller, "T'liz")>-1) sSpawn = "namechspawn";
else if ((FindSubString(sKiller, "Morg")>-1)||
(sRightTag=="vampirespawner")||
(sLeftTag=="vampirespawner")) sSpawn = "namechspawn";
/* //No Vampires on Athas
{
if (GetGender(OBJECT_SELF)==GENDER_FEMALE) sSpawn = "vampirespawn_f";
else sSpawn = "vampirespawn_m";
}*/
else if (FindSubString(sKiller, "Wight")>-1) sSpawn = "wightspawn";
if (FindSubString(sKiller, "Wraith")>-1) sSpawn = "wraithspawn";
}
return sSpawn;
}
int ShadeType(object oShadeKiller = OBJECT_INVALID)
{
int iShade = 0;
string sSpawn = "";
string sKiller = GetName(oShadeKiller);
object oRight = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oShadeKiller);
string sRightTag = GetTag(oRight);
if ((FindSubString(sKiller, "Shadow")>-1)||(sRightTag=="shadowspawner")) iShade = 1;
else if (FindSubString(sKiller, "Spectre")>-1) iShade = 2;
if (FindSubString(sKiller, "Wraith")>-1) iShade = 3;
return iShade;
}
int IsSpawnable(int iSpawnRace)
{
int iSpawnable = 0;
if ((iSpawnRace == RACIAL_TYPE_ANIMAL)||
(iSpawnRace == RACIAL_TYPE_BEAST)||
(iSpawnRace == RACIAL_TYPE_MAGICAL_BEAST)||
(iSpawnRace == RACIAL_TYPE_SHAPECHANGER)||
(iSpawnRace == RACIAL_TYPE_VERMIN)||
(iSpawnRace == RACIAL_TYPE_ABERRATION)||
(iSpawnRace == RACIAL_TYPE_FEY)||
(iSpawnRace == RACIAL_TYPE_GIANT)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_GOBLINOID)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_MONSTROUS)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_ORC)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_REPTILIAN)||
(iSpawnRace == RACIAL_TYPE_DRAGON)||
(iSpawnRace == RACIAL_TYPE_DWARF)||
(iSpawnRace == RACIAL_TYPE_ELF)||
(iSpawnRace == RACIAL_TYPE_GNOME)||
(iSpawnRace == RACIAL_TYPE_HALFELF)||
(iSpawnRace == RACIAL_TYPE_HALFLING)||
(iSpawnRace == RACIAL_TYPE_HUMAN)||
(iSpawnRace == RACIAL_TYPE_HALFORC))
iSpawnable = 1;
return iSpawnable;
}
int IsNonHuman(int iSpawnRace)
{
int iSpawnable = 0;
if ((iSpawnRace == RACIAL_TYPE_ANIMAL)||
(iSpawnRace == RACIAL_TYPE_BEAST)||
(iSpawnRace == RACIAL_TYPE_DRAGON)||
(iSpawnRace == RACIAL_TYPE_MAGICAL_BEAST)||
(iSpawnRace == RACIAL_TYPE_VERMIN)||
(iSpawnRace == RACIAL_TYPE_ABERRATION)||
(iSpawnRace == RACIAL_TYPE_FEY)||
(iSpawnRace == RACIAL_TYPE_GIANT) ||
(iSpawnRace == RACIAL_TYPE_HUMANOID_GOBLINOID)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_MONSTROUS)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_ORC)||
(iSpawnRace == RACIAL_TYPE_HUMANOID_REPTILIAN))
iSpawnable = 1;
return iSpawnable;
}
int UndeadCheck(object oMyKiller)
{
int iPassed = 0;
int iSpawnVFX = VFX_FNF_SUMMON_UNDEAD;
object oMyKiller = GetLastKiller();
int iRace = MyPRCGetRacialType(OBJECT_SELF);
int iKillerRace = MyPRCGetRacialType(oMyKiller);
int iKillerUndeadClass = GetLevelByClass(CLASS_TYPE_UNDEAD, oMyKiller);
object oLeft = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oMyKiller);
object oRight = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oMyKiller);
string sLeftTag = GetTag(oLeft);
string sRightTag = GetTag(oRight);
if ((iKillerRace==RACIAL_TYPE_UNDEAD)
||(iKillerUndeadClass>0)
||(sRightTag=="tyrantfogspawner")
||(sRightTag=="shadowspawner")
||(sRightTag=="CR_SLAM_PSISHAD1")
||(sLeftTag=="CR_SLAM_PSISHAD1")
||(sRightTag=="vampirespawner")
||(sLeftTag=="vampirespawner"))
if (IsSpawnable(iRace))
{
string sSpawnStr = SpawnOf(oMyKiller);
if (sSpawnStr != "")
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(iSpawnVFX), OBJECT_SELF);
object oSpawn = CreateObject(OBJECT_TYPE_CREATURE, sSpawnStr, GetLocation(OBJECT_SELF));
if (GetIsObjectValid(oSpawn)) iPassed = 1;
SetPortraitId(oSpawn, GetPortraitId(OBJECT_SELF));
if (GetIsPC(GetMaster(oMyKiller))||(GetIsPC(oMyKiller)))
{
SetName(oSpawn,GetName(OBJECT_SELF,FALSE)+" "+GetName(oSpawn,TRUE));
if (GetIsObjectValid(GetMaster(oMyKiller)))
AddHenchman(GetMaster(oMyKiller), oSpawn);
else AddHenchman(oMyKiller, oSpawn);
}
else
{
SetName(oSpawn,GetName(OBJECT_SELF,FALSE)+" "+GetName(oSpawn,TRUE));
//if (FindSubString(GetName(OBJECT_SELF)," Spawn")==-1) SetName(GetName(OBJECT_SELF)+ " Spawn");
ChangeFaction(oSpawn,oMyKiller);
}
int iShadeNum = 0;
if (IsNonHuman(iRace))
{
SetCreatureAppearanceType(oSpawn,GetAppearanceType(OBJECT_SELF));
iShadeNum = ShadeType(oMyKiller);
switch (iShadeNum)
{
case 1: //dark shadows
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR)),oSpawn,7.0);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT)),oSpawn,7.0);
break;
case 2: //grey spectre
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT)),oSpawn,7.0);
break;
case 3: //light wraith
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_GLOW_GREY)),oSpawn,7.0);
break;
}
}
if (iShadeNum>0) //Fly off
{
DelayCommand(fUnlifespan-1.5,ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectDisappear(), oSpawn));
DestroyObject(oSpawn, fUnlifespan);
}
else // Decay and Disintegrate
{
DelayCommand(fUnlifespan-1.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_DEATH), oSpawn));
DestroyObject(oSpawn, fUnlifespan);
}
}
}
return iPassed;
}
//void main() {}

View File

@@ -0,0 +1,117 @@
//::
//:: bld_drain_onhit.nss
//::
//:: Modified by: Jaysyn 20221216
//::
#include "prc_inc_combmove"
#include "prc_misc_const"
/*void DoBloodDrain(object oTarget, object oCaster)
{
//:: Setup oCaster's healing
effect eVis1 = EffectVisualEffect(VFX_IMP_HEALING_L);
effect eDrain = EffectTemporaryHitpoints(5);
eDrain = ExtraordinaryEffect(eDrain);
//:: Setup Blood Drain
effect eVis2 = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
effect eBlood = EffectAbilityDecrease(2, d4(1));
eBlood = SupernaturalEffect(eBlood);
//:: Drain blood from oTarget
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBlood, oTarget);
//:: Apply Temp HP to oCaster
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis1, oCaster);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDrain, oCaster, HoursToSeconds(1));
if (GetGrapple(oTarget) == TRUE)
{
DelayCommand(6.0f, DoBloodDrain(oTarget, oCaster));
}
}
*/
void main()
{
//:: Declare major variables
object oCaster = OBJECT_SELF ; //:: Where the spell came from
object oTarget = GetSpellTargetObject(); //:: What the spell is aimed at
int nRaceType = MyPRCGetRacialType(oTarget);
int nChaMod = GetAbilityModifier(5, oCaster);
int nMobHD = GetHitDice(oCaster);
int nDC = 10 + (nMobHD / 2) + nChaMod;
int nSave = FortitudeSave( oTarget, nDC );
int GrappleBonus = GetLocalInt(oCaster, "GRAPPLE_BONUS");
int CasterSize = PRCGetSizeModifier(oCaster);
int TargetSize = PRCGetSizeModifier(oTarget);
int GrappleChance = d100();
int nEvent = GetRunningEvent();
//:: Check for Entangle Immunity
if ( GetIsImmune(oTarget, IMMUNITY_TYPE_ENTANGLE) )
{
SendMessageToPC(oTarget, "Immune to grappling.");
SendMessageToPC(oCaster, "Target is immune to grappling.");
return;
}
//:: Check for Freedom Itemprop
if ( IPGetHasItemPropertyOnCharacter(oTarget, ITEM_PROPERTY_FREEDOM_OF_MOVEMENT) )
{
SendMessageToPC(oTarget, "Immune to grappling.");
SendMessageToPC(oCaster, "Target is immune to grappling.");
return;
}
//:: Don't try to grapple on every attack.
/* if (GetGrapple(oTarget) == FALSE)
{
if (GrappleChance >= 66)
{
return;
}
}*/
//:: Can't grapple target if two or more size categories larger than you are.
if (TargetSize - 2 >= CasterSize)
{
FloatingTextStringOnCreature("This creature is too large to grapple.", oCaster);
return;
}
//:: If you got this far, you're getting grappled.
DoGrapple(oCaster, oTarget, 0, TRUE, TRUE);
//:: Hook in the events if grapple is successful
if (GetGrapple(oTarget) == TRUE)
{
if(DEBUG) DoDebug("Blood Drain: Adding eventhooks");
FloatingTextStringOnCreature("Blood Drain: Adding eventhooks.", oCaster);
FloatingTextStringOnCreature("Blood Drain: Adding eventhooks.", oTarget);
AddEventScript(oTarget, EVENT_HEARTBEAT, "hb_vamp_bl_drain", TRUE, FALSE);
}
/* if (GetGrapple(oTarget) == FALSE)
{
DoGrapple(oCaster, oTarget, 0, TRUE, TRUE);
if (GetGrapple(oTarget) == TRUE)
{
DoBloodDrain(oTarget, oCaster);
}
}
else
{
DoBloodDrain(oTarget, oCaster);
}*/
}

View File

@@ -19,7 +19,17 @@ void DoLevelDrain(object oTarget, object oCaster)
// Setup Level Drain
effect eVis2 = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
effect eNeg = EffectNegativeLevel(1);
effect eNeg;
if (GetResRef(oCaster) == "RA_SPECTRE001")
{
eNeg = EffectNegativeLevel(2);
}
else
{
eNeg = EffectNegativeLevel(1);
}
eNeg = SupernaturalEffect(eNeg);
// Drain levels from oTarget
@@ -42,7 +52,7 @@ void main()
int nChaMod = GetAbilityModifier(5, oCaster);
int nMobHD = GetHitDice(oCaster);
int nDC = 10 + (nMobHD / 2) + nChaMod;
int nSave = FortitudeSave( oTarget, nDC );
int nSave = FortitudeSave( oTarget, nDC );
//:: Check for Negative Level Immunity
if ( GetIsImmune(oTarget, IMMUNITY_TYPE_NEGATIVE_LEVEL) )
@@ -55,7 +65,7 @@ void main()
if ( nSave )
return;
//:: if you got this far, you're taking a negative level.
//:: if you got this far, you're taking negative levels.
DelayCommand(0.1, DoLevelDrain(oTarget,oCaster));

View File

@@ -13,16 +13,42 @@
void main()
{
object oNPC = OBJECT_SELF;
object oAttacker;
string sResRef = GetResRef(oNPC);
//:: Equips best armor
if ((!GetIsInCombat(OBJECT_SELF) && (GetItemInSlot(INVENTORY_SLOT_CHEST) == OBJECT_INVALID)))
if ((!GetIsInCombat(oNPC) && (GetItemInSlot(INVENTORY_SLOT_CHEST) == OBJECT_INVALID)))
DelayCommand(0.5f, ActionEquipMostEffectiveArmor());
//:: Handles Vampire's Gaseous form death.
if(sResRef == "ra_vamp_gas_form")
{
//:: Get nearest alive PC.
oAttacker = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oNPC, 1, CREATURE_TYPE_IS_ALIVE, TRUE);
//:: Set destroyable.
SetIsDestroyable(TRUE, FALSE, FALSE);
//:: Remove plot/immoral/lootable flags JUST in case.
SetPlotFlag(oNPC, FALSE);
SetImmortal(oNPC, FALSE);
SetLootable(oNPC, FALSE);
//:: Clear Actions & run away
ClearAllActions();
ActionMoveAwayFromObject(oAttacker, TRUE, 300.0f);
//:: Destroy ourselves after fleeing the scene
DelayCommand(10.0f, DestroyObject(oNPC));
}
//:: Execute the CODI NPC OnHeartbeat script
ExecuteScript("no_ai_hrt", OBJECT_SELF);
ExecuteScript("no_ai_hrt", oNPC);
//:: Execute the default NPC OnHeartbeat script
//ExecuteScript("nw_c2_default1", OBJECT_SELF);
//ExecuteScript("nw_c2_default1", oNPC);
//:: Execute the PRC NPC OnHeartbeat script
ExecuteScript("prc_npc_hb", OBJECT_SELF);
ExecuteScript("prc_npc_hb", oNPC);
}

View File

@@ -13,7 +13,9 @@
void main()
{
object oNPC = OBJECT_SELF;
object oNPC = OBJECT_SELF;
string sResRef = GetResRef(oNPC);
// Makes sure armor's droppable flag is set to 0
/* SetDroppableFlag(GetItemInSlot(INVENTORY_SLOT_CHEST, OBJECT_SELF), 0);
@@ -222,6 +224,32 @@ int nVFX = GetLocalInt(OBJECT_SELF,"SpawnVFX");
DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
}
//:: Vampire's Gaseous Form onDeath
if(sResRef == "ra_vampspawn01" || sResRef == "ra_vampspawn02")
{
effect eVFX;
object oSpawn;
location lSelf = GetLocation(OBJECT_SELF);
//:: Apply some visual effects & unload the model.
eVFX = EffectVisualEffect(VFX_COM_UNLOAD_MODEL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
eVFX = EffectVisualEffect(VFX_COM_BLOOD_CRT_RED);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
eVFX = EffectVisualEffect(491);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
eVFX = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
//:: Spawn Gaseous Form.
eVFX = EffectVisualEffect(133);
oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "ra_vamp_gas_form", GetLocation(oNPC));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpawn));;
}
//:: Execute CODI AI NPC OnDeath script
ExecuteScript("no_ai_dth", OBJECT_SELF);

View File

@@ -46,19 +46,37 @@ const int EVENT_USER_DEFINED_POSTSPAWN = 1511;
#include "ms_name_inc"
#include "x2_inc_switches"
#include "rnd_commoner_inc"
#include "ra_rnd_armor_inc"
void ShrinkEm(object oPC)
void ShrinkEm(object oNPC)
{
SetObjectVisualTransform(oPC, OBJECT_VISUAL_TRANSFORM_SCALE, 0.5f);
SetObjectVisualTransform(oNPC, OBJECT_VISUAL_TRANSFORM_SCALE, 0.5f);
}
void GrowEm(object oPC)
void Embiggen(object oNPC)
{
SetObjectVisualTransform(oPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5f);
SetObjectVisualTransform(oNPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.15f);
}
void GrowEm(object oNPC)
{
SetObjectVisualTransform(oNPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5f);
}
void NoFreeGear(object oNPC)
{
object oArmor;
object oWeapon;
oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, OBJECT_SELF);
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, OBJECT_SELF);
SetDroppableFlag(oArmor, FALSE);
SetDroppableFlag(oWeapon, FALSE);
}
void main()
{
string sTag;
@@ -85,6 +103,15 @@ void main()
SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN ));
}
//:: Give the Vampire Spawn ~fancy~ clothes
if(sResRef == "ra_vampspawn01" || sResRef == "ra_vampspawn02")
{
oNPC = OBJECT_SELF;
rnd_clothes (oNPC);
//RndOutcast(oNPC);
NoFreeGear(oNPC);
}
sTag=GetLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG");
if (GetStringLength(sTag)>0)
{ // look for master
@@ -161,6 +188,13 @@ void main()
}
int nEmbiggen = GetLocalInt(OBJECT_SELF,"EMBIGGEN");
if (nEmbiggen > 0)
{
DelayCommand(0.0f, Embiggen(OBJECT_SELF));
}
int nNoStun = GetLocalInt(OBJECT_SELF,"NOSTUN");
if (nNoStun > 0)
{
@@ -492,26 +526,7 @@ void main()
rnd_tattoo(OBJECT_SELF);
}
//:: Execute OnSpawn script.
if (sResRef == "monst_spider004")
{
//:: Execute drop in from above spawn.
ExecuteScript("nw_c2_dropin9", OBJECT_SELF);
}
else
{
//:: Execute CODI AI OnSpawn script.
ExecuteScript(sSpawnType, OBJECT_SELF);
//:: Execute default OnSpawn script.
//ExecuteScript("nw_c2_default9", OBJECT_SELF);
}
//:: Execute PRC OnSpawn script.
ExecuteScript("prc_npc_spawn", OBJECT_SELF);
//:: activate various custom auras.
//:: Activate various custom auras.
int nAtropal = GetTag(OBJECT_SELF)=="ATROPAL001" ? TRUE : FALSE;
if(nAtropal)ExecuteScript("atropal_aura",OBJECT_SELF);
@@ -570,4 +585,22 @@ void main()
SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN));
}
//:: Execute OnSpawn script.
if (sResRef == "monst_spider004")
{
//:: Execute drop in from above spawn.
ExecuteScript("nw_c2_dropin9", OBJECT_SELF);
}
else
{
//:: Execute CODI AI OnSpawn script.
ExecuteScript(sSpawnType, OBJECT_SELF);
//:: Execute default OnSpawn script.
//ExecuteScript("nw_c2_default9", OBJECT_SELF);
}
//:: Execute PRC OnSpawn script.
ExecuteScript("prc_npc_spawn", OBJECT_SELF);
}

View File

@@ -77,6 +77,7 @@ void rnd_tattoo(object oPC)
void rnd_clothes(object oPC)
{
int nNoble = GetLocalInt(OBJECT_SELF,"NOBLE");
object oItem;
if (nNoble != 1)
{
@@ -87,7 +88,7 @@ void rnd_clothes(object oPC)
string sItem;
sItem = "baleas_cloth0" + IntToString(nResult);
object oItem = CreateItemOnObject(sItem, oPC, 1);
oItem = CreateItemOnObject(sItem, oPC, 1);
DelayCommand(0.5f, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
}
@@ -100,7 +101,9 @@ void rnd_clothes(object oPC)
int nResult = d10(1);
string sItem;
sItem = "noble_m_cloth0" + IntToString(nResult);
DelayCommand(0.5f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
oItem = CreateItemOnObject(sItem, oPC, 1);
//DelayCommand(0.5f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
DelayCommand(0.5f, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
}
else
@@ -111,7 +114,9 @@ void rnd_clothes(object oPC)
int nResult = d10(1);
string sItem;
sItem = "noble_f_cloth0" + IntToString(nResult);
DelayCommand(1.0f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
oItem = CreateItemOnObject(sItem, oPC, 1);
//DelayCommand(0.5f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
DelayCommand(0.5f, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -176,7 +176,44 @@ string SpawnGroup(object oSpawn, string sTemplate)
// Only Make Modifications Between These Lines
// -------------------------------------------
//:: Brigands
//:: Wererats
if (sTemplate == "group_wererats")
{
switch(d3(1))
{
case 1:
sRetTemplate = "RA_WERERAT004";
break;
case 2:
sRetTemplate = "RA_WERERAT003";
break;
case 3:
sRetTemplate = "RA_WERERAT003";
break;
}
}
//:: Wererats
//:: Vampire Spawn
if (sTemplate == "group_vampspawn")
{
switch(d3(1))
{
case 1:
sRetTemplate = "RA_VAMPSPAWN01";
break;
case 2:
sRetTemplate = "RA_VAMPSPAWN01";
break;
case 3:
sRetTemplate = "RA_VAMPSPAWN02";
break;
}
}
//:: Vampire Spawn
//:: Brigands
if (sTemplate == "group_brigands")
{
switch(d3(1))
@@ -192,9 +229,9 @@ string SpawnGroup(object oSpawn, string sTemplate)
break;
}
}
//:: Brigands
//:: Brigands
// Aragnak in Lair
//:: Aragnak in Lair
if (sTemplate == "grp_aragnak")
{
int iRnd = Random(9)+1;
@@ -209,7 +246,7 @@ string SpawnGroup(object oSpawn, string sTemplate)
sRetTemplate = "RA_DRAG_ARAGNAK2";
}
}
//
//:: Aragnak in Lair
if (GetStringLeft(sTemplate, 7) == "scaled_")
{

View File

@@ -0,0 +1,41 @@
//::///////////////////////////////////////////////
//:: Name vamp_gas_form_hb
//:: Copyright (c) 2022 Project RATDOG
//:://////////////////////////////////////////////
/*
Make the Vampire's onDeath Gaseous Form flee
& vanish
*/
//:://////////////////////////////////////////////
//:: Created By: Jaysyn
//:: Created On: 20221207
//:://////////////////////////////////////////////
void main()
{
object oNPC = OBJECT_SELF;
location lSelf = GetLocation(oNPC);
object oAttacker = GetNearestCreature(CREATURE_TYPE_REPUTATION , REPUTATION_TYPE_ENEMY, oNPC, 1, CREATURE_TYPE_IS_ALIVE, TRUE);
string sResRef = GetResRef(oNPC);
//:: Set destroyable.
SetIsDestroyable(TRUE, FALSE, FALSE);
//:: Remove plot/immoral/lootable flags JUST in case.
SetPlotFlag(oNPC, TRUE);
SetImmortal(oNPC, FALSE);
SetLootable(oNPC, FALSE);
//:: Clear Actions & run away
//AssignCommand(oNPC, ClearAllActions());
ClearAllActions();
ActionMoveAwayFromObject(oAttacker, TRUE, 10.0f);
//DelayCommand(0.2f, ActionMoveAwayFromObject(oAttacker, TRUE, 10.0f));
//:: Destroy ourselves after fleeing the scene
DelayCommand(4.0f, DestroyObject(oNPC));
}