World copying with facts and constants is working so now new levels are possible, but need to work on previous level motion.
This commit is contained in:
parent
2735a0ac1f
commit
82216b8307
6 changed files with 52 additions and 32 deletions
|
@ -8,6 +8,6 @@
|
|||
"worldgen": {
|
||||
"enemy_probability": 20,
|
||||
"empty_room_probability": 10,
|
||||
"device_probability": 100
|
||||
"device_probability": 30
|
||||
}
|
||||
}
|
||||
|
|
24
dinkyecs.hpp
24
dinkyecs.hpp
|
@ -14,7 +14,7 @@ namespace DinkyECS {
|
|||
|
||||
typedef unsigned long Entity;
|
||||
|
||||
typedef std::unordered_map<Entity, std::any> EntityMap;
|
||||
using EntityMap = std::unordered_map<Entity, std::any>;
|
||||
|
||||
struct Event {
|
||||
int event = 0;
|
||||
|
@ -29,20 +29,30 @@ namespace DinkyECS {
|
|||
std::unordered_map<std::type_index, EntityMap> $components;
|
||||
std::unordered_map<std::type_index, std::any> $facts;
|
||||
std::unordered_map<std::type_index, EventQueue> $events;
|
||||
std::vector<Entity> constants;
|
||||
std::vector<Entity> $constants;
|
||||
|
||||
Entity entity() {
|
||||
return ++entity_count;
|
||||
}
|
||||
/*
|
||||
void clone_into(DinkyECS::World &from_world, DinkyECS::World &to_world) {
|
||||
|
||||
void clone_into(DinkyECS::World &to_world) {
|
||||
to_world.$constants = $constants;
|
||||
to_world.$facts = $facts;
|
||||
to_world.entity_count = entity_count;
|
||||
|
||||
for(auto eid : $constants) {
|
||||
for(const auto &[tid, eid_map] : $components) {
|
||||
auto& their_map = to_world.$components[tid];
|
||||
if(eid_map.contains(eid)) {
|
||||
their_map.insert_or_assign(eid, eid_map.at(eid));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void update_constants(DinkyECS::World &from_world, DinkyECS::World &to_world) {
|
||||
|
||||
void make_constant(DinkyECS::Entity entity) {
|
||||
$constants.push_back(entity);
|
||||
}
|
||||
*/
|
||||
|
||||
template <typename Comp>
|
||||
EntityMap& entity_map_for() {
|
||||
|
|
|
@ -15,33 +15,14 @@ LevelManager::LevelManager() {
|
|||
|
||||
size_t LevelManager::create_level(shared_ptr<DinkyECS::World> prev_world) {
|
||||
auto world = make_shared<DinkyECS::World>();
|
||||
save::load_configs(*world);
|
||||
|
||||
auto map = make_shared<Map>(GAME_MAP_X, GAME_MAP_Y);
|
||||
|
||||
if(prev_world != nullptr) {
|
||||
auto& player = prev_world->get_the<Player>();
|
||||
player.entity = world->entity();
|
||||
world->set_the<Player>(player);
|
||||
|
||||
auto inventory = prev_world->get<Inventory>(player.entity);
|
||||
world->set<Inventory>(player.entity, inventory);
|
||||
|
||||
auto light = prev_world->get<LightSource>(player.entity);
|
||||
world->set<LightSource>(player.entity, light);
|
||||
|
||||
world->set_the<Debug>(prev_world->get_the<Debug>());
|
||||
auto& combat = prev_world->get<Combat>(player.entity);
|
||||
world->set<Combat>(player.entity, combat);
|
||||
|
||||
auto& motion = prev_world->get<Motion>(player.entity);
|
||||
world->set<Motion>(player.entity, motion);
|
||||
|
||||
auto& tile = prev_world->get<Tile>(player.entity);
|
||||
|
||||
world->set<Tile>(player.entity, tile);
|
||||
prev_world->clone_into(*world);
|
||||
} else {
|
||||
save::load_configs(*world);
|
||||
}
|
||||
|
||||
auto map = make_shared<Map>(GAME_MAP_X, GAME_MAP_Y);
|
||||
WorldBuilder builder(*map);
|
||||
builder.generate(*world);
|
||||
|
||||
|
@ -49,7 +30,6 @@ size_t LevelManager::create_level(shared_ptr<DinkyECS::World> prev_world) {
|
|||
|
||||
auto collider = make_shared<SpatialMap>();
|
||||
// not sure if this is still needed
|
||||
world->set_the<SpatialMap>(*collider);
|
||||
System::init_positions(*world, *collider);
|
||||
|
||||
$levels.emplace_back(index, map, world,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
TODO:
|
||||
|
||||
* Items are doubled in inventory.
|
||||
* What's the result of out of memory error with shared/unique ptr?
|
||||
* Config is all over the place. Can I get rid of constant.hpp? Or most of it? Also renderer.cpp:RenderConfig is weird too. Too much indirection all around.
|
||||
* GUI needs to become a statemachine now. Too many panels open at too many times.
|
||||
|
|
|
@ -152,3 +152,31 @@ TEST_CASE("confirm that the event system works", "[ecs]") {
|
|||
ready = world.has_event<GUIEvent>();
|
||||
REQUIRE(ready == false);
|
||||
}
|
||||
|
||||
|
||||
TEST_CASE("confirm copying and constants", "[ecs-constants]") {
|
||||
DinkyECS::World world1;
|
||||
|
||||
Player player_info{"Zed", world1.entity()};
|
||||
world1.set_the<Player>(player_info);
|
||||
|
||||
world1.set<Position>(player_info.eid, {10,10});
|
||||
world1.make_constant(player_info.eid);
|
||||
|
||||
DinkyECS::World world2;
|
||||
world1.clone_into(world2);
|
||||
|
||||
auto &test1 = world1.get<Position>(player_info.eid);
|
||||
auto &test2 = world2.get<Position>(player_info.eid);
|
||||
|
||||
REQUIRE(test2.x == test1.x);
|
||||
REQUIRE(test2.y == test1.y);
|
||||
|
||||
// check for accidental reference
|
||||
test1.x = 100;
|
||||
REQUIRE(test2.x != test1.x);
|
||||
|
||||
// test the facts copy over
|
||||
auto &player2 = world2.get_the<Player>();
|
||||
REQUIRE(player2.eid == player_info.eid);
|
||||
}
|
||||
|
|
|
@ -247,6 +247,7 @@ void WorldBuilder::place_entities(DinkyECS::World &world) {
|
|||
Player player{player_ent};
|
||||
world.set_the<Player>(player);
|
||||
world.set<Inventory>(player.entity, {5});
|
||||
world.make_constant(player.entity);
|
||||
}
|
||||
|
||||
randomize_entities(world, config);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue