Videogames and GameMaker things
This update consists of a large number of smaller works for what could be described as military-technical reasons - this spring Russia has been attacking Ukrainian power plants and infrastructure again, which meant that rolling blackouts have returned.
So from mid-May to late July I’ve had electricity a third .. half of the time, which for the most part wasn’t too bad (except when it’s sunny and 36℃ outside), but meant that I was mostly working on my little laptop and thus focusing on tasks that the laptop can adequately do.
Things are better now and might get worse this winter..? Perhaps I’ll have to move somewhere with gas heating.
The laptop made appearances in earlier newsletters; since then, I added a second 8GB RAM stick to it, and also it’s now missing a battery - according to service center, batteries are hard to ship at the moment. Fortunately, I have a battery-equivalent power bank and a higher-capacity UPS, so that’s workable.
I’ve been looking into getting a slightly better laptop, but who knows what’s a good laptop, really.
Anyway,
Videogame work
Nuclear Throne
A new beta build (on openbeta_win64 branch) fixes a few issues with SteamDeck and generally improves input handling.
It’d be nice to include a photo of Nuclear Throne running on a SteamDeck in this section, but Valve doesn’t ship hardware here.
Ghost Croquet
We’ve released a few updates and generally have gone over most smaller additions that we had in mind.
Next up would be porting the game to console(s), but there is a bit of added complexity: even though I have a devkit, appear in credits of a dozen Switch games, and submitted a developer registration request ahead of time (in 2019),
Getting a registration approved is not easy for this region:
Perhaps bothering Nintendo over email would be more fruitful in this year, but previously the consensus among local developers was “get a publisher or register a company in Cyprus/etc.”.
Other
Been doing bits of netcode and porting work on a few games, but nothing I can tell you about yet;
I am working on some tooling to help with implementing state saving/loading for rollback netcode and a few friends are testing it, but it might be a while until it’s ready for release.
Releases
cmnLoc
A localization system for GameMaker! I already wrote about this one.
Fields for two
With a client’s permission I published an example that I made for them earlier this year. It’s a “starter project” for the sort of two-player game where each player does their own thing and they occasionally influence each other - like Tetris, Puyo Puyo, or even Shovel Knight Pocket Dungeon.
The example features a flexible networking setup (using either TCP or Steam), more or less all the boilerplate, and a test ““game””.
SnowStateVis
This is a debugger-visualizer for SnowState (a finite state machine library for GM) that lets you see what state machines are around right now, what states they’re in, and transition their states if necessary.
Some extensions are now GM8.1-compatible
Like, five of them at the time of writing. And some of the future extensions might be GM8.1-compatible when that doesn’t create additional development burden.
You can read the blog post about my tooling updates that lead to this being a possibility.
function_get_address (2024 edition)
I made an example of how to call GameMaker functions from native extensions in recent GM versions. This can be handy if you want to interface with external scripting languages (like my Lua wrapper does).
The test project is in C++ and I later added a smaller C# test.
Updates
I released a couple updates for GMEdit
Most notably, you can now “navigate to definition” of methods when GMEdit knows what they are, but there are also other tweaks and bug-fixes.
Also it has a Godot-like theme now, thanks to Topher.window_shape now supports per-pixel transparency, chromakey, and opacity
File Dropper now includes a secondary extension for dragging files out of the game window
(and I added a few more events/functions to it)Fixed a few things for GMLive
Also the documentation has seen an overhaul.
Work in progress
ASteam (working title)
I’ve been looking into adding more Steam Workshop functions into the GameMaker Steamworks extension for a client, which made me realize a few things:
Most of the code in this extension is boilerplate
(“a 20-line function for a single-line call” kind of deal)“async events” really aren’t the best way to handle multi-step requests
The recent (and even not-too-recent!) versions of Steamworks SDK come with a steam_api.json file, which describes every function in the C++ interface and their parameters.
It’s a little janky and occasionally wrong, but sure beats trying to parse a C++ header file!
So I’ve had an idea: what if I made a system that auto-generates a Steamworks wrapper for GameMaker from these API definitions? And thus:
The functions are named the same as in the C++ SDK (SteamUGC()->DownloadItem
is SteamUGC_DownloadItem
), take the same arguments, and generally work sufficiently alike that you can copy snippets from Valve’s documentation with minor editing.
A small addition is that async functions take an optional “callback” argument so that they can be used similar to call_later
:
I am quite happy with the results, but it might take a little bit before this is fully tested and ready for release.
winMenu
This one’s a near-complete (sans some very esoteric bits) wrapper for Windows’ menu functions!
So you can make custom popup menus (akin, but more flexibly than show_menu
in old GameMaker versions), define custom menu bars, and even add new items to the system menu of your window!
This will be released after I’m done writing documentation and making an example project for it.
Other things
Apart of all of that, I:
Made a few more mods for Parkitect (now up to 5 total)
Wrote a little tool for re-calculating a color for new opacity to have it look the same over a background
Wrote a macro for converting cursor movements into custom actions
Played a few videogames!
Unfortunately, this post is once again almost “too long for email” (even after being split in two), so additional stories will have to wait until the next post.
Thanks for reading, and see you next time!