Go Back   EQEmulator Home > EQEmulator Forums > Development > Development::Bug Reports

Development::Bug Reports Post detailed bug reports and what you would like to see next in the emu here.

Reply
 
Thread Tools Display Modes
  #1  
Old 07-23-2015, 10:46 PM
Shendare
Dragon
 
Join Date: Apr 2009
Location: California
Posts: 814
Default Level 1 NPCs may be overpowered after all

Playing around on Legacy of Froststone last night, I had a rather disappointing experience. My Dark Elf Enchanter in old Nektulos managed to take down two level 1 creatures, but was killed by level 1 creatures at least 10 times in a row afterwards. Them's bad odds.

I thought I'd do some experimenting on my own default EQEmu install. See if it's just a fluke or happens rarely. Looks like it's not...

I created five Level 1 characters, got them their starting chest piece and cast their starting buffs, and went to kill Level 1 creatures in their newbie areas.

Here's how things went:

Code:
1) Dark Elf Enchanter, Nektulos

a black wolf - 19secs, npc: 33dmg, player: 14dmg, player won
a garter snake - 27secs, npc: 44dmg, player: 10dmg, npc won

2) Wood Elf Druid, GFaydark

a sylvan bat - 18secs, npc: 22dmg, player: 17dmg, player won
a decaying skeleton - 18secs, npc: 24dmg, player: 20dmg, player won
a sylvan bat - 33secs, npc: 49dmg, player: 15dmg, npc won

3) Halfling Cleric, Misty

a black wolf - 13secs, npc: 14dmg, player: 14dmg, player won
a mangy rat - 12secs, npc: 12dmg, player: 16dmg, player won
a black wolf - 16secs, npc: 25dmg, player: 14dmg, player won

4) Ogre Berzerker, Feerott, 6/33 starter 2HS felt OP

a decaying skeleton - 0secs, npc: 0dmg, player: 12dmg, player won
a froglok tad - 3secs, npc: 6dmg, player: 19dmg, player won

5) Human Necro, NRo

a decaying skeleton - 12secs, npc: 21dmg, player: 13dmg, player won
a decaying skeleton - 14secs, npc: 22dmg, player: 17dmg, player won
a coyote - 10secs, npc: 19dmg, player: 13dmg, player won
I know it's a small sampling, but one thing really stood out during every fight... the NPC was hitting for 50%-100% of its max damage with nearly every hit.

That first black wolf? Hit my enchanter for 6, 3, 6, 4, 6, 4, 4.
I hit back for 2, 1, 1, 3, 2, 1, 0, 1, 3.

Fortunately, Level 1 NPCs have like a dozen HP, so my enchanter survived the encounter with about 20% health left.

Next was the garter snake. It hit for 0, 6, 6, 6, 3, 4, 6, 3, 4, 6, 6, 6.
I hit back for 0, 0, 2, 2, 1, 2, 0, 0, 1, 1, 0, 1, and was knocked down and killed.

Even after just two fights, there was some definite strangeness about the NPC's hit rate and damage. Just like someone else had reported a little while ago, every hit played the "big hit" sound effect instead of the little hit one, and almost never did it hit for less than 50% of its max damage.

Through the rest of the fights, the way for a Level 1 character to beat a Level 1 creature came down to one thing: getting lucky with big hits from their starter weapon, and taking out the enemy before it could hit back with all those half to max hits.

If the player's hits were unlucky and low, the fight lasted too long, and the enemy's big hits took them down. Only if the player was fast enough to kill the enemy did they win, and that really came down to pure dumb luck with the autoattack rolls.

I know the number of wins and losses in the table above doesn't look too bad, but it really felt off in the game. Those enemies are doing twice the damage I would expect them to.

I do not remember my level 1 character being killed 10 times in a row by a level 1 enemy even back in 2000.

Something's off with their ATK, or STR, or their rolls, and it's likely not limited to Level 1 NPCs.

Oh, and the 6/33 starter 2HS for the Ogre Berzerker just felt silly. It killed everything in 1 or 2 hits. Hahaha.
Reply With Quote
  #2  
