Mechanical whitespace-only change across src/, include/, tests/, and util/, applied with scripts/reindent.sh. No behavioral change. Most files already conformed. The genuine outliers indented at 2 columns (json_helpers.c, util.c from akgl_rectangle_points onward, assets.c, staticstring.c, akgl_actor_add_child, util.h, staticstring.h) or used spaces where the canonical form is a tab (draw.c). cc-mode also re-aligns line-continuation backslashes in multi-line macros to its default c-backslash-column, which is required for the tree to be a fixed point of the indenter. Verified whitespace-only: `git diff -w` over this change is empty apart from three trailing blank lines removed at EOF in src/heap.c, src/registry.c, and tests/tilemap.c. The build produces no new errors and ctest is unchanged at 13/14, with `character` still the one intentional failure. The tree is now a fixed point of `scripts/reindent.sh --check`. include/akgl/SDL_GameControllerDB.h is generated and excluded. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
145 lines
4.6 KiB
C
145 lines
4.6 KiB
C
/**
|
|
* @file game.h
|
|
* @brief Declares the public game API.
|
|
*/
|
|
|
|
#ifndef _AKGL_GAME_H_
|
|
#define _AKGL_GAME_H_
|
|
|
|
#include <stdint.h>
|
|
#include <SDL3_mixer/SDL_mixer.h>
|
|
#include "types.h"
|
|
#include "tilemap.h"
|
|
#include "renderer.h"
|
|
#include "physics.h"
|
|
|
|
#define AKGL_VERSION "0.1.0"
|
|
|
|
#define AKGL_GAME_AUDIO_TRACK_BGM 1
|
|
#define AKGL_GAME_AUDIO_MAX_TRACKS 64
|
|
|
|
#define AKGL_TIME_ONESEC_NS 1000000000
|
|
#define AKGL_TIME_ONESEC_MS 1000000
|
|
|
|
/* ==================== GAME STATE VARIABLES =================== */
|
|
|
|
/** @brief Describes a renderable frame. */
|
|
typedef struct {
|
|
float32_t w;
|
|
float32_t h;
|
|
SDL_Texture *texture;
|
|
} akgl_Frame;
|
|
|
|
/** @brief Stores application-defined game-state flags. */
|
|
typedef struct {
|
|
int32_t flags;
|
|
} akgl_GameState;
|
|
|
|
/** @brief Stores game metadata, timing, synchronization, and FPS accounting. */
|
|
typedef struct {
|
|
char libversion[32];
|
|
char version[32];
|
|
char name[256];
|
|
char uri[256];
|
|
akgl_GameState state;
|
|
SDL_Mutex *statelock;
|
|
int16_t fps;
|
|
SDL_Time gameStartTime;
|
|
SDL_Time lastIterTime;
|
|
SDL_Time lastFPSTime;
|
|
int16_t framesSinceUpdate;
|
|
void (*lowfpsfunc)(void);
|
|
} akgl_Game;
|
|
|
|
/** @brief SDL window used by the active renderer. */
|
|
extern SDL_Window *window;
|
|
/** @brief Loaded background-music resource. */
|
|
extern MIX_Audio *bgm;
|
|
/** @brief Mixer used for game audio playback. */
|
|
extern MIX_Mixer *akgl_mixer;
|
|
/** @brief Process-wide audio-track table. */
|
|
extern MIX_Track *akgl_tracks[AKGL_GAME_AUDIO_MAX_TRACKS];
|
|
/** @brief Storage for the default camera. */
|
|
extern SDL_FRect _akgl_camera;
|
|
/** @brief Process-wide game metadata and timing state. */
|
|
extern akgl_Game game;
|
|
/** @brief Storage for the default renderer. */
|
|
extern akgl_RenderBackend _akgl_renderer;
|
|
/** @brief Storage for the default physics backend. */
|
|
extern akgl_PhysicsBackend _akgl_physics;
|
|
/** @brief Storage for the default tilemap. */
|
|
extern akgl_Tilemap _akgl_gamemap;
|
|
|
|
/** @brief Currently active tilemap. */
|
|
extern akgl_Tilemap *gamemap;
|
|
/** @brief Currently active renderer. */
|
|
extern akgl_RenderBackend *renderer;
|
|
/** @brief Currently active physics backend. */
|
|
extern akgl_PhysicsBackend *physics;
|
|
/** @brief Currently active camera. */
|
|
extern SDL_FRect *camera;
|
|
|
|
#define AKGL_BITMASK_HAS(x, y) (x & y) == y
|
|
#define AKGL_BITMASK_HASNOT(x, y) (x & y) != y
|
|
#define AKGL_BITMASK_ADD(x, y) x |= y
|
|
#define AKGL_BITMASK_DEL(x, y) x &= ~(y)
|
|
#define AKGL_BITMASK_CLEAR(x) x = 0;
|
|
|
|
/**
|
|
* @brief Game init.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKERR_NULLPOINTER When the corresponding validation or operation fails.
|
|
* @throws AKGL_ERR_SDL When the corresponding validation or operation fails.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init();
|
|
/**
|
|
* @brief Game init screen.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKERR_* Propagates an error reported by a delegated operation.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init_screen();
|
|
/**
|
|
* @brief Game updatefps.
|
|
*/
|
|
void akgl_game_updateFPS();
|
|
/**
|
|
* @brief Game save.
|
|
* @param fpath Path to the input or output file.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKERR_NULLPOINTER When the corresponding validation or operation fails.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_save(char *fpath);
|
|
/**
|
|
* @brief Game load.
|
|
* @param fpath Path to the input or output file.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKERR_API When the corresponding validation or operation fails.
|
|
* @throws AKERR_NULLPOINTER When the corresponding validation or operation fails.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_load(char *fpath);
|
|
/**
|
|
* @brief Game lowfps.
|
|
*/
|
|
void akgl_game_lowfps(void);
|
|
/**
|
|
* @brief Game state lock.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKGL_ERR_SDL When the corresponding validation or operation fails.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_state_lock(void);
|
|
/**
|
|
* @brief Game state unlock.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKERR_* Propagates an error reported by a delegated operation.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_state_unlock(void);
|
|
/**
|
|
* @brief Game update.
|
|
* @param opflags Optional iterator operation flags; `NULL` selects defaults.
|
|
* @return `NULL` on success, otherwise an error context owned by the caller.
|
|
* @throws AKERR_* Propagates an error reported by a delegated operation.
|
|
*/
|
|
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_update(akgl_Iterator *opflags);
|
|
|
|
#endif //_AKGL_GAME_H_
|