Rexcellent Games - Egor Dorichev makes games and writes about that

Rexcellent Games

Egor Dorichev makes games and writes about that

Burning Knight is out!

Hey!
It has been a while, huh?

Umm, did I say something about writing more in the new year resolution? Wel… I think we both see how this turned out, oops. But yes, I’ve been extremely busy with Burning Knight, my indie game (that is out now, please buy a copy!)

So, I usually don’t go into many details on the development on social media, especially recently, but this is what this blog is for, even if no one is reading, this is like a time capsule to my future self. But if you are reading this, well, I’m glad I’m not shouting into the void.

Progress in early 2020

As of writing this on June the 5th 2020, I can not recall any major development breakthroughs that happened in January…

Screenshot from 2020-06-05 18-17-46

Looking at the commit logs (a huge bonus of using git), I see that I’ve pretty much worked only for 1 week, the rest of the month I’ve been suffering from a really bad burn out. It’s extremely weird to me because usually, January is my most productive month. I’ve been slowly working on new NPCs, achievement systems, and adding new Grandma/DM items.

But the development in this year really took off in the middle of February. I’ve finally recovered from the burnout and felt a tiny drop of motivation. I’ve fully implemented the Frozen Ruins area, which has a really fancy mechanic of breaking snow walls.

In March I’ve started trying to wrap up my feature list. Of course, looking back at it now, I probably should’ve done that much more aggressively, but well, that already happened. I’ve implemented leaderboards, overhauled the death screen, added run statistics, daily runs. I had a lot of fun implementing these, especially leaderboards for some reason. The game didn’t have a scoring system before, so I had to invent a way to score player actions, and surprisingly, that was the hardest part. Steam API worked buttery smooth, and I’m so glad I’ve implemented those leaderboards, it’s really fun to watch them evolve.

Screenshot from 2020-06-05 18-27-50

Right now I’m on a pathetic 8th place, but I promise, that I will fix that!
I’ve also reworked the hub (yet again), and added a really nice display for your top 3 runs.

While working on the hub, COVID popped up, and it’s still raging in Russia as of writing this.

In April I’ve added a ton of achievements, new items, and started working on the translations.

Screenshot from 2020-06-05 18-31-51

I’m skipping over a ton of stuff, but most of it is pretty boring and unremarkable, half of my commit logs for this project are bugfixes… Yes, I was aware that bugs would pop up, but not this many…
It’s just hard for me to even describe it. Basically, after every single playtest, showcase, or whatever I always ended up with a huge huge list of little tweaks, fixes, and such. Probably no one notices most of these, but that’s where most of my time went.

And finally, we get to May (+ a few days of super intense June).

I always hated implementing bosses. It’s such a hard thing to get right, and I never liked bosses in games anyway, but there are things that you just gotta do. I’ve been postponing the two final bosses of the game for a few months, but I’ve finally found the forces and finished them. And the game became done, all of a sudden?

