Grilled Cheese

ExploreLog inSign up

Séb

@sebdegraff.bsky.social

667 Following579 Followers

Game dev, made the game Terraformers.
Game jams, homemade game engine dev.
Sometimes streaming on youtube:
🔴 https://www.youtube.com/@seb_degraff/streams
Also on mastodon:
🐘 http://mastodon.gamedev.place/@seb_degraff

PostsRepliesMedia
@sebdegraff.bsky.socialOct 14, 2026, 2:18 PM

Thank you for trying out game and writing about it! Sorry we missed you at the booth. We'll def send a steam key your way when we'll have a more mature game in our hands :)

@merryghouled.bsky.socialOct 12, 2026, 12:04 AMReposted by @sebdegraff.bsky.social

Example of what a bot farm looks like for people wondering.

@mmalex.bsky.socialSep 29, 2026, 2:08 AMReposted by @sebdegraff.bsky.social

still messin' with erik (synth prototype). random technical thread, so i'll open with a vid: as an experiment, all code runs once per '4 samples', at 16khz; the only data type is a float4 ie 4 samples in a row, or a single note: pitch, gate, sequence and sample no (think: tracker cell)

@andwap.bsky.socialSep 24, 2026, 2:36 PMReposted by @sebdegraff.bsky.social

When your gamedev friend shows you progress on their new engine.

26
@sebdegraff.bsky.socialSep 24, 2026, 5:20 PM

Damn, the save upgrade thing must have been painful. Thanks for the link, the presentation is quite interesting

@sebdegraff.bsky.socialSep 24, 2026, 4:57 PM

Now I have to prototype it quickly, and hope I don't find a flow in my solution. That would be a feeling of the same magnitude, in the other direction!

@sebdegraff.bsky.socialSep 24, 2026, 4:56 PM

Just thought of a GREAT solution to a game engine design problem that was rolling in my head for a couple months. What an amazing feeling when it happens!

@sebdegraff.bsky.socialSep 24, 2026, 12:21 PM

I'm honestly fine with explicitly passing an ID for the "yield" locations. That way when modifying the code, it's still possible to remain compatible with an old save by thinking through each possible resume location. Interesting idea to do a preprocessing step, some sugar would be nice indeed!

@sebdegraff.bsky.socialSep 24, 2026, 12:07 PM

interesting. Did you put some kind of explicit "checkpoint" in coroutines or something like that?

@sebdegraff.bsky.socialSep 24, 2026, 8:47 AM

that looks awesome! Bookmarked

@sebdegraff.bsky.socialSep 24, 2026, 8:45 AM

For animations in my turn based game I took inspiration from that same "Coroutines in C" article, but went with an explicit context struct and manual checks. That code keeps getting called until exec->keep_calling is set to false (or rather, not set to true). It works, but is not a joy to write...

// Deal {} damage to the next monster.
            entity_t* other = entity_next_solid_after_pos(entity->tile_pos, false);
            int amount = arg(0) + warcaster_boost;

            if (other) {
                if (exec->step_idx == 0) {
                    // projectile anim
                    anim_task_t* anim_task = arr_put(gs->anim_tasks);
                    rdx_clear_struct(anim_task);
                    anim_task->type = ANIM_TASK_TYPE_Projectile;
                    anim_task->start_tile = entity->tile_pos;
                    anim_task->end_tile = other->tile_pos;
                    anim_task->vfx_def_id = trigger_entity->def_id;
                    anim_task->speed_multiplier = 1.8f;

                    exec->step_idx++;
                    exec->keep_calling = true;
                    break;
                }
                
                if (exec->step_idx == 1) {
                    // impact anim
                    anim_task_t* anim_task = arr_put(gs->anim_tasks);
                    rdx_clear_struct(anim_task);
                    anim_task->type = ANIM_TASK_TYPE_Impact;
                    anim_task->start_tile = other->tile_pos;
                    anim_task->end_tile = other->tile_pos;
                    anim_task->vfx_def_id = trigger_entity->def_id;
                    anim_task->blocking_duration = 0.16f;
                    if (!burning) {
                        anim_task->speed_multiplier = 1.8f;
                    }

                    exec->step_idx++;
                    exec->keep_calling = true;
                    break;
                }

                if (exec->step_idx == 2) {
                    entity_recieve_hit(other, amount, true, burning, poison);

                    exec->step_idx++;
                    exec->keep_calling = true;
                    break;
                }
            }
@sebdegraff.bsky.socialSep 24, 2026, 8:38 AM

Right, saving the local variables is easy enough in lua, and can be done in C by using a struct, but the hard part is resuming at the correct place in the function. Extra-difficult if the code can change between save and load, which would disqualify the __LINE__ hack. But I like the macro tricks!

@sebdegraff.bsky.socialSep 24, 2026, 7:17 AM

My biggest problem with them is thar it's hard to save the state of a program that has coroutines running (and resume them on load). That's the only thing preventing me from using them for e.g. cutscenes because I want to be able to snapshot the game at any point for debugging

@sebdegraff.bsky.socialSep 22, 2026, 9:47 AM

yes, absolutely, people can do whatever they want. I gather you prefer not to have an "unset" / zero tile, and instead initialize an "empty" tilemap with the 1st tile of the palette? I can see cases where that would be useful. It's nice that there are no holes in the level then, too

@sebdegraff.bsky.socialSep 22, 2026, 9:05 AM

I'm curious, what would you prefer? Zero for "empty" sounds good to me

@sebdegraff.bsky.socialSep 18, 2026, 7:28 AM

You can download an iso straight from this page (scroll past the "Installation media")

@sebdegraff.bsky.socialSep 17, 2026, 9:57 PM

Re-installing windows on my gaming PC (previous ssd died). Rufus is a godsend!

Popup window in Rufus with options to customize the windows install:

Remove requirement for 4GB+ RAM, Secure Boot and TPM 2.0
Remove requirement for an online Microsoft account
Create a local account with username: seb
Set regional options to the same values as this user's
Disable data collection (Skip privacy questions)
Disable BitLocker automatic device encryption
@sebdegraff.bsky.socialSep 16, 2026, 7:43 PMReposted by @sebdegraff.bsky.social

This was a good stream! - implemented the monkey tester in like 10 lines - let it run - it finds a bug (pointer to item in a growing array) - fix the bug, add a mode to detect similar bugs faster (force realloc for every element added to growing arrays)

@sebdegraff.bsky.socialSep 16, 2026, 7:43 PM

This was a good stream! - implemented the monkey tester in like 10 lines - let it run - it finds a bug (pointer to item in a growing array) - fix the bug, add a mode to detect similar bugs faster (force realloc for every element added to growing arrays)

@sebdegraff.bsky.socialSep 16, 2026, 5:17 PM

Oh, haha! Sorry for the rabbit hole, but glad my question was useful :) Makes a lot of sense to grow and eventually repack, I'm also doing that. I'm curious how you handle some specific aspects of resizing, I'll ask followup questions on your discord later!

Older posts
Terms of UsePrivacy PolicyCommunity StandardsHelpGet the app

Grilled Cheese is a product of Village Compute

Version devBuilt at: 2026-10-15 18:51:49 EDT