Saturday, February 8, 2020

Of Course I Want to Be a Game Developer

Does making a puzzle game that takes 10 minutes to complete give any indication of if you want to be a game developer?

I'm not sure, but here's what I learned...

I grew up playing video games, and I'm a professional software developer. 

That's a combination with an easy path to day dreams of game development.

Even aside from the career, what's it like to make a game? Is there some naiveté involved in thinking because you enjoy playing games that you'd enjoy making games?

It's fun to speculate about, but I figured I'd just try it out. 

In early 2017, I bought RPG Maker MV on Steam, and started playing around with it.

I had a nephew that was interested in game development and thought it might be fun to try it out together. He popped over for a few times and then it fizzled, but I figured I'd stick with it.

The hello_world mess-around map evolved (somewhat) into what it is today... A watered down puzzle game like Day of the Tentacle that feels like a it was made for SNES after N64 came out :)

This really isn't anything more than a homework project that no one would play. It HAD to be about the experience. But because there's nothing on the line (even a desire for positive feedback) it can't be the full experience, so what's next? So what have I really learned?

Here's what I came up with during the on-again, off-again, very part time effort I put into this over 3 years.

Self-imposed Constraints Are Good

With a bit of foresight, I set down the following constraints:
  • Don't create the need to "balance" very much
  • Don't rely on interesting/unique assets
  • Keep the scope manageable (though I had no idea what that meant)


  • Finish it! Engage in something, learn it, care about it, and, most importantly, see it through.
  • Both a hobby and exploratory to feel what the "day to day" is like. 

The Process

Determine Game Style - Puzzle Adventure Game

Given my constraints and objectives, a puzzle adventure game seemed like a safe bet. No fighting, no crazy effects, no need for lots of rooms. In fact, a good puzzle game often makes use of gates to bring new life to the same areas.

Learn RPG Maker MV

This was done through trial and error, and lots fo YouTube videos. 

Echo607's channel was helpful for this, and lots of forum digging.

Fortunately, all I really had to figure out was:
  • Basic tile mapping
  • The Event System
  • The Plugin System (though this was more for curiosity)

Figure out the game

This article proved to be invaluable for formalizing a puzzle game.

The Dependency Graph 

I grabbed yED, a piece of paper, and opened up the resource browser in RPG Maker MV and just started brain storming.

This was a very iterative process.

I'd describe it like the following:

  • Randomly create buildings or section of the town while processing RPG Maker MV Tutorials
  • Brainstorm "puzzle" ideas while doing this.
  • Ideas were driven by the available assets. (I think the only asset I went out and got was the magnet)
  • The sequence of events naturally (and somewhat arbitrarily) took shape.
  • I used the Dependency Graph to keep my thinking, the reality of the game, and the consequences of each "gate" in sync.

After 3 years, I had a game! More or less.

Things I Noticed

I really felt the lack of automated testing

In Web Development, you really get spoiled by being able to write an automated test that fires through your application. I started feeling that especially towards the end of this project, when I was tweaking little things.

Next time: I'll at least do some research into how to automate testing 

It's Hard Not To Want to Do More

Even with my constraints, I still wanted to do more. Item overlays, different tilesets, plugins galore... The options are endless. And having them takes up emotional energy. Even wondering if you could be doing something better with a plugin takes up emotional energy!

Next time: There shouldn't be a hard rule for this. Just be mindful of the cost of exploring new things that go beyond what you were originally intending. Remember to embrace constraints.

"Finishing" is Hard

"The first 90% of the project takes the first 90% of the time, and the last 10% takes the other 90% of the time." True for all projects! This seems common knowledge and was expected.

However, the more interesting thing is the mental component that comes with finishing. It's like my brain was coming up with excuses to not be done. Not sure what I was afraid of... Putting it out there? Not having something to pass the time? That I hadn't put enough effort into it? That I'd be judged? Who knows!

Next time: Again, this is just something to be aware of. If we anticipate the mental resistance (Resistance?) then we can brace ourselves for it and actively counter-act it.

To collect Analytics or not?

The amount of tracking that happens as we browse the web creeps me out just as much as everyone else. However, I just read Richard Garriott's book, and he talked about how, for the first 3 games he made, he got no feedback. It wasn't until his company also became the publisher that he realized there was fan mail.

So, I figured, why not... So right at the end of the project, I slapped in a connector to Google Analytics, just to see what it felt like.

Next time: If I do another one of these games, I think I'll consider analytics at the start, and maybe even roll out my own service to collect them. I'm not wild about giving so much free data to Google.

The Dependency Graph was fun to do any crazy useful

I can't stress enough how important it was for mental clarity to have the Dependency Graph. Keeping it up to do with what was actually changing in the game forced me to deal with any plot/puzzle continuity problems right up front.

And this is for a game that takes 10 minutes to finish. I can't imagine doing anything bigger without one.

Next time: For sure have a dependency graph!!

Scripting is great

Having the ability to break out from the high level event system in RPG Maker MV was great once the logic got complicated. You can introduce your own game-specific plugins that essentially let you write JavaScript to do anything you want.

Next time: Keep using the Game Engine tools for common things, but don't hesitate to go to Plugin Scripts as soon as things start getting awkward with the editor.

The Game

If, for some strange reason, you're interested in seeing the game, you can play it here: 

Saturday, November 17, 2018

Using Symfony 4, PHPUnit, and PHPStorm

It took me a few minutes to work out how to be able to run PHP Unit from within PHPStorm for my new Symfony 4.1 project.

Here's the configuration that ultimately worked, with no fiddling of any configuration files or changes to my symfony code of any kind.

