For older updates read: viewtopic.php?t=51604
All Vanilla (Player) Skills Recoded: 7th November, 2009.
CEL File Limit Removed: 11th May, 2011.
All Vanilla Shrines Recoded 3rd December, 2011
All Vanilla Item Events Recoded 3rd December, 2011
All Vanilla Active State Funcs Recoded 24th June, 2012
All Classic D2 AIs Recoded 24th June, 2012
All LoD AIs Recoded 2nd January, 2014
All Level Generation Code Replaced 2nd January, 2014
All Hireling Code Replaced 18th March 2015
MetalStorm 160628
(SYS) The compile data and time and the version number of the build are evaluated dynamically based on the timestamp in the PE header now (this is vastly superior to using __DATE__ which doesn't accept custom formating).
(SYS) The MetalStorm log is now logging times down to the millisecond.
(SYS) Removed the option to restrict the game to one CPU core from MetalStorm.DLL, an equivalent option was added to D2Run.EXE in 2015.
(SYS) Removed old and now unnecessary 9X-specific legacy junk from Nefex.cpp (such as options to disable NT-exclusive functions during patching). No point in keeping this because our graphics core will require DirectX 9+.
(SYS) All realtime calls to strftime have been replaced with calls to the more performant CTIME_Format which is restricted to doing exactly what we need it to.
(CORE) The Thaumaturgic Shrine now works the way it did in Diablo, that is it refills all previously opened chests of the current level.
(CORE) The Monster Shrine no longer checks the 'Height' column in MonGFX.txt to see wether something is eligible for upgrading, the other checks are sufficient to eliminate all undesired monsters.
(CORE) The Monster Shrine no longer checks wether the monster is in NU or WL modes (or RN which we added in 2011), it will consider any monster eligible for upgrades no matter what mode it is in (as long as it isn't dead or dying).
(CORE) Monster's upgraded by the Monster Shrine are removed from their pack unless they are the boss of the pack (previously we removed them even if they were the boss, but that didn't make a lot of sense).
(CORE) In vanilla a monster's AI type is not changed by Revive, Confuse and Conversion, this has been changed in order to make it easier to test wether a monster's AI is modified by something or not.
(CORE) A new implementation of UNITS_Find was written that unifies the client and server exclusive versions that are currently in use, this version abstracts the three client/server specific tests into a callback function. Writing this version gave me an opportunity to re-examine the vanilla implementation and its plethora of previously undocumented bugs (these are all documented below in the bugs section now).
(CORE) It is now possible to pass SITEM_Generate options to SITEM_SpawnItemsInTreasureClass, these are combined with any SITEM_Generate options specified by the TC itself (socketed, ethereal).
(CORE) Added a new CREATEITEMFLAG to SITEM_Generate that instructs the unique item selector to ignore wether the item already exists in the current session.
(CORE) The Exploding and Poison Shrines were revised, they now create 5-10 potions again (in vanilla they create 5-9 due to an off by 1 error) which are now using a TC. The missiles created by these shrines are more potent now (see below).
(CORE) Missiles and skills will from now one use code that is largely shared between client and server without define or template hacks, this will be accomplished using a callback table. Initial steps toward this have already been put into place and it is expected to come to full fruition once the revision ventures into the skill and missile code wholesale.
(CORE) The D2UnitMessage dispatching code was extended to allow any packet to be dispatched as a broadcast to all eligible clients. This will deprecate a whole series of shims that were previously required to broadcast such updates.
(CORE) The Glowing Shrine has been restored to its Hellfire behavior although it will not reduce your Experience unless you have enough for it to add 1 point to Energy.
(CORE) Hellforge.txt being a prototype of ItemLists.txt was merged into it for the time being (however when I get around to it these drops will be turned into a TC).
(CORE) Somewhat unlike the Diablo version our revised take on the Holy Shrine will warp you to a random room in the current level that is at least 20 tiles away from the shrine's room. This is not restricted to adjacent rooms, every accessible room in the current level is an eligible destination. If it choses to send you across the map it will.
(CORE) The Oily Shrine was overhauled and now does its phrase justice, it only grants a stat bonus if you survive the explosion triggered by the shrine. Instead of adding a bonus to two random stats it now adds +2 to your highest stat (if the stat is equal to or exceeds half the sum of your stats) or otherwise +1 to your two highest stats.
(CORE) Missiles can now be created by all unit types server side, this allows us to eliminate a whole class of shims that vanilla and metalstorm previously required to get missiles to emerge from objects.
(CORE) The Fascinating, Ornate and Sacred Shrines will automatically set the temporary skills they grant the player as the right mouse button skill. The skill level is now calculated as '(Level - LevelMin) / Divisor + Add' where Level refers to the dungeon level of the map and LevelMin refers to the minimum dungeon level the shrine can occur at, at dungeon level 99 the shrines currently add their skills at level 25.
(CORE) The Eldritch Shrine uses a novel approach to transform Healing and Mana into Rejuvenation Potions, instead of deleting and creating items it transforms them in place now.
(CORE) The Health and Mana Exchange Shrines were restored to their original behavior of taking half your current Mana or HP and adding 5 times as much to current HP or Mana respectively. The bug that allowed these unused shrines to leave a player with illegal Mana or HP values has been fixed.
(CORE) The Divine Shrine now uses a TC to determine what potions it will create for you (see below for more information). It also fully restores life and mana now like it did in Diablo.
(CORE) Using a Refilling or Health Shrine now updates your HP immediately for other clients in the game by calling SUNIT_UpdateHP.
(CORE) Items that receive a magical bonus to durability now display their durability in blue, the bonus is also shown in the item's modifier list.
(CORE) Items that had their durability modified by the Hidden Shrine are now marked with ITEMFLAG_MAGICAL if they're not already of a magic quality.
(CORE) Shrine functions now take pShrinesAUX instead of pShrinesTXT as the parameter, Blizzard's old file is going to be deprecated completely soon.
(CORE) The Spiritual Shrine has been changed to work as it did in Diablo, it now creates a small amount of gold in each unoccupied inventory square (see below for the amount of gold it creates per pile).
(CORE) Blizzard originally intended for inventory gold to show a different graphic depending on the amount of gold in the pile (basically like it works for gold on the ground), unfortunately this was broken because they used cel-directions instead of loading the separate inventory gold graphics. I merged INVGLD.DC6, INVGLDM.DC6 and INVGLDH.DC6 into a multi-direction inventory file to restore the original behavior (and added it back to CITEM_DrawInventoryItem).
(CORE) When gold is created as an inventory item it can now be right-clicked to add it to your gold amount instead of having to drop and pick it up again.
(CORE) The Murphy's Shrine was revised and now works much closer to how it did in Hellfire. It now has a 1 in 3 chance to reduce the durability of any breakable and non-stackable item that isn't already broken by half it's maximum durability (thus applying the effect twice to the same item will break that item). If it doesn't find an item it will subtract half of your maximum inventory gold from your current inventory gold. It will only affect one item at a time, however this item is randomly selected from those it found to be eligible to prevent manipulation.
(CORE) Item effect function 18 is now a thin wrapper around item effect function 4 with the exception that it will remove any states in its state's group before assigning a new state.
(CORE) SITEM_PRV_AddStat will add the same value to STAT_OTHER_ANIMRATE automatically when stat STAT_ATTACKRATE is added to the potion statlist which mirrors skill behavior.
(CORE) Item effect functions 3, 4 and 5 now call UNITS_RecalculateAnimRate in order to correctly support velocity modifications (STAT_VELOCITYPERCENT, STAT_ATTACKRATE, STAT_OTHER_ANIMRATE).
(CORE) Got rid of STAT_MS_MODIFIERLIST_ITEM and STAT_MS_MODIFIERLIST_PALETTE which have not served a purpose for years (they were hacks introduced prior to my removing of the state limit).
(CORE) A massive clean-up of DRLG and other map related structures was performed in order to eliminate many old unnecessary unions and some duplicated structures (D2Rect vs. DRLGRect --- etc).
(CORE) Object TC's were split between Acts.txt and Objects2.txt, the former defines the basic TC for each act and difficulty and the latter can override these with a custom per-object TC as before.
(CORE) TC spawning functions now test TC ID's using IS_VALID_TREASURE_CLASS instead of guessing (the Blizzard way) if a TC ID is valid.
(CORE) Object TC spawns are no longer limited to 6 items, objects that check for spawned item quality do so differently now.
(CORE) OBJECT_NONE (0) is now treated as an error value across the board rather than just in some of the object lookups (at least as far as those we control are concerned).
(CORE) The association between ITEMTYPE_GEM and STAT_MS_ITEM_GEMBONUS and ITEMTYPE_RUNE and STAT_MS_ITEM_RUNEBONUS has been softcoded into ItemTypesAUX making it possible to produce custom upgrade chains and stats without touching the code (it's also possible to use this to make stats that for example turn all swords into gold).
(CORE) STAT_ITEM_GOLDBONUS uses the overrun-proof math API to calculate the percentage and perform the addition now. This also applies to the 'mul' keyword.
(CORE) Previously I changed the limit on items per TC drop to 256 (from 6), the limit is now only enforced when a limit is needed by the code (which only applies to a handful of object drops --- everything else is completely unlimited by default).
(CORE) Setting Picks to 0 now disables a TC without having to delete it from TreasureClassEx.txt (the original code defaults to 1).
(CORE) Negative probabilities (Magic, Rare, Set, Unique) in TreasureClassEx.txt are accepted now, they reduce the probability of the quality in question (change is actually from March 2015 but was not documented before IIRC).
(CORE) The damage dealt by Open Wounds is no longer calculated by a formula in the code, it is now read from OpenWounds.txt where a value can be set for each level (the values in the default OpenWounds.txt were precalculated using the standard formula).
(CORE) UNIT_TIMER_REGENERATE is no longer arbitrarily deleted from all monsters in a room when there're no players near that room anymore.
(CORE) SMONSTER_TIMER_Regenerate was cleaned up, it is now using the overrun-proof math API.
(CORE) The AI no longer sets bonuses to STAT_HPREGEN itself, instead such bonuses are added through a new member added to pMonsterData now. This deprecates an older fix involving states.
(CORE) sgpD2DataTables is largely deprecated in favor of our own global control structure to increase the speed of legacy TXT file queries from our code.
(CORE) The three Healing Potion item effect functions (3, 4 and 5) now support negative values, using a potion that reduces HP will kill the user if HP is lowered to zero.
(CORE) It is now possible for the three Healing Potion item effect functions (3, 4 and 5) to buff the user as well (scaling only affects STAT_HPREGEN and STAT_MANARECOVERY now).
(CORE) Rejuvenation Potions can be changed to offer healing over time like Mana and Healing Potions by making them add STAT_HPREGEN and STAT_MANARECOVERY instead of STAT_HITPOINTS and STAT_MANA now.
(CORE) Item effect functions 3, 4 and 5 will assign their state even when all their stats links resolve to -1, states by themselves can have an effect so there's no reason not to assign the state.
(CORE) The three Healing Potion item effect functions (3, 4 and 5) originally incorporated into MetalStorm.DLL in 2008 were redesigned from the ground up to correct many logic problems inherited from vanilla (see more under bugs).
(CORE) An attack now counts as a missile attack only when HITFLAG_MISSILE is set in tDamage and not by the bResist boolean being set in calls to SDMG_ProcessDamage.
(CORE) Player cheats for debug builds are now saved to the D2S file instead of being read from D2.ini, a new backend API was added to manage them.
(CORE) The damage formula used by the Jester item modifier is now identical to the one from Hellfire (although it can now grant +600% damage instead of capping out at 595% due to a bug).
(CORE) The player Mana and HP regeneration code has been cleaned up, the new version is using the overrun-proof math API.
(CORE) The monster lifebar and modifier description code has been completely redesigned (the old version was a hacky mess I didn't touch since 2008 or even earlier that was almost as bad as the original code). Monster lifebar behavior is now controlled by a single field in MonStatsAUX as opposed to being a hodgepodge of multiple settings.
(CORE) A legacy shim that made certain monster names always appear in gold (to replace a series of equivalent hardcodes in vanilla) was eliminated in favor of a new setting that marks these monsters as unique upon spawning.
(CORE) It is now possible to hide the UMod and resistance descriptions of a monsters by setting MONSTATSAUX_HIDEMODS in MonStatsAUX to TRUE (this just reimplements the hardcoded 1.11b uber-boss behavior I previously removed).
(CORE) An archaic hack that instructed the client to release Charged Bolts when a LEB was damaged by an attack with RESULTFLAG_SOFTHIT set was eliminated (we didn't have a use for it since around 2007 when all their UMod code was replaced but kept the hack, the purpose of which I didn't research at the time).
(CORE) Hireling names will show up in red text if they are owned by a player who is currently hostile to you.
(CORE) Shadow Master and Shadow Warrior display a standard lifebar instead of the hireling lifebar now, they only used the latter in vanilla to hide a bug (a hack which ironically led to an even worse bug where the game leaks memory every frame while their name is shown).
(CORE) ITEMS_GetTransformPalette has been split into ITEMS_GetTransformPalette and ITEMS_PRV_GetTransformColor.
(MOD) The Eldritch Shrine now creates yellow Rejuvenation Potions (they work like purple Rejuvenation Potions in every respect). Now that Diablo phrase it's using actually makes sense again.
(MOD) Chance of Getting Better Gems and Chance of Getting Better Runes use a simpler formula to do their magic (see below).
(MOD) Prevent Heal only cancels a monster's natural HP regeneration (including any AI driven bonuses) now, it will not effect the healing bestowed by Healing Potions (etc).
(MOD) Poison and co. can now interrupt interruptable monster attacks (this will not interrupt monsters that're occupied with special things like the Vulture Demons when they fly).
(MOD) Every point in Vitality above 400 counts as 1/256 HP regenerated per frame (this deprecates the old HP regeneration formula).
(MOD) Poison, Open Wounds and related status ailments will no longer kill you while you're inside a town.
(MOD) The Mana Recovery formula has been changed to: (Energy * 256) / 1000.
(MOD) Poison and related status ailments no longer interrupt you as frequently, the chance was reduced to 5 % per frame (or 1 in 20) assuming of course that you can currently be interrupted.
(D2) The Monster Shrine will always upgraded monsters to unique, never champion (this is an old change from 2011 but I'm not sure it was documented before).
(D2) The Fire Shrine was changed to reduce HP to 50 % only when current HP is above 50 % instead of reducing current HP by 50 %. The fire balls spawned by the shrine are evently spaced now too (this is an earlier change from at least 2011 that was likely also documented at the time).
(D2) The Gem Shrine is able to create Chipped Skulls now.
(D2) The Refilling Shrine now takes 5 minutes to regenerate whereas the Health and Mana Shrines take 2 minutes instead.
(D2) Automatic TC upgrades to exceptional (and elite --- even if they didn't exist back then) were restored more or less exactly to how they worked prior to the expansion (at which point they were disabled in favor of more grind).
(D2) Open Wounds has been restored to its original behavior, with a few modifications (see below).
(D2) All Healing Potions now take the same time to heal their designated amount to improve their effectiveness (this is how Mana Potions have always worked).
(D2) Crushing Blow has been restored to its original behavior, the only difference is that it uses the effective amount of damage resistance now (this means that Sanctuary will negate it to zero if the target is undead for example).
(D2) I restored the original double healing formula as documented by Blizzard in the Chaos Sanctuary (it should be noted that this formula was not used in any released version of the game, the formula used is very different from the one in their documentation).
(BUG) ITEMS_GetTC could return a different TC for the same level depending on the search direction (upgrade versus downgrade).
(BUG) Fixed a dumb but very cryptic bug that was lingering in the codebase since at least 2014 (no earlier versions were retrieved from the archive to test) that prevented Mephisto's Double-Helix Lightning skill from working correctly.
(D2BUG) Blizzard didn't check wether monsters being evaluated by a Monster Shrine had their AI changed by a skill or other effect, this can lead to strange behavior where it turns monsters affected by Confusion, Terror, Dim Vision or mounted Demon Imps into unique monsters.
(D2BUG) Blizzard doesn't call UNITS_AddToUpdateQueue after marking the monster upgraded by the Monster Shrine for updating, the updates are only dispatched to the client if something else attaches an update to the unit later which can result in desync.
(D2BUG) The Fire Shrine could reduce player HP in town in the event that it spawned in a room directly adjacent to the town.
(D2BUG) The Fire Shrine was supposed to only reduce HP of attackable and searchable players and monsters, due to a bug with its implementation these filters are never tested.
(D2BUG) The client version of UNITS_Find did not acquire the owner for missiles performing a search whereas the server version did so when doing an alignment check, this results in inconsistent behavior and desync.
(D2BUG) The server version of UNITS_Find did not acquire the owner for missiles being tested during alignment checks, this results in FILTER_HOSTILE and FILTER_FRIENDLY not working as expected when combined with FILTER_MISSILE.
(D2BUG) The server version of UNITS_Find acquired the missile owner for missiles performing a search when testing FILTER_MELEE, the client version did not, this results in inconsistent behavior (and it doesn't make sense to boot).
(D2BUG) When testing wether rooms fall into the search radius all three vanilla implementations of UNITS_Find are bugged and consider every room eligible for unit searching no matter how distant due to poor math.
(D2BUG) The client version of UNITS_Find did not ignore async units such as critters, instead it relied entirely on none of the other filters applying to them (which is not guaranteed to be the case if for example the search is composed only of FILTER_MONSTER for example), this results in inconsistent behavior and desync.
(D2BUG) The D2Common version of UNITS_Find performed a legacy LOS test using the field tables that was not modified since 1.00, the D2Client and D2Game versions perform modern LOS tests, this can result in inconsistent behavior and is very inefficient (field tables were certainly deprecated for a reason).
(D2BUG) The LOS tests performed by all three versions of UNITS_Find only test for COLLIDE_WALL, this means they will see units behind closed doors due to a missing COLLIDE_DOOR test.
(D2BUG) If the searching unit is a missile the server version of UNITS_Find causes severe desync when FILTER_HOSTILE, FILTER_FRIENDLY or FILTER_MELEE are paired with FILTER_LOS due to the searching unit being permanently overwritten prior to the LOS test (thus passing a completely different unit to it compared to the client).
(D2BUG) The Stamina Shrine was supposed to add +200% to Stamina, due to a bug it will always add 0 unless the player already has STAT_SKILL_STAMINA_PERCENT from another source, in which case it will add a percent of that value (!).
(D2BUG) The Combat Shrine calculates it's bonus to Attack Rating incorrectly in vanilla, this has been fixed a long time ago but was to my knowledge never properly documented.
(D2BUG) The unused Health and Mana Exchange Shrines were each using the message string intended for the other.
(D2BUG) INV_GetComponent returns the wrong component for Barbarians who're dual-wielding two-handed swords (it'll return COMPONENT_RH for both swords).
(D2BUG) Fixes a crash bug in INV_GetComponent, the vanilla function does not test the unit for NULL.
(D2BUG) Due to what I presume was a mass-replace operation all TC spawns for Act 5 objects were inaccurate (they replaced level 132 with 136 in the object TC level table).
(D2BUG) Negative STAT_ITEM_GOLDBONUS will no longer result in gold piles with zero STAT_GOLD. Minimum gold per pile is now 1.
(D2BUG) Fixed an infinite loop condition in the TC spawner caused by negative picks paired with a probability sum lower than the absolute value of picks.
(D2BUG) The 'cm', 'cr', 'cs' and 'cu' parameters you can set for individual items in TreasureClassEx.txt are not used by the TC spawning code. They can now be used together with the other quality percentages, they function much in the same way but affect single items only.
(D2BUG) If a TC drops the maximum amount of items permitted the last item will be unaffected by STAT_ITEM_GOLDBONUS because SITEM_CreateItemsInTreasureClass will return before applying it.
(D2BUG) If a non-pet monster kills another monster the game will apply its STAT_ITEM_MAGICBONUS twice if it is the leader of a pack.
(D2BUG) PATH_IsInNewRoom will fault if a unit of type UNIT_WARP is passed to the function (they retrieve +2C as hPath instead of hPlacement).
(D2BUG) In vanilla Open Wounds does not set UNIT_TIMER_REGENERATE, thus if the monster isn't already regenerating it will take no damage from Open Wounds (assuming that the attack that applied the effect didn't damage the monster to trigger regeneration).
(D2BUG) Due to UNIT_TIMER_REGENERATE being deleted when there're no players near the monster's room monsters will not regenerate HP before they get fully deactivated and then reactivated if you return to that room later (it also means monsters in distant rooms stop taking damage from poison and open wounds).
(D2BUG) STATE_HEALINGPOTION was not removed once a monster (including hirelings) had recovered to full health, this was changed to make the behave like the player code.
(D2BUG) Hirelings and other pets were not supposed to die to poison while in town, unfortunately the order of checks in the vanilla version of SMONSTER_TIMER_Regenerate is wrong rendering it completely moot (they will simply die).
(D2BUG) There's a whole class of cryptic bugs resulting from the way Healing Potions, Prevent Heal and Poison/Open Wounds interact when they're affecting the same monster (especially hirelings). We fixed all of these bugs by making SSTAT_CB_RemoveState set a new UNIT_TIMER_REGENERATE when a statlist with STAT_HPREGEN is removed from a monster.
(D2BUG) The three Healing Potion item effect functions (3, 4 and 5) all share a series of bugs that prevents them from being useable with stats other than STAT_HITPOINTS, STAT_MANA, STAT_STAMINA, STAT_DURABILITY, STAT_HPREGEN and STAT_MANARECOVERY (they could've just as well kept them hardcoded, would've been better for performance seing how they can't be used for anything they're not already used for).
(D2BUG) Healing and Mana don't recover their full amount because the UNIT_TIMER_REGENERATE event is processed prior to the item taking effect (so in essence they're missing a frame worth of regeneration - before you ask, this can't be fixed by increasing their duration by 1 frame in Misc.txt because that will only reduce the amount they recover per frame).
(D2BUG) The amount of HP restored by Healing Potion (hp3) is not divisible by the duration of that potion, this results in it not healing you the correct amount.
(D2BUG) Blizzard reads the duration of statlists even if they don't have STATLIST_EXPIRES set, this will result in chaos if the statlist doesn't have a duration in certain functions.
(D2BUG) CLT_INL_IsLUIOpen was missing a check for UI_TYPE_BARK_SCROLL which leads to a display bug if that UI is open while you hover over a monster.
(D2BUG) UI_GetRect sets the height to sgnScreenW instead of sgnScreenH, thankfully none of the places that call that function used the height of the rectangle it returns for anything.
(D2BUG) When given a string with embedded color codes the standard D2WinGetPixWidth variant included those characters in the width calculation which results in bugs when its return value is used for text alignment (which it almost always is).
(D2BUG) Monster descriptions are now linked directly to the D2Win lifebar and tooltip API, this resolves a whole class of bugs where descriptive text is shown even when a lifebar is not.
(D2BUG) Monster descriptions calculated their drawing offset without setting a font, this meant that their placement could become unpredictable if the order of function calls is changed (and they'd thus use whatever font was previously set using D2WinSetFont).
(D2BUG) Blizzard tried to prevent the monster descriptions from overlapping with the right and left UI panel but they used a constant value of 480 for this which doesn't work properly, the cap is now calculated dynamically based on game resolution and UI state. In LoD they forgot to mirror this code when adding descriptions for resistance, with the effect that these will always bleed into the UI with no recourse.
(D2BUG) The immunity strings shown under monster names were not centered correctly due to a bug in D2WinGetPixWidth (see above).
(D2BUG) The function updating client life percentages can be coaxed into treating non-players as players which results in undefined behavior.
(D2BUG) While under the effect of a Stamina Shrine your Stamina Recovery is 50 % higher while you run than it is while you walk.
(MISC) DumbDiff - A new tool similar to (but much, much simpler than) diff that creates a tab-delimited table showing differences between source files at the word rather than line/block level (useful for validating large-scale replacing operations --- as became necessary today due to the DRLG/map structure clean-up pass) has been added to the arsenal.
(MISC) Fixed a minor problem with D2PalEdit which prevented it from loading GIF files created by XnView (they're missing a value in the GIF header the code was checking during validation).
Fire / Exploding / Poison Shrine
Blizzard caps the maximum level of the missiles spawned by these shrines to 8 (this is based on the current character level divided by 5). I have removed the maximum cap.
Divine Shrine (These values are provisional and will be subject to future balancing)
Code: Select all
Level Healing Potion Mana Potion
----------------------------------------------------
1-11 Light Healing Potion Light Mana Potion
12-19 Healing Potion Mana Potion
20-35 Greater Healing Potion Greater Mana Potion
36-44 Super Healing Potion Super Mana Potion
45-99 Full Rejuvenation Potion Full Rejuvenation Potion
Code: Select all
Difficulty Act Min Max Total (40 Squares)
----------------------------------------------
Normal 1 5 15 200- 600
Normal 2 10 30 400-1200
Normal 3 15 45 600-1800
Normal 4 20 60 800-2400
Normal 5 25 75 1000-3000
----------------------------------------------
Nightmare 1 30 90 1200-3600
Nightmare 2 35 105 1400-4200
Nightmare 3 40 120 1600-4800
Nightmare 4 45 135 1800-5400
Nightmare 5 50 150 2000-6000
----------------------------------------------
Hell 1 55 165 2200-6600
Hell 2 60 180 2400-7200
Hell 3 65 195 2600-7800
Hell 4 70 210 2800-8400
Hell 5 75 225 3000-9000
When an item drops there is a 10 % (Nightmare) and 20 % (Hell) chance that it will be upgraded to exceptional, in Hell difficulty there is a chance of 30 % that it will be upgraded to elite if the first upgrade succeeds. 40 % monster drops and all drops by quest monsters (those labelled 'Boss' in MonStats.txt) double the chance for upgrades to exceptional and increase the chance for upgrades to elite to 40 %.
Gem/Rune Bonus
Each Gem and Rune has a limit to its chance of being upgraded, for example El has a limit of 90 %, if you have 100 % Chance of Getting Better Runes the remaining 10 % won't be factored into this roll, upon success the total value is divided by 2 (thus having more than 100 % helps, although you would need an astronomical amount to get from El to Zod directly, but of course late in the game not all runes drop as El so your upgrade path begins higher up in the chain giving you a better chance to reach the top) and so on.
Open Wounds
While we restored the damage dealt by open wounds to the original values through OpenWounds.txt, we did change to what monsters it can be applied. In previous builds monsters that couldn't bleed were immune to Open Wounds, this wasn't very satisfactory because many monsters where open wounds would've made sense (such as Giant Spiders) cannot bleed by default. Instead Open Wounds tests whenever the monster has been assigned MONSTER_TEMPLATE_SKELETON and/or MONSTER_TEMPLATE_CONSTRUCT. Ethereal monsters (and players affected by skills that bestow this effect) are also invulnerable to Open Wounds. In vanilla Open Wounds damage is divided by 4 when players are subject to it (and by 2 again if it is a missile attack against a player). It is also divided by 2 if the monster is a Unique (including Super Unique Monsters and those with an attached quest event) or Champion. These divisors were kept, however the missile divisor is applied independent of wether the target is a player, Open Wounds damage to hirelings is treated like that dealt to players (so it is divided by 4). Further the damage is divided by 2 also for monsters labelled as Boss in MonStats.txt to be consistent with other stat effects.