added naming of villages in random maps

This commit is contained in:
Dave White 2004-05-24 21:01:08 +00:00
parent 16995d0cf5
commit 10992d045a
7 changed files with 93 additions and 44 deletions

View file

@ -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

View file

@ -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

View file

@ -238,6 +238,10 @@ road_windiness=3
valid_terrain=gfh
min_distance=24
[/castle]
[village_naming]
{VILLAGE_NAMES}
[/village_naming]
[/generator]
[/multiplayer]

View file

@ -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);

View file

@ -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

View file

@ -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;
}

View file

@ -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_;
};