Wowpedia

We have moved to Warcraft Wiki. Click here for information and the new URL.

READ MORE

Wowpedia
Register
(Gray level of a mob is character level - 9 for character levels 60-70.)
mNo edit summary
Line 14: Line 14:
 
Char level 6-39: Gray level = Char level - 5 - FLOOR(Char level/10)
 
Char level 6-39: Gray level = Char level - 5 - FLOOR(Char level/10)
 
Char level 40-59: Gray level = Char level - 1 - FLOOR(Char level/5)
 
Char level 40-59: Gray level = Char level - 1 - FLOOR(Char level/5)
Char level 60-70: Gray level = Char level - 9 = 51
+
Char level 60-70: Gray level = Char level - 9 = 51 @ 60, 61 @ 70
   
 
== Basic Formula ==
 
== Basic Formula ==

Revision as of 21:48, 4 April 2007

Con Colors

This is the color used to display the mob's level number in when the mob is targetted. It is a function of the difference between your level and the mob's level. Click Here For a full table list per level

Red:     Mob Level >= Char Level + 5
Orange:  Mob Level =  Char Level + (3 or 4)
Yellow:  Mob Level between (Char Level - 2) and (Char Level + 2)
Green:   Mob Level <= Char Level - 3, but above Gray Level
Gray:    Mob Level <= Gray Level

The highest mob level that gives you no experience is the Gray Level. It varies based on your character level as follows: (notes where levels have not been confirmed)

Char level  1-5:  Gray level = 0 (all mobs give XP)
Char level  6-39: Gray level = Char level - 5 - FLOOR(Char level/10)
Char level 40-59: Gray level = Char level - 1 - FLOOR(Char level/5)
Char level 60-70: Gray level = Char level - 9 = 51 @ 60, 61 @ 70

Basic Formula

XP = (Char Level * 5 + 45), where Char Level = Mob Level

This is the amount of experience you will get for a solo kill on a mob whose level is equal to your level.

Higher Level Mobs

XP = (Char Level * 5 + 45) * (1 + 0.05 * (Mob Level - Char Level) ), where Mob Level > Char Level

