4 * Created on: Sep 29, 2012
10 #include "../loader/TypeDescription.h"
12 using geometry::Vector;
13 using loader::FieldDescription;
14 using loader::TypeDescription;
24 , orientation(ORIENTATION_NORTH)
27 runner.SetFrameShift(1);
31 void Entity::SetOrientation(Orientation o) {
34 runner.SetColOffset(orientation);
37 void Entity::SetSpeed(float s) {
42 void Entity::StartAnimation(app::Application &ctrl) {
46 void Entity::StartAnimation(app::State &ctrl) {
50 void Entity::StopAnimation() {
54 void Entity::AddFollower(Entity *f) {
56 follower->AddFollower(f);
62 void Entity::RemoveFollower(Entity *f) {
64 follower = follower->follower;
65 } else if (follower) {
66 follower->RemoveFollower(f);
70 void Entity::SetAnimation(const graphics::Animation *a) {
72 runner.ChangeAnimation(animation);
76 void Entity::UpdateVelocity() {
78 velocity = Vector<float>();
81 switch (orientation) {
82 case ORIENTATION_NORTH:
83 velocity = Vector<float>(0.0f, -speed);
85 case ORIENTATION_EAST:
86 velocity = Vector<float>(speed, 0.0f);
88 case ORIENTATION_SOUTH:
89 velocity = Vector<float>(0.0f, speed);
91 case ORIENTATION_WEST:
92 velocity = Vector<float>(-speed, 0.0f);
98 bool Entity::TileLock(const geometry::Vector<int> &tileSize) const {
99 // TODO: change position to point to the top-left corner of a tile
100 Vector<int> tilePosition(position);
101 return (tilePosition.X() % tileSize.X() == 0) && (tilePosition.Y() % tileSize.Y() == 0);
105 void Entity::Update(float deltaT) {
106 position += velocity * deltaT;
110 void Entity::Render(SDL_Surface *dest, const Vector<int> &offset) const {
111 // TODO: configurable sprite offsets
112 if (runner.Running()) {
113 runner.Draw(dest, offset + position + spriteOffset);
115 animation->GetSprite()->Draw(dest, offset + position + spriteOffset, orientation);
120 void Entity::CreateTypeDescription() {
123 int animationId(TypeDescription::GetTypeId("Animation"));
124 int monsterId(TypeDescription::GetTypeId("Monster"));
125 int partyLayoutId(TypeDescription::GetTypeId("PartyLayout"));
126 int vectorId(TypeDescription::GetTypeId("Vector"));
128 TypeDescription &td(TypeDescription::CreateOrGet("Entity"));
129 td.SetConstructor(&Construct);
131 td.SetSize(sizeof(Entity));
133 td.AddField("animation", FieldDescription(((char *)&e.animation) - ((char *)&e), animationId).SetReferenced());
134 td.AddField("partyLayout", FieldDescription(((char *)&e.partyLayout) - ((char *)&e), partyLayoutId).SetReferenced());
135 td.AddField("monsters", FieldDescription(((char *)&e.monsters) - ((char *)&e), monsterId).SetReferenced().SetAggregate());
136 td.AddField("spriteOffset", FieldDescription(((char *)&e.spriteOffset) - ((char *)&e), vectorId));
139 void Entity::Construct(void *data) {
143 void Entity::Load(void *data) {
144 Entity *entity(reinterpret_cast<Entity *>(data));
145 entity->runner.ChangeAnimation(entity->animation);