Jason Thor Hall / PirateSoftware / Maldavius Figtree / DarkSphere Creations / Maldavius / Thorwich / Witness X / @PotatoSec - Incompetent Furry Programmer, Blizzard Nepo Baby, Lies about almost every thing in his life, Industry Shill, Carried by his father, Hate boner against Ross Scott of Accursed Farms, False Flagger

  • 🐕 I am attempting to get the site runnning as fast as possible. If you are experiencing slow page load times, please report it.

Which will happen first?

  • Jason Hall finishes developing his game

    Votes: 33 0.8%
  • YandereDev finishes developing his game

    Votes: 411 9.6%
  • Grummz finishes developing his game

    Votes: 117 2.7%
  • Chris Roberts finishes developing his game

    Votes: 143 3.4%
  • Cold fusion

    Votes: 1,638 38.4%
  • The inevitable heat death of the universe

    Votes: 1,924 45.1%

  • Total voters
    4,266
dont listen to them write more and longer hit the word count and go further byeond

I'm back on my phone and I'm sorry I had no idea it would be that big.

Neovim es numero uno.

I know I know but fuck vim motions. I need to install the VSCode extension for them to get used to them first.

Also how is using arrays overhead? It's shit choice from design perspective. However array access should be the fastest possible operations it's just pointer + offset. I don't think even GML would do it differently, but I might be wrong.

Because from what I've seen of his codebase and the array itself, every item in the array is held in-process. His explanation for this is so you can "hack the game" and change the array to see other narrative options or some shit. GML would treat it as a JSON module.

He uses JetBrains if I can see correctly.

Holy shit it was underlined in the IDE for a whole four minutes before realising that he typed the wrong name.

"Waaaaaitaminute... let me call Jake".
 
the 20% thing has been discussed a few times, having an array in memory caching values is relevant for heavy physics math that is done hundreds of times per frame. caching an array may increase performance by up to 20% by doing things like, say, caching positioning so when you need to reference that positioning your cpu has an easier time finding where the current one is to calculate the next

a storyline array saved to memory is retarded, we've talked lots about this, althought admiteldly it's been a while

i think part of maldys reasoning is that someone could hack his game and change future storyline events but that same person can just open a json file in notepad and do the same thing without your game being poorly coded

this toby fox undertale having shit code garbage he kept spewling out is a massive cope
 
Even doing a 24 hour stream, he still made a net loss in follower count. How sad

1749251138509.webp
 
