Wednesday, December 31, 2008

Java: CharSi Update #14

Any mods provided by equipment is now properly displayed in the Stats panel, minus damage and attack rating calculations. The first step was to add a method for each category of mod that would sum the data from each of the equipment subpanels into a single value. I split up the mods into small groups to make things a bit easier, such as all boolean values in one method, all mods of note in another and so forth. During the calculations the mods that are based on character level had to be taken into account as well. This was done with a simple addition to the currently summed value.

((int)charLevelMods[15])*(levelCBox.getSelectedIndex()+1)

Once the summing was completed it was a simple matter of creating another method to populate all of the JTextFields and JTextAreas. To do this a couple of different methods were created to populate patches of these components, then a single method is made that calls all of the methods together, both the summing and populating ones. I determined it was easier just to sum everything each time a value is changed rather than only the ones affected, to ensure that I didn't miss something along the way.

The miscMods panel had a few different wrinkles beyond the others. Specifically the text files that contain the random mod information for each piece of equipment needed to be dealt with for when the program is closed or the item added/removed. Adding the information wasn't too difficult, however a new method needed to be created to erase all of the file's content when the item was removed or the program closed. This new method basically overwrote the current file with a blank one and is called every time just before an item is added or whenever one is removed, as well as when the miscMod Panel is initialized for cases when the program is closed with equipment still assigned to the virtual character.

Once that was done it was a simple matter of taking every mod that isn't deal with in any of the other panels and appending that mod's information to a StringBuffer that is then displayed in the miscMod JTextArea.

Now with all of the other Panels completed it is time to work on the Damage panel. This one will take a little research first as I need to get the correct damage equation to ensure I don't repeat the mistakes of the current LCS. That and I know I need to alter the current component's GUI quite a bit to take into account kick, smite, one-handed and throw damage as well as active auras for Paladins. Once that is completed there are only a few cleanup items to take care of before the current iteration of the program is complete. Then I'll have to decide what the next step will be.

Monday, December 22, 2008

Diablo II: Patriarch Hades

Hades will be a Fishymancer, basically a character that summons skeleton minions to do the fighting for him and backs them up with curses and Corpse Explosion. I've already completed one such character, but he was in Hardcore from the No Vitality tournament and therefore not someone I intend to play again. The point of this character is to have someone in the end who can magic find in Level 85 areas quite easily.

At first I thought I'd enter the current MFO with him, but since there is no way I could compete with everyone else in that category, my runs are far too long, I decided to forgo that idea. Still, I decided to make this a purely twinkled character, which is very different from what I normally do. The point was that Fishymancers can slow down a bit and I didn't want that as I've already played this character before. Secondly I'm curious how long it would take me to play a twinkled character through the game, as I haven't done that in years. And so Hades was born.

Hades started off twinkled with the Infernal set, giving him some nice +skill mods early on. He also started off as a melee character, right there on the front lines with his minions whacking away at monsters. This worked quite well as Hades could concentrate on the Devilkin shaman while his minions kept their minions at bay. As he progressed through the first Act I continued to twinkle on gear, such as the Tarnhelm and a pair of Nagelrings. I wanted him to be magic finding as much as possible as early as possible, as well as getting as many +skills as I could.

Once in Act II Hades decided to forgo getting a Desert Warrior mercenary and instead stayed with the Rogue. He already had eight melee minions at that point, so didn't need another one. Besides which, none of the available auras would help out his army much, but a powerful ranged attacker would be very useful in places like the Maggot Lair and Arcane Sanctuary. And boy wasn't she helpful there, those areas went by quite quickly, although it helps when you drop the player settings down to P1 too.

Hades wasn't in any sort of danger through Normal, not from the monster packs nor the Act bosses. Diablo did catch him with the edge of one of his lightning hoses and dropped his life down to one third, but that was about as close as things came. By the time Hades completed Act IV, he had ten skeleton warriors, four mages, a clay golem and his rogue mercenary companion beside him. Backed up by Amplify Damage they were quite the wrecking crew. At this point Hades is wearing quite a bit of magic find; two Nagelrings, Chance Guards, Tarnhelm and a Goldwrap belt. Still, he hasn't found much of anything, but I do expect this will help him complete some of the tasks in the Christmas tournament.

The army size stayed the same all through Act V as well, as I didn't mule on anything else. Mainly because I was playing the entire act through in one sitting and didn't feel like stopping to mule more on, as well as the fact nothing was really needed at that point. Hades breezed through the rest of Normal and took out Baal with zero difficulty. A clay golem plus Decrepify means no Baal clone, no teleporting and no froze wave. Just sit back and cast Decrepify every 8.2 seconds until Baal fell.

Nightmare was pretty much a continuation of the end of Normal. However things did start to slow down a bit in the Catacombs as monster's hit points increased. Still, they all fell without too much trouble and this lead the way to Act II. Here is where Hades parted with his Rogue companion and sent her back home to help her sisters. He replaced her with a Might Desert warrior, the aura is simply too enticing for this particular build to go with anyone else. Coupled that with the Insight Partizan I muled onto him and we're set to go. Along with the Insight I muled on a Arm of King Leoric. This will allow Hades to have a full dozen skeleton warriors and a half dozen mages. However there is a catch, the item has a chance to cast Bone Prison when Hades is hit. I'll just have to ensure he's never in melee range of any monsters.

Hades continues to progress nicely, things really did pick back up again once I switched mercenaries. He definitely isn't a fan of tight spaces, but in wide open areas he is king. At the moment not spending my extra skill points, as I'm not sure where to put them. I was thinking CE but that only increases the mana required and at P8 it isn't very useful. The other option was Skeletal Mage but they aren't the most useful and I have twenty minions right now. At the moment I think I'll just hang onto them. I do want to enter Hell with CE maxed so will store the points until I can ensure that happens, then the rest go into Skeletal Mage.

AoKLR is as dangerous as they say. Got stuck with a Fallen when attempting to raise an army. Thankfully it was a Fallen and could beat it away with the wand. Still, almost got stuck with a few Dolls in Act III, which wouldn't have been so much fun. The Durance was a bit tricky, as every doorway held the potential for disaster if Hades were trapped in a Bonewall prison. Still, he made it through and eliminated Mephisto without much trouble.

Hades cruised through the rest of the difficulty without only one snag. In the Ancients Way he encountered the undead that keep rising after they are defeated. Thinking nothing of this Hades continued through the area staying behind his troops and out of danger. All of a sudden one of the monsters raised from the dead behind him and charged. Hades died in a single hit. After that he learned to explode every corpse as he went to ensure that didn't happen again. Hades had to do a few Baal Minion runs to get his level to the norm for going into Hell, 75. Then he was able to twinkle on the rest of his equipment.

After that he had a decision to make, what to do with 310 unused stat points and 25 skill points. Decided on dropping the strength charms and being able to wear all of the equipment outright, as well as dumping enough points into dexterity for maximum block. After that was done he increased Raise Skeletal Mage until ten could be summoned and then dropped the remaining 17 skill points into Corpse Explosion. CE will be maxed, followed by Raise Skeletal Mage and that will finish the build.

Hades made full use of his skillset in Hell. The army he would normally quest with was his desert warrior Might mercenary, a clay golem, 13 skeleton warriors, 12 skeleton mages and up to 11 revives. Obviously as long as Hades CEed every corpse that could be resurrected he was in no real danger himself, other than those monsters with piercing attack like Gloams and Slingers. And so Hades did either CE or revive every monster encountered. I found that my favorite revives were either the Rogues (of any type), Frenzytaurs, Snakes or Witches. All of them are fast, tank well and deal decent amounts of damage. On the flip side they do still look somewhat like their still-monster counterparts and I got confused may times thinking a pack had snuck up me somehow.

Progress through Hell went much, much faster than Nightmare. Of course Corpse Explosion was the main reason for that. It was used liberally and Hades practically ran though the entire difficulty. He did get caught up in the Arcane Sanctuary with all those Ghost packs. Being mostly physically immune they took quite a while for 1-2 skeleton warriors to take down. Oddly enough the Maggot Lair didn't have the same problem, as the lightning Beetles aren't PI and therefore a single skeleton kills one in only 2-3 swings.

Hades had a few close calls when Gloams appeared, and they appeared everywhere they could except the World Stone Keep. He did have only 60 lightning resist until the middle of Act V, which probably accounted for some tense moments. However I decided resurrecting monsters that give me a tough time isn't the best of ideas. With an army of 38 running around, keeping track of which lightning blast is from a minion Gloam and which is from a monster one is practically impossible. As a result I found myself dodging my own attacks until I simply stopped resurrecting Gloams and such. Oddly enough I didn't have the same issue with the Witches, which is why I'm willing to resurrect them.

Overall the act bosses were a joke. Decrepify and Clay Golem keep them pretty much immobilized and they all went down easily. Baal did clone himself immediately and as a result I had to take on both at the same time. Since one wasn't engaging a clay golem that one was able to use Baal's normal attacks, although teleporting didn't appear to be possible.

