EN4_PRC8/_module/nss/en4_mobdeath.nss

294 lines
8.1 KiB
Plaintext
Raw Permalink Normal View History

#include "inc_debug"
void RndDropGear(object oSelf, object oKiller);
void GiveXPToParty(object oPC,int iXP,int iPartyCount);
int GetHighestLevel(object oPC);
int GetPartyCount(object oPC);
int GetIntWisBonus(object oPC);
int HasHenchman(object oPC);
//void HyperGore(object oPC);
void RndDropGear(object oSelf, object oKiller)
{
//:: Declare major variables
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oSelf);
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oSelf);
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oSelf);
object oHelm = GetItemInSlot(INVENTORY_SLOT_HEAD, oSelf);
object oNecklace = GetItemInSlot(INVENTORY_SLOT_NECK, oSelf);
object oArms = GetItemInSlot(INVENTORY_SLOT_ARMS, oSelf);
object oArrows = GetItemInSlot(INVENTORY_SLOT_ARROWS, oSelf);
object oBelt = GetItemInSlot(INVENTORY_SLOT_BELT, oSelf);
object oBolts = GetItemInSlot(INVENTORY_SLOT_BOLTS, oSelf);
object oBoots = GetItemInSlot(INVENTORY_SLOT_BOOTS, oSelf);
object oBullets = GetItemInSlot(INVENTORY_SLOT_BULLETS, oSelf);
object oCloak = GetItemInSlot(INVENTORY_SLOT_CLOAK, oSelf);
object oLeftRing = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oSelf);
object oRightRing = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oSelf);
//:: Give a 25% chance to drop each type of equipment. 90% for Ammo
int bDropArmor = d100() > 75;
int bDropWeapon = d100() > 75;
int bDropShield = d100() > 75;
int bDropHelm = d100() > 75;
int bDropNecklace = d100() > 75;
int bDropArms = d100() > 75;
int bDropArrows = d100() > 10;
int bDropBelt = d100() > 75;
int bDropBolts = d100() > 10;
int bDropBoots = d100() > 75;
int bDropBullets = d100() > 10;
int bDropCloak = d100() > 75;
int bDropLeftRing = d100() > 75;
int bDropRightRing = d100() > 75;
if (!GetIsObjectValid(oArmor))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping armor", oKiller, FALSE);}
bDropArmor = 0;
}
if (!GetIsObjectValid(oWeapon))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping weapon", oKiller, FALSE);}
bDropWeapon = 0;
}
if (!GetIsObjectValid(oShield))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping shield", oKiller, FALSE);}
bDropShield = 0;
}
if (!GetIsObjectValid(oHelm))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping helmet", oKiller, FALSE);}
bDropHelm = 0;
}
if (!GetIsObjectValid(oNecklace))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping necklace", oKiller, FALSE);}
bDropNecklace = 0;
}
if (!GetIsObjectValid(oArrows))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping arrows", oKiller, FALSE);}
bDropArrows = 0;
}
if (!GetIsObjectValid(oBelt))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping belt", oKiller, FALSE);}
bDropBelt = 0;
}
if (!GetIsObjectValid(oBolts))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping bolts", oKiller, FALSE);}
bDropBolts = 0;
}
if (!GetIsObjectValid(oBoots))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping boots", oKiller, FALSE);}
bDropBoots = 0;
}
if (!GetIsObjectValid(oBullets))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping bullets", oKiller, FALSE);}
bDropBullets = 0;
}
if (!GetIsObjectValid(oCloak))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping cloak", oKiller, FALSE);}
bDropCloak = 0;
}
if (!GetIsObjectValid(oLeftRing))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping left ring", oKiller, FALSE);}
bDropLeftRing = 0;
}
if (!GetIsObjectValid(oRightRing))
{
if(DEBUG) {FloatingTextStringOnCreature("Not dropping right ring", oKiller, FALSE);}
bDropRightRing = 0;
}
//:: Set Droppable Flag as determined above.
SetDroppableFlag(oArmor, bDropArmor);
SetDroppableFlag(oWeapon, bDropWeapon);
SetDroppableFlag(oShield, bDropShield);
SetDroppableFlag(oHelm, bDropHelm);
SetDroppableFlag(oNecklace, bDropNecklace);
SetDroppableFlag(oArms, bDropArms);
SetDroppableFlag(oArrows, bDropArrows);
SetDroppableFlag(oBelt, bDropBelt);
SetDroppableFlag(oBolts, bDropBolts);
SetDroppableFlag(oBoots, bDropBoots);
SetDroppableFlag(oBullets, bDropBullets);
SetDroppableFlag(oCloak, bDropCloak);
SetDroppableFlag(oLeftRing, bDropLeftRing);
SetDroppableFlag(oRightRing, bDropRightRing);
}
void GiveXPToParty(object oPC,int iXP,int iPartyCount)
{
int iXPValue;
int iXPBonus;
object oPartyMember = GetFirstFactionMember(oPC, TRUE);
while (GetIsObjectValid(oPartyMember) == TRUE)
{
if (GetAssociateType(oPartyMember) == ASSOCIATE_TYPE_NONE && GetArea(oPartyMember) == GetArea(oPC))
{
if (GetLocalInt(oPartyMember,"PCHardCorePNP") == 1)
iXPValue = iXP*10/iPartyCount;
else if (GetLocalInt(oPartyMember,"PCHardCoreSpecial") == 1)
iXPValue = iXP*6/iPartyCount + (iXP/2)/iPartyCount;
else
iXPValue = iXP*3/iPartyCount;
iXPBonus = GetLocalInt(oPartyMember,"PCXPBonus") + GetIntWisBonus(oPC) + GetLocalInt(GetModule(),"BonusXP");
iXPValue = iXPValue + (iXPValue * iXPBonus/100);
if (HasHenchman(oPC))
iXPValue = iXPValue*2/3;
GiveXPToCreature(oPartyMember,iXPValue);
}
oPartyMember = GetNextFactionMember(oPC, TRUE);
}
}
int GetHighestLevel(object oPC)
{
object oPartyMember = GetFirstFactionMember(oPC, TRUE);
int iLevel;
int iHighestLevel;
iHighestLevel = 1;
while (GetIsObjectValid(oPartyMember) == TRUE)
{
iLevel = GetHitDice(oPartyMember) + GetLocalInt(oPartyMember,"PCLevelMod");
if (iLevel > iHighestLevel)
iHighestLevel = iLevel;
oPartyMember = GetNextFactionMember(oPC, TRUE);
}
return iHighestLevel;
}
int GetPartyCount(object oPC)
{
object oPartyMember = GetFirstFactionMember(oPC, TRUE);
int iCount;
iCount = 0;
while (GetIsObjectValid(oPartyMember) == TRUE)
{
if (GetAssociateType(oPartyMember) == ASSOCIATE_TYPE_NONE && GetArea(oPartyMember) == GetArea(oPC))
iCount++;
oPartyMember = GetNextFactionMember(oPC, TRUE);
}
return iCount;
}
int GetIntWisBonus(object oPC)
{
int iInt;
int iWis;
int iScore;
iInt = GetAbilityScore(oPC,ABILITY_INTELLIGENCE);
iWis = GetAbilityScore(oPC,ABILITY_WISDOM);
if (iInt > iWis)
iScore = iInt;
else
iScore = iWis;
iScore = (iScore-10)/2;
if (iScore < 0)
iScore = 0;
return iScore;
}
int HasHenchman(object oPC)
{
int iResult;
int iIndex;
object oHench;
iResult = FALSE;
iIndex = 1;
while (iIndex < 7)
{
oHench = GetHenchman(oPC,iIndex);
if (GetIsObjectValid(oHench))
{
if (GetTag(oHench) == GetLocalString(oPC,"Henchman"))
iResult = TRUE;
}
iIndex++;
}
return iResult;
}
/* void HyperGore(object oMob) <-- breaks quests
{
//:: Run Hypergore
int maxHP = GetMaxHitPoints(oMob);
//:: Gib target if massive damage is caused
if (GetCurrentHitPoints(oMob) < maxHP - (maxHP * 175/100))
{
effect eDeath = SupernaturalEffect(EffectDeath(TRUE, FALSE));
DelayCommand(0.1, ApplyEffectToObject(DURATION_TYPE_INSTANT ,eDeath, oMob));
}
else //:: Otherwise leave a corpse
{
//:: Prevent corpse fading.
SetIsDestroyable(FALSE, FALSE, FALSE);
//:: Create a corpse dummy.
object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "prop_corpse", GetLocation(oMob), FALSE, "BodyBag");
SetLocalObject(oCorpse, "CREATURE", oMob);
DestroyObject(oCorpse, 300.0);
}
} */
void main()
{
object oPC;
object oMob;
int iLevel;
int iLevelMod;
int iCR;
float fCR;
int iXPValue;
string sCR;
string sXPValue;
oPC = GetLastKiller();
if (!GetAssociateType(oPC) == ASSOCIATE_TYPE_NONE)
oPC =GetMaster(oPC);
oMob = OBJECT_SELF;
RndDropGear(oMob, oPC);
//HyperGore(oMob);
iLevel = GetHighestLevel(oPC);
fCR = GetChallengeRating(oMob);
iCR = FloatToInt(fCR);
if (iCR > 40)
sCR = "C40";
else
sCR = "C" + IntToString(iCR);
sXPValue = Get2DAString("xptable",sCR,iLevel-1);
iXPValue = StringToInt(sXPValue);
GiveXPToParty(oPC,iXPValue,GetPartyCount(oPC));
iLevelMod = GetLocalInt(oPC,"PCLevelMod");
//WriteTimestampedLogEntry("Value to " + GetName(oPC) + " for " + GetName(oMob) + "(" + sCR + ") : " + sXPValue + " -- Party Members = " + IntToString(GetPartyCount(oPC)));
}