In the case of Heartbound, he uses a global data structure to track all player decisions and dialogue states (it's not like an mutable dynamic list, but more an immutable dictionary matrix... you can probably see the problems for development now). This makes the narrative flexible and persistent but also introduces performance overhead, especially when that data is accessed frequently during gameplay, dialogue rendering, and persisting across scenes. Because that global system is inherently inefficient, Jason is forced to aggressively “optimise” everything else just to keep performance acceptable. This includes micromanaging instance creation (there are many), obsessing over draw call reductions, and pre-parsing data. Not because these are elegant solutions, but because they’re necessary compensations for the weight of an overburdened global state machine. The "20% performance gain" isn’t a sign of thoughtful engineering: it’s a patchwork fix to a self-imposed problem.
I thought I told you to stop shitting up the thread with ChatGPT slop.
Fuck you, I had already wasted time typing out half a reply before I realized.

His shitty huge ass array does NOT cause performance issues. It also does NOT help with a "flexible and persistent narrative" in any way whatsoever, whatever the fuck that is supposed to mean.
 
Gamemaker games have very little protection and are easy to decompile.
What's extra retarded about all this is that he's making his game in Game Maker, which has decompile tools out there. Some one with know how can just decompile his game.
Looks like Shieldman beat me to it a while ago, but I wanted to look at this 1337 ray tracing code so I took a stab at it. LetThemSneed mentioned a decompiler and I found the UndertaleModTool which was incredibly simple to use, Undertale fans might be insane but they do good work, I know very little about coding and even I could figure it out.

Now let's see this, as Fagtree himself states, "fully dynamic physics based lighting."
I'm not exactly certain that this is a 1-1 copy of his code or just a close approximation that the tool made, however, the following code block should be what he is calling "ray tracing."
Code:
function scr_draw_light()
{
    if (light_activate == 1)
    {
        light_activate = 0;
        gpu_set_blendmode_ext(9, bm_one);
        
        switch (light_direction)
        {
            case 0:
                var lighted_x = floor(x - sprite_get_xoffset(sprite_index));
                var lighted_y = floor(y - sprite_get_yoffset(sprite_index));
                
                if (last_image != image_index || last_sprite != sprite_index)
                {
                    last_image = image_index;
                    last_sprite = sprite_index;
                    var light_distance = floor(x - light_caster.x);
                    
                    if (light_distance < 1)
                        light_distance = 1;
                    
                    if (last_blend != light_caster.image_blend)
                    {
                        light_hue = color_get_hue(light_caster.image_blend);
                        light_saturation = color_get_saturation(light_caster.image_blend);
                        last_blend = light_caster.image_blend;
                    }
                    
                    var light_value = light_luminosity * ((light_caster.sprite_width - light_distance) / light_caster.sprite_width);
                    light_value = clamp(light_value, 0, 255);
                    
                    for (yy = 0; yy <= (sprite_height - 1); yy++)
                    {
                        for (xx = 0; xx <= (sprite_width - 1); xx++)
                        {
                            if (position_meeting(lighted_x + xx, lighted_y + yy, object_index))
                            {
                                pixels_found = 1;
                                
                                repeat (light_diffuse)
                                {
                                    if (position_meeting(lighted_x + xx, lighted_y + yy, object_index))
                                    {
                                        var draw_x = floor(lighted_x + xx);
                                        var draw_y = floor(lighted_y + yy);
                                        var new_value = light_value - (pixels_found * light_falloff);
                                        
                                        if (new_value < 0)
                                            new_value = 0;
                                        
                                        var draw_color = make_color_hsv(light_hue, light_saturation, new_value);
                                        draw_sprite_ext(spr_pixel, 0, draw_x, draw_y, image_xscale, image_yscale, image_angle, draw_color, image_alpha);
                                        pixels_found++;
                                        xx++;
                                    }
                                }
                                
                                break;
                            }
                        }
                    }
                }
                
                break;
            
            case 2:
                var lighted_x = floor(x - sprite_get_xoffset(sprite_index));
                var lighted_y = floor(y - sprite_get_yoffset(sprite_index));
                
                if (last_image != image_index || last_sprite != sprite_index)
                {
                    last_image = image_index;
                    last_sprite = sprite_index;
                    var light_distance = floor(light_caster.x - x);
                    
                    if (light_distance < 1)
                        light_distance = 1;
                    
                    if (last_blend != light_caster.image_blend)
                    {
                        light_hue = color_get_hue(light_caster.image_blend);
                        light_saturation = color_get_saturation(light_caster.image_blend);
                        last_blend = light_caster.image_blend;
                    }
                    
                    var light_value = light_luminosity * ((light_caster.sprite_width - light_distance) / light_caster.sprite_width);
                    light_value = clamp(light_value, 0, 255);
                    
                    for (yy = 0; yy <= (sprite_height - 1); yy++)
                    {
                        xx = sprite_width - 1;
                        
                        while (xx >= 0)
                        {
                            if (position_meeting(lighted_x + xx, lighted_y + yy, object_index))
                            {
                                pixels_found = 1;
                                
                                repeat (light_diffuse)
                                {
                                    if (position_meeting(lighted_x + xx, lighted_y + yy, object_index))
                                    {
                                        var draw_x = floor(lighted_x + xx);
                                        var draw_y = floor(lighted_y + yy);
                                        var new_value = light_value - (pixels_found * light_falloff);
                                        
                                        if (new_value < 0)
                                            new_value = 0;
                                        
                                        var draw_color = make_color_hsv(light_hue, light_saturation, new_value);
                                        draw_sprite_ext(spr_pixel, 0, draw_x, draw_y, image_xscale, image_yscale, image_angle, draw_color, image_alpha);
                                        pixels_found++;
                                        xx--;
                                    }
                                }
                                
                                break;
                            }
                            
                            xx--;
                        }
                    }
                }
                
                break;
            
            case 3:
                var draw_hue = color_get_hue(light_caster.image_blend);
                var draw_saturation = color_get_saturation(light_caster.image_blend);
                var light_distance = floor(light_caster.y - y - (sprite_height * 0.5));
                
                if (light_distance < 1)
                    light_distance = 1;
                
                var new_value = light_luminosity * ((light_caster.sprite_height - light_distance) / light_caster.sprite_height);
                
                if (new_value > 255)
                    new_value = 255;
                
                if (new_value < 0)
                    new_value = 0;
                
                var draw_color = make_color_hsv(light_hue, light_saturation, new_value);
                var light_side = sign(light_caster.x - x);
                
                switch (light_side)
                {
                    case -1:
                        var light_x_offset = (light_caster.x + (light_caster.sprite_width * 0.5)) - (x - (sprite_width * 0.5));
                        draw_sprite_part_ext(sprite_index, image_index, 0, 0, light_x_offset, sprite_height, ceil(x - (sprite_width * 0.5)), ceil(y - (sprite_height * 0.5)), image_xscale, image_yscale, draw_color, image_alpha);
                        break;
                    
                    case 1:
                        var light_x_offset = (x + (sprite_width * 0.5)) - (light_caster.x - (light_caster.sprite_width * 0.5));
                        draw_sprite_part_ext(sprite_index, image_index, sprite_width - light_x_offset, 0, sprite_width * 2, sprite_height, ceil((x - (sprite_width * 0.5) - light_x_offset) + sprite_width), ceil(y - (sprite_height * 0.5)), image_xscale, image_yscale, draw_color, image_alpha);
                        break;
                }
                
                break;
        }
        
        gpu_set_blendmode(bm_normal);
    }
}

It looks like case1 is what's doing the "ray tracing," a quick proof for anyone like myself who doesn't code. Changing the following line from a hue and saturation value:raytracing.webp
To a red, green, blue value:
greenraytracing.webp
Should change the light we see coming from the window in his room to green.
Case2 appears to be the shadow being cast on the floor behind the player, and Case3 is something else, maybe the dimming effect that seems to be on the main character sprite? Someone with better coding knowledge should be able to correct me on that.

One other thing I noticed is that he talks about how it's all ray traced and dynamic, but we can see here, when the bottom of the dogs sprite enters the window area, the whole dog is lit up with the light. This also includes the top of the character sprite being in the box but his shoes are still lit up red.

It's all disappointingly bland, I wondered why he never showed the code on stream. It's just a scan of the sprite, applying the light effects from the window object on any sprite that enters the box on the floor. None of this is is what I would call "dynamic" at all.
heartboundwindow.webp
heartboundwindowcode.webp
 
Why does Mald even pretend to care about his game at this point? He clearly doesn't want to bother with it. Is it because he knows people will shit on him if he finally abandons it?
Cause he put it on steam and made it his whole brand thats hes a pro game dev if he gets his game to abandonware status no one gonna take him serious as a leet gamer coder so hes just doing minor things to look busy he should join the army if hes that great at looking busy while doing nothing
 
when the bottom of the dogs sprite enters the window area, the whole dog is lit up with the light
That one does make sense though. The whole dog is standing where the light hits. Imagine a top down view. If you took a step forward in front of the window, your whole body would be lit, not just your legs.

But yeah, typical for Jason to take a bit of beginner code and present it as this ultra giga brain invention.
 
Last edited:
Why does Mald even pretend to care about his game at this point? He clearly doesn't want to bother with it. Is it because he knows people will shit on him if he finally abandons it?
The audience he has doesn't care though. They wouldn't abandon him they don't care about heart bound beyond the fact that it annoys Jason.
This is a personal demon for him. its a blemish on his ego that as long as it remains incomplete people can point out and go "yeah you're not a real game dev." Which is true. He isn't. He doesn't Game Dev.
He should just drop it. Admit the truth and just be a streamer. It makes more money, its more glamorous than a game dev, and its certainly easier.
But for some reason he can't let it go. He can't take the L.

I know it was meant as a joke option, but did anyone else actually pick Cold Fusion on the poll because they think it's the most likely option?

I have faith in humanity to get cold fusion. I don't have faith in any of those devs.
 
View attachment 7471073

Knew it was farmable content
Was not disappointed
"Just make your game bro" is crazy phrasing from our dear friend... does he even hear himself? How is he this retarded, that words spew out his mouth and not at any point make him think "shit wait i need to make my game"
 
Happy 500 pages, Jason. We wish you the best of luck in your game development and fangame prevention endeavors. We wish you the best of luck in your illustrious streaming career with your many friends and associates. We wish you the best of luck in housing up to two hundred fifty ferrets with your stream revenue.
 
I thought I told you to stop shitting up the thread with ChatGPT slop.
Fuck you, I had already wasted time typing out half a reply before I realized.

His shitty huge ass array does NOT cause performance issues. It also does NOT help with a "flexible and persistent narrative" in any way whatsoever, whatever the fuck that is supposed to mean.

I didn't AI it, it was one of the few times I typed a reply on a keyboard, and then jumped back on my phone and realised I wrote a Tolstoy-length response with an autistic flavour. I'M SORRY.

The "flexible persistent" shit was steel-manning his excuse, and yes, the design of his array does cause overhead because it's in-process (from what I've seen). It's held it memory. It's immutable and big.

