Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - time-killer-games

Issues Help Desk / Who is the smartest person in all of enigma-dev?
« on: January 04, 2021, 07:13:46 PM »
i cast 3 votes, 1 to each of them

Off-Topic / Converting a Linux user to FreeBSD be like.
« on: December 25, 2020, 08:07:04 PM »

I know what you are thinking: "Why not just use Arch?" My answer: The less GPL, the better. After all, FreeBSD is what all modern Sony and Nintendo consoles and handhelds (even the Switch) are based on for the permissive *BSD license. These companies produce stable and respected products with huge followings. What can be said about Linux? Android and Chromebook. From literally exploding Samsungs to constantly breaking external storage, to having everything stored in the cloud and monitored by Google, what's not to hate? It's obvious why these products suck. "Just anyone" can contribute and break anything they want to without testing the code manually.

If it passes the imperfect and ever-growing CI, they'll probably accept it. Bad idea when money and making a living is a non-motivator to hobbyist GPL devs. This prevents quality products on being delivered, which results in severe bugs, and a rather poopy OS as a whole. FreeBSD needs to be stable, otherwise companies with the tiniest bit of self respect won't look to them. Even apple shares some of FreeBSD ancestry in common for the same licensing debate. Money talks, even if you aren't the one making it but others who are relying on you are, you'll be much likelier to be motivated to deliver what they need and keep up the reputation as being reliable.

Additionally, the process filesystem is optional on FreeBSD. Linux has it mandatory, which results in slower applications that need to read and write to files for any kind of process related interaction, even something as simple as getting the current executable directory and filename, it requires creating, reading, and writing directories, text files, and symlinks for practically everything. The more processes you run, all the more will your computer be unnecessarily slow because of it. More processes = less performance regardless, but now we're just adding to that slowness for no good reason.

Another myth: commercial developers don't give back to the open source permissively licensed OS. Some of that is covered in this video.

Greetings from Brazil,

Announcements / Re: ENIGMOS - The Operating System for Attractive Women!
« on: December 22, 2020, 08:04:16 PM »
The previous img.xz file was removed temporarily because I noticed the Legacy BIOS boot was broken in the most recent update (UEFI boot would still work but less machines would be compatible as a result), due to a corrupt GPT backup header. This issue is being resolved and once the image is recreated and tested, I'll upload the new file and remove this comment as it will no longer be relevant by then. The VirtualBox image is still available in the meantime.

Tips, Tutorials, Examples / Running NGINX Server in GameMaker and ENIGMA
« on: December 20, 2020, 03:55:52 PM »
Running NGINX Server in GameMaker and ENIGMA

ENIGMA | GM Version: GameMaker Sudio 2.x or later (ENIGMA and GMS 1.4.x too but w/ different string handling)
Target Platform: Windows, (macOS and Linux/Ubuntu need slightly modified instructions)


ENIGMA users can ignore the download links for File Manager and Process Info above. Server and client interaction is very common in games and my Process Info extension allows you to do much more with that. For the time being, these extensions are not available in ENIGMA's main repository. File Manager is virtually the same as the upcoming official support for std::filesystem in ENIGMA, however I have several bells and whistles added in my repository such as the ability to pass environment variables directly to string arguments when in the form of, for example, ${VARIABLE}.

TL;DR ENIGMA users have to install ENIGMA from the instructions on my own repository instead to get the required extensions:

Then you may proceed with this tutorial.


Someone added me on Discord asking me how to do this with my Execute Shell extension, so I used that as an excuse to educate everyone here on a practical use case for my much more powerful extension called Process Info, hoping more people switch to using that extension instead of my Execute Shell and Evaluate Shell extensions, which are much less powerful and deprecated in favor of Process Info. They are also no longer actively developed and won't receive any feature updates. Use Process Info instead, it has a learning curve that is steeper, but you will learn to appreciate it with time as you learn what it can do.

Here I am explaining how to use Process Info more specifically on the topic of how to properly run your own NGINX server.


Download NGINX and extract the ZIP archive. Drag and drop all the files in the extracted contents, (if extracted to a new folder, the contents of that folder), into your GameMaker Studio 2.x window to add them as included files for your project to make use of them. Not just the nginx executable, but also the folders it depends on which are also included in the ZIP you extracted. Create a controller object obj_conttroller, create a blank room with a black background, and then drag your controller object from the resource tree into your room. Now your body is ready.

