]> git.localhorst.tv Git - l2e.git/blobdiff - src/map/Entity.cpp
implemented followers
[l2e.git] / src / map / Entity.cpp
index 01cbe7f619e8b37aaf20ee051c72e038837a27a7..666db7a2d2f656b0104b57dc4fbb886a6cd815f0 100644 (file)
@@ -7,11 +7,90 @@
 
 #include "Entity.h"
 
+using geometry::Vector;
+
 namespace map {
 
 Entity::Entity()
-: sprite(0) {
+: follower(0)
+, animation(0)
+, orientation(ORIENTATION_NORTH)
+, speed(0) {
+       runner.SetFrameShift(1);
+}
+
+
+void Entity::SetOrientation(Orientation o) {
+       orientation = o;
+       UpdateVelocity();
+       runner.SetColOffset(orientation);
+}
+
+void Entity::SetSpeed(float s) {
+       speed = s;
+       UpdateVelocity();
+}
+
+void Entity::StartAnimation(app::Application &ctrl) {
+       runner.Start(ctrl);
+}
+
+void Entity::StartAnimation(app::State &ctrl) {
+       runner.Start(ctrl);
+}
+
+void Entity::StopAnimation() {
+       runner.Stop();
+}
+
+void Entity::AddFollower(Entity *f) {
+       if (follower) {
+               follower->AddFollower(f);
+       } else {
+               follower = f;
+       }
+}
+
+void Entity::RemoveFollower(Entity *f) {
+       if (follower == f) {
+               follower = follower->follower;
+       } else if (follower) {
+               follower->RemoveFollower(f);
+       }
+}
+
+void Entity::SetAnimation(const graphics::Animation *a) {
+       animation = a;
+       runner.ChangeAnimation(animation);
+}
+
+
+void Entity::UpdateVelocity() {
+       if (speed == 0.0f) {
+               velocity = Vector<float>();
+               return;
+       }
+       switch (orientation) {
+               case ORIENTATION_NORTH:
+                       velocity = Vector<float>(0.0f, -speed);
+                       break;
+               case ORIENTATION_EAST:
+                       velocity = Vector<float>(speed, 0.0f);
+                       break;
+               case ORIENTATION_SOUTH:
+                       velocity = Vector<float>(0.0f, speed);
+                       break;
+               case ORIENTATION_WEST:
+                       velocity = Vector<float>(-speed, 0.0f);
+                       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);
 }
 
 
@@ -20,11 +99,12 @@ void Entity::Update(float deltaT) {
 }
 
 
-void Entity::Render(SDL_Surface *dest, const geometry::Vector<int> &offset) const {
-       if (animation.Running()) {
-               animation.DrawCenterBottom(dest, offset + position);
+void Entity::Render(SDL_Surface *dest, const Vector<int> &offset) const {
+       // TODO: configurable sprite offsets
+       if (runner.Running()) {
+               runner.Draw(dest, offset + position + spriteOffset);
        } else {
-               sprite->DrawCenterBottom(dest, offset + position);
+               animation->GetSprite()->Draw(dest, offset + position + spriteOffset, orientation);
        }
 }