1// SuperTux - Thunderstorm Game Object
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#ifndef HEADER_SUPERTUX_OBJECT_THUNDERSTORM_HPP
18#define HEADER_SUPERTUX_OBJECT_THUNDERSTORM_HPP
19
20#include "squirrel/exposed_object.hpp"
21#include "scripting/thunderstorm.hpp"
22#include "supertux/game_object.hpp"
23#include "supertux/timer.hpp"
24
25class DrawingContext;
26class ReaderMapping;
27
28/** Thunderstorm scriptable GameObject; plays thunder, lightning and
29 electrifies water at regular interval */
30class Thunderstorm final : public GameObject,
31 public ExposedObject<Thunderstorm, scripting::Thunderstorm>
32{
33public:
34 Thunderstorm(const ReaderMapping& reader);
35
36 virtual void update(float dt_sec) override;
37 virtual void draw(DrawingContext& context) override;
38
39 virtual std::string get_class() const override { return "thunderstorm"; }
40 virtual std::string get_display_name() const override { return _("Thunderstorm"); }
41
42 virtual ObjectSettings get_settings() override;
43
44 virtual const std::string get_icon_path() const override { return "images/engine/editor/thunderstorm.png"; }
45
46 /** @name Scriptable Methods
47 @{ */
48
49 /** Start playing thunder and lightning at configured interval */
50 void start();
51
52 /** Stop playing thunder and lightning at configured interval */
53 void stop();
54
55 /** Play thunder */
56 void thunder();
57
58 /** Play lightning, i.e. call flash() and electrify() */
59 void lightning();
60
61 /** Display a nice flash */
62 void flash();
63
64 /** Electrify water throughout the whole sector for a short time */
65 void electrify();
66
67 /** @} */
68
69private:
70 bool running; /**< whether we currently automatically trigger lightnings */
71 float interval; /**< time between two lightnings */
72 int layer; /**< layer, where flash will be painted */
73
74 std::string m_strike_script;
75
76 Timer time_to_thunder; /**< counts down until next thunder */
77 Timer time_to_lightning; /**< counts down until next lightning */
78 Timer flash_display_timer; /**< counts down while flash is displayed */
79
80private:
81 Thunderstorm(const Thunderstorm&) = delete;
82 Thunderstorm& operator=(const Thunderstorm&) = delete;
83};
84
85#endif
86
87/* EOF */
88