#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 }