Project 1999

Go Back   Project 1999 > Class Discussions > Melee

Reply
 
Thread Tools Display Modes
  #21  
Old 09-17-2024, 03:50 PM
Jimjam Jimjam is online now
Planar Protector


Join Date: Jul 2013
Posts: 11,937
Default

Quote:
Originally Posted by Knuckle [You must be logged in to view images. Log in or Register.]
That's cool but we would need confirmation if P99 are using a post POP agi table.
The fact it caps out at 40+ and 255 agi suggests to me that Korak Sarathai derived this before the revamp, or it is unchanged from pre-kunark.
Reply With Quote
  #22  
Old 09-17-2024, 04:40 PM
Jimjam Jimjam is online now
Planar Protector


Join Date: Jul 2013
Posts: 11,937
Default

Quote:
Originally Posted by Knuckle [You must be logged in to view images. Log in or Register.]
That's cool but we would need confirmation if P99 are using a post POP agi table.
Found a similar table from early 2002 meaning it is from before the great monk nerf.

https://web.archive.org/web/20020625...cID=1462.topic

As the changes focused on ac caps, the table predates the nerf and as i reasoned in a previous post it looks like it has been untouched since vanilla release I suggest p99 should be using a similar table for agi avoidance ac calculation.
Reply With Quote
  #23  
Old 10-01-2024, 10:14 PM
greatdane greatdane is offline
Fire Giant


Join Date: Jun 2011
Posts: 669
Default

The long and short of it is that agility gives nowhere near enough to ever care about or give anything up for. It isn't even worth a buff slot unless there are no other useful buffs available. Aside from the well-known breakpoint at 75 agility, the stat can be ignored entirely and the difference is invisible to the naked eye. It does almost nothing.
Reply With Quote
  #24  
Old 10-03-2024, 09:47 PM
Salaryman Salaryman is offline
Fire Giant

Salaryman's Avatar

Join Date: Jan 2014
Posts: 594
Default

Agility effects pvp making it the most important stat, I am now stacking agi because i play on a real man's server RED99
Reply With Quote
  #25  
Old 10-03-2024, 11:57 PM
Snaggles Snaggles is offline
Planar Protector


Join Date: Jul 2011
Posts: 2,925
Default

*pretending to take notes*
That’s fascinating. Please go on.
Reply With Quote
  #26  
Old 10-13-2024, 01:02 AM
Knuckle Knuckle is offline
Planar Protector

Knuckle's Avatar

Join Date: Dec 2010
Posts: 3,796
Send a message via AIM to Knuckle
Default

Quote:
Originally Posted by Jimjam [You must be logged in to view images. Log in or Register.]
Found a similar table from early 2002 meaning it is from before the great monk nerf.

https://web.archive.org/web/20020625...cID=1462.topic

As the changes focused on ac caps, the table predates the nerf and as i reasoned in a previous post it looks like it has been untouched since vanilla release I suggest p99 should be using a similar table for agi avoidance ac calculation.
Now that is a good find! Feels like an archeology club digging up these old relics.
__________________
Reply With Quote
  #27  
Old 11-06-2024, 10:31 PM
Jafir Jafir is offline
Orc


Join Date: Jan 2013
Posts: 41
Default

Classic/Kunark/Velious Agility gave both Avoidance and Mitigation AC. Whether or not the formula on P99 adheres to that, I do not know. Here is a reference to mid-Velious, which still had a hard cap on Mitigation AC:

defense_agility_bonus method
Code:
if GetAGI() < 40: # penalty
  return (25 * (GetAGI() - 40)) / 40

if GetAGI() <= 60:
  return 0

if GetAGI() <= 74:
  bonus = 28 - (200 - GetAGI()) / 5
  return 2 * bonus / 3

# so 75+
bonus = max(200 - GetAGI(), 0)
if GetLevel() >= 40:
  bonus = 80 - bonus / 5
elif GetLevel() >= 20:
  bonus = 70 - bonus / 5
elif GetLevel() >= 7:
  bonus = 55 - bonus / 5
else:
  bonus = 35 - bonus / 5
return 2 * bonus / 3
compute_defense method
Code:
skill = max(GetSkill(SkillDefense), 0)
bonus = 400 * skill / 225 + defense_agility_bonus()

if IsClient():
  drunk = float(GetIntoxication() / 2)
  if drunk > 20.0:
    redux = min((110.0 - drunk) * 0.01, 1.0)
    bonus = int(bonus * redux)

return max(bonus, 1)
ac method
Code:
item_ac = 0
for slot in range(0, 21):
  item = GetItemPossession(slot)
  if item.IsValid and item.GetItemClass() == ItemClassCommon:
    item_ac = item_ac + item.GetItemAC()

