Devtober - Post Mortem
Hi everybody, long time no see! At the beginning of October, I started noticing that several tweets on my feed included #Devtober tag inside their posts. My curiosity brought me to a specific itch.io page, basically explaining what it’s all about. Devtober turned out to be a kind of challenge aimed for game developers. After reading the article, I decided to take part in this event. Today’s article is going to cover my progress over Smintheus during the challenge, share my experience with cross-compiling Smintheus on Linux to Windows, provide a quick overview over level design and drop a few miscellaneous words.
So, what is all the fuss with this Devtober? There is a popular challenge on social media called Inktober where painters and other kinds of knights of the brush challenge themselves into drawing doodles every day of October. Devtober is game developer version of Inktober. Developers are expected to dedicate time to their projects every day, regardless of the result. You can draw more details from the challenge right here.
One of the requirements of Devtober is to write a Post Mortem article and publish it at the end of the event, which happens to be today. So, here it is - you are reading it.
My last devlog post was published on 25 of December last year. If it wasn’t for this requirement, I would probably keep forgetting about the development blog. So, there you have it - first virtue of the challenge.
Couple of words for those who are meeting yours truly for the first time. My name is Henrik Chukhran and I’m indie game developer. My current solo project is called Smintheus - upcoming 2D Adventure Puzzle indie game where you craft your way out of dangerous situations through all kinds of gadgets while being hunted by a vicious monster. Game is inspired by 90s PC puzzle games such as The Incredible Machine, Chips’ Challenge and many other similar games.
You can get beta version on itch.io page.
Make sure you follow me on Twitter - it’s my social media number one and I post there almost daily, revealing latest news about Smintheus as well as retweeting cool tweets of projects made by others and sometimes post silly things for fun.
Recently, I opened facebook page specifically for this game, although it clearly wants money for marketing the page because right now there are literally zero likes despite all my marketing efforts and it’s been like this for whole month. Some replies in marketing topics in reddit are telling that facebook, twitter and instagram are better for keeping existing audience, gathered around steam and other game distribution platforms. Getting your audience out of the blue seems like impossible task. Damn... marketing and gamedev are never going to be best friends.
Anyway, I posted (and keep posting) there all the progress animations from very beginning of Smintheus’s development. Check it out!
I’ve been working on the project for more than 4 years. Currently, game is on last long lap and is about to be released soon. Majority of work is done, only levels are left to be made and write more tracks for the game’s soundtrack. Levels generate play time and I want this playtime to be of best quality. Getting the right quality takes a lot of time and energy, but hey, because of that, I’m totally happy of what I have achieved.
I discovered Devtober challenge on 4 of October but really started doing some devtobery stuff on 7 of October. Funny thing, I dedicated every day to game development during September and Devtober turned out to be a good reason to keep doing in a same pace despite being already tired from that self-appointed marathon.
Every day I tried to fit into minimal 5 hour work day. Some days were extended into 10 hour day, mainly when only programming was involved. Whenever creative things appear in todo list, like drawing or designing game elements, I’m unable to sit more than 5-6 hours. Creativity is all about making up things, mostly out of nowhere (Duh!) and programming is tied with problem solving and figuring out solutions. Especially now, when hard and clever puzzles are needed to be designed. Plus, traditionally it wants inspiration to be present and it’s often difficult to keep it at one place. Finally, the tiredness comes in a huge chunks after session of intensive “creation”.
I know there are devs that work in average for 12 hours and even more, but I already had that period during my first two years of development - it’s no fruitful to follow such routine anymore, because there is a great chance to either go crazy or totally loose that valuable motivation. It’s very fragile you know and there is plenty of work that it needs to get trough.
Cross-compiling to Linux
In the first half of the October, my project experienced a vast programming stage where I tried cross-compiling game from Linux to Windows. Apart from that, I also managed to compile my game to Raspberry Pi. Oh, in case you’re unaware - game is written in C++ using SDL 2, SDL_gpu and LuaJIT libraries. Currently I’m using Linux Manjaro to do all the heavy lifting.
After some research, my journey stopped on MinGW 64 compiler, downloaded from AUR repository. Giving the comfortable distributions of libraries and the way things work on Linux, it turned out to be surprisingly pleasant experience. All the libraries I need are already in repository, just download and link them to your project. Windows couldn’t brag about this kind of work flow back in a day but now in some way it seems like it can actually brag - packet managers like Nugget makes it possible. Still, C++ development on Windows, after trying Linux, feels very clumsy and uncomfortable. That is, of course, if you compare the experience... It was fine for me before the Linux days., now it definitely isn’t. Perspective is changed, hard to roll to previous one.
Early compilation phase required couple of necessary changes in the project to make it work under Windows and RPI. I soon realized that _WIN32 define spoils a lot of things in my projects since MinGW is actually a port of GCC, flagman compiler of the Linux world. The code that was previously dedicated to windows, now falls for the code specifically meant for Linux. MinGW defined both _WIN32 and __GNUC__ which brought a lot of trouble. Shitload of warnings and errors made my developing time very fun. GCC version of MinGW is the same as native version on my OS, but for some reason the rules were a bit different.
Rewriting and fixing improper parts of the code wasn’t a big deal, time consuming - yes, but not a big deal. The real pain-in-the-ass came after!
I use CMake to build my project files and MinGW provides its own version of CMake. Project script configured through MinGW version refused to include certain libraries and commands onto final makefile. Clearing, flushing project files didn’t help at first. Solution wasn’t discovered that quickly and eventually it got fixed on its own. Yeah, it happens. I did so many changes that I can’t seem to point out the exact solution to this problem. However, I think it was a bug in that cmake version rather than my own incompetence. Unfortunately, not only one...
I had a real fight with the new C++14/17 filesystem library. Linking filesystem library (-lstdc++fs flag) seemed to be impossible task. MSVC, Linux GCC and RPI old GCC (version 6) worked as expected but the cross-compiler version presented its own quirks. You see, filesystem library in c++11/14 belongs to experimental branch and the name of the included headers start with experimental word. However, in c++17, you don’t need to include that word anymore. For some damn reason, MinGW compiler doesn’t treat it as experimental when using c++14. I had to make cross-compiler compile my game under c++17 standard. For that reason I even included forced CMake option for treating project as if it has experimental filesystem on. Oh yeah, forgot to mention one more ridiculous annoyance: this stdc++fs flag had to be the last flag. Not the first, not somewhere between, but the last one. Why on Earth it had to be like that? The frustration held its place for long time because there was no explanation or any clue that it should be there. Fortunately, I discovered topic on stackoverflow about saying where should that flag stand and that made my day.
Next, derailed ride with SSE instructions. No matter how you configure damn compiler, it puts a SSE 3 definition inside your project and then complains about it. It doesn’t matter whether I link sse or not. Simply speaking, it gives no fuck. I had to manually put #undef __SSE3__ inside the project in order to fix this tiny convenience.
The craze didn’t stopped there. My game refused to launch after successful compilation. No hints, no info at all. After some prolonged debugging session I found it can’t create a window. But why? No reason provided. Later I found that only debug version works but compiling my game into release version with debugging symbols lead to same problem.
It was a long investigation. I removed flags one by one and spent lots of time compiling different versions of the game. I was about to abandon this idea... but, for the pete’s sake, just one more test and I’m out...
Bingo! It works!
What a luck!
You know what prevented from my game launching on Windows? The predefined “-NDEBUG” flag. The internet couldn’t offer me similar example, so, I really don’t know why it needs that damn flag, but hey! It works! Fuck the rest.
Cross-compilation succeeded, game runs like a charm. I strongly believe that it’s a Linux MinGW bug, because I downloaded Windows version of the compiler, recompiled there and guess what - it compiles, it runs and leaves no problematic traces!
I learned a valuable lesson that day: sometimes, if something doesn’t work, it doesn’t mean it’s your fault. It’s the software’s fault, but hey... it’s pretty difficult to grasp such revelation. When you’re operating in world of C++ language and something doesn’t work as expected - you always get the feeling that it’s definitely your fault.
The Curse of the Sewers Level
Throughout whole October, I was stuck one particular level. My latest masterpiece, the “Shopaholic” level, introduces shops as new feature, done through Lua scripting and most importantly, it introduces custom gadgets. You see, Smintheus has 12 default gadgets and sometimes you get quest-based gadgets. These quest-based gadgets do what quest requires them to do and they are completely useless in average day situation. Technically, they are custom gadgets too. However, what I really mean beside this phrase is that gadget being like any other gadget, but goes outside the default scope. The main purpose of customization of gadgets lies in the idea of extending player’s possibilities to interact with the world and manipulate environment to his or her needs.
I had to rewrite some part of the Lua API as well as greatly extend it. Process was filled with lot of experiments and tests . When comparing the step with previous activities, this one turned out to be filled with joy, although it took few days to make it work accordingly.
It felt so great observing the outcome. Basically, with the new updated API, I broke myself from level design limitations that been choking me ever since the beta release. It’s so versatile! You could probably make a game inside the game. It releases creativity even further than usually!
Anyway, this level introduces the following custom gadgets: Cheese Plant - lets you grow your own cheese, consuming it replenishes lost health (yeah, game’s silly). Mirror - reflects bullets, can be rotated and, of course, Lava Lamp! Oh, the lava lamp, my favourite custom gadget. It attract low tier mobs, makes them come closer and stare at lamp until bothered. Last gadget has a lot of potential in forming puzzles. I’m so hyped about future levels now.
After cross-compilation phase, I did so many changes that it utterly broke my game. Tenths, no - hundreds of bugs came out of the blue! Some of them brought enormous frutration into my life - at some point I was eager to throw my PC out of window.
Today is the day I killed last known bug and I’m super satisfied now. This is the point when game won’t be affected by any major changes because, thanks to new API, new functionality will be written in Lua.
The level itself survived a lot of iterations. I wasn’t very happy of the final result and after each final result, came another final result. I even had to cut several parts of the level that took some time. Believe me, cutting something you spent hours working on is truly, truly painful. But it’s necessary for the greater good.
I could write about more things, talk about other topics that were risen during development, but as you can see, I already wrote a novel here. If I let myself go then the article would probably going to end with triple of its size. Nah!
I dedicated 22 days for the challenge, but posted nearly 14 tweets about it. One week was left for “having life”. Getting my batteries charged because you know, it’s very easy to get crazy with all this game development and, you know, I’m already abusing the word crazy here... madness is much closer than one might think.
I had a fishing spree with one of my best friends. He wanted to get a 100% big fish, so we had to pick a lake with payed entrance. I usually don’t like these lakes, breaks any sort of adventurous feelings but hey, why not. Let me tell we haven’t caught anything. Nobody present there did, blamed the weather but there was one guy, from a local village, that kept scoring fishes one by one. My friend was watching all that and it was clearly, judging the look on his face, that he wanted to get up, go there and kick his ass :)
That guy turned out to be quite friendly, probably noticed friend’s look - gave a couple of advises of which bait to use, which we didn’t have. It was of no help either...
There were a lot similar trips and they all had “bad weather” but we had so much fun.
Also, I wanted to post this article two days ago, but my other best friend came from his voyage on commercial ship whom I haven't seen for ages. Me and the others gathered and had a crazy time. It got me immobilized on the very next day, couldn’t think about gamedev at all.
My evenings sucked me deeply into game called Underrail which I discovered through one of the reviews made by SsethTzeentach, my favourite youtuber. If you like old school RPG games, consider trying it. It’s similar to Fallout. It’s not a clone or even spiritual successor, but the game on its own. Underrail is interesting, difficult game that has some mad stuff like cats shooting laser beams and versatile gameplay that offers a lots of options in various situations. Kinda my thing.
Another horrifying revelation popped out while playing Underrail. My usual genre preferences dedicated to deep RPG games, survival games like Don’t Starve, The Long Dark or Subnautica and uber colossal craziness like Dwarf Fortress. My project, Smintheus, is adventure puzzle game. Sure, I played a ton of puzzle games back in my childhood as well as point and click adventure games but I don’t play them anymore. Why the fuck I am making a puzzle game? Looks like gamedev existential crisis is on my way.
Devtober was surely a fun event. I discovered several interesting projects made by other equally interesting participants. Watching others making their progress was truly motivating. Realizing that others busted their asses everyday for the same event made me work harder.
Conclusion? Nothing particular concerning Smintheus. All the shit is same, except maybe I will try to pour some portion of the money onto marketing soon. My next game is going to be RPG game. No more going outside the main area. I already have big ass design document with over than 40 A4 pages of “quick sketchy notes”. But that’s topic for another day! Right now, I will continue working on my project until its done.
What's next? Soon, I will publish two spacesynth tracks, new recompiled Smintheus beta version and open up a steam page. Now, where’s that bottle of rum...
Thanks for staying with me guys, Ciao!
Leave a comment
Log in with itch.io to leave a comment.