Philosophical Ranting of an Engineer

I’ve been spending quite a bit of time thinking, and playing, Demigod over the last couple weeks. One of the things I’ve been thinking about and meaning to write on is character design and balance, specifically balancing out all of their spells. I went to David Sirlin’s talk at GDC on balancing competitive multiplayer gameplay and it is very relevant to this game. One thing he specifically warned about was dominant strategies. Dominated strategies are bad, but people just don’t choose those and the game continues. Dominant strategies are bad because people pick them and it ruins everything else.

The general trend right now is that Lord Erebus is overpowered and ought to be nerfed, and I’m inclined to agree with them, but I want to mention a few things about Erebus and dominant strategies. Another way to look at a dominant strategy is a dominant talent. All of the heroes have many different spells and you aren’t required to take any of them. You get to pick and choose and for the most part all of the heroes can be played many different ways. But some heroes have dominant spells. They have spells that you, while maybe aren’t forced to take, should always take. There is little reason to not take them. They are as good or better than all of your other spells, so why not get it?

Take for example Erabus’ Bite spell. This spell is available at level 1 and offers several effects: damage, heals yourself, slows the enemy, reduces the enemy’s armor. That’s a lot of bang for your buck. It has a short cooldown and isn’t too overly priced. Erebus is special in my opinion in that ALL of his talents are very useful. Other characters I’m happy to take some spells, leave others, but with Erebus, I would take all of his spells all the time. They give him so much variety. But Bite is special. I always take Bite. I can’t think of an Erebus build that doesn’t take Bite. I could make a build that doesn’t use minions, or one that doesn’t use Bat Swarm, or Mist, but Bite? Bite is always useful. In the beginning of the game I use it to heal and harass the enemy. Later on I use it to reduce their armor and slow them. In my opinion, Bite is a dominant spell and should be nerfed, not because it is too powerful against other players, but because the decision to take it is trivial.

There are other spells like this and this is really just in my experience: Rook’s shoulder towers, Sedna’s Heal, Unclean Beast’s Spit. I’m sure you all have your own. And having your own “must have” spell is fine, unless it is everyone’s must have. Then it should be nerfed or the other spells buffed so we have to make some real decisions picking a build.

Army Ants Download

April 4th, 2009

A download for Army Ants has finally been released!

We demoed it at GDC last week and got a lot of really good feedback, as well as hearing from recruiters over and over that I need a playable demo of any games I’ve worked on. Thus, this last week I’ve really pounded away at a few nitpicky things like GUI, controls, menu and got it in a state that it can be distributed. Please, go download it and try it out and let me know what you think.

Edit: Official site

Capstone Day 3

March 11th, 2009

Yep, development on my capstone project has started and it is the beginning of day 3! I will try to keep this blog updated with our progression as well as some more in depth articles on what I’ve been working on.

On Monday, I began work on my deferred renderer, trying to get multiple render targets (MRT) working but didn’t have much luck. Yesterday was much smoother and I got MRT working, however it became apparent to me that a standard pipeline with some simple scene graph management was more important right now than a fancy deferred renderer so I switched over and started implementing the scene graph stuff I designed last quarter.

I would like to write up a more official post on the system later as I’m quite proud of it, so for now I’ll just tell you that it is a 3-part system.

  • Scene Graph
  • Spatial Graph
  • Render Graph

Scene graph updates hierarchical transforms and passes that on the spatial graph which manages collisions and frustum culling and passes objects in the scene to the render graph which can do render state sorting as well as batching and instancing and does the final draw call. That’s what I’m working on today.

Tank Frenzy (working title)

February 27th, 2009

It is finally done! After a quarter of work, our design doc for our capstone game is finished. Weighing in at 243 pages, this thing is massive! Go check it out.. Be warned, it’s about 8 megabytes.

Canada is a strange place.

The first trouble my friend Josh and I had was traversing the border crossing. The road split several times with no signs indicating which way to go. Fortunately we passed this test with flying colors. We later theorized that this was all part of an elaborate ruse by the Canadians to keep idiots out of their country. This theory has been supported through several further experiences.

