Friedrich Hanisch's Dev Log

Homepage
Projects
Dev Log
All
2025
2024
2023
2022
2021
2020

2025-02-17

DONE

  • I finished following a tutorial for an interpreter in Python. I used GDScript instead, because I actually wanted to have a simple scripting language that I can use in our own Godot game projects (for Unity I'm quite content with SmallBasic, or just Rosalyn). I didn't find anything yet that suited my needs, so creating "my own" apparently was the way to go. Although I read stuff about interpreters before, I never did quite grok the whole thing, but the tutorial by Jay Conrod helped to finally just do it, and that approach was the most helpful so far. I tried reading "Crafting Interpreters" by Robert Nystrom, and while it's extremely complete, following is a bit of a chore, because the author adds too much fluff to the text, in my opinion. I think the lack of verbosity of Jay Conrod helped me much more with concentrating and understanding. On the other hand, IMP is very simplistic, and before I can actually use it for our projects I have to try adding some features, especially functions. Nonetheless I uploaded Gimpl on Github.
    https://jayconrod.com/posts/37/a-simple-interpreter-from-scratch-in-python-part-1
    https://github.com/ratkingsminion/gimpl

2025-02-14

SEEN

  • I was always a bit annoyed by Godot's lack of Unity's Instantiate() functionality that would let me duplicate an in-scene GameObject without any problems. Godot has duplicate(), but it definitely doesn't have the same versatility and produces unexpected problems. I also got word that duplicate() shouldn't be used for this anyway. Instead I would create little scenes inside the project with the nodes that have to be duplicated and I would reference them as PackedScenes. Only now I found out it's possible to create such PackedScenes during runtime, and thus I can recreate Instantiate() like this:
    var scene := PackedScene.new()
    for c: Node in proto_node.find_children("*"):
      c.owner = proto_node
    scene.pack(proto_node)
    proto_node.queue_free()
    
    I messed around with this before, but I never understood that all the node's children need their owner property set to the node. I'm still not sure what the benefit of the owner property actually is, but at least it works now.

DONE

  • I did some more stuff for sustAIn, small QOL changes only, but there's still no release of the full version in sight. I guess creating a story-based adventure game, even with no additional gameplay, is always harder to make than first anticipated.
  • The same with Mops & Mobs. I worked on small things that felt necessary, like a sanity check for the decoration mode (so that the player doesn't spawn into a barrel) and feedback messages when placing decorations, bug fixes for the savegames, moving the controls to the settings screen, adding titles and descriptions to quest lines... But without significant progress on the story I don't feel like uploading a new demo version. The differences are just too small, even if they're numerous.

2025-02-03

DONE

  • I participated in this year's game jam of the bpb, and as always it was great! This time I didn't work together with Jana, as it's pretty much impossible for now that we both attend such an event at the same time (because of the baby, of course). Instead I did the programming for Lara Keilbart's game idea: you're feeding a blank AI the knowledge of a small community so it will actually be a useful tool in the end. Cozy AI was the working title, but most people somehow incorporated "AI" into the title we also went with sustAIn. I provided the setting - the community are actually survivors of a generation spaceship that crash-landed on an alien planet - and of course my 'vast' Godot knowledge. Matthias Bunzel, the third team member, mostly worked on the dialogs, and for that he had to write formatted text files for the system that I created for the jam. In hindsight it probably would have been faster to use an existing dialog editor for Godot, but somehow I was interested in parsing textfiles that allow if-then logic. It was a bit more involved than I anticipated, so it took a big chunk of the time to create this, but I'm glad I tried it out. In any case the game isn't finished, we barely could make the first scene, but the systems are there and can be extended easly, if Lara and Matthias are willing. I also did some additional work already by adding the possibility to have both English and German in the game. Oh, and all the other entries were awesome too.
    https://larakaa.itch.io/sustain-a-solarpunk-adventure

2025-01-29

SEEN

DONE

  • Mops & Mobs feels more complete again, as I added an option to change the language of the game. Of course, for now it's only German as second language. Apart from the dialogs, where the translation will take a bit longer, there's also the job description at the beginning of the first level, which is a texture and not localized yet. Jana hopefully will change it to something using Godot's UI system, so that it will be easier to translate it via the CSVs.

2025-01-26

DONE

  • The new inventory UI in Mops & Mobs for the combat cards proved to be useful for preparing the combat too, and also the removal of exceeding cards from the backpack afterwards. This didn't need much additional code, which makes me happy, but of course it just means I missed some detail that will increase the complexity anyway. But for now, the combat system feels complete, and we can finally work on some "real" fights, as real as a card game can be, in the near future.

2025-01-24

PLAN

  • In light of the current events (Twixxer's boss Musk more and more open about being a nazi), I'll have to remove/replace all the links to Twitter on this dev log some day.

DONE

  • I added an inventory UI screen for the combat cards in Mops & Mobs. After much thinking about the approach, we decided that a single overview of all cards in the player's backpack in a grid would be enough. The first cards, marked with an outline, are inside the deck, which is used for the next fight. Clicking on a card moves it to the first slot, so it will definitely be part of the combat deck too (and the last one gets removed). We hope the minimalism of this approach is appreciated, but it might be that some people want more control. Overall we try to not overengineer the combat in Mops & Mobs just so it doesn't get more important than the rest of the game mechanics. Wish us luck.

2025-01-16

SEEN

  • Some gameplay of Behind Stars and Under Hills can be seen in the series "Deutscher" on the German broadcast ZDF (3rd episode, 25:02)! I totally forgot about this - back in 2019 a TV production company asked us if they could use a video of one of our games.
    https://mstdn.io/@ratking/113839883289963346

2025-01-14

SEEN

  • I just learned that Mark Sibly, creator of several easy to use game development languages/tools, has passed away last month. I really enjoyed Blitz3D back in the day and even bought Monkey and tried to make some small games with it. It was always cool to be able to use BASIC in combination with versatile graphics engines. In any case it's nice to read so many testimonials of Sibly's influence on game developers' careers.
    https://notices.nzherald.co.nz/nz/obituaries/nzherald-nz/name/mark-sibly-obituary?id=57014447

DONE

  • My brother released the intro video that I made for his art exhibition.
    https://www.youtube.com/watch?v=fygmO6KNcDk
  • It was a bit more complicated than I anticipated, but now a dialog can branch differently in Mops & Mobs depending on the outcome of a fight. The problem was, of course, that there was no result until the player did the fight, but the dialog nodes would advance until the next "stopping node" (Text or Choice). So any Condition node would be evaluated too early. I added a "pause" functionality that is called as soon as a Script node notices that the current game state isn't the dialog mode anymore. This works well enough, but in the future I might create a dedicated Combat node for dialogs in order to combine the Script and the Condition.

2025-01-10

DONE

  • While the player is walking through the dungeons of Mops & Mobs they're triggering different actions with each step, like a dialog starts or music changes. This happens via Dummy nodes. If the game were more physics-based I'd use Area3Ds, but I found it more logical to just use points at distinct positions; might be a decision born out of overthinking, but it's what we use now. Over the months the Dummy script received more and more functionality - not only do the dummies start dialogs or change music, they can also change the whole ambience, teleport the player to another dummy or level, and so on. But while the code doesn't have to be beautiful, I still thought having so many optional parameters makes the dummies unneccessary bulky, and creating different types of Dummy scripts that handle each case individually isn't as easy as in Unity with its MonoBehaviour component system. After some thinking I decided to use Godot's resource system. Each dummy now has an array of "traits", and every trait is inheriting a DummyTrait which is a Resource script. This means seldom used dummy functionalities like is_player_start don't pollute all dummies, which I like. I also added the posibility to create custom scripts, like they're used in dialogs already. I don't really use a scripting language currently for the game, but if the need arises it should be easy to parse some simple if-then-else constructs.

2025-01-04

SEEN

DONE

  • Currently I'm not really working on anything worth mentioning (unfortunately), but I'm preparing a video for my brother's art exhibition. The exhibition is called BACKROOM, so of course it's just a fly-through in a labyrinthine backroom, with the typical wallpaper and carpet floor. I use bloed to create the level along a simple path. Dreamteck's spline tool is a bit overpowered for the camera path, but at least I don't have to make my own bezier curves. Annoyingly there was a bug that would only appear in the standalone build and not in the editor (the position change of the spline during Start() wouldn't be recognized by the path follower anymore).