Saturday, September 27, 2008

Diablo II: Guardian Enkidu

Enkidu is a Teslafroster from Merlin's Emperor's Clothes tournament. For those not familiar with this tournament the character may only be equipped with items that drop from Super Uniques/Act bosses, with white items as place holders until that slot is filled. Along with this there is a restriction on summons, basically they aren't allowed. It is a single-pass, untwinkled tournament, as is the norm.

As one can imagine the item restrictions was both entertaining and extremely frustrating, as more often than not a normal monster would drop needed equipment while SUs dropped Isenhart cases. Case in point not a single gear upgrade was made from the SU drops in Hell, which the switch shield fell from Normal Bloodraven. Thankfully there was a provision that allowed the personalization quest to make a normal drop wearable. This lead to an uber shield from Act V Normal until endgame being wearable.

Skills
Holy Freeze - 20(24)
Holy Shock - 20(24)
Resist Cold - 20(24)
Resist Lightning - 16(20)
Zeal - 4(8)
Holy Shield - 5(9)

Stats
Level - 82
Strength - 77(83)
Dexterity - 163(182)
Vitality - 250(272)
Energy - 15(23)
Life - 952(1075)
Mana - 136(258)

Resist Fire - 75
Resist Lightning - 83
Resist Cold - 85
Resist Poison - 75

Equipment
Helm - Tarnhelm
Armor - Goldskin
Shield - Spirit (in 32% resist all Targe)
Weapon - War scepter, +1 paladin skills, 20% IAS, +AR/Max dmg per char lvl
Belt - 16% FR, 11% PR
Boots - Hsarus' Iron Heel
Gloves - 8% FR, +5 light radius, 5% AR
Amulet - 2 strength, 13 dex, 27% FR, 19% CR, 3% LR, 3% PR
Ring 1 - 12% LR
Ring 2 - 27% CR, 10% MF

Switch:
Weapon - Battle dart, 22-57 cold dmg, +AR/Max dmg per char lvl
Shield - 19% LR, 17% FR, 9% CR, 9% PR

Mercenary:
Helm - Tal Rasha's Horadric Crest
Armor - Heavenly Garb (ethereal)
Weapon - Partizan, 123% ED, 183 AR, 7% LL, +Max dmg per char lvl

Since this was a single pass tournament and only drops from SUs counted I found myself going into areas I normally just skip, for example the Cave and Cold Crow. As it was I didn't actually fully clear the entire game, I simply walked until I found all the SUs and Waypoints then moved on. I did not however skip anyone on purpose other than a single boss monster in the WSK Hell level.

Enkidu's journey started off utilizing a one point Holy Fire until Holy Freeze became available. This made progress through Normal and the early part of Nightmare manageable, not fast by any means but not slow either. A typical battle scene for Enkidu had his mercenary tanking the entire pack while Enkidu worked on the outside concentrating on one or two monsters at a time. For the most part this was OK as long as the mercenary was sent a steady supply of health potions. Granted such tactics couldn't be used against the monsters that cause melee builds the most problems, Dolls. Against these migit minions Enkidu switched to his alternate weapon and went ranged, still allowing the merc to tank of course. Same tactic was used in the Chaos Sanctuary and anywhere else Oblivion Knights appeared.

Things started to slow down a bit mid Nightmare as Holy Freeze was maxed out and it's synergy while the monsters kept getting more and more hit points. Also started to run into Cold Immunes and the few points in Holy Shock I had at that point really made dealing with them a chore. Still, plugged through and as Holy Shock was increased the killing speed started to progress again. However I did use Holy Freeze as the main aura. It worked well to slow down any packs so I could see what I was dealing with before engaging. Then they stayed slow during the fight. However I would switch to Holy Shock if the group was CI or highly cold resistant.

Still, in Act IV of NM I ran into a brick wall. Progress slowed drastically from that point onward and instead of fighting mobs straight on I had to being to split them up to deal with them. This lead to much running away to string out the monsters, especially when cursed or might enhanced bosses were around (which happened often). This continued all the way through the end of Hell. Only difference between the end of NM and Hell was the number of NDEs and the fact that the mercenary had to be resurrected on a regular basis. My last tournament character had trouble with gold so from the beginning of Hell I started to pick up every piece of equipment that would catch a good price with Charsi. This ended up working out as by the time Baal fell I had enough money to resurrect the mercenary about a dozen times or so.

One thing I probably would have changed would be to hire a Blessed Aim mercenary rather than the Defiance one I had. Enkidu has real trouble hitting the Ancients and all Hell act bosses. The +AR per character level mod on both his main and switch weapons was extremely helpful in that regard, but still didn't make up for the fact that he wasn't only hitting them one-fifth of the time at best. Regular monster packs didn't have the same issue, nor bosses, so regular questing the Defiance aura was more helpful in allowing the mercenary to tank a bit longer.