Decided this build is pretty much complete. I wouldn't know what to do with any more skill points, but I'm sure a few levels wouldn't hurt the minions at all. Since he is geared towards level 85 areas I still have to decide if the Skin of the Vipermaji or Skulder's Ire is the armor of choice. Will have to play around with it to see how low I can get my resistances and still feel comfortable with it. Either way if I'm going to the WSK then all I have to do is what I did this time around. Wander through with 11 Frenzytaur revives and absolutely nothing will give me problems, even Listers group went down extremely fast.

Stats:
Level 83
Strength - 95(105)
Dexterity - 180(184)
Vitality - 205(215)
Energy - 25(51)

Life - 608(628)
Mana - 351(361)

Lightning Resistance - 75
Fire Resistance - 74
Cold Resistance - 70
Poison Resistance - 74

Skills:
Decrepify - 1(9)
Dim Vision - 1(9)
Bone Armor - 1(8)
Corpse Explosion - 20(27)
Raise Skeleton - 20(33)
Skeleton Mastery - 20(33)
Summon Resist - 1(11)
Raise Skeletal Mage - 20(32)
Revive - 1(11)
Fire Golem - 1(11)

Equipment:
Weapon: Arm of King Leoric
Armor: Skin of the Viper Magi
Boots: War Traveler
Belt: Goldwrap
Gloves: Chance Guards
Helm: Tiara - +2 Necro skills, LR 29%, Teleport charges
Shield: Homunculus (socketed: Pdiamond)
Ring1: Nagelring
Ring2: Nagelring
Amulet: +3 Summoning skills

Mercenary (Might Desert Warrior)
Helm: Tal Rashas Horadric Crest
Armor: Duriel's Shell
Weapon: Partizan 'Insight'

Hellforge:
NM - Lem
Hell - Ko

Thursday, December 18, 2008

Java: CharSi Update #13

Progress is moving along nicely. I have now updated each of the equipment class files to incorporate the changes made to the Armor class file. Specifically each now can be used to search for an item given a set of parameters and then equip that item to the virtual character.


In updating all of these files I did encounter several mods that I had neglected to take into account earlier. Mods like Assassin kick damage and Fire absorb based on character level didn't appear in the armor items. As a result I had to update certain integer arrays in each of the class files as well as any methods that worked with these arrays each time a new mod was "discovered". Along with that I did find several of the item text files had typos that caused an exception to be generated. Those had to be corrected as well.Once that was done I was then able to completely equip a character with white, set or unique items and view those stats that I have hooked up in the Stats panel.


The Mods of Note panel is mostly attached to the equipment panels, as is the Stat Points and Properties panels. They are missing the additions for based on character mods but beyond that they should be accurate. The other panels need work however. So that's my next step, to attach all of the data I've collected from the equipment panels and display that properly in the Stats panel.

Wednesday, December 10, 2008

Diablo II: Patriarch Atlas

Up to this point I've never patted a Barbarian. I had an IK barbarian in Nightmare at one point before I deleted all of my stashes/characters and restarted in Single Player. So it's about time I got one all of the way through Hell. To that end Atlas was born. He will be a Whirlwind barbarian, however I'm not sure what type of weapon he'll wield quite yet. As with all other builds the only items that may be twinkled on are weapons, and that's only because he relies on physical damage to do his dirty work.

Atlas started out as everyone else, whacking away with his starter gear. Very quickly Bash became available and while somewhat mana intensive it allows him to deal a large amount of damage. As a result this skill is what is used to get Atlas all the way to level 30, which twinkling on weapons such as the Chieftain. While progress was somewhat slow until Whirlwind became available, Atlas made up for that by being ridiculously safe. His high amount of life, 1k at the beginning of Normal Act V, meant he could take massive amounts of punishment and still keep on trucking. As a result all of Normal was fairly simple and not very noteworthy.

At level 30 I equipped a pair of Bloodletters onto Atlas. With their plus to WW and Sword Mastery skills they gave Atlas a significant amount of damage dealt and he cruised through the rest of the difficulty. However I did notice the repair cost of these items is absurdly high. This means they definitely aren't endgame material, nor can they remain on Atlas for a long period of time. By mid-Act V Normal he's almost out of gold. As a result I have to pick up every piece of expensive equipment I can to sell for repair costs. Pretty much broke even for the rest of Act V.

No real difficulties encountered in Act V. Baal's minions waves took a while, especially Lister. With their very high life pool and regeneration concentrating on one or two to take out at a time was time consuming. Would be a good idea to get some poison damage for Nightmare so I don't have to go through that again.

Apparently poison damage was the least of my worries for NM. Staying with the gear I had suddenly it took Atlas four WWs to eliminate a single normal Fallen. That doesn't bode well for the future. In attempting to tackle Blood Raven Atlas ran into a brick wall. She could summon more minions faster than Atlas could deal with them, soon he had a virtual army chasing him around the graveyard. This lead to his first death. Seeing as things were just going to get worse for this build I relented and twinkled him up to his eyeballs by equipping an Iron Pelt, Arreat's Face, String of Ears and a few other odds and ends. The weapons stayed the same for the moment but now he can deal with monsters at a moderate pace.

Atlas was slowed down in Act II with all of the unleechable monsters roaming around. This lead to frequent mana potion consumption and lots of trips back to town to restock on said potions. Still, he progressed nicely and while large packs of monsters take a while to whittle down due to WW damage being distributed evenly among all of the present monsters, Atlas is a very sturdy character. In Act III Atlas learned a good lesson for WW, don't specifically target any monster that may run away. He did this one a few Flayers and Zakarum and when they run, Atlas WWs after them until he catches them. This lead to Atlas waking up massive packs of monsters in succession and a bit of running away to string out the packs afterwards. From then onwards I was very careful to only target empty land when aiming WW to ensure that didn't happen again.

Act IV didn't have the massive slowdown I expected with the increased Hit Points of all of the monsters. In fact it went by so well that Atlas was feeling brave and WWed himself right through the Chaos Sanctuary. He targeted the Oblivion Knights first and while he did get IMed a few times, those same OKs cast something else on him before he attacked to much so he didn't suicide himself a single time. By the time Atlas reached Act V he was level 65, so I equipped a pair of Baranar's Stars on him to see if those could be endgame material. He completely owned everything in Act V, most within one or two WW cycles. Which is surprising since by getting rid of the Bloodletters Atlas lost +6 to WW and Sword Mastery. Now I need to decided between them and a pair of Lightsabres as my final weapons.

After trying out the Lightsabres my mind was made up, they would be my final weapon. Couple the lightning absorb from them with the fire absorb from the Dwarf Star and Atlas was pretty much running around being healed by all the elemental damage thrown his way. That and the Lightsabres helped him deal with physical immunes all on his own, as well as physical resistant monsters such as the Frenzytaurs.

Oddly enough Hell went very much the same way as Nightmare. Atlas WW all over the place and half the time didn't even see what mods the boss had before it was dealt with, or didn't even realize a boss was present until I was checking out the dropped loot. This was very similar to the Fury Druid I completed just recently. Very odd how the physically damaging builds are doing so well in Hell and yet my understanding was they suffered there instead.

Still Atlas cruised right along through pretty much all of Hell. Having near 3600 life and maxed resistances does make one almost invincible. Almost, as Atlas did suffer his one and only Hell death in Act IV when he got caught in a long WW cycle inside of a huge pack of monsters. That was when I realized I couldn't die while WWing and only once the cycle was over would Atlas suffer the consequences. After that though nothing stood in his way. Even Baals minion waves didn't last as long as against my fully decked out Meteorb.

A few notes about this build. Whirlwind is quite the fun skill, but not so easy against large packs. The damage gets spread out so much that it takes forever to clear out a twenty monster group. That is why I ended up spreading out the monsters as much as possible and WWing groups of 5-6 instead. With so much life, lots of life leech, maxed resistances and absorb in the main two elements this character is about as indestructible a character as I can make. He could run the World Stone Keep, and has, without much difficulty. If Oblivion Knights spawn he'll just use the single point Berserk to wipe everyone out in no time flat. To top it off Lightsabres aren't the most damaging weapons he could use. Most of the other Patriarch threads in the SPF have higher end equipment, which is scary as to how damaging those characters could be. Overall, a fun build to play. Not sure exactly why I put of patting a Barbarian for so long, but now I have one completed character for every single class, which just so happened to be one of my goals in DII for this year.

Stats:
Level 83
Strength - 91(146)
Dexterity - 84(136)
Vitality - 310(330)
Energy - 10(20)

Life - 1419(3693)
Mana - 459(1022)

Lightning Resistance - 75
Fire Resistance - 75
Cold Resistance - 75
Poison Resistance - 75

Skills:
Whirlwind - 20(24)
Berserk - 1(5)
Sword Mastery - 20(22)
Natural Resistance - 3(5)
Battle Command - 1(3)
Battle Orders - 20(22)
Shout - 20(22)
Battle Cry - 1(3)

