Friday, December 11, 2009

Java: Hotline Update #13

An update was needed for the Hotline program, specifically emails are now going to be tracked following the same guidelines and options as phone calls. The hard part was already done thanks not having a different set of options to select from. So the OptionPanel file was copied and renamed to EmailPanel to create the new program tab. Along with this the pop-up messages that appear were renamed to mention an email was tracked as opposed to a call.

However some changes were made as left to the current setup the user would have to log into both tabs individually, which allows the possibility of doing so incorrectly for one of them and causing significant tracking issues. So I borrowed some code from the Enguard program and required the users to log into the application upon startup, before the program window appears. Then once logged in the bottom panel displays what type of tracking that page performs as well as the individual logged in instead of the JComboBox that was there before for logging in.


In order to make it painfully obvious which tab was for calls and which for emails the email tab was recolored, I used Dark Salmon (light red) which made a nice contrast to the opaque blue of the call panel. Along with this borders were placed on all of the buttons to better distinguish them from one another.

Now that there are two reporting tools being used in the program, they each need a separate way to have reports run on them. As such a JMenu was added with two JMenuRadioButtons, one for emails and one for phones. Depending on which one was selected the report would pull the corresponding data for the Report tab.

Right now there isn't a way to combine the two reports together, but that's in the works. Along with that I will be hiding the Report JMenu from anyone who doesn't have the privileges to view the Report tab, just to avoid confusion.

Monday, October 26, 2009

Java: Hotline Update #12

It has been a little while since I was last asked to make any changes to the Hotline application. These changes weren't anything significant, same as the previous couple of updates. Basically one of the options was removed and replaced by a new options. As such this entailed a new JButton to be created with associated listener, and a new piece to the If-Else statement in the ReportPanel class to handle this new variation to the call options. One quick test to ensure that a representative can save calls and then a report can be run on that day's usage, which both passed, and the requested change is complete.

Wednesday, October 21, 2009

Online Game: Dungeons & Dragons: Tiny Adventures

A while back my brother convinced me to join Facebook. Being a gamer I knew I'd end up playing some of the applications there, and I was right. Thankfully one of the ones I found was simple and requires as little time as possible to still have fun. This game is Dungeons and Dragons: Tiny Adventures. In this game you take a character, equip them and send them off on a short adventure. While they are gone you need to do nothing. After a certain period of time your character completes their journey and you can read about their experience. Once they've healed up you can then send them off again on a different adventure.



It works very much the way D&D works, except just about as simplistic as possible. Each encounter during an adventure has a difficulty in one of the characteristics (strength, dexterity, wisdom...etc). A 20 sides die is virtually rolled and compared to the difficulty. Equal or higher and the character is successful, lower and the character is not. Rewards are given for being successful which can be used or equipped on the character for the next adventure.

This is a set and forget application, that was the intent. One could sit and watch each encounter and switch equipment between them for maximum effect, but personally I see that as a waste of time. This is perfect for me as I have enough other things I do and games I play that getting involved in something that took lots of time would be a major problem. Best part about this is, if you go on vacation there is no penalty. Your character simply sits idle until you return, just like a single player game (which it is). One side effect of playing this game is now I've gotten back into playing Balder's Gate II on my PC. I've only played through that twice before and definitely not seen all of the different aspects of the game, so I don't mind. I needed a bit of a break from Diablo II as I've pretty much worn that game out and played all of the builds I intended to play. There are a few more I could play if I wanted, but I think I'll wait for the 1.13 patch before that happens.

Tuesday, October 13, 2009

Diablo II: Classic Tournament

In the Classic Tournament by EmperorMoo the rules were extremely simply, play a hardcore character in Classic mode untwinkled. Rerunning was allowed, as were any skill and stat distributions. I haven't played Classic in years, so seemed like fun.

I should have read up on the changes between Classic and Expansion before starting, so I wasn't surprised. I was aware of several changes (no charms/runes, no equipment on the mercenary) but many I wasn't. Such as:

No potions can be given to the mercenary
Static Field has no limitations in NM/Hell
Mercenaries can't move from one act to another
No orb weapons
No weapon switch

Turns out some of these ended up being my downfall, but I'm getting ahead of myself. I played this tournament with Mirax, a Blizzballer. Never made one before but they are pretty simple and should be able to solo the game. This was especially important as the mercenary won't be doing much damage of their own.

Things started off somewhat slow, as expected with a sorceress. Hitting everything with a staff until a few points in Firebolt were available, then mowed everything down when Fireball was introduced. The rogue mercenary was a very poor tank and only vaguely distracted the monsters away from Mirax. So moving through tight areas was slow going as Mirax wouldn't move forward very fast. This changed a bit in Act II as the desert mercenary does tank fairly well, or at least well enough to hold monsters in place for a few Fireballs to finish them off. Of course any poison damage kills off the merc right away, so lots of trips back to town to be healed/resurrected were needed.

Act III proved interesting with an Iron wolf mercenary. He doesn't tank, so Mirax leads and had to go slowly to be able to deal with the fast Flayer packs in the jungle. Thankfully they have low health and fall to Fireball quickly. At least now Teleport is available and can be used to reposition the merc when needed, or save his life of course. At the end of the act Glacial Spike is also available and used to freeze any monster packs before they are eliminated, which is the exact tactic used in Act IV.

Both Mephisto and Diablo in Normal difficulty proved to be fantastic and entertaining fights, one dealt with Fireball chains and the other a constant stream of Blizzards.

Started to run into cold immunes in Nightmare and a one point Blizzard is tough to eliminate them, mostly because I have trouble aiming at single targets. Can take up to 6 casts to get rid of a single skeleton, since the merc isn't powerful enough to finish it off on her own. Most of Nightmare was a combination of Blizzard and Fireball chains, I basically forgot all about Static Field as the monsters didn't get close enough. In the end Blizzard was used almost exclusively in Act IV and against Diablo, chilled monsters is just safer.

Hell ended up being a huge jump up from NM. The mercenary died constantly and money became a real problem. However while that mean progress was slowed a bit it wasn't stopped, and Mirax continued onward through the different areas without too much difficulty. This is why her sudden end was so unexpected. Walking across the Kurast Causeway she ran into a double pack of Faithful and Sextons. The Sextons dropped Blizzards on her and with 20% cold resistance she didn't have a chance to react before the Faithful finished her off.

It was a fun tournament and a very interesting departure from my normal DII playing. Now I'll return to the land of softcore and try to finish off the last two to three builds I have in planned before I finish the list I made oh so long ago.

Wednesday, July 29, 2009