One odd thing I noticed is that the mercenary, while having trouble with normal monster packs, was a champ when it came to the act bosses. He survived NM Baal onward, except for Hell Mephisto, without the need for many health potions (not a single one for Hell Baal/Diablo).

Overall I'd say this character was a lot of fun to play, and not too underpowered being untwinkled with item restrictions. Although I think my definition of decent killing speed may be not quite as high as a lot of other people, as I think my Strafazon without Fortitude/Windforce has decent killing speed too. Overall very durable character and I'd be interested to see what a twinkled version could do, perhaps a project for another time. Enkidu becomes the third of my tournament guardian sept, with both Necromancer and Amazon being previously completed.

For such a small amount of MF this character did fairly well in the item finding department. Some notable drops:

Cerebus' Bite
Griswold's Redemption
Stoneraven
Tal's Mask x2
Eye of Etlich
Mahim-Oak Curio
Oculus
Thundergod's Vigor

As for runes, I can't recall what the NM hellforge was but in Hell a Hel fell, fittingly. Other finds were 3 Dols, 1 Shael and a Ko.

Thursday, September 18, 2008

Diablo II: Teslafroster Skill Layout

A Teslafroster is a melee Paladin build that utilizes both the Holy Freeze and Holy Shock auras to deal damage. This build is less damaging than a pure Frost Zealot or Tesladin, however it will be able to handle immunities much easier than those builds. The skill setup is as follows:

Might - 1
Smite - 1
Sacrifice - 1
Holy Fire - 1

At level size Holy Fire becomes available to increase the damage output of the character. No points are invested into this skill beyond the one requirement, however that will allow the character to proceed at a decent pace until the main skills become available.

Zeal - 1

At level twelve Zeal becomes available to replace the slow normal attack used up to this point. This will speed up the progress, especially when at level fifteen Zeal is up to 4 hard points so that the maximum number of hits per Zeal cycle (5) is reached. The bonus to attack rating is also a nice side benefit.

Holy Freeze - 1
Cold Resist - 8
Lightning Resist - 1

At level eighteen Holy Freeze becomes available and replaces Holy Fire as the main aura. Any monsters that come within range will be slowed by the aura and this drastically increases the character's survival potential. The synergy to Holy Freeze, Cold Resist, is given all extra points at this time to increase the damage output as much as possible. Lightning Resist is also given a single point for use in Act II when the lightning beetles are encountered. If played untwinkled melee builds have a lot of difficulties in this area, but with the lightning resistance provided by this aura that problem is fairly moot.

Holy Freeze - 20
Cold Resist - 10
Salvation - 1

At level thirty-seven Holy Freeze is maxed out and providing a very nice amount of damage per hit. Progress through the rest of Normal isn't very difficult as a result, even though some of the Act V monsters are cold resistant.

Holy Shock - 1
Cold Resist - 20

At level forty-seven Holy Freeze's synergy Cold Resist is maxed to bring that skill up to its final potential. Holy Shock, the other main aura for this build, also receives a single point for us against any cold immune monsters that may appear in early Nightmare.

Holy Bolt - 1
Charge - 1
Blessed Hammer - 1
Holy Shield - 5

At level fifty-four Holy Shield is added to the character's skill arsenal. While in Normal blocking isn't very important, this changes as the character progresses through Nightmare and all the way through Hell. Level five, with plus skills, should be fine to allow the character to obtain maximum blocking percentage without too many stat points invested into Dexterity.

Holy Shock - 20

By level seventy-one Holy Shock is maxed out and providing a decent amount of damage. Holy Frost will be the main aura so that all monsters are slowed, even if they are cold immune, which increases the characters survivability. The aura can be switched easily to Holy Shock when cold immunes are encountered. From here on out all extra skill points are placed in the Lightning Resist skill as a synergy to Holy Shock. By level eighty the damage of Holy Shock will be greater than Holy Freeze, however I still prefer Holy Freeze as the main aura for the slowing effect. This also allows the character time to review the threat faced before deciding on a course of action.

Final Skill Distribution:

Holy Freeze - 20
Holy Shock - 20
Resist Cold - 20
Zeal - 4
Holy Shield - 5
Salvation - 1
Resist Lightning - rest

Wednesday, September 10, 2008

Java: Character Simulator Update #8

I had a decision to make as to whether to create a Runeword Wizard or finish the character simulator part of CharSi. I know that were I to start the character part I wouldn't be finished for quite a while. Since I already have a decent idea how to make the runeword wizard I decided that was the application I would work on. It is still going to be part of the overall CharSi program, but more of an add-on than an integral part since it won't interact with any other tabs.


