summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFedja Beader <fedja@protonmail.ch>2024-03-20 01:51:00 +0100
committerFedja Beader <fedja@protonmail.ch>2024-03-26 00:49:09 +0100
commita5e4d06d031eb3e477f59db6ee98ae8c3a09a9ae (patch)
tree239981b05623c3fcb7aa9b88065e4052f6ba1ee1
parent9d3fa3c50c0f0668b20ff0d5b7f760f46290e21c (diff)
downloadmanaplus-a5e4d06d031eb3e477f59db6ee98ae8c3a09a9ae.tar.gz
manaplus-a5e4d06d031eb3e477f59db6ee98ae8c3a09a9ae.tar.bz2
manaplus-a5e4d06d031eb3e477f59db6ee98ae8c3a09a9ae.tar.xz
manaplus-a5e4d06d031eb3e477f59db6ee98ae8c3a09a9ae.zip
Issue warning when variant given is exceeds declared variants. Load error sprite in that case.
-rw-r--r--src/resources/sprite/spritedef.cpp36
-rw-r--r--src/resources/sprite/spritedef.h2
2 files changed, 24 insertions, 14 deletions
diff --git a/src/resources/sprite/spritedef.cpp b/src/resources/sprite/spritedef.cpp
index d47ce7b23..97ca833aa 100644
--- a/src/resources/sprite/spritedef.cpp
+++ b/src/resources/sprite/spritedef.cpp
@@ -103,12 +103,18 @@ SpriteDef *SpriteDef::load(const std::string &animationFile,
return nullptr;
XmlNodePtrConst rootNode = doc->rootNode();
- if ((rootNode == nullptr) || !xmlNameEqual(rootNode, "sprite"))
+ SpriteDef *const def = new SpriteDef;
+ def->mSource = animationFile;
+ def->mProcessedFiles.insert(animationFile);
+
+ if ((rootNode == nullptr)
+ || !xmlNameEqual(rootNode, "sprite")
+ || !def->loadSprite(rootNode, variant, palettes) )
{
- reportAlways("Error, failed to parse sprite %s",
- animationFile.c_str())
+ reportAlways("Error, failed to load sprite %s", animationFile.c_str())
const std::string errorFile = pathJoin(paths.getStringValue("sprites"),
paths.getStringValue("spriteErrorFile"));
+ delete def;
BLOCK_END("SpriteDef::load")
doc->decRef();
if (animationFile != errorFile)
@@ -116,10 +122,6 @@ SpriteDef *SpriteDef::load(const std::string &animationFile,
return nullptr;
}
- SpriteDef *const def = new SpriteDef;
- def->mSource = animationFile;
- def->mProcessedFiles.insert(animationFile);
- def->loadSprite(rootNode, variant, palettes);
def->substituteActions();
if (settings.fixDeadAnimation)
def->fixDeadAction();
@@ -202,7 +204,7 @@ void SpriteDef::substituteActions()
substituteAction(SpriteAction::DEADRIDE, SpriteAction::DEAD);
}
-void SpriteDef::loadSprite(XmlNodeConstPtr spriteNode,
+bool SpriteDef::loadSprite(XmlNodeConstPtr spriteNode,
const int variant,
const std::string &palettes)
{
@@ -210,17 +212,24 @@ void SpriteDef::loadSprite(XmlNodeConstPtr spriteNode,
if (spriteNode == nullptr)
{
BLOCK_END("SpriteDef::loadSprite")
- return;
+ return false;
}
// Get the variant
const int variantCount = XML::getProperty(spriteNode, "variants", 0);
int variant_offset = 0;
- if (variantCount > 0 && variant < variantCount)
+ if (variantCount > 0)
{
- variant_offset = variant * XML::getProperty(spriteNode,
- "variant_offset",
- 0);
+ if (variant < variantCount)
+ variant_offset = variant
+ * XML::getProperty(spriteNode, "variant_offset",
+ 0);
+ else {
+ logger->assertLog("Error: variant %d >= %d (variants property)",
+ variant, variantCount);
+ BLOCK_END("SpriteDef::loadSprite")
+ return false;
+ }
}
for_each_xml_child_node(node, spriteNode)
@@ -233,6 +242,7 @@ void SpriteDef::loadSprite(XmlNodeConstPtr spriteNode,
includeSprite(node, variant);
}
BLOCK_END("SpriteDef::loadSprite")
+ return true;
}
void SpriteDef::loadImageSet(XmlNodeConstPtr node,
diff --git a/src/resources/sprite/spritedef.h b/src/resources/sprite/spritedef.h
index 6bfe93f6b..157c3d337 100644
--- a/src/resources/sprite/spritedef.h
+++ b/src/resources/sprite/spritedef.h
@@ -101,7 +101,7 @@ class SpriteDef final : public Resource
/**
* Loads a sprite element.
*/
- void loadSprite(XmlNodeConstPtr spriteNode,
+ bool loadSprite(XmlNodeConstPtr spriteNode,
const int variant,
const std::string &palettes);