Reload game.so without dropping the old handle on failure, reset state via F2

This commit is contained in:
Joseph Ferano 2026-07-19 10:31:05 +07:00
parent ac4d458938
commit 65aafd0052
3 changed files with 54 additions and 36 deletions

View File

@ -31,6 +31,7 @@ GameState *InitState() {
assets.textures[TEX_TARGET_RETICLE] = LoadTexture("./assets/UI/Pointers/02.png");
auto game = new GameState;
game->should_reset = false;
game->assets = assets;
// TODO: Probably want to use idiomatic C++ here?
game->knights = (Knight*)calloc(MAX_KNIGHTS, sizeof(Knight));
@ -114,8 +115,8 @@ void Input(GameState *state) {
global_debug_mode = !global_debug_mode;
}
if (IsKeyPressed(KEY_F2)) {
auto new_state = InitState();
*state = *new_state;
state->should_reset = true;
printf("Resetting GameState\n");
}
}
@ -291,7 +292,12 @@ extern "C" {
return Init();
}
void game_step(GameState* state) {
GameState* game_init_state() {
return InitState();
}
void game_step(GameState *state) {
try {
Input(state);
Update(state);
BeginDrawing();
@ -308,8 +314,14 @@ extern "C" {
}
EndDrawing();
}
catch (const exception& e) {
printf("Exception: %s\n", e.what());
TraceLog(LOG_ERROR, "Exception: %s", e.what());
}
}
void game_cleanup(GameState* state) {
void game_cleanup(GameState *state) {
// free(state->assets.textures);
delete state;
printf("Cleaning Up\n");
CloseWindow();

3
game.h
View File

@ -49,6 +49,7 @@ struct Assets {
};
struct GameState {
bool should_reset;
Camera2D camera;
int frame_count;
Point camera_position;
@ -73,6 +74,6 @@ struct GameState {
UnloadTexture(assets.textures[i]);
}
free(assets.textures);
printf("I freed the stuff?\n");
printf("Freeing GameState memory\n");
}
};

View File

@ -3,14 +3,13 @@
#include <sys/stat.h>
#include <cstdio>
struct GameState;
#include "game.h"
struct GameApi {
struct GameState *(*init)();
GameState *(*init)();
GameState *(*init_state)();
void (*step) (GameState *state);
void (*finalize) (GameState *state);
void (*reload) (GameState *state);
void (*unload) (GameState *state);
void (*cleanup) (GameState *state);
bool (*window_should_close)();
};
@ -38,20 +37,21 @@ bool load_game_api(Game* game) {
return false;
}
if (game->gamelib_handle) {
dlclose(game->gamelib_handle);
}
game->gamelib_handle = dlopen(lib_path, RTLD_NOW);
if (!game->gamelib_handle) {
void *gamelib_handle = dlopen(lib_path, RTLD_NOW);
if (!gamelib_handle) {
printf("Failed to load game.so: %s\n", dlerror());
return false;
}
if (game->gamelib_handle) {
dlclose(game->gamelib_handle);
}
game->gamelib_handle = gamelib_handle;
game->api.init = (GameState*(*)())dlsym(game->gamelib_handle, "game_init");
game->api.init_state = (GameState*(*)())dlsym(game->gamelib_handle, "game_init_state");
game->api.step = (void(*)(GameState*))dlsym(game->gamelib_handle, "game_step");
game->api.finalize = (void(*)(GameState*))dlsym(game->gamelib_handle, "game_cleanup");
game->api.cleanup = (void(*)(GameState*))dlsym(game->gamelib_handle, "game_cleanup");
game->api.window_should_close = (bool(*)())dlsym(game->gamelib_handle, "window_should_close");
game->last_write_time = write_time;
@ -60,7 +60,7 @@ bool load_game_api(Game* game) {
}
int main(void) {
Game game;
Game game = {};
load_game_api(&game);
@ -70,9 +70,14 @@ int main(void) {
// float dt = GetFrameTime();
load_game_api(&game);
if (game.state->should_reset) {
delete game.state;
game.state = game.api.init_state();
}
game.api.step(game.state);
}
game.api.finalize(game.state);
game.api.cleanup(game.state);
return 0;
}