Equipment:
Weapon1: Lightsabre (Socketed: PSkull)
Weapon2: Lightsabre (Socketed: PSkull)
Armor: Lionheart (Great Hauberk)
Boots: Goblin Toe
Belt: String of Ears
Gloves: M'avina's Icy Clutch
Helm: Arreat's Face (Socketed: Ort)
Ring1: Dwarf Star
Ring2: Nature's Peace
Amulet: All resist 30%, MD reduced by 3

Mercenary (Might Desert Warrior)
Helm: Tal Rasha's Horadric Crest
Armor: Shaftstop
Weapon: The Reaper's Toll

Hellforge:
NM - Dol
Hell - Pul

Tuesday, December 9, 2008

Java: CharSi Update #12

Before I could get the Equip and Remove JButtons working in the Armor panel I had to first correct some oversights and problems in the Stats class. Specifically not all of the mods were being summed correctly, or at all, so a few methods needed to be generated. I made a different method for each array or subset of variables so that each could be called separately. Currently I don't have a need to call them separately, but one could arise in the future so I'm planning ahead. Along with this a super method was needed that would call all of the summing methods at once, SetAll.

Now that the Stats panel was all set it was time to finish the Equip JButton listener. First a check is done to ensure that there isn't already a piece of Armor equipped on the virtual character. This is done with an array stored in the Equipment class, and therefore available to all classes that govern the tabbedpanes. After that check is complete, and passes, then the stats from the selected item are stored using the massive If-Else statement created earlier. Once completed the SetAll method is called to save this information into the Stat class variables and the Armor slot is considered "filled".

StoreItemStats();
Equipment.equipListModel.addElement(itemName);
Stats.SetAll();
Equipment.equipYes[1] = 1; //1 = filled, 0 = empty

This places the item name as an element in the equipped JList component. I decided that any elements in this list, while clickable, won't display the items properties in the JTextArea. That would have required saving the data into a text file to be displayed on command, and at this point that isn't a critical element for the application to function.

Now that an item can be equipped, it needs to be removed as well. Doing so needed another method, ZeroStatArrays, that would empty the contents of all the stat arrays before calling the SetAll method to sum the stats from all equipment pieces. Along with this the element in question would need to be removed from the equipped JList. However, before this could be done a check needs to be made to ensure that the user is in the correct JPanel for the equipment being removed. I decided that needed to be a requirement to remove the item piece.

Now that those pieces were in place, I had to run through the entire list of available armor pieces and both equip and remove each one. This was a check to ensure that the right values are being stored by the StoreItemStats method. As it turned out there were several bugs in that part of the code. A few times the wrong slot of the array was updated, while others there was a conflict between mods I didn't know existed, such as between "to mana" and "Damage taken goes to mana". Both contain the phrase "to mana" and therefore the method was attempting to apply both statements to the value given.

As a last piece I removed the Perfect and Reroll components. These were now redundant as the user is choosing the desired values whenever the item is equipped. The next step will be to transfer this code to the Belt class file and then test all those items to ensure the StoreItemStats code is still valid. I'm sure there are some mods not handled by the armor files that may still have small difficulties. Each piece of defensive equipment will be handled in turn until they are all completed.

Friday, December 5, 2008

Java: CharSi Update #11

Next step in this program was to transfer the flag code to the other Class files so that I can easily search on any item set and display that list in the item JList. Once that was done I did make a decision about the Weapon class file. Leaving the application the way it was would have been burdensome to find a particular item. So I bit the bullet and created massive if-else statements to incorporate the fifteen different weapon types in the code. Along with that I had to create a new GUI piece to allow the choice of which items to search under, leaving them all unselected to start with.

Once that was done it was time to start working on the true workhorse of this application, the ability to take the information from the text file and save it in the application to be added to the stat fields when needed. I elected to do this with a series of arrays and a single text file. Before I could do this however I had to alter the way some mods were written so that I could store them correctly. I made sure all variable ranges were encompasses by parentheses () and these were the only values that had such characters in their particular line. Same goes for the set items, {} brackets were used to signify those items so they could be dealt with differently.

This ended up being a much larger project than I had originally anticipated, not that I though this piece would be small mind you. The main method for this process, StoreItemStats, was designed to take the text and deal with it one line at a time. Each line was compared to the possible mod text and if it matched then the appropriate array field was updated with the value provided in the text. Sounds simple? Well not quite that easy.

First there are a ton of mods to deal with so a couple hundred String variables had to be created for the comparison. Then several arrays were created, each for a different type of mod so they could be identified easier, such as modsOfNote and stats. Once a mod was identified then it had to be determined if the mod was variable or not.

else if(currentString.contains(ML)){
if(currentString.contains(RANGE)){
modsOfNote[7] = DetermineRangeValue(currentString, "Mana stolen per hit");
}else
modsOfNote[7] = Integer.parseInt(currentString.substring(0,currentString.indexOf("%")));
}

The above is a call to see if the mod Mana Leech is present. If the line of text contains a "(" character then it is a range then the method DetermineRangeValue is called, as the program needs to determine what the exact value of this mod should be. That is where the user comes into play. The user will be provided a dialogue box to choose the desired value, then that value is stored in the appropriate array slot. This seemed a much easier route to go than to have the Reroll and Perfect JButton/JCheckBox components do this in a more random fashion. This way the user can simply create whatever version of the item they want, from low end to perfect and anywhere in between. It means I'll have to remove those components in the near future and unclutter the GUI a bit.

The coding itself wasn't so difficult, it was the amount of data I needed to sort through that gave me a headache (and a stiff back). The giant If-Else statement ended up being 1820 lines of code, which basically quadrupled the size of the Class file with one method. Some of the If-Else statements had to be nested together as their text was too similar to distinguish easily. For example there are several mods that reference "fire damage" or simply "damage", so to ensure the right value got into the right array slot those mods were nested together.


Now that this piece of the code is written the application works pretty much like a giant item database. Easy to search for a particular item but not much else beyond that. However now that I have all of the mod information stored into appropriate arrays (for the Armor class at least), the rest should go a bit quicker. I plan on working only on the Armor class for now so that I can get that one pretty much completed before transferring all of that code to the other defensive equipment classes. So along that train of thought, my next step will be to get the JList for equipped items working and ensure that I can't accidentally equip more than one item at a time. That and I need to get the Remove Item JButton working as well as remove the components that aren't necessary anymore.

Diablo II: Whirlwind Barbarian Skill Layout

A Whirlwind (WW) Barbarian is a character that uses the Combat skill Whirlwind as his main attack. This skill consists of the character spinning through hordes of monsters damaging them as he goes. He can take damage as this happens, but will only die once the WW cycle is complete. The damage this type of build generates completely depends on what type of weapon is utilized. Most of the damage will be physical, but with certain equipment choices quite a bit of elemental damage can be included as well to allow the character to deal with physically immune monsters. This particular build is a fairly slow starter and lots of skill points are left unused initially. The skill setup is as follows:

Bash - 1
Howl - 1
Leap - 1
Shout - 1
Taunt - 1

At level six some prerequisites become available. None of that are all that special, although the warcries do allow the character a fair amount of crowd control for such a low level. To this end Howl is quite helpful to keep the character from being mobbed while Bash becomes the main attacking skill.

Stun - 1

At level twelve not much changes from level six. Stun isn't used to replace Bash as the main attacking skill as Bash does well enough to allow the character to progress at a fair pace.

Leap Attack - 1
Concentrate - 1
Battle Cry - 1
Iron Skin - 1

At level eighteen a few more skills become available that make progression simple for the character. Concentrate can replace Bash if desired as the main attack, but it's not completely necessary, and war tactics remain basically the same up to this point.

Battle Orders - 1

At level twenty-four the character obtains the use of one of his main skills. At this level it isn't very useful due to the short duration period, but for some battles every little bit helps. It's best to recast BO after each monster encounter to ensure it doesn't run out during a heated fight.

Battle Orders - 7
Battle Command - 1
Natural Resistance - 1
Whirlwind - 1
Berserk - 1

At level thirty is where things start to get going for this character. All of his main skills are now available and he is able to use his main attack, Whirlwind. Along with this the duration of BO is extended to be more viable as it doesn't require as much recasting as before.

Whirlwind - 20
Battle Orders - 20

The next thing to accomplish is to max out both of the main skills, which is finished at level forty-nine. This means at the very beginning of Nightmare the character has an insane amount of life and deals quite a bit of damage, as long as he is able to leech back enough mana to keep going as WW is a fairly mana intensive skill.

Shout - 20

Shout is maxed out by level sixty-five. This gives a greater duration to BO and BC and also increases the character's defense significantly. While increased defense may not seem like much, if the right equipment is used it helps ensure that the character can avoid enough damage to survive each WW cycle. The extended duration of BO means it only needs to be cast every once and a while and doesn't need to be worried about as much as before.

Mastery - 20

At this point the weapon mastery should be maxed to provide extra Attack Rating and damage to the character's attack. This is completed by level eighty-one. The type of mastery to max out depends on the weapon(s) chosen by the character. This can be left to last as the bonuses given will not make or break the build and Hell can be completed without this skill, depending on weapon chosen of course. After this the skills to place points in could be either Iron Skin for the added defense bonus or Natural Resistance for the added resistances. Which one depends on what the character is in need of. If the character is fairly close to the 10,000 defense mark then Iron Skin would be fairly useful, otherwise Natural Resistance is the route to take.

