mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-27 22:49:25 +02:00
Moved all once-per-hero visitable (sans Tree) to config
This commit is contained in:
@@ -70,6 +70,15 @@ void AIMemory::markObjectVisited(const CGObjectInstance * obj)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// TODO: maybe this logic belongs to CaptureObjects::shouldVisit
|
// TODO: maybe this logic belongs to CaptureObjects::shouldVisit
|
||||||
|
if(const auto * rewardable = dynamic_cast<const CRewardableObject *>(obj))
|
||||||
|
{
|
||||||
|
if (rewardable->getVisitMode() == CRewardableObject::VISIT_HERO) //we may want to visit it with another hero
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (rewardable->getVisitMode() == CRewardableObject::VISIT_BONUS) //or another time
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(dynamic_cast<const CGVisitableOPH *>(obj)) //we may want to visit it with another hero
|
if(dynamic_cast<const CGVisitableOPH *>(obj)) //we may want to visit it with another hero
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -1606,6 +1606,16 @@ void VCAI::markObjectVisited(const CGObjectInstance * obj)
|
|||||||
{
|
{
|
||||||
if(!obj)
|
if(!obj)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(const auto * rewardable = dynamic_cast<const CRewardableObject *>(obj)) //we may want to visit it with another hero
|
||||||
|
{
|
||||||
|
if (rewardable->getVisitMode() == CRewardableObject::VISIT_HERO) //we may want to visit it with another hero
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (rewardable->getVisitMode() == CRewardableObject::VISIT_BONUS) //or another time
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(dynamic_cast<const CGVisitableOPH *>(obj)) //we may want to visit it with another hero
|
if(dynamic_cast<const CGVisitableOPH *>(obj)) //we may want to visit it with another hero
|
||||||
return;
|
return;
|
||||||
if(dynamic_cast<const CGBonusingObject *>(obj)) //or another time
|
if(dynamic_cast<const CGBonusingObject *>(obj)) //or another time
|
||||||
|
|||||||
@@ -53,7 +53,8 @@
|
|||||||
"config/objects/dwellings.json",
|
"config/objects/dwellings.json",
|
||||||
"config/objects/rewardable.json",
|
"config/objects/rewardable.json",
|
||||||
"config/objects/rewardablePickable.json",
|
"config/objects/rewardablePickable.json",
|
||||||
"config/objects/rewardableOnceVisitable.json"
|
"config/objects/rewardableOnceVisitable.json",
|
||||||
|
"config/objects/rewardableOncePerHero.json"
|
||||||
],
|
],
|
||||||
|
|
||||||
"artifacts" :
|
"artifacts" :
|
||||||
|
|||||||
@@ -84,207 +84,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"arena" : {
|
|
||||||
"index" : 4,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPAREN"],
|
|
||||||
"visit" : ["NOMAD"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 3000,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 3000,
|
|
||||||
"rarity" : 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"marlettoTower" : {
|
|
||||||
"index" : 23,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPSWAR"],
|
|
||||||
"visit" : ["NOMAD"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1500,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1500,
|
|
||||||
"rarity" : 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gardenOfRevelation" : {
|
|
||||||
"index" : 32,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPGARD"],
|
|
||||||
"visit" : ["GETPROTECTION"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1500,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1500,
|
|
||||||
"rarity" : 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraryOfEnlightenment" : {
|
|
||||||
"index" : 41,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"visit" : ["GAZEBO"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 12000,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 12000,
|
|
||||||
"rarity" : 20
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mercenaryCamp" : {
|
|
||||||
"index" : 51,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPMERC"],
|
|
||||||
"visit" : ["NOMAD"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1500,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1500,
|
|
||||||
"rarity" : 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"starAxis" :{
|
|
||||||
"index" : 61,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPSTAR"],
|
|
||||||
"visit" : ["GAZEBO"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1500,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1500,
|
|
||||||
"rarity" : 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"treeOfKnowledge" : {
|
|
||||||
"index" : 102,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"visit" : ["GAZEBO"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 2500,
|
|
||||||
"rmg" : {
|
|
||||||
"mapLimit" : 100,
|
|
||||||
"value" : 2500,
|
|
||||||
"rarity" : 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"schoolOfMagic" : {
|
|
||||||
"index" : 47,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPMAGI"],
|
|
||||||
"visit" : ["FAERIE"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1000,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1000,
|
|
||||||
"rarity" : 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"schoolOfWar" : {
|
|
||||||
"index" : 107,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPSWAR"],
|
|
||||||
"visit" : ["MILITARY"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1000,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1000,
|
|
||||||
"rarity" : 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"learningStone" : {
|
|
||||||
"index" : 100,
|
|
||||||
"handler": "oncePerHero",
|
|
||||||
"base" : {
|
|
||||||
"sounds" : {
|
|
||||||
"ambient" : ["LOOPLEAR"],
|
|
||||||
"visit" : ["GAZEBO"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types" : {
|
|
||||||
"object" : {
|
|
||||||
"index" : 0,
|
|
||||||
"aiValue" : 1500,
|
|
||||||
"rmg" : {
|
|
||||||
"value" : 1500,
|
|
||||||
"rarity" : 200
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"objectWoG" : { "index" : 1 } // WoG object? Present on VCMI_Tests 2011
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"buoy" : {
|
"buoy" : {
|
||||||
"index" : 11,
|
"index" : 11,
|
||||||
"handler": "bonusingObject",
|
"handler": "bonusingObject",
|
||||||
|
|||||||
362
config/objects/rewardableOncePerHero.json
Normal file
362
config/objects/rewardableOncePerHero.json
Normal file
@@ -0,0 +1,362 @@
|
|||||||
|
{
|
||||||
|
/// These are objects that covered by concept of "configurable object" and have their entire configuration in this config
|
||||||
|
|
||||||
|
"arena" : {
|
||||||
|
"index" : 4,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPAREN"],
|
||||||
|
"visit" : ["NOMAD"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 3000,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 3000,
|
||||||
|
"rarity" : 50
|
||||||
|
},
|
||||||
|
|
||||||
|
"onSelectMessage" : 0,
|
||||||
|
"onVisitedMessage" : 1,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"primary" : { "attack" : 2 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primary" : { "defence" : 2 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"marlettoTower" : {
|
||||||
|
"index" : 23,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPSWAR"],
|
||||||
|
"visit" : ["NOMAD"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1500,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1500,
|
||||||
|
"rarity" : 100
|
||||||
|
},
|
||||||
|
|
||||||
|
"onVisitedMessage" : 40,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"message" : 39,
|
||||||
|
"primary" : { "defence" : 1 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gardenOfRevelation" : {
|
||||||
|
"index" : 32,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPGARD"],
|
||||||
|
"visit" : ["GETPROTECTION"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1500,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1500,
|
||||||
|
"rarity" : 100
|
||||||
|
},
|
||||||
|
|
||||||
|
"onVisitedMessage" : 60,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"message" : 59,
|
||||||
|
"primary" : { "knowledge" : 1 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraryOfEnlightenment" : {
|
||||||
|
"index" : 41,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"visit" : ["GAZEBO"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 12000,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 12000,
|
||||||
|
"rarity" : 20
|
||||||
|
},
|
||||||
|
|
||||||
|
"onVisitedMessage" : 67,
|
||||||
|
"onEmptyMessage" : 68,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectFirst",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"limiter" : {
|
||||||
|
"minLevel" : 10
|
||||||
|
},
|
||||||
|
"message" : 59,
|
||||||
|
"primary" : {
|
||||||
|
"attack" : 2,
|
||||||
|
"defence" : 2,
|
||||||
|
"spellpower" : 2,
|
||||||
|
"knowledge" : 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"limiter" : {
|
||||||
|
"minLevel" : 8,
|
||||||
|
"secondary" : { "diplomacy" : 1 }
|
||||||
|
},
|
||||||
|
"message" : 59,
|
||||||
|
"primary" : {
|
||||||
|
"attack" : 2,
|
||||||
|
"defence" : 2,
|
||||||
|
"spellpower" : 2,
|
||||||
|
"knowledge" : 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"limiter" : {
|
||||||
|
"minLevel" : 6,
|
||||||
|
"secondary" : { "diplomacy" : 2 }
|
||||||
|
},
|
||||||
|
"message" : 59,
|
||||||
|
"primary" : {
|
||||||
|
"attack" : 2,
|
||||||
|
"defence" : 2,
|
||||||
|
"spellpower" : 2,
|
||||||
|
"knowledge" : 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"limiter" : {
|
||||||
|
"minLevel" : 4,
|
||||||
|
"secondary" : { "diplomacy" : 3 }
|
||||||
|
},
|
||||||
|
"message" : 59,
|
||||||
|
"primary" : {
|
||||||
|
"attack" : 2,
|
||||||
|
"defence" : 2,
|
||||||
|
"spellpower" : 2,
|
||||||
|
"knowledge" : 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mercenaryCamp" : {
|
||||||
|
"index" : 51,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPMERC"],
|
||||||
|
"visit" : ["NOMAD"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1500,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1500,
|
||||||
|
"rarity" : 100
|
||||||
|
},
|
||||||
|
|
||||||
|
"onVisitedMessage" : 81,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"message" : 80,
|
||||||
|
"primary" : { "attack" : 1 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"starAxis" :{
|
||||||
|
"index" : 61,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPSTAR"],
|
||||||
|
"visit" : ["GAZEBO"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1500,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1500,
|
||||||
|
"rarity" : 100
|
||||||
|
},
|
||||||
|
|
||||||
|
"onVisitedMessage" : 101,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"message" : 100,
|
||||||
|
"primary" : { "spellpower" : 1 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treeOfKnowledge" : {
|
||||||
|
"index" : 102,
|
||||||
|
"handler": "oncePerHero", //TODO: configurable
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"visit" : ["GAZEBO"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 2500,
|
||||||
|
"rmg" : {
|
||||||
|
"mapLimit" : 100,
|
||||||
|
"value" : 2500,
|
||||||
|
"rarity" : 50
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"schoolOfMagic" : {
|
||||||
|
"index" : 47,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPMAGI"],
|
||||||
|
"visit" : ["FAERIE"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1000,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1000,
|
||||||
|
"rarity" : 50
|
||||||
|
},
|
||||||
|
|
||||||
|
"onSelectMessage" : 71,
|
||||||
|
"onVisitedMessage" : 72,
|
||||||
|
"onEmptyMessage" : 73,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"canRefuse" : true,
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"limiter" : { "resources" : { "gold" : 1000 } },
|
||||||
|
"resources" : { "gold" : -1000 },
|
||||||
|
"primary" : { "spellpower" : 2 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"limiter" : { "resources" : { "gold" : 1000 } },
|
||||||
|
"resources" : { "gold" : -1000 },
|
||||||
|
"primary" : { "knowledge" : 2 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"schoolOfWar" : {
|
||||||
|
"index" : 107,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPSWAR"],
|
||||||
|
"visit" : ["MILITARY"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1000,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1000,
|
||||||
|
"rarity" : 50
|
||||||
|
},
|
||||||
|
|
||||||
|
"onSelectMessage" : 158,
|
||||||
|
"onVisitedMessage" : 159,
|
||||||
|
"onEmptyMessage" : 160,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectPlayer",
|
||||||
|
"canRefuse" : true,
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"limiter" : { "resources" : { "gold" : 1000 } },
|
||||||
|
"resources" : { "gold" : -1000 },
|
||||||
|
"primary" : { "attack" : 1 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"limiter" : { "resources" : { "gold" : 1000 } },
|
||||||
|
"resources" : { "gold" : -1000 },
|
||||||
|
"primary" : { "defence" : 1 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"learningStone" : {
|
||||||
|
"index" : 100,
|
||||||
|
"handler": "configurable",
|
||||||
|
"base" : {
|
||||||
|
"sounds" : {
|
||||||
|
"ambient" : ["LOOPLEAR"],
|
||||||
|
"visit" : ["GAZEBO"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"object" : {
|
||||||
|
"index" : 0,
|
||||||
|
"aiValue" : 1500,
|
||||||
|
"rmg" : {
|
||||||
|
"value" : 1500,
|
||||||
|
"rarity" : 200
|
||||||
|
},
|
||||||
|
|
||||||
|
"onVisitedMessage" : 144,
|
||||||
|
"visitMode" : "hero",
|
||||||
|
"selectMode" : "selectFirst",
|
||||||
|
"rewards" : [
|
||||||
|
{
|
||||||
|
"message" : 143,
|
||||||
|
"gainedExp" : 1000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -69,7 +69,6 @@
|
|||||||
"artifacts" : [ { "class" : "MINOR" } ]
|
"artifacts" : [ { "class" : "MINOR" } ]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -359,6 +359,11 @@ bool CRewardableObject::wasVisited(const CGHeroInstance * h) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CRewardableObject::EVisitMode CRewardableObject::getVisitMode() const
|
||||||
|
{
|
||||||
|
return EVisitMode(visitMode);
|
||||||
|
}
|
||||||
|
|
||||||
void CRewardInfo::loadComponents(std::vector<Component> & comps,
|
void CRewardInfo::loadComponents(std::vector<Component> & comps,
|
||||||
const CGHeroInstance * h) const
|
const CGHeroInstance * h) const
|
||||||
{
|
{
|
||||||
@@ -663,44 +668,6 @@ void CGVisitableOPH::initObj(CRandomGenerator & rand)
|
|||||||
{
|
{
|
||||||
switch(ID)
|
switch(ID)
|
||||||
{
|
{
|
||||||
case Obj::ARENA:
|
|
||||||
info.resize(2);
|
|
||||||
info[0].reward.primary[PrimarySkill::ATTACK] = 2;
|
|
||||||
info[1].reward.primary[PrimarySkill::DEFENSE] = 2;
|
|
||||||
onSelect.addTxt(MetaString::ADVOB_TXT, 0);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 1);
|
|
||||||
canRefuse = true;
|
|
||||||
break;
|
|
||||||
case Obj::MERCENARY_CAMP:
|
|
||||||
info.resize(1);
|
|
||||||
info[0].reward.primary[PrimarySkill::ATTACK] = 1;
|
|
||||||
info[0].message.addTxt(MetaString::ADVOB_TXT, 80);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 81);
|
|
||||||
break;
|
|
||||||
case Obj::MARLETTO_TOWER:
|
|
||||||
info.resize(1);
|
|
||||||
info[0].reward.primary[PrimarySkill::DEFENSE] = 1;
|
|
||||||
info[0].message.addTxt(MetaString::ADVOB_TXT, 39);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 40);
|
|
||||||
break;
|
|
||||||
case Obj::STAR_AXIS:
|
|
||||||
info.resize(1);
|
|
||||||
info[0].reward.primary[PrimarySkill::SPELL_POWER] = 1;
|
|
||||||
info[0].message.addTxt(MetaString::ADVOB_TXT, 100);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 101);
|
|
||||||
break;
|
|
||||||
case Obj::GARDEN_OF_REVELATION:
|
|
||||||
info.resize(1);
|
|
||||||
info[0].reward.primary[PrimarySkill::KNOWLEDGE] = 1;
|
|
||||||
info[0].message.addTxt(MetaString::ADVOB_TXT, 59);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 60);
|
|
||||||
break;
|
|
||||||
case Obj::LEARNING_STONE:
|
|
||||||
info.resize(1);
|
|
||||||
info[0].reward.gainedExp = 1000;
|
|
||||||
info[0].message.addTxt(MetaString::ADVOB_TXT, 143);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 144);
|
|
||||||
break;
|
|
||||||
case Obj::TREE_OF_KNOWLEDGE:
|
case Obj::TREE_OF_KNOWLEDGE:
|
||||||
info.resize(1);
|
info.resize(1);
|
||||||
canRefuse = true;
|
canRefuse = true;
|
||||||
@@ -726,54 +693,6 @@ void CGVisitableOPH::initObj(CRandomGenerator & rand)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Obj::LIBRARY_OF_ENLIGHTENMENT:
|
|
||||||
{
|
|
||||||
selectMode = SELECT_FIRST;
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 67);
|
|
||||||
onEmpty.addTxt(MetaString::ADVOB_TXT, 68);
|
|
||||||
|
|
||||||
CVisitInfo visit;
|
|
||||||
visit.reward.primary[PrimarySkill::ATTACK] = 2;
|
|
||||||
visit.reward.primary[PrimarySkill::DEFENSE] = 2;
|
|
||||||
visit.reward.primary[PrimarySkill::KNOWLEDGE] = 2;
|
|
||||||
visit.reward.primary[PrimarySkill::SPELL_POWER] = 2;
|
|
||||||
visit.message.addTxt(MetaString::ADVOB_TXT, 66);
|
|
||||||
|
|
||||||
static_assert(SecSkillLevel::LEVELS_SIZE == 4, "Behavior of Library of Enlignment may not be correct");
|
|
||||||
for (int i=0; i<SecSkillLevel::LEVELS_SIZE; i++)
|
|
||||||
{
|
|
||||||
visit.limiter.minLevel = 10 - i * 2;
|
|
||||||
visit.limiter.secondary[SecondarySkill::DIPLOMACY] = i;
|
|
||||||
info.push_back(visit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case Obj::SCHOOL_OF_MAGIC:
|
|
||||||
info.resize(2);
|
|
||||||
info[0].reward.primary[PrimarySkill::SPELL_POWER] = 1;
|
|
||||||
info[1].reward.primary[PrimarySkill::KNOWLEDGE] = 1;
|
|
||||||
info[0].limiter.resources[Res::GOLD] = 1000;
|
|
||||||
info[0].reward.resources[Res::GOLD] = -1000;
|
|
||||||
info[1].limiter.resources[Res::GOLD] = 1000;
|
|
||||||
info[1].reward.resources[Res::GOLD] = -1000;
|
|
||||||
onSelect.addTxt(MetaString::ADVOB_TXT, 71);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 72);
|
|
||||||
onEmpty.addTxt(MetaString::ADVOB_TXT, 73);
|
|
||||||
canRefuse = true;
|
|
||||||
break;
|
|
||||||
case Obj::SCHOOL_OF_WAR:
|
|
||||||
info.resize(2);
|
|
||||||
info[0].reward.primary[PrimarySkill::ATTACK] = 1;
|
|
||||||
info[1].reward.primary[PrimarySkill::DEFENSE] = 1;
|
|
||||||
info[0].limiter.resources[Res::GOLD] = 1000;
|
|
||||||
info[0].reward.resources[Res::GOLD] = -1000;
|
|
||||||
info[1].limiter.resources[Res::GOLD] = 1000;
|
|
||||||
info[1].reward.resources[Res::GOLD] = -1000;
|
|
||||||
onSelect.addTxt(MetaString::ADVOB_TXT, 158);
|
|
||||||
onVisited.addTxt(MetaString::ADVOB_TXT, 159);
|
|
||||||
onEmpty.addTxt(MetaString::ADVOB_TXT, 160);
|
|
||||||
canRefuse = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -198,15 +198,7 @@ class DLL_LINKAGE CRewardableObject : public CArmedInstance
|
|||||||
/// grants reward to hero
|
/// grants reward to hero
|
||||||
void grantRewardBeforeLevelup(const CVisitInfo & reward, const CGHeroInstance * hero) const;
|
void grantRewardBeforeLevelup(const CVisitInfo & reward, const CGHeroInstance * hero) const;
|
||||||
|
|
||||||
protected:
|
public:
|
||||||
/// controls selection of reward granted to player
|
|
||||||
enum ESelectMode
|
|
||||||
{
|
|
||||||
SELECT_FIRST, // first reward that matches limiters
|
|
||||||
SELECT_PLAYER, // player can select from all allowed rewards
|
|
||||||
SELECT_RANDOM // reward will be selected from allowed randomly
|
|
||||||
};
|
|
||||||
|
|
||||||
enum EVisitMode
|
enum EVisitMode
|
||||||
{
|
{
|
||||||
VISIT_UNLIMITED, // any number of times. Side effect - object hover text won't contain visited/not visited text
|
VISIT_UNLIMITED, // any number of times. Side effect - object hover text won't contain visited/not visited text
|
||||||
@@ -216,6 +208,15 @@ protected:
|
|||||||
VISIT_PLAYER // every player can visit object once
|
VISIT_PLAYER // every player can visit object once
|
||||||
};
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// controls selection of reward granted to player
|
||||||
|
enum ESelectMode
|
||||||
|
{
|
||||||
|
SELECT_FIRST, // first reward that matches limiters
|
||||||
|
SELECT_PLAYER, // player can select from all allowed rewards
|
||||||
|
SELECT_RANDOM // reward will be selected from allowed randomly
|
||||||
|
};
|
||||||
|
|
||||||
/// filters list of visit info and returns rewards that can be granted to current hero
|
/// filters list of visit info and returns rewards that can be granted to current hero
|
||||||
virtual std::vector<ui32> getAvailableRewards(const CGHeroInstance * hero) const;
|
virtual std::vector<ui32> getAvailableRewards(const CGHeroInstance * hero) const;
|
||||||
|
|
||||||
@@ -247,6 +248,8 @@ protected:
|
|||||||
bool canRefuse;
|
bool canRefuse;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
EVisitMode getVisitMode() const;
|
||||||
|
|
||||||
void setPropertyDer(ui8 what, ui32 val) override;
|
void setPropertyDer(ui8 what, ui32 val) override;
|
||||||
std::string getHoverText(PlayerColor player) const override;
|
std::string getHoverText(PlayerColor player) const override;
|
||||||
std::string getHoverText(const CGHeroInstance * hero) const override;
|
std::string getHoverText(const CGHeroInstance * hero) const override;
|
||||||
|
|||||||
Reference in New Issue
Block a user