From a6bda58276e1571f93006f02ecac702429458277 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Sun, 22 Jan 2023 20:26:19 +0200 Subject: [PATCH] Moved CGOnceVisitable to config --- config/gameConfig.json | 3 +- config/objects/rewardable.json | 77 --------- config/objects/rewardableOnceVisitable.json | 172 ++++++++++++++++++++ config/objects/rewardablePickable.json | 2 +- lib/mapObjects/CObjectClassesHandler.cpp | 1 - lib/mapObjects/CRewardableConstructor.cpp | 7 + lib/mapObjects/CRewardableObject.cpp | 106 ------------ lib/mapObjects/CRewardableObject.h | 13 -- lib/registerTypes/RegisterTypes.h | 2 - 9 files changed, 182 insertions(+), 201 deletions(-) create mode 100644 config/objects/rewardableOnceVisitable.json diff --git a/config/gameConfig.json b/config/gameConfig.json index 19f90785b..a332ee766 100644 --- a/config/gameConfig.json +++ b/config/gameConfig.json @@ -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" : diff --git a/config/objects/rewardable.json b/config/objects/rewardable.json index c0f9127af..af34b37d8 100644 --- a/config/objects/rewardable.json +++ b/config/objects/rewardable.json @@ -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", diff --git a/config/objects/rewardableOnceVisitable.json b/config/objects/rewardableOnceVisitable.json new file mode 100644 index 000000000..1cc24e7af --- /dev/null +++ b/config/objects/rewardableOnceVisitable.json @@ -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" } ] + } + ] + } + } + } +} diff --git a/config/objects/rewardablePickable.json b/config/objects/rewardablePickable.json index c3a98cfc3..bdda59802 100644 --- a/config/objects/rewardablePickable.json +++ b/config/objects/rewardablePickable.json @@ -37,7 +37,7 @@ "type" : "gold", "min" : 400, "max" : 600 - }, + } ] } ] diff --git a/lib/mapObjects/CObjectClassesHandler.cpp b/lib/mapObjects/CObjectClassesHandler.cpp index 7c428b54a..8606f95ae 100644 --- a/lib/mapObjects/CObjectClassesHandler.cpp +++ b/lib/mapObjects/CObjectClassesHandler.cpp @@ -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); diff --git a/lib/mapObjects/CRewardableConstructor.cpp b/lib/mapObjects/CRewardableConstructor.cpp index 783f7f784..0b62a33d9 100644 --- a/lib/mapObjects/CRewardableConstructor.cpp +++ b/lib/mapObjects/CRewardableConstructor.cpp @@ -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); diff --git a/lib/mapObjects/CRewardableObject.cpp b/lib/mapObjects/CRewardableObject.cpp index d7ffad479..c5820a5a0 100644 --- a/lib/mapObjects/CRewardableObject.cpp +++ b/lib/mapObjects/CRewardableObject.cpp @@ -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; diff --git a/lib/mapObjects/CRewardableObject.h b/lib/mapObjects/CRewardableObject.h index a1fe0838f..0b3b3e1bb 100644 --- a/lib/mapObjects/CRewardableObject.h +++ b/lib/mapObjects/CRewardableObject.h @@ -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 void serialize(Handler &h, const int version) - { - h & static_cast(*this); - } -}; - class DLL_LINKAGE CGVisitableOPH : public CRewardableObject //objects visitable only once per hero { public: diff --git a/lib/registerTypes/RegisterTypes.h b/lib/registerTypes/RegisterTypes.h index 194132f39..f8137344e 100644 --- a/lib/registerTypes/RegisterTypes.h +++ b/lib/registerTypes/RegisterTypes.h @@ -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(); s.template registerType(); s.template registerType(); - s.template registerType(); s.template registerType(); s.template registerType();