diff options
author | Ira Rice <irarice@gmail.com> | 2008-09-25 00:15:44 +0000 |
---|---|---|
committer | Ira Rice <irarice@gmail.com> | 2008-09-25 00:15:44 +0000 |
commit | 489a429bea6739dfa25503b9329bd9e33bffb856 (patch) | |
tree | 8112f6fd988fdc0610329b6bc14ee3f9d5801092 /src/resources | |
parent | 2dc8eadff1e67bb70b1772ecc19c9e1e2e40a5b4 (diff) | |
download | Mana-489a429bea6739dfa25503b9329bd9e33bffb856.tar.gz Mana-489a429bea6739dfa25503b9329bd9e33bffb856.tar.bz2 Mana-489a429bea6739dfa25503b9329bd9e33bffb856.tar.xz Mana-489a429bea6739dfa25503b9329bd9e33bffb856.zip |
Merged the Tametomo branch into trunk.
Diffstat (limited to 'src/resources')
-rw-r--r-- | src/resources/action.cpp | 5 | ||||
-rw-r--r-- | src/resources/imageset.cpp | 7 | ||||
-rw-r--r-- | src/resources/imageset.h | 8 | ||||
-rw-r--r-- | src/resources/itemdb.cpp | 6 | ||||
-rw-r--r-- | src/resources/mapreader.cpp | 218 | ||||
-rw-r--r-- | src/resources/mapreader.h | 4 | ||||
-rw-r--r-- | src/resources/monsterdb.cpp | 5 | ||||
-rw-r--r-- | src/resources/monsterinfo.cpp | 5 | ||||
-rw-r--r-- | src/resources/spritedef.cpp | 100 | ||||
-rw-r--r-- | src/resources/spritedef.h | 8 |
10 files changed, 203 insertions, 163 deletions
diff --git a/src/resources/action.cpp b/src/resources/action.cpp index facd23fb..8ed099ea 100644 --- a/src/resources/action.cpp +++ b/src/resources/action.cpp @@ -23,8 +23,6 @@ #include "action.h" -#include <algorithm> - #include "animation.h" #include "../utils/dtor.h" @@ -36,8 +34,7 @@ Action::Action() Action::~Action() { - std::for_each(mAnimations.begin(), mAnimations.end(), - make_dtor(mAnimations)); + delete_all(mAnimations); } Animation* diff --git a/src/resources/imageset.cpp b/src/resources/imageset.cpp index 6228f4e4..b7263ec3 100644 --- a/src/resources/imageset.cpp +++ b/src/resources/imageset.cpp @@ -21,8 +21,6 @@ * $Id: imageset.cpp 4209 2008-04-29 12:58:21Z b_lindeijer $ */ -#include <algorithm> - #include "imageset.h" #include "../log.h" @@ -46,11 +44,10 @@ ImageSet::ImageSet(Image *img, int width, int height) ImageSet::~ImageSet() { - for_each(mImages.begin(), mImages.end(), make_dtor(mImages)); + delete_all(mImages); } -Image* -ImageSet::get(size_type i) +Image* ImageSet::get(size_type i) const { if (i >= mImages.size()) { diff --git a/src/resources/imageset.h b/src/resources/imageset.h index 719e9769..e276dd06 100644 --- a/src/resources/imageset.h +++ b/src/resources/imageset.h @@ -47,12 +47,18 @@ class ImageSet : public Resource */ ~ImageSet(); + /** + * Returns the width of the images in the image set. + */ int getWidth() { return mWidth; }; + /** + * Returns the height of the images in the image set. + */ int getHeight() { return mHeight; }; typedef std::vector<Image*>::size_type size_type; - Image* get(size_type i); + Image* get(size_type i) const; size_type size() { return mImages.size(); } diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 6ae7b499..8999f651 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -21,7 +21,6 @@ * $Id: itemdb.cpp 4347 2008-06-12 09:06:01Z b_lindeijer $ */ -#include <algorithm> #include <cassert> #include <libxml/tree.h> @@ -146,7 +145,7 @@ void ItemDB::unload() delete mUnknown; mUnknown = NULL; - for_each(mItemInfos.begin(), mItemInfos.end(), make_dtor(mItemInfos)); + delete_all(mItemInfos); mItemInfos.clear(); mLoaded = false; } @@ -177,8 +176,7 @@ void loadSpriteRef(ItemInfo *itemInfo, xmlNodePtr node) { itemInfo->setSprite(filename, 0); } - - if (gender == "female" || gender == "unisex") + else { itemInfo->setSprite(filename, 1); } diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index e2b47e66..ab3b0cae 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -145,8 +145,7 @@ inflateMemory(unsigned char *in, unsigned int inLength, return outLength; } -Map* -MapReader::readMap(const std::string &filename) +Map* MapReader::readMap(const std::string &filename) { // Load the file through resource manager ResourceManager *resman = ResourceManager::getInstance(); @@ -206,19 +205,13 @@ MapReader::readMap(const std::string &filename) Map* MapReader::readMap(xmlNodePtr node, const std::string &path) { - xmlChar *prop; - // Take the filename off the path - std::string pathDir = path.substr(0, path.rfind("/") + 1); - - prop = xmlGetProp(node, BAD_CAST "version"); - xmlFree(prop); + const std::string pathDir = path.substr(0, path.rfind("/") + 1); - int w = XML::getProperty(node, "width", 0); - int h = XML::getProperty(node, "height", 0); - int tilew = XML::getProperty(node, "tilewidth", DEFAULT_TILE_WIDTH); - int tileh = XML::getProperty(node, "tileheight", DEFAULT_TILE_HEIGHT); - int layerNr = 0; + const int w = XML::getProperty(node, "width", 0); + const int h = XML::getProperty(node, "height", 0); + const int tilew = XML::getProperty(node, "tilewidth", DEFAULT_TILE_WIDTH); + const int tileh = XML::getProperty(node, "tileheight", DEFAULT_TILE_HEIGHT); Map *map = new Map(w, h, tilew, tileh); for_each_xml_child_node(childNode, node) @@ -232,9 +225,7 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) } else if (xmlStrEqual(childNode->name, BAD_CAST "layer")) { - logger->log("- Loading layer %d", layerNr); - readLayer(childNode, map, layerNr); - layerNr++; + readLayer(childNode, map); } else if (xmlStrEqual(childNode->name, BAD_CAST "properties")) { @@ -246,15 +237,29 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) { if (xmlStrEqual(objectNode->name, BAD_CAST "object")) { - std::string objName = XML::getProperty(objectNode, "name", ""); - std::string objType = XML::getProperty(objectNode, "type", ""); - int objX = XML::getProperty(objectNode, "x", 0); - int objY = XML::getProperty(objectNode, "y", 0); + const std::string objType = XML::getProperty(objectNode, "type", ""); + + if (objType == "WARP" || objType == "NPC" || + objType == "SCRIPT" || objType == "SPAWN") + { + // Silently skip server-side objects. + continue; + } + + const std::string objName = XML::getProperty(objectNode, "name", ""); + const int objX = XML::getProperty(objectNode, "x", 0); + const int objY = XML::getProperty(objectNode, "y", 0); logger->log("- Loading object name: %s type: %s at %d:%d", objName.c_str(), objType.c_str(), objX, objY); + if (objType == "PARTICLE_EFFECT") { + if (objName.empty()) { + logger->log(" Warning: No particle file given"); + continue; + } + map->addParticleEffect(objName, objX, objY); } else @@ -271,8 +276,7 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) return map; } -void -MapReader::readProperties(xmlNodePtr node, Properties* props) +void MapReader::readProperties(xmlNodePtr node, Properties* props) { for_each_xml_child_node(childNode, node) { @@ -280,43 +284,65 @@ MapReader::readProperties(xmlNodePtr node, Properties* props) continue; // Example: <property name="name" value="value"/> - xmlChar *name = xmlGetProp(childNode, BAD_CAST "name"); - xmlChar *value = xmlGetProp(childNode, BAD_CAST "value"); + const std::string name = XML::getProperty(childNode, "name", ""); + const std::string value = XML::getProperty(childNode, "value", ""); - if (name && value) { - props->setProperty((const char*)name, (const char*)value); - } - - if (name) xmlFree(name); - if (value) xmlFree(value); + if (!name.empty() && !value.empty()) + props->setProperty(name, value); } } -void -MapReader::readLayer(xmlNodePtr node, Map *map, int layer) +static void setTile(Map *map, MapLayer *layer, int x, int y, int gid) +{ + const Tileset * const set = map->getTilesetWithGid(gid); + if (layer) { + // Set regular tile on a layer + Image * const img = set ? set->get(gid - set->getFirstGid()) : 0; + layer->setTile(x, y, img); + } else { + // Set collision tile + map->setWalk(x, y, (!set || (gid - set->getFirstGid() == 0))); + } +} + +void MapReader::readLayer(xmlNodePtr node, Map *map) { - int h = map->getHeight(); - int w = map->getWidth(); + // Layers are not necessarily the same size as the map + const int w = XML::getProperty(node, "width", map->getWidth()); + const int h = XML::getProperty(node, "height", map->getHeight()); + const int offsetX = XML::getProperty(node, "xoffset", 0); + const int offsetY = XML::getProperty(node, "yoffset", 0); + const std::string name = XML::getProperty(node, "name", ""); + + const bool isFringeLayer = (name.substr(0,6) == "Fringe"); + const bool isCollisionLayer = (name.substr(0,9) == "Collision"); + + MapLayer *layer = 0; + + if (!isCollisionLayer) { + layer = new MapLayer(offsetX, offsetY, w, h, isFringeLayer); + map->addLayer(layer); + } + + logger->log("- Loading layer \"%s\"", name.c_str()); int x = 0; int y = 0; - - // Load the tile data. Layers are assumed to be map size, with (0,0) as - // origin. + + // Load the tile data for_each_xml_child_node(childNode, node) { if (!xmlStrEqual(childNode->name, BAD_CAST "data")) - continue; - - xmlChar *encoding = xmlGetProp(childNode, BAD_CAST "encoding"); - xmlChar *compression = xmlGetProp(childNode, BAD_CAST "compression"); - - if (encoding && xmlStrEqual(encoding, BAD_CAST "base64")) + continue; + + const std::string encoding = + XML::getProperty(childNode, "encoding", ""); + const std::string compression = + XML::getProperty(childNode, "compression", ""); + + if (encoding == "base64") { - xmlFree(encoding); - - if (compression && !xmlStrEqual(compression, BAD_CAST "gzip")) { + if (!compression.empty() && compression != "gzip") { logger->log("Warning: only gzip layer compression supported!"); - xmlFree(compression); return; } @@ -324,15 +350,15 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) xmlNodePtr dataChild = childNode->xmlChildrenNode; if (!dataChild) continue; - + int len = strlen((const char*)dataChild->content) + 1; unsigned char *charData = new unsigned char[len + 1]; const char *charStart = (const char*)dataChild->content; unsigned char *charIndex = charData; - + while (*charStart) { if (*charStart != ' ' && *charStart != '\t' && - *charStart != '\n') + *charStart != '\n') { *charIndex = *charStart; charIndex++; @@ -348,40 +374,34 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) delete[] charData; if (binData) { - if (compression) { - if (xmlStrEqual(compression, BAD_CAST "gzip")) { - // Inflate the gzipped layer data - unsigned char *inflated; - unsigned int inflatedSize = - inflateMemory(binData, binLen, inflated); - - free(binData); - binData = inflated; - binLen = inflatedSize; - - if (inflated == NULL) - { - logger->log("Error: Could not decompress layer!"); - xmlFree(compression); - return; - } + if (compression == "gzip") { + // Inflate the gzipped layer data + unsigned char *inflated; + unsigned int inflatedSize = + inflateMemory(binData, binLen, inflated); + + free(binData); + binData = inflated; + binLen = inflatedSize; + + if (!inflated) { + logger->log("Error: Could not decompress layer!"); + return; } - xmlFree(compression); } for (int i = 0; i < binLen - 3; i += 4) { - int gid = binData[i] | + const int gid = binData[i] | binData[i + 1] << 8 | binData[i + 2] << 16 | binData[i + 3] << 24; - map->setTileWithGid(x, y, layer, gid); - + setTile(map, layer, x, y, gid); + x++; - if (x == w) { + if (x == w) + { x = 0; y++; - - // When we're done, don't crash on too much data if (y == h) break; } @@ -390,29 +410,29 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) } } else { - // Read plain XML map file - for_each_xml_child_node(childNode2, childNode) - { - if (!xmlStrEqual(childNode2->name, BAD_CAST "tile")) + // Read plain XML map file + for_each_xml_child_node(childNode2, childNode) + { + if (!xmlStrEqual(childNode2->name, BAD_CAST "tile")) continue; - - int gid = XML::getProperty(childNode2, "gid", -1); - map->setTileWithGid(x, y, layer, gid); - - x++; - if (x == w) { - x = 0; y++; - if (y >= h) - break; - } - } + + const int gid = XML::getProperty(childNode2, "gid", -1); + setTile(map, layer, x, y, gid); + + x++; + if (x == w) { + x = 0; y++; + if (y >= h) + break; + } + } } - + if (y < h) std::cerr << "TOO SMALL!\n"; if (x) std::cerr << "TOO SMALL!\n"; - + // There can be only one data element break; } @@ -429,20 +449,20 @@ MapReader::readTileset(xmlNodePtr node, return NULL; } - int firstGid = XML::getProperty(node, "firstgid", 0); - int tw = XML::getProperty(node, "tilewidth", map->getTileWidth()); - int th = XML::getProperty(node, "tileheight", map->getTileHeight()); + const int firstGid = XML::getProperty(node, "firstgid", 0); + const int tw = XML::getProperty(node, "tilewidth", map->getTileWidth()); + const int th = XML::getProperty(node, "tileheight", map->getTileHeight()); for_each_xml_child_node(childNode, node) { if (!xmlStrEqual(childNode->name, BAD_CAST "image")) continue; - xmlChar* source = xmlGetProp(childNode, BAD_CAST "source"); + const std::string source = XML::getProperty(childNode, "source", ""); - if (source) + if (!source.empty()) { - std::string sourceStr = std::string((const char*)source); + std::string sourceStr = source; sourceStr.erase(0, 3); // Remove "../" ResourceManager *resman = ResourceManager::getInstance(); @@ -452,14 +472,14 @@ MapReader::readTileset(xmlNodePtr node, { Tileset *set = new Tileset(tilebmp, tw, th, firstGid); tilebmp->decRef(); - xmlFree(source); return set; } else { - logger->log("Warning: Failed to load tileset (%s)", source); + logger->log("Warning: Failed to load tileset (%s)", source.c_str()); } } + // Only one image element expected break; } diff --git a/src/resources/mapreader.h b/src/resources/mapreader.h index 0d59fc9f..eb0d4873 100644 --- a/src/resources/mapreader.h +++ b/src/resources/mapreader.h @@ -63,10 +63,10 @@ class MapReader readProperties(xmlNodePtr node, Properties* props); /** - * Reads a map layer. + * Reads a map layer and adds it to the given map. */ static void - readLayer(xmlNodePtr node, Map *map, int layer); + readLayer(xmlNodePtr node, Map *map); /** * Reads a tile set. diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index 847b99fe..73e9d666 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -21,8 +21,6 @@ * $Id: monsterdb.cpp 4255 2008-05-21 21:44:27Z crush_tmw $ */ -#include <algorithm> - #include "monsterdb.h" #include "resourcemanager.h" @@ -143,8 +141,7 @@ MonsterDB::load() void MonsterDB::unload() { - for_each(mMonsterInfos.begin(), mMonsterInfos.end(), - make_dtor(mMonsterInfos)); + delete_all(mMonsterInfos); mMonsterInfos.clear(); mLoaded = false; diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp index e492ccd3..19f2990b 100644 --- a/src/resources/monsterinfo.cpp +++ b/src/resources/monsterinfo.cpp @@ -21,8 +21,6 @@ * $Id: monsterinfo.cpp 2650 2006-09-03 15:00:47Z b_lindeijer $ */ -#include <algorithm> - #include "monsterinfo.h" #include "../utils/dtor.h" @@ -35,8 +33,7 @@ MonsterInfo::MonsterInfo() MonsterInfo::~MonsterInfo() { // kill vectors in mSoundEffects - for_each (mSounds.begin(), mSounds.end(), - make_dtor(mSounds)); + delete_all(mSounds); mSounds.clear(); } diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index 550b2d1c..ebc60240 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: spritedef.cpp 4332 2008-06-05 07:33:12Z b_lindeijer $ + * $Id$ */ #include <set> @@ -70,33 +70,8 @@ SpriteDef *SpriteDef::load(std::string const &animationFile, int variant) } } - // Get the variant - int variant_num = XML::getProperty(rootNode, "variants", 0); - int variant_offset = 0; - - if (variant_num > 0 && variant < variant_num) - { - variant_offset = variant * XML::getProperty(rootNode, "variant_offset", 0); - } - SpriteDef *def = new SpriteDef; - - for_each_xml_child_node(node, rootNode) - { - if (xmlStrEqual(node->name, BAD_CAST "imageset")) - { - def->loadImageSet(node, palettes); - } - else if (xmlStrEqual(node->name, BAD_CAST "action")) - { - def->loadAction(node, variant_offset); - } - else if (xmlStrEqual(node->name, BAD_CAST "include")) - { - def->includeSprite(node); - } - } - + def->loadSprite(rootNode, variant, palettes); def->substituteActions(); return def; } @@ -119,11 +94,47 @@ void SpriteDef::substituteActions() substituteAction(ACTION_DEAD, ACTION_HURT); } +void SpriteDef::loadSprite(xmlNodePtr spriteNode, int variant, + const std::string &palettes) +{ + // Get the variant + const int variantCount = XML::getProperty(spriteNode, "variants", 0); + int variant_offset = 0; + + if (variantCount > 0 && variant < variantCount) + { + variant_offset = + variant * XML::getProperty(spriteNode, "variant_offset", 0); + } + + for_each_xml_child_node(node, spriteNode) + { + if (xmlStrEqual(node->name, BAD_CAST "imageset")) + { + loadImageSet(node, palettes); + } + else if (xmlStrEqual(node->name, BAD_CAST "action")) + { + loadAction(node, variant_offset); + } + else if (xmlStrEqual(node->name, BAD_CAST "include")) + { + includeSprite(node); + } + } +} + void SpriteDef::loadImageSet(xmlNodePtr node, std::string const &palettes) { - int width = XML::getProperty(node, "width", 0); - int height = XML::getProperty(node, "height", 0); - std::string name = XML::getProperty(node, "name", ""); + const std::string name = XML::getProperty(node, "name", ""); + + // We don't allow redefining image sets. This way, an included sprite + // definition will use the already loaded image set with the same name. + if (mImageSets.find(name) != mImageSets.end()) + return; + + const int width = XML::getProperty(node, "width", 0); + const int height = XML::getProperty(node, "height", 0); std::string imageSrc = XML::getProperty(node, "src", ""); Dye::instantiate(imageSrc, palettes); @@ -184,9 +195,9 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, Action *action, ImageSet *imageSet, int variant_offset) { - std::string directionName = + const std::string directionName = XML::getProperty(animationNode, "direction", ""); - SpriteDirection directionType = makeSpriteDirection(directionName); + const SpriteDirection directionType = makeSpriteDirection(directionName); if (directionType == DIRECTION_INVALID) { @@ -201,7 +212,7 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, // Get animation frames for_each_xml_child_node(frameNode, animationNode) { - int delay = XML::getProperty(frameNode, "delay", 0); + const int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); int offsetY = XML::getProperty(frameNode, "offsetY", 0); offsetY -= imageSet->getHeight() - 32; @@ -209,7 +220,7 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) { - int index = XML::getProperty(frameNode, "index", -1); + const int index = XML::getProperty(frameNode, "index", -1); if (index < 0) { @@ -230,7 +241,7 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { int start = XML::getProperty(frameNode, "start", -1); - int end = XML::getProperty(frameNode, "end", -1); + const int end = XML::getProperty(frameNode, "end", -1); if (start < 0 || end < 0) { @@ -263,12 +274,23 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, void SpriteDef::includeSprite(xmlNodePtr includeNode) { + // TODO: Perform circular dependency check, since it's easy to crash the + // client this way. const std::string filename = XML::getProperty(includeNode, "file", ""); - ResourceManager *resman = ResourceManager::getInstance(); - SpriteDef *sprite = resman->getSprite("graphics/sprites/" + filename); - // TODO: Somehow implement actually including it - sprite->decRef(); + if (filename.empty()) + return; + + XML::Document doc("graphics/sprites/" + filename); + xmlNodePtr rootNode = doc.rootNode(); + + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "sprite")) + { + logger->log("Error, no sprite root node in %s", filename.c_str()); + return; + } + + loadSprite(rootNode, 0); } void diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h index 2872af06..72c2566f 100644 --- a/src/resources/spritedef.h +++ b/src/resources/spritedef.h @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: spritedef.h 4255 2008-05-21 21:44:27Z crush_tmw $ + * $Id$ */ #ifndef _TMW_SPRITEDEF_H @@ -92,6 +92,12 @@ class SpriteDef : public Resource ~SpriteDef(); /** + * Loads a sprite element. + */ + void loadSprite(xmlNodePtr spriteNode, int variant, + const std::string &palettes = ""); + + /** * Loads an imageset element. */ void loadImageSet(xmlNodePtr node, std::string const &palettes); |