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