a first implementation of doors to switch between sectors
[supertux.git] / src / player.cpp
index df8571b..f9a6032 100644 (file)
 #include "scene.h"
 #include "tile.h"
 #include "sprite.h"
+#include "sector.h"
+#include "tilemap.h"
+#include "camera.h"
 #include "gameobjs.h"
+#include "interactive_object.h"
 #include "screen/screen.h"
 
 // behavior definitions:
@@ -54,7 +58,8 @@ PlayerKeymap keymap;
 
 PlayerKeymap::PlayerKeymap()
 {
-  keymap.jump  = SDLK_UP;
+  keymap.jump  = SDLK_SPACE;
+  keymap.activate = SDLK_UP;
   keymap.duck  = SDLK_DOWN;
   keymap.left  = SDLK_LEFT;
   keymap.right = SDLK_RIGHT;
@@ -70,6 +75,7 @@ void player_input_init(player_input_type* pplayer_input)
   pplayer_input->right = UP;
   pplayer_input->up = UP;
   pplayer_input->old_up = UP;
+  pplayer_input->activate = UP;
 }
 
 Player::Player()
@@ -153,6 +159,23 @@ Player::key_event(SDLKey key, int state)
       input.fire = state;
       return true;
     }
+  else if(key == keymap.activate)
+    {
+      input.activate = state;
+
+      if(state == DOWN) {
+        /** check for interactive objects */
+        for(Sector::InteractiveObjects::iterator i 
+            = Sector::current()->interactive_objects.begin();
+            i != Sector::current()->interactive_objects.end(); ++i) {
+          if(rectcollision(base, (*i)->get_area())) {
+            (*i)->interaction(INTERACTION_ACTIVATE);
+          }
+        }
+      }
+      
+      return true;
+    }
   else
     return false;
 }
@@ -261,26 +284,30 @@ Player::action(float elapsed_time)
           if (isbrick(base.x, base.y) ||
               isfullbox(base.x, base.y))
             {
-              World::current()->trygrabdistro(base.x, base.y - 32, BOUNCE);
-              World::current()->trybumpbadguy(base.x, base.y - 64);
+              Sector::current()->trygrabdistro(
+                  Vector(base.x, base.y - 32), BOUNCE);
+              Sector::current()->trybumpbadguy(Vector(base.x, base.y - 64));
 
-              World::current()->trybreakbrick(base.x, base.y, size == SMALL);
+              Sector::current()->trybreakbrick(
+                  Vector(base.x, base.y), size == SMALL);
 
               bumpbrick(base.x, base.y);
-              World::current()->tryemptybox(base.x, base.y, RIGHT);
+              Sector::current()->tryemptybox(Vector(base.x, base.y), RIGHT);
             }
 
           if (isbrick(base.x+ 31, base.y) ||
               isfullbox(base.x+ 31, base.y))
             {
-              World::current()->trygrabdistro(base.x+ 31, base.y - 32,BOUNCE);
-              World::current()->trybumpbadguy(base.x+ 31, base.y - 64);
+              Sector::current()->trygrabdistro(
+                  Vector(base.x+ 31, base.y - 32), BOUNCE);
+              Sector::current()->trybumpbadguy(Vector(base.x+ 31, base.y - 64));
 
               if(size == BIG)
-                World::current()->trybreakbrick(base.x+ 31, base.y, size == SMALL);
+                Sector::current()->trybreakbrick(
+                    Vector(base.x+ 31, base.y), size == SMALL);
 
               bumpbrick(base.x+ 31, base.y);
-              World::current()->tryemptybox(base.x+ 31, base.y, LEFT);
+              Sector::current()->tryemptybox(Vector(base.x+ 31, base.y), LEFT);
             }
         }
 
@@ -480,16 +507,17 @@ Player::handle_vertical_input()
     butt_jump = false;
 
     // Break bricks beneath Tux
-    if(World::current()->trybreakbrick(base.x + 1, base.y + base.height, false)
-        || World::current()->trybreakbrick(
-           base.x + base.width - 1, base.y + base.height, false))
+    if(Sector::current()->trybreakbrick(
+          Vector(base.x + 1, base.y + base.height), false)
+        || Sector::current()->trybreakbrick(
+           Vector(base.x + base.width - 1, base.y + base.height), false))
     {
       physic.set_velocity_y(2);
       butt_jump = true;
     }
 
     // Kill nearby badguys
