TODO: modify other races constructors
did some reworking
This commit is contained in:
91
src/map.cc
91
src/map.cc
@ -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) {
|
||||
|
Reference in New Issue
Block a user