This land has trolley. Trolleys are trains that drive on the road. Or you could call them buses that run on rails. They are big and scary and obey street lights. Cue foreshadowing.

Shortly after we arrived at the hotel. We both agreed this was a sketchy part of town. The hotel employee could not believe my friend’s name was “Josh? As in J.O.S.H.? As in Joshua?” He was astounded. Apparently no one in Canada is named Josh. This employee informed us that parking was two blocks away in an underground garage. Thus begins our adventure. We immediately drove down the wrong road and found a hospital parking garage. We drove some more and did not find any underground garage. We circled around again and drove into an area filled with trolleys. We turned down the alley and were greeted with traffic signs unintended for motor vehicles. It was not until the “TTL Personnel Only” sign that we realized we were not where we should be. Unable to turn around due to the incoming trolleys, we continued on. Employees gave us strange looks, we were unfazed. We would escape this trolley land.

We did and then circled the area a couple more times before returning to the hotel for a map. Armed with directions to the parking garage we made it to a nearby apartment complex with an underground garage. We drove down into the garage and parked the car. As we began walking out a man sitting in a van a couple parking spots down from us beckoned us over. He asked us if we were staying at the hotel. He then told us that we should take any valuables out of the car because a vehicle had been broken into the night before. He then elaborated saying cars had been broken into several nights in a row and he was sitting down there to catch people. Josh and I quickly decided we didn’t want to park in that garage and took the man’s advice that parking on the main street was safer.

Due to all this excitement, Josh and I plan on finding a different hotel to stay in tomorrow and Friday night.

Pictures of the hotel room will be coming shortly, but for now a checklist of features:

  • missing light bulb
  • old computer
  • no walking space
  • very loose bathroom doorknob
  • air conditioning unit covered in plastic
  • electrical cord duct taped to the floor
  • and free wireless internet (which we are using to find a different hotel)
  • broken deadbolt (edit)

Zone with a purpose

August 1st, 2007

In World of Warcraft (WoW), there are many different zones or geographical regions. Each zone has a variety of monsters to fight and quests to complete. Zones are designed for characters of a certain level range. Some zones are places where low level characters can fight, quest, and level while some are for high level characters. I think zones could be organized better than they are now.

When playing in a zone, a player has the option of taking on quests. These quests might have the player talk to or deliver an item to an NPC. Or he might be asked to kill a number of monster or kill a single powerful monster or retrieve an item that is guarded. Whatever the quest is, the player receives experience and gold and sometimes an item for their work.

Some quests have follow up quests. A player might get a quest that asks them to kill 10 small monsters, then 5 big monsters, then kill the boss monster. Some quests are elite, that is they ask you to do something very difficult and are for groups of people to accomplish. Some of these elite quests are dungeon quests. That means you must go into a specific dungeon, filled with elite monsters, in order to complete the quest. Elite quests and elite dungeon quests generally give the greatest rewards in terms of money and items.

Quest lines are a great way to give players continuity to what they are doing and give them more of a purpose than simply being given a smattering of unrelated quests. I believe that more can be done to give players more of a purpose and a direction and make the quests and the zones more compelling.

I propose that quests in zones should be related and should guide the player along a mini-story. After finishing with quests in a region, a player will have completed a variety of quests leading up to defeating the overarching evil boss in the zone’s dungeon. While some quests will be unrelated to this path, most will progress the player along a branching series of quests. To give you an idea of how I imagine the quests to work, here is a graph.

In this image you can see several nodes with direction lines connecting them. The square nodes are normal quests, the hexogonal ones are elite. The line signifies what quests unlock another quest. In order to start the “Kill 10 Blobs” quest you have to have completed “Talk to Quest Giver.” However the lines are not requirements in that all must be completed, the line only means it unlocks a quest. The “Kill Mini Boss” quest doesn’t require you to complete all 3 prerequisite quests, only one. This means that if you loathe collecting quests, you can avoid those and focus on the killing path. Or maybe you want to complete all of them, you are free to do that. I think the number of quests in the area and the experience given should be such that a player need not complete all quests in order to level past a zone, letting him pick and choose.

