Charm, Root and Lull Resist Mechanics
Charm works like this: (although minor unknown unknowns may exist)
On spell lands, the target's resist is modified by (CHA - 75) / 8, max 25. So if the enchanter has 275+ CHA then they'll get a -25 MR bonus to casts, making it considerably easier to land. If CHA is under 75, there is no penalty to having lower CHA. Charm tick saves are handled this way:
Root tick saves work like this:
Lull fails work like this:
Evidence For These Claims I have two primary sources for these claims. I recently automated casts on NPCs for weeks and I was also given information from two highly respected members of the Al'Kabor community who got information years ago from quote 'somebody who ought to know'. They are essentially intermediaries to a real source, but for simplicity I'll refer to these two individuals as 'my sources' for the rest of this thread. Once I was given the information from them I set out to try and verify it with Live server tests, which wasn't simple because they misinterpreted some things, but I was able to figure out what they mistook. I also have some secondary sources, including public dev comments. (which are remarkably inaccurate, but did help in some ways) I was told by my sources that charm's save throw preliminary roll is 40%, the minimum 'can't go below 5%', the resist check has a +4 level mod, the CHA bonus is CHA - 75 / 8 (max 25), and TD is 15/25/35%. At first I was excited to see this and plugging that into my simulator produced results close enough that I thought it was accurate. Furthermore, the 5% minimum had been mentioned in a 2015 dev post and TD %s were added to the client AA description some years back, so that matched and gave it credibility. I knew that a preliminary roll had to exist simply because 5% by itself didn't work. It looked really legit. I decided to run tests on Live and also squeeze more AK data from old logs to verify the claims using log parsing scripts I had written. It didn't take long to realize that it didn't work. It was kind of close but too far away to be right. After weeks of data collection on Live and playing with with simulations to try and match it, I found out that the best fit to my Live data is 47% with a MR floor of 5. This got my sources talking more and they mentioned a 'Rand0()' function to me. They got the preliminary roll wrong because they assumed that 'Rand0(4)' meant roll a number from 0 to 4, so comparing that with a 2 (they mentioned a '< 2' here) would result in a 40% per value instead of 50%. EQ's random functions are known to use 0 to n - 1 as client decompiles show. (thanks to Mackal for the assist here) Root data also proved the n - 1 to be correct, so charm's preliminary roll is 50%. The '5% minimum' could also mean one of several different things. The two most obvious would be either a MR floor of 10 (since the resist roll is 1-200) or a separate 1 in 20 roll. Neither of these worked in simulations. Trial and error to get the simulations to fit the data resulted in an MR floor of 5, but that's not 5%. Further correspondence with my sources later mentioned quote: "I got the strong impression that the person we talked to at least thought that the 5% minimum was not a separate roll but tacked onto the end of the resist function itself." So that strongly implies a MR floor instead of a separate roll. I tested this on a 5 MR NPC and the result was an average duration within the margin of error of a 0 MR NPC, which confirmed it since a separate roll would result in a much lower average. There is a 2015 dev post here: https://forums.daybreakgames.com/eq/.../#post-3678593 That says: (I added what the SPAs are) Quote:
Prathun's pseudocode link for reference: https://everquest.allakhazam.com/for...01109310546959 Niente also states that charm tick saves get a CHA bonus. This is incorrect. I ran tests at various CHA levels and they resulted in the same duration charms with large data sets ruling out margin of error. (well over ten thousand casts) In fact due to margin of error, the 15 CHA log resulted in the longest charms in my unicorn data. Niente also implies due to her wording that the CHA bonus to charm caps at 200, which is also untrue for charm lands; although perhaps she just meant a 200 cap for blurs or meant CHA above 75. These are good examples why developer comments should not be taken as gospel and that hard data should be the final arbiter. Geoffrey Zatkin answered a question in 1999 where he claimed that charisma had a role in charm durations. He was also either wrong or charm changed before PoP went Live. He also mentioned a softcap at 200 CHA in the year 2000 which is not observed in either charm or lull, but I couldn't say how CHA works for mez and mem blur. As a developer myself I can attest that it's easy to get stuff wrong when taking a cursory look at code, so disputing developer claims isn't as presumptuous as it seems. https://www.tapatalk.com/groups/othe...sma-t1046.html https://web.archive.org/web/20030611...60&Action=View Charm Data Now on to the raw data. I'll start with a link to 2003 data from the enchanter forums on Wayback: https://web.archive.org/web/20050224...pic.php?t=1148 I was very fortunate to find that link while in the middle of my data collecting, because not only is it in and of itself convincing evidence for CHA doing nothing to modify charm durations, but also dates this to 2003, which is the era I'm most interested in; and since this agrees with my Live data, it suggests that charm has not been modified much since then. This guy ran a careful test and lists individual charm durations with known de/buffs and charisma, so this is good stuff. (note that the character's name is Yandie in the table below) My data comes from two primary sources: Al'Kabor logs, and Live tests I conducted using automated casts. I wrote a script to parse logs to extract charm data, which I will include below. I will present the data in table form because there is a lot of it. The script output looks like this however: Code:
July 2021: Level 65 Enchanter with 280 CHA and TD3 casting Command of Druzzil vs a gantru moktor (lvl56; 35 MR) Note the following:
Root Data Root and charm work in a similar manner. My sources claimed at first that root's preliminary roll was 60%, but once the Rand0() mistake was corrected, the roll is now known to be 75%. i.e. Rand0(4) < 3. Simulations using a preliminary roll of 75% and a resist floor of 5 matched my Live data very well. Since this fit so well, this bolsters the claims made for charm. Here is my Live data with simulations under each data set for comparison. Note that 'Test' NPCs on the Test server have a base MR of 50 and that root also gets a +4 level modifier. Code:
Three Minute Roots I did some root early break logs awhile back (breaks from spell damage) but I can't seem to find them. I believe the chance was 50% or around there on white cons with some scaling to level difference. The root logs which produced the above data can be downloaded here: https://drive.google.com/drive/folde...4Q&usp=sharing Lull Data Prathun's resist pseudocode had the 15 MR substitution for lull spells in it, so that part was easy. Note that this lull behavior was the result of a patch in the late Luclin era and is different for most of Luclin and prior eras. They might have just did the 15 MR substitution then and the rest of this applied to prior eras but I have no idea. My sources gave me the lull formula of 90 - CHA / 4. I had already done lull parses in 2015 for TAKP so I had data on-hand to compare with and it matched. The formula I came up with for TAKP was only slightly different. This matching also bolsters the charm and root claims. Here are the notes I wrote 6 years ago: Code:
Level 50 Enchanter with 62 Charisma casting Pacify on Test Fifty Five: Lulls can fade early and this is easily seen with 'worn off messages' on Live servers and easily tested for on Test server Arena mobs. My 2015 notes on this are: "Chance is not affected by MR or charisma. On Live, fade chance per tick was about 2% per tick on white cons, 7% on a +5 a red con, 0% on a -5 blue, and 1% on a -1 blue." This data could be fleshed out more, but for TAKP I'm currently using: fadeChance = GetLevel() - caster_level + 2; in DoBuffTic() My lull logs can be downloaded here: https://drive.google.com/drive/folde...dA&usp=sharing Additional Claims My sources claim that blind and fear also use a 75% preliminary roll, and that blind also has that 5 MR floor; however they're unsure if fear uses a 5 MR floor. Awhile back I did raise blind's preliminary roll on TAKP to the same level as root was (70%; but I'll raise them to 75% very shortly) because I did some crude tests on Live and it seemed to need to be raised, so that agrees with the claim. Beyond that I have no data to share. |
I use lua scripts to parse logs or run simulations. I will paste them here.
This is my charm simulator: Code:
local RESIST_VALUE = 50; This is my charm log parser: Code:
local INPUT_DIR = "I:\\Google Drive\\Classic EverQuest Preservation\\EQLive 2014 Sourced Data\\Logs\\Resist Mechanics Logs\\Charms\\"; This is my root simulator: Code:
local RESIST_VALUE = 50; This is my root log parser: Code:
local INPUT_DIR = "I:\\Google Drive\\Classic EverQuest Preservation\\EQLive 2014 Sourced Data\\Logs\\Resist Mechanics Logs\\Roots\\"; |
Is it possible to get a Memory Blur/Mez addendum to this?
|
I have an update to this thread as I've done extensive research on the original resist system over the last year, and some of the findings apply to modern EQ. See my new thread about it, which has charm root and lull information in it.
A summary of discoveries that are relevant to this thread:
I did some parsing recently of fear and blind spells. The results were conclusive: Code:
EQLive2024 Level 50 Enchanter vs Test Fifty (50-20=30 MR) casting Invoke Fear; 7 tick fear = 42/43+ seconds It was recently discovered that the oldest EQ clients (in classic and Kunark) had most of the server-side resist logic in them from the period. We've decompiled these and made discoveries from it. I found the lull tick save roll in them, but the other tick save rolls were not found. This is how I know the lull tick saves are 75% +4 caster level like the others. For example, a white con had a 2% chance to fade early in my tests, and a white con would have a lull MR of 15 in modern EQ when the spell lands. But for tick saves we add 4 to caster level, so the MR becomes 15-8=7. That's a 3.5% resist chance, now multiply by the preliminary roll: 0.75 = 2.625% chance to fade every tick. The original resist system had two big things about it that made these spells worse. One is that the resist roll used to be 0-99 instead of 1-200, meaning the tick save floor of 5 resulted in twice as many resists. (actually a bit more than 2x) The original resist system also had a level difference floor that could not be debuffed under, and this floor was often 10 if the NPC was anywhere near the player's level. This floor applied to tick saves. The consequence of this floor combined with the 0-99 roll is that tick saves broke the spells four times as frequently as they do in modern EQ for NPCs near the player's level prior to September 2002. Lulls in classic EQ did not have that 15 MR override. Instead they had a floor that went up the higher level the target was. This tiered floor was very unforgiving and lulls in classic EQ were pretty much unusable. NPCs level 50 and higher were outright immune to lull before September 2002. The classic resist logic clearly shows charisma modifying charm tick save MR. This was seemingly removed on Sept 4 2002. See my other thread for details about the classic resist system. It also has some mem blur details that apply to modern EQ. |
All times are GMT -4. The time now is 03:17 PM. |
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.