Previously this program relied upon a brute strength method of comparing a given IP with a list of previously provided IPs. Some of these IPs were classes and large ranges and were converted to a longer list of single IPs before the comparison took place. As one can imagine this is not the ideal way to go about the process as it can take minutes to compare a Class B range and Class C ranges actually crash the program itself.
Recently it became necessary to add a Class B range to the list of IPs to be compared to, so a solution to this problem was needed to allow the program to remain viable. So the entire block of code regarding comparison of IPs was rewritten, with very little of it being reused. Comparison of Ips would be done in steps where each octet was compared to each other rather than the entire IP at once. The input and list IPs were split up into arrays of integers, one slot for each octet of the IP. For those that were classes or ranges there was one array for the beginning of the IP range and one array for the end.
Once the IPs were stored in this manner their first octets were compared and if the given IP range fell within the list's IP range then a boolean variable was set to true, signifying that a match was found.
if(beginUserIP[0] > endCompareIP[0] || endUserIP[0] <>
match1 = false;
else
match1 = true;
This was done for all four octets. Then if all of the variable were true the given IP matched, if not then it did not match the list IP range and the next IP range on the list was taken and the process repeated all over again.
As it turns out this process only requires at most a second to run through the entire restricted IP list, and this includes having some Class A ranges in the list. Also helps that this reduced the amount of code in the program by several dozen lines, considering how small the program is that is rather nice. I don't see any additional changes that need to be made to this program, it is very basic and now all of the bugs are worked out of it so no new updates should be forthcoming.
Tuesday, April 28, 2009
Monday, April 27, 2009
Java: Hotline Update #10
Another month, another round of changes to the Hotline program. Again, these changes weren't anything significant. Basically three of the options were removed and replaced by three new options. As such this entailed new JButtons to be created with associated listeners, and a new piece to the If-Else statement in the ReportPanel class to handle this new variation to the call options.
Along with this I decided to get cute and inserted an easter egg into the program. Originally I was thinking a blank JButton in the OptionsPanel class to initiate the easter egg. However that seemed a bit obvious and would definitely be noticed by management, so I had to come up with another way. I settled on having the easter egg accessed via the report section, specifically when a report is run covering February 30-31st or some combination of this date range. Since these dates don't exist it won't interfere with legitimate business.
The easter egg is purely a little game. Several windows appear in succession that require an OK button to be clicked. When they are all gone a new window appears displaying the time it took to clear these windows. A lowest score is saved in a text file on the server and is compared to the individual's score, if they are lower then their score replaces the current one.
I'm going to let the reps find it on their own, but may give a slight hint to get them started.
Along with this I decided to get cute and inserted an easter egg into the program. Originally I was thinking a blank JButton in the OptionsPanel class to initiate the easter egg. However that seemed a bit obvious and would definitely be noticed by management, so I had to come up with another way. I settled on having the easter egg accessed via the report section, specifically when a report is run covering February 30-31st or some combination of this date range. Since these dates don't exist it won't interfere with legitimate business.
The easter egg is purely a little game. Several windows appear in succession that require an OK button to be clicked. When they are all gone a new window appears displaying the time it took to clear these windows. A lowest score is saved in a text file on the server and is compared to the individual's score, if they are lower then their score replaces the current one.
I'm going to let the reps find it on their own, but may give a slight hint to get them started.
Wednesday, April 22, 2009
Diablo II: Fanatic Zealot Skill Layout
A Fanatic Zealot is a Paladin that utilizes the Zeal attack and Fanatic aura to enhance his physical attack. This build deals purely physical damage to monsters and as such needs a backup skill, such as Vengeance, or specialized equipment, such as Reapers Toll, in order to deal with the physically immune monsters of Hell. The skill setup is as follows:
Might - 1
Sacrifice - 1
Smite - 1
Holy Bolt - 1
At level six this character is utilizing the Might aura in order to amplify his damage. For the low level monsters encountered at this point this is quite adequate to keep progress moving at a decent pace. As Might isn't a synergy for the endgame skills only a single point is placed here.
Blessed Aim - 1
Zeal - 1
Charge - 1
Now at level twelve Zeal becomes available as the character's main attacking skill. This allows multiple monsters to be targeted at the same time, as well as increasing the damage of each attack. Still only a single point Might aura is utilized so progress will most likely slow down a bit at this point as skill points are used mostly on prerequisites so far.
Zeal - 7
Blessed Hammer - 1
Concentration - 1
At level eighteen the character trades in a single point Might aura for a single point Concentration aura. The damage dealt is not increased significantly, but the chance of having the zeal cycle interrupted is reduced dramatically. Along with this the Zeal skill is pumped which adds to the damage done as well as the number of targets that can be hit per cycle. As such the character's progress should increase again to acceptable levels.
Zeal - 13
Holy Shield - 1
At level twenty-four the character is able to utilize the Holy shield skill. As the length of time it will remain is low and mana cost high this skill will only be used in extreme circumstances at this point, such as against Act bosses. Zeal is also increased as the character's level increases, allowing progress to remain smooth.
Zeal - 20
Fanaticism - 2
At level thirty Fanaticism becomes available and replaces Concentration as the aura of choice. At level thirty-one Zeal is maxed as well. With Fanaticism the character's attack becomes faster and additional damage modifiers are added to his attack, helping him deal with the increased Hit Points of the monsters in the later acts.
Fanaticism - 20
At level forty-nine Fanaticism is maxed and the character has received the bulk of the enhanced damage modifiers possible. As such his damage is significant and will allow him to deal with virtually any monster pack encountered.
Holy Shield - 10
Vengeance - 1
Sacrifice - 20
At level seventy-one Holy Shield has been increased to allow it's use in normal questing. Now its charge will last for a few minutes at a time and as such can be used in all circumstances rather than only against act bosses. As such the survival of the character is increased exponentially with the better block rate and multiplied defense rating that Holy shield provides. Vengeance is also given a single point as the answer to physical immune monsters. Preferably the character will have an equipment answer to PIs, but if any unbreakable ones are encountered he will have a way to deal with them with Vengeance. Along with this Sacrifice, a synergy for Zeal, is maxed and as a result increased the damage dealt by the character significantly.
Holy Shield - 20
At level seventy-nine Holy Shield is maxed to allow the highest possible bonus to blocking percentage. This allows the character to have what is basically 75% resistance to physical attacks with a blocking percentage of the same value. Depending on equipment worn this could also push the character's defense rating past the ten thousand mark, which is the magic value when monsters begin to have difficulties successfully attacking the character. That coupled with the max block rating allows the character able to tank even the most dangerous monster packs. From this point onward the character can place points into Defiance as a synergy for Holy Shield. This will increase the defense rating of the character that much more and increase his survivability.
Final Skill Distribution:
Zeal - 20
Sacrifice - 20
Fanaticism - 20
Holy Shield - 20
Vengeance - 1
Defiance - rest
Might - 1
Sacrifice - 1
Smite - 1
Holy Bolt - 1
At level six this character is utilizing the Might aura in order to amplify his damage. For the low level monsters encountered at this point this is quite adequate to keep progress moving at a decent pace. As Might isn't a synergy for the endgame skills only a single point is placed here.
Blessed Aim - 1
Zeal - 1
Charge - 1
Now at level twelve Zeal becomes available as the character's main attacking skill. This allows multiple monsters to be targeted at the same time, as well as increasing the damage of each attack. Still only a single point Might aura is utilized so progress will most likely slow down a bit at this point as skill points are used mostly on prerequisites so far.
Zeal - 7
Blessed Hammer - 1
Concentration - 1
At level eighteen the character trades in a single point Might aura for a single point Concentration aura. The damage dealt is not increased significantly, but the chance of having the zeal cycle interrupted is reduced dramatically. Along with this the Zeal skill is pumped which adds to the damage done as well as the number of targets that can be hit per cycle. As such the character's progress should increase again to acceptable levels.
Zeal - 13
Holy Shield - 1
At level twenty-four the character is able to utilize the Holy shield skill. As the length of time it will remain is low and mana cost high this skill will only be used in extreme circumstances at this point, such as against Act bosses. Zeal is also increased as the character's level increases, allowing progress to remain smooth.
Zeal - 20
Fanaticism - 2
At level thirty Fanaticism becomes available and replaces Concentration as the aura of choice. At level thirty-one Zeal is maxed as well. With Fanaticism the character's attack becomes faster and additional damage modifiers are added to his attack, helping him deal with the increased Hit Points of the monsters in the later acts.
Fanaticism - 20
At level forty-nine Fanaticism is maxed and the character has received the bulk of the enhanced damage modifiers possible. As such his damage is significant and will allow him to deal with virtually any monster pack encountered.
Holy Shield - 10
Vengeance - 1
Sacrifice - 20
At level seventy-one Holy Shield has been increased to allow it's use in normal questing. Now its charge will last for a few minutes at a time and as such can be used in all circumstances rather than only against act bosses. As such the survival of the character is increased exponentially with the better block rate and multiplied defense rating that Holy shield provides. Vengeance is also given a single point as the answer to physical immune monsters. Preferably the character will have an equipment answer to PIs, but if any unbreakable ones are encountered he will have a way to deal with them with Vengeance. Along with this Sacrifice, a synergy for Zeal, is maxed and as a result increased the damage dealt by the character significantly.
Holy Shield - 20
At level seventy-nine Holy Shield is maxed to allow the highest possible bonus to blocking percentage. This allows the character to have what is basically 75% resistance to physical attacks with a blocking percentage of the same value. Depending on equipment worn this could also push the character's defense rating past the ten thousand mark, which is the magic value when monsters begin to have difficulties successfully attacking the character. That coupled with the max block rating allows the character able to tank even the most dangerous monster packs. From this point onward the character can place points into Defiance as a synergy for Holy Shield. This will increase the defense rating of the character that much more and increase his survivability.
Final Skill Distribution:
Zeal - 20
Sacrifice - 20
Fanaticism - 20
Holy Shield - 20
Vengeance - 1
Defiance - rest
Friday, April 17, 2009
Diablo II: Patriarch Silverbolt
Silverbolt is a Fanatic Zealot, a Paladin that utilizes the Zeal attack and Fanaticism aura to enhance his physical attack. This is the type of character that requires a good, high damaging weapon in order to be effective. It's a very simple build with few variations, normally in the area of how to deal with physically immune monsters. Mine followed the mainstream concept of maximizing damage output above all else.
Silverbolt started off untwinkled, as per the norm, but with the plan to upgrade his weapon early
and often in order to keep his damage as high as possible. Progress in the beginning was slow but steady as the first act of Normal normally doesn't have any major obstacles I haven't seen before. Silverbolt progressed through nicely and with the addition of some lightning/fire resistance charms was able to tank the lightning beetles of Act II and shaman of Act III comfortably.
Still his progress the farther into Normal he got was slower and slower. And this with the constant twinkling of weapons: Bladebone to Rusthandle to The Chieftain to Steeldriver to Hand of Blessed Light. As such the mobs of monsters couldn't simply be engaged head on after Act I, they would swarm too much and overwhelm our hero. Instead Silverbolt could be found hiding behind his trusted Desert Warrior mercenary and letting the more hardy companion soak up as much damage as possible. Environmental obstacles were also used to great effect in this regard, such as the doorways of the Act II tombs.
AS expected Act IV lead to a fair amount of close calls, but no NDE until Silverbolt was suddenly surrounded by spawners and their kin. With a pillar to his back Silverbolt had no where to run and ran out of potions before the spawners ran out of kids. Dying in Normal really wasn't part of the plan, but it did show some overconfidence on my part as a boss pack of spawners really needs to be handled a bit more delicately, no matter the difficulty. After that Silverbolt was able to complete out the difficulty without any other dire circumstances, including fights against Diablo and Baal.
This brought him to Nightmare, at level 45. Here just about all of his end game equipment could be worn, and was. All that was missing was his weapon, boots and gloves. Even though his damage output didn't grow considerably, his defensive ability gained an exponential boots. Max block was suddenly very possible along with 90% resistance to all elements. As a result Silverbolt blew through all of Nightmare difficulty with almost no problems. In fact he used only three health potions the entire difficulty, not counting any that went to the merc of course. He did get caught once by an Oblivion Knight in mid-zeal cycle in the Chaos Sanctuary, from which death was the only outcome. I truly thought all of the OKs were farther away, otherwise I would never have tried to zeal in their presence.
Upon entering Hell both Silverbolt and his mercenary, a Might Desert Warrior, were almost full equipped, all that was missing was the merc's Reaper's Toll. This was my answer to the physically immune monsters that would be encountered, namely Ghosts, Swarms and unique bosses. Silverbolt's single point in Vengeance was purely for any unbreakable PIs. Silverbolt took Hell at P3, as I had a feeling he could handle it. He could, all the way through.
Tactics were reversed from NM, Silverbolt was in front tanking the monster mobs while his mercenary hung behind and poked them with his polearm but mainly remained in a safe position. Due to max block and around 11k defense Silverbolt was as much a tank as possible. That coupled with a decent amount of life leech meant he could survive almost any mob encountered head-on. The only monsters he let the mercenary lead was against Ghosts so they didn't drain his mana away.
Silverbolt did keep the trend going with a single death in Act IV. I was being careful and using Vengeance only in the Chaos Sanctuary. However while swinging against a Doom Knight one of those mana draining wisps drained away all of Silverbolt's mana almost instantly (it was low to begin with). At almost the exact same time an Oblivion Knight cursed him with Iron Maiden. So when Silverbolt's swing landed home he died, or his swing after killed him. Either way an unfortunately chain of events conspired to Silverbolt's only death in Hell. From there onward he ripped through the rest of the difficulty without any other unfortunate occurrences. Baal and his minions were almost anti-climatic after all the effort of getting to the World Stone Keep in the first place. Especially since the Throne Room consisted of Dolls, OKs and the Witches that kept Silverbolt cursed the entire level. At least that overrode Iron Maiden, the only plus possible.
No plans to do anything else with Silverbolt. I did find a Lower Kurast map with two campfires for him. It's possible I'll use him for LK running to pop all chests/logs/bodies in the area once and a while. I'm not really going to try for thousands of runs with him, since a single run takes a few minutes easily. Other than that Silverbolt will retire comfortably.
Stats:
Level 84
Strength - 105(126)
Dexterity - 78(106)
Vitality - 317(352)
Energy - 15(15)
Life - 1157(1357)
Mana - 139(317)
Lightning Resistance - 90
Fire Resistance - 90
Cold Resistance - 88
Poison Resistance - 57
Skills:
Zeal - 20(28)
Fanaticism - 20(26)
Sacrifice - 20(28)
Holy Shield - 20(28)
Vengeance - 1(9)
Defiance - 7(13)
Equipment:
Weapon: Heaven's Light (Amn-Shael)
Armor: Guardian Angel (Ort)
Shield: Herald of Zakarum (Pdiamond)
Boots: Gore Rider
Belt: String of Ears
Gloves: Laying of Hands
Helm: Rockstopper (Thul)
Ring 1: Raven Frost
Ring 2: Angelic Halo
Amulet: Angelic Wings
Mercenary (Might Desert Warrior)
Helm: Vampire Gaze
Armor: Duriel's Shell
Weapon: Reaper's Toll
Hellforge
NM - Io
Hell - Fal
Silverbolt started off untwinkled, as per the norm, but with the plan to upgrade his weapon early

Still his progress the farther into Normal he got was slower and slower. And this with the constant twinkling of weapons: Bladebone to Rusthandle to The Chieftain to Steeldriver to Hand of Blessed Light. As such the mobs of monsters couldn't simply be engaged head on after Act I, they would swarm too much and overwhelm our hero. Instead Silverbolt could be found hiding behind his trusted Desert Warrior mercenary and letting the more hardy companion soak up as much damage as possible. Environmental obstacles were also used to great effect in this regard, such as the doorways of the Act II tombs.
AS expected Act IV lead to a fair amount of close calls, but no NDE until Silverbolt was suddenly surrounded by spawners and their kin. With a pillar to his back Silverbolt had no where to run and ran out of potions before the spawners ran out of kids. Dying in Normal really wasn't part of the plan, but it did show some overconfidence on my part as a boss pack of spawners really needs to be handled a bit more delicately, no matter the difficulty. After that Silverbolt was able to complete out the difficulty without any other dire circumstances, including fights against Diablo and Baal.
This brought him to Nightmare, at level 45. Here just about all of his end game equipment could be worn, and was. All that was missing was his weapon, boots and gloves. Even though his damage output didn't grow considerably, his defensive ability gained an exponential boots. Max block was suddenly very possible along with 90% resistance to all elements. As a result Silverbolt blew through all of Nightmare difficulty with almost no problems. In fact he used only three health potions the entire difficulty, not counting any that went to the merc of course. He did get caught once by an Oblivion Knight in mid-zeal cycle in the Chaos Sanctuary, from which death was the only outcome. I truly thought all of the OKs were farther away, otherwise I would never have tried to zeal in their presence.

Tactics were reversed from NM, Silverbolt was in front tanking the monster mobs while his mercenary hung behind and poked them with his polearm but mainly remained in a safe position. Due to max block and around 11k defense Silverbolt was as much a tank as possible. That coupled with a decent amount of life leech meant he could survive almost any mob encountered head-on. The only monsters he let the mercenary lead was against Ghosts so they didn't drain his mana away.
Silverbolt did keep the trend going with a single death in Act IV. I was being careful and using Vengeance only in the Chaos Sanctuary. However while swinging against a Doom Knight one of those mana draining wisps drained away all of Silverbolt's mana almost instantly (it was low to begin with). At almost the exact same time an Oblivion Knight cursed him with Iron Maiden. So when Silverbolt's swing landed home he died, or his swing after killed him. Either way an unfortunately chain of events conspired to Silverbolt's only death in Hell. From there onward he ripped through the rest of the difficulty without any other unfortunate occurrences. Baal and his minions were almost anti-climatic after all the effort of getting to the World Stone Keep in the first place. Especially since the Throne Room consisted of Dolls, OKs and the Witches that kept Silverbolt cursed the entire level. At least that overrode Iron Maiden, the only plus possible.
No plans to do anything else with Silverbolt. I did find a Lower Kurast map with two campfires for him. It's possible I'll use him for LK running to pop all chests/logs/bodies in the area once and a while. I'm not really going to try for thousands of runs with him, since a single run takes a few minutes easily. Other than that Silverbolt will retire comfortably.
Stats:
Level 84
Strength - 105(126)
Dexterity - 78(106)
Vitality - 317(352)
Energy - 15(15)
Life - 1157(1357)
Mana - 139(317)
Lightning Resistance - 90
Fire Resistance - 90
Cold Resistance - 88
Poison Resistance - 57
Skills:
Zeal - 20(28)
Fanaticism - 20(26)
Sacrifice - 20(28)
Holy Shield - 20(28)
Vengeance - 1(9)
Defiance - 7(13)
Equipment:
Weapon: Heaven's Light (Amn-Shael)
Armor: Guardian Angel (Ort)
Shield: Herald of Zakarum (Pdiamond)
Boots: Gore Rider
Belt: String of Ears
Gloves: Laying of Hands
Helm: Rockstopper (Thul)
Ring 1: Raven Frost
Ring 2: Angelic Halo
Amulet: Angelic Wings
Mercenary (Might Desert Warrior)
Helm: Vampire Gaze
Armor: Duriel's Shell
Weapon: Reaper's Toll
Hellforge
NM - Io
Hell - Fal
Friday, March 27, 2009
Java: Hotline Update #9
Another round of changes was made to the Hotline program. This time around we were adding a single option, "India Inquiries", however two current options were removed as well, "Symbian" and "Blackberry". The reasoning for this is that not very many of either comes into the call center so there isn't any need to track them anymore. That and management has made any decisions they wanted about the devices with this OS.
This time around I was able to make the changes before it had to go live, as a result no need to recreate individual rep data. The changes consisted of removing two JButtons from the display and replacing them with a single one for the new option. Along with that in the ReportPanel class I had to extend the If-Else statement controlling which options were displayed in the report output. The month of March 2009 has a unique display so that had to be taken into account.
(Integer.parseInt(targetMonth) == 3 && Integer.parseInt(targetYear) == 2009)
Beyond that everything else remained the same in the program. This update will be made at the beginning of next month.
This time around I was able to make the changes before it had to go live, as a result no need to recreate individual rep data. The changes consisted of removing two JButtons from the display and replacing them with a single one for the new option. Along with that in the ReportPanel class I had to extend the If-Else statement controlling which options were displayed in the report output. The month of March 2009 has a unique display so that had to be taken into account.
(Integer.parseInt(targetMonth) == 3 && Integer.parseInt(targetYear) == 2009)
Beyond that everything else remained the same in the program. This update will be made at the beginning of next month.
Tuesday, March 24, 2009
Java: CharSi Update #23
Saving the character information turned out to be easier than I first expected. JMenuItems were added to the File JMenu for saving purposes. One for simply saving the currently opened character and the other (Save As...) to assign a new name to the virtual character's save file.
When saving the character information all of it is saved to a text file with each component on a different line. For example part of a character's file could look like the following.
Paladin
1
20
1
1
20
1
1
20
0
0
1
1
The information is saved in a specific order. First the charType from the Skills class, followed by the values of all the skill point arrays, then each piece of equipment and finally with all of the user inputted values from the Stats panel (character level, user inputted Strength, difficulty level and so forth).
Saving a character takes only a second, opening one takes about 10-20 seconds due to all of the updates that occur every time a component's value is changed. Opening a character basically takes each line of the text file and assigns it to the appropriate variable. However when each variable is altered that prompts a re-evaluation of all the final character values. This re-evaluation works fine when altering a single value manually, such as adding 100 points into Vitality. But when it is run after each variable change it does slow down the opening of the character a bit. Not sure if there is a way around that, but I'll look into it.
I did have some issues when opening characters, all due to pretty basic mistakes on my part but they took quite a long time to track down. The main one was that they program wouldn't update the user inputted stat values correctly. Every time a character was loaded the values of vitality, energy, strength and dexterity revered back to their base values. Upon checking variables I did notice that the correct numbers were being saved into the variables that handle this information.
This meant that I had to find the spot in the code where things information was stopped from being applied correctly. I used a brute force method to do this. In the Open method code I broke the code up into 5-10 line sections and one at a time checked the desired variable before and after the code block. The variable value was output in the command prompt in each instance. If it's value was correct I moved onto the next code block, if it wasn't I took each line of code in that block one at a time to find where the problem was.
Eventually I found that the program wasn't saving the type of character correctly and as a result couldn't assign any values to the stat fields as the variables weren't being updated. The code that caused all the problem was this:
character = input.substring(index1, index2);
Skills.charBox.setSelectedItem(character);
Skills.charType = Skills.charType.substring(0,0);
Skills.charType = Skills.charType.concat(character);
It was the second two lines that were the problem. Worst part was they were completely unnecessary, the first two lines update the appropriate variables correctly so no other changes needed to have been made. Once the last two lines were removed everything worked correctly.
Now it's possible to save and open virtual characters and name them however desired. This coupled with all of the other changes I've made constitutes a significant alteration of the original program, and therefore means I posted an update in the DII forums. The new program can be downloaded here. My To-Do list is much smaller now and mostly contains checks to ensure the user input is valid or code cleanup. The only major component I'll be adding will be a new tab that will contain all of the breakpoint values for FCR, FHR, IAS and block speed. I intend this page to show where the current character's value is, which breakpoint they have hit and how many points are needed to hit the next breakpoint. It should be a fairly straightforward page, but I will have to think about how to make it available when the application is in Standalone mode.
When saving the character information all of it is saved to a text file with each component on a different line. For example part of a character's file could look like the following.
Paladin
1
20
1
1
20
1
1
20
0
0
1
1
The information is saved in a specific order. First the charType from the Skills class, followed by the values of all the skill point arrays, then each piece of equipment and finally with all of the user inputted values from the Stats panel (character level, user inputted Strength, difficulty level and so forth).
Saving a character takes only a second, opening one takes about 10-20 seconds due to all of the updates that occur every time a component's value is changed. Opening a character basically takes each line of the text file and assigns it to the appropriate variable. However when each variable is altered that prompts a re-evaluation of all the final character values. This re-evaluation works fine when altering a single value manually, such as adding 100 points into Vitality. But when it is run after each variable change it does slow down the opening of the character a bit. Not sure if there is a way around that, but I'll look into it.
I did have some issues when opening characters, all due to pretty basic mistakes on my part but they took quite a long time to track down. The main one was that they program wouldn't update the user inputted stat values correctly. Every time a character was loaded the values of vitality, energy, strength and dexterity revered back to their base values. Upon checking variables I did notice that the correct numbers were being saved into the variables that handle this information.
This meant that I had to find the spot in the code where things information was stopped from being applied correctly. I used a brute force method to do this. In the Open method code I broke the code up into 5-10 line sections and one at a time checked the desired variable before and after the code block. The variable value was output in the command prompt in each instance. If it's value was correct I moved onto the next code block, if it wasn't I took each line of code in that block one at a time to find where the problem was.
Eventually I found that the program wasn't saving the type of character correctly and as a result couldn't assign any values to the stat fields as the variables weren't being updated. The code that caused all the problem was this:
character = input.substring(index1, index2);
Skills.charBox.setSelectedItem(character);
Skills.charType = Skills.charType.substring(0,0);
Skills.charType = Skills.charType.concat(character);
It was the second two lines that were the problem. Worst part was they were completely unnecessary, the first two lines update the appropriate variables correctly so no other changes needed to have been made. Once the last two lines were removed everything worked correctly.
Now it's possible to save and open virtual characters and name them however desired. This coupled with all of the other changes I've made constitutes a significant alteration of the original program, and therefore means I posted an update in the DII forums. The new program can be downloaded here. My To-Do list is much smaller now and mostly contains checks to ensure the user input is valid or code cleanup. The only major component I'll be adding will be a new tab that will contain all of the breakpoint values for FCR, FHR, IAS and block speed. I intend this page to show where the current character's value is, which breakpoint they have hit and how many points are needed to hit the next breakpoint. It should be a fairly straightforward page, but I will have to think about how to make it available when the application is in Standalone mode.
Saturday, March 14, 2009
Diablo II: Patriarch Jade
Jade is a Tesladin, a paladin that utilizes the Holy Shock aura to deal damage to his enemies. I've never actually built such a character before, the closest I've come is a hybrid Teslafroster. This character is going to be build like a tank, but one that can also deal out significant amounts of damage. Still, he'll be able to solo the game without skipping any areas or monsters.
Jade started off untwinkled, as do pretty much all of my characters. As his
main aura of Holy Shock doesn't become available until level 24 I knew that he would be a slow starter, and I wasn't disappointed. Using both a level one Holy Fire or Holy Freeze aura for the beginning Jade slowly but surely worked his way through the first two acts. It wasn't until the end of Act II that Holy Shock became available and Jade's power began to increase to a decent level.
Once that happened he took off in terms of ripping apart his enemies. Since there aren't really any immunites in Normal, once Holy Shock was available he walked through the rest of the difficulty without much problem. The only spot he hit a snag was the Chaos Sanctuary, unfortunately. In this area Jade attempted to lure all of the Doom Knights away from their Oblivion Knight overlords so they could be dealt with away from any possibility of being cursed with Iron Maiden. The plan was working quite well, until an OK followed the DKs and caught Jade mid-Zeal cycle.
That turned out to be his only death in Normal. Everything beyond that posed no problems and very quickly Jade was in Nightmare, where things went pretty much the same up until Act II. At this point Jade's damage output was pretty much set but he hadn't really paid that much attention to defense, nor to placing any points into his stats. I was attempting to waste as few points as possible and it cost me a pair of deaths in the desert. Mods of monsters were dealing decent damage to Jade due to low life and zero block (no dexterity) so it really was only a matter of time before that caught up to me.
At this point Jade was level 54 and therefore could equip all of his endgame equipment, so he did. That enabled me to place all of his stat points as well. From this point onward Jade was a Juggernaut and simply ripped through the rest of Nightmare with no problems, even at p8.
Which leads us to Hell difficulty. Due to his ease of dealing with the latter stages of NM and my experience with Lucian I decided to tackle Hell at p3 instead of my normal p1. This lasted all the way to the end as Tesladins are fairly overpowered creatures. Lightning immune mobs did give Jade pause, but none ended up taking too long for him to eliminate. As such progress through Hell as made at a decent pace. I can't say any particularly weird occurrences or situations appeared in Jade's journey.
As such he dealt with everything that was thrown his way, including a pair of LI Ancients. This was followed by OKs in the WSK level 2, Gloams in level 3 and OKs and Gloams in the Throne Room. Apparently the game was making sure I had an ultimate challenge to end Jade's questing, which I didn't mind. Jade wiped out the opposition and then handily defeated Baal's minions and Baal himself to end his journey.
Some interesting facts about Jade. His mercenary was a Defiance Desert mercenary and with the aura Jade's defense was around 12k, which is above the 10k mark where defense actually means anything. This is why he maxed out Holy Shield, as normally I leave that at level 5 and simply recast it more often. As a result Jade was a very good tank and could stand up to just about anything, which was a big reason why he didn't have too many extremely challenging situations to deal with in Hell. More often than not I didn't even realize I was facing a boss until it was time to pick up the loot.
I don't have any future plans for Jade. Perhaps he'll join a multiplayer game or two, but for now he's retired.
Stats:
Level 84
Strength - 78(165)
Dexterity - 86(136)
Vitality - 336(383)
Energy - 15(27)
Life - 1367(1214)
Mana - 197(139)
Lightning Resistance - 95
Fire Resistance - 90
Cold Resistance - 90
Poison Resistance - 90
Skills:
Holy Shock - 20(23)
Resist Lightning - 20(23)
Salvation - 20(23)
Holy Shield - 20(25)
Zeal - 4(9)
Fanaticism - 1(4)
Equipment:
Weapon: Cresent Moon Phase Blade
Switch Weapon: Baranar's Star
Armor: Guardian Angel (15% IAS jewel)
Shield: Herald of Zakarum (Pdiamond)
Switch Shield: eth Herald of Zakarum
Boots: Goblin Toe
Belt: ID Detail
Gloves: IK Forge
Helm: Rockstopper (15% IAS jewel)
Ring 1: Raven Frost
Ring 2: Nature's Peace
Amulet: Saracen's Chance
Mercenary (Defiance Desert Warrior)
Helm: Tal's Mask
Armor: Shaftstop
Weapon: Reaper's Toll
Hellforge
NM - Ko
Hell - Lem
Jade started off untwinkled, as do pretty much all of my characters. As his

Once that happened he took off in terms of ripping apart his enemies. Since there aren't really any immunites in Normal, once Holy Shock was available he walked through the rest of the difficulty without much problem. The only spot he hit a snag was the Chaos Sanctuary, unfortunately. In this area Jade attempted to lure all of the Doom Knights away from their Oblivion Knight overlords so they could be dealt with away from any possibility of being cursed with Iron Maiden. The plan was working quite well, until an OK followed the DKs and caught Jade mid-Zeal cycle.
That turned out to be his only death in Normal. Everything beyond that posed no problems and very quickly Jade was in Nightmare, where things went pretty much the same up until Act II. At this point Jade's damage output was pretty much set but he hadn't really paid that much attention to defense, nor to placing any points into his stats. I was attempting to waste as few points as possible and it cost me a pair of deaths in the desert. Mods of monsters were dealing decent damage to Jade due to low life and zero block (no dexterity) so it really was only a matter of time before that caught up to me.
At this point Jade was level 54 and therefore could equip all of his endgame equipment, so he did. That enabled me to place all of his stat points as well. From this point onward Jade was a Juggernaut and simply ripped through the rest of Nightmare with no problems, even at p8.

As such he dealt with everything that was thrown his way, including a pair of LI Ancients. This was followed by OKs in the WSK level 2, Gloams in level 3 and OKs and Gloams in the Throne Room. Apparently the game was making sure I had an ultimate challenge to end Jade's questing, which I didn't mind. Jade wiped out the opposition and then handily defeated Baal's minions and Baal himself to end his journey.
Some interesting facts about Jade. His mercenary was a Defiance Desert mercenary and with the aura Jade's defense was around 12k, which is above the 10k mark where defense actually means anything. This is why he maxed out Holy Shield, as normally I leave that at level 5 and simply recast it more often. As a result Jade was a very good tank and could stand up to just about anything, which was a big reason why he didn't have too many extremely challenging situations to deal with in Hell. More often than not I didn't even realize I was facing a boss until it was time to pick up the loot.
I don't have any future plans for Jade. Perhaps he'll join a multiplayer game or two, but for now he's retired.
Stats:
Level 84
Strength - 78(165)
Dexterity - 86(136)
Vitality - 336(383)
Energy - 15(27)
Life - 1367(1214)
Mana - 197(139)
Lightning Resistance - 95
Fire Resistance - 90
Cold Resistance - 90
Poison Resistance - 90
Skills:
Holy Shock - 20(23)
Resist Lightning - 20(23)
Salvation - 20(23)
Holy Shield - 20(25)
Zeal - 4(9)
Fanaticism - 1(4)
Equipment:
Weapon: Cresent Moon Phase Blade
Switch Weapon: Baranar's Star
Armor: Guardian Angel (15% IAS jewel)
Shield: Herald of Zakarum (Pdiamond)
Switch Shield: eth Herald of Zakarum
Boots: Goblin Toe
Belt: ID Detail
Gloves: IK Forge
Helm: Rockstopper (15% IAS jewel)
Ring 1: Raven Frost
Ring 2: Nature's Peace
Amulet: Saracen's Chance
Mercenary (Defiance Desert Warrior)
Helm: Tal's Mask
Armor: Shaftstop
Weapon: Reaper's Toll
Hellforge
NM - Ko
Hell - Lem
Subscribe to:
Posts (Atom)