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:
parent
0e1b309edc
commit
a6bda58276
@ -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",
|
||||
|
172
config/objects/rewardableOnceVisitable.json
Normal file
172
config/objects/rewardableOnceVisitable.json
Normal file
@ -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>();
|
||||
|
Loading…
x
Reference in New Issue
Block a user