Diablo II: Blizzballer Skill Layout

A Blizzballer is a Sorceress that utilizes Blizzard and Fire Ball as her main skills. This is a variation of the Meteorb build with cold being the timer spell and fire the spamming spell, just a different type of cold spell being used. Generally this build should be able to deal with just about any monster encountered, and any CI/FI ones can be handled by the mercenary companion. The skill setup is as follows:

Firebolt - 1
Frozen Armor - 1
Icebolt - 1
Iceblast - 1
Static Field - 1

At level 6 some utility skills become available. Static Field is the most important, as this will be used from here onward to weaken any uniques or act bosses initially before they are finished off with other spells. Along with SF, Frozen Armor also becomes available. The Sorceress will have this spell running at all times as it is helpful when melee monsters get close enough that they are temporarily frozen after striking, giving the character time to react by either teleporting away, attacking or running in a different direction.

Telekinesis - 1
Frost Nova - 1
Fireball - 1

At level twelve one of the main offensive skills becomes available, Fireball. From here onward this skill is the main offensive weapon, especially due to it's splash damage. It is fairly mana intensive, so many mana pots will be used so the character should be stocking up their inventory with them for each venture into the wilds.

Fireball - 7
Teleport - 1
Glacial Spike - 1

At level eighteen both Teleport and Glacial Spike become available. Teleport is another utility spell that won't see much action early on. It will mainly be used to escape danger and reposition the mercenary to better tank the monster hordes. This is especially true in the Chaos Sanctuary as way to avoid death for the melee mercenaries. Glacial Spike is uses as a good way to dispose of corpses, of avoid resurrection, as well as freeze packs of monsters in their tracks.

Fireball - 13
Blizzard - 1

At level twenty-four the other main attacking skill becomes available, Blizzard. Even at one point it is a viable way to deal with packs of monsters, and those that are fire resistant. Blizzard is a quirky spell in that the areas it hits are very random and make it very possible for monsters to walk through a Blizzard wall without being touched. As such it is best to cast multiple times in slightly different spots to ensure that all areas are covered and no monsters gets by untouched. By this point Fireball is doing significant damage and monster packs don't last long, as long as the character has mana pots available.

Fireball - 19
Fire Mastery - 1
Cold Mastery - 1

At level thirty a single point is added to both fire and cold mastery, to give both main spells a boost to their damage. A single point is how they will both stay for the rest of the game, plus skill mods will have to make up any difference needed. By level thirty-one Fireball is now maxed and dealing very good damage, wiping out packs of monsters with only a few casts.

Fireball - 20
Blizzard - 20

At level forty-seven Blizzard is also maxed out and the character has two completely different ways to wipe out all of the monsters in Nightmare. Both deal enough damage to deal with any pack in short order. If the character is pressed a few SF casts and a Glacial Spike or two should slow any packs down enough to either retreat or reposition the character to better deal with them.

Firebolt - 20

Now it is time to max out the synergies for our main skills. At level sixty-three Fireball's synergy Firebolt is maxed out giving that skill an extra boost. As Meteor gives the same amount of bonus but requires a few extra skill points to reach, it is bypassed for Firebolt as skill points are at a premium with this build.

Glacial Spike - 20

At level eighty Blizzard's main synergy of Glacial Spike is maxed out. All of they synergies for Blizzard provide the same bonus, but Glacial Spike has the added bonus of being able to affect multiple monsters with it's splash damage when used. As such it can be used against monsters to freeze them in place to be dealt with by other skills. Glacial Spike by itself won't have enough power to take out many monsters in Nightmare/Hell.

From here on skill points can be used in a few different ways. Cold Mastery could receive the rest of the points to make Blizzard more dangerous. If CIs are causing issues then Fire Mastery or Meteor could receive the points to balance the character's damage out. It depends on where problems are being encountered for where to put the last few points.

Final Skill Distribution:

Blizzard - 20
Glacial Spike - 20
Fireball - 20
Firebolt - 20
Cold Mastery - 1
Fire Mastery - 1
Static Field - 1
Frozen Armor - 1
Teleport - 1

Wednesday, July 1, 2009

Java: CharSi Update #24

While using the program I, and others, ran into a few equipment pieces that didn't add the bonuses they should. This was due to either typos on my part or miswording of the mod itself, such as the "+2 to Combat skills" mod was spelled "+2 to Combat" instead. These were all very minor changes to about a half dozen different text files. There might be more out there, but I haven't found them yet.

A code clean-up was also performed to remove some unused variables and code pieces as well as remove all of the "public" identifiers from the variables and methods, as it wasn't necessary. This shortened the number of code lines a bit, not extremely noticable but more a personal preference than anything else.

Next on my To-Do list was to add some additional checks to the system to ensure that when creating items in the generator or selecting a value for a variable mod the value input was valid. Up to this point a Breast Plate could technically have a defense value of 100k. That is no longer possible. Now there is a check that will only allow values that fall between the given minimum and maximum mod values. This required a couple code lines addition to the DetermineRangeValue method in all of the class files.

if(CharSi.userInput){
while(rangeWrong){
userInput = Integer.parseInt(JOptionPane.showInputDialog(helmBackPanel, "Choose a value between " + start + " and " + end, modName, JOptionPane.PLAIN_MESSAGE));
if(userInput > Integer.parseInt(end) || userInput <>
JOptionPane.showMessageDialog(helmBackPanel, "Value given outside the allowed range. Retry.", "Input Error", JOptionPane.ERROR_MESSAGE);
rangeWrong = true;
}else
rangeWrong = false;
}
}

This piece is only active if the user is manually inputting values for variable mods. The rangeWrong boolean variable is initially set to True until the check is made. The user input is then compared to the given minimum and maximum values and if it passes is accepted, otherwise the error appears and the user has to try again until a valid input is given.

Lastly I wanted to ensure that runewords could not be created in the generator in illegal base items, such as a Spirit shield in a buckler that allows less than 4 sockets. This required several changes to the GenerateRunewords class file. First I had to decide how to store the information for how many sockets each piece of equipment allows. This I did with several array of arrays. Each sub-array was two values long, the first for the name of the item and the second for the maximum number of sockets. The array of arrays were grouped by item type available in the item generator, so one for armor, another for hammers and so forth. This method was called when the GUI is created.

Next I needed to be able to obtain the number of sockets the runeword required. To do this I altered the text file of each runeword item so that it displayed the number of runes used in the description in parentheses.

Runes(3):
Thul + Io + Nef

When the runeword is selected in the GUI this number is saved in a variable in integer form for later comparison.

