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

Merge pull request #3528 from vcmi/master

Merge master -> develop
This commit is contained in:
Ivan Savenko 2024-01-19 21:19:20 +02:00 committed by GitHub
commit 339fad6e27
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 44 additions and 25 deletions

View File

@ -10,8 +10,8 @@ android {
applicationId "is.xyz.vcmi"
minSdk 19
targetSdk 33
versionCode 1430
versionName "1.4.3"
versionCode 1440
versionName "1.4.4"
setProperty("archivesBaseName", "vcmi")
}

View File

@ -1,6 +1,6 @@
set(VCMI_VERSION_MAJOR 1)
set(VCMI_VERSION_MINOR 4)
set(VCMI_VERSION_PATCH 3)
set(VCMI_VERSION_PATCH 4)
add_definitions(
-DVCMI_VERSION_MAJOR=${VCMI_VERSION_MAJOR}
-DVCMI_VERSION_MINOR=${VCMI_VERSION_MINOR}

View File

@ -166,7 +166,10 @@
"defaultGainChance" : {
"type" : "number",
"description" : "Gain chance by default for all factions"
},
"canCastOnSelf" : {
"type" : "boolean",
"description" : "If used as creature spell, unit can cast this spell on itself"
},
"gainChance" : {
"type" : "object",

6
debian/changelog vendored
View File

@ -1,3 +1,9 @@
vcmi (1.4.4) jammy; urgency=medium
* New upstream release
-- Ivan Savenko <saven.ivan@gmail.com> Sat, 20 Jan 2024 12:00:00 +0200
vcmi (1.4.3) jammy; urgency=medium
* New upstream release

View File

@ -76,7 +76,8 @@
</screenshot>
</screenshots>
<releases>
<release version="1.4.3" date="2024-01-19" type="development"/>
<release version="1.4.4" date="2024-01-20" type="stable"/>
<release version="1.4.3" date="2024-01-19" type="stable"/>
<release version="1.4.2" date="2023-12-25" type="stable"/>
<release version="1.4.1" date="2023-12-12" type="stable"/>
<release version="1.4.0" date="2023-12-08" type="stable"/>

View File

@ -12,4 +12,4 @@ Exec=vcmilauncher
Categories=Game;StrategyGame;
Version=1.5
Keywords=heroes of might and magic;heroes;homm;homm3;strategy;
SingleMainWindow=yes
SingleMainWindow=true

View File

@ -138,6 +138,9 @@ void Object::Instance::setTemplate(TerrainId terrain, CRandomGenerator & rng)
void Object::Instance::clear()
{
if (onCleared)
onCleared(&dObject);
delete &dObject;
dBlockedAreaCache.clear();
dAccessibleAreaCache.clear();

View File

@ -51,6 +51,7 @@ public:
void finalize(RmgMap & map, CRandomGenerator &); //cache invalidation
void clear();
std::function<void(CGObjectInstance *)> onCleared;
private:
mutable Area dBlockedAreaCache;
int3 dPosition;

View File

@ -34,7 +34,7 @@
VCMI_LIB_NAMESPACE_BEGIN
ObjectInfo::ObjectInfo():
destroyObject([](){})
destroyObject([](CGObjectInstance * obj){})
{
}
@ -123,15 +123,9 @@ void TreasurePlacer::addAllPossibleObjects()
continue;
}
oi.generateObject = [i, this, prisonHeroPlacer, &oi]() -> CGObjectInstance*
oi.generateObject = [i, this, prisonHeroPlacer]() -> CGObjectInstance*
{
HeroTypeID hid = prisonHeroPlacer->drawRandomHero();
oi.destroyObject = [hid, prisonHeroPlacer]()
{
// Hero can be used again
prisonHeroPlacer->restoreDrawnHero(hid);
};
auto factory = VLC->objtypeh->getHandlerFor(Obj::PRISON, 0);
auto* obj = dynamic_cast<CGHeroInstance*>(factory->create());
@ -141,6 +135,13 @@ void TreasurePlacer::addAllPossibleObjects()
return obj;
};
oi.destroyObject = [prisonHeroPlacer](CGObjectInstance* obj)
{
// Hero can be used again
auto* hero = dynamic_cast<CGHeroInstance*>(obj);
prisonHeroPlacer->restoreDrawnHero(hero->getHeroType());
};
oi.setTemplates(Obj::PRISON, 0, zone.getTerrainType());
oi.value = generator.getConfig().prisonValues[i];
oi.probability = 30;
@ -464,18 +465,20 @@ void TreasurePlacer::addAllPossibleObjects()
RandomGeneratorUtil::randomShuffle(creatures, zone.getRand());
auto setRandomArtifact = [qap, &oi](CGSeerHut * obj)
auto setRandomArtifact = [qap](CGSeerHut * obj)
{
ArtifactID artid = qap->drawRandomArtifact();
oi.destroyObject = [artid, qap]()
{
// Artifact can be used again
qap->addRandomArtifact(artid);
qap->removeQuestArtifact(artid);
};
obj->quest->mission.artifacts.push_back(artid);
qap->addQuestArtifact(artid);
};
auto destroyObject = [qap](CGObjectInstance * obj)
{
auto * seer = dynamic_cast<CGSeerHut *>(obj);
// Artifact can be used again
ArtifactID artid = seer->quest->mission.artifacts.front();
qap->addRandomArtifact(artid);
qap->removeQuestArtifact(artid);
};
for(int i = 0; i < static_cast<int>(creatures.size()); i++)
{
@ -502,6 +505,7 @@ void TreasurePlacer::addAllPossibleObjects()
return obj;
};
oi.destroyObject = destroyObject;
oi.probability = 3;
oi.setTemplates(Obj::SEER_HUT, randomAppearance, zone.getTerrainType());
oi.value = static_cast<ui32>(((2 * (creature->getAIValue()) * creaturesAmount * (1 + static_cast<float>(map.getZoneCount(creature->getFaction())) / map.getTotalZoneCount())) - 4000) / 3);
@ -546,6 +550,7 @@ void TreasurePlacer::addAllPossibleObjects()
return obj;
};
oi.destroyObject = destroyObject;
if(!oi.templates.empty())
possibleSeerHuts.push_back(oi);
@ -564,6 +569,7 @@ void TreasurePlacer::addAllPossibleObjects()
return obj;
};
oi.destroyObject = destroyObject;
if(!oi.templates.empty())
possibleSeerHuts.push_back(oi);
@ -666,11 +672,10 @@ rmg::Object TreasurePlacer::constructTreasurePile(const std::vector<ObjectInfo*>
}
auto * object = oi->generateObject();
if(oi->templates.empty())
{
logGlobal->warn("Deleting randomized object with no templates: %s", object->getObjectName());
oi->destroyObject();
oi->destroyObject(object);
delete object;
continue;
}
@ -695,6 +700,7 @@ rmg::Object TreasurePlacer::constructTreasurePile(const std::vector<ObjectInfo*>
}
auto & instance = rmgObject.addInstance(*object);
instance.onCleared = oi->destroyObject;
do
{
@ -831,7 +837,6 @@ void TreasurePlacer::createTreasures(ObjectManager& manager)
{
for (auto* oi : treasurePile)
{
oi->destroyObject();
oi->maxPerZone++;
}
};

View File

@ -30,7 +30,7 @@ struct ObjectInfo
ui32 maxPerZone = 1;
//ui32 maxPerMap; //unused
std::function<CGObjectInstance *()> generateObject;
std::function<void()> destroyObject;
std::function<void(CGObjectInstance *)> destroyObject;
void setTemplates(MapObjectID type, MapObjectSubID subtype, TerrainId terrain);
};