//::
//:: prc_pwondeath.nss
//::

#include "NW_I0_GENERIC"

void main()
{
    object oKiller = GetLastKiller();
    int noleech = 0;
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);

    float BaseEXP = ((GetChallengeRating(OBJECT_SELF)*3.0)+5);
    float BonusEXP = GetChallengeRating(OBJECT_SELF)+5;
    float BaseMonEXP = BaseEXP;
    int NumOfParty = 0;
    float PartyLevelSum = 0.0;
    object oPartyMember = GetFirstFactionMember(oKiller, TRUE);
    while(GetIsObjectValid(oPartyMember))  {
        if (GetArea(OBJECT_SELF) == GetArea(oPartyMember))
        {
        int leech = GetHitDice(oPartyMember);
        if (leech >= noleech){
        noleech = leech;
        }
        NumOfParty++;
        PartyLevelSum += GetCharacterLevel(oPartyMember);
        }
        oPartyMember = GetNextFactionMember(oKiller, TRUE);
    }
     if (PartyLevelSum <= 1.0)
    {
       PartyLevelSum = 1.0;
    }
     if (NumOfParty <= 1)
    {
       NumOfParty = 1;
    }
    float PartyAvgLvl = PartyLevelSum / NumOfParty;
    //Calculate Adjustment Value
         if (PartyAvgLvl <= 1.0)
    {
       PartyAvgLvl = 1.0;
    }
    float x =  GetChallengeRating(OBJECT_SELF);
             if (x <= 1.0)
    {
       x = 1.0;
    }
    float z =  (x / PartyAvgLvl);
    float AdjustValue = ((z+2)/3);
    float FinalMonValue;
    //Determine Final Experience Value
    if (AdjustValue == 0.0) {
        FinalMonValue = BaseMonEXP;
     } else {
        if (AdjustValue < 1.0) {
            FinalMonValue = BaseMonEXP * AdjustValue;
        } else {
            FinalMonValue = BaseMonEXP + (BonusEXP * (AdjustValue * (1.10)));
        }
     }
     //Determine the value of the Split EXP
    if (NumOfParty >= 6)
    {
       NumOfParty = 5;
    }
     if (NumOfParty <= 1)
    {
       NumOfParty = 1;
    }
         if (FinalMonValue <= 1.0)
    {
       FinalMonValue = 1.0;
    }
     float SplitFinalEXP = FinalMonValue / NumOfParty;
             if (SplitFinalEXP <= 1.0)
    {
       SplitFinalEXP = 1.0;
    }
    float y = (FinalMonValue - SplitFinalEXP);
                if (y <= 1.0)
    {
       y = 1.0;
    }
              if (PartyAvgLvl >= 15.0)
    {
        FinalMonValue = FinalMonValue - ( PartyAvgLvl);
    }
     float PartyBonus = ((y +1)/ 1.75) + (FinalMonValue + ((21-PartyAvgLvl)/3));
     int SFEint = FloatToInt(PartyBonus);
     //Distribute EXP to all PCs in the Party
     oPartyMember = GetFirstFactionMember(oKiller, TRUE);
     while (GetIsObjectValid(oPartyMember)) {
        if (GetArea(OBJECT_SELF) == GetArea(oPartyMember))  {
            int nHD = GetHitDice(oPartyMember) + 1;
            int nMax = (((nHD * (nHD - 1)) / 2) * 1000)+1;
            if (nMax <= GetXP(oPartyMember) && nHD <= 40)  {
                SendMessageToPC(oPartyMember, "You cannot gain experience until you have leveled.");
            } else if (GetIsDead(oPartyMember))  {
                SendMessageToPC(oPartyMember, "You cannot gain experience while dead. Your XP has been reset.");
            } else if ((GetHitDice(oPartyMember)) <= (noleech - 7) || (GetHitDice(oPartyMember)) >= FloatToInt(PartyAvgLvl) + 7)  {
                SendMessageToPC(oPartyMember, "All party members must be within 6 levels of each other.");
            } else {
                GiveXPToCreature(oPartyMember, SFEint);
            }
        }
        oPartyMember = GetNextFactionMember(oKiller, TRUE);
     }
}