Friedrich Hanisch's Dev Log
SEEN
- A list of projects that pledged to not use AI (LLMs). Of course, the pledges are just words, and if something happens - like a new project leader - things can change quickly. But mostly I just wish the list were bigger to begin with.
- One of the most often discussed topics in the Godot subreddit is how to protect your game so it can't be decompiled. I can relate to that, as I tried the Godot RE Tools and it was shockingly easy and the resulting project files were complete, as far as I could tell at least. People already reverse engineered Slay the Spire 2 this way, and the developers (apparently) don't mind it. Still, if I should become paranoid, this article describes some ways to protect the game files. What I gather is that for actually working encryption, one has to compile their own version of the Godot editor.
- Watched a video about "illegal" rendering techniques on the Nintendo 64. Quite advanced and cool stuff. In the same vein, here's another video that shows how the author is making a big open world with a far render distance on the N64.
- Might be interesting later - a tool for content-aware resizing of pictures.
- A bit of a niche topic, but this article about typed Futures (for asynchronous programming) in GDScript was an insightful read for me.
DONE
- As I already mentioned, Felix and I submitted I Made A Game For You to the A MAZE Awards, and some time ago we received a rejection that read like someone had a very bad day. It's awful enough that apparently only one person judged our game, but giving it only 1 out of 10 in the category Potential is, in my opinion, unfiltered malice - not to mention the contradictory written feedback (which was also very short). I did mail to the organizer and they at least admitted that this really isn't worth the submission fee, and wrote some feedback that was actually useful.
In any case, as a counterpoint to this very disappointing experience, I found out today that I Made A Game For You was reviewed in the February issue of PC Gamer USA - I guess it's not really a 1 out of 10 game.
- I had the idea to post short development updates on the Steam discussion forum of Mops & Mobs. The idea was to write 2 to 3 sentences each week on what I did, and I could convince Jana and Patrick to send me such dev logs too. From now on I try to do weekly updates in our Discord, on Steam, and on IndieDB. For Steam I don't post screenshots (yet), but Discord and IndieBD have some pictures, usually. The reactions to this are ... negligible, but I didn't expect anything else. This is mostly for ourselves, for now.
- So what did I do for Mops & Mobs since my last entry? The main quest of chapter 3 is now mostly playable (to a certain point), but of course that doesn't mean it's finished - I'm currently gathering feedback from Patrick, and try to remove any confusion. There was a mean bug that would sometimes remove NPCs from the game world after loading a game save. It's fixed now and thankfully it didn't affect the demo.
It's now possible to inspect some items in the inventory (which is needed for some quests). This was a bit harder to implement because I use the dialog mode for that - as it should still work when the player examines an item while there's already a dialog with an NPC going on.
- Right now the biggest - and still ongoing - changes are related to the combat system. I planned to overhaul the card fights for a long time, and now it's finally happening. To improve the feel (at least for me), instead of a single respawning broom card players now use a deck with several broom cards; and instead of a simple health display the player has a stack of health cards, just like in Mondar's Dungeon. Which was the main 'inspiration' for our card system. These changes are the more fundamental ones, but I suspect much more work will have to be put in a better UI, and in randomly generated fights.
- I'm still tinkering with my little side side project, BlockJumper, on and off. I got the urge to do something else with the bloxels, so now I generate levels with them. This is pretty ugly and minimalistic, which is why I try to create an atmosphere that I like. I still don't exactly know what I'm doing here, so I'm sure my next update will be something completely different.
SEEN
- For a while I had the plan to learn either zig or Odin, but I just couldn't decide which, so instead I used the time to read about the two languages. Which is kind of stupid, and in the end I'm only sure that it won't be zig. But of course I came across other options, like Zen-C before and now C3, which I also find kind of intriguing as someone who wants to use C but somehow doesn't really want to use it. I even read C3's documentation a bit. It's also illuminating to visit the respective Discord communities, how they see and discuss the 'rival' languages (the C3 developer seems to be very fond of Odin at least). But yeah, I guess I'm not really in need of another language right now; this website generator is still written in V, even if V seems to be a bit of a joke among other language developers.
- I watched a video about 10 things to know before starting a large Godot project. It's nothing really new, but I often like such reminders.
DONE
- For potential trailer fly-throughs I gave the debug camera of Mops & Mobs smoothing and speed factors, and I even posted a video that was deliberately unpolished (i.e. I clip through walls). In any case it looks cool. Back then I already added that to TRI, where I didn't want to meticulously plan camera paths through the levels for the final trailer and just fly through via mouse.
- Ironically, the video that Jana made the last weeks doesn't use this. Mostly because I implemented it a bit too late, but also because Jana's video is meant as a "gameplay reveal" trailer, where it was more important to show real gameplay scenes. We even went all in and got a guy on Fiverr to do a voice-over of the dungeon master, telling viewers how great the janitor's job is.
- While advertising the new trailer everywhere I got a bug report that basically prevented the user from completing the Mops & Mobs demo. I had to search a bit and then conclude that I actually already fixed the bug (if you save at a certain point and then load, the game wouldn't remember an important gameplay variable because it was in a different 'blackboard'), but the demo was outdated and didn't have that fix. Thus we finally had a reason to update the demo to v0.5.0. The new version also tries to make the main quest a tiny bit easier, as a lot of people are stuck when it comes to do a bit of detective work.
- Apart from the camera stuff I mostly worked on the main quest of the third chapter. It's coming together, but I'm much slower than I expected. We will probably shorten the fourth and fifth chapter a bit, just so we can finish within the budget. At least I do like the third chapter's quest, as it involves a lot of goblins.
Another job that had to be done was creating an import and export script for our localisation files. We use CSVs for all the texts of the UI and the quests, as CSVs are natively supported by Godot for localisation (but in the end we don't use the inbuilt system anymore), and JSONs for the dialogs (via connected). But the translators we asked all want XLSX files, and so I had to write scripts that automatically do conversions and create the correct JSON data.
- I had the itch to update Gompl, my simple interpreter written in GDScript. I always wanted it to have
function definitions, because SmallBasic has them too - and just like SmallBasic, Gompl's functions don't support parameters. And after realising that it would be best to just use jumps to implement them, functions now work with recursion too. As a bonus, it finally makes sense that I use stop as keyword for breaking out of loops - it's repurposed as "return" in functions, and if you want to return a value or rather expression, you write stop with <expression>. This also works in while loops.
with is also allowed after skip (aka "continue") and interrupt, and using skip in a function basically is the same as using recursion. Language design is fun, especially if you don't have any idea of language design.
In the future I would like to add support for arrays, but that will definitely be a bit more involved. Mops & Mobs' scripting API doesn't need arrays, so there's no hurry - but it doesn't need functions either, so we'll see.
SEEN
- I enjoyed this code golf over at the Godot forum, as the user 'normalized' wrote a Snake clone, a Flappy Bird clone and a Space Invaders with the shortest GDScript code possible. There are some tricks that I found illuminating, and I even could contribute a tiny bit to the Flappy Bird project.
- Unity got some bad news again. It's really frustrating for me, as I spent so much time with this engine and put so much effort into somewhat mastering it, and now I don't even find the motivation to keep myself informed about the latest updates. But stuff like them deprecating PolyBrush somehow still reaches me and depresses me, because they could have really amazing tools built inside the editor, but instead concentrate on disgusting AI tools to keep the investors happy. While PolyBrush wasn't great, not replacing it after it's gone is even worse.
The more important bad news is about China-based assets on the asset store getting removed - this isn't Unity's fault directly, but they handle this awfully too. I had to use some user's vibe-coded script to find out which of the assets I own(ed) are affected; Unity only provides a 50 page PDF with all the assets, and expects their users to just deal with it I guess. In any case I'm sad to see this QR Code Scanner and Generator plugin getting removed, as I used it with great joy in our HaQR jam games.
- A Godot add-on that helps saving energy? Sounds like a good idea.
- One of my dreams is to program a game for retro hardware some day, but I don't know if this will ever happen. Still, I find projects like this engine for the Nintendo64 called Pyrite64 always interesting. But I'm a sucker for new engines in general.
- I watched a video about the 7 Levels of Dungeon Crawlers, as this was recommended to me by Jana for our devlog. It was indeed fun to watch, and I wasn't even mad that one of my favourite games, Ultima Underworld, was only in Level 5. We now use the term DINO (Dungeon Crawler In Name Only) too, for Mops & Mobs, because it fits: in the end, our game is like a pastiche of the Crawler genre, or - if you're familiar with Tale of Tales' philosophy - maybe even a "Not-Dungeon Crawler".
- If I ever should want to play some old multiplayer games again, GameDate looks quite useful to find sessions.
- For some reason I was always fascinated by the language Forth, mostly by the myths that surround it. About people writing complete operating systems in Forth just to power their games, or something like that. There's also this C64 game engine called White Lightning that was written in Forth. And a few days ago I somehow found the time to finally read an introduction into Forth, and I did read it in one go.
- A personal highlight recently was QUOD, a Quake-like shooter in 64 kilo-bytes. Crazy stuff, and I'm glad the developer recorded a making-of video with cool insights. I found it surprising that he uses Trenchbroom to create the levels, instead of a dedicated generative tool.
- Another post-mortem I watched is about Marble's Marbles, a Marble Madness clone that had some moderate success on Steam. The insights are good, even if already known. Make small and good games in a short amount if time, don't try to create your absolute dream game every time. Put some effort into marketing by being attractive to your target audience, and contact IGN at least four times to feature your trailer. Et cetera.
DONE
- I graced my test project BlockJumper with another video on Mastodon, which is similar to the first one on the surface. I made the second video after replacing the player controller based on Godot's
CharacterBody3D with my own Rigidbody3D-based solution.
With the first controller I felt this problem area was more or less 'solved' as I added crouching with ceiling detection and improved the stair-stepping. But the gameplay - as shown in the videos - consists of walking over a lot of small bloxels that get summoned at will. And this can go a bit haywire as soon as the player does this in a cramped area, colliding with walls and ceilings while still trying to traverse over the little bloxels. (I named them 'glitch bloxels'.) All these edge-cases led to jitter and an overall unpolished feel, and I didn't feel like even trying to fix this as it felt like a problem on a more fundamental level.
So instead I took a character controller that I built in C# for Unity (based on concepts I follow since 2009 or so, back then in C++ and BulletPhysics) and ported it over to GDScript, which was both an interesting and awful experience - especially as I had to port it fully before I could test it. The methods for ray-casting and especially sphere-casting work a bit different in Unity and Godot, but at least I now have a working character controller with jumping, running, crouching and mantling again. There are still some jitters here and there, and I still had to smoothen the camera's movement on the Y axis, but thankfully, overall it does feel better in the game, at least to me (and for now).
I still don't know what kind of game I want to make with this, though. Sure, a grand plan vaguely exists, but for the start I should do something with almost no friction.
- Last time I wrote about the adventurers in Mops & Mobs and how their appearance is randomly generated from different parts. And now there's a video that demonstrates this - of course this is exaggerated, they won't change their armour like that during the game. Or maybe they should?
- I continued with writing the main quest line, but as usual did some other small stuff too, like changing the background scene of the start menu. I only mention this because an attractive start menu is actually important if you showcase your game at a game convention. Last time we exhibited Mops & Mobs at the A MAZE in Berlin this became very clear to me - I mostly stood next to the computer screen with only a boring brick wall and a lit torch (and a floating logo) on display.
- Jana made a video of the third level for ScreenshotSaturday. I find the level too small actually, but in the end the story line of the third chapter concentrates on almost a single room currently - the forge of the goblins. And the next levels should be even smaller, if we want to finish the game some day.
- We recorded another devlog video, where we talk about gridders that we made before, gridders that we played, and inspirations for Mops & Mobs in general. By the way, if you read this and want to help out, we do need some more reviews for the demo page on Steam!
SEEN
- For a potential project I got to research plugins for Godot that would make the creation of point&click games easier, namely Escoria and Popochiu. I only tried the plugins' test games for evaluation, so far. They both definitely are capable, but I think I would choose Popochiu, as Escoria felt a bit too powerful/complex for what I want to do. On the other side, the demo game of Popchiu didn't let me combine the key with the door (gasp!), and had some small glitches. Maybe I should just roll my own framework. In the end, a character walking around (which isn't even mandatory), an inventory and the ability to combine things with other things is all the project needs. For the dialogs I could use connected, of course.
- I don't remember exactly why, but I read this article about the Biggest Scams in the Audiophile World. Of course the title is clickbait, but overall I found it to be an informative and funny read. I don't like to listen to music via my laptop's speaker, but that's already where I draw the line when it comes to audio quality. The article makes fun of those super expensive cables which apparently use unicorn hair or some other stuff, while nobody will hear a difference to normal $8 cables. And so on. I also liked the explanation of the myth of "vinyl is better".
- A video about addictive games - which is to say, factory games - made me thankful I don't play such games. I'm getting depressed too quickly because of the waste of time - even if I'm not really productive instead.
- John Romero uploaded a making-of of Catacomb 3-D, which I never played. It's mostly interviews with the developers. Watching this I find the (visual) design of the game somehow better and more coherent than Wolfenstein 3-D, even though it came later. Well, and John Carmack's strangely empty room is also a highlight of the video.
- Why 96% of Indie Games Fail is a good video IMHO. Not groundbreaking of course - the analysis was done often enough. But it's a good summary; and look, John Romero is mentioned again. He explains that DOOM was his 90th game actually, so one important lesson is perseverance, as usual. And marketing and market research, of course.
- A "middle game" is a game you develop within in a short time. The article about Merchant 64 explains it in more detail, and really, Rat King's next project should be a middle game. Concentration on a non-complex gameplay loop, interesting art style, only a tiny bit of narrative. Should be doable! Only problem is that Jana and I sometimes can't decide on what this gameplay should be.
- I read this Reddit post about composing game music with only a rudimentary knowledge of music theory and composition tools, and found the info useful. Of course I disliked the advice to ask ChatGPT about scales and emotions - there are so many websites exactly about that, why not just visiting them and enjoy the authors' knowledge directly? Makes me sad.
- We don't make 3D characters for our current game projects, but I'd like to try this plugin for Blender some day. We did use Pepakura a decade ago, for a prototype that was never released sadly.
- Over at the Godot forum, user normalized (who seems to be the Godot crack) took the challenge of the missing pivot of the editor camera and wrote a plugin that basically recreates Unity's Alt + middle mouse button: zooming the camera to where you clicked. Reading the code I was both disgusted and fascinated, somehow - for example, in order to focus a temporary dummy node created at the clicked position, the code iterates over all buttons of the Godot editor main screen, looks for the one named "Perspective" and clicks it by creating a fake input event for the key F. Okay.
DONE
- Just to get it done I now uploaded the materials for Demokarten, the card game we developed for the board game jam in January. My contribution is the design and print sheet for the cards, and some parts of the manual. The game is not really tested, so there's no guarantee it's actually playable. But well, it has rules and a card design. Matthias from the bpb even offered that finished games can be be hosted on the bpb website too, so here it is. That's really cool, if you ask me.
- As we submitted I Made A Game For You to the A MAZE this year, I made a tiny update for it. From now on, players can decrease the head movement to 0%. I don't really like that, as I think it's an integral part of the experience. But enough people complained about getting nauseous from the movement, so I guess I just like to improve our chances to get nominated. To be honest though, I don't think the game's crazy enough for the A MAZE, but it felt wrong not submitting it.
- I worked a bit on Golem and the grid functionality is now usable, more or less. As intended it's almost like in bloed, but at the beginning the grids' position is always at the origin. I.e. if you work on bloxels far away it might be you have to move the grids by pressing the Space key hundreds of times. I'm sure there's a solution for this, and I will look into it as soon as I see the need for it. Which is pretty much the only time I work on Golem in the future.
I also added support for multiple materials and UV scaling to Golem, here's the proof. With those, my little bloxel tool has most of the functionality I need for now.
- As demonstration I recorded this little video of BlockJumper (working title). For the prototype I improved the stair-stepping abilities of the (very minimalistic) character controller that I originally used in I Made A Game For You, so walking over randomly distributed little bloxels wouldn't look too janky. It's not perfect, as there are a lot of edge cases, but it's a start. I just don't really know what to do with this bloxel summoning mechanic, as the original plan - a "remaster" of one of my entries for the One Hour Game Jam - doesn't really spark motivation so far.
- And Mops & Mobs should be in this list too. We're a bit slower these days because the child is sick quite often (it's winter after all). But still, I managed to work a bit on the main quest line of the third chapter and also add a Pipemania-like mini game (by using the decoration mode). And I added some tiny but satisfying animations to the speech box, which also help a bit with telling the three participants of a dialog - NPC, player and narrator - apart.
- Adventurers in the game are generic characters and their graphics consist of different parts in different variations - trousers, weapon, helmet, etc. To remove the need to equip them individually, I added randomization based on a seed (the NPC's ID) so the adventurers would look the same on each start. Last but not least I implemented some sounds from our sound guy, and the second level suddenly has a far better atmosphere. It's slowly coming together, I think.
SEEN
- Zen-C seems like an interesting project to me - basically a modern version of C. But it's so young that I don't think I will have a serious look this year. It just feels like V, and that one is highly prone to bugs even after years. Instead I still have the plan to learn either Zig or Odin or even both, just to have more options.
- I always like learning of neat (free) software, this time a 2D animation program called Friction.
- Folded Paper Engine is a Godot plugin that improves the Blender to Godot pipeline, so that the level designer is able to do much more within Blender. Might be useful for future Rat King projects.
- Another cool project, made possible by Godot's recent library-fication: 2dog. You basically use all the rendering capabilities and so on from Godot via C#, directly. I guess it's comparable to MonoGame?
- And something to try when there is time (haha): KAPLAY.js is a HTML5 game engine that looks kinda fun to use.
- I read an article about the making of Dungeon Master, with interviews from the original developers. "Mike created the dungeon, but the individual puzzles were created by all of us. I probably created the most puzzles, but I think Dennis and Wayne created some of the best. We would tinker around and create [them], and then try them out on each other. Eventually, we had to include other people, because you needed to have fresh people as you refined the puzzles. The play testing was quite extensive." rings definitely true, I think a lot of our puzzles would benefit from more eyes on them too.
- Interesting tip by digitalbreed for new Unity 6 projects: disable the search index in order to increase performance.
DONE
- The weekend in Schmitten (Hessen) was nice - I took part in a board game jam, which was (almost) a first for me. And that's why I joined Thomas Thudt and Martin Esters to work on Demokarten - Demokratie durchgespielt!, a resource-management deck-builder card game, about democratic parties trying to get the most voters. (The theme of the jam was Democracy.) Most of the time I tried to understand the rules and write them into a document, so others would be able to play it too. The prototyping phase was far too short for my taste - we began work on Saturday morning and early afternoon we already had to have a playable version ready. It was fun though, and the "final" product didn't even matter much to me - it was nice meeting so many people from the real of board games, and of course it helps that the whole trip was paid for by the tax payers.
Still, I'm currently trying to design and layout a document with the cards for printing, so we can upload everything on itch. It will be pretty minimalistic, but for me it's a good opportunity to get into Affinity Designer, especially as it has some strange quirks. (No button to vertically center texts?!) After a while I switched to the new version, where all three Affinity products were melted into a single one. A bit strange, but this way I could create several pages of cards without much hassle. I hate that I have to log into my Canva account all the time though.
- I uploaded a very minimalistic bloed-like on Codeberg. Golem is a level editor add-on for Godot, and so far it works okay-ish, but I don't think anybody else would get much out of it, because of course there are far better tools out there. Sometimes I just get the NIH syndrome. I already 'use' it for a little side side project that is just a recreation of one of my 1-hour-game-jam games, but that one takes a bit longer, because there is so much else to work on.
- While trying to add some grid functionalities for Golem just like I have them in bloed, I noticed that Godot does not expose its editor 3D camera's pivot point (called camera cursor here). So I began a Github discussion about adding this feature. I'd really like to use this point to be able to define the position of my grid (where the user then can place bloxels). And it would also be cool to move this point (and the camera) to a specific position on the bloxel objects.
- There isn't much to say about Mops & Mobs currently, because I mostly tried to think of a main quest story line for the third level, and such things always take longer than I'd like. But I also worked on something that always was a tiny but annoying issue - empty dialog choices. Most of the important characters have an option called "Tell me about...", and when the player selects it there would be several topics to choose from. These topics get (de)activated dynamically, depending on the current chapter, active quests, etc - and when you talked about everything, the "Tell me about..." branch would be empty, which means it should be hidden. But the dialogs are very dynamic graphs, so it's not straight-forward to check if a choice node has further choices as children, and if those are active or not. As this can lead to some strange bugs if the writer isn't careful, I decided to only do such a check for choice nodes with a special internal tag.
- Mops & Mobs suffers from a strange visual bug, where point lights would produce very pixel-y shadows if they are behind the camera. Apparently this is known for years in Godot, and a fix seems to be low priority, unfortunately.
PLAN
- I write this log entry while on my way to the bpb board game jam. Usually the bpb jams attract people from various fields and backgrounds, but this time the jam's Discord is full of experts in the board game field. Which means this weekend I'm pretty much the noob and 'outsider'.
SEEN
- I watched a dev log of Evan Todd's current game project, about how blue noise made his game feel more "alive". The most interesting part to me is that Todd is making a new game. I was quite amazed by Lemma back then (though it was too hard for me to finish it), and backed the Kickstarter of his second game, which unfortunately didn't work out. Apparently he now uses Godot instead of his own engine.
- A short article about the Github monopoly and about contributing to open source projects, from the perspective of a teacher.
- Maybe I'm easy to amuse, but I chuckled when I watched this video about Street Fighter II, and how they fixed a typo shortly before release - back when fixing typos inside graphics assets was not easy at all.
DONE
- We released version 0.4.4 of the Mops & Mobs demo. We wanted to have it ready for the Steam Detective Fest, so it includes the new decoration mode functionalities and the new detective-like quest where the player has to take notes (gasp). Unfortunately we were not allowed to include the game in the Steam Fest, but we uploaded the demo nonetheless. Finally there's also a dedicated Steam page for it, so if you are inclined to write a few words about it, you can now leave a review.
- I started a simple experiment to recreate bloed in Godot. Well, it won't have the same amount of features in the near or far future, but I'd like to have something where I can very quickly build (and edit) small minimalistic bloxel levels in my preferred workflow. Right now I don't even plan to support different bloxel types, and different textures would be a big nice-to-have. Optimization is also not a concern for now. Instead I just try to get comfortable with extending the Godot editor via GDScript, and maybe make a low effort game with it just for testing the editor. Some day I also might look into GDExtensions.