Lastly I needed a way to compare this rune number with the number of sockets that each item could have, then eliminate from the available list those items that don't qualify. This was done with another method, ComapreSocketNumbers. Basically this method would see which JRadioButton was selected in the GUI and compare the rune number with each available item. Those that had less sockets than runes needed were removed from the DefaultListModel.

if(shieldFlag){ //if shield radiobutton marked
for(int i = 0; i <>
if(Integer.parseInt(shieldSocketArray[i][1]) <>
if(baseListModel.contains(shieldSocketArray[i][0])){
int index = baseListModel.indexOf(shieldSocketArray[i][0]);
baseListModel.remove(index);
}
}
}
}

This method is called when either the Display Base JButton is pressed or a runeword is selected from the available list. However to ensure that items removed from the baseListModel can be returned a doClick() call is made on the Display Base JButton to repopulate the listModel fully before it is checked for illegal items. Otherwise once an item is removed, it is gone until the program is closed and reopened, which isn't too convenient.

My next projected changes to the program is to take into account aura bonuses from equipment and also the +O skill mods.

Tuesday, June 30, 2009

Java: Hotline Update #11

This time around the Hotline program did not lose any current options. Instead only two options were added, which made things extremely simple to update. In the OptionPanel class the new JButton variables were created and added to the very end of the GUI. Then the file output was updated to add the number of calls taken for these new categories to the very end of the file, so as not to displace any current call values.

This took care of the OptionPanel, the ReportPanel required just as few changes. Basically a new qualifier had to be created that covered the time from the last update (April 2009) to the new one (June 2009). Then the default qualifier, everything from June 2009 onward, covered the two new call categories. Those were the only changes required to include the new call categories. Now the page actually is full, before there were empty spots for JButtons in the display as I didn't have the correct number of options for full rows. Now I do so the GUI looks more complete.

Wednesday, June 24, 2009

Diablo II: Frost Zealot Skill Layout

A Frost Zealot is a Paladin that utilizes the Holy Freeze aura to deal cold damage to his enemies. A side effect of this aura is that it slows down 90% of the monsters movement rate as well. This type of character has a few different avenues for skill placement available, for my purposes I am dealing with only the pure cold damage variation that has minimal backup skills. As a result the mercenary is relied upon to help out against any Cold Immune monsters encountered. The skill setup is as follows:

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

At level six the character has a single point Holy Fire aura active that adds additional fire damage to all attacks. Might is also available and depending on the equipment found Might may be more damaging than Holy Fire. Either one will allow the character to deal decent damage to the monsters encountered and progress should be fairly smooth.

Zeal - 1
Charge - 1

At level twelve one of the character's main skills becomes available, Zeal. With Zeal the character is now attacking multiple targets at a time and dealing out damage faster than before. It does require mana, so if any mana steal equipment can be found this would be very helpful. However Zeal requires so little mana that such equipment isn't absolutely necessary and the character could simply drink a mana potion from time to time instead.

Holy Freeze - 1
Zeal - 4
Resist Cold - 1

At level eighteen the main damaging skill is now available, Holy Freeze. This will add increasing amounts of cold damage to all attacks as well as slow down any monster's movement within a certain radius. Along with this Zeal has been increased to the point where the maximum number of attacks per cycle is achieved at five. This allows the character to attack many targets at once, or a single target multiple times faster than using the normal attack. Thus increasing his killing ability and speeding up progress through the acts.

Holy Freeze - 20

The first thing that is done is the main skill, Holy Freeze, is maxed out. This is achieved at level thirty-four. At this time the character is dealing significant damage to enemies and they are all slowed by by at least 54%. This significantly increases the character's survivability as monsters don't hit him as often while he is hitting back rather hard.

Blessed Hammer - 1
Holy Shield - 5
Resist Cold - 20

The next thing to do is to max the main synergy for Holy Freeze, Resist Cold, and this is accomplished by level fifty-two. Maxing this synergy boosts the damage done by the character even more and allows his progress through the acts to remain steady as the hit points of the monsters encountered increases accordingly. Up to this point blocking has not been an issue, but moving forward through the end of Normal and into Nightmare it becomes a necessity. As such Holy Shield is given enough points so that a single cast lasts a respectable amount of time and it won't fade in the middle of a heated battle.

Holy Shield - 10
Salvation - 20

By level seventy-six Holy Shield is given enough points so that the duration is significant, as is the bonus to blocking percentage. It isn't require to max this skill as the character still won't be able to boost defense into the ten thousand range and this build is rather tight when it comes to skill points. But level 10, along with any plus skills from equipment, is sufficient to protect the character. As this build is going for pure cold damage, Salvation is the next Holy Freeze synergy to be maxed. While it doesn't provide as much of a bonus as Resist Cold, it's contribution is significant enough that maxing it is desired.

At this point all of the main skills have the hard points they need to make the build viable before entering Hell difficulty. Everything from here onward is simply gravy. To that end I suggest putting points into Zeal. The character is relying purely on cold damage to deal with monsters, and there are plenty of CIs in Hell. Against them the character is depending on the mercenary to handle those types of monsters, however some help against them would be welcome. To that end Zeal is given all additional skill points to increase the character's physical damage, as well as increase the attack rating of the character to ensure a decent hit percentage. The damage done by the character physically won't be massive, but every bit will help when encountering CIs. Simply understand that fights against those types of monsters will take a little longer than against non-CIs.

Thursday, June 18, 2009

Online Game: Castle Age

Recently I've gotten involved in a Facebook application named Castle Age. It's a realtime text-based game centered around the medieval age. In this game the player is king and hires soldiers and buys land as well as equipment for the soldiers. The main point of the game is to complete a series of quests to reap the rewards given as well as engage other players in combat. Players can choose which aspect they wish to concentrate on however, as neither combat nor questing is absolutely required.

A player has a certain amount of health and energy available to them, and these regenerate over time. The energy is used to complete quests, a certain amount is necessary to attempt a quest and a quest needs to be completed a certain amount of times before the player may move on to the next quest. This is called gaining influence in that quest, and the player needs to reach 100% before they can move onto the next quest.

Health on the other hand is used only when battling another player. This can be done in one of two ways, either invading or dueling. Invading involves bringing your entire army to combat the other player, winner takes all. Conversely dueling is a one on one fight between your general and the other players active general. After each fight both sides lose a random amount of health and if either reaches zero that player is "eliminated". Being eliminated doesn't affect the player more than making them lose six experience points. A player can be eliminated multiple times with no derogatory affects onto their account.


