From cf366ee21a519e629afde19bd3defa3fe375d2fe Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Sun, 26 Jul 2026 14:37:58 +0200 Subject: [PATCH] Linked lists error handling and consequences :skull: --- SDL3_Core | 2 +- src/components/animation_system.c | 23 +++++++++++++------- src/components/headers/animation_system.h | 8 +++---- src/components/headers/player_system.h | 4 ++-- src/components/headers/sprite_component.h | 4 ++-- src/components/headers/transform_component.h | 4 ++-- src/components/player_system.c | 20 +++++++++++------ src/components/sprite_component.c | 9 ++++++-- src/components/transform_component.c | 8 +++++-- src/game.c | 13 +++++++---- 10 files changed, 61 insertions(+), 34 deletions(-) diff --git a/SDL3_Core b/SDL3_Core index 8b37fc7..457de07 160000 --- a/SDL3_Core +++ b/SDL3_Core @@ -1 +1 @@ -Subproject commit 8b37fc78fa36748444054cac3c862e94de3565e9 +Subproject commit 457de07ecb02822d5e309c188bdcdba1ce2cdc59 diff --git a/src/components/animation_system.c b/src/components/animation_system.c index 3f7bcfe..09a3a39 100644 --- a/src/components/animation_system.c +++ b/src/components/animation_system.c @@ -5,12 +5,12 @@ #include "errors.h" // Args : size_t nb_frames, size_t actual_frame, float frame_delay_ms, bool play, bool loop, bool reverse -void animation_system_init(component_t *component, va_list args) +int animation_system_init(component_t *component, va_list args) { animation_system_data_t *system_data = component->component_data; system_data->sprite_component_data = get_component(component->entity, SPRITE_COMPONENT)->component_data; - if(!system_data->sprite_component_data) return; + if(!system_data->sprite_component_data) return EXIT_FAILURE; system_data->nb_frames = va_arg(args, size_t); system_data->actual_frame_nb= va_arg(args, size_t); @@ -23,10 +23,10 @@ void animation_system_init(component_t *component, va_list args) linked_list_init(&system_data->frames, sizeof(rect_t), NULL); - animation_system_create_frames_clips(system_data); + return animation_system_create_frames_clips(system_data); } -void animation_system_update(component_t *component) +int animation_system_update(component_t *component) { animation_system_data_t *system_data = component->component_data; @@ -76,6 +76,8 @@ void animation_system_update(component_t *component) system_data->sprite_component_data->src_rect = *(rect_t *)system_data->actual_frame->data; } + + return EXIT_SUCCESS; } inline void animation_system_destroy(component_t *component) @@ -86,7 +88,7 @@ inline void animation_system_destroy(component_t *component) free(system_data); } -void animation_system_create_frames_clips(animation_system_data_t *system_data) +int animation_system_create_frames_clips(animation_system_data_t *system_data) { linked_list_clear(&system_data->frames); @@ -101,18 +103,23 @@ void animation_system_create_frames_clips(animation_system_data_t *system_data) ((rect_t *)frame->data)->w = sprite_srcR->w; ((rect_t *)frame->data)->h = sprite_srcR->h; - linked_list_push_back_elem(&system_data->frames, frame); + if(linked_list_push_back_elem(&system_data->frames, frame)) return EXIT_FAILURE; } system_data->actual_frame = linked_list_get_elem(&system_data->frames, system_data->actual_frame_nb); + if(!system_data->actual_frame) return EXIT_FAILURE; + + return EXIT_SUCCESS; } -inline void animation_system_change_animation(animation_system_data_t *system_data, const char *name, size_t nb_frames) +inline int animation_system_change_animation(animation_system_data_t *system_data, const char *name, size_t nb_frames) { system_data->sprite_component_data->texture = asset_manager_get_texture(&game.asset_manager, name); system_data->nb_frames = nb_frames; - animation_system_create_frames_clips(system_data); + if(animation_system_create_frames_clips(system_data)) return EXIT_FAILURE; system_data->sprite_component_data->src_rect = *(rect_t *)system_data->actual_frame->data; + + return EXIT_SUCCESS; } diff --git a/src/components/headers/animation_system.h b/src/components/headers/animation_system.h index 2ac687c..9cf1d1f 100644 --- a/src/components/headers/animation_system.h +++ b/src/components/headers/animation_system.h @@ -21,14 +21,14 @@ typedef struct animation_system_data_t { bool reverse :1; } animation_system_data_t; -void animation_system_init(component_t *component, va_list args); +int animation_system_init(component_t *component, va_list args); -void animation_system_update(component_t *component); +int animation_system_update(component_t *component); void animation_system_destroy(component_t *component); -void animation_system_create_frames_clips(animation_system_data_t *system_data); +int animation_system_create_frames_clips(animation_system_data_t *system_data); -void animation_system_change_animation(animation_system_data_t *system_data, const char *name, size_t nb_frames); +int animation_system_change_animation(animation_system_data_t *system_data, const char *name, size_t nb_frames); #endif // SPRITE_COMPONENT_H \ No newline at end of file diff --git a/src/components/headers/player_system.h b/src/components/headers/player_system.h index acff8ac..f76d736 100644 --- a/src/components/headers/player_system.h +++ b/src/components/headers/player_system.h @@ -32,9 +32,9 @@ typedef struct player_system_data_t { player_state_t last_state; } player_system_data_t; -void player_system_init(component_t *, va_list); +int player_system_init(component_t *, va_list); -void player_system_update(component_t *); +int player_system_update(component_t *); void player_system_destroy(component_t *); diff --git a/src/components/headers/sprite_component.h b/src/components/headers/sprite_component.h index 719b362..625963e 100644 --- a/src/components/headers/sprite_component.h +++ b/src/components/headers/sprite_component.h @@ -16,9 +16,9 @@ typedef struct sprite_component_data_t { bool flip; } sprite_component_data_t; -void sprite_component_init(component_t *, va_list); +int sprite_component_init(component_t *, va_list); -void sprite_component_update(component_t *); +int sprite_component_update(component_t *); int sprite_component_draw(component_t *); diff --git a/src/components/headers/transform_component.h b/src/components/headers/transform_component.h index a16bd18..d971d89 100644 --- a/src/components/headers/transform_component.h +++ b/src/components/headers/transform_component.h @@ -10,9 +10,9 @@ typedef struct transform_component_data_t { float speed; } transform_component_data_t; -void transform_component_init(component_t *, va_list); +int transform_component_init(component_t *, va_list); -void transform_component_update(component_t *); +int transform_component_update(component_t *); void transform_component_destroy(component_t *); diff --git a/src/components/player_system.c b/src/components/player_system.c index 49d0cec..09b6362 100644 --- a/src/components/player_system.c +++ b/src/components/player_system.c @@ -7,7 +7,7 @@ #include "transform_component.h" // No args -void player_system_init(component_t *component, va_list args __attribute__((unused))) +int player_system_init(component_t *component, va_list args __attribute__((unused))) { player_system_data_t *system_data = component->component_data; @@ -16,6 +16,8 @@ void player_system_init(component_t *component, va_list args __attribute__((unus system_data->transform_component_data = system_data->sprite_component_data->transform_component_data; system_data->state = PLAYER_IDLE; + + return EXIT_SUCCESS; } // Only for this file @@ -70,7 +72,7 @@ static inline void player_system_set_velocity(player_system_data_t *system_data) } // Only for this file -static inline void player_system_set_animation_and_speed(player_system_data_t *system_data) +static inline int player_system_set_animation_and_speed(player_system_data_t *system_data) { animation_system_data_t *animation_system_data = system_data->animation_system_data; sprite_component_data_t *sprite_component_data = system_data->sprite_component_data; @@ -87,14 +89,14 @@ static inline void player_system_set_animation_and_speed(player_system_data_t *s transform_component_data->speed = PLAYER_DEFAULT_RUN_SPEED; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_RUN_ANIMATION_SPEED; animation_system_data->actual_frame_nb = 0; - animation_system_change_animation(animation_system_data, "player_run_sheet", 8); + if(animation_system_change_animation(animation_system_data, "player_run_sheet", 8)) return EXIT_FAILURE; } else { transform_component_data->speed = PLAYER_DEFAULT_WALK_SPEED; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_WALK_ANIMATION_SPEED; animation_system_data->actual_frame_nb = 0; - animation_system_change_animation(animation_system_data, "player_walk_sheet", 4); + if(animation_system_change_animation(animation_system_data, "player_walk_sheet", 4)) return EXIT_FAILURE; } } else if(!(system_data->state & PLAYER_MOVING) && (system_data->last_state & PLAYER_MOVING)) @@ -102,17 +104,21 @@ static inline void player_system_set_animation_and_speed(player_system_data_t *s animation_system_data->actual_frame_nb = 0; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_IDLE_ANIMATION_SPEED; animation_system_data->actual_frame_nb = 0; - animation_system_change_animation(animation_system_data, "player_idle_sheet", 4); + if(animation_system_change_animation(animation_system_data, "player_idle_sheet", 4)) return EXIT_FAILURE; } + + return EXIT_SUCCESS; } -void player_system_update(component_t *component) +int player_system_update(component_t *component) { player_system_data_t *system_data = component->component_data; player_system_get_inputs(system_data); player_system_set_velocity(system_data); - player_system_set_animation_and_speed(system_data); + if(player_system_set_animation_and_speed(system_data)) return EXIT_FAILURE; + + return EXIT_SUCCESS; } void player_system_destroy(component_t *component) diff --git a/src/components/sprite_component.c b/src/components/sprite_component.c index 2c4f3a1..8a3d4d5 100644 --- a/src/components/sprite_component.c +++ b/src/components/sprite_component.c @@ -3,7 +3,7 @@ #include "game.h" // Arg : const char *name -void sprite_component_init(component_t *component, va_list args) +int sprite_component_init(component_t *component, va_list args) { sprite_component_data_t *component_data = component->component_data; @@ -16,12 +16,17 @@ void sprite_component_init(component_t *component, va_list args) component_data->flip = false; component_data->texture = asset_manager_get_texture(&game.asset_manager, va_arg(args, const char *)); + if(!component_data->texture) return EXIT_FAILURE; + + return EXIT_SUCCESS; } -inline void sprite_component_update(component_t *component) +inline int sprite_component_update(component_t *component) { sprite_component_data_t *component_data = component->component_data; frect_to_rect(&component_data->transform_component_data->bounds, &component_data->dst_rect); + + return EXIT_SUCCESS; } inline int sprite_component_draw(component_t *component) diff --git a/src/components/transform_component.c b/src/components/transform_component.c index ac63a9c..be6a9ff 100644 --- a/src/components/transform_component.c +++ b/src/components/transform_component.c @@ -3,7 +3,7 @@ #include "game.h" // Args : frect_t bounds, double speed -void transform_component_init(component_t *component, va_list args) +int transform_component_init(component_t *component, va_list args) { transform_component_data_t *const component_data = component->component_data; @@ -12,14 +12,18 @@ void transform_component_init(component_t *component, va_list args) component_data->velocity.x = 0.0f; component_data->velocity.y = 0.0f; + + return EXIT_SUCCESS; } -void transform_component_update(component_t *component) +int transform_component_update(component_t *component) { transform_component_data_t *component_data = component->component_data; component_data->bounds.x += component_data->velocity.x * component_data->speed * (float)game.delta_time_ms / 1000.0f; component_data->bounds.y += component_data->velocity.y * component_data->speed * (float)game.delta_time_ms / 1000.0f; + + return EXIT_SUCCESS; } inline void transform_component_destroy(component_t *component) diff --git a/src/game.c b/src/game.c index 83b4dba..2194e7f 100644 --- a/src/game.c +++ b/src/game.c @@ -17,7 +17,7 @@ int game_init(void) entity_t *player = create_entity(0); - entity_manager_add_entity(&game.entity_manager, player); + if(entity_manager_add_entity(&game.entity_manager, player)) return EXIT_FAILURE; frect_t player_bounds = {10.0f, 10.0f, 32.0f, 32.0f}; @@ -58,9 +58,15 @@ void game_handle_event(void) } } -void game_update(void) +int game_update(void) { - entity_manager_update(&game.entity_manager); + if(entity_manager_update(&game.entity_manager)) + { + game.is_running = false; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; } int game_render(void) @@ -77,7 +83,6 @@ int game_render(void) return EXIT_FAILURE; } - display_update(); return EXIT_SUCCESS;