mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-25 22:42:04 +02:00
Try to simplify / cleanup code to localize crash
This commit is contained in:
@@ -21,17 +21,7 @@
|
|||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
AObjectTypeHandler::AObjectTypeHandler() = default;
|
AObjectTypeHandler::AObjectTypeHandler() = default;
|
||||||
|
AObjectTypeHandler::~AObjectTypeHandler() = default;
|
||||||
AObjectTypeHandler::~AObjectTypeHandler()
|
|
||||||
{
|
|
||||||
// FIXME: currently on Android there is a weird crash in destructor of 'base' member
|
|
||||||
// this code attempts to localize and fix this crash
|
|
||||||
if (base)
|
|
||||||
{
|
|
||||||
base->clear();
|
|
||||||
base.reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string AObjectTypeHandler::getJsonKey() const
|
std::string AObjectTypeHandler::getJsonKey() const
|
||||||
{
|
{
|
||||||
@@ -89,12 +79,12 @@ void AObjectTypeHandler::init(const JsonNode & input)
|
|||||||
if (base)
|
if (base)
|
||||||
JsonUtils::inherit(entry.second, *base);
|
JsonUtils::inherit(entry.second, *base);
|
||||||
|
|
||||||
auto * tmpl = new ObjectTemplate;
|
auto tmpl = std::make_shared<ObjectTemplate>();
|
||||||
tmpl->id = Obj(type);
|
tmpl->id = Obj(type);
|
||||||
tmpl->subid = subtype;
|
tmpl->subid = subtype;
|
||||||
tmpl->stringID = entry.first; // FIXME: create "fullID" - type.object.template?
|
tmpl->stringID = entry.first; // FIXME: create "fullID" - type.object.template?
|
||||||
tmpl->readJson(entry.second);
|
tmpl->readJson(entry.second);
|
||||||
templates.push_back(std::shared_ptr<const ObjectTemplate>(tmpl));
|
templates.push_back(tmpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const JsonNode & node : input["sounds"]["ambient"].Vector())
|
for(const JsonNode & node : input["sounds"]["ambient"].Vector())
|
||||||
@@ -188,12 +178,13 @@ void AObjectTypeHandler::addTemplate(JsonNode config)
|
|||||||
config.setType(JsonNode::JsonType::DATA_STRUCT); // ensure that input is not null
|
config.setType(JsonNode::JsonType::DATA_STRUCT); // ensure that input is not null
|
||||||
if (base)
|
if (base)
|
||||||
JsonUtils::inherit(config, *base);
|
JsonUtils::inherit(config, *base);
|
||||||
auto * tmpl = new ObjectTemplate;
|
|
||||||
|
auto tmpl = std::make_shared<ObjectTemplate>();
|
||||||
tmpl->id = Obj(type);
|
tmpl->id = Obj(type);
|
||||||
tmpl->subid = subtype;
|
tmpl->subid = subtype;
|
||||||
tmpl->stringID.clear(); // TODO?
|
tmpl->stringID.clear(); // TODO?
|
||||||
tmpl->readJson(config);
|
tmpl->readJson(config);
|
||||||
templates.emplace_back(tmpl);
|
templates.push_back(tmpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<const ObjectTemplate>> AObjectTypeHandler::getTemplates() const
|
std::vector<std::shared_ptr<const ObjectTemplate>> AObjectTypeHandler::getTemplates() const
|
||||||
|
|||||||
@@ -109,13 +109,13 @@ std::vector<JsonNode> CObjectClassesHandler::loadLegacyData()
|
|||||||
|
|
||||||
for (size_t i = 0; i < totalNumber; i++)
|
for (size_t i = 0; i < totalNumber; i++)
|
||||||
{
|
{
|
||||||
auto * tmpl = new ObjectTemplate;
|
auto tmpl = std::make_shared<ObjectTemplate>();
|
||||||
|
|
||||||
tmpl->readTxt(parser);
|
tmpl->readTxt(parser);
|
||||||
parser.endLine();
|
parser.endLine();
|
||||||
|
|
||||||
std::pair key(tmpl->id, tmpl->subid);
|
std::pair key(tmpl->id, tmpl->subid);
|
||||||
legacyTemplates.insert(std::make_pair(key, std::shared_ptr<const ObjectTemplate>(tmpl)));
|
legacyTemplates.insert(std::make_pair(key, tmpl));
|
||||||
}
|
}
|
||||||
|
|
||||||
objects.resize(256);
|
objects.resize(256);
|
||||||
|
|||||||
@@ -35,17 +35,17 @@ void DwellingInstanceConstructor::initTypeData(const JsonNode & input)
|
|||||||
const auto totalLevels = levels.size();
|
const auto totalLevels = levels.size();
|
||||||
|
|
||||||
availableCreatures.resize(totalLevels);
|
availableCreatures.resize(totalLevels);
|
||||||
for(auto currentLevel = 0; currentLevel < totalLevels; currentLevel++)
|
for(int currentLevel = 0; currentLevel < totalLevels; currentLevel++)
|
||||||
{
|
{
|
||||||
const JsonVector & creaturesOnLevel = levels[currentLevel].Vector();
|
const JsonVector & creaturesOnLevel = levels[currentLevel].Vector();
|
||||||
const auto creaturesNumber = creaturesOnLevel.size();
|
const auto creaturesNumber = creaturesOnLevel.size();
|
||||||
availableCreatures[currentLevel].resize(creaturesNumber);
|
availableCreatures[currentLevel].resize(creaturesNumber);
|
||||||
|
|
||||||
for(auto currentCreature = 0; currentCreature < creaturesNumber; currentCreature++)
|
for(int currentCreature = 0; currentCreature < creaturesNumber; currentCreature++)
|
||||||
{
|
{
|
||||||
VLC->identifiers()->requestIdentifier("creature", creaturesOnLevel[currentCreature], [=] (si32 index)
|
VLC->identifiers()->requestIdentifier("creature", creaturesOnLevel[currentCreature], [this, currentLevel, currentCreature] (si32 index)
|
||||||
{
|
{
|
||||||
availableCreatures[currentLevel][currentCreature] = VLC->creh->objects[index];
|
availableCreatures.at(currentLevel).at(currentCreature) = VLC->creh->objects[index];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
assert(!availableCreatures[currentLevel].empty());
|
assert(!availableCreatures[currentLevel].empty());
|
||||||
|
|||||||
@@ -1074,14 +1074,14 @@ void CMapLoaderJson::MapObjectLoader::construct()
|
|||||||
|
|
||||||
auto handler = VLC->objtypeh->getHandlerFor( ModScope::scopeMap(), typeName, subtypeName);
|
auto handler = VLC->objtypeh->getHandlerFor( ModScope::scopeMap(), typeName, subtypeName);
|
||||||
|
|
||||||
auto * appearance = new ObjectTemplate;
|
auto appearance = std::make_shared<ObjectTemplate>();
|
||||||
|
|
||||||
appearance->id = Obj(handler->getIndex());
|
appearance->id = Obj(handler->getIndex());
|
||||||
appearance->subid = handler->getSubIndex();
|
appearance->subid = handler->getSubIndex();
|
||||||
appearance->readJson(configuration["template"], false);
|
appearance->readJson(configuration["template"], false);
|
||||||
|
|
||||||
// Will be destroyed soon and replaced with shared template
|
// Will be destroyed soon and replaced with shared template
|
||||||
instance = handler->create(std::shared_ptr<const ObjectTemplate>(appearance));
|
instance = handler->create(appearance);
|
||||||
|
|
||||||
instance->id = ObjectInstanceID(static_cast<si32>(owner->map->objects.size()));
|
instance->id = ObjectInstanceID(static_cast<si32>(owner->map->objects.size()));
|
||||||
instance->instanceName = jsonKey;
|
instance->instanceName = jsonKey;
|
||||||
|
|||||||
Reference in New Issue
Block a user