1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

- Random monsters will have proper strength.

- Fixed blocking of tiles under objects
This commit is contained in:
DjWarmonger 2014-06-01 14:10:44 +02:00
parent 11454ef4b3
commit 3c5a65af3d
3 changed files with 54 additions and 35 deletions

View File

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

View File

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

View File

@ -113,6 +113,7 @@ public:
std::set<int3> 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);