You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.2 KiB
81 lines
2.2 KiB
#include "levelmanager.hpp"
|
|
#include "worldbuilder.hpp"
|
|
#include "constants.hpp"
|
|
#include "save.hpp"
|
|
#include "systems.hpp"
|
|
#include "components.hpp"
|
|
|
|
using lighting::LightRender;
|
|
using std::shared_ptr, std::make_shared;
|
|
using namespace components;
|
|
|
|
LevelManager::LevelManager() {
|
|
create_level();
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
WorldBuilder builder(*map);
|
|
builder.generate(*world);
|
|
|
|
size_t index = $levels.size();
|
|
|
|
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,
|
|
make_shared<LightRender>(map->width(), map->height()),
|
|
collider);
|
|
|
|
dbc::check(index == $levels.size() - 1, "Level index is not the same as $levels.size() - 1, off by one error");
|
|
return index;
|
|
}
|
|
|
|
GameLevel &LevelManager::next() {
|
|
dbc::check($current_level < $levels.size(), "attempt to get next level when at end");
|
|
$current_level++;
|
|
return $levels.at($current_level);
|
|
}
|
|
|
|
GameLevel &LevelManager::previous() {
|
|
dbc::check($current_level > 0, "attempt to go to previous level when at 0");
|
|
$current_level--;
|
|
return $levels.at($current_level);
|
|
}
|
|
|
|
GameLevel &LevelManager::current() {
|
|
return $levels.at($current_level);
|
|
}
|
|
|
|
GameLevel &LevelManager::get(size_t index) {
|
|
return $levels.at(index);
|
|
}
|
|
|