Category Archives: Uncategorized

When In Doubt, Take The Next Small Step

I remember awhile back some indie devs warned me about post game depression. And well, after finishing up Pixel Blocked!, I experienced it as well. I felt lost for awhile, my sense of purpose was gone. I’d wake up and not know what to do. My finances were in terrible condition and my future was in doubt. Since then I’ve been keeping myself busy by taking little small steps here and there towards different projects.

I’ve started an amazing part-time teaching job at BrainBoost Education. I teach students programming through the process of making their own games. It’s not only a lot of fun seeing kids bring their creations to life, but also extremely rewarding. As my director would say, it’s fuel for the soul. Working again has also brought back a sense of financial stability to my life that I’ve desperately needed. More importantly it’s in a job that I enjoy and allows me to continue pursuing indie game development.

On the indie game development front, I can happily say that I’ve begun working on new and exciting projects of my own again. I have a wall full of ideas and even a long-term game project I feel really passionate about. Stay tuned, good things are coming…

Creating a PC Executable for XNA 4.0

I’m gearing up to release Pixel Blocked! for the PC. One of the things I’ve been working on the past few days was creating an all-inclusive executable that would install the game and software prerequisites that aren’t already installed on the player’s machine. My problem was that I couldn’t really find one that I liked online. I’m sure other XNA developers feel the same way, so I’m sharing this script I’ve created for Inno Setup that will create an elegant executable for your XNA 4.o games.

I’ve built off of the script edited by David Amador that you can find here. It was made for XNA 3.1, but with a small tweak, I also had it working with XNA 4.o. Although functional, there were a few things I didn’t like about it. When it installs the prerequisites, the UI hangs with the message “Finishing installation…”. On slower computers, this could actually take anywhere from 2-20 minutes, a process that is very misleading to the user. It looks like the installation is frozen. Another issue is that it will always install the XNA framework even if the user already has it installed on their machines. That’s an unnecessary step that slows the installation process.

I’ve made extensive changes to the script (especially the pascal code) so that the installation is more transparent to the user. It’ll tell the user when it’s installing the prerequisites and also show a progress bar as they are installing. The executable is also all-inclusive, so that they don’t have to download and install anything else. It’s a simple setup that will properly check for prerequisite software and only install them if needed.

Without further ado, here’s the code.

; Script generated by the Inno Setup Script Wizard.
; (Then extensively modified by Caliban Darklock.)
; (And yet again modified by David Amador)
; (And again extensively modified by Daniel Truong)
; Now works for XNA 4.0, installation is also more transparent when installing prerequisites.
; Shows progress bar for XNA and DotNet redistributables and skips them if already installed.

; Enter the name of your game here
#define MyAppName "Pixel Blocked!"
; Enter the name of your game and a version number here
#define MyAppVerName "Pixel Blocked v1.2"

; Enter the name of your company, or just your name
#define MyCompany "Daniel Truong"

; Enter the URL of your website
#define MyAppURL ""

; Enter the path to your game project - check Visual Studio properties for the path
#define MyAppLocation "C:\Users\Daniel\Documents\Personal Subversion Repositories\Pixel Blocked\Blocks On A Plane\Blocks On A Plane"

; Enter the name of your game executable
#define MyAppExeName "Pixel Blocked!.exe"

; Enter the location where XNA Game Studio is installed
#define MyGameStudioLocation "C:\Program Files (x86)\Microsoft XNA\XNA Game Studio\v4.0"

; Enter the name for the correct version of the XNA Framework MSI
#define XNARedist "xnafx40_redist.msi"

; Enter the location where you have placed the .NET redistributable
#define MyRedistLocation "D:\Game Development Tools"

; Download .NET 4.0 from <a href=""></a>
; enter the name of the executable file here
 #define DotNetSetup "dotNetFx40_Full_x86_x64.exe"

; Once you've filled in all the variables above and downloaded your redist packages,
; everything under this point should JUST WORK for most XNA projects.