I have a general idea as to what type of information was needed to perform the runeword query properly. After I had my list created I reviewed an online runeword calculator to ensure I didn't miss anything important. From that version I added the Paladin only aura runeword option, but that was all. The online version has some modifiers I can't see myself using, and since this is primarily for my personal use I'm not adding them in.

So then it was off to create the look-and-feel portion of the program. I created a separate JPanel for each section to be combined at the end into a single JPanel. I borrowed code from a few earlier programs to speed up the process, no need to recreate the wheel all over again. Specifically I am using a JList and JTextArea panel from the equipment tabs of CharSi. Virtually a cut-and-paste operation with only a few variable names changed. Also utilizing the Rune JPanel from the AMAS program, with a few modifications. The columns were changed from three to two and I needed to use a different constructor for the JCheckBoxes.

JCheckBoxMenuItem (String text, Icon icon, boolean b)

Actually it's a different component all together to be honest. Also needed to set their value upon initialization as I wanted all of the rune options to be initially checked. As a result had to borrow all of the rune images as well to include with the JPanel.

As it turned out the only pieces that had to be created from scratch were the query modifiers. Once that was all done the separate JPanels were grouped together using GroupLayout to display correctly. Now I need to look into how I want to handle the queries, and how to store the runeword information so that the information displayed is accurate. I'm considering an array of arrays so that For and While loops can be used rather than a separate instance for each runeword.

Friday, September 5, 2008

Java: Character Simulator Update #7

Three pieces were planned on being completed for the next update. Specifically:

1. Update the skill text files to hold data for skill values up to 55
2. Fix bug where JComboBox ToolTip is not updated when a synergies skill is changed
3. Fix bug where when switch between characters the SkillPanel panel is repopulated even when the application is set to standalone mode, where only the skill calculator Tabbedpane is visible

The first piece required the most amount of time and was mind-numbingly boring. It basically consisted of me updating text files with the information of each skill level. Some of the skills were fairly easy to do as the skill values progressed at a steady pace. In this regards the Barbarian class is my favorite. However other skills, such as Plague Javelin for the Amazon, increased exponentially and therefore required far more time to update. Thankfully that is done and hopefully all of the data was entered correctly, as finding a mistake will be rather difficult. I will spot check a few skills and compare my results to that of another skill calculator, but I will not be checking every single skill and synergy.

Fixing the ToolTip on the JComboBox to update when synergies are updated was fairly simple. I had Listeners set to update the calculations and tooltips for each category, such as Necromancer Curses. However some synergies are outside of the skill's category, so I expanded the update to include all tooltips rather than just the category's ten. To accomplish this I created a new method, RecalculateSkills, that was called at the end of each JPanel listener.

Lastly I wanted to fix the bug where when the Skill Calculator is not set to act in standalone mode the SkillPanel containing the JComboBoxes for selecting plus skill values is not removed correctly. When the standalone mode is turned off the initial SkillPanel is removed, but when a different character class is chosen then their corresponding SkillPanel appears. To bypass this a single line of code was required.

if (CharSi.standaloneMenuItem.getState() == true)

This is called just before the SkillPanel method is called, so that if the Skill Calculator is to act in standalone mode then the method is utilized, otherwise it is not.

Originally I had thought that after making these changes I would be done with the Skill Calculator and could move on to the next piece of the application. However upon further consideration I've decided to add two additional pieces.

1. Create Clear All skill selections button
2. Synergy information in skill description tooltips

Creating the Clear All button was the easy part. Simply add the JButton component at the end of the selectionPanel. A few JLabels full of spaces were added to ensure the original components stayed where they were and the JButton was placed in the upper right corner of the application window. Getting the listener to act properly was a bit tougher.

A difference instance for each character type was created inside of the listener. Within each instance a few things had to be altered. First the arrays that help plus skill values were zeroed out using For loops. Then the JComboBoxes had to be reset to index zero. It was this step that caused quite a few problems. When a JComboBox that has a requirement is set to zero this caused the JOptionPane error message to appear, regardless of which order the JComboBoxes were reset. In the end I had to create a new variable that would be a specific value inside of the Skills class Button listener. Then the character JPanel listeners were ignored if the new variable was this specific value.

if (Skills.clearing == 1)
return;

'Clearing' being the variable in question and the above code is executed first in each listener. This ensured the requirement error doesn't appear multiple times when the Clear All button was pressed.

As for including the Synergy information into the tiptool of the JLabel, no problem. All of the information was already in the description of the corresponding calculator method. It simply had to be copied over.

This leaves the Skill Calculator portion of the application basically complete. Some minor word changes or correction of typos may occur but it is fully functional and ready to use. Now I just need to create an icon for it and generate the necessary executable file.