I started this project a little late in the month. Initial plan was to use the Team Dogpit Jam for the February activity, but that’s been postponed because of weather troubles and power outages in Texas. My substitute project is a small scriptable text tool.
A few times a week I find myself needing to decode something in base64, wanting to pick apart a JWT token, or needing to nicely format some JSON. Sure, I can post each of these into an untrusted website or, in the base64 case, throw pbpaste | base64 --decode | pbcopy into the terminal, but I’d like something that’s fairly low resource, extensible, and serves the singular purpose of running tiny scripts on text inputs.
The proposed text tool has two fields: one for running a plugin (with autocomplete and suggestions) and another area which takes a big block of text and gets replaced with another block of text. Support for multiple scripting languages is great, but ultimately not worth it if it pushes the project past the time limit. There should be a clean, minimal UI with friendly features like autocomplete (suggest) and keyboard shortcuts for copy/paste into specific command areas.
Update: Despite the late start, I was able to wrap up this project. It’s not quite where I want it to be, but when is it ever? The full source is available on my GitHub page at https://github.com/JosephCatrambone/TextUtil . It needs a documentation pass and a lot of code cleanup, but it works. Here’s a demo of me invoking the base64 decode plugin, using a keyboard shortcut to jump back to the command entry, and invoking the ‘hello_world’ plugin.
tldr: Pitch: A physics based (soft body) sim where you drag and fling a floppy cat, Angry Birds style, through a series of levels like Sonic.
Ideation Phase: I was thinking of something roguelike, but I’m worried I’d spend too much time endlessly tweaking the procedural generation stuff and not enough time making a shippable game. I would also like to be doing this in Rust, but since it’s too hard to throw things online and deploy to mobile, I’m thinking that Godot makes the most sense. Something simple and physics based with one-finger inputs would be satisfying and approachable by my friends and family. Perhaps Pikuniku meets JellyCar.
Day 3 (Workday 1):
I spent a little too much time fiddling with verlet integration for the soft-body physics stuff. The simulation is unstable for reasons that aren’t clear and it also doesn’t really add to gameplay. It’s not a goal or even a mechanic — it’s a distraction.
Backing out, I think I’d like to use SmartShape2D with RigidBody physics, but it’s not available for Godot 4 yet, so I’ll probably do a tileset with some clever shapes. I think it might be better to have a simplified set of angles, too. It lets people predict their shots more easily.
Possible assistive features: slow down time and/or project the angles? Hmm.
Design Question: when a player drags on the cat, should the impulse applied always be central, or does it make sense to apply a torque when they grab off center? Or should there be a sweet spot where it’s “central torque” and everywhere else applies spin?
First enemy in the game was “Psychophant”, the psychotic elephant. I added a component called “rb_damage” which listens for contacts between RigidBodies. I had originally used a CharacterBody because it made sense for something that was kinematic, but there wasn’t a good way to register impacts (with velocity) on the body. After a lot of futzing there was just no convincing way to get the impacts. The get_slide_collision on CharacterBody only returns the physics objects encountered along the path of movement, so if the player bonks an enemy from behind we don’t register a hit. I gave up and said that all enemies have to be RigidBodies, then I added a meme explosion sprite on death.
I only had time to make a camera component which followed the player and the player’s direction of movement. At this point, I’m really avoiding making level geometry and more enemies because I neither want to use tilemap nor have to deal with converting Polygon2D maps to collision geometry. SmartShape2D is sadly not available for Godot 4 yet.
I finally broke down and created levels. I spent a lot of time automatically generating collision shapes from polygons so that I can remove the debug rendering. Offsets were ruining what was otherwise a fairly straightforward creation of one collision polygon per polygon2d. Ultimately, I gave up and threw a warning when the polygon had nonzero offset.
It looks like a game, at least. I added time slowing when the player taps, and it feels pretty good! However, a new problem has shown itself: Dragging the player adds an impulse, rather than explicitly setting linear velocity. This seemed like a nicer and more physics based way to do things. The problem is that when the player is in free-fall, applying a big force just brings the player to a standstill, rather than setting the linear velocity. This doesn’t feel really great, so I’m wondering if there are better choices. I could set linear velocity and let the player pivot in the air, but it’s mostly a matter of experimentation now.
I ended up setting the linear velocity if the angle was outside of some threshold. If you are travelling forward and slingshot floppy cat in the same direction, the velocities add. If you apply a linear velocity in the opposite direction, the velocity gets set. This feels pretty good, anecdotally.
I spent a while working on the title screen and level select. I’m starting to feel some hacks coming in from the UI because of how ‘main game’ is a standalone scene which does level loading. After the MainGame screen gets loaded, I don’t have a way of signaling from the level select screen that “Level 1” should be loaded, so instead I set a global variable “map to load” and then main game checks if it’s set, loads the level provided, and clears the value. Gross. Hacky. Functional.
And that leads us most of the way to a complete game. I have kill boxes to return the player to the last checkpoint, a ‘level complete’ marker at the end which will trigger the end of level sequence, and now all that remains is adding three more levels and doing a bunch of playtesting.
After hastily throwing together a bunch of levels and wiring up menus as best I could, the game is ready to ship, or at least “done sufficiently for the time provided”. It’s up and running on itch.io at https://xoana.itch.io/floppy-cat-saves-the-world . Making the last levels feel fun was a challenge, both because of the way that they were structured (using polygons) and because of viewport limitations in Godot itself. I found that I couldn’t scroll past +4000 in either direction, which, when your viewport is 1k by 1k, makes for a bit of a tricky cap. I think if I had to do it again I’d shrink the viewport significantly and do scaling. This would help with the texturing, too, as all of them ended up looking really tiny in the final shipped product. I also didn’t finish the ending cinematic or hidden ending in time, but I’m glad I got something out of the door.
My personal website started as a way of tracking my New Year’s resolution some 12 years ago. It’s still up as a place for putting short stories, rants, and guides. I think cohost as a microblogging platform is taking over that role in some respects, but I’m not ready to make a redirect here. I’ll settle for cross-posting.
I’ve been burned out a half-dozen times in about as many years, and something that particularly gets to me is not long hours but a lack of shipping anything. Spending a year on a project to have it canned is more demoralizing than spending a week under duress. In the interest of resolving this, I would like to ship one small app or game per month. It seems strange that adding more strain to the schedule would cause less stress, but every vacation I’ve had so far this year has been absolutely plagued by depression over getting nothing done and yet somehow failing to relax.
This will not be a trivial matter, as work, home obligations, and a commute leave me with almost solely the hours of 7:30PM to 10:30PM, Mon/Wed/Th/Fri to myself. That’s 12 hours a week plus whatever I can do on Saturday morning. That’s 48 hours a month at maximum efficiency, and probably rather optimistic, given I need to do domestic things like laundry and cleaning and taking care of people/creatures.
Is it really worth spending the little time I’ve got making games instead of cultivating a skill like making art or practicing music? I’m not sure. 12 hours a week feels like so little time for all the things I want to do, but this is the reality of the situation, so I guess the only option is to make the most of it.
So many resolutions revolve around suddenly having discipline never before demonstrated in one’s life, and this isn’t much different. Perhaps I can simply make do with building up a habit.