1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-29 21:56:54 +02:00

Moved CGOnceVisitable to config

This commit is contained in:
Ivan Savenko 2023-01-22 20:26:19 +02:00
parent 0e1b309edc
commit a6bda58276
9 changed files with 182 additions and 201 deletions

@ -52,7 +52,8 @@
"config/objects/creatureBanks.json",
"config/objects/dwellings.json",
"config/objects/rewardable.json",
"config/objects/rewardablePickable.json"
"config/objects/rewardablePickable.json",
"config/objects/rewardableOnceVisitable.json"
],
"artifacts" :

@ -84,83 +84,6 @@
}
}
},
"leanTo" :{
"index" : 39,
"handler": "onceVisitable",
"base" : {
"sounds" : {
"visit" : ["GENIE"]
}
},
"types" : {
"object" : {
"index" : 0,
"aiValue" : 500,
"rmg" : {
"value" : 500,
"rarity" : 100
}
}
}
},
"corpse" :{
"index" : 22,
"handler": "onceVisitable",
"base" : {
"sounds" : {
"visit" : ["MYSTERY"]
}
},
"types" : {
"object" : {
"index" : 0,
"aiValue" : 500,
"rmg" : {
"value" : 500,
"rarity" : 100
}
}
}
},
"wagon" :{
"index" : 105,
"handler": "onceVisitable",
"base" : {
"sounds" : {
"visit" : ["GENIE"]
}
},
"types" : {
"object" : {
"index" : 0,
"aiValue" : 500,
"rmg" : {
"value" : 500,
"rarity" : 50
}
}
}
},
"warriorTomb" : {
"index" : 108,
"handler": "onceVisitable",
"base" : {
"sounds" : {
"visit" : ["GRAVEYARD"]
}
},
"types" : {
"object" : {
"index" : 0,
"aiValue" : 6000,
"rmg" : {
"value" : 6000,
"rarity" : 20
}
}
}
},
"arena" : {
"index" : 4,
"handler": "oncePerHero",

@ -0,0 +1,172 @@
{
/// These are objects that covered by concept of "configurable object" and have their entire configuration in this config
"leanTo" :{
"index" : 39,
"handler": "configurable",
"base" : {
"sounds" : {
"visit" : ["GENIE"]
}
},
"types" : {
"leanTo" : {
"index" : 0,
"aiValue" : 500,
"rmg" : {
"value" : 500,
"rarity" : 100
},
"onEmptyMessage" : 65,
"visitMode" : "once",
"selectMode" : "selectFirst",
"rewards" : [
{
"message" : 64,
"resources" : [
{
"list" : [ "wood", "ore", "mercury", "gems", "sulfur", "crystal" ],
"min" : 1,
"max" : 5
}
]
}
]
}
}
},
"corpse" :{
"index" : 22,
"handler": "configurable",
"base" : {
"sounds" : {
"visit" : ["MYSTERY"]
}
},
"types" : {
"corpse" : {
"index" : 0,
"aiValue" : 500,
"rmg" : {
"value" : 500,
"rarity" : 100
},
"onEmptyMessage" : 38,
"blockedVisitable" : true,
"visitMode" : "once",
"selectMode" : "selectFirst",
"rewards" : [
{
"appearChance" : { "max" : 10 },
"message" : 37,
"artifacts" : [ { "class" : "TREASURE" } ]
},
{
"appearChance" : { "min" : 10, "max" : 20 },
"message" : 37,
"artifacts" : [ { "class" : "MINOR" } ]
}
]
}
}
},
"wagon" :{
"index" : 105,
"handler": "configurable",
"base" : {
"sounds" : {
"visit" : ["GENIE"]
}
},
"types" : {
"wagon" : {
"index" : 0,
"aiValue" : 500,
"rmg" : {
"value" : 500,
"rarity" : 50
},
"onEmptyMessage" : 156,
"visitMode" : "once",
"selectMode" : "selectFirst",
"rewards" : [
{
"appearChance" : { "max" : 20 },
"message" : 155,
"artifacts" : [ { "class" : "TREASURE" } ]
},
{
"appearChance" : { "min" : 20, "max" : 40 },
"message" : 155,
"artifacts" : [ { "class" : "MINOR" } ]
},
{
"message" : 154,
"appearChance" : { "min" : 40, "max" : 90 },
"resources" : [
{
"list" : [ "wood", "ore", "mercury", "gems", "sulfur", "crystal" ],
"min" : 2,
"max" : 5
},
]
}
]
}
}
},
"warriorTomb" : {
"index" : 108,
"handler": "configurable",
"base" : {
"sounds" : {
"visit" : ["GRAVEYARD"]
}
},
"types" : {
"warriorTomb" : {
"index" : 0,
"aiValue" : 6000,
"rmg" : {
"value" : 6000,
"rarity" : 20
},
"onSelectMessage" : 161,
"onEmptyMessage" : 163,
"visitMode" : "once",
"selectMode" : "selectFirst",
"rewards" : [
{
"appearChance" : { "max" : 30 },
"message" : 162,
"artifacts" : [ { "class" : "TREASURE" } ],
"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
},
{
"appearChance" : { "min" : 30, "max" : 80 },
"message" : 162,
"artifacts" : [ { "class" : "MINOR" } ],
"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
},
{
"appearChance" : { "min" : 80, "max" : 95 },
"message" : 162,
"artifacts" : [ { "class" : "MAJOR" } ],
"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
},
{
"appearChance" : { "min" : 95 },
"message" : 162,
"artifacts" : [ { "class" : "RELIC" } ],
"bonuses" : [ { "type" : "MORALE", "val" : -3, "duration" : "ONE_BATTLE" } ]
}
]
}
}
}
}

@ -37,7 +37,7 @@
"type" : "gold",
"min" : 400,
"max" : 600
},
}
]
}
]