Final Skill Distribution:

Whirlwind - 20
Mastery - 20
Shout - 20
Battle Orders - 20
Battle Command - 1
Berserk - 1
Natural Resistance - 1
Iron Skin - 1

Friday, November 14, 2008

Java: CharSi Update #10

Now that the Runeword Wizard portion of the program is completed I can turn my attention back to the main goal of this application, namely the ability to virtually equip a character with items and see those stats. To do this I need a list of available pieces of equipment that can be displayed in the item JList.

Similar to the way runewords are handled with the Runeword Wizard I decided upon text files, one for each possible item. Granted an access database or something similar would be a bit more efficient in the long run, but since I have no idea how to hook one up the application text files remain my only alternative beyond hard coding each item's stats into the class files.

Before these files could be created I needed to generate a list of all possible mods that can spawn on items. This is needed for two reasons; first to be able to consistently word a mod in the text files and secondly to lay the basis for the array of arrays necessary to compare possible mods to mods actually present and update the correct variables within the program. The second part is far into the future so I'm not worrying about that yet, however wording the mods right is something I must worry about. If I misspell a mod then when the text file is searched for that mod it won't be found due to a typo, and as a result the information displayed will be inaccurate. As a result I must be very careful when creating the text files, such as the one seen below.

Vampire Gaze
Grim Helm
Required level: 41
Required strength: 58
Defense: 252
Durability: 40
+100% Enhanced defense
Adds 6-22 cold damage over 4 seconds
15% Slower stamina drain
6-8% Life stolen per hit
6-8% Mana stolen per hit
Damage reduced by 15-20%
Magic damage reduced by 10-15

The files themselves are organized in subfolders that separate set/unique/white(normal) items based on whether they are normal, exceptional or elite. This makes displaying the list of item matches much easier in the JList component if all the normal set items are stored separate from the unique items.

Once the files were created, the code then needed to be generated that could search them and display the correct items dependent on which checkboxes the user had selected. A pair of methods were created for this purpose, one being the workhorse and the other calling the first dependent on what folder location was being utilized. A basic setup of the first method is below.

if(normalFlag){
if(whiteFlag){
location = location.concat("Normal/White/");
AddToList(location);
location = location.substring(0,11); //revert string back to original form
}
if(setFlag){
location = location.concat("Normal/Set/");
AddToList(location);
location = location.substring(0,11); //revert string back to original form
}
if(uniqueFlag){
location = location.concat("Normal/Unique/");
AddToList(location);
location = location.substring(0,11); //revert string back to original form
}
}

The folder location is passed to the workhorse method (AddToList) and all files in that location are dumped into an array of Strings. That list of Strings is then shortened to remove the .txt portion of the filename and then added to the DefaultListModel governing the item JList component. This allows the items to appear in the item JList component. Once in this component the JList Listener is then added that once an item is selected its corresponding text file is displayed in the JTextArea. The layout of the listener is the same as the method shown above.

The next step is to then transfer this same code to the class files for the other equipment types. I do realize that by grouping items in such broad terms the generated lists for the weapon types will be quite extensive. I've considered changing that class file into a JTabbedPane, one for each weapon type, except that there are fifteen different weapon types and that would lead to quite a bit of duplicate code. Another alternative is to add another set of checkboxes, one for each weapon type, that the user can select which weapon types to display. This would make the code quite a bit longer and require a new component added to the GUI to display these choices. I haven't decided which way I wish to go, or if I simply want to leave it as is and have a long list of items displayed. As a result I'm going to skip the weapon class update for now and concentrate on the others.

Tuesday, November 11, 2008

Diablo II: Patriarch Lucian

I have patted a single Druid in my D2 career, and that was on Battle.net. Since one of my goals for this year was a pat/mat of each class I have so work to do. So a Druid was decided to be my next character, mostly because I have no idea what type of Barbarian to build. Specifically this character will be a Fury werewolf Druid. I have a nice 298% ED Ribcracker collecting dust in my ATMA stash so time to put it to use. And so Lucian was born. The name comes from the movie Underworld, where the leader of the Lycan (werewolf) clan is a fellow of the same name. Seemed fitting.

Lucian started out whacking away at monsters with his starter equipment and things went rather well. Due to this being a purely physical damage build I am allowing myself some twinkling before reaching Hell. Specifically the weapon may be twinkled, but nothing else. This lets me use items like the Hellplauge and Bonesnap that would otherwise remain idle in my stash. Such twinkling made Lucian's progress move at a decent pace, but nothing absurd.

Resistance troubles plagued Lucian from the start and as expected the first Act was fairly uneventful, but Act II gave him real problems. Specifically the lightning beetles and their charged bolts were the culprit of many a NDE. For this reason Lucian traded in the rogue mercenary for a desert warrior one, so that someone else could tank these monsters.

Along the way Lucian became quite fond of his summonable companions, especially the ravens.
His constant companions in the beginning were a pair of ravens, a dire wolf and an oak sage spirit. The ravens were key in keeping the mobs a bit off balance with the constant attacks and blindings. As a result Lucian wasn't overwhelmed and could hold his own, even with low resistances and no hard points spend in Vitality.

All of this changed however in the beginning of Act IV. Lucian was level 29.5 going in and it only took clearing the first area to raise his level and gain his endgame skills, specifically Grizzly and Fury. The grizzly makes a much better tank than the single dire wolf Lucian had up to this point, so he traded. As for Fury, suddenly monsters were dying so much faster it was fantastic. Also made Bonesnap a bit faster of a weapon. Very soon after Lucian reached level 31 and could equip his endgame weapon, Ribcracker. Oddly enough his damage output dropped when replacing the Bonesnap, but the speed of attacks increased dramatically and that more than made up for the small damage output reduction.

Suddenly Lucian was breezing through the rest of Normal. No NDEs, no interesting drops but also no problem handling the Chaos Sanctuary and both Diablo and Baal at P8. Even Iron Maiden wasn't an issue as Lucian would cast a dire wolf on the Oblivion Knights and that would keep them occupied just long enough for him to deal with the Doom Knights before knocking off the OKs as well. Also helped that a Cathan's Seal dropped early in Act IV and the 6% life leech made it so that Lucian didn't need to use health potions anymore, reducing the amount of times required to return to town while questing.

Nightmare was very much the same, at first. Once Lucian arrived in the desert his mercenary companion had difficulties staying alive. That, coupled with the ghost packs that were encountered everywhere and kept burning off all of Lucian's mana, made the trek through the desert quite long and dangerous. As it was that is where Lucian met his first, followed by a few other, death. His cold resistance is -30% currently and up to this point he had base vitality. The combination meant that each cold enhanced boss encountered killed him off. I finally broke down and placed 125 points into Vitality, so his life is over 1100 and deaths aren't occurring anymore.

Lucian cruised through the rest of Nightmare without too many difficulties. Did drop the player settings to 3 for the Chaos Sanctuary so that Oblivion Knights weren't too difficult to handle. Other than that everything, including the Ancients were done at P8. The mercenary liked to take a dirt nap quite often the closer they got to Baal, against the minions he must have been resurrected at least a dozen times. Once Baal was defeated a few NM Baal runs were performed to level everyone to 76 so that all the endgame equipment could be used. Then it was onward to Hell.

Hell proved to be a bit easier than expected. From the other patriarch threads in the SPF I assumed that entering Hell with a non-upped Ribcracker and no Fortitude I would have a difficult time, since all monsters have 50% physical resistance. That didn't turn out to be the case at all. Lucian breezed through the first three acts without any difficulties. All through Normal and Nightmare he quested with a grizzly but now in hell the dire wolves come into play, and they held up nicely.

Mehpisto was a pushover, getting to him was a bit more difficult. In one of the side rooms Lucian encountered a double boss pack of Blood Lords coupled with a champion pack of the same monsters, along with the unique council member I expected. Needless to say the dire wolves died instantly since they don't do so well against elemental attacks. The grizzly came out and tanked the lords while Lucian and his merc concentrated on one Blood Lord at a time. Eventually they were all dealt with and Mephisto was handled without having to use a single potion. Lucian recast the dire wolves in preparation for Act IV.

That was a mistake. Keeping them alive against the harder hitting monsters of that act proved to be quite the task as they needed constant recasting. So Lucian switched back to grizzly which could pretty much be cast and forgotten about. In the meantime I put all available skill points into Dire Wolf in order to increase their life so I could use them again. As it turned out they were useful, in the Chaos Sanctuary. My way to avoid Iron Maiden was to cast three dire wolves at the OK's feet, then deal with their minions. It worked quite well, except once. I was IMed and meant to cast dire wolf but instead misclicked and furied a doom knight. Obviously I died quite quickly, up to this point my only death in Hell.

