Last time, we looked at the origins of this blog. Today, we’re digging into the oldest project I’ve got: Halberd
Yes, the very same Halberd I abandoned 3 years back…ish. But we’ll get to that part of the story later, let’s go back to where it all began.
Yeeeeaaah, didn’t see that one coming did you? None of you did, not even my closest friends know the full history of this project. Like many kids born in the 90s I had a phase where I was really into Neopets. At this point it’s pretty hazy in my memory, but I still distinctly recall the browser-based RPG NeoQuest you could play (among various other games) on the site. I put way too much time into that game, and so when I finally learned Java in high school I started playing with the idea of making my own RPG in a similar style.
This project proceeded to go nowhere, and vanished into the mists of time. Typical!
Ah, here we have yet another childhood crush. I wouldn’t be surprised if this game had the highest playtime of any game I’ve touched, given that I started in the mid-2000s and only stopped playing a few years ago. But why do I bring that up now? Don’t worry, it will make sense soon. Just keep that game in the back of your head for a moment.
Halberd, Take 1
Returning to Summer 2012 now, it was the summer between highschool and college. With that failed project still fresh in the past and an MMORPG in the present, I had RPGs on the mind. What could possibly go wrong? As it turns out, nothing. Yet.
Heading into my first semester, I wrote a post about a new project. I don’t have an exact timeline anymore, but judging from the post the game was started at some point in June or July. In typical Love2D project fashion, I’d made some fairly impressive strides in just a short period of time! Going by this post I already had the ability to create and load maps (from a custom editor), walk around, use items, show text, get in fights, and uhhhhh…
…not fight them.
Going by the screenshot in that post, there was another feature I’d neglected to mention at this point: A day/night cycle. Why? Who knows! But despite being entirely cosmetic at that point, it’s something I’d added. In general, looking at the oldest builds and goals I get the distinct impression that this was intended to be more of an open-world game. But still turn-based. I don’t really get it either, but this open-world format is something that would survive several years in the end!
Anyway, the main takeaway of that post is that at this point, I actually knew very little about RPGs. Much of the goals I’m describing align closely with western RPGs, but my first goal describes the game as
“…leaning toward the Final Fantasy side of things rather than, say, Fallout.”
Final Fantasy 15 did not exist at the time, so I cannot fathom what caused this disconnect–well, no that’s a lie. I totally can: I hadn’t played any Final Fantasy or Fallout games.
Then, towards the end I present the quintessential RPG foe, the slime:
Note, again–at this point, I had not played any RPGs prominently featuring slimes. I was vaguely aware of Dragon Quest though, and just sort of absorbed the idea that slimes were a big RPG thing as a result.
Looking back today, with significantly more JRPG credentials, this whole spiel feels a little weird to read. But if I hadn’t played much in the way of RPGs, where did my inspiration come from? Let’s take another look at a screenshot:
Hmm, something about that seems familiar…
Let’s Just Forget All That Happened, OK?
Yes, it’s exactly what you think it is. Let’s just moooove riiiiiight alooooong to our next post from early September.
I kept working on the game for a few weeks, and here I document one of the more interesting things I did: A chunk-based map loading system. In order to make that open world I wanted, I needed a way to have infinitely-large maps. To make it happen, I came up with a system that would dynamically load & unload regions of a larger map grid as the player walked around.
It’s pretty simple stuff, but the fact that I was already able to solve problems like this before really learning anything in college does a good job of pinpointing my experience at the time–I’d been making games for a few years already, so even without strong tech or design knowledge I already had the problem-solving mindset that’s so critical for programming. If there’s one thing I’d advise prospective coders, it’d be to work on developing that mindset as fast as possible.
The Famous Map Editor
I suspect any long-time reader might be surprised by the above, because the last time we saw the name “Halberd” is was in relation to Halberd Studio, an engine for building RPGs. The reason is simple! This project had a custom (map) editor from the start, and it eventually just cannibalized the “game” portion to become the leading project. In these next two posts, we can see it happen as I focus almost almost entirely on expanding the editor with new features:
- First, I declare a whole bunch of new features I want
- Then, I write a recursive (!!!!!) flood-fill algorithm
Kids, don’t write recursive flood-fill algorithms. Remember: if it’s recursive, it can be iterative instead! And the latter is unlikely to give you a stack overflow. Oh yeah, as a side-note: If you’re wondering what the reference to not having hair in the first post was, at the time I was just straight-up bald. Wild.
These days I’m rocking the BIG HAIR lifestyle, with a curly mess that reaches halfway down my back. But enough about that, let’s see what happens to Halberd next!
AND THEN NOTHING HAPPENED FOR 3 YEARS
Well, sort of. We have one more September post containing the reason the project died:
“Lua … doesn’t seem particularly friendly when it comes to OO programming”
“…I’m planning on switching from Love and Lua to SDL and C++.”
I have no words to properly express the depths of my disappointment in myself. Not only is this a terrible reason to decide to rewrite an entire project on a new tech stack, IT’S NOT EVEN TRUE! Lua can absolutely do most of what OO does. There’s tons of OO frameworks for Lua! Not that I use any of them, because OO is completely unneeded for gamedev and the most typical modern design pattern, ECS, has basically no relation to it whatsoever.
And hey, just between the two of us I’ll let you in on a secret: C++ is bad for videogames. Like, exceptionally so. This may come as a shock given that it’s the industry standard, but as a AAA programmer I can say that the C++ you’re thinking of and the C++ we use are remarkably different. Between rewritten standard libraries, unity files, extensive code generation, in-house reflection systems, sometimes even custom ABI-compatible languages… it really may as well be a whole new language. And in many cases, standard features of the language like templates are considered bad practice due to their build-time perf implications. It’s an absolute mess. Just because something is “industry standard” does not make it the right tool for every job.
This post was basically the beginning of the Problems that I’d be tangled in for many years to come. It really wasn’t until late 2020 that I’d fully recover from the “Build your own tech stack in a low-level language” affliction.
Rant aside, this was essentially the death of the project. I’d occasionally write some notes in the coming months (as per the usual refrain: More on that in a future post), but aside from a couple of name-drops the game I had in mind would never resurface.
In July 2015 (Note: We are now in senior year of college. That’s how much time I lost), I posted a timeline. This covered most of the projects of the past, and outlined a (doomed) plan to bring back several projects. Given that it’s only tangentially related to Halberd, I’m leaving that post’s resurrection for another day. But for now, all you need to know is that I decided to finally make that RPG I wanted.
2 months later, I finally posted an update on that! This is a pretty dry and technical update that mainly describes an animation system I’d hold onto for years to come. One interesting note is that 2015 Hugues acknowledges the open-world aspects of the previous attempt’s map system. At the time, I still had this idea to make an absolutely huge open-world map as part of the game. In retrospect it was probably a bad idea, but I think the intent was to use it as a defining feature.
Roughly a week later, I would post another update with the completion of that map streaming feature:
One thing that I’m noticing in this era of Halberd is that I’m focusing a lot on tech and features, while any mention of an actual game is missing. The graphics are even more placeholder-y than before, and things really feel like the bare minimum needed to verify the tech. It’s interesting to see this change in approach while looking back.
After this partial re-implementation of the game came 3 months of radio silence, followed by a genuinely interesting update. I find it interesting not just because of the content, but because of what it represents. With the addition of features like project management, this is roughly the moment that Halberd diverged fully from being a game and we begin to see what would eventually become Halberd Studio. As we will also see, this was a very bad idea.
Regardless of that ominous note, let’s move right along. Development on Halberd was pretty steady, and in February of 2016 I posted an update with a whole ton of improvements to the editor… and still nothing playable after more than 6 months. There are some genuinely neat things that I added to Halberd around this point, particularly an asset manager with support for resolving broken links. In a way, you could call it “foreshadowing” to my current career as a Tools Programmer. I also mention in this part that I’ve been advancing the development of DFGame using pieces of Halberd’s codebase. This is around the point that DFGame first began to emerge, but that’s a topic large enough for its own retrospective post.
Beyond a handful of mentions though, this is the last we’ll see of Halberd for years to come. If I had to guess, both schoolwork and DFGame itself conspired to kill this iteration. Then again we may also be able to blame utter lack of actual playability, this iteration was a giant stack of tools and tech with no purpose.
Speaking of giant stacks of tools and tech with no purpose, let’s skip riiiight on ahead to March 2018. I’m now out of college entirely, and working professionally in gamedev… and I still haven’t learned my lesson, so here we go again!
How Is This Still Happening???
Look, I never said I was smart. And to prove that, let’s just take a gander at that post again:
“One thing that I want to do with this new attempt at Halberd is an increase to the project’s scope.”
More seriously, we can see a continuation of my 2015 mindset: At this point, the idea of making an RPG with this RPG engine is just an extra sentence tacked on at the end of my goals rather than the fucking point of the project. And spoiler alert: This will spell the project’s undoing in the end. One slight point of improvement is a dedication to trying to assemble the project in smaller passes, starting with an MVP. However, as we’ll soon see this doesn’t last.
With that said, this was the subject of the blog for a pretty long time! For ~14 months, this blog was almost all Halberd-related content. Given the sheer volume of written content, I’m going to skim a bit.
Part 1: MVP?
But then, a question appeared–what is an MVP here? Is this enough? It can make a game where the player can walk around and get into fights, but you can’t exactly build much of an RPG out of it. And this is the exact problem I tried to tackle with… a cop out. I basically defined two tiers of “MVP”: One with the bare minimum to build anything resembling an RPG, and another with more stuff attached. I can’t really blame myself though, figuring out how to balance “minimum” and “viable” with such a massive scope is difficult.
Part 2: Henry
Now in July, 4 months after the start of the project, I decided to finally put the engine to the test. I would make a very simple game, a playable vignette of sorts with 10min of actual gameplay.
This didn’t really go well, and I think it was partly because of the blog itself. I decided to try and talk about every part of the process, sometimes spending hours documenting decisions that would’ve taken minutes or seconds in real-time:     
This wasn’t lost on me, and I decided to stop writing about the game entirely in favor of buckling back down on the engine. I promised to continue work on the game, but I don’t think I made much progress after that. I mentioned a tiny bit of progress in October, but then officially killed the game two weeks later.
I don’t think the blogging was the only issue though. RPGs usually exist as either a storytelling medium, a tactical challenge, or both. And ultimately, telling a half-assed “story” with gameplay deep as a drop of water to prove an engine’s viability is… not fun? Yeah, not fun. If you’re not being payed to do it, it’s hard to really justify the investment.
Part 3: The Third Part
All of this game-dropping also happened around the time that I rebranded “Halberd” as “Halberd Studio”. In some ways, you can think of it as this take’s final nail in the video-game coffin–the moment that I decided to fully divorce the project from gamedev and just make a tool. Just a month later, I mention that the “roadmap” I’d made for the project wasn’t getting updates and that I was keeping ongoing code private, probably a sign that my momentum was slowing down.
With that said, things didn’t stop right away. In a rather informative blog post I explained the concept of the “property grid”, and the process of building one for Halberd.
As 2019 rolled around, this attempt clearly became the longest-running one. At the same time though, I noted slow development speeds as a big sticking points. At the time I blamed priorities, but I suspect I was starting to get demotivated and wanted to put time into other things. Finally, in March and April I finally assembled the tech needed to…talk to static NPCs. If you scroll back to the top of this post, you might note that this was already possible two months into my very first attempt! I think this does a good job of highlighting just how much slower it is to make an engine than a game–with half a decade more experience, it was taking roughly 4-5x longer to accomplish the same tasks.
It all came to a head in May, 14 months after my first announcement. Realising many of the mistakes that I’ve discussed here today, I killed the project saying:
“As for those games I wanted to make? I’ll make them. I don’t need a complete GUI-driven game engine to make games … If I succeed in my projects, I’ll obviously also have a viable RPG engine at the end.”
I recommend reading that above post, especially if you’re an indie dev making their dream engine. Maybe this doesn’t apply to you, but I wouldn’t be so sure–I had many moments in the past saying “These people failed, but surely I will do better because <insert loose justification here>”.
Just keep my story in mind.
Ok, I think it’s time to drop the pretense. I’ve put out a few hints in the past weeks, so let me make it official: That game from 10 years ago did not entirely die, the notes remained and over the years they evolved. Even with these engine projects taking over, I still intended to make the game someday. And today, I’m following through with Love2D.
In many ways, we’ve come full-circle. But I’ve learned a lot about code, project management, and JRPGs. I’ve expanded my view of the genre, spent a lot of time thinking and planning, not to mention learning what not to do! I think it’s time to discuss things publicly, and maybe start diving into my notes and some of the secret revisions this idea went through.
Unfortunately for you, I’m way too tired to do that today. This chronicle was a trial and a half to produce and my fingers are tired. Until next time!