Skip to content

implement savestate support#359

Open
jeboo wants to merge 17 commits into
blkerby:mainfrom
jeboo:main
Open

implement savestate support#359
jeboo wants to merge 17 commits into
blkerby:mainfrom
jeboo:main

Conversation

@jeboo

@jeboo jeboo commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@jeboo
jeboo marked this pull request as draft June 27, 2026 22:25
@jeboo

jeboo commented Jun 27, 2026

Copy link
Copy Markdown
Contributor Author

This is a nearly complete implementation of the full savestate (SD2SNES, 256K SRAM) from the practice hack. The only thing pending is an actual flag to enable/disable the feature in the ROM. So far I've tested in most of the rooms and the 4 major bosses and MB.

Comment thread patches/src/savestate.asm Outdated
; Makes the game check Samus' health again, to see if we need annoying sound
STZ !SAMUS_HEALTH_WARNING
; see if no_beeping.asm applied
LDA $90EA92 : CMP #$EAEA : BNE .done_health_alarm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't this be BEQ nop nop (disabled sounds)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tried out the latest commit.

Seems to mostly be working. Couple of things I caught.

  1. holding save/load will loop the saving/loading until the inputs are released
  2. loading a savestate from an item room continiues to play the item room music after load.
  3. loading a savestate in the death animation the music doesn't play at all.

@jeboo
jeboo marked this pull request as ready for review July 18, 2026 12:10
@blkerby

blkerby commented Jul 19, 2026

Copy link
Copy Markdown
Owner

It feels very nice, will be a great addition. Some feedback:

  • Loading while in the pause menu results in the minimap getting corrupted when it is next drawn (after crossing a screen boundary).
  • The various counters and their settings seem more complicated than they need to be. I think we could just have a single numeric setting which limits the amount of times you can create a savestate until refreshing the counter by using a save station; so that's the current "Checkpoint Saves". Loading should be unlimited. And a "Total Saves" limit would be undesirable for the same reason that we don't put "canRiskPermanentLossOfAccess" strats in logic: we don't want past things that the player did to permanently lock them out from being able to complete a seed. And the way this feature is likely to be used, players will be relying on it to realistically be able to complete seeds, e.g. by selecting higher difficulties than they would otherwise be able to complete.
  • For the web site UI, rather than using 0 as a special value meaning "unlimited", I would use radio buttons "Limited" and "Unlimited". I would put the "Limited" and "Unlimited" buttons as top-level options on the main page, so you would have No/Limited/Unlimited options side by side and only need to open the cog to change the amount of saves in the Limited option. I would default it to 1. If larger values become popular, we might want to think about having some way for the player to see the current value of the counter in-game; otherwise it could be difficult to keep track. I think a value of 1 could be good though, because it's still powerful, simple to understand, and at the same time forces the player to use it strategically.

@blkerby

blkerby commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Thinking about it a bit more, I would lean toward dropping the cog and just having "Limited" always be a value of 1 (in the ASM it could still be implemented as a general counter). I think that would be better, because otherwise the limiting value can tend to be hidden, both in the web UI and in-game, so the flexibility doesn't seem worth it for the confusion that it would tend to create. One other thing: on the seed page display of "Other options", we could distinguish between "Unlimited savestates enabled" and "Limited savestates enabled", so then the player can have a clear understanding of what to expect.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants