Files
Anphillia_PRC8/_module/nss/zep_rust_cmb_end.nss
Jaysyn904 28cdb617b3 Initial commit
Adding all of the current content for Anphillia Unlimited.
2024-01-04 07:49:38 -05:00

163 lines
5.2 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Rust Monster Antennae Attack
//:://////////////////////////////////////////////
/*
Handles antennae attack and rusting functions
if attack hits. Also calls the end of combat
script every round.
*/
//:://////////////////////////////////////////////
//:: Based on End of Round Combat Script by Preston Watamaniuk
//:: Modified by LordEmil (July-30-2002) to include rust monster abilities
//:: Modified by El Magnifico Uno (Sept-11-2002) to enhance an already great script
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"
#include "zep_inc_scrptdlg"
// Added by eyesolated to respect the material(s) an item is made of
int IsMetalByItemProperties(object oItem)
{
// If no Material Property is set, return -1
if (!GetItemHasItemProperty(oItem, ITEM_PROPERTY_MATERIAL))
return -1;
itemproperty material = GetFirstItemProperty(oItem);
int nMaterial;
while (GetIsItemPropertyValid(material))
{
if (GetItemPropertyType(material) == ITEM_PROPERTY_MATERIAL)
{
nMaterial = GetItemPropertySubType(material);
/* Return TRUE if one of the following properties is found:
1 Adamantine
2 Brass
3 Bronze
5 Cold_Iron
6 Copper
7 Darksteel
8 Gold
9 Iron
10 Lead
11 Mithral
12 Platinum
13 Silver
14 Silver_Alchemical
15 Steel
*/
if ((nMaterial > 0 && nMaterial < 4) || // 4 = Carbon
(nMaterial > 4 && nMaterial < 16))
return 1;
}
material = GetNextItemProperty(oItem);
}
// There was material properties set, but none was a metal, so return FALSE
return 0;
}
// this will check to see if the object is metal
// or is partly metal - Returns 0 if no metal,
// 1 if part metal, 2 if mostly metal
// type 16 is armor and needs an extra check
int IsItemMetal(object oItem)
{
// Added by eyesolated to respect item properties
int nMetalByProperties = IsMetalByItemProperties(oItem);
if (nMetalByProperties != -1)
return nMetalByProperties;
int nReturnVal=0;
int type=GetBaseItemType(oItem);
if((type<6)||type==9||type==10||type==12||type==13||type==17||type==18
||type==22||type==27||type==32||type==33||type==35||type==37||type==28
||type==40||type==41||type==42||type==47||type==51||type==52||type==53
||type==57||type==59||type==60||type==63||type==65||type==76)
{
nReturnVal=2;// Mostly metal
}
if(type==7||type==7||type==19||type==20||type==21||type==28||type==31
||type==44||type==45||type==46||type==56||type==62||type==78
||type==25||type==55||type==58)
{
nReturnVal=1;// Part metal
}
if(type==BASE_ITEM_ARMOR)// see what kind of armor
{
int ac=GetItemACValue (oItem);
int limit=3;
if(GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS))limit=5;
if(ac>limit)
{
nReturnVal=2;// mostly metal
}
}
return nReturnVal;
}
void main()
{
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior();
}
else if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
{
DetermineCombatRound();
}
// do rust attack against attakee
if(GetIsInCombat())
{
string sItem;
object oItem;
int nItemSlot;
int isMetal;
object oPC=GetAttackTarget();
if(oPC==OBJECT_INVALID)oPC=GetAttemptedAttackTarget();
if (GetDistanceToObject(oPC) < 2.5)
{
for(nItemSlot=0;nItemSlot<13;nItemSlot++)
{
oItem=GetItemInSlot(nItemSlot,oPC);
isMetal=IsItemMetal(oItem);
if(isMetal!=0)break;// found a target
}
// El Magnifico Uno - Added TouchAttack
if(nItemSlot<13 && (TouchAttackMelee(oPC)>0))// we got one
{
sItem=GetName(oItem);
string sMessageToPC = GetStringByStrRef(nZEPRustMonBrush ,GENDER_MALE);
string sMessagePart2;
SendMessageToPC(oPC,sMessageToPC+sItem );
// El Magnifico Uno - Changed save mechanism
// to a straight Reflex Save per 3e rules.
// Normally only get a save for magical items.
// But was lazy and didn't want to list 60+
// instances of GetItemHasProperty.
if(ReflexSave(oPC,20))// saved
{
sMessageToPC=GetStringByStrRef(nZEPRustButResist1,GENDER_MALE);
sMessagePart2 = GetStringByStrRef(nZEPRustButResist2,GENDER_MALE);
SendMessageToPC(oPC,sMessageToPC+sItem+sMessagePart2);
}else //didn't save
{
sMessageToPC = GetStringByStrRef(nZEPRustAndDest,GENDER_MALE);
SendMessageToPC(oPC,sMessageToPC+sItem+"!");
DestroyObject(oItem);
//El Magnifico Uno - Changed Effect
// ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_ACID_L),oPC);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_ACID),GetLocation(oPC));
}
}
}
}
if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1003));
}
}