Amateur Foley Artist

Gathering Sound Effects

Now is a good time for me to start gathering sound effects for the game.  I could have went to one of the sites that offer free creative commons sounds effects and downloaded what I needed there, but one has to be careful to read the license for each sound effect to ensure that it is covered by a creative commons license that allows it to be included in a work that is sold for profit.  Right now, I’m just creating this game for the contest, but if the game is popular I would be willing to sell copies of it for money (sorry RMS).  I’m trying to make the development of this game as open as possible without sharing the source code, because I believe I read once that sharing source is not allowed by XBox Indie games.  I also didn’t want to make another credits screen, which would be filled up with URLs with links to sounds effects.

My iPod Touch was used for recording all of the sound effects as voice memos.  The sound quality isn’t the best, but it does the job.  I wouldn’t mind going back later and recapturing the sounds using a high quality recording system.  Using a tip that I found on the Internet, I was able to export all of the sound effects through iTunes directly into WAV (MP3 was also an option) so I can edit the sound effects in Audacity.  To change iTunes to export as WAV (default is AAC which is useless), there is a setting under Import CD that must be changed.

Now is the fun part of capturing sounds.  My clippers and hair trimmers were used to make buzzing sounds.  These can be used for error sounds.


Running water at full pressure almost sounds like electricity.  I doubt anyone would notice the difference, unless they read this post.  Futher modifications in Audacity will also give it a more electric sound.  This will probably be a constant sound that plays as wires are filling.   I think Audacity has an option for making an audio file seamless, so it can be looped multiple times without any breaks in the audio.


Ice makes a nice chrunching and breaking sound, without all the mess of breaking a real glass.  This will probably be the sound when an LED breaks.  I know it should probably be a burn out for fizzling sound, but I think the breaking sound will be more dramatic.


Two spoons were used to make a nice ringing sound.  The spoon hitting the glass makes a longer vibrating ringing sound.  These will probably be used as a confirmation sound effects.


A drawer slamming makes a good sound, which can be used for a cancel event.


The test on this CO detector makes a nice beeping sound.  I could imagine that sound being used as the ranks at the end of the level are displayed.


I’m not sure if this will make the final cut of sound effects in the game, but a shaken Pepto Bismol bottle makes a great liquid type sound.  I’ll probably find some way of working it in the game.

Background Images

While I was at it, I went ahead and used my iPod Touch to take picutres of an old sound card and network card that I had in storage.  After some touching up in Gimp, these should make great background images.


Minor Graphics and Input Fixes

Set the default cursor position for the level to 5,5 because it really bugged me that the cursor starts off the board on the first level in the upper left corner.  It also minimizes the distance that the cursor must move from the starting position to any other space.  The position of the game board has also been centered on the screen (SCREENWIDTH – (iTotalCols * CELL_SIZE)) / 2, (SCREENHEIGHT – (iTotalRows * CELL_SIZE)) / 2 = (640 – (10 * 32)) / 2, (480 – (10 *32)) / 2.  This is a very helpful formula that I’ve used for centering objects in many games.  Fortunately, I already defined a board offset variable as a Vector2, so I just needed to add that formula to that offset variable.

By simply adding one line of code, I was able to disable the ability to place a piece on a empty space.  I still allow the player to move the cursor to empty spaces, primarily due to the fact that the starting position of the cursor (5,5) may be in an empty space.  This happens on level 4 (donut level) where there is empty space in the middle of the board.

Fixed the resistor graphics so that it can be superimposed over the default wire images.  Increased the maximum pieces to 10 (1 + 9 resistors).  Now all resistors are selectable.  The currently selected piece has a red background.  Later, I will probably make only certain resistors available on each level.  For example, there’s really no point in having a 9 resistor on a level where the maximum battery and LED value is 2.  The selected piece can now be changed by using the left and right bumpers.

Now displaying the selectable pieces at the top of the screen, but I’ve got to be careful that it isn’t cut off on the television screen.  I think I remember reading that 20% of each side of the screen image is not displayed on the television.  Added right/left bumper pressed/released abstract methods to the Screen class, which made me implement it in all the Screen subclasses.  Added methods to increment and decrement the selected piece, which is called by the action button (X) press and the bumper button presses.


Fixed the GamePieceResistor class so that the Elex value can’t be lowered below zero.  LEDs can be activated with a zero value wire, but it won’t add any points to the total luminosity score at the end of the level.

Made minor modification to the level 3 board, so that the last two LEDs are placed further back on the game board.

The Level Select screen now takes the player to the selected level once the confirm button is pressed.

Changed the cancel button to set the selected piece to the wire (index 0).  The Back button now takes the player back to the main menu.  The Back button will probably be disabled, after I create a Pause menu.

Noticed an issue on the XBox 360 that doesn’t happen when running the game through the PC.  If I set the MediaPlayer sound to zero (for mute), then it must be set back to 100 for sound to play through the XBox again.  Just commenting out the line that set the sound volume to zero will still keep the sound muted.

Went through and manually played the five levels that I have so far, and used my score for the S ranks.  I just created values for the A, B, and C ranks, which seemed appropriate.  All these values are stored in arrays in the LevelDefinition class.  I updated the getPieceRank, getLuminosityRank, and getTimeRank methods to return the appropriate values based on the current level.  Forgot that I was passing the time as milliseconds, which took a little while to debug.  Dividing the time value by 1000 before passing it to the getTimeRank method fixed that problem.

Changed the message from “YOU WIN” to “LEVEL COMPLETE” after completing a level.

