PullMonkey Blog


28 May

A Warcraft III 2v2 Strategy That’s Effective and Hilariously Fun!


The funnest warcraft games I’ve ever played are usually arranged 2v2 games with me and my friend Jacob. We always have fun devising hilarious and original strategies that always leave us laughing by the end of the game. One such strategy is one I recently came up with involving an all out footmen archer rush with both hero’s being Tinker.

The first step in this strategy is in the arranged team screen after you choose your partner is THUMBS DOWN (veto) ALL MAPS WITHOUT A TAVERN. We didn’t bother to do this and we got depantzed (and nearly solomized) 5 times in a row because we kept having to play on maps without taverns. It blew.

The second step is choose your races. We used to go Orc and Night Elf because grunts are pretty kick ass melee, but if they upgraded or built towers we always got owned…bad. Now we go Human and Night Elf. I like to build footmen and research Defend quickly. Pesky burrows and gay towers are rendered mostly ineffective.

Now starting off as Human. The first thing you should do is send 4 peasants to your mine and have your fifth start a Barracks. When you build your sixth peasant send him to mine gold (you should have 5 peasants getting gold now) and send all subsequent peasants to harvest lumber. (in total i usually have 6 peasants getting lumber, you will probably end up have excess lumber though). After your seventh peasant returns his first full load of lumber, have him build a farm, then with your eighth peasant build a second farm. When you have enough gold and lumber, build a second Barracks with one of your lumber harvesting peasants. When you get enough gold and lumber after that, build your altar. You should build another farm around this time as well. Build footies at your first Barracks when it is built. When my second Barracks is finished I try to research Defend immediatly there. After that, just pump out footies from both.

Night Elf should send 3 wisps to get gold and the 4th and 5th wisp to make a Moonwell and an Ancient of War. The next two wisps trained should go to your mine, and subsequent wisps to harvest lumber. With the wisp that is building the Moonwell, when he is finished have him harvest a little lumber, probably 5 and then with him, build your Altar. When you get enough gold and lumber build another moon well. A second ancient of war and a third moonwell should be build next when you have the means.

