#include "ParsedSource.h"
#include "../battle/Hero.h"
#include "../battle/Monster.h"
+#include "../battle/PartyLayout.h"
#include "../graphics/ComplexAnimation.h"
#include "../graphics/SimpleAnimation.h"
#include "../graphics/Sprite.h"
using battle::Hero;
using battle::Monster;
+using battle::PartyLayout;
using battle::Stats;
using graphics::Animation;
using graphics::ComplexAnimation;
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;
}
}
}
+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);
+ }
+}
+
Sprite *Interpreter::GetSprite(const std::string &name) {
map<string, ParsedDefinition>::const_iterator i(parsedDefinitions.find(name));
if (i != parsedDefinitions.end()) {
}
}
+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 PropertyList *Interpreter::GetPropertyList(const Value &v) {
if (v.IsLiteral()) {
return v.GetLiteral().GetProperties();
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());
}
}
+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") {
namespace battle {
class Hero;
class Monster;
+ class PartyLayout;
class Stats;
}
battle::Hero *GetHero(const std::string &name);
battle::Monster *GetMonster(const std::string &name);
int GetNumber(const std::string &name) const;
+ battle::PartyLayout *GetPartyLayout(const std::string &name);
graphics::Sprite *GetSprite(const std::string &name);
const char *GetString(const std::string &name) const;
geometry::Vector<int> GetVector(const std::string &name) const;
const std::vector<SDL_Surface *> &Images() const { return images; }
const std::vector<battle::Monster *> &Monsters() const { return monsters; }
const std::vector<int> &Numbers() const { return numbers; }
+ const std::vector<battle::PartyLayout *> &PartyLayouts() const { return partyLayouts; }
const std::vector<graphics::SimpleAnimation *> &SimpleAnimations() const { return simpleAnimations; }
const std::vector<graphics::Sprite *> &Sprites() const { return sprites; }
const std::vector<const char *> &Strings() const { return strings; }
bool GetBoolean(const Value &);
SDL_Surface *GetImage(const Value &);
int GetNumber(const Value &);
+ battle::PartyLayout *GetPartyLayout(const Value &);
const PropertyList *GetPropertyList(const Value &);
const std::vector<PropertyList *> &GetPropertyListArray(const Value &);
graphics::Sprite *GetSprite(const Value &);
void ReadComplexAnimationFrame(graphics::ComplexAnimation::FrameProp &, const PropertyList &);
void ReadHero(battle::Hero &, const PropertyList &);
void ReadMonster(battle::Monster &, const PropertyList &);
+ void ReadPartyLayout(battle::PartyLayout &, const PropertyList &);
void ReadSimpleAnimation(graphics::SimpleAnimation &, const PropertyList &);
void ReadSprite(graphics::Sprite &, const PropertyList &);
void ReadStats(battle::Stats &, const PropertyList &);
IMAGE,
MONSTER,
NUMBER,
+ PARTY_LAYOUT,
PROPERTY_LIST_ARRAY,
SIMPLE_ANIMATION,
SPRITE,
std::vector<SDL_Surface *> images;
std::vector<battle::Monster *> monsters;
std::vector<int> numbers;
+ std::vector<battle::PartyLayout *> partyLayouts;
std::vector<PropertyList *> propertyLists;
std::vector<std::vector<PropertyList *> > propertyListArrays;
std::vector<graphics::SimpleAnimation *> simpleAnimations;
// temporary test data
SDL_Surface *bg(IMG_Load("test-data/battle-bg.png"));
- PartyLayout monstersLayout;
- monstersLayout.AddPosition(Vector<Uint8>(88, 88));
- monstersLayout.AddPosition(Vector<Uint8>(128, 88));
- monstersLayout.AddPosition(Vector<Uint8>(168, 88));
- monstersLayout.AddPosition(Vector<Uint8>(208, 88));
- PartyLayout heroesLayout;
- heroesLayout.AddPosition(Vector<Uint8>(48, 136));
- heroesLayout.AddPosition(Vector<Uint8>(128, 136));
- heroesLayout.AddPosition(Vector<Uint8>(80, 152));
- heroesLayout.AddPosition(Vector<Uint8>(160, 152));
+ PartyLayout monstersLayout(*intp.GetPartyLayout("monstersLayout"));
+ PartyLayout heroesLayout(*intp.GetPartyLayout("heroesLayout"));
Monster monster(*intp.GetMonster("lizard"));
Hero maxim(*intp.GetHero("maxim"));
Number fourFramesTime 132
Number fiveFramesTime 165 // darn, i really need to implement expressions
+export PartyLayout monstersLayout {
+ positions: [
+ < 88, 88>,
+ <128, 88>,
+ <168, 88>,
+ <208, 88>
+ ]
+}
+export PartyLayout heroesLayout {
+ positions: [
+ < 48,136>,
+ <128,136>,
+ < 80,152>,
+ <160,152>
+ ]
+}
+
Sprite lizardSprite {
// using pathes relative to project root until path resolution is implemented
image: "test-data/monster.png",