Allow hitboxes to hit multiple hurtboxes

scene_man
En Yi 2023-07-03 20:57:17 +08:00
parent 256ea02d0b
commit 5049efb952
1 changed files with 9 additions and 12 deletions

View File

@ -1652,9 +1652,9 @@ void hitbox_update_system(Scene_t* scene)
unsigned int ent_idx; unsigned int ent_idx;
CHitBoxes_t* p_hitbox; CHitBoxes_t* p_hitbox;
sc_map_foreach(&scene->ent_manager.component_map[CHITBOXES_T], ent_idx, p_hitbox) sc_map_foreach(&scene->ent_manager.component_map[CHITBOXES_T], ent_idx, p_hitbox)
{ {
bool hit = false;
Entity_t *p_ent = get_entity(&scene->ent_manager, ent_idx); Entity_t *p_ent = get_entity(&scene->ent_manager, ent_idx);
if (!p_ent->m_alive) continue; if (!p_ent->m_alive) continue;
CTransform_t* p_ctransform = get_component(p_ent, CTRANSFORM_COMP_T); CTransform_t* p_ctransform = get_component(p_ent, CTRANSFORM_COMP_T);
@ -1692,17 +1692,15 @@ void hitbox_update_system(Scene_t* scene)
) )
) )
{ {
hit = true;
if (p_hitbox->atk > tilemap.tiles[tile_idx].def) if (p_hitbox->atk > tilemap.tiles[tile_idx].def)
{ {
change_a_tile(&tilemap, tile_idx, EMPTY_TILE); change_a_tile(&tilemap, tile_idx, EMPTY_TILE);
} continue;
if (p_hitbox->one_hit)
{
remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_ent);
goto hitbox_done;
} }
} }
} }
sc_map_foreach(&tilemap.tiles[tile_idx].entities_set, other_ent_idx, p_other_ent) sc_map_foreach(&tilemap.tiles[tile_idx].entities_set, other_ent_idx, p_other_ent)
{ {
if (other_ent_idx == ent_idx) continue; if (other_ent_idx == ent_idx) continue;
@ -1724,6 +1722,7 @@ void hitbox_update_system(Scene_t* scene)
) )
) )
{ {
hit = true;
if (p_hitbox->atk > p_other_hurtbox->def) if (p_hitbox->atk > p_other_hurtbox->def)
{ {
p_other_hurtbox->damage_src = ent_idx; p_other_hurtbox->damage_src = ent_idx;
@ -1750,19 +1749,17 @@ void hitbox_update_system(Scene_t* scene)
remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_other_ent); remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_other_ent);
} }
if (p_hitbox->one_hit) }
}
}
}
}
if (p_hitbox->one_hit && hit)
{ {
remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_ent); remove_entity_from_tilemap(&scene->ent_manager, &tilemap, p_ent);
goto hitbox_done;
} }
} }
} }
}
}
}
hitbox_done: continue;
}
}
void boulder_destroy_wooden_tile_system(Scene_t* scene) void boulder_destroy_wooden_tile_system(Scene_t* scene)
{ {