summaryrefslogtreecommitdiff
path: root/src/resources
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2006-11-26 14:20:50 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2006-11-26 14:20:50 +0000
commit7f819e46b584145e2cf2ea742ced9fab0ffc233e (patch)
tree9aa8ee99a4b4dd653917155282e82e6b9a64f718 /src/resources
parentcc86266f4b59420a155df8c1aa01b9ce20b6585d (diff)
downloadmana-client-7f819e46b584145e2cf2ea742ced9fab0ffc233e.tar.gz
mana-client-7f819e46b584145e2cf2ea742ced9fab0ffc233e.tar.bz2
mana-client-7f819e46b584145e2cf2ea742ced9fab0ffc233e.tar.xz
mana-client-7f819e46b584145e2cf2ea742ced9fab0ffc233e.zip
Made Being::mDirection protected, forcing the use of setDirection. Defaulted
variant argument to 0 since this is the most common situation. Some SpriteDef refactoring, splitting up the loading into several methods, in preparation of adding support for including other sprites.
Diffstat (limited to 'src/resources')
-rw-r--r--src/resources/resourcemanager.h2
-rw-r--r--src/resources/spritedef.cpp282
-rw-r--r--src/resources/spritedef.h28
3 files changed, 196 insertions, 116 deletions
diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h
index 4367cd5e..d458f96e 100644
--- a/src/resources/resourcemanager.h
+++ b/src/resources/resourcemanager.h
@@ -146,7 +146,7 @@ class ResourceManager
* variant.
*/
SpriteDef*
- getSprite(const std::string &path, int variant);
+ getSprite(const std::string &path, int variant = 0);
/**
* Releases a resource, removing it from the set of loaded resources.
diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp
index 21eae6e0..bd273b3b 100644
--- a/src/resources/spritedef.cpp
+++ b/src/resources/spritedef.cpp
@@ -85,151 +85,202 @@ SpriteDef::load(const std::string &animationFile, int variant)
// Get the variant
int variant_num = XML::getProperty(node, "variants", 0);
- int variant_offset = XML::getProperty(node, "variant_offset", 0);
+ int variant_offset = 0;
- if (variant_num > 0 && variant < variant_num ) {
- variant_offset *= variant;
- } else {
- variant_offset = 0;
+ if (variant_num > 0 && variant < variant_num)
+ {
+ variant_offset = variant * XML::getProperty(node, "variant_offset", 0);
}
for (node = node->xmlChildrenNode; node != NULL; node = node->next)
{
if (xmlStrEqual(node->name, BAD_CAST "imageset"))
{
- int width = XML::getProperty(node, "width", 0);
- int height = XML::getProperty(node, "height", 0);
- std::string name = XML::getProperty(node, "name", "");
- std::string imageSrc = XML::getProperty(node, "src", "");
+ loadImageSet(node);
+ }
+ else if (xmlStrEqual(node->name, BAD_CAST "action"))
+ {
+ loadAction(node, variant_offset);
+ }
+ else if (xmlStrEqual(node->name, BAD_CAST "include"))
+ {
+ includeSprite(node);
+ }
+ }
- Spriteset *spriteset =
- resman->getSpriteset(imageSrc, width, height);
+ xmlFreeDoc(doc);
- if (!spriteset) {
- logger->error("Couldn't load spriteset!");
- }
+ // Complete missing actions
+ substituteAction(ACTION_STAND, ACTION_DEFAULT);
+ substituteAction(ACTION_WALK, ACTION_STAND);
+ substituteAction(ACTION_WALK, ACTION_RUN);
+ substituteAction(ACTION_ATTACK, ACTION_STAND);
+ substituteAction(ACTION_ATTACK_SWING, ACTION_ATTACK);
+ substituteAction(ACTION_ATTACK_STAB, ACTION_ATTACK_SWING);
+ substituteAction(ACTION_ATTACK_BOW, ACTION_ATTACK_STAB);
+ substituteAction(ACTION_ATTACK_THROW, ACTION_ATTACK_SWING);
+ substituteAction(ACTION_CAST_MAGIC, ACTION_ATTACK_SWING);
+ substituteAction(ACTION_USE_ITEM, ACTION_CAST_MAGIC);
+ substituteAction(ACTION_SIT, ACTION_STAND);
+ substituteAction(ACTION_SLEEP, ACTION_SIT);
+ substituteAction(ACTION_HURT, ACTION_STAND);
+ substituteAction(ACTION_DEAD, ACTION_HURT);
+}
- mSpritesets[name] = spriteset;
- }
- // get action
- else if (xmlStrEqual(node->name, BAD_CAST "action"))
+void
+SpriteDef::loadImageSet(xmlNodePtr node)
+{
+ int width = XML::getProperty(node, "width", 0);
+ int height = XML::getProperty(node, "height", 0);
+ std::string name = XML::getProperty(node, "name", "");
+ std::string imageSrc = XML::getProperty(node, "src", "");
+
+ ResourceManager *resman = ResourceManager::getInstance();
+ Spriteset *spriteset = resman->getSpriteset(imageSrc, width, height);
+
+ if (!spriteset)
+ {
+ logger->error("Couldn't load imageset!");
+ }
+
+ mSpritesets[name] = spriteset;
+}
+
+void
+SpriteDef::loadAction(xmlNodePtr node, int variant_offset)
+{
+ const std::string actionName = XML::getProperty(node, "name", "");
+ const std::string imagesetName = XML::getProperty(node, "imageset", "");
+
+ SpritesetIterator si = mSpritesets.find(imagesetName);
+ if (si == mSpritesets.end())
+ {
+ logger->log("Warning: imageset \"%s\" not defined in %s",
+ imagesetName.c_str(), getIdPath().c_str());
+ return;
+ }
+ Spriteset *imageset = si->second;
+
+ SpriteAction actionType = makeSpriteAction(actionName);
+ if (actionType == ACTION_INVALID)
+ {
+ logger->log("Warning: Unknown action \"%s\" defined in %s",
+ actionName.c_str(), getIdPath().c_str());
+ return;
+ }
+ Action *action = new Action();
+ mActions[actionType] = action;
+
+ // When first action set it as default direction
+ if (mActions.empty())
+ {
+ mActions[ACTION_DEFAULT] = action;
+ }
+
+ // Load animations
+ for (xmlNodePtr animationNode = node->xmlChildrenNode;
+ animationNode != NULL;
+ animationNode = animationNode->next)
+ {
+ if (xmlStrEqual(animationNode->name, BAD_CAST "animation"))
{
- std::string actionName = XML::getProperty(node, "name", "");
- std::string imagesetName = XML::getProperty(node, "imageset", "");
+ loadAnimation(animationNode, action, imageset, variant_offset);
+ }
+ }
+}
- SpritesetIterator si = mSpritesets.find(imagesetName);
- if (si == mSpritesets.end()) {
- logger->log("Warning: imageset \"%s\" not defined in %s",
- imagesetName.c_str(),
- animationFile.c_str());
+void
+SpriteDef::loadAnimation(xmlNodePtr animationNode,
+ Action *action, Spriteset *imageset,
+ int variant_offset)
+{
+ std::string directionName =
+ XML::getProperty(animationNode, "direction", "");
+ SpriteDirection directionType = makeSpriteDirection(directionName);
- // skip loading animations
- continue;
- }
- Spriteset *imageset = si->second;
+ if (directionType == DIRECTION_INVALID)
+ {
+ logger->log("Warning: Unknown direction \"%s\" used in %s",
+ directionName.c_str(), getIdPath().c_str());
+ return;
+ }
+
+ Animation *animation = new Animation();
+ action->setAnimation(directionType, animation);
+
+ // Get animation phases
+ for (xmlNodePtr phaseNode = animationNode->xmlChildrenNode;
+ phaseNode != NULL;
+ phaseNode = phaseNode->next)
+ {
+ int delay = XML::getProperty(phaseNode, "delay", 0);
+ int offsetX = XML::getProperty(phaseNode, "offsetX", 0);
+ int offsetY = XML::getProperty(phaseNode, "offsetY", 0);
+ offsetY -= imageset->getHeight() - 32;
+ offsetX -= imageset->getWidth() / 2 - 16;
- SpriteAction actionType = makeSpriteAction(actionName);
- if (actionType == ACTION_INVALID)
+ if (xmlStrEqual(phaseNode->name, BAD_CAST "frame"))
+ {
+ int index = XML::getProperty(phaseNode, "index", -1);
+
+ if (index < 0)
{
- logger->log("Warning: Unknown action \"%s\" defined in %s",
- actionName.c_str(),
- animationFile.c_str());
+ logger->log("No valid value for 'index'");
continue;
}
- Action *action = new Action();
- mActions[actionType] = action;
- // When first action set it as default direction
- if (mActions.empty())
+ Image *img = imageset->get(index + variant_offset);
+
+ if (!img)
{
- mActions[ACTION_DEFAULT] = action;
+ logger->log("No image at index " + (index + variant_offset));
+ continue;
}
+ animation->addPhase(img, delay, offsetX, offsetY);
+ }
+ else if (xmlStrEqual(phaseNode->name, BAD_CAST "sequence"))
+ {
+ int start = XML::getProperty(phaseNode, "start", -1);
+ int end = XML::getProperty(phaseNode, "end", -1);
- // get animations
- for (xmlNodePtr animationNode = node->xmlChildrenNode;
- animationNode != NULL;
- animationNode = animationNode->next)
+ if (start < 0 || end < 0)
{
- // We're only interested in animations
- if (!xmlStrEqual(animationNode->name, BAD_CAST "animation"))
- continue;
+ logger->log("No valid value for 'start' or 'end'");
+ continue;
+ }
- std::string directionName =
- XML::getProperty(animationNode, "direction", "");
- SpriteDirection directionType =
- makeSpriteDirection(directionName);
+ while (end >= start)
+ {
+ Image *img = imageset->get(start + variant_offset);
- if (directionType == DIRECTION_INVALID)
+ if (!img)
{
- logger->log("Warning: Unknown direction \"%s\" defined "
- "for action %s in %s",
- directionName.c_str(),
- actionName.c_str(),
- animationFile.c_str());
+ logger->log("No image at index " +
+ (start + variant_offset));
continue;
}
- Animation *animation = new Animation();
- action->setAnimation(directionType, animation);
-
- // Get animation phases
- for (xmlNodePtr phaseNode = animationNode->xmlChildrenNode;
- phaseNode != NULL;
- phaseNode = phaseNode->next)
- {
- int delay = XML::getProperty(phaseNode, "delay", 0);
-
- if (xmlStrEqual(phaseNode->name, BAD_CAST "frame"))
- {
- int index = XML::getProperty(phaseNode, "index", -1);
- int offsetX = XML::getProperty(phaseNode, "offsetX", 0);
- int offsetY = XML::getProperty(phaseNode, "offsetY", 0);
-
- offsetY -= imageset->getHeight() - 32;
- offsetX -= imageset->getWidth() / 2 - 16;
- Image *img = imageset->get(index + variant_offset);
- animation->addPhase(img, delay, offsetX, offsetY);
- }
- else if (xmlStrEqual(phaseNode->name, BAD_CAST "sequence"))
- {
- int start = XML::getProperty(phaseNode, "start", 0);
- int end = XML::getProperty(phaseNode, "end", 0);
- int offsetY = -imageset->getHeight() + 32;
- int offsetX = -imageset->getWidth() / 2 + 16;
- while (end >= start)
- {
- Image *img = imageset->get(start + variant_offset);
- animation->addPhase(img, delay, offsetX, offsetY);
- start++;
- }
- }
- else if (xmlStrEqual(phaseNode->name, BAD_CAST "end"))
- {
- animation->addTerminator();
- }
- } // for phaseNode
- } // for animationNode
- } // if "<imageset>" else if "<action>"
- } // for node
+ animation->addPhase(img, delay, offsetX, offsetY);
+ start++;
+ }
+ }
+ else if (xmlStrEqual(phaseNode->name, BAD_CAST "end"))
+ {
+ animation->addTerminator();
+ }
+ } // for phaseNode
+}
- // Complete missing actions
- substituteAction(ACTION_STAND, ACTION_DEFAULT);
- substituteAction(ACTION_WALK, ACTION_STAND);
- substituteAction(ACTION_WALK, ACTION_RUN);
- substituteAction(ACTION_ATTACK, ACTION_STAND);
- substituteAction(ACTION_ATTACK_SWING, ACTION_ATTACK);
- substituteAction(ACTION_ATTACK_STAB, ACTION_ATTACK_SWING);
- substituteAction(ACTION_ATTACK_BOW, ACTION_ATTACK_STAB);
- substituteAction(ACTION_ATTACK_THROW, ACTION_ATTACK_SWING);
- substituteAction(ACTION_CAST_MAGIC, ACTION_ATTACK_SWING);
- substituteAction(ACTION_USE_ITEM, ACTION_CAST_MAGIC);
- substituteAction(ACTION_SIT, ACTION_STAND);
- substituteAction(ACTION_SLEEP, ACTION_SIT);
- substituteAction(ACTION_HURT, ACTION_STAND);
- substituteAction(ACTION_DEAD, ACTION_HURT);
+void
+SpriteDef::includeSprite(xmlNodePtr includeNode)
+{
+ std::string filename = XML::getProperty(includeNode, "file", "");
+ ResourceManager *resman = ResourceManager::getInstance();
+ SpriteDef *sprite = resman->getSprite("graphics/sprites/" + filename);
- xmlFreeDoc(doc);
+ // TODO: Somehow implement actually including it
+ sprite->decRef();
}
void
@@ -246,7 +297,8 @@ SpriteDef::substituteAction(SpriteAction complete, SpriteAction with)
SpriteDef::~SpriteDef()
{
- for (SpritesetIterator i = mSpritesets.begin(); i != mSpritesets.end(); ++i)
+ for (SpritesetIterator i = mSpritesets.begin();
+ i != mSpritesets.end(); ++i)
{
i->second->decRef();
}
diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h
index 51c47a24..64414259 100644
--- a/src/resources/spritedef.h
+++ b/src/resources/spritedef.h
@@ -29,6 +29,8 @@
#include <map>
#include <string>
+#include <libxml/tree.h>
+
class Action;
class Graphics;
class Spriteset;
@@ -96,6 +98,32 @@ class SpriteDef : public Resource
load(const std::string &file, int variant);
/**
+ * Loads an imageset element.
+ */
+ void
+ loadImageSet(xmlNodePtr node);
+
+ /**
+ * Loads an action element.
+ */
+ void
+ loadAction(xmlNodePtr node, int variant_offset);
+
+ /**
+ * Loads an animation element.
+ */
+ void
+ loadAnimation(xmlNodePtr animationNode,
+ Action *action, Spriteset *imageset,
+ int variant_offset);
+
+ /**
+ * Include another sprite into this one.
+ */
+ void
+ includeSprite(xmlNodePtr includeNode);
+
+ /**
* When there are no animations defined for the action "complete", its
* animations become a copy of those of the action "with".
*/