In the Create Event of your controller object...

General Initialization and copying all your files to where they need to be is the first thing we need to take care of before we can do anything else.

1) First, choose a process index, similar to a resource id like for a sprite or other stuff, but this will represent a unique instance of a running application so we can later get various information from it such as output that would show in the terminal or command prompt if something goes wrong you can further debug it with ease. I chose the variable name to be nginx because that is the name of the executable we are running here, and a value of 0 stored in the variable to uniquely identify the process index:
Code: (GML) [Select]
globalvar nginx; nginx = 0;
2) Next, we create the sandbox directory, using the game_save_id constant, which is a writable directory, the working directory won't always be writable, thus we are using the sandbox directory for that reason alone:
Code: (GML) [Select]
3) Then, copy the included files we have in our project (nginx and its associated files and folders) using my File Manager extension's directory_copy function:
Code: (GML) [Select]
directory_copy(working_directory, game_save_id + "files");
4) We need to set a new working directory to where we copied the included files to, using File Manager's set_working_directory(dname) function, like so:
Code: (GML) [Select]
set_working_directory(game_save_id + "files");and that will set the new working directory to the "files" subdirectory we copied into the sandbox folder game_save_id from the working_directory in step 3. It will also copy everything else the game depends on, not just the included files you previously drag and dropped onto the GameMaker Studio 2 IDE window.

Now we can write a batch file that will run nginx and we will write it directly to our sandbox, (not to be confused with what we set the working _directory to, which is the "files" subfolder within the sandbox folder game_save_id):
Code: (GML) [Select]
f = file_text_open_write(game_save_id + "nginx.bat");
file_text_write_string(f, @'cd "' + working_directory + @'" & "' + working_directory + @'nginx.exe"');

Notice above I also set the working directory of the batch file using the cd command, which is necessary to get this stuff working. Now for the good part; we are going to execute asynchronously an instance of a nginx web server process, but first, please notice I created a temp folder:
Code: (GML) [Select]
directory_create(working_directory + "temp");
process_execute_async(nginx, @'cmd /c @ECHO OFF & "' + game_save_id + @'nginx.bat"');

That temp folder is needed by nginx, otherwise it will complain in the process standard output that the folder doesn't exist. Notice there are two arguments to our process creation function, the second argument is the command itself, not the first. In the second argument we are running the batch file we created earlier found in our sandbox directory game_save_id.

The first argument of process_execute_asnyc(ind, command), on-the-other-hand, should be the global variable we set in the very first step of this tutorial, nginx as the variable's name and zero as its value to represent an index for the specific running application instance, which will be used to get process output for debugging purposes like mentioned earlier. That leads to our next step major step in this tutorial.

Done with Create Event. Now Draw Event / Draw GUI.

Now we are going to draw the process output to our game window in case something went wrong. If you followed this tutorial perfectly as described, no text should be drawn. In the code below you'll see I am setting a custom font named fnt_example, you will either need to create a font yourself that has this name or omit that line completely. The key thing is the text needs to not be cropped when drawn, so make the text small enough it is readable but will still fit in your game window or view-port for easy viewing. If you want to program a camera system to view the output text more power to you but that I won't be covering and it is a lot of unnecessary extra effort. The second line is where we actually draw the process output, should you have messed up following any steps thus far, text will draw and you will need to go back and review this tutorial to debug what the issue is based on what info is drawn.
Code: (GML) [Select]
draw_text(0, 0, process_output(nginx));

process_output(ind) will return the process output for the specified process index, that is, the running application process that was started using the exact same process index ind argument. To clear process output when you no longer need it and wish to free memory, call process_clear_out(ind) on the same exact process index value, in this case the value we have stored in the nginx global variable.

Done with Draw Event / Draw GUI. Now for Game End Event.

Now, create a Game End event in your controller object, and give it the following code to execute when triggered:
Code: (GML) [Select]
process_execute(999, @'"' + working_directory + @'nginx.exe" -s stop');
This will cause the nginx server to shut down automatically when you close the game, to prevent it running in the background after you are done with it. Notice I used process_execute(ind, command) which will run synchronously, unlike process_execute_async(ind, command) which is what we used earlier. For the process index ind argument I used 999 as the reserved value to represent this process to make room for other process indexes to be used throughout your program should you ever have the need to run 999 other processes (counting zero) simultaneously, this allows for that many if you count up without skipping a reserved value for each process you create. Though 999 is not required, you may use any ridiculously high number if you wish that is less than ULONG_MAX(=4294967295). The key thing is that every process you have running from your game or application must have a unique index when run and held in memory simultaneously. A process index also can not be negative nor can it have a decimal value.

