This repository has been archived on 2019-12-07. You can view files and clone it, but cannot push or open issues or pull requests.
dungeon-gunner/source/util/Yaml.h

113 lines
2.2 KiB
C
Raw Normal View History

/*
* Yaml.h
*
* Created on: 06.10.2012
* Author: Felix
*/
#ifndef DG_YAML_H_
#define DG_YAML_H_
2012-12-22 14:10:26 +00:00
#include <string>
#include <fstream>
#include <yaml-cpp/yaml.h>
2012-12-22 14:10:26 +00:00
#include <SFML/System.hpp>
2013-03-30 12:38:25 +00:00
#include "Log.h"
/**
* Interface to a YAML file.
*/
class Yaml {
public:
explicit Yaml(const std::string& filename);
~Yaml();
2012-12-22 14:10:26 +00:00
std::string getFilename() const;
2012-12-22 14:10:26 +00:00
static void setFolder(const std::string& folder);
template <typename T>
2012-12-22 14:10:26 +00:00
T get(const std::string& key, const T& defaultValue) const;
private:
2012-12-22 14:10:26 +00:00
static std::string mFolder;
2012-12-22 14:10:26 +00:00
std::string mFilename;
std::ifstream mFile;
YAML::Node mNode;
};
/**
* Stream output operators to specialize Yaml::get for other types.
2013-03-30 12:38:25 +00:00
* Error handling is done in Yaml::get.
*/
namespace {
2012-12-22 14:10:26 +00:00
void operator>>(const YAML::Node& node, sf::Vector2i& vector) {
node[0] >> vector.x;
node[1] >> vector.y;
}
2012-12-22 14:10:26 +00:00
void operator>>(const YAML::Node& node, sf::Vector2f& vector) {
node[0] >> vector.x;
node[1] >> vector.y;
}
};
/**
2013-03-30 12:38:25 +00:00
* Gets a value of a specified type by key. Returns default value on error.
*
* @param key The string by which to select the return value.
* @tparam T The type of the return value.
* @return The value of the specified key.
*/
template <typename T>
2012-12-22 14:10:26 +00:00
T Yaml::get(const std::string& key, const T& defaultValue) const {
2013-03-30 12:38:25 +00:00
try {
if (const YAML::Node* node = mNode.FindValue(key)) {
T value;
*node >> value;
return value;
}
2013-04-04 21:13:08 +00:00
else
return defaultValue;
}
catch(YAML::Exception&) {
return defaultValue;
}
};
namespace YAML_KEY {
// Sprite
const std::string SIZE = "size";
const std::string RADIUS = "radius";
const std::string TEXTURE = "texture";
// Character
const std::string HEALTH = "health";
const std::string SPEED = "speed";
const std::string WEAPON = "weapon";
// Bullet
const std::string DAMAGE = "damage";
// Weapon
const std::string BULLET = "bullet";
const std::string INTERVAL = "interval";
const std::string AUTOMATIC = "automatic";
}
namespace YAML_DEFAULT {
const int HEALTH = 100;
const float SPEED = 100;
const std::string WEAPON = "weapon.yaml";
const int DAMAGE = 10;
const int INTERVAL = 250;
const std::string BULLET = "bullet.yaml";
const bool AUTOMATIC = false;
}
#endif /* DG_YAML_H_ */