Old 07-23-2015, 11:36 PM
Shendare
Dragon
 
Join Date: Apr 2009
Location: California
Posts: 814
Default

For comparison, I logged onto Live and created the Dark Elf Enchanter, going to the same newbie area with the same starter gear and what looked to me like the same stats.

Obviously, they've made the game easier now than it was way back when, but the difference is striking:

Code:
a black wolf - 22secs, npc: 12dmg, player: 19dmg, player won
a decaying skeleton - 17secs, npc: 14dmg, player: 19dmg, player won
an araneidae spiderling - 14secs, npc: 15dmg, player: 22dmg, player won
a decaying skeleton - 25secs, npc: 11dmg, player: 21dmg, player won
a decaying skeleton - 15secs, npc: 7dmg, player: 18dmg, player won
Even with the fight lasting 25 seconds, the decaying skeleton did 11 damage, while the player did 21.

In the default EQEmu setup, a garter snake did 44 damage in 27 seconds, and the player did 10.

I also noticed that, not only are the NPCs not hitting for max with each hit (it seemed to be pretty evenly distributed between 1 and 6), but on Live my character was hitting for up to 6 damage with the same 3/21 dagger as on Emu, where he never did more than 3.

Just some peculiarity that seems to be making fresh EQEmu starts extra difficult.
Reply With Quote
  #3  
Old 07-24-2015, 08:25 AM
chrsschb's Avatar
chrsschb
Dragon
 
Join Date: Nov 2008
Location: GA
Posts: 905
Default

Have noticed the same.
__________________
Clumsy's World: Resurgence
Clumsy's World [2006-2012]
Reply With Quote
  #4  
Old 07-24-2015, 09:00 AM
provocating's Avatar
provocating
Demi-God
 
Join Date: Nov 2007
Posts: 2,175
Default

I have noticed the same. I do not remember getting my ass kicked quite so bad in Classic. Of course playing way back then we all knew so little about the game. As time progressed we did statistics, parses, etc and learned so much about the game. Also as the game changed things got skewed and so did our memories about the game. I remember the game being hard but as Shendare said I do not remember that "hard hit" sound quite so much.

I will look into the AC and attack code this morning and see where we are at. I am glad Torven is doing so much research but the sad thing we can only do statistics on live now, which has changed. There is no way to go back and do statistics during the time I want to capture, which is Velious. Sadly all I can do is recapture that time period the best I can.
Reply With Quote
  #5  
Old 07-24-2015, 11:28 AM
Shendare
Dragon
 
Join Date: Apr 2009
Location: California
Posts: 814
Default

Yeah. I don't remember it being this way in Emu, either, but I don't have the slightest idea when it might have been accidentally introduced. It's been a good while since I tested Level 1 character encounters.
Reply With Quote
  #6  
Old 07-24-2015, 03:58 PM
N0ctrnl's Avatar
N0ctrnl
Discordant
 
Join Date: Jan 2007
Posts: 443
Default

Cowboy6534 came up with a custom bit of code that I've been using for around 6 months to ease this very thing: http://www.eqemulator.org/forums/sho...3&postcount=75

Here's a patch file if you want to give this a shot:
Code:
--- attack.cpp	2015-07-22 17:07:55.879303652 -0500
+++ attack.cpp.patched	2015-07-24 09:55:03.886735122 -0500
@@ -1851,24 +1851,29 @@
 		uint8 otherlevel = other->GetLevel();
 		uint8 mylevel = this->GetLevel();
 
-		otherlevel = otherlevel ? otherlevel : 1;
-		mylevel = mylevel ? mylevel : 1;
+                int otherac = other->GetAC();
+                float acdiv = (RuleR(Combat, ACDR));
 
