Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

YellowAfterlife

2,101
Posts
5
Topics
3,376
Followers
38
Following
A member registered Oct 01, 2014 · View creator page →

Creator of

Recent community posts

GMEdit gets the user folder name from um.json, so if the GM IDE logs you out (which it now does more often!), GMEdit can’t figure out where it’s supposed to look for your project state files.

As per note that shows when you hold the mouse over the “color font” option, support varies - for these to semi-consistently show up across major browsers, you need to supply 4 (!) different color font formats, and the library that I use to generate the final TTF/OTF fonts only implements one.

You can change Output➜Countour Type to Outline, but your actual issue is that the in-game font size doesn’t match the font very well and thus your font is getting interpolated at your expense.

You already can using /color red and alike (also accepts #rrggbb), or disable outlines using /outlines.

Зараз ситуація така, що вчора я завантажив 100r6 з 23 виправленнями, а за наступні 12 годин люди знайшли ще 6 багів, тому зараз в TODO списку їх 25.

Може я ще встигну випустити якусь u100 бету NTT до нового року, але я б не сподівався на стабільну багатокористувацьку гру.

If anyone’s wondering, the problem was that the author mixed up Window Freeze Fix (the test project of which is called window_frame) and Gameframe, and I guess Window Freeze Fix is even less stable in latest GameMaker than it was before.

Hm, so I imported the gameframe test project into the same GM version as you’re using, and it seems to work normally, including with this

if (keyboard_check(vk_space)) {
	window_set_position(window_get_x(),window_get_y())
	show_debug_message("re-positioned!");
}

If you can send me an email, I can send you a YYZ and you can see if you can get it to misbehave

Generally makes me think that you have something else going on that causes this weird interaction.

(1 edit)

Gameframe does not modify those built-in functions, so you should start with testing whether they work as intended in an empty GameMaker project (without Gameframe) that has the “borderless window” option enabled. Sometimes things break with GM updates

In GameMaker, application surface is a still surface so all normal rules apply to it - you might do gpu_set_colourwriteenable(1, 1, 1, 0) when you definitely don’t want to deal with alpha, for example

The plan was to work on NTT around mid-December after I finish fixing bugs in the base game, but in the past week Russia has renewed interest in destroying energy infrastructure in my region so it might take a while longer.

Unless someone made a mod for it, there is not - the loadout menu only works with one player and was hidden in coop mode in base game too.

I’ve had a major release on a work project (it’s Nuclear Throne!) last week so I’ve not been able to look into this yet, but we’ll get there; I did receive your email.

Hello, on a glance that should work.

  • What platform is this on?
  • What GameMaker version are you using? Can double-click the version in top-right corner of the IDE
  • Any errors/warnings in the Output?

There’s a contact email on the website

That would be a question for JW (I’m only responsible for technical parts once their design is figured out), but IIRC the plan is to update the various Vlambeer games before thinking of anything else.

Currently you can access the latest NTT version on the “ntt_development” branch on Steam. It doesn’t have u100 content yet, but does have more or less all bug fixes/optimizations.

An actual u100 NTT version will come slightly later because I’m also the person that fixes most of the weird bugs in the update.

On Windows and Linux, display_mouse_get_x and display_mouse_get_y poll the current mouse coordinate directly from the system, but you are still bound by when the game finishes drawing and the window contents update.

The system cursor, on other hand, is drawn on spot whenever the system sends the image to the display, so that’s always slightly ahead of what you can get by drawing in-game.

Yeah, that’s not great - there are two main ways to hide a taskbar button, and this is the one that doesn’t cause oddities due to having a second hidden window.

In 2024.14 you have to tick the “Use legacy DXGI_SWAP_EFFECT_DISCARD” checkbox

Send me an email with the font file if you might, but if I were to guess, you are going past 65535 kerning pairs total and FontHX (the underlying font generator library) doesn’t know that it should split them into multiple kerning sub-tables at that point.

Writing yourself a script that adds kerning pairs using FontForge’s API could be a workaround.

If you can reduce this to a small test project on the latest extension version, email me a copy.

function name() {} has been historically quirkier than name = function() {}, but it’s not illegal as of latest GMLive

If your game is non-commercial, you can compile the extension from source code and use it. It does take a little effort though.

Haven’t noticed that this was marked as spam

Would need the error message at the very least

That’s mildly mysterious, good that it works after a reinstall, but… huh

In the description you can find links to the blog post explaining how I did everything and to the source code. The latest Godot versions have stencil buffer support so it’s now possible to do this slightly better, but I haven’t had time to experiment with this myself.

(1 edit)

Built-in enums are new and a bit of a funny matter because they are defined in fnames like this

AudioEffectType#*

??AudioEffectType
Bitcrusher?#*
Delay?#*
Gain?#*
HPF2?#*
LPF2?#*
Reverb1?#*
Tremolo?#*
PeakEQ?#*
HiShelf?#*
LoShelf?#*
EQ?#*
Compressor?#*

But you can do this for now in the end of obj_gmlive’s Create event

var e:live_enum = live_enum_create_builtin("AudioEffectType");
e.h_add("Bitcrusher", AudioEffectType.Bitcrusher);
// ... more h_add() calls for enum items

I recommend using 1.4.1804, but if you have to use a version where macros and function overriding don’t work, you’ll have to delete the gameframe_macros.gml file from the extension using GM IDE (“expand” the extension resource, then right-click the file), rename the one use of __display_set_gui_maximise_base in gameframe.dll to be display_set_gui_maximise, and restore GUI size manually after calling gameframe_draw.

Window Freeze Fix avoided the freeze on moving the window by embedding a borderless game window into another window, but this revealed to have a number of caveats

Gameframe avoids the issue by drawing a custom frame in Draw GUI event and simulating the common window operations (move, resize, maximize, etc.) with either what GM offers out of box or through a DLL.

Each build script updates the extension within the respective GM test project folder, for GM:S / build-14.hxml that’s gameframe.gmx\extensions\gameframe.extension.gmx.

The message is harmless and is a leftover from debugging something.

For included files, you can open their properties (using the three-line menu in the asset browser) and untick all platform checkboxes for them. These are supposed to be unticked after importing the extension, but something happens sometimes somewhere along the way.

If that doesn’t do it, you can move the GMLive folder out of datafiles to sit in your project folder - it’s not in Included Files because it has to be there, but because this is the easiest way to bundle some files that will be easily observable by the user and will update when you re-import the extension.

Ultimately, flipping live_enabled to false (manually or using a configuration - see above) is the only thing that matters here. The server the simpler part of the extension and isn’t useful on its own.

Какие скрипты, что перегораживают? Debug mod выводит лишь, что было сделано в результате выполнения команды (скажем, что вы теперь можете умирать / не умирать)

Если мод постоянно выдает ошибки, нужно брать версию NTT, под которую мод сделан, или сообщить автору.

Per description, this is a DLL for Windows, so it works on Windows.

Some platforms have their own APIs for per-device input, but these are all different enough that it would be a complete rewrite for each platform.

Keyboard/mouse input is second-class on consoles so I would be surprised if any had a way to poll these individually.

Hello!

The extension doesn’t try to perfectly mimic the Windows title bars/borders because the most reliable way to do that is to have a secondary window wrap around the game window, which is what Window Freeze Fix did, and which is why it had so many oddities - although nested windows are a core feature of Windows, plenty tools don’t expect games and software to use this or don’t handle the various edge cases.

Fullscreen transitions are done using gameframe_set_fullscreen.

You add live calls to events/functions that you want to live-reload! The cost of having a live call in a place that’s not been live-reloaded this run is minor, but still GMEdit shows the badges as a reminder that you can eventually remove these when you’re done with that code.

(2 edits)

This isn’t about the server, but rather that live_call is what runs the live-reloaded version of the event/function once we have one - you can’t just do obj_some.create = new_function or scr_some = new_function in GML.

JS live reload is different because typically (like with nodemon or live.js) it simply restarts the app / reloads the page on JS changes. On GM terms this is an equivalent of compiling-running the game again and saving-restoring the window position or using window_embed_into to insert the game window into a container window.

I’m not getting any other errors in your test project with these settings either, but are you getting the original method_get_self error after making these changes? I’m noticing that your screenshot above doesn’t have it

If you are only getting it in your main project with latest GMLive, you could find this bit

	static h_set_func = function(l_func) {
		var l_rawFunc;
		if (is_method(l_func)) {
			l_rawFunc = method_get_index(l_func);
			var l__self = method_get_self(l_func);

and replace it with

	static h_set_func = function(l_func) {
		var l_rawFunc;
		if (is_method(l_func)) {
			l_rawFunc = method_get_index(l_func);
			var l__self;
			try {
				l__self = method_get_self(l_func);
			} catch (e) {
				l__self = undefined;
				show_debug_message("Error getting method self for " + self.h_signature + ": " + string(e));
			}

Can you also post a screenshot of your HTML5 preferences? I’m doing this here (is that the default?) and I’m not seeing your error, but I’m seeing some other things:

audio_group_name crashes for lack of an audio group

Where did it go

You can find this bit

	for(var l_i=0;l_i<256;l_i++){
		var l_agn=audio_group_name(l_i);
		if(l_agn==undefined||l_agn==""||l_agn=="<undefined>")break;
		live_api_asset_add(l_agn,l_i);
	}

And replace it with

	for(var l_i=0;l_i<256;l_i++) try{
		var l_agn=audio_group_name(l_i);
		if(l_agn==undefined||l_agn==""||l_agn=="<undefined>")break;
		live_api_asset_add(l_agn,l_i);
	}catch(_){}

Sprite reloading

After fixing the sprite_set_live call to use the right sprite, it turns out that you can’t buffer_save ➜ sprite_add anymore..? But that’s okay, 2024.11 supports Data URIs, so you could find this

				var l_tb=buffer_base64_decode(ds_list_find_value(l_frames,l_i1));
				if(l_tb==-1){
					live_log_script("Error: couldn't decode base64 for "+l_name+".",2);
					continue;
				}
				buffer_save(l_tb,l_tmp);
				buffer_delete(l_tb);

and replace it with

				if (os_browser == browser_not_a_browser) {
					var l_tb=buffer_base64_decode(ds_list_find_value(l_frames,l_i1));
					if(l_tb==-1){
						live_log_script("Error: couldn't decode base64 for "+l_name+".",2);
						continue;
					}
					buffer_save(l_tb,l_tmp);
					buffer_delete(l_tb);
				} else l_tmp = "data:image/png;base64," + ds_list_find_value(l_frames,l_i1);

… but that will not save you, for sprite_assign is non-functional on latest runtime - the sprite becomes transparent and its sizes are reported as -1.

Perhaps you could workaround this by rewriting that whole block of code to use sprite_replace ➜ sprite_add_from_surface, but I wouldn’t be too hopeful about stability of those functions either.

That is the latest server; the extension version is printed to Output/browser console (see above), or you can check the build date in the beginning of “Extensions ➜ GMLive ➜ GMLive” script. With sufficiently poor luck you may have to remove the Extensions ➜ GMLive folder before re-importing a new YYMPS.

For debugging, you’ll want to press Continue a few times until you get to this error in particular, though if you are completely unfamiliar with using a debugger, you might instead email me your test project after you make sure that the extension is the newest version.

(1 edit)

If you tick “pause on caught extensions”, the debugger will pause when this error happens and you will be able to click through the previous items on the Call Stack to see which function it was going over when this happens.

However, I have just re-downloaded the latest YYMPS from Itch, imported it into a new project, and that works fine:

Entering main loop... test23.js:85325:47
[GMLive][28/09/2025 22:26:36] GMLive.gml v1.0.76 for GM2022+
[GMLive][28/09/2025 22:26:36] Initializing...
[GMLive][28/09/2025 22:26:36] Indexing assets...
[GMLive][28/09/2025 22:26:36] Indexed OK!
Audio Engine => Loading
[GMLive][28/09/2025 22:26:36] Trying to connect to gmlive-server...
Application Surface created: w=640, h=360
Audio Engine => Suspended
[GMLive][28/09/2025 22:26:36] Ready!

Are you sure that you are on the current version of GMLive? Based on your gmlive-server build date, it seems that you are on 2024.2 minifix from March last year, and I have to fix something related to HTML5 support after every other GM update.

(2 edits)

Hard to tell, the extension passes unit tests on my end, and I don’t think I have changed anything HTML5-related since the last public release.

If this is in Safari, you could try another browser. If that doesn’t do it either, run in debug mode and enable “pause on exceptions” + “pause on caught exceptions” on Sources/Debugger tab of browser’s Developer Tools so that you can see what function is causing trouble.