Personally I'm not so interested in battling strangers for the off chance I can steal some of their gold. Instead I only concentrate on completing the quests and building my defenses to repulse invading armies from my kingdom. As a result this means I level my character slower than others as I'm not gaining experience from fights and only from quests. As this game isn't really a race, this is fine by me.

To this end I've invested some of my stat points into Energy to ensure I can perform multiple quests at a time. I wanted to make sure that I could leave the game for extended periods of time and not have to worry that I lost energy, so I plan on having 120 Energy total that means I can be gone for ten hours with no ill effects. All of the rest of my stat points go into Defense, in the attempt to win more battles than I lose when defending. I am willing to retaliate against those that attack me, but if I can't when I notice the attack, if the other player is too low in health, then I ignore them and continue on my merry way with questing.

Overall the game is pretty entertaining, and not too much of a time sink. In the beginning one is forced to login often to use up the small store of Energy that accumulates, but as stat points are put into Energy logging in becomes a less frequent occurrence. It is a fairly quick game however, as after a month of playing I have completed four of the five currently available quest areas. The last one should take two months to complete but with no reward at the end isn't something I have to worry about much. So as long as I don't concern myself too much with my battle stats or win/loss ratio it is a decent distraction from time to time but not something I have to feel is taking over my life, as I am rather limited in terms of what I can do in the game.

Sunday, May 10, 2009

Diablo II: Matriarch Esmay

Esmay will be a Fishyzon, which is an Amazon that utilizes the Freezing Arrow and Lightning Fury skills to damage her enemies. She will not have a valkyrie available to tank monsters, so will have to rely on her mercenary and a low level decoy to keep herself safe.

None of Esmay's main skills are available for much later in the game so she started off life poking everything to death with her javelins. Luckily for her a set of rare javelins fell early, but still she had great trouble getting through the beginning of Normal. Even when she received a mercenary for support both were not using any special skills and instead only a normal attack to damage the monsters. As a result progress was extremely slow, and remained that way all the way until the middle of Act III.

Finally around the end of the Flayer Jungle Esmay started to use her skills. Up to this point her mercenary was doing several times the damage per hit as she was and she was tired of being a second-class character. She had finally gotten Charged Strike up to a respectable level so that it would deal a great deal of damage. This was key as it is mana intensive and the reward had to equal the payment necessary. It turns out this was the case, even though Esmay had to start running around with half her inventory taken up by mana potions. She picked up every single one that dropped and still had to return to town often to replenish her stock.

However as a result Esmay began to simply roll over all monsters packs encountered. Between one to three pokes with a javelin and a monster was dead, and sometimes the ones behind as well if some of the bolts missed the initial target. She did have an issue with getting stun locked, since she didn't have any faster run/walk she had to try and keep her mercenary between her and the monsters so that she would not be interrupted. As long as that was done Esmay and co ripped through to the end of Normal.

At this point she was able to equip a few pieces of equipment that are intended for endgame use, such as Titan's Revenge, Moser's Blessed Circle and M'avina's belt and gloves. With these added Esmay's blocking increased dramatically and as such she was in much less danger of getting stunlocked. Act I was pretty much a continuation of the end of Normal in that nothing could stand in her way. She did run into one or two situations where the monsters were lightning resistant, such as Misshappen, and there she had to switch to utilizing Freezing Arrow. This worked because by this point that skill was pretty much maxed and the monsters dropped like flies.

As Esmay progressed through Nightmare she progressively began to use Freezing Arrow more and more, until it was her main skill near the end of Act II, which is when it was finally maxed. This came in handy when dealing with packs of skeletons, since the corpses shattered upon death they couldn't be resurrected. Esmay did have issues however with dealing with packs now that she didn't have a reliable tank in the valkyrie. The mercenary simply couldn't cut it by himself against the worst of packs and as a result Esmay have some issues. Most notable was in the Viper Temple where the first level had a stair trap of about two dozen snakes. Esmay tried to escape them by running farther into the temple to gain some breathing room, but every turn simply loosed more monsters upon her until she was cornered and eliminated.

That was more overconfidence than anything else, she should have taken things slower and would have survived her first attempt into the temple. Regardless she was successful the second time around. Freezing Arrow is much more mana intensive than Charged Strike however, so Esmay is running out of mana potions frequently, requiring more trips back to town. However once I got the hand of it she progressed nicely through to Act V, where she ran into more problems.

Her issues in the Barbarian homeland didn't start until the Crystalline Passage. There she kept encountering back spawns of snakes, frenzytaurs or some combination thereof. Her mercenary simply wasn't capable of tanking two champion frenzytaurs at a time and as a result Esmay found herself running dangerously low on gold for resurrections. She had to start picking up all the items that gave good money returns to keep things going, but it was quite close for a little while. Eventually she did finally make her way to Baal and dispatched him with relative ease.

Hell, it turns out, didn't start off so bad. Esmay started off at P1 assuming all the immunities would make it too difficult otherwise. That turned out to be a mistake, so she ramped things up to P3 from the Cold Plains onward. Now she could no longer stay with a single skill for the majority of the time. Esmay found herself switching from Charged Strike, to Freezing Arrow, back to Charged Strike and then a few Lightning Furies to finish things off on a constant basis. She is questing with FA as the primary skill, but that's as much for the cool aura that Mavinas set gives than anything else. Besides, she'd be a lightning Amazon otherwise and that's not her point. She's a Frost Maiden first, with a CS backup skill and I intend to play her that way as much as possible. Besides, the frozen monsters makes the mercenary job of tanking so much easier.

Things went smoothly for the most part, although single cold immune monsters take a while to eliminate with CS if they aren't very large (think vampires). Still Esmay wasn't noticing the fact she was questing without a valkyrie, something none of my Amazons have done up to this point. Esmay was having a grand old time until she was ambushed out in the desert of Act II. Apparently there was a vulture extra strong, might enhanced boss hiding behind a palm tree where it couldn't be seen. Esmay, thinking she had nothing to fear stood nearby and plucked away at the minions. Suddenly Esmay's life was practically zero and then it was gone, two hit knockout. After that Esmay was a bit more careful to stand out in the middle of nowhere so monsters didn't have anywhere to hide.

Everything through Act III was done at P3, but it was dropped down to P1 from Act IV onwards as it was time to end Esmay's quest. She ripped through Act IV like it wasn't even there. Hordes of maggots dropped in a single FA and LFs took out any CI stragglers. Diablo didn't even require a single health potion, although the mercenary didn't need about a dozen resurrections due to IM just to get to Big D. Nothing of interest was dropped of course, why would Hell be any different than the rest of the areas up to this point.

