December 2018 Dev Entry
In this blog post I will start with a new tradition of using the current month that the blog post is being written as the title. This blog post though will summarize the work that I did in November 2018! Let's get it start.
November a lot of polish was put into the game. From polishing up the Outpost town, to getting new rendering systems in place. The game has never looked better. Let's deep dive into all that was done this month. But first let's do our monthly work hour totals, as is tradition after all.
November Work Hours
- Total work hours: 82
- Total work hours streamed: 17
Wow, these are not good numbers. What happened? I took two weeks off at the end of the month, that is what happened. Between the Thanksgiving Holiday to some much needed rest, it makes sense that the amount of hours I worked seems reasonable for half a month's time.
Outpost Town Polish
While a map could never be polished enough, I went around and polished up some things that were bothering me. All with the idea that we would be having a playable alpha coming out in a matter of days.
The Blacksmith now has an outdoor work area anvil!
The Blacksmith work area was created by Laguna by using tiles that were not intended to be a work area: he used a lumber shed, a chimney, and a stone doorway to create the original forge. I used that concept to draw a proper chimney arch. And then I also drew an anvil tile to place in front. It turned out pretty nice!
The Shop Exterior now has crates full of items!
There were a ton of empty crates outside the General Goods shop, so I added crates with different types of produce and a crate with some kind of metallic scraps in it. It really does make that area look a lot more vibrant.
With the exterior of the town looking good, it was time to examine the interior one last time.
In the previous months we worked on the interior of the town but I skipped the interior of one large and important building in the Outpost, The Command Hall.
The Command Hall Exterior viewed from map editor (not in-game).
The Command Hall was originally going to just be a building you saw the exterior of and the door was going to be locked. But we decided that the interior would be a useful place for several cut-scenes involving the main story. So I went to work making the interior.
The Command Hall interior viewed from map editor (not in-game).
The intention of the interior was to split the space up into three areas. One for a meeting table, one for a research desk, and another where we could place a large crystal used for communicating long distances.
I also took this time to create a basement for the Command Hall, and let's just say that got a bit out of hand. There was a lot of empty space on the map and I filled it with a basement full of hidden catacombs and tunnels. I won't show that in the blog because I want you to explore it first hand!
But now with all the interiors complete and with so many dark cellars and basements in the game I needed to do something to set the mood. I needed to get a light rendering system into the game.
The previous version of our game engine had a light rendering system in place that worked well enough. So I took that code and brought it into the newly refactored engine. But with a few changes!
The first thing I wanted to change was allowing more varied lighting shapes. Before all lights were emitted as a perfectly round circle. A very high resolution gradient circle. I took that same texture space that was used for this circle and was able to add over 8 lower resolution textures in that same texture allocation. I added cone lights for windows and doors, and of course a lower resolution circle.
Animation preview of the light rendering within the Interior of the Command Hall.
In the above preview you will see light coming from several sources, including: the windows, the torches, the fireplace and the candles on the tables. Each light source merges with the other light sources by using an erase blendmode. Additionally each light source may also be tinted. Only the lights coming from the windows are currently tinted a yellow.
Let's see how the light rendering looks down in a moody cellar...
Animation preview of the light rendering within a moody cellar.
As you can see the light rendering technique can be used to create the perfect mood for dark cellars. Plus the lower resolution light circle fits better wtih the retro pixel look of the rest of the game. A very good success I would say!
Tile Rendering Refactor
Sadly while I was testing out all these great new additions I noticed that the game would crash with the error "tile pool has been exhausted". Thankfully this error wasn't foreign to me, afterall it was an error I programmed to occur under a terrible situation. When the tile pool gets exhausted that means there are no more tiles to use to render the map. Each tile is stored in a reusable pool so as tiles move off the screen they should return to the pool so they can be reused to render new tiles. So if the pool is being exhausted then that means the pool is empty and tiles aren't being returned to it. I needed to see what was going on right outside the screen.
So I added the ability to zoom the screen out and see the tiles being drawn and erased. And while I was at it I also added the ability to track how many tiles are left in the pool. And sure enough the tiles were not getting erased and the pool was reaching 0 and then the game crashed. Oh no!
I spent the next week refactoring the tile rendering engine to narrow down the issue and resolve this. I resolved it by making sure my method names were more clear to what they were suppose to do. I had too many methods that included the word "erase" and one "draw" function. But what I realized is that I needed to come up with a new word for a concept that is to erase the tiles but only those that are out of the bounds of the screen. I decided to call this new concept "cull". And thus everything instantly got simpler. I now have three methods, "erase", "cull" and "draw". And with that the pool worked as intended and the code base is now more organized than before!
I found myself a few hours to work in the later half of the month and so I added a few small things. I added the ability to flag ladders which allows your character to always face upward when walking up or down a ladder. Its the little details. And I also added a way to flag tiles as hidden passages allowing you to walk through otherwise solid objects. This will allow us to create hidden passages like many classic JRPGs! Both of these features required me to introduce a new feature called "Tile Flags".
Tile Flags are basically tiles that we place on the map that are invisible to you, but we provide keywords to each. I then just have to add those keywords directly into the engine wherever they make the most sense. For example the "ladder" keyword adds additional functionality to the turnToFace methods. And the "passage" keyword adds functionality to the IsPassable method.
New Character Backdrop
For only an 80 hour month there is even more progress to share with you. Yes another feature.
In the last days of the month I added an amazing new character backdrop. This required new art assets to be drawn, and a new backdrop rendering framework that will be highly reusable throughout the game.
Preview of the Characters screen (Work in Progress)
I will go into the backdrop system as its own blog post soon. But to just touch on it briefly, it allows me to create these scenes in under 3 hours, very easily. And it gives a really nice effect as the background for this screen and other menus, but also I can use it as a parallax background behind maps!
In the preview above one critical piece is missing. I want you to see your selected character standing on the cliff at the bottom of the screen. This will come hopefully before the Alpha release. But just imagine Dana standing there!
This month so much was completed and yet my biggest goal getting the Alpha released wasn't reached. But we are closer than ever to the Alpha release.
If you want to help support the game there are so many things you can do. But the simplest thing you can do is hit that "Like" button below and leave me a comment so I know you read this and even that bit of moral support goes a long way to keep me going.
If you want to do more here are some things you can also do:
- Join our discord: https://discord.gg/phanxgames
- Support me on Patreon or Donate: https://www.phanxgames.com/donate
- Follow and Subscribe to the Twitch Dev Stream: https://www.twitch.tv/phanxgames
- Follow me on Twitter: https://www.twitter.com/phanxgames
- Buy Special Offers and support us indirectly: https://www.phanxgames.com/offers
Thank you so much to my patrons and Twitch subscribers! Without you I wouldn't be able to keep doing this. Your support makes this all possible.
A special thank you to my Patreon supporters: Parker, Grant, Daniel, Alessandro, Alexander, Mark, Roman, and Shield!
@OffbeatJenny and @addikit: Thank you for reading the blog post, I hope that this month of december we get even more done! @shieldgenerator7: I use a switch statement to parse the tile flags. I can just throw an exception with the incorrect tile flag traced in the default clause. And that will always show us if we did something wrong. In addition, since flags are inserted in the game tools program we can have the game tools parse the input for errors and catch it even earlier. Thanks for reading and providing feedback :)
about flags: the danger of using text flags is that you can accidentally use an invalid flag that looks like a valid one. For example, if you misspell "passage" as "pasage", your compiler won't tell you and tracking down the resulting bug would be really difficult. I would recommend having a class that stores all valid flags, and then checking with that class everytime you need to use a flag in code. That way, your class can raise an error if you try to use a flag that doesn't exist, like is the case when you misspell a flag.
wow thats cool how you solved the tile pool problem. nothing like well-named methods and a bit of refactoring to make coding easier!
All you needed was some needed rest and you could get so many things done! Impressive and awesome.
You really did get a lot done for the time spent!