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

All CGPickable objects are now fully configurable

This commit is contained in:
Ivan Savenko
2023-01-21 16:45:04 +02:00
parent a19c9eccc4
commit 83bb70cd8a
10 changed files with 161 additions and 176 deletions

View File

@@ -173,13 +173,34 @@
}
},
"types" : {
"object" : {
"campfire" : {
//EXPERNCE.WAV
"index" : 0,
"aiValue" : 2000,
"rmg" : {
"value" : 2000,
"rarity" : 500
}
},
"visitMode" : "unlimited",
"selectMode" : "player",
"rewards" : [
{
"message" : 23,
"removeObject" : true,
"resources" : [
{
"type" : [ "wood", "ore", "mercury", "gems", "sulfur", "crystal" ],
"min" : 4,
"max" : 6
},
{
"type" : "gold",
"min" : 400,
"max" : 600
},
]
}
]
}
}
},
@@ -193,13 +214,38 @@
}
},
"types" : {
"object" : {
"flotsam" : {
//GENIE.WAV
"index" : 0,
"aiValue" : 2000,
"rmg" : {
"value" : 2000,
"rarity" : 100
}
},
"visitMode" : "unlimited",
"selectMode" : "player",
"rewards" : [
{
"message" : 51,
"removeObject" : true,
},
{
"message" : 52,
"removeObject" : true,
"resources" : {
"wood" : 5,
"gold" : 200
}
},
{
"message" : 53,
"removeObject" : true,
"resources" : {
"wood" : 10,
"gold" : 500
}
}
]
}
}
},
@@ -213,13 +259,42 @@
}
},
"types" : {
"object" : {
"seaChest" : {
//CHEST.WAV
"index" : 0,
"aiValue" : 1500,
"rmg" : {
"value" : 1500,
"rarity" : 500
}
},
"visitMode" : "unlimited",
"selectMode" : "player",
"rewards" : [
{
"appearChance" : { "max" : 20 },
"message" : 116,
"removeObject" : true,
},
{
"appearChance" : { "min" : 20, "max" : 30 },
"message" : 117, //FIXME: this text contains placeholder for artifact name
"removeObject" : true,
"artifacts" : [
{ "class" : "TREASURE" }
],
"resources" : {
"gold" : 1000
}
},
{
"appearChance" : { "min" : 30 },
"message" : 118,
"removeObject" : true,
"resources" : {
"gold" : 1500
}
}
]
}
}
},
@@ -233,13 +308,42 @@
}
},
"types" : {
"object" : {
"shipwreckSurvivor" : {
//EXPERNCE.WAV
"index" : 0,
"aiValue" : 1500,
"rmg" : {
"value" : 1500,
"rarity" : 50
}
},
"visitMode" : "unlimited",
"selectMode" : "player",
"rewards" : [
{
"appearChance" : { "max" : 55 },
"message" : 125, //FIXME: this text contains placeholder for artifact name
"removeObject" : true,
"artifacts" : [ "TREASURE"]
},
{
"appearChance" : { "min" : 55, "max" : 75 },
"message" : 125, //FIXME: this text contains placeholder for artifact name
"removeObject" : true,
"artifacts" : [ "MINOR"]
},
{
"appearChance" : { "min" : 75, "max" : 95 },
"message" : 125, //FIXME: this text contains placeholder for artifact name
"removeObject" : true,
"artifacts" : [ "MAJOR"]
},
{
"appearChance" : { "min" : 95 },
"message" : 125, //FIXME: this text contains placeholder for artifact name
"removeObject" : true,
"artifacts" : [ "RELIC"]
}
]
}
}
},
@@ -253,13 +357,56 @@
}
},
"types" : {
"object" : {
"onSelect" : 146,
"treasureChest" : {
"index" : 0,
"aiValue" : 1500,
"aiValue" : 2000,
"rmg" : {
"value" : 1500,
"rarity" : 1000
}
},
//CHEST.WAV
"visitMode" : "unlimited",
"selectMode" : "player",
"rewards" : [
{
"appearChance" : { "max" : 33 },
"resources" : { "gold" : 2000 }
"removeObject" : true,
},
{
"appearChance" : { "max" : 33 },
"experience" : 1500
"removeObject" : true,
},
{
"appearChance" : { "min" : 33, "max" : 65 },
"resources" : { "gold" : 1500 }
"removeObject" : true,
},
{
"appearChance" : { "min" : 33, "max" : 65 },
"experience" : 1000
"removeObject" : true,
},
{
"appearChance" : { "min" : 65, "max" : 95 },
"resources" : { "gold" : 1000 }
"removeObject" : true,
},
{
"appearChance" : { "min" : 65, "max" : 95 },
"experience" : 500
"removeObject" : true,
},
{
//TREASURE.WAV
"appearChance" : { "min" : 95 },
"message" : 145, //FIXME: this text contains placeholder for artifact name
"removeObject" : true,
"artifacts" : [ "TREASURE"]
}
]
}
}
},

