adding torch sprite for level entry
[supertux.git] / src / textscroller.cpp
index 9f7a5dd..d76342a 100644 (file)
 //  along with this program; if not, write to the Free Software
 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //  02111-1307, USA.
-
 #include <config.h>
 
-#include "textscroller.h"
+#include "textscroller.hpp"
 
 #include <stdexcept>
-#include "resources.h"
-#include "video/font.h"
-#include "video/drawing_context.h"
-#include "app/globals.h"
-#include "lisp/parser.h"
-#include "lisp/lisp.h"
-#include "main.h"
-#include "control/joystickkeyboardcontroller.h"
+#include "resources.hpp"
+#include "video/font.hpp"
+#include "video/drawing_context.hpp"
+#include "lisp/parser.hpp"
+#include "lisp/lisp.hpp"
+#include "audio/sound_manager.hpp"
+#include "main.hpp"
+#include "control/joystickkeyboardcontroller.hpp"
 
 static const float DEFAULT_SPEED = .02;
 static const float SCROLL = 60;
@@ -55,7 +54,7 @@ static void split_text(const std::string& text, std::vector<std::string>& lines)
   }
 }
 
-void display_text_file(const std::string& file)
+void display_text_file(const std::string& filename)
 {
   const Font* heading_font = white_big_text;
   const Font* normal_font = white_text;
@@ -67,8 +66,8 @@ void display_text_file(const std::string& file)
   std::string text;
   std::string background_file;
   std::vector<std::string> lines;
+  std::map<std::string, Surface*> images;
 
-  std::string filename = datadir + "/" + file;
   lisp::Parser parser;
   try {
     std::auto_ptr<lisp::Lisp> root (parser.parse(filename));
@@ -92,9 +91,20 @@ void display_text_file(const std::string& file)
   // Split text string lines into a vector
   split_text(text, lines);
 
+  for(size_t i = 0; i < lines.size(); ++i) {
+    const std::string& line = lines[i];
+    if(line.size() == 0)
+      continue;
+    if(line[0] == '!') {
+      std::string imagename = line.substr(1, line.size()-1);
+      std::cout << "Imagename: " << imagename << "\n";
+      images.insert(std::make_pair(imagename, new Surface(imagename, true)));
+    }
+  }
+
   // load background image
-  Surface* background = new Surface(
-      get_resource_filename("images/background/" + background_file), false);
+  Surface* background 
+    = new Surface("images/background/" + background_file, false);
 
   bool done = false;
   float scroll = 0;
@@ -140,6 +150,7 @@ void display_text_file(const std::string& file)
       }
       
       const Font* font = 0;
+      const Surface* image = 0;
       bool center = true;
       switch(line[0])
       {
@@ -148,29 +159,42 @@ void display_text_file(const std::string& file)
         case '-': font = heading_font; break;
         case '*': font = reference_font; break;
         case '#': font = normal_font; center = false; break;
+        case '!': {
+            std::string imagename = line.substr(1, line.size()-1);
+            image = images[imagename];
+            break;
+        }
         default:
           std::cerr << "Warning: text contains an unformated line.\n";
           font = normal_font;
           center = false;
           break;
       }
-      
-      if(center) {
-        context.draw_text(font,
-                          line.substr(1, line.size()-1),
-                          Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT + y - scroll),
-                          CENTER_ALLIGN, LAYER_FOREGROUND1);
-      } else {
-        context.draw_text(font,
-                          line.substr(1, line.size()-1),
-                          Vector(left_border, SCREEN_HEIGHT + y - scroll),
-                          LEFT_ALLIGN, LAYER_FOREGROUND1);
+     
+      if(font != 0) {
+        if(center) {
+          context.draw_text(font,
+              line.substr(1, line.size()-1),
+              Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT + y - scroll),
+              CENTER_ALLIGN, LAYER_FOREGROUND1);
+        } else {
+          context.draw_text(font,
+              line.substr(1, line.size()-1),
+              Vector(left_border, SCREEN_HEIGHT + y - scroll),
+              LEFT_ALLIGN, LAYER_FOREGROUND1);
+        }
+        y += font->get_height() + ITEMS_SPACE;
+      }
+      if(image != 0) {
+        context.draw_surface(image,
+            Vector( (SCREEN_WIDTH - image->w) / 2,
+                    SCREEN_HEIGHT + y - scroll), 255);
+        y += image->h + ITEMS_SPACE;
       }
-      
-      y += font->get_height() + ITEMS_SPACE;
     }
     
     context.do_drawing();
+    sound_manager->update();
     
     if(SCREEN_HEIGHT+y-scroll < 0 && 20+SCREEN_HEIGHT+y-scroll < 0)
       done = 1;
@@ -183,7 +207,11 @@ void display_text_file(const std::string& file)
     
     SDL_Delay(10);
   }
-  
+
+  for(std::map<std::string, Surface*>::iterator i = images.begin();
+      i != images.end(); ++i)
+    delete i->second;
+
   SDL_EnableKeyRepeat(0, 0);    // disables key repeating
   delete background;
 }