- Jun 23, 2003
- 560
- 0
- 0
Interesting bug: Annihilus in SP
While working on my mod, I came across something very interesting.
Background
In 1.10, things used to be simple when it came to uberquests. There was one, and he had a treasure class assigned to him that dropped Annihilus 100% of the time.
Enter 1.11 and six more level 110 bosses. As you may or may not know, 1.11 was a rush job and has some very messy code. For instance, everything about the Torch quest is hardcoded, bypassing the neat expanded 1.10 table files. Things like the Torch and associated organ drops do not actually appear in treasureclassex.txt.
Instead, it appears that what the drop picker does when you kill either Ubermephisto, Uberdiablo or Uberbaal is to check if the other two have already been killed in the current game, and if so, drop the Torch. Likewise, the organ drops of the lesser uberevils has been hardcoded to their monstats.txt ID#. If the monster is level 110 and is neither an uberevil nor a lesser uberevil, and the area is not level 110, the game assumes it is the Diablo Clone and drops the treasure class referred to in the Diablo Clone's monstats.txt line - the 100% Annihilus one. This (hardcoded) check appears to be processed before everything else when a monster is killed, overriding its drop settings.
This also means any level 110 monster that is not part of the Torch quest will drop Annihilus when killed. Good thing there aren't any regular level 110 monsters, right?
Town
Towns have an area level of -1, and the vendors and animals have a monster level of 0. In Nightmare and Hell difficulty, the area level takes precedence, setting the level of the townsfolk to -1.
Any monsters in town are not saved, because this flag is set to 0 in levels.txt. In other words, the game could care less about their stats and level. However, should you manage to drag an NPC out of town, it will end up in a regular combat area, where the monster stats are saved. When the monster crosses the town>wilderness border, the game will roll the dice and assign stats to this monster. (Should you manage to knock a monster into town, its stats will be forgotten and rerolled when the monster leaves town again. This is however prevented by an invisible wall)
This is where the bug comes in. Although monster level is a signed 8 bit number (from 0 to 255), monlevel.txt (the table that contains the base monster stats for each level, multiplied by the percentages in monstats.txt to produce their actual stats in the game) goes from 0 to 110. A level 0 monster will properly end up with 0 life, 0 damage and 0 attack rating. A level -1 monster will ...roll over to 255, then it will be capped at 110.
Level 110. Interesting.
The exploit
The only problem is that townsfolk don't leave town. There is only a single 'monster' that spawns in town and can be coerced to leave town: the Act 1 chickens. Their AI will attempt to evade the player, often leaving town in the process.
In other words, any chicken you chase out of town will become an invulnerable level 110 monster that will drop Annihilus if killed on Hell difficulty. Too bad it's invulnerable, eh?
Enter Blood Raven. Her death animation that kills everything nearby is more indiscriminate than previously thought; it will destroy any monster that has been summoned by BR (this part is hardcoded), and any monster that does not meet any of the following criteria:
- an animal spawned by the 'critter' column of the Graveyard;
- a monster spawned by the 'monxx' columns of any level;
- the Diablo Clone.
This means that, other than the hardcoded BR summons, it will only target monsters preplaced on the map itself - the zombies and skeletons that were created in or near the graveyard.
Well, that and invulnerable level 110 chickens.
How to exploit
It is quite simple really; go to Act 1 and approach a chicken from the opposite direction of the town gate, so it will run away from you. (Don't stand on top of it, or it won't know in which direction to run and just stand there shedding feathers) Keep this up until the chicken has crossed the town border. The chicken will now become level 110.
Then chase it all the way to Blood Raven's graveyard. You may want to scout out the shortest path first, or you could be at it for a long time. Park the chicken near Blood Raven; the death lightning only has unlimited range when it strikes down summoned monsters, but for all other targets, its range is actually quite small, something like 10-20 yards and it depends on the direction. You may want to slow Blood Raven so she doesn't run out of range.
Get the chicken within range, then kill Blood Raven. Wait for the lightning to hit the chicken, 'kill' it (the chicken has no death animation, so it will simply vanish), and scoop up your new Annihilus.
Here it is, the first legit Annihilus in single player.
It should work on realms as well, unless their drop code is somehow different.
Summary
If you don't feel like reading the wall of theory above, here's an abbreviated version;
- Nightmare and Hell town animals are level -1, including Act 1 chickens.
- When a chicken leaves town, its level is set to 110 due to a rollover bug.
- You cannot target it, but Blood Raven's death anim will affect it.
- Any level 110 monster that is not located in a level 110 area and is not any of the uberbosses will drop Annihilus when killed.
Known side-effects
- You can only do this once per game; subsequent drops will be failed unique (magic) small charms.
- Never let the Diablo Clone replace a Torch quest superunique on realms; it will drop nothing.
Will Blizzard patch this?
I don't know. It can be exploited to hell on realms, which would warrant an immediate fix. Unfortunately, I don't have a battle.net account at the moment, and my email to Blizzard bounced.
If any of you has a Blizzard forum account, please post this link in the bug report forum so Blizzard can look into this as soon as possible...
Note: this only works in 1.11.
While working on my mod, I came across something very interesting.
Background
In 1.10, things used to be simple when it came to uberquests. There was one, and he had a treasure class assigned to him that dropped Annihilus 100% of the time.
Enter 1.11 and six more level 110 bosses. As you may or may not know, 1.11 was a rush job and has some very messy code. For instance, everything about the Torch quest is hardcoded, bypassing the neat expanded 1.10 table files. Things like the Torch and associated organ drops do not actually appear in treasureclassex.txt.
Instead, it appears that what the drop picker does when you kill either Ubermephisto, Uberdiablo or Uberbaal is to check if the other two have already been killed in the current game, and if so, drop the Torch. Likewise, the organ drops of the lesser uberevils has been hardcoded to their monstats.txt ID#. If the monster is level 110 and is neither an uberevil nor a lesser uberevil, and the area is not level 110, the game assumes it is the Diablo Clone and drops the treasure class referred to in the Diablo Clone's monstats.txt line - the 100% Annihilus one. This (hardcoded) check appears to be processed before everything else when a monster is killed, overriding its drop settings.
This also means any level 110 monster that is not part of the Torch quest will drop Annihilus when killed. Good thing there aren't any regular level 110 monsters, right?
Town
Towns have an area level of -1, and the vendors and animals have a monster level of 0. In Nightmare and Hell difficulty, the area level takes precedence, setting the level of the townsfolk to -1.
Any monsters in town are not saved, because this flag is set to 0 in levels.txt. In other words, the game could care less about their stats and level. However, should you manage to drag an NPC out of town, it will end up in a regular combat area, where the monster stats are saved. When the monster crosses the town>wilderness border, the game will roll the dice and assign stats to this monster. (Should you manage to knock a monster into town, its stats will be forgotten and rerolled when the monster leaves town again. This is however prevented by an invisible wall)
This is where the bug comes in. Although monster level is a signed 8 bit number (from 0 to 255), monlevel.txt (the table that contains the base monster stats for each level, multiplied by the percentages in monstats.txt to produce their actual stats in the game) goes from 0 to 110. A level 0 monster will properly end up with 0 life, 0 damage and 0 attack rating. A level -1 monster will ...roll over to 255, then it will be capped at 110.
Level 110. Interesting.
The exploit
The only problem is that townsfolk don't leave town. There is only a single 'monster' that spawns in town and can be coerced to leave town: the Act 1 chickens. Their AI will attempt to evade the player, often leaving town in the process.
In other words, any chicken you chase out of town will become an invulnerable level 110 monster that will drop Annihilus if killed on Hell difficulty. Too bad it's invulnerable, eh?
Enter Blood Raven. Her death animation that kills everything nearby is more indiscriminate than previously thought; it will destroy any monster that has been summoned by BR (this part is hardcoded), and any monster that does not meet any of the following criteria:
- an animal spawned by the 'critter' column of the Graveyard;
- a monster spawned by the 'monxx' columns of any level;
- the Diablo Clone.
This means that, other than the hardcoded BR summons, it will only target monsters preplaced on the map itself - the zombies and skeletons that were created in or near the graveyard.
Well, that and invulnerable level 110 chickens.
How to exploit
It is quite simple really; go to Act 1 and approach a chicken from the opposite direction of the town gate, so it will run away from you. (Don't stand on top of it, or it won't know in which direction to run and just stand there shedding feathers) Keep this up until the chicken has crossed the town border. The chicken will now become level 110.
Then chase it all the way to Blood Raven's graveyard. You may want to scout out the shortest path first, or you could be at it for a long time. Park the chicken near Blood Raven; the death lightning only has unlimited range when it strikes down summoned monsters, but for all other targets, its range is actually quite small, something like 10-20 yards and it depends on the direction. You may want to slow Blood Raven so she doesn't run out of range.
Get the chicken within range, then kill Blood Raven. Wait for the lightning to hit the chicken, 'kill' it (the chicken has no death animation, so it will simply vanish), and scoop up your new Annihilus.
Here it is, the first legit Annihilus in single player.
It should work on realms as well, unless their drop code is somehow different.
Summary
If you don't feel like reading the wall of theory above, here's an abbreviated version;
- Nightmare and Hell town animals are level -1, including Act 1 chickens.
- When a chicken leaves town, its level is set to 110 due to a rollover bug.
- You cannot target it, but Blood Raven's death anim will affect it.
- Any level 110 monster that is not located in a level 110 area and is not any of the uberbosses will drop Annihilus when killed.
Known side-effects
- You can only do this once per game; subsequent drops will be failed unique (magic) small charms.
- Never let the Diablo Clone replace a Torch quest superunique on realms; it will drop nothing.
Will Blizzard patch this?
I don't know. It can be exploited to hell on realms, which would warrant an immediate fix. Unfortunately, I don't have a battle.net account at the moment, and my email to Blizzard bounced.
If any of you has a Blizzard forum account, please post this link in the bug report forum so Blizzard can look into this as soon as possible...
Note: this only works in 1.11.