Tuesday, November 27, 2007

Diablo II: Necromancer Summoner Skill Layout

Also known as the Fishymancer, a Necromancer that uses summons to fight is a typical build in Diablo II. There are many variations of such builds; relying on just skeletons, golems or revives. Personally I want as many meat shields as possible for the character, so a combination of all three is used. The skill setup is as follows.

Raise Skeleton - 20
Skeleton Mastery - 20
Raise Skeletal Mage - 20
Corpse Explosion - 20
Summon Resist - 1
Decrepify - 1
Revive - 1
Attract - 1

As well as a single point in all of the prerequisites. I like to provide a breakdown of when each skill point is allocated.

Raise Skeleton - 2
Amplify Damage - 1
Skeleton Mastery - 1
Clay Golem - 1

At level 6 the character will have three skeleton warriors (1 due to starting wand) and a clay golem to deal the necessary damage. This isn't enough to progress quickly, so the character will be engaging in melee combat for the beginning portion of Act I. Monsters are first cursed with Amplify Damage and then engaged in combat.

Raise Skeleton - 7
Golem Mastery - 1
Raise Skeletal Mage - 1

At level twelve the character has four skeleton warriors, one clay golem and a skeleton mage for company, along with the mercenary. The character will still need to engage in melee combat, but the burden of engaging mobs is no longer present.

Raise Skeleton - 9
Skeleton Mastery - 5

At level 18 the character is ready to take on Andariel, with an additional skeleton warrior. The points in Skeleton Mastery will make the summons strong enough to withstand a few hits by Andariel so they don't crumble instantly. Luckily there are always several carver packs right near her, so resummoning any defeated minions is simple.

Raise Skeleton - 12
Weaken - 1
Terror - 1
Summon Resist - 1
Decrepify - 1

At level 24 Decrepify becomes available, which will be used against all act bosses from here to the end of questing. Decrepify, along with a clay golem, will slow the boss down to such a point where they are dealing very little damage to the summons. An extra skeleton warrior is also obtained, giving a total of 9 companions for the character. At this point the character doesn't need to engage in melee combat and can instead sit back cursing monsters and picking up items while the summons do the dirty work. Duriel should be extremely easy to overcome.

Raise Skeleton - 20
Skeletal Mastery - 20

The next objective is to maximize Raise Skeleton to have as many minions as possible. To that end equipment with +summon skills mods are highly sought after. Shopping for wands is advised, as is using the imbune quest reward from Act I on a necromancer head (shield). By the end of the first difficulty level the character has reached level 45 and has at least nine skeleton warriors, one skeletal mage, one clay golem and a mercenary at their disposal.

Bone Armor - 1
Blood Golem - 1
Iron Golem - 1
Revive - 1
Dim Vision - 1
Confuse - 1
Attract - 1
Teeth - 1
Corpse Explosion - 1

Up to level 52 the utility skills are obtained, each will only receive a single point overall and allow plus skill mods on equipment to provide any additional bonuses, except Corpse Explosion of course. However Corpse Explosion will not receive any additional points quite yet. Normally Normal and Nightmare are run at 'players 8', so CE has limited effectiveness due to it's damage not scaling accordingly. Therefore it will only be used as a body disposal skill for reviving monsters.

Raise Skeletal Mage - 20

Next comes mages as minions. They are not anywhere as useful as skeleton warriors due to their lower Hit Points and damage output. However the character can have as many of them as warriors and they can easily act as extra meat shields to keep the monsters off of the player character. Along the way it is suggested (if RWM) to obtain an Insight polearm for the mercenary (Act II Might, NM). Revives are going to be used and they are very mana intensive and require constant recasting, so to avoid stockpiling mana potions the Insight will solve all mana issues immediately. It's only a suggestion however, Insight is not critical to the character's success, but it does make managing 10+ revives much easier.

Corpse Explosion - 20

At level 69 all summon skills are finished and work can now begin on Corpse Explosion, which should take until level 83 to maximize. It is assumed that in Hell the player will lower the settings to 'player 1 or 3', which will make CE an extremely effective mob killer and speed up the character's progress exponentially. Normally when entering Hell the character will have the ability to summon 11-12 warriors/mages, a clay golem and 8-10 revives, along with the always present mercenary. The player character shouldn't be injured very often. The monsters to watch out for are Black Souls (piercing lightning attack) and Slingers (piercing physical attack). Also reviving monsters should have their corpses exploded, otherwise it is very likely monsters will be revived behind the lines right next to the character.

No pieces of equipment are vital to the success of this character. A general rule is that +skill pieces are more desired over resistance providing equipment. With the amount of friendly minions in the game, any elemental attacks will be absorbed by them long before they reach the player character (except Black Soul lightning of course).