-		//instead of calcing damage in floats lets just go straight to ints
-		if(RuleB(Combat, UseIntervalAC))
-			damage = (max_dmg+eleBane);
-		else
-			damage = zone->random.Int((min_dmg+eleBane),(max_dmg+eleBane));
-
-		//check if we're hitting above our max or below it.
-		if((min_dmg+eleBane) != 0 && damage < (min_dmg+eleBane)) {
-			Log.Out(Logs::Detail, Logs::Combat, "Damage (%d) is below min (%d). Setting to min.", damage, (min_dmg+eleBane));
-			damage = (min_dmg+eleBane);
-		}
-		if((max_dmg+eleBane) != 0 && damage > (max_dmg+eleBane)) {
-			Log.Out(Logs::Detail, Logs::Combat, "Damage (%d) is above max (%d). Setting to max.", damage, (max_dmg+eleBane));
-			damage = (max_dmg+eleBane);
-		}
+                otherlevel = otherlevel ? otherlevel : 1;
+                mylevel = mylevel ? mylevel : 1;
+
+                //instead of calcing damage in floats lets just go straight to ints
+                if(RuleB(Combat, UseIntervalAC)) {
+                        damage = (max_dmg+eleBane);
+                }
+                else {
+                        damage = zone->random.Real((min_dmg+eleBane) - (otherac * acdiv/100.0f),(max_dmg+eleBane) - (otherac * acdiv/100.0f));
+
+                }
+
+                //check if we're hitting above our max or below it.
+                if((min_dmg+eleBane) != 0 && damage < (min_dmg+eleBane)) {
+                        Log.Out(Logs::Detail, Logs::Combat, "Damage (%d) is below min (%d). Setting to min.", damage, (min_dmg+eleBane));
+                        damage = ((min_dmg+eleBane) - (otherac * acdiv/100.0f));
+                }
+                if((max_dmg+eleBane) != 0 && damage > (max_dmg+eleBane)) {
+                        Log.Out(Logs::Detail, Logs::Combat, "Damage (%d) is above max (%d). Setting to max.", damage, (max_dmg+eleBane));
+                        damage = (max_dmg+eleBane);
+                }
 
 		damage = mod_npc_damage(damage, skillinuse, Hand, weapon, other);
You'll also need the Combat::ACDR rule:
Code:
--- ruletypes.h 2015-07-22 17:01:15.399924354 -0500
+++ ruletypes.h.patched 2015-07-24 10:00:08.434263104 -0500
@@ -452,6 +452,7 @@
 RULE_BOOL(Combat, MeleePush, true) // enable melee push
 RULE_INT(Combat, MeleePushChance, 50) // (NPCs) chance the target will be pushed. Made up, 100 actually isn't that bad
 RULE_BOOL(Combat, UseLiveCombatRounds, true) // turn this false if you don't want to worry about fixing up combat rounds for NPCs
+RULE_REAL (Combat, ACDR, 2) // Divisor for Cowboy6354's AC changes (acdiv) http://www.eqemulator.org/forums/showpost.php?p=229623&postcount=75
 RULE_CATEGORY_END()

 RULE_CATEGORY(NPC)
