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