To free a process index from memory, call process_clear_pid(ind) to get rid of the pid's (process identifer, not the same thing as an index) held in memory, as well as call process_clear_out(ind) to get rid of the process index's standard output strings held in memory.

In other words, for example:
Code: (GML) [Select]

The above can be put in your Game End event after the process_execute(ind, command) call for general code cleanup.

If you followed everything correctly, you should have the following code in your controller object:

Create Event:
Code: (GML) [Select]
globalvar nginx; nginx = 0;
directory_copy(working_directory, game_save_id + "files");
set_working_directory(game_save_id + "files");
f = file_text_open_write(game_save_id + "nginx.bat");
file_text_write_string(f, @'cd "' + working_directory + @'" & "' + working_directory + @'nginx.exe"');
directory_create(working_directory + "temp");
process_execute_async(nginx, @'cmd /c @ECHO OFF & "' + game_save_id + @'nginx.bat"');
Draw Event (or Draw GUI, either one):
Code: (GML) [Select]
draw_set_font(fnt_example); // optional line
draw_text(0, 0, process_output(nginx));
Game End Event:
Code: (GML) [Select]
process_execute(999, @'"' + working_directory + @'nginx.exe" -s stop');

Like normal when running the NGINX server executable, it will ask you for permission to access your local network, and which you will need to accept. You can view the server by typing in "localhost" in your favorite internet browser.

Happy Coding!

Announcements / ENIGMOS - The Operating System for Attractive Women!
« on: November 10, 2020, 06:52:47 AM »
Hello everyone!

I created a FreeBSD virtualbox image (and an image that can be flashed to a USB drive for those interested to boot like NomadBSD) that you may use to create games with everything you need to do that installed by default - showcasing the Xfce Desktop Environment customized to be themed around the game development software packaged with it - ENIGMA - as well as some basic apps for development. GIMP and GrafX2 for drawing and animating sprites, tilesets, backgrounds, and textures. Audacity for editing music you have composed or to touch up on your sound effects. mpv Media Player (the client library and command line app) for playing videos as cutscenes for your games or to preview them directly from a double click in Thunar File Manager. Engrampa for a graphical means to manage archives. OctoPkg for graphical package management. The FreeBSD GUI Wifi Manager, Firefox, Thunderbird, and all the default apps of the Xfce Desktop Environment - all essentials to having a complete desktop experience ready for game development - without the bloat. Also includes WINE and the Linux compatibility layer for running software built for Windows and Linux for convenience.