I would expect a real quest graph for a zone would be much more complex with some dead ends, unconnected branches, but this would be the general shape. The idea is that all of the quests leading up to the dungeon quests, are preparing you to face the end boss. As you work your way through the quests you learn more about the evil boss and all the horrible things he has done to this zone and why you must defeat him.

This method of organizing quests and displaying a quest graph to player (information to be filled in as players discover each quest) means that players know they are working towards something as they play through a zone. The best rewards come from finishing the elite quests and running the dungeon. They have choices on which quests they want to do on the path to the elite quests. By requiring players to finish a series of quests to get the elite dungeon quests, players will feel more of an accomplishment and purpose to running the dungeon. I feel that dungeons right now are rather unattached to the rest of the zone.

In my final quarter at Rose, I took a class entitled Game Design & Development. This was a 10 week course where we were taught about a variety of topics about game development. The core of the class was the game that we wrote. My team consisted of five people and we spent six weeks working on our game.

Wombat is a top down 2D shooter, similar to games like Alien Swarm and Smash TV. My team wrote the game from scratch. I was responsible for basic architecture, rendering engine, collision detection, particle effects, and numerous other small features.

Considering the scope of the project, a class project where none of us had any real game development experience, the time, six weeks, and team size, I consider our game to be a smashing success. By the end of the class we had a stable engine, working weapons and magic, an interface with a map editor, a working menu system, and AI. The game is nowhere close to being publishable, nor would it win any awards, but it is an excellent working prototype. Given a couple more months, I think our team could have turned the game into something really fun.

Read the rest of this entry

I’m sure you were all holding your breath. I just heard back from my recruiter today and I didn’t get the job.

Considering my goals of wanting to work in the game industry and weighing working at Microsoft on something unrelated to games for two years versus going to grad school learning how to make games for two years, I’m not sure I would have accepted a job at Microsoft. But, I was a little excited about it and disappointed I didn’t get it.

Also, I would have very disappointed if I couldn’t be friends with Tim anymore

So now I’m waiting on RIT to see if I get a graduate assistantship position. I should hear within a week hopefully.

Fun With Tiles

April 6th, 2007

This blog may or may not turn into “fun and exciting experiences Matthew had while writing his game.”

My engine is coming along nicely. It loads and draws a map and can draw units. I was doing some refactoring because the TileEngine class was responsible for loading the Map and I thought the World class should be doing that. So changed some code so it was the World that created the map and then passed it to the TileEngine for rendering. Lo and behold once I got it compiled and ran it I was displayed a beautiful blue screen, which is the background color. No tiles! I was very distraught as there were no exceptions to trace and no null variables I could locate. I had no idea why it was no longer drawing my game.

And then I remembered two little lines of code that I had deleted and forgotten to replace.

myWorld.Map.TileHeight = 48; myWorld.Map.TileWidth = 48;

These numbers specify the number of pixels in every tile of the map. These variables are used everywhere in my rendering engine. It uses it to specify the size of the tiles; it uses it to determine where to draw units. I had forgotten to set these values and thus they were the default C# value: 0.

Behold, my rendering engine was working properly! Only it was drawing all the tiles with 0 height and 0 width. It was drawing and infinitely small map. I added the lines back in and everything worked.

Programming Tip of the Day

April 5th, 2007

And now for the Programming Tip of the Day. The first piece of code is not equal to the second piece of code. Can you spot the difference? It took me about a half hour to realize that this was the reason my units were jumping around and not moving smoothly.


(int)((myUnit.PosX - myCamera.TileX) * Map.TileWidth)


((int)(myUnit.PosX - myCamera.TileX) * Map.TileWidth)

Graduate School & RIT

February 23rd, 2007

I got accepted to RIT!

Rochester Institute of Technology (RIT) has a brand new graduate program entitled Master’s in Game Design & Development. I applied there and a couple days ago was informed that I was accepted! Right now I haven’t applied to any other schools, such as USC, so I need to figure out if I would even consider those if they accepted me.

Among other things, I’m on quarter break right now which means I have exactly one more quarter to go!

Dice Wars & kdice

December 23rd, 2006

