A small guide on writing interpreters, part 2

label hello: select dialog("Hello! What would you like to do?") {
    option "Count to 5":
        for (var i = 1; i <= 5; i = i + 1) {
            wait(1);
            trace(i + "!");
        }
        return 1;
    option "Nothing": jump yousure;
}
label yousure: select dialog("You sure?") {
    option "Yes": trace("Well then,"); return 0;
    option "No": jump hello;
}

Example of supported syntax

As some might remember, earlier this year I have published a small guide on writing interpreters, which went over the process of implementing a basic interpreter capable of evaluating expressions consisting of numbers, operators, and variables.

This continuation of the guide further expands upon concept, outlining how to support calls, statements, and branching - enough for a small scripting language.

Continue reading

GameMaker: Checking whether a string is a valid number


Some things are numbers, some aren't

GameMaker Studio 2.2.2 released few days ago, bringing, among improvements, "GML consistency", which changes how automatic type conversion works in corner cases.

A little less known thing, together with that it also changed how GameMaker's string-to-number conversion function (real) works, having it throw an error if your string is definitely not a number.

A slight inconvenience, given that there is not a function to check if a string is a number before attempting conversion.

But, of course, that can be fixed.

Continue reading

A yellow accent skin for GameMaker Studio 2 (and how to make your own)


(click for full-window version)

As it becomes increasingly more apparent that many people are completely unware of GameMaker Studio 2 having a light skin and fail to recognize it as being GameMaker as such, I have decided to stop using it for screenshots in my assets/blog posts.

However, the default dark skin is a little boring, so I decided to make a custom one with a familiar yellow tone for accents. This also doubles as a general explanation on how to make skins.

Continue reading

GameMaker: sprite_add_sprite in Studio / Studio 2

On this fine day[1], we're[2] proud to announce that we're bringing back everyone's[3] favourite GameMaker 8.x function!

That's right, we're bringing back sprite_add_sprite! 🎉

Now, you might be thinking either "this is not what I've expected" or "this is exactly what I expected [after reading the title] and I only have more questions now". You see, there's not always justification for things happening, sometimes they just do.

Should you actually need this function or if this introduction got you curious, take a seat and let me tell you a story (and some code),

Continue reading

GameMaker: draw_sprite_ext_skew

(click to interact) (mouseover/click to play GIF) Drag sliders and click things (if JS is enabled)

This post is about a slightly fancier version of draw_sprite_ext - maybe you want to apply skewing/shearing to the sprite, or scale it after rotating it, or use a 2d matrix transformation.

The built-in function isn't made for that, but, with a little bit of math and draw_sprite_pos, you can have a script for this.

Continue reading

GameMaker: Formatted date output

(click to interact)

This is a small post about a replica of the strftime function seen in PHP, C standard library, and a handful of other APIs. Such a function takes a date-time and prints it according to the given format string.

The script supports the common formats and those that mapped reasonably to GML functions.

Continue reading

GameMaker: Microtester

Performance tester/comparator for GameMaker
And other reasons to avoid overusing reflection

On this fine day I have published the project that I use to compare relative performance of different approaches to algorithms. It aims to get a few things right with this:

  • Tested scripts are re-shuffled between runs to lower execution order/CPU cache bias.
  • Script call time can be excluded if you are comparing approaches rather than actual scripts.
  • Easy to use - you add scripts that you want tested to the project, specify how you want them to be called, and that's it.

The project can be found on GitHub.