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).
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.