#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3/SDL_properties.h>
#include <SDL3_image/SDL_image.h>
#include <SDL3_mixer/SDL_mixer.h>

#include <akgl/assets.h>
#include <akgl/error.h>
#include <akgl/iterator.h>
#include <akgl/tilemap.h>
#include <akgl/heap.h>
#include <akgl/game.h>
#include <akgl/controller.h>
#include <akgl/draw.h>
#include <akgl/sprite.h>
#include <akgl/actor.h>
#include <akgl/registry.h>
#include <akgl/text.h>

#include <akstdlib.h>

#define AKGLTEST_STATE_WAITFORINPUT                   1 << 8
#define AKGLTEST_STATE_LOADING                        1 << 9
#define AKGLTEST_STATE_RUNNING                        1 << 10
#define AKGLTEST_STATE_MAPMENU                        1 << 11
#define AKGLTEST_STATE_QUIT                           1 << 12

#define AKGLTEST_CONTROLMAP_MENU                      0
#define AKGLTEST_CONTROLMAP_INGAMEACTOR               1


extern int menuselection;
extern int maxmenu;
extern int kbid;
extern int jsid;

extern int numchars;
extern char *characterpaths[2];

extern int numsounds;
extern char *soundfiles[2];

extern int numsprites;
extern char *spritepaths[9];

extern char dirnamebuf[1024];

akerr_ErrorContext AKERR_NOIGNORE *akgltest_controller_bind_universal(char *actorname, int mapid, int kbid, int jsid);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_controller_get_defaults(void *appstate, SDL_Event *event);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_init_menupointer(void);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_init_player(void);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_iterate_mapmenu(void);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_iterate_running(void);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_iterate_waitforinput(void);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_load_assets();
akerr_ErrorContext AKERR_NOIGNORE *akgltest_menupointer_logic_movement(akgl_Actor *obj, float32_t dt);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_release_actor(char *actorname);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_set_actor_visible(char *actorname, bool visible);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_set_gamemode_menu(akgl_Actor *appstate, SDL_Event *event);
akerr_ErrorContext AKERR_NOIGNORE *akgltest_set_gamemode_running(akgl_Actor *appstate, SDL_Event *event);
akerr_ErrorContext AKERR_NOIGNORE *music_toggle(akgl_Actor *obj, SDL_Event *event);
akerr_ErrorContext AKERR_NOIGNORE *quit_game(akgl_Actor *obj, SDL_Event *event);
akerr_ErrorContext AKERR_NOIGNORE *savegame(akgl_Actor *obj, SDL_Event *event);
akerr_ErrorContext AKERR_NOIGNORE *user_breakpoint(akgl_Actor *obj, SDL_Event *event);
