int AddExperience(int x) {
  int partyLevel = 1;
  object *party = ({ });
  foreach(string party_member in PartyMembers) {
    if (find_player(party_member)) {
      party += ({ find_player(party_member) });
    } else {
      RemovePartyMember(party_member);
    }

    // don't add xp if not in the same room.
    if (!present(party_member), environment(this_object())) {
      RemovePartyMember(party_member);    
    }
  }
   
  party += ({ this_object() });

  // I'm not actually sure what function this calls--
  //  number will go to inherited AddExperience?
  if (x < 0) { AddPartyExperience(x); return x; }

  foreach(object m in party) {
    if(m->GetLevel() > partyLevel) partyLevel = m->GetLevel();
  }
  
  // Old value (halfers/thirders/etc.)
  //x = x/sizeof(party);
  
  if (sizeof(party) > 1) eventPrint("%^YELLOW%^**%^RESET%^You are sharing experience with " + conjunction(GetCapitalPartyMembers(), "and") + ".");
  foreach(object m in party) {
    // a more advantagous split than halfers/thirders:
    // highest level gets full xp, lowbies get increasingly less.
    m->AddPartyExperience(x * m->GetLevel() / partyLevel ); 
  }
  return x;
}

/*
 front row: melee on front row, projectile/two-handed on back row
 back row: two-handed/projectile on front row
 spells always target whatever.

 combat lib: make GetRandomEnemy(whatever) always get the front row.
 
 Experience: smarter algorithm, closer to each getting 100% xp.
   Highest level: 100% xp
   Lower level: (level/higher level) * xp
*/