One of the things that is so awesome about buying Tinker is you can build your Barracks (or AOW) first and start pumping out footies (or archers) and still have your hero almost as fast as someone who built his altar right away. There is no need to send a peasant or a wisp to the tavern to buy your hero, just rally your units there. That way you can be off and rushing without having to wait for your units at your base. ALWAYS REMEMBER TO CHANGE YOUR RALLY POINT to have your units follow your Tinker when you build him. When we forget to do this, we almost always lose. Also be sure to have enough food to buy your Tinker. When we first started doing this we forgot to make a Farm or a Moonwell quickly enough and we’d end up having to wait a while before we could get our Tinkie. Also HOTKEY YOUR BUILDINGS (if you don’t already) it’s makes it soooo much easier to send reinforcements. (Hitting key# and F to build a footman as opposed to going back to your base clicking on Barracks and clicking on footman picture).

It seems like lately a lot of players have been going for a hero rush. If they do this ignore attacking them with your units and go straight for their base. Pocket factory and units do much more damage to them than just one hero will do to you. Of course, if you can, try to micro your peasants/wisps well and protect them. Human can possibly builld an arcane tower early if he has enough gold. NE shouldn’t build a tower, just try to micro your wisps or rally them to a spot where they aren’t easily seen. Also some retards attack your entangled gold mine. It is free to repair, just be careful not to let the wisp who is repairing it die. Switch them out if you can. Meanwhile you’ll be attacking their base with a sizable force of footies who have defend and archers. They will send their hero back to their base if they are smart. If not, just keep killing their base and try to protect your base as well as possible.

The abilities your Tinkers you should get are 1. Pocket Factory and 2. Engineering Upgrade. Try to lay your pocket factories near their buildings where your units will be. Most opponents will try to kill archers first rather than footmen, try to keep footmen between your enemy and the archers. If they get past, the Night Elf guy might have to run a lot. That is okay though because while your enemies are chasing him, the Human ally has free reign on their base.The order of base attack priority is this. 1. Orc; 2. Human; 3; Undead; 4. Night Elf. Whichever opponent’s race has the highest priority on this list you should attack first. If you don’t know or didn’t scout as a rule we usually go to the opponent closest to your Night Elf’s base. That way wounded units can be send back and healed faster. We really don’t upgrade our bases because most of our resources are going into pumping out footies and archers. If they are able to defeat you, you probably will lose, but rather than upgrade, we just try to keep attacking them.

Some things:
For the Human: Turn off defend if you see a hero or unit who is hurt and you have a possibility of surrounding it and killing it, or if your teamates archers are getting flanked by melee (pretty much turn if off if you need to get somewhere quickly). If you’re trying to surround a unit, use the move command a few times to move your units past it, then when it is in the midst of your units click it with your melee and they will attack it from all sides. If you don’t kill it and it escapes into it’s base, you don’t have to follow it. Just stay near the outside of the base and keep killing buidings. If you teamate is getting flanked. Try to help him. Archers are so unbeleivably weak. Try to get between him and the enemy.

For the Night Elf: Try to focus fire. It helps big time. Intelligence heros are easy to kill, but dont chase after them if they run into their base, just choose a different target. If they have huntresses they should be given high focus fire priority. They take extra damage from peircing attacks.

If they upgrade towers, it’s not a big deal. Defend (and also more or less archer’s Elune’s Grace) will nearly negate them. You don’t have to go deep into their base to kill the tower, just let it upgrade and kill the outer buildings or units.

Attack the same base the entire game unitl you kill it. After you kill it, scout the other person. Now you can upgrade your Town Hall or Tree of Life to build units to counter them. We usually are able to kill them right after we killed the first guy though.

If you can, try to avoid attacking a Night Elf base first. Ancients are hookers to kill and they hurt footies a lot. Also, most of the games we’ve lost were due to a Demon Hunter constantly mana burning us.

Against Orc, we usually go for burrows after we’ve defeated most of their units, they don’t do much damage if you have Defend and you can cripple an Orc easily by killing just one or two. Burrows take so long to build and they supply 10 food.

WIth the build order I suggested you probably won’t be able to buy your Tinker when it is immediatly available, but you WILL have more units. Feel free to deviate from my suggestion depending on what you feel is best.

You might have to try this strategy a few times to get used to it before you get a win. Be patient. Trust me, it works.

I hope you have as much fun as we did using this strategy. We crack up after almost every game when we do this. Be prepared to be called a noob for doing this strat because most people cry when this happens. This is possibly the funniest part. I guess according to their logic, you are a noob if you come up with a winning strategy, . Let me know if you guys consider it a noob strategy. This strat is ESPECIALLY satisfying when you kill someone who tries to hero rush you. GL! HF!


27 May

Emover Help


I have spent a few hours throwing together this application to allow emovers to track their moves a little easier.

Everytime an emover logs in, the system collects their latest moves and updates their older moves with any changes in status. The system tracks all dates, revisions, notes and many other things.

If you are an emover then go ahead and try it out here.



Some of my future plans involve the following:

  • Letting the emover store their password with the system (encrypted) to allow the system to periodically check for new moves.
  • With every new move that is found the user can receive emails and/or text pages.
  • Anything else that comes up, let me know.


27 May

The Projects


I have started doing some projects.

You should check them out - The Projects.


22 May

Back from RailsConf2007


RailsConf was awesome!

Until I have more time to blog about all the stuff I learned, you can check out the presentations here.



No Response Filed under: Home, rails, railsconf
15 May

RailsConf2007


RailsConf 2007.

I leave for Portland tomorrow! Check out my schedule here.



1 Response Filed under: Home, me, rails, railsconf, ruby
03 May

Converting ruby Array to Hash


I ran across a situation that required the know-how of converting an array into a hash.

Converting a hash into an array (obvious):

1
2
3
4
  >> hash = {"a" => 1, "b" => 2, "c" => 3}
  => {"a"=>1, "b"=>2, "c"=>3}
  >> array = hash.to_a
  => [["a", 1], ["b", 2], ["c", 3]]

Now back to hash from an array, you could try array.to_h, or array.to_hash, but apparently not.

1
2
  >> hash2 = Hash[*array.flatten]
  => {"a"=>1, "b"=>2, "c"=>3}

The * of *array converts array into an assignment list.

The * opperator can also be used on the left side of the assignment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  irb(main):001:0> a = ["1","2","3","4"]
  => ["1", "2", "3", "4"]
  irb(main):002:0> b,c = a
  => ["1", "2", "3", "4"]
  irb(main):003:0> b
  => "1"
  irb(main):004:0> c
  => "2"
  irb(main):008:0> b,*c = a
  => ["1", "2", "3", "4"]
  irb(main):009:0> b
  => "1"
  irb(main):010:0> c
  => ["2", "3", "4"]

Notice how using the * in front of c made it a list, in otherwords, c contains the remainder of elements in a after b got its assignment.

Neat, eh?



No Response Filed under: Home, development, ruby
02 May

Riff - ActiveRecord diff plugin


The other day I went looking for a quick way to get a diff between revisions of a record for ActiveRecord.

This led to the Riff plugin for Ruby on Rails.

There are two uses of this plugin:

  1. object1.diff?(object2) #=> true | false
  2. object2.diff(object2) #=> hash of differences

Here is an example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

    >> requests = Request.find(:all)
    >> request1 = requests[0]
    => #<Request:0x2a9c93f360 @attributes={.....}>
    >> request2 = requests[1]
    => #<Request:0x2a9c93f310 @attributes={.....}>  
    >> request1.diff?(request2)
    => true
    >> request1.diff(request2)
    => {:last_email_alert_at=>[Wed Apr 11 15:36:03 MDT 2007, nil], 
           :description=>["hello", "goodbye"],
           :due_date=>[#<Date: 4908383/2,0,2299161>, 
                       #<Date: 4908421/2,0,2299161>], 
           :summary=>["Do this for me.....", "Test"], 
           :created_at=>[Mon Apr 09 10:58:24 MDT 2007, 
                         Mon Apr 09 11:08:17 MDT 2007], 
           :last_email_alert_by=>[2, nil], 
           :version=>[30, 1], 
           :updated_at=>[Wed Apr 11 15:36:03 MDT 2007, 
                         Mon Apr 09 11:08:17 MDT 2007]}

Yah, so that is cool, but with a little more time on my hands I decided to figure out what is going on behind the scenes.

Here is how you would normally get a diff between hashes, unfortunately you will see later this does not work so well:

First, create the hashes:

1
2
3
4
  >> r1 = requests[0].attributes
  => {...}
  >> r2 = requests[1].attributes
  => {...}

Next, show that the records contain the same keys:

1
2
  >> r1.keys - r2.keys
  => [] 

Let's get the diffs, one for first - second and one for second - first:

1
2
3
4
5
6
7
  >> diff_2_1 = r2.values - r1.values
  => [Mon Apr 09 11:08:17 MDT 2007, 4, "Test", "goodbye", 
    #<Date: 4908421/2,0,2299161>, Mon Apr 09 11:08:17 MDT 2007]
  >> diff_1_2 = r1.values - r2.values
  => [Wed Apr 11 15:36:03 MDT 2007, Wed Apr 11 15:36:03 MDT 2007, 
    3, 30, "Do this for me.....", "Hello", #<Date: 4908383/2,0,2299161>, 
    Mon Apr 09 10:58:24 MDT 2007]

This would be perfect if the results of the hash diffs were the same size:

1
2
3
4
  >> diff_1_2.size
  => 8
  >> diff_2_1.size
  => 6

Well this means we can't assume the indexes match. So here is how we really need to get the hash differences:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  >> ra1 = r1.to_a  #=> converted to an array [[key,value],[key2,value2]...]
  >> ra2 = r2.to_a  #=> converted to an array 
  >> diff_a_1_2 = ra1 - ra2 
  => [["updated_at", Wed Apr 11 15:36:03 MDT 2007], 
    ["last_email_alert_at", Wed Apr 11 15:36:03 MDT 2007], ["id", 3], 
    ["version", 30], ["summary", "Do this for me....."], 
    ["last_email_alert_by", 2], ["description", "Hello"], 
    ["due_date", #<Date: 4908383/2,0,2299161>], 
    ["created_at", Mon Apr 09 10:58:24 MDT 2007]]
  >> diff_a_2_1 = ra2 - ra1
  => [["updated_at", Mon Apr 09 11:08:17 MDT 2007], 
    ["last_email_alert_at", nil], ["id", 4], ["version", 1], 
    ["summary", "Test"], ["last_email_alert_by", nil], 
    ["description", "goodbye"], 
    ["due_date", #<Date: 4908421/2,0,2299161>], 
    ["created_at", Mon Apr 09 11:08:17 MDT 2007]]
  >> diff_a_2_1.size
  => 9
  >> diff_a_1_2.size
  => 9

Well, that's odd there appear to be nine differences, where as before we saw a max of eight differences. This difference in size can be explained by the missing nils in the prior example.

Now we create the diff hash, to have results like riff:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  >> diff = {}
  => {}
  >> diff_a_1_2.each_with_index do |d,index|
  ?> diff[d[0]] = [d[1],diff_a_2_1[index][1]]
  >> end  #=> populates the diff
  >> diff
  => {"updated_at"=>[Wed Apr 11 15:36:03 MDT 2007, 
                     Mon Apr 09 11:08:17 MDT 2007], 
    "last_email_alert_at"=>[Wed Apr 11 15:36:03 MDT 2007, nil], 
    "id"=>[3, 4], 
    "description"=>["hello", "goodbye"], 
    "last_email_alert_by"=>[2, nil], 
    "summary"=>["Do this for me.....",   "Test"], 
    "version"=>[30, 1], 
    "due_date"=>[#<Date: 4908383/2,0,2299161>, 
                 #<Date: 4908421/2,0,2299161>], 
    "created_at"=>[Mon Apr 09 10:58:24 MDT 2007, 
                   Mon Apr 09 11:08:17 MDT 2007]}
  >> diff.size
  => 9 

Now if you compare the results above with the results I showed for riff, they are almost identical, riff just takes the extra step of ignoring the differences between id, since that is implied.