Support ecs behavior forbidden components that prevent applying it to a certain species
This commit is contained in:
parent
ce287c0416
commit
34ee3f0a6e
1 changed files with 26 additions and 0 deletions
|
|
@ -89,6 +89,8 @@ namespace psemek::util
|
|||
template <typename Behavior, typename ... Args>
|
||||
void apply(Behavior & behavior, Args const & ... args)
|
||||
{
|
||||
if (!check_forbidden(behavior, 0))
|
||||
return;
|
||||
apply_impl(behavior, static_cast<typename Behavior::component_types *>(nullptr), std::make_index_sequence<std::tuple_size_v<typename Behavior::component_types>>{}, args...);
|
||||
}
|
||||
|
||||
|
|
@ -103,6 +105,24 @@ namespace psemek::util
|
|||
std::string name_;
|
||||
species_handle id_;
|
||||
|
||||
template <typename Behavior>
|
||||
bool check_forbidden(Behavior &, typename Behavior::forbidden_component_types * helper)
|
||||
{
|
||||
return check_forbidden_impl(helper);
|
||||
}
|
||||
|
||||
template <typename Behavior>
|
||||
bool check_forbidden(Behavior &, ...)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename ... Components>
|
||||
bool check_forbidden_impl(std::tuple<Components...> *)
|
||||
{
|
||||
return (!get_species_component<Components>() && ...);
|
||||
}
|
||||
|
||||
template <typename Behavior, typename ... Components, std::size_t ... Is, typename ... Args>
|
||||
void apply_impl(Behavior & behavior, std::tuple<Components...> *, std::index_sequence<Is...>, Args const & ... args)
|
||||
{
|
||||
|
|
@ -395,6 +415,12 @@ namespace psemek::util
|
|||
friend auto operator <=> (entity_handle const &, entity_handle const &) = default;
|
||||
};
|
||||
|
||||
template <typename ... Components>
|
||||
struct without
|
||||
{
|
||||
using forbidden_component_types = std::tuple<Components...>;
|
||||
};
|
||||
|
||||
template <typename ... Components>
|
||||
struct behavior
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue