1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

More cleanup:

- moved SoundBase.h to lib since it contains shared data
- added RMG info to object format. Note that data is not yet imported in
configs
- slightly updated API of object handlers
This commit is contained in:
Ivan Savenko 2014-06-05 23:51:24 +03:00
parent b2e8c92383
commit 44742814cd
21 changed files with 118 additions and 47 deletions

View File

@ -25,7 +25,7 @@
#include "CPreGame.h"
#include "../lib/VCMI_Lib.h"
#include "../lib/CSpellHandler.h"
#include "CSoundBase.h"
#include "../lib/CSoundBase.h"
#include "../lib/CGameState.h"
#include "CMusicHandler.h"
#include "gui/CGuiHandler.h"

View File

@ -48,8 +48,6 @@ set(client_SRCS
)
set(client_HEADERS
CSoundBase.h
gui/SDL_Pixels.h
)

View File

@ -1,7 +1,7 @@
#pragma once
#include "../lib/CConfigHandler.h"
#include "CSoundBase.h"
#include "../lib/CSoundBase.h"
#include "../lib/CCreatureHandler.h"
/*

View File

@ -14,7 +14,7 @@
#include "../lib/mapping/CMap.h"
#include "../lib/VCMIDirs.h"
#include "../lib/CSpellHandler.h"
#include "CSoundBase.h"
#include "../lib/CSoundBase.h"
#include "mapHandler.h"
#include "GUIClasses.h"
#include "../lib/CConfigHandler.h"

View File

@ -651,7 +651,7 @@ void CArtHandler::afterLoadFinalization()
for (CArtifact * art : artifacts)
{
VLC->objtypeh->createObject(art->Name(), JsonNode(), Obj::ARTIFACT, art->id.num);
VLC->objtypeh->loadSubObject(art->Name(), JsonNode(), Obj::ARTIFACT, art->id.num);
if (!art->advMapDef.empty())
{
@ -664,7 +664,7 @@ void CArtHandler::afterLoadFinalization()
}
// object does not have any templates - this is not usable object (e.g. pseudo-art like lock)
if (VLC->objtypeh->getHandlerFor(Obj::ARTIFACT, art->id)->getTemplates().empty())
VLC->objtypeh->eraseObject(Obj::ARTIFACT, art->id);
VLC->objtypeh->removeSubObject(Obj::ARTIFACT, art->id);
}
}

View File

@ -1118,7 +1118,7 @@ void CCreatureHandler::afterLoadFinalization()
{
for (CCreature * crea : creatures)
{
VLC->objtypeh->createObject(crea->nameSing, JsonNode(), Obj::MONSTER, crea->idNumber.num);
VLC->objtypeh->loadSubObject(crea->nameSing, JsonNode(), Obj::MONSTER, crea->idNumber.num);
if (!crea->advMapDef.empty())
{
JsonNode templ;
@ -1128,7 +1128,7 @@ void CCreatureHandler::afterLoadFinalization()
// object does not have any templates - this is not usable object (e.g. pseudo-creature like Arrow Tower)
if (VLC->objtypeh->getHandlerFor(Obj::MONSTER, crea->idNumber.num)->getTemplates().empty())
VLC->objtypeh->eraseObject(Obj::MONSTER, crea->idNumber.num);
VLC->objtypeh->removeSubObject(Obj::MONSTER, crea->idNumber.num);
}
}

View File

@ -235,7 +235,7 @@ void CHeroClassHandler::afterLoadFinalization()
for (CHeroClass * hc : heroClasses)
{
VLC->objtypeh->createObject(hc->identifier, JsonNode(), Obj::HERO, hc->id);
VLC->objtypeh->loadSubObject(hc->identifier, JsonNode(), Obj::HERO, hc->id);
if (!hc->imageMapMale.empty())
{
JsonNode templ;

View File

@ -104,6 +104,7 @@ set(lib_HEADERS
mapObjects/MapObjects.h
CSoundBase.h
AI_Base.h
CondSh.h
ConstTransitivePtr.h

View File

@ -763,7 +763,7 @@ void CTownHandler::afterLoadFinalization()
{
if (fact->town)
{
VLC->objtypeh->createObject(fact->identifier, JsonNode(), Obj::TOWN, fact->index);
VLC->objtypeh->loadSubObject(fact->identifier, JsonNode(), Obj::TOWN, fact->index);
if (!fact->town->clientInfo.advMapCastle.empty())
{
JsonNode templ;
@ -782,7 +782,7 @@ void CTownHandler::afterLoadFinalization()
JsonNode templ;
templ["animation"].String() = fact->town->dwellings[i];
VLC->objtypeh->createObject("", JsonNode(), Obj::CREATURE_GENERATOR1, 80 + cre);
VLC->objtypeh->loadSubObject("", JsonNode(), Obj::CREATURE_GENERATOR1, 80 + cre);
VLC->objtypeh->getHandlerFor(Obj::CREATURE_GENERATOR1, 80 + cre)->addTemplate(templ);
VLC->objh->cregens[80 + cre] = cre; //map of dwelling -> creature id
}

View File

@ -108,19 +108,14 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & meta;
// simple saving - save json in its string interpretation
if (h.saving)
{
std::ostringstream stream;
stream << *this;
std::string str = stream.str();
h & str;
}
else
{
std::string str;
h & str;
JsonNode(str.c_str(), str.size()).swap(*this);
h & type;
switch (type) {
break; case DATA_NULL:
break; case DATA_BOOL: h & data.Bool;
break; case DATA_FLOAT: h & data.Float;
break; case DATA_STRING: h & data.String;
break; case DATA_VECTOR: h & data.Vector;
break; case DATA_STRUCT: h & data.Struct;
}
}
};

View File

@ -13,7 +13,7 @@
#include "../NetPacks.h"
#include "../CGeneralTextHandler.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
using namespace boost::assign;

View File

@ -14,7 +14,7 @@
#include "../NetPacks.h"
#include "../CGeneralTextHandler.h"
#include "../CHeroHandler.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
#include "../CSpellHandler.h"
#include "CObjectClassesHandler.h"

View File

@ -12,7 +12,7 @@
#include "CGPandoraBox.h"
#include "../NetPacks.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
#include "../CSpellHandler.h"

View File

@ -185,7 +185,7 @@ void CObjectClassesHandler::loadObject(std::string scope, std::string name, cons
VLC->modh->identifiers.registerObject(scope, "object", name, object->id);
}
void CObjectClassesHandler::createObject(std::string name, JsonNode config, si32 ID, boost::optional<si32> subID)
void CObjectClassesHandler::loadSubObject(std::string name, JsonNode config, si32 ID, boost::optional<si32> subID)
{
config.setType(JsonNode::DATA_STRUCT); // ensure that input is not NULL
assert(objects.count(ID));
@ -201,7 +201,7 @@ void CObjectClassesHandler::createObject(std::string name, JsonNode config, si32
loadObjectEntry(config, objects[ID]);
}
void CObjectClassesHandler::eraseObject(si32 ID, si32 subID)
void CObjectClassesHandler::removeSubObject(si32 ID, si32 subID)
{
assert(objects.count(ID));
assert(objects.at(ID)->objects.count(subID));
@ -225,6 +225,28 @@ TObjectTypeHandler CObjectClassesHandler::getHandlerFor(si32 type, si32 subtype)
return nullptr;
}
std::set<si32> CObjectClassesHandler::knownObjects() const
{
std::set<si32> ret;
for (auto entry : objects)
ret.insert(entry.first);
return ret;
}
std::set<si32> CObjectClassesHandler::knownSubObjects(si32 primaryID) const
{
std::set<si32> ret;
if (objects.count(primaryID))
{
for (auto entry : objects.at(primaryID)->objects)
ret.insert(entry.first);
}
return ret;
}
void CObjectClassesHandler::beforeValidate(JsonNode & object)
{
for (auto & entry : object["types"].Struct())
@ -239,7 +261,6 @@ void CObjectClassesHandler::beforeValidate(JsonNode & object)
void CObjectClassesHandler::afterLoadFinalization()
{
legacyTemplates.clear(); // whatever left there is no longer needed
for (auto entry : objects)
{
for (auto obj : entry.second->objects)
@ -262,9 +283,26 @@ void AObjectTypeHandler::setType(si32 type, si32 subtype)
this->subtype = subtype;
}
static ui32 loadJsonOrMax(const JsonNode & input)
{
if (input.isNull())
return std::numeric_limits<ui32>::max();
else
return input.Float();
}
void AObjectTypeHandler::init(const JsonNode & input)
{
base = input["base"];
if (!input["rmg"].isNull())
{
rmgInfo.value = input["rmg"]["value"].Float();
rmgInfo.mapLimit = loadJsonOrMax(input["rmg"]["mapLimit"]);
rmgInfo.zoneLimit = loadJsonOrMax(input["rmg"]["zoneLimit"]);
rmgInfo.rarity = input["rmg"]["rarity"].Float();
} // else block is not needed - set in constructor
for (auto entry : input["templates"].Struct())
{
entry.second.setType(JsonNode::DATA_STRUCT);
@ -281,7 +319,7 @@ void AObjectTypeHandler::init(const JsonNode & input)
bool AObjectTypeHandler::objectFilter(const CGObjectInstance *, const ObjectTemplate &) const
{
return true; // by default - accept all.
return false; // by default there are no overrides
}
void AObjectTypeHandler::addTemplate(ObjectTemplate templ)
@ -331,3 +369,8 @@ boost::optional<ObjectTemplate> AObjectTypeHandler::getOverride(si32 terrainType
}
return boost::optional<ObjectTemplate>();
}
const RandomMapInfo & AObjectTypeHandler::getRMGInfo()
{
return rmgInfo;
}

View File

@ -19,6 +19,34 @@
class JsonNode;
class CRandomGenerator;
/// Structure that describes placement rules for this object in random map
struct RandomMapInfo
{
/// How valuable this object is, 1k = worthless, 10k = Utopia-level
ui32 value;
/// How many of such objects can be placed on map, 0 = object can not be placed by RMG
ui32 mapLimit;
/// How many of such objects can be placed in one zone, 0 = unplaceable
ui32 zoneLimit;
/// Rarity of object, 5 = extremely rare, 100 = common
ui32 rarity;
RandomMapInfo():
value(0),
mapLimit(0),
zoneLimit(0),
rarity(0)
{}
template <typename Handler> void serialize(Handler &h, const int version)
{
h & value & mapLimit & zoneLimit & rarity;
}
};
class IObjectInfo
{
public:
@ -42,6 +70,8 @@ class CGObjectInstance;
class AObjectTypeHandler
{
RandomMapInfo rmgInfo;
si32 type;
si32 subtype;
@ -56,22 +86,22 @@ public:
void setType(si32 type, si32 subtype);
/// loads templates from Json structure using fields "base" and "templates"
/// loads generic data from Json structure
virtual void init(const JsonNode & input);
void addTemplate(ObjectTemplate templ);
void addTemplate(JsonNode config);
/// returns all templates, without any filters
/// returns all templates matching parameters
std::vector<ObjectTemplate> getTemplates() const;
/// returns all templates that can be placed on specific terrain type
std::vector<ObjectTemplate> getTemplates(si32 terrainType) const;
/// returns preferred template for this object, if present (e.g. one of 3 possible templates for town - village, fort and castle)
/// note that appearance will not be changed - this must be done separately (either by assignment or via pack from server)
boost::optional<ObjectTemplate> getOverride(si32 terrainType, const CGObjectInstance * object) const;
const RandomMapInfo & getRMGInfo();
/// Creates object and set up core properties (like ID/subID). Object is NOT initialized
/// to allow creating objects before game start (e.g. map loading)
virtual CGObjectInstance * create(ObjectTemplate tmpl) const = 0;
@ -84,7 +114,7 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & type & subtype & templates;
h & type & subtype & templates & rmgInfo;
}
};
@ -129,7 +159,7 @@ class DLL_LINKAGE CObjectClassesHandler : public IHandlerBase
template <typename Handler> void serialize(Handler &h, const int version)
{
h & base & objects;
h & name & handlerName & base & objects;
}
};
@ -138,10 +168,10 @@ class DLL_LINKAGE CObjectClassesHandler : public IHandlerBase
/// list of object handlers, each of them handles only one type
std::map<si32, ObjectContainter * > objects;
/// map that is filled during contruction with all known handlers. Not serializeable
/// map that is filled during contruction with all known handlers. Not serializeable due to usage of std::function
std::map<std::string, std::function<TObjectTypeHandler()> > handlerConstructors;
/// container with H3 templates, used only during loading
/// container with H3 templates, used only during loading, no need to serialize it
TTemplatesContainer legacyTemplates;
void loadObjectEntry(const JsonNode & entry, ObjectContainter * obj);
@ -154,14 +184,18 @@ public:
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
void createObject(std::string name, JsonNode config, si32 ID, boost::optional<si32> subID = boost::optional<si32>());
void eraseObject(si32 ID, si32 subID);
void loadSubObject(std::string name, JsonNode config, si32 ID, boost::optional<si32> subID = boost::optional<si32>());
void removeSubObject(si32 ID, si32 subID);
void beforeValidate(JsonNode & object) override;
void afterLoadFinalization() override;
std::vector<bool> getDefaultAllowed() const override;
/// Queries to detect loaded objects
std::set<si32> knownObjects() const;
std::set<si32> knownSubObjects(si32 primaryID) const;
/// returns handler for specified object (ID-based). ObjectHandler keeps ownership
TObjectTypeHandler getHandlerFor(si32 type, si32 subtype) const;

View File

@ -14,7 +14,7 @@
#include "../NetPacks.h"
#include "../CGeneralTextHandler.h"
#include "../CHeroHandler.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
#include "CObjectClassesHandler.h"

View File

@ -13,7 +13,7 @@
#include "CQuest.h"
#include "../NetPacks.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
#include "../CGeneralTextHandler.h"
#include "../CHeroHandler.h"
#include "CObjectClassesHandler.h"

View File

@ -13,7 +13,7 @@
#include "CRewardableObject.h"
#include "../CHeroHandler.h"
#include "../CGeneralTextHandler.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
#include "../NetPacks.h"
#include "CObjectClassesHandler.h"

View File

@ -13,7 +13,7 @@
#include "../NetPacks.h"
#include "../CGeneralTextHandler.h"
#include "../client/CSoundBase.h"
#include "../CSoundBase.h"
#include "CObjectClassesHandler.h"
#include "../CSpellHandler.h"

View File

@ -21,7 +21,7 @@
#include "../lib/mapping/CMap.h"
#include "../lib/VCMIDirs.h"
#include "../lib/ScopeGuard.h"
#include "../client/CSoundBase.h"
#include "../lib/CSoundBase.h"
#include "CGameHandler.h"
#include "CVCMIServer.h"
#include "../lib/CCreatureSet.h"