@ -71,7 +71,6 @@ CObjectClassesHandler::CObjectClassesHandler()
SET_HANDLER("mine", CGMine);
SET_HANDLER("obelisk", CGObelisk);
SET_HANDLER("observatory", CGObservatory);
SET_HANDLER("onceVisitable", CGOnceVisitable);
SET_HANDLER("pandora", CGPandoraBox);
SET_HANDLER("prison", CGHeroInstance);
SET_HANDLER("questGuard", CGQuestGuard);

@ -101,6 +101,13 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
info.reward.removeObject = reward["removeObject"].Bool();
info.reward.bonuses = JsonRandom::loadBonuses(reward["bonuses"]);
for (auto & bonus : info.reward.bonuses)
{
bonus.source = Bonus::OBJECT;
bonus.sid = object->ID;
//TODO: bonus.description = object->getObjectName();
}
info.reward.primary = JsonRandom::loadPrimary(reward["primary"], rng);
info.reward.secondary = JsonRandom::loadSecondary(reward["secondary"], rng);

@ -471,32 +471,6 @@ CRewardableObject::CRewardableObject():
/// END OF CODE FOR CREWARDABLEOBJECT AND RELATED CLASSES ///
///////////////////////////////////////////////////////////////////////////////////////////////////
/// Helper, selects random art class based on weights
static int selectRandomArtClass(CRandomGenerator & rand, int treasure, int minor, int major, int relic)
{
int total = treasure + minor + major + relic;
assert(total != 0);
int hlp = rand.nextInt(total - 1);
if(hlp < treasure)
return CArtifact::ART_TREASURE;
if(hlp < treasure + minor)
return CArtifact::ART_MINOR;
if(hlp < treasure + minor + major)
return CArtifact::ART_MAJOR;
return CArtifact::ART_RELIC;
}
/// Helper, adds random artifact to reward selecting class based on weights
static void loadRandomArtifact(CRandomGenerator & rand, CVisitInfo & info, int treasure, int minor, int major, int relic)
{
int artClass = selectRandomArtClass(rand, treasure, minor, major, relic);
ArtifactID artID = VLC->arth->pickRandomArtifact(rand, artClass);
info.reward.artifacts.push_back(artID);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CGBonusingObject::CGBonusingObject()
{
visitMode = VISIT_BONUS;
@ -679,86 +653,6 @@ void CGBonusingObject::grantReward(ui32 rewardID, const CGHeroInstance * hero) c
///////////////////////////////////////////////////////////////////////////////////////////////////
CGOnceVisitable::CGOnceVisitable()
{
visitMode = VISIT_ONCE;
selectMode = SELECT_FIRST;
}
void CGOnceVisitable::initObj(CRandomGenerator & rand)
{
switch(ID)
{
case Obj::CORPSE:
{
onEmpty.addTxt(MetaString::ADVOB_TXT, 38);
blockVisit = true;
if(rand.nextInt(99) < 20)
{
info.resize(1);
loadRandomArtifact(rand, info[0], 10, 10, 10, 0);
info[0].message.addTxt(MetaString::ADVOB_TXT, 37);
info[0].limiter.numOfGrants = 1;
}
}
break;
case Obj::LEAN_TO:
{
onEmpty.addTxt(MetaString::ADVOB_TXT, 65);
info.resize(1);
int type = rand.nextInt(5); //any basic resource without gold
int value = rand.nextInt(1, 4);
info[0].reward.resources[type] = value;
info[0].message.addTxt(MetaString::ADVOB_TXT, 64);
info[0].limiter.numOfGrants = 1;
}
break;
case Obj::WARRIORS_TOMB:
{
onSelect.addTxt(MetaString::ADVOB_TXT, 161);
onVisited.addTxt(MetaString::ADVOB_TXT, 163);
info.resize(1);
loadRandomArtifact(rand, info[0], 30, 50, 25, 5);
Bonus bonus(Bonus::ONE_BATTLE, Bonus::MORALE, Bonus::OBJECT, -3, ID);
info[0].reward.bonuses.push_back(bonus);
info[0].limiter.numOfGrants = 1;
info[0].message.addTxt(MetaString::ADVOB_TXT, 162);
info[0].message.addReplacement(VLC->arth->objects[info[0].reward.artifacts.back()]->getNameTranslated());
}
break;
case Obj::WAGON:
{
onVisited.addTxt(MetaString::ADVOB_TXT, 156);
int hlp = rand.nextInt(99);
if(hlp < 40) //minor or treasure art
{
info.resize(1);
loadRandomArtifact(rand, info[0], 10, 10, 0, 0);
info[0].limiter.numOfGrants = 1;
info[0].message.addTxt(MetaString::ADVOB_TXT, 155);
info[0].message.addReplacement(VLC->arth->objects[info[0].reward.artifacts.back()]->getNameTranslated());
}
else if(hlp < 90) //2 - 5 of non-gold resource
{
info.resize(1);
int type = rand.nextInt(5);
int value = rand.nextInt(2, 5);
info[0].reward.resources[type] = value;
info[0].limiter.numOfGrants = 1;
info[0].message.addTxt(MetaString::ADVOB_TXT, 154);
}
// or nothing
}
break;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CGVisitableOPH::CGVisitableOPH()
{
visitMode = VISIT_HERO;

@ -314,19 +314,6 @@ public:
}
};
class DLL_LINKAGE CGOnceVisitable : public CRewardableObject // wagon, corpse, lean to, warriors tomb
{
public:
void initObj(CRandomGenerator & rand) override;
CGOnceVisitable();
template <typename Handler> void serialize(Handler &h, const int version)
{
h & static_cast<CRewardableObject&>(*this);
}
};
class DLL_LINKAGE CGVisitableOPH : public CRewardableObject //objects visitable only once per hero
{
public:

@ -119,7 +119,6 @@ void registerTypesMapObjectTypes(Serializer &s)
REGISTER_GENERIC_HANDLER(CGMine);
REGISTER_GENERIC_HANDLER(CGObelisk);
REGISTER_GENERIC_HANDLER(CGObservatory);
REGISTER_GENERIC_HANDLER(CGOnceVisitable);
REGISTER_GENERIC_HANDLER(CGPandoraBox);
REGISTER_GENERIC_HANDLER(CGQuestGuard);
REGISTER_GENERIC_HANDLER(CGResource);
@ -164,7 +163,6 @@ void registerTypesMapObjects2(Serializer &s)
s.template registerType<CRewardableObject, CGBonusingObject>();
s.template registerType<CRewardableObject, CGVisitableOPH>();
s.template registerType<CRewardableObject, CGVisitableOPW>();
s.template registerType<CRewardableObject, CGOnceVisitable>();
s.template registerType<CGVisitableOPW, CGMagicSpring>();
s.template registerType<CGObjectInstance, CTeamVisited>();