]> git.localhorst.tv Git - l2e.git/commitdiff
added interpretation of PartyLayout
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 31 Aug 2012 18:40:39 +0000 (20:40 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 31 Aug 2012 18:46:24 +0000 (20:46 +0200)
src/loader/Interpreter.cpp
src/loader/Interpreter.h
src/main.cpp
test-data/test.l2s

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") {
index 8824a14ecfb2e36eb428519c9268d328d5a3230f..3f53b3f492fdb6f6e196cc0cff54ea094acb2940 100644 (file)
@@ -20,6 +20,7 @@
 namespace battle {
        class Hero;
        class Monster;
+       class PartyLayout;
        class Stats;
 }
 
@@ -60,6 +61,7 @@ public:
        battle::Hero *GetHero(const std::string &name);
        battle::Monster *GetMonster(const std::string &name);
        int GetNumber(const std::string &name) const;
+       battle::PartyLayout *GetPartyLayout(const std::string &name);
        graphics::Sprite *GetSprite(const std::string &name);
        const char *GetString(const std::string &name) const;
        geometry::Vector<int> GetVector(const std::string &name) const;
@@ -71,6 +73,7 @@ public:
        const std::vector<SDL_Surface *> &Images() const { return images; }
        const std::vector<battle::Monster *> &Monsters() const { return monsters; }
        const std::vector<int> &Numbers() const { return numbers; }
+       const std::vector<battle::PartyLayout *> &PartyLayouts() const { return partyLayouts; }
        const std::vector<graphics::SimpleAnimation *> &SimpleAnimations() const { return simpleAnimations; }
        const std::vector<graphics::Sprite *> &Sprites() const { return sprites; }
        const std::vector<const char *> &Strings() const { return strings; }
@@ -85,6 +88,7 @@ private:
        bool GetBoolean(const Value &);
        SDL_Surface *GetImage(const Value &);
        int GetNumber(const Value &);
+       battle::PartyLayout *GetPartyLayout(const Value &);
        const PropertyList *GetPropertyList(const Value &);
        const std::vector<PropertyList *> &GetPropertyListArray(const Value &);
        graphics::Sprite *GetSprite(const Value &);
@@ -96,6 +100,7 @@ private:
        void ReadComplexAnimationFrame(graphics::ComplexAnimation::FrameProp &, const PropertyList &);
        void ReadHero(battle::Hero &, const PropertyList &);
        void ReadMonster(battle::Monster &, const PropertyList &);
+       void ReadPartyLayout(battle::PartyLayout &, const PropertyList &);
        void ReadSimpleAnimation(graphics::SimpleAnimation &, const PropertyList &);
        void ReadSprite(graphics::Sprite &, const PropertyList &);
        void ReadStats(battle::Stats &, const PropertyList &);
@@ -109,6 +114,7 @@ private:
                IMAGE,
                MONSTER,
                NUMBER,
+               PARTY_LAYOUT,
                PROPERTY_LIST_ARRAY,
                SIMPLE_ANIMATION,
                SPRITE,
@@ -131,6 +137,7 @@ private:
        std::vector<SDL_Surface *> images;
        std::vector<battle::Monster *> monsters;
        std::vector<int> numbers;
+       std::vector<battle::PartyLayout *> partyLayouts;
        std::vector<PropertyList *> propertyLists;
        std::vector<std::vector<PropertyList *> > propertyListArrays;
        std::vector<graphics::SimpleAnimation *> simpleAnimations;
index 3719a8de6e452e7850c5c8493c0aa480081a4f1e..90f08d53bed888b629406ef15b248de497511e64 100644 (file)
@@ -92,16 +92,8 @@ int main(int argc, char **argv) {
 
                // temporary test data
                SDL_Surface *bg(IMG_Load("test-data/battle-bg.png"));
-               PartyLayout monstersLayout;
-               monstersLayout.AddPosition(Vector<Uint8>(88, 88));
-               monstersLayout.AddPosition(Vector<Uint8>(128, 88));
-               monstersLayout.AddPosition(Vector<Uint8>(168, 88));
-               monstersLayout.AddPosition(Vector<Uint8>(208, 88));
-               PartyLayout heroesLayout;
-               heroesLayout.AddPosition(Vector<Uint8>(48, 136));
-               heroesLayout.AddPosition(Vector<Uint8>(128, 136));
-               heroesLayout.AddPosition(Vector<Uint8>(80, 152));
-               heroesLayout.AddPosition(Vector<Uint8>(160, 152));
+               PartyLayout monstersLayout(*intp.GetPartyLayout("monstersLayout"));
+               PartyLayout heroesLayout(*intp.GetPartyLayout("heroesLayout"));
 
                Monster monster(*intp.GetMonster("lizard"));
                Hero maxim(*intp.GetHero("maxim"));
index d53fe76b52257b5798d16e3b6354de74abea8794..b4ff641aec4cb1b628bdbe01625a0e1627d25454 100644 (file)
@@ -3,6 +3,23 @@ Number twoFramesTime 66
 Number fourFramesTime 132
 Number fiveFramesTime 165 // darn, i really need to implement expressions
 
+export PartyLayout monstersLayout {
+       positions: [
+               < 88, 88>,
+               <128, 88>,
+               <168, 88>,
+               <208, 88>
+       ]
+}
+export PartyLayout heroesLayout {
+       positions: [
+               < 48,136>,
+               <128,136>,
+               < 80,152>,
+               <160,152>
+       ]
+}
+
 Sprite lizardSprite {
        // using pathes relative to project root until path resolution is implemented
        image: "test-data/monster.png",