Stick a Fork in It

May 28, 2012

Title Safe

Noticed that the title safe area on the PC is the entire window, so things looked slightly off when it is running in  a window.   Went back and removed the device specific Title Safe Area rectangle, with my own that I calculate based on the size of the screen that I define, using 10% around the edges as the unsafe area.

Device Storage

The fast transition of the device selection screen on the XBox Slim was very noticeable, due to the bright yellow background color.  This screen is only displayed for a split second, since there is only one storage device which is automatically selected.  I’m not sure why it won’t let me select between the hard drive and cloud storage.  I removed the yellow screen and replaced it with the standard background color, but the “select storage device” message still flickered for a brief second, so I put in a counter to delay the display of the message for 60 frames.  Now, the message should only display if there is a problem.

I also need to go back and modify the “reset all data” functionality, so that it takes advantage of the new load storage screen.   I don’t have the time to fix this, so I went ahead and removed the “Delete All records” functionality from the level select screen.  I never liked the fact that there was no selector for it on the screen, and adding the functionality back using the new saving method will just be too much of a hassle at this point.  I can use that time to do better things.  Plus, I did learn previously that the player’s data can be deleted from the XBox system menu.

Four Controller Ports

Added code to hold the controller state for all four controller ports.  Apparently, I don’t need to check to see if a controller is actually active to get its state.  Added a parameter to Screen methods which handle button presses, so that now those take an int parameter which signifies which controller port pressed that button.

Updated the code so that it now allows the device selector to be opened and controlled by the controller port which started the game.  Added exceptions to handle a save after the user has signed out of their profile during the game.

Tried using the Guide message display API call to display a message to the user if the game was no longer being saved due to the user signing out, but it also has the problem of crashing if the guide is active, so I didn’t bother with it.

Marketplace

After reading threads about others who have failed peer review, I added a check to ensure that the logged in player can purchase content before the Marketplace screen is shown on the trial screen.  I’m thinking that 21 levels for the trial may be a bit too much.  I’m doubting that anyone can complete that many levels within 8 minutes, and my purchase screen is only displayed after those 21 levels are complted.  However, people can still buy the game through the main marketplace window.  The user can play the 8 minute trail multiple times, selecting the other levels (up to 21, 3-1) that they have not completed, so therefore it is possible to the player to complete all 21 trial levels to see the purchase screen.

I’m trying not to be like most other games which have “buy buy buy” plastered all of the game’s interface.  After all, if the player likes the game, then I’m sure they will know how to buy it from the marketplace menu.

Graphics Updates

Updated the cell selector to use the a symbol representing a resistor.  Went back and made it a hand drawn anti-aliased line using the Gimp brush tool, with the middle cut out.  Added a slight green glowing effect to this selector sprite.

Also added another overlay to the filled light, which is a sprite of two white filled arcs.  This rotates for each filled light.  It looks much better than what the screenshot shows.

  

Minor Changes

On the title screen, I also changed “New Game” to “Start Game”.  I thought people may think that “New Game” will overwrite their existing record data, which isn’t the case.

After checking the Not So Evil Checklist again, the game won’t be failed for a Code 7 crash, which results from the account with the App Hub subscription signing out.  So I just needed to ensure that it is playable from any controller port.

Learned that I don’t have to recreate the XBox entry XNA Studio Device Center and re-enter the key after restarting the XBox.  I’ve just got to ensure that the XBox device for the active system is set as default.

Wrapping Up

At this point, I’m considering this game to be done.  I tested it using all of the checks on the Evil Checklist, and I believe it passes all of them now.  I will sleep on it overnight, and may play test some  more of the levels again tomorrow, since I have tomorrow off of work for Memorial Day.  Unless there is some major issue that must be fixed, I plan on submitting it to the contest tomorrow.  Thanks to everyone who has read my status updates.



Testing on Older Hardware

May 26, 2012

Multiple Controller Testing

So sure enough, the first time I tried running the game with two controllers plugged in (first one signed out, second one signed in as my developer account) I get the Code 4 error from the XBox.  Even turning off the first controller will generate this error, so currently the first controller must be the one with the developer’s account.

