#pragma once #include "character/CharacterActionTypes.h" #include "common/InteractionHighlightSprite.h" #include "npc/NpcAnimation.h" #include #include #include #include #include namespace frostbite2D { class NpcObject : public Actor { public: NpcObject() = default; ~NpcObject() override = default; bool Construction(int npcId); void SetDirection(int direction); void SetNpcPosition(const Vec2& pos); void SetWorldPosition(const CharacterWorldPosition& pos); void SetInteractable(bool interactable); void SetInteractionHighlighted(bool highlighted); void BeginInteract(); void EndInteract(); bool CanInteract() const; bool IsInteracting() const { return interacting_; } bool IsInteractionHighlighted() const { return interactionHighlighted_; } int GetNpcId() const { return npcId_; } int GetDirection() const { return direction_; } const std::string& GetName() const; const std::string& GetFieldName() const; const std::string& GetDisplayName() const; const CharacterWorldPosition& GetWorldPosition() const { return worldPosition_; } bool IsAnimationFinished() const; const npc::NpcConfig* GetConfig() const { return config_ ? &config_.value() : nullptr; } void Update(float deltaTime) override; void Render() override; private: void EnsureInteractionHighlight(); void EnsureNameLabel(); void RefreshNameLabel(); void SyncInteractionHighlight(); void SyncActorPositionFromWorld(); int npcId_ = -1; int direction_ = 1; CharacterWorldPosition worldPosition_; std::optional config_; RefPtr animation_ = nullptr; RefPtr interactionHighlight_ = nullptr; std::array, 8> nameOutlineLabels_; RefPtr nameLabel_ = nullptr; bool interactable_ = true; bool interacting_ = false; bool interactionHighlighted_ = false; uint64 syncedHighlightCompositeVersion_ = 0; }; } // namespace frostbite2D