If you have a >= 32gb USB Flash Drive handy, boot from the flash drive itself when turning on a physical machine you have connected it to and as previously mentioned - similar to NomadBSD, although this is more targeted at game developers specifically, it is also a nice alternative to NomadBSD in itself. It even has a few nice things NomadBSD lacks, like a terminal you can drag and drop files onto, (NomadBSD's sakura Terminal is bad for this reason imo), or a task manager app for when an app chooses to not respond so you won't be completely screwed, which at the time of writing NomadBSD apparently lacks.

After you have booted, please note ENIGMA is installed under "/usr/local/bin/engima-dev/" and there is at the time of writing one example game pre-packaged with the distro. Under "/usr/local/bin/enigma-dev/games/" you will find my Key to Succes platformer game directory; in the form of an runnable executable therein (the file is literally named "executable") and the editable source code is archived in the same directory (that file is named "editable.tar.xz"). The editable can be extracted anywhere in "/usr/local/bin/enigma-dev/games/Key to Success/" without root access. This folder i rand "sudo chmod 777" on that folder so you can extract the archive ther with Engrampa Archive Manager for convenience. The "/usr/local/bin/enigma-dev/games/" parent folder is also not write protected so you may add your own game creations in there as well, and organize them by folder.

Interface Preview:

Install Instructions:

OS review by RoboNuggie (Thanks RoboNuggie!!!):

As mentioned in the video, Windows users can extract the *.xz file by downloading and using 7zip, Linux, *BSD, and Mac users and use the unxz command and Linux users will need the xz-utils package installed for that. Mac users also need to install xz-utils by some means.

For example Ubuntu users:
Code: [Select]
sudo apt-get install xz-utils
Mac users can install it via:
Code: [Select]
brew install xz
...although the macOS terminal command also requires that you have HomeBrew installed in advance with the instructions found at

The gorgeous desktop backgrounds used by the OS were created by ENIGMA community member HitCoder.

The download link lists the following files:

- FreeBSD-12.1-RELEASE-amd64-ENIGMA.img.xz

This is for writing to a usb drive, also can replace the OS your physical machine if you know what you are doing, using the FreeBSD gpart command from a live medium will be quite helpful if you want to expand your storage space from the initial size of less than 32gb to the size of your hard drive or partition. You may use a software like balenaEtcher if you would like to write to to a drive without needing to extract it manually or you can unxz + dd command it on Unix-like platforms such as Mac, Linux, or one of the *BSD's. Windows also has support for the dd command, but it is not available on Windows by default.

balenaEtcher supports Windows, macOS, and Linux: - works great, tested.

...or if you are on Windows, there is also Rufus here: - also works great in my experience.

...or for Windows if you just need to extract the *.xz: - untested, but should work.

...or dd for Windows for writing to a drive (untested): use at your own risk.

unxz and dd as follows (untested but who cares lel):
Code: [Select]
xz -d < /path/to/FreeBSD-12.1-RELEASE-amd64-ENIGMA.img.xz - | dd of=/dev/whatever
- FreeBSD-12.1-RELEASE-amd64-ENIGMA.vdi.xz

This is the virtual box image. Requires Oracle VM VirtualBox. - only available for Win/Mac/Lin

Extract the VirualBox image with (or use 7zip instead Windows users)
Code: [Select]
unxz /path/to/FreeBSD-12.1-RELEASE-amd64-ENIGMA.vdi.xz
You are now ready to follow the Installation Instructions found in the video above. Disregard VirtualBox-specific steps in the video if you aren't using the VirtualBox image.


I hope this attracts more people over to the ENIGMA and FreeBSD communities lel

Issues Help Desk / Re: Adding Sound causes "Game returned -1073741819"
« on: October 16, 2020, 07:47:17 PM »
You can get the dll you need here:

But it should already exist in your MinGW installation and the one I uploaded is probably outdated at this point.

I can't speak for DirectSound without more information. I never had issues with it using wav.

run in debug mode and use gdb like mentioned on the wiki. Wait until it crashes and give us a pastebin of the backtrace.

Announcements / Video Player Extension for ENIGMA Early Access
« on: August 12, 2020, 08:21:44 PM »
The pull request will be more up-to-date than the information and download available in this thread.

To get the latest scoop on what progress has been made, please check out the actual pull request:

Finally, official video playback functionality is being added to ENIGMA.

  -  Win32 games need MSYS2 installed along with the mpv/libmpv package to get all the deps.
  -  Mac users need to install mpv/libmpv via homebrew or similar package managers available.
  -  Linux and FreeBSD users may simply use their package manager as usual to install libmpv.
  -  Android support is also possible due libmpv has an Android build - so we have all platforms.

For early access to this extension, use the installer scripts provided at this repository:


General ENIGMA / Re: OpenSuse Support for Enigma
« on: June 09, 2020, 03:22:07 PM »
yeeeaah boi

Announcements / Cross-Platform External DLL Functions Now Supported
« on: May 03, 2020, 03:22:16 PM »
Hey guys!

Robert fixed our Windows functions for calling DLL's so that they can use strings correctly. I decided to add to this vast improvement by making these functions work on Mac OS X, Linux, and FreeBSD. Mac is still broken so it's not tested on there, but there's no reason why it wouldn't work, once the Cocoa and Mac SDL platforms get patched.

Functions introduced by this extension:
- external_define(dll, name, calltype, restype, argnumb, argtype[0], argtype[1], ...argtype[10])
- external_call(id, args[0...15])
- external_free(id)

Example project demonstrating the use of external functions:

Example DLL source code:

This means nearly all GameMaker extensions for Desktop Platforms should now work in ENIGMA out-of-the-box, whether for GameMaker Studio or older versions of GameMaker. Although you will need to set a compatibility mode for the version of GM your extension is built for in order to get window_handle() working. The only thing to be done is to convert your extension to use scripts with the external functions because we don't support GameMaker's special extension package formats yet. Due to POSIX and/or X11 compliance, a lot of Linux and Mac OS X extensions can be rebuilt and "just work" on FreeBSD in a lot of cases if you have the source code handy.

To get access to these new features, simply update enigma to the latest version and enable the "External Functions" extension like so:

You will also need to install libffi. Windows users should already have this installed because we've included it on our Windows Installation page for a long time now. As for everyone else, the dependency can be installed for your platform using the terminal commands below...

Ubuntu/Debian-Linux based:
Code: [Select]
sudo apt-get install libffi-dev
Arch/Manjaro-Linux based:
Code: [Select]
sudo pacman -Sy libffi
Code: [Select]
sudo pkg ins libffi
Have a wonderful day.

Off-Topic / Re: I just want to express my gratitude to you guys
« on: April 22, 2020, 08:54:57 PM »
Yeah, hopefully things will be more peaceful by the time you get back, and I'll be more proactive at watching my tongue. It's good to hear you haven't forgotten about us, and we all certainly haven't forgotten about you. Thank you for being such a positive person, it helps everyone greatly.

Announcements / Re: Announcing FreeBSD Support
« on: March 27, 2020, 08:18:09 PM »
You're welcome! :)

General ENIGMA / Re: Android Support viable!
« on: March 13, 2020, 02:27:36 AM »

Announcements / Announcing FreeBSD Support
« on: March 12, 2020, 09:15:29 PM »
Hey guys...

Here's a game by community member hpg678 running natively on BSD that was compiled with ENIGMA:

Waiting for Josh to finish some stuff with JDI, in the meantime, you can make games for FreeBSD using my branch; make sure you build with the clang compiler instead of gcc otherwise projects that use sound or audio functions will have a segmentation fault and won't run.

Install instructions:

Here's the pull request that adds support to FreeBSD for those waiting anxiously for it to be merged into master and want updates on it:


Announcements / Re: Regression Testers Wanted
« on: February 23, 2020, 09:03:32 AM »
I noticed a regression with my key to success game.  pressing space to unpause the game will also make the player jump, as though I pressed the spacebar twice in the same step, when i only pressed it once. So well done, you fucked up keyboard input. Also noticed some minor problems with the collision event, specifically once you've climbed up to the top of a ladder in some levels it behaves different than GM now. I'm too lazy to include a small test case reproducible for these two regressions, so feel free to gut away my key to success game yourself to narrow it down.

If you need further details on the collision bug I can provide a video if you aren't able to find out what I'm talking about on your own. The compiled executables are built with an older version of enigma which behave the same as GM, so you may use that as a reference. Ctrl+Enter to skip levels until you get to level 3 and that's where you'll notice the collision regression at the top of the ladder if you pay close attention, at the very beginning of the level..

Also what magical reason did you need to rewrite events for, if they were working just perfect previously, but they are not in this branch of yours?

You get mad at me for causing a so-called "regression" with Robert's game, but in his case it was a bad programming practice of his, not mine. What I did was take a bad implementation and made it a good one. He was using a string where it would make more sense logically by the function's name and purpose to use a number instead. Then you, as the big almighty project lead developer came out here with this big pr that potentially breaks every game made with enigma in existence, with both broken input and collisions, you out of arrogance are too afraid to merge my icon pull request, because of a "regression" I caused, that again, in reality, was just Robert being stupid and something really weird possessed him to put quotes around a number argument, turning it into a string for absolutely no reason. You blame his bad practices on my good practices. get_integer() should take a number, as the name implies, and as the function's intended purposes serve, it would only make natural sense it would take a number argument, yet you call Robert expecting to use a string where a number makes more sense to be used, "a regression".

I question the state your mental health if this is honestly how you feel, even now. Just don't use that crap as a weird-ass excuse to be afraid to merge my icon pr. As this pr of yours clearly demonstrates, you are more prone to killing the entire project than I am, where as I was very lucky to have very loosely-speaking "break" a single game. Do you have any idea how many games even use get_integer()? Robert's might have been the only one in our community that used it. You, on the other hand, broke our entire input and collision systems, in ways that are very specific, quirky, and extremely hard to narrow down, and debug, the root causes for it.

Good day to you, ween.

Announcements / Re: Taking on Xinerama dependency on Linux
« on: February 15, 2020, 11:04:33 PM »
I wonder what idiot whose pull request is responsible for this.