Welcome back, put up your feet and take a load off. It’s the second newsletter already, and there is so much to talk about. I’ve been working on Monster Heart for a few months now, getting the engine ready and rolling to go. My main plan with this engine is to build something that makes it easy and simple to make games I want to make (and games I like to play). That is, primarily 2d pixel art games that focus on exploration, simple game mechanics, heavy on the narrative with some light puzzle solving.
I’ve been attempting at making games like these, in various languages, engines, and libraries for a long while now. And really, it’s my favorite kind of game to make. Bad Writer is a very good example of this kind of game, for certain. Emberglass, the first game we put up for sale, isn’t exactly quite the same as this kind of game. it does have some elements I love, but I left out the narrative heaviness on purpose with that game. I wanted to finish a game on my own, and release it. And I knew that if I went the narrative heavy route I would have to create a GUI system and handling all that goes with it, as well creating a system for creating cut scenes, and all of that. And that would add a lot of time in game creation, and it was important for me to get it out, just rip the band aid off and have a complete game. All the games I made in the past, it seemed to take a long time to make the GUI work, and have it be windowed, and have cut scenes and all of that. It was where I got bogged down the most.
Well, when I created Bad Writer, I focused almost entirely on a menu driven game, and it went very smoothly this time around, unlike in the past. After all, that game only took me two and a half weeks to create from start to finish, and the GUI was the main portion of that work. I decided to simplify how I did windows/gui in video games, and it was like a huge load off. I just cut right to the quick, made a very simple menu system, a very simple way of displaying game windows (with a psuedo 3d affect), and ran with it. Sure, there were downsides with the one I created for Bad Writer.
For one, I hard coded everything. While this can lead to speed when creating a game and designing it, it royally sucks for re-usability. All the code in Bad Writer that was re-usable was code I’d used elsewhere before hand (such as the finite state machine that controls game logic, and the way it handled keyboard and gamepad/controller controls). But the actual window system, game logic, etc, couldn’t be used elsewhere.
And even though the game was created quickly, I realized I could make an engine to speed up the process even more for future games. So I created a wishlist of features that would make my life easier, and abstracted them in a way that made them super versatile. I created a sprite stack, to cut down on memory space. I created a simple entity engine that allowed for dynamic interactions (eg: just add a function called “interact” and that object can be interacted with by the push of a button!), and handled collision detection and animations (both for walking and still animations). I added a day/night cycle and really nice dynamic lighting using the Luven light library for Love2d. That was key, I always love a good day/night cycle in a game, and I am a sucker for 2d games using 3d shaders for lighting effects.
Then, the key bit to make it super re-usable, was to have it tie into TileD in a very interesting, and complex way. Basically, I turned TileD into a game maker of sorts. TileD is wonderful at this sort of thing, you can easily create custom properties, entity types and classes for objects, etc. Each game moving forward can use TileD in it’s own unique way, simply and easily. This is important for re-usability, since each game will do things slightly differently.
For example, Monster Heart will have NPC/Monster scheduling, much like Ultima 6 or 7 (or Stardew Valley, for a more recent example), where characters wander throughout the day, following specific paths and schedules. Some monsters are awake at night, others like to migrate at dawn. Some evening there will be special events, and all the workers on the island will get together and have a celebration. In the evenings most of the workers meet at the local coffeeshop/bakery and hang out and talk shop. Not all games will want this kind of complexity, nor need it. But it will be easy to add and subtract no problem at all.
Currently the scheduling is using a robust series of area sub maps (for wandering) and a* pathfinding (for moving to specific places during specific days and times). There are also other elements within the engine that will mostly be unique to this game, for example all characters and monsters have emotional states (including the main character) that change how to they talk and interact with each other. The A* path finding is also used in touch screen and mouse based movement, which the game engine currently supports in an intuitive manner, so you won’t have to use such kludgy things like a virtual gamepad, or using your analog stick on a controller like a mouse.
Anyway, that’s the basic overview of the engine. Some of things I slotted in for the futrue, and would love to have in Monster Heart (but might not make the deadline) would be a random weather cycle (like what was used in Emberglass) that effects the feelings/emotions of everyone on the island, and a season cycle. I have a really pretty snowflake pixel art that uses a pretty cool particle engine that I’m hoping to use. But we’ll see! If for nothing else, a post release update or future games will use it.
And that’s it for this. There are more features and stuff I want to go over eventually (like having a talk bubble pop up when you’re near items to interact with, so that the player is notified that hey, this is important). Also, in the future this will be more of a devlog for a bit, talking about the stuff I did that week. This first one was more of a “here’s all the cool stuff I did so far”. A kind of catch up post, so to speak.
I think the next newsletter will be a bit about the pixel art for Monster Heart, and why I’m doing it the way I am, and why I’m using that style, etc.
Until then, ciao.