This post serves as a collection of descriptions and links to various GameMaker-related assets and extensions that I have published over time.
Back when publishing it in 2017, I thought it was longer than expected, but it had since grown about twice in size. At least the blog has that "navigation" sidebar now.
Also should answer the "how do I support your work" question that some readers have.
2021 note: I regret to inform that I have now made too many things to comfortably fit in a single huge blog post. While I'm figuring out a better way to present this, I recommend taking a look at my itch.io page that has all of these shown in a grid layout.
Mini-FAQ
How do you price your assets?
Pricing is pretty straightforward, being based on how long it takes to make and how popular I can expect it to be - after all, the ideal case scenario is to make your time investment back in sales.
Consequently, this also means that some ideas stay on "todo" list for a long time if they require a substantial amount of time to make but are too exotic to sell at an anyhow accessible price point.
How are some of these free?
I release assets as free/pay-what-you-want if:
- Someone paid me to make the thing and was happy with having it publicly available as well (e.g. Steam/GOG/Discord wrappers)
- I made the thing for some personal project and determined that there shouldn't be substantial maintenance costs if I release it for free.
Why do some assets cost more on GM Marketplace than on itch.io?
By default, itch.io takes a 10% cut of each sale.
(you can adjust this and I have mine at 11%, but let's use 10% for simplicity)
GM Marketplace, on other hand, uses an "industry standard" 30% cut.
So MP assets are priced accordingly (+28%, rounded to nearest good-looking number) and I receive about the same amount of money no matter whether you bought my assets on MP or itch.io...
... unless you bought them in Steam version of GameMaker with Steam wallet money! Then Valve also takes a 30% cut, which, combined with YYG's cut and VAT, lands us at just about 35-45% of transaction making it to me. Pretty cool, huh? And then there are taxes too.
Essentials
GMLive.gml (live coding)
(mouseover/click to play GIF) If you're wondering, that's just how the light theme in GMS2 looks.
GMLive is generally regarded as my best asset to date - it lets you update code, artwork, and rooms while the game's running - you mark things for live update before running the game for the first time (generally through a single function call), and then saving the resource will automatically update them in-game.
If you are doing something that requires quick iterations (UI, animation, timing, procedural generation, parameters), GMLive can turn countless minutes of waiting into literal seconds, saving hours in the end.
The extension can be used locally, when running on a remote machine, on mobile devices, and even when running in browser (GMS2-only; currently requires running in debug mode or this free extension to support current-script name discovery)
Versions: GMS1, GMS2
Platforms: All (GMS2), All except HTML5 (GMS1)
Price: USD 29.95
Links: blog post
· itch.io
· marketplace
· documentation
GMRoomPack (room loading)
To put it simply, this extension allows you to easily inject GM rooms into other GM rooms while the game is running. This can be used for procedural generation, chunked loading (making it manageable to do massive open-world games in GM), prefab systems, or external loading (DLC/etc.).
The extension also offers a simple JSON-based format for generated data,
Versions: GMS1, GMS2
Platforms: All
Price: USD 4.95
Links: itch.io
· marketplace
· documentation
Tools for advanced users
(... and people that might not consider themselves advanced users but still make big games)
GMEdit (code editor)
GMEdit is an external code editor for GM:S/GMS2 projects with focus on workflow. With a variety of syntax extensions, keyboard shortcuts, custom themes, and plugin support, the editor allows to write and navigate through code faster than ever.
Versions: GMS1, GMS2
Platforms: [editor runs on] Windows, Mac, Linux
Price: Free
Links: itch.io
· source code
· documentation
sfGML (classes, types)
While GML is a perfectly good language for writing the actual game code, attempting to use the language for complex systems offers a similar set of problems and challenges as you would have in JavaScript - the language lacks compile-time type checking and has its own set of type quirks that can make debugging a mistyped data structure variable a bit of a trouble.
sfGML offers a solution to this problem - it is a compiler for a high-level, strictly-typed language called Haxe, which has classes, interfaces, high-end macros, null safety, and everything else you would or would not expect to have.
And then this wonderful code of yours can be compiled into GML code, thus getting you your compile-time checks and sanity without imposing any runtime overhead that you would have if you packed your system code into native extensions.
You can read a bit more about it on my "works" page.
Versions: GMS1, GMS2
Platforms: All
Price: Free
Links: itch.io
· source code
· documentation
catch_error (error handling)
Error messages display can be considered one of the weaker points in GameMaker - default error dialog boxes look unappealing, confusing to player, and give no incentive to actually copy the error, having you often hear that the game "had shown an error message and closed" without ever getting to know what the error message was.
This extension addresses that - you can choose how to present the errors (and whether to present them at all), as well as having the option to not have the game close upon encountering majority of "fatal" errors.
Combined with Sentry, you can even have automatic error reporting!
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 14.95
Links: itch.io
· marketplace
· documentation
RerouteAudio (organize audio files on export)
GameMaker's Windows export has a small but unfortunate flaw: any audio files that were specified to be external ("streamed") are always put into the game's root directory, which, given enough of them, makes it harder to find the game itself in the pile of audio files.
While workarounds existed (like using audio_create_stream or self-extracting archives), these came with either organizational of performance overheads.
This tool addresses that, allowing to auto-sort audio files into subdirectories based on name patterns, subsequently updating the game data to look for them in new places.
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 6.95
Links: itch.io
· marketplace
Fixing the built-in functions
Some things might not work like you'd expect them for legacy reasons, but that's a fixable oversight.
Improved INI functions
Built-in functions have a number of minor oversights - from only being able to work with one file to not preserving comments on changes to straight up breaking upon writing multi-line strings. You can see my blog post for more information.
This extension fixes all of that. It preserves comments and structure. It supports escape characters. It can iterate over sections/keys and will not error even if your INI file is actually just garbage data.
Versions: GMS1, GMS2
Platforms: All
Price:: $3.99
Links:: itch.io (has demo)
· marketplace
· documentation
Improved JSON functions
Akin to above, but addresses flaws in built-in JSON functions instead, which also have a set of issues, even allowing for data access attacks (causing the game to read/modify different data structures than those retrieved from JSON) given a specifically crafted JSON string.
And, much like above, offers an implementation that fixes all of that.
But wait, there's more:
- You can tell whether a value you'd just read is an array/object/etc.
- You don't have to manually destroy your JSON objects.
- Recognizes JSON booleans as a separate type.
- Decoding is straightforward - if you decode "[1,2,3]", you get an array; if you decode "4.5", you get a real. No "default" keys. [similarly, you can encode any supported value type]
Versions: GMS1, GMS2
Platforms: All
Price:: $3.99
Links:: itch.io (has demo)
· marketplace
Improved DS functions
Fixes a number of various annoyances with built-in data structure functions, making them safer to work with while also allowing to easily enable/disable checks for no performance impact in final builds.
Versions: GMS1, GMS2
Platforms: All
Price:: $4.95
Links:: itch.io
· marketplace
Prevent window from freezing while dragged
Suppose you made an online multiplayer game and now you suddenly find that there's a minor inconvenience happening whenever the player drags the window around - the game freezes while doing so.
The underlying problem goes deep into WinAPI and is not easy to address without causing other side effects, but this extension offers a pleasant workaround - you make your game borderless, and when you do need a border, it is inserted into a blank window that the user can drag around (thus without freezing the game).
Versions: GMS1, GMS2
Platforms: Windows
Price: Free
Links: itch.io
BMFont converter
While GameMaker's font generation algorithm had seen substantial improvements over time, select fonts might still look slightly off. Or you might want to embed one or other effect into your font.
This small tool takes fonts in widely supported BMFont format (generated by BMFont itself or countless other tools) and generates GameMaker font files for them.
Versions: GMS1, GMS2
Platforms: Windows
Price: Free
Links: itch.io
Quality-of-life features
Native cursors
Little known fact, drawing your cursor in-game can have anywhere from 0.5 to 2.5 frames worth of latency (on average) depending on GPU settings and double/triple-buffering. The issue becomes furthermore apparent if the player's screen has a higher refresh frequency than your game's framerate.
This extension addresses that, allowing you to utilize system-level cursors, which have as little visual latency as it is technically possible.
Versions: GMS1, GMS2
Platforms: Windows, HTML5
Price: USD 1
Links: itch.io (has demo)
Native mouselock
Constraining the mouse is a surprisingly tricky matter - it might be tempting to just window_mouse_set every frame, but in doing so the mouse can still escape the boundaries, as your game code can never run as fast as the mouse is polled (which is up to 2500hz).
This extension addresses that, interfacing with a system-level API to grant you perfect mouselock.
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 1
Links: itch.io (has demo)
Extending games
When your game is finished and popular enough, people might start asking for some form of modding support, and that's a doable thing now.
Apollo (Lua modding)
Allows to execute Lua code in GameMaker games, permitting to use it for debugging, mod support, scripting, and numerous other purposes.
You can have Lua access GM functions, scripts, instances, and variables.
With being able to define what should be accessible, this allows for "deep" integrations and high-level scripting API design for GameMaker games.
Comes with a GML->Lua converter to simplify learning process.
Versions: GMS1, GMS2
Platforms: Windows, Mac, Linux
Price:: $14.99
Links:: itch.io (has demo)
· marketplace
· documentation
TXR (GML-ish modding)
TXR is a demo project for my series on writing custom interpreters. It lets you compile and run snippets of GML-like code.
This can be used as a replacement for execute_string, for small-scale modding support, dialogue systems, or numerous other purposes.
You can choose which scripts to expose to interpreted code, have it access instance variables, process arguments, pause/resume execution, save/load execution state, inspect execution state, etc.
This is obviously a little less fancy than having Lua, but it does work on all platforms.
Versions: GMS2
Platforms: All
Price: Free
Links: Documentation
· itch.io
· marketplace
· source code
Posts: part 1
· part 2
mod.io (mod platform)
A wrapper for the universal mod platform from creators of ModDB.
Versions: GMS1, GMS2
Platforms: All
Price: Free
Links: source code
Platform integrations
Steamworks.gml
Expands GameMaker's set of Steam-related functions to include Steam P2P networking, Steam Matchmaking, and related APIs.
Versions: GMS1, GMS2
Platforms: Windows, Mac, Linux
Price: Free
Links: itch.io (example)
· source code
· documentation
Steamworks.gmk
Offers a set of basic Steam-related functions (stats, achievements) for games made with older versions of GameMaker.
Versions: GM5..GM8.1
Platforms: Windows
Price: Free
Links: source code
GOG.gml
A wrapper for achievements, stats, and leaderboards for GOG's Galaxy SDK.
Versions: GMS1, GMS2
Platforms: Windows, Mac
Price: Free
Links: itch.io (example)
· source code
· documentation
Discord.gml
A wrapper for Rich Presence, P2P networking, and matchmaking from Discord store's Game SDK.
Versions: GMS1, GMS2
Platforms: Windows (should build for Mac/Linux fine though)
Price: Free
Links: source code
GMS1-specific
These extensions address oversights that had since been corrected in GMS2
Buffer (de-)compression
Utilizes zlib to add equivalents of GMS2 buffer_compress/buffer_decompress functions to GMS1.
Can also be used in GMS2 to utilize different compression levels.
Versions: GMS1, GMS2
Platforms: Windows
Price: Free
Links: itch.io
· marketplace
· documentation
Non-sandboxed filesystem
While GMS2.2.3 had finally introduced the option to disable sandboxing on desktop platforms, preceding versions (and GMS1) do not have such a privilege.
This extension addresses that, offering a wide range of replacements for built-in functions that do not mind the sandboxing rules.
You can read and write files in the game directory, My Documents, or wherever else your heart desires (and OS allows).
Is fast, compact, and has zero dependencies. Comes with C++ source code.
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 3.99
Links: itch.io (has demo)
· marketplace
· documentation
Convert DnD to GML code
If you have ever tried importing a GMS1 project with DnD blocks into GMS2, you might have noticed that the generated code for them is... not very readable. Let's put it that way.
This tool automatically converts DnD blocks into code using hand-picked rules, which makes for far more readable code and preserved comments / structure.
Versions: GMS1, GMS2
Platforms: Windows
Price: Free (web), USD 3 (native)
Links: itch.io
Purpose-specific
I appreciate your dedication to scroll this far through this post.
The following are useful for specific occasions and close to useless for an average game.
Take input from multiple mice/keyboards
Ever wish your game could differentiate between different mouse/tablet/keyboard devices like it can differentiate between gamepads? This might seem impossible because of how uncommon such functionality is in games, but it is not - it's rather that the approaches required are so obscure that they are barely ever implemented.
This extension goes through that trouble and wraps these in a convenient package.
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 14.95
Links: itch.io (has demo)
· marketplace
· documentation
Generate ZIP archives
This extension allows your GM games to generate perfectly valid ZIP archives.
Complimentary to the build-in zip_unzip function.
Versions: GMS1, GMS2
Platforms: All
Price: Free
Links: itch.io
· source code
Flash the game's button in taskbar
This tiny extension lets you flash the game's taskbar button to signify something happening or demand attention from the player. Handy for letting the player know that something happened while the game is not focused.
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 1
Links: itch.io (has demo)
· marketplace
Show a progress bar inside the game's button in taskbar
This similarly tiny extension allows you to display a progress bar of one or other kind inside the game's taskbar button.
Did you know that some people use GameMaker to make software, and not just games?
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 1
Links: itch.io
· marketplace
Take screenshot of part/whole desktop
Suppose you decide to make a screensaver, or a GIF recorder, or one of those games that let you use your desktop background. Perhaps a better snipping tool? Rest assured, you want to be able to do something about the pixels not just inside your game window.
This extension gives you that - the ability to capture arbitrary pixels of screen - even in multi-monitor setups. And a couple other helper functions too.
Versions: GMS1, GMS2
Platforms: Windows
Price: USD 4.95
Links: itch.io (has demos)
· marketplace
· documentation
Run/forbid window commands
Suppose you want to show "are you sure you want to exit" popup, or minimize a borderless window when clicking a custom "minimize" button, or similar things. With this extension, you can.
Versions: GMS1, GMS2
Platforms: Windows
Price: Free
Links: itch.io
External log window
A tiny extension and a server helper that let you forward debug messages to a separate window instead of relying on GM's output or printing to files.
Versions: GMS1, GMS2
Platforms: Windows
Price: Free
Links: itch.io
HTML5-specific
The following either only work on HTML5, or bridge inconsistencies between native and HTML5 targets.
Allow Data URIs
This small extension enables majority of built-in functions to accept base64 (e.g. data:image/png;base64,...), which makes for one less problem when implementing interoperation between GML code and JavaScript.
Versions: GMS1, GMS2
Platforms: HTML5
Price: Free
Links: itch.io
Allow pasting text/files
Allows your game to listen to browser paste events and grab data from them.
Versions: GMS1, GMS2
Platforms: HTML5
Price: Free
Links: itch.io
Eliminate the stall on first file read
You know that thing where your game freezes for a moment when you first read a nonexistent file via default (synchronous) functions? This is because it must check if it happens to exist in game directory on the server first.
This extension essentially lets you skip that check if you know that the file cannot possibly exist in the game directory (e.g. it is a save file)
Versions: GMS1, GMS2
Platforms: All
Price: Free
Links: itch.io
HTML5 loading screen
Simple, configurable, and even supports animations.
Versions: GMS1, GMS2
Platforms: HTML5
Price: Free
Links: itch.io
· blog post
Screenshot save dialog
A tiny extension that adds a unified API for letting the player save screenshots of the game to their computer with a conventional file picker.
Versions: GMS1, GMS2
Platforms: Desktop, HTML5
Price: Free
Links: itch.io
High-precision get_timer
Makes get_timer function actually have microsecond precision as it is supposed to.
You want this if you are doing any performance comparisons.
Note that most browsers now "fuzz" the timings slightly to prevent side-channel attacks, so make sure to do your thing more than once before comparing timings.
Versions: GMS1, GMS2
Platforms: HTML5
Price: Free
Links: itch.io
debug_get_callstack
As of GMS 2.3.3, debug_get_callstack only returns original script names when ran in debug mode. This extension delpoys a small workaround that causes script names to be reported in non-debug as well.
Versions: GMS1, GMS2
Platforms: HTML5
Price: Free
Links: itch.io
PointerLock
As you might know, browsers do not allow the visitor's cursor to be moved about - they instead offer a "PointerLock" API, which locks the mouse at its current position and reports "movement offset" events while it is locked.
This extension offers a unified API for HTML5 and native platforms.
It can also be used in combination with above extension to ensure that the player cannot click outside the game window on Windows if they move the mouse really fast.
Overall intended for games that use mouse movement for mouselook (e.g. first-person games) / other non-point-at purposes.
Versions: GMS1, GMS2
Platforms: Desktop, HTML5
Price: Free
Links: itch.io
Conclusion
It would appear that I made a lot of stuff over time.
Hey people!!!!!
Good mood and good luck to everyone!!!!!
Wow, so many good things in here. Any of them let you use instances as classes? I come from a more traditional programming background and wonder if there’s a straightforward way to do this. I think with functions being first class citizens now, we could make a base smart object and dynamically assign methods there, but since you have done so much work I wonder if there’s a better way with your custom classes and editor.
In GMS≥2.3, constructor functions and methods act as classes
https://yal.cc/gamemaker-2-3-syntax-in-details/
For older versions, GMEdit has syntactic sugar for mapping an array and script calls to conventional syntax https://github.com/GameMakerDiscord/GMEdit/wiki/Using-type-magic
Instances aren’t usually used as classes unless they represent a visible entity.
Just got TJSON today and while reading this post saw it wasn’t mentioned here. Is there a reason for that? It really helped with my issue! Thank you Vadim!
It is! “Improved JSON functions”
A lot of good work, GMLive is a life saver. (Both of them, I use yal.cc/r/gml constantly too).
Quick question, does your Mouse Extension allows to take the input of the other buttons? Like the Side Buttons (Mouse 4, Mouse 5, etc…)
I’ve seen this asked more than a few times so I wrote a small post https://yal.cc/poll-x1-mouse-buttons/
Thanks for the explanation! I had no idea it was possible to get the input with keyboard_check_direct.
Would you consider making something to fix the current GMS1 problem with HTML5 games?? They run at the same rate as the monitor’s refresh rate, rather than the step speed specified in the room, so if it’s higher than 60 it’ll probs be too fast.
My dream would be see an Apollo-JS working on in native platforms plus HTML5.
I’m impressed by your projects. I’ve already tried some of them and now I’m truly looking forward to buy the Apollo extension @ç@