Made trampolines less likely to interfere with level design:
[supertux.git] / src / worldmap / worldmap.cpp
index ba81b1e..b34e881 100644 (file)
@@ -524,23 +524,23 @@ WorldMap::update(float delta)
     enter_level = true;
   if(main_controller->pressed(Controller::PAUSE_MENU))
     on_escape_press();
-  
+  // check for teleporters
+  Teleporter* teleporter = at_teleporter(tux->get_tile_pos());
+  if (teleporter && (teleporter->automatic || (enter_level && (!tux->is_moving())))) {
+    enter_level = false;
+    if (teleporter->worldmap != "") {
+      change(teleporter->worldmap, teleporter->spawnpoint);
+    } else {
+      // TODO: an animation, camera scrolling or a fading would be a nice touch
+      sound_manager->play("sounds/warp.wav");
+      tux->back_direction = D_NONE;
+      move_to_spawnpoint(teleporter->spawnpoint);
+    }
+  }
+
   if (enter_level && !tux->is_moving())
     {
-      /* Check special tile action */
-      SpecialTile* special_tile = at_special_tile();
-      if(special_tile)
-        {
-        if (special_tile->teleport_dest != Vector(-1,-1))
-          {
-          // TODO: an animation, camera scrolling or a fading would be a nice touch
-          sound_manager->play("sounds/warp.wav");
-          tux->back_direction = D_NONE;
-          tux->set_tile_pos(special_tile->teleport_dest);
-          SDL_Delay(1000);
-          }
-        }
-
       /* Check level action */
       LevelTile* level = at_level();
       if (!level) {
@@ -690,6 +690,14 @@ WorldMap::draw_status(DrawingContext& context)
         break;
       }
     }
+
+    // display teleporter messages
+    Teleporter* teleporter = at_teleporter(tux->get_tile_pos());
+    if (teleporter && (teleporter->message != "")) {
+      Vector pos = Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT - white_text->get_height() - 30);
+      context.draw_text(white_text, teleporter->message, pos, CENTER_ALLIGN, LAYER_FOREGROUND1);
+    }
+
   }
   
   /* Display a passive message in the map, if needed */
@@ -710,8 +718,13 @@ WorldMap::setup()
   current_ = this;
   load_state();
 
-  // if force_spawnpoint was set, move Tux there
-  if (force_spawnpoint != "") move_to_spawnpoint(force_spawnpoint);
+  // if force_spawnpoint was set, move Tux there, then clear force_spawnpoint
+  if (force_spawnpoint != "") {
+    move_to_spawnpoint(force_spawnpoint);
+    force_spawnpoint = "";
+  }
+
+  tux->setup();
 
   // register worldmap_table as worldmap in scripting
   using namespace Scripting;