Check return value of some lisp.get calls
[supertux.git] / src / object / candle.cpp
index 1123ce0..0f93126 100644 (file)
 #include "util/reader.hpp"
 
 Candle::Candle(const Reader& lisp)
-  : MovingSprite(lisp, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED), burning(true),
-    candle_light_1(Surface::create("images/objects/candle/candle-light-1.png")),
-    candle_light_2(Surface::create("images/objects/candle/candle-light-2.png"))
+  : MovingSprite(lisp, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED),
+    burning(true),
+    flicker(true),
+    lightcolor(1.0f, 1.0f, 1.0f),
+    candle_light_1(SpriteManager::current()->create("images/objects/candle/candle-light-1.sprite")),
+    candle_light_2(SpriteManager::current()->create("images/objects/candle/candle-light-2.sprite"))
 {
-  lisp.get("name", name);
-  lisp.get("burning", burning);
+
+  if(!lisp.get("name", name))
+  {
+    log_warning << "Couldn't get \"name\" property for candle." << std::endl;
+  }
+  if(!lisp.get("burning", burning))
+  {
+    log_warning << "Couldn't get \"burning\" property for candle." << std::endl;
+  }
+  if(!lisp.get("flicker", flicker))
+  {
+    log_warning << "Couldn't get \"flicker\" property for candle." << std::endl;
+  }
+  //get color from lisp
+  std::vector<float> vColor;
+  if(lisp.get("color", vColor))
+  {
+    log_warning << "Couldn't get \"color\" property for candle." << std::endl;
+  }
+
+  //change the light color if defined
+  if (vColor.size() >= 3) {
+    lightcolor = Color(vColor);
+    candle_light_1->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
+    candle_light_2->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
+    candle_light_1->set_color(lightcolor);
+    candle_light_2->set_color(lightcolor);
+    //the following allows the original candle appearance to be preserved
+    candle_light_1->set_action("white");
+    candle_light_2->set_action("white");
+  }
 
   if (burning) {
     sprite->set_action("on");
@@ -47,14 +79,16 @@ Candle::draw(DrawingContext& context)
 
   // draw on lightmap
   if (burning) {
-    Vector pos = get_pos() + (bbox.get_size() - candle_light_1->get_size()) / 2;
+    //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);
+    if (gameRandom.rand(10) != 0 || !flicker) {
+      //context.draw_surface(candle_light_1, pos, layer);
+      candle_light_1->draw(context, get_bbox().get_middle(), 0);
     } else {
-      context.draw_surface(candle_light_2, pos, layer);
+      //context.draw_surface(candle_light_2, pos, layer);
+      candle_light_2->draw(context, get_bbox().get_middle(), 0);
     }
     context.pop_target();
   }
@@ -87,7 +121,11 @@ Candle::puff_smoke()
   Vector ppos = bbox.get_middle();
   Vector pspeed = Vector(0, -150);
   Vector paccel = Vector(0,0);
-  Sector::current()->add_object(new SpriteParticle("images/objects/particles/smoke.sprite", "default", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_BACKGROUNDTILES+2));
+  Sector::current()->add_object(std::make_shared<SpriteParticle>("images/objects/particles/smoke.sprite",
+                                                                 "default",
+                                                                 ppos, ANCHOR_MIDDLE,
+                                                                 pspeed, paccel,
+                                                                 LAYER_BACKGROUNDTILES+2));
 }
 
 bool
@@ -97,17 +135,17 @@ Candle::get_burning()
 }
 
 void
-Candle::set_burning(bool burning)
+Candle::set_burning(bool burning_)
 {
-  if (this->burning == burning) return;
-  this->burning = burning;
-  if (burning) {
+  if (this->burning == burning_) return;
+  this->burning = burning_;
+  if (burning_) {
     sprite->set_action("on");
-    puff_smoke();
   } else {
     sprite->set_action("off");
-    puff_smoke();
   }
+  //puff smoke for flickering light sources only
+  if (flicker) puff_smoke();
 }
 
 /* EOF */