Act V was a bit tougher than the previous act, but not enough to give Esmay any real problems. She did find herself using the decoy to keep ranged monster packs busy while she dealt with someone else, something she rarely had to do up to this point. While that became common practice, for the most part everything else stayed the same, with one exception. From the Crystaline Passage onward Esmay no longer quested with her bow as the main weapon, instead her javelins were the main weapon as cold immune monsters outnumber non-CIs in all areas except the WSK. So while there was less freezing of monster packs to keep the mercenary alive, this was replaced by LF strikes that wiped out the packs faster than they could hurt the mercenary, so it evened out in the end.

No champion packs of Frenzytaurs were encountered so Esmay had no trouble all the way through Baal and his minions. The WSK threw at her the obligatory monster spawns of Unravellers, Dolls, Oblivion knights and Souls but in Esmay successfully engaged them all. The minions when down with a whimper and Baal, while he did remain cloned the entire fight, was defeated without too much hassle.

A few parting thoughts about the Fishyzon. She's a very overpowered build. Even untwinkled she'd be able to handle all of Hell at P3. The equipment that Esmay wore wasn't the most optimal for her skills, as she was more a themed build for the Mavinas set than anything else. She could have been even more deadly with a few choice gear changes and could perhaps had dealt with Hell at P5. With this being my first Amazon without a valkyrie sidekick I found the experience odd but didn't notice her absence too much. The fact that FA worked even better for tanking monster packs had a lot to do with it, as did the chance to decrepify that the mercenary's Reapers Toll provided. Overall a very safe and powerful build, exactly as advertised.

Stats:
Level 84
Strength - 92(122)
Dexterity - 130(199)
Vitality - 273(273)
Energy - 15(15)

Life - 1035(1035)
Mana - 139(294)

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

Skills:
Freezing Arrow - 20(26)
Cold Arrow - 20(26)
Decoy - 1(7)
Pierce - 1(7)
Lightning Fury - 20(25)
Charged Strike - 20(25)
Lightning Bolt - 4(9)

Equipment:
Weapon: Mavinas Caster (shael)
Switch Weapon: Titan's Revenge
Switch Shield: Mosers Blessed Circle (2 Pdiamonds)
Armor: Mavinas Embrace (cold facet)
Belt: Mavinas Tenet
Helm: Mavinas True Sight
Boots: light plated boots - LR 28%, PR 27%, 23% MF, 20% FRW
Gloves: Mavinas Icy Clutch
Amulet: All resist 30%
Ring 1: Raven Frost
Ring 2: FR 18%, CR 17%, 4 Dex, 24 AR

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

Hellforge:
NM: Sol
Hell: Ko

Wednesday, May 6, 2009

Diablo II: Fishyzon Skill Layout

A Fishyzon is an Amazon character that utilizes Freezing Arrow and Lightning Fury/Charged Strike attacks to deal damage to her enemies. Along with this a backup skill of a single point Jab or even relying on the mercenary provide this character the ability to deal with any monsters encountered. Unlike many other Amazon builds, the valkyrie minion is not utilized, which does make this build a little bit more fragile than most, but not enough to cause any real concern. The skill setup is as follows:

Jab - 1
Inner Sight - 1
Power Strike - 1
Cold Arrow - 1
Poison Javelin - 1

At level six several interesting skills are available to the character. None of them however will be a final skill so for the time being none of them will receive more than a single point. As such the character will be utilizing normal attacks for the beginning of the game with a single Poison Javelin or Cold Arrow thrown in for tough bosses or large packs that can't be dealt with one at a time.

Critical Strike - 1
Lightning Bolt - 1
Slow Missile - 1

At level twelve only prerequisites are being filled so battles are still fought in the same manner. Mostly normal attacks with the odd Poison Javelin thrown in against packs or Cold Arrow against bosses.

Ice Arrow - 1
Charged Strike - 1
Plague Javelin - 1
Penetrate - 1

At level eighteen one of the main skills does finally become available, Charged Strike. However at such a low level the mana requirements for the damage dealt are not very character friendly and as such the skill is used only in dire emergencies. Otherwise tactics remain the same.

Decoy - 1
Charge Strike - 7

At level twenty-four a very good monster distraction becomes available in Decoy. With only a single point it won't last very long but the few seconds of peace should be enough at this point in questing to allow the character to regroup her wits. Charged Strike has become a bit more viable, still mana hunger enough that it isn't in use all of the time, but working it's way towards that goal.

Lightning Fury - 1
Freezing Arrow - 1
Charged Strike - 13
Pierce - 1

At level thirty all skills are now available, including two of the main ones in FA/LF. Also, Charged Strike has become powerful enough that it may be used on a constant basis. Half of the inventory will need to be filled with mana potions before venturing out, in order to ensure a decent amount of territory can be crossed before a trip back to town is required.

Charged Strike - 20
Freezing Arrow - 6

At level thirty-seven Charged Strike is now maxed and dealing significant damage. While CS is the main attack Freezing Arrow has been added to the skillset and comes into play whenever a pack approaches. One or two quick FA shots freezes the group for a short period of time, but normally enough for the character to eliminate a few with CS. Then the process is repeated until the pack is gone.

Freezing Arrow - 20

At level fifty Freezing Arrow is maxed. Finally the character has a choice as to which skill will be the main one, FA or CS. Either will work quite well and purely depends on the characters personal preference. Either way scouting ahead with the random Decoy from time to time is advisable, especially in areas such as the Durance and WSK were very nasty monsters can pop out of nowhere.

Cold Arrow - 10
Lightning Fury - 10

At level sixty-five the synergy for Freezing arrow is increased, as is one of the mains skills in Lightning Fury. As the character is still in Nightmare difficulty having LF maxed is not an absolute priority, Charged Strike and Freezing Arrow do quite fine at this point.

Cold Arrow - 20
Lightning Fury - 20

By level eighty-one all of the skills are complete and the character should be able to deal with any monster pack encountered. Liberal use of Decoy in Hell difficulty is suggested to avoid any nasty traps, although granted stair traps will still be unavoidable. But without a valkyrie to soak up the damage the character needs to be a tad cautious when moving through areas. From here on the extra skill points can be placed in a few different areas. Decoy could be increased to give a more powerful, and instantly summonable, tank. Or one of the CS/LF synergies could be increased to provide more power to those attacks. Or Pierce can be increased to add to the current percentage. Which route is taken purely depends on the character's play style and what situations have caused the character difficulties up to this point.

Final Skill Distribution:

