GGPO and various adventures
My work on Shovel Knight Pocket Dungeon has been publicly announced!
I worked on various PS/Switch tasks and reworked the game’s leaderboard system to support more features (like pagination and dailies).
Also check out this artwork by Jaime:
I adapted GGPO (the rollback netcode system) for use in GameMaker!
Fueled by investigative work for Rivals of Aether (“but what does GGPO do in this case?”) and an unannounced project, this puts an average person closer to having Pretty Good Netcode in GM games than they ever were.
I did some additional programming for something that’s very exciting that I cannot talk about… yet.
I currently live in Odessa, UA and in some ways it is a strange city.
In a trait only somewhat shared with Kiev, every few weeks there’ll be a day where you just don’t have power from 9AM to 5PM or so. Sometimes it’s planned maintenance, which happens often enough that there’s a little website plotting data over an OpenStreetMap widget,
And sometimes it isn’t. Rest assured, you will see a fuel-based power generator behind every single shop/bank/hotel/whatever - to most businesses, missing out on an entire day of work is unacceptable.
I’m not usually heavily affected as my work is not tied to any given time of the day and I can take a walk while waiting for issues to resolve, but still it’s an annoyance and has cost me some system stability as Windows does not do well with being interrupted amid of installing something (and Windows tends to update modules in background without asking).
But this time, things were a little different.
It is Monday of September 20. I have some changes to make for imminent release of Rivals of Aether Rollback public beta and a few fixes to make for Pocket Dungeon’s upcoming QA pass. Perhaps 3-4 hours of work total.
Surely enough, I wake up and there’s no power. The little website doesn’t suggest that there’s any maintenance to be expected today. I decide to
jump forward in time take a nap - don’t even have to set an alarm or anything as the apartment’s air conditioner beeps incredibly loudly when [re-]gaining power.
Two or so hours later I wake up again, and there’s still no power.
I call the landlord to ask what’s up, but she doesn’t know — only that the apartment building’s “bearer of responsibilities” had reassured everyone that he’s working on the issue and that this time it’s not that he forgot to timely pay the energy company.
I ponder the situation
If the power is back within the next few hours, I’ll have just enough time to finish everything
If the power is back by 7PM (which is the latest time for any maintenance work to finish), I’ll barely have time to do work for Rivals and will have to stay up late to do Pocket Dungeon work
If the power is only back tomorrow, I’m causing delays for both projects and things generally aren’t very good.
I decide that perhaps I’ve encountered this problem enough times to justify getting some sort of a laptop as a backup option. As it’d essentially only be used to write code and run GameMaker/Haxe/C++ compilers, it can have an integrated GPU, a very average CPU, and 8GB RAM. Surely that shouldn’t be hard to come by
Cut to a nearby electronics store, I discover that there are now essentially two common laptop categories:
An Office Laptop: sort-of light, sort-of thin, usually a 2-core i3 CPU, and featuring variously insane (usually Apple-inspired) keyboard layouts with squished arrow keys and randomly omitted navigation/F keys.
I’m not fond of the idea of unconditionally having to carry both the laptop and a wireless keyboard if I need to charge the laptop at a cafe.
A Gamer Laptop: weights 3kg, is at least 15.6”, full RGB backlight, and 3-4 hours of battery life due to all of above and also a dedicated GPU.
I’ve had one of these before and it’d be really hard to convince me to buy another one.
But these do have normal-sized arrow keys.
In disbelief of this situation, I decide to check at a few more stores.
Eventually I stumble upon a very peculiar-looking laptop: CHUWI’s CoreBook X. A 14” laptop with a 3:2 QHD-ish (2160x1440) screen, 8GB RAM, and a slightly-older-but-4-core i5 CPU. And it has Win10 Home, which is a bonus.
A taller screen sounds like a good idea for editing code and the laptop is priced pretty competitively compared to what you usually get for the kind of money, so I decide to go for it.
A caveat of the unusual screen size is fast to reveal itself: there is not a single bag or backpack in the shop that fits the laptop remotely well - it sticks out of the bags meant for little laptops and doesn’t fit width of backpacks meant for larger laptops.
Still, I take it home and assemble a rather comical-looking setup (still no power):
Laptop’s initial charge lasts enough for me to set up Windows, set up my commonly used software (Notepad++, VS Code, HaxeDevelop), and do the top-priority work for Rivals. I charge the laptop at a nearby cafe and do a little more work before the day ends.
I wake up next day to find that there’s still no power.
Recalling that there’s a little local store that sells just bags and backpacks, I walk there and find a relatively well-fitting backpack for the laptop.
I charge the laptop at the same cafe and do the rest of the urgent work.
Dusk falls and there’s still no power. Increasingly discontent with the apartment being no use without power (as cooking, heating, and even water supply all rely on it), I decide to rent a room in some hotel. The place doesn’t seem to concretely exist in a specific time period:
The power is finally restored a day later - as it turns out, the contract with energy supplier hasn’t renewed on time. In the end, the only thing that was truly lost was the contents of the apartment’s fridge.
As for the laptop, it had served me well on this occasion and several less-dramatic ones since then, and will probably come handy the next time I’ll take a vacation… whenever that will be, considering the current pandemic situation.
You’d think that this would be all, but somehow it wasn’t - the next day I found out that the accident not only been longer than usual, but also far less timely, as something got really broken in Windows and hibernation ceased to work (but power-based sleep still did) while attempts to update Windows would fail, locking the system up for a few minutes before showing “reverting” and trying to update on next shutdown.
A few weeks later I reinstalled Windows and also got a tiny UPS, which is now possibly the most gaming-themed object in the apartment:
A little Godot
I made a little game with portals for “Stop waiting for Godot” game jam!
I’m yet to do anything else with Godot due to issues I’ve encountered with rendering portals themselves, level design, and lighting.
I released a new stable build of GMEdit! This features icons for menus, a whole bunch of options for tabs (such as multi-line and pinned tabs - pictured), and many improvements to type-related features.
I made a tool that automatically synchronizes changes from Aseprite!
This can save a lot of time if you are primarily drawing your graphics in Aseprite, and can also be combined with GMLive’s sprite reloading to auto-update a sprite in-game when you hit Ctrl+S in Aseprite.
For those who don’t want to deal with CLI, there is also a simple GUI app by Sahaun.
Templates for native extensions
Both use my other tools (GmxGen, GmlCppExtFuncs) to automate extension synchronization, meaning that you can write a function in your IDE of choice, compile it, and have it be available for invocation from GML immediately.
High-precision pointer polling
I made an extension that lets you get high-frequency position data from mice and tablet devices! Perhaps the ten or so people that make graphics software in GameMaker (and the person that paid me to do this) can appreciate such a thing.
Other GameMaker things
I made a GMS2.3 version of my HTML5 paste extension!
I rewrote my Window Freeze Fix basically entirely, though some of the issues are inherently un-fixable (e.g. you can’t tell Steam Overlay what to do) so I have another extension in the works, this time simulating the window border convincingly enough with in-game drawing instead of embedding the game window into another window.
I updated GMLive to support GMS2.3.7’s new syntax features and also to fix a few issues people reported.
I added more wrappers (such as non-P2P lobby chat) to my Steamworks extension, though you’d have to compile it yourself to make use of them (for now).
I made a GMS2.3 version of my GOG extension, which is nice because attempting to import it would cause the extension to magically pop out of existence for… reasons.
My proposal for local static variables have been approved for inclusion in the language! It’s one of those little handy things
I released a library for working with GMS2.3 YY files (which are off-spec JSON)
I updated my Haxe➜GML compiler with some small tricks (like printing JSDocs for GMEdit) and more externs.
I wrote a blog post about the various horrors of security on Discord.
Meanwhile, Discord founder teased crypto integration and (following public backlash) then said that “there are no current plans” to ship the feature, which is polite speak for “we won’t promise that we won’t do this later”
Patreon CEO discussed possibly getting into NFTs on a podcast and a very similar “no imminent decisions” response was given.
KickStarter announced going all-in on blockchain, all without mentioning a single thing that use of blockchain will improve upon vs existing systems.
Like decrepit corpses raised by a necromancer, long-forgotten social accounts of favorite artists sproing back to life to advertise the world’s newest pyramid schemes.
As Russia shuffles forces along my country’s border and demands for Ukraine to never be part of NATO (which’d mean being able to do this again and again with no consequences), rumors of possibility of large-scale invasion circulate again.
Evidently, Ukraine isn’t a highly desired candidate for neither EU nor NATO - I’d be surprised if we get into either of two in the next 20 years.
Kind of tired of all of this to be honest - I usually write posts during weekends, but it is hard to find motivation to do so when everything is vaguely on fire.