]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Interpreter.cpp
added interpretation of PartyLayout
[l2e.git] / src / loader / Interpreter.cpp
index 47b7744763e23e03475cc14d91bc51913b48e72c..9f4b77dcbac93c20b43df8cb1d8017bbf14e5230 100644 (file)
@@ -10,6 +10,7 @@
 #include "ParsedSource.h"
 #include "../battle/Hero.h"
 #include "../battle/Monster.h"
+#include "../battle/PartyLayout.h"
 #include "../graphics/ComplexAnimation.h"
 #include "../graphics/SimpleAnimation.h"
 #include "../graphics/Sprite.h"
@@ -20,6 +21,7 @@
 
 using battle::Hero;
 using battle::Monster;
+using battle::PartyLayout;
 using battle::Stats;
 using graphics::Animation;
 using graphics::ComplexAnimation;
@@ -47,6 +49,9 @@ Interpreter::~Interpreter() {
        for (vector<Monster *>::const_iterator i(monsters.begin()), end(monsters.end()); i != end; ++i) {
                delete *i;
        }
+       for (vector<PartyLayout *>::const_iterator i(partyLayouts.begin()), end(partyLayouts.end()); i != end; ++i) {
+               delete *i;
+       }
        for (vector<SimpleAnimation *>::const_iterator i(simpleAnimations.begin()), end(simpleAnimations.end()); i != end; ++i) {
                delete *i;
        }
@@ -126,6 +131,19 @@ int Interpreter::GetNumber(const std::string &name) const {
        }
 }
 
+PartyLayout *Interpreter::GetPartyLayout(const std::string &name) {
+       map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
+       if (i != parsedDefinitions.end()) {
+               if (i->second.type == PARTY_LAYOUT) {
+                       return partyLayouts[i->second.index];
+               } else {
+                       throw Error("cannot cast " + i->second.dfn->TypeName() + " to PartyLayout");
+               }
+       } else {
+               throw Error("access to undefined PartyLayout " + name);
+       }
+}
+
 Sprite *Interpreter::GetSprite(const std::string &name) {
        map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
        if (i != parsedDefinitions.end()) {
@@ -267,6 +285,17 @@ int Interpreter::GetNumber(const Value &v) {
        }
 }
 
+PartyLayout *Interpreter::GetPartyLayout(const Value &v) {
+       if (v.IsLiteral()) {
+               PartyLayout *l(new PartyLayout);
+               ReadPartyLayout(*l, *v.GetLiteral().GetProperties());
+               return l;
+       } else {
+               ReadDefinition(source.GetDefinition(v.GetIdentifier()));
+               return GetPartyLayout(v.GetIdentifier());
+       }
+}
+
 const PropertyList *Interpreter::GetPropertyList(const Value &v) {
        if (v.IsLiteral()) {
                return v.GetLiteral().GetProperties();
@@ -340,6 +369,12 @@ void Interpreter::ReadObject(const Definition &dfn) {
                monsters.push_back(monster);
                ReadMonster(*monster, *dfn.GetProperties());
                parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, MONSTER, index)));
+       } else if (dfn.TypeName() == "PartyLayout") {
+               PartyLayout *layout(new PartyLayout);
+               int index(partyLayouts.size());
+               partyLayouts.push_back(layout);
+               ReadPartyLayout(*layout, *dfn.GetProperties());
+               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, PARTY_LAYOUT, index)));
        } else if (dfn.TypeName() == "SimpleAnimation") {
                SimpleAnimation *animation(new SimpleAnimation);
                int index(simpleAnimations.size());
@@ -457,6 +492,19 @@ void Interpreter::ReadMonster(Monster &m, const PropertyList &props) {
        }
 }
 
+void Interpreter::ReadPartyLayout(PartyLayout &p, const PropertyList &props) {
+       for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
+               if (i->first == "positions") {
+                       const vector<Value *> &positions(GetValueArray(*i->second));
+                       for (vector<Value *>::const_iterator j(positions.begin()), end(positions.end()); j != end; ++j) {
+                               p.AddPosition(GetVector(**j));
+                       }
+               } else {
+                       throw Error("unknown PartyLayout property: " + i->first);
+               }
+       }
+}
+
 void Interpreter::ReadSimpleAnimation(SimpleAnimation &a, const PropertyList &props) {
        for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
                if (i->first == "sprite") {