- 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") {
- 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()) {
+ int arraySize(i->second->GetLiteral().ArraySize());
+ char *aggregate(new char[fieldType.Size() * arraySize]);
+ char *iter(aggregate);
+ if (i->second->GetLiteral().GetType() == Literal::ARRAY_PROPS) {
+ const vector<PropertyList *> &list(i->second->GetLiteral().GetPropertyLists());
+ for (vector<PropertyList *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
+ fieldType.Construct(iter);
+ ReadObject(fieldType.TypeId(), -1, iter, **j);
+ }
+ } else {
+ const vector<Value *> &list(i->second->GetLiteral().GetValues());
+ for (vector<Value *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
+ fieldType.Construct(iter);
+ ReadLiteral(fieldType.TypeId(), -1, iter, (*j)->GetLiteral());
+ }
+ }
+ 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.TypeId() == TypeDescription::GetTypeId("Image")) {
+ src = reinterpret_cast<char *>(GetImage(src));
+ }
+ if (fd.IsReferenced()) {
+ std::memcpy(dest, &src, sizeof(char *));
+ } else {
+ std::memcpy(dest, src, fieldType.Size());
+ }