|
|
|
@ -11,14 +11,9 @@ using namespace fmt; |
|
|
|
|
using namespace components; |
|
|
|
|
|
|
|
|
|
void WorldBuilder::generate_map() { |
|
|
|
|
// run it once to find dead ends
|
|
|
|
|
maze::init($map.$walls); |
|
|
|
|
maze::hunt_and_kill($map.$walls, $map.$rooms, $map.$dead_ends); |
|
|
|
|
|
|
|
|
|
// randomize rooms based on dead ends
|
|
|
|
|
maze::randomize_rooms($map.$rooms, $map.$dead_ends); |
|
|
|
|
|
|
|
|
|
// run it again to create the final map with rooms
|
|
|
|
|
// NOTE: hund_and_kill is responsible for clearing the map correctly
|
|
|
|
|
maze::hunt_and_kill($map.$walls, $map.$rooms, $map.$dead_ends); |
|
|
|
|
|
|
|
|
|
$map.expand(); |
|
|
|
@ -26,6 +21,7 @@ void WorldBuilder::generate_map() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DinkyECS::Entity WorldBuilder::configure_entity_in_map(DinkyECS::World &world, json &entity_data, Point pos_out) { |
|
|
|
|
dbc::log(">>>>>>>>>>> ENTER"); |
|
|
|
|
auto item = world.entity(); |
|
|
|
|
world.set<Position>(item, {pos_out.x+1, pos_out.y+1}); |
|
|
|
|
|
|
|
|
@ -36,14 +32,19 @@ DinkyECS::Entity WorldBuilder::configure_entity_in_map(DinkyECS::World &world, j |
|
|
|
|
if(entity_data.contains("components")) { |
|
|
|
|
components::configure_entity($components, world, item, entity_data["components"]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dbc::log("<<<<<<<<<<<<< EXIT"); |
|
|
|
|
return item; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DinkyECS::Entity WorldBuilder::configure_entity_in_map(DinkyECS::World &world, json &entity_data, int in_room) { |
|
|
|
|
DinkyECS::Entity WorldBuilder::configure_entity_in_room(DinkyECS::World &world, json &entity_data, int in_room) { |
|
|
|
|
Point pos_out; |
|
|
|
|
dbc::log("is it configure_entity_in_map's fault?"); |
|
|
|
|
bool placed = $map.place_entity(in_room, pos_out); |
|
|
|
|
dbc::check(placed, "failed to randomly place item in room"); |
|
|
|
|
return configure_entity_in_map(world, entity_data, pos_out); |
|
|
|
|
auto entity = configure_entity_in_map(world, entity_data, pos_out); |
|
|
|
|
dbc::log("<<<<<<<<<<<<<<<<<<<<<<<<<<< leaving configure_entity_in_room"); |
|
|
|
|
return entity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -81,10 +82,10 @@ inline json& random_entity_data(GameConfig& config, json& gen_config) { |
|
|
|
|
void WorldBuilder::randomize_entities(DinkyECS::World &world, GameConfig &config) { |
|
|
|
|
auto& gen_config = config.game["worldgen"]; |
|
|
|
|
|
|
|
|
|
for(size_t room_num = $map.room_count() - 1; room_num > 0; room_num--) { |
|
|
|
|
for(int room_num = $map.room_count() - 1; room_num > 0; room_num--) { |
|
|
|
|
// pass that to the config as it'll be a generic json
|
|
|
|
|
auto& entity_data = random_entity_data(config, gen_config); |
|
|
|
|
configure_entity_in_map(world, entity_data, room_num); |
|
|
|
|
configure_entity_in_room(world, entity_data, room_num); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for(auto& at : $map.$dead_ends) { |
|
|
|
@ -97,7 +98,7 @@ void WorldBuilder::place_stairs(DinkyECS::World& world, GameConfig& config) { |
|
|
|
|
auto& device_config = config.devices.json(); |
|
|
|
|
auto entity_data = device_config["STAIRS_DOWN"]; |
|
|
|
|
int last_room = $map.room_count() - 1; |
|
|
|
|
configure_entity_in_map(world, entity_data, last_room); |
|
|
|
|
configure_entity_in_room(world, entity_data, last_room); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void WorldBuilder::configure_starting_items(DinkyECS::World &world) { |
|
|
|
@ -117,12 +118,13 @@ void WorldBuilder::place_entities(DinkyECS::World &world) { |
|
|
|
|
if(world.has_the<Player>()) { |
|
|
|
|
auto& player = world.get_the<Player>(); |
|
|
|
|
Point pos_out; |
|
|
|
|
dbc::log("or is it in place_entities placing the player?"); |
|
|
|
|
bool placed = $map.place_entity(0, pos_out); |
|
|
|
|
dbc::check(placed, "failed to randomly place item in room"); |
|
|
|
|
world.set<Position>(player.entity, {pos_out.x+1, pos_out.y+1}); |
|
|
|
|
} else { |
|
|
|
|
auto player_data = config.enemies["PLAYER_TILE"]; |
|
|
|
|
auto player_ent = configure_entity_in_map(world, player_data, 0); |
|
|
|
|
auto player_ent = configure_entity_in_room(world, player_data, 0); |
|
|
|
|
|
|
|
|
|
// configure player in the world
|
|
|
|
|
Player player{player_ent}; |
|
|
|
|