From fc2001e428041919753d34cf7ce469937c28e838 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 17 Jun 2023 11:50:23 +0800 Subject: [PATCH] Add system to destroy one-way tile with boulder --- scenes/editor_scene.c | 1 + scenes/game_systems.c | 37 +++++++++++++++++++++++++++++++++++++ scenes/game_systems.h | 1 + 3 files changed, 39 insertions(+) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index cabb96b..152720f 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -425,6 +425,7 @@ void init_level_scene(LevelScene_t* scene) sc_array_add(&scene->scene.systems, &moveable_update_system); sc_array_add(&scene->scene.systems, &movement_update_system); + sc_array_add(&scene->scene.systems, &boulder_destroy_wooden_tile_system); sc_array_add(&scene->scene.systems, &update_tilemap_system); sc_array_add(&scene->scene.systems, &tile_collision_system); sc_array_add(&scene->scene.systems, &update_tilemap_system); diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 993d71e..60ffbb0 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -1437,6 +1437,43 @@ void hitbox_update_system(Scene_t* scene) } } +void boulder_destroy_wooden_tile_system(Scene_t* scene) +{ + LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); + TileGrid_t tilemap = data->tilemap; + Entity_t* p_boulder; + sc_map_foreach_value(&scene->ent_manager.entities_map[BOULDER_ENT_TAG], p_boulder) + { + const CTransform_t* p_ctransform = get_component(p_boulder, CTRANSFORM_COMP_T); + const CBBox_t* p_bbox = get_component(p_boulder, CBBOX_COMP_T); + + if (p_ctransform->velocity.y <= 0) continue; + + unsigned int tile_idx = get_tile_idx( + p_ctransform->position.x + p_bbox->half_size.x, + p_ctransform->position.y + p_bbox->size.y, + tilemap.width + ); + unsigned int tile_x = (p_ctransform->position.x + p_bbox->half_size.x) / TILE_SIZE; + + if (tilemap.tiles[tile_idx].tile_type == ONEWAY_TILE) + { + tilemap.tiles[tile_idx].tile_type = EMPTY_TILE; + tilemap.tiles[tile_idx].solid = NOT_SOLID; + if (tile_x > 0 && tilemap.tiles[tile_idx - 1].tile_type == ONEWAY_TILE) + { + tilemap.tiles[tile_idx - 1].tile_type = EMPTY_TILE; + tilemap.tiles[tile_idx - 1].solid = NOT_SOLID; + } + if (tile_x < tilemap.width && tilemap.tiles[tile_idx + 1].tile_type == ONEWAY_TILE) + { + tilemap.tiles[tile_idx + 1].tile_type = EMPTY_TILE; + tilemap.tiles[tile_idx + 1].solid = NOT_SOLID; + } + } + } +} + void sprite_animation_system(Scene_t* scene) { unsigned int ent_idx; diff --git a/scenes/game_systems.h b/scenes/game_systems.h index 0e427b4..8e4937f 100644 --- a/scenes/game_systems.h +++ b/scenes/game_systems.h @@ -18,6 +18,7 @@ void state_transition_update_system(Scene_t* scene); void update_tilemap_system(Scene_t* scene); void hitbox_update_system(Scene_t* scene); void sprite_animation_system(Scene_t* scene); +void boulder_destroy_wooden_tile_system(Scene_t* scene); void camera_update_system(Scene_t* scene); void player_dir_reset_system(Scene_t* scene); void player_respawn_system(Scene_t* scene);