I’ve been holding back as best I could, but it is finally time for me to post! I’m sitting around waiting for my laundry to finish and contemplating taking a shower before I fly home for Christmas break and I am playing kdice. What is kdice you may ask? It is an ingenious little multiplayer game you can play in your browser! But what is it? First, we must discuss Dice Wars.

Dice Wars is a Flash game similar to Risk. There are many territories and you must conquer the entire board. Your armies are little dice. When you attack another territory, all of your dice are rolled and all of their dice are rolled and whoever has the greatest sum wins! It is an addicting little game and you should go play it now. The beauty is in its simplicity and speed of play.

Once you have the hang of that and are ready for more, then you can move onto kdice. kdice is a multiplayer clone of Dice Wars. For more information, check out its Wikipedia page.

I’ve been playing kdice quite a bit and my score has climbed. Yes, it keeps track of points using a system similar to that of Chess. You can view my profile here. Go sign up now!

Capture the Flag AI

November 15th, 2006

This last quarter I was taking an AI (artificial intelligence) class. Our final project was to create an AI player for a simple capture the flag game. At the end of the quarter all the teams would compete in a tournament. Whoever won the tournament got an A on their AI and bragging rights!

My friend Jonathan, the same one who went to Florida with my roommate Eric and I, was my partner and we put in many hours on it. Unfortunately we were unable to polish it up completely. We had no idea how well we would do in this tournament as there are a lot of really smart people in the class who spent a lot of time on it.

We found out the standings today. We got 4th place! Check it out

To read a paper we wrote about our player, you can read the rest of this post.

Read the rest of this entry

Halo Evolution

October 8th, 2006

I recently discovered a video made by some of the developers of Halo where they comment on a video of Halo at different stages of development. It starts way back when Halo was going to be an RTS. Its really cool to see how it progressed as well as humorous to hear the developers joking with each other.

View the full article to watch the video.

Read the rest of this entry

Summer Update 2

July 22nd, 2006


So I found work since I last posted. I’m writing a Rails app for a guy in Van Nuys. Its fun and challenging. Hopefully it won’t take me much longer. Once It gets close to production state I’ll let you guys know more about it.

Since I began working on this new project I haven’t touched Showcase. This isn’t to say I have forgotten about it, I just feel that I’m learning more by working on this new project. It is similar in many ways and I’ll be able to use the more sophisticated methods I’m learning from it to make a better Showcase.

Speaking of learning new Rails stuff, I watched David Heinemeier Hansson’s keynote address at RailsConf 2006. DHH is th e creator of Ruby on Rails. He had a lot of ineresting things to say, mostly concerning CRUD and using it to design your software, but he also spoke of some new Rails stuff that would be revolutionary, as well as some bleeding edge stuff he had only been working on a few days. If you have an hour to spare and want to learn about programming, not only Rails, I suggest you watch it. Follow along with a pdf of his slideshow.

I was able to directly use some of his CRUD ideas in my project. Approaching design from a CRUD point of view made my many-to-many relationship more manageable and more elegant.

All this thinking about CRUD has got me thinking.

Creating an Engine on Rails

I still want to write a 3D engine, although it is put on hold while I am doing a lot of Rails. It has always struck me that writing an engine seems like a sloppy thing. There is no agreen on organization, no framework for how an engine should be organized. Of course this means that I get to do all that for my engine, but why is this? Perhaps it is because all 3D engines have to be very specific and thus not much can be generalized. Or so few engines are written that putting forth the effort of writing a framework is pointless. I think neither of those is true. I look forward to really thinking about building a framework for my engine. Most likely I will be basing a lot of it off of Rails, as it is what I know, and I think it is organized very well. I can’t wait.


My dad and his good friend Scott bought a Coronado 15. This is a 15ft dinghy with a mainsail and a jib. It is designed for two people. My dad used to own one a long time ago and one of his favorite stories is of when he and a friend found the “ultimate wave” for a C15. The boat isn’t dog slow, nor is it as quick as something like a laser. I have not yet been out on the water, Scott took it out for the first time today, but I hope to sail it a lot before I go back to school.