X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FInterpreter.cpp;h=12dacb89cd8ab85fe92f3b6bf9f23e0df0a8180d;hb=8cd1fa19b3697a78579ae254933bdcf7345ba9ff;hp=65db6a00400bccb30329fa40e3325d97a6ca33cc;hpb=18f74a6be69846207f4184ab8570b29e8a39f592;p=l2e.git diff --git a/src/loader/Interpreter.cpp b/src/loader/Interpreter.cpp index 65db6a0..12dacb8 100644 --- a/src/loader/Interpreter.cpp +++ b/src/loader/Interpreter.cpp @@ -37,9 +37,18 @@ Interpreter::~Interpreter() { for (vector::const_iterator i(animations.begin()), end(animations.end()); i != end; ++i) { delete *i; } + for (vector::const_iterator i(heroes.begin()), end(heroes.end()); i != end; ++i) { + delete *i; + } for (vector::const_iterator i(images.begin()), end(images.end()); i != end; ++i) { SDL_FreeSurface(*i); } + for (vector::const_iterator i(monsters.begin()), end(monsters.end()); i != end; ++i) { + delete *i; + } + for (vector::const_iterator i(sprites.begin()), end(sprites.end()); i != end; ++i) { + delete *i; + } } @@ -67,7 +76,7 @@ Hero *Interpreter::GetHero(const std::string &name) { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { if (i->second.IsCompatible(HERO)) { - return &heroes[i->second.index]; + return heroes[i->second.index]; } else { throw Error("cannot cast " + i->second.dfn->TypeName() + " to Hero"); } @@ -80,7 +89,7 @@ Monster *Interpreter::GetMonster(const std::string &name) { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { if (i->second.IsCompatible(MONSTER)) { - return &monsters[i->second.index]; + return monsters[i->second.index]; } else { throw Error("cannot cast " + i->second.dfn->TypeName() + " to Monster"); } @@ -106,7 +115,7 @@ Sprite *Interpreter::GetSprite(const std::string &name) { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { if (i->second.IsCompatible(SPRITE)) { - return &sprites[i->second.index]; + return sprites[i->second.index]; } else { throw Error("cannot cast " + i->second.dfn->TypeName() + " to Sprite"); } @@ -260,17 +269,22 @@ Vector Interpreter::GetVector(const Value &v) { void Interpreter::ReadObject(const Definition &dfn) { if (dfn.TypeName() == "Hero") { - heroes.push_back(Hero()); - ReadHero(heroes.back(), *dfn.GetProperties()); - parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, HERO, heroes.size() - 1))); + Hero *hero(new Hero); + int index(heroes.size()); + heroes.push_back(hero); + ReadHero(*hero, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, HERO, index))); } else if (dfn.TypeName() == "Monster") { - monsters.push_back(Monster()); - ReadMonster(monsters.back(), *dfn.GetProperties()); - parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, MONSTER, monsters.size() - 1))); + Monster *monster(new Monster); + int index(monsters.size()); + monsters.push_back(monster); + ReadMonster(*monster, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, MONSTER, index))); } else if (dfn.TypeName() == "Sprite") { + Sprite *sprite(new Sprite); int index(sprites.size()); - sprites.push_back(Sprite()); - ReadSprite(sprites.back(), *dfn.GetProperties()); + sprites.push_back(sprite); + ReadSprite(*sprite, *dfn.GetProperties()); parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, SPRITE, index))); } else { throw Error("unhandled object type: " + dfn.TypeName());