Skip to content

Commit

Permalink
a wip
Browse files Browse the repository at this point in the history
  • Loading branch information
sthalik committed May 3, 2024
1 parent e8a544f commit 964a43c
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 30 deletions.
14 changes: 10 additions & 4 deletions src/critter-script.cpp → src/critter-script-empty.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include "critter-script.inl"
#include "compat/assert.hpp"
#include "entity/name-of.hpp"

namespace floormat {

Expand All @@ -19,14 +19,20 @@ void touch_ptr(const std::shared_ptr<critter>& p)

struct empty_critter_script final : critter_script
{
empty_critter_script();
const void* type_id() const override;
void on_init(const std::shared_ptr<critter>& c) override;
void on_update(const std::shared_ptr<critter>& c, size_t& i, const Ns& dt) override;
void on_destroy(const std::shared_ptr<critter>& c, script_destroy_reason reason) override;
void delete_self() noexcept override;
};

empty_critter_script::empty_critter_script() : critter_script{} {}
constexpr StringView script_name = name_of<empty_critter_script>;

const void* empty_critter_script::type_id() const
{
return &script_name;
}

void empty_critter_script::on_init(const std::shared_ptr<critter>& p)
{
DBG_nospace << "> init critter:" << (void*)&*p << " id:" << p->id << (p->name ? " name:" : "") << p->name;
Expand All @@ -47,7 +53,7 @@ void empty_critter_script::delete_self() noexcept
DBG_nospace << "< delete critter";
}

empty_critter_script empty_script_ = {};
constinit empty_critter_script empty_script_ = {};

} // namespace

Expand Down
62 changes: 62 additions & 0 deletions src/critter-script-walk.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include "critter-script.hpp"
//#include "raycast.hpp"
#include "point.hpp"
#include "critter.hpp"
#include "search-result.hpp"
#include "search-astar.hpp"
#include "entity/name-of.hpp"

namespace floormat {

namespace {

enum class walk_mode : uint8_t
{
none, line, path,
};

struct walk_script final : critter_script
{
const void* type_id() const override;
void on_init(const std::shared_ptr<critter>& c) override;
void on_update(const std::shared_ptr<critter>& c, size_t& i, const Ns& dt) override;
void on_destroy(const std::shared_ptr<critter>& c, script_destroy_reason reason) override;
void delete_self() noexcept override;

point to;
path_search_result path;
walk_mode mode = walk_mode::none;
};

constexpr StringView script_name = name_of<walk_script>;

const void* walk_script::type_id() const
{
return &script_name;
}

void walk_script::on_init(const std::shared_ptr<critter>& c)
{
}

void walk_script::on_update(const std::shared_ptr<critter>& c, size_t& i, const Ns& dt)
{
}

void walk_script::on_destroy(const std::shared_ptr<critter>& c, script_destroy_reason reason)
{
}

void walk_script::delete_self() noexcept
{
delete this;
}

} // namespace

critter_script* critter_script::make_walk_script(point to, path_search_result path)
{
return new walk_script{};
}

} // namespace floormat
8 changes: 7 additions & 1 deletion src/critter-script.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,21 @@ namespace floormat {
struct critter;
struct Ns;

struct point;
struct path_search_result;

struct critter_script : base_script
{
constexpr critter_script() noexcept = default;
~critter_script() noexcept override;

virtual void on_init(const std::shared_ptr<critter>& c) = 0;
// todo can_activate, activate
virtual void on_update(const std::shared_ptr<critter>& c, size_t& i, const Ns& dt) = 0;
virtual void on_destroy(const std::shared_ptr<critter>& c, script_destroy_reason reason) = 0;
virtual void delete_self() = 0;
// todo can_activate, activate

[[nodiscard]] static critter_script* make_walk_script(point to, path_search_result path);
};

} // namespace floormat
1 change: 0 additions & 1 deletion src/critter-script.inl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "critter-script.hpp"
#include "script.inl"
#include "critter.hpp"
#include "compat/assert.hpp"

namespace floormat {

Expand Down
8 changes: 0 additions & 8 deletions src/critter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -391,13 +391,6 @@ void critter::update(const std::shared_ptr<object>& ptrʹ, size_t& i, const Ns&
update_movement(i, dt, new_r);
}
}
else
update_nonplayable(i, dt);
}

void critter::update_nonplayable(size_t& i, const Ns& dt)
{
(void)i; (void)dt; (void)playable;
}

void critter::update_movement(size_t& i, const Ns& dt, rotation new_r)
Expand Down Expand Up @@ -531,7 +524,6 @@ auto critter::move_toward(size_t& index, const Ns& dt, const point& dest) -> mov
return { .blocked = false, .moved = moved };
}


object_type critter::type() const noexcept { return object_type::critter; }

