TODO: modify other races constructors

did some reworking
This commit is contained in:
2024-07-13 14:02:30 -04:00
parent f2d2f6f72d
commit 9fdbf141d3
24 changed files with 227 additions and 186 deletions

View File

@ -1,11 +1,10 @@
#include "map.h"
#include <algorithm>
#include <array>
#include <iostream>
game_map::game_map(RNG *rng, const feature enabled_features):
game_map::game_map(character *player, RNG *rng, const feature enabled_features):
enabled_features{enabled_features} {
map.reserve(MAP_HEIGHT * MAP_WIDTH);
@ -26,21 +25,40 @@ game_map::game_map(RNG *rng, const feature enabled_features):
gen_path(layer_data, rng);
for (std::size_t i = 0; i < map.size(); ++i)
if (map[i] >= 0 && map[i] < MAX_ROOM_CNT)
empty_spots.push_back(remap_index(i));
down_stairs = rng->get_rand_in_vector(empty_spots);
rooms_tile_list.reserve(room_data.size());
for (size_t i = 0; i < room_data.size(); ++i)
rooms_tile_list.push_back({});
for (size_t i = 0; i < map.size(); ++i)
if (map[i] >= 0 && map[i] < MAX_ROOM_CNT)
rooms_tile_list[map[i]].push_back(remap_index(i));
for (size_t i = 0; i < rooms_tile_list.size(); ++i)
rooms_tile_list[i].shrink_to_fit();
rooms_tile_list.shrink_to_fit();
int player_room = rng->rand_under(room_data.size());
player->set_position(rng->get_rand_in_vector(rooms_tile_list[player_room]));
gen_stairs(player_room, rng);
}
void game_map::gen_stairs(int player_room, RNG *rng) {
down_stairs = rng->get_rand_in_vector(rooms_tile_list[
rng->exclude_middle(0, room_data.size(), player_room)]);
if (enabled_features & FEATURE_REVISIT) {
auto tmp = remove_from_list(empty_spots, down_stairs);
up_stairs = rng->get_rand_in_vector(tmp);
up_stairs = rng->get_rand_in_vector(rooms_tile_list[player_room]);
map[remap_position(up_stairs)] = '<';
map[remap_position(down_stairs)] = '>';
} else {
map[remap_position(down_stairs)] = '\\';
}
}
position game_map::random_size(int min_width, int min_height,
@ -50,11 +68,15 @@ position game_map::random_size(int min_width, int min_height,
rng->rand_between(min_height, max_height + 1)};
}
game_map::game_map(const std::string &map_data,
game_map::game_map(character *player, const std::string &map_data,
RNG *rng, const feature enabled_features):
enabled_features{enabled_features} {
int map_size = MAP_HEIGHT * MAP_WIDTH;
map.reserve(map_size);
rooms_tile_list.reserve(MAX_ROOM_CNT);
for (int i = 0; i < MAX_ROOM_CNT; ++i)
rooms_tile_list.push_back({});
int max_room_num = 0;
@ -67,24 +89,17 @@ game_map::game_map(const std::string &map_data,
}
if (map_data[i] >= '0' && map_data[i] <= '9')
empty_spots.push_back(remap_index(i));
}
down_stairs = rng->get_rand_in_vector(empty_spots);
if (enabled_features & FEATURE_REVISIT) {
auto tmp = remove_from_list(empty_spots, down_stairs);
up_stairs = rng->get_rand_in_vector(tmp);
map[remap_position(up_stairs)] = '<';
map[remap_position(down_stairs)] = '>';
} else {
map[remap_position(down_stairs)] = '\\';
rooms_tile_list[map_data[i] - '0'].push_back(remap_index(i));
}
for (int i = 0; i <= max_room_num; ++i)
room_data.push_back({0, 0, 0, 0});
int player_room = rng->rand_under(room_data.size());
player->set_position(rng->get_rand_in_vector(rooms_tile_list[player_room]));
gen_stairs(player_room, rng);
}
bool game_map::is_available(const position &pos) const {
@ -113,6 +128,14 @@ void game_map::print(display *out) const {
map[i] == '<' ? COLOR_PAIR(COLOR_BLUE) : A_NORMAL);
}
int game_map::which_room(const position &pos) const {
if (pos.y > MAP_HEIGHT || pos.x > MAP_WIDTH || pos.x < 0 || pos.y < 0)
return -1;
char tmp = map[remap_position(pos)];
return tmp < MAX_ROOM_CNT ? tmp : -1;
}
position game_map::get_up_stairs() const {
return up_stairs;
}
@ -130,29 +153,11 @@ int game_map::get_down_stairs_room() const {
}
position_list game_map::get_room_list(int idx) const {
position_list result;
for (size_t i = 0; i < map.size(); ++i) {
if (map[i] == idx)
result.push_back(remap_index(i));
}
result.shrink_to_fit();
return result;
return rooms_tile_list[idx];
}
std::vector<position_list> game_map::get_room_list() const {
std::vector<position_list> result;
result.reserve(room_data.size());
for (size_t i = 0; i < room_data.size(); ++i)
result.push_back({});
for (size_t i = 0; i < map.size(); ++i)
if (map[i] >= 0 && map[i] < MAX_ROOM_CNT)
result[map[i]].push_back(remap_index(i));
return result;
return rooms_tile_list;
}
std::vector<std::pair<position, int>> game_map::gen_room_dims(RNG *rng) {