ec0ff01dd03e5f5da7b91ad216956af798ed315f
[supertux.git] / src / object / candle.cpp
1 //  SuperTux
2 //  Copyright (C) 2006 Christoph Sommer <christoph.sommer@2006.expires.deltadevelopment.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 #include "math/random_generator.hpp"
18 #include "object/candle.hpp"
19 #include "object/sprite_particle.hpp"
20 #include "scripting/candle.hpp"
21 #include "scripting/squirrel_util.hpp"
22 #include "supertux/object_factory.hpp"
23 #include "supertux/sector.hpp"
24 #include "util/reader.hpp"
25
26 Candle::Candle(const Reader& lisp)
27   : MovingSprite(lisp, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED),
28     burning(true),
29     flicker(true),
30     lightcolor(1.0f, 1.0f, 1.0f),
31     candle_light_1(SpriteManager::current()->create("images/objects/candle/candle-light-1.sprite")),
32     candle_light_2(SpriteManager::current()->create("images/objects/candle/candle-light-2.sprite"))
33 {
34   lisp.get("name", name);
35   lisp.get("burning", burning);
36   lisp.get("flicker", flicker);
37   //get color from lisp
38   std::vector<float> vColor;
39   lisp.get("color", vColor);
40   //change the light color if defined
41   if (vColor.size() >= 3) {
42     lightcolor = Color(vColor);
43     candle_light_1->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
44     candle_light_2->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
45     candle_light_1->set_color(lightcolor);
46     candle_light_2->set_color(lightcolor);
47     //the following allows the original candle appearance to be preserved
48     candle_light_1->set_action("white");
49     candle_light_2->set_action("white");
50   }
51
52   if (burning) {
53     sprite->set_action("on");
54   } else {
55     sprite->set_action("off");
56   }
57
58 }
59
60 void
61 Candle::draw(DrawingContext& context)
62 {
63   // draw regular sprite
64   sprite->draw(context, get_pos(), layer);
65
66   // draw on lightmap
67   if (burning) {
68     //Vector pos = get_pos() + (bbox.get_size() - candle_light_1->get_size()) / 2;
69     context.push_target();
70     context.set_target(DrawingContext::LIGHTMAP);
71     // draw approx. 1 in 10 frames darker. Makes the candle flicker
72     if (gameRandom.rand(10) != 0 || !flicker) {
73       //context.draw_surface(candle_light_1, pos, layer);
74       candle_light_1->draw(context, get_bbox().get_middle(), 0);
75     } else {
76       //context.draw_surface(candle_light_2, pos, layer);
77       candle_light_2->draw(context, get_bbox().get_middle(), 0);
78     }
79     context.pop_target();
80   }
81 }
82
83 HitResponse
84 Candle::collision(GameObject&, const CollisionHit& )
85 {
86   return FORCE_MOVE;
87 }
88
89 void
90 Candle::expose(HSQUIRRELVM vm, SQInteger table_idx)
91 {
92   if (name.empty()) return;
93   scripting::Candle* _this = new scripting::Candle(this);
94   expose_object(vm, table_idx, _this, name, true);
95 }
96
97 void
98 Candle::unexpose(HSQUIRRELVM vm, SQInteger table_idx)
99 {
100   if (name.empty()) return;
101   scripting::unexpose_object(vm, table_idx, name);
102 }
103
104 void
105 Candle::puff_smoke()
106 {
107   Vector ppos = bbox.get_middle();
108   Vector pspeed = Vector(0, -150);
109   Vector paccel = Vector(0,0);
110   Sector::current()->add_object(std::make_shared<SpriteParticle>("images/objects/particles/smoke.sprite",
111                                                                  "default",
112                                                                  ppos, ANCHOR_MIDDLE,
113                                                                  pspeed, paccel,
114                                                                  LAYER_BACKGROUNDTILES+2));
115 }
116
117 bool
118 Candle::get_burning()
119 {
120   return burning;
121 }
122
123 void
124 Candle::set_burning(bool burning_)
125 {
126   if (this->burning == burning_) return;
127   this->burning = burning_;
128   if (burning_) {
129     sprite->set_action("on");
130   } else {
131     sprite->set_action("off");
132   }
133   //puff smoke for flickering light sources only
134   if (flicker) puff_smoke();
135 }
136
137 /* EOF */