X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FInterpreter.cpp;h=fcfe473eaad533b69210a914ebd66d9710873704;hb=d5959073b2c413ba1bd6f3d14bc8bcf59304e488;hp=f616c1a394a0f803d0fee0a828b5f53abf3c32b0;hpb=d003612c783c271285c437e47f4ab671405fa402;p=l2e.git diff --git a/src/loader/Interpreter.cpp b/src/loader/Interpreter.cpp index f616c1a..fcfe473 100644 --- a/src/loader/Interpreter.cpp +++ b/src/loader/Interpreter.cpp @@ -11,10 +11,16 @@ #include "../battle/Hero.h" #include "../battle/Monster.h" #include "../battle/PartyLayout.h" +#include "../battle/Resources.h" +#include "../common/Ikari.h" +#include "../common/Item.h" +#include "../common/Spell.h" +#include "../common/TargetingMode.h" #include "../graphics/ComplexAnimation.h" #include "../graphics/Font.h" #include "../graphics/Frame.h" #include "../graphics/Gauge.h" +#include "../graphics/Menu.h" #include "../graphics/SimpleAnimation.h" #include "../graphics/Sprite.h" @@ -26,7 +32,12 @@ using battle::Hero; using battle::Monster; using battle::PartyLayout; using battle::Stats; +using common::Ikari; +using common::Item; +using common::Spell; +using common::TargetingMode; using graphics::Animation; +using graphics::Color; using graphics::Font; using graphics::Frame; using graphics::Gauge; @@ -43,10 +54,10 @@ using std::vector; namespace loader { Interpreter::~Interpreter() { - for (vector::const_iterator i(complexAnimations.begin()), end(complexAnimations.end()); i != end; ++i) { + for (vector::const_iterator i(battleResources.begin()), end(battleResources.end()); i != end; ++i) { delete *i; } - for (vector::const_iterator i(heroes.begin()), end(heroes.end()); i != end; ++i) { + for (vector::const_iterator i(complexAnimations.begin()), end(complexAnimations.end()); i != end; ++i) { delete *i; } for (vector::const_iterator i(fonts.begin()), end(fonts.end()); i != end; ++i) { @@ -58,9 +69,21 @@ Interpreter::~Interpreter() { for (vector::const_iterator i(gauges.begin()), end(gauges.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(ikaris.begin()), end(ikaris.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(items.begin()), end(items.end()); i != end; ++i) { + delete *i; + } + for (vector::const_iterator i(menuProperties.begin()), end(menuProperties.end()); i != end; ++i) { + delete *i; + } for (vector::const_iterator i(monsters.begin()), end(monsters.end()); i != end; ++i) { delete *i; } @@ -70,12 +93,18 @@ Interpreter::~Interpreter() { for (vector::const_iterator i(simpleAnimations.begin()), end(simpleAnimations.end()); i != end; ++i) { delete *i; } + for (vector::const_iterator i(spells.begin()), end(spells.end()); i != end; ++i) { + delete *i; + } for (vector::const_iterator i(sprites.begin()), end(sprites.end()); i != end; ++i) { delete *i; } for (vector::const_iterator i(strings.begin()), end(strings.end()); i != end; ++i) { delete *i; } + for (vector::const_iterator i(targetingModes.begin()), end(targetingModes.end()); i != end; ++i) { + delete *i; + } } @@ -94,6 +123,19 @@ Animation *Interpreter::GetAnimation(const std::string &name) { } } +battle::Resources *Interpreter::GetBattleResources(const std::string &name) { + map::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == BATTLE_RESOURCES) { + return battleResources[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to BattleResources"); + } + } else { + throw Error("access to undefined BattleResources " + name); + } +} + bool Interpreter::GetBoolean(const std::string &name) const { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { @@ -107,6 +149,19 @@ bool Interpreter::GetBoolean(const std::string &name) const { } } +const Color &Interpreter::GetColor(const std::string &name) const { + map::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == COLOR) { + return colors[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to Color"); + } + } else { + throw Error("access to undefined Color " + name); + } +} + Font *Interpreter::GetFont(const std::string &name) { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { @@ -159,6 +214,45 @@ Hero *Interpreter::GetHero(const std::string &name) { } } +Ikari *Interpreter::GetIkari(const std::string &name) { + map::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == IKARI) { + return ikaris[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to Ikari"); + } + } else { + throw Error("access to undefined Ikari " + name); + } +} + +Item *Interpreter::GetItem(const std::string &name) { + map::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == ITEM) { + return items[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to Item"); + } + } else { + throw Error("access to undefined Item " + name); + } +} + +graphics::MenuProperties *Interpreter::GetMenuProperties(const std::string &name) { + map::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == MENU_PROPERTIES) { + return menuProperties[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to MenuProperties"); + } + } else { + throw Error("access to undefined MenuProperties " + name); + } +} + Monster *Interpreter::GetMonster(const std::string &name) { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { @@ -198,6 +292,32 @@ PartyLayout *Interpreter::GetPartyLayout(const std::string &name) { } } +const char *Interpreter::GetPath(const std::string &name) const { + map::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::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == SPELL) { + return spells[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to Spell"); + } + } else { + throw Error("access to undefined Spell " + name); + } +} + Sprite *Interpreter::GetSprite(const std::string &name) { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { @@ -214,7 +334,8 @@ Sprite *Interpreter::GetSprite(const std::string &name) { const char *Interpreter::GetString(const std::string &name) const { map::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"); @@ -224,6 +345,19 @@ const char *Interpreter::GetString(const std::string &name) const { } } +TargetingMode *Interpreter::GetTargetingMode(const std::string &name) { + map::const_iterator i(parsedDefinitions.find(name)); + if (i != parsedDefinitions.end()) { + if (i->second.type == TARGETING_MODE) { + return targetingModes[i->second.index]; + } else { + throw Error("cannot cast " + i->second.dfn->TypeName() + " to TargetingMode"); + } + } else { + throw Error("access to undefined TargetingMode " + name); + } +} + Vector Interpreter::GetVector(const std::string &name) const { map::const_iterator i(parsedDefinitions.find(name)); if (i != parsedDefinitions.end()) { @@ -270,12 +404,22 @@ void Interpreter::ReadLiteral(const Definition &dfn) { parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, BOOLEAN, booleans.size() - 1))); break; case Literal::COLOR: - throw Error("unhandled literal: color"); + colors.push_back(Color(dfn.GetLiteral()->GetRed(), dfn.GetLiteral()->GetGreen(), dfn.GetLiteral()->GetBlue(), dfn.GetLiteral()->GetAlpha())); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, COLOR, colors.size() - 1))); break; case Literal::NUMBER: 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]); @@ -314,6 +458,17 @@ Animation *Interpreter::GetAnimation(const Value &v) { } } +battle::Resources *Interpreter::GetBattleResources(const Value &v) { + if (v.IsLiteral()) { + battle::Resources *r(new battle::Resources); + ReadBattleResources(*r, *v.GetLiteral().GetProperties()); + return r; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetBattleResources(v.GetIdentifier()); + } +} + bool Interpreter::GetBoolean(const Value &v) { if (v.IsLiteral()) { return v.GetLiteral().GetBoolean(); @@ -323,6 +478,15 @@ bool Interpreter::GetBoolean(const Value &v) { } } +Color Interpreter::GetColor(const Value &v) { + if (v.IsLiteral()) { + return Color(v.GetLiteral().GetRed(), v.GetLiteral().GetGreen(), v.GetLiteral().GetBlue(), v.GetLiteral().GetAlpha()); + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetColor(v.GetIdentifier()); + } +} + Font *Interpreter::GetFont(const Value &v) { if (v.IsLiteral()) { Font *f(new Font); @@ -356,11 +520,72 @@ Gauge *Interpreter::GetGauge(const Value &v) { } } +Hero *Interpreter::GetHero(const Value &v) { + if (v.IsLiteral()) { + Hero *h(new Hero); + ReadHero(*h, *v.GetLiteral().GetProperties()); + return h; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetHero(v.GetIdentifier()); + } +} + +Ikari *Interpreter::GetIkari(const Value &v) { + if (v.IsLiteral()) { + Ikari *i(new Ikari); + ReadIkari(*i, *v.GetLiteral().GetProperties()); + return i; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetIkari(v.GetIdentifier()); + } +} + 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::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) { + if (v.IsLiteral()) { + Item *i(new Item); + ReadItem(*i, *v.GetLiteral().GetProperties()); + return i; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetItem(v.GetIdentifier()); + } +} + +graphics::MenuProperties *Interpreter::GetMenuProperties(const Value &v) { + if (v.IsLiteral()) { + graphics::MenuProperties *m(new graphics::MenuProperties); + ReadMenuProperties(*m, *v.GetLiteral().GetProperties()); + return m; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetMenuProperties(v.GetIdentifier()); + } +} + +Monster *Interpreter::GetMonster(const Value &v) { + if (v.IsLiteral()) { + Monster *m(new Monster); + ReadMonster(*m, *v.GetLiteral().GetProperties()); + return m; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetMonster(v.GetIdentifier()); + } } int Interpreter::GetNumber(const Value &v) { @@ -383,6 +608,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(); @@ -399,6 +633,17 @@ const vector &Interpreter::GetPropertyListArray(const Value &v) } } +Spell *Interpreter::GetSpell(const Value &v) { + if (v.IsLiteral()) { + Spell *s(new Spell); + ReadSpell(*s, *v.GetLiteral().GetProperties()); + return s; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetSpell(v.GetIdentifier()); + } +} + Sprite *Interpreter::GetSprite(const Value &v) { if (v.IsLiteral()) { Sprite *s(new Sprite); @@ -419,6 +664,17 @@ const char *Interpreter::GetString(const Value &v) { } } +TargetingMode *Interpreter::GetTargetingMode(const Value &v) { + if (v.IsLiteral()) { + TargetingMode *t(new TargetingMode); + ReadTargetingMode(*t, *v.GetLiteral().GetProperties()); + return t; + } else { + ReadDefinition(source.GetDefinition(v.GetIdentifier())); + return GetTargetingMode(v.GetIdentifier()); + } +} + Vector Interpreter::GetVector(const Value &v) { if (v.IsLiteral()) { return Vector(v.GetLiteral().GetX(), v.GetLiteral().GetY()); @@ -438,7 +694,13 @@ const vector &Interpreter::GetValueArray(const Value &v) { void Interpreter::ReadObject(const Definition &dfn) { - if (dfn.TypeName() == "ComplexAnimation") { + if (dfn.TypeName() == "BattleResources") { + battle::Resources *res(new battle::Resources); + int index(battleResources.size()); + battleResources.push_back(res); + ReadBattleResources(*res, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, BATTLE_RESOURCES, index))); + } else if (dfn.TypeName() == "ComplexAnimation") { ComplexAnimation *animation(new ComplexAnimation); int index(complexAnimations.size()); complexAnimations.push_back(animation); @@ -468,6 +730,24 @@ void Interpreter::ReadObject(const Definition &dfn) { heroes.push_back(hero); ReadHero(*hero, *dfn.GetProperties()); parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, HERO, index))); + } else if (dfn.TypeName() == "Ikari") { + Ikari *ikari(new Ikari); + int index(ikaris.size()); + ikaris.push_back(ikari); + ReadIkari(*ikari, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, IKARI, index))); + } else if (dfn.TypeName() == "Item") { + Item *item(new Item); + int index(items.size()); + items.push_back(item); + ReadItem(*item, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, ITEM, index))); + } else if (dfn.TypeName() == "MenuProperties") { + graphics::MenuProperties *mprops(new graphics::MenuProperties); + int index(menuProperties.size()); + menuProperties.push_back(mprops); + ReadMenuProperties(*mprops, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, MENU_PROPERTIES, index))); } else if (dfn.TypeName() == "Monster") { Monster *monster(new Monster); int index(monsters.size()); @@ -486,18 +766,138 @@ void Interpreter::ReadObject(const Definition &dfn) { simpleAnimations.push_back(animation); ReadSimpleAnimation(*animation, *dfn.GetProperties()); parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, SIMPLE_ANIMATION, index))); + } else if (dfn.TypeName() == "Spell") { + Spell *spell(new Spell); + int index(spells.size()); + spells.push_back(spell); + ReadSpell(*spell, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, SPELL, index))); } else if (dfn.TypeName() == "Sprite") { Sprite *sprite(new Sprite); int index(sprites.size()); sprites.push_back(sprite); ReadSprite(*sprite, *dfn.GetProperties()); parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, SPRITE, index))); + } else if (dfn.TypeName() == "TargetingMode") { + TargetingMode *mode(new TargetingMode); + int index(targetingModes.size()); + targetingModes.push_back(mode); + ReadTargetingMode(*mode, *dfn.GetProperties()); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, TARGETING_MODE, index))); } else { throw Error("unhandled object type: " + dfn.TypeName()); } } +void Interpreter::ReadBattleResources(battle::Resources &res, const PropertyList &props) { + for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { + if (i->first == "swapCursor") { + res.swapCursor = GetSprite(*i->second); + } else if (i->first == "moveIcons") { + res.moveIcons = GetSprite(*i->second); + } else if (i->first == "attackIcons") { + res.attackIcons = GetSprite(*i->second); + } else if (i->first == "attackChoiceIcons") { + res.attackChoiceIcons = GetSprite(*i->second); + } else if (i->first == "titleFrame") { + res.titleFrame = GetFrame(*i->second); + } else if (i->first == "titleFont") { + res.titleFont = GetFont(*i->second); + } else if (i->first == "heroTagFrame") { + res.heroTagFrame = GetFrame(*i->second); + } else if (i->first == "activeHeroTagFrame") { + res.activeHeroTagFrame = GetFrame(*i->second); + } else if (i->first == "smallHeroTagFrame") { + res.smallHeroTagFrame = GetFrame(*i->second); + } else if (i->first == "lastSmallHeroTagFrame") { + res.lastSmallHeroTagFrame = GetFrame(*i->second); + } else if (i->first == "heroTagFont") { + res.heroTagFont = GetFont(*i->second); + } else if (i->first == "heroTagLabels") { + res.heroTagLabels = GetSprite(*i->second); + } else if (i->first == "healthGauge") { + res.healthGauge = GetGauge(*i->second); + } else if (i->first == "manaGauge") { + res.manaGauge = GetGauge(*i->second); + } else if (i->first == "ikariGauge") { + res.ikariGauge = GetGauge(*i->second); + } else if (i->first == "selectFrame") { + res.selectFrame = GetFrame(*i->second); + } else if (i->first == "normalFont") { + res.normalFont = GetFont(*i->second); + } else if (i->first == "disabledFont") { + res.disabledFont = GetFont(*i->second); + } else if (i->first == "menuCursor") { + res.menuCursor = GetSprite(*i->second); + } else if (i->first == "weaponTargetCursor") { + res.weaponTargetCursor = GetSprite(*i->second); + } else if (i->first == "magicTargetCursor") { + res.magicTargetCursor = GetSprite(*i->second); + } else if (i->first == "itemTargetCursor") { + res.itemTargetCursor = GetSprite(*i->second); + } else if (i->first == "spellMenuHeadline") { + res.spellMenuHeadline = GetString(*i->second); + } else if (i->first == "spellMenuProperties") { + res.spellMenuProperties = GetMenuProperties(*i->second); + } else if (i->first == "itemMenuHeadline") { + res.itemMenuHeadline = GetString(*i->second); + } else if (i->first == "itemMenuProperties") { + res.itemMenuProperties = GetMenuProperties(*i->second); + } else if (i->first == "ikariMenuHeadline") { + res.ikariMenuHeadline = GetString(*i->second); + } else if (i->first == "ikariMenuProperties") { + res.ikariMenuProperties = GetMenuProperties(*i->second); + } else if (i->first == "noEquipmentText") { + res.noEquipmentText = GetString(*i->second); + } else if (i->first == "escapeText") { + res.escapeText = GetString(*i->second); + } else if (i->first == "numberAnimationPrototype") { + res.numberAnimationPrototype = GetAnimation(*i->second); + } else if (i->first == "bigNumberSprite") { + res.bigNumberSprite = GetSprite(*i->second); + } else if (i->first == "greenNumberSprite") { + res.greenNumberSprite = GetSprite(*i->second); + } else if (i->first == "weaponMenuIcon") { + res.weaponMenuIcon = GetSprite(*i->second); + } else if (i->first == "armorMenuIcon") { + res.armorMenuIcon = GetSprite(*i->second); + } else if (i->first == "shieldMenuIcon") { + res.shieldMenuIcon = GetSprite(*i->second); + } else if (i->first == "helmetMenuIcon") { + res.helmetMenuIcon = GetSprite(*i->second); + } else if (i->first == "ringMenuIcon") { + res.ringMenuIcon = GetSprite(*i->second); + } else if (i->first == "jewelMenuIcon") { + res.jewelMenuIcon = GetSprite(*i->second); + } else if (i->first == "levelLabelCol") { + res.levelLabelCol = GetNumber(*i->second); + } else if (i->first == "levelLabelRow") { + res.levelLabelRow = GetNumber(*i->second); + } else if (i->first == "healthLabelCol") { + res.healthLabelCol = GetNumber(*i->second); + } else if (i->first == "healthLabelRow") { + res.healthLabelRow = GetNumber(*i->second); + } else if (i->first == "manaLabelCol") { + res.manaLabelCol = GetNumber(*i->second); + } else if (i->first == "manaLabelRow") { + res.manaLabelRow = GetNumber(*i->second); + } else if (i->first == "moveLabelCol") { + res.moveLabelCol = GetNumber(*i->second); + } else if (i->first == "moveLabelRow") { + res.moveLabelRow = GetNumber(*i->second); + } else if (i->first == "ikariLabelCol") { + res.ikariLabelCol = GetNumber(*i->second); + } else if (i->first == "ikariLabelRow") { + res.ikariLabelRow = GetNumber(*i->second); + } else if (i->first == "heroesBgColor") { + res.heroesBgColor = GetColor(*i->second); + } else { + throw Error("unknown BattleResources property: " + i->first); + } + } +} + void Interpreter::ReadComplexAnimation(ComplexAnimation &a, const PropertyList &props) { for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { if (i->first == "sprite") { @@ -585,6 +985,50 @@ void Interpreter::ReadGauge(Gauge &g, const PropertyList &props) { } } +void Interpreter::ReadIkari(Ikari &ikari, const PropertyList &props) { + for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { + if (i->first == "name") { + ikari.SetName(GetString(*i->second)); + } else if (i->first == "cost") { + ikari.SetCost(GetNumber(*i->second)); + } else if (i->first == "targets") { + ikari.GetTargetingMode() = *GetTargetingMode(*i->second); + } else if (i->first == "magical") { + if (GetBoolean(*i->second)) { + ikari.SetMagical(); + } + } else if (i->first == "physical") { + if (GetBoolean(*i->second)) { + ikari.SetPhysical(); + } + } else { + throw Error("unknown Ikari property: " + i->first); + } + } +} + +void Interpreter::ReadItem(Item &item, const PropertyList &props) { + for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { + if (i->first == "name") { + item.SetName(GetString(*i->second)); + } else if (i->first == "menuicon") { + item.SetMenuIcon(GetSprite(*i->second)); + } else if (i->first == "battle") { + if (GetBoolean(*i->second)) { + item.SetUsableInBattle(); + } + } else if (i->first == "targets") { + item.GetTargetingMode() = *GetTargetingMode(*i->second); + } else if (i->first == "ikari") { + item.SetIkari(GetIkari(*i->second)); + } else if (i->first == "attackanimation") { + item.SetAttackAnimation(GetAnimation(*i->second)); + } else { + throw Error("unknown Item 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") { @@ -619,6 +1063,40 @@ void Interpreter::ReadHero(Hero &h, const PropertyList &props) { } } +void Interpreter::ReadMenuProperties(graphics::MenuProperties &mprops, const PropertyList &props) { + for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { + if (i->first == "font") { + mprops.font = GetFont(*i->second); + } else if (i->first == "disabledFont") { + mprops.disabledFont = GetFont(*i->second); + } else if (i->first == "cursor") { + mprops.cursor = GetSprite(*i->second); + } else if (i->first == "charsPerEntry") { + mprops.charsPerEntry = GetNumber(*i->second); + } else if (i->first == "rows") { + mprops.rows = GetNumber(*i->second); + } else if (i->first == "rowGap") { + mprops.rowGap = GetNumber(*i->second); + } else if (i->first == "iconSpace") { + mprops.iconSpace = GetNumber(*i->second); + } else if (i->first == "cols") { + mprops.cols = GetNumber(*i->second); + } else if (i->first == "colGap") { + mprops.colGap = GetNumber(*i->second); + } else if (i->first == "delimiter") { + mprops.delimiter = *GetString(*i->second); + } else if (i->first == "charsPerNumber") { + mprops.charsPerNumber = GetNumber(*i->second); + } else if (i->first == "charsPerAdditionalText") { + mprops.charsPerAdditionalText = GetNumber(*i->second); + } else if (i->first == "additionalTextGap") { + mprops.additionalTextGap = GetNumber(*i->second); + } else { + throw Error("unknown MenuProperties property: " + i->first); + } + } +} + void Interpreter::ReadMonster(Monster &m, const PropertyList &props) { for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { if (i->first == "name") { @@ -682,6 +1160,24 @@ void Interpreter::ReadSimpleAnimation(SimpleAnimation &a, const PropertyList &pr } } +void Interpreter::ReadSpell(Spell &s, const PropertyList &props) { + for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { + if (i->first == "name") { + s.SetName(GetString(*i->second)); + } else if (i->first == "cost") { + s.SetCost(GetNumber(*i->second)); + } else if (i->first == "battle") { + if (GetBoolean(*i->second)) { + s.SetUsableInBattle(); + } + } else if (i->first == "targets") { + s.GetTargetingMode() = *GetTargetingMode(*i->second); + } else { + throw Error("unknown Spell property: " + i->first); + } + } +} + void Interpreter::ReadSprite(Sprite &s, const PropertyList &props) { for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { if (i->first == "image") { @@ -718,4 +1214,36 @@ void Interpreter::ReadStats(Stats &s, const PropertyList &props) { } } +void Interpreter::ReadTargetingMode(TargetingMode &t, const PropertyList &props) { + for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) { + if (i->first == "ally") { + if (GetBoolean(*i->second)) { + t.TargetAlly(); + } else { + t.TargetEnemy(); + } + } else if (i->first == "enemy") { + if (GetBoolean(*i->second)) { + t.TargetEnemy(); + } else { + t.TargetAlly(); + } + } else if (i->first == "all") { + if (GetBoolean(*i->second)) { + t.TargetAll(); + } + } else if (i->first == "multiple") { + if (GetBoolean(*i->second)) { + t.TargetMultiple(); + } + } else if (i->first == "single") { + if (GetBoolean(*i->second)) { + t.TargetSingle(); + } + } else { + throw Error("unknown TargetingMode property: " + i->first); + } + } +} + }