Skip to content

Commit

Permalink
refactor cave map generator
Browse files Browse the repository at this point in the history
we now use a helper class to store the temporary variables for
create_scenario so that we dont have to carry them areoudn if we aren't
exacuting  create_scenario
  • Loading branch information
gfgtdf committed Aug 23, 2014
1 parent 9f3d158 commit 2d872fb
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 79 deletions.
77 changes: 35 additions & 42 deletions src/generators/cave_map_generator.cpp
Expand Up @@ -37,12 +37,6 @@ cave_map_generator::cave_map_generator(const config &cfg) :
village_(t_translation::UNDERGROUND_VILLAGE),
castle_(t_translation::DWARVEN_CASTLE),
keep_(t_translation::DWARVEN_KEEP),
map_(),
starting_positions_(),
chamber_ids_(),
chambers_(),
passages_(),
res_(),
cfg_(cfg ? cfg : config()),
width_(50),
height_(50),
Expand Down Expand Up @@ -95,16 +89,20 @@ std::string cave_map_generator::create_map()

config cave_map_generator::create_scenario()
{
map_ = t_translation::t_map(width_ + 2 * gamemap::default_border,
t_translation::t_list(height_ + 2 * gamemap::default_border, wall_));
chambers_.clear();
passages_.clear();

res_.clear();
if (const config &settings = cfg_.child("settings")) {
res_ = settings;
}
cave_map_generator_job job(*this);
return job.res_;
}

cave_map_generator::cave_map_generator_job::cave_map_generator_job(const cave_map_generator& pparams)
: params(pparams)
, map_(t_translation::t_map(params.width_ + 2 * gamemap::default_border,
t_translation::t_list(params.height_ + 2 * gamemap::default_border, params.wall_)))
, starting_positions_()
, chamber_ids_()
, chambers_()
, passages_()
, res_(params.cfg_.child_or_empty("settings"))
{
LOG_NG << "creating scenario....\n";
generate_chambers();

Expand All @@ -118,22 +116,17 @@ config cave_map_generator::create_scenario()
for(std::vector<passage>::const_iterator p = passages_.begin(); p != passages_.end(); ++p) {
place_passage(*p);
}

LOG_NG << "outputting map....\n";

config& map = res_.add_child("map");
map["data"] = t_translation::write_game_map(map_, starting_positions_);
map["usage"] = "map";
map["border_size"] = gamemap::default_border;

LOG_NG << "returning result...\n";

return res_;
}

void cave_map_generator::build_chamber(map_location loc, std::set<map_location>& locs, size_t size, size_t jagged)
void cave_map_generator::cave_map_generator_job::build_chamber(map_location loc, std::set<map_location>& locs, size_t size, size_t jagged)
{
if(size == 0 || locs.count(loc) != 0 || !on_board(loc))
if(size == 0 || locs.count(loc) != 0 || !params.on_board(loc))
return;

locs.insert(loc);
Expand All @@ -147,9 +140,9 @@ void cave_map_generator::build_chamber(map_location loc, std::set<map_location>&
}
}

void cave_map_generator::generate_chambers()
void cave_map_generator::cave_map_generator_job::generate_chambers()
{
BOOST_FOREACH(const config &ch, cfg_.child_range("chamber"))
BOOST_FOREACH(const config &ch, params.cfg_.child_range("chamber"))
{
// If there is only a chance of the chamber appearing, deal with that here.
if (ch.has_attribute("chance") && (rand() % 100) < ch["chance"].to_int()) {
Expand All @@ -159,7 +152,7 @@ void cave_map_generator::generate_chambers()
const std::string &xpos = ch["x"];
const std::string &ypos = ch["y"];

size_t min_xpos = 0, min_ypos = 0, max_xpos = width_, max_ypos = height_;
size_t min_xpos = 0, min_ypos = 0, max_xpos = params.width_, max_ypos = params.height_;

if (!xpos.empty()) {
const std::vector<std::string>& items = utils::split(xpos, '-');
Expand All @@ -176,9 +169,9 @@ void cave_map_generator::generate_chambers()
max_ypos = atoi(items.back().c_str());
}
}

const size_t x = translate_x(min_xpos + (rand()%(max_xpos-min_xpos)));
const size_t y = translate_y(min_ypos + (rand()%(max_ypos-min_ypos)));
//TODO: move trandlate to job class.
const size_t x = params.translate_x(min_xpos + (rand()%(max_xpos-min_xpos)));
const size_t y = params.translate_y(min_ypos + (rand()%(max_ypos-min_ypos)));

int chamber_size = ch["size"].to_int(3);
int jagged_edges = ch["jagged"];
Expand Down Expand Up @@ -213,10 +206,10 @@ void cave_map_generator::generate_chambers()
}
}

void cave_map_generator::place_chamber(const chamber& c)
void cave_map_generator::cave_map_generator_job::place_chamber(const chamber& c)
{
for(std::set<map_location>::const_iterator i = c.locs.begin(); i != c.locs.end(); ++i) {
set_terrain(*i,clear_);
set_terrain(*i,params.clear_);
}

if (c.items == NULL || c.locs.empty()) return;
Expand Down Expand Up @@ -303,7 +296,7 @@ double passage_path_calculator::cost(const map_location& loc, const double) cons
return res;
}