As it turned out Infector of Souls ended up much harder than Diablo himself, since IoS spawned immune to physical and with a Conviction aura. Much casting of grizzly was needed to keep the pack at bay for a few seconds while Lucian engaged on minion at a time. Eventually they were all dealt with so Lucian could resurrect his mercenary companion and deal with Infector himself. One thing to note is that my hellforge drop was a Hel rune, the lowest possible one. The past four characters I've finished have had drops of Io-Hel-Hel-Hel, apparently my luck in respect to runes continues.

The last act was ripped through like nothing else. I didn't intend to play it all in one sitting, but that's what happened. None of the normal areas held down Lucian much, except for a few places. The Frozen River contained Fanaticism enhanced Succubus in large numbers that gave Lucian fits, and required quite a few mercenary resurrections. A pack of Might enhanced Blood Lords didn't help matters in the Glacial Trail, but all were manageable. Eventually the Ancients were encountered and defeated after a long protracted battle where they were split up and dealt with one at a time.

The World Stone Keep help the normal assortment of Flayers, Oblivion Knights and Gloams. Each dealt with in the normal way; straight up assault, spammed dire wolves or using a distractionary grizzly respectively. And then there were Baal's minion waves, which didn't last long. With Life Tap active and a decent life leech possible to boot Lucian was able to tank all of them, including Lister's entire pack. After that Baal was almost anti-climatic as he fell without summoning a single clone or teleporting more than twice.

A few notes about this build. A Fury Druid is definitely overpowered for P1 Hell, and that's without Fortitude or and upgraded Ribcracker. I can't image what this character would be like with both of those, but it's definitely enough to keep Baal awake at night. The character himself had no way of dealing with physical immunes, such as Ghosts. Instead he relied on the mercenary with his chance to cast Decrepify for these situations. Now the only problem with this was that Life Tap from the gloves or being blinded by a raven attack overrode Decrepify on a semi-regular basis, which was a bit annoying. I can see using a different pair of gloves, if a better one existed. However Life Tap definitely had it's uses and saved both Lucian and his mercenary's lives in more than one occasion. So overall I'd stick with the setup and just live with the fact that physical immunes will take a little longer than normal to eliminate.

Stats:
Level 82
Strength - 78(111)
Dexterity - 40(91)
Vitality - 362(362)
Energy - 20(50)

Life - 910(929)
Life in Werewolf form: 2556
Mana - 182(325)

Lightning Resistance - 75
Fire Resistance - 75
Cold Resistance - 60
Poison Resistance - 70

Skills:
Summon Grizzly - 1(5)
Heart of the Wolverine - 17(21)
Summon Dire Wolf - 10(14)
Lycanthropy - 20(27)
Werewolf - 20(27)
Fury - 20(27)
Raven - 1(5)

Equipment:
Weapon: Ribcracker (Shael)
Armor: Wire Fleece 'Smoke'
Boots: Gore Rider
Belt: String of Ears
Gloves: Dracul's Grasp
Helm: Jalal's Mane
Ring 1: Raven Frost
Ring 2: FR 6%, PR 29%, 5% ML, 36 AR
Amulet: 17 dex, 43 mana, 12% resist all, +2 Druid levels

Mercenary (Might Desert Warrior)
Helm: Vampire Gaze
Armor: Duriel's Shell
Weapon: The Reaper's Toll

Hellforge
NM - Lum
Hell - Hel

Monday, November 10, 2008

Diablo II: Fury Druid Skill Layout

A Fury Druid is a fairly basic character. This is a druid in werewolf form that uses Fury as his main attack, with a few secondary skills for crowd control and so forth. The big debate about this type of build is what type of spirit to have, Oak Sage or Heart of the Wolverine. I went with Wolverine as in Hell all monsters have 50% physical resistance so the more damage I deal the better. Along with that due to being in werewolf form the character should have plenty of life to begin with so more isn't going to provide much of a bonus, while more damage is definitely a major plus. Since he deals purely physical damage he does need some sort of backup plan for the physical immunes that are encountered in Hell, most specifically the Ghost-type monsters. The skill setup is as follows:

Werewolf - 1
Lycantropy - 3
Oak Sage - 1

At level six a few good skills are available. Obviously the main skill Werewolf is present to increase attack speed and attack rating. However here Lycantropy is the skill being pumped for two reasons: extra life and duration. Following that theme a one point Oak Sage spirit will be used from here onward until Wolverine becomes necessary. Early on the extra life will be what keeps this character alive in dire circumstances and is a hallmark of the build in general.

Raven - 1
Spirit Wolf - 1
Lycantropy - 7
Feral Rage - 1

At level twelve the duration of Werewolf is decent and the life increase very noticeable. However a big change at this point is the availability of minions. The Spirit wolves provide tanks to spread out monster packs so they are not all concentrating on the character while the ravens will help keep the packs disorganized and ranged attackers blinded. Ravens will be useful all the way to the end of Hell.

Lycantropy - 10
Rabies - 1
Heart of the Wolverine - 1
Dire Wolf - 1

At level eighteen dire wolves replace spirit wolves as the minion of choice for tanking purposes. Their increased live along with helpful corpse disposal make them much more viable. While Heart of the Wolverine has become available, the small amount of increased damage it provides doesn't warrant switched from the Oak Sage for the time being.

Lycantropy - 20

At level twenty-seven Lycantropy is maxed and the duration of Werewolf is quite substantial so that it won't be running out in the middle of a long protracted battle anymore. Just remember to recast it from time to time after a fight. At this point the character should have a large life pool and near death experiences (NDE) should be few and far between.

Werewolf - 2
Grizzly - 1
Fury - 1

At level thirty our main offensive skill is available, Fury. The mana cost is relatively low so that this can be used right away, just keep a column of mana pots in the belt in case a mana burn monster is encountered (Ghosts). Also at this time an excellent tank becomes available, Grizzly. The grizzly has much more life than all three dire wolves put together and for much of the game will be the main minion companion, at least until we get a chance to put more points into Dire wolf to boost their life.

Fury - 20
Werewolf - 4

At level forty-nine Fury is completed and our character should be dealing quite a bit of damage rapidly. The Attack rating will be quite his so that no points need to be placed in Dexterity at all, except to wear equipment. A few charms or equipment pieces that provide straight AR is all that is required to allow a decent chance to hit once Hell is reached.

Werewolf - 10
Heart of the Wolverine - 10

At level sixty-two we get a chance to boost Heart of the Wolverine and it may now replace Oak Sage as the spirit of choice. This boots our AR that much more, as well as the damage dealt by the entire party. The mercenary will very much enjoy this boost, so make sure to equip him/her with life leech and she/he won't die very often at all.

Werewolf - 20
Heart of the Wolverine - 15

At level seventy-four Werewolf is not maximized and the character has become as fast as possible with his Fury cycles. Along with this extra damage is added by the Wolverine spirit and the character is just about ready for Hell.

Dire Wolf - 10
Heart of the Wolverine - rest

The next group of skill points goes into Dire Wolf to increase their life, which is done at level eighty. This allows the character to quest in hell with three dire wolves instead of a single grizzly to better spread out the monster packs. They still don't equal the grizzly in durability, so constant recasting is necessary. As a result the character will need to manage his minions on a regular basis as the spirit has low life, the ravens don't have too many hits available before they disappear and the dire wolves die to hard hitting monsters. Still, the main focus of the character will be melee fighting with minion management a secondary concern.

Final Skill Distribution:

Werewolf - 20
Lycanthropy - 20
Fury - 20
Heart of the Wolverine - 15
Dire Wolf - 10
Grizzly - 1

Thursday, October 30, 2008

Java: En Guard Update #6

Beyond the search feature there were a few other minor changes I wanted to make to the En Guard program. First off the "Contact Info" JTextField is currently a required field to submit a new record. This field turned out to be less useful than I had intended so I am making it an optional field instead. At first I thought I would need to alter the code checking which fields are filled as well as the code that opens and saves the records. As it turns out none of this was necessary. All I needed to do was set the text of the JTextField to be a space character. By doing this the field is technically "filled" and saving/opening records works just as it did before. Good reminder to always look for the simple solution first and then work towards more complex resolutions.

The second feature I wanted to work on was making the skin chooser a bit more viable. Currently it works great to change the background color of the application, however whenever the app is closed it reverts back to the original color. This can get tedious to change such information every time the program is opened. Therefore I added a log in to the program that forces the user to choose a representative name before gaining access. This method is called before the properties of the JFrame are set.

JOptionPane.showConfirmDialog(aFrame, loginPanel, "Select Name", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE);
loginIndex = loginBox.getSelectedIndex();

The log in sets the loginIndex variable to the index corresponding to the rep's name. This information is then used to designate the file name that the program will need to open in order to determine what color to set the background to. Each rep has their own text file containing their color information, such as:

150
200
250

The file is then opened and each line of text assigned to the background color variables red, green and blue. Once done the SetBackground() method is called to change all of the JPanel's color accordingly. The text file will be updated whenever the ColorChanger() method is called as well, to ensure that the next time the program is opened it does so with the most recently selected color combination. As an added bonus, as the rep's name is being stored for this process, the Entered By field is automatically populated with the rep's name once the program is opened.

