294 lines
8.1 KiB
Plaintext
294 lines
8.1 KiB
Plaintext
#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)));
|
|
} |