OutputBaseFilename={#MyAppName} Setup
SetupIconFile = "C:\Users\Daniel\Documents\Personal Subversion Repositories\Pixel Blocked\Blocks On A Plane\Blocks On A Plane\Game.ico"

Name: english; MessagesFile: compiler:Default.isl

Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

; XNA Framework redistributable
Source: {#MyGameStudioLocation}\Redist\XNA FX Redist\{#XNARedist}; DestDir: {tmp}

; .NET redistributables
Source: {#MyRedistLocation}\{#DotNetSetup}; DestDir: {tmp}

; The game itself
Source: {#MyAppLocation}\bin\x86\Release\{#MyAppExeName}; DestDir: {app}; Flags: ignoreversion
Source: {#MyAppLocation}\bin\x86\Release\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon

Filename: {tmp}\{#DotNetSetup}; Flags: skipifdoesntexist; StatusMsg: "Installing required component: .NET Framework 4.0 Client."; Parameters: "/norestart /passive"; Check: CheckNetFramework
Filename: msiexec.exe; StatusMsg: "Installing required component: XNA Framework Redistributable 4.0 Refresh."; Parameters: "/qb /i ""{tmp}\{#XNARedist}"; Check: CheckXNAFramework
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent

function IsDotNetDetected: boolean;
    key: string;
    install: cardinal;
    success: boolean;

    WizardForm.StatusLabel.Caption := 'Checking for .Net Framework 4.0 Client.';
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client';
    success := RegQueryDWordValue(HKLM, key, 'Install', install);
    result := success and (install = 1);
function CheckNetFramework: boolean;
    if IsDotNetDetected then begin
        WizardForm.StatusLabel.Caption := '.Net Framework 4.0 Client detected.';
    result := not IsDotNetDetected;

function IsXNAFrameworkDetected: Boolean;
    key: string;
    install: cardinal;
    success: boolean;

    WizardForm.StatusLabel.Caption := 'Checking for XNA Framework Redistributable 4.0 Refresh.';
    if IsWin64 then begin
        key := 'SOFTWARE\Wow6432Node\Microsoft\XNA\Framework\v4.0';
    end else begin
        key := 'SOFTWARE\Microsoft\XNA\Framework\v4.0';
    success := RegQueryDWordValue(HKLM, key, 'Installed', install);
    result := success and (install = 1);

function CheckXNAFramework: boolean;
    if IsXNAFrameworkDetected then begin
        WizardForm.StatusLabel.Caption := 'XNA Framework Redistributable 4.0 Refresh detected.';
    result := not IsXNAFrameworkDetected;

Steps to get it working:

  1. Download and install Inno Setup.
  2. Download the .NET redistributable.
  3. Copy and paste the code above into an Inno Setup script file.
  4. Replace all #define constants with your own values.
  5. Compile and enjoy!

Adding Value

This update also includes a lot of additions that don’t directly affect gameplay. However, these changes add a tremendous amount of value to the game by increasing replayability and enjoyment for players. They were also a ton of fun for me to think up and implement.


Try to earn all 200 points!
They pop up in-game when you accomplish them.

Awardments are my attempt at mimicking the addictive nature of Achievements. Unfortunately, as with all Xbox Indie Games, these aren’t real Xbox Achievements. They won’t add points to your gamer score and they won’t show up on your profile. However, they do provide an in-game acknowledgement of the things you accomplish and help to guide the players who want to accomplish everything the game has to offer. If my game were an Xbox Arcade game, these would be the Achievements I’d have. They’re for the overachievers 🙂



For the players for whom a simple acknowledgement of an awardment simply isn’t enough, I’ve also added tangible rewards players can strive for. These range from different sky backgrounds, new player skins and unique modes, such as having only unusual flying objects in the sky. They’re a lot of fun and add a nice visual change to the game.


Jump Kick Dude kicking a shark and a helicopter! What more could you possibly want? 🙂

One of my favourite additions in this update is the backgrounds. I received a lot of positive feedback when I initially drew two different backgrounds. As a consequence, it really encouraged me to explore my artistic side and to step outside of my comfort zone. I experimented with different styles, studied other pixel art, and developed a new skill that I now feel more competent in. In total, there are 31 different backgrounds. While some backgrounds are personal, others are imbued with my sense of humour, and then there are a few in particular which were drawn for plain fun. They add a nice visual incentive for players to keep playing. I hope you’ll enjoy them as much as I enjoyed making them.

With the addition of Awardments, Unlockables and Backgrounds, it really feels like it levitates Pixel Blocked! to a new level of production values. When I look at Pixel Blocked!, it seems much more complete now: something comparable to a product of a small studio, and not just the work of one person.

Reworking the Reward System

One of the most misunderstood design choices I made as a designer was with the reward system. The audience and I misunderstood its use and implementation, as I used a 3-star reward system without really thinking about how and why it works in other games. This update replaces the reward system with a 2-medal performance rating system that makes a lot more sense.

Before: 3-Star Reward System

In the above picture, the game rewarded you a star for completing the level, a star for not using a missile and a star for beating the target time. The problem here is that the 3-star reward system is based on 3 different aspects of performance, and that the system is completely binary, meaning that if you don’t reach the target times or missiles, you are not rewarded at all.

This issue is amplified even more when rated on your performance on time. Here, beating the time would be the equivalent of earning a Gold medal in the new reward system. However, without a tiered rating system, most people, on their first try, will see their time in comparison to the ‘Gold’ time and deem it impossible to achieve.

Most successful implementations of 3-star reward systems can actually be replaced with a single bronze, silver, and gold medal system (1-star, 2-star, 3-star). It’s not binary, and earning stars is based on tiered performance, meaning that the better you do, the more stars you get. In those cases, one aspect of performance is rated. An obvious example that comes to mind is that of Angry Birds. You get more stars based on your total score. It could also be replaced with a single medal, but that’s probably a little less interesting to the player.

After: 2-Medal Reward System

One of the reasons why the ‘Times’ seemed impossible to many players was that there was no in-game tool for determining what the most optimal solutions were. With the removal of missiles, I decided to add in a “Moves” counter, and reward medals based on the least number of moves used and the fastest time completed.

Adding in the medal for performance based on number moves helps the player understand if they have an optimal solution. With a tiered reward system, they can see where their solution ranks in terms of bronze, silver and gold. This helps players achieve the best time, as they now have a target time to work harder for. It no longer seems impossible, and the game also teases you by telling you how much more effort you need to put in to get to that next medal. The above picture tells the player that the puzzle can be solved in 16 moves, which will help shave off those valuable seconds when trying to get Gold time.

This 2-medal reward system works better in Pixel Blocked!, because it gives players a better understanding of their performance and increases replay value without the frustration of the previous 3-star reward system.

First major change: The Removal of Missiles

The first and biggest change I made in this update is the removal of missiles. It’s a big change that propagates itself throughout the entire experience. Once this change was implemented, the rest of the design changes flowed naturally from there.

Before: With Missiles 

This is one of the first levels where you really have to think before placing a block. In the picture above, the player has placed a block that has now blocked him/her from filling in the last space. Now with missiles, this is solved by destroying the offending block, and filling in the rest of the spaces.

Now I’ve mentioned before that all puzzles are solvable without using a single missile. So they aren’t necessary to any solution; in fact, the game frowns upon the use of missiles. However, there will be players who will use this tool simply because it’s there. Thus my two main reasons for taking missiles out of the game: the first reason is that they can be used to make the whole game a breeze, and the second reason is that it encourages a haphazard placement of blocks, since the player knows that his/her mistakes can be easily corrected with missiles.

After: Without Missiles

Aside from the visual changes in the figure above, here, the player is stuck in the very same situation as before except that now, they can’t rely on the use of missiles. The concept and implementation of missiles no longer exists.

Instead, the game now tells you that you’ve been “Pixel Blocked!” when you find yourself in this predicament and highlights the space that can no longer be filled. This mechanic allows the player to identify the misplaced blocks and hopefully learn from the mistake.  The removal of missiles not only enhances the flow of the puzzle, but it also encourages thoughtful placements of each block, allowing the player to have that very satisfying ‘aha’ moment when they finally figure out the solution to each puzzle.

Designer Intent Versus Player Response

Before I get into the nitty-gritty details of all the changes, I want to talk about why these changes have been necessary.

In every designer’s head is an idea for an amazing game. The struggle is trying to properly convey that idea through making smart design choices, researching the tech you’ll be using, laying out the groundwork, and cooperating with the game as it takes its own direction, and most importantly, trying to stay in control at the same time. This is the process of executing on the idea, and in a lot of ways, it’s more important than the actual idea itself.

However, there are times when even after all that work, your idea doesn’t come out unscathed. I like to think of this as a discrepancy between designer intent and player response. I was able to experience this first hand when Pixel Blocked! debuted for XBLIG and the reviews started pouring in. Pixel Blocked! received quite a few positive responses which you can check out here. What really struck me were the positive-criticisms and the negative reviews. I find these more interesting because a lot of the criticisms offered feedback about the design decisions that I had made. It was clear that those decisions weren’t properly conveying Pixel Blocked! the way I had intended, and that’s when I noticed the discrepancy between my intent and the public response .

The original release of Pixel Blocked! contained a lot of design choices that came about according to the way I play games. With my obsessive compulsive nature to want to collect every star in games that I play (even when there is no reward for doing so other than the sheer personal satisfaction of knowing you accomplished something), I made decisions that catered to gamers like myself. As a result, my intent was lost in some of these poor design choices I made.

For example, I wanted people to solve puzzles without using missiles. My incentive for them to do so was to reward a star. As a result, this design choice divided two types of players: the ones who wanted the star and the ones who didn’t care for it. The ones who didn’t care about earning stars played a different game than the one I intended. I saw these players breeze through the game, and then complain about the lack of challenge. Of course, that isn’t their fault; it’s mine as a designer. I didn’t properly convey the challenge to them.

Another example is that my intent with the difficult completion times was to have players find optimal solutions, and follow that up by using muscle memory to achieve better times. Instead, what I saw was frustration at what players thought were insane completion times. That’s because my game, at the time, didn’t properly convey the idea of finding optimal solutions. Because my intent wasn’t very clear, players responded with frustration.

Being that Pixel Blocked! is my baby, I knew that I would need to put more time and effort into the game so that other gamers could see the game as I see it and play it the way I intend for it to be played (or get as close as possible). That’s what this update addresses: it brings Pixel Blocked! closer to my ideal vision of the game and eliminates the discrepancy between designer intent and player response.

Let’s Talk Change

Pixel Blocked! is being updated. Over the next few posts I’ll be trying to document the numerous changes that have gone into making Pixel Blocked! a better game since its initial release on XBLIG. I don’t want to be too wordy so I’ll try to let the pictures do all the talking.

A Pixel Blocked Algorithm

With Pixel Blocked! released on XBLIG, I’ve been able to take a lot of the professional feedback from various reviewers and make Pixel Blocked! a better game for the upcoming XBLIG patch and Windows Phone version.

One of the things I’ve been working on is a Pixel Blocked Algorithm. It sounds silly, but really, it’s just an algorithm to determine whether or not a particular pixel is un-reachable. (i.e. the player can not fill that pixel, thus putting the puzzle into a fail state where it can no longer be solved.)

What I wanted to share was that programming this algorithm has been one of the most rewarding experiences I’ve had making this game. I’ve spent a total of 6 days working on this algorithm, but I mean that very lightly. I’m currently visiting family in WPG and in those 6 days I also managed to spend an afternoon and evening fishing at Seven Sisters… twice, biking 50km+ to Lock Port and on another day 40+km to Birds Hill Park, an Age of Mythology LAN gaming night and various other family activities.

Originally, I started off with a very naive algorithm, which then grew more complex and convoluted over the days as I tried to determine all the scenarios in which a pixel would be blocked. By day 4, my algorithm had grown into a recursive mess and there was one particular scenario involving a specific arrangement of magnetic and crumble blocks that the algorithm could not correctly detect as being Pixel Blocked. Fixing it would mean breaking other parts of the algorithm, which meant more fixing, and a bigger mess of an algorithm.

At this point, I decided to restart from scratch, which meant 4 days of code out the window (but saved in GIT just in case :P). But I now had a stronger understanding of what it meant to be pixel blocked and this time around, I decided to take a completely different approach with the algorithm. It worked, and I managed to complete it in half the time I did for the first algorithm.

I think what’s so rewarding about the whole experience for me is that it reminded me of the things I believe in. I believe in hard work, I believe in learning from my mistakes and trying again, and I believe in being better. It’s been a month now since I’ve released Pixel Blocked! on XBLIG. I’ve received a lot of great reception and reviews. The majority of the reviews have been really positive. However, downloads/sales have been really low: 1998 downloads / 281 sales of Pixel Blocked as of August 28th. There’s this disconnect between the reception and sales of the game. It could be that puzzle games just don’t sell well on XBLIG, or it could be that the game isn’t as accessible as I thought it could be. Like the first attempt at the Pixel Blocked Algorithm, I think the game over the course of the development grew more complex and convoluted than it needed to be, and fragments of an earlier game ended up staying in the final product. The mobile versions of the game represent my second attempt, and I’m working hard on making it better and more accessible than the first.