The game will play fine with two controllers having the first one signed in as the developer’s account and the second one not signed in.  However, if the first controller signs out from the Guide it will immediately throw a Code 7 error.

  

Old School Television

I also needed to test to ensure that my game will run on older televisions.  It’s a good thing that I paid to have my old Elite XBox fixed about a year ago.  Originally, the only reason why I had it fixed was so I could get my game saves off of it to transfer over to the XBox Slim.  I think I had to buy a special $20 adapter just to do that as well.  Fortunately, now it is going to come in handy, since it is the only working XBox that I have that can read an MU (Memory Unit), which is required for testing the device selector.  I also had an old Sharp CRT television sitting around collecting dust, so I can use it to test the lower resolution and 4:3 screen ratio.

  

  

Save File Problem

After downloading the XNA Game Studio Connect to this XBox and recovering my developer profile, I was able to connect my PC development environment to this system.  Unfortunately, when I tried to deploy the game, it just sat on a black screen.   This completely froze the XBox system, because pressing the Stop button in Visual Studio and pressing the Guide button on the controller had no effect.  I tried changing the resolution constants in my main game class to 1080×720 to see if that would help resolve the issue, but I still got the black screen.  Therefore, I had to manually hold the power button to shut down the XBox.

  

 

Next, I tried just deploying a default project, and I did get the Cornflower blue screen on the television, which at least gave me a starting point for finding the problem.

I removed the MU from the XBox and tried deploying again, and this time I got a runtime error (which is better than the black screen).  It was complaining about my save file not existing.  This file must have gotten created on my other XBox during my testing, but I never added the code to create the file in my final game code.   The OpenFile was crashing if that file didn’t already exist.  To resolve this problem, I just added a check to see if the file exists before it is read.  If it doesn’t exist, then it just creates an empty file, which should prevent the error.

 

After fixing this, I got another error about the file being used by another process.  This is (unfortunately) one of those problems that appears to happen only once.  I tried deploying it again, and the game runs fine.   I believe this was because the CreateFile method opens the file for reading, but it wasn’t closed, so when the OpenFile method tried reading the file, it saw that something already had a handle to that file.  However, the next time the game was run, the file was not created, so nothing had a handle to the file when the OpenFile method was called.  I went ahead and added a Close method immediately after the CreateFile call.  This probably isn’t the optimal solution, but I just want to get it working for now.

It’s a good thing I tested this before submitting my game, otherwise it would have probably crashed the first time someone tried to play it.  Unfortunately, there is no easy way (that I know) to entirely remove the game and the files it creates in the process, to simulate a new person playing the game.  It is possible to set the XBox back to factory settings, but then I would have to install all the updates, download my profile, and download the XBox Studio Connect again.

I went ahead and added a check around the file reading and writing functions, so it doesn’t try to read or save if the Guide is open.  Therefore, it won’t save the player’s data, but the game won’t crash.  Theoretically, this should never happen since I’ve added a check to the game level screen, which will transition to the PAUSEGAME state if the guide is active.  I also noticed that there is an “OpenOrCreate” property on the FileMode object used with OpenFile, so I was able to remove the inefficient Create/Close code I just added.  Using the OpenOrCreate property solved one problem that I’ve noticed, where it wouldn’t always add the achieved  ranks to the level select screen, making it impossible to get back to the last level completed.

After all these changes, my game still didn’t use the device selector, which is a requirement to pass the peer review in the Evil Checklist.  Spent some time (IO always seems to take the longest) to rework all of the file save code.  I quickly realized that the method that I used to save games in an earlier post did the job, but wouldn’t pass the peer review process.  The thing that gave me the biggest headache is the asynchronous method it uses to select a storage device.  While the player is selecting a device, your game is still running in the background.  This made it very difficult to do the load from the level select or game level screens, because  the game would be started (or level select displayed) before the storage device is selected.  Therefore, I created another screen just for selecting the storage device (LoadScreen) which subclasses my default screen class.  This screen will wait (unless the cancel button is pressed) until the storage device is selected and the file is loaded.  The next problem was which state should the load screen transitions to after it is complete, because the load screen can come before either the game loop screen or the level select screen.  I added a variable to the load screen called iFollowingState, which is set before the screen is shown to track the state that follows.  If the user doesn’t select a device, it remains on the load screen displaying a message to the user stating that a storage device must be selected.  If the user presses confirm or start, then it will give the user a chance to select the storage device again.  If the user presses cancel after not selecting a storage device, then the user is sent back to the title screen.  On an XBox with only one storage device, the player should never see this screen at all.

  

