Day 1: Revisiting the Past


Well well, it’s 7DRL again! I’ve been looking forward to this for a few weeks. I had a pretty good concept of what I wanted to work on, and then last week, I decided to shelve it and work on something else! Top-tier planning!

Day 0 Preamble

Here’s the primer on what I’m working on and how I came to it.

The Concept

This year, I’m making “Arcanist’s Heritage” (not sure I’ll keep the title). You play as a magician (an arcanist), who has been given a book of secret magical knowledge by a relative who has now passed. The knowledge comes in the form of a forgotten magical language, which you can use to impose your will on the world. Taking the book and your wits, you decide to seek out more knowedge, but there are unseen forces who’d like to stop you.

It’s a top-down traditional roguelike, but I decided to take away melee combat (for the player) and focus on a “modular” spellcasting system. Spells are cast by typing in words of a tiny language I’ve devised, in order to decide things like “What the spell vaguely does”, “what element/school of magic is it” and “what area or target does it affect”. As you travel, you can uncover new words of power to incorporate into your vocabulary.

Expected Challenges

The main one for this year is a serious scope issue. Implementing the entire variety of spell effects could become a multiplicative chore, and there’s not going to be time to implement a huge range of spells. Part of the reason for that is that some spell ideas are only interesting if there’s an environment and mechanics to support them. For example, a spell that grows plants in useful ways is only handy if there are plants to grow; using water to extinguish fire makes sense, unless fire can’t exist in the world, etc.

I spent most of the week hashing out the main design of the game and spell language, using my normal GDD template, but there’s a good chance that there will be further challenges.

This year, I made some arrangements to work with a pixel-artist, to lighten the load on myself in order to focus on the development, and I’m not used to collaborating like this, so we’ll see how productive we are as a team.

Finally, I’m reusing the engine from Acolyte’s Pledge, my 7DRL from last year, which should give me a headstart, but is far from complete.

Day 1 Progress

So with that preamble out of the way, we kicked off. Well, sort of. I actually had to issue an update to my game framework DOME first, as I realised I had some lingering patches and leftover bug fixes from last year to release. After hurriedly releasing that, we began in earnest.

Clearing down the Acolyte’s Pledge code is a bit rough. It’s in a peculiar state because I started to push it towards a “configuration-file” based input for everything, and untangling and removing a lot of unneeded concepts took some time.

I stripped out the pieces I know I won’t use and there’s some leftover parts that might get used later, but it’s basically a new game. Now I can look at my pre-planned list of tasks.

First up was a small task to get my feet wet again: Adding an MP (magic points) stat and gauge to the system. Acolyte’s Pledge didn’t use magic so it only had stats for HP. For the moment, I’m using the same kind of gauge, which I think looks cool. Spells you cast in this game will cost varying amounts of MP depending on what words you use, and it’ll regenerate over “time” (aka, some number of turns).

I had to remind myself of how various game systems fit together to have this up and running, but we were good to go by lunchtime.

Next, we needed something to cast. I really wanted to get the basics of the language interpreter in the game. I started with text entry (you need to be able to type in the words of your spell) and I hit a small roadblock. The existing UI code is not very suited to heavy interactive use. I didn’t want to have to rewrite and re-implement everything to be more appropriate, given the limited timeframe. Fortunately, one of the components I wrote last year was about 90% of the way towards what I wanted, so I seized on the opportunity and just expanded it out to cover what I wanted.

I’ve been going back and forth on UI implementations for a while, and it turns out a little different in every 7DRL I’ve done. Last year and this year, I’m using a “Retained Mode” GUI: The gui is built up as a collection of objects which persist, frame to frame. This means more memory usage because there’s a constant load, but it fits in well with the event-based nature of the game engine.

It took me an hour or two to get the UI hierarchy working well, and I had a little textbox ready for spell input.

The final piece of the puzzle, interpreting a spell. To do that, we needed a lexicon. I’m procedurally generating the words used for each player’s spell language. The language is the same across each of a single players runs (so you, the player, can actually learn it). This means I need to store it somewhere reliably, and then translate those words into an internal game representation for execution.

Figuring out the persistence part wasn’t too bad. The method I’m using for generating words leaves us with about 250 words we could use, and I’d be surprised if we got through even a quarter of them. Nice to have room for expansion.

By the end of the night, I had a tiny language parser which validated that spell phrases are the correct structure and it can pick out details to apply to the spell.

I’d hoped to get the spell cast and affecting the world, but as you can see, things were a bit uphill.

Next Steps

Day 2 is unfortunately a light-work day, I had some pre-existing plans, so I won’t get too much done. If I can squeeze in the fundamental spell effect casting, I’d consider that a win, and everything else a bonus.

I’m planning to livestream my development of this game between Monday and Friday over on my Twitch channel, so make sure to follow me there to get notifications when I go live, if that interests you!

Until next time!

Get Arcanist's Heritage

Download NowName your own price

Comments

Log in with itch.io to leave a comment.

sounds cool! looking forward to reading the rest