]> git.localhorst.tv Git - l2e.git/commitdiff
added hard support for path names in source files
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 1 Sep 2012 17:01:50 +0000 (19:01 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 1 Sep 2012 17:01:50 +0000 (19:01 +0200)
src/loader/Interpreter.cpp
src/loader/Interpreter.h
src/loader/ParsedSource.cpp
src/loader/ParsedSource.h
src/loader/Parser.cpp
test-data/items.l2s
test-data/test.l2s

index 7c26aaafded4ae6ad86929521e1bc5ebc9fe3e26..5d3b9fccba1dd63722aa49d1c966d71af3c8e614 100644 (file)
@@ -244,6 +244,19 @@ PartyLayout *Interpreter::GetPartyLayout(const std::string &name) {
        }
 }
 
+const char *Interpreter::GetPath(const std::string &name) const {
+       map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
+       if (i != parsedDefinitions.end()) {
+               if (i->second.type == PATH) {
+                       return strings[i->second.index];
+               } else {
+                       throw Error("cannot cast " + i->second.dfn->TypeName() + " to Path");
+               }
+       } else {
+               throw Error("access to undefined Path " + name);
+       }
+}
+
 Spell *Interpreter::GetSpell(const std::string &name) {
        map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
        if (i != parsedDefinitions.end()) {
@@ -273,7 +286,8 @@ Sprite *Interpreter::GetSprite(const std::string &name) {
 const char *Interpreter::GetString(const std::string &name) const {
        map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
        if (i != parsedDefinitions.end()) {
-               if (i->second.type == STRING) {
+               // TODO: enable path to string casting some time
+               if (i->second.type == STRING /* || i->second.type == PATH */) {
                        return strings[i->second.index];
                } else {
                        throw Error("cannot cast " + i->second.dfn->TypeName() + " to String");
@@ -348,6 +362,15 @@ void Interpreter::ReadLiteral(const Definition &dfn) {
                        numbers.push_back(dfn.GetLiteral()->GetNumber());
                        parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, NUMBER, numbers.size() - 1)));
                        break;
+               case Literal::PATH:
+                       {
+                               char *str(new char[dfn.GetLiteral()->GetString().size() + 1]);
+                               std::memcpy(str, dfn.GetLiteral()->GetString().c_str(), dfn.GetLiteral()->GetString().size());
+                               str[dfn.GetLiteral()->GetString().size()] = '\0';
+                               strings.push_back(str);
+                       }
+                       parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, PATH, strings.size() - 1)));
+                       break;
                case Literal::STRING:
                        {
                                char *str(new char[dfn.GetLiteral()->GetString().size() + 1]);
@@ -451,10 +474,16 @@ Ikari *Interpreter::GetIkari(const Value &v) {
 }
 
 SDL_Surface *Interpreter::GetImage(const Value &v) {
-       const char *file(GetString(v));
-       SDL_Surface *image(IMG_Load(file));
-       images.push_back(image);
-       return image;
+       string path(GetPath(v));
+       map<string, SDL_Surface *>::const_iterator i(imageCache.find(path));
+       if (i == imageCache.end()) {
+               SDL_Surface *image(IMG_Load(path.c_str()));
+               images.push_back(image);
+               imageCache.insert(make_pair(path, image));
+               return image;
+       } else {
+               return i->second;
+       }
 }
 
 Item *Interpreter::GetItem(const Value &v) {
@@ -488,6 +517,15 @@ PartyLayout *Interpreter::GetPartyLayout(const Value &v) {
        }
 }
 
+const char *Interpreter::GetPath(const Value &v) {
+       if (v.IsLiteral()) {
+               return v.GetLiteral().GetString().c_str();
+       } else {
+               ReadDefinition(source.GetDefinition(v.GetIdentifier()));
+               return GetPath(v.GetIdentifier());
+       }
+}
+
 const PropertyList *Interpreter::GetPropertyList(const Value &v) {
        if (v.IsLiteral()) {
                return v.GetLiteral().GetProperties();
index ffbad42e1a6ef1e2897305c55a04ad3090e38832..7755a1beb01e767684f5db5561143b48661b4cca 100644 (file)
@@ -77,6 +77,7 @@ public:
        battle::Monster *GetMonster(const std::string &name);
        int GetNumber(const std::string &name) const;
        battle::PartyLayout *GetPartyLayout(const std::string &name);
+       const char *GetPath(const std::string &name) const;
        common::Spell *GetSpell(const std::string &name);
        graphics::Sprite *GetSprite(const std::string &name);
        const char *GetString(const std::string &name) const;
@@ -121,6 +122,7 @@ private:
        battle::PartyLayout *GetPartyLayout(const Value &);
        const PropertyList *GetPropertyList(const Value &);
        const std::vector<PropertyList *> &GetPropertyListArray(const Value &);
+       const char *GetPath(const Value &);
        common::Spell *GetSpell(const Value &);
        graphics::Sprite *GetSprite(const Value &);
        const char *GetString(const Value &);
@@ -159,6 +161,7 @@ private:
                MONSTER,
                NUMBER,
                PARTY_LAYOUT,
+               PATH,
                PROPERTY_LIST_ARRAY,
                SIMPLE_ANIMATION,
                SPELL,
@@ -177,6 +180,8 @@ private:
        };
        std::map<std::string, ParsedDefinition> parsedDefinitions;
 
+       std::map<std::string, SDL_Surface *> imageCache;
+
        std::vector<bool> booleans;
        std::vector<graphics::ComplexAnimation *> complexAnimations;
        std::vector<graphics::Font *> fonts;
index 13b1262f93410de52ce0f522bfb538f66531fa6a..bceed089f0377f4a4678edc84414afa4d7c3084b 100644 (file)
@@ -7,6 +7,8 @@
 
 #include "ParsedSource.h"
 
+#include "utility.h"
+
 #include <ostream>
 #include <stdexcept>
 
@@ -209,6 +211,16 @@ Literal::Literal(int number)
 
 }
 
+Literal::Literal(const string &dir, const string &path)
+: props(0)
+, str(CatPath(dir, path))
+, i1(0), i2(0)
+, i3(0), i4(0)
+, b(false)
+, type(STRING) {
+
+}
+
 Literal::Literal(const string &str)
 : props(0)
 , str(str)
@@ -428,6 +440,9 @@ ostream &operator <<(ostream &out, const loader::Literal &l) {
                case loader::Literal::NUMBER:
                        out << "number, " << l.GetNumber();
                        break;
+               case loader::Literal::PATH:
+                       out << "path, \"" << l.GetString() << '"';
+                       break;
                case loader::Literal::STRING:
                        out << "string, \"" << l.GetString() << '"';
                        break;
index 36f3810ab434cb8805bb188b95348f6984165a91..8401777f54e0f43ebac98a6ed2e3286a268ec87f 100644 (file)
@@ -28,6 +28,7 @@ public:
                BOOLEAN,
                COLOR,
                NUMBER,
+               PATH,
                STRING,
                VECTOR,
                OBJECT
@@ -39,6 +40,7 @@ public:
        explicit Literal(bool);
        Literal(int r, int g, int b, int a = 255);
        explicit Literal(int number);
+       Literal(const std::string &dir, const std::string &path);
        Literal(const std::string &);
        Literal(int x, int y);
        Literal(const std::string &typeName, PropertyList *properties);
index bd65200ab8bc674bf983d4791962231d5ab21a40..6e5cbe014918a74846b67e6de7f68759e11bb6ee 100644 (file)
@@ -107,6 +107,7 @@ Declaration *Parser::ProbeDefinition() {
 bool Parser::BeginningOfLiteral(const Tokenizer::Token &t) const {
        switch (t.type) {
                case Tokenizer::Token::CHEVRON_OPEN:
+               case Tokenizer::Token::COLON:
                case Tokenizer::Token::BRACKET_OPEN:
                case Tokenizer::Token::PARENTHESIS_OPEN:
                case Tokenizer::Token::NUMBER:
@@ -205,6 +206,10 @@ Literal *Parser::ParseLiteral() {
                        case Tokenizer::Token::CHEVRON_OPEN:
                                tok.Putback(t);
                                return ParseVector();
+                       case Tokenizer::Token::COLON:
+                               t = GetToken();
+                               AssertTokenType(t.type, Tokenizer::Token::STRING);
+                               return new Literal(dirname, t.str);
                        case Tokenizer::Token::BRACKET_OPEN:
                                tok.Putback(t);
                                return ParseArray();
index f1734a74132efc7ba21f9ed4af0b614feaf83238..ac45d2a8f8ccbe7e0598c58aefa2133c20cf68ed 100644 (file)
@@ -1,66 +1,66 @@
 export Sprite potionIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>
 }
 export Sprite ballIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,16>
 }
 export Sprite crankIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,32>
 }
 export Sprite spearIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,48>
 }
 export Sprite swordIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,64>
 }
 export Sprite axIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,80>
 }
 export Sprite rodIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,96>
 }
 export Sprite armorIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,112>
 }
 export Sprite shieldIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,128>
 }
 export Sprite helmetIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,144>
 }
 export Sprite ringIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,160>
 }
 export Sprite jewelIcon {
-       image: "test-data/item-icons.png",
+       image: :"item-icons.png",
        size: <16,16>,
        offset: <0,176>
 }
 
 export SimpleAnimation swordAttackAnimation {
        sprite: Sprite {
-               image: "test-data/attack-sword.png",
+               image: :"attack-sword.png",
                size: <96,96>
        },
        frametime: twoFramesTime,
index 6b03e299f90e806abb2dd9f6f600702895fb5917..1547c8f8fc1baf4de55192b0343bdddb8a724943 100644 (file)
@@ -21,8 +21,7 @@ export PartyLayout heroesLayout {
 }
 
 Sprite lizardSprite {
-       // using pathes relative to project root until path resolution is implemented
-       image: "test-data/monster.png",
+       image: :"monster.png",
        size: <64,64>
 }
 
@@ -54,7 +53,7 @@ export Monster lizard {
        },
        meleeAnimation: SimpleAnimation {
                sprite: Sprite {
-                       image: "test-data/attack-monster.png",
+                       image: :"attack-monster.png",
                        size: <96,64>
                },
                frametime: frameTime,
@@ -63,7 +62,7 @@ export Monster lizard {
 }
 
 Sprite maximSprite {
-       image: "test-data/maxim.png",
+       image: :"maxim.png",
        size: <64,64>
 }
 export Hero maxim {
@@ -130,7 +129,7 @@ export Hero maxim {
        },
        meleeAnimation: SimpleAnimation {
                sprite: Sprite {
-                       image: "test-data/melee-maxim.png",
+                       image: :"melee-maxim.png",
                        size: <96,96>
                },
                frametime: twoFramesTime,
@@ -139,7 +138,7 @@ export Hero maxim {
 }
 
 Sprite selanSprite {
-       image: "test-data/selan.png",
+       image: :"selan.png",
        size: <64,64>
 }
 export Hero selan {
@@ -200,7 +199,7 @@ export Hero selan {
        },
        meleeAnimation: SimpleAnimation {
                sprite: Sprite {
-                       image: "test-data/melee-selan.png",
+                       image: :"melee-selan.png",
                        size: <96,96>
                },
                frametime: twoFramesTime,
@@ -209,7 +208,7 @@ export Hero selan {
 }
 
 Sprite guySprite {
-       image: "test-data/guy.png",
+       image: :"guy.png",
        size: <64,64>
 }
 export Hero guy {
@@ -253,7 +252,7 @@ export Hero guy {
        },
        meleeAnimation: SimpleAnimation {
                sprite: Sprite {
-                       image: "test-data/melee-guy.png",
+                       image: :"melee-guy.png",
                        size: <96,96>
                },
                frametime: fourFramesTime,
@@ -262,7 +261,7 @@ export Hero guy {
 }
 
 Sprite dekarSprite {
-       image: "test-data/dekar.png",
+       image: :"dekar.png",
        size: <64,64>
 }
 export Hero dekar {
@@ -324,7 +323,7 @@ export Hero dekar {
        },
        meleeAnimation: SimpleAnimation {
                sprite: Sprite {
-                       image: "test-data/melee-dekar.png",
+                       image: :"melee-dekar.png",
                        size: <96,96>
                },
                frametime: twoFramesTime,
@@ -333,30 +332,30 @@ export Hero dekar {
 }
 
 export Sprite swapCursor {
-       image: "test-data/swap-cursor.png",
+       image: :"swap-cursor.png",
        size: <32,32>
 }
 export Sprite attackIcons {
-       image: "test-data/attack-type-icons.png",
+       image: :"attack-type-icons.png",
        size: <32,32>
 }
 export Sprite attackChoiceIcons {
-       image: "test-data/attack-choice-icons.png",
+       image: :"attack-choice-icons.png",
        size: <16,16>
 }
 export Sprite moveIcons {
-       image: "test-data/move-icons.png",
+       image: :"move-icons.png",
        size: <32,32>
 }
 
 export Frame titleFrame {
-       image: "test-data/title-frame.png",
+       image: :"title-frame.png",
        border: <16,16>
 }
 
 export Font largeFont {
        sprite: Sprite {
-               image: "test-data/large-font.png",
+               image: :"large-font.png",
                size: <16,32>
        },
        rowoffset: -2
@@ -404,48 +403,48 @@ export ComplexAnimation numberAnimationPrototype {
        ]
 }
 export Sprite bigNumbers {
-       image: "test-data/big-numbers.png",
+       image: :"big-numbers.png",
        size: <16,32>
 }
 export Sprite bigGreenNumbers {
-       image: "test-data/big-green-numbers.png",
+       image: :"big-green-numbers.png",
        size: <16,32>
 }
 
 export Sprite heroTagLabels {
-       image: "test-data/hero-tag-sprites.png",
+       image: :"hero-tag-sprites.png",
        size: <32,16>
 }
 export Font heroTagFont {
        sprite: Sprite {
-               image: "test-data/numbers.png",
+               image: :"numbers.png",
                size: <16,16>
        },
        rowoffset: -3
 }
 
 export Frame activeHeroTagFrame {
-       image: "test-data/tag-frames.png",
+       image: :"tag-frames.png",
        border: <16,16>
 }
 export Frame heroTagFrame {
-       image: "test-data/tag-frames.png",
+       image: :"tag-frames.png",
        border: <16,16>,
        offset: < 0,33>
 }
 
 export Frame smallHeroTagFrame {
-       image: "test-data/small-tag-frame.png",
+       image: :"small-tag-frame.png",
        border: <8,16>
 }
 export Frame lastSmallHeroTagFrame {
-       image: "test-data/small-tag-frame.png",
+       image: :"small-tag-frame.png",
        border: <8,16>,
        offset: <0,33>
 }
 
 export Gauge healthGauge {
-       image: "test-data/gauges.png",
+       image: :"gauges.png",
        full:  <0,16>,
        empty: <0, 0>,
        height: 16,
@@ -454,7 +453,7 @@ export Gauge healthGauge {
        end:     6
 }
 export Gauge manaGauge {
-       image: "test-data/gauges.png",
+       image: :"gauges.png",
        full:  <0,32>,
        empty: <0, 0>,
        height: 16,
@@ -463,7 +462,7 @@ export Gauge manaGauge {
        end:     6
 }
 export Gauge ikariGauge {
-       image: "test-data/gauges.png",
+       image: :"gauges.png",
        full:  <0,48>,
        empty: <0, 0>,
        height: 16,
@@ -473,39 +472,39 @@ export Gauge ikariGauge {
 }
 
 export Frame selectFrame {
-       image: "test-data/select-frame.png",
+       image: :"select-frame.png",
        border: <16,16>
 }
 export Font normalFont {
        sprite: Sprite {
-               image: "test-data/normal-font.png",
+               image: :"normal-font.png",
                size: <16,16>
        },
        rowoffset: -2
 }
 export Font disabledFont {
        sprite: Sprite {
-               image: "test-data/disabled-font.png",
+               image: :"disabled-font.png",
                size: <16,16>
        },
        rowoffset: -2
 }
 export Sprite handCursor {
-       image: "test-data/cursor-hand.png",
+       image: :"cursor-hand.png",
        size: <32,32>
 }
 
 export Sprite weaponTargetCursor {
-       image: "test-data/targeting-icons.png",
+       image: :"targeting-icons.png",
        size: <32,32>
 }
 export Sprite magicTargetCursor {
-       image: "test-data/targeting-icons.png",
+       image: :"targeting-icons.png",
        size: <32,32>,
        offset: <0,32>
 }
 export Sprite itemTargetCursor {
-       image: "test-data/targeting-icons.png",
+       image: :"targeting-icons.png",
        size: <32,32>,
        offset: <0,64>
 }