1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-10 22:31:40 +02:00

Added forceCombat field for ambush-like objects

This commit is contained in:
Ivan Savenko
2025-05-07 19:49:26 +03:00
parent 0e2ea99283
commit 434da3ffe1
5 changed files with 24 additions and 9 deletions

View File

@@ -52,7 +52,14 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *hero) const
cb->sendAndApply(cov);
}
if (isGuarded())
if (!isGuarded())
doHeroVisit(hero);
if (configuration.forceCombat)
{
doStartBattle(hero);
}
else
{
auto guardedIndexes = getAvailableRewards(hero, Rewardable::EEventType::EVENT_GUARDED);
auto guardedReward = configuration.info.at(guardedIndexes.at(0));
@@ -65,10 +72,6 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *hero) const
cb->showBlockingDialog(this, &bd);
}
else
{
doHeroVisit(hero);
}
}
void CRewardableObject::heroLevelUpDone(const CGHeroInstance *hero) const
@@ -92,15 +95,18 @@ void CRewardableObject::garrisonDialogClosed(const CGHeroInstance *hero) const
cb->eraseStack(StackLocation(id, stacks.begin()->first));
}
void CRewardableObject::doStartBattle(const CGHeroInstance * hero) const
{
auto layout = BattleLayout::createLayout(cb, configuration.guardsLayout, hero, this);
cb->startBattle(hero, this, visitablePos(), hero, nullptr, layout, nullptr);
}
void CRewardableObject::blockingDialogAnswered(const CGHeroInstance * hero, int32_t answer) const
{
if(isGuarded())
{
if (answer)
{
auto layout = BattleLayout::createLayout(cb, configuration.guardsLayout, hero, this);
cb->startBattle(hero, this, visitablePos(), hero, nullptr, layout, nullptr);
}
doStartBattle(hero);
}
else
{

View File

@@ -25,6 +25,8 @@ protected:
/// reward selected by player, no serialize
ui16 selectedReward = 0;
void doStartBattle(const CGHeroInstance * hero) const;
void grantReward(ui32 rewardID, const CGHeroInstance * hero) const override;
void markAsVisited(const CGHeroInstance * hero) const override;

View File

@@ -103,6 +103,7 @@ void Rewardable::Configuration::serializeJson(JsonSerializeFormat & handler)
handler.serializeStruct("resetParameters", resetParameters);
handler.serializeBool("canRefuse", canRefuse);
handler.serializeBool("showScoutedPreview", showScoutedPreview);
handler.serializeBool("forceCombat", forceCombat);
handler.serializeBool("coastVisitable", coastVisitable);
handler.serializeInt("infoWindowType", infoWindowType);
}

View File

@@ -169,6 +169,9 @@ struct DLL_LINKAGE Configuration
/// if true - player can refuse visiting an object (e.g. Tomb)
bool canRefuse = false;
/// if set to true and object is guarded, then hero visit will immediately start combat without confirmation
bool forceCombat = false;
/// if true - right-clicking object will show preview of object rewards
bool showScoutedPreview = false;
@@ -200,6 +203,8 @@ struct DLL_LINKAGE Configuration
h & variables;
h & visitLimiter;
h & canRefuse;
if (h.version >= Handler::Version::REWARDABLE_EXTENSIONS)
h & forceCombat;
h & showScoutedPreview;
h & infoWindowType;
h & coastVisitable;

View File

@@ -458,6 +458,7 @@ void Rewardable::Info::configureObject(Rewardable::Configuration & object, vstd:
object.canRefuse = parameters["canRefuse"].Bool();
object.showScoutedPreview = parameters["showScoutedPreview"].Bool();
object.forceCombat = parameters["forceCombat"].Bool();
object.guardsLayout = parameters["guardsLayout"].String();
object.coastVisitable = parameters["coastVisitable"].Bool();