added naming of villages in random maps
This commit is contained in:
parent
16995d0cf5
commit
10992d045a
7 changed files with 93 additions and 44 deletions
|
@ -23,3 +23,8 @@ male_names="Althaas,Burin,Glomin,Glamcatus,Trithaithis,Gomdrol,Andurus,Pelaithol
|
|||
#define ORCISH_NAMES
|
||||
male_names="Snamuuga,Knafakhan,Urgtelfar,Maganafa,Gagabreuk,Gruumogth,Muknafa,Snagakhan"
|
||||
#enddef
|
||||
|
||||
#define VILLAGE_NAMES
|
||||
male_names="
|
||||
Th'Lath,Tu'Kach,Tu'Kath,Th'Skalich,Ta'Tel,T'Oos,Thu'Teer,Na'Tal,Ch'Las,Gre'Bach,Thu'Ror,Ta'Mach,Do'Ooch,Gre'Vykk,Th'Lel,G'Ten,So'Bath,Re'Goch,Th'Vyk,Ch'Teek,Th'Goch,Na'Bach,So'Ster,So'Nor,Ch'Teech,Thu'Thol,Sh'Rok,Sh'Voth,T'Quok,Na'Tath,Do'Thon,Ch'Man,Re'Lal,So'Lech,T'Makk,Sh'Both,Tu'Ralal,Do'Bon,Sh'Tees,Th'Goch,Ch'Ralak,Na'Stek,Mak'Vakk,Ch'Gan,Ch'Len,Ch'Mos,Ch'Koch,Mak'Noch,Mak'Lok,Thu'Kol,Do'Stoth,T'Mach,Na'Dor,Ch'Loth,Th'Qual,Mak'Stor,Sh'Quas,Mak'Skakk,Mak'Kar,Mak'Ror,Gre'Bakk,So'Shath,So'Bon,Re'Sten,Ta'Gak,Sh'Kan,Th'Tan,Sh'Nal,Ta'Gol,Ch'Goch,Do'Mas,Th'Ralas,Tu'Vakk,Th'Kal,Tu'Mol,Th'Bon,Re'Thos,Tu'Shalich,So'Kach,G'Dal,G'Boch,Na'Path,Sh'Man,So'Pak,Do'Doth,Re'Teeth,Thu'Mol,G'Skak,Ta'Ooch,Sh'Toth,G'Gok,Do'Tor,Thu'Shalin,Na'Stos,Mak'Stokk,Th'Stach,G'Goch,Tu'Shalil,G'Par,Th'Dath,Ch'Thon,Sh'Pal,G'Ror,Th'Stas,Thu'Mokk,G'Stos,Tu'Gech,So'Lak,So'Noch,Ta'Thoth,Na'Shalil,Gre'Vath,Tu'Shalir,T'Los,Do'Noth,Mak'Ter,Sh'Gel,T'Nor,Sh'Stol,Gre'Doch,Tu'Thal,Gre'Toch,Th'Quor,Ch'Quan,Sh'Ooth,Ch'Shalis,Sh'Tas,T'War,Gre'Kol,T'Dol,G'Stekk,Sh'Koth,G'Kar,Thu'Vyth,Ch'Pal,Ch'Lan,Th'Vol,Mak'Lech,Th'Stak,G'Gas,G'Skar,Th'Ban,Mak'Dakk,Thu'Rath,Mak'Kan,Thu'Vokk,Sh'Dor,Ta'Tok,Ta'Quok,Sh'Lan,Tu'Tes,Ch'Nas,T'Rakk,Ta'Lol,Sh'Lech,Ch'Skach,Do'Mokk,Th'Nakk,Tu'Stor,Ta'Gokk,Gre'Noch,Tu'Quas,Thu'Teth,Ch'Teth,Sh'Vor,Tu'Tees,Sh'Nas,Mak'Quok,T'Vych,Ta'Stak,Gre'Bok,Ta'Path,Na'Lan,Ch'Lech,T'Stok,T'Gak,T'Tos,Ta'Wan,Th'Ster,Mak'Pon,T'Tel,Gre'Tas,Ch'Oon,Sh'Von,Gre'Vath,Do'Quakk,So'Tar,Tu'Vol,Th'Quon,Th'Ros,So'Ger,Mak'Ralar,Do'Shakk,Thu'Thas,Tu'Vyl,So'Lon,Ch'Kokk,Re'Pon,G'Bar,Ta'Gos,G'Ten,Th'Ger,Ta'Skal,Mak'Star,Ta'Gak,Do'Tes,Re'Nak,Ch'Non,Re'Stech,Sh'Kok,Do'Tas,Tu'Goth,Na'Thal,G'Thor,Re'Teekk,Sh'Nok,So'Shach,Gre'Dan,Gre'Vyl,Gre'Gor,Ta'Val,Ch'Tech,So'Shalir,Ta'Mas,Th'Shak,Mak'Tekk,Ta'Stok,Ch'Dakk,Thu'Stan,Tu'Ron,Re'Pon,Mak'Mol,Sh'Gon,G'Por,Thu'Star,Th'Stokk,G'Bokk,Do'Bakk,Na'Vokk,G'Ooth,Gre'Nor,Mak'Ook,So'Quakk,Th'Vych,Sh'Ralas,Th'Los,G'Quakk,Gre'Skar,Gre'Vys,Mak'Pok,Do'Teekk,Thu'Thath,Thu'Vas,T'Lar,Tu'Mas,Mak'Tak,Re'Ter,Th'Roch,Gre'Stok,Do'Gach,Tu'Stan,Re'Las,T'Len,Re'Lath,Gre'Skakk,Ch'Pach,G'Rak,Tu'Stes,Thu'Gok,Gre'Thach,Ta'Ton,Mak'Tach,Ta'Teech,Ch'Bor,Th'Vath,Ch'Pok,Re'Quokk,Ch'Nol,Ta'Gel,Tu'Poch,Ch'Dan,Mak'Quakk,Ta'Val,T'Gas,G'Kach,Sh'Skan,Thu'Gakk,Thu'Skalikk,Sh'Ras,G'Stek,Thu'Dokk,Na'Gen,Gre'Shak,Th'Thor,Gre'Skalith,Sh'Stok,Re'Skalir,Ch'Stath,Ta'Moth,So'Stan,Gre'Shar,Tu'Vyk,Gre'Shach,G'Boch,So'Kach,Gre'Than,Gre'Gen,Gre'Thak,Thu'Gek,Na'Skalil,Ch'Ler,Sh'Teekk,Do'Kar,Sh'Geth,Sh'Teen,T'Boch,Gre'Les,Mak'Lon,Mak'Gas,T'Don,Ta'Pos,Mak'Tech,Th'Gos,Na'Stes,Th'Teekk,Mak'Shalis,So'Poth,Mak'Loch,Na'Noth,G'Wakk,Mak'Ron,Thu'Shak,Mak'Ooch,Tu'Len,T'Dol,Na'Mokk,G'Thath,Thu'Tokk,Do'Lech,Mak'Bas,Re'Dal,Th'Gal,Gre'Shalir,Na'Mos,T'Mach,Th'Tek,Ch'Thar,Mak'Stes,Sh'Shalis,T'Skath,Mak'Stath,Mak'Skas,Do'Lar,So'Dal,Mak'Dar,Re'Skalil,Thu'Rach,Tu'Nor,Sh'Voth,Thu'Teer,G'Toth,So'Teech,Th'Shalikk,Thu'Kakk,Sh'Vych,Gre'Shak,Gre'Rath,Gre'Skalikk,Gre'Dath,Th'Ralas,Re'Toch,Mak'Kon,So'Vyn,T'Qual,Th'Wan,Th'Mok,Ch'Ster,So'Rach,Thu'Thas,Do'Wach,Mak'Math,Ch'Stan,Mak'Shalil,Ch'Quakk,G'Gor,Na'Skalich,Sh'Ralan,Na'Tas,Thu'Gakk,Ch'Mon,Do'Thakk,Do'Ookk,Na'Poth,Tu'Das,Thu'Quos,Gre'Mach,Sh'Tol,Mak'Path,Ta'Nokk,Mak'Shas,Tu'Teel,Ch'Teekk,G'Lon,Th'Kan,G'Mar,Thu'Toch,Ta'Skakk,Tu'Skalith,Thu'Than,Re'Thol,Mak'Don,Mak'Bakk,Do'Ralakk,Re'Ster,Tu'Kor,Na'Leth,G'Dor,So'Stas,Sh'Ban,Tu'Wal,Th'Teech,Sh'Thon,So'Kok,Gre'Oor,So'Bon,Mak'Var,Thu'Skakk,Do'Von,So'Tees,So'Vyk,Th'Doch,Gre'Kach,T'Bar,Sh'Nan,Re'Gar,Sh'Mak,Ch'Teer,Tu'Tak,T'Lach,Ch'Oor,Thu'Kos,So'Dal,Th'Bon,Tu'Thoth,Sh'Gan,Na'Quak,So'Ton,Sh'Bol,Ch'Wath,Mak'Poch,Na'Kol,Sh'Geth,Sh'Stek,Na'Gath,Gre'Stal,Th'Vyth,Sh'Gak,Do'Len,T'Ralan,Ch'Shath,Ta'Var,Thu'Mal,Mak'Vath,Thu'Tath,Sh'Nol,Do'Mol,G'Mokk,Na'Boch,Na'Ler,Re'Wach,Tu'Shalir,Thu'Skalis,Do'Kan,Na'Tath,Thu'Ralar,Mak'Gel,Re'Pan,T'Boch,Thu'Tok,Na'Loch,Thu'Stach,So'Rol,Na'Gal,Na'Gech,Tu'Loth,Gre'Kach,So'Pok,G'Roth,Gre'Teer,T'Tekk,Gre'Kol,Thu'Lar,Thu'Star,G'Kar,Tu'Thas,Ta'Tach,Tu'Kath,Th'Shalich,So'Dal,Do'Quon"
|
||||
#enddef
|
||||
|
|
|
@ -39,12 +39,21 @@ Defeat:
|
|||
controller=human
|
||||
[/side]
|
||||
|
||||
#define VOD_AI_PARMS
|
||||
[ai]
|
||||
grouping=no
|
||||
simple_targetting=yes
|
||||
[/ai]
|
||||
#enddef
|
||||
|
||||
[side]
|
||||
type=Lich
|
||||
description=Galga
|
||||
side=2
|
||||
canrecruit=1
|
||||
|
||||
{VOD_AI_PARMS}
|
||||
|
||||
#ifdef EASY
|
||||
recruit=Skeleton,Revenant,Blood Bat,Ghost,Bone Shooter
|
||||
recruitment_pattern=fighter,fighter,archer,scout
|
||||
|
@ -75,6 +84,7 @@ Defeat:
|
|||
side=3
|
||||
canrecruit=1
|
||||
recruit=Wraith,Walking Corpse
|
||||
{VOD_AI_PARMS}
|
||||
|
||||
#ifdef EASY
|
||||
recruitment_pattern=fighter
|
||||
|
@ -102,6 +112,7 @@ Defeat:
|
|||
description=Selda-Mana
|
||||
side=4
|
||||
canrecruit=1
|
||||
{VOD_AI_PARMS}
|
||||
|
||||
#ifdef EASY
|
||||
recruit=Walking Corpse,Wraith,Bone Shooter,Revenant,Skeleton
|
||||
|
|
|
@ -238,6 +238,10 @@ road_windiness=3
|
|||
valid_terrain=gfh
|
||||
min_distance=24
|
||||
[/castle]
|
||||
|
||||
[village_naming]
|
||||
{VILLAGE_NAMES}
|
||||
[/village_naming]
|
||||
|
||||
[/generator]
|
||||
[/multiplayer]
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "mapgen.hpp"
|
||||
#include "mapgen_dialog.hpp"
|
||||
#include "pathfind.hpp"
|
||||
#include "race.hpp"
|
||||
#include "scoped_resource.hpp"
|
||||
#include "util.hpp"
|
||||
|
||||
|
@ -623,7 +624,7 @@ gamemap::location place_village(const std::vector<std::vector<gamemap::TERRAIN>
|
|||
std::string default_generate_map(size_t width, size_t height, size_t island_size, size_t island_off_center,
|
||||
size_t iterations, size_t hill_size,
|
||||
size_t max_lakes, size_t nvillages, size_t nplayers,
|
||||
const config& cfg)
|
||||
std::map<gamemap::location,std::string>* labels, const config& cfg)
|
||||
{
|
||||
//odd widths are nasty, so make them even
|
||||
if(is_odd(width)) {
|
||||
|
@ -869,44 +870,6 @@ std::string default_generate_map(size_t width, size_t height, size_t island_size
|
|||
|
||||
std::set<location> villages;
|
||||
|
||||
if(nvillages > 0) {
|
||||
//first we work out the size of the x and y distance between villages
|
||||
const size_t tiles_per_village = ((width*height)/9)/nvillages;
|
||||
size_t village_x = 1, village_y = 1;
|
||||
|
||||
//alternate between incrementing the x and y value. When they are high enough
|
||||
//to equal or exceed the tiles_per_village, then we have them to the value
|
||||
//we want them at.
|
||||
size_t* village_ptr = &village_x;
|
||||
while(village_x*village_y < tiles_per_village) {
|
||||
(*village_ptr)++;
|
||||
village_ptr = (village_ptr == &village_x ? &village_y : &village_x);
|
||||
}
|
||||
|
||||
for(size_t vx = 0; vx < width; vx += village_x) {
|
||||
for(size_t vy = rand()%village_y; vy < height; vy += village_y) {
|
||||
const size_t add_x = rand()%3;
|
||||
const size_t add_y = rand()%3;
|
||||
const size_t x = (vx + add_x) - 1;
|
||||
const size_t y = (vy + add_y) - 1;
|
||||
|
||||
const gamemap::location res = place_village(terrain,x,y,2,cfg);
|
||||
|
||||
if(res.x >= width/3 && res.x < (width*2)/3 && res.y >= height/3 && res.y < (height*2)/3) {
|
||||
const std::string str(1,terrain[res.x][res.y]);
|
||||
const config* const child = cfg.find_child("village","terrain",str);
|
||||
if(child != NULL) {
|
||||
const std::string& convert_to = (*child)["convert_to"];
|
||||
if(convert_to != "") {
|
||||
terrain[res.x][res.y] = convert_to[0];
|
||||
villages.insert(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cerr << "placing castles...\n";
|
||||
|
||||
//try to find configuration for castles.
|
||||
|
@ -1042,7 +1005,57 @@ std::string default_generate_map(size_t width, size_t height, size_t island_size
|
|||
terrain[x+1][y-1] = 'C';
|
||||
terrain[x+1][y+1] = 'C';
|
||||
}
|
||||
}
|
||||
|
||||
if(nvillages > 0) {
|
||||
const config* const naming = cfg.child("village_naming");
|
||||
config naming_cfg;
|
||||
if(naming != NULL) {
|
||||
naming_cfg = *naming;
|
||||
}
|
||||
|
||||
const unit_race village_names_generator(naming_cfg);
|
||||
|
||||
//first we work out the size of the x and y distance between villages
|
||||
const size_t tiles_per_village = ((width*height)/9)/nvillages;
|
||||
size_t village_x = 1, village_y = 1;
|
||||
|
||||
//alternate between incrementing the x and y value. When they are high enough
|
||||
//to equal or exceed the tiles_per_village, then we have them to the value
|
||||
//we want them at.
|
||||
size_t* village_ptr = &village_x;
|
||||
while(village_x*village_y < tiles_per_village) {
|
||||
(*village_ptr)++;
|
||||
village_ptr = (village_ptr == &village_x ? &village_y : &village_x);
|
||||
}
|
||||
|
||||
for(size_t vx = 0; vx < width; vx += village_x) {
|
||||
for(size_t vy = rand()%village_y; vy < height; vy += village_y) {
|
||||
const size_t add_x = rand()%3;
|
||||
const size_t add_y = rand()%3;
|
||||
const size_t x = (vx + add_x) - 1;
|
||||
const size_t y = (vy + add_y) - 1;
|
||||
|
||||
const gamemap::location res = place_village(terrain,x,y,2,cfg);
|
||||
|
||||
if(res.x >= width/3 && res.x < (width*2)/3 && res.y >= height/3 && res.y < (height*2)/3) {
|
||||
const std::string str(1,terrain[res.x][res.y]);
|
||||
const config* const child = cfg.find_child("village","terrain",str);
|
||||
if(child != NULL) {
|
||||
const std::string& convert_to = (*child)["convert_to"];
|
||||
if(convert_to != "") {
|
||||
terrain[res.x][res.y] = convert_to[0];
|
||||
villages.insert(res);
|
||||
|
||||
if(labels != NULL && naming_cfg.empty() == false) {
|
||||
const gamemap::location loc(res.x-width/3,res.y-height/3);
|
||||
labels->insert(std::pair<gamemap::location,std::string>(loc,village_names_generator.generate_name(unit_race::MALE)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return output_map(terrain);
|
||||
|
|
|
@ -37,7 +37,7 @@ map_generator* create_map_generator(const std::string& name, const config* cfg);
|
|||
|
||||
std::string default_generate_map(size_t width, size_t height, size_t island_size, size_t island_off_center,
|
||||
size_t iterations, size_t hill_size,
|
||||
size_t max_lakes, size_t nvillages, size_t nplayers,
|
||||
size_t max_lakes, size_t nvillages, size_t nplayers, std::map<gamemap::location,std::string>* labels,
|
||||
const config& cfg);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -254,6 +254,11 @@ void default_map_generator::user_config(display& disp)
|
|||
std::string default_map_generator::name() const { return "default"; }
|
||||
|
||||
std::string default_map_generator::create_map(const std::vector<std::string>& args)
|
||||
{
|
||||
return generate_map(args);
|
||||
}
|
||||
|
||||
std::string default_map_generator::generate_map(const std::vector<std::string>& args, std::map<gamemap::location,std::string>* labels)
|
||||
{
|
||||
size_t iterations = iterations_;
|
||||
size_t island_size = 0;
|
||||
|
@ -280,10 +285,11 @@ std::string default_map_generator::create_map(const std::vector<std::string>& ar
|
|||
|
||||
std::cerr << "generating map with " << nplayers_ << " players\n";
|
||||
|
||||
if(cfg_ != NULL)
|
||||
return default_generate_map(width_,height_,island_size,island_off_center,iterations,hill_size_,max_lakes,(nvillages_*width_*height_)/1000,nplayers_,*cfg_);
|
||||
else
|
||||
if(cfg_ != NULL) {
|
||||
return default_generate_map(width_,height_,island_size,island_off_center,iterations,hill_size_,max_lakes,(nvillages_*width_*height_)/1000,nplayers_,labels,*cfg_);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
config default_map_generator::create_scenario(const std::vector<std::string>& args)
|
||||
|
@ -294,7 +300,14 @@ config default_map_generator::create_scenario(const std::vector<std::string>& ar
|
|||
res = *scenario;
|
||||
}
|
||||
|
||||
res["map_data"] = create_map(args);
|
||||
std::map<gamemap::location,std::string> labels;
|
||||
res["map_data"] = generate_map(args,&labels);
|
||||
|
||||
for(std::map<gamemap::location,std::string>::const_iterator i = labels.begin(); i != labels.end(); ++i) {
|
||||
config& label = res.add_child("label");
|
||||
label["text"] = i->second;
|
||||
i->first.write(label);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
|
@ -17,6 +17,9 @@ public:
|
|||
config create_scenario(const std::vector<std::string>& args);
|
||||
|
||||
private:
|
||||
|
||||
std::string generate_map(const std::vector<std::string>& args, std::map<gamemap::location,std::string>* labels=NULL);
|
||||
|
||||
size_t width_, height_, island_size_, iterations_, hill_size_, max_lakes_, nvillages_, nplayers_;
|
||||
const config* cfg_;
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue