]> git.localhorst.tv Git - l2e.git/commitdiff
added interpretation of Font and Frame objects
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 31 Aug 2012 19:43:26 +0000 (21:43 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 31 Aug 2012 19:44:48 +0000 (21:44 +0200)
src/loader/Interpreter.cpp
src/loader/Interpreter.h
src/main.cpp
test-data/test.l2s

index 9f4b77dcbac93c20b43df8cb1d8017bbf14e5230..d5a61a669a9bd177c023325cfec12031664395d1 100644 (file)
@@ -12,6 +12,8 @@
 #include "../battle/Monster.h"
 #include "../battle/PartyLayout.h"
 #include "../graphics/ComplexAnimation.h"
+#include "../graphics/Font.h"
+#include "../graphics/Frame.h"
 #include "../graphics/SimpleAnimation.h"
 #include "../graphics/Sprite.h"
 
@@ -24,6 +26,8 @@ using battle::Monster;
 using battle::PartyLayout;
 using battle::Stats;
 using graphics::Animation;
+using graphics::Font;
+using graphics::Frame;
 using graphics::ComplexAnimation;
 using graphics::SimpleAnimation;
 using graphics::Sprite;
@@ -43,6 +47,12 @@ Interpreter::~Interpreter() {
        for (vector<Hero *>::const_iterator i(heroes.begin()), end(heroes.end()); i != end; ++i) {
                delete *i;
        }
+       for (vector<Font *>::const_iterator i(fonts.begin()), end(fonts.end()); i != end; ++i) {
+               delete *i;
+       }
+       for (vector<Frame *>::const_iterator i(frames.begin()), end(frames.end()); i != end; ++i) {
+               delete *i;
+       }
        for (vector<SDL_Surface *>::const_iterator i(images.begin()), end(images.end()); i != end; ++i) {
                SDL_FreeSurface(*i);
        }
@@ -92,6 +102,32 @@ bool Interpreter::GetBoolean(const std::string &name) const {
        }
 }
 
+Font *Interpreter::GetFont(const std::string &name) {
+       map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
+       if (i != parsedDefinitions.end()) {
+               if (i->second.type == FONT) {
+                       return fonts[i->second.index];
+               } else {
+                       throw Error("cannot cast " + i->second.dfn->TypeName() + " to Font");
+               }
+       } else {
+               throw Error("access to undefined Font " + name);
+       }
+}
+
+Frame *Interpreter::GetFrame(const std::string &name) {
+       map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
+       if (i != parsedDefinitions.end()) {
+               if (i->second.type == FRAME) {
+                       return frames[i->second.index];
+               } else {
+                       throw Error("cannot cast " + i->second.dfn->TypeName() + " to Frame");
+               }
+       } else {
+               throw Error("access to undefined Frame " + name);
+       }
+}
+
 Hero *Interpreter::GetHero(const std::string &name) {
        map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
        if (i != parsedDefinitions.end()) {
@@ -269,6 +305,28 @@ bool Interpreter::GetBoolean(const Value &v) {
        }
 }
 
+Font *Interpreter::GetFont(const Value &v) {
+       if (v.IsLiteral()) {
+               Font *f(new Font);
+               ReadFont(*f, *v.GetLiteral().GetProperties());
+               return f;
+       } else {
+               ReadDefinition(source.GetDefinition(v.GetIdentifier()));
+               return GetFont(v.GetIdentifier());
+       }
+}
+
+Frame *Interpreter::GetFrame(const Value &v) {
+       if (v.IsLiteral()) {
+               Frame *f(new Frame);
+               ReadFrame(*f, *v.GetLiteral().GetProperties());
+               return f;
+       } else {
+               ReadDefinition(source.GetDefinition(v.GetIdentifier()));
+               return GetFrame(v.GetIdentifier());
+       }
+}
+
 SDL_Surface *Interpreter::GetImage(const Value &v) {
        const char *file(GetString(v));
        SDL_Surface *image(IMG_Load(file));
@@ -357,6 +415,18 @@ void Interpreter::ReadObject(const Definition &dfn) {
                complexAnimations.push_back(animation);
                ReadComplexAnimation(*animation, *dfn.GetProperties());
                parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, COMPLEX_ANIMATION, index)));
+       } else if (dfn.TypeName() == "Font") {
+               Font *font(new Font);
+               int index(fonts.size());
+               fonts.push_back(font);
+               ReadFont(*font, *dfn.GetProperties());
+               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, FONT, index)));
+       } else if (dfn.TypeName() == "Frame") {
+               Frame *frame(new Frame);
+               int index(frames.size());
+               frames.push_back(frame);
+               ReadFrame(*frame, *dfn.GetProperties());
+               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, FRAME, index)));
        } else if (dfn.TypeName() == "Hero") {
                Hero *hero(new Hero);
                int index(heroes.size());
@@ -428,6 +498,36 @@ void Interpreter::ReadComplexAnimationFrame(ComplexAnimation::FrameProp &f, cons
        }
 }
 
