]> git.localhorst.tv Git - l2e.git/blobdiff - src/map/Entity.cpp
removed outdated TODOs from map::Entity
[l2e.git] / src / map / Entity.cpp
index e1f970bea644103be655e27a094ffa478c4a3169..d239844ea2ef420bd76fd5e47a57dbe7082359e0 100644 (file)
@@ -1,16 +1,20 @@
-/*
- * Entity.cpp
- *
- *  Created on: Sep 29, 2012
- *      Author: holy
- */
-
 #include "Entity.h"
 
+#include "../battle/Monster.h"
+#include "../battle/PartyLayout.h"
+#include "../graphics/Animation.h"
+#include "../graphics/Sprite.h"
+#include "../loader/Interpreter.h"
 #include "../loader/TypeDescription.h"
 
-using geometry::Vector;
+using battle::Monster;
+using battle::PartyLayout;
+using graphics::Animation;
+using graphics::Sprite;
+using math::Fixed;
+using math::Vector;
 using loader::FieldDescription;
+using loader::Interpreter;
 using loader::TypeDescription;
 
 namespace map {
@@ -18,6 +22,10 @@ namespace map {
 Entity::Entity()
 : follower(0)
 , animation(0)
+, sprite(0)
+, partyLayout(0)
+, monsters(0)
+, numMonsters(0)
 , orientation(ORIENTATION_NORTH)
 , speed(0)
 , flags(0) {
@@ -28,14 +36,17 @@ Entity::Entity()
 void Entity::SetOrientation(Orientation o) {
        orientation = o;
        UpdateVelocity();
-       runner.SetColOffset(orientation);
+       if (CanTurn()) {
+               runner.SetColOffset(orientation);
+       }
 }
 
-void Entity::SetSpeed(float s) {
+void Entity::SetSpeed(Fixed<8> s) {
        speed = s;
        UpdateVelocity();
 }
 
+
 void Entity::StartAnimation(app::Application &ctrl) {
        runner.Start(ctrl);
 }
@@ -48,6 +59,20 @@ void Entity::StopAnimation() {
        runner.Stop();
 }
 
+
+void Entity::SetHandsFree() {
+       runner.SetRowOffset(0);
+}
+
+void Entity::SetCarrying() {
+       runner.SetRowOffset(2);
+}
+
+void Entity::SetPushing() {
+       runner.SetRowOffset(4);
+}
+
+
 void Entity::AddFollower(Entity *f) {
        if (follower) {
                follower->AddFollower(f);
@@ -67,49 +92,50 @@ void Entity::RemoveFollower(Entity *f) {
 void Entity::SetAnimation(const graphics::Animation *a) {
        animation = a;
        runner.ChangeAnimation(animation);
+       if (!sprite) {
+               sprite = animation->GetSprite();
+       }
 }
 
 
 void Entity::UpdateVelocity() {
-       if (speed == 0.0f) {
-               velocity = Vector<float>();
+       if (speed == 0) {
+               velocity = Vector<Fixed<8> >();
                return;
        }
        switch (orientation) {
                case ORIENTATION_NORTH:
-                       velocity = Vector<float>(0.0f, -speed);
+                       velocity = Vector<Fixed<8> >(0, -speed);
                        break;
                case ORIENTATION_EAST:
-                       velocity = Vector<float>(speed, 0.0f);
+                       velocity = Vector<Fixed<8> >(speed, 0);
                        break;
                case ORIENTATION_SOUTH:
-                       velocity = Vector<float>(0.0f, speed);
+                       velocity = Vector<Fixed<8> >(0, speed);
                        break;
                case ORIENTATION_WEST:
-                       velocity = Vector<float>(-speed, 0.0f);
+                       velocity = Vector<Fixed<8> >(-speed, 0);
                        break;
        }
 }
 
 
-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);
+bool Entity::TileLock(const math::Vector<int> &tileSize) const {
+       Vector<int> tilePosition(ToInt(position));
+       return tilePosition % tileSize == Vector<int>();
 }
 
 
-void Entity::Update(float deltaT) {
+void Entity::Update(Uint32 deltaT) {
        position += velocity * deltaT;
 }
 
 
 void Entity::Render(SDL_Surface *dest, const Vector<int> &offset) const {
-       // TODO: configurable sprite offsets
        if (runner.Running()) {
-               runner.Draw(dest, offset + position + spriteOffset);
+               runner.Draw(dest, offset + ToInt(position) + spriteOffset);
        } else {
-               animation->GetSprite()->Draw(dest, offset + position + spriteOffset, orientation);
+               sprite->Draw(dest, offset + ToInt(position) + spriteOffset, CanTurn() ? orientation : 0);
        }
 }
 
@@ -117,16 +143,18 @@ void Entity::Render(SDL_Surface *dest, const Vector<int> &offset) const {
 void Entity::CreateTypeDescription() {
        Entity e;
 
-       int animationId(TypeDescription::GetTypeId("Animation"));
-       int vectorId(TypeDescription::GetTypeId("Vector"));
-
-       TypeDescription &td(TypeDescription::CreateOrGet("Entity"));
+       TypeDescription &td(TypeDescription::Create(TYPE_ID, "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));
+       td.AddField("animation", FieldDescription(((char *)&e.animation) - ((char *)&e), Animation::TYPE_ID).SetReferenced());
+       td.AddField("sprite", FieldDescription(((char *)&e.sprite) - ((char *)&e), Sprite::TYPE_ID).SetReferenced());
+       td.AddField("partyLayout", FieldDescription(((char *)&e.partyLayout) - ((char *)&e), PartyLayout::TYPE_ID).SetReferenced());
+       td.AddField("monsters", FieldDescription(((char *)&e.monsters) - ((char *)&e), Monster::TYPE_ID).SetReferenced().SetAggregate());
+       td.AddField("spriteOffset", FieldDescription(((char *)&e.spriteOffset) - ((char *)&e), Interpreter::VECTOR_ID));
+       td.AddField("position", FieldDescription(((char *)&e.tilePosition) - ((char *)&e), Interpreter::VECTOR_ID));
+       td.AddField("flags", FieldDescription(((char *)&e.flags) - ((char *)&e), Interpreter::NUMBER_ID));
 }
 
 void Entity::Construct(void *data) {
@@ -135,7 +163,12 @@ void Entity::Construct(void *data) {
 
 void Entity::Load(void *data) {
        Entity *entity(reinterpret_cast<Entity *>(data));
-       entity->runner.ChangeAnimation(entity->animation);
+       if (entity->animation) {
+               entity->runner.ChangeAnimation(entity->animation);
+               if (!entity->sprite) {
+                       entity->sprite = entity->animation->GetSprite();
+               }
+       }
 }
 
 }