Skip to content

Commit ee266b1

Browse files
tobbiswagtoy
andauthored
Run init-script only once after a sector has loaded (#3011)
* Run init-script only once after a sector has loaded Fixes #698 * Allow saving init-script-run-once to level file * Add toggle to editor sector menu * Code improvement * Per current guidelines * Make run logic more clear --------- Co-authored-by: swagtoy <[email protected]>
1 parent 213df63 commit ee266b1

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

src/supertux/menu/editor_sector_menu.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ EditorSectorMenu::EditorSectorMenu() :
3535
add_hl();
3636
add_textfield(_("Name"), &sector->m_name);
3737
add_script(_("Initialization script"), &sector->m_init_script);
38+
add_toggle(0, _("Run initialization script only once"), &sector->m_init_script_run_once);
3839
add_floatfield(_("Gravity"), &sector->m_gravity);
3940

4041
add_hl();

src/supertux/sector.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ Sector::Sector(Level& parent) :
6969
m_foremost_opaque_layer(),
7070
m_gravity(10.0f),
7171
m_collision_system(new CollisionSystem(*this)),
72-
m_text_object(add<TextObject>("Text"))
72+
m_text_object(add<TextObject>("Text")),
73+
m_init_script_run(),
74+
m_init_script_run_once()
7375
{
7476
add<DisplayEffect>("Effect");
7577
add<TextArrayObject>("TextArray");
@@ -284,8 +286,10 @@ Sector::activate(const Vector& player_pos)
284286
}
285287

286288
// Run init script
287-
if (!m_init_script.empty() && !Editor::is_active()) {
289+
if (!m_init_script.empty() && !Editor::is_active() && !m_init_script_run) {
288290
run_script(m_init_script, "init-script");
291+
if (m_init_script_run_once)
292+
m_init_script_run = true;
289293
}
290294

291295
// Do not interpolate camera after it has been warped
@@ -775,6 +779,10 @@ Sector::save(Writer &writer)
775779
writer.write("init-script", m_init_script,false);
776780
}
777781

782+
if (m_init_script_run_once) {
783+
writer.write("init-script-run-once", m_init_script_run_once);
784+
}
785+
778786
// saving objects;
779787
std::vector<GameObject*> objects(get_objects().size());
780788
std::transform(get_objects().begin(), get_objects().end(), objects.begin(), [] (auto& obj) {

src/supertux/sector.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class Sector final : public Base::Sector
8484
inline Level& get_level() const { return m_level; }
8585
TileSet* get_tileset() const override;
8686
bool in_worldmap() const override;
87+
inline void set_init_script_run_once(bool run_once) { m_init_script_run_once = run_once; }
88+
inline bool get_init_script_run_once() const { return m_init_script_run_once; }
8789

8890
/** activates this sector (change music, initialize player class, ...) */
8991
void activate(const std::string& spawnpoint);
@@ -266,6 +268,8 @@ class Sector final : public Base::Sector
266268
Vector m_last_translation; // For camera interpolation at high frame rates
267269
float m_last_scale;
268270
float m_last_dt;
271+
bool m_init_script_run;
272+
bool m_init_script_run_once;
269273

270274
public:
271275
// The default sector size.

src/supertux/sector_parser.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ SectorParser::parse(const ReaderMapping& reader)
150150
iter.get(value);
151151
m_sector.set_init_script(value);
152152
}
153+
else if(iter.get_key() == "init-script-run-once")
154+
{
155+
auto sector = dynamic_cast<Sector*>(&m_sector);
156+
if (!sector) continue;
157+
bool value;
158+
iter.get(value);
159+
sector->set_init_script_run_once(value);
160+
}
153161
else if (iter.get_key() == "ambient-light")
154162
{
155163
const auto& sx = iter.get_sexp();

0 commit comments

Comments
 (0)