Tuesday, October 28, 2008

Java: En Guard Update #5

Two hundred and sixty-one lines of code later the Search tab is complete. The components were easily modified from other programs I have already made so putting the GUI together was a piece of cake. A combination of BorderLayouts and GroupLayouts were used for the look-and-feel portion. Once that was done the workhorses of this tab, the Listeners, needed to be created.


The Listener associated with the JList was copied along with the JList component itself and only small modifications were required to allow it to function properly. The JButton Listener however had to be created from scratch. Once the button was pressed several things needed to happen. First I needed to populate an array of file names for those currently present in the data directory. Originally I had gone with a brute force method since all of the file names are numbers ranging from 1 to 2.5 million. I had a For loop checking which files existed and if they did adding them to the JList component.

Obviously this took quite a bit of time to complete and slowed down the program considerably, enough so that it actually crashed the program on more than one occasion. Therefore a rewrite of the method (called by the Listener) was required. In reviewing the File Class I noticed a nice method named list() that would output a String array of the files present in a given directory. Exactly what I was looking for. Then calling a length method on the created arrays produced the exact number of files present so the slots used in the array is known and an exception isn't caused by trying to access a nonexistent array slot.

This search method was much faster than the previous one and does not crash the program at all, which was a nice bonus. Now a few other minor details need to be completed to have this version of En Guard finished. Specifically I want to add a log in dialogue to the program that will register which representative is using that version. This will allow me to auto populate the Submitted By field as well as save the user's skin color preference.

Thursday, October 23, 2008

Diablo II: Matriarch Theia

Up to this point I have a single MFer that I use as all of my other characters are retired, except the strafer that may make some Pit runs in the future. I wanted to make a character that could do many types of MF runs, such as Pindle, level 85 areas but mostly NM Flayer Jungle and onward as well as NM Cows in search of Skiller Grand Charms. Currently I have maybe 7 of them total so a larger stash would be very helpful.

To that end Theia was born. She takes her name from the Greek Titaness who ruled the sun. Her name brings overtones of brightness and that is very fitting for a pure lightning sorceress. I decided on zero backup skills as getting through Hell won't be too difficult with a well equipped Act II desert warrior by her side. Beside which she'll be living in NM most of the time and therefore doesn't need to worry about immunities.

Normal was fairly uneventful. The going was very slow at first with Charged Bolt the main weapon of choice until Lightning became available. Very early on mana consumption became a problem and will remain one until I either equip the mercenary with an Insight weapon or find lots of +mana items. Either way she leaves town with an inventory filled with mana pots and returns quite frequently.

She didn't run into any issues besides one against Infector of Souls in the Chaos Sanctuary. Up to this point she fried everything easily so while the monsters surrounded the mercenary she simply fired Chain Lightning at them over and over. I wasn't paying complete attention and apparently Theia was standing a little too close. One of the monsters wandered her way and hit her with a blast of flaming breath that simply drained her life to zero and killed her off. Didn't help she had zero fire resistance up to this point.

I was very annoyed at myself for such a stupid mistake, and another reason I don't play Hardcore outside of tournaments. Regardless Theia avenged that death by frying everything from that point onwards with a vengeance. The rest of Normal was finished with little fuss and no interesting drops.

Nightmare was a bit more difficult. Lightning immunes started to appear and the mercenary's weapon wasn't really up to dealing with them in more than 3 monster packs. Going was a bit slower and a few more deaths occurred, mostly due to player inattention than anything else. Still, progress was made all the way the end of Nightmare without too much fuss. The WSK did have Gloams on 2 levels, Minatours on 3 levels and dolls on the final level. But since there weren't any stair traps Theia was able to clear all of them without dying. She leveled up on Baal to be able to wear all of her endgame equipment, minus the Archainds Mesh, before venturing into Hell difficulty.

Once gear was twinkled on Theia became a one-woman wrecking crew. She simply ripped apart and non-LIs and used Frost Nova to chill (slow) the LIs encountered so the mercenary could take them out. Lots of monsters died in one hit, very few needed more than three. Absolutely nothing stood in her way, including LIster and company. Oddly enough, she didn't die a single time all in Hell, while in Nightmare she must have died a dozen times. Mostly due to impatience, and purely because I can (Softcore ftw).

Overall a decently fun character and definitely my most powerful one to date. Her future plans are to do cow and NM Act III runs in the search for more skiller grand charms. She's making good progress as she found two while questing, a Martial Arts and a Shape-Shifting skiller.

Stats:
Level 82
Strength - 142(167)
Dexterity - 25(27)
Vitality - 298(352)
Energy - 35(57)

Life - 757(988)
Mana - 197(472)

Lightning Resistance - 20
Fire Resistance - -9
Cold Resistance - 29
Poison Resistance - 20

Skills:
Charged Bolt - 20(32)
Lightning - 20(32)
Chain Lightning - 20(32)
Lightning Mastery - 20(32)
Nova - 6 (rest)
Teleport - 1(13)
Thunder Storm - 1(13)
Frozen Armor - 1(10)
Frost Nova - 1(10)
Warmth - 1(10)

Equipment:
Weapon: The Oculus
Armor: Skin of the Vipermagi
Boots: War Traveler
Belt: Arachnid Mesh
Gloves: Chance Guards
Helm: Harlequin Crest
Ring 1: Nagelring
Ring 2: 6% FR, 9% CR, 1 strength, 10% FCR
Amulet: 12 strength, +3 lightning skills

Mercenary (Might Holy Freeze Warrior)
Helm: Tal Rasha's Helm
Armor: Shaftstop
Weapon: Cryptic Axe 'Insight'

Hellforge
NM: Sol
Hell: Hel

Wednesday, October 15, 2008

Diablo II: Guardian Bob

Note: Proper repost from a previous one

Bob is a Fishymancer out of the No Vitality tournament. He also has the distinction of being my very first guardian so yes I am very proud of him. I only play HC in tournaments, and my next closest guardian was a lightning sorceress in Skunkbelly's Six of One, Half Dozen of the Other tournament that died in Act V Hell.

Anyway, for those that aren't in the tournament, the basic premise is that no stat points may be placed into vitality. Equipment and charms that give vitality are fine, just no hard points. This means Bob ended his quest with 284 unused stat points, but all of the skill points were used as they became available. This is a single pass, no twinkling tournament (as is the norm).

Bob is a traditionally build Fishymancer, so:
Skeleton Mastery: 20
Raise Skeleton: 20
Raise Skeletal Mage: 20
Corpse Explosion: 20
Decrepify: 1
Revive: 1
Summon Resist: 1
Dim Vision: 1
Bone Armor: 1

One in all the prerequisites as well. That last one (Bone Armor) was quite key, I'm sure it saved Bob more times than I can count, especially in the beginning of the tournament when Bob had so little life.

Obviously +life and +vitality items were prized and those were equipped before anything else, except maybe lightning/fire resistance items. This resulted in some interesting stat numbers:

Strength: 151 (156)
Dexterity: 25 (31)
Vitality: 15 (57)
Energy: 25 (45)
Life: 226 (621)
Mana: 187 (397)

Equipment:
Helm: Peasant Crown (Ort)
Weapon: Ume's Lament
Shield: Spirit Monarch
Armor: Gothic - 38 life, 60% FR, 30% LR
Gloves: Trang-Oul's Claws
Boots: Tearhaunch
Belt: Plated - 96 life
Amulet: 33 mana, +2 summoning skills
Ring 1: 30% FR
Ring 2: 12% resist all

Mercenary
Helm: Circlet - 15 life, 98 AR, 36% FR, 14% LR, 14% CR, 14% PR
Weapon: Hwanin's Justice
Armor: Hwanin's Refuge

Overall Bob was quite fun, and frustrating to play. I've never actually gotten a Fishymancer all the way through Hell before, HC or SC, as I got bored. However I believe being a tournament and HC was enough incentive to keep me glued to playing him. His minions kept running all over the place and I truly wished I had found a teleport amulet to organize things easier. By far the hardest places were the indoor areas with narrow corridors: Act II tombs, Catacombs, Act III dungeons/sewers. More often than not the army didn't want to walk through the door until Bob had, which isn't very healthy for Bob as I couldn't see what was on the other side. I ended up using the clay golem as a scout, casting it into the next room and then watching what it did. Slow, but fairly safe.

Going was fairly slow but constant in Normal and NM, it was in Hell that he really shined. Reason for this is that Normal/NM was run on /p8 while Hell at /p1, so Corpse Explosion became available and viable in Hell. By the end of it Bob had quite the army going:

1 might mercenary (Mizan)
1 clay golem
11 skeleton warriors
11 skeleton mages
8 revives

Enough meat shields to keep elemental attacks away from Bob. His three worst enemies were Gloams (of course), Slingers (piercing attack) and Oblivion Knights (IM). Thankfully they never all appeared at the same time.

Diablo II: Guardian Atropos

Note: Proper repost from a previous one