void cave_map_generator::place_passage(const passage& p)
void cave_map_generator::cave_map_generator_job::place_passage(const passage& p)
{
const std::string& chance = p.cfg["chance"];
if(chance != "" && (rand()%100) < atoi(chance.c_str())) {
Expand All @@ -314,9 +307,9 @@ void cave_map_generator::place_passage(const passage& p)
int windiness = p.cfg["windiness"];
double laziness = std::max<double>(1.0, p.cfg["laziness"].to_double());

passage_path_calculator calc(map_,wall_,laziness,windiness);
passage_path_calculator calc(map_, params.wall_, laziness, windiness);

pathfind::plain_route rt = a_star_search(p.src, p.dst, 10000.0, &calc, width_, height_);
pathfind::plain_route rt = a_star_search(p.src, p.dst, 10000.0, &calc, params.width_, params.height_);

int width = std::max<int>(1, p.cfg["width"].to_int());
int jagged = p.cfg["jagged"];
Expand All @@ -325,31 +318,31 @@ void cave_map_generator::place_passage(const passage& p)
std::set<map_location> locs;
build_chamber(*i,locs,width,jagged);
for(std::set<map_location>::const_iterator j = locs.begin(); j != locs.end(); ++j) {
set_terrain(*j,clear_);
set_terrain(*j, params.clear_);
}
}
}

void cave_map_generator::set_terrain(map_location loc, const t_translation::t_terrain & t)
void cave_map_generator::cave_map_generator_job::set_terrain(map_location loc, const t_translation::t_terrain & t)
{
if (on_board(loc)) {
if (params.on_board(loc)) {
t_translation::t_terrain& c = map_[loc.x + gamemap::default_border][loc.y + gamemap::default_border];

if(c == clear_ || c == wall_ || c == village_) {
if(c == params.clear_ || c == params.wall_ || c == params.village_) {
// Change this terrain.
if ( t == clear_ && rand() % 1000 < village_density_ )
if ( t == params.clear_ && rand() % 1000 < params.village_density_ )
// Override with a village.
c = village_;
c = params.village_;
else
c = t;
}
}
}

void cave_map_generator::place_castle(int starting_position, const map_location &loc)
void cave_map_generator::cave_map_generator_job::place_castle(int starting_position, const map_location &loc)
{
if (starting_position != -1) {
set_terrain(loc, keep_);
set_terrain(loc, params.keep_);

t_translation::coordinate coord(
loc.x + gamemap::default_border
Expand All @@ -360,7 +353,7 @@ void cave_map_generator::place_castle(int starting_position, const map_location
map_location adj[6];
get_adjacent_tiles(loc,adj);
for(size_t n = 0; n != 6; ++n) {
set_terrain(adj[n],castle_);
set_terrain(adj[n], params.castle_);
}
}

81 changes: 44 additions & 37 deletions src/generators/cave_map_generator.hpp
Expand Up @@ -40,52 +40,59 @@ class cave_map_generator : public map_generator
config create_scenario();

private:

struct chamber {
chamber() :
center(),
locs(),
items(0)
{
}

map_location center;
std::set<map_location> locs;
const config *items;
};

struct passage {
passage(map_location s, map_location d, const config& c)
: src(s), dst(d), cfg(c)
{}
map_location src, dst;
config cfg;
struct cave_map_generator_job
{
cave_map_generator_job(const cave_map_generator& params);

struct chamber {
chamber()
: center()
, locs()
, items(0)
{
}

map_location center;
std::set<map_location> locs;
const config *items;
};

struct passage {
passage(map_location s, map_location d, const config& c)
: src(s), dst(d), cfg(c)
{}
map_location src, dst;
config cfg;
};

void generate_chambers();
void build_chamber(map_location loc, std::set<map_location>& locs, size_t size, size_t jagged);

void place_chamber(const chamber& c);

void place_passage(const passage& p);

void set_terrain(map_location loc, const t_translation::t_terrain & t);
void place_castle(int starting_position, const map_location &loc);


const cave_map_generator& params;

t_translation::t_map map_;
std::map<int, t_translation::coordinate> starting_positions_;
std::map<std::string,size_t> chamber_ids_;
std::vector<chamber> chambers_;
std::vector<passage> passages_;
config res_;
};

void generate_chambers();
void build_chamber(map_location loc, std::set<map_location>& locs, size_t size, size_t jagged);

void place_chamber(const chamber& c);

void place_passage(const passage& p);

bool on_board(const map_location& loc) const
{
return loc.x >= 0 && loc.y >= 0 && loc.x < width_ && loc.y < height_;
}

void set_terrain(map_location loc, const t_translation::t_terrain & t);
void place_castle(int starting_position, const map_location &loc);

t_translation::t_terrain wall_, clear_, village_, castle_, keep_;
t_translation::t_map map_;
std::map<int, t_translation::coordinate> starting_positions_;

std::map<std::string,size_t> chamber_ids_;
std::vector<chamber> chambers_;
std::vector<passage> passages_;

config res_;
config cfg_;
int width_, height_, village_density_;

Expand Down

0 comments on commit 2d872fb

Please sign in to comment.