Monday, November 26, 2007

Diablo II: No Vitality Tournament

The concept of the No Vitality tournament is simple, no stat points are allowed to be placed in vitality at all. This is the only restriction. Equipment and charms that add to life or vitality are fine to be used at any time. For obvious reasons equipment with +life/vitality mods are highly sought after.

Regardless of which character is chosen life will be an issue, so I decided on a non-melee character to ensure a decent showing in the tournament. The character would be the same as my All Alone character, a summoning Necromancer. That character wasn't anywhere near as boring as I thought it would be, so I wanted to try again and see how far I could go. I expected this character to be a bit easier due to the mercenary being available to get the army started. The main problem was going to be balancing +life and resistance equipment to ensure survivability. I think I did fairly well in that regard.

As it turned out this Fishymancer, named Bob, became my very first Guardian. I won't go into depth on what happened while questing, I did that quite fine in my Guardian thread in the SPF.

I don't play Hardcore outside of the SPF tournaments, so I'm not sure what to do with Bob. Most likely he'll just sit there as a reminder that I can actually solve the game without dying eight thousand times. Some incentive to play smarter is always nice.

Wednesday, November 21, 2007

Java: DII Character Simulator Update #3

I started to attach JTextFields, JComboBoxes and so forth between the different tabbedpanels. While doing so it started to get quite confusing as to what variables needed to be modified when a component's value changed. There was quite a bit of references between tabbedpanels and at this point I had to stop. I had plans of separating the Skills panel into seven separate panels, one for each character type. Since I was starting to reference variables from the Skills panel for the Stats panel, that separation had to be done before anything else.

This was not simple by any means. Each character received a variable in the Skills panel that is called when the corresponding value is chosen in the JComboBox for character selection. Originally I wanted to simply have these character panels extend JPanel and create a panel that is automatically added to the main program. As it turned out, an easier way was to pass a panel from Skills to the character sub-panel and allow that panel to be the framework for the character skill display.

After that is was simply a matter of copying the first character panel into 6 more copies and changing a few variable names. Along with this the Save button that was initially used to populate the characterField JTextField in the Stats panel was removed. The logic behind the button was Incorporated into the character panels. This lead to a new problem, a NullPointerException error occurs when the program is launched. NullPointerException occurs for one of a few reasons:
  • Calling the instance method of a null object
  • Accessing or modifying the field of a null object
  • Taking the length of null as if it were an array
  • Accessing or modifying the slots of null as if it were an array
  • Throwing null as if it were a Throwable value
In this case the second option was the culprit. The Skills panel is initialized before the Stats panel and Skills is giving the Stats variable characterField a value. It would have been possible to remove characterField from Stats and initialize it in Skills instead, but since that variable has nothing to do with the Skills panel that was avoided. Instead the solution was to change the order of the tabbedpanel creation. Stats would be generated first, followed by Skills and then lastly by Equipment.

With that out of the way the listeners for all 210 JComboBoxes in Skills had to be created and then linked to associated int arrays to store the selected data. While time consuming, it wasn't extremely difficult to do. In the end I was also able to put in checks to ensure that a skill wasn't assigned points if it's requirements did not already have points assigned. If that is the case an error message is generated.


This basically finished off the groundwork for the Skills tab. All that is left is to locate the equations that govern each of the 210 skills and create a separate method for each. These equations must be stored somewhere, I'm hoping the good folks at Diabloii.net will be able to point me in the right direction. I'm hoping it is an equation that drives each skill. If not then I'll have to store each skills values in an array of arrays and then create my own equation to generate the necessary information.

Once this is done I'll have a standalone skill calculator ready to go.

Tuesday, November 6, 2007

Java: DII Character Simulator Update #2

The third and final piece of the GUI for the character simulator is completed. This won't be the last page to be made, but for the initial application attempt this will suffice. Thanks to the lessons learned making the Equipment tab the format was much easier to setup with the GroupLayout manager.

I took the LCS of the Diablo II program as a template and then added any information I felt was necessary for display purposes. The first few subpanels were fairly basic, the Misc mods, Mods of note and Resistance panels were for pure display purposes. It was the other panels that required extra components.

Originally I was going to create the Stat panel with JTextFields and have the user enter in the amount of points to add to each characteristic, then a "Calculate" button would need to be pressed to add the needed info. This unfortunately didn't take into account removing points as a user played with the virtual character's setup. So instead I followed the setup of the LCS and used buttons, one plus and one minus, for adding/subtracting stat points. GroupLayout was of course utilized to arrange the JLabels and JButtons into an appropriate order.

