Back in high school, my math teacher gave my parents a grim warning. It was about my methodology in his class. While I was getting perfectly adequate results in my work, I wasn’t following the structure he was teaching. Not only that, but the way I was getting there was almost indecipherable. It looked like I was winging it, instead of planning ahead of time.
So he told them that this way of life would work, for a while. But I didn’t start organizing myself better, there would come a time when improvisation wouldn’t be enough.
I would, inevitably, hit a wall.
Since then I’ve had plenty of situations where you could say I’ve “hit a wall”. Personal projects I dropped partway through, bills I forgot to pay on time, disastrous scores due to sheer negligence.
Once, I wrote down the date wrong for the final exam of one of my university courses. Naturally, I never bothered to double-check. Then I even attempted to find a study group for the exam the day after it happened, exposing my idiocy to everyone in my year.
And yet, despite wall after wall, it’s like I refuse to learn anything from these mistakes. These moments never hurt quite enough, quite long enough, for me to change my ways. Years pass. Life goes on.
Maybe the wall my math teacher foresaw is yet to come.
Miracles and Magic is where the story of Mirama’s creation begins… Sort of. For years at that point, I’ve had a desire to make something I could call my own. There was this vague concept in my head, of a reversed adventure. Of something going wrong along the process.
Sometimes, the idea was for an action game where you have to persist while the growing attention of the world turns against you. Sometimes, the idea was for a role-playing game where your teammates would turn against one another in the end due to differing ideals.
Now that I’m taking the time to write that second idea down, doesn’t that just seem like Shin Megami Tensei without demons?
Of course, “things be getting worse yo” is not the strongest concept to build any project. So nothing came out of it. I’d just be daydreaming, at times, without actually putting any work into these ideas. And that could have been the end of that.
But it wasn’t. If the soul-crushing reality of the workplace can be thanked for one thing, that’s reigniting the spirit of the Artiste in me. Still haphazardly, I started thinking of ideas for a cinematic universe.
Well, maybe that’s overselling it. Through scattered thoughts, a trilogy started to form in my head:
Determined that I’d make something I could call my own, I started writing The Bass Awards around halfway through 2018. That’s… 4 years ago now. Ouch.
Not having a clearer plan of where I wanted to go with these projects made progress difficult. I missed the original deadline I set out for myself – instead of basing The Bass Awards on games released in 2018, I had to go at it with games released across both 2018 and 2019 instead.
Thankfully, I eventually found a system that clicked for me, dividing the story into little chunks that played out like side stories in an RPG. Once that was in place, writing went a lot smoother.
Finally, this story where my self-insert character spends a long period holed up inside while the world outside shifts to something unrecognizable launches… In March 2020.
Oh. Huh. That’s some interesting timing.
It’s funny. At first, I thought my introverted nature would be an incredible fit for a pandemic, and working at home. Turns out that wasn’t the case at all. When one’s social experiences are based on having small talk at work, and people reaching out to you outside of it… It doesn’t take too long for the silence to turn deafening.
In any case, the nice comments I read on Destructoid after releasing the Bass Awards cheered me up. Like so many, my family and I were going through rough times – rough times that aren’t exactly over, but we’ve gotten better at shouldering them. I think I have, at least.
Don’t worry. I’m getting to Miracles and Magic now.
This is a game I blogged about on Destructoid already, so I’ll try to keep it short. The prospect of a pandemic summer sounded like torture to me. I wanted to participate in some kind of community thing to get my mind in a better place.
In the end, I ended up itching to participate in a game jam. It was the perfect opportunity to reconnect with friends, online and otherwise, and to get us to do something a little different from our rapidly stagnating routines. And, as a bit of an ulterior motive of mine, it’d also force me to start working on the second pillar of the trilogy.
Starting with, uh, figuring out what that second pillar would even be like.
I ended up hosting a game jam over the summer of 2020. Many game jams are competitions that only last a strict amount of time – a weekend or so. Making that work would be very difficult for everyone’s schedules, plus I didn’t want to lead any of the friends participating to burnout.
Doing it this way led to impressive entries from everyone! It was an absolute blast.
But let’s get into the game itself now. The theme I revealed to participants was “loss”. And, as I was brainstorming ideas, two concepts locked into place for me.
That second part was kind of a remnant of these old ideas of mine. A sight loss mechanic ended up one of the first things I coded for Miracles and Magic! Ironic, considering it’s the one element I don’t plan to bring back for the full game.
These thematic and mechanical losses were wrapped up in a three-stage long action game. Getting proper AI done under a time limit would have been a recipe for disaster, however. So I felt inspired to make a bullet-dodging game inspired by bullet hells and the Nier series. Thrilling, without worrying about enemy movement!
Time for a little self-review!
I’m proud of what I accomplished with Miracles and Magic. Sure, it’s far from perfect. It wears game jam compromises on its sleeves. But there is something here.
Something I want to chase after.
Unfortunately, Pico-8 as a development platform has a ton of limitations. One of the bigger ones is the cartridge size, which I’d already managed to fill with the (fairly short) original. If this was going to be a commercial game, I’d need to move to a different framework. That meant starting from scratch.
A little detour first. My original reflex, back in October 2020, was to set out to complete the trilogy. The final piece missing was the story taking place in the future. So I sat down and started writing this story, which I’d renamed Legacy of Miracles and Magic.
I went nowhere fast. Writing good dialogue is extremely difficult, turns out! Everything I would start to write felt like an excuse to move a story along, rather than conversations between three-dimensional characters.
Mélodie’s time in the spotlight would have to wait.
So I decided to return to Miracles and Magic and keep the game development momentum going instead. From the get-go, I started this project – creatively named Miracles and Magic DELUXE – with two objectives:
If your first thought goes like “these two sound counter-productive to one another”, you’re not alone! But I figured if I prioritized goal #2 over goal #1, I could get it done. And that started with better planning.
The project starts with a Trello board. I’m honestly impressed with the past version of me. It’s been months now since I’ve updated the board, but it was a good way to organize thoughts, designs, and track progress. Maybe I’ll return to this one.
I wanted to get some progress done quickly, if only for motivation’s sake. So work begins on a new engine. Instead of learning Unity, Unreal, Game Maker, or anything else that’s prebuilt, I go for pure C# with Monogame.
It’s not an artistic statement, or a desire to optimize the heck out of the game.
It’s just that I already code for my day job on the regular. I know how it works. Moving to a premade engine meant learning a brand new UI and set of tools. That meant taking the time to learn and plan ahead. And we couldn’t have that, for the sake of objective #2.
Wait… Planning? That was the plan, right?
Meh. I set out a basic project and start splitting some basic logic between an Update method and a Draw method. By the end of the weekend, I can display a playable character on the screen and move him around with the arrow keys.
Oh yeah, now it’s all coming together. Shouldn’t take too much longer to start having collisions and obstacles and level design, I can feel it.
Well, animation playback is… not nothing. Plus December’s a good month for personal projects, with vacations and all. I have a good feeling about that one.
Things are happening a little out of order, but now that there’s a perfectly functional code repository doing stuff I start to write down the story’s basic beats again.
First: Location. The original game took place in fake ley lines in real locations:
Three levels make for a short game, especially with my goal of releasing this commercially! So I’m looking to visit two additional ones: Tentatively, a winter one, and one in grassy plains.
Then I figured I should ask a friend of mine, studying history, what places would best fit this destination quintet around the turn of the millennium.
In the end, we could not find any perfect fit. I started considering my different options, and I realized something.
I was going about this the wrong way.
I was trying to complete a pattern because that was “how the original did it”, instead of reconsidering everything. There were no obvious benefits to sticking to real places, it’s just something that was improvised in a game jam. But it came with risks, of limiting creativity, and of being disrespectful to other cultures.
So I decided I’d go with fictional locations instead. Progress!
These are the six destinations I started with:
You can probably notice at this point that, despite having better variety than the original game, I didn’t exactly have a strong thematic link going yet. But as a starting point, it would do.
Alright, now let’s check out the state of the code to wrap things up for 2020.
Ah. It’s the same thing, but without the framerate lock.
Bring on 2021!
Before looking at the timeline of the game’s progress over time, it’s a good time to mention the outcome of the brainstorming I did over the holidays. A few ideas stood out and became part of the project:
Starting to feel like… a plan? Alright, let’s see that progress.
The first new bit of content added is a dialogue system!
If all else fails, I could recycle the engine for a visual novel at this point. Marvel at the artistic talent behind these portraits.
Plus look at that, we’ve even got dodge rolls working again! But they look so stiff at this point. I quickly realized my Pico-8-era sprites weren’t going to cut the mustard.
While there was a lot of progress between the last update and this one, there is unfortunately nothing I can show in-between.
Why? Because the game straight up refuses to launch until February 22.
The problem stems from my use of the Tiled map editor. I’d already used it in a game jam so I knew my way around it, but importing the outputs in Monogame isn’t trivial.
I attempted instead to use a premade library to do so for me: Monogame.Extended. But I was already running into a couple of issues; Monogame itself now supported .net 5 but Extended still required .net 3.1. Still requires, actually. And for some reason, I also needed to forcefully include specific DLL files in my project to even get the thing to run.
But look at that! Updated homemade sprites! A functional camera! Collisions! Bullets that hurt the player! A dodge roll with an extraordinarily short invincibility window!
At this point, Mirama (as it’s now named) is starting to look like a video game again. Exciting progress, but also… That was a year and a half ago? Oh no!
And now we have a proper pause menu! The options don’t do anything yet, but as this is taking place in a storybook world, I figured a bookmark would be a nice thematic fit.
One thing that always motivates me in any project is the chance to work alongside someone else. Whether they’re on the same team or not, just having someone around that is going through the same thing does a ton to keep my mind focused.
During this period, I had the pleasure of having Lunate make sprites. That helped me focus on the code, and we were going to have much better-looking visuals as a result. And that made a ton of difference to keep this little project going strong.
Let’s have one last look at the state of the game pre-sprite revamp. By this point, we have two different levels (a hub and the bullet-filed level), idle animations, and even a boss routine! It does not show super well on the gif, but the spell meter does charge as I empty MP bars into it. Pinky promise!
Now doesn’t this look just a trillion times better? Playing back Lunate’s sprite animations in-game required a bit of work – I wound up creating an Animation Player that could queue animations. That’s useful, for example, to have transition animations for in-between states. Transitions like having a short wind-up before running, or waking up from a long idle animation.
This quarter suffered the most from my unorganized approach to game development. Instead of carrying on with game mechanics, most of the work that was achieved here was on menus instead. It’s work that needs to be done, sure, it could and should have waited for longer!
I guess I was excited to have the sprite art for the different text boxes at the ready – plus with Lunate moving on to working full-time in the industry, that meant I was back to solo development.
A year ago. More than half a year after Mirama’s development began. What’s the state of things? Well, it’s almost worrying how much of the current-day progress of the project is already in here.
I haven’t checked how other engines handle dialogue histories, but here’s my approach in case it’s of interest to any of you. I already have a Dialogue Box class that holds as many dialogue entries as I throw at it and displays them one at a time, right?
So when it comes time to remove an entry from the dialogue box, I added two different callbacks. One that comes from the dialogue entry itself (it could trigger a level change, for example) and another globally used for every entry.
That second callback is provided to the dialogue box at its creation and is a simple method that stores the dialogue entry in the history menu’s internal list.
Of course, I don’t save the dialogue history anywhere, so it’ll be wiped when the game reloads. Would that be a big deal to any of you?
Ah, there we go! Much better. Now time to work on the gam—
Oh, the title screen? Sure, we need a title screen. That works too, I guess.
If you ever wanted to know what an in-development menu looks like, your wishes have come true!
So what’s happening here? To explain that, we first need to explain a common user interface technique called the “9-slice”.
How does it work? Let’s start by taking a look at a dialogue box sprite, like this one:
If you use the sprite as is, it will only look good if you’re displaying it on a 48x48 pixel surface. Otherwise, you’ll get results like this:
Yummy yummy in my tummy! Well, what’s the alternative?
Instead of looking at the original sprite as one texture, let’s look at it like a tileset, like you’d see in a level editor. Let’s treat the four corners, the four sides that tie them together, and the center as 9 different textures.
Now, remember how wonky the lighter blue part of this texture ended up when it was stretched? Preserving the original look requires respect for the natural direction of these slices.
Take the left side slice. This one can’t be stretched horizontally without changing the width of the light blue section, but it can be stretched vertically because each horizontal line of pixels is identical. Applying this to the rest of the texture, we can see how each of its different slices has its limitations as to how they can be used.
By now, you might start to see how we’re going to construct our final shape. The corners can’t be stretched, so we’ll put them in the corners of the final image, with their original size.
Then the sides stretched in one direction to connect the different corners:
And now we can just fill in the rest with the center texture, that can stretch in all directions.
Tadah! And this can all be done by the code, instead of preparing a different sprite ahead of time for every use!
An eagle-eyed viewer might realize that we could save most of the on-disk space taken by this specific sprite: the corners are identical, so we could just reuse the same one. The sides only need to be one pixel wide, because they’re going to be repeated anyway. And the middle only needs to be a single pixel.
But the texture is already only taking 200 bytes. If Mirama ever gets to the point of needing this kind of optimization, we’ll be in a very good place!
In any case, when I took this snapshot of the game, I hadn’t applied the 9-slice technique to this menu yet, the textures being stretched to their final position instead. This shows one of the limitations of pre-rendered UI: The proportions can’t be tweaked in the code without ruining the final look.
Here’s what the final result looks like! I also added a text-entry menu based on the one in the Paper Mario series – I know what I like! When the DONE button is pressed, the game creates a save file on disk that, for now, only contains its name.
Alright, the title screen is in good shape. Time to get going with the game proper. Any second now!
I wasn’t at peak mental health in this period, to say the least. I almost ended up scrapping the project entirely. But I hadn’t given up on the way of the Artiste. Instead of working on Mirama, I ended up writing a series of 8 short stories. They incorporated a lot of similar themes to what I have in mind for the game: Stories of self-worth, longing for long-lost innocence, of the undying struggle that makes us human.
I’m happy with how they came out, all things considered – if you haven’t given them a look already, it might just be worth the detour! And I need to give a special shoutout to Chris' comments on these, which seriously brightened up my day at a time when that felt particularly important.
Momentum has thankfully been pretty great since I started work on Mirama again. Maybe a break was just what I needed at that time. There might be other periods where I struggle to get progress done, but I want to see this through. For me, for Mélodie and the Storyteller, for Alexis and Béatrice, for anyone who believes I can reach that finish line.
Little by little, I’ve been able to get a ton of things finally done to a point where I finally feel comfortable just messing around with the level design. Sure took a while, didn’t it? The bullet list of things I finally got done looks like so:
So what is it all looking like, right now?
Look at that, it almost looks like a trailer! Speaking of, maybe it would be a good idea to end this blog with a good old-fashioned sales pitch. I’ve been writing this like a stream of consciousness after all, so…
Maybe it’s time to pick some of these pieces up, no?
It’s the middle of summer. In the small village of Saint-Joël-de-Nulpart, the vagabond Mélodie desperately searches for respite from the heat. Finding shelter at a local storyteller’s home, she awaits kinder weather, while listening to his tales.
Avoid fearsome attacks! Bring comfort to strangers! Change the world!
Mirama is the story of Alexis and Béatrice, a duo of mercenaries. Both were born with the gift of magic, but choose to avoid its use for reasons hidden in their pasts. As a strange affliction ravages all magic wielders across the land, these two are spared. This inspires the two to journey to the five world pillars, the wells of mana that give the world its structure.
Their goal is to seal each and all of them away, bringing an end to an era of miracles and magic. It’s a story full of intricate bullet patterns, puzzles to solve, and small moments to cherish with the strangers they encounter.
It’s an unusual pitch for a book. And yet, it manages to enrapture Mélodie. Not only the story told through these pages, but the implicit one told around them – the tale of the village and its people.
In the end, will she ever want to leave?
These five world pillars… I wonder what remains when these sources of hope are taken away. There must be something to look forward to for the faithless and the common man. For the stagnant, the lonely, and the disillusioned.
There simply has to be.
I won’t lie, I’m looking forward to figuring it out together. Even if we still have a lot of walls to hit before we get there.
How does that sound to you, Mélodie?