After a little more searching, I was able to find where the XBox keeps the save data for the deployed Creator’s Club games.  Under the System menu, select the XNA Game Studio Connect under games, and then there’s another menu under that which contains all of the game data.  This will be very helpful for wiping the save game data, to test the game as a entirely new player.


Title Safe Area

Started reading about the title safe area, which is another requirement on the Evil Checklist.  I think my game should be okay, since I was having a hard time filling up the entire screen anyway.  I may need to go back and double check some things like the “Replay” and “Next” selectors on the GameWinScreen.

So after I got the game running on the CRT television, I immediately noticed that the year value was being cut off on the title screen.  There is also a black letterbox effect around the top and bottom, but I think that is expected in the 4:3 resolution, so I don’t think it would fail peer review for the letterbox effect.  The arrows on the level select screen are slightly cutoff, as well as the word “LEVEL” on the game level screen.  Everything else is looking good.

Discovered that even though this looks okay on my CRT, it may still not technically be in the Title Safe area, which is determined by the Rectangle returned from graphics.GraphicsDevice.Viewport.TitleSafeArea.  I updated the draw method on the main Screen class to take one additional parameter, which is the title safe rectangle.  Therefore, I had to update all the screens that subclass Screen, to accept this new parameter.   However, it will be beneficial in the long run, since all draw methods will now have a reference to the TitleSafe area.

  

 


After adding the new TitleSafe Rectangle as a parameter to the abstract Draw method for screen and implementing it in all the subclasses, I drew a transparent red rectangle cover the title safe area.  This is really helpful in determining if anything is outside of that area.  I added a variable in the main game class, which can be used for turning this red tile safe box on and off.  I updated all of the screens appropriately, so vital information does not display outside of this area.  I left the scrolling arrows on the level select screen and parts of the S-rank circling stars immediately outside of the of the title safe rectangle.  The stars are just for show, and the user doesn’t need the arrows for navigating the level select screen.  As seen in the screenshots below, I had to move the selectable resistor icons slightly down, the “LEVEL X-Y” label to the right, and “Replay” and “Next” buttons up.  I had to move all of the text on the Game Win screen slightly up for everything to fit in the title safe rectangle.

  


Minor Fixes

Updated the Level Select screen, so that if the selector is over a level that can not be played at this time, it will have a darker color.  This was accomplished using the isLevelUnlocked method that I previously created.

Noticed that when pressing right on the D-Pad, the cursor will keep moving after the button is released.  When I checked the main game loop, I was actually calling rightPressed instead of rightReleased on the current screen when right was pressed on the D-Pad.  It’s hard for me to believe I didn’t catch this earlier, but I always play the game with the thumb stick.

Also noticed while testing the multiple device selector, the device selection menu would popup every time the Cancel/B button was pressed.  This was a really old test when I was first implementing the save feature, but I guess I never took that line of code out.  I never realized it was still doing that on my main XBox, because it doesn’t show the device selector when there is only one storage device.  It was really noticeable on the XBox with the MU installed.  Taking the load game call out of the “B” button detection check fixed this problem.




Peer Review Preparation

May 25, 2012

Evil Checklist

I started reading about what needs to be done to publish a game, and I noticed a thread on the App Hub site referencing the Evil Checklist.  I’m not sure if my game needs to pass everything in the list to submit it to the contest, but it’s probably better if it does.  For instance all games must have a trial mode to be approved to be published to the XBox Marketplace, but I’m not sure if that is necessarily required for the contest.  Since I still have two weeks until submission, I will try to make sure that my game passes everything on that checklist.

Right out of the gate, I know my game would fail peer review because it doesn’t allow the game to be played on any controller port.  It only registers input from the controller on the first port.  That may not be a quick fix, but it should be relatively simple.

