Files
balatro-gba/source/state_machine.c
Rickey 92cb9f9883
Some checks failed
Build and Deploy Doxygen Docs / docs (push) Has been cancelled
Refactor/state machine (#470)
* initial additions

* Move current_blind to game vars

* tmp

* tmp

* tmp

* tmp

* tmp

* tmp

* tmp

* Compile but is broken

* temp fix for token location

* tmp

* Working, lets clean up

* remove todo

* Remove odd reroll blind variable

* fix skipping blind screen

* fix reroll

* remove magic for blind token locations

* clang format

* Cleanup button highlight in blind menu

* some cleanup

* Add layout file for global UI rects

* remove dead code

* Clang format

* clang format it up

* Move reset top left funct to gfx utils

* make note of soon-to-be removed vars

* Cleanup gamevars declaration

* Cleanup layout file

* Apply suggestions from code review

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add include for stdbool.h in common_ui.h

* Cleanup rect declaration

* Start moving state machine stuff to new file

* quick tmp

* oops, add new files

* working call list

* fixed pointer stuff

* working as per norm

* working replacement

* move defines to static const

* fix compile issue

* Add some missing "void"s

* Working new substates

* add statemachine to blind select

* Fix game restart statemachine leak

* clang-format

* Clang format

* Rework shop exit logic

* Use new state machine in shop

* Remove substates entirely

* Remove debug stuff

* Clang format

* document state machine better

* update list tests

* clang-format

* Update for PR

* Claaaaang format

* another clang-format

* Remove extra state in round_end

* cleanup docs for removals in lists

* clang-format... again

* update doxygen format

* Clang format

* Update list docs

* Update lists tests

* Fix bad conflict resolution

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-22 18:06:13 -07:00

64 lines
1.7 KiB
C

#include "state_machine.h"
#include "game.h"
#include "list.h"
#include "util.h"
static List update_cbs = LIST_DEFAULT;
// Used as a No Operation for game states that have no init and/or exit function.
// ricfehr3 did the work of determining whether a noop or a NULL check was more
// efficient. Well, this is the answer.
// Thanks!
// https://github.com/cellos51/balatro-gba/issues/137#issuecomment-3322485129
void noop(void) {};
void state_machine_register(StateMachine* state_machine)
{
// Always try to remove the state machine first. Only one can exist at a time
// So ensure that calling this function doesn't add two update functions
state_machine_remove(state_machine);
state_machine->active_update = noop;
state_machine->state = UNDEFINED;
list_push_back(&update_cbs, &state_machine->active_update);
}
void state_machine_remove(StateMachine* state_machine)
{
list_remove_data(&update_cbs, &state_machine->active_update);
}
void state_machine_update(void)
{
ListItr itr = list_itr_create(&update_cbs);
StateCallback* cb;
while ((cb = list_itr_next(&itr)))
{
(*cb)();
}
}
void state_machine_change_state(StateMachine* state_machine, int new_state)
{
if (state_machine->state >= 0 && state_machine->state < state_machine->num_infos)
{
state_machine->state_infos[state_machine->state].on_exit();
}
if (new_state >= 0 && new_state < state_machine->num_infos)
{
state_machine->state_infos[new_state].on_init();
state_machine->active_update = state_machine->state_infos[new_state].on_update;
state_machine->state = new_state;
}
else
{
state_machine->active_update = noop;
state_machine->state = UNDEFINED;
}
}