if not IsMage():
  bonus = 4 * item_ac / 3

if IsClient() and bonus > 6 * GetLevel() + 25:
  bonus = 6 * GetLevel() + 25

weight_hardcap = 30
weight_softcap = 14

if GetLevel() > 59:
  weight_hardcap = 45
  weight_softcap = 24
elif GetLevel() > 54:
  weight_hardcap = 40
  weight_softcap = 20
elif GetLevel() > 50:
  weight_hardcap = 38
  weight_softcap = 18
elif GetLevel() > 44:
  weight_hardcap = 36
  weight_softcap = 17
elif GetLevel() > 29:
  weight_hardcap = 34
  weight_softcap = 16
elif GetLevel() > 14:
  weight_hardcap = 32
  weight_softcap = 15

if GetClass() == MONK:
  weight = GetWeight()
  if weight < weight_hardcap - 1:
    weight_bonus = float(level + 5)
    if weight > weight_softcap:
      temp_mod = min(float(weight - weight_softcap) * 6.66667, 100.0)
      weight_bonus = max(0.0, weight_bonus * ((100.0 - temp_mod) * 0.01))
    bonus = bonus + int(weight_bonus * 11.0 * 0.1)

if bonus < 0:
  bonus = 0

if GetClass() == MONK:
  weight = GetWeight()
  if weight > weight_hardcap + 1:
    weight_penalty = level + 5
    temp_mod = min(1.0, (float(weight) - 20.0) * 0.01)
    bonus = bonus - int(temp_mod)

if GetClass() == ROGUE:
  agi = GetAGI()
  if agi > 75 and GetLevel() > 29:
    LevelScaler = GetLevel() - 26
    if agi >= 100:
      LevelScaler = LevelScaler * 5
    elif agi >= 90:
      LevelScaler = LevelScaler * 4
    elif agi >= 85:
      LevelScaler = LevelScaler * 3
    elif agi >= 80:
      LevelScaler = LevelScaler * 2
    tmp_bonus = LevelScaler / 4
    bonus = bonus + min(12, tmp_bonus)