Cold Arrow - 20
Freezing Arrow - 20
Lightning Fury - 20
Charged Strike - 20
Decoy - 1
Pierce - 1

Tuesday, April 28, 2009

Java: IP Analyzer Update #2

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.

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.

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

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

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.

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.

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

Diablo II: Tesladin Skill Layout

A Tesladin is a paladin type character that utilizes the Holy Shock aura to add lightning damage to his attacks. This coupled with a quick Zeal attack cycle means the character can deal high damage amounts to multiple monsters in a short amount of time. There are several variations of the Tesladin build to deal with immunities. Some require the build to become a hybrid with Holy Freeze as a backup skill. Others have the build become a lightning-physical hybrid. I decided on the latter method as I've build a Teslafroster already and wanted something a little different. The skill setup is as follows:

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

At level six the character receives an attacking fire bonus from Holy Fire, after having used Might for the very beginning of the game. While not the most damaging skill, Holy Fire will allow the character to deal respectable amounts of damage if some +skill equipment can be found. This is good as the skill has to last the character up to level 18 with only a single hard skill point invested.

Charge - 1
Zeal - 1

At level twelve Zeal becomes available and replaces normal attacking as the default attack. This coupled with Holy Fire allows the character to deal with any monsters encountered without too much difficulty.

Zeal - 4
Blessed Hammer - 1
Holy Freeze - 1

At level eighteen Holy Freeze replaces Holy Fire as the aura of choice. It deals slightly more damage with a single invested skill point, but more importantly the aura slows down all monsters at this level. As a result the character's survivability increases dramatically. The aura also provides the character with a chance to shatter any monsters killed, a definitely bonus when facing monsters that can be resurrected, such as skeletons and fallen.

Holy Shield - 1
Holy Shock - 1
Resist Lightning - 9

At level 24 the main aura of Holy Shock becomes available to replace Holy Freeze. Along with this all extra skill points are placed in Resist Lightning, a synergy of Holy Shock, to increase the aura's damage even more. While Holy Shield received a point, the skill itself really isn't used in Normal beyond when engaging Act bosses, as the mana investment and low timer are simply prohibitive at level 1.

Holy Shock - 20

At level 43 the main aura is maxed and the character is dealing a respectable amount of damage. Offensively the character is very powerful, but it must be remembers that defensively he is fairly fragile due to not utilizing Holy Shield consistently.

Resist Lightning - 20

At level 50 the character is done maxing the main synergy to Holy Shock and his damage is significant. That coupled with a Zeal cycle that deals the maximum number of hits per cycle and this character can pretty much rip through any mod he encounters at this point, as lightning immunities won't show up until later in Nightmare.

Blessed Aim - 1
Concentration - 1
Fanaticism - 1

At level 53 Fanaticsm becomes available, as the way this character will deal with lighting immunes when they begin to show up. The general idea is to have a high damage weapon on switch with Fanaticism active on that switch. When LIs are encountered the character will switch to the alternative weapon/aura to deal with these monsters. It's best to ensure that the switch weapon has some decent elemental damage (not lightning) just in case a dual LI/PI monster is engaged.

Holy Shield - 20

At this point a decision must be made. If the plan is to make this character an excellent tank and concentrate on increasing defense about the 10k mark, then Holy Shield is the next skill to complete and will be done by level 70. This ensures that Holy Shield won't run out in the middle of a fight and provides a huge defensive bonus to the character so monsters have a much harder time hitting him to begin with. Couple that with the increase in blocking percentage that makes 75% simple to achieve and this character is going to be tough to hurt. If however defense isn't high on the list of necessary the increasing damage potential should be, so Salvation is the next skill to max instead to finish off all of Holy Shock's synergies, although a few more points into Holy Shield is recommended to increase the timer and the chance to block to acceptable levels. Say 5 hard points total.

Salvation - 20

If the defense route was taken then only Holy Shield is maxed then Salvation is maxed as well to finish off the damage potential of Holy Shock. This is completed at level 84 and finishes off the skills for this character. If any additional skill points become available they can be placed in either Zeal for greater Attack Rating or into Defiance as a synergy for Holy Shield and increased defense.

Final Skill Distribution:

Holy Shock - 20
Holy Shield - 20
Resist Lightning - 20
Salvation - 20
Zeal - 4
Fanaticism - 1

Tuesday, March 10, 2009

Diablo II: Pindlethon V

A Pindlethon is an event run about once per year in the SPF. The basic idea is that each participant kills Pindleskin two thousand times during the month long event. Each elite unique and set item is considered a qualifier and those numbers are tracked. The participant with the best 5 items wins. Normally the top few players get to take an item or two from those below them, but that was left out of this Pindlethon. That was something I don't mind too much since I am not a big fan of losing my best items or any grailers I might have picked up along the way. I'd survive it, but still not be too keen about the idea.

During the Pindlethon I placed all my qualifiers into an ATMA stash, and then once the tournament was over I promptly put them all into my general stashes. As a result I don't actually have hard numbers or data as to what I found. However I do recall my finds being one S/U per every 90-100 runs. Much higher percentage than a lot of the other runners. But at least I got my times down to around 25 seconds per run. It means I didn't waste too much time with this one, and found several grailers to boot.

My top 5 were:
1. Ohm Rune
Can be Inserted into Socketed Items
Weapons: +50% Enhanced Damage
Helms: +5% to Maximum Cold Resist
Armor: +5% to Maximum Cold Resist
Shields: +5% to Maximum Cold Resist
Required Level: 57
Item Version: 1.10+ Expansion

2. Mara's Kaleidoscope
Amulet
Required Level: 67
Item Version: 1.10+ Expansion
Item Level: 86
Fingerprint: 0xab5702d1
+5 to Strength
+5 to Energy
+5 to Dexterity
+5 to Vitality
All Resistances +29
+2 to All Skill Levels

3. Shadow Dancer
Myrmidon Greaves
Defense: 126
Durability: 12 of 24
Kick Damage: 83 to 149
Required Strength: 166
Required Level: 71
Item Version: 1.10+ Expansion
Item Level: 86
Fingerprint: 0x9f37c26a
+21 to Dexterity
+75% Enhanced Defense
Requirements -20%
30% Faster Run/Walk
30% Faster Hit Recovery
+1 to Shadow Discipline Skills (Assassin Only)