Code:
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES ('1', 'Combat:ACDR', '2', 'Divisor for Cowboy6354's AC changes (acdiv) http://www.eqemulator.org/forums/showpost.php?p=229623&postcount=75');
Reply With Quote
  #7  
Old 07-25-2015, 07:20 AM
Shendare
Dragon
 
Join Date: Apr 2009
Location: California
Posts: 814
Default

Interesting.

I also noticed that turning off the IntervalAC rule seems to affect both problems. NPCs were still hitting a bit harder than I would expect, but it was no longer 50-100% each time. The enchanter also started hitting for up to 2*weapondamage, instead of up to 1*weapondamage.

What is the IntervalAC rule exactly about?
Reply With Quote
  #8  
Old 07-25-2015, 09:42 PM
Torven
Sarnak
 
Join Date: Aug 2014
Posts: 52
Default

Quote:
Originally Posted by provocating View Post
I am glad Torven is doing so much research but the sad thing we can only do statistics on live now, which has changed.
I've been dreading trying to figure out how AC and atk function and was sort of hoping Daybreak would spill the beans on these to save me the trouble.

One thing I can say however, is that most of the game has remained unchanged, at least since Planes of Power. Most of the big changes actually happened in the earlier expacs-- NPC hate in Velious, melee caps in Velious, resists in Luclin.

Demonstar has been examining client decompiles and claims that the dual wield and double attack functions are unaltered.

On Live right now, level 1s start out with maxed (for the level) combat stats. That alone is going to have a huge impact on survivability.
Reply With Quote
  #9  
Old 07-26-2015, 12:45 AM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

This is definitely demonstar/torven/KLS/Kayen realm

Last edited by Akkadius; 07-26-2015 at 01:02 AM..
Reply With Quote
  #10  
Old 07-26-2015, 12:48 AM
demonstar55
Demi-God
 
Join Date: Apr 2008
Location: MA
Posts: 1,165
Default

I've been doing some research into hit/miss stuff, but ahh it's a lot. Bunch of spell effects I need to figure out how they exactly work.
Reply With Quote
  #11  
Old 07-26-2015, 01:19 AM
Burningsoul
Discordant
 
Join Date: Oct 2009
Posts: 312
Default

Everyone stay awesome. People like you are why EQEmu isn't a fuggin' abandonware project nowadays. I almost get a nerd-boner seeing Torven post his insanely great "This is borked, here's my data" posts. Same goes for every other dev or contributer - from shendare to krabbers to a guy with three posts to his name citing why something is wrong. Noobers may never appreciate it - but as a decade+-long lurker, you ALL are doing fucking amazing work and Daybreak should be jerking it into a silver-coated bucket about the slack you're picking up on their end. Seeing their idea of "classic" and the massive amount of data you all crushed into a fully-functioning package almost brings a tear to my salty, off-my-lawn eye. /standing_ovation_19 ya'll.
Reply With Quote
  #12  
Old 07-26-2015, 02:46 AM
demonstar55
Demi-God
 
Join Date: Apr 2008
Location: MA
Posts: 1,165
Default

If anyone is wondering, here is some actual formulas (well parts)

(First one is from a dev post)
Code:
Step1 = (DefenseSkill*400) / 225
Step2 = Step1 + 'Agility Bonus'
Step3 = Step2 + 'Item Avoidance'
Step4 = Step3 * 'Drunkenness Reduction'
If Step4 < 1: 'Computed Defense' = 1
Otherwise 'Computed Defense' = Step4.
Aglity Bonus mentioned above

Code:
Step1 = (8000 * (FunctionalAgility-40)) / 36000
Step2 = (HeroicAgility / 10)
'Agility Bonus' = Step1 + Step2
Drunkenness mentioned above

Code:
Value = HowDrunk / 2
Reduction = (110 - Value)/100.0
If Reduction > 1.0: Reduction = 1.0
Step4 = truncate(Step3*Reduction)
Now this is just the avoidance AC that gets mixed in with mitigation AC for display.

This is missing some SPA effects, which is what I've been trying to parse out. The biggest for this number would be SPA 172 (Evasion) which is the SPA used in Evasive Discipline and Combat Agility AA. I believe this works exactly the same as SPA 215 (Pet Avoidance) which is used in Elemental Agility AA.

My best guess is that the number calculated above in increased by a percentage of total 172 and 215 if you're a pet. NPCs also most like have a single number that the devs use for tweaking things. (Or they could just tweak AGI)

This number is rolled against part of your attack to determine if its a hit or miss.

Now for the hit chance part of your attack (no dev posts I know of)

Code:
Step1 = OffenseSkill + 7
Step2 = Step1 + SkillAttackingWith // 1h slashing, etc
If Drunk / 2 > 20: Step3 = Step2 * 'Drunkenness reduction'
Else If IsBerserk: Step3 = Step2 + 2 * Level / 5
If Step3 < 1: Step3 = 1
Drunkenness reduction is the same as above. Now the hit chance has A LOT more spell effects that get a lot more confusing where to add them in.

Now a notable thing missing is item accuracy, you'd think it would be in their if item avoidance is in it's counter part. My best guess is that SPA 183 (Skill Increase Chance) modifies this number above before item accuracy and all the other hit chance increase SPAs. But that's basically where I'm at. (I do have some parses sitting to analyze SPA 183)

Last edited by demonstar55; 08-14-2015 at 01:41 AM..
Reply With Quote
Reply


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 06:21 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3