Skip to content

Commit

Permalink
feat: Add ability activation and blocking methods
Browse files Browse the repository at this point in the history
This commit adds new methods to the AbilityContainer class for activating and blocking abilities. It also includes methods for activating and blocking multiple abilities at once. Additionally, it adds getter methods for retrieving activatable, blockable, and cancellable abilities.
  • Loading branch information
OctoD committed Jan 15, 2024
1 parent 5d20de9 commit 4b6446a
Show file tree
Hide file tree
Showing 2 changed files with 139 additions and 6 deletions.
124 changes: 121 additions & 3 deletions src/system/ability/ability_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,11 @@ void AbilityContainer::_bind_methods()
ClassDB::bind_method(D_METHOD("_get_abilities"), &AbilityContainer::_get_abilities);
ClassDB::bind_method(D_METHOD("_set_abilities", "abilities"), &AbilityContainer::_set_abilities);
ClassDB::bind_method(D_METHOD("activate_by_name", "ability_name"), &AbilityContainer::activate_by_name);
ClassDB::bind_method(D_METHOD("activate_many"), &AbilityContainer::activate_many);
ClassDB::bind_method(D_METHOD("activate", "ability"), &AbilityContainer::activate);
ClassDB::bind_method(D_METHOD("add_ability", "ability"), &AbilityContainer::add_ability);
ClassDB::bind_method(D_METHOD("block_by_name", "ability_name"), &AbilityContainer::block_by_name);
ClassDB::bind_method(D_METHOD("block_many"), &AbilityContainer::block_many);
ClassDB::bind_method(D_METHOD("block", "ability"), &AbilityContainer::block);
ClassDB::bind_method(D_METHOD("can_activate_by_name", "ability_name"), &AbilityContainer::can_activate_by_name);
ClassDB::bind_method(D_METHOD("can_activate", "ability"), &AbilityContainer::can_activate);
Expand All @@ -50,20 +52,25 @@ void AbilityContainer::_bind_methods()
ClassDB::bind_method(D_METHOD("can_cancel_by_name", "ability_name"), &AbilityContainer::can_cancel_by_name);
ClassDB::bind_method(D_METHOD("can_cancel", "ability"), &AbilityContainer::can_cancel);
ClassDB::bind_method(D_METHOD("can_grant", "ability"), &AbilityContainer::can_grant);
ClassDB::bind_method(D_METHOD("can_revoke", "ability"), &AbilityContainer::can_revoke);
ClassDB::bind_method(D_METHOD("cancel_by_name", "ability_name"), &AbilityContainer::cancel_by_name);
ClassDB::bind_method(D_METHOD("cancel_many"), &AbilityContainer::cancel_many);
ClassDB::bind_method(D_METHOD("cancel", "ability"), &AbilityContainer::cancel);
ClassDB::bind_method(D_METHOD("get_abilities"), &AbilityContainer::get_abilities);
ClassDB::bind_method(D_METHOD("get_ability_owner"), &AbilityContainer::get_ability_owner);
ClassDB::bind_method(D_METHOD("get_ability", "ability_name"), &AbilityContainer::get_ability);
ClassDB::bind_method(D_METHOD("get_activatable_abilities"), &AbilityContainer::get_activatable_abilities);
ClassDB::bind_method(D_METHOD("get_blockable_abilities"), &AbilityContainer::get_blockable_abilities);
ClassDB::bind_method(D_METHOD("get_cancellable_abilities"), &AbilityContainer::get_cancellable_abilities);
ClassDB::bind_method(D_METHOD("grant_abilities"), &AbilityContainer::grant_abilities);
ClassDB::bind_method(D_METHOD("grant_ability", "ability"), &AbilityContainer::grant_ability);
ClassDB::bind_method(D_METHOD("has_ability_owner"), &AbilityContainer::has_ability_owner);
ClassDB::bind_method(D_METHOD("has_ability", "ability"), &AbilityContainer::has_ability);
ClassDB::bind_method(D_METHOD("set_abilities", "abilities"), &AbilityContainer::set_abilities);
ClassDB::bind_method(D_METHOD("set_ability_owner", "ability_owner"), &AbilityContainer::set_ability_owner);
ClassDB::bind_method(D_METHOD("revoke_all"), &AbilityContainer::revoke_all);
ClassDB::bind_method(D_METHOD("revoke_by_name", "ability_name"), &AbilityContainer::revoke_by_name);
ClassDB::bind_method(D_METHOD("revoke", "ability"), &AbilityContainer::revoke);
ClassDB::bind_method(D_METHOD("revoke_all"), &AbilityContainer::revoke_all);
ClassDB::bind_method(D_METHOD("set_abilities", "abilities"), &AbilityContainer::set_abilities);
ClassDB::bind_method(D_METHOD("set_ability_owner", "ability_owner"), &AbilityContainer::set_ability_owner);

ClassDB::bind_method(D_METHOD("_handle_ability_enqueued", "ability"), &AbilityContainer::_handle_ability_enqueued);
ClassDB::bind_method(D_METHOD("_handle_ability_dequeued", "ability"), &AbilityContainer::_handle_ability_dequeued);
Expand Down Expand Up @@ -177,6 +184,19 @@ void AbilityContainer::activate(Ability *p_ability)
}
}

void AbilityContainer::activate_many()
{
TypedArray<Ability> activatable_abilities = get_activatable_abilities();

for (int i = 0; i < activatable_abilities.size(); i++)
{
Variant variant = activatable_abilities[i];
Ability *ability = cast_to<Ability>(variant);

activate(ability);
}
}