The checklist also provides various tests for the device selector.  I know I had a problem the other night when the game transitioned to the game win screen (and saved) while the Guide was open.  My game may also not function properly if no storage device is selected, since it always reads from the storage device when the level select screen is displayed to show the ranks.  According to the Not So Evil Checklist, I can force the player to select a storage device.  Therefore, I should be able to just modify the code (if needed) to gracefully handle the state when no storage device is selected, such as returning the player to the title screen.  The real kicker is that my primary XBox (slim) doesn’t even have a port for an MU (Memory Unit) for testing multiple storage devices, so I’ll have to try to get the developer tools running on my old XBox (ugh!).

More Rank Updates

Updated the rank values for the last 30 levels, 7-1 through 9-10.  Played each level twice to get the piece, luminosity, and rank values.  If I got a better score the second time, then I usually played it again a third time.  Basically, I kept playing the levels over until I didn’t get a better score, and then I used the best scores for the S ranks.  I think the game should now be functionally complete, but I might go back and update the graphics for the selected cell (currently just a blue square).


Comes Full Circle

May 24, 2012

Back Where We Started

After almost two months of development, I’m back to doing what I started on the first days of development which is updating the sprite graphics.  Updated all of the wire graphics, so now those are filled with light gray (#e0e0e0) with white (#ffffff) and black (#000000) around the edges.  It seems to make the wires stand out a lot better.  Unfortunately, since the shading is on specific sides of the sprites, I can’t do the quick flip/rotate trick that I used when first creating these sprites.  However, Gimp provides the ability to zoom to make the pixels really large, which makes adding the outlines rather easy.  Just tedious.  It should just display as a slightly darker shade of yellow, since Yellow is used as the color parameter of the draw method.  Thought about adding an option to allow the player to select their flow color, but it’s too late to add that now.  Maybe a new flow color will be the reward for completing all of the stages.

 

While I was making graphics, I went ahead and replaced the GameThumbnail.png and Game.ico graphics.  I modified the resistor image with four connections, and replaced the number with just the letter R.  The size for the GameThumbnail was 64×64 pixels, which I believe is used for the dashboard.  The graphic I created is simple, but it does the job.  The Game.ico I believe is only used for when it is running under Windows, and maybe under the XBox system menu.

 

You’re on Trial

Made a trail screen in the game, which subclasses the basic Screen class.  It was a little frustrating to test this, since the game is not in trial mode as I am developing it.  There is a Guide.SimulateTrialMode value that can be set to make the game run in trial mode for testing.  Or I can run the game as trial mode from My Game list, but the game has to be deployed from Xbox Studio Connect first.

Copied a lot of code from the Pause screen to implement two selections, “Buy” and “Back to Title”.  Choosing “Buy” will call the Guide.ShowMarketplace method.  This doesn’t actually purchase the game, but instead takes the player to a standard XBox screen where they can purchase the game.

Added a check in the update method of the trial screen to see if the game has been purchased.  If it has been purchased, then it displays the “Thank you” message and removes the buy option from the screen (leaving only the “Return to Title” option).  From there, the player will have to use level select to pick up at the last level they were playing, because it’s too late now to rework the code for an event that will just happen once for each player.  Ideally, I would have a “Continue” option from the main menu, but I wanted to keep the main menu simple.  Having to find the last level played in the level select screen is the “price” the user has to pay in time for having the simple menu.

Added my cheesy Indie game “song” into the trial screen.  I had to work it in somewhere.

  


Other Fixes

Had to add a special case to fix the level 10 LED (piece ID 30), just as I had to do with the level 10 battery.  Made comments in the code that these should be optimized later.

Added code to center the numeric text of the batteries and LEDs, since the “10” value was displaying near the edge  of the battery and LED.

Maybe it’s just me, but the scrolling background for the game level screen on the XBox seems choppy.  It doesn’t do this for the PC version.  Not sure if that is fixable, or if it’s just my eyes playing tricks on me from looking at monitors too long.  The scrolling background for the title screen doesn’t look this way either.  I may have to re-evaluate some of the code that I used for the slow scroll method.  Alternatively, I could just set the level select background to scroll one pixel per update, just like the title screen does.

Noticed a problem when the level ends and tries to save.  If the Guide is already open, then the game will crash, because the file save operation uses the BeginShowSelector method which conflicts with the Gudie.  To fix this rare scenario, I think I can just pause the game when Game.IsActive is false which is suggested by this article.  This only happens if the player draws the connections to complete the level, and then presses the Guide button before the level is complete, which will cause the level to complete while the Guide is open.


Week 7 Video Update

May 22, 2012

Short Update video

Level Editing Done

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.


Play it Again Sam

May 20, 2012

Wrapping Up Level Design

Created 20 new levels, which use the 7 and 8 resistors.  Now I have a total of 80 levels.  If each level takes 30 seconds to play, then it would make the total time to play through all the levels 40 minutes.  This is not counting the replay time, which I’m sure some people will want to do to get the best ranks in all the levels.

While playtesting, I noticed a few issues with some of the levels that I have noted:

Level 7-5:  The 6 LEDs block the 8 LEDs, so the maximum luminosity can never be achieved.  Either remove the 6 LEDs, lower the 8  LEDs to 6 or below, or add tiles to make the 8 LEDs accessible without connecting to the 6 LEDs.

Level 7-8:  There is no way to activate the 1 LEDs without first lowering the 6 LEDs and 4 LEDs to one.  Again, this makes it impossible to get the maximum luminosity.

Level 7-9:  There is no way to activate the 5 LED without lowering it to four.

Level 8-2:  Accidentally added 8 and 1 batteries, when I intended for those to be LEDs.

  

 

Scales of Difficulty

I still feel like there needs to be something extra in the game.  I did have the idea to add capacitors, encoders, and logic gates, but it is too late now to make major changes in the game engine.  Those will have to wait for Resistor 2.  If I make any changes to the engine (even just moving the starting location of the cursor), then I will have to recalculate the time ranks for all of the stages, which is something I don’t want to do.  I think this is the right level of difficulty to reach the largest player base.  Most players probably make up their mind in about 10 seconds of first starting a game on whether or not the game is too difficult to play.  If the game isn’t easy to pick up, people will put the game in the “too hard” pile in their minds and give up on it.  On the other hand, I don’t want a game that is so easy that players will get bored with it.  This is definitely a delicate scale to balance, and that scale is different for each person.  I would rather error on the side of being too easy, because players may go ahead and play through the boring parts to see if there is something better coming.  If the game is too hard, then people will drop it and never play again.  However, there is a niche out there for very difficult games (Super Meat Boy, I Want to be the Guy), but that is only a very limited number of players compared to the overall pool of game players in the world.

Replay Option Added

One of the things that frustrated me while I was playtesting the game, was that if I did not get the best ranks on a stage then it would automatically send me to the next stage.  I really wanted to play the same stage again, so I could get the best ranks.  This made me have to quit, go back to the level select screen, and then scroll all the way back down to the level I was playing.  This was very aggravating, so on the GameWinScreen I added two options, “Replay” and “Next”.  Next is default, so the player still only has to press the confirm button to move to the next stage.  Pressing left will select “Replay”, which will just load the current stage again, so that the player can try to get better ranks.  These options don’t appear until the game win pause has expired (after all of the ranks have displayed).

This also sheds light on another problem, that on the Level Select screen it can take quite a while to scroll down to the later levels.  In a way, this is a good thing that there are so many levels to display, it takes some time to get to the bottom.  This reminds me of the game “You Don’t Know Jack” for the XBox 360, which had over 70 total episodes, so it took forever to select one of the later levels.  What I really need to do is have the trigger or bumper buttons jump up or down 10 levels on the level select screen.  The benefit of this is minimal, so I probably won’t take the time to implement that feature now.

Menu Backgrounds

Spent some time touching up the menu selector graphics.  This can really be a time drain, because I can spend hours on the graphics and it still not look perfect to me.   One reason I really don’t like doing graphics is because there is no right or wrong answer.  There’s just people’s preferences, which will be different for each person.  Added the bevel effect for all selectors.  I changed the main menu selector to a box, but I wasn’t happy with the color of the selector.  If it’s too light, then you can’t read the menu text.  If it’s too dark, then it contrasts too much with the rest of the screen, drawing attention away from the title graphics.  Fortunately, I can change the color programmatically, so I don’t have to change the graphic each time in Gimp.  Just as I was about to give up, I used a less saturated shade of green (selected from the scrolling background image), which looks fairly good as the selector color.

  

I went ahead and changed the font color for the 5 resistor to black, because white was a little hard to see.  Currently, only the 4, 5, and 9 resistors have black text.

Trailer Video

In order to submit this game to the contest, I have to submit a trailer video.  Therefore, I took a shot at making my first trailer video with its own cheesy indie game song.

 

Blog Cleanup

Went through all the posts in this blog and added categories, so that all of the posts related to Graphics, Engine, Game Saves, Level Design, and Audio can be quickly displayed and accessed.  A Video Update category was also added, to easily display all posts with video content.  Casual and Technical categories were added, so that the casual audience can view  posts targeted towards them.


Home Stretch

May 18, 2012

Small Glitch

Fixed an issue that actually only occurs on one frame of the fill animation.  This happens when a wire goes to the “filled” state, but the neighbor wires have not yet begun filling.  Since the wire is filled, it doesn’t make any connections to neighbors that don’t have the same flow value.  Since the neighbor doesn’t have a flow value initialized yet (assuming it is defaulted to zero), it’s flow value doesn’t not match the flow value of the wire that just completed filling, therefore it will not be connected.  However, on the next frame the empty wire will begin filling, using  the flow value of the filled wire which will make it connected again.  This flicker was quick, but it was noticeable.  Therefore, I added special checks for this case, and made the wires connected in this one frame case.

The Night the Music Died

Used the Pause method on the MediaPlayer to pause the music when the pause screen is active.  Unfortunately, there is no MediaPlayer property to determine if the music is paused, so I had to create a new variable to track if the music was paused.  I simply want to resume if the GameLevelScreen is coming from the pause state, but I want it to start playing anew if it is coming from the title screen or level select.  Also had to set this pause variable to false if the user quit from the pause menu to the main menu, otherwise it would still think that the music just needs to be resumed.  When that happened, it would try to Resume the title screen music when the level started.  The title screen music would just continue to play during the level, and the level music would never start.

Centering Text

Overloaded the drawRaisedString method, so that it now takes six arguments with the last being a boolean signifying if the text should be horizontally centered at the point passed as a parameter.  The drawing code is now in the six parameter method, and the five parameter method of the same name just calls the six parameter method with the boolean set to false.  This will keep me from having to change every line of code in the game that uses the drawRaisedString method.  Plus, I just add “true” as an extra parameter for the text that does need to be centered.

Background Colors

Fixed the background colors for level 4 (yellow) and 5 (green) so those aren’t so bright.  Also created a standard method in the LevelDefinition class that returns the background color, since that color was previously being determined in two different locations.  Updated those locations to use this new standard method.

Added columns of stars in the background which scroll if the player achieves the star rank (S Rank in all three categories at once).  Stars in the even number columns scroll in the opposite direction of the stars in the odd number columns.  I used Inkscape to make the stars since there was no easy way to make a star shape in Gimp.  Then, I just took a screenshot (PrintScreen button) and pasted into Gimp, because copy-and-paste from InkScape to Gimp doesn’t work.  I then used the fuzzy select tool to select the star, set the selected star region to white, inverted the select and set the remaining to transparent (after adding transparency to the layer).

 

One thing that I do like about C Sharp is that after some research, I found that structures (such as Vector2) can be passed by either value or reference.  At first I found it passed by value, when I tried to pass my star position to the getStarPosition method, but it left the position at the original value after the method completed.  Then I found that just using the ref keyword in the method parameter list and in the method call will make it pass the Vector2 by reference, which allows the method to modify the original Vector2 passed to the method.  This was necessary for me to make a trailing star effect, for the blinking stars that circle the results.  After trying a few different things, I thought the best look was two groups of three stars that circled the result screen.  Also, the yellow alternates between the three stars in each group.

More Effects

I also added a glow effect, so that the wire transitioned from yellow to white (four different shades) every 15 frames.  I didn’t like how it looked, so I just set it back to solid yellow.

Using the sprite scale parameter, I was able to make a light layover expand inside of the LED circle.  This gives the appearance that the LED is filling up.  The default color for an LED was set to light gray (previously white) to give a better contrast between the expanding yellow inner circle sprite and the rest of the LED sprite.