Atropos is my second character from the No Vitality Tournament, and as it turns out also my second only Guardian. Some of you may remember Bob.

For those that aren't in the tournament, the basic premise is that no stat points may be placed into vitality. Equipment and charms that give vitality are fine, just no hard points. This is a single pass, no twinkling tournament (as is the norm).

Atropos is a level 82 Frost Maiden that uses Magic Arrow for cold immunes, so:
Cold Arrow - 20
Ice Arrow - 10
Freezing Arrow - 20
Magic Arrow - 13
Valkyrie - 20
Pierce - 1
Decoy - 2

Also one point in all prerequisites. As you can see I did make a major mistake with the Ice Arrow points. At the time, in Normal, adding points gave me the ability to freeze enemies and deal more damage quicker. I figured that maxing all three cold skills was necessary anyway. After reading up on Frost Maidens a bit more however I realized the freezing length it provides is basically negated in Hell and therefore the 9 extra points there would have been much better off in Magic arrow and Decoy.

Obviously +life and +vitality items were prized and those were equipped before anything else, except maybe lightning/fire resistance items. This resulted in some interesting stat numbers:

Strength: 100 (100)
Dexterity: 330 (345)
Vitality: 20 (20)
Energy: 50 (55)
Life: 272 (749)
Mana: 189 (294)

Equipment
Weapon: Stag Bow - 10-14 cold dmg, 99 poison dmg, +2 bow skills
Boots: Heavy Boots - 40% LR, repair
Helm: Circlet - 27 mana, 14% FR, 14% LR, 44% CR, 14% PR, 17% MF
Armor: 93 life, 30% FR, 30% LR, 21% PR
Amulet: 98 life, 21% resist all
Ring 1: 64 AR, 23% CR
Gloves: Vampirebone - 14% FR, +77% Gold, 23% MF, 5% AR
Ring 2: 9 dex, 30% FR
Belt: Plated - 97 life

Mercenary (Defiance):
Weapon: Cryptic Axe - Malice
Armor: Mesh - 23% FR, 26% CR, 17% FHR
Helm: Tal Rasha's

Bonuses from charms:
189 life, 71 mana, 20 LR, 43 CR, 5 PR, 13 FR, 3 sources of cold dmg

Overall she was a blast to play, but definitely underpowered. Due to being untwinkled the main concern was the dismal amount of non-cold damage she inflicted, so cold immunes in Hell gave her constant headaches. As a completely opposite to Bob, she favored the indoor and cramped areas that forces monsters to bunch up and therefore one arrow would freeze huge packs.

In the beginning only Atropos was a bit overpowered, cold enhanced arrows simply made short work of any monster/boss she encountered. Then Andariel dropped a Dimoak's Hew and suddenly Emilio was even more overpowered, so much so that Atropos wasn't able to add much to any battle before Emilio finished everyone off. As a result until Freezing Arrow was available Atropos was a cheerleader.

As expected cold immunes were terrible, starting in Act V Normal. The terrain had to be used constantly to bottleneck the monster packs so Emilio and the valkyrie could deal with them 2-3 at a time. More than that and Emilio would be in serious need of a doctor...or mortician. This trend continued into Hell until Emilio could get a better weapon. My rune finding was terrible, as I wanted an Insight but never found a Sol nor enough Amns to cube one. So we went with a Malice instead for the OW and increased damage.

For the most part things were safe, but that may have been due to me being extra careful than anything else. Decoy was used liberally as both a scout and a, gasp, decoy to split monster group's attention. Probably cast is a couple thousand times in Hell alone. Also picked up the trick of running away slightly from battle, just enough to get Emilio to follow but not the valkyrie. Allowed me to position him so he wasn't the main focus of attention for the monsters, since he was quite fragile.

There were a few scary moments. City of the Damned contained Stygian Hags, which are cold immune and so are their spawn. They multiplied faster than my crew could kill them. So I took to sprinting through the level looking for the WP. Really not a good idea as I did get cornered at one point, but managed to work my way out. Second troublesome spot was the Ancients, as I just couldn't split them up for the longest time. As a result I almost ran out of gold resurrecting Emilio. Finally I equipped some FRW and that allowed the Ancients to be dealt with one at a time.

Baal himself was an epic battle worth of song, dance and the consumption of much recreational beverages. Atropos had more NDEs than the rest of the Acts put together. Appendages littered the area, Baal was cloned more often than not and Emilio took a dirt nap early (slacker!). But eventually Atropos whittled down Baal's life to nothing after at least 30 trips back to town to restock and heal.

Diablo II: Matriarch Malice

Note: Proper post from a previous one.

Well I recently restarted. This means of course I need a magic finder, so introducing Malice the Meteorb sorceress. She's my very first Meteorb as I normally build a lightning sorceress for magic finding purposes. Wanted something different this time around.

Playing softcore, thankfully. Had I not then Malice's journey would have ended in the Normal Blood Moor, I kid you not. Right at the beginning of the Cold Plains was a pack of 3 Champion Brutes that Flaive attracted my way by shooting at them (and missing I might add). Very tough characters for a level 6 sorceress with purely starting gear and a one point static field/firebolt. Without a merc to distract them I tried to get in close enough to static them a bit, and got too close. A quick stunlock second later Malice was dead, my earliest death ever.

After that auspicious start Malice made good progress through Normal with no other close calls or really interesting issues. Picked up Frozen Orb just before dealing with Mephisto so from then until Nightmare it was a cakewalk.

However Nightmare gave me some problems. Apparently the Diablo gods knows I've restarted and therefore threw as many bosspacks at me as possible, normally in pairs. This lead to a death in the Dark Wood. A might enhanced bosspack of spearwomen snuck up on me under the trees, didn't see them until Malice was sprawled on the ground. Another death to a super fast lighting beetle bosspack in Act II didn't help my confidence in this build much (or my abilities). However everyone seems to swear by it so I stuck with Malice. She started to slow down considerably in the Kurast areas of Act III, but slowly and surely got to Mephisto. Used the tried and true tactic of leaving the mercenary as bait for the boss. Mephisto killed the merc but at the same time Malice was able to static field him a lot. This lead to several minutes of Malice running circles around Mephisto throwing Frozen Orbs. Same tactic used on Diablo and Baal (with some meteor thrown in).

Hell ended up being as long as I expected, even when run at /p1. Of course the first three bosses Malice encountered were fire/cold immune but after that they got more manageable, but FI/CI guys still showed up regularly. Didn't help that she was wearing her magic find gear until Act IV as I forgot it was equipped (explains why her resistances were negative). Once this was corrected she did a bit better until Act V, where every drop was picked up for gold in order to pay for mercenary resurrections. Must have resurrected him at least 50 times in Act V alone. Oddly enough, the regular monsters gave Malice more trouble than the act bosses, both Diablo, Baal and Baal's Minions fell very fast, with Baal requiring 30 seconds tops, and the Ancients were only rerolled twice due to receiving dual fire/cold resistant opponents.

One thing to note is that the WSK did give one of the nastiest monster grouping possible. Dolls and Gloams backed up by Horadrim Ancients. :yikes: A lot of cat-and-mouse was played to draw monsters away from their packs to deal with them in 2-3 sized groups.

Statistics (before equipment)
Level: 82
Strength: 92(72)
Dexterity: 30(25)
Energy: 66(35)
Vitality: 273(268)
Life: 765
Mana: 342
[100 Stat points unused]

Resistances
Lightning: 75
Fire: 73
Cold: 35
Poison: 66

Skills
Fire Mastery, Fireball, Meteor, Frozen Orb: 20
Cold Mastery, Static Field, Teleport, Warmth: 1

Equipment
Helm: Tarnhelm
Armor: Skin of the Vipermagi
Weapon: +2 Fire skills, 20% FCR, 39% Fire Resist Orb
Shield: Lidless Wall
Belt: 22% Light Resist, 9 Str
Boots: 30% Light Resist, 29% MF
Ring1: Nagelring 29%
Ring2: Cold Resist 30%, Poison Resist 28%, Light Resist 5%, 30 Life
Amulet: Maras 30%
Switch: Gull Dagger, Mil's Orb

Mercenary
Helm: Vampire Gaze
Armor: Griswold's Heart
Weapon: Kelpie Snare

Charms (picked up every one I found with resistances): Poison Resist - 50%, Fire Resist - 28%, Cold Resist - 17%, Light Resist - 31%, Mana - 58, Life - 15

Noteable finds: Maras (H Mephisto), Vipermagi (NM Andariel), Lidless Wall (NM Mephisto), Vampire Gaze (rack in NM Durance Lvl 3)

Malice will be used to run Mephisto and Pindle mostly, with maybe some Baal thrown in since he was so much easier than expected. Thinking the next character might be a Plague Javelin Amazon, as I never got to finish my first one as she was a tournament character.

Java: En Guard Update #4

The way the program is currently written it is not very easy to modify or add additional components. Due to all of my work with JTabbedPanes with the CharSi application I decided to make a similar change here. To do this quite a bit of code needed to be altered and consolidated.