-    std::vector<GameObject*> gameobjects = World::current()->gameobjects;
+    std::vector<GameObject*> gameobjects = Sector::current()->gameobjects;
     for (std::vector<GameObject*>::iterator i = gameobjects.begin();
          i != gameobjects.end();
          i++)
@@ -538,7 +566,7 @@ Player::handle_input()
   /* Shoot! */
   if (input.fire == DOWN && input.old_fire == UP && got_power != NONE_POWER)
     {
-      if(World::current()->add_bullet(Vector(base.x, base.y + (base.height/2)),
+      if(Sector::current()->add_bullet(Vector(base.x, base.y + (base.height/2)),
           physic.get_velocity_x(), dir))
         shooting_timer.start(SHOOTING_TIME);
       input.old_fire = DOWN;
@@ -615,16 +643,20 @@ Player::grabdistros()
   /* Grab distros: */
   if (!dying)
     {
-      World::current()->trygrabdistro(base.x, base.y, NO_BOUNCE);
-      World::current()->trygrabdistro(base.x+ 31, base.y, NO_BOUNCE);
+      Sector::current()->trygrabdistro(Vector(base.x, base.y), NO_BOUNCE);
+      Sector::current()->trygrabdistro(Vector(base.x+ 31, base.y), NO_BOUNCE);
 
-      World::current()->trygrabdistro(base.x, base.y + base.height, NO_BOUNCE);
-      World::current()->trygrabdistro(base.x+ 31, base.y + base.height, NO_BOUNCE);
+      Sector::current()->trygrabdistro(
+          Vector(base.x, base.y + base.height), NO_BOUNCE);
+      Sector::current()->trygrabdistro(
+          Vector(base.x+ 31, base.y + base.height), NO_BOUNCE);
 
       if(size == BIG)
         {
-          World::current()->trygrabdistro(base.x, base.y + base.height / 2, NO_BOUNCE);
-          World::current()->trygrabdistro(base.x+ 31, base.y + base.height / 2, NO_BOUNCE);
+          Sector::current()->trygrabdistro(
+              Vector(base.x, base.y + base.height / 2), NO_BOUNCE);
+          Sector::current()->trygrabdistro(
+              Vector(base.x+ 31, base.y + base.height / 2), NO_BOUNCE);
         }
 
     }
@@ -739,12 +771,9 @@ Player::draw(DrawingContext& context)
       largetux_star->draw(context, pos, LAYER_OBJECTS + 2);
   }
  
-#if 0 // TODO
   if (debug_mode)
-    fillrect(base.x - viewport.get_translation().x,
-        base.y - viewport.get_translation().y, 
-             base.width, base.height, 75,75,75, 150);
-#endif
+    context.draw_filled_rect(Vector(base.x, base.y),
+        Vector(base.width, base.height), Color(75,75,75, 150), LAYER_OBJECTS+1);
 }
 
 void
@@ -924,7 +953,7 @@ Player::move(const Vector& vector)
 }
 
 void
-Player::check_bounds(DrawingContext& viewport)
+Player::check_bounds(Camera* camera)
 {
   /* Keep tux in bounds: */
   if (base.x < 0)
@@ -934,7 +963,7 @@ Player::check_bounds(DrawingContext& viewport)
     }
 
   /* Keep in-bounds, vertically: */
-  if (base.y > World::current()->get_level()->height * /*TILE_HEIGHT*/ 32)
+  if (base.y > Sector::current()->solids->get_height() * 32)
     {
       kill(KILL);
       return;
@@ -942,12 +971,12 @@ Player::check_bounds(DrawingContext& viewport)
 
   bool adjust = false;
   // can happen if back scrolling is disabled
-  if(base.x < viewport.get_translation().x) {
-    base.x = viewport.get_translation().x;
+  if(base.x < camera->get_translation().x) {
+    base.x = camera->get_translation().x;
     adjust = true;
   }
-  if(base.x >= viewport.get_translation().x + screen->w - base.width) {
-    base.x = viewport.get_translation().x + screen->w - base.width;
+  if(base.x >= camera->get_translation().x + screen->w - base.width) {
+    base.x = camera->get_translation().x + screen->w - base.width;
     adjust = true;
   }
 
@@ -960,5 +989,3 @@ Player::check_bounds(DrawingContext& viewport)
   }
 }
 
-// EOF //
-