+void Interpreter::ReadFont(Font &f, const PropertyList &props) {
+       for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
+               if (i->first == "sprite") {
+                       f.SetSprite(GetSprite(*i->second));
+               } else if (i->first == "columnoffset") {
+                       f.SetColOffset(GetNumber(*i->second));
+               } else if (i->first == "rowoffset") {
+                       f.SetRowOffset(GetNumber(*i->second));
+               } else {
+                       throw Error("unknown Font property: " + i->first);
+               }
+       }
+}
+
+void Interpreter::ReadFrame(Frame &f, const PropertyList &props) {
+       for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
+               if (i->first == "image") {
+                       f.SetSurface(GetImage(*i->second));
+               } else if (i->first == "border") {
+                       f.SetBorderSize(GetVector(*i->second));
+               } else if (i->first == "repeat") {
+                       f.SetRepeatSize(GetVector(*i->second));
+               } else if (i->first == "offset") {
+                       f.SetOffset(GetVector(*i->second));
+               } else {
+                       throw Error("unknown Frame property: " + i->first);
+               }
+       }
+}
+
 void Interpreter::ReadHero(Hero &h, const PropertyList &props) {
        for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
                if (i->first == "name") {
index 3f53b3f492fdb6f6e196cc0cff54ea094acb2940..ca9900cb7ada7148801ec47f7a872c19345d0672 100644 (file)
@@ -26,6 +26,8 @@ namespace battle {
 
 namespace graphics {
        class Animation;
+       class Font;
+       class Frame;
        class SimpleAnimation;
        class Sprite;
 }
@@ -58,6 +60,8 @@ public:
 public:
        graphics::Animation *GetAnimation(const std::string &name);
        bool GetBoolean(const std::string &name) const;
+       graphics::Font *GetFont(const std::string &name);
+       graphics::Frame *GetFrame(const std::string &name);
        battle::Hero *GetHero(const std::string &name);
        battle::Monster *GetMonster(const std::string &name);
        int GetNumber(const std::string &name) const;
@@ -69,6 +73,8 @@ public:
 public:
        const std::vector<bool> &Booleans() const { return booleans; }
        const std::vector<graphics::ComplexAnimation *> &ComplexAnimations() const { return complexAnimations; }
+       const std::vector<graphics::Font *> &Fonts() const { return fonts; }
+       const std::vector<graphics::Frame *> &Frames() const { return frames; }
        const std::vector<battle::Hero *> &Heroes() const { return heroes; }
        const std::vector<SDL_Surface *> &Images() const { return images; }
        const std::vector<battle::Monster *> &Monsters() const { return monsters; }
@@ -86,6 +92,8 @@ private:
 
        graphics::Animation *GetAnimation(const Value &);
        bool GetBoolean(const Value &);
+       graphics::Font *GetFont(const Value &);
+       graphics::Frame *GetFrame(const Value &);
        SDL_Surface *GetImage(const Value &);
        int GetNumber(const Value &);
        battle::PartyLayout *GetPartyLayout(const Value &);
@@ -98,6 +106,8 @@ private:
 
        void ReadComplexAnimation(graphics::ComplexAnimation &, const PropertyList &);
        void ReadComplexAnimationFrame(graphics::ComplexAnimation::FrameProp &, const PropertyList &);
+       void ReadFont(graphics::Font &, const PropertyList &);
+       void ReadFrame(graphics::Frame &, const PropertyList &);
        void ReadHero(battle::Hero &, const PropertyList &);
        void ReadMonster(battle::Monster &, const PropertyList &);
        void ReadPartyLayout(battle::PartyLayout &, const PropertyList &);
@@ -110,6 +120,8 @@ private:
        enum Type {
                BOOLEAN,
                COMPLEX_ANIMATION,
+               FONT,
+               FRAME,
                HERO,
                IMAGE,
                MONSTER,
@@ -133,6 +145,8 @@ private:
 
        std::vector<bool> booleans;
        std::vector<graphics::ComplexAnimation *> complexAnimations;
+       std::vector<graphics::Font *> fonts;
+       std::vector<graphics::Frame *> frames;
        std::vector<battle::Hero *> heroes;
        std::vector<SDL_Surface *> images;
        std::vector<battle::Monster *> monsters;
index 1c87e33ff95a3728cc006b0470591da0e1a45c72..e1969307c93ff83dff5c88adfda6f2066c1e0e2d 100644 (file)
@@ -107,16 +107,8 @@ int main(int argc, char **argv) {
                battleRes.attackIcons = intp.GetSprite("attackIcons");
                battleRes.attackChoiceIcons = intp.GetSprite("attackChoiceIcons");
                battleRes.moveIcons = intp.GetSprite("moveIcons");
-
-               SDL_Surface *titleFrameImg(IMG_Load("test-data/title-frame.png"));
-               Frame titleFrame(titleFrameImg, 16, 16);
-               battleRes.titleFrame = &titleFrame;
-
-               SDL_Surface *largeFontImg(IMG_Load("test-data/large-font.png"));
-               Sprite largeFontSprite(largeFontImg, 16, 32);
-               Font largeFont(&largeFontSprite, 0, -2);
-               battleRes.titleFont = &largeFont;
-
+               battleRes.titleFrame = intp.GetFrame("titleFrame");
+               battleRes.titleFont = intp.GetFont("largeFont");
                battleRes.numberAnimationPrototype = intp.GetAnimation("numberAnimationPrototype");
                battleRes.bigNumberSprite = intp.GetSprite("bigNumbers");
                battleRes.greenNumberSprite = intp.GetSprite("bigGreenNumbers");
@@ -133,20 +125,11 @@ int main(int argc, char **argv) {
                battleRes.ikariLabelCol = 0;
                battleRes.ikariLabelRow = 4;
 
-               SDL_Surface *numbersImg(IMG_Load("test-data/numbers.png"));
-               Sprite numbersSprite(numbersImg, 16, 16);
-               Font heroTagFont(&numbersSprite, 0, -3);
-               battleRes.heroTagFont = &heroTagFont;
-               SDL_Surface *tagFramesImg(IMG_Load("test-data/tag-frames.png"));
-               Frame heroTagFrame(tagFramesImg, 16, 16, 1, 1, 0, 33);
-               battleRes.heroTagFrame = &heroTagFrame;
-               Frame activeHeroTagFrame(tagFramesImg, 16, 16);
-               battleRes.activeHeroTagFrame = &activeHeroTagFrame;
-               SDL_Surface *smallTagFrameImg(IMG_Load("test-data/small-tag-frame.png"));
-               Frame smallTagFrame(smallTagFrameImg, 8, 16);
-               battleRes.smallHeroTagFrame = &smallTagFrame;
-               Frame lastSmallTagFrame(smallTagFrameImg, 8, 16, 1, 1, 0, 33);
-               battleRes.lastSmallHeroTagFrame = &lastSmallTagFrame;
+               battleRes.heroTagFont = intp.GetFont("heroTagFont");
+               battleRes.heroTagFrame = intp.GetFrame("heroTagFrame");
+               battleRes.activeHeroTagFrame = intp.GetFrame("activeHeroTagFrame");
+               battleRes.smallHeroTagFrame = intp.GetFrame("smallHeroTagFrame");
+               battleRes.lastSmallHeroTagFrame = intp.GetFrame("lastSmallHeroTagFrame");
                battleRes.heroesBgColor = SDL_MapRGB(screen.Screen()->format, 0x18, 0x28, 0x31);
 
                SDL_Surface *gauges(IMG_Load("test-data/gauges.png"));
index 36c119aab537580fdc4f5686c90dd979a91ebcbb..b7e1acd27bfb9912aba6285b5c9b4a35f5b0334d 100644 (file)
@@ -349,6 +349,19 @@ export Sprite moveIcons {
        size: <32,32>
 }
 
+export Frame titleFrame {
+       image: "test-data/title-frame.png",
+       border: <16,16>
+}
+
+export Font largeFont {
+       sprite: Sprite {
+               image: "test-data/large-font.png",
+               size: <16,32>
+       },
+       rowoffset: -2
+}
+
 export ComplexAnimation numberAnimationPrototype {
        frametime: frameTime,
        repeat: false,
@@ -403,3 +416,30 @@ export Sprite heroTagLabels {
        image: "test-data/hero-tag-sprites.png",
        size: <32,16>
 }
+export Font heroTagFont {
+       sprite: Sprite {
+               image: "test-data/numbers.png",
+               size: <16,16>
+       },
+       rowoffset: -3
+}
+
+export Frame activeHeroTagFrame {
+       image: "test-data/tag-frames.png",
+       border: <16,16>
+}
+export Frame heroTagFrame {
+       image: "test-data/tag-frames.png",
+       border: <16,16>,
+       offset: < 0,33>
+}
+
+export Frame smallHeroTagFrame {
+       image: "test-data/small-tag-frame.png",
+       border: <8,16>
+}
+export Frame lastSmallHeroTagFrame {
+       image: "test-data/small-tag-frame.png",
+       border: <8,16>,
+       offset: <0,33>
+}
\ No newline at end of file