This was however only part of the subpanel. There was also the display of the sum of remaining stat points that needed to be added. The subpanel was actually governed not by GroupLayout but by BorderLayout with the GroupLayout section in the center and a FlowLayout in the southern portion containing the JLabel/JTextField combination that displays remaining stat points. The same layout setup was used for the Damage subpanel, with its JComboBox for skill selection component taking up the southern portion of the subpanel.

The last subpanel to be added was the Skill Info section. It occurred to me that there is not a place in the Skill Planner tab to view the properties of each of the skills once points have been allocated. I could have placed a JTextArea at the bottom of the page with this information, but I thought that would ruin the layout of each page. So this feature is added to the Stat panel instead, so that damage and effects of each skill may be viewed, taking into account bonuses from the equipment the virtual character is wearing.


This completes the first phase of the application's development. With the GUI completed I can now begin work implementing listeners and functionality to all of the JComboBoxes, JButtons, JCheckBoxes, JTextFields and JTextAreas. There is a limited amount of pieces that can be tied together before data is required, but as much as possible will be implemented.

Friday, November 2, 2007

Java: DII Character Simulator Update #1

Creating the GUI interface for the DII Character Simulator was the next step in this applications development. Unlike in the original draft I decided against using a JComboBox to change between equipment types. Instead I used a nested JTabbedPane for a more professional look.

Of course this became the first obstacle in that I wasn't sure how to nest a JTabbedPane instead of an already existing JTabbedPane. First attempts lead to the tabs showing up, but in a vertical line instead of horizontally, and also leaving quite a bit of wasted white space on the edges. The problem was that the Equipment class was extending a JPanel, so when this was changed to extend a JTabbedPane everything worked out nicely.

Each piece of the GUI was created in its own method and hosted on a separate JPanel, so that they could be organized and formatted independently. As work began a combination of JCheckBoxes (first time this component has ever been used by me), JButtons, JScrollPanes and JLists (also a first) was organized into the needed GUI pieces. The JList component took some research to locate as the component that would do the job I needed. Set to allow only a single selection, this component is the cornerstone to how equipment will be added (and removed) from the virtual character.

Once all of the components were created, the next task was to combine them all into a single JPanel for display purposes. This turned out to be more of a problem than anticipated. Due to the success of the GroupLayout manager with the skill panels I felt this would be the format needed to create the look and feel of the equipment panels. The problem that arose is that I have only 5 components and didn't want to leave any extra white space. The GroupLayout manager kept cutting off part of one of the components, the ItemList Panel, as I was unable to extend this panel vertically. Everything apparently has to remain in their separate rows, no overlap allowed.

Next attempt was a FlowLayout manager, but getting all of the items to line up vertically simply wasn't working. The components would push each other out of the program window. Finally I settled on a compromise. Two panels were created with the GroupLayout manager that each had two components lined up vertically. The third panel, the one containing the ItemList panel was created with FlowLayout manager. Then all three panels were added to the main panel, also using the FlowLayout manager.


I most likely used more panels and layout managers than necessary, however the final result is quite nice and the code isn't too jumbled, so I'm fine with how things worked out. Once the code was finished for the first equipment type, the helm, it could be carbon copied for all of the other equipment items. The only changes came with the weapon panel, where an option to dual wield was added to the ButtonPanel via a JCheckBox and the other change was the jewelry panel, where some of the selection options were removed or renamed such as elite/exceptional/ normal quality options do not apply.

The next step will be to create the final statistic display that will replace the LCS.

Thursday, November 1, 2007

Java: Hotline Update #4

Yet again more changes to the Hotline program. It is only a single change this time and was done in a previous update so the groundwork has already been laid. Specifically a new button needs to be added. I actually tried to argue against adding this button as once again this will leave blank spots that isn't too pretty. But since no one else seems to be worrying about this I guess I can't either.


In order to add the button a few changes were required. First the OptionPanel required a new JButton to be added, along with its associated listener, and then the GridLayout adjusted to be 6x4 instead of the previous 5x4. What I didn't realize is that by doing so the main frame would need to be extended as well. So originally the button labels were shortened due to not having enough horizontal space to fully display.

The other main change required was to alter the ReportPanel's main If/Else statement to incorporate the new button option. The previous change from the last update now needed a qualifier at the end of its If/Else section:

else if (Integer.parseInt(targetMonth) <> 9 && Integer.parseInt(targetYear) == 2007)

Then the current update could be tacked onto the end of the statement with no qualifier and would only come into play starting November 1st, 2007, which is when it will be introduced to the Call Center.

The only hitch came when call center representatives attempted to open the program after the update. Some received a message stating they could not find the main class. This was resolved by updating the version of Java on their computers to the latest copy.