I really haven’t done any development for Resistor in over a month, so I decided to go ahead and put it into the Peer Review process on the Microsoft Creator’s Club site. I see it as my way of doing my part in adding to the fine collection of interactive video entertainment titles in the XBox Indie Games marketplace.
With over 400 entries into the Dream Build Play competition, I don’t think I have a chance at being one of the finalists. If the competition was based purely on uniqueness I think my game would fare better. However as in real life, looks do matter and my game is about as plain as it gets.
Overall, I would be thrilled if my game could make $100 on the marketplace, which would equal the original investment that I made for the Creator’s Club membership. Unfortunately, I’ve heard that most XBLIGs don’t make anything, so my goal is probably a bit of a stretch.
Below are the changes I made to the game after putting it through playtest a few weeks ago.
Tutorial tips were added to teach new players the rules of the games. These tips should not display as long as the player is doing well in the game. The tutorial tip system keeps track of which tutorial tips the player has seen, and it doesn’t display a tip that the player has already seen. However, once the player quits the game the tip flags are reset. A tip is displayed if the player falls to the B rank in any of the three categories. Also, if the player doesn’t use the appropriate resistor and gets a Game Over, then a tip will display when the level is started again stating that resistors should be used to reduce the flow value.
More Graphical Improvements
Made the spinning light sprite display while the LEDs are filling, using the scale parameter.
The rank letters at the end of the stage now zoom into position.
Changed the A, B, and C rank colors to use lighter shades of blue, green, and red. The status icons in the lower right portion of the screen now change with their respective rank values. I also modified the real time rank value of the luminosity category, so that it calculates the rank based upon the maximum possible luminosity of activated LEDs (instead of all LEDs). This way, the player starts out with an S rank in luminosity and the rank is only lowered if they connect a wire with a lower flow needed by the LED.
Used Audacity to make the ding sound when an LED is activated lower based on the difference between the maximum flow value and the current flow value. The rank grades at the end of the stages use these modified sounds as well.
Finished the last ten stages of the game, which use the 10 battery with a maximum resistor of 9. Went back and fixed the level design issues that I found during playtesting yesterday. I still need to set the rank values for the last 30 stages.
The level 10 battery caused an issue, because it used block ID “20” in the array. However, I had defined everything between 20 and 29 as LEDs. I modified the battery range to use IDs 10 through 20, but the battery showed up as 0, because I was using modulo (%) 10 to get the battery value. I went ahead and just wrote a special case for this to fix it for now.
Trailer Video Remake
I wasn’t happy with the audio in the trailer video, so I recaptured and re-edited the audio tonight. However, I kept most of the video clips and edits made last night. I don’t want to spoil my cheesy indie game song, so I’m keeping it under wraps until the contest is over.
Added a pause screen to the game, which I thought was going to be a simple change. I created a new class that extended the Screen class, implemented the draw and confirm button methods, so that it just returns back to the game when the confirm button is pressed. However, when the level ends it uses the time that the level was finished minus the time that the level was started to get the value for the time rank category. With the pause screen implemented, the time calculation for rank does not exclude the time while the game was paused. Therefore, I will have to come up with some method of tracking the time when the game was paused, and subtracting that off the game time. Alternatively, I could re-write all the time based code and just keep a variable that tracks the number of updates in the game level screen since the level was started (since the updates on the level screen won’t be called while the pause screen is active). I think it is too late for that, plus it depends that each update is really 1/60th of a second which may not be the case, so I’ll just have to keep track of the amount of time that the game was paused, and pass that value to the game level screen class after the pause is complete so it can be subtracted off the total time. What a pain.
I also had to create a new variable in the main update loop to track the previous screen, because coming from every other state (title screen, level select, game win, game over), going to the GAMELOOP state just required the game level screen to be loaded and set to active. However, I do not want the level to be loaded if the user is just continuing from a pause.
I created a new method in the PauseScreen class which returns the total time (in milliseconds) spent on the pause screen. This value is then passed to the addPauseTime method that I created in the GameLevelScreen. One positive thing from doing this is that I found that the total time was being derived in multiple locations in the GameLevelScreen class. Therefore, I removed that extra code and then used my getTime method in its place. I just had to subtract off the pause time, which is now stored in an instance variable.
Added two options “Resume” and “Quit” to the pause screen. Resume goes back to the level screen and quit goes back to the main menu. This may be a little misleading, if the player expects quit to completely close the game. I may have to think about rewording that later. I was able to reuse much of the display and logic code from my delete records screen. Also, I was finally able to remove the Back button control from the level select screen, since the player can now exit to the title screen from the pause menu.
Made minor tweaks to the delete records subscreen, to correctly place the selector image.
Also updated the drawPieceSelection method in the GameLevelScreen to give more spacing between the selectable pieces. Created a new background image for the selectable pieces, using another portion of one of my computer card photos. By default, the background image uses green as the color parameter, but if it is the selected piece, then it uses yellow and is vertically offset by 8 pixels. This gives the player a color based and location based change to signify the currently selected piece.
Removed the ability to select Quit on the main menu by pressing the Back button, and changed it to the Cancel button. Now, the only function that the Back button serves is to delete the records. I think having this rarely used button only assigned to a critical function is good. This way, the user won’t get confused between the roles of the Back button and the Cancel button. This also re-enforces the concept that the Cancel button (and only that button) backs out of a menu.
Added spoon sound effect when moving between levels on the level select screen. Added the plop sound effect when the user select a level on the level select screen.
I tried putting the star graphic for the star rank in multiple places on the game win screen. First I placed it at the bottom of the ranks, but it looked like it could have been just for the time rank. Then I put it under the “Complete” text, but it looked odd there as well. It also didn’t look very good to the right of the “Complete” text. Since I didn’t like how it looked in any of those places, I decided to put two stars on the screen which circle around the text in a rectangular pattern. It also gives more liveliness to a pretty much “dead” screen.
The Game Over screen has also be updated to use the improved graphics, basically by copying most of the code from the pause screen. It’s easy to forget about updating the Game Over screen, since I actually rarely ever see it.
Found that I could use the Rectangle object in place of the Vector2 object to place a sprite on the screen as well as size it. This is perfect for my cooldown overlay, which makes the cooldown overlay size proportional to the cooldown duration left. That means that overlay shrinks (from bottom to top) as the cooldown period continues. I’m not sure if the Rectangle scales or crops the sprite, since I’m just using a white block with a black transparent color as the overlay. This may be sometime I look into if I try to get the animated flow working.
Added 10 more levels to the game, bringing the current total to 60 levels.