if GetRace() == IKSAR:
  bonus = bonus + min(35, max(10, GetLevel())

if IsMage():
  bonus = bonus + GetSkill(SkillDefense) / 2
else:
  bonus = bonus + GetSkill(SkillDefense) / 3

if GetAGI() > 70:
  bonus = bonus + GetAGI() / 20

if IsMage():
  bonus = bonus + TotalEffect(SPA_AC) / 3
else:
  bonus = bonus + TotalEffect(SPA_AC) / 4

if bonus < 0:
  bonus = 0

if IsClient():
  hardcap = 350
  if GetClass() == WARRIOR and GetLevel() > 50:
    hardcap = 430
  if (GetClass() == PALADIN or GetClass() == SHADOWKNIGHT or GetClass() == BARD) and GetLevel() > 50
    hardcap = 403
  if (GetClass() == RANGER or GetClass() == ROGUE or GetClass() == MONK) and GetLevel() > 50
    hardcap = 375
  if bonus > hardcap:
    bonus = hardcap

return bonus
That means you could have 12.75 Mitigation AC and 53.33 Avoidance AC from 255 Agility. Compared to 75 Agility where you get 3.75 Mitigation AC and 36.67 Avoidance AC.
Last edited by Jafir; 11-06-2024 at 10:45 PM..
Reply With Quote
  #28  
Old 11-06-2024, 10:43 PM
Knuckle Knuckle is offline
Planar Protector

Knuckle's Avatar

Join Date: Dec 2010
Posts: 3,796
Send a message via AIM to Knuckle
Default

Would be cool if there was a dev response on how AGI works on p99. really hard to confirm if any effect here.
__________________
Reply With Quote
  #29  
Old 11-06-2024, 11:33 PM
Jimjam Jimjam is online now
Planar Protector


Join Date: Jul 2013
Posts: 11,937
Default

Quote:
Originally Posted by Jafir [You must be logged in to view images. Log in or Register.]
Classic/Kunark/Velious Agility gave both Avoidance and Mitigation AC.
 
Whether or not the formula on P99 adheres to that, I do not know. Here is a reference to mid-Velious, which still had a hard cap on Mitigation AC:

defense_agility_bonus method
Code:
if GetAGI() < 40: # penalty
  return (25 * (GetAGI() - 40)) / 40

if GetAGI() <= 60:
  return 0

if GetAGI() <= 74:
  bonus = 28 - (200 - GetAGI()) / 5
  return 2 * bonus / 3

# so 75+
bonus = max(200 - GetAGI(), 0)
if GetLevel() >= 40:
  bonus = 80 - bonus / 5
elif GetLevel() >= 20:
  bonus = 70 - bonus / 5
elif GetLevel() >= 7:
  bonus = 55 - bonus / 5
else:
  bonus = 35 - bonus / 5
return 2 * bonus / 3
compute_defense method
Code:
skill = max(GetSkill(SkillDefense), 0)
bonus = 400 * skill / 225 + defense_agility_bonus()

if IsClient():
  drunk = float(GetIntoxication() / 2)
  if drunk > 20.0:
    redux = min((110.0 - drunk) * 0.01, 1.0)
    bonus = int(bonus * redux)

return max(bonus, 1)
ac method
Code:
item_ac = 0
for slot in range(0, 21):
  item = GetItemPossession(slot)
  if item.IsValid and item.GetItemClass() == ItemClassCommon:
    item_ac = item_ac + item.GetItemAC()

if not IsMage():
  bonus = 4 * item_ac / 3

if IsClient() and bonus > 6 * GetLevel() + 25:
  bonus = 6 * GetLevel() + 25

weight_hardcap = 30
weight_softcap = 14

if GetLevel() > 59:
  weight_hardcap = 45
  weight_softcap = 24
elif GetLevel() > 54:
  weight_hardcap = 40
  weight_softcap = 20
elif GetLevel() > 50:
  weight_hardcap = 38
  weight_softcap = 18
elif GetLevel() > 44:
  weight_hardcap = 36
  weight_softcap = 17
elif GetLevel() > 29:
  weight_hardcap = 34
  weight_softcap = 16
elif GetLevel() > 14:
  weight_hardcap = 32
  weight_softcap = 15

if GetClass() == MONK:
  weight = GetWeight()
  if weight < weight_hardcap - 1:
    weight_bonus = float(level + 5)
    if weight > weight_softcap:
      temp_mod = min(float(weight - weight_softcap) * 6.66667, 100.0)
      weight_bonus = max(0.0, weight_bonus * ((100.0 - temp_mod) * 0.01))
    bonus = bonus + int(weight_bonus * 11.0 * 0.1)

if bonus < 0:
  bonus = 0

if GetClass() == MONK:
  weight = GetWeight()
  if weight > weight_hardcap + 1:
    weight_penalty = level + 5
    temp_mod = min(1.0, (float(weight) - 20.0) * 0.01)
    bonus = bonus - int(temp_mod)

if GetClass() == ROGUE:
  agi = GetAGI()
  if agi > 75 and GetLevel() > 29:
    LevelScaler = GetLevel() - 26
    if agi >= 100:
      LevelScaler = LevelScaler * 5
    elif agi >= 90:
      LevelScaler = LevelScaler * 4
    elif agi >= 85:
      LevelScaler = LevelScaler * 3
    elif agi >= 80:
      LevelScaler = LevelScaler * 2
    tmp_bonus = LevelScaler / 4
    bonus = bonus + min(12, tmp_bonus)

if GetRace() == IKSAR:
  bonus = bonus + min(35, max(10, GetLevel())

if IsMage():
  bonus = bonus + GetSkill(SkillDefense) / 2
else:
  bonus = bonus + GetSkill(SkillDefense) / 3

if GetAGI() > 70:
  bonus = bonus + GetAGI() / 20

if IsMage():
  bonus = bonus + TotalEffect(SPA_AC) / 3
else:
  bonus = bonus + TotalEffect(SPA_AC) / 4

if bonus < 0:
  bonus = 0

if IsClient():
  hardcap = 350
  if GetClass() == WARRIOR and GetLevel() > 50:
    hardcap = 430
  if (GetClass() == PALADIN or GetClass() == SHADOWKNIGHT or GetClass() == BARD) and GetLevel() > 50
    hardcap = 403
  if (GetClass() == RANGER or GetClass() == ROGUE or GetClass() == MONK) and GetLevel() > 50
    hardcap = 375
  if bonus > hardcap:
    bonus = hardcap

return bonus

That means you could have 12.75 Mitigation AC and 53.33 Avoidance AC from 255 Agility. Compared to 75 Agility where you get 3.75 Mitigation AC and 36.67 Avoidance AC.
Very interesting. On live, if you use a monster shroud and spend shroud AA on agility your mitigation ac rises too. I wonder whether a similar system is in use there.
Reply With Quote
  #30  
Old 11-07-2024, 12:08 AM
Snaggles Snaggles is offline
Planar Protector


Join Date: Jul 2011
Posts: 2,925
Default

A 60 shaman can buff over 129 agility and heal a monk against a normal blue con forever.

There is nothing stopping anyone from parsing this. Aside from it being silly and painfully boring.
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 02:24 PM.


Everquest is a registered trademark of Daybreak Game Company LLC.
Project 1999 is not associated or affiliated in any way with Daybreak Game Company LLC.
Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.