Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions include/EcoSimEngine/system/AISystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,18 @@
#include "EcoSimEngine/math/Vec2.hpp"
#include "EcoSimEngine/system/System.hpp"
#include "EcoSimEngine/utils/Random.hpp"
#include "EcoSimEngine/component/ComponentIndices.hpp"

class AISystem : public System
{
public:
static Signature requiredSignature() {
Signature signature;
signature.set(COMP_INDEX_CBehavior);
signature.set(COMP_INDEX_CTransform);
return signature;
}

void update(
EntityManager &em,
ComponentManager &cm,
Expand Down
8 changes: 8 additions & 0 deletions include/EcoSimEngine/system/MetabolismSystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,18 @@

#include "EcoSimEngine/ecs/EntityManager.hpp"
#include "EcoSimEngine/system/System.hpp"
#include "EcoSimEngine/component/ComponentIndices.hpp"

class MetabolismSystem : public System
{
public:
static Signature requiredSignature() {
Signature signature;
signature.set(COMP_INDEX_CEnergy);
signature.set(COMP_INDEX_CHealth);
return signature;
}

static constexpr float kStarvationDamagePerSecond{10.0f}; // Damage applied to entities that are starving

void update(
Expand Down
6 changes: 6 additions & 0 deletions include/EcoSimEngine/system/MovementSystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@

class MovementSystem : public System {
public:
static Signature requiredSignature() {
Signature signature;
signature.set(COMP_INDEX_CTransform);
return signature;
}

// EntityManager must implement getEntityById(size_t)
void update(EntityManager& em, ComponentManager& cm, float dt)
{
Expand Down
13 changes: 3 additions & 10 deletions include/EcoSimEngine/system/SystemManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,11 @@ class SystemManager {
}

auto system = std::make_shared<T>(std::forward<Args>(args)...);
m_systems.emplace(type, system);
return system;
}

template <typename T>
void SetSignature(const Signature& signature) {
const std::type_index type(typeid(T));
if (!m_systems.contains(type)) {
throw std::logic_error("Cannot set a signature for an unregistered system");
}
m_systems.emplace(type, system);
m_signatures.emplace(type, T::requiredSignature());

m_signatures[type] = signature;
return system;
}

void EntityDestroyed(EntityId id) {
Expand Down
25 changes: 1 addition & 24 deletions src/simulation/SimulationWorld.cpp
Original file line number Diff line number Diff line change
@@ -1,39 +1,16 @@
#include "EcoSimEngine/simulation/SimulationWorld.hpp"

#include "EcoSimEngine/component/ComponentIndices.hpp"

#include "EcoSimEngine/system/AISystem.hpp"
#include "EcoSimEngine/system/MovementSystem.hpp"
#include "EcoSimEngine/system/MetabolismSystem.hpp"

SimulationWorld::SimulationWorld()
: m_entityManager(m_systemManager, m_componentManager)
{
// Movement system
// Register systems
m_systemManager.RegisterSystem<MovementSystem>();

Signature movementSignature;
movementSignature.set(COMP_INDEX_CTransform);

m_systemManager.SetSignature<MovementSystem>(movementSignature);

// AI system
m_systemManager.RegisterSystem<AISystem>();

Signature aiSignature;
aiSignature.set(COMP_INDEX_CBehavior);
aiSignature.set(COMP_INDEX_CTransform);

m_systemManager.SetSignature<AISystem>(aiSignature);

// Metabolism system
m_systemManager.RegisterSystem<MetabolismSystem>();

Signature metabolismSignature;
metabolismSignature.set(COMP_INDEX_CEnergy);
metabolismSignature.set(COMP_INDEX_CHealth);

m_systemManager.SetSignature<MetabolismSystem>(metabolismSignature);
}

void SimulationWorld::update(float dt)
Expand Down
33 changes: 9 additions & 24 deletions tests/foundation_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,13 @@ namespace

class TransformSystem final : public System
{
};
class UnregisteredSystem final : public System
{
public:
static Signature requiredSignature()
{
Signature signature;
signature.set(COMP_INDEX_CTransform);
return signature;
}
};

void require(bool condition, const char *message)
Expand Down Expand Up @@ -140,21 +144,17 @@ namespace
SystemManager systems;
auto transformSystem = systems.RegisterSystem<TransformSystem>();

Signature required;
required.set(0);
systems.SetSignature<TransformSystem>(required);

Signature entitySignature;
systems.EntitySignatureChanged(11, entitySignature);
require(!transformSystem->mEntities.contains(11),
"entity without required components must not join system");

entitySignature.set(0);
entitySignature.set(COMP_INDEX_CTransform);
systems.EntitySignatureChanged(11, entitySignature);
require(transformSystem->mEntities.contains(11),
"matching entity must join system");

entitySignature.reset(0);
entitySignature.reset(COMP_INDEX_CTransform);
systems.EntitySignatureChanged(11, entitySignature);
require(!transformSystem->mEntities.contains(11),
"entity must leave system after signature stops matching");
Expand All @@ -170,17 +170,6 @@ namespace
}
require(duplicateRejected, "duplicate system registration must fail in release builds too");

bool unregisteredSignatureRejected = false;
try
{
systems.SetSignature<UnregisteredSystem>(required);
}
catch (const std::logic_error &)
{
unregisteredSignatureRejected = true;
}
require(unregisteredSignatureRejected,
"setting a signature for an unregistered system must fail explicitly");
}

void testEntityDestruction()
Expand All @@ -191,10 +180,6 @@ namespace

auto transformSystem = systems.RegisterSystem<TransformSystem>();

Signature required;
required.set(COMP_INDEX_CTransform);
systems.SetSignature<TransformSystem>(required);

auto destroyedEntity = entities.addEntity("destroyed");
auto survivingEntity = entities.addEntity("survivor");

Expand Down