namespace loader {
Interpreter::~Interpreter() {
- for (vector<Animation *>::const_iterator i(animations.begin()), end(animations.end()); i != end; ++i) {
+ for (vector<ComplexAnimation *>::const_iterator i(complexAnimations.begin()), end(complexAnimations.end()); i != end; ++i) {
delete *i;
}
for (vector<Hero *>::const_iterator i(heroes.begin()), end(heroes.end()); i != end; ++i) {
for (vector<Monster *>::const_iterator i(monsters.begin()), end(monsters.end()); i != end; ++i) {
delete *i;
}
+ for (vector<SimpleAnimation *>::const_iterator i(simpleAnimations.begin()), end(simpleAnimations.end()); i != end; ++i) {
+ delete *i;
+ }
for (vector<Sprite *>::const_iterator i(sprites.begin()), end(sprites.end()); i != end; ++i) {
delete *i;
}
}
-bool Interpreter::ParsedDefinition::IsCompatible(DynamicType with) const {
- return type == with
- || (with == ANIMATION
- && (type == COMPLEX_ANIMATION || type == SIMPLE_ANIMATION));
-}
-
-
Animation *Interpreter::GetAnimation(const std::string &name) {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
- if (i->second.IsCompatible(ANIMATION)) {
- return animations[i->second.index];
+ if (i->second.type == COMPLEX_ANIMATION) {
+ return complexAnimations[i->second.index];
+ } else if (i->second.type == SIMPLE_ANIMATION) {
+ return simpleAnimations[i->second.index];
} else {
throw Error("cannot cast " + i->second.dfn->TypeName() + " to Animation");
}
Hero *Interpreter::GetHero(const std::string &name) {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
- if (i->second.IsCompatible(HERO)) {
+ if (i->second.type == HERO) {
return heroes[i->second.index];
} else {
throw Error("cannot cast " + i->second.dfn->TypeName() + " to Hero");
Monster *Interpreter::GetMonster(const std::string &name) {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
- if (i->second.IsCompatible(MONSTER)) {
+ if (i->second.type == MONSTER) {
return monsters[i->second.index];
} else {
throw Error("cannot cast " + i->second.dfn->TypeName() + " to Monster");
int Interpreter::GetNumber(const std::string &name) const {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
- if (i->second.IsCompatible(NUMBER)) {
+ if (i->second.type == NUMBER) {
return numbers[i->second.index];
} else {
throw Error("cannot cast " + i->second.dfn->TypeName() + " to Number");
Sprite *Interpreter::GetSprite(const std::string &name) {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
- if (i->second.IsCompatible(SPRITE)) {
+ if (i->second.type == SPRITE) {
return sprites[i->second.index];
} else {
throw Error("cannot cast " + i->second.dfn->TypeName() + " to Sprite");
if (v.GetLiteral().GetTypeName() == "ComplexAnimation") {
ComplexAnimation *a(new ComplexAnimation);
ReadComplexAnimation(*a, *v.GetLiteral().GetProperties());
- animations.push_back(a);
+ complexAnimations.push_back(a);
return a;
} else {
SimpleAnimation *a(new SimpleAnimation);
ReadSimpleAnimation(*a, *v.GetLiteral().GetProperties());
- animations.push_back(a);
+ simpleAnimations.push_back(a);
return a;
}
} else {
void Interpreter::ReadObject(const Definition &dfn) {
- if (dfn.TypeName() == "Hero") {
+ if (dfn.TypeName() == "ComplexAnimation") {
+ ComplexAnimation *animation(new ComplexAnimation);
+ int index(complexAnimations.size());
+ complexAnimations.push_back(animation);
+ ReadComplexAnimation(*animation, *dfn.GetProperties());
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, COMPLEX_ANIMATION, index)));
+ } else if (dfn.TypeName() == "Hero") {
Hero *hero(new Hero);
int index(heroes.size());
heroes.push_back(hero);
monsters.push_back(monster);
ReadMonster(*monster, *dfn.GetProperties());
parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, MONSTER, index)));
+ } else if (dfn.TypeName() == "SimpleAnimation") {
+ SimpleAnimation *animation(new SimpleAnimation);
+ int index(simpleAnimations.size());
+ simpleAnimations.push_back(animation);
+ ReadSimpleAnimation(*animation, *dfn.GetProperties());
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, SIMPLE_ANIMATION, index)));
} else if (dfn.TypeName() == "Sprite") {
Sprite *sprite(new Sprite);
int index(sprites.size());
private:
const ParsedSource &source;
- enum DynamicType {
- ANIMATION,
+ enum Type {
COMPLEX_ANIMATION,
HERO,
MONSTER,
SPRITE,
};
struct ParsedDefinition {
- ParsedDefinition(const Definition *dfn, DynamicType type, int index)
+ ParsedDefinition(const Definition *dfn, Type type, int index)
: dfn(dfn), type(type), index(index) { }
- bool IsCompatible(DynamicType with) const;
const Definition *dfn;
- DynamicType type;
+ Type type;
int index;
};
std::map<std::string, ParsedDefinition> parsedDefinitions;
- std::vector<graphics::Animation *> animations;
+ std::vector<graphics::ComplexAnimation *> complexAnimations;
std::vector<battle::Hero *> heroes;
std::vector<SDL_Surface *> images;
std::vector<battle::Monster *> monsters;
std::vector<int> numbers;
+ std::vector<graphics::SimpleAnimation *> simpleAnimations;
std::vector<graphics::Sprite *> sprites;
};