namespace loader {
Interpreter::~Interpreter() {
- for (vector<battle::Resources *>::const_iterator i(battleResources.begin()), end(battleResources.end()); i != end; ++i) {
- delete *i;
+ for (vector<PostponedDefinition>::const_iterator i(postponedDefinitions.begin()), end(postponedDefinitions.end()); i != end; ++i) {
+ delete i->identifier;
}
- for (vector<ComplexAnimation *>::const_iterator i(complexAnimations.begin()), end(complexAnimations.end()); i != end; ++i) {
- delete *i;
+ for (map<string, SDL_Surface *>::const_iterator i(imageCache.begin()), end(imageCache.end()); i != end; ++i) {
+ SDL_FreeSurface(i->second);
}
- 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<Gauge *>::const_iterator i(gauges.begin()), end(gauges.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<Hero *>::const_iterator i(heroes.begin()), end(heroes.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<Ikari *>::const_iterator i(ikaris.begin()), end(ikaris.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<SDL_Surface *>::const_iterator i(images.begin()), end(images.end()); i != end; ++i) {
- SDL_FreeSurface(*i);
- }
- for (vector<Item *>::const_iterator i(items.begin()), end(items.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<graphics::MenuProperties *>::const_iterator i(menuProperties.begin()), end(menuProperties.end()); i != end; ++i) {
- delete *i;
- }
- 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;
- }
- for (vector<Spell *>::const_iterator i(spells.begin()), end(spells.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<Sprite *>::const_iterator i(sprites.begin()), end(sprites.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<const char *>::const_iterator i(strings.begin()), end(strings.end()); i != end; ++i) {
- delete *i;
- }
- for (vector<TargetingMode *>::const_iterator i(targetingModes.begin()), end(targetingModes.end()); i != end; ++i) {
- delete *i;
- }
-}
-
-
-Animation *Interpreter::GetAnimation(const std::string &name) {
- map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == COMPLEX_ANIMATION) {
- return complexAnimations[i->second.index];
- } else if (i->second.type == SIMPLE_ANIMATION) {
- return simpleAnimations[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Animation");
- }
- } else {
- throw Error("access to undefined Animation " + name);
- }
-}
-
-battle::Resources *Interpreter::GetBattleResources(const std::string &name) {
- map<string, ParsedDefinition>::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<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == BOOLEAN) {
- return booleans[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Boolean");
- }
- } else {
- throw Error("access to undefined Boolean " + name);
- }
-}
-
-const Color &Interpreter::GetColor(const std::string &name) const {
- map<string, ParsedDefinition>::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<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");
+ // TODO: maybe need to reverse the array deletion check if most objects turn out to be arrays (of char)
+ for (map<int, vector<void *> >::const_iterator i(values.begin()), end(values.end()); i != end; ++i) {
+ for (vector<void *>::const_iterator j(i->second.begin()), end(i->second.end()); j != end; ++j) {
+ delete[] reinterpret_cast<char *>(*j);
}
- } 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);
- }
-}
-
-Gauge *Interpreter::GetGauge(const std::string &name) {
- map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == GAUGE) {
- return gauges[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Gauge");
- }
- } else {
- throw Error("access to undefined Gauge " + name);
- }
-}
-Hero *Interpreter::GetHero(const std::string &name) {
+void *Interpreter::GetObject(int typeId, const std::string &name) {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
- if (i->second.type == HERO) {
- return heroes[i->second.index];
+ const TypeDescription &requested(TypeDescription::Get(typeId));
+ const TypeDescription &actual(TypeDescription::Get(i->second.type));
+ if (requested.TypeId() == actual.TypeId()) {
+ return values[actual.TypeId()][i->second.id];
+ } else if (actual.IsSubtypeOf(requested)) {
+ char *sub(reinterpret_cast<char *>(values[actual.TypeId()][i->second.id]));
+ std::ptrdiff_t offset(actual.SupertypeOffset(requested));
+ return sub - offset;
} else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Hero");
+ throw Error("cannot cast " + actual.TypeName() + " to " + requested.TypeName());
}
} else {
- throw Error("access to undefined Hero " + name);
- }
-}
-
-Ikari *Interpreter::GetIkari(const std::string &name) {
- map<string, ParsedDefinition>::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<string, ParsedDefinition>::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<string, ParsedDefinition>::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<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == MONSTER) {
- return monsters[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Monster");
- }
- } else {
- throw Error("access to undefined Monster " + name);
- }
-}
-
-int Interpreter::GetNumber(const std::string &name) const {
- map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == NUMBER) {
- return numbers[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Number");
- }
- } else {
- throw Error("access to undefined Number " + name);
- }
-}
-
-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);
- }
-}
-
-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()) {
- 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<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == SPRITE) {
- return sprites[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Sprite");
- }
- } else {
- throw Error("access to undefined Sprite " + name);
- }
-}
-
-const char *Interpreter::GetString(const std::string &name) const {
- map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- // 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");
- }
- } else {
- throw Error("access to undefined String " + name);
- }
-}
-
-TargetingMode *Interpreter::GetTargetingMode(const std::string &name) {
- map<string, ParsedDefinition>::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<int> Interpreter::GetVector(const std::string &name) const {
- map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
- if (i != parsedDefinitions.end()) {
- if (i->second.type == VECTOR) {
- return vectors[i->second.index];
- } else {
- throw Error("cannot cast " + i->second.dfn->TypeName() + " to Vector");
- }
- } else {
- throw Error("access to undefined Vector " + name);
+ throw Error("access to undefined object " + name);
}
}
void Interpreter::ReadLiteral(const Definition &dfn) {
switch (dfn.GetLiteral()->GetType()) {
case Literal::ARRAY_VALUES:
- valueArrays.push_back(dfn.GetLiteral()->GetValues());
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, VALUE_ARRAY, valueArrays.size() - 1)));
+ throw Error("named value arrays are not supported, sorry");
break;
case Literal::ARRAY_PROPS:
- propertyListArrays.push_back(dfn.GetLiteral()->GetPropertyLists());
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, PROPERTY_LIST_ARRAY, propertyListArrays.size() - 1)));
+ throw Error("named property list arrays are not supported, sorry");
break;
case Literal::BOOLEAN:
- booleans.push_back(dfn.GetLiteral()->GetBoolean());
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, BOOLEAN, booleans.size() - 1)));
+ {
+ int typeId(TypeDescription::GetTypeId("Boolean"));
+ values[typeId].push_back(new bool(dfn.GetLiteral()->GetBoolean()));
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
+ }
break;
case 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)));
+ {
+ int typeId(TypeDescription::GetTypeId("Color"));
+ values[typeId].push_back(new Color(dfn.GetLiteral()->GetRed(), dfn.GetLiteral()->GetGreen(), dfn.GetLiteral()->GetBlue(), dfn.GetLiteral()->GetAlpha()));
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
+ }
break;
case Literal::NUMBER:
- numbers.push_back(dfn.GetLiteral()->GetNumber());
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, NUMBER, numbers.size() - 1)));
+ {
+ int typeId(TypeDescription::GetTypeId("Number"));
+ values[typeId].push_back(new int(dfn.GetLiteral()->GetNumber()));
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
+ }
break;
case Literal::PATH:
{
+ int typeId(TypeDescription::GetTypeId("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);
+ values[typeId].push_back(str);
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
}
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, PATH, strings.size() - 1)));
break;
case Literal::STRING:
{
+ int typeId(TypeDescription::GetTypeId("String"));
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);
+ values[typeId].push_back(str);
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
}
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, STRING, strings.size() - 1)));
break;
case Literal::VECTOR:
- vectors.push_back(Vector<int>(dfn.GetLiteral()->GetX(), dfn.GetLiteral()->GetY()));
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, VECTOR, vectors.size() - 1)));
+ {
+ int typeId(TypeDescription::GetTypeId("Vector"));
+ values[typeId].push_back(new Vector<int>(dfn.GetLiteral()->GetX(), dfn.GetLiteral()->GetY()));
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
+ }
break;
case Literal::OBJECT:
ReadObject(dfn);
}
}
-Animation *Interpreter::GetAnimation(const Value &v) {
- if (v.IsLiteral()) {
- if (v.GetLiteral().GetTypeName() == "ComplexAnimation") {
- ComplexAnimation *a(new ComplexAnimation);
- ReadComplexAnimation(*a, *v.GetLiteral().GetProperties());
- complexAnimations.push_back(a);
- return a;
- } else {
- SimpleAnimation *a(new SimpleAnimation);
- ReadSimpleAnimation(*a, *v.GetLiteral().GetProperties());
- simpleAnimations.push_back(a);
- return a;
- }
- } else {
- ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetAnimation(v.GetIdentifier());
- }
-}
-
-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) {
+void *Interpreter::GetObject(int typeId, const Value &v) {
if (v.IsLiteral()) {
- return v.GetLiteral().GetBoolean();
- } else {
- ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetBoolean(v.GetIdentifier());
- }
-}
-
-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);
- 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());
- }
-}
-
-Gauge *Interpreter::GetGauge(const Value &v) {
- if (v.IsLiteral()) {
- Gauge *g(new Gauge);
- ReadGauge(*g, *v.GetLiteral().GetProperties());
- return g;
- } else {
- ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetGauge(v.GetIdentifier());
- }
-}
-
-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) {
- 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) {
- 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) {
- if (v.IsLiteral()) {
- return v.GetLiteral().GetNumber();
- } else {
- ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetNumber(v.GetIdentifier());
- }
-}
-
-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 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();
- } else {
- throw Error("cannot reference property lists");
- }
-}
-
-const vector<PropertyList *> &Interpreter::GetPropertyListArray(const Value &v) {
- if (v.IsLiteral()) {
- return v.GetLiteral().GetPropertyLists();
- } else {
- throw Error("cannot reference property list arrays");
- }
-}
-
-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);
- ReadSprite(*s, *v.GetLiteral().GetProperties());
- return s;
- } else {
- ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetSprite(v.GetIdentifier());
- }
-}
-
-const char *Interpreter::GetString(const Value &v) {
- if (v.IsLiteral()) {
- return v.GetLiteral().GetString().c_str();
- } else {
- ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetString(v.GetIdentifier());
- }
-}
-
-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<int> Interpreter::GetVector(const Value &v) {
- if (v.IsLiteral()) {
- return Vector<int>(v.GetLiteral().GetX(), v.GetLiteral().GetY());
+ if (v.GetLiteral().IsObject()) {
+ int typeId(TypeDescription::GetTypeId(v.GetLiteral().GetTypeName()));
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ char *object(new char[td.Size()]);
+ int id(values[typeId].size());
+ values[typeId].push_back(object);
+ ReadObject(typeId, id, object, *v.GetLiteral().GetProperties());
+ return object;
+ } else {
+ int typeId(0), id(0);
+ switch (v.GetLiteral().GetType()) {
+ case Literal::ARRAY_VALUES:
+ throw Error("cannot copy value arrays, sorry");
+ break;
+ case Literal::ARRAY_PROPS:
+ throw Error("cannot copy property list arrays, sorry");
+ break;
+ case Literal::BOOLEAN:
+ {
+ typeId = TypeDescription::GetTypeId("Boolean");
+ id = values[typeId].size();
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ char *object(new char[td.Size()]);
+ values[typeId].push_back(new (object) bool(v.GetLiteral().GetBoolean()));
+ }
+ break;
+ case Literal::COLOR:
+ {
+ typeId = TypeDescription::GetTypeId("Color");
+ id = values[typeId].size();
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ char *object(new char[td.Size()]);
+ values[typeId].push_back(new (object) Color(v.GetLiteral().GetRed(), v.GetLiteral().GetGreen(), v.GetLiteral().GetBlue(), v.GetLiteral().GetAlpha()));
+ }
+ break;
+ case Literal::NUMBER:
+ {
+ typeId = TypeDescription::GetTypeId("Number");
+ id = values[typeId].size();
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ char *object(new char[td.Size()]);
+ values[typeId].push_back(new (object) int(v.GetLiteral().GetNumber()));
+ }
+ break;
+ case Literal::PATH:
+ {
+ typeId = TypeDescription::GetTypeId("Path");
+ id = values[typeId].size();
+ char *str(new char[v.GetLiteral().GetString().size() + 1]);
+ std::memcpy(str, v.GetLiteral().GetString().c_str(), v.GetLiteral().GetString().size());
+ str[v.GetLiteral().GetString().size()] = '\0';
+ values[typeId].push_back(str);
+ }
+ break;
+ case Literal::STRING:
+ {
+ typeId = TypeDescription::GetTypeId("String");
+ id = values[typeId].size();
+ char *str(new char[v.GetLiteral().GetString().size() + 1]);
+ std::memcpy(str, v.GetLiteral().GetString().c_str(), v.GetLiteral().GetString().size());
+ str[v.GetLiteral().GetString().size()] = '\0';
+ values[typeId].push_back(str);
+ }
+ break;
+ case Literal::VECTOR:
+ {
+ typeId = TypeDescription::GetTypeId("Vector");
+ id = values[typeId].size();
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ char *object(new char[td.Size()]);
+ values[typeId].push_back(new (object) Vector<int>(v.GetLiteral().GetX(), v.GetLiteral().GetY()));
+ }
+ break;
+ case Literal::OBJECT:
+ {
+ typeId = TypeDescription::GetTypeId(v.GetLiteral().GetTypeName());
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ id = values[typeId].size();
+ char *object(new char[td.Size()]);
+ ReadObject(typeId, id, object, *v.GetLiteral().GetProperties());
+ }
+ break;
+ }
+ return values[typeId][id];
+ }
} else {
ReadDefinition(source.GetDefinition(v.GetIdentifier()));
- return GetVector(v.GetIdentifier());
- }
-}
-
-const vector<Value *> &Interpreter::GetValueArray(const Value &v) {
- if (v.IsLiteral()) {
- return v.GetLiteral().GetValues();
- } else {
- throw Error("cannot reference value arrays");
+ return GetObject(typeId, v.GetIdentifier());
}
}
void Interpreter::ReadObject(const Definition &dfn) {
- 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);
- 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() == "Gauge") {
- Gauge *gauge(new Gauge);
- int index(gauges.size());
- gauges.push_back(gauge);
- ReadGauge(*gauge, *dfn.GetProperties());
- parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, GAUGE, index)));
- } else if (dfn.TypeName() == "Hero") {
- Hero *hero(new Hero);
- int index(heroes.size());
- 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());
- 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());
- 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());
- }
+ int typeId(TypeDescription::GetTypeId(dfn.TypeName()));
+ const TypeDescription &td(TypeDescription::Get(typeId));
+ int id(values[typeId].size());
+ char *object(new char[td.Size()]);
+ values[typeId].push_back(object);
+ ReadObject(typeId, id, object, *dfn.GetProperties());
+ parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, id)));
}
-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) {
+void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyList &props) {
+ const TypeDescription &td(TypeDescription::Get(typeId));
for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
- if (i->first == "sprite") {
- a.SetSprite(GetSprite(*i->second));
- } else if (i->first == "frametime") {
- a.SetFrameTime(GetNumber(*i->second));
- } else if (i->first == "repeat") {
- a.SetRepeat(GetBoolean(*i->second));
- } else if (i->first == "frames") {
- const vector<PropertyList *> &values(GetPropertyListArray(*i->second));
- for (vector<PropertyList *>::const_iterator i(values.begin()), end(values.end()); i != end; ++i) {
- ComplexAnimation::FrameProp frame;
- ReadComplexAnimationFrame(frame, **i);
- a.AddFrame(frame);
+ const FieldDescription &fd(td.GetField(i->first));
+ const TypeDescription &fieldType(TypeDescription::Get(fd.TypeId()));
+ if (CanLink(*i->second)) {
+ char *dest(object + fd.Offset());
+ if (fd.IsAggregate()) {
+ if (i->second->GetLiteral().GetType() != Literal::ARRAY_PROPS) {
+ throw Error("unsupported aggregate type");
+ }
+ int arraySize(i->second->GetLiteral().ArraySize());
+ char *aggregate(new char[fieldType.Size() * arraySize]);
+ char *iter(aggregate);
+ vector<PropertyList *> list(i->second->GetLiteral().GetPropertyLists());
+ for (vector<PropertyList *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
+ ReadObject(fieldType.TypeId(), -1, iter, **j);
+ }
+ if (fd.IsReferenced()) {
+ std::memcpy(dest, &aggregate, sizeof(char *));
+ dest += sizeof(char *);
+ std::memcpy(dest, &arraySize, sizeof(int));
+ } else {
+ throw Error("aggregate type fields must be referenced");
+ }
+ } else {
+ char *src(reinterpret_cast<char *>(GetObject(fd.TypeId(), *i->second)));
+ if (fd.IsReferenced()) {
+ std::memcpy(dest, &src, sizeof(char *));
+ } else {
+ std::memcpy(dest, src, fieldType.Size());
+ }
}
} else {
- throw Error("unknown ComplexAnimation property: " + i->first);
+ Postpone(typeId, id, fd.Offset(), i->second->GetIdentifier(), fd.TypeId());
}
}
}
-void Interpreter::ReadComplexAnimationFrame(ComplexAnimation::FrameProp &f, const PropertyList &props) {
- for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
- if (i->first == "column") {
- f.col = GetNumber(*i->second);
- } else if (i->first == "row") {
- f.row = GetNumber(*i->second);
- } else if (i->first == "disposition") {
- f.disposition = GetVector(*i->second);
- } else {
- throw Error("unknown ComplexAnimationFrame property: " + i->first);
- }
- }
-}
-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);
- }
- }
+bool Interpreter::CanLink(const Value &v) const {
+ return v.IsLiteral() || source.IsDefined(v.GetIdentifier());
}
-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::Postpone(int type, int id, std::ptrdiff_t offset, const std::string &identifier, int linkedType) {
+ char *str(new char[identifier.size() + 1]);
+ std::memcpy(str, identifier.c_str(), identifier.size());
+ str[identifier.size()] = '\0';
+ postponedDefinitions.push_back(PostponedDefinition(type, id, offset, str, linkedType));
}
-void Interpreter::ReadGauge(Gauge &g, const PropertyList &props) {
- for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
- if (i->first == "image") {
- g.SetSurface(GetImage(*i->second));
- } else if (i->first == "full") {
- g.SetFullOffset(GetVector(*i->second));
- } else if (i->first == "empty") {
- g.SetEmptyOffset(GetVector(*i->second));
- } else if (i->first == "height") {
- g.SetHeight(GetNumber(*i->second));
- } else if (i->first == "start") {
- g.SetStartWidth(GetNumber(*i->second));
- } else if (i->first == "repeat") {
- g.SetRepeatWidth(GetNumber(*i->second));
- } else if (i->first == "end") {
- g.SetEndWidth(GetNumber(*i->second));
- } else {
- throw Error("unknown Gauge property: " + i->first);
- }
- }
-}
-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::CreateTypeDescriptions() {
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("Boolean"));
+ td.SetSize(sizeof(bool));
}
-}
-
-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);
- }
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("Color"));
+ td.SetSize(sizeof(Color));
}
-}
-
-void Interpreter::ReadHero(Hero &h, const PropertyList &props) {
- for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
- if (i->first == "name") {
- h.SetName(GetString(*i->second));
- } else if (i->first == "sprite") {
- h.SetSprite(GetSprite(*i->second));
- } else if (i->first == "level") {
- h.SetLevel(GetNumber(*i->second));
- } else if (i->first == "maxHealth") {
- h.SetMaxHealth(GetNumber(*i->second));
- } else if (i->first == "health") {
- h.SetHealth(GetNumber(*i->second));
- } else if (i->first == "maxMana") {
- h.SetMaxMana(GetNumber(*i->second));
- } else if (i->first == "mana") {
- h.SetMana(GetNumber(*i->second));
- } else if (i->first == "ip") {
- h.SetIP(GetNumber(*i->second));
- } else if (i->first == "stats") {
- battle::Stats stats;
- ReadStats(stats, *GetPropertyList(*i->second));
- h.SetStats(stats);
- } else if (i->first == "attackAnimation") {
- h.SetAttackAnimation(GetAnimation(*i->second));
- } else if (i->first == "spellAnimation") {
- h.SetSpellAnimation(GetAnimation(*i->second));
- } else if (i->first == "meleeAnimation") {
- h.SetMeleeAnimation(GetAnimation(*i->second));
- } else {
- throw Error("unknown Hero property: " + i->first);
- }
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("Image"));
+ td.SetSize(sizeof(SDL_Surface));
}
-}
-
-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") {
- m.SetName(GetString(*i->second));
- } else if (i->first == "sprite") {
- m.SetSprite(GetSprite(*i->second));
- } else if (i->first == "level") {
- m.SetLevel(GetNumber(*i->second));
- } else if (i->first == "maxHealth") {
- m.SetMaxHealth(GetNumber(*i->second));
- } else if (i->first == "health") {
- m.SetHealth(GetNumber(*i->second));
- } else if (i->first == "maxMana") {
- m.SetMaxMana(GetNumber(*i->second));
- } else if (i->first == "mana") {
- m.SetMana(GetNumber(*i->second));
- } else if (i->first == "stats") {
- battle::Stats stats;
- ReadStats(stats, *GetPropertyList(*i->second));
- m.SetStats(stats);
- } else if (i->first == "attackAnimation") {
- m.SetAttackAnimation(GetAnimation(*i->second));
- } else if (i->first == "meleeAnimation") {
- m.SetMeleeAnimation(GetAnimation(*i->second));
- } else {
- throw Error("unknown Monster property: " + i->first);
- }
- }
-}
-
-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") {
- a.SetSprite(GetSprite(*i->second));
- } else if (i->first == "frametime") {
- a.SetFrameTime(GetNumber(*i->second));
- } else if (i->first == "repeat") {
- a.SetRepeat(GetBoolean(*i->second));
- } else if (i->first == "framecount") {
- a.SetNumFrames(GetNumber(*i->second));
- } else if (i->first == "col") {
- a.SetCol(GetNumber(*i->second));
- } else if (i->first == "row") {
- a.SetRow(GetNumber(*i->second));
- } else {
- throw Error("unknown SimpleAnimation property: " + i->first);
- }
- }
-}
-
-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);
- }
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("Number"));
+ td.SetSize(sizeof(int));
}
-}
-
-void Interpreter::ReadSprite(Sprite &s, const PropertyList &props) {
- for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
- if (i->first == "image") {
- s.SetSurface(GetImage(*i->second));
- } else if (i->first == "size") {
- s.SetSize(GetVector(*i->second));
- } else if (i->first == "offset") {
- s.SetOffset(GetVector(*i->second));
- } else {
- throw Error("unknown Sprite property: " + i->first);
- }
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("Path"));
+ td.SetSize(1);
+ td.AddSupertype(TypeDescription::GetTypeId("String"), 0);
}
-}
-
-void Interpreter::ReadStats(Stats &s, const PropertyList &props) {
- for (PropertyList::ConstIterator i(props.Begin()), end(props.End()); i != end; ++i) {
- if (i->first == "atp") {
- s.SetAttack(GetNumber(*i->second));
- } else if (i->first == "dfp") {
- s.SetDefense(GetNumber(*i->second));
- } else if (i->first == "str") {
- s.SetStrength(GetNumber(*i->second));
- } else if (i->first == "agl") {
- s.SetAgility(GetNumber(*i->second));
- } else if (i->first == "int") {
- s.SetIntelligence(GetNumber(*i->second));
- } else if (i->first == "gut") {
- s.SetGut(GetNumber(*i->second));
- } else if (i->first == "mgr") {
- s.SetMagicResistance(GetNumber(*i->second));
- } else {
- throw Error("unknown Stats property: " + i->first);
- }
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("String"));
+ td.SetSize(1);
}
-}
-
-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);
- }
+ {
+ TypeDescription &td(TypeDescription::CreateOrGet("Vector"));
+ td.SetSize(sizeof(Vector<int>));
}
}