diff --git a/assets/Makefile b/assets/Makefile index f2f59d9..6921842 100644 --- a/assets/Makefile +++ b/assets/Makefile @@ -1,5 +1,4 @@ ASSETS := \ - misc/dummy_sheet.png \ player_sheets/player_idle_sheet.png \ player_sheets/player_walk_sheet.png \ player_sheets/player_run_sheet.png \ diff --git a/assets/misc/dummy_sheet.png b/assets/misc/dummy_sheet.png deleted file mode 100644 index b867a45..0000000 Binary files a/assets/misc/dummy_sheet.png and /dev/null differ diff --git a/src/components/animation_system.c b/src/components/animation_system.c index 09c165b..577e01d 100644 --- a/src/components/animation_system.c +++ b/src/components/animation_system.c @@ -16,18 +16,10 @@ int animation_system_init(component_t *component) } system_data->sprite_component_data = sprite_component->data; - system_data->nb_frames = 1; - system_data->current_frame_nb = 0; linked_list_init(&system_data->frames, sizeof(rect_t), NULL, NULL); - animation_system_create_frames_clips(system_data); - system_data->frame_delay_ms = 0.0f; system_data->frame_timer_ms = 0.0f; - system_data->play = false; - system_data->loop = false; - system_data->reverse = false; - return EXIT_SUCCESS; } diff --git a/src/components/door_component.c b/src/components/door_component.c index 22346ea..5ad94a8 100644 --- a/src/components/door_component.c +++ b/src/components/door_component.c @@ -47,10 +47,6 @@ inline int door_component_init(component_t *component) } component_data->hitbox_component_data = hitbox_component->data; - component_data->topic_id = 0; - event_bus_subscribe(&game.event_bus, component_data->topic_id, door_component_callback, component->entity); - - component_data->state = false; component_data->last_state = false; return EXIT_SUCCESS; @@ -83,3 +79,10 @@ inline int door_component_destroy(component_t *component) return EXIT_SUCCESS; } + +inline int door_component_subscribe(door_component_data_t *component_data, entity_t *entity) +{ + if(event_bus_subscribe(&game.event_bus, component_data->topic_id, door_component_callback, entity)) return_failure_int; + + return EXIT_SUCCESS; +} diff --git a/src/components/headers/animation_system.h b/src/components/headers/animation_system.h index b1cd817..7b308e0 100644 --- a/src/components/headers/animation_system.h +++ b/src/components/headers/animation_system.h @@ -28,8 +28,6 @@ int animation_system_update(component_t *component); int animation_system_destroy(component_t *component); -int animation_system_create_frames_clips(animation_system_data_t *system_data); - int animation_system_apply_changes(animation_system_data_t *system_data); #endif // SPRITE_COMPONENT_H \ No newline at end of file diff --git a/src/components/headers/door_component.h b/src/components/headers/door_component.h index 712764a..2a7de31 100644 --- a/src/components/headers/door_component.h +++ b/src/components/headers/door_component.h @@ -24,4 +24,6 @@ int door_component_update(component_t *component); int door_component_destroy(component_t *component); +int door_component_subscribe(door_component_data_t *component_data, entity_t *entity); + #endif // DOOR_COMPONENT_H \ No newline at end of file diff --git a/src/components/headers/interact_component.h b/src/components/headers/interact_component.h index 2cac944..a8fc674 100644 --- a/src/components/headers/interact_component.h +++ b/src/components/headers/interact_component.h @@ -36,6 +36,6 @@ int interact_component_destroy(component_t *component); int interact_component_interact(interact_component_data_t *component_data); -int interact_component_modify_topic(interact_component_data_t *component_data, size_t id); +int interact_component_modify_topic_id(interact_component_data_t *component_data, size_t id); #endif // TRANSFORM_COMPONENT_H \ No newline at end of file diff --git a/src/components/headers/lever_component.h b/src/components/headers/lever_component.h index d81d4b0..f6744d6 100644 --- a/src/components/headers/lever_component.h +++ b/src/components/headers/lever_component.h @@ -22,4 +22,6 @@ int lever_component_update(component_t *component); int lever_component_destroy(component_t *component); +int lever_component_subscribe(lever_component_data_t *component_data, entity_t *entity); + #endif // LEVER_COMPONENT_H \ No newline at end of file diff --git a/src/components/hitbox_component.c b/src/components/hitbox_component.c index 798c62b..fd51e56 100644 --- a/src/components/hitbox_component.c +++ b/src/components/hitbox_component.c @@ -37,8 +37,8 @@ inline int hitbox_component_update(component_t *component) hitbox_component_data_t *component_data = component->data; const transform_component_data_t *transform_component_data = component_data->transform_component_data; - component_data->bounds.x = transform_component_data->bounds.x + (transform_component_data->bounds.w - component_data->bounds.w) * component_data->position.x; - component_data->bounds.y = transform_component_data->bounds.y + (transform_component_data->bounds.h - component_data->bounds.h) * component_data->position.y; + component_data->bounds.x = transform_component_data->bounds.x + transform_component_data->bounds.w * component_data->position.x; + component_data->bounds.y = transform_component_data->bounds.y + transform_component_data->bounds.h * component_data->position.y; component_data->bounds.w = transform_component_data->bounds.w * component_data->scale.x; component_data->bounds.h = transform_component_data->bounds.h * component_data->scale.y; diff --git a/src/components/interact_component.c b/src/components/interact_component.c index 4a9b9fb..2b6f879 100644 --- a/src/components/interact_component.c +++ b/src/components/interact_component.c @@ -27,11 +27,8 @@ inline int interact_component_init(component_t *component) }; component_data->topic_id = 0; - component_data->type = INTERACT_TOGGLE; if(event_bus_new_topic(&game.event_bus, component_data->topic_id)) return_failure_int; - component_data->state = 0; - component_data->activated = true; @@ -43,8 +40,8 @@ inline int interact_component_update(component_t *component) interact_component_data_t *component_data = component->data; const transform_component_data_t *transform_component_data = component_data->transform_component_data; - component_data->bounds.x = transform_component_data->bounds.x + (transform_component_data->bounds.w - component_data->bounds.w) * component_data->position.x; - component_data->bounds.y = transform_component_data->bounds.y + (transform_component_data->bounds.h - component_data->bounds.h) * component_data->position.y; + component_data->bounds.x = transform_component_data->bounds.x + transform_component_data->bounds.w * component_data->position.x; + component_data->bounds.y = transform_component_data->bounds.y + transform_component_data->bounds.h * component_data->position.y; component_data->bounds.w = transform_component_data->bounds.w * component_data->scale.x; component_data->bounds.h = transform_component_data->bounds.h * component_data->scale.y; @@ -91,7 +88,7 @@ inline int interact_component_interact(interact_component_data_t *component_data return EXIT_SUCCESS; } -inline int interact_component_modify_topic(interact_component_data_t *component_data, size_t id) +inline int interact_component_modify_topic_id(interact_component_data_t *component_data, size_t id) { if(event_bus_change_topic_id(&game.event_bus, component_data->topic_id, id)) return_failure_int; diff --git a/src/components/lever_component.c b/src/components/lever_component.c index 23ab9f5..65163f7 100644 --- a/src/components/lever_component.c +++ b/src/components/lever_component.c @@ -39,10 +39,6 @@ inline int lever_component_init(component_t *component) } component_data->animation_system_data = animation_system->data; - component_data->topic_id = 0; - event_bus_subscribe(&game.event_bus, component_data->topic_id, lever_component_callback, component->entity); - - component_data->state = false; component_data->last_state = false; return EXIT_SUCCESS; @@ -72,3 +68,10 @@ inline int lever_component_destroy(component_t *component) return EXIT_SUCCESS; } + +inline int lever_component_subscribe(lever_component_data_t *component_data, entity_t *entity) +{ + if(event_bus_subscribe(&game.event_bus, component_data->topic_id, lever_component_callback, entity)) return_failure_int; + + return EXIT_SUCCESS; +} diff --git a/src/components/sprite_component.c b/src/components/sprite_component.c index 3056c00..0d3fb97 100644 --- a/src/components/sprite_component.c +++ b/src/components/sprite_component.c @@ -18,8 +18,6 @@ inline int sprite_component_init(component_t *component) transform_component_data_t *transform_component_data = component_data->transform_component_data; - if(sprite_component_set_texture(component_data, "dummy_sheet")) return EXIT_FAILURE; - frect_to_rect(&transform_component_data->bounds, &component_data->src_rect); component_data->src_rect.x = 0; component_data->src_rect.y = 0; diff --git a/src/game.c b/src/game.c index ef13da2..ad05b16 100644 --- a/src/game.c +++ b/src/game.c @@ -27,179 +27,318 @@ int game_init(void) if(asset_manager_load_asset(&game.asset_manager, "tileset", ASSET_TEXTURE)) return_failure_int; /* ======== Player ======== */ - entity_t *player_entity = entity_manager_new_entity(&game.entity_manager, 0); - if(!player_entity) return EXIT_FAILURE; + { + entity_t *player_entity = entity_manager_new_entity(&game.entity_manager, 0); + if(!player_entity) return_failure_int; - component_t *component = entity_new_component(player_entity, TRANSFORM_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *transform_component = entity_new_component(player_entity, TRANSFORM_COMPONENT); + if(!transform_component) return_failure_int; - ((transform_component_data_t *)component->data)->bounds = (frect_t) { - .x = 10.0f, - .y = 10.0f, - .w = 32.0f, - .h = 32.0f - }; + transform_component_data_t *transform_component_data = transform_component->data; - if(!entity_new_component(player_entity, SPRITE_COMPONENT)) return EXIT_FAILURE; + transform_component_data->bounds = (frect_t) { + .x = 10.0f, + .y = 10.0f, + .w = 32.0f, + .h = 32.0f + }; + } - component = entity_new_component(player_entity, ANIMATION_SYSTEM); - if(!component) return EXIT_FAILURE; + { + component_t *sprite_component = entity_new_component(player_entity, SPRITE_COMPONENT); + if(!sprite_component) return_failure_int; - ((animation_system_data_t *)component->data)->loop = true; - ((animation_system_data_t *)component->data)->play = true; + sprite_component_data_t *sprite_component_data = sprite_component->data; - component = entity_new_component(player_entity, HITBOX_COMPONENT); - if(!component) return EXIT_FAILURE; + sprite_component_set_texture(sprite_component_data, "player_idle_sheet"); + } - ((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { - .x = 0.5f, - .y = 1.0f - }; + { + component_t *animation_system = entity_new_component(player_entity, ANIMATION_SYSTEM); + if(!animation_system) return_failure_int; - ((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { - .x = 0.5f, - .y = 1.0f / 3.0f - }; + animation_system_data_t *animation_system_data = animation_system->data; - if(!entity_new_component(player_entity, PHYSICS_SYSTEM)) return EXIT_FAILURE; + if(linked_list_reserve(&animation_system_data->frames, 8)) return_failure_int; - if(!entity_new_component(player_entity, PLAYER_SYSTEM)) return EXIT_FAILURE; + animation_system_data->current_frame_nb = 0; + animation_system_data->nb_frames = 4; + if(animation_system_apply_changes(animation_system_data)) return_failure_int; + animation_system_data->play = true; + animation_system_data->loop = true; + animation_system_data->reverse = false; + } + + { + component_t *hitbox_component = entity_new_component(player_entity, HITBOX_COMPONENT); + if(!hitbox_component) return_failure_int; + + hitbox_component_data_t * hitbox_component_data = hitbox_component->data; + + hitbox_component_data->position = (fvector2d_t) { + .x = 0.25f, + .y = 0.6875f + }; + + hitbox_component_data->scale = (fvector2d_t) { + .x = 0.5f, + .y = 0.3125f + }; + } + + if(!entity_new_component(player_entity, PHYSICS_SYSTEM)) return_failure_int; + + if(!entity_new_component(player_entity, PLAYER_SYSTEM)) return_failure_int; + } /* ======== Lever ========*/ - entity_t *lever_entity = entity_manager_new_entity(&game.entity_manager, 1); - if(!lever_entity) return EXIT_FAILURE; + { + entity_t *lever_entity = entity_manager_new_entity(&game.entity_manager, 1); + if(!lever_entity) return_failure_int; - component = entity_new_component(lever_entity, TRANSFORM_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *transform_component = entity_new_component(lever_entity, TRANSFORM_COMPONENT); + if(!transform_component) return_failure_int; - ((transform_component_data_t *)component->data)->bounds = (frect_t) { - .x = 30.0f, - .y = 120.0f, - .w = 48.0f, - .h = 32.0f - }; + transform_component_data_t *transform_component_data = transform_component->data; - component = entity_new_component(lever_entity, SPRITE_COMPONENT); - if(!component) return EXIT_FAILURE; + transform_component_data->bounds = (frect_t) { + .x = 30.0f, + .y = 120.0f, + .w = 48.0f, + .h = 32.0f + }; + } - if(sprite_component_set_texture(component->data, "lever_sheet")) return EXIT_FAILURE; + { + component_t *sprite_component = entity_new_component(lever_entity, SPRITE_COMPONENT); + if(!sprite_component) return_failure_int; - component = entity_new_component(lever_entity, ANIMATION_SYSTEM); - if(!component) return EXIT_FAILURE; + sprite_component_data_t *sprite_component_data = sprite_component->data; - ((animation_system_data_t *)component->data)->nb_frames = 3; - ((animation_system_data_t *)component->data)->frame_delay_ms = LEVER_DEFAULT_ANIMATION_SPEED; - if(animation_system_create_frames_clips(component->data)) return EXIT_FAILURE; + if(sprite_component_set_texture(sprite_component_data, "lever_sheet")) return_failure_int; + } - component = entity_new_component(lever_entity, HITBOX_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *animation_system = entity_new_component(lever_entity, ANIMATION_SYSTEM); + if(!animation_system) return_failure_int; - ((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { - .x = 0.5f, - .y = 0.9f - }; + animation_system_data_t *animation_system_data = animation_system->data; - ((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { - .x = 1.0f / 3.0f, - .y = 0.3f - }; + animation_system_data->nb_frames = 3; + animation_system_data->current_frame_nb = 0; + animation_system_data->frame_delay_ms = LEVER_DEFAULT_ANIMATION_SPEED; - component = entity_new_component(lever_entity, INTERACT_COMPONENT); - if(!component) return EXIT_FAILURE; + animation_system_data->play = false; + animation_system_data->loop = false; + animation_system_data->reverse = false; - ((interact_component_data_t *)component->data)->position = (fvector2d_t) { - .x = 0.5f, - .y = 1.9f - }; + if(animation_system_apply_changes(animation_system_data)) return_failure_int; + } - ((interact_component_data_t *)component->data)->scale = (fvector2d_t) { - .x = 2.0f / 3.0f, - .y = 0.8f - }; + { + component_t *hitbox_component = entity_new_component(lever_entity, HITBOX_COMPONENT); + if(!hitbox_component) return_failure_int; - if(!entity_new_component(lever_entity, LEVER_COMPONENT)) return EXIT_FAILURE; + hitbox_component_data_t *hitbox_component_data = hitbox_component->data; + + hitbox_component_data->position = (fvector2d_t) { + .x = 0.3333333333333333f, + .y = 0.59375 + }; + + hitbox_component_data->scale = (fvector2d_t) { + .x = 0.3333333333333333f, + .y = 0.34375f + }; + } + + { + component_t *interact_component = entity_new_component(lever_entity, INTERACT_COMPONENT); + if(!interact_component) return_failure_int; + + interact_component_data_t *interact_component_data = interact_component->data; + + interact_component_data->position = (fvector2d_t) { + .x = 0.16666666666666666f, + .y = 0.34375f + }; + + interact_component_data->scale = (fvector2d_t) { + .x = 0.6666666666666666f, + .y = 0.84375f + }; + + interact_component_data->type = INTERACT_TOGGLE; + interact_component_data->state = 0; + + interact_component_modify_topic_id(interact_component_data, 0); + + } + + { + component_t *lever_component = entity_new_component(lever_entity, LEVER_COMPONENT); + if(!lever_component) return_failure_int; + + lever_component_data_t * lever_component_data = lever_component->data; + + lever_component_data->topic_id = 0; + lever_component_data->state = false; + + lever_component_subscribe(lever_component_data, lever_entity); + } + } /* ======== Door ======== */ - entity_t *door_entity = entity_manager_new_entity(&game.entity_manager, 1); - if(!lever_entity) return EXIT_FAILURE; + { + entity_t *door_entity = entity_manager_new_entity(&game.entity_manager, 1); + if(!door_entity) return_failure_int; - component = entity_new_component(door_entity, TRANSFORM_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *transform_component = entity_new_component(door_entity, TRANSFORM_COMPONENT); + if(!transform_component) return_failure_int; - ((transform_component_data_t *)component->data)->bounds = (frect_t) { - .x = 120.0f, - .y = 30.0f, - .w = 32.0f, - .h = 48.0f - }; + transform_component_data_t *transform_component_data = transform_component->data; - component = entity_new_component(door_entity, SPRITE_COMPONENT); - if(!component) return EXIT_FAILURE; + transform_component_data->bounds = (frect_t) { + .x = 120.0f, + .y = 30.0f, + .w = 32.0f, + .h = 48.0f + }; + } - if(sprite_component_set_texture(component->data, "barred_door_sheet")) return EXIT_FAILURE; + { + component_t *sprite_component = entity_new_component(door_entity, SPRITE_COMPONENT); + if(!sprite_component) return_failure_int; - component = entity_new_component(door_entity, ANIMATION_SYSTEM); - if(!component) return EXIT_FAILURE; + sprite_component_data_t * sprite_component_data = sprite_component->data; - ((animation_system_data_t *)component->data)->nb_frames = 8; - ((animation_system_data_t *)component->data)->frame_delay_ms = BARRED_DOOR_DEFAULT_ANIMATION_SPEED; - if(animation_system_create_frames_clips(component->data)) return EXIT_FAILURE; + if(sprite_component_set_texture(sprite_component_data, "barred_door_sheet")) return_failure_int; + } - component = entity_new_component(door_entity, HITBOX_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *animation_system = entity_new_component(door_entity, ANIMATION_SYSTEM); + if(!animation_system) return_failure_int; - ((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { - .x = 0.5f, - .y = 1.0f - }; + animation_system_data_t *animation_system_data = animation_system->data; - ((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { - .x = 1.0f, - .y = 1.0f / 7.0f - }; + animation_system_data->nb_frames = 8; + animation_system_data->current_frame_nb = 0; + animation_system_data->frame_delay_ms = BARRED_DOOR_DEFAULT_ANIMATION_SPEED; - if(!entity_new_component(door_entity, DOOR_COMPONENT)) return EXIT_FAILURE; + animation_system_data->play = false; + animation_system_data->loop = false; + animation_system_data->reverse = false; + + if(animation_system_apply_changes(animation_system->data)) return_failure_int; + } + + { + component_t *hitbox_component = entity_new_component(door_entity, HITBOX_COMPONENT); + if(!hitbox_component) return_failure_int; + + hitbox_component_data_t * hitbox_component_data = hitbox_component->data; + + hitbox_component_data->position = (fvector2d_t) { + .x = 0.0f, + .y = 0.8333333333333334f + }; + + hitbox_component_data->scale = (fvector2d_t) { + .x = 1.0f, + .y = 0.16666666666666666f + }; + } + + { + component_t *door_component = entity_new_component(door_entity, DOOR_COMPONENT); + if(!door_component) return_failure_int; + + door_component_data_t * door_component_data = door_component->data; + + door_component_data->topic_id = 0; + door_component_data->state = false; + + door_component_subscribe(door_component_data, door_entity); + } + } /* ======== Door 2 ======== */ - entity_t *door2_entity = entity_manager_new_entity(&game.entity_manager, 1); - if(!lever_entity) return EXIT_FAILURE; + { + entity_t *door2_entity = entity_manager_new_entity(&game.entity_manager, 1); + if(!door2_entity) return_failure_int; - component = entity_new_component(door2_entity, TRANSFORM_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *transform_component = entity_new_component(door2_entity, TRANSFORM_COMPONENT); + if(!transform_component) return_failure_int; - ((transform_component_data_t *)component->data)->bounds = (frect_t) { - .x = 240.0f, - .y = 30.0f, - .w = 32.0f, - .h = 48.0f - }; + transform_component_data_t *transform_component_data = transform_component->data; - component = entity_new_component(door2_entity, SPRITE_COMPONENT); - if(!component) return EXIT_FAILURE; + transform_component_data->bounds = (frect_t) { + .x = 240.0f, + .y = 30.0f, + .w = 32.0f, + .h = 48.0f + }; + } - if(sprite_component_set_texture(component->data, "wooden_door_sheet")) return EXIT_FAILURE; + { + component_t *sprite_component = entity_new_component(door2_entity, SPRITE_COMPONENT); + if(!sprite_component) return_failure_int; - component = entity_new_component(door2_entity, ANIMATION_SYSTEM); - if(!component) return EXIT_FAILURE; + sprite_component_data_t *sprite_component_data = sprite_component->data; - ((animation_system_data_t *)component->data)->nb_frames = 6; - ((animation_system_data_t *)component->data)->frame_delay_ms = WOODEN_DOOR_DEFAULT_ANIMATION_SPEED; - if(animation_system_create_frames_clips(component->data)) return EXIT_FAILURE; + if(sprite_component_set_texture(sprite_component_data, "wooden_door_sheet")) return_failure_int; + } - component = entity_new_component(door2_entity, HITBOX_COMPONENT); - if(!component) return EXIT_FAILURE; + { + component_t *animation_system = entity_new_component(door2_entity, ANIMATION_SYSTEM); + if(!animation_system) return_failure_int; - ((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { - .x = 0.5f, - .y = 1.0f - }; + animation_system_data_t *animation_system_data = animation_system->data; - ((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { - .x = 1.0f, - .y = 1.0f / 7.0f - }; + animation_system_data->nb_frames = 6; + animation_system_data->current_frame_nb = 0; + animation_system_data->frame_delay_ms = WOODEN_DOOR_DEFAULT_ANIMATION_SPEED; - if(!entity_new_component(door2_entity, DOOR_COMPONENT)) return EXIT_FAILURE; + animation_system_data->play = false; + animation_system_data->loop = false; + animation_system_data->reverse = false; + + if(animation_system_apply_changes(animation_system->data)) return_failure_int; + } + + { + component_t *hitbox_component = entity_new_component(door2_entity, HITBOX_COMPONENT); + if(!hitbox_component) return_failure_int; + + hitbox_component_data_t *hitbox_component_data = hitbox_component->data; + + hitbox_component_data->position = (fvector2d_t) { + .x = 0.0f, + .y = 0.8333333333333334f + }; + + hitbox_component_data->scale = (fvector2d_t) { + .x = 1.0f, + .y = 0.16666666666666666f + }; + } + + { + component_t *door_component = entity_new_component(door2_entity, DOOR_COMPONENT); + if(!door_component) return_failure_int; + + door_component_data_t * door_component_data = door_component->data; + + door_component_data->topic_id = 0; + door_component_data->state = false; + + door_component_subscribe(door_component_data, door2_entity); + } + } game.is_running = true;