View File

@@ -142,9 +142,6 @@ void MetaString::getLocalString(const std::pair<ui8,ui32> &txt, std::string &dst
case GENERAL_TXT:
dst = VLC->generaltexth->translate("core.genrltxt", ser);
break;
case XTRAINFO_TXT:
dst = VLC->generaltexth->translate("core.xtrainfo", ser);
break;
case RES_NAMES:
dst = VLC->generaltexth->translate("core.restypes", ser);
break;

View File

@@ -419,7 +419,6 @@ CGeneralTextHandler::CGeneralTextHandler():
hcommands (*this, "core.hallinfo" ),
fcommands (*this, "core.castinfo" ),
advobtxt (*this, "core.advevent" ),
xtrainfo (*this, "core.xtrainfo" ),
restypes (*this, "core.restypes" ),
randsign (*this, "core.randsign" ),
overview (*this, "core.overview" ),
@@ -450,7 +449,6 @@ CGeneralTextHandler::CGeneralTextHandler():
readToVector("core.hallinfo", "DATA/HALLINFO.TXT" );
readToVector("core.castinfo", "DATA/CASTINFO.TXT" );
readToVector("core.advevent", "DATA/ADVEVENT.TXT" );
readToVector("core.xtrainfo", "DATA/XTRAINFO.TXT" );
readToVector("core.restypes", "DATA/RESTYPES.TXT" );
readToVector("core.randsign", "DATA/RANDSIGN.TXT" );
readToVector("core.crgen1", "DATA/CRGEN1.TXT" );

View File

@@ -205,7 +205,6 @@ public:
//objects
LegacyTextContainer advobtxt;
LegacyTextContainer xtrainfo;
LegacyTextContainer restypes; //names of resources
LegacyTextContainer randsign;
LegacyTextContainer seerEmpty;

View File

@@ -96,7 +96,7 @@ struct DLL_LINKAGE MetaString
private:
enum EMessage {TEXACT_STRING, TLOCAL_STRING, TNUMBER, TREPLACE_ESTRING, TREPLACE_LSTRING, TREPLACE_NUMBER, TREPLACE_PLUSNUMBER};
public:
enum {GENERAL_TXT=1, XTRAINFO_TXT, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES,
enum {GENERAL_TXT=1, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES,
MINE_EVNTS, ADVOB_TXT, ART_EVNTS, SPELL_NAME, SEC_SKILL_NAME, CRE_SING_NAMES, CREGENS4, COLOR, ART_DESCR, JK_TXT};
std::vector<ui8> message; //vector of EMessage

View File

@@ -73,7 +73,6 @@ CObjectClassesHandler::CObjectClassesHandler()
SET_HANDLER("observatory", CGObservatory);
SET_HANDLER("onceVisitable", CGOnceVisitable);
SET_HANDLER("pandora", CGPandoraBox);
SET_HANDLER("pickable", CGPickable);
SET_HANDLER("prison", CGHeroInstance);
SET_HANDLER("questGuard", CGQuestGuard);
SET_HANDLER("resource", CGResource);

View File

@@ -113,6 +113,8 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
info.reward.spells = JsonRandom::loadSpells(reward["spells"], rng, spells);
info.reward.creatures = JsonRandom::loadCreatures(reward["creatures"], rng);
info.reward.removeObject = reward["removeObject"].Bool();
info.message = loadMessage(reward["message"]);
info.selectChance = JsonRandom::loadValue(reward["selectChance"], rng);

View File

@@ -489,148 +489,6 @@ static void loadRandomArtifact(CRandomGenerator & rand, CVisitInfo & info, int t
info.reward.artifacts.push_back(artID);
}
CGPickable::CGPickable()
{
visitMode = VISIT_UNLIMITED;
selectMode = SELECT_PLAYER;
}
void CGPickable::initObj(CRandomGenerator & rand)
{
blockVisit = true;
switch(ID)
{
case Obj::CAMPFIRE:
{
int givenRes = rand.nextInt(5);
int givenAmm = rand.nextInt(4, 6);
info.resize(1);
info[0].reward.resources[givenRes] = givenAmm;
info[0].reward.resources[Res::GOLD]= givenAmm * 100;
info[0].message.addTxt(MetaString::ADVOB_TXT,23);
info[0].reward.removeObject = true;
break;
}
case Obj::FLOTSAM:
{
int type = rand.nextInt(3);
switch(type)
{
case 0:
info.resize(1);
info[0].message.addTxt(MetaString::ADVOB_TXT, 51);
info[0].reward.removeObject = true;
break;
case 1:
{
info.resize(1);
info[0].reward.resources[Res::WOOD] = 5;
info[0].message.addTxt(MetaString::ADVOB_TXT, 52);
info[0].reward.removeObject = true;
break;
}
case 2:
{
info.resize(1);
info[0].reward.resources[Res::WOOD] = 5;
info[0].reward.resources[Res::GOLD] = 200;
info[0].message.addTxt(MetaString::ADVOB_TXT, 53);
info[0].reward.removeObject = true;
break;
}
case 3:
{
info.resize(1);
info[0].reward.resources[Res::WOOD] = 10;
info[0].reward.resources[Res::GOLD] = 500;
info[0].message.addTxt(MetaString::ADVOB_TXT, 54);
info[0].reward.removeObject = true;
break;
}
}
break;
}
case Obj::SEA_CHEST:
{
int hlp = rand.nextInt(99);
if(hlp < 20)
{
info.resize(1);
info[0].message.addTxt(MetaString::ADVOB_TXT, 116);
info[0].reward.removeObject = true;
}
else if(hlp < 90)
{
info.resize(1);
info[0].reward.resources[Res::GOLD] = 1500;
info[0].message.addTxt(MetaString::ADVOB_TXT, 118);
info[0].reward.removeObject = true;
}
else
{
info.resize(1);
loadRandomArtifact(rand, info[0], 100, 0, 0, 0);
info[0].reward.resources[Res::GOLD] = 1000;
info[0].message.addTxt(MetaString::ADVOB_TXT, 117);
info[0].message.addReplacement(MetaString::ART_NAMES, info[0].reward.artifacts.back());
info[0].reward.removeObject = true;
}
}
break;
case Obj::SHIPWRECK_SURVIVOR:
{
info.resize(1);
loadRandomArtifact(rand, info[0], 55, 20, 20, 5);
info[0].message.addTxt(MetaString::ADVOB_TXT, 125);
info[0].message.addReplacement(MetaString::ART_NAMES, info[0].reward.artifacts.back());
info[0].reward.removeObject = true;
}
break;
case Obj::TREASURE_CHEST:
{
int hlp = rand.nextInt(99);
if(hlp >= 95)
{
info.resize(1);
loadRandomArtifact(rand, info[0], 100, 0, 0, 0);
info[0].message.addTxt(MetaString::ADVOB_TXT,145);
info[0].message.addReplacement(MetaString::ART_NAMES, info[0].reward.artifacts.back());
info[0].reward.removeObject = true;
return;
}
else if (hlp >= 65)
{
onSelect.addTxt(MetaString::ADVOB_TXT,146);
info.resize(2);
info[0].reward.resources[Res::GOLD] = 2000;
info[1].reward.gainedExp = 1500;
info[0].reward.removeObject = true;
info[1].reward.removeObject = true;
}
else if(hlp >= 33)
{
onSelect.addTxt(MetaString::ADVOB_TXT,146);
info.resize(2);
info[0].reward.resources[Res::GOLD] = 1500;
info[1].reward.gainedExp = 1000;
info[0].reward.removeObject = true;
info[1].reward.removeObject = true;
}
else
{
onSelect.addTxt(MetaString::ADVOB_TXT,146);
info.resize(2);
info[0].reward.resources[Res::GOLD] = 1000;
info[1].reward.gainedExp = 500;
info[0].reward.removeObject = true;
info[1].reward.removeObject = true;
}
}
break;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CGBonusingObject::CGBonusingObject()

View File

@@ -287,19 +287,6 @@ public:
friend class CRandomRewardObjectInfo;
};
class DLL_LINKAGE CGPickable : public CRewardableObject //campfire, treasure chest, Flotsam, Shipwreck Survivor, Sea Chest
{
public:
void initObj(CRandomGenerator & rand) override;
CGPickable();
template <typename Handler> void serialize(Handler &h, const int version)
{
h & static_cast<CRewardableObject&>(*this);
}
};
class DLL_LINKAGE CGBonusingObject : public CRewardableObject //objects giving bonuses to luck/morale/movement
{
protected:

View File

@@ -121,7 +121,6 @@ void registerTypesMapObjectTypes(Serializer &s)
REGISTER_GENERIC_HANDLER(CGObservatory);
REGISTER_GENERIC_HANDLER(CGOnceVisitable);
REGISTER_GENERIC_HANDLER(CGPandoraBox);
REGISTER_GENERIC_HANDLER(CGPickable);
REGISTER_GENERIC_HANDLER(CGQuestGuard);
REGISTER_GENERIC_HANDLER(CGResource);
REGISTER_GENERIC_HANDLER(CGScholar);
@@ -162,7 +161,6 @@ void registerTypesMapObjects2(Serializer &s)
s.template registerType<CGTownBuilding, COPWBonus>();
s.template registerType<CGObjectInstance, CRewardableObject>();
s.template registerType<CRewardableObject, CGPickable>();
s.template registerType<CRewardableObject, CGBonusingObject>();
s.template registerType<CRewardableObject, CGVisitableOPH>();
s.template registerType<CRewardableObject, CGVisitableOPW>();