critter::operator critter_proto() const
Expand Down
1 change: 0 additions & 1 deletion src/critter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ struct critter final : object

void update(const std::shared_ptr<object>& ptr, size_t& i, const Ns& dt) override;
void update_movement(size_t& i, const Ns& dt, rotation r);
void update_nonplayable(size_t& i, const Ns& dt);

struct move_result { bool blocked, moved; };
[[nodiscard]] move_result move_toward(size_t& i, const Ns& dt, const point& dest);
Expand Down
10 changes: 9 additions & 1 deletion src/script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,15 @@ StringView base_script::state_name(script_lifecycle x)
return names[(uint32_t)x];
}

void base_script::_assert_state(script_lifecycle old_state, script_lifecycle s, const char* file, int line)
{
if (old_state != s) [[unlikely]]
fm_emit_abort(file, line,
"invalid state transition from '%s' to '%s'",
state_name(old_state).data(),
state_name(s).data());
}

base_script::~base_script() noexcept = default;
base_script::base_script() noexcept = default;

} // namespace floormat
6 changes: 4 additions & 2 deletions src/script.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,19 @@ struct base_script
fm_DECLARE_DELETED_COPY_ASSIGNMENT(base_script);
fm_DECLARE_DELETED_MOVE_ASSIGNMENT(base_script);

base_script() noexcept;
constexpr base_script() noexcept = default;
virtual ~base_script() noexcept;
virtual const void* type_id() const = 0;

static StringView state_name(script_lifecycle x);
static void _assert_state(script_lifecycle old_state, script_lifecycle s, const char* file, int line);
};

template<typename S, typename Obj>
class Script final
{
S* ptr;
script_lifecycle _state;
void _assert_state(script_lifecycle s, const char* file, int line);
static S* make_empty();

public:
Expand All @@ -51,6 +52,7 @@ class Script final
void do_create(S* ptr);
void do_initialize(const std::shared_ptr<Obj>& obj);
void do_reassign(S* ptr, const std::shared_ptr<Obj>& obj);
void do_clear(const std::shared_ptr<Obj>& obj);
void do_destroy_pre(const std::shared_ptr<Obj>& obj, script_destroy_reason r);
void do_finish_destroy();
void do_ensure_torn_down();
Expand Down
25 changes: 13 additions & 12 deletions src/script.inl
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void concept_check() {}

namespace floormat {

#define FM_ASSERT_SCRIPT_STATE(new_state) (Script<S, Obj>::_assert_state((new_state), __FILE__, __LINE__))
#define FM_ASSERT_SCRIPT_STATE(new_state) (base_script::_assert_state(_state, (new_state), __FILE__, __LINE__))

template <typename S, typename Obj> Script<S, Obj>::~Script() noexcept
{
Expand All @@ -60,16 +60,6 @@ Script<S, Obj>::Script(): ptr{nullptr}, _state{script_lifecycle::no_init}
detail_Script::concept_check<S, Obj>();
}

template <typename S, typename Obj>
void Script<S, Obj>::_assert_state(script_lifecycle s, const char* file, int line)
{
if (_state != s) [[unlikely]]
fm_emit_abort(file, line,
"invalid state transition from '%s' to '%s'",
base_script::state_name(_state).data(),
base_script::state_name(s).data());
}

template <typename S, typename Obj> script_lifecycle Script<S, Obj>::state() const { return _state; }

template <typename S, typename Obj>
Expand Down Expand Up @@ -111,7 +101,8 @@ void Script<S, Obj>::do_initialize(const std::shared_ptr<Obj>& obj)
template <typename S, typename Obj>
void Script<S, Obj>::do_reassign(S* p, const std::shared_ptr<Obj>& obj)
{
fm_assert(p);
if (!p) [[unlikely]]
return do_clear(obj);
FM_ASSERT_SCRIPT_STATE(script_lifecycle::created);
fm_debug_assert(ptr);
ptr->on_destroy(obj, script_destroy_reason::unassign);
Expand All @@ -120,6 +111,16 @@ void Script<S, Obj>::do_reassign(S* p, const std::shared_ptr<Obj>& obj)
p->on_init(obj);
}

template <typename S, typename Obj>
void Script<S, Obj>::do_clear(const std::shared_ptr<Obj>& obj)
{
FM_ASSERT_SCRIPT_STATE(script_lifecycle::created);
fm_debug_assert(ptr);
ptr->on_destroy(obj, script_destroy_reason::unassign);
ptr->delete_self();
ptr = make_empty();
}

template <typename S, typename Obj>
void Script<S, Obj>::do_destroy_pre(const std::shared_ptr<Obj>& obj, script_destroy_reason r)
{
Expand Down

0 comments on commit 964a43c

Please sign in to comment.