From 2a147ccb7d3e5c37e7f28d69e87f7bfb93854486 Mon Sep 17 00:00:00 2001 From: Alexey Nabrodov Date: Wed, 13 Sep 2017 20:33:25 +0300 Subject: [PATCH] init cities --- CMakeLists.txt | 1 + images/anchor.png | Bin 0 -> 3197 bytes images/capital.png | Bin 0 -> 17358 bytes include/mapgen/City.hpp | 14 ++++++ include/mapgen/MapGenerator.hpp | 3 ++ include/mapgen/Region.hpp | 5 +++ src/Biom.cpp | 2 + src/City.cpp | 8 ++++ src/MapGenerator.cpp | 76 ++++++++++++++++++++++++++------ src/application.cpp | 45 +++++++++++++++++-- src/infoWindow.cpp | 2 + src/names.cpp | 14 ++++++ 12 files changed, 153 insertions(+), 17 deletions(-) create mode 100644 images/anchor.png create mode 100644 images/capital.png create mode 100644 include/mapgen/City.hpp create mode 100644 src/City.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b316597..d1a4b80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set (mapgen_VERSION_MINOR 1) file(GLOB SOURCE "src/*.cpp" "include/mapgen/*.h") file(COPY "font.ttf" DESTINATION "bin") +file(COPY "images" DESTINATION "bin") configure_file ( "${PROJECT_SOURCE_DIR}/MapgenConfig.h.in" diff --git a/images/anchor.png b/images/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..a64273a087df54d47c80a563a432e9166bad069b GIT binary patch literal 3197 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 literal 0 HcmV?d00001 diff --git a/images/capital.png b/images/capital.png new file mode 100644 index 0000000000000000000000000000000000000000..62f10ac13ba119a36ac4770367817c65db343409 GIT binary patch literal 17358 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 vKs>v^JFW8>M(>FrRKvG0W-h rivers; + std::vector cities; std::vector clusters; std::vector megaClusters; bool simpleRivers; @@ -59,6 +61,7 @@ class MapGenerator { void simplifyRivers(); void makeBorders(); void makeMinerals(); + void makeCities(); int _seed; VoronoiDiagramGenerator _vdg; int _pointsCount; diff --git a/include/mapgen/Region.hpp b/include/mapgen/Region.hpp index 9ad9d51..ef1060b 100644 --- a/include/mapgen/Region.hpp +++ b/include/mapgen/Region.hpp @@ -12,6 +12,7 @@ typedef std::map HeightMap; struct Cluster; typedef Cluster MegaCluster; +class City; class Region { public: Region(); @@ -29,6 +30,9 @@ class Region { float temperature; float minerals; float nice; + City* city; + float distanceFormCapital; + bool coast; private: PointList _verticies; HeightMap _heights; @@ -46,6 +50,7 @@ struct Cluster { PointList border; std::vector resourcePoints; std::vector goodPoints; + std::vector cities; }; #endif diff --git a/src/Biom.cpp b/src/Biom.cpp index 66149cb..9c87184 100644 --- a/src/Biom.cpp +++ b/src/Biom.cpp @@ -16,6 +16,7 @@ Biom ICE = {1.2000, sf::Color(220, 220, 255), "Ice", 0.9}; Biom PRAIRIE = {999.000, sf::Color(239, 220, 124), "Prairie", 0.1}; Biom MEADOW = {999.000, sf::Color(126, 190, 75), "Meadow", 0.1}; Biom DESERT = {999.000, sf::Color(244, 164, 96), "Desert", 0.3}; +Biom CITY = {999.000, sf::Color(220,220,220), "City", 0.3}; Biom RAIN_FORREST = {0.3750, sf::Color(51, 90, 75), "Rain forrest", 0.6}; @@ -25,6 +26,7 @@ std::vector BIOMS = {{ Biom LAKE = {999.000, sf::Color(51, 51, 91), "Lake", 1}; Biom MARK = {999.000, sf::Color::Red, "Mark"}; +Biom MARK2 = {999.000, sf::Color::Black, "Mark"}; Biom LAND = {0.500, sf::Color(136, 170, 85), "Land", 1}; Biom SEA = {-1.000, sf::Color(39, 39, 70), "Sea", 1}; diff --git a/src/City.cpp b/src/City.cpp new file mode 100644 index 0000000..578d111 --- /dev/null +++ b/src/City.cpp @@ -0,0 +1,8 @@ +#include "mapgen/City.hpp" +#include "mapgen/Region.hpp" + +City::City(Region *r, std::string n) : region(r), name(n) { + isCapital = false; + region->biom = CITY; + region->city = this; +} diff --git a/src/MapGenerator.cpp b/src/MapGenerator.cpp index b3fc597..ee3abc0 100644 --- a/src/MapGenerator.cpp +++ b/src/MapGenerator.cpp @@ -3,6 +3,7 @@ #include #include #include "Biom.cpp" +#include "City.cpp" #include "names.cpp" const int DEFAULT_RELAX = 5; @@ -56,6 +57,13 @@ MapGenerator::MapGenerator(int w, int h): _w(w), _h(h) { temperature = DEFAULT_TEMPERATURE; } +double getDistance(Point p, Point p2) { + double distancex = (p2->x - p->x); + double distancey = (p2->y - p->y); + + return std::sqrt(distancex * distancex + distancey * distancey); +} + void MapGenerator::simplifyRivers() { currentOperation = "Simplify rivers..."; for (auto r : rivers) { @@ -74,19 +82,8 @@ void MapGenerator::simplifyRivers() { Point p3 = (*rvr)[i+2]; Point sp; - double distancex = (p2->x - p->x); - distancex *= distancex; - double distancey = (p2->y - p->x); - distancey *= distancey; - - double d1 = sqrt(distancex + distancey); - - distancex = (p3->x - p->x); - distancex *= distancex; - distancey = (p3->y - p->x); - distancey *= distancey; - - double d2 = sqrt(distancex + distancey); + double d1 = getDistance(p, p2); + double d2 = getDistance(p, p3); if (d2 < d1) { sp = p2; @@ -178,9 +175,59 @@ void MapGenerator::update() { makeFinalRegions(); makeClusters(); + makeCities(); + ready = true; } +void MapGenerator::makeCities() { + currentOperation = "Founding cities..."; + double minDistance = std::numeric_limits::max(); + Region* betterPlace; + MegaCluster* biggestCluster; + for (auto c: megaClusters) { + if (c->isLand) { + biggestCluster = c; + break; + } + } + + std::vector places; + std::copy_if(biggestCluster->regions.begin(), biggestCluster->regions.end(), std::back_inserter(places), [](Region* r){ + return r->biom.name != LAKE.name && r->nice >= 0.5 && r->minerals >= 0.5 && r->temperature >= DEFAULT_TEMPERATURE/3; + }); + std::sort(places.begin(), places.end(), [&](Region* r, Region* r2){ + if (r->nice + r->minerals >= r2->nice + r2->minerals){ + return true; + } + return false; + }); + City* capital = new City(places[0], generateCityName()); + capital->isCapital = true; + cities.push_back(capital); + + // std::vector::iterator portPlace = std::find_if(biggestCluster->regions.begin(), biggestCluster->regions.end(), [](Region* r){ + // return r->border && r->hasRiver; + // }); + + places.clear(); + std::copy_if(biggestCluster->regions.begin(), biggestCluster->regions.end(), std::back_inserter(places), [&](Region* r){ + return r->border && r->hasRiver && r->coast && r != capital->region; + }); + std::sort(places.begin(), places.end(), [&](Region* r, Region* r2){ + if ( getDistance(r->site, capital->region->site) <= getDistance(r2->site, capital->region->site)){ + return true; + } + return false; + }); + City* port = new City(places[0], generateCityName()); + cities.push_back(port); + + for (auto r : *_regions) { + r->distanceFormCapital = getDistance(r->site, capital->region->site); + } +} + void MapGenerator::makeMinerals() { currentOperation = "Search for minerals..."; utils::NoiseMapBuilderPlane heightMapBuilder; @@ -484,6 +531,8 @@ void MapGenerator::makeRegions() { h.insert(std::make_pair(&p, ht)); Biom b = ht < 0.0625 ? SEA : LAND; Region *region = new Region(b, verts, h, &p); + region->city = nullptr; + region->coast = false; region->cell = c; region->humidity = DEFAULT_HUMIDITY; region->border = false; @@ -569,6 +618,7 @@ void MapGenerator::makeMegaClusters() { Region* rn = _cells[n]; if (r->biom.name != rn->biom.name){ r->border = true; + r->coast = r->biom.name == LAND.name && rn->biom.name == SEA.name; } else if (_megaClusters.count(rn) != 0) { cu = false; if (knownCluster == nullptr) { diff --git a/src/application.cpp b/src/application.cpp index 8edc8b0..40a560a 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -20,7 +20,10 @@ class Application { std::vector polygons; std::vector poi; std::vector infoPolygons; + std::vector sprites; std::vector verticies; + sf::Texture *capitalIcon; + sf::Texture *anchorIcon; sf::Color bgColor; AppLog log; MapGenerator *mapgen; @@ -86,6 +89,18 @@ class Application { sffont.loadFromFile("./font.ttf"); + capitalIcon = new sf::Texture(); + if (!capitalIcon->loadFromFile("images/capital.png")) { + std::cout<<"Image error"<setSmooth(true); + + anchorIcon = new sf::Texture(); + if (!anchorIcon->loadFromFile("images/anchor.png")) { + std::cout<<"Image error"<setSmooth(true); + sf::Vector2u windowSize = window->getSize(); cachedMap.create(windowSize.x, windowSize.y); log.AddLog("Welcome to Mapgen\n"); @@ -294,10 +309,10 @@ class Application { regen(); } - if (ImGui::SliderFloat("Base temperature", &temperature, -20.f, 50.f)) { - mapgen->temperature = temperature; - regen(); - } + // if (ImGui::SliderFloat("Base temperature", &temperature, -20.f, 50.f)) { + // mapgen->temperature = temperature; + // regen(); + // } // if (ImGui::Button("Relax")) { // log.AddLog("Update map\n"); @@ -466,6 +481,9 @@ class Application { } drawRivers(); + for (auto sprite : sprites) { + window->draw(sprite); + } sf::Vector2u windowSize = window->getSize(); cachedMap.create(windowSize.x, windowSize.y); @@ -579,6 +597,7 @@ class Application { polygons.clear(); poi.clear(); verticies.clear(); + sprites.clear(); for (auto mc: mapgen->megaClusters) { for (auto p: mc->resourcePoints) { @@ -624,7 +643,25 @@ class Application { } col.a = a; } + if (region->city != nullptr) { + sf::Sprite sprite; + if (region->city->isCapital) { + sprite.setTexture(*capitalIcon); + auto p = region->site; + sprite.setScale(0.05, 0.05); + auto size = capitalIcon->getSize(); + sprite.setPosition(sf::Vector2f(p->x-size.x*0.05/2.f, p->y-size.y*0.05/2.f)); + } else { + sprite.setTexture(*anchorIcon); + auto p = region->site; + sprite.setScale(0.1, 0.1); + auto size = anchorIcon->getSize(); + sprite.setPosition(sf::Vector2f(p->x-size.x*0.05/2.f, p->y-size.y*0.05/2.f)); + } + sprites.push_back(sprite); + } polygon.setFillColor(col); + if (edges) { polygon.setOutlineColor(sf::Color(100, 100, 100)); polygon.setOutlineThickness(1); diff --git a/src/infoWindow.cpp b/src/infoWindow.cpp index a7d5679..4fcc5d7 100644 --- a/src/infoWindow.cpp +++ b/src/infoWindow.cpp @@ -17,6 +17,8 @@ void infoWindow(sf::RenderWindow* window, Region* currentRegion) { ImGui::Text("Cluster: %p", cluster); ImGui::Text("Cluster size: %zu", cluster->regions.size()); ImGui::Text("Mega Cluster: %s", currentRegion->megaCluster->name.c_str()); + ImGui::Text("Distance from capital: %f", currentRegion->distanceFormCapital); + ImGui::Text("Coast: %s", currentRegion->coast ? "true" : "false"); ImGui::Text("Site: x:%f y:%f z:%f", currentRegion->site->x, currentRegion->site->y, diff --git a/src/names.cpp b/src/names.cpp index 789c9a4..d175ddf 100644 --- a/src/names.cpp +++ b/src/names.cpp @@ -1,6 +1,7 @@ #include #include #include +#include const std::string _river_first_names[] = {"Alligator","Amazon","Arching","Arctic","Arrowhead","Bamboo","Black","Bland","Blue","Bogbeast","Boundless","Brilliant","Bursting","Calm","Charmed","Choral","Climbing","Cobalt","Cold","Coral","Crocodile","Crystal","Cursed","Dancing","Dark","Darkest","Dead","Deep","Distant","Dragonfly","Dread","Dreaded","Eastern","Emerald","Empty","Enchanted","Ethereal","Ever Reaching","Fair","Flowing","Foaming","Forbidden","Frothy","Frozen","Glassy","Gleaming","Glistening","Gray","Green","Harmony","Heaving","Homeless","Hungry","Infernal","Infinite","Invisible","Iris","Isolated","Jade","Laughing","Lifeless","Lilypad","Lion's Tail","Living","Lonely","Lotus","Lucent","Majestic","Mesmerizing","Mighty","Mirrored","Misty","Moaning","Molten","Moon-lit","Motionless","Moving","Narrow","New","Northern","Peaceful","Perfumed","Pleasant","Quiet","Raging","Rainy","Red","Restless","Rippling","Rocking","Rolling","Rough","Rushing","Sandy","Sanguine","Savage","Serene","Serpent","Shimmering","Silent","Sleeping","Slumbrous","Soundless","Southern","Sparkling","Sterile","Stern","Straitened","Sunny","Surging","Tadpole","Teal","Throbbing","Thundering","Tinted","Tortoise","Tossing","Tranquil","Treacherous","Troubled","Turbulent","Turquoise","Turtle","Uncanny","Unknown","Violent","Waveless","Western","Whispering","White","Wild","Windy","Wondering","Wrinkled"}; const std::string _river_second_names[] = {"Creek","River","Stream","Brook","Run","Tributary","Beck","Rill"}; @@ -20,6 +21,13 @@ const std::string _sea_second_names[] = {"Abyss","Tides","Waves","Bay","Deep","D std::vector sea_first_names (_sea_first_names, _sea_first_names + sizeof(_sea_first_names) / sizeof(_sea_first_names[0]) ); std::vector sea_second_names (_sea_second_names, _sea_second_names + sizeof(_sea_second_names) / sizeof(_sea_second_names[0]) ); +const std::string _city_first_names[] = {"amber","angel","spirit","basin","lagoon","basin","arrow","autumn","bare","bay","beach","bear","bell","black","bleak","blind","bone","boulder","bridge","brine","brittle","bronze","castle","cave","chill","clay","clear","cliff","cloud","cold","crag","crow","crystal","curse","dark","dawn","dead","deep","deer","demon","dew","dim","dire","dirt","dog","dragon","dry","dusk","dust","eagle","earth","east","ebon","edge","elder","ember","ever","fair","fall","false","far","fay","fear","flame","flat","frey","frost","ghost","glimmer","gloom","gold","grass","gray","green","grim","grime","hazel","heart","high","hollow","honey","hound","ice","iron","kil","knight","lake","last","light","lime","little","lost","mad","mage","maple","mid","might","mill","mist","moon","moss","mud","mute","myth","never","new","night","north","oaken","ocean","old","ox","pearl","pine","pond","pure","quick","rage","raven","red","rime","river","rock","rogue","rose","rust","salt","sand","scorch","shade","shadow","shimmer","shroud","silent","silk","silver","sleek","sleet","sly","small","smooth","snake","snow","south","spring","stag","star","steam","steel","steep","still","stone","storm","summer","sun","swamp","swan","swift","thorn","timber","trade","west","whale","whit","white","wild","wilde","wind","winter","wolf"}; +const std::string _city_second_names[] = {"acre","band","barrow","bay","bell","born","borough","bourne","breach","break","brook","burgh","burn","bury","cairn","call","chill","cliff","coast","crest","cross","dale","denn","drift","fair","fall","falls","fell","field","ford","forest","fort","front","frost","garde","gate","glen","grasp","grave","grove","guard","gulch","gulf","hall","hallow","ham","hand","harbor","haven","helm","hill","hold","holde","hollow","horn","host","keep","land","light","maw","meadow","mere","mire","mond","moor","more","mount","mouth","pass","peak","point","pond","port","post","reach","rest","rock","run","scar","shade","shear","shell","shield","shore","shire","side","spell","spire","stall","wich","minster","star","storm","strand","summit","tide","town","vale","valley","vault","vein","view","ville","wall","wallow","ward","watch","water","well","wharf","wick","wind","wood","yard"}; + +std::vector city_first_names (_city_first_names, _city_first_names + sizeof(_city_first_names) / sizeof(_city_first_names[0]) ); +std::vector city_second_names (_city_second_names, _city_second_names + sizeof(_city_second_names) / sizeof(_city_second_names[0]) ); + + template Iter select_randomly(Iter start, Iter end, int s) { std::mt19937 gen(s); @@ -41,3 +49,9 @@ std::string generateLandName() { std::string generateSeaName() { return *select_randomly(sea_first_names.begin(), sea_first_names.end(), std::clock()) + " " + *select_randomly(sea_second_names.begin(), sea_second_names.end(), std::clock()); } + +std::string generateCityName() { + auto name = *select_randomly(city_first_names.begin(), city_first_names.end(), std::clock()) + *select_randomly(city_second_names.begin(), city_second_names.end(), std::clock()); + name[0] = toupper(name[0]); + return name; +}