void AbilityContainer::activate_by_name(const StringName &p_ability_name)
{
AbilityGrant *ability_grant = get_ability_grant(p_ability_name);
Expand Down Expand Up @@ -241,6 +261,19 @@ void AbilityContainer::block(Ability *p_ability)
}
}

void AbilityContainer::block_many()
{
TypedArray<Ability> blockable_abilities = get_blockable_abilities();

for (int i = 0; i < blockable_abilities.size(); i++)
{
Variant variant = blockable_abilities[i];
Ability *ability = cast_to<Ability>(variant);

block(ability);
}
}

void AbilityContainer::block_by_name(const StringName &p_ability_name)
{
AbilityGrant *ability_grant = get_ability_grant(p_ability_name);
Expand Down Expand Up @@ -374,6 +407,19 @@ void AbilityContainer::cancel(Ability *p_ability)
}
}

void AbilityContainer::cancel_many()
{
TypedArray<Ability> cancellable_abilities = get_cancellable_abilities();

for (int i = 0; i < cancellable_abilities.size(); i++)
{
Variant variant = cancellable_abilities[i];
Ability *ability = cast_to<Ability>(variant);

cancel(ability);
}
}

void AbilityContainer::cancel_by_name(const StringName &p_ability_name)
{
if (can_cancel_by_name(p_ability_name))
Expand Down Expand Up @@ -465,6 +511,78 @@ TypedArray<Ability> AbilityContainer::get_abilities() const
return output;
}

TypedArray<Ability> AbilityContainer::get_activatable_abilities() const
{
TypedArray<Ability> out = TypedArray<Ability>();

for (int i = 0; i < abilities.size(); i++)
{
Variant variant = abilities[i];
AbilityGrant *ability_grant = cast_to<AbilityGrant>(variant);

if (ability_grant != nullptr)
{
Ref<Ability> ability = Ref<Ability>(ability_grant->get_ability());
Ability *ability_ptr = ability.ptr();

if (ability != nullptr && ability.is_valid() && can_activate(ability_ptr))
{
out.append(ability_ptr);
}
}
}

return out;
}

TypedArray<Ability> AbilityContainer::get_blockable_abilities() const
{
TypedArray<Ability> out = TypedArray<Ability>();

for (int i = 0; i < abilities.size(); i++)
{
Variant variant = abilities[i];
AbilityGrant *ability_grant = cast_to<AbilityGrant>(variant);

if (ability_grant != nullptr)
{
Ref<Ability> ability = Ref<Ability>(ability_grant->get_ability());
Ability *ability_ptr = ability.ptr();

if (ability != nullptr && ability.is_valid() && can_block(ability_ptr))
{
out.append(ability_ptr);
}
}
}

return out;
}

TypedArray<Ability> AbilityContainer::get_cancellable_abilities() const
{
TypedArray<Ability> out = TypedArray<Ability>();

for (int i = 0; i < abilities.size(); i++)
{
Variant variant = abilities[i];
AbilityGrant *ability_grant = cast_to<AbilityGrant>(variant);

if (ability_grant != nullptr)
{
Ref<Ability> ability = Ref<Ability>(ability_grant->get_ability());
Ability *ability_ptr = ability.ptr();

if (ability != nullptr && ability.is_valid() && can_cancel(ability_ptr))
{
out.append(ability_ptr);
}
}
}

return out;
}

Node *AbilityContainer::get_ability_owner() const
{
return ability_owner;
Expand Down
21 changes: 18 additions & 3 deletions src/system/ability/ability_container.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,22 @@ namespace ggs
/// @brief Activates an ability.
/// @param p_ability The ability to activate.
void activate(Ability *p_ability);
/// @brief Activates all abilities which meet their own requirements.
void activate_many();
/// @brief Activates an ability by name.
/// @param p_ability_name The name of the ability to activate.
void activate_by_name(const StringName &p_ability_name);
/// @brief Adds an ability.
/// @param p_ability The ability to add.
void add_ability(Ability *p_ability);
/// @brief Blocks an ability.
/// @param p_ability The ability to block.
void block(Ability *p_ability);
/// @brief Blocks all abilities which meet their own requirements.
void block_many();
/// @brief Blocks an ability by name.
/// @param p_ability_name The name of the ability to block.
void block_by_name(const StringName &p_ability_name);
/// @brief Adds an ability.
/// @param p_ability The ability to add.
void add_ability(Ability *p_ability);
/// @brief Returns if the container can activate an ability.
/// @param p_ability The ability to check for.
/// @return True if the container can activate the ability, false otherwise.
Expand Down Expand Up @@ -109,6 +113,8 @@ namespace ggs
/// @brief Cancels an ability.
/// @param p_ability The ability to cancel.
void cancel(Ability *p_ability);
/// @brief Cancels all abilities which meet their own requirements.
void cancel_many();
/// @brief Cancels an ability by name.
/// @param p_ability_name The name of the ability to cancel.
void cancel_by_name(const StringName &p_ability_name);
Expand All @@ -126,6 +132,15 @@ namespace ggs
/// @brief Gets the abilities.
/// @return The abilities.
TypedArray<Ability> get_abilities() const;
/// @brief Gets all the activatable abilities.
/// @return The activatable abilities.
TypedArray<Ability> get_activatable_abilities() const;
/// @brief Gets the blockable abilities.
/// @return The blockable abilities.
TypedArray<Ability> get_blockable_abilities() const;
/// @brief Gets the cancellable abilities.
/// @return The cancellable abilities.
TypedArray<Ability> get_cancellable_abilities() const;
/// @brief Returns the owner of the abilities.
/// @return The owner of the abilities.
Node *get_ability_owner() const;
Expand Down

0 comments on commit 4b6446a

Please sign in to comment.