4. Earth Shifter
Thunder Maul
Two-Hand Damage: 116 to 637
Durability: 51 of 60
Required Strength: 253
Required Level: 69
Mace Class - Slow Attack Speed
Item Version: 1.10+ Expansion
Item Level: 86
Fingerprint: 0x9c7f08bd
+254% Enhanced Damage
10% Increased Attack Speed
10% Faster Cast Rate
150% Damage to Undead
33% Chance of Crushing Blow
+7 to Elemental Skills (Druid Only)
25% Chance to cast Level 14 Fissure on striking
Level 14 Volcano (17/30 Charges)

5. Trang-Oul's Girth
Troll Belt
Defense: 155
Durability: 12 of 18
Required Strength: 91
Required Level: 62
Item Version: 1.10+ Expansion
Item Level: 86
Fingerprint: 0x49f4ea27
+66 to Life
+40 to Mana
+30 to Maximum Stamina
+92 Defense
Replenish Life +5
Requirements -40%
Cannot Be Frozen

Overall I found seven grailers and five TC87 items. But still the prize was my only high rune (HR), the Ohm. I had found a Vex a while back in the Mephathon but lost it due to a PEBCAK problem when backing up my ATMA stashes. As a result this is my one and only HR at this point. Along with this I did gain an extra level with Malice, my Meteorb runner, bringing her to level 94 overall. So it was a very successful Pindlethon, all of my goals were accomplished so I'm happy with the results even though I didn't get more than two 3rd place votes.

Friday, March 6, 2009

Java: CharSi Update #22

Creating the GUI for the charm generator wasn't too difficult. It basically consisted of borrowing GUI pieces from other parts of the program. Since I've been doing that all along the page was up in a very short amount of time.


As expected the difficult part was creating the listeners behind the nice GUI interface. Many were fairly simple, for example the Clear JButton and Completed Items JList listener. On the other hand, other pieces were a bit more time consuming.

The list of prefix and suffixes came from a guide from the Diii.net site. Using this as my main information source I was able to setup the lists of possible values. From here creating the listeners was 75% of the entire page. First the selected item is obtained from the appropriate JList, then in the listener it is compared to all the possible options for that JList. Unfortunately the values possible differ with the size of the charm so once the mod is located then the program looks to see which JRadioButton is selected (and whose boolean flag was set to "true"). Once the charm type is identified then the String that will be tacked onto the end of the current display in the JTextArea is created.

if(mod.compareTo(AZURE) == 0){
if(smallFlag){
value = DetermineRangeValue(3,5,"Cold Resist %");
newMod = newMod.concat("Cold resist +" + value + "%\r\n");
}
if(largeFlag){
value = DetermineRangeValue(4,7,"Cold Resist %");
newMod = newMod.concat("Cold resist +" + value + "%\r\n");
}
if(grandFlag){
value = DetermineRangeValue(7,15,"Cold Resist %");
newMod = newMod.concat("Cold resist +" + value + "%\r\n");
}
}

When the Save JButton is selected a final check is done before the item is actually saved. It is possible to have both the suffix and prefix related to the same elemental damage type. Therefore a check must be made when the Save JButton is pressed before the charm is actually saved to ensure that these values are added together into the same mod line.

if(compare.indexOf("poison damage") )

The text in the JTextArea is rewritten if this is indeed the case and then the file is saved. Once saved the charms can then be added to the virtual character via a new tab in the Equipment page.

Adding and removing charms works the same way as all of the other equipment pages. The only change is the same charm may be added multiple times if desired. This avoids the need to create more than one type of charm and saves the user the hassle of scrolling through a long list of charms looking for just one more of a certain type of skiller.

One thing that was essential to this page is the charm counter display. This keeps track of how many charms of each type is already equipped to the virtual inventory and how many inventory spaces are left open. Before a charm can be added a check is made to ensure there is in face room for this charm. It can't be done on remaining spaces alone as grand charms can't be put in horizontally so only 10 total area allowed, for example.

grandFree = grandAllowed - grandCount;
if(charmSize == 3 && (grandFree == 0 || totalCount == 2))
add = false;

The checking method itself returns a boolean that is true unless it fails one of the checks such as above. It was actually easier to setup than I thought, as I was expecting to have to create an array of arrays that would replicate the physical inventory that I would fill in as charms were added. Not the best way to deal with the situation, so I'm glad the equations worked out as a much simpler solution.

Now the virtual character can be fully equipped, both with gear and charms. This includes the Battle.net only charms such as the Hellfire Torch. My next step is to create the ability to save characters so that they can be loaded in a latter program session without having to recreated them each time.

Java: Hotline Update #8

Another round of changes was made to the Hotline program today. This round was exactly the same as before, except that this time only an option for PDA Activation was added. Process was basically identical to before.

Again this was done in the month I wanted changes to take place, rather than before the reps were able to use the program. As a result I had to move all of the data created during the month out of the program and re-enter it under the correct date and representative's name to ensure the accuracy of the application.

Friday, February 27, 2009

Java: CharSi Update #21

Apparently there were more bugs and problems with CharSi than I thought. I posted on the Diii.net for anyone who wanted to download the current version of CharSi. It seems more than I thought did, but as a result they found several issues or necessary improvements that need to be addressed to make CharSi much more viable.

A few of the issues were very basic. They ranged from adding "on attack" and "on monster kill" to the CtC section of the rare/magical item generator, correcting the spelling of the unique belt's pathname and switching the "\" characters with "/" characters to support operating systems other than Windows. These were resolved almost instantly and with little fuss.

Other issues were a little more complex but didn't require anything I hadn't already done before. For example adding a tool tip to the Defense JLabel that displays the current blocking percentage or a tool tip to the Character JLabel (in Stats tab) to display the required character level for the equipment worn. These followed the code for the strength/dexterity tool tips almost exactly. The same can be said for the JButton added to the magical/rare generator for adding automods to equipment. This borrowed completely from the JButtons already present for Charges and CtC mods.

However a few of the issues were definitely more involved and required some reorganization of the code to implement. In the Skill calculator a prerequisite can be unchecked while leaving the skill that depends on it with points present. Also I added the feature that when a skill has points added, if it's prerequisites don't already have points then a single one is added. A typical example would be the following:

if(event.getActionCommand().compareTo(FIREBALL) == 0){
fireSpellsArray[3] = Integer.parseInt(levelSelected);
if(fireSpellsArray[1] == 0 && fireSpellsArray[3] > 0)
fireBoltBox.setSelectedIndex(1);
if(fireSpellsArray[3] == 0){
meteorBox.setSelectedIndex(0);
hydraBox.setSelectedIndex(0);
enchantBox.setSelectedIndex(0);
fireBallBox.setSelectedIndex(0);
}
}