This is the amount of experience you will get for a solo kill on a mob whose level is higher than your level. This is known to be valid for up to Mob Level = Char Level + 4 (Orange and high-Yellow Mobs). Red mobs cap out at the same experience as orange. (For a level 40 character, a level 50 mob and a level 55 gave the same xp, even though the level 55 was elite and the 50 wasn't. Schmidt 00:46, 22 Nov 2005 (EST))

Lower Level Mobs

For a given character level, the amount of XP given by lower-level mobs is a linear function of the Mob Level. The amount of experience reaches zero when the difference between the Char Level and Mob Level reaches a certain point. This is called the Zero Difference value, and is given by:

ZD =  5, when Char Level =  1 -  7
ZD =  6, when Char Level =  8 -  9
ZD =  7, when Char Level = 10 - 11
ZD =  8, when Char Level = 12 - 15
ZD =  9, when Char Level = 16 - 19 
ZD = 11, when Char Level = 20 - 29
ZD = 12, when Char Level = 30 - 39
ZD = 13, when Char Level = 40 - 44
ZD = 14, when Char Level = 45 - 49
ZD = 15, when Char Level = 50 - 54
ZD = 16, when Char Level = 55 - 59
ZD = 17, when Char Level = 60
ZD is not known when Char Level >= 61

Using the ZD values above, the formula for Mob XP for any mob of level lower than your character is:

XP = (Char Level * 5 + 45) * (1 - (Char Level - Mob Level)/ZD )
   where Mob Level < Char Level, and Mob Level > Gray Level

Example calculations:

using Char Level = 20.
so Gray Level = 13, by the table above.
killing any mob level 13 or lower will give 0 XP.
Basic XP is (20 * 5 + 45) = 145. Killing a level 20 mob will give 145 XP.
For a level 21 mob, we have XP = 145 * (1 + 0.05 * 1) = 152.2 rounded to 152 XP.
ZD is 11, from the table above.
For a level 18 mob, we have XP = 145 * (1 - 2/11) = 118.6 rounded to 119 XP.
For a level 14 mob, we have XP = 145 * (1 - 6/11) =  92.3 rounded to  92 XP.

For a full table, complete with in-game observed values, see: Greenman's Solo XP Table

Elite Mobs

Mobs that are flagged as elite will give twice the amount of experience as a normal mob for the same level.

Elite XP = 2 * XP

The API UnitClassification function can return 5 levels of elite status: "worldboss", "rareelite", "elite", "rare", and "normal". Mobs classified as "elite" gain the 2x bonus as described. Mobs classified as "normal" and "rare" do not. The other two classes are unknown at this time. (elites in instances give 2.5 * XP when solo-ed; untested for normal mobs in instances - Stilpu)

Rested Bonus

The rested bonus doubles the experience given by a mob.

Rested XP = 2 * XP

This bonus is often reported as 50%. Consider this example for clarification:

a Level 11 rogue, fighting a level 10 Forest Lurker.
Basic XP for this level combination is 86 points.
The rogue is fully rested.
Combat log shows: "Forest Lurker dies, you gain 172 experience (+86exp Rested bonus)"
The experience bar shows that the rogue gained a total of 172 XP.
So the XP gained was 86 (Base XP) + 86 (Rested Bonus)

The bonus is not 50% of the base XP, it is 50% of the total XP gained.

The bonus is not 33% of the total gained, that is, the rogue above did not gain 172 + 86 XP total.

The rested bonus is accumulated as a certain number of future XP points. Your bonus on a kill will never exceed the amount of future XP points stored. Thus, if you have no rested bonus, and you stay briefly at an inn you will only accumulate 1 or 2 points. On your first kill thereafter, your Rested bonus will be that 1 or 2 points, not the full 100% bonus.

Solo Experience Modifiers

The experience amounts given above assume that the solo character and their pets have done 100% of the damage to kill the mob. Experience will be reduced when:

  • Someone else (ungrouped) helps to damage the mob. The XP you receive depends on if that someone else will receive xp for killing that mob. If yes, you get full XP. If not, you get a tiny fraction. It doesn't matter how many other ungrouped help damage nor how much damage you done.

Example: You're 6th level fighting a 6th level mob. If the ungrouped helper is level 10 or lower damage the mob, you will get full XP because a character level 10 or lower can receive XP from a 6th level mob. If the ungrouped helper is level 11 or higher, you get a tiny fraction of the XP.

  • Someone else (ungrouped) helps you by healing you in mid fight. This will cost you only a few XP points per heal.
  • Your damage shields do significant damage to the mob. This is usually a small loss, 5-10 XP points at worst.

The effect of this is that power-leveling low levels is much less effective than at higher levels. It is faster for low levels to kill without help, than it is to powerlevel them. It also makes it hard to determine the solo XP for high level mobs, since you won't get an accurate number unless the character does 100% of the damage.

The way to power-level is to be near the character level you're power-leveling. Thus, a 49th character will be much more effective than a 70th character in power-leveling a 40th level character. More effective would be multiple 49th characters power-leveling the 40th level character.

Level 60 and Up Characters

The Burning Crusade expansion has raised the level cap from 60 to 70 when it was released. The Gray Level for a level 60 character has changed from the previously known 47 to 51. The Zero Difference value at level 60 is indeed 17 as predicted. The formulas for levels 61 and above have not been discovered or verified so far.

Group Experience


The following is after very limited testing. The formulas here are best guess.

Assuming everyone in the group is the same level, XP = MXP/numberOfMembers * modifier.

Modifiers:

1 person group = 1.
2 person group = 1.
3 person group = 1.166.
4 person group = 1.3.
5 person group = 1.4.

Example:

1 person = 100xp
2 people = 50xp each.
3 people = ~39xp each.
4 people = ~33xp each.
5 people = ~28xp each.
Raid-sized groups dramatically decrease experience gained.

Two Character Groups

this information is based on a few limited trials

In a group of two characters, the total experience awarded for the mob is calculated using the solo XP formula and the level of the higher character. The experience is always divided between the two characters in the same ratio, regardless of how much damage was caused by each. The ratio for each character is determined by the formula:

CL1 = Character 1 Level, assumed to be the higher level character
CL2 = Character 2 Level
MXP = Solo Mob Experience, as calculated above for CL1
XP1 = MXP * CL1 / (CL1 + CL2),   the experience awarded to character 1
XP2 = MXP * CL2 / (CL1 + CL2),   the experience awarded to character 2

Note that XP1 and XP2 appear to be rounded to an integer value. The rested bonus available to each character is then applied based on the rounded amount of XP.

There is no group XP bonus for groups of only two players.

Examples:

A duo of levels 35 and 34 kill a mob of level 30.
CL1 = 35
CL2 = 34
ML  = 30
MXP = 128   (the solo XP as calculated for the level 35 char)
XP1 = 128 * 35 / 69 = 64.9275 (rounds up to 65)
XP2 = 128 * 34 / 69 = 63.0725 (rounds down to 63)
A duo of levels 36 and 34 kill a mob of level 34.
CL1 = 36
CL2 = 34
ML  = 34
MXP = 187.500   (the solo XP as calculated for the level 36 char)
XP1 = 187.5 * 36 / 70 = 96.429 (rounds down to 96)
XP2 = 187.5 * 34 / 70 = 91.071 (rounds down to 91)

When the mob is gray to the higher level character but not to the lower, the higher character will get no XP. The lower character will get some small amount of XP. (No idea how this is calculated or scales at this time.)

Example Code

LUA function for calculating xp based on the above figures

function CalcXp()
      t = UnitLevel("target");
      p = UnitLevel("player");
      if ( t == -1 ) then
           return 0;
      end
      if ( t == p ) then
           xp = ((p * 5) + 45);
      end
      if ( t > p ) then
           xp = ((p * 5) + 45) * (1 + 0.05 * (t - p));
      end
      if ( t < p ) then
           -- need gray level "g"
           if (p < 6) then g = 0; end
           if (p > 5 and p < 40) then
                g = p - 5 - floor(p/10);
           end
           if (p > 39) then
                g = p - 1 - floor(p/5);
           end
           if (t > g) then
                -- need zero difference "z"
                if (p < 8) then z = 5; end
                if (p > 7 and p < 10) then z = 6; end
                if (p > 9 and p < 12 ) then z = 7; end
                if (p > 11 and p < 16 ) then z = 8; end
                if (p > 15 and p < 20 ) then z = 9; end
                if (p > 19 and p < 40 ) then z = 9 + floor(p/10); end
                if (p > 39) then z = 5 + floor(p/5); end
                xp = (p * 5 + 45) * (1 - (p - t) / z);
           else 
                -- t <= g, mob is Gray
                xp = 0;
           end
      end
      xp = floor(xp+0.5);    -- result is rounded before calculating rest bonus
      if ( GetRestState() == 1) then
           xp = xp * 2;
      end
      if ( UnitClassification("target") == "elite" ) then
           xp = xp * 2;
           -- what about "worldboss", "rareelite"... not sure how the XP scales
      end
      if (xp > 0) then
           return xp;
      else
           return 0;
      end
end

These are C++ functions for calculating any mob XP (this is from my experimentation with a Palm OS WoW-like game, from which I 'stole' most of the formulas). They also include the mob difficulty colors (referred to as ConColors).


// Mob XP Functions (including Con Colors)
// Colors will be numbers:
//  {grey = 0, green = 1, yellow = 2, orange = 3, red = 4, skull = 5}
// NOTE: skull = red when working with anything OTHER than mobs!

double getConColor(int playerlvl, int moblvl)
{
	if(playerlvl + 5 <= moblvl) {
		if(playerlvl + 10 <= moblvl) {
			return 5;
		}
		else {
			return 4;
		}
	}
	else {
		switch(moblvl - playerlvl)
		{
			case 4:
			case 3:
			return 3;
			break;
			case 2:
			case 1:
			case 0:
			case -1:
			case -2:
			return 2;
			break;
			default:
			// More adv formula for grey/green lvls:
			if(playerlvl <= 5) {
				return 1; //All others are green.
			}
			else {
				if(playerlvl <= 39) {
					if(moblvl <= (playerlvl - 5 - floor(playerlvl/10))) {
						// Its below or equal to the 'grey level':
						return 0;
					}
					else {
						return 1;
					}
				}
				else {
					//player over lvl 39:
					if(moblvl <= (playerlvl - 1 - floor(playerlvl/5))) {
						return 0;
					}
					else {
						return 1;
					}
				}
			}
		}
	}
}

int getZD(int lvl)
{
	if(lvl <= 7) {
		return 5;
	}
	if(lvl <= 9) {
		return 6;
	}
	if(lvl <= 11) {
		return 7;
	}
	if(lvl <= 15) {
		return 8;
	}
	if(lvl <= 19) {
		return 9;
	}
	if(lvl <= 29) {
		return 11;
	}
	if(lvl <= 39) {
		return 12;
	}
	if(lvl <= 44) {
		return 13;
	}
	if(lvl <= 49) {
		return 14;
	}
	if(lvl <= 54) {
		return 15;
	}
	if(lvl <= 59)  {
               return 16;
	}

else { return 17; // Approx. }

}
double getMobXP(int playerlvl, int moblvl)
{
	if(moblvl >= playerlvl) {
		double temp = ((playerlvl * 5) + 45) * (1 + (0.05 * (moblvl - playerlvl)));
		double tempcap = ((playerlvl * 5) + 45) * 1.2;
		if(temp > tempcap) {
			return floor(tempcap);
		}
		else {
			return floor(temp);
		}
	}
	else {
		if(getConColor(playerlvl, moblvl) == 0) {
			return 0;
		}
		else {
			return floor((playerlvl * 5) + 45) * (1 - (playerlvl -  moblvl)/getZD(playerlvl));
		}
	}
}
double getEliteMobXP(int playerlvl, int moblvl)
{
	return getMobXP(playerlvl, moblvl) * 2;
}

// Rested Bonus:
// Restedness is double XP, but if we only have part restedness we must split the XP:

double getMobXPFull(int playerlvl, int moblvl, bool elite, int rest)
{
	// rest = how much XP is left before restedness wears off:
	double temp = 0;
	if(elite) {
		temp = getEliteMobXP(playerlvl, moblvl);
	}
	else {
		temp = getMobXP(playerlvl, moblvl);
	}
	// Now to apply restedness.  temp = actual XP.
	// If restedness is 0...
	if(rest == 0) {
		return temp;
	}
	else {
		if(rest >= temp) {
			return temp * 2;
		}
		else {
			//Restedness is partially covering the XP gained.
			// XP = rest + (AXP - (rest / 2))
			return rest + (temp - (rest / 2));
		}
	}
}
// Party Mob XP:
double getPartyMobXPFull(int playerlvl, int highestlvl, int sumlvls, int moblvl, bool elite, int  rest)
{
	double temp = getMobXPFull(highestlvl, moblvl, elite, 0);
	// temp = XP from soloing via highest lvl...
	temp = temp * playerlvl / sumlvls;
	if(rest == 0) {
		return temp;
	}
	else {
		if(rest >= temp) {
			return temp * 2;
		}
		else {
			//Restedness is partially covering the XP gained.
			// XP = rest + (AXP - (rest / 2))
			return rest + (temp - (rest / 2));
		}
	}
}

Here are some functions to do these calculations in PHP. Only single person XP is provided.

<?
	function calculateXP($playerlevel, $moblevel, $elite = false, $rested = false)
	{
		if($playerlevel < $moblevel)
		{
			if($moblevel - $playerlevel > 4)
				$moblevel = $playerlevel + 4;
			$xp = ($playerlevel * 5 + 45) * (1 + 0.05 * ($moblevel - $playerlevel));
		}
		elseif($playerlevel == $moblevel)
		{
			$xp = $playerlevel * 5 + 45;
		}
		elseif($playerlevel > $moblevel)
		{
			if($moblevel <= calculateGrayLevel($playerlevel))
				$xp = 0;
			else
			{
				if($playerlevel >= 1 && $playerlevel <= 7)
					$zd = 5;
				elseif($playerlevel >= 8 && $playerlevel <= 9)
					$zd = 6;
				elseif($playerlevel >= 10 && $playerlevel <= 11)
					$zd = 7;
				elseif($playerlevel >= 12 && $playerlevel <= 15)
					$zd = 8;
				elseif($playerlevel >= 16 && $playerlevel <= 19)
					$zd = 9;
				elseif($playerlevel >= 20 && $playerlevel <= 29)
					$zd = 11;
				elseif($playerlevel >= 30 && $playerlevel <= 39)
					$zd = 12;
				elseif($playerlevel >= 40 && $playerlevel <= 44)
					$zd = 13;
				elseif($playerlevel >= 45 && $playerlevel <= 49)
					$zd = 14;
				elseif($playerlevel >= 50 && $playerlevel <= 54)
					$zd = 15;
				elseif($playerlevel >= 55 && $playerlevel <= 59)
					$zd = 16;
				elseif($playerlevel == 60)
					$zd = 17;
				$xp = ($playerlevel * 5 + 45) * (1 - ($playerlevel - $moblevel) / $zd);
			}
		}
		if($elite == true)
			$xp *= 2;
		if($rested == true)
			$xp *= 2;
		return round($xp);
	}
	function calculateGrayLevel($playerlevel)
	{
		if($playerlevel >= 1 && $playerlevel <= 5)
			return 0;
		elseif($playerlevel >= 6 && $playerlevel <= 39)
			return $playerlevel - 5 - floor($playerlevel / 10);
		elseif($playerlevel >= 40 && $playerlevel <= 60)
			return $playerlevel - 1 - floor($playerlevel / 5);
	}
	function calculateDifficulty($playerlevel, $moblevel)
	{
		$leveldiff = $moblevel - $playerlevel;
		if($moblevel <= calculateGrayLevel($playerlevel))
			return 'Gray';
		else
		{
			if($leveldiff >= 5)
				return 'Red';
			elseif($leveldiff >= 3 && $leveldiff <= 4)
				return 'Orange';
			elseif($leveldiff >= -2 && $leveldiff <= 2)
				return 'Yello';
			elseif($leveldiff <= -3)
				return 'Green';
		}
	}
?>