Removed the fill frame number from currently filling cells.

Level Up

Tile Editor Agony

Started using the Tiled tile editor to create levels for the game, because I thought that was the editor I used for Legend of Tux.  I created a simple sprite sheet which contained the tiles on one layer, and the batteries and LEDs on another layer.  I found that I was only able to export my maps in a very limited number of formats.  It’s sad that this tile editor can’t output a simple indexed array of tiles.  I’m really not in the mood to write a parser for any of these formats, so I went back to the Legend of Tux wiki and found that I actually used Mappy last time.  Therefore, I downloaded Mappy and recreated my levels with that tool.



Mappy will not load PNG spritesheets unless two DLLs are included, so I had to download those file separately from the Mappy website.  Apparently there is a now bug with the “export all layers” functionality, so each layer has to be exported individually or else you will get an array filled with zeros.  What a pain!  Unfortunately, they don’t provide a binary download for the previous Mappy versions, and it’s not on SourceForge so a previous version isn’t archived for download.  The author even says on the website that 1.4 is a beta, so why can’t the last stable release still be downloaded?


Make sure to set the color depth to 16-bit when creating the map, or else the sprite sheet will not load and Mappy will complain.  As shown in the sprite sheet above, batteries start at index 10, and LEDs start at index 20.  I can get the Elex value of the LED or battery by modding (%) by 10, which really isn’t scalable past 10, so this may need to be reworked later.  This sprite sheet is just used for creating the level arrays, so I was sloppy when placing the numbers.  In the actual game, the numbers are programmatically placed on the objects.

I created getter methods in the LevelDefinition class to return the background tile array and object array.  Then I have a method in the GameLevel class which converts the integer arrays to actual objects (GamePieceBattery, GamePieceLight, etc).  Using the Mappy exporter, I was able to acquire the static array data definitions, which I pasted into my LevelDefinition class.  Wrote simple if/else statements to return the correct array for the level, but this could be changed to a switch/case statement (if C Sharp has those… I don’t know, and I didn’t feel like looking it up, since if/else does the job).

Next Level

Added instance variable to the main ResistorGame class to track the current level.  I’ve been trying to keep instance variables out of this class except for the media files.  When the GAMEWIN state is enabled, the current level instance variable is incremented.  If the current level variable is greater than the maximum number of levels (currently hardcoded to 5), then it gets set back to zero.  For the  LevelSelectScreen, the class could return a level index, and the ResistorGame class can use that value to set the current level instance variable.

One problem I’ve noticed is that the cursor defaults to cell 0,0 at the start of each level, which may be off the actual game board, now that the shape of the levels are custom defined.  I may need to add an additional object to the level definition which is the starting position of the cursor.  Additionally, all levels are using the same value thresholds for the ranks, which will need to be fixed later.  The S rank for luminosity should be easy to calculate (the sum of the bust values of all the LEDs).  As for the time and pieces used rank, I’ll probably just play through the levels a few times, and use my best scores for S rank, then use some sort of bell curve function to determine the thresholds for the A, B, and C ranks.


Loose Ends (Fix later)

Here’s just a few additional things that need to be fixed.

Currently, there is a display issue if the wires connect to the resistor from the sides.   The wires need to be removed from the resistor sprites, then just simply display a standard wire which will make the proper connections, then display the resistor core on top of it.

I haven’t decided if I should let the player move the cursor off the board cells, and just prevent the user from placing a piece on a non-board space… or should the player only be allowed to move the cursor on game board spaces.  If the player is allowed to move the cursor off of game board spaces,  then the player shouldn’t be allowed to lay pieces on those empty spaces.

I may allow the player to continually lay wires as long as the confirm button is held down, because currently the player has to keep alternating between pressing the direction and the confirm button to lay continuous pieces, which feels jerky.

The LED values can still fall below zero if enough resistors are used.  Need to set the bottom limit to zero for these.

It’s Time for a Change

Bust Condition Handled

Added code to detect if an LED has busted, which makes the game transition to the GAMEOVER state.  Added a GameOverScreen class to handle the display of the game over state.  Need to determine if I should give a warning to the player if the wire connected to the light is higher than its bust value, and allow the player to put a resistor there before the light has filled to avoid losing the stage.  Currently, once the light starts filling it is locked to that value, which doesn’t give the player a chance to fix their mistake.

Will add a meter to the lower right corner to display the Elex flow value of the currently selected cell.

Time Variables Added

I was able to get the current game time using the TotalGameTime.TotalMilliseconds property of the GameTime object that is passed to the update method.  However, I had to update all the update methods of all classes that extend Screen to accept GameTime as a parameter.  Created three new instance variables to the GameLevel class for holding the level start time, the current time, and the end time.  The end time is now displayed on the game win screen.

Level Definition

Created LevelDefinition class to hold the definition of the layout of each level along with the requirements for each piece/time/luminosity rank.  Created arrays of size 3 for holding each grade threshold.  Index 0 is for the S rank, index 1 is for A rank, 2 is for B rank, and all greater values are assigned C rank.

Fixed the getPieceCount method that returns the Pieces Used end level statistic to not count the LED and battery pieces, but only wires and resistors.

Added methods to the LevelDefinition class to take a piece count, luminosity value, or time and it will return the grade rank for each of those values.  The grade ranks are now displayed on the game win screen.  Using yellow for S, blue for A, green for B, and red for C.

Just thought I would reiterate the fact that I’m trying to make a fun game that is as scientifically accurate as possible, instead of trying to make a scientific simulation as fun as possible.