The relevant part of the Path to phpunit.phar is: <your-project-directory>/bin/.phpunit/phpunit-6.5/phpunit

You'll receive something along the lines of

Fatal error: Class 'Symfony\Bundle\FrameworkBundle\Test\KernelTestCase' not found

when running your unit tests if you haven't checked the 'Default configuration file' box.

Wednesday, August 29, 2018

2018 Diner Dash Bike Tour - Henderson Harbor, NY to Selkirk Shores State Park, NY

Overnight at a camp ground in upstate New York, keeping it light at around 55 miles of biking.


  • Take it easy
  • Don't shy away from stops
  • Eat a lot!
  • Shake down the rigs
  • Get out of the cottage for a bit

The Crew

Jim, John, and Adam. Adam and I have done an overnight or two before, but this was John's first time doing anything like this. 

Jim, John, Adam

The Route

The route to the Selkirk State Forest
The route we took
Route 3 is a moderately bike-friendly highway that's just inland from the eastern edge of Lake Ontario. It had the attractive feature of presenting a straight line between our starting point and destination.

Naturally we avoided this!

To dodge traffic, add some miles, hit a few stops, and vary the scenery, Adam plotted an alternative route that focused on back roads, passed through a few small towns, and gave us a chance to check out Monitor Mills Falls.


Monitor Falls

This was a surprising gem with very little indication of its existence, and we blew right past it initially. It was worth the backtrack, though.

It's a short way (less that a quarter mile) down Monitor Mill Road off of 289, but there are no signs. You'll see it when you cross a small bridge. There's a parking lot (a grassy field) on the south side of the road, from which you can find steep trails running down into the creek valley. One of these even has a rope aid the descent. Alternatively, you can walk across the street to the entrance of a field, and follow a gently sloping grass path down to the upper part of the falls themselves.

Monitor falls on a "low" day
When we visited, the water was low. A later trip back featured water gushing across the entirety of the stone wall.

The low water allowed us to splash around safely, and fully explode the lower part of the falls.

It was a great stop, and very refreshing.

Random Blueberries

There were a few more hills that we originally expected. At the crest of one of the bigger ones, we couldn't resist taking a quick break and picking some blueberries at Farnham Farm. Some friendly conversation with the woman at the stand, a local of near-by Pulaski, a potassium rich snack, and some rest for our middle aged legs, and we were off again.

Selkirk Shores

We went in to Selkirk Shores through a back way, that would have only been accessible via bike, as the gravel road was gated. This was accessible via Pine Grove Road.

The park itself was very nice, with a different feel to it than the rest of the area... Cooler, older, mossier. It felt like we were in a state park. We didn't have time to explore it, as it was late when we arrived, but there trails looked well groomed and maintained.

We camped in Loop B. The sites felt a bit cramped and close together; there was no natural separation between each spot. However, this was fine for the evening, as it wasn't crowded and quite. The area for tents was level, and there was a fire pit. The outer sites on Loop A looked slightly more secluded (though not much) with a small about or natural separation between the sites.

Returning on Route 3

Our initial concerns about Route 3 were that it was too busy and would feel risky. That concern was reinforced for the first two miles, where pavement grooming was occurring, the lanes were tight, and it seemed like all commuters upgraded to semi trucks. Fortunately, once the construction ended, the wide shoulder revealed itself and it was pretty easy going for the rest of the way home. We were passed by several other bikers during a breaks, and we didn't have any close calls.

At the Trolley Ice Cream shop, we were flagged down by a large group of riders touring from DC to Canada. They offered us some giant cinnamon rolls that we couldn't refuse, despite the stop happening between our recent snack break and an imminent lunch. I wish I had captured the name of the group!

Tuesday, January 29, 2013

Bootstrap Modal Double Backdrop

I recently had an issue where I was getting the modal-backdrop class applied twice, so I ended up with two overlays.


Upon calling .modal(), I ended up with a very dark background overlay. Dismissing the modal cause the overlay to lighten but remain. Clicking somewhere on the page or pressing ESC caused the overlay to vanish.


This was occurring whenever I loaded the entire content of the modal with AJAX. Something like:

function makeModal(html) {
        var $modal = $(html);

The problem is that html had a script tag present, so $modal.modal(); was actually being applied to the modal div and the script tag.

The Fix

You need to make sure you only apply modal() to the modal  div, like this:

function makeModal(html) {
        var $modal = $(html);

I found the answer to this problem via landon's post on this github issue:

Friday, January 25, 2013

Confluence: Failed to create the user X. Check your server logs for more information.

I recently received this error when trying to create a new user.

The error was occurring because of the order of my Group Directories.

I have both Confluence Internal Directory and Microsoft Active Directory enabled. The order is important here. Microsoft Active Directory was listed first, so when I was trying to create a new user it was trying to do so in AD.

In my case, I wanted the user to be created in the internal directory, not my AD.

The Fix

  1. Browse -> Confluence Admin
  2. User Directories
  3. Use the green arrows to make it so the Internal directory is first in the list.

You should now be able to create your user!

Tuesday, January 22, 2013

Get a Stack Trace on the Symfony2 Command line (console)

If you run a command via the Symfony 2 Console component and receive an exception, you aren't presented with much more information than the exception name and message.

To see a full stack trace, append -v to your command.

For example:

php app/console doctrine:schema:update --force -v

This will provide a full stack trace. You probably need to have Xdebug installed.

Friday, December 7, 2012

Symfony 2 cache and log permissions on Ubuntu

Using the ACL, run the following in your project home directory:

sudo setfacl -R -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs
sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs

More info at