282 lines
10 KiB
Plaintext
282 lines
10 KiB
Plaintext
#include "antistuck_h"
|
|
#include "prc_inc_skin"
|
|
|
|
|
|
void fnDarknessStorm(object oMe)
|
|
{ // storm of darkness
|
|
object oMod=GetModule();
|
|
int nDisableNonEssential=GetLocalInt(oMod,"nDisableNonEssential");
|
|
int nX=Random(16)*10;
|
|
int nY=Random(16)*10;
|
|
int nZ=Random(4)*10;
|
|
effect eDarkness=EffectVisualEffect(VFX_DUR_DARKNESS);
|
|
vector vVec=Vector(IntToFloat(nX),IntToFloat(nY),IntToFloat(nZ));
|
|
location lLoc=Location(oMe,vVec,0.0);
|
|
int nN=1;
|
|
if (nDisableNonEssential!=TRUE)
|
|
{ // enabled
|
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eDarkness,lLoc,4.0);
|
|
while(nN<6)
|
|
{ // darkness
|
|
nX=Random(16)*10;
|
|
nY=Random(16)*10;
|
|
nZ=Random(4)*10;
|
|
vVec=Vector(IntToFloat(nX),IntToFloat(nY),IntToFloat(nZ));
|
|
lLoc=Location(oMe,vVec,0.0);
|
|
nN++;
|
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eDarkness,lLoc,4.0);
|
|
} // darkness
|
|
DelayCommand(10.0,fnDarknessStorm(oMe));
|
|
} // enabled
|
|
} // fnDarknessStorm()
|
|
|
|
void fnShadowPlume(object oMe)
|
|
{ // shadowPlume
|
|
object oMod=GetModule();
|
|
int nDisableNonEssential=GetLocalInt(oMod,"nDisableNonEssential");
|
|
int nX=Random(160);
|
|
int nY=Random(160);
|
|
float fX=IntToFloat(nX);
|
|
float fY=IntToFloat(nY);
|
|
vector vVec=Vector(fX,fY,0.0);
|
|
location lLoc=Location(oMe,vVec,0.0);
|
|
int nCount=GetLocalInt(oMe,"nPlume");
|
|
if (nDisableNonEssential!=TRUE)
|
|
{ // enabled
|
|
if (nCount<16)
|
|
{ // make plume
|
|
object oPlume=CreateObject(OBJECT_TYPE_PLACEABLE,"shadowflux",lLoc,FALSE);
|
|
nCount++;
|
|
if (oPlume!=OBJECT_INVALID) SetLocalInt(oMe,"nPlume",nCount);
|
|
} // make plume
|
|
DelayCommand(6.0,fnShadowPlume(oMe));
|
|
} // enabled
|
|
} // fnShadowPlume()
|
|
|
|
string fnSpawnType(object oPC)
|
|
{ // return resref of creature to spawn
|
|
string sRet="nw_shadow1";
|
|
int nLevel=GetLevelByPosition(1,oPC);
|
|
int nR=d100();
|
|
nLevel=nLevel+GetLevelByPosition(2,oPC);
|
|
nLevel=nLevel+GetLevelByPosition(3,oPC);
|
|
if (nLevel<3)
|
|
{ // lowest level
|
|
if (nR<75) sRet="nw_shadow1";
|
|
else if (nR<95) sRet="nw_shmastif1";
|
|
else if (nR<100) sRet="nw_shfiend1";
|
|
else { sRet="nw_bodak1"; }
|
|
} // lowest level
|
|
else if (nLevel<6)
|
|
{ // second stage
|
|
if (nR<50) sRet="nw_shadow1";
|
|
else if (nR<80) sRet="nw_shmastif1";
|
|
else if (nR<98) sRet="nw_shfiend1";
|
|
else { sRet="nw_bodak1"; }
|
|
} // second stage
|
|
else if (nLevel<10)
|
|
{ // third stage
|
|
if (nR<33) sRet="nw_shadow1";
|
|
else if (nR<50) sRet="nw_shmastif1";
|
|
else if (nR<80) sRet="nw_shfiend1";
|
|
else if (nR<95) sRet="nw_bodak1";
|
|
else { sRet="nighthag"; }
|
|
} // third stage
|
|
else if (nLevel<15)
|
|
{ // fourth stage
|
|
if (nR<20) sRet="nw_shadow1";
|
|
else if (nR<33) sRet="nw_shmastif1";
|
|
else if (nR<50) sRet="nw_shfiend1";
|
|
else if (nR<80) sRet="nw_bodak1";
|
|
else { sRet="nighthag"; }
|
|
} // fourth stage
|
|
else if (nLevel<19)
|
|
{ // fifth stage
|
|
if (nR<10) sRet="nw_shadow1";
|
|
else if (nR<20) sRet="nw_shmastif1";
|
|
else if (nR<33) sRet="nw_shfiend1";
|
|
else if (nR<50) sRet="nw_bodak1";
|
|
else if (nR<90) sRet="nighthag";
|
|
else { sRet="nightwalker"; }
|
|
} // fifth stage
|
|
else
|
|
{ // final stage
|
|
if (nR<10) sRet="nw_shfiend1";
|
|
else if (nR<33) sRet="nw_bodak1";
|
|
else if (nR<75) sRet="nighthag";
|
|
else { sRet="nightwalker"; }
|
|
} // final stage
|
|
return sRet;
|
|
} // fnSpawnType()
|
|
|
|
int HasLightSource(object oT)
|
|
{ // check to see if the object has a light source ready
|
|
int nRet=FALSE;
|
|
effect eTest;
|
|
object oItem;
|
|
effect eCompare1=EffectVisualEffect(VFX_DUR_LIGHT);
|
|
effect eCompare2=EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20);
|
|
effect eCompare3=EffectVisualEffect(VFX_DUR_LIGHT_WHITE_15);
|
|
effect eCompare4=EffectVisualEffect(VFX_DUR_LIGHT_WHITE_10);
|
|
effect eCompare5=EffectVisualEffect(VFX_DUR_LIGHT_WHITE_5);
|
|
effect eCompare6=EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_20);
|
|
effect eCompare7=EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_15);
|
|
effect eCompare8=EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
|
|
effect eCompare9=EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_5);
|
|
effect eCompare10=EffectVisualEffect(VFX_DUR_LIGHT_BLUE_20);
|
|
effect eCompare11=EffectVisualEffect(VFX_DUR_LIGHT_BLUE_15);
|
|
effect eCompare12=EffectVisualEffect(VFX_DUR_LIGHT_GREY_20);
|
|
effect eCompare13=EffectVisualEffect(VFX_DUR_LIGHT_ORANGE_20);
|
|
effect eCompare14=EffectVisualEffect(VFX_DUR_LIGHT_PURPLE_20);
|
|
effect eCompare15=EffectVisualEffect(VFX_DUR_LIGHT_RED_20);
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARMS,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BELT,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOOTS,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
//oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oT);
|
|
oItem = GetPCSkin(oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_CHEST,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_CLOAK,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_HEAD,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTRING,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_NECK,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oT);
|
|
if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_LIGHT)==TRUE) nRet=TRUE;
|
|
if (nRet!=TRUE)
|
|
{ // test for light spell effect
|
|
eTest=GetFirstEffect(oT);
|
|
while(GetEffectType(eTest)!=EFFECT_TYPE_INVALIDEFFECT&&nRet==FALSE)
|
|
{ // check for light
|
|
if(eTest==eCompare1) nRet=TRUE;
|
|
else if (eTest==eCompare2) nRet=TRUE;
|
|
else if (eTest==eCompare3) nRet=TRUE;
|
|
else if (eTest==eCompare4) nRet=TRUE;
|
|
else if (eTest==eCompare5) nRet=TRUE;
|
|
else if (eTest==eCompare6) nRet=TRUE;
|
|
else if (eTest==eCompare7) nRet=TRUE;
|
|
else if (eTest==eCompare8) nRet=TRUE;
|
|
else if (eTest==eCompare9) nRet=TRUE;
|
|
else if (eTest==eCompare10) nRet=TRUE;
|
|
else if (eTest==eCompare11) nRet=TRUE;
|
|
else if (eTest==eCompare12) nRet=TRUE;
|
|
else if (eTest==eCompare13) nRet=TRUE;
|
|
else if (eTest==eCompare14) nRet=TRUE;
|
|
else if (eTest==eCompare15) nRet=TRUE;
|
|
eTest=GetNextEffect(oT);
|
|
} // check for light
|
|
} // test for light spell effect
|
|
return nRet;
|
|
} // HasLightSource()
|
|
|
|
void fnShadowAI()
|
|
{ // make the shadows on this level react
|
|
object oPortal=GetNearestObjectByTag("SR_AI_TRANSITION",OBJECT_SELF,1);
|
|
object oEnemy=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,OBJECT_SELF,1,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);
|
|
float fDist=GetDistanceBetween(OBJECT_SELF,oEnemy);
|
|
object oMod=GetModule();
|
|
int nDisableNonEssential=GetLocalInt(oMod,"nDisableNonEssential");
|
|
float fSpeed=8.0;
|
|
object oTargetEnemy=GetLocalObject(OBJECT_SELF,"oTargetEnemy");
|
|
if (nDisableNonEssential==TRUE) fSpeed=10.0; // reduce a little usage
|
|
if (GetIsInCombat(OBJECT_SELF)!=TRUE&&GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,1)!=OBJECT_INVALID)
|
|
{ // not fighting
|
|
if (oTargetEnemy!=oEnemy||GetArea(oTargetEnemy)!=GetArea(OBJECT_SELF))
|
|
{
|
|
AssignCommand(OBJECT_SELF,ClearAllActions(TRUE));
|
|
DeleteLocalObject(OBJECT_SELF,"oTargetEnemy");
|
|
}
|
|
if (fDist<20.0&&oEnemy!=OBJECT_INVALID&&GetObjectSeen(oEnemy)==TRUE)
|
|
{ // engage enemy
|
|
AssignCommand(OBJECT_SELF,ClearAllActions());
|
|
AssignCommand(OBJECT_SELF,ActionAttack(oEnemy));
|
|
SetLocalObject(OBJECT_SELF,"oTargetEnemy",oEnemy);
|
|
} // engage enemy
|
|
else if (HasLightSource(oEnemy)==TRUE)
|
|
{ // run to enemy
|
|
AssignCommand(OBJECT_SELF,ASActionMoveToObject(oEnemy,TRUE,1.0));
|
|
SetLocalObject(OBJECT_SELF,"oTargetEnemy",oEnemy);
|
|
} // run to enemy
|
|
else
|
|
{ // walk to portal
|
|
AssignCommand(OBJECT_SELF,ClearAllActions());
|
|
AssignCommand(OBJECT_SELF,ActionForceMoveToObject(oPortal,FALSE,2.0,120.0));
|
|
} // walk to portal
|
|
} // not fighting
|
|
DelayCommand(fSpeed,fnShadowAI());
|
|
} // fnShadowAI()
|
|
|
|
|
|
void main()
|
|
{
|
|
object oMe=OBJECT_SELF;
|
|
object oPC=GetEnteringObject();
|
|
object oCR;
|
|
string sTag;
|
|
int nL;
|
|
int nC;
|
|
int nR=d10();
|
|
object oDest;
|
|
object oMod=GetModule();
|
|
int nDNE=GetLocalInt(oMod,"nDisableNonEssential");
|
|
if (GetIsPC(oPC)==TRUE)
|
|
{ // is PC entering
|
|
if (GetLocalInt(oMe,"nDarknessStorm")!=TRUE&&nDNE!=TRUE)
|
|
{ // activate darkness storm
|
|
SetLocalInt(oMe,"nDarknessStorm",TRUE);
|
|
fnDarknessStorm(oMe);
|
|
fnShadowPlume(oMe);
|
|
} // activate darkness storm
|
|
if (GetIsPC(oPC)==TRUE)
|
|
{ // is PC
|
|
nL=1;
|
|
oCR=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nL,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);
|
|
while(oCR!=OBJECT_INVALID)
|
|
{ // !OI
|
|
sTag=GetResRef(oCR);
|
|
if (sTag=="nw_shadow"||sTag=="nw_shmastif"||sTag=="nw_shfiend") nC++;
|
|
else if (sTag=="nw_bodak"||sTag=="nighthag"||sTag=="nightwalker") nC++;
|
|
nL++;
|
|
oCR=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nL,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);
|
|
} // !Oi
|
|
if (nC<8)
|
|
{ // spawn
|
|
sTag=fnSpawnType(oPC);
|
|
oDest=GetWaypointByTag("SR_SPAWN_"+IntToString(nR));
|
|
if (oDest!=OBJECT_INVALID&&GetObjectType(oDest)==OBJECT_TYPE_WAYPOINT)
|
|
{ // valid destination
|
|
oCR=CreateObject(OBJECT_TYPE_CREATURE,sTag,GetLocation(oDest));
|
|
AssignCommand(oCR,fnShadowAI());
|
|
} // valid destination
|
|
} // spawn
|
|
ExecuteScript("area_visit",OBJECT_SELF);
|
|
/*if (GetLocalInt(GetArea(oPC),"nPortalStarted")!=TRUE)
|
|
{
|
|
fnMovePortal(oCR,GetArea(oPC));
|
|
}
|
|
if (GetLocalInt(oMe,"nDarknessStorm")!=TRUE)
|
|
{ // activate darkness storm
|
|
SetLocalInt(oMe,"nDarknessStorm",TRUE);
|
|
fnDarknessStorm(oMe);
|
|
} // activate darkness storm */
|
|
} // is PC
|
|
} // is PC entering
|
|
}
|