]> git.localhorst.tv Git - l2e.git/blobdiff - src/map/Entity.cpp
store complete entity in hero
[l2e.git] / src / map / Entity.cpp
index 08be97b96c93208ab95774ed4168377e02cc007d..e1f970bea644103be655e27a094ffa478c4a3169 100644 (file)
@@ -7,7 +7,11 @@
 
 #include "Entity.h"
 
+#include "../loader/TypeDescription.h"
+
 using geometry::Vector;
+using loader::FieldDescription;
+using loader::TypeDescription;
 
 namespace map {
 
@@ -15,7 +19,8 @@ Entity::Entity()
 : follower(0)
 , animation(0)
 , orientation(ORIENTATION_NORTH)
-, speed(0) {
+, speed(0)
+, flags(0) {
        runner.SetFrameShift(1);
 }
 
@@ -87,11 +92,10 @@ void Entity::UpdateVelocity() {
 }
 
 
-bool Entity::TileLock(int width, int height) const {
-       Vector<int> tilePosition(
-                       position.X() - (width / 2),
-                       position.Y());
-       return (tilePosition.X() % width == 0) && (tilePosition.Y() % height == 0);
+bool Entity::TileLock(const geometry::Vector<int> &tileSize) const {
+       // TODO: change position to point to the top-left corner of a tile
+       Vector<int> tilePosition(position);
+       return (tilePosition.X() % tileSize.X() == 0) && (tilePosition.Y() % tileSize.Y() == 0);
 }
 
 
@@ -103,10 +107,35 @@ void Entity::Update(float deltaT) {
 void Entity::Render(SDL_Surface *dest, const Vector<int> &offset) const {
        // TODO: configurable sprite offsets
        if (runner.Running()) {
-               runner.DrawCenter(dest, offset + position);
+               runner.Draw(dest, offset + position + spriteOffset);
        } else {
-               animation->GetSprite()->DrawCenter(dest, offset + position, orientation);
+               animation->GetSprite()->Draw(dest, offset + position + spriteOffset, orientation);
        }
 }
 
+
+void Entity::CreateTypeDescription() {
+       Entity e;
+
+       int animationId(TypeDescription::GetTypeId("Animation"));
+       int vectorId(TypeDescription::GetTypeId("Vector"));
+
+       TypeDescription &td(TypeDescription::CreateOrGet("Entity"));
+       td.SetConstructor(&Construct);
+       td.SetLoader(&Load);
+       td.SetSize(sizeof(Entity));
+
+       td.AddField("animation", FieldDescription(((char *)&e.animation) - ((char *)&e), animationId, true));
+       td.AddField("spriteOffset", FieldDescription(((char *)&e.spriteOffset) - ((char *)&e), vectorId, false));
+}
+
+void Entity::Construct(void *data) {
+       new (data) Entity;
+}
+
+void Entity::Load(void *data) {
+       Entity *entity(reinterpret_cast<Entity *>(data));
+       entity->runner.ChangeAnimation(entity->animation);
+}
+
 }