Developer of Empires of Eradia: Cataclysm of Chaos.
Palandus was kind enough to speak with me about his work on TCOD and the customizations he had to make to support his requirements. His project has been in development since 2018 and I'm incredibly grateful for his input. We share a lot of the same influences: I'm thrilled to run into another Alpha Centauri fan in the wild! I also cut my teeth on AutoIt! I don't want to editorialize too much, but it's very validating to see other devs turn similar humble beginnings into hours of satisfying playtime.
Inspired by Jason's work? Consider sharing your own with EngJam, August 19th 2023 through September 3rd 2023: https://itch.io/jam/engjam
RogueBasin says about EOECOC:
Empires of Eradia: The Cataclysm of Chaos, offers many unique twists on the classic roguelike formula. Instead of the typical dungeon layout with rooms and hallways, combat takes place in large open battlefields against multiple foes at once. Treasure, secrets and portals are scattered all over the map, and your vision is not blocked by solid walls but thick fog clouds you can pass through.. but not without risk! The game also offers a unique permadeath system, crafting and multiple disciplines to master.
EOECOC is a traditional roguelike, with an ASCII interface:
You can find Palandus and EOECOC online at:
What follows is Jason's own responses to my questions (the headings). I've edited lightly for formatting and organization.
Modifications to TCOD used in EOECOC
- Resolution switching at runtime. I'd like to have a better solution for this eventually, but, it was locked to whatever size of font file was loaded. I had to figure out an ingenious way to kill the console, and load a new font file, to allow resolution switching at runtime.
- Single Input Taking. So the main way my version of TCOD does input checking for Mouse and Keyboard, the documentation says it takes the input once and clears it. There was a bug with my version, that took the input twice then cleared it. I had to come up with a very duct-tape solution to clear the first input, so that only the second input was registered. Took me over a year to figure that one out. So as an example, you have two menus layered upon themselves in like a character selection. Say choosing race and class. If you selected option B in race, it would select option B in class, if you didn't clear the inputs.
- Cursor highlighting. TCOD had no feature for this, but in a 2D roguelike, you need to know what is under the mouse and the mouse cursor isn't always the best for that. So I had to figure out a way to highlight underneath the cursor and then on the next rendering of the console to clear it. But this had lots of problems, such as that any time you'd take the mouse to the areas outside of FOV it would leave ghost images. So it took me a while to have the cursor highlighting and eliminate the ghost images.
- FOV Gradient. I've always liked that in modern games that you could have torchlight that faded out to the limits of your vision. The FOV calculation in TCOD only allows for determining if a tile is lit or not. Creating a systerm wherein I would be allowed to change the color of the floor, based on distance from the player without taking half a second each frame to calculate, took me a fair amount of work.
Engine Features showcased in EOECOC v54
- Cursor highlighting in menus. You'd think that if I could get it to work in the gameplay that it would be easy to get it to work in menus... Wrong. I had to fully redesign how I did menus to get it to work. The menu code that came with the python tutorial for TCOD at the time, wasn't cutting it anymore, and I had to create a brand new menu generation and manipulation system, and now can create beautifully intricate menus (with a border) all properly aligned, with cursor highlighting in menus now.
- Metric bars in menus. Again, easy to implement on the main UI, really painful to implement in menus.
- Menu System types. So I've spent a lot of time improving my interfaces in V54, and a big thing is the creation of menu systems. Each one has a different way of manipulating the users input to create an a specific output, or take them to a specific new menu system. My systems are Directory, Distributor, Hub, Entry, and Singular. The user doesn't understand the complex nature of these systems, but it really makes creating new menus a lot easier for me.
The reality of game development is that if your engine/library lacks something you need, you gotta put it in yourself or find a library or addon that will do it for you.
How did you get into programming and game development? What games inspired you?
- I've dabbled with mod creation for decades, with the first game I created small mods for being Alpha Centauri. The games I made the biggest mods were for Space Pirates and Zombies 1, Skyrim (original), and Majesty Gold HD.
- In high school, I learned a smattering of Visual Basic, HTML, and AutoIt (an automation based language that performs tasks for the user automatically without need for their input).
- I tried to get into programming in my early College career, but found the rigid deadlines of class work too difficult to learn programming quickly enough.
- I first got into game development by trying to build a game in UE4 v8 (2015), but that ended in disaster when my data got corrupted and lost the entire project. Since then, being doing backups.
- Then started working on a simpler project (2016-2017) (well simpler than a UE4 title at least), in Quest. It was a text-adventure roguelike dungeon crawler, and tried to get into GOG Game Development Program, and although they liked it a lot, they didn't think it would sell without graphics or sounds. So, I canned work on that project, as I was trying to create a commercial product.
- Then I recreated the game in many aspects into an ASCII roguelike starting in (2018-Present). I tried once again to get into GOG's Game Development Program and failed, and haven't tried since. I might give it another go once the game is more polished, but probably won't bother. The point of the program is for GOG to teach the developer all the things to do with social media, promotion, advertising, etc... but I've had to learn most of that if not all, by myself, so not sure the point of the program at this point.
- As for games that inspired me, its a long list. I've taken inspiration from other non-roguelike games to create features for it, that aren't commonly seen. Like I was playing Doom 2016 and liked the auto-pickup, so I created an auto-pickup system in my game. If you want all the games on my inspiration list, I'll provide it.
Oh yeah, here is a link to my text adventure. It is playable in browser, and has 3-5 hours of content. Its a decent game that I put quite a bit of time and effort into, if you wanted to see my previous work. Link = http://textadventures.co.uk/games/view/rvnjlvi4heq6u7-namkaxa/the-cataclysm-of-chaos-v9
What led up to your most recent project?
- 2015 = Failed UE4 project
- 2017 = Cancelled Text Adventure
- 2018 = Started work on Cataclysm of Chaos (yes my roguelike was originally named after the text adventure)
- 2019 = Renamed it to Empires of Eradia: The Cataclysm of Chaos (this was due to feedback that it sounded too similar to Cataclysm Dark Days Ahead).
- 2020 = Heavily reworked a lot of the story, mechanics, and created the turnscript system. Thus the 2020 version is basically a different game from the 2018 start.
- 2022 = Started a major rebuild of the entire game, so that it addresses a lot of the story, mechanics, and performance of the 2020 version. Ongoing.
- I've also continued to do modding, and have released mods or took on an abandoned mod and added to it. In 2020 I took on an abandoned mod for Legend of Grimrock 2. In 2021, I released the only functional mod for Subterrain. And early this year I released a mod for Void Bastards.
Any fond memories on languages or systems from the past? Anything you were glad to see go out of style, or are there any features or core lessons missing from modern development tools?
- Fond languages = I did like learning HTML but it was too hard to create even the most basic webpages with it. I liked Shockwave Flash, but never was a great artist. I remember how a lot of early 90s games were made in C (like Quake 1), but C isn't the easy to work with.
- Fond systems = I enjoyed the Sega Genesis, even though we only ever had side scrollers. I had an Atari for a short period and remember playing Adventure on it, but not much else. I remember how technology soared in leaps in bounds from our 486 to our Pentium 1, P2, and P4. I really liked Windows 3.1 and 95; those were spartan in terms of features but just plain worked without a huge RAM footprint.
- Glad to see go out of style = The massive number of graphic card companies and imcompatibility with games... like before Nvidia and Radeon, there was like 6-7 different care manufacturers and it caused so much grief. No mouse look in games; ie Duke 3D originally had no mouse look so you had to use PGUP and PGDN to look up/down. FPSes that ran at 15 FPS or less (probably a hardware issue with my old computers and demanding games). Netscape Navigator. Dial-up modem. VHS tapes. Floppy Disks.
Do you still play games "just for fun"? Is developing the same kind of fun as playing?
- I don't know what "just for fun" means.
- I play games to de-stress, to mine ideas for my current title or future titles, to provide feedback for developers, to achieve ingame goals, and to experience something new. I don't know if I am ever having fun though. What is fun in the context of a video game? I really can't say.
- Developing is certainly not fun. Its addicting, its complex, its enriching, it allows me to take idea and make them manifest. But fun? No. Draining and exhausting and fulfilling sure, but not fun.
- Playing my own game may approach being fun, but it often involves me still observing my observations, looking for bugs, and looking at weak areas to rebalance things.
- I like to play other indie games, to provide feedback to them. I know what its like to go for months without feedback, so I like to pay it forward as often as I am able to and give other indies that critical feedback. Its why I like Steam Next Fests, as it gives me ample opportunity to do so.
What's still fun or most inspiring to you?
- With my excessive stress levels, I find it difficult to enjoy life or be inspired. Some mornings I don't even care to wake up.
- Fun = Playing with my Niece (6) and Nephew (4). Successfully completing a game build or new mod. Reaching the pinnacle in a game and utterly dominating. I dunno, I have a hard time defining fun.
- Inspiring = John Carmack and Bob Ross. Otherwise I don't know how to answer the question, as I'm inspired by things or people in a transient manner, being inspired for say a few months and then losing interest and moving on to the next thing or person. I don't know why I'm the way I am.
What's a classic game (whatever you decide that means) that still gets you pumped up?
- Card Game = Star Realms or Crazy Eight or Gin Rummy.
- Board Game = Stratego or Monopoly or Chess.
- D&D 3.0 Edition.
- 90s Game = Doom (generally with GZDoom), Alpha Centauri, and Majesty: The Fantasy Kingdom Sim
- 2000s Game = Halo 1, Supreme Commander 1, and Elder Scrolls: Oblivion.
- 2010s Game = Diablo 3, 7 Days to Die, and Dragons Dogma.
Other things you would want to share?
- Plan to eventually have a GitHub and an Itch.io, around V54 release window.
- Plan to sell the game eventually, but only when the game hits at least Early Beta (currently Late Alpha)
- Plan to eventually do cross compilation to Linux and Mac.
May people message you for help or feedback?
- Certainly. I've received emails, PMs, and conversation in Discord in the past, and always like interacting with newcomers, be it chatting, bug reports, or suggestions or even just words of encouragement. Wish I didn't run into as many internet trolls though. They are draining.
Do you have any tips on persistence and overcoming problems? Do you code on a schedule? Do solutions come to you in the shower or while dreaming?
- Tips for persistence = Have an end goal in mind. Since I wanted to commercialize it, any major problem I eventually work out because the end goal is money and hopefully the livelihood to create games for a living. If you have no end goal in mind, such as its a throwaway project (which I've had several small throwaway side projects), the first major problem will stall development.
- Tips for overcoming problems = Playing other peoples games gives me insight into ways to solve my problems. Putting it aside and coming back to it after sleeping for 8+ hrs. Brainstorming possible reasons things are happening (ie for an annoying bug that you can't quickly solve). Using debug messages (for Python that is print) at specific places in the codebase to help you find slowdown or infinite loops to narrow down where the problem is occurring. Sometimes just working on other aspects of game development for a few months until you come up with something ingenious (most of my major accomplishments were a result of this).
- I do not code on a schedule. I might bughunt on a schedule before a release, but otherwise no. Most of my coding is often doing something new, so there is always a ton of designing that needs to be done first and that just takes time. Trying to force myself to code at a specific time doesn't work for me... probably why classwork programming never clicked. I don't have the discipline to force myself to code, but once I've hit a groove, I can code for 8+hrs in one go without breaks.
- Most solutions come to me after sleeping for a while. Some of my most innovative ideas came to me when I was severely sleep deprived, caused by being viciously violently ill, and thus unable to sleep for 24 hours, and in my totally warped, sleep exhausted brain, I come up with interesting ways to address longstanding problems. Like most recently how to make the Runestone better, with a fixed map system. Or before that, having window popups instead of a side panel to display information.
- But a lot of solutions come from playtesting other indie games or from playing a new video game, seeing a cool feature, and going, "wow that would totally solve this issue in my game"
How can one decide if they need a custom engine?
Usually its a matter of things like: Is there a tutorial on that custom engine, Is it well documented, Does it have critical/core features you need to make the experience you want to create, Is there available assets that work nicely with that engine, Is it performant for a game that requires good performance, Is it easy to debug (UE is not easy to debug), and do you know how to read/write that language required for it?
Most people will prefer to use things like Godot, Unreal Engine, Cry Engine, Unity, or Gamemaker, to create games, depending on their skills, scope for the game, and such forth. But creating certain types of games, like ASCII roguelikes are extremely hard to do in these engines, so you have to often find a custom engine to do them in... or pay a lot of money to get asset packs and script packs to work together nicely in one of these engines. Not an easy task either.
Do you prefer rushing towards a minimum viable feature, or do you build to support your entire feature list?
- My games are too complex to figure out what I would define as a Minimum Viable Product. Since most systems are critical, to achieving the right experience and gameplay loop, its hard to say which ones would be needed in a MVP... probably all of them, but that usually takes months. And the point of a MVP is to create something in 3 months or less with the bare minimum features to see if its good or not.
- For EOECOC, I was also learning a lot while coding, so from 2018-2022, I made a lot of poor mistakes, which resulted in months-long refactors of the codebase. The current V54, in progress right now in 2023, is more like building to support my feature list and creating a MVP, with an idea of how I want both to look like, in its phased development.
- I'd like to do things differently for future projects, but right now that is what I'm doing.
How do you balance between extensibility and simplicity? How can newbies avoid rework of delicate, inflexible code versus overengineering?
- When I complete EOECOC, I might have an idea on how to answer this question. But as I've been a newbie for a while and had to rework delicate inflexible code or refactor overengineered stuff, I don't have any specific advice here. V54 is meant to achieve flexible, easy to read and work with code, that is properly engineered. However, a lot of stuff still isn't finished yet.
What's your organization system like? Trello, post-it notes, "// TODO" all over the code files, etc...
- Haphazard. I've tried out at least 20 different websites (ie Trello) or programs (Over a period of 6 years) to try to organize things, and the only thing I've found to be effective is an old software called DM Genie meant for D&D 3rd Edition. It has a Campaign Manager that lets me easily organize vast amounts of information, with good labels and easy navigation. I'd prefer to use something else as it has its own share of bugs, but its the best system of organization thus far. I got the DM Genie over a decade ago when I was playing 3.5 Edition. Currently I'm in the process of transfering all my notes from other organizational systems to DM Genie, but its a huge project and balancing that with code development is difficult.
What game engines did you try? What did they have as far as pros & cons?
- For EOECOC, I tried a few different things, before settling on Python and Libtcod.
- I looked at 3-4 custom engines, but they all had several issues. ie they had poor documentation, used a weird programming language (ie D), or weren't commercially sellable, so good for a personal project and nothing else.
- I looked at TOME. It has a custom engine built for it with lots of features, but I found it hard to comprehend, and wasn't commercially viable at the time, so I moved on despite it having really good tiling capabilities.
- I looked at Godot and Unity, but couldn't find anything free to use to start up a roguelike on and wasn't prepared to sink money into asset packs, when I barely understood their programming languages or if the asset pack would be the only thing I needed.
- I wanted to do Python 3 and Libtcod, but at the time in 2018, the tutorial wasn't even started yet, so I went with Python 2 and Libtcod. If there wasn't a tutorial for Libtcod, I wouldn't have gone for it, but it seemed to be the most ideal situation with the features I needed to create the game I wanted to create. The initial game was built into the tutorial and around it. But over time I replaced tutorial code with my own code, and now with V54, there is no trace of the tutorial code left.