summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-03-18 00:08:33 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-03-18 00:08:33 +0100
commitc7a342d71ee93586b073a8e9c73b8ba6b621266f (patch)
tree4fd99ee3db670fe9933e023d18d74f50abf1311c /src
parent2640db18223b6a93140dd8fdc57d607d4b777f08 (diff)
a
Diffstat (limited to 'src')
-rw-r--r--src/character.cpp45
-rw-r--r--src/character.hpp1
-rw-r--r--src/entity.cpp30
-rw-r--r--src/entity.hpp1
-rw-r--r--src/scenery.cpp10
-rw-r--r--src/scenery.hpp2
6 files changed, 53 insertions, 36 deletions
diff --git a/src/character.cpp b/src/character.cpp
index 67b6ca72..9c69e061 100644
--- a/src/character.cpp
+++ b/src/character.cpp
@@ -51,17 +51,23 @@ constexpr auto arrows_to_dir(bool L, bool R, bool U, bool D)
} // namespace
-character::character(std::uint64_t id, struct chunk& c, entity_type type, const character_proto& proto) :
- entity{id, c, type, proto},
- name{proto.name},
- playable{proto.playable}
+character_proto::character_proto(const character_proto&) = default;
+character_proto::character_proto() = default;
+character_proto::~character_proto() noexcept = default;
+character_proto& character_proto::operator=(const character_proto&) = default;
+character::~character() = default;
+
+bool character_proto::operator==(const entity_proto& e0) const
{
- if (!atlas)
- atlas = loader.anim_atlas("npc-walk", loader.ANIM_PATH);
- entity::set_bbox_(offset, bbox_offset, Vector2ub(iTILE_SIZE2/2), pass);
-}
+ if (type != e0.type)
+ return false;
-character::~character() = default;
+ if (!entity_proto::operator==(e0))
+ return false;
+
+ const auto& s0 = static_cast<const character_proto&>(e0);
+ return name == s0.name && playable == s0.playable;
+}
int character::allocate_frame_time(float dt)
{
@@ -120,4 +126,25 @@ bool character::update(std::size_t i, float dt)
return true;
}
+character::operator character_proto() const
+{
+ character_proto ret;
+ static_cast<entity_proto&>(ret) = entity::operator entity_proto();
+ ret.name = name;
+ ret.playable = playable;
+ return ret;
+}
+
+character::character(std::uint64_t id, struct chunk& c, entity_type type, const character_proto& proto) :
+ entity{id, c, type, proto},
+ name{proto.name},
+ playable{proto.playable}
+{
+ if (!name)
+ name = "(Unnamed)"_s;
+ if (!atlas)
+ atlas = loader.anim_atlas("npc-walk", loader.ANIM_PATH);
+ entity::set_bbox_(offset, bbox_offset, Vector2ub(iTILE_SIZE2/2), pass);
+}
+
} // namespace floormat
diff --git a/src/character.hpp b/src/character.hpp
index af48b19a..751fc42e 100644
--- a/src/character.hpp
+++ b/src/character.hpp
@@ -19,7 +19,6 @@ struct character_proto : entity_proto
~character_proto() noexcept override;
character_proto& operator=(const character_proto&);
bool operator==(const entity_proto& proto) const override;
- operator bool() const;
};
struct character final : entity
diff --git a/src/entity.cpp b/src/entity.cpp
index 390cf18c..ad599a1c 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -203,6 +203,21 @@ void entity::set_bbox_(Vector2b offset_, Vector2b bbox_offset_, Vector2ub bbox_s
const_cast<pass_mode&>(pass) = pass_;
}
+entity::operator entity_proto() const
+{
+ entity_proto ret;
+ ret.atlas = atlas;
+ ret.offset = offset;
+ ret.bbox_offset = bbox_offset;
+ ret.bbox_size = bbox_size;
+ ret.delta = delta;
+ ret.frame = frame;
+ ret.type = entity_type::character;
+ ret.r = r;
+ ret.pass = pass;
+ return ret;
+}
+
void entity::set_bbox(Vector2b offset_, Vector2b bbox_offset_, Vector2ub bbox_size_, pass_mode pass)
{
chunk::bbox bb0, bb;
@@ -212,21 +227,6 @@ void entity::set_bbox(Vector2b offset_, Vector2b bbox_offset_, Vector2ub bbox_si
c->_replace_bbox(bb0, bb, b0, b);
}
-entity::operator entity_proto() const
-{
- entity_proto x;
- x.atlas = atlas;
- x.offset = offset;
- x.bbox_offset = bbox_offset;
- x.bbox_size = bbox_size;
- x.delta = delta;
- x.frame = frame;
- x.type = type;
- x.r = r;
- x.pass = pass;
- return x;
-}
-
bool entity::can_activate(std::size_t) const { return false; }
bool entity::activate(std::size_t) { return false; }
diff --git a/src/entity.hpp b/src/entity.hpp
index c6edcf90..96e5477f 100644
--- a/src/entity.hpp
+++ b/src/entity.hpp
@@ -73,7 +73,6 @@ struct entity
protected:
entity(std::uint64_t id, struct chunk& c, entity_type type, const entity_proto& proto) noexcept;
-
void set_bbox_(Vector2b offset, Vector2b bbox_offset, Vector2ub bbox_size, pass_mode pass);
};
diff --git a/src/scenery.cpp b/src/scenery.cpp
index 694090a2..14bf691b 100644
--- a/src/scenery.cpp
+++ b/src/scenery.cpp
@@ -103,19 +103,11 @@ bool scenery_proto::operator==(const entity_proto& e0) const
scenery::operator scenery_proto() const
{
scenery_proto ret;
+ static_cast<entity_proto&>(ret) = entity::operator entity_proto();
ret.sc_type = sc_type;
ret.active = active;
ret.closing = closing;
ret.interactive = interactive;
- ret.atlas = atlas;
- ret.offset = offset;
- ret.bbox_offset = bbox_offset;
- ret.bbox_size = bbox_size;
- ret.delta = delta;
- ret.frame = frame;
- ret.type = entity_type::character;
- ret.r = r;
- ret.pass = pass;
return ret;
}
diff --git a/src/scenery.hpp b/src/scenery.hpp
index 3fe5fa35..0c074e5e 100644
--- a/src/scenery.hpp
+++ b/src/scenery.hpp
@@ -37,7 +37,7 @@ struct scenery_proto : entity_proto
struct scenery final : entity
{
- scenery_type sc_type : 3 = scenery_type::none;
+ scenery_type sc_type : 3 = scenery_type::none;
unsigned char active : 1 = false;
unsigned char closing : 1 = false;
unsigned char interactive : 1 = false;