Or so I thought. At this point, I’ve sent the game build to be reviewed by Valve and started polishing up some sharp corners here and there. 6 really scary days later, I’ve received a GO for launch from the Steam team. Or so I thought. We’ve decided to release on June the 5th, that gave me 11 days worth of marketing/development margin, but woah this time went by so fast! It’s probably been the most intense 11 days of the whole development, I’ve even implemented a twitch integration in that time (:

So here I am, sitting with my laptop, typing this blog post. Just 1 hour before I press that green button and the game either goes crazy or flops. For the past week, I’ve been both insanely stressed out and calm, I guess I’m just so tired that I can’t really stress. But as the timer ticks closer and closer, I’m getting really nervous and excited.

But we will see how it goes really soon. I did my best. Looking back at the development, it’s been a really hard journey, yet I’ve still learned so much. It’s crazy for me to think right now, that before starting the project I had no clue about how shaders work or how to draw nicely. So, I have really mixed feelings about the project. I’m really glad to finally wrap it up, even tho I really suspect, that I won’t be able to relax at least for another month, bugs will hunt me.

But till then, stay calm, get a copy of the game, and I will see ya later!

2019: the year of C#

Oh wow, it’s 31st already? Maaan, time flies by like crazy. So I guess, I don’t really have any more time to procrastinate this article, huh? Let’se’go then!

A look back

Last year I’ve said I will do a bunch of stuff:

  • Care about making my code clean. I will spend each Friday refactoring it up. Well, I did do a huge refractor of the whole Burning Knight codebase, so I guess I didn’t fail completely. I really advanced this year in programming patterns, especially in ECS’s. I’m really happy with how C# brach of Burning Knight is looking. But I didn’t spend every Friday, nope :/

  • Try out monogame with next big project. Well… Yep, Burning Knight is now monogame based xD

  • Finish Burning Knight. Man, I wish.

  • Write. 12 articles in 12 months. Not bad, but could be better. It’s really hard to motivate myself and write, when the analytics show almost 0 interest in my writing…

  • Open source more things. Burning Knight ate all my time, tbh.

  • Making a PICO-8 cart a week. I’ve made a bunch of carts at first, but then I just got busy and just forgot about it at some point :/

  • Make Voxatron carts. Nope.

Yeah, things did not go according to the plan, but I’m fine with that. From my experience, my plans always evolve, and not always for the worse.

But you know, I’m really happy, how the year turned out overall. The hugest thing for me was learning a new language – C#. I was under the illusion of it being just a Java clone for so long… How happy I am, that I’m now Java-free!

I’ve made 4 tiny games this year. I’m starting to miss being able to work on stuff, that I want, without having a long-time commitment to one project… I’m so jealous to get the Burning Knight done, but at the same time, each time I open my IDE, I just want to add more and more details, content and easter eggs. Yeah…

I’ve also made a website for the game (duh, I’m so not happy with it), and another one for a project, I got involved somehow. I also redesigned this site from being white and blue into black and red, but I’m still not happy with it… Man, webdev is not my thing for sure.

Next year

  • I will spend less time in social apps. Reddit and twitter became really hard resist, so I’ve deleted them a few days ago from my phone. Feeling much better now. Tho, I have to admit, both desktop site versions are so much worse 😮

  • I will write a word a day. I want to try. Just a single word. Maybe random, maybe not. And I want to see, where it goes through the year.

  • No jams, besides ldjam. I love jams. But they are exhausting. And time-consuming. So how I’ve said no to them in 2019, I’m saying no to jams in 2020. Except for the ldjam. Its only 2 times a year now (sob).

I just want to let you know, that Burning Knight development (wew, I’ve mentioned the game name like 20 times now??) is going really fast, the game is evolving like crazy. Just on the past week, I’ve introduced a lot of statues, scourges, NPC’s and more! I’m not sure, when I will force myself into writing the next devlog, but that should happen somewhere soonish.

So yeah. As of writing this, I still have 7 hours left of 2019, so I will go and try to finish it well 🙂

Egor.

Showcasing Burning Knight for the first time

Hi, Egor here.

So a few months ago, I got invited to a game conference in Moscow, called White Nights. I’ve never been to a gamecon before, so I got really excited and started preparing my game, Burning Knight, for the showcase section. At first, 1.5 months looked like a huge time frame to get the game ready, but it flew by so fast…

Preparation

When I develop games, I tend to focus on the gameplay aspect more, than on menus and other UI. I knew BK interface was pretty rough, so it was of the biggest things I had to focus on.

The game also had almost no SFX, and since I don’t have a sound designer, I’ve bought Zoom h1n recorder, and spend a few days just running around my house and pocking everything, that I saw. It was a lot of fun, but editing the recordings, adjusting them and picking the right ones takes a lot of time, so I simply picked the most important ones and left the rest of the work for later.

Side note: Github Actions

I’m not sure, how I’ve managed to ignore CI’s for so long. A few months ago, Github rolled out their new CI: Actions, and I’ve signed up for the beta… and did nothing. Until a friend of mine saw me building the game by hand, and helped me to setup Github to build the game for me. It wasn’t easy, debugging Windows scripts on a virtual VM, that gets reset every time, is not easy, especially if you are a Linux user… But I’ve managed to get it done.

I can’t imagine making games without CI anymore. Being able just to merge your commits into the release branch and then press a single button in Steam to publish a new game update… It’s a feeling, that I can’t describe. I really recommend you taking at least a glance at the world of CI.

Playtesting

After I rewrote the game in C#, I didn’t do any playtests what so ever, because I never felt, that the build "was ready enough". But I have to say, having a deadline helped me a lot, but I only managed to finish a playable build 3 days before I had to go. I wish I started collecting feedback on the build earlier…

So anyway, first playtesting round went really well, but it was just my friends playing the game, and not real players destroying testing it. They liked the game a lot, found a few minor bugs, but that’s about it. So I’ve quickly patched the bugs, and the fun of real playtesting begun on the next day…

I’ve dropped the build at my Discord server. It isn’t big, even tho, it’s more than 1.5 years old at this point, but it was just enough, to totally destroy the game. Every tiny glitch, that I thought no one would notice, was reported. So many exploits were found. And they also went data mining into the game assets folder… But it was a lot of fun, both for them and for me. And I also had a huge list of things to fix and change, and I had just 1 day left to do it.

Playtest your games early.

It’s time to go

Late in the evening, I was coding something, and then I’ve noticed, that my laptop’s power supply died. Just a few hours before my train to Moscow. And that was the only laptop I had. And I still had to go and pick up the posters and business cards I’ve ordered. All shops, that I found online, closed by that point, and I had no replacement. Thankfully, I found a matching power supply in my house, that had a slightly different plug. So I combined both wires with some soldering, and it started working again.

I had just enough time to pick up my business cards and leave.

The Conference

As I’ve said, it was my first ever gamecon, so I was excited, when I saw all the game booths and the huge hall, that it was all inside. I have to admit, sitting in one spot for 2 days is pretty boring, so I’ve spent most of my time away from my stand.


Burning Knight booth

The conference was mostly about mobile games and all the business around them, but there were plenty of PC games too.

Sadly, not so many gamers were around. And overall, I got max 20 people to play the game in 2 days, and that was pretty disappointing. But. Big but here. Almost everyone, who came and played the game, stayed around for a few hours, and I’ve gathered yet another huge list of bugs, changes and ideas. The game proved to be a bit hard for the most players, but taking that it was a mostly mobile conference, I did not worry about that too much.

My favorite thing to do was to pretend I’m not the developer, by standing somewhere nearby, wait till someone came to play, and then watch the reaction 😀

What’s next

The feedback received doing the conference motivated me to do a lot more playtesting, and with the new CI system, it’s so easy, since I use git anyway. So if you, by any chance, want to help me with testing the game, hop onto my Discord server 🙂

Since the conference, I’ve showcased the game in a bunch of other smaller events, and this cycle of constantly fixing/adding stuff and then seeing, how the feedback changes feels really good. And it’s great for the game.

Start to playtest your game as soon as you can. It really helps.
Egor.

Steam killed my traffic

Rip my traffic

Hi. I’m a fellow indie developer, who tries to put a word about his game out into the world. And before this September, Steam was by far the most influential platform for me. It allowed me to show my game to thousands of players…

But now it’s over. Steam killed my traffic.

Continue reading →

Burning Knight: the roadmap (part 2)

Hey guys, Egor here.

Remember that post from December 2018, where I talked about development plans for Burning Knight? Well, I was right about one thing for sure: the development did not go according to the plan… So let’s talk about this.

Continue reading →

Procgen in Burning Knight

Roguelikes are defined by two key things: perma death and procgen. Permadeath is super simple to implement, but that’s not the case with procgen. There are thousands of ways, how you can implement it, and today we are going to look underhood of the Burning Knight engine (it’s called Lens, btw), and see what type of monsters live there.

Popular methods of generating a dungeon layout

Cellular automate

Cellular automate based dungeon
Source was not found, but the gif is too good

Cellular automate algorithms allow you to generate cave-like worlds with really little code.
You create a grid of "cells" (that are usually just booleans, because they have can be only dead or alive), and randomize it.
Then you do a few passes over the whole grid, applying some simple rules over it. In most cases, its all about calculating how many alive neighbor cells does a cell have, and deciding based on that should it live or die.

To be or not to be…

If you want to learn more about this method, I recommend reading this article.

Continue reading →

Guide on minifying tweetcarts

So I’ve been randomly making tweetcarts for the past 2 years, and I’ve been always obsessed with how much cool stuff people can fit into a single tweet! I see a lot of guys out there who try to start with tweetcarts but struggle with fitting their doodles into such a tiny size margin.

So here is a guide on how to do it, and a few tricks that I use myself.

But what is tweetcart?

In case you didn’t see this magic yet: tweet carts are PICO-8 doodles, that fit into a single tweet. That means that each of those masterpieces is not longer than 280 chars (bytes).

Tweetjam first started in 2016 on the PICO-8 forums, but quickly moved over to tweetjam hashtag on twitter.

If you’ve stuck with twitter for long enough, you remember, that tweet limitation on twitter was not always 280 chars. It all started out with just 140! So if you check out the early tweetcarts, they all are just a half of the modern ones, compared by the size!

Continue reading →

My experience with Dear ImGui and thoughts about boring UI

What is ImGui?

ImGui is yet another a small C++ UI library.
What makes it different from most other UI libraries, tho, is the way you define
widgets with it. Let’s take a look at a basic example: I want a button, that logs something
to console when pressed. Usual UI libraries would request you to do something like this:

static UiButton* button;

void initGame() {
    button = Ui::getContext()->createButton("Click me!");
    button.sayOnClick("Thanks <3");
}

void updateGame(float dt) {
    button.update(dt);
}

void renderGame() {
    button.render();
}

And here is the ImGui variant:

void renderGame() {
    if (ImGui::Button("Click me!")) {
        std::cout << "Thanks <3\n";
    }
}

Live demo, might take some time to load

I think you see, why this is so handy for prototyping UI really fast. And the API obviously doesn’t end
with buttons. ImGui features context menus, windows, sliders, text inputs, tags, and much more
than you can probably think of. And that all still in this simple form, bloat free (without having to store anything anywhere).

Really neat!

Continue reading →

Burning Knight is now on Steam: Wishlist!

Yay! This was a long-waited moment, but it finally happened! Burning Knight Steam page just went live (please wishlist!)!

Also, hey, I wasn’t sitting without a task for the last month, so here is a short list of things I’ve done, that are somewhat exciting:

  • Breakable things!
  • Breakable walls!
  • Paintings (they are also breakable)!
  • New enemies!
  • Awesome level editor!
  • Items are now defined in json!
  • New procgen algs!
  • Movement tech!
  • New shadows
  • New website! (https://burningknight.net/)
  • Teasers!

Trust me, there are so many not exciting things, that I had to cut from this list, just because… Well, they or wherein java edition, or just too boring.

So let’s dive into it, and have a closer look at all that cool stuff!

Continue reading →

Porting 60k line Java code base to C#, or a story about mistakes of the past

Preface

Somewhere in the drafts of this blog, I have an article, that explains all the flaws of Java 8 (and a bunch of other languages). It probably will never be released, cause it’s just a pile of boring (and sad) facts, but I will list some of them, to explain my actions, that I did.
So, Java:

  • Has really old syntax, compared, to C# or any other more modern language.
  • Packing an app requires or packing extra 100mb JVM, or having users to install JVM For example, Steam doesn’t ship JVM with it, and just overall packing .exe on Linux is a big pain.
  • "Write once, run anywhere" is a lie Java won’t run on consoles, such as Nintendo Switch.

Might be enough already, but there is also the framework, that BurningKnight Java Edition works on – LibGDX. Overall, it’s a great library, but:

  • What’s up with gamepad support? Hotplug works only with LWJGL3, but that crashes on MacOS, gamepad remappings for millions of existing gamepads? No, you gotta figure them all out yourself.
  • Audio API is super limited Might seem minor, but all the juice, that comes from lowpass filter, writing notes to audio source on fly, and other, is just impossible.

So yeah. It’s all was piling on me for over a year now, and I’ve been dreaming of porting the whole game to C# for a while now. Burning Knight git repo has csharp branch, that is 7 months, but it didn’t really go far beyond rendering an animation of a mummy.
I’ve knew it was a huge project to port, and I was scared of it.

Continue reading →