When I was first contacted by Binary Cocoa to help them finish off IT Simulator, I was in the middle of my Ludum Dare project. I offered to help out after the contest if they still needed me, and they were gracious enough to wait for me. I've worked with Binary Cocoa in the past on the BOCO title so I was already familiar with some other projects they had up their sleeves, including IT Simulator.
IT Simulator is a title that was made in partnership with Fisher's Technology, a private business based in Idaho, the same state where Binary Cocoa is headquartered. Fisher's Technology wanted Binary Cocoa to create an arcade-style game to be used as a marketing tool at an upcoming IT conference.
The gist of IT Simulator is that you are a Fisher's Technology IT worker who must travel to various locations to fix and prevent the destruction of several pieces of office equipment such as computers, printers, copiers, etc. As customers use the equipment, the equipment's health goes down. You need to make sure that health doesn't reach zero or else the equipment will catch fire and become unusable. As customers use the equipment, the equipments make money for the business that you are helping to service. If there is not enough working equipment for customers to use, they get angry and temporarily stop spending their money. Some fun little features in IT Simulator include being able to pick up and throw office equipment, smashing and jumping out windows, and moving equipment to different floors to help with load balancing.
When I got involved with IT Simulator, much of the core gameplay was already completed. Binary Cocoa had me assist their other developer with some rendering issues, balancing the gameplay, and tweaking some of the core mechanics. IT Simulator relies very heavily on a piece of software I wrote in the past called Simple Tiled Implementation (STI). STI is a LÖVE module that imports and renders tilemaps built using the Tiled map editor.
The first order of business was to fix some of the rendering issues that were being caused. IT Simulator was specifically designed to run in an arcade machine with a 16:9 screen. With that in mind, we didn't want to spend extra time making sure it could run on dynamic screen resolutions. The quick fix was to draw everything to a 1920x1080 canvas and scale it as needed. This technique ensured the game would run perfectly fine in its intended environment while letter-boxing on other aspect ratios such as 16:10 or 4:3.
With window scaling taken care of, the next problem was scaling the world. Each level is designed with a basic set of parameters: There is a distinct floor, the building has a height, and the world has a width. We wanted the entire world to be visible on screen without any camera panning, so we had to design each level to be able to fit within a 16:9 environment where the world is scaled to fit the width of the screen while the height of the world doesn't clip out of bounds.
Once the world is properly scaled, it is not always lined up exactly where it should be. STI generally draws the world starting at the top-left corner of the screen, but that is not always the right place for the world to be. If a world is shorter than the prescribed 16:9 aspect ratio, then you will see a hard edge where the world cuts off. This is not desired so we must reposition the world so it is anchored to the bottom of the screen, not the top. To do this, we do the following:
- Get the height of the screen
- Get the height of the scaled world
- Push the world down by the height of the screen
- Pull the world back up by the height of the world
Or, in pseudocode:
-- Get the height of the screen and world local screen_height = love.graphics.getHeight() local world_height = world.height * world.tileheight * world_scale -- Calculate anchour local translate_x = 0 local translate_y = screen_height - world_height -- Anchour world to bottom of screen love.graphics.translate(translate_x, translate_y)
With that, we fixed all of the rendering issues.
Up next was tweaking some of the game's mechanics. Binary Cocoa wasn't fully satisfied with how the game's scoring was implemented. Originally, the player earned money by fixing office equipment. This had the unfortunate incentive to allow the equipment to nearly break so you could then milk it for more cash. We both felt this sent the wrong message to players about Fisher's Technology's business motives, so we came up with the new scoring mechanism where customers were spending their money at businesses to use the office equipment. Money per second was earned based on the health of the piece of equipment so keeping the equipment in pristine condition meant that customers were spending more money than if the equipment was low on health. We felt this gave a much better image to players as it sends the message that Fisher's Technology wants to help your business thrive.
Another mechanic we decided to change was customer anger. Originally, if a customer became angry, they would be permanently angry. The main problem I had with this was that it was too punishing to the player: there was no way to fix a mistake once it was made. This sent a bad message that angry customers should be written off instead of won back so we decided to set a timer when a customer became angry. This would give the player a few seconds after noticing the angry customer to fix the office equipment on that floor before the customer tried to use it again. Players were now penalized by letting customers get angry since that customer would not be spending money while angry, but they could still fix the equipment for the customer and that customer wouldn't be considered a lost cause.
Temporary anger had one major drawback, though: all you needed to do to appease them was fix the equipment. Originally, even if equipment for to zero health, it was possible to fix it up and be on your way. This made the game a bit too easy since you were able to focus your attention on a floor that made more money while letting other floors wait to be serviced. To fix this, we adjusted how anger was calculated. If a piece of equipment got to 30% health, it would start to smoke and customers could no longer start using it. However, if a customer is currently using it, they can continue using it until it reaches 0% health at which point the equipment catches fire and becomes permanently destroyed. To keep this mechanic from permanently punishing a player, we added extra office equipment on some floors so that a player can take surplus equipment and bring it to the floor where it is needed. Now players need to try to balance the health of all equipment, or else they will have to do some load balancing, which takes extra time.
The final order of business was to create a high score screen that players could use with the arcade machine's controller: a joystick and some buttons. I am an avid player of the arcade games Dance Dance Revolution (DDR) and In The Groove (ITG). I really liked how ITG's score results screen worked: The player presses left or right to seek a letter, number, or symbol and then they press the select button to accept that letter. The player can select up to four characters as their initials. I decided to use this same method for IT Simulator. This screen only took about an hour to whip up and test so I was pretty happy with how it turned out.
With all the tweaks and changes made to IT Simulator, we still finished the project on time and Fisher's Technology was very happy with the results. I was happy to be a part of this project even though I only stepped in near the end and I look forward to the next game I get to work on with Binary Cocoa.