Candle affects lightmap
authorChristoph Sommer <mail@christoph-sommer.de>
Thu, 10 Aug 2006 22:55:59 +0000 (22:55 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Thu, 10 Aug 2006 22:55:59 +0000 (22:55 +0000)
SVN-Revision: 4153

data/images/objects/candle/candle-light-1.png [new file with mode: 0644]
data/images/objects/candle/candle-light-2.png [new file with mode: 0644]
data/levels/test/candle.stl
src/object/candle.cpp
src/object/candle.hpp
src/video/surface.hpp

diff --git a/data/images/objects/candle/candle-light-1.png b/data/images/objects/candle/candle-light-1.png
new file mode 100644 (file)
index 0000000..a2e8fe8
Binary files /dev/null and b/data/images/objects/candle/candle-light-1.png differ
diff --git a/data/images/objects/candle/candle-light-2.png b/data/images/objects/candle/candle-light-2.png
new file mode 100644 (file)
index 0000000..5510784
Binary files /dev/null and b/data/images/objects/candle/candle-light-2.png differ
index ef4bf5c..3b0e30e 100644 (file)
@@ -4,11 +4,10 @@
   (author "Marek")
   (sector
     (name "main")
+    (ambient-light 0.450721 0.3396048 0.3396048)
     (background
-      (x 0)
-      (y 0)
-      (image "images/background/arctis.jpg")
       (speed 0.5)
+      (image "images/background/BlueRock_Forest/blue-top.jpg")
     )
     (tilemap
       (z-pos -100)
       (height 30)
       (tiles 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
     )
+    (tilemap
+      (z-pos -101)
+      (solid #f)
+      (name "TileBG")
+      (speed 1)
+      (width 30)
+      (height 30)
+      (tiles 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1910 1911 1908 1909 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1914 1915 1912 1913 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1902 1903 1900 1901 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905 1906 1907 1904 1905)
+    )
     (camera
       (mode "normal")
     )
index 924bc38..98c48c1 100644 (file)
 #include "sector.hpp"
 #include "object/sprite_particle.hpp"
 #include "object_factory.hpp"
+#include "random_generator.hpp"
 
 Candle::Candle(const lisp::Lisp& lisp)
-       : MovingSprite(lisp, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED), burning(true)
+       : MovingSprite(lisp, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED), burning(true),
+       candle_light_1("images/objects/candle/candle-light-1.png"),
+       candle_light_2("images/objects/candle/candle-light-2.png")
 {
+  lisp.get("name", name);
   lisp.get("burning", burning);
 
   if (burning) {
@@ -36,6 +40,28 @@ Candle::Candle(const lisp::Lisp& lisp)
   } else {
     sprite->set_action("off");
   }
+
+}
+
+void
+Candle::draw(DrawingContext& context)
+{
+  // draw regular sprite
+  sprite->draw(context, get_pos(), layer);
+
+  // draw on lightmap
+  if (burning) {
+    Vector pos = get_pos() + (bbox.get_size() - candle_light_1.get_size()) / 2;
+    context.push_target();
+    context.set_target(DrawingContext::LIGHTMAP);
+    // draw approx. 1 in 10 frames darker. Makes the candle flicker
+    if (systemRandom.rand(10) != 0) {
+      context.draw_surface(&candle_light_1, pos, layer);
+    } else {
+      context.draw_surface(&candle_light_2, pos, layer);
+    }
+    context.pop_target();
+  }
 }
 
 HitResponse
index 6b40b3e..95d005a 100644 (file)
@@ -25,6 +25,7 @@
 #include "lisp/lisp.hpp"
 #include "object/moving_sprite.hpp"
 #include "script_interface.hpp"
+#include "video/surface.hpp"
 
 /**
  * A burning candle: Simple, scriptable level decoration.
@@ -34,6 +35,7 @@ class Candle : public MovingSprite, public ScriptInterface
 public:
   Candle(const lisp::Lisp& lisp);
   virtual Candle* clone() const { return new Candle(*this); }
+  virtual void draw(DrawingContext& context);
 
   HitResponse collision(GameObject& other, const CollisionHit& hit);
 
@@ -47,6 +49,8 @@ public:
 
 private:
   bool burning; /**< true if candle is currently lighted */
+  Surface candle_light_1; /**< drawn to lightmap */
+  Surface candle_light_2; /**< drawn to lightmap (alternative image) */
 
 };
 
index 650f931..d702181 100644 (file)
@@ -21,6 +21,7 @@
 #define __SURFACE_HPP__
 
 #include <string>
+#include "math/vector.hpp"
 
 class Color;
 class Blend;
@@ -81,6 +82,13 @@ public:
   {
     return height;
   }
+
+  /**
+   * returns a vector containing width and height
+   */
+  Vector get_size() const
+  { return Vector(get_width(), get_height()); }
+
 };
 
 #endif