diff --git a/config/rmg.json b/config/rmg.json index ca2f72cfa..0ac7bf064 100644 --- a/config/rmg.json +++ b/config/rmg.json @@ -33,10 +33,10 @@ }, "connections" : [ - { "a" : "1", "b" : "5", "guard" : 1000 }, - { "a" : "2", "b" : "5", "guard" : 1000 }, - { "a" : "3", "b" : "5", "guard" : 1000 }, - { "a" : "4", "b" : "5", "guard" : 1000 } + { "a" : "1", "b" : "5", "guard" : 5000 }, + { "a" : "2", "b" : "5", "guard" : 5000 }, + { "a" : "3", "b" : "5", "guard" : 5000 }, + { "a" : "4", "b" : "5", "guard" : 5000 } ] }, "Upgrade" : @@ -111,18 +111,18 @@ }, "connections" : [ - { "a" : "1", "b" : "4", "guard" : 1000 }, - { "a" : "1", "b" : "5", "guard" : 1000 }, - { "a" : "2", "b" : "6", "guard" : 1000 }, - { "a" : "2", "b" : "7", "guard" : 1000 }, - { "a" : "3", "b" : "8", "guard" : 1000 }, - { "a" : "3", "b" : "9", "guard" : 1000 }, - { "a" : "4", "b" : "10", "guard" : 1000 }, - { "a" : "5", "b" : "12", "guard" : 1000 }, - { "a" : "6", "b" : "10", "guard" : 1000 }, - { "a" : "7", "b" : "11", "guard" : 1000 }, - { "a" : "8", "b" : "12", "guard" : 1000 }, - { "a" : "9", "b" : "11", "guard" : 1000 } + { "a" : "1", "b" : "4", "guard" : 2000 }, + { "a" : "1", "b" : "5", "guard" : 2000 }, + { "a" : "2", "b" : "6", "guard" : 2000 }, + { "a" : "2", "b" : "7", "guard" : 2000 }, + { "a" : "3", "b" : "8", "guard" : 2000 }, + { "a" : "3", "b" : "9", "guard" : 2000 }, + { "a" : "4", "b" : "10", "guard" : 20000 }, + { "a" : "5", "b" : "12", "guard" : 20000 }, + { "a" : "6", "b" : "10", "guard" : 20000 }, + { "a" : "7", "b" : "11", "guard" : 20000 }, + { "a" : "8", "b" : "12", "guard" : 20000 }, + { "a" : "9", "b" : "11", "guard" : 20000 } ] }, "Unfair Game" : @@ -156,12 +156,12 @@ }, "connections" : [ - { "a" : "1", "b" : "3", "guard" : 2000 }, - { "a" : "1", "b" : "4", "guard" : 2000 }, - { "a" : "2", "b" : "3", "guard" : 2000 }, - { "a" : "2", "b" : "4", "guard" : 2000 }, - { "a" : "3", "b" : "5", "guard" : 1000 }, - { "a" : "4", "b" : "6", "guard" : 1000 } + { "a" : "1", "b" : "3", "guard" : 5000 }, + { "a" : "1", "b" : "4", "guard" : 5000 }, + { "a" : "2", "b" : "3", "guard" : 5000 }, + { "a" : "2", "b" : "4", "guard" : 5000 }, + { "a" : "3", "b" : "5", "guard" : 2000 }, + { "a" : "4", "b" : "6", "guard" : 2000 } ] } } diff --git a/lib/rmg/CRmgTemplateZone.cpp b/lib/rmg/CRmgTemplateZone.cpp index 03d207ae1..e680e4847 100644 --- a/lib/rmg/CRmgTemplateZone.cpp +++ b/lib/rmg/CRmgTemplateZone.cpp @@ -16,6 +16,7 @@ #include "../VCMI_Lib.h" #include "../CTownHandler.h" +#include "../CCreatureHandler.h" class CMap; class CMapEditManager; @@ -349,7 +350,7 @@ void CRmgTemplateZone::createConnections(CMapGenerator* gen) }); if (guardPos.valid()) { - gen->setOccupied (guardPos, ETileType::FREE); //TODO: place monster here + addMonster (gen, guardPos, 10000); //TODO: set value according to template //zones can make paths only in their own area this->crunchPath (gen, guardPos, this->getPos(), this->getId()); //make connection towards our zone center gen->getZones()[connection]->crunchPath (gen, guardPos, otherZoneCenter, connection); //make connection towards other zone center @@ -454,6 +455,29 @@ void CRmgTemplateZone::addRequiredObject(CGObjectInstance * obj) requiredObjects.push_back(obj); } +void CRmgTemplateZone::addMonster(CMapGenerator* gen, int3 &pos, si32 strength) +{ + CreatureID creId = CreatureID::NONE; + int amount = 0; + while (true) + { + creId = VLC->creh->pickRandomMonster(gen->rand); + auto cre = VLC->creh->creatures[creId]; + amount = strength / cre->AIValue; + if (amount >= cre->ammMin && amount <= 100) + break; + } + + auto guard = new CGCreature(); + guard->ID = Obj::MONSTER; + guard->subID = creId; + auto hlp = new CStackInstance(creId, amount); + //will be set during initialization + guard->putStack(SlotID(0), hlp); + + placeObject(gen, guard, pos); +} + bool CRmgTemplateZone::fill(CMapGenerator* gen) { int townId = 0; @@ -567,7 +591,7 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen) for(const auto &obj : guarded_objects) { - if ( ! guardObject(gen, obj, 500)) + if ( ! guardObject(gen, obj, 1000)) { //TODO, DEL obj from map } @@ -687,11 +711,11 @@ void CRmgTemplateZone::placeObject(CMapGenerator* gen, CGObjectInstance* object, if (object->isVisitable()) points.insert(pos + object->getVisitableOffset()); points.insert(pos); - for(auto const &p : points) + for(auto p : points) { - if (vstd::contains(tileinfo, pos + p)) + if (gen->map->isInTheMap(p)) { - gen->setOccupied(pos + p, ETileType::USED); + gen->setOccupied(p, ETileType::USED); } } for(auto tile : tileinfo) @@ -723,14 +747,8 @@ bool CRmgTemplateZone::guardObject(CMapGenerator* gen, CGObjectInstance* object, } auto guard_tile = *RandomGeneratorUtil::nextItem(tiles, gen->rand); gen->setOccupied (guard_tile, ETileType::USED); - auto guard = new CGCreature(); - guard->ID = Obj::RANDOM_MONSTER; - guard->subID = 0; - auto hlp = new CStackInstance(); - hlp->count = 10; - //type will be set during initialization - guard->putStack(SlotID(0), hlp); - checkAndPlaceObject(gen, guard, guard_tile); + addMonster (gen, guard_tile, str); + return true; } diff --git a/lib/rmg/CRmgTemplateZone.h b/lib/rmg/CRmgTemplateZone.h index 3a41f509d..657c6ccae 100644 --- a/lib/rmg/CRmgTemplateZone.h +++ b/lib/rmg/CRmgTemplateZone.h @@ -113,6 +113,7 @@ public: std::set getTileInfo () const; void addRequiredObject(CGObjectInstance * obj); + void addMonster(CMapGenerator* gen, int3 &pos, si32 strength); bool fill(CMapGenerator* gen); void createConnections(CMapGenerator* gen); void createBorder(CMapGenerator* gen);