diff --git a/modules/wave_survival/enemies/enemy_rifleman.cpp b/modules/wave_survival/enemies/enemy_rifleman.cpp index 8b90f545..4e009a70 100644 --- a/modules/wave_survival/enemies/enemy_rifleman.cpp +++ b/modules/wave_survival/enemies/enemy_rifleman.cpp @@ -1,12 +1,26 @@ #include "enemy_rifleman.h" +#include "core/os/memory.h" +#include "scene/animation/animation_player.h" +#include "wave_survival/macros.h" +#include "wave_survival/state_machine.h" void EnemyRifleman::_bind_methods() { + BIND_PROPERTY(Variant::FLOAT, chase_speed); } -void EnemyRifleman::on_child_entered() { +void EnemyRifleman::on_child_entered(Node *node) { + if (StateMachine * fsm{ cast_to(node) }) { + this->fsm = fsm; + } + if (node->has_node(NodePath("AnimationPlayer"))) { + this->anim = cast_to(node->get_node(NodePath("AnimationPlayer"))); + } } void EnemyRifleman::ready() { + this->fsm->add_state(memnew(RiflemanPatrolState)); + this->fsm->add_state(memnew(RiflemanSeekState)); + this->fsm->add_state(memnew(RiflemanFireState)); } void EnemyRifleman::_notification(int what) { @@ -17,10 +31,46 @@ void EnemyRifleman::_notification(int what) { default: return; case NOTIFICATION_ENTER_TREE: - enter_tree(); + if (!is_ready()) { + connect("child_entered", callable_mp(this, &self_type::on_child_entered)); + } return; case NOTIFICATION_READY: ready(); return; } } + +void EnemyRifleman::set_chase_speed(float speed) { + this->chase_speed = speed; +} + +float EnemyRifleman::get_chase_speed() const { + return this->chase_speed; +} + +AnimationPlayer *EnemyRifleman::get_anim() const { + return this->anim; +} + +void RiflemanState::set_target(Node *node) { + this->target = cast_to(node); +} + +EnemyRifleman *RiflemanState::get_target() const { + return this->target; +} + +NpcUnit *RiflemanState::get_unit() const { + return this->target->get_unit(); +} + +NavigationAgent3D *RiflemanState::get_nav() const { + return this->target->get_nav(); +} + +AnimationPlayer *RiflemanState::get_anim() const { + return this->target->get_anim(); +} + +void diff --git a/modules/wave_survival/enemies/enemy_rifleman.h b/modules/wave_survival/enemies/enemy_rifleman.h index cbc49b41..aad13aba 100644 --- a/modules/wave_survival/enemies/enemy_rifleman.h +++ b/modules/wave_survival/enemies/enemy_rifleman.h @@ -3,31 +3,41 @@ #include "wave_survival/enemy_body.h" #include "wave_survival/state.h" +#include "wave_survival/state_machine.h" class AnimationPlayer; class NavigationAgent3D; class EnemyRifleman : public EnemyBody { GDCLASS(EnemyRifleman, EnemyBody); static void _bind_methods(); - void on_child_entered(); - void enter_tree(); + void on_child_entered(Node *node); void ready(); protected: void _notification(int what); + +public: + void set_chase_speed(float speed); + float get_chase_speed() const; + AnimationPlayer *get_anim() const; + +private: + float chase_speed{ 5.f }; + StateMachine *fsm{ nullptr }; + AnimationPlayer *anim{ nullptr }; }; /* ============================== STATES ============================== */ class RiflemanState : public State { GDCLASS(RiflemanState, State); - static void _bind_methods(); + static void _bind_methods() {} public: virtual void set_target(Node *target) override; EnemyRifleman *get_target() const; NpcUnit *get_unit() const; - NavigationAgent3D *get_agent() const; + NavigationAgent3D *get_nav() const; AnimationPlayer *get_anim() const; private: @@ -36,7 +46,7 @@ private: class RiflemanPatrolState : public RiflemanState { GDCLASS(RiflemanPatrolState, RiflemanState); - static void _bind_methods(); + static void _bind_methods() {} public: virtual void enter_state() override; @@ -45,12 +55,12 @@ public: class RiflemanSeekState : public RiflemanState { GDCLASS(RiflemanSeekState, RiflemanState); - static void _bind_methods(); + static void _bind_methods() {} }; class RiflemanFireState : public RiflemanState { GDCLASS(RiflemanFireState, RiflemanState); - static void _bind_methods(); + static void _bind_methods() {} }; #endif // !ENEMY_RIFLEMAN_H