feat: OnAttack behavior (#1853)

Adds the `OnAttack` property behavior starting node.
Tested that having the node allows the model to be attacked to trigger the start of behaviors
This commit is contained in:
David Markowitz
2025-08-01 01:09:16 -07:00
committed by GitHub
parent c9e95839ee
commit c083f21e44
11 changed files with 111 additions and 6 deletions

View File

@@ -184,3 +184,7 @@ void PropertyBehavior::Update(float deltaTime, ModelComponent& modelComponent) {
void PropertyBehavior::OnChatMessageReceived(const std::string& sMessage) {
for (auto& state : m_States | std::views::values) state.OnChatMessageReceived(sMessage);
}
void PropertyBehavior::OnHit() {
for (auto& state : m_States | std::views::values) state.OnHit();
}

View File

@@ -42,6 +42,7 @@ public:
void Update(float deltaTime, ModelComponent& modelComponent);
void OnChatMessageReceived(const std::string& sMessage);
void OnHit();
private:
// The current active behavior state. Behaviors can only be in ONE state at a time.

View File

@@ -170,3 +170,7 @@ void State::Update(float deltaTime, ModelComponent& modelComponent) {
void State::OnChatMessageReceived(const std::string& sMessage) {
for (auto& strip : m_Strips) strip.OnChatMessageReceived(sMessage);
}
void State::OnHit() {
for (auto& strip : m_Strips) strip.OnHit();
}

View File

@@ -24,6 +24,7 @@ public:
void Update(float deltaTime, ModelComponent& modelComponent);
void OnChatMessageReceived(const std::string& sMessage);
void OnHit();
private:
// The strips contained within this state.

View File

@@ -118,6 +118,16 @@ void Strip::OnChatMessageReceived(const std::string& sMessage) {
}
}
void Strip::OnHit() {
if (m_PausedTime > 0.0f || !HasMinimumActions()) return;
const auto& nextAction = GetNextAction();
if (nextAction.GetType() == "OnAttack") {
IncrementAction();
m_WaitingForAction = false;
}
}
void Strip::IncrementAction() {
if (m_Actions.empty()) return;
m_NextActionIndex++;
@@ -259,6 +269,8 @@ void Strip::RemoveStates(ModelComponent& modelComponent) const {
if (prevActionType == "OnInteract") {
modelComponent.RemoveInteract();
Game::entityManager->SerializeEntity(modelComponent.GetParent());
} else if (prevActionType == "OnAttack") {
modelComponent.RemoveAttack();
} else if (prevActionType == "UnSmash") {
modelComponent.RemoveUnSmash();
}
@@ -336,13 +348,14 @@ void Strip::Update(float deltaTime, ModelComponent& modelComponent) {
if (m_NextActionIndex == 0) {
if (nextAction.GetType() == "OnInteract") {
modelComponent.AddInteract();
Game::entityManager->SerializeEntity(entity);
m_WaitingForAction = true;
} else if (nextAction.GetType() == "OnChat") {
Game::entityManager->SerializeEntity(entity);
m_WaitingForAction = true;
// logic here if needed
} else if (nextAction.GetType() == "OnAttack") {
modelComponent.AddAttack();
}
Game::entityManager->SerializeEntity(entity);
m_WaitingForAction = true;
} else { // should be a normal block
ProcNormalAction(deltaTime, modelComponent);
}

View File

@@ -42,6 +42,7 @@ public:
bool HasMinimumActions() const { return m_Actions.size() >= 2; }
void OnChatMessageReceived(const std::string& sMessage);
void OnHit();
private:
// Indicates this Strip is waiting for an action to be taken upon it to progress to its actions
bool m_WaitingForAction{ false };