Now I'm happy to be proven wrong but that's my 2 cents from what I've glanced, and how he's explained it.
 
Glance at Mald's youtube
See this
View attachment 7471073
Knew it was farmable content
Was not disappointed


The way he talks down on actual game devs like fox and cawthorn is funny if it weren't so sad lol
It doesn't matter what you are making, it just matters that you finish the things you are making [...]
Just make your game
It is said that the emptiest void in the universe is the Boötes Void, but his self-awareness is even emptier.
 
i put down the heat death of the universe because of the funny but if i were to recast my vote seriously it'd be chris roberts finishing scam citizen first
I feel like he'll make infinitely more money by never finishing and promising more and more than by finishing.

The thread has slowed down a bit, but its still more productive than Mald on his game.
 
That one does make sense though. The whole dog is standing where the light hits. Imagine a top down view. If you took a step forward in front of the window, your whole body would be lit, not just your legs.
Fuck, I was so annoyed at Fagtree I didn't stop to think, you're right it does make sense. Though I still think it is more likely to be incidental due to the way he implemented the light rather than a purposeful accurate representation given the rest of his code.

Jason is forced to aggressively “optimise” everything else just to keep performance acceptable. This includes micromanaging instance creation (there are many), obsessing over draw call reductions, and pre-parsing data. Not because these are elegant solutions, but because they’re necessary compensations for the weight of an overburdened global state machine. The "20% performance gain" isn’t a sign of thoughtful engineering: it’s a patchwork fix to a self-imposed problem.
What makes you think he is actually optimizing anything? It's an Undertale clone made in GameMaker, compared to one of the more intensive GM games to come out, Nuclear Throne which has multiple AI moving around varied environments, tons of particle effects and projectiles and is still able to run on any phone, I think the game even ran on the PSVita. Mald's game is basically a visual novel, there's no self-imposed problem with performance, it's all just buzzwords to him so that he sounds smart.
gamemakerlimits.webp
 
Back