candle.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. #include "object/candle.hpp"
  17. #include "math/random.hpp"
  18. #include "object/sprite_particle.hpp"
  19. #include "sprite/sprite.hpp"
  20. #include "sprite/sprite_manager.hpp"
  21. #include "supertux/flip_level_transformer.hpp"
  22. #include "supertux/sector.hpp"
  23. #include "util/reader_mapping.hpp"
  24. Candle::Candle(const ReaderMapping& mapping) :
  25. MovingSprite(mapping, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED),
  26. ExposedObject<Candle, scripting::Candle>(this),
  27. burning(true),
  28. flicker(true),
  29. lightcolor(1.0f, 1.0f, 1.0f),
  30. candle_light_1(SpriteManager::current()->create("images/objects/candle/candle-light-1.sprite")),
  31. candle_light_2(SpriteManager::current()->create("images/objects/candle/candle-light-2.sprite"))
  32. {
  33. mapping.get("burning", burning, true);
  34. mapping.get("flicker", flicker, true);
  35. std::vector<float> vColor;
  36. if (!mapping.get("color", vColor)) vColor = {1.0f, 1.0f, 1.0f};
  37. mapping.get("layer", m_layer, 0);
  38. // Change the light color if defined.
  39. if (vColor.size() >= 3) {
  40. lightcolor = Color(vColor);
  41. candle_light_1->set_blend(Blend::ADD);
  42. candle_light_2->set_blend(Blend::ADD);
  43. candle_light_1->set_color(lightcolor);
  44. candle_light_2->set_color(lightcolor);
  45. // The following allows the original candle appearance to be preserved.
  46. candle_light_1->set_action("white");
  47. candle_light_2->set_action("white");
  48. }
  49. set_action(burning ? "on" : "off");
  50. }
  51. void
  52. Candle::after_editor_set()
  53. {
  54. MovingSprite::after_editor_set();
  55. candle_light_1->set_color(lightcolor);
  56. candle_light_2->set_color(lightcolor);
  57. set_action(burning ? "on" : "off");
  58. }
  59. ObjectSettings
  60. Candle::get_settings()
  61. {
  62. ObjectSettings result = MovingSprite::get_settings();
  63. result.add_bool(_("Burning"), &burning, "burning", true);
  64. result.add_bool(_("Flicker"), &flicker, "flicker", true);
  65. result.add_color(_("Color"), &lightcolor, "color", Color::WHITE);
  66. result.add_int(_("Layer"), &m_layer, "layer", 0);
  67. result.reorder({"burning", "flicker", "name", "sprite", "color", "layer", "x", "y"});
  68. return result;
  69. }
  70. void
  71. Candle::draw(DrawingContext& context)
  72. {
  73. // Draw regular sprite.
  74. MovingSprite::draw(context);
  75. // Draw on lightmap.
  76. if (burning) {
  77. // Vector pos = get_pos() + (bbox.get_size() - candle_light_1->get_size()) / 2;
  78. // draw approx. 1 in 10 frames darker. Makes the candle flicker.
  79. if (graphicsRandom.rand(10) != 0 || !flicker) {
  80. // context.color().draw_surface(candle_light_1, pos, layer);
  81. candle_light_1->draw(context.light(), m_col.m_bbox.get_middle(), m_layer);
  82. } else {
  83. // context.color().draw_surface(candle_light_2, pos, layer);
  84. candle_light_2->draw(context.light(), m_col.m_bbox.get_middle(), m_layer);
  85. }
  86. }
  87. }
  88. HitResponse
  89. Candle::collision(GameObject&, const CollisionHit& )
  90. {
  91. return FORCE_MOVE;
  92. }
  93. void
  94. Candle::puff_smoke()
  95. {
  96. Vector ppos = m_col.m_bbox.get_middle();
  97. Vector pspeed = Vector(0, -150);
  98. Vector paccel = Vector(0,0);
  99. Sector::get().add<SpriteParticle>("images/particles/smoke.sprite",
  100. "default",
  101. ppos, ANCHOR_MIDDLE,
  102. pspeed, paccel,
  103. LAYER_BACKGROUNDTILES+2);
  104. }
  105. bool
  106. Candle::get_burning() const
  107. {
  108. return burning;
  109. }
  110. void
  111. Candle::set_burning(bool burning_)
  112. {
  113. if (burning == burning_) return;
  114. burning = burning_;
  115. if (burning_) {
  116. set_action("on");
  117. } else {
  118. set_action("off");
  119. }
  120. // Puff smoke for flickering light sources only.
  121. if (flicker) puff_smoke();
  122. }
  123. void
  124. Candle::on_flip(float height)
  125. {
  126. MovingSprite::on_flip(height);
  127. FlipLevelTransformer::transform_flip(m_flip);
  128. }
  129. /* EOF */