#pragma once #include "compat/defs.hpp" #include "src/global-coords.hpp" #include "src/rotation.hpp" #include "src/pass-mode.hpp" #include "src/entity-type.hpp" #include #include namespace floormat { template struct entity_type_; struct anim_atlas; struct world; struct chunk; struct entity_proto { std::shared_ptr atlas; Vector2b offset, bbox_offset; Vector2ub bbox_size = Vector2ub(iTILE_SIZE2); std::uint16_t delta = 0, frame = 0; entity_type type = entity_type::none; rotation r : rotation_BITS = rotation::N; pass_mode pass : pass_mode_BITS = pass_mode::see_through; std::int32_t ordinal(local_coords coord) const; entity_proto& operator=(const entity_proto&); entity_proto(); entity_proto(const entity_proto&); bool operator==(const entity_proto&) const; virtual ~entity_proto() noexcept; }; struct entity { fm_DECLARE_DELETED_COPY_ASSIGNMENT(entity); using It = typename std::vector>::const_iterator; const std::uint64_t id = 0; struct chunk& c; std::shared_ptr atlas; global_coords coord; Vector2b offset, bbox_offset; Vector2ub bbox_size; std::uint16_t delta = 0, frame = 0; const entity_type type; rotation r : rotation_BITS = rotation::N; pass_mode pass : pass_mode_BITS = pass_mode::see_through; virtual ~entity() noexcept; static Vector2b ordinal_offset_for_type(entity_type type, Vector2b offset); std::int32_t ordinal() const; static std::int32_t ordinal(local_coords xy, Vector2b offset, entity_type type); struct chunk& chunk() const; It iter() const; virtual bool operator==(const entity_proto& e0) const; operator entity_proto() const; virtual bool can_activate(It it) const; virtual bool activate(It it); virtual bool update(It it, float dt) = 0; virtual void rotate(It it, rotation r); static Pair normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i delta); [[nodiscard]] virtual bool can_move_to(Vector2i delta); static void move(It it, Vector2i delta); void update_bbox(Vector2b bbox_offset, Vector2ub bbox_size); // todo bool is_dynamic() const; friend struct world; protected: entity(std::uint64_t id, struct chunk& c, entity_type type) noexcept; entity(std::uint64_t id, struct chunk& c, entity_type type, const entity_proto& proto) noexcept; }; } // namespace floormat