Up to this point I had two java files in order to create the GUI portion of the program. I decided to consolidate those two files together into a single java file, especially considering one of them was only 60 lines of code long. Problems came up there as I had used the same variable names for different components in each file so once they were combined the GUI was missing pieces. Eventually everything was ironed out.

The next step was to turn the main panel in to a JTabbedPane and each subsequent tab into it's own java file. Using CharSi as a guide this process was not too complex and left me with two workhorse files, Info.java and Search.java. Info.java contains the GUI portion of the application along with the methods utilized to open and save the informational text files.

Search.java will host a search engine that will allow the informational text files to be searched one at a time for a particular string. The resultant list will be displayed in a JList and when a selection is clicked it's contents will be displayed in a JTextArea. The other change that needs to take place is that the Contact Information field will no longer be a required field. It will still be present but the record may be saved without any information displayed. It simply didn't turn out to be as useful as I had hoped.

Tuesday, October 14, 2008

Diablo II: Lightning Sorceress Skill Layout

A Lightning Sorceress is exactly what it sounds like, a sorceress who uses only lightning skills to deal damage to her enemies. As a result her damage output is staggering but she has real difficulties dealing with Lightning Immune (LI) monsters. The skill setup is as follows:

Charged Bolt - 3
Warmth - 1
Static Field - 1

At level six the character has to main skills, Charged Bolt and Static Field. In Normal difficulty SF can reduce a monster's life to a sliver, so it is used quite often for just this reason. CB is tough to aim and rather mana intensive, so used sparingly. As a result the character will still be using a staff to physically hurt her enemies for the first several levels.

Lightning - 1
Charged Bolt - 9

At level twelve Lightning becomes available. At this point CB is more effective due to the larger amount of bolts that are released. It also deals more damage than Lightning so while it is very mana intensive CB is the skill of choice against large packs, with the stragglers deal with by a few staff hits.

Charged Bolt - 10
Lightning - 5
Chain Lightning - 1

At level eighteen Chain Lightning becomes available. This is the ultimate crowd control for this build, especially against packs that spread out as they attack, Flayers for example. Lightning is also becoming a more viable attack skill with the added points. Mana will remain a problem here so solitary monsters are still dealt with by the staff, while the character will be drinking mana potions constantly.

Telekinesis - 1
Teleport - 1
Chain Lightning - 6

At level twenty-four Teleport becomes available. At lower levels it isn't used too much, however does allow the character to reposition the mercenary as needed or pull him/her out of trouble at a moments notice.

Lightning - 10
Lightning Mastery - 1

At level thirty both Lightning and Chain Lightning have become viable skills, even with the large mana consumption. They are dealing enough damage that only a few hits are needed to eliminate any monsters, so while mana potions are in constant need the character isn't running out of mana every few seconds.

Chain Lightning - 10
Lightning Mastery - 20

Lightning Mastery is maximized first as it helps both of the main skills, Lightning and Chain Lightning, at the same time. This is completed by level fifty, which correlates to the first act or two of Nightmare difficulty.

Lightning - 20

At level fifty-nine Lightning is completed. This will be used as the main skill versus bosses as well as closely grouped monster packs. In the end this skill's damage will be about twice as great as Chain Lightning so in many circumstances is the skill of choice.

Chain Lightning - 20

At level sixty-seven Chain Lightning is finished and the two main skills for this build are fully charged. Chain Lightning is used in circumstances where the monsters are spread out and a single Lightning burst wouldn't damage more than 1-2 at a time. Instead of dealing with monsters one at a time this skill will target all of them at once, assuming they are within the same line-of-sight.

Frost Nova - 1
Frozen Armor - 1
Nova - 1
Thunder Storm - 1

At level seventy-one a few utility skills become available. up to this point Lighting Immune monsters have been few and far between, but all of that changes in Hell difficulty. As a result Frost Nova is utilized to chill and slow down the LI hordes while the mercenary deals with them one at a time. It won't do much damage, but that is fine since the chilling effect is the intent of the skill. Thunder Storm is another utility skill that won't do a great deal of damage but is useful enough to invest a single skill point. Thunder Storm randomly targets monsters so it won't be used to eliminate a wanderer. Instead it is useful as a early warning system when monsters become near as well as a way to put the weaker monsters (fallen, flayers) into hit recovery. Frozen Armor is used purely to chill monsters that get within melee range of the character. They should be slowed enough to allow the character to exit hit recovery mode and then either run or teleport to safety.

Charged Bolt - 20

At level seventy-nine a synergy for both Lightning and Chain Lightning is completed and this build's damage is pretty much completed. All that is left is to put the remaining points into Nova, which is another synergy for the lightning skills.

Final Skill Distribution:

Charged Bolt - 20
Lightning - 20
Chain Lightning - 20
Lightning Mastery - 20
Thunder Storm - 1
Teleport - 1
Warmth - 1
Frozen Armor - 1
Frost Nova - 1
Nova - rest

Friday, October 3, 2008

Diablo II: The Obsession Tournament

As per the name, in Obsession Tournament obsession is the name of the game. Choose a skill and then you are required to max it and all of its synergies out before choosing another skill. The same holds true for stats, choose either Strength, Dexterity, Vitality or Energy and four out of five stat points must be placed there each time the character is leveled up. Along with these restrictions there are equipment rules as well. An element is also picked and then all equipment used must reference this element in some way, same holds true for the attribute selected.

I choose an Amazon named Mercury who would be obsessed with Plague Javelin, Lightning and Vitality. Going started slow as both javelins and armor were lacking for most of Act I. This was Ok since the main attack isn't even usable yet, so still progressing but slowly. Only against Andariel did Plague Javelin become available, but from there onward things became much easier. The normal monsters were tanked by the Act II town guard while Mercury poisoned them all from afar. The only problems appeared from Act bosses who killed off the mercenary. Mercury would run circles around them and throw javelins periodically to keep the poison acting at all times. Very slow way to whittle down a boss' life, but eventually they fell.

One extra rule that caused me problems is that all equipment used must be of the type equal to the difficulty the character is in. Therefore in normal regular equipment is used but in Nightmare the character must have all exceptional equipment, and so forth. This means starting Nightmare Mercury was basically naked and starting from scratch.

Once Plague Javelin was maxed out Mercury moved on to maxing Valkyrie for an additional tank to help out the mercenary. He's been getting swarmed up to this point and needs help surviving monster mobs. Mercury got to Hell and then suddenly realize I poorly planner her out. She didn't have the strength/dexterity to wield an elite javelin. As a result she would have to punch her way to Baal. Tried this up to the Cold Plains and then called it quits and retired, took far too much time. This of course is a good lesson for me, plan out the character way in advance before starting to ensure something like this never happens again.

To redeem myself I started Wraith, an Assassin obsessed with Strength, Poison and Cloak of Shadows. The idea was that CoS would keep her alive in the most dire of circumstances and then she could obsess in an offensive skill afterwards. Unfortunately I never got that far. Wraith met her end at level 22 to the lightning beetles of Act II Normal. Her lightning resistance was at 40% but with so many charged bolts flying around she couldn't drink health potions fast enough.

This lead to the third and final character of mine in this tournament; Rayne the sorceress obsessed with Vitality, Lightning and Static Field (then Firewall). Her basic strategy was static field like mad while the mercenary tanked, then firewall the remaining monsters. This worked wonders in Normal where SF can actually kill monsters. Nightmare had problems as SF can only reduce monster life to 1/4 their total. However Rayne didn't get much of a chance to see how NM would go, she met her end to a Might enhanced, Extra Fast, Extra Strong, Cursed Treadhead in the Dark Wood. The mercenary died within seconds and Rayne couldn't outrun the pack.

That ended this tournament for me, I had just restarted a week or two earlier and wanted to concentrate on Softcore characters and magic finding for a while.

Diablo II: The Afterlife Tournament

The Afterlife Tournament is another from Wolron, all which are quite interesting. This tournament has restrictions on both skills used and stat points assigned per character type. I choose a Sorceress and as a result was restricted to the Lightning skills, with only a single point allowed to vitality/strength per character level. The only equipment allowed to be used was either ethereal or had the word "angel", "radiance", or "rainbow" in it.

Angela started her quest off by punching all of her monster enemies, since she doesn't start with any ethereal weapons. This was quite a new experience and lasted her quite a while into Act I before decent skills became available (Lightning). Once she did have her skills then progress went swimmingly, as pure lightning sorceresses are traditionally overpowered.

She kept having to dodge monster packs and teleport to safety. Apparently I had great difficulty keeping Angela out of harms way, as more often than not she's on the front lines with the mercenary behind her rather than in front. Still she progressed all the way to Act III of Nightmare before meeting her end. She was walking through the sewers underneath the Kurast Bazaar when she ran into a pack of monsters she couldn't see. They were hidden by one of the walls. Still Angela let loose with a Chain Lightning strike just as she heard their attack and realized they were dolls. The entire group exploded as one and took Angela along with them. As it turned out I ended up with the second highest Angel(sorceress) of the tournament at level 61, beaten out by Grisu who Guardianed his Angel.