When the JComboBox for Fire Ball is utilized a few things must now happen. First the value selected is saved in the appropriate array for damage calculations. Then the first If statement checks that all prerequisites (fire Bolt) have a value greater than one, and if they don't then one point is added. The next If statement checks to ensure that if the value for Fire Ball is set to zero that all skills for which Fire Ball is a prerequisite are also set to zero.

Another option that was added from suggestions made by the Diii.net crowd was in the Stats page. Specifically the GUI portion that controls which difficulty the virtual character is in and which quests are completed needed to be reworked so that these two pieces were independent of each other. Up to this point if the character were in Hell, it was assumed all quests up to that point were completed and therefore the quest rewards already applied. To correct that the JCheckBoxes for the quests were changed to JButtons. When a button is pressed a dialog appears asking how many times the quest is completed. Then depending on the answer the appropriate bonus value is applied to the character. Along with that the JComboBox for difficulty selection had all of the code corresponding to the quest rewards removed, so now all it changes is the difficulty resistance value (0, -40, 100 respectively).

The last major piece that was added was also a suggestion from the Diii.net group. It was mentioned that too much user input is required to equip items with variable stats. So I added the ability to have those values automatically assigned a value. The values I allowed were maximum, minimum and average, along with the normal user input. To allow for this the DetermineRangeValue method in each class file needed to have a few lines of code added.

if(CharSi.userInput)
userInput = Integer.parseInt(JOptionPane.showInputDialog(helmBackPanel, "Choose a value between " + start + " and " + end, modName, JOptionPane.PLAIN_MESSAGE));
if(CharSi.maxValue)
userInput = Integer.parseInt(end);
if(CharSi.avgValue)
userInput = (Integer.parseInt(start) + Integer.parseInt(end))/2;
if(CharSi.minValue)
userInput = Integer.parseInt(start);

The method returns userInput so beyond the alteration to the DetermineRangeValue method nothing else needed to be done. I did set it so the value the user wants is saved from one session of CharSi to another, as I'm sure it would be annoying to have to reset this every time the program is used.

I did make changes based on every suggestion made by the Diii.net forum. I made the changes I could do relatively quickly. There are still some, for instance the option to save a virtual character for loading later on, that are on the To-Do list currently. The ones left are more features than bugs, so I'm leaving them for now and will get back to them later. First I want to add the ability to create any type of charm and then equip it to the virtual character's inventory so that those stats can be counted as well. Once that piece is done I'll make the updates available.

Friday, February 20, 2009

Java: CharSi Update #20

The tab for creating magical and rare items did borrow extensively from the runeword generator class. For the most part both tabs look extremely similar. However there were also some major differences. Specifically rare/magical items can have charges and a chance to cast certain character skills, so a pair of JButtons in the bottom panel enabled those options.

The longest part was, as expected, creating the mod JList/Listener. The list of mods themselves was originally the same list that could appear on any unique/runeword item. Once the code was complete, then those mods that can't actually appear on an item, such as Poison absorb, were commented out. Creating the JList options wasn't difficult so the extra code wasn't a problem, as all that is required is a simple addElement call to the DefaultModelList. Then the Listener was simply a massive if-else statement. When a specific mod is selected the user is prompted for to choose a value to assign the mod, such as Fire resist +30%. Then a String is created and added to the bottom of the already existing item's description.


When completed the user clicks the Save JButton. When this happens the special mods that pertain to defense/damage are used to calculate the item's final values in those areas. The text in the JTextArea is then updated with this information to display the final product as it will appear in the Equipment tab.

With this update the program is completely usable. Not that it wasn't usable before but now any type of character may be created and equipped with any item that can be found ingame. It is possible to generate illegal items, say with +20 to all skills. The amount of checks I put in place were minimal so the user does need to understand a little bit about the game so they don't create hacked items. Perhaps in the future I'll add in the necessary checks, but for now as long as one pays attention it should work fine.

As it is now a working program and the mods have agreed it may be useful to a selection of the community I am prepared to make it available to the general public of diii.net. I need to first create a bit of documentation to walk users through the quirks of the application, but that shouldn't take too much time. Then I'll make a post in the SPF and see what type of feedback I get.

I do expect bugs to be found, I'm not naive enough to think I made a perfect program. Most of the mod values should show correctly, but I am worried the damage numbers may be slightly off. I did the best I could and they look right to me, but I haven't tried every single permutation possible so there may still be a glitch with my calculations. I won't know until someone points it out to me though.

After the documentation is complete the next step is to allow the virtual character to have an inventory. This means a charm generator is next on the agenda. That and fixing any bugs others find when attempting to use CharSi.

Currently CharSi can be downloaded via RapidShare from this location.

Wednesday, February 18, 2009

Diablo II: The Peasants Tournament

The Peasants Tournament by Morathi was an interesting concept for a tournament. The basic premise is that each character is a peasant, and therefore restricted from having access to certain items and skills. Specifically no spells above level 18 are allowed to be used, although they may have points added for synergy purposes. Also defensive equipment was restricted to those without metal and all equipment restricted to only normal/rare/magical, no set or unique items allowed.

I entered with Calypso, a Firewall and Glacial Spike sorceress. Her progress was slow but steady. In the beginning she simply went melee and whacked all of the monsters she encountered. Later, as points were invested in Ice Blast that skill was used as the main monster killer and as a support feature for the mercenary. Being mana intense I found the need to return to town early and often, which was quite annoying. Things didn't get any easier once Firewall was available, as that skill is fairly mana intensive as well. However on the flip side Firewall was able to kill off any monster fairly quickly so progress sped up a bit.

General game play saw Calypso freezing her enemies with Glacial Spike and then dropping a Firewall on them while a GS or two were thrown in to keep the monsters in place. For those monsters that were highly fire immune then GS and Static Field were used in concert, with the mercenary cleaning up the mess afterwards. While this worked well in Normal and the beginning of Nightmare it definitely slowed down a bit as NM progressed.

Alas Calypso met her end in the sewers of Act III due to player error. Instead of dropping a Firewall on Icewing's pack but instead Teleported into their midst instead. With no FHR or FCR Calypso was stun locked and the mercenary was unable to scare the pack away due to having a very weak weapon.

Overall it was fun, but I was beginning to doubt that Glacial Spike with only a single synergy would be viable in Hell to deal with all of the fire immune monsters. I tend to doubt it as it had major issues dealing with monsters in Act II NM, much less the massive HP increase they'll all get in the later part of NM and Hell. I don't think I'll rejoin this tournament, I have so many softcore characters I want to build and a lot of new toys from the recent MFO and Pindlethon to use on them. As a result I'm going to do that for a while instead of any public tournaments.