diff --git a/lib/rmg/CRmgTemplateZone.cpp b/lib/rmg/CRmgTemplateZone.cpp index d846f4f01..a3d0c7995 100644 --- a/lib/rmg/CRmgTemplateZone.cpp +++ b/lib/rmg/CRmgTemplateZone.cpp @@ -294,63 +294,16 @@ void CRmgTemplateZone::setCenter(float3 f) bool CRmgTemplateZone::pointIsIn(int x, int y) { - //int i, j; - //bool c = false; - //int nvert = shape.size(); - //for (i = 0, j = nvert-1; i < nvert; j = i++) { - // if ( ((shape[i].y>y) != (shape[j].y>y)) && - // (x < (shape[j].x-shape[i].x) * (y-shape[i].y) / (shape[j].y-shape[i].y) + shape[i].x) ) - // c = !c; - //} return true; } void CRmgTemplateZone::setShape(std::vector shape) { - //int z = -1; - //si32 minx = INT_MAX; - //si32 maxx = -1; - //si32 miny = INT_MAX; - //si32 maxy = -1; - //for(auto &point : shape) - //{ - // if (z == -1) - // z = point.z; - // if (point.z != z) - // throw rmgException("Zone shape points should lie on same z."); - // minx = std::min(minx, point.x); - // maxx = std::max(maxx, point.x); - // miny = std::min(miny, point.y); - // maxy = std::max(maxy, point.y); - //} this->shape = shape; - //for(int x = minx; x <= maxx; ++x) - //{ - // for(int y = miny; y <= maxy; ++y) - // { - // if (pointIsIn(x, y)) - // { - // tileinfo[int3(x,y,z)] = CTileInfo(); - // } - // } - //} } int3 CRmgTemplateZone::getPos() { - //si32 cx = 0; - //si32 cy = 0; - //si32 area = 0; - //si32 sz = shape.size(); - ////include last->first too - //for(si32 i = 0, j = sz-1; i < sz; j = i++) { - // si32 sf = (shape[i].x * shape[j].y - shape[j].x * shape[i].y); - // cx += (shape[i].x + shape[j].x) * sf; - // cy += (shape[i].y + shape[j].y) * sf; - // area += sf; - //} - //area /= 2; - //return int3(std::abs(cx/area/6), std::abs(cy/area/6), shape[0].z); return pos; } void CRmgTemplateZone::setPos(int3 &Pos) @@ -366,6 +319,9 @@ void CRmgTemplateZone::addTile (int3 &pos) bool CRmgTemplateZone::fill(CMapGenerator* gen) { std::vector required_objects; + + int townId = 0; + if ((type == ETemplateZoneType::CPU_START) || (type == ETemplateZoneType::PLAYER_START)) { logGlobal->infoStream() << "Preparing playing zone"; @@ -376,7 +332,7 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen) PlayerColor player(player_id); auto town = new CGTownInstance(); town->ID = Obj::TOWN; - int townId = gen->mapGenOptions->getPlayersSettings().find(player)->second.getStartingTown(); + townId = gen->mapGenOptions->getPlayersSettings().find(player)->second.getStartingTown(); if(townId == CMapGenOptions::CPlayerSettings::RANDOM_TOWN) townId = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); // all possible towns, skip neutral @@ -398,15 +354,6 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen) playerInfo.posOfMainTown = town->pos - int3(2, 0, 0); playerInfo.generateHeroAtMainTown = true; - //paint zone with matching terrain - std::vector tiles; - for (auto tile : tileinfo) - { - tiles.push_back (tile.first); - } - gen->editManager->getTerrainSelection().setSelection(tiles); - gen->editManager->drawTerrain(VLC->townh->factions[townId]->nativeTerrain, &gen->rand); - //required_objects.push_back(town); std::vector required_mines; @@ -426,9 +373,23 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen) else { type = ETemplateZoneType::TREASURE; + townId = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); logGlobal->infoStream() << "Skipping this zone cause no player"; } } + else //no player + { + townId = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); + } + //paint zone with matching terrain + std::vector tiles; + for (auto tile : tileinfo) + { + tiles.push_back (tile.first); + } + gen->editManager->getTerrainSelection().setSelection(tiles); + gen->editManager->drawTerrain(VLC->townh->factions[townId]->nativeTerrain, &gen->rand); + logGlobal->infoStream() << "Creating required objects"; for(const auto &obj : required_objects) {