From be22a62c417fc89cb2ca850415102bf4da991c6c Mon Sep 17 00:00:00 2001 From: Vankata453 <78196474+Vankata453@users.noreply.github.com> Date: Thu, 24 Oct 2024 00:05:57 +0300 Subject: [PATCH 01/21] Block break particles are now on the same z-pos as the block [ci skip] --- src/object/block.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object/block.cpp b/src/object/block.cpp index 318335f9ec..a51e65f490 100644 --- a/src/object/block.cpp +++ b/src/object/block.cpp @@ -193,7 +193,7 @@ Block::break_me() Sector::get().add(m_sprite->clone(), action, pos, ANCHOR_MIDDLE, velocity, Vector(0, gravity), - LAYER_OBJECTS + 3); + m_layer); } remove_me(); From b51c16a06fe817ef985fa0597e0ec59146c2d4ee Mon Sep 17 00:00:00 2001 From: Frostwithasideofsalt Date: Wed, 23 Oct 2024 23:54:05 -0700 Subject: [PATCH 02/21] New add layer icon & redo editor cursor button (#3088) [ci skip] --- data/images/engine/editor/README | 4 ---- data/images/engine/editor/add.png | Bin 2963 -> 1430 bytes data/images/engine/editor/arrow.png | Bin 947 -> 1382 bytes 3 files changed, 4 deletions(-) delete mode 100644 data/images/engine/editor/README diff --git a/data/images/engine/editor/README b/data/images/engine/editor/README deleted file mode 100644 index 7f3714b1e5..0000000000 --- a/data/images/engine/editor/README +++ /dev/null @@ -1,4 +0,0 @@ -The following images are taken from other open source projects: - -arrow.png from inkscape - diff --git a/data/images/engine/editor/add.png b/data/images/engine/editor/add.png index 3db48622c64fba97156b44dd23adcdd8bbe7e57c..caf87dd7910df00805e5550900baee33e63fe243 100644 GIT binary patch literal 1430 zcmV;H1!?+;P)!1iW=wkFDG=d@u zu3YNiYTVvg=wIMUVVKSQ0lK)T3&n+ttMo#|h2W|gp*ISb7O!X%bK87$QdOsBk(@)) z>GX6ickTlP=Tz0H=c(s?>#YMl6pO`NCX@Lwo6RswJ2?WG@uLSa@Z_3HHL)15bO-Zx=6af48@82$^{Lighx0>~O-G&f+2qFF>1@sX2*0y)<+^Gv8 zemQdF$Rtq|{q5}8v+Yi&^Zz6t5V5wlX3w2FXO&X_V0L!){r&s*-Jd`{AYyTG(P^za zLP}{reE6WIr>6k~e-4889%D?bLkJ?D&yP)BtyXC^n|%BBjY6To)YKH2OlGT}3#C;0 z;>YpNS{p83z8t2fr-PI-06_>5E?&Gib}WFJ0Bi_BkF)z+F2|KCS16augb=7!t2}t{ zfR&Y%aa=$M(a?Y#hdjZ|%uM<`H8ll*b8ajFfRX%;#FKJRv(_3ZC2<^&yOj7{0(R}% zHMoipLw#FBOVh32TNd%@(AsZ;_;9f_i7GjZQHO}-m9Zt(Q!Q@r&uU@?xMd1YyhY*Gwh~pSz4A-w;r(7;0 zgg}Vyv=G8j9&CiqpFi{D$rBbA7bzBtL*qh-kCJW(hOoT6ObCHJd-kA|LQ0v6*a|s7 zu~?*9t+KMRGHS|{q$;;wr}6QselbnK%r1zW@d(m4wtn%GCr@(k-n}#&`Fx&3hYr#Evl>YTUAOvci;z-wzJC2`wALu4Fvg^3eIs({ z#{c8TkJRgRa=9GYY?e}~gfWAu)Gxq$pElVfy$Y!&v+I#=cyLa#2xOwyDwr$(C zNn=dN=kr2JITVim{7BqczuQEN_dd1WIfwV2R;v{njYhE6hR2T||JG(ZrA%q~4$%v#1I_Hp5VyzvSY>BuKLK?cBlcD!*c=qgBc=6&z6}Sfc z+`rC#;P11uvrQ>wETxR;Ue#$6Lilxk4zR|U-;6P<#+X$pr58eYV~m@am~fMmlU6C^ kwbrpQ#smNAaRG?`0`T*7&;sMP0000007*qoM6N<$g2-LDp8x;= literal 2963 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 fy8rK@RnxzX+mDl!O)K;O0000 Date: Thu, 24 Oct 2024 20:19:21 +0300 Subject: [PATCH 03/21] Reloading resources from "Debug" menu (#2928) The new "Reload Resources" option in the "Debug" menu allows for reloading all fonts, textures, sprites and tilesets. **Additionally:** * Removes the `name` field for sprites. I honestly didn't know it existed before, and don't know what the point of it is, considering it's not referenced anywhere in the code, other than in logs, where a filename can be used instead. Closes #2901. --- src/object/moving_sprite.cpp | 2 +- src/sprite/sprite.hpp | 5 +- src/sprite/sprite_data.cpp | 175 +++++++++++++++++++++--------- src/sprite/sprite_data.hpp | 41 ++++--- src/sprite/sprite_manager.cpp | 72 ++---------- src/sprite/sprite_manager.hpp | 15 +-- src/supertux/menu/debug_menu.cpp | 14 +++ src/supertux/resources.cpp | 6 +- src/supertux/resources.hpp | 2 +- src/supertux/tile_manager.cpp | 7 ++ src/supertux/tile_manager.hpp | 8 +- src/supertux/tile_set.cpp | 21 +++- src/supertux/tile_set.hpp | 9 +- src/video/gl/gl_texture.cpp | 11 +- src/video/gl/gl_texture.hpp | 5 +- src/video/null/null_texture.cpp | 5 + src/video/null/null_texture.hpp | 3 + src/video/sdl/sdl_texture.cpp | 16 ++- src/video/sdl/sdl_texture.hpp | 7 +- src/video/sdl_surface_ptr.hpp | 7 ++ src/video/texture.cpp | 7 ++ src/video/texture.hpp | 11 ++ src/video/texture_manager.cpp | 88 +++++++++++---- src/video/texture_manager.hpp | 15 ++- src/video/ttf_surface_manager.cpp | 7 ++ src/video/ttf_surface_manager.hpp | 2 + 26 files changed, 362 insertions(+), 199 deletions(-) diff --git a/src/object/moving_sprite.cpp b/src/object/moving_sprite.cpp index 7f419594b9..e71205bb0c 100644 --- a/src/object/moving_sprite.cpp +++ b/src/object/moving_sprite.cpp @@ -209,7 +209,7 @@ MovingSprite::change_sprite(const std::string& new_sprite_name) m_sprite_name = new_sprite_name; update_hitbox(); - return SpriteManager::current()->last_load_successful(); + return m_sprite->load_successful(); } ObjectSettings diff --git a/src/sprite/sprite.hpp b/src/sprite/sprite.hpp index 7c9c21b99a..76c85c326a 100644 --- a/src/sprite/sprite.hpp +++ b/src/sprite/sprite.hpp @@ -85,9 +85,6 @@ class Sprite final /** Get current frame progress */ float get_current_frame_progress() const { return m_frame; } - /** Get sprite's name */ - const std::string& get_name() const { return m_data.name; } - /** Get current action name */ const std::string& get_action() const { return m_action->name; } @@ -127,6 +124,8 @@ class Sprite final bool has_action (const std::string& name) const { return (m_data.get_action(name) != nullptr); } size_t get_actions_count() const { return m_data.actions.size(); } + bool load_successful() const { return m_data.m_load_successful; } + private: void update(); diff --git a/src/sprite/sprite_data.cpp b/src/sprite/sprite_data.cpp index bd8d2c8d5f..3a70d16130 100644 --- a/src/sprite/sprite_data.cpp +++ b/src/sprite/sprite_data.cpp @@ -1,5 +1,6 @@ // SuperTux // Copyright (C) 2006 Matthias Braun +// 2023-2024 Vankata453 // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -29,6 +30,7 @@ #include "util/reader_document.hpp" #include "util/reader_mapping.hpp" #include "util/reader_object.hpp" +#include "util/string_util.hpp" #include "video/surface.hpp" #include "video/texture_manager.hpp" @@ -48,70 +50,141 @@ SpriteData::Action::Action() : { } -SpriteData::SpriteData(const ReaderMapping& mapping) : - actions(), - name() +void +SpriteData::Action::reset(SurfacePtr surface) { - auto iter = mapping.get_iter(); - while (iter.next()) - { - if (iter.get_key() == "name") { - iter.get(name); - } else if (iter.get_key() == "action") { - parse_action(iter.as_mapping()); - } else { - log_warning << "Unknown sprite field: " << iter.get_key() << std::endl; - } - } - if (actions.empty()) - throw std::runtime_error("Error: Sprite without actions."); + x_offset = 0; + y_offset = 0; + hitbox_w = static_cast(surface->get_width()); + hitbox_h = static_cast(surface->get_height()); + hitbox_unisolid = false; + fps = 10; + loops = -1; + loop_frame = 1; + has_custom_loops = false; + family_name.clear(); + surfaces = { surface }; } -SpriteData::SpriteData(const std::string& image) : - actions(), - name() -{ - auto surface = Surface::from_file(image); - if (!TextureManager::current()->last_load_successful()) - throw std::runtime_error("Cannot load image."); - auto action = create_action_from_surface(surface); - action->name = "default"; - actions[action->name] = std::move(action); +SpriteData::SpriteData(const std::string& filename) : + m_filename(filename), + m_load_successful(false), + actions() +{ + load(); } -SpriteData::SpriteData() : - actions(), - name() +void +SpriteData::load() { - auto surface = Surface::from_texture(TextureManager::current()->create_dummy_texture()); - auto action = create_action_from_surface(surface); - action->name = "default"; - actions[action->name] = std::move(action); + // Reset all existing actions to a dummy texture + if (!actions.empty()) + { + auto surface = Surface::from_texture(TextureManager::current()->create_dummy_texture()); + for (const auto& action : actions) + action.second->reset(surface); + } + + if (StringUtil::has_suffix(m_filename, ".sprite")) + { + try + { + auto doc = ReaderDocument::from_file(m_filename); + auto root = doc.get_root(); + + if (root.get_name() != "supertux-sprite") + { + std::ostringstream msg; + msg << "'" << m_filename << "' is not a 'supertux-sprite' file!"; + throw std::runtime_error(msg.str()); + } + else + { + // Load ".sprite" file + parse(root.get_mapping()); + } + } + catch (const std::exception& err) + { + log_warning << "Parse error when trying to load sprite '" << m_filename + << "': " << err.what() << std::endl; + + // Load initial dummy texture + if (actions.empty()) + { + auto surface = Surface::from_texture(TextureManager::current()->create_dummy_texture()); + auto action = std::make_unique(); + action->name = "default"; + action->reset(surface); + actions[action->name] = std::move(action); + } + + m_load_successful = false; + return; + } + } + else + { + // Load single image + auto surface = Surface::from_file(m_filename); + if (!TextureManager::current()->last_load_successful()) + throw std::runtime_error("Cannot load image."); + + // Create action, if it doesn't exist + { + auto i = actions.find("default"); + if (i == actions.end()) + { + auto action = std::make_unique(); + action->name = "default"; + actions["default"] = std::move(action); + } + } + actions["default"]->reset(surface); + } + + m_load_successful = true; } -std::unique_ptr -SpriteData::create_action_from_surface(SurfacePtr surface) +void +SpriteData::parse(const ReaderMapping& mapping) { - auto action = std::make_unique(); - - action->hitbox_w = static_cast(surface->get_width()); - action->hitbox_h = static_cast(surface->get_height()); - action->surfaces.push_back(surface); + auto iter = mapping.get_iter(); + while (iter.next()) + { + if (iter.get_key() == "action") + parse_action(iter.as_mapping()); + else + log_warning << "Unknown sprite field: " << iter.get_key() << std::endl; + } - return action; + if (actions.empty()) + throw std::runtime_error("Error: Sprite without actions."); } void SpriteData::parse_action(const ReaderMapping& mapping) { - auto action = std::make_unique(); + std::string name; + mapping.get("name", name); - if (!mapping.get("name", action->name)) + // Create action, if it doesn't exist { - if (!actions.empty()) - throw std::runtime_error("If there are more than one action, they need names!"); + auto i = actions.find(name); + if (i == actions.end()) + { + auto action = std::make_unique(); + action->name = name; + actions[name] = std::move(action); + } } + Action* action = actions[name].get(); + + // Reset action + action->hitbox_w = 0; + action->hitbox_h = 0; + action->surfaces.clear(); std::vector hitbox; if (mapping.get("hitbox", hitbox)) @@ -128,7 +201,7 @@ SpriteData::parse_action(const ReaderMapping& mapping) break; default: - throw std::runtime_error("hitbox should specify 2/4 coordinates"); + throw std::runtime_error("Hitbox should specify 2/4 coordinates!"); } } mapping.get("unisolid", action->hitbox_unisolid); @@ -141,7 +214,7 @@ SpriteData::parse_action(const ReaderMapping& mapping) { if (action->loop_frame < 1) { - log_warning << "'loop-frame' of action '" << action->name << "' in sprite '" << name << "' set to a value below 1." << std::endl; + log_warning << "'loop-frame' of action '" << action->name << "' in sprite '" << m_filename << "' set to a value below 1." << std::endl; action->loop_frame = 1; } } @@ -343,7 +416,7 @@ SpriteData::parse_action(const ReaderMapping& mapping) else { std::stringstream msg; - msg << "Sprite '" << name << "' unknown tag in 'surfaces' << " << i.get_name(); + msg << "Sprite '" << m_filename << "' unknown tag in 'surfaces' << " << i.get_name(); throw std::runtime_error(msg.str()); } } @@ -362,7 +435,7 @@ SpriteData::parse_action(const ReaderMapping& mapping) else { std::stringstream msg; - msg << "Sprite '" << name << "' contains no images in action '" + msg << "Sprite '" << m_filename << "' contains no images in action '" << action->name << "'."; throw std::runtime_error(msg.str()); } @@ -372,11 +445,9 @@ SpriteData::parse_action(const ReaderMapping& mapping) const int frames = static_cast(action->surfaces.size()); if (action->loop_frame > frames && frames > 0) { - log_warning << "'loop-frame' of action '" << action->name << "' in sprite '" << name << "' not-in-range of total frames." << std::endl; + log_warning << "'loop-frame' of action '" << action->name << "' in sprite '" << m_filename << "' not-in-range of total frames." << std::endl; action->loop_frame = 1; } - - actions[action->name] = std::move(action); } const SpriteData::Action* diff --git a/src/sprite/sprite_data.hpp b/src/sprite/sprite_data.hpp index 555c2edf3a..5137f5b50f 100644 --- a/src/sprite/sprite_data.hpp +++ b/src/sprite/sprite_data.hpp @@ -1,5 +1,6 @@ // SuperTux // Copyright (C) 2006 Matthias Braun +// 2023-2024 Vankata453 // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,8 +18,8 @@ #ifndef HEADER_SUPERTUX_SPRITE_SPRITE_DATA_HPP #define HEADER_SUPERTUX_SPRITE_SPRITE_DATA_HPP -#include #include +#include #include #include "video/surface_ptr.hpp" @@ -30,26 +31,17 @@ class SpriteData final friend class Sprite; public: - /** - * Sprite from data. - * `mapping` has to be a pointer to data in the form of "((hitbox 5 10 0 0) ...)". - */ - SpriteData(const ReaderMapping& mapping); - /** Single-image sprite */ - SpriteData(const std::string& image); - /** Dummy texture sprite */ - SpriteData(); - - const std::string& get_name() const - { - return name; - } + SpriteData(const std::string& filename); + + void load(); private: - struct Action + struct Action final { Action(); + void reset(SurfacePtr surface); + std::string name; /** Position correction */ @@ -87,17 +79,22 @@ class SpriteData final std::vector surfaces; }; - typedef std::map > Actions; - - static std::unique_ptr create_action_from_surface(SurfacePtr surface); - +private: + void parse(const ReaderMapping& mapping); void parse_action(const ReaderMapping& mapping); - /** Get an action */ + const Action* get_action(const std::string& act) const; private: + const std::string m_filename; + bool m_load_successful; + + typedef std::unordered_map> Actions; Actions actions; - std::string name; + +private: + SpriteData(const SpriteData& other); + SpriteData& operator=(const SpriteData&) = delete; }; #endif diff --git a/src/sprite/sprite_manager.cpp b/src/sprite/sprite_manager.cpp index db21bd7b5f..fc12c97ff5 100644 --- a/src/sprite/sprite_manager.cpp +++ b/src/sprite/sprite_manager.cpp @@ -1,6 +1,6 @@ // SuperTux // Copyright (C) 2006 Matthias Braun -// 2023 Vankata453 +// 2023-2024 Vankata453 // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,24 +17,11 @@ #include "sprite/sprite_manager.hpp" -#include -#include - #include "sprite/sprite.hpp" -#include "util/file_system.hpp" -#include "util/log.hpp" -#include "util/reader_document.hpp" -#include "util/reader_mapping.hpp" -#include "util/string_util.hpp" - -std::unique_ptr SpriteManager::s_dummy_sprite_data = nullptr; SpriteManager::SpriteManager() : - m_sprites(), - m_load_successful(false) + m_sprites() { - if (!s_dummy_sprite_data) - s_dummy_sprite_data.reset(new SpriteData()); } SpritePtr @@ -45,65 +32,28 @@ SpriteManager::create(const std::string& name) if (i == m_sprites.end()) { // Try loading the sprite file. - try - { - data = load(name); - } - catch (const std::exception& err) - { - log_warning << "Error loading sprite '" << name << "', using dummy texture: " << err.what() << std::endl; - m_load_successful = false; - return SpritePtr(new Sprite(*s_dummy_sprite_data)); // Return a dummy sprite. - } + data = load(name); } else { data = i->second.get(); } - m_load_successful = true; return SpritePtr(new Sprite(*data)); } SpriteData* SpriteManager::load(const std::string& filename) { - std::unique_ptr sprite_data; - - if (StringUtil::has_suffix(filename, ".sprite")) - { - std::optional doc; - try - { - doc = ReaderDocument::from_file(filename); - } - catch (const std::exception& err) - { - std::ostringstream msg; - msg << "Parse error when trying to load sprite '" << filename - << "': " << err.what(); - throw std::runtime_error(msg.str()); - } - auto root = doc->get_root(); - - if (root.get_name() != "supertux-sprite") - { - std::ostringstream msg; - msg << "'" << filename << "' is not a supertux-sprite file"; - throw std::runtime_error(msg.str()); - } - else - { - sprite_data = std::make_unique(root.get_mapping()); - } - } - else - { - sprite_data = std::make_unique(filename); - } - - m_sprites[filename] = std::move(sprite_data); + m_sprites[filename] = std::make_unique(filename); return m_sprites[filename].get(); } +void +SpriteManager::reload() +{ + for (const auto& sprite_data : m_sprites) + sprite_data.second->load(); +} + /* EOF */ diff --git a/src/sprite/sprite_manager.hpp b/src/sprite/sprite_manager.hpp index 381e04f96a..5159a23ddc 100644 --- a/src/sprite/sprite_manager.hpp +++ b/src/sprite/sprite_manager.hpp @@ -1,6 +1,6 @@ // SuperTux // Copyright (C) 2006 Matthias Braun -// 2023 Vankata453 +// 2023-2024 Vankata453 // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -31,21 +31,18 @@ class SpriteData; class SpriteManager final : public Currenton { private: - static std::unique_ptr s_dummy_sprite_data; - -private: - typedef std::map > Sprites; + typedef std::map> Sprites; Sprites m_sprites; - bool m_load_successful; public: SpriteManager(); - bool last_load_successful() const { return m_load_successful; } - - /** loads a sprite. */ + /** Loads a sprite. */ SpritePtr create(const std::string& filename); + /** Reloads all sprites. */ + void reload(); + private: SpriteData* load(const std::string& filename); diff --git a/src/supertux/menu/debug_menu.cpp b/src/supertux/menu/debug_menu.cpp index 1461c19bb1..86447ec09f 100644 --- a/src/supertux/menu/debug_menu.cpp +++ b/src/supertux/menu/debug_menu.cpp @@ -20,10 +20,14 @@ #include #include "editor/editor.hpp" +#include "gui/item_action.hpp" #include "gui/item_stringselect.hpp" +#include "sprite/sprite_manager.hpp" #include "supertux/debug.hpp" #include "supertux/gameconfig.hpp" #include "supertux/globals.hpp" +#include "supertux/resources.hpp" +#include "supertux/tile_manager.hpp" #include "util/gettext.hpp" #include "util/log.hpp" #include "video/texture_manager.hpp" @@ -72,6 +76,16 @@ DebugMenu::DebugMenu() : []{ return g_debug.get_use_bitmap_fonts(); }, [](bool value){ g_debug.set_use_bitmap_fonts(value); }); add_toggle(-1, _("Show Tile IDs in Editor Toolbox"), &g_debug.show_toolbox_tile_ids); + + add_entry(_("Reload Resources"), []{ + TextureManager::current()->reload(); + + Resources::load(true); + SpriteManager::current()->reload(); + TileManager::current()->reload(); + }) + .set_help(_("Reloads all fonts, textures, sprites and tilesets.")); + add_entry(_("Dump Texture Cache"), []{ TextureManager::current()->debug_print(get_logging_instance()); }); add_hl(); diff --git a/src/supertux/resources.cpp b/src/supertux/resources.cpp index 18f779888e..ce05b97123 100644 --- a/src/supertux/resources.cpp +++ b/src/supertux/resources.cpp @@ -27,6 +27,7 @@ #include "video/font.hpp" #include "video/surface.hpp" #include "video/ttf_font.hpp" +#include "video/ttf_surface_manager.hpp" std::unique_ptr Resources::mouse_cursor; @@ -48,7 +49,7 @@ SurfacePtr Resources::no_tile; std::string Resources::current_font; void -Resources::load() +Resources::load(bool reload) { // Load the mouse-cursor mouse_cursor.reset(new MouseCursor(SpriteManager::current()->create("images/engine/menu/mousecursor.sprite"))); @@ -69,7 +70,7 @@ Resources::load() console_font.reset(new TTFFont("fonts/SourceCodePro-Medium.ttf", 12, 1.25f, 0, 1)); auto font = get_font_for_locale(g_dictionary_manager->get_language()); - if(font != current_font) + if(reload || font != current_font) { current_font = font; fixed_font.reset(new TTFFont(font, 18, 1.25f, 2, 1)); @@ -79,6 +80,7 @@ Resources::load() control_font.reset(new TTFFont("fonts/Roboto-Regular.ttf", 15, 1.25f, 0, 0)); } } + TTFSurfaceManager::current()->clear_cache(); /* Load menu images */ checkbox = Surface::from_file("images/engine/menu/checkbox-unchecked.png"); diff --git a/src/supertux/resources.hpp b/src/supertux/resources.hpp index 509717493d..27e38e6fae 100644 --- a/src/supertux/resources.hpp +++ b/src/supertux/resources.hpp @@ -62,7 +62,7 @@ class Resources final static SurfacePtr no_tile; public: - static void load(); + static void load(bool reload = false); static void unload(); static bool needs_custom_font(const tinygettext::Language& locale); static std::string get_font_for_locale(const tinygettext::Language& locale); diff --git a/src/supertux/tile_manager.cpp b/src/supertux/tile_manager.cpp index 0b9bd68501..8d710da28b 100644 --- a/src/supertux/tile_manager.cpp +++ b/src/supertux/tile_manager.cpp @@ -42,4 +42,11 @@ TileManager::get_tileset(const std::string &filename) } } +void +TileManager::reload() +{ + for (const auto& tileset : m_tilesets) + tileset.second->reload(); +} + /* EOF */ diff --git a/src/supertux/tile_manager.hpp b/src/supertux/tile_manager.hpp index 0b6cc54de5..b93bc5d75b 100644 --- a/src/supertux/tile_manager.hpp +++ b/src/supertux/tile_manager.hpp @@ -28,12 +28,18 @@ class TileSet; class TileManager final : public Currenton { private: - std::map > m_tilesets; + std::map> m_tilesets; public: TileManager(); TileSet* get_tileset(const std::string &filename); + + void reload(); + +private: + TileManager(const TileManager&) = delete; + TileManager& operator=(const TileManager&) = delete; }; #endif diff --git a/src/supertux/tile_set.cpp b/src/supertux/tile_set.cpp index 7d2b8b16e6..6faffc7b8b 100644 --- a/src/supertux/tile_set.cpp +++ b/src/supertux/tile_set.cpp @@ -36,17 +36,18 @@ Tilegroup::Tilegroup() : std::unique_ptr TileSet::from_file(const std::string& filename) { - auto tileset = std::make_unique(); + auto tileset = std::make_unique(filename); TileSetParser parser(*tileset, filename); parser.parse(); - tileset->print_debug_info(filename); + tileset->print_debug_info(); return tileset; } -TileSet::TileSet() : +TileSet::TileSet(const std::string& filename) : + m_filename(filename), m_autotilesets(), m_thunderstorm_tiles(), m_tiles(1), @@ -55,6 +56,18 @@ TileSet::TileSet() : m_tiles[0] = std::make_unique(); } +void +TileSet::reload() +{ + m_autotilesets.clear(); + m_thunderstorm_tiles.clear(); + m_tiles.resize(1); // Preserve only the initial tile with an ID of 0 + m_tilegroups.clear(); + + TileSetParser parser(*this, m_filename); + parser.parse(); +} + void TileSet::add_tile(int id, std::unique_ptr tile) { @@ -168,7 +181,7 @@ TileSet::add_tilegroup(const Tilegroup& tilegroup) } void -TileSet::print_debug_info(const std::string& filename) +TileSet::print_debug_info() { if (false) { // enable this if you want to see a list of free tiles diff --git a/src/supertux/tile_set.hpp b/src/supertux/tile_set.hpp index 8335e098db..15290622e2 100644 --- a/src/supertux/tile_set.hpp +++ b/src/supertux/tile_set.hpp @@ -47,9 +47,11 @@ class TileSet final static std::unique_ptr from_file(const std::string& filename); public: - TileSet(); + TileSet(const std::string& filename); ~TileSet() = default; + void reload(); + void add_tile(int id, std::unique_ptr tile); /** Adds a group of tiles that haven't @@ -73,8 +75,11 @@ class TileSet final return m_tilegroups; } - void print_debug_info(const std::string& filename); + void print_debug_info(); +private: + const std::string m_filename; + public: // Must be public because of tile_set_parser.cpp std::vector> m_autotilesets; diff --git a/src/video/gl/gl_texture.cpp b/src/video/gl/gl_texture.cpp index 84789bd547..4a825d4f67 100644 --- a/src/video/gl/gl_texture.cpp +++ b/src/video/gl/gl_texture.cpp @@ -24,7 +24,6 @@ GLTexture::GLTexture(int width, int height, std::optional fill_color) : m_handle(), - m_sampler(), m_texture_width(), m_texture_height(), m_image_width(), @@ -68,15 +67,23 @@ GLTexture::GLTexture(int width, int height, std::optional fill_color) : } GLTexture::GLTexture(const SDL_Surface& image, const Sampler& sampler) : + Texture(sampler), m_handle(), - m_sampler(sampler), m_texture_width(), m_texture_height(), m_image_width(), m_image_height() +{ + reload(image); +} + +void +GLTexture::reload(const SDL_Surface& image) { assert_gl(); + glDeleteTextures(1, &m_handle); + if (gl_needs_power_of_two()) { m_texture_width = next_power_of_two(image.w); diff --git a/src/video/gl/gl_texture.hpp b/src/video/gl/gl_texture.hpp index a2a650b9f2..1975236301 100644 --- a/src/video/gl/gl_texture.hpp +++ b/src/video/gl/gl_texture.hpp @@ -24,8 +24,6 @@ #include "video/sampler.hpp" #include "video/texture.hpp" -class Sampler; - /** This class is a wrapper around a texture handle. It stores the texture width and height and provides convenience functions for uploading SDL_Surfaces into the texture. */ @@ -36,6 +34,8 @@ class GLTexture final : public Texture GLTexture(const SDL_Surface& image, const Sampler& sampler); ~GLTexture() override; + virtual void reload(const SDL_Surface& image) override; + virtual int get_texture_width() const override { return m_texture_width; } virtual int get_texture_height() const override { return m_texture_height; } @@ -55,7 +55,6 @@ class GLTexture final : public Texture private: GLuint m_handle; - Sampler m_sampler; int m_texture_width; int m_texture_height; int m_image_width; diff --git a/src/video/null/null_texture.cpp b/src/video/null/null_texture.cpp index d91d8b4fe4..35c018a915 100644 --- a/src/video/null/null_texture.cpp +++ b/src/video/null/null_texture.cpp @@ -26,6 +26,11 @@ NullTexture::~NullTexture() { } +void +NullTexture::reload(const SDL_Surface&) +{ +} + int NullTexture::get_texture_width() const { diff --git a/src/video/null/null_texture.hpp b/src/video/null/null_texture.hpp index ea278f46d6..04043099ef 100644 --- a/src/video/null/null_texture.hpp +++ b/src/video/null/null_texture.hpp @@ -27,8 +27,11 @@ class NullTexture : public Texture NullTexture(const Size& size); ~NullTexture() override; + virtual void reload(const SDL_Surface& image) override; + virtual int get_texture_width() const override; virtual int get_texture_height() const override; + virtual int get_image_width() const override; virtual int get_image_height() const override; diff --git a/src/video/sdl/sdl_texture.cpp b/src/video/sdl/sdl_texture.cpp index e8a3690a3e..5a2363cdf2 100644 --- a/src/video/sdl/sdl_texture.cpp +++ b/src/video/sdl/sdl_texture.cpp @@ -23,19 +23,27 @@ #include "video/video_system.hpp" SDLTexture::SDLTexture(SDL_Texture* texture, int width, int height, const Sampler& sampler) : + Texture(sampler), m_texture(texture), m_width(width), - m_height(height), - m_sampler(sampler) + m_height(height) { } SDLTexture::SDLTexture(const SDL_Surface& image, const Sampler& sampler) : + Texture(sampler), m_texture(), m_width(), - m_height(), - m_sampler(sampler) + m_height() { + reload(image); +} + +void +SDLTexture::reload(const SDL_Surface& image) +{ + SDL_DestroyTexture(m_texture); + m_texture = SDL_CreateTextureFromSurface(static_cast(VideoSystem::current()->get_renderer()).get_sdl_renderer(), const_cast(&image)); if (!m_texture) diff --git a/src/video/sdl/sdl_texture.hpp b/src/video/sdl/sdl_texture.hpp index b28b60195f..e36e8571a5 100644 --- a/src/video/sdl/sdl_texture.hpp +++ b/src/video/sdl/sdl_texture.hpp @@ -23,15 +23,15 @@ #include "video/sampler.hpp" -struct SDL_Texture; - class SDLTexture final : public Texture { public: SDLTexture(SDL_Texture* texture, int width, int height, const Sampler& sampler); - SDLTexture(const SDL_Surface& sdl_surface, const Sampler& sampler); + SDLTexture(const SDL_Surface& image, const Sampler& sampler); ~SDLTexture() override; + virtual void reload(const SDL_Surface& image) override; + virtual int get_texture_width() const override { return m_width; } virtual int get_texture_height() const override { return m_height; } @@ -45,7 +45,6 @@ class SDLTexture final : public Texture SDL_Texture* m_texture; int m_width; int m_height; - Sampler m_sampler; private: SDLTexture(const SDLTexture&) = delete; diff --git a/src/video/sdl_surface_ptr.hpp b/src/video/sdl_surface_ptr.hpp index 3eaf8786d1..cef48e6478 100644 --- a/src/video/sdl_surface_ptr.hpp +++ b/src/video/sdl_surface_ptr.hpp @@ -82,6 +82,13 @@ class SDLSurfacePtr final m_surface = surface; } + void reset(SDLSurfacePtr& other) + { + SDL_FreeSurface(m_surface); + m_surface = other.m_surface; + other.m_surface = nullptr; + } + SDL_Surface* get() const { return m_surface; diff --git a/src/video/texture.cpp b/src/video/texture.cpp index e7c60fd69e..92ffef9041 100644 --- a/src/video/texture.cpp +++ b/src/video/texture.cpp @@ -19,6 +19,13 @@ #include "video/texture_manager.hpp" Texture::Texture() : + m_sampler(), + m_cache_key() +{ +} + +Texture::Texture(const Sampler& sampler) : + m_sampler(sampler), m_cache_key() { } diff --git a/src/video/texture.hpp b/src/video/texture.hpp index 16534a5399..69b14dc7c7 100644 --- a/src/video/texture.hpp +++ b/src/video/texture.hpp @@ -23,6 +23,9 @@ #include "math/rect.hpp" #include "video/flip.hpp" +#include "video/sampler.hpp" + +struct SDL_Surface; /** This class is a wrapper around a texture handle. It stores the texture width and height and provides convenience functions for @@ -37,16 +40,24 @@ class Texture protected: Texture(); + Texture(const Sampler& sampler); public: virtual ~Texture(); + virtual void reload(const SDL_Surface& image) = 0; + virtual int get_texture_width() const = 0; virtual int get_texture_height() const = 0; virtual int get_image_width() const = 0; virtual int get_image_height() const = 0; + const Sampler& get_sampler() const { return m_sampler; } + +protected: + Sampler m_sampler; + private: std::optional m_cache_key; diff --git a/src/video/texture_manager.cpp b/src/video/texture_manager.cpp index bf5c2b24ec..ccee7c8a23 100644 --- a/src/video/texture_manager.cpp +++ b/src/video/texture_manager.cpp @@ -275,7 +275,8 @@ TextureManager::create_image_texture(const std::string& filename, const Rect& re m_load_successful = true; try { - return create_image_texture_raw(filename, rect, sampler); + SDLSurfacePtr surface = create_image_surface_raw(filename, rect, sampler); + return VideoSystem::current()->new_texture(*surface, sampler); } catch(const std::exception& err) { @@ -298,8 +299,8 @@ TextureManager::get_surface(const std::string& filename) return *(m_surfaces[filename] = std::move(surface)); } -TexturePtr -TextureManager::create_image_texture_raw(const std::string& filename, const Rect& rect, const Sampler& sampler) +SDLSurfacePtr +TextureManager::create_image_surface_raw(const std::string& filename, const Rect& rect, const Sampler& sampler) { assert(rect.valid()); @@ -358,7 +359,7 @@ TextureManager::create_image_texture_raw(const std::string& filename, const Rect } } - return VideoSystem::current()->new_texture(*subimage, sampler); + return subimage; } TexturePtr @@ -367,7 +368,8 @@ TextureManager::create_image_texture(const std::string& filename, const Sampler& m_load_successful = true; try { - return create_image_texture_raw(filename, sampler); + SDLSurfacePtr surface = create_image_surface(filename); + return VideoSystem::current()->new_texture(*surface, sampler); } catch (const std::exception& err) { @@ -377,42 +379,84 @@ TextureManager::create_image_texture(const std::string& filename, const Sampler& } } -TexturePtr -TextureManager::create_image_texture_raw(const std::string& filename, const Sampler& sampler) -{ - SDLSurfacePtr surface = create_image_surface(filename); - TexturePtr texture = VideoSystem::current()->new_texture(*surface, sampler); - surface.reset(nullptr); - return texture; -} - -TexturePtr -TextureManager::create_dummy_texture() +SDLSurfacePtr +TextureManager::create_dummy_surface() { // on error, try loading placeholder file try { - TexturePtr tex = create_image_texture_raw(s_dummy_texture, Sampler()); - return tex; + SDLSurfacePtr surface = create_image_surface(s_dummy_texture); + return surface; } catch (const std::exception& err) { // on error (when loading placeholder), try using empty surface, // when that fails to, just give up - SDLSurfacePtr image(SDL_CreateRGBSurface(0, 128, 128, 8, 0, 0, 0, 0)); - if (!image) + SDLSurfacePtr surface(SDL_CreateRGBSurface(0, 128, 128, 8, 0, 0, 0, 0)); + if (!surface) { throw; } else { log_warning << "Couldn't load texture '" << s_dummy_texture << "' (now using empty one): " << err.what() << std::endl; - TexturePtr texture = VideoSystem::current()->new_texture(*image); - return texture; + return surface; } } } +TexturePtr +TextureManager::create_dummy_texture() const +{ + SDLSurfacePtr surface = create_dummy_surface(); + return VideoSystem::current()->new_texture(*surface); +} + +void +TextureManager::reload() +{ + // Reload surfaces + for (auto& surface : m_surfaces) + { + SDLSurfacePtr surface_new = create_image_surface(surface.first); + surface.second.reset(surface_new); + } + + // Reload textures + for (auto& texture : m_image_textures) + { + auto texture_ptr = texture.second.lock(); + + SDLSurfacePtr surface; + if (std::get<1>(texture.first).empty()) // No specific rect for texture + { + try + { + surface = create_image_surface(std::get<0>(texture.first)); + } + catch (const std::exception& err) + { + log_warning << "Couldn't load texture '" << std::get<0>(texture.first) << "' (now using dummy texture): " << err.what() << std::endl; + surface = create_dummy_surface(); + } + } + else // Texture has a specific rect + { + try + { + surface = create_image_surface_raw(std::get<0>(texture.first), std::get<1>(texture.first), texture_ptr->get_sampler()); + } + catch (const std::exception& err) + { + log_warning << "Couldn't load texture '" << std::get<0>(texture.first) << "' (now using dummy texture): " << err.what() << std::endl; + surface = create_dummy_surface(); + } + } + + texture_ptr->reload(*surface); + } +} + void TextureManager::debug_print(std::ostream& out) const { diff --git a/src/video/texture_manager.hpp b/src/video/texture_manager.hpp index 73c80930ee..240e37cb43 100644 --- a/src/video/texture_manager.hpp +++ b/src/video/texture_manager.hpp @@ -53,7 +53,9 @@ class TextureManager final : public Currenton TexturePtr get(const std::string& filename, const std::optional& rect, const Sampler& sampler = Sampler()); - TexturePtr create_dummy_texture(); + TexturePtr create_dummy_texture() const; + + void reload(); void debug_print(std::ostream& out) const; @@ -63,17 +65,18 @@ class TextureManager final : public Currenton const SDL_Surface& get_surface(const std::string& filename); void reap_cache_entry(const Texture::Key& key); - TexturePtr create_image_texture(const std::string& filename, const Rect& rect, const Sampler& sampler); - /** on failure a dummy texture is returned and no exception is thrown */ TexturePtr create_image_texture(const std::string& filename, const Sampler& sampler); + TexturePtr create_image_texture(const std::string& filename, const Rect& rect, const Sampler& sampler); + /** throw an exception on error */ - TexturePtr create_image_texture_raw(const std::string& filename, const Sampler& sampler); - TexturePtr create_image_texture_raw(const std::string& filename, const Rect& rect, const Sampler& sampler); + SDLSurfacePtr create_image_surface_raw(const std::string& filename, const Rect& rect, const Sampler& sampler); + + static SDLSurfacePtr create_dummy_surface(); private: - std::map > m_image_textures; + std::map> m_image_textures; std::map m_surfaces; bool m_load_successful; diff --git a/src/video/ttf_surface_manager.cpp b/src/video/ttf_surface_manager.cpp index f6703cf346..46e42c307a 100644 --- a/src/video/ttf_surface_manager.cpp +++ b/src/video/ttf_surface_manager.cpp @@ -83,6 +83,13 @@ TTFSurfaceManager::get_cached_surface_width(const TTFFont& font, return entry.ttf_surface->get_width(); } +void +TTFSurfaceManager::clear_cache() +{ + m_cache.clear(); + m_cache_iter = m_cache.begin(); +} + void TTFSurfaceManager::cache_cleanup_step() { diff --git a/src/video/ttf_surface_manager.hpp b/src/video/ttf_surface_manager.hpp index 110d170757..d6e87de982 100644 --- a/src/video/ttf_surface_manager.hpp +++ b/src/video/ttf_surface_manager.hpp @@ -39,6 +39,8 @@ class TTFSurfaceManager final : public Currenton // Returns -1 if there is no cached text surface int get_cached_surface_width(const TTFFont& font, const std::string& text); + void clear_cache(); + void print_debug_info(std::ostream& out); private: From 792eaa0ec469a671cd090346377bfe122a0c83ae Mon Sep 17 00:00:00 2001 From: Vankata453 <78196474+Vankata453@users.noreply.github.com> Date: Thu, 24 Oct 2024 20:19:42 +0300 Subject: [PATCH 04/21] Editor: Support multiple autotilesets per tile (#3082) Tiles can now be present in multiple autotilesets in the same tileset. They would be autotileable with all (max. 10) autotilesets they are included in. The editor allows for pressing keys 0-9 to choose from all 10 autotilesets the user can tile with. This is visually indicated in the autotile help strings. --- data/images/autotiles.satc | 4 +- src/editor/editor.cpp | 6 + src/editor/editor.hpp | 2 + src/editor/overlay_widget.cpp | 219 +++++++++++++++++++++------------- src/editor/overlay_widget.hpp | 11 +- src/editor/toolbox_widget.cpp | 2 + src/object/tilemap.cpp | 142 +++++++++------------- src/object/tilemap.hpp | 12 +- src/supertux/autotile.hpp | 2 + src/supertux/tile_set.cpp | 27 +++-- src/supertux/tile_set.hpp | 3 +- 11 files changed, 250 insertions(+), 180 deletions(-) diff --git a/data/images/autotiles.satc b/data/images/autotiles.satc index 3990953e3e..eb88baf059 100644 --- a/data/images/autotiles.satc +++ b/data/images/autotiles.satc @@ -14,7 +14,7 @@ ;; | ;; V ;; Contains : -;; The autotileset name (unused as of writing these lines) : (name "snow") +;; The autotileset name (used as an indicator in the editor) : (name "snow") ;; The name of the autotileset is "snow". ;; The default tile ID (used if no tile matches any mask) : (default 11) ;; If a very special tile is needed (and it doesn't exist), it will use this tile (it's a center tile) by default. @@ -75,7 +75,7 @@ ;; (Contributor, 2020) ;; ;; -;; NOTE : A single id MUST NOT OCCUR MORE THAN ONE AUTOTILE IN THE ENTIRE FILE. +;; NOTE : A single id MUST NOT OCCUR IN MORE THAN ONE AUTOTILE IN AN AUTOTILESET. ;; Otherwise, the behavior is UNDEFINED. (supertux-autotiles diff --git a/src/editor/editor.cpp b/src/editor/editor.cpp index 5b399e4d64..37ac7f9de3 100644 --- a/src/editor/editor.cpp +++ b/src/editor/editor.cpp @@ -410,6 +410,12 @@ Editor::get_tileselect_move_mode() const return m_toolbox_widget->get_tileselect_move_mode(); } +void +Editor::update_autotileset() +{ + m_overlay_widget->update_autotileset(); +} + void Editor::scroll(const Vector& velocity) { diff --git a/src/editor/editor.hpp b/src/editor/editor.hpp index d31a5b80ca..5eec578fd4 100644 --- a/src/editor/editor.hpp +++ b/src/editor/editor.hpp @@ -124,6 +124,8 @@ class Editor final : public Screen, void check_deprecated_tiles(bool focus = false); bool has_deprecated_tiles() const { return m_has_deprecated_tiles; } + void update_autotileset(); + /** Checks whether the level can be saved and does not contain obvious issues (currently: check if main sector and a spawn point named "main" is present) */ diff --git a/src/editor/overlay_widget.cpp b/src/editor/overlay_widget.cpp index 6bf19cdd0f..c00caf6128 100644 --- a/src/editor/overlay_widget.cpp +++ b/src/editor/overlay_widget.cpp @@ -16,6 +16,8 @@ #include "editor/overlay_widget.hpp" +#include + #include "editor/editor.hpp" #include "editor/node_marker.hpp" #include "editor/object_menu.hpp" @@ -53,6 +55,7 @@ EditorOverlayWidget::EditorOverlayWidget(Editor& editor) : m_editor(editor), m_hovered_tile(0, 0), m_hovered_tile_prev(0, 0), + m_last_hovered_tile(0, 0), m_sector_pos(0, 0), m_mouse_pos(0, 0), m_previous_mouse_pos(0, 0), @@ -66,6 +69,8 @@ EditorOverlayWidget::EditorOverlayWidget(Editor& editor) : m_selected_object(nullptr), m_edited_path(nullptr), m_last_node_marker(nullptr), + m_available_autotilesets(), + m_current_autotileset(0), m_object_tip(new Tip()), m_obj_mouse_desync(0, 0), m_rectangle_preview(new TileSelection()), @@ -170,7 +175,7 @@ EditorOverlayWidget::autotile(const Vector& pos, uint32_t tile) if (!tilemap || !is_position_inside_tilemap(tilemap, pos)) return; tilemap->save_state(); - tilemap->autotile(static_cast(pos.x), static_cast(pos.y), tile); + tilemap->autotile(static_cast(pos.x), static_cast(pos.y), tile, get_current_autotileset()); } void @@ -196,7 +201,7 @@ EditorOverlayWidget::autotile_corner(const Vector& pos, uint32_t tile, if (!tilemap || !is_position_inside_tilemap(tilemap, pos)) return; tilemap->save_state(); - tilemap->autotile_corner(static_cast(pos.x), static_cast(pos.y), tile, op); + tilemap->autotile_corner(static_cast(pos.x), static_cast(pos.y), tile, get_current_autotileset(), op); } void @@ -220,36 +225,37 @@ EditorOverlayWidget::input_autotile_corner(const Vector& corner, uint32_t tile, } void -EditorOverlayWidget::put_tile(const Vector& target_tile) +EditorOverlayWidget::put_tiles(const Vector& target_tile, TileSelection* tiles) { m_editor.get_selected_tilemap()->save_state(); - Vector hovered_corner = target_tile + Vector(0.5f, 0.5f); - auto tiles = m_editor.get_tiles(); + const Vector hovered_corner = target_tile + Vector(0.5f, 0.5f); Vector add_tile(0.0f, 0.0f); for (add_tile.x = static_cast(tiles->m_width) - 1.0f; add_tile.x >= 0.0f; add_tile.x--) { for (add_tile.y = static_cast(tiles->m_height) - 1.0f; add_tile.y >= 0; add_tile.y--) { + const uint32_t tile = tiles->pos(static_cast(add_tile.x), static_cast(add_tile.y)); - uint32_t tile = tiles->pos(static_cast(add_tile.x), static_cast(add_tile.y)); - auto tilemap = m_editor.get_selected_tilemap(); - - if (g_config->editor_autotile_mode && ((tilemap && tilemap->get_autotileset(tile)) || tile == 0)) + if (g_config->editor_autotile_mode) { - if (tile == 0) - { - tilemap->autotile_erase(target_tile + add_tile, hovered_corner + add_tile); - } - else if (tilemap->get_autotileset(tile)->is_corner()) + AutotileSet* autotileset = get_current_autotileset(); + if (autotileset) { - input_autotile_corner(hovered_corner + add_tile, - tile, - target_tile + add_tile); - } - else - { - input_autotile(target_tile + add_tile, tile); + if (tile == 0) + { + m_editor.get_selected_tilemap()->autotile_erase(target_tile + add_tile, hovered_corner + add_tile, autotileset); + } + else if (autotileset->is_corner()) + { + input_autotile_corner(hovered_corner + add_tile, + tile, + target_tile + add_tile); + } + else + { + input_autotile(target_tile + add_tile, tile); + } } } else @@ -350,7 +356,7 @@ EditorOverlayWidget::put_next_tiles() { // Avoid drawing lines when the user has hold the left mouse button for some // time while not putting a tile - put_tile(m_hovered_tile); + put_tiles(m_hovered_tile, m_editor.get_tiles()); m_hovered_tile_prev = m_hovered_tile; return; } @@ -359,7 +365,7 @@ EditorOverlayWidget::put_next_tiles() for (const Vector &pos : rasterize_line_segment(m_hovered_tile_prev * 2.0f, m_hovered_tile * 2.0f)) { - put_tile(pos * 0.5f); + put_tiles(pos * 0.5f, m_editor.get_tiles()); } m_hovered_tile_prev = m_hovered_tile; } @@ -387,30 +393,6 @@ EditorOverlayWidget::preview_rectangle() } } - -void -EditorOverlayWidget::draw_rectangle() -{ - Rectf dr = drag_rect(); - dr.set_p1(glm::floor(sp_to_tp(dr.p1()))); - dr.set_p2(glm::floor(sp_to_tp(dr.p2()))); - bool sgn_x = m_drag_start.x < m_sector_pos.x; - bool sgn_y = m_drag_start.y < m_sector_pos.y; - - int x_ = sgn_x ? 0 : static_cast(-dr.get_width()); - for (int x = static_cast(dr.get_left()); x <= static_cast(dr.get_right()); x++, x_++) - { - int y_ = sgn_y ? 0 : static_cast(-dr.get_height()); - for (int y = static_cast(dr.get_top()); y <= static_cast(dr.get_bottom()); y++, y_++) - { - if (g_config->editor_autotile_mode) - input_autotile(Vector(static_cast(x), static_cast(y)), m_editor.get_tiles()->pos(x_, y_)); - else - input_tile(Vector(static_cast(x), static_cast(y)), m_editor.get_tiles()->pos(x_, y_)); - } - } -} - bool EditorOverlayWidget::check_tiles_for_fill(uint32_t replace_tile, uint32_t target_tile, @@ -418,10 +400,8 @@ EditorOverlayWidget::check_tiles_for_fill(uint32_t replace_tile, { if (g_config->editor_autotile_mode) { - return m_editor.get_tileset()->get_autotileset_from_tile(replace_tile) - == m_editor.get_tileset()->get_autotileset_from_tile(target_tile) - && m_editor.get_tileset()->get_autotileset_from_tile(replace_tile) - != m_editor.get_tileset()->get_autotileset_from_tile(third_tile); + return m_editor.get_tileset()->has_mutual_autotileset(replace_tile, target_tile) && + !m_editor.get_tileset()->has_mutual_autotileset(replace_tile, third_tile); } else { @@ -437,7 +417,7 @@ EditorOverlayWidget::fill() if (!tilemap) return; // The tile that is going to be replaced: - uint32_t replace_tile = tilemap->get_tile_id(static_cast(m_hovered_tile.x), static_cast(m_hovered_tile.y)); + uint32_t replace_tile = tilemap->get_tile_id(m_hovered_tile); if (replace_tile == tiles->pos(0, 0)) { @@ -479,7 +459,7 @@ EditorOverlayWidget::fill() if (pos_.x >= 0) { if (check_tiles_for_fill(replace_tile, - tilemap->get_tile_id(static_cast(pos_.x), static_cast(pos_.y)), + tilemap->get_tile_id(pos_), tiles->pos(static_cast(tpos.x - 1), static_cast(tpos.y)))) { pos_stack.push_back( pos_ ); @@ -492,7 +472,7 @@ EditorOverlayWidget::fill() if (pos_.x < static_cast(tilemap->get_width())) { if (check_tiles_for_fill(replace_tile, - tilemap->get_tile_id(static_cast(pos_.x), static_cast(pos_.y)), + tilemap->get_tile_id(pos_), tiles->pos(static_cast(tpos.x + 1), static_cast(tpos.y)))) { pos_stack.push_back( pos_ ); @@ -505,7 +485,7 @@ EditorOverlayWidget::fill() if (pos_.y >= 0) { if (check_tiles_for_fill(replace_tile, - tilemap->get_tile_id(static_cast(pos_.x), static_cast(pos_.y)), + tilemap->get_tile_id(pos_), tiles->pos(static_cast(tpos.x), static_cast(tpos.y - 1)))) { pos_stack.push_back( pos_ ); @@ -518,7 +498,7 @@ EditorOverlayWidget::fill() if (pos_.y < static_cast(tilemap->get_height())) { if (check_tiles_for_fill(replace_tile, - tilemap->get_tile_id(static_cast(pos_.x), static_cast(pos_.y)), + tilemap->get_tile_id(pos_), tiles->pos(static_cast(tpos.x), static_cast(tpos.y + 1)))) { pos_stack.push_back( pos_ ); @@ -539,7 +519,7 @@ void EditorOverlayWidget::replace() { auto tilemap = m_editor.get_selected_tilemap(); - uint32_t replace_tile = tilemap->get_tile_id(static_cast(m_hovered_tile.x), static_cast(m_hovered_tile.y)); + uint32_t replace_tile = tilemap->get_tile_id(m_hovered_tile); // Don't do anything if the old and new tiles are the same tile. if (m_editor.get_tiles()->m_width == 1 && m_editor.get_tiles()->m_height == 1 && replace_tile == m_editor.get_tiles()->pos(0, 0)) return; @@ -920,7 +900,7 @@ EditorOverlayWidget::process_left_click() switch (m_editor.get_tileselect_select_mode()) { case 0: - put_tile(m_hovered_tile); + put_tiles(m_hovered_tile, m_editor.get_tiles()); m_hovered_tile_prev = m_hovered_tile; m_time_prev_put_tile = std::chrono::steady_clock::now(); break; @@ -1072,6 +1052,8 @@ EditorOverlayWidget::update_tile_selection() } } } + + update_autotileset(); } bool @@ -1083,7 +1065,7 @@ EditorOverlayWidget::on_mouse_button_up(const SDL_MouseButtonEvent& button) { if (m_dragging && m_editor.get_tileselect_select_mode() == 1) { - draw_rectangle(); + put_tiles(sp_to_tp(drag_rect().p1()), m_rectangle_preview.get()); m_rectangle_preview->m_tiles.clear(); } @@ -1197,10 +1179,11 @@ bool EditorOverlayWidget::on_key_up(const SDL_KeyboardEvent& key) { auto sym = key.keysym.sym; - if (sym == SDLK_LSHIFT) { + if (sym == SDLK_LSHIFT) + { g_config->editor_snap_to_grid = !g_config->editor_snap_to_grid; } - if (sym == SDLK_LCTRL || sym == SDLK_RCTRL) + else if (sym == SDLK_LCTRL || sym == SDLK_RCTRL) { if (action_pressed) { @@ -1210,7 +1193,8 @@ EditorOverlayWidget::on_key_up(const SDL_KeyboardEvent& key) // Hovered objects depend on which keys are pressed hover_object(); } - if (sym == SDLK_LALT || sym == SDLK_RALT) { + else if (sym == SDLK_LALT || sym == SDLK_RALT) + { alt_pressed = false; } return true; @@ -1220,22 +1204,34 @@ bool EditorOverlayWidget::on_key_down(const SDL_KeyboardEvent& key) { auto sym = key.keysym.sym; - if (sym == SDLK_F8) { + + if (sym == SDLK_F8) + { g_config->editor_render_grid = !g_config->editor_render_grid; } - if (sym == SDLK_F7 || sym == SDLK_LSHIFT) { + else if (sym == SDLK_F7 || sym == SDLK_LSHIFT) + { g_config->editor_snap_to_grid = !g_config->editor_snap_to_grid; } - if (sym == SDLK_F5 || ((sym == SDLK_LCTRL || sym == SDLK_RCTRL) && !action_pressed)) + else if (sym == SDLK_F5 || ((sym == SDLK_LCTRL || sym == SDLK_RCTRL) && !action_pressed)) { g_config->editor_autotile_mode = !g_config->editor_autotile_mode; action_pressed = true; // Hovered objects depend on which keys are pressed hover_object(); } - if (sym == SDLK_LALT || sym == SDLK_RALT) { + else if (sym == SDLK_LALT || sym == SDLK_RALT) + { alt_pressed = true; } + else if (sym == SDLK_0) + { + m_current_autotileset = 0; + } + else if (sym > SDLK_0 && sym <= SDLK_9) + { + m_current_autotileset = static_cast(sym - SDLK_0); + } return true; } @@ -1254,10 +1250,68 @@ EditorOverlayWidget::update_pos() m_editor.get_sector()->get_camera().get_translation(); m_hovered_tile = sp_to_tp(m_sector_pos); + if (m_last_hovered_tile != m_hovered_tile) + { + const uint32_t hovered_id = m_editor.get_selected_tilemap()->get_tile_id(m_hovered_tile); + if ((!m_dragging || hovered_id != 0) && + m_editor.get_tiles()->pos(0, 0) == 0 && // Erasing + m_editor.get_selected_tilemap()->get_tile_id(m_last_hovered_tile) != hovered_id) + { + update_autotileset(); + } + + m_last_hovered_tile = m_hovered_tile; + } + // update tip hover_object(); } +void +EditorOverlayWidget::update_autotileset() +{ + AutotileSet* old_autotileset = get_current_autotileset(); + + if (m_editor.get_tiles()->pos(0, 0) == 0) // Erasing + { + const uint32_t current_tile = m_editor.get_selected_tilemap()->get_tile_id(m_hovered_tile); + m_available_autotilesets = m_editor.get_tileset()->get_autotilesets_from_tile(current_tile); + } + else + { + m_available_autotilesets = m_editor.get_tileset()->get_autotilesets_from_tile(m_editor.get_tiles()->pos(0, 0)); + } + + if (!old_autotileset) + { + m_current_autotileset = 0; + return; + } + auto it_autotileset = std::find(m_available_autotilesets.begin(), m_available_autotilesets.end(), old_autotileset); + m_current_autotileset = it_autotileset != m_available_autotilesets.end() ? static_cast(it_autotileset - m_available_autotilesets.begin()) : 0; +} + +AutotileSet* +EditorOverlayWidget::get_current_autotileset() const +{ + if (m_available_autotilesets.empty()) + return nullptr; + + if (m_current_autotileset < 0 || m_current_autotileset > static_cast(m_available_autotilesets.size() - 1)) + return m_available_autotilesets.front(); + + return m_available_autotilesets[m_current_autotileset]; +} + +std::string +EditorOverlayWidget::get_autotileset_key_range() const +{ + if (m_available_autotilesets.size() < 2) + return ""; + + return "(0-" + std::to_string(std::min(static_cast(m_available_autotilesets.size() - 1), 9)) + ")"; +} + void EditorOverlayWidget::draw_tile_tip(DrawingContext& context) { @@ -1507,7 +1561,7 @@ EditorOverlayWidget::draw(DrawingContext& context) { // Deprecated tiles in active tilemaps should have indication, when hovered auto sel_tilemap = m_editor.get_selected_tilemap(); - if (m_editor.get_tileset()->get(sel_tilemap->get_tile_id(static_cast(m_hovered_tile.x), static_cast(m_hovered_tile.y))).is_deprecated()) + if (m_editor.get_tileset()->get(sel_tilemap->get_tile_id(m_hovered_tile)).is_deprecated()) context.color().draw_text(Resources::normal_font, "!", tp_to_sp(Vector(static_cast(m_hovered_tile.x), static_cast(m_hovered_tile.y))) + Vector(16, 8), ALIGN_CENTER, LAYER_GUI - 10, Color::RED); @@ -1563,22 +1617,23 @@ EditorOverlayWidget::draw(DrawingContext& context) if (g_config->editor_autotile_help) { - if (m_editor.get_tileset()->get_autotileset_from_tile(m_editor.get_tiles()->pos(0, 0)) != nullptr) + if (g_config->editor_autotile_mode) { - if (g_config->editor_autotile_mode) - { - context.color().draw_text(Resources::normal_font, _("Autotile mode is on"), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_active_color); - } - else + AutotileSet* autotileset = get_current_autotileset(); + if (m_editor.get_tiles()->pos(0, 0) == 0) { - context.color().draw_text(Resources::normal_font, _("Hold Ctrl to enable autotile"), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_available_color); + if (autotileset) + { + context.color().draw_text(Resources::normal_font, fmt::format(fmt::runtime(_("Autotile erasing mode is on (\"{}\")")), autotileset->get_name()) + " " + get_autotileset_key_range(), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_active_color); + } + else + { + context.color().draw_text(Resources::normal_font, _("Autotile erasing cannot be performed here"), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_error_color); + } } - } - else if (g_config->editor_autotile_mode) - { - if (m_editor.get_tiles()->pos(0, 0) == 0) + else if (autotileset) { - context.color().draw_text(Resources::normal_font, _("Autotile erasing mode is on"), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_active_color); + context.color().draw_text(Resources::normal_font, fmt::format(fmt::runtime(_("Autotile mode is on (\"{}\")")), autotileset->get_name()) + " " + get_autotileset_key_range(), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_active_color); } else { @@ -1587,7 +1642,11 @@ EditorOverlayWidget::draw(DrawingContext& context) } else if (m_editor.get_tiles()->pos(0, 0) == 0) { - context.color().draw_text(Resources::normal_font, _("Hold Ctrl to enable autotile erasing"), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_available_color); + context.color().draw_text(Resources::normal_font, _("Hold Ctrl to enable autotile erasing") + " " + get_autotileset_key_range(), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_available_color); + } + else + { + context.color().draw_text(Resources::normal_font, _("Hold Ctrl to enable autotile") + " " + get_autotileset_key_range(), Vector(144, 16), ALIGN_LEFT, LAYER_OBJECTS+1, EditorOverlayWidget::text_autotile_available_color); } } } diff --git a/src/editor/overlay_widget.hpp b/src/editor/overlay_widget.hpp index 89b6b9388f..9fea628e55 100644 --- a/src/editor/overlay_widget.hpp +++ b/src/editor/overlay_widget.hpp @@ -28,6 +28,7 @@ #include "supertux/timer.hpp" #include "util/typed_uid.hpp" +class AutotileSet; class Color; class DrawingContext; class Editor; @@ -64,6 +65,7 @@ class EditorOverlayWidget final : public Widget virtual void on_window_resize() override; void update_pos(); + void update_autotileset(); void delete_markers(); void update_node_iterators(); void on_level_change(); @@ -81,7 +83,7 @@ class EditorOverlayWidget final : public Widget void input_autotile(const Vector& pos, uint32_t tile); void autotile_corner(const Vector& pos, uint32_t tile, TileMap::AutotileCornerOperation op); void input_autotile_corner(const Vector& corner, uint32_t tile, const Vector& override_pos = Vector(-1.f, -1.f)); - void put_tile(const Vector& target_tile); + void put_tiles(const Vector& target_tile, TileSelection* tiles); void put_next_tiles(); void draw_rectangle(); void preview_rectangle(); @@ -101,6 +103,9 @@ class EditorOverlayWidget final : public Widget void select_object(); void add_path_node(); + AutotileSet* get_current_autotileset() const; + std::string get_autotileset_key_range() const; + void draw_tile_tip(DrawingContext&); void draw_tile_grid(DrawingContext&, int tile_size, bool draw_shadow) const; void draw_tilemap_border(DrawingContext&); @@ -130,6 +135,7 @@ class EditorOverlayWidget final : public Widget Editor& m_editor; Vector m_hovered_tile; Vector m_hovered_tile_prev; + Vector m_last_hovered_tile; Vector m_sector_pos; Vector m_mouse_pos; Vector m_previous_mouse_pos; @@ -147,6 +153,9 @@ class EditorOverlayWidget final : public Widget TypedUID m_edited_path; TypedUID m_last_node_marker; + std::vector m_available_autotilesets; + int m_current_autotileset; + std::unique_ptr m_object_tip; Vector m_obj_mouse_desync; diff --git a/src/editor/toolbox_widget.cpp b/src/editor/toolbox_widget.cpp index 00fc2b1f3d..4db15151ce 100644 --- a/src/editor/toolbox_widget.cpp +++ b/src/editor/toolbox_widget.cpp @@ -108,6 +108,7 @@ EditorToolboxWidget::on_mouse_button_down(const SDL_MouseButtonEvent& button) { if (m_tilebox->on_mouse_button_down(button)) { + m_editor.update_autotileset(); update_mouse_icon(); return true; } @@ -150,6 +151,7 @@ EditorToolboxWidget::on_mouse_button_down(const SDL_MouseButtonEvent& button) case 0: m_tilebox->get_tiles()->set_tile(0); m_tilebox->set_object(""); + m_editor.update_autotileset(); update_mouse_icon(); break; diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index a464917ab2..0561ac0a7a 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -654,6 +654,12 @@ TileMap::get_tile_id(int x, int y) const return m_tiles[y*m_width + x]; } +uint32_t +TileMap::get_tile_id(const Vector& pos) const +{ + return get_tile_id(static_cast(pos.x), static_cast(pos.y)); +} + bool TileMap::is_outside_bounds(const Vector& pos) const { @@ -726,80 +732,43 @@ TileMap::change_all(uint32_t oldtile, uint32_t newtile) } void -TileMap::autotile(int x, int y, uint32_t tile) +TileMap::autotile(int x, int y, uint32_t tile, AutotileSet* autotileset) { if (x < 0 || x >= m_width || y < 0 || y >= m_height) return; - uint32_t current_tile = m_tiles[y*m_width + x]; - AutotileSet* curr_set; - if (current_tile == 0) - { - // Special case 1 : If the tile is empty, check if we can use a non-solid - // tile from the currently selected tile's autotile set (if any). - curr_set = m_tileset->get_autotileset_from_tile(tile); - } - else if (m_tileset->get_autotileset_from_tile(tile) != nullptr && - m_tileset->get_autotileset_from_tile(tile)->is_member(current_tile)) - { - // Special case 2 : If the tile is in multiple autotilesets, check if it - // is in the same tileset as the selected tile. (Example : tile 47) - curr_set = m_tileset->get_autotileset_from_tile(tile); - } - else - { - curr_set = m_tileset->get_autotileset_from_tile(current_tile); - } - - // If tile is not autotileable, abort - // If tile is from a corner autotileset, abort as well - if (curr_set == nullptr) - { + if (!autotileset || !autotileset->is_member(tile)) return; - } - uint32_t realtile = curr_set->get_autotile(current_tile, - curr_set->is_solid(get_tile_id(x-1, y-1)), - curr_set->is_solid(get_tile_id(x , y-1)), - curr_set->is_solid(get_tile_id(x+1, y-1)), - curr_set->is_solid(get_tile_id(x-1, y )), - curr_set->is_solid(get_tile_id(x , y )), - curr_set->is_solid(get_tile_id(x+1, y )), - curr_set->is_solid(get_tile_id(x-1, y+1)), - curr_set->is_solid(get_tile_id(x , y+1)), - curr_set->is_solid(get_tile_id(x+1, y+1)), + m_tiles[y*m_width + x] = autotileset->get_autotile(m_tiles[y*m_width + x], + autotileset->is_solid(get_tile_id(x-1, y-1)), + autotileset->is_solid(get_tile_id(x , y-1)), + autotileset->is_solid(get_tile_id(x+1, y-1)), + autotileset->is_solid(get_tile_id(x-1, y )), + autotileset->is_solid(get_tile_id(x , y )), + autotileset->is_solid(get_tile_id(x+1, y )), + autotileset->is_solid(get_tile_id(x-1, y+1)), + autotileset->is_solid(get_tile_id(x , y+1)), + autotileset->is_solid(get_tile_id(x+1, y+1)), x, y); - - m_tiles[y*m_width + x] = realtile; } void -TileMap::autotile_corner(int x, int y, uint32_t tile, AutotileCornerOperation op) +TileMap::autotile_corner(int x, int y, uint32_t tile, AutotileSet* autotileset, AutotileCornerOperation op) { if (x < 0 || x >= m_width || y < 0 || y >= m_height) return; - if (!m_tileset->get_autotileset_from_tile(tile)->is_corner()) + if (!autotileset || !autotileset->is_corner() || !autotileset->is_member(tile)) return; - AutotileSet* curr_set = m_tileset->get_autotileset_from_tile(tile); - - // If tile is not autotileable, abort - if (curr_set == nullptr) - { - return; - } - // If tile is not empty or already of the appropriate tileset, abort uint32_t current_tile = m_tiles[y*m_width + x]; - if (current_tile != 0 && (m_tileset->get_autotileset_from_tile(tile) != nullptr - && !m_tileset->get_autotileset_from_tile(tile)->is_member(current_tile))) - { + if (current_tile != 0 && !autotileset->is_member(current_tile)) return; - } // If the current tile is 0, it will automatically return 0 - uint8_t mask = curr_set->get_mask_from_tile(current_tile); + uint8_t mask = autotileset->get_mask_from_tile(current_tile); if (op == AutotileCornerOperation::REMOVE_TOP_LEFT) mask = static_cast(mask & 0x07); if (op == AutotileCornerOperation::REMOVE_TOP_RIGHT) mask = static_cast(mask & 0x0B); if (op == AutotileCornerOperation::REMOVE_BOTTOM_LEFT) mask = static_cast(mask & 0x0D); @@ -809,7 +778,7 @@ TileMap::autotile_corner(int x, int y, uint32_t tile, AutotileCornerOperation op if (op == AutotileCornerOperation::ADD_BOTTOM_LEFT) mask = static_cast(mask | 0x02); if (op == AutotileCornerOperation::ADD_BOTTOM_RIGHT) mask = static_cast(mask | 0x01); - uint32_t realtile = (!mask) ? 0 : curr_set->get_autotile(current_tile, + uint32_t realtile = (!mask) ? 0 : autotileset->get_autotile(current_tile, (mask & 0x08) != 0, false, (mask & 0x04) != 0, @@ -827,12 +796,16 @@ TileMap::autotile_corner(int x, int y, uint32_t tile, AutotileCornerOperation op bool TileMap::is_corner(uint32_t tile) const { - auto* ats = m_tileset->get_autotileset_from_tile(tile); - return ats && ats->is_corner(); + for (const AutotileSet* autotileset : get_autotilesets(tile)) + { + if (autotileset->is_corner()) + return true; + } + return false; } void -TileMap::autotile_erase(const Vector& pos, const Vector& corner_pos) +TileMap::autotile_erase(const Vector& pos, const Vector& corner_pos, AutotileSet* autotileset) { if (pos.x < 0.f || pos.x >= static_cast(m_width) || pos.y < 0.f || pos.y >= static_cast(m_height)) @@ -844,15 +817,16 @@ TileMap::autotile_erase(const Vector& pos, const Vector& corner_pos) uint32_t current_tile = m_tiles[static_cast(pos.y)*m_width + static_cast(pos.x)]; + if (!autotileset || (current_tile != 0 && !autotileset->is_member(current_tile))) + return; - AutotileSet* curr_set = m_tileset->get_autotileset_from_tile(current_tile); - - if (curr_set && curr_set->is_corner()) { + if (current_tile != 0 && autotileset->is_corner()) + { int x = static_cast(corner_pos.x), y = static_cast(corner_pos.y); - autotile_corner(x, y, current_tile, AutotileCornerOperation::REMOVE_TOP_LEFT); - autotile_corner(x-1, y, current_tile, AutotileCornerOperation::REMOVE_TOP_RIGHT); - autotile_corner(x, y-1, current_tile, AutotileCornerOperation::REMOVE_BOTTOM_LEFT); - autotile_corner(x-1, y-1, current_tile, AutotileCornerOperation::REMOVE_BOTTOM_RIGHT); + autotile_corner(x, y, current_tile, autotileset, AutotileCornerOperation::REMOVE_TOP_LEFT); + autotile_corner(x-1, y, current_tile, autotileset, AutotileCornerOperation::REMOVE_TOP_RIGHT); + autotile_corner(x, y-1, current_tile, autotileset, AutotileCornerOperation::REMOVE_BOTTOM_LEFT); + autotile_corner(x-1, y-1, current_tile, autotileset, AutotileCornerOperation::REMOVE_BOTTOM_RIGHT); } else { @@ -861,58 +835,58 @@ TileMap::autotile_erase(const Vector& pos, const Vector& corner_pos) if (x - 1 >= 0 && y - 1 >= 0 && !is_corner(m_tiles[(y-1)*m_width + x-1])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[(y-1)*m_width + x-1]); - autotile(x-1, y-1, m_tiles[(y-1)*m_width + x-1]); + autotile(x, y, m_tiles[(y-1)*m_width + x-1], autotileset); + autotile(x-1, y-1, m_tiles[(y-1)*m_width + x-1], autotileset); } if (y - 1 >= 0 && !is_corner(m_tiles[(y-1)*m_width + x])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[(y-1)*m_width + x]); - autotile(x, y-1, m_tiles[(y-1)*m_width + x]); + autotile(x, y, m_tiles[(y-1)*m_width + x], autotileset); + autotile(x, y-1, m_tiles[(y-1)*m_width + x], autotileset); } if (y - 1 >= 0 && x + 1 < m_width && !is_corner(m_tiles[(y-1)*m_width + x+1])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[(y-1)*m_width + x+1]); - autotile(x+1, y-1, m_tiles[(y-1)*m_width + x+1]); + autotile(x, y, m_tiles[(y-1)*m_width + x+1], autotileset); + autotile(x+1, y-1, m_tiles[(y-1)*m_width + x+1], autotileset); } if (x - 1 >= 0 && !is_corner(m_tiles[y*m_width + x-1])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[y*m_width + x-1]); - autotile(x-1, y, m_tiles[y*m_width + x-1]); + autotile(x, y, m_tiles[y*m_width + x-1], autotileset); + autotile(x-1, y, m_tiles[y*m_width + x-1], autotileset); } if (x + 1 < m_width && !is_corner(m_tiles[y*m_width + x+1])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[y*m_width + x+1]); - autotile(x+1, y, m_tiles[y*m_width + x+1]); + autotile(x, y, m_tiles[y*m_width + x+1], autotileset); + autotile(x+1, y, m_tiles[y*m_width + x+1], autotileset); } if (x - 1 >= 0 && y + 1 < m_height && !is_corner(m_tiles[(y+1)*m_width + x-1])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[(y+1)*m_width + x-1]); - autotile(x-1, y+1, m_tiles[(y+1)*m_width + x-1]); + autotile(x, y, m_tiles[(y+1)*m_width + x-1], autotileset); + autotile(x-1, y+1, m_tiles[(y+1)*m_width + x-1], autotileset); } if (y + 1 < m_height && !is_corner(m_tiles[(y+1)*m_width + x])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[(y+1)*m_width + x]); - autotile(x, y+1, m_tiles[(y+1)*m_width + x]); + autotile(x, y, m_tiles[(y+1)*m_width + x], autotileset); + autotile(x, y+1, m_tiles[(y+1)*m_width + x], autotileset); } if (y + 1 < m_height && x + 1 < m_width && !is_corner(m_tiles[(y+1)*m_width + x+1])) { if (m_tiles[y*m_width + x] == 0) - autotile(x, y, m_tiles[(y+1)*m_width + x+1]); - autotile(x+1, y+1, m_tiles[(y+1)*m_width + x+1]); + autotile(x, y, m_tiles[(y+1)*m_width + x+1], autotileset); + autotile(x+1, y+1, m_tiles[(y+1)*m_width + x+1], autotileset); } } } -AutotileSet* -TileMap::get_autotileset(uint32_t tile) const +std::vector +TileMap::get_autotilesets(uint32_t tile) const { - return m_tileset->get_autotileset_from_tile(tile); + return m_tileset->get_autotilesets_from_tile(tile); } void @@ -989,7 +963,7 @@ TileMap::register_class(ssq::VM& vm) PathObject::register_members(cls); - cls.addFunc("get_tile_id", &TileMap::get_tile_id); + cls.addFunc("get_tile_id", &TileMap::get_tile_id); cls.addFunc("get_tile_id_at", &TileMap::get_tile_id_at); cls.addFunc("change", &TileMap::change); cls.addFunc("change_at", &TileMap::change_at); diff --git a/src/object/tilemap.hpp b/src/object/tilemap.hpp index 16a3f4a0b4..3854abaa53 100644 --- a/src/object/tilemap.hpp +++ b/src/object/tilemap.hpp @@ -31,6 +31,7 @@ #include "video/flip.hpp" #include "video/drawing_target.hpp" +class AutotileSet; class CollisionObject; class CollisionGroundMovementManager; class DrawingContext; @@ -169,6 +170,7 @@ class TileMap final : public GameObject, * @param int $y */ uint32_t get_tile_id(int x, int y) const; + uint32_t get_tile_id(const Vector& pos) const; /** * @scripting * @description Returns the ID of the tile at the given position (in world coordinates). @@ -205,7 +207,7 @@ class TileMap final : public GameObject, void change_all(uint32_t oldtile, uint32_t newtile); /** Puts the correct autotile block at the given position */ - void autotile(int x, int y, uint32_t tile); + void autotile(int x, int y, uint32_t tile, AutotileSet* autotileset); enum class AutotileCornerOperation { ADD_TOP_LEFT, @@ -219,13 +221,13 @@ class TileMap final : public GameObject, }; /** Puts the correct autotile blocks at the tiles around the given corner */ - void autotile_corner(int x, int y, uint32_t tile, AutotileCornerOperation op); + void autotile_corner(int x, int y, uint32_t tile, AutotileSet* autotileset, AutotileCornerOperation op); /** Erases in autotile mode */ - void autotile_erase(const Vector& pos, const Vector& corner_pos); + void autotile_erase(const Vector& pos, const Vector& corner_pos, AutotileSet* autotileset); - /** Returns the Autotileset associated with the given tile */ - AutotileSet* get_autotileset(uint32_t tile) const; + /** Returns the Autotilesets associated with the given tile */ + std::vector get_autotilesets(uint32_t tile) const; void set_flip(Flip flip) { m_flip = flip; } Flip get_flip() const { return m_flip; } diff --git a/src/supertux/autotile.hpp b/src/supertux/autotile.hpp index e5951c7716..1d2e8a92df 100644 --- a/src/supertux/autotile.hpp +++ b/src/supertux/autotile.hpp @@ -100,6 +100,8 @@ class AutotileSet final /** Returns the id of the first block in the autotileset. Used for erronous configs. */ uint32_t get_default_tile() const { return m_default; } + const std::string& get_name() const { return m_name; } + /** true if the given tile is present in the autotileset */ bool is_member(uint32_t tile_id) const; diff --git a/src/supertux/tile_set.cpp b/src/supertux/tile_set.cpp index 6faffc7b8b..bc02481bcc 100644 --- a/src/supertux/tile_set.cpp +++ b/src/supertux/tile_set.cpp @@ -100,22 +100,35 @@ TileSet::get(const uint32_t id) const } } -AutotileSet* -TileSet::get_autotileset_from_tile(uint32_t tile_id) const +std::vector +TileSet::get_autotilesets_from_tile(uint32_t tile_id) const { if (tile_id == 0) { - return nullptr; + return {}; } + std::vector autotilesets; for (auto& ats : m_autotilesets) { if (ats->is_member(tile_id)) - { - return ats.get(); - } + autotilesets.push_back(ats.get()); + } + return autotilesets; +} + +bool +TileSet::has_mutual_autotileset(uint32_t lhs, uint32_t rhs) const +{ + if (lhs == rhs) + return true; + + for (const auto& autotileset : m_autotilesets) + { + if (autotileset->is_member(lhs) && autotileset->is_member(rhs)) + return true; } - return nullptr; + return false; } void diff --git a/src/supertux/tile_set.hpp b/src/supertux/tile_set.hpp index 15290622e2..9a1bbc7845 100644 --- a/src/supertux/tile_set.hpp +++ b/src/supertux/tile_set.hpp @@ -65,7 +65,8 @@ class TileSet final const Tile& get(const uint32_t id) const; - AutotileSet* get_autotileset_from_tile(uint32_t tile_id) const; + std::vector get_autotilesets_from_tile(uint32_t tile_id) const; + bool has_mutual_autotileset(uint32_t lhs, uint32_t rhs) const; uint32_t get_max_tileid() const { return static_cast(m_tiles.size()); From bda676b8c82b66d471b5288c9b9914882b8f9117 Mon Sep 17 00:00:00 2001 From: Vankata453 <78196474+Vankata453@users.noreply.github.com> Date: Thu, 24 Oct 2024 20:19:59 +0300 Subject: [PATCH 05/21] `GameObject` change undo/redo refactor to track different options (#3085) `GameObject`, instead of comparing all options against each other, now saves the state of and compares individual ones, so the change data is more memory-efficient. This way of tracking object changes also allows for proper undo/redo tracking with multiple remote users (regarding the [remote level editing concept](https://github.com/SuperTux/supertux/tree/editor-remote-level-networking), which branch these changes originate from). `TileMap` tile changes are now saved in a way more memory-efficient way. Instead of saving the whole tiles array for each change, only the changed tiles are saved in a list of pairs (tile index, old/new tile ID). --- src/editor/layers_widget.cpp | 30 ++- src/editor/layers_widget.hpp | 2 + src/editor/object_option.cpp | 338 +++++++++++++++++++++++++-- src/editor/object_option.hpp | 111 ++++++--- src/editor/object_settings.cpp | 84 +++++++ src/editor/object_settings.hpp | 24 +- src/object/tilemap.cpp | 32 ++- src/object/tilemap.hpp | 3 + src/supertux/game_object.cpp | 24 +- src/supertux/game_object.hpp | 5 +- src/supertux/game_object_change.cpp | 92 ++++++++ src/supertux/game_object_change.hpp | 71 ++++++ src/supertux/game_object_manager.cpp | 221 +++++++++++++++--- src/supertux/game_object_manager.hpp | 47 ++-- src/util/reader_mapping.cpp | 15 +- src/util/reader_mapping.hpp | 2 + src/util/uid.hpp | 5 + src/util/writer.cpp | 7 + src/util/writer.hpp | 3 + src/video/color.cpp | 4 +- src/video/color.hpp | 2 +- 21 files changed, 973 insertions(+), 149 deletions(-) create mode 100644 src/supertux/game_object_change.cpp create mode 100644 src/supertux/game_object_change.hpp diff --git a/src/editor/layers_widget.cpp b/src/editor/layers_widget.cpp index 61d9bf78f1..98a330e863 100644 --- a/src/editor/layers_widget.cpp +++ b/src/editor/layers_widget.cpp @@ -148,17 +148,7 @@ EditorLayersWidget::draw(DrawingContext& context) void EditorLayersWidget::update(float dt_sec) { - auto it = m_layer_icons.begin(); - while (it != m_layer_icons.end()) - { - auto layer_icon = (*it).get(); - if (!layer_icon->is_valid()) - { - it = m_layer_icons.erase(it); - continue; - } - ++it; - } + remove_invalid_layers(); TileMap* selected_tilemap = get_selected_tilemap(); if (selected_tilemap) @@ -460,6 +450,8 @@ EditorLayersWidget::add_layer(GameObject* layer, bool initial) void EditorLayersWidget::update_tip() { + remove_invalid_layers(); + if (m_hovered_layer == m_layer_icons.size()) m_object_tip->set_info(_("Add Layer")); else if (m_hovered_layer > m_layer_icons.size()) @@ -477,6 +469,22 @@ EditorLayersWidget::update_current_tip() update_tip(); } +void +EditorLayersWidget::remove_invalid_layers() +{ + auto it = m_layer_icons.begin(); + while (it != m_layer_icons.end()) + { + auto layer_icon = (*it).get(); + if (!layer_icon->is_valid()) + { + it = m_layer_icons.erase(it); + continue; + } + ++it; + } +} + TileMap* EditorLayersWidget::get_selected_tilemap() const { diff --git a/src/editor/layers_widget.hpp b/src/editor/layers_widget.hpp index e974fa91e2..3efc7355c4 100644 --- a/src/editor/layers_widget.hpp +++ b/src/editor/layers_widget.hpp @@ -78,7 +78,9 @@ class EditorLayersWidget final : public Widget private: Vector get_layer_coords(const int pos) const; int get_layer_pos(const Vector& coords) const; + void update_tip(); + void remove_invalid_layers(); private: Editor& m_editor; diff --git a/src/editor/object_option.cpp b/src/editor/object_option.cpp index 06f70b2bfa..a25b044a88 100644 --- a/src/editor/object_option.cpp +++ b/src/editor/object_option.cpp @@ -29,8 +29,12 @@ #include "gui/menu_object_select.hpp" #include "object/tilemap.hpp" #include "supertux/direction.hpp" +#include "supertux/game_object_factory.hpp" #include "supertux/moving_object.hpp" #include "util/gettext.hpp" +#include "util/log.hpp" +#include "util/reader_iterator.hpp" +#include "util/reader_mapping.hpp" #include "util/writer.hpp" #include "video/color.hpp" @@ -46,11 +50,62 @@ std::string fmt_to_string(const T& v) } // namespace +bool BaseObjectOption::s_allow_saving_defaults = false; + BaseObjectOption::BaseObjectOption(const std::string& text, const std::string& key, unsigned int flags) : m_text(text), m_key(key), - m_flags(flags) + m_flags(flags), + m_last_state() +{ +} + +std::string +BaseObjectOption::save() const { + std::ostringstream stream; + Writer writer(stream); + save(writer); + + return stream.str(); +} + +void +BaseObjectOption::save_state() +{ + s_allow_saving_defaults = true; + m_last_state = save(); + s_allow_saving_defaults = false; +} + +bool +BaseObjectOption::has_state_changed() const +{ + s_allow_saving_defaults = true; + const bool result = m_last_state != save(); + s_allow_saving_defaults = false; + + return result; +} + +void +BaseObjectOption::parse_state(const ReaderMapping& reader) +{ + parse(reader); +} + +void +BaseObjectOption::save_old_state(std::ostream& out) const +{ + out << m_last_state; +} + +void +BaseObjectOption::save_new_state(Writer& writer) const +{ + s_allow_saving_defaults = true; + save(writer); + s_allow_saving_defaults = false; } template @@ -74,11 +129,17 @@ BoolObjectOption::add_to_menu(Menu& menu) const menu.add_toggle(-1, get_text(), m_value_pointer); } +void +BoolObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void BoolObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { writer.write(get_key(), *m_value_pointer); @@ -100,11 +161,17 @@ IntObjectOption::IntObjectOption(const std::string& text, int* pointer, const st { } +void +IntObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void IntObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { writer.write(get_key(), *m_value_pointer); @@ -130,11 +197,6 @@ LabelObjectOption::LabelObjectOption(const std::string& text, { } -void -LabelObjectOption::save(Writer& writer) const -{ -} - std::string LabelObjectOption::to_string() const { @@ -155,6 +217,13 @@ RectfObjectOption::RectfObjectOption(const std::string& text, Rectf* pointer, co { } +void +RectfObjectOption::parse(const ReaderMapping& reader) +{ + reader.get("width", m_width); + reader.get("height", m_height); +} + void RectfObjectOption::save(Writer& write) const { @@ -187,11 +256,17 @@ FloatObjectOption::FloatObjectOption(const std::string& text, float* pointer, co { } +void +FloatObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void FloatObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { writer.write(get_key(), *m_value_pointer); @@ -219,11 +294,19 @@ StringObjectOption::StringObjectOption(const std::string& text, std::string* poi { } +void +StringObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void StringObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if ((m_default_value && *m_default_value == *m_value_pointer) || m_value_pointer->empty()) { + if (!s_allow_saving_defaults && + ((m_default_value && *m_default_value == *m_value_pointer) || + m_value_pointer->empty())) { // skip } else { writer.write(get_key(), *m_value_pointer, (get_flags() & OPTION_TRANSLATABLE)); @@ -251,11 +334,19 @@ StringMultilineObjectOption::StringMultilineObjectOption(const std::string& text { } +void +StringMultilineObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void StringMultilineObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if ((m_default_value && *m_default_value == *m_value_pointer) || m_value_pointer->empty()) { + if (!s_allow_saving_defaults && + ((m_default_value && *m_default_value == *m_value_pointer) || + m_value_pointer->empty())) { // skip } else { writer.write(get_key(), *m_value_pointer, (get_flags() & OPTION_TRANSLATABLE)); @@ -288,11 +379,17 @@ StringSelectObjectOption::StringSelectObjectOption(const std::string& text, int* { } +void +StringSelectObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void StringSelectObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { writer.write(get_key(), *m_value_pointer); @@ -333,13 +430,28 @@ EnumObjectOption::EnumObjectOption(const std::string& text, int* pointer, { } +void +EnumObjectOption::parse(const ReaderMapping& reader) +{ + std::string symbol; + if (reader.get(get_key().c_str(), symbol)) + { + int i = 0; + while (i < static_cast(m_symbols.size()) && m_symbols[i] != symbol) + i++; + + if (0 <= i && i < static_cast(m_symbols.size())) + *m_value_pointer = i; + } +} + void EnumObjectOption::save(Writer& writer) const { - if (0 <= *m_value_pointer && *m_value_pointer < int(m_symbols.size()) && + if (0 <= *m_value_pointer && *m_value_pointer < static_cast(m_symbols.size()) && !get_key().empty()) { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { writer.write(get_key(), m_symbols[*m_value_pointer]); @@ -350,7 +462,7 @@ EnumObjectOption::save(Writer& writer) const std::string EnumObjectOption::to_string() const { - if (0 <= *m_value_pointer && *m_value_pointer < int(m_labels.size())) { + if (0 <= *m_value_pointer && *m_value_pointer < static_cast(m_labels.size())) { return m_labels[*m_value_pointer]; } else { return _("invalid"); @@ -373,11 +485,17 @@ ScriptObjectOption::ScriptObjectOption(const std::string& text, std::string* poi { } +void +ScriptObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void ScriptObjectOption::save(Writer& writer) const { auto& value = *m_value_pointer; - if (!value.empty()) + if (s_allow_saving_defaults || !value.empty()) { if (!get_key().empty()) { writer.write(get_key(), value); @@ -415,10 +533,16 @@ FileObjectOption::FileObjectOption(const std::string& text, std::string* pointer { } +void +FileObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void FileObjectOption::save(Writer& writer) const { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { auto& value = *m_value_pointer; @@ -452,11 +576,19 @@ ColorObjectOption::ColorObjectOption(const std::string& text, Color* pointer, co { } +void +ColorObjectOption::parse(const ReaderMapping& reader) +{ + std::vector v_color; + if (reader.get(get_key().c_str(), v_color)) + *m_value_pointer = Color(v_color, m_use_alpha); +} + void ColorObjectOption::save(Writer& writer) const { if (!get_key().empty()) { - if (m_default_value && *m_default_value == *m_value_pointer) { + if (!s_allow_saving_defaults && m_default_value && *m_default_value == *m_value_pointer) { // skip } else { auto vec = m_value_pointer->toVector(); @@ -489,6 +621,34 @@ ObjectSelectObjectOption::ObjectSelectObjectOption(const std::string& text, std: { } +void +ObjectSelectObjectOption::parse(const ReaderMapping& reader) +{ + std::optional objects_mapping; + if (reader.get(get_key().c_str(), objects_mapping)) + { + m_value_pointer->clear(); + + auto iter = objects_mapping->get_iter(); + while (iter.next()) + { + try + { + auto obj = GameObjectFactory::instance().create(iter.get_key(), iter.as_mapping()); + if (m_add_object_function) + m_add_object_function(std::move(obj)); + else + m_value_pointer->push_back(std::move(obj)); + } + catch (const std::exception& err) + { + log_warning << "Error adding object select option object '" << iter.get_key() + << "': " << err.what() << std::endl; + } + } + } +} + void ObjectSelectObjectOption::save(Writer& writer) const { @@ -530,19 +690,32 @@ ObjectSelectObjectOption::add_to_menu(Menu& menu) const }); } +TilesObjectOption::TilesState::TilesState() : + width(), + height(), + tiles() +{ +} + TilesObjectOption::TilesObjectOption(const std::string& text, TileMap* tilemap, const std::string& key, unsigned int flags) : - ObjectOption(text, key, flags), - m_tilemap(tilemap) + ObjectOption(text, key, flags, tilemap), + m_last_tiles_state() +{ +} + +void +TilesObjectOption::parse(const ReaderMapping& reader) { + m_value_pointer->parse_tiles(reader); } void TilesObjectOption::save(Writer& write) const { - write.write("width", m_tilemap->get_width()); - write.write("height", m_tilemap->get_height()); - write.write("tiles", m_tilemap->get_tiles(), m_tilemap->get_width()); + write.write("width", m_value_pointer->get_width()); + write.write("height", m_value_pointer->get_height()); + write.write("tiles", m_value_pointer->get_tiles(), m_value_pointer->get_width()); } std::string @@ -556,12 +729,86 @@ TilesObjectOption::add_to_menu(Menu& menu) const { } +void +TilesObjectOption::save_state() +{ + BaseObjectOption::save_state(); + + m_last_tiles_state.width = m_value_pointer->get_width(); + m_last_tiles_state.height = m_value_pointer->get_height(); + m_last_tiles_state.tiles = m_value_pointer->get_tiles(); +} + +void +TilesObjectOption::parse_state(const ReaderMapping& reader) +{ + parse(reader); + + std::vector tile_changes; // Array of pairs (index, old/new tile ID). + if (!reader.get("tile-changes", tile_changes)) + return; + + if (tile_changes.size() % 2 != 0) + throw std::runtime_error("'tile-changes' does not contain number pairs."); + + for (size_t i = 0; i < tile_changes.size(); i += 2) + m_value_pointer->change(tile_changes[i], static_cast(tile_changes[i + 1])); +} + +void +TilesObjectOption::save_old_state(std::ostream& out) const +{ + Writer writer(out); + save_tile_changes(writer, false); +} + +void +TilesObjectOption::save_new_state(Writer& writer) const +{ + save_tile_changes(writer, true); +} + +void +TilesObjectOption::save_tile_changes(Writer& writer, bool new_tiles) const +{ + writer.write("width", new_tiles ? m_value_pointer->get_width() : m_last_tiles_state.width); + writer.write("height", new_tiles ? m_value_pointer->get_height() : m_last_tiles_state.height); + + assert(!m_last_tiles_state.tiles.empty()); + const auto& tiles = m_value_pointer->get_tiles(); + + // Tiles have been resized. Save all tiles. + if (m_last_tiles_state.tiles.size() != tiles.size()) + { + writer.write("tiles", new_tiles ? tiles : m_last_tiles_state.tiles); + return; + } + + // Get and write old/new states of changed tiles in the array. + std::vector tile_changes; // Array of pairs (index, old/new tile ID). + for (uint32_t i = 0; i < static_cast(m_last_tiles_state.tiles.size()); i++) + { + if (m_last_tiles_state.tiles[i] != tiles[i]) + { + tile_changes.push_back(i); + tile_changes.push_back(new_tiles ? tiles[i] : m_last_tiles_state.tiles[i]); + } + } + writer.write("tile-changes", tile_changes); +} + PathObjectOption::PathObjectOption(const std::string& text, Path* path, const std::string& key, unsigned int flags) : ObjectOption(text, key, flags, path) { } +void +PathObjectOption::parse(const ReaderMapping& reader) +{ + m_value_pointer->read(reader); +} + void PathObjectOption::save(Writer& write) const { @@ -586,6 +833,12 @@ PathRefObjectOption::PathRefObjectOption(const std::string& text, PathObject& ta { } +void +PathRefObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), m_path_ref); +} + void PathRefObjectOption::save(Writer& writer) const { @@ -612,6 +865,12 @@ SExpObjectOption::SExpObjectOption(const std::string& text, const std::string& k { } +void +SExpObjectOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void SExpObjectOption::save(Writer& writer) const { @@ -638,6 +897,19 @@ PathHandleOption::PathHandleOption(const std::string& text, PathWalker::Handle& { } +void +PathHandleOption::parse(const ReaderMapping& reader) +{ + std::optional handle_mapping; + if (reader.get(get_key().c_str(), handle_mapping)) + { + handle_mapping->get("scale_x", m_target.m_scalar_pos.x); + handle_mapping->get("scale_y", m_target.m_scalar_pos.y); + handle_mapping->get("offset_x", m_target.m_pixel_offset.x); + handle_mapping->get("offset_y", m_target.m_pixel_offset.y); + } +} + void PathHandleOption::save(Writer& writer) const { @@ -742,6 +1014,12 @@ StringArrayOption::StringArrayOption(const std::string& text, const std::string& m_items(items) {} +void +StringArrayOption::parse(const ReaderMapping& reader) +{ + reader.get("strings", m_items); +} + void StringArrayOption::save(Writer& write) const { @@ -759,6 +1037,12 @@ ListOption::ListOption(const std::string& text, const std::string& key, const st m_items(items) {} +void +ListOption::parse(const ReaderMapping& reader) +{ + reader.get(get_key().c_str(), *m_value_pointer); +} + void ListOption::save(Writer& writer) const { @@ -782,6 +1066,14 @@ DirectionOption::DirectionOption(const std::string& text, Direction* value_ptr, Direction::RIGHT, Direction::UP, Direction::DOWN }; } +void +DirectionOption::parse(const ReaderMapping& reader) +{ + std::string dir_string; + if (reader.get(get_key().c_str(), dir_string)) + *m_value_pointer = string_to_dir(dir_string); +} + void DirectionOption::save(Writer& writer) const { diff --git a/src/editor/object_option.hpp b/src/editor/object_option.hpp index ede074fc84..2385921be4 100644 --- a/src/editor/object_option.hpp +++ b/src/editor/object_option.hpp @@ -45,20 +45,34 @@ class GameObject; class Menu; class Path; class PathObject; +class ReaderMapping; class Rectf; class TileMap; class Writer; class BaseObjectOption { +protected: + /** If set, options with their default value set will be saved. */ + static bool s_allow_saving_defaults; + public: BaseObjectOption(const std::string& text, const std::string& key, unsigned int flags); virtual ~BaseObjectOption() = default; - virtual void save(Writer& write) const = 0; + virtual void parse(const ReaderMapping& reader) = 0; + virtual void save(Writer& writer) const = 0; virtual std::string to_string() const = 0; virtual void add_to_menu(Menu& menu) const = 0; + std::string save() const; + + virtual void save_state(); + bool has_state_changed() const; + virtual void parse_state(const ReaderMapping& reader); + virtual void save_old_state(std::ostream& out) const; + virtual void save_new_state(Writer& writer) const; + const std::string& get_key() const { return m_key; } const std::string& get_text() const { return m_text; } unsigned int get_flags() const { return m_flags; } @@ -68,6 +82,8 @@ class BaseObjectOption const std::string m_key; const unsigned int m_flags; + std::string m_last_state; + private: BaseObjectOption(const BaseObjectOption&) = delete; BaseObjectOption& operator=(const BaseObjectOption&) = delete; @@ -97,7 +113,8 @@ class BoolObjectOption final : public ObjectOption std::optional default_value, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -116,7 +133,8 @@ class IntObjectOption final : public ObjectOption std::optional default_value, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -134,7 +152,8 @@ class LabelObjectOption final : public ObjectOption<> LabelObjectOption(const std::string& text, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override {} + virtual void save(Writer& writer) const override {} virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -149,7 +168,8 @@ class RectfObjectOption final : public ObjectOption RectfObjectOption(const std::string& text, Rectf* pointer, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -169,7 +189,8 @@ class FloatObjectOption final : public ObjectOption std::optional default_value, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -188,7 +209,8 @@ class StringObjectOption final : public ObjectOption std::optional default_value, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -207,7 +229,8 @@ class StringMultilineObjectOption final : public ObjectOption std::optional default_value, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -226,7 +249,8 @@ class StringSelectObjectOption final : public ObjectOption std::optional default_value, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -248,7 +272,8 @@ class EnumObjectOption final : public ObjectOption std::optional default_value, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -268,7 +293,8 @@ class ScriptObjectOption final : public ObjectOption ScriptObjectOption(const std::string& text, std::string* pointer, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -288,7 +314,8 @@ class FileObjectOption final : public ObjectOption bool path_relative_to_basedir, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -310,7 +337,8 @@ class ColorObjectOption final : public ObjectOption std::optional default_value, bool use_alpha, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -330,7 +358,8 @@ class ObjectSelectObjectOption final : public ObjectOption)>& add_object_func, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -349,12 +378,29 @@ class TilesObjectOption final : public ObjectOption TilesObjectOption(const std::string& text, TileMap* tilemap, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; + virtual void save_state() override; + virtual void parse_state(const ReaderMapping& reader) override; + virtual void save_old_state(std::ostream& out) const override; + virtual void save_new_state(Writer& writer) const override; + +private: + void save_tile_changes(Writer& writer, bool new_tiles) const; + private: - TileMap* m_tilemap; + struct TilesState final + { + TilesState(); + + int width; + int height; + std::vector tiles; + }; + TilesState m_last_tiles_state; private: TilesObjectOption(const TilesObjectOption&) = delete; @@ -367,7 +413,8 @@ class PathObjectOption final : public ObjectOption PathObjectOption(const std::string& text, Path* path, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -382,7 +429,8 @@ class PathRefObjectOption final : public ObjectOption PathRefObjectOption(const std::string& text, PathObject& target, const std::string& path_ref, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -399,7 +447,8 @@ class SExpObjectOption final : public ObjectOption public: SExpObjectOption(const std::string& text, const std::string& key, sexp::Value& value, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -414,7 +463,8 @@ class PathHandleOption final : public ObjectOption PathHandleOption(const std::string& text, PathWalker::Handle& handle, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -431,7 +481,8 @@ class RemoveObjectOption final : public ObjectOption<> public: RemoveObjectOption(); - virtual void save(Writer& write) const override {} + virtual void parse(const ReaderMapping& reader) override {} + virtual void save(Writer& writer) const override {} virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -445,7 +496,8 @@ class TestFromHereOption final : public ObjectOption<> public: TestFromHereOption(); - virtual void save(Writer& write) const override {} + virtual void parse(const ReaderMapping& reader) override {} + virtual void save(Writer& writer) const override {} virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -459,7 +511,8 @@ class ParticleEditorOption final : public ObjectOption<> public: ParticleEditorOption(); - virtual void save(Writer& write) const override {} + virtual void parse(const ReaderMapping& reader) override {} + virtual void save(Writer& writer) const override {} virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -473,7 +526,8 @@ class ButtonOption final : public ObjectOption<> public: ButtonOption(const std::string& text, std::function callback); - virtual void save(Writer& write) const override {} + virtual void parse(const ReaderMapping& reader) override {} + virtual void save(Writer& writer) const override {} virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; @@ -490,7 +544,8 @@ class StringArrayOption final : public ObjectOption<> public: StringArrayOption(const std::string& text, const std::string& key, std::vector& items); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override { return "text-area"; } virtual void add_to_menu(Menu& menu) const override; @@ -507,7 +562,8 @@ class ListOption final : public ObjectOption public: ListOption(const std::string& text, const std::string& key, const std::vector& items, std::string* value_ptr); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override { return *m_value_pointer; } virtual void add_to_menu(Menu& menu) const override; @@ -526,7 +582,8 @@ class DirectionOption final : public ObjectOption std::vector possible_directions, const std::string& key, unsigned int flags); - virtual void save(Writer& write) const override; + virtual void parse(const ReaderMapping& reader) override; + virtual void save(Writer& writer) const override; virtual std::string to_string() const override; virtual void add_to_menu(Menu& menu) const override; diff --git a/src/editor/object_settings.cpp b/src/editor/object_settings.cpp index 45ee96e4ca..964850e397 100644 --- a/src/editor/object_settings.cpp +++ b/src/editor/object_settings.cpp @@ -20,6 +20,7 @@ #include #include "util/gettext.hpp" +#include "util/log.hpp" #include "video/color.hpp" ObjectSettings::ObjectSettings(const std::string& name) : @@ -28,9 +29,25 @@ ObjectSettings::ObjectSettings(const std::string& name) : { } +ObjectSettings::ObjectSettings(ObjectSettings&& other) : + m_name(other.m_name), + m_options(std::move(other.m_options)) +{ +} + void ObjectSettings::add_option(std::unique_ptr option) { + if (!option->get_key().empty()) + { + // Make sure no option with the same key exists + assert(std::none_of(m_options.begin(), m_options.end(), + [key = option->get_key()](const auto& opt) + { + return key == opt->get_key(); + })); + } + m_options.push_back(std::move(option)); } @@ -392,4 +409,71 @@ ObjectSettings::remove(const std::string& key) m_options.end()); } +void +ObjectSettings::parse(const ReaderMapping& reader) +{ + for (const auto& option : m_options) + { + try + { + option->parse(reader); + } + catch (const std::exception& err) + { + log_warning << "Error processing data for option '" << option->get_key() + << "': " << err.what() << std::endl; + } + } +} + +void +ObjectSettings::save_state() +{ + for (const auto& option : m_options) + option->save_state(); +} + +bool +ObjectSettings::has_state_changed() const +{ + for (const auto& option : m_options) + if (option->has_state_changed()) + return true; + + return false; +} + +void +ObjectSettings::parse_state(const ReaderMapping& reader) +{ + for (const auto& option : m_options) + { + try + { + option->parse_state(reader); + } + catch (const std::exception& err) + { + log_warning << "Error processing state data for option '" << option->get_key() + << "': " << err.what() << std::endl; + } + } +} + +void +ObjectSettings::save_old_state(std::ostream& out) const +{ + for (const auto& option : m_options) + if (option->has_state_changed()) + option->save_old_state(out); +} + +void +ObjectSettings::save_new_state(Writer& writer) const +{ + for (const auto& option : m_options) + if (option->has_state_changed()) + option->save_new_state(writer); +} + /* EOF */ diff --git a/src/editor/object_settings.hpp b/src/editor/object_settings.hpp index b9ba078d97..df523d1711 100644 --- a/src/editor/object_settings.hpp +++ b/src/editor/object_settings.hpp @@ -28,10 +28,14 @@ class Color; enum class Direction; class GameObject; class PathObject; +class ReaderMapping; enum class WalkMode; +class Writer; + namespace worldmap { enum class Direction; } // namespace worldmap + namespace sexp { class Value; } // namespace sexp @@ -40,7 +44,9 @@ class ObjectSettings final { public: ObjectSettings(const std::string& name); - ObjectSettings(ObjectSettings&&) = default; + ObjectSettings(ObjectSettings&& other); + + ObjectSettings& operator=(ObjectSettings&&) = default; const std::string& get_name() const { return m_name; } @@ -167,6 +173,22 @@ class ObjectSettings final /** Remove an option from the list, this is a hack */ void remove(const std::string& key); + /** Parse option properties. */ + void parse(const ReaderMapping& reader); + + /** Save the current states of all options. */ + void save_state(); + + /** Check all options for any with a changed state. */ + bool has_state_changed() const; + + /** Parse option properties from an alternative state. */ + void parse_state(const ReaderMapping& reader); + + /** Write the old/new states of all modified options. */ + void save_old_state(std::ostream& out) const; + void save_new_state(Writer& writer) const; + private: void add_option(std::unique_ptr option); diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index 0561ac0a7a..ba9cacc13c 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -156,9 +156,16 @@ TileMap::TileMap(const TileSet *tileset_, const ReaderMapping& reader) : m_effective_solid = m_real_solid; update_effective_solid(false); + parse_tiles(reader); +} + +void +TileMap::parse_tiles(const ReaderMapping& reader) +{ reader.get("width", m_width); reader.get("height", m_height); - if (m_width < 0 || m_height < 0) { + if (m_width < 0 || m_height < 0) + { //throw std::runtime_error("Invalid/No width/height specified in tilemap."); m_width = 0; m_height = 0; @@ -166,13 +173,15 @@ TileMap::TileMap(const TileSet *tileset_, const ReaderMapping& reader) : resize(static_cast(Sector::get().get_width() / 32.0f), static_cast(Sector::get().get_height() / 32.0f)); m_editor_active = false; - } else { - if (!reader.get("tiles", m_tiles)) + } + else + { + reader.get("tiles", m_tiles); + if (m_tiles.empty()) throw std::runtime_error("No tiles in tilemap."); - if (int(m_tiles.size()) != m_width * m_height) { + if (static_cast(m_tiles.size()) != m_width * m_height) throw std::runtime_error("wrong number of tiles in tilemap."); - } } bool empty = true; @@ -190,6 +199,11 @@ TileMap::TileMap(const TileSet *tileset_, const ReaderMapping& reader) : { log_info << "Tilemap '" << get_name() << "', z-pos '" << m_z_pos << "' is empty." << std::endl; } + + m_new_size_x = m_width; + m_new_size_y = m_height; + m_new_offset_x = 0; + m_new_offset_y = 0; } void @@ -705,6 +719,12 @@ TileMap::change(int x, int y, uint32_t newtile) m_tiles[y*m_width + x] = newtile; } +void +TileMap::change(int idx, uint32_t newtile) +{ + m_tiles[idx] = newtile; +} + void TileMap::change_at(const Vector& pos, uint32_t newtile) { @@ -965,7 +985,7 @@ TileMap::register_class(ssq::VM& vm) cls.addFunc("get_tile_id", &TileMap::get_tile_id); cls.addFunc("get_tile_id_at", &TileMap::get_tile_id_at); - cls.addFunc("change", &TileMap::change); + cls.addFunc("change", &TileMap::change); cls.addFunc("change_at", &TileMap::change_at); cls.addFunc("change_all", &TileMap::change_all); cls.addFunc("fade", &TileMap::fade); diff --git a/src/object/tilemap.hpp b/src/object/tilemap.hpp index 3854abaa53..8daf470761 100644 --- a/src/object/tilemap.hpp +++ b/src/object/tilemap.hpp @@ -58,6 +58,8 @@ class TileMap final : public GameObject, TileMap(const TileSet *tileset, const ReaderMapping& reader); ~TileMap() override; + void parse_tiles(const ReaderMapping& reader); + virtual void finish_construction() override; static std::string class_name() { return "tilemap"; } @@ -189,6 +191,7 @@ class TileMap final : public GameObject, * @param int $newtile */ void change(int x, int y, uint32_t newtile); + void change(int idx, uint32_t newtile); /** * @scripting * @description Changes the tile at the given position (in-world coordinates) to ""newtile"". diff --git a/src/supertux/game_object.cpp b/src/supertux/game_object.cpp index d52bb6d5e2..d245bcf860 100644 --- a/src/supertux/game_object.cpp +++ b/src/supertux/game_object.cpp @@ -196,14 +196,14 @@ GameObject::save_state() if (!m_parent->undo_tracking_enabled()) { - m_last_state.clear(); + m_last_state.reset(); return; } - if (!track_state()) + if (!track_state() || m_last_state) return; - if (m_last_state.empty()) - m_last_state = save(); + m_last_state = get_settings(); + m_last_state->save_state(); } void @@ -214,21 +214,15 @@ GameObject::check_state() if (!m_parent->undo_tracking_enabled()) { - m_last_state.clear(); + m_last_state.reset(); return; } - if (!track_state()) + if (!track_state() || !m_last_state) return; - // If settings have changed, save the change. - if (!m_last_state.empty()) - { - if (m_last_state != save()) - { - m_parent->save_object_change(*this, m_last_state); - } - m_last_state.clear(); - } + // Save any option changes. + m_parent->save_object_change(*this, *m_last_state); + m_last_state.reset(); } void diff --git a/src/supertux/game_object.hpp b/src/supertux/game_object.hpp index e576d653c2..7b4ce294ba 100644 --- a/src/supertux/game_object.hpp +++ b/src/supertux/game_object.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "editor/object_settings.hpp" @@ -309,9 +310,9 @@ class GameObject : public ExposableClass /** this flag indicates if the object should be removed at the end of the frame */ bool m_scheduled_for_removal; - /** The object's data at the time of the last state save. + /** The object's settings at the time of the last state save. Used to check for changes that may have occured. */ - std::string m_last_state; + std::optional m_last_state; std::vector > m_components; diff --git a/src/supertux/game_object_change.cpp b/src/supertux/game_object_change.cpp new file mode 100644 index 0000000000..db0a3b184d --- /dev/null +++ b/src/supertux/game_object_change.cpp @@ -0,0 +1,92 @@ +// SuperTux +// Copyright (C) 2024 Vankata453 +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "supertux/game_object_change.hpp" + +#include "util/log.hpp" +#include "util/reader_iterator.hpp" +#include "util/reader_mapping.hpp" +#include "util/writer.hpp" + +GameObjectChange::GameObjectChange(const std::string& name_, const UID& uid_, + const std::string& data_, const std::string& new_data_, + Action action_) : + name(name_), + uid(uid_), + data(data_), + new_data(new_data_), + action(action_) +{ +} + +GameObjectChange::GameObjectChange(const ReaderMapping& reader) : + name(), + uid(), + data(), + new_data(), + action() +{ + reader.get("name", name); + reader.get("uid", uid); + reader.get("data", data); + reader.get("action", reinterpret_cast(action)); +} + +void +GameObjectChange::save(Writer& writer) const +{ + writer.write("name", name); + writer.write("uid", uid); + writer.write("data", data); + writer.write("action", reinterpret_cast(action)); +} + + +GameObjectChangeSet::GameObjectChangeSet(const UID& uid_, std::vector changes_) : + uid(uid_), + changes(std::move(changes_)) +{ +} + +GameObjectChangeSet::GameObjectChangeSet(const ReaderMapping& reader) : + uid(), + changes() +{ + auto iter = reader.get_iter(); + while (iter.next()) + { + if (iter.get_key() != "object-change") + { + log_warning << "Unknown key '" << iter.get_key() << "' in GameObjectChanges data. Ignoring." << std::endl; + continue; + } + + changes.push_back(GameObjectChange(iter.as_mapping())); + } +} + +void +GameObjectChangeSet::save(Writer& writer) const +{ + for (const auto& change : changes) + { + writer.start_list("object-change"); + change.save(writer); + writer.end_list("object-change"); + } +} + +/* EOF */ diff --git a/src/supertux/game_object_change.hpp b/src/supertux/game_object_change.hpp new file mode 100644 index 0000000000..96624adf46 --- /dev/null +++ b/src/supertux/game_object_change.hpp @@ -0,0 +1,71 @@ +// SuperTux +// Copyright (C) 2024 Vankata453 +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifndef HEADER_SUPERTUX_SUPERTUX_GAME_OBJECT_CHANGE_HPP +#define HEADER_SUPERTUX_SUPERTUX_GAME_OBJECT_CHANGE_HPP + +#include +#include + +#include "util/uid.hpp" + +class ReaderMapping; +class Writer; + +/** Stores a change in a GameObject's state. */ +class GameObjectChange final +{ +public: + enum Action + { + ACTION_CREATE, + ACTION_DELETE, + ACTION_MODIFY + }; + +public: + GameObjectChange(const std::string& name, const UID& uid, + const std::string& data, const std::string& new_data, + Action action); + GameObjectChange(const ReaderMapping& reader); + + void save(Writer& writer) const; + +public: + std::string name; + UID uid; + std::string data; // Stores old data of changed object options + std::string new_data; // Stores new data of changed object options + Action action; // The action which triggered a state change +}; + +/** Stores multiple GameObjectChange-s. */ +class GameObjectChangeSet final +{ +public: + GameObjectChangeSet(const UID& uid, std::vector changes); + GameObjectChangeSet(const ReaderMapping& reader); + + void save(Writer& writer) const; + +public: + UID uid; + std::vector changes; +}; + +#endif + +/* EOF */ diff --git a/src/supertux/game_object_manager.cpp b/src/supertux/game_object_manager.cpp index 52d33a26af..eecf558bd6 100644 --- a/src/supertux/game_object_manager.cpp +++ b/src/supertux/game_object_manager.cpp @@ -29,6 +29,9 @@ #include "object/tilemap.hpp" #include "supertux/game_object_factory.hpp" #include "supertux/moving_object.hpp" +#include "util/reader_document.hpp" +#include "util/reader_mapping.hpp" +#include "util/writer.hpp" bool GameObjectManager::s_draw_solids_only = false; @@ -283,7 +286,7 @@ GameObjectManager::flush_game_objects() // If object changes have been performed since last flush, push them to the undo stack. if (m_undo_tracking && !m_pending_change_stack.empty()) { - m_undo_stack.push_back({ m_change_uid_generator.next(), std::move(m_pending_change_stack) }); + m_undo_stack.emplace_back(m_change_uid_generator.next(), std::move(m_pending_change_stack)); m_redo_stack.clear(); undo_stack_cleanup(); } @@ -376,16 +379,93 @@ GameObjectManager::on_editor_save() m_last_saved_change = (m_undo_stack.empty() ? UID() : m_undo_stack.back().uid); } +void +GameObjectManager::apply_object_change(const GameObjectChange& change, bool track_undo) +{ + GameObject* object = get_object_by_uid(change.uid); + switch (change.action) + { + case GameObjectChange::ACTION_CREATE: + { + create_object_from_change(change, track_undo); + } + break; + + case GameObjectChange::ACTION_DELETE: + { + if (!object) + throw std::runtime_error("Object '" + change.name + "' does not exist."); + + object->m_track_undo = track_undo; + object->remove_me(); + } + break; + + case GameObjectChange::ACTION_MODIFY: + { + if (!object) + throw std::runtime_error("Object '" + change.name + "' does not exist."); + + auto settings = object->get_settings(); + if (track_undo) + settings.save_state(); + + parse_object_settings(settings, change.data); // Parse settings + object->after_editor_set(); + + if (track_undo) + save_object_change(*object, settings); + } + break; + + default: + break; + } +} + +void +GameObjectManager::apply_object_changes(const GameObjectChangeSet& change_set, bool track_undo) +{ + for (const auto& change : change_set.changes) + { + try + { + apply_object_change(change, track_undo); + } + catch (const std::exception& err) + { + log_warning << "Cannot process object state change for object with UID " + << change.uid << ": " << err.what() << std::endl; + } + } +} + void GameObjectManager::undo() { if (m_undo_stack.empty()) return; - ObjectChanges& changes = m_undo_stack.back(); + GameObjectChangeSet& change_set = m_undo_stack.back(); - for (auto& obj_change : changes.objects) - process_object_change(obj_change); + auto it = change_set.changes.begin(); + while (it != change_set.changes.end()) + { + try + { + process_object_change(*it); + it++; + } + catch (const std::exception& err) + { + log_warning << "Cannot process object change: " << err.what() << std::endl; + it = change_set.changes.erase(it); // Drop invalid changes + } + } - m_redo_stack.push_back(std::move(changes)); + if (!change_set.changes.empty()) + { + // Changes have been reversed for redo + m_redo_stack.push_back(std::move(change_set)); + } m_undo_stack.pop_back(); } @@ -393,62 +473,139 @@ void GameObjectManager::redo() { if (m_redo_stack.empty()) return; - ObjectChanges& changes = m_redo_stack.back(); + GameObjectChangeSet& change_set = m_redo_stack.back(); - for (auto& obj_change : changes.objects) - process_object_change(obj_change); + auto it = change_set.changes.begin(); + while (it != change_set.changes.end()) + { + try + { + process_object_change(*it); + it++; + } + catch (const std::exception& err) + { + log_warning << "Cannot process object change: " << err.what() << std::endl; + it = change_set.changes.erase(it); // Drop invalid changes + } + } - m_undo_stack.push_back(std::move(changes)); + if (!change_set.changes.empty()) + { + // Changes have been reversed for undo + m_undo_stack.push_back(std::move(change_set)); + } m_redo_stack.pop_back(); } void -GameObjectManager::create_object_from_change(const ObjectChange& change) +GameObjectManager::create_object_from_change(const GameObjectChange& change, bool track_undo) { auto object = GameObjectFactory::instance().create(change.name, change.data); - object->m_track_undo = false; + object->m_track_undo = track_undo; object->set_uid(change.uid); object->after_editor_set(); add_object(std::move(object)); } void -GameObjectManager::process_object_change(ObjectChange& change) +GameObjectManager::parse_object_settings(ObjectSettings& settings, const std::string& data) +{ + std::istringstream stream(data); + auto doc = ReaderDocument::from_stream(stream); + auto root = doc.get_root(); + if (root.get_name() != "supertux-game-object") + throw std::runtime_error("Data is not 'supertux-game-object'."); + + settings.parse_state(root.get_mapping()); +} + +std::string +GameObjectManager::save_object_settings_state(const ObjectSettings& settings, bool new_state) +{ + std::ostringstream stream; + Writer writer(stream); + + writer.start_list("supertux-game-object"); + if (new_state) + settings.save_new_state(writer); + else + settings.save_old_state(stream); + writer.end_list("supertux-game-object"); + + return stream.str(); +} + +void +GameObjectManager::process_object_change(GameObjectChange& change) { GameObject* object = get_object_by_uid(change.uid); - if (object) // Object exists, remove it. + switch (change.action) { - object->m_track_undo = false; - object->remove_me(); + case GameObjectChange::ACTION_CREATE: /** Object was added, remove it. */ + { + if (!object) + throw std::runtime_error("Object '" + change.name + "' no longer exists."); - const std::string data = object->save(); + object->m_track_undo = false; + object->remove_me(); - // If settings have changed, re-create object with old settings. - if (!change.creation && change.data != data) - create_object_from_change(change); + // Prepare for redo + change.data = object->save(); + change.action = GameObjectChange::ACTION_DELETE; + } + break; - change.data = std::move(data); - } - else // Object doesn't exist, create it. - { - create_object_from_change(change); + case GameObjectChange::ACTION_DELETE: /** Object was deleted, create it. */ + { + create_object_from_change(change, false); + + // Prepare for redo + change.action = GameObjectChange::ACTION_CREATE; + } + break; + + case GameObjectChange::ACTION_MODIFY: /** Object was modified, revert settings. */ + { + if (!object) + throw std::runtime_error("Object '" + change.name + "' no longer exists."); + + auto settings = object->get_settings(); + settings.save_state(); + + parse_object_settings(settings, change.data); // Parse old settings + object->after_editor_set(); + + // Prepare for redo + change.data = save_object_settings_state(settings, false); + change.new_data = save_object_settings_state(settings, true); + } + break; + + default: + break; } } void -GameObjectManager::save_object_change(GameObject& object, bool creation) +GameObjectManager::save_object_state(GameObject& object, GameObjectChange::Action action) { - if (m_undo_tracking && object.track_state() && object.m_track_undo) - m_pending_change_stack.push_back({ object.get_class_name(), object.get_uid(), object.save(), creation }); + if (object.track_state() && object.m_track_undo) + m_pending_change_stack.push_back({ object.get_class_name(), object.get_uid(), + object.save(), "", action }); object.m_track_undo = true; } void -GameObjectManager::save_object_change(GameObject& object, const std::string& data) +GameObjectManager::save_object_change(const GameObject& object, const ObjectSettings& settings) { - if (m_undo_tracking) - m_pending_change_stack.push_back({ object.get_class_name(), object.get_uid(), data, false }); + if (!settings.has_state_changed()) return; + + m_pending_change_stack.push_back({ object.get_class_name(), object.get_uid(), + save_object_settings_state(settings, false), + save_object_settings_state(settings, true), + GameObjectChange::ACTION_MODIFY }); } void @@ -489,13 +646,13 @@ GameObjectManager::this_before_object_add(GameObject& object) } } - save_object_change(object, true); + save_object_state(object, GameObjectChange::ACTION_CREATE); } void GameObjectManager::this_before_object_remove(GameObject& object) { - save_object_change(object); + save_object_state(object, GameObjectChange::ACTION_DELETE); { // By name: const std::string& name = object.get_name(); diff --git a/src/supertux/game_object_manager.hpp b/src/supertux/game_object_manager.hpp index 07a79f77db..e6da628f6a 100644 --- a/src/supertux/game_object_manager.hpp +++ b/src/supertux/game_object_manager.hpp @@ -28,6 +28,7 @@ #include #include "supertux/game_object.hpp" +#include "supertux/game_object_change.hpp" #include "util/uid_generator.hpp" class DrawingContext; @@ -273,14 +274,19 @@ class GameObjectManager : public ExposableClass void undo(); void redo(); - /** Save object change in the undo stack with given data. + /** Apply saved object changes. */ + void apply_object_change(const GameObjectChange& change, bool track_undo); + void apply_object_changes(const GameObjectChangeSet& changes, bool track_undo); + + /** Save object settings changes in the undo stack. Used to save an object's previous state before a change had occurred. */ - void save_object_change(GameObject& object, const std::string& data); + void save_object_change(const GameObject& object, const ObjectSettings& settings); /** Clear undo/redo stacks. */ void clear_undo_stack(); - /** Indicate if there are any object changes in the undo stack. */ + /** Indicate if there are any unsaved object changes in the undo stack. + @see m_last_saved_change */ bool has_object_changes() const; /** Called on editor level save. */ @@ -311,27 +317,20 @@ class GameObjectManager : public ExposableClass } private: - struct ObjectChange - { - std::string name; - UID uid; - std::string data; - bool creation; // If the change represents an object creation. - }; - struct ObjectChanges - { - UID uid; - std::vector objects; - }; - /** Create object from object change. */ - void create_object_from_change(const ObjectChange& change); + void create_object_from_change(const GameObjectChange& change, bool track_undo); + + /** Parse object settings ("supertux-game-object") from a string. */ + static void parse_object_settings(ObjectSettings& settings, const std::string& data); + + /** Save old or new state of object settings. */ + static std::string save_object_settings_state(const ObjectSettings& settings, bool new_state); - /** Process object change on undo/redo. */ - void process_object_change(ObjectChange& change); + /** Undo/redo object change. */ + void process_object_change(GameObjectChange& change); - /** Save object change in the undo stack. */ - void save_object_change(GameObject& object, bool creation = false); + /** Save object state in the undo stack. */ + void save_object_state(GameObject& object, GameObjectChange::Action action); void this_before_object_add(GameObject& object); void this_before_object_remove(GameObject& object); @@ -347,9 +346,9 @@ class GameObjectManager : public ExposableClass UIDGenerator m_change_uid_generator; bool m_undo_tracking; int m_undo_stack_size; - std::vector m_undo_stack; - std::vector m_redo_stack; - std::vector m_pending_change_stack; // Before a flush, any changes go here + std::vector m_undo_stack; + std::vector m_redo_stack; + std::vector m_pending_change_stack; // Before a flush, any changes go here UID m_last_saved_change; std::vector> m_gameobjects; diff --git a/src/util/reader_mapping.cpp b/src/util/reader_mapping.cpp index 2534d14f0c..a7bcef0200 100644 --- a/src/util/reader_mapping.cpp +++ b/src/util/reader_mapping.cpp @@ -45,6 +45,9 @@ ReaderMapping::get_iter() const const sexp::Value* ReaderMapping::get_item(const char* key) const { + if (!key || !key[0]) // Check whether key is valid and non-empty + return nullptr; + for (size_t i = 1; i < m_arr.size(); ++i) { auto const& pair = m_arr[i]; @@ -95,6 +98,12 @@ ReaderMapping::get(const char* key, uint32_t& value, const std::optional& default_value) const +{ + GET_VALUE_MACRO("uint32_t", is_integer, as_int) +} + bool ReaderMapping::get(const char* key, float& value, const std::optional& default_value) const { @@ -146,6 +155,7 @@ ReaderMapping::get(const char* key, std::string& value, const std::optionalas_array(); \ for (size_t i = 1; i < item.size(); ++i) \ { \ @@ -159,7 +169,6 @@ bool ReaderMapping::get(const char* key, std::vector& value, const std::optional>& default_value) const { - value.clear(); GET_VALUES_MACRO("bool", is_boolean, as_bool) } @@ -167,7 +176,6 @@ bool ReaderMapping::get(const char* key, std::vector& value, const std::optional>& default_value) const { - value.clear(); GET_VALUES_MACRO("int", is_integer, as_int) } @@ -176,7 +184,6 @@ bool ReaderMapping::get(const char* key, std::vector& value, const std::optional>& default_value) const { - value.clear(); GET_VALUES_MACRO("float", is_real, as_float) } @@ -184,7 +191,6 @@ bool ReaderMapping::get(const char* key, std::vector& value, const std::optional>& default_value) const { - value.clear(); GET_VALUES_MACRO("string", is_string, as_string) } @@ -192,7 +198,6 @@ bool ReaderMapping::get(const char* key, std::vector& value, const std::optional>& default_value) const { - value.clear(); GET_VALUES_MACRO("unsigned int", is_integer, as_int) } diff --git a/src/util/reader_mapping.hpp b/src/util/reader_mapping.hpp index 186f544bb5..02a4af3d9a 100644 --- a/src/util/reader_mapping.hpp +++ b/src/util/reader_mapping.hpp @@ -21,6 +21,7 @@ #include #include "util/reader_iterator.hpp" +#include "util/uid.hpp" namespace sexp { class Value; @@ -43,6 +44,7 @@ class ReaderMapping final bool get(const char* key, bool& value, const std::optional& default_value = std::nullopt) const; bool get(const char* key, int& value, const std::optional& default_value = std::nullopt) const; bool get(const char* key, uint32_t& value, const std::optional& default_value = std::nullopt) const; + bool get(const char* key, UID& value, const std::optional& default_value = std::nullopt) const; bool get(const char* key, float& value, const std::optional& default_value = std::nullopt) const; bool get(const char* key, std::string& value, const std::optional& default_value = std::nullopt) const; diff --git a/src/util/uid.hpp b/src/util/uid.hpp index c7c58d7a1b..d043a8f590 100644 --- a/src/util/uid.hpp +++ b/src/util/uid.hpp @@ -55,6 +55,11 @@ class UID UID(const UID& other) = default; UID& operator=(const UID& other) = default; + inline UID& operator=(uint32_t value) { + m_value = value; + return *this; + } + inline operator bool() const { return m_value != 0; } diff --git a/src/util/writer.cpp b/src/util/writer.cpp index b8dd33dad2..725afc9771 100644 --- a/src/util/writer.cpp +++ b/src/util/writer.cpp @@ -104,6 +104,13 @@ Writer::write(const std::string& name, float value) *out << '(' << name << ' ' << value << ")\n"; } +void +Writer::write(const std::string& name, const UID& uid) +{ + indent(); + *out << '(' << name << ' ' << uid << ")\n"; +} + /** This function is needed to properly resolve the overloaded write() function, without it the call write("foo", "bar") would call write(name, bool), not write(name, string, bool) */ diff --git a/src/util/writer.hpp b/src/util/writer.hpp index e374b62b2c..273bbd40aa 100644 --- a/src/util/writer.hpp +++ b/src/util/writer.hpp @@ -20,6 +20,8 @@ #include #include +#include "util/uid.hpp" + namespace sexp { class Value; } // namespace sexp @@ -38,6 +40,7 @@ class Writer final void write(const std::string& name, bool value); void write(const std::string& name, int value); void write(const std::string& name, float value); + void write(const std::string& name, const UID& uid); void write(const std::string& name, const char* value); void write(const std::string& name, const std::string& value, bool translatable = false); void write(const std::string& name, const std::vector& value); diff --git a/src/video/color.cpp b/src/video/color.cpp index 868e7c59d8..244e59ece3 100644 --- a/src/video/color.cpp +++ b/src/video/color.cpp @@ -45,7 +45,7 @@ Color::Color(float red_, float green_, float blue_, float alpha_) : assert(0 <= blue && blue <= 1.0f); } -Color::Color(const std::vector& vals) : +Color::Color(const std::vector& vals, bool use_alpha) : red(), green(), blue(), @@ -61,7 +61,7 @@ Color::Color(const std::vector& vals) : red = vals[0]; green = vals[1]; blue = vals[2]; - if (vals.size() > 3) + if (use_alpha && vals.size() > 3) alpha = vals[3]; else alpha = 1.0; diff --git a/src/video/color.hpp b/src/video/color.hpp index 87b13355f1..8490e133c9 100644 --- a/src/video/color.hpp +++ b/src/video/color.hpp @@ -95,7 +95,7 @@ class Color final Color(float red_, float green_, float blue_, float alpha_ = 1.0); - Color(const std::vector& vals); + Color(const std::vector& vals, bool use_alpha = true); bool operator==(const Color& other) const; bool operator!=(const Color& other) const; From b59bfd0a9b284ddfa2527fbc16b00119a5a95d92 Mon Sep 17 00:00:00 2001 From: Vankata453 <78196474+Vankata453@users.noreply.github.com> Date: Fri, 25 Oct 2024 21:45:20 +0300 Subject: [PATCH 06/21] Fix crash drawing an empty string using a TTF font --- src/video/ttf_font.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/video/ttf_font.cpp b/src/video/ttf_font.cpp index 6b0f5526ac..5e73244230 100644 --- a/src/video/ttf_font.cpp +++ b/src/video/ttf_font.cpp @@ -103,8 +103,10 @@ TTFFont::draw_text(Canvas& canvas, const std::string& text, const Vector& pos, FontAlignment alignment, int layer, const Color& color) { + const float init_y = pos.y - (static_cast(TTF_FontHeight(m_font)) - get_height()) / 2.0f; + float min_x = pos.x; - float last_y = pos.y - (static_cast(TTF_FontHeight(m_font)) - get_height()) / 2.0f; + float last_y = init_y; float max_width = 0.f; LineIterator iter(text); @@ -138,7 +140,7 @@ TTFFont::draw_text(Canvas& canvas, const std::string& text, last_y += get_height(); } - return Rectf(min_x, pos.y, min_x + max_width, last_y); + return Rectf(min_x, init_y, min_x + max_width, last_y); } std::string From 364a199ca3c3d2c13aad4322d54e9f678268609b Mon Sep 17 00:00:00 2001 From: Semphriss <66701383+Semphriss@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:51:08 -0400 Subject: [PATCH 07/21] Disable the update checker by default and add option to disable networking (#2376) This avoids some privacy concerns linked to pinging an external server each time the game is open. It also allows the user to decide whether the game should connect to the internet at all. --------- Co-authored-by: Semphris Co-authored-by: Vankata453 <78196474+Vankata453@users.noreply.github.com> --- src/addon/addon_manager.cpp | 5 +++- src/addon/downloader.cpp | 36 ++++++++++++++++++++++++ src/gui/menu_manager.cpp | 3 +- src/supertux/gameconfig.cpp | 9 +++--- src/supertux/gameconfig.hpp | 6 ++++ src/supertux/main.cpp | 3 ++ src/supertux/menu/addon_menu.cpp | 19 ++++++++++--- src/supertux/menu/addon_preview_menu.cpp | 6 ++++ src/supertux/menu/main_menu.cpp | 19 +++++++++++++ src/supertux/menu/options_menu.cpp | 29 +++++++++++++++---- src/supertux/menu/options_menu.hpp | 5 ++++ 11 files changed, 125 insertions(+), 15 deletions(-) diff --git a/src/addon/addon_manager.cpp b/src/addon/addon_manager.cpp index 67f4f1c636..54be09eca1 100644 --- a/src/addon/addon_manager.cpp +++ b/src/addon/addon_manager.cpp @@ -276,7 +276,10 @@ AddonManager::request_check_online() { empty_cache_directory(); - TransferStatusPtr status = m_downloader.request_download(m_repository_url, ADDON_INFO_PATH); + // Since then() may be called immediately if networking is disabled, + // hold the status in a separate variable so that `m_transfer_status = {}` + // below doesn't cause this function to return nullptr. + auto status = m_downloader.request_download(m_repository_url, ADDON_INFO_PATH); status->then( [this](bool success) { diff --git a/src/addon/downloader.cpp b/src/addon/downloader.cpp index 56d82b0821..1c36364ea3 100644 --- a/src/addon/downloader.cpp +++ b/src/addon/downloader.cpp @@ -33,6 +33,7 @@ #endif #include "physfs/util.hpp" +#include "supertux/gameconfig.hpp" #include "supertux/globals.hpp" #include "util/file_system.hpp" #include "util/log.hpp" @@ -137,6 +138,7 @@ TransferStatusList::update() void TransferStatusList::push(TransferStatusPtr status) { + assert(!status->parent_list); status->parent_list = this; m_transfer_statuses.push_back(status); @@ -421,6 +423,9 @@ Downloader::download(const std::string& url, size_t (*write_func)(void* ptr, size_t size, size_t nmemb, void* userdata), void* userdata) { + if (g_config->disable_network) + throw std::runtime_error("Networking is disabled"); + log_info << "Downloading " << url << std::endl; #ifndef EMSCRIPTEN @@ -456,6 +461,9 @@ Downloader::download(const std::string& url, std::string Downloader::download(const std::string& url) { + if (g_config->disable_network) + throw std::runtime_error("Networking is disabled"); + std::string result; download(url, my_curl_string_append, &result); return result; @@ -464,6 +472,9 @@ Downloader::download(const std::string& url) void Downloader::download(const std::string& url, const std::string& filename) { + if (g_config->disable_network) + throw std::runtime_error("Networking is disabled"); + #ifndef EMSCRIPTEN log_info << "download: " << url << " to " << filename << std::endl; std::unique_ptr fout(PHYSFS_openWrite(filename.c_str()), @@ -512,6 +523,31 @@ Downloader::abort(TransferId id) void Downloader::update() { + if (g_config->disable_network) + { + // Remove any on-going transfers + for (const auto& transfer_data : m_transfers) + { + TransferStatusPtr status = transfer_data.second->get_status(); + status->error_msg = "Networking is disabled"; + for (const auto& callback : status->callbacks) + { + try + { + callback(false); + } + catch(const std::exception& err) + { + log_warning << "Illegal exception in Downloader: " << err.what() << std::endl; + } + } + if (status->parent_list) + status->parent_list->on_transfer_complete(status, false); + } + m_transfers.clear(); + return; + } + #ifndef EMSCRIPTEN // Prevent updating a Downloader multiple times in the same frame. if (m_last_update_time == g_real_time) return; diff --git a/src/gui/menu_manager.cpp b/src/gui/menu_manager.cpp index b85cb0cd98..d568333edf 100644 --- a/src/gui/menu_manager.cpp +++ b/src/gui/menu_manager.cpp @@ -131,7 +131,8 @@ MenuManager::draw(DrawingContext& context) { if (m_dialog.has_next) // Has next dialog { - if (m_dialog.next) m_dialog.next->update(); + // Removed to fix a crash with changing dialog in initial next dialog update + //if (m_dialog.next) m_dialog.next->update(); if (m_dialog.current && m_dialog.next) { diff --git a/src/supertux/gameconfig.cpp b/src/supertux/gameconfig.cpp index 810b8ef025..67a443eb1c 100644 --- a/src/supertux/gameconfig.cpp +++ b/src/supertux/gameconfig.cpp @@ -35,6 +35,7 @@ #endif Config::Config() : + m_initial(true), profile(1), fullscreen_size(0, 0), fullscreen_refresh_rate(0), @@ -78,11 +79,8 @@ Config::Config() : confirmation_dialog(false), pause_on_focusloss(true), custom_mouse_cursor(true), -#ifdef __EMSCRIPTEN__ do_release_check(false), -#else - do_release_check(true), -#endif + disable_network(true), custom_title_levels(true), #ifdef ENABLE_DISCORD enable_discord(false), @@ -155,6 +153,7 @@ Config::load() config_mapping.get("pause_on_focusloss", pause_on_focusloss); config_mapping.get("custom_mouse_cursor", custom_mouse_cursor); config_mapping.get("do_release_check", do_release_check); + config_mapping.get("disable_network", disable_network); config_mapping.get("custom_title_levels", custom_title_levels); std::optional config_integrations_mapping; @@ -351,6 +350,7 @@ Config::load() } check_values(); + m_initial = false; } void @@ -374,6 +374,7 @@ Config::save() writer.write("pause_on_focusloss", pause_on_focusloss); writer.write("custom_mouse_cursor", custom_mouse_cursor); writer.write("do_release_check", do_release_check); + writer.write("disable_network", disable_network); writer.write("custom_title_levels", custom_title_levels); writer.start_list("integrations"); diff --git a/src/supertux/gameconfig.hpp b/src/supertux/gameconfig.hpp index 97cde1e649..a726247e48 100644 --- a/src/supertux/gameconfig.hpp +++ b/src/supertux/gameconfig.hpp @@ -36,6 +36,11 @@ class Config final void check_values(); + bool is_initial() const { return m_initial; } + +private: + bool m_initial; + public: int profile; @@ -108,6 +113,7 @@ class Config final bool pause_on_focusloss; bool custom_mouse_cursor; bool do_release_check; + bool disable_network; bool custom_title_levels; #ifdef ENABLE_DISCORD diff --git a/src/supertux/main.cpp b/src/supertux/main.cpp index d89cf67175..6c81486669 100644 --- a/src/supertux/main.cpp +++ b/src/supertux/main.cpp @@ -771,6 +771,9 @@ Main::run(int argc, char** argv) void Main::release_check() { + if (g_config->disable_network) + return; + // Detect a potential new release of SuperTux. If a release, other than // the current one is indicated on the given web file, show a notification on the main menu screen. const std::string target_file = "ver_info.nfo"; diff --git a/src/supertux/menu/addon_menu.cpp b/src/supertux/menu/addon_menu.cpp index da4a532262..565df572eb 100644 --- a/src/supertux/menu/addon_menu.cpp +++ b/src/supertux/menu/addon_menu.cpp @@ -23,6 +23,8 @@ #include "gui/dialog.hpp" #include "gui/menu_item.hpp" #include "gui/menu_manager.hpp" +#include "supertux/gameconfig.hpp" +#include "supertux/globals.hpp" #include "supertux/menu/addon_browse_menu.hpp" #include "supertux/menu/addon_file_install_menu.hpp" #include "supertux/menu/addon_preview_menu.hpp" @@ -169,7 +171,10 @@ AddonMenu::menu_action(MenuItem& item) } else if (index == MNID_BROWSE) { - MenuManager::instance().push_menu(std::make_unique(m_langpacks_only, false)); + if (g_config->disable_network) + Dialog::show_message(_("To browse through the add-on catalog, you must enable networking.")); + else + MenuManager::instance().push_menu(std::make_unique(m_langpacks_only, false)); } else if (index == MNID_INSTALL_FROM_FILE) { @@ -202,17 +207,23 @@ AddonMenu::menu_action(MenuItem& item) void AddonMenu::check_for_updates() { + if (g_config->disable_network) + { + Dialog::show_message(_("To check for add-on updates, you must enable networking.")); + return; + } + try { TransferStatusPtr status = m_addon_manager.request_check_online(); + auto dialog = std::make_unique(status, false); + dialog->set_title(_("Checking for updates...")); + MenuManager::instance().set_dialog(std::move(dialog)); status->then([this](bool success) { if (success) refresh(); set_active_item(MNID_CHECK_ONLINE); }); - auto dialog = std::make_unique(status, false); - dialog->set_title(_("Checking for updates...")); - MenuManager::instance().set_dialog(std::move(dialog)); } catch (std::exception& e) { diff --git a/src/supertux/menu/addon_preview_menu.cpp b/src/supertux/menu/addon_preview_menu.cpp index 80aefba86b..ac5fae61ae 100644 --- a/src/supertux/menu/addon_preview_menu.cpp +++ b/src/supertux/menu/addon_preview_menu.cpp @@ -22,6 +22,8 @@ #include "addon/addon_manager.hpp" #include "gui/menu_item.hpp" #include "gui/menu_manager.hpp" +#include "supertux/gameconfig.hpp" +#include "supertux/globals.hpp" #include "supertux/menu/download_dialog.hpp" #include "supertux/resources.hpp" #include "util/log.hpp" @@ -147,6 +149,10 @@ AddonPreviewMenu::rebuild_menu() add_inactive(_("Failed to load all available screenshot previews.")); } } + else if (g_config->disable_network) + { + add_inactive(_("To fetch add-on screenshots, you must enable networking.")); + } else { const std::string show_screenshots_text = _("Show screenshots"); diff --git a/src/supertux/menu/main_menu.cpp b/src/supertux/menu/main_menu.cpp index 7c08e21e05..e011d2a88c 100644 --- a/src/supertux/menu/main_menu.cpp +++ b/src/supertux/menu/main_menu.cpp @@ -22,6 +22,7 @@ #include "gui/menu_item.hpp" #include "gui/menu_manager.hpp" #include "supertux/fadetoblack.hpp" +#include "supertux/gameconfig.hpp" #include "supertux/globals.hpp" #include "supertux/level.hpp" #include "supertux/level_parser.hpp" @@ -68,6 +69,24 @@ MainMenu::MainMenu() #endif on_window_resize(); + +#ifndef __EMSCRIPTEN__ + // Show network-related confirmation dialogs on first startup + if (g_config->is_initial()) + { + Dialog::show_confirmation(_("Would you allow SuperTux to connect to the Internet?\n\nThis enables additional features, such as the in-game add-on catalog."), + []() + { + g_config->disable_network = false; + + Dialog::show_confirmation(_("Would you allow SuperTux to check for new releases on startup?\n\nYou will be notified if any are found."), + []() + { + g_config->do_release_check = true; + }); + }, true); + } +#endif } void diff --git a/src/supertux/menu/options_menu.cpp b/src/supertux/menu/options_menu.cpp index 9d120d7bc5..f8e3e3d8f9 100644 --- a/src/supertux/menu/options_menu.cpp +++ b/src/supertux/menu/options_menu.cpp @@ -56,6 +56,8 @@ OptionsMenu::less_than_volume(const std::string& lhs, const std::string& rhs) } OptionsMenu::OptionsMenu(Type type, bool complete) : + m_type(type), + m_complete(complete), m_magnifications(), m_aspect_ratios(), m_window_resolutions(), @@ -66,13 +68,21 @@ OptionsMenu::OptionsMenu(Type type, bool complete) : m_flash_intensity_values(), m_mobile_control_scales() { - switch (type) // Insert label and menu items, appropriate for the chosen OptionsMenu type + refresh(); +} + +void +OptionsMenu::refresh() +{ + clear(); + + switch (m_type) // Insert label and menu items, appropriate for the chosen OptionsMenu type { case LOCALE: /** LOCALE */ { insert_label(_("Locale")); - if (complete) + if (m_complete) { add_submenu(_("Select Language"), MenuStorage::LANGUAGE_MENU) .set_help(_("Select a different language to display text in")); @@ -174,7 +184,7 @@ OptionsMenu::OptionsMenu(Type type, bool complete) : { insert_label(_("Extras")); - if (complete) + if (m_complete) add_submenu(_("Select Profile"), MenuStorage::PROFILE_MENU) .set_help(_("Select a profile to play with")); @@ -219,8 +229,12 @@ OptionsMenu::OptionsMenu(Type type, bool complete) : add_toggle(MNID_CUSTOM_CURSOR, _("Use custom mouse cursor"), &g_config->custom_mouse_cursor).set_help(_("Whether the game renders its own cursor or uses the system's cursor")); #ifndef __EMSCRIPTEN__ - add_toggle(MNID_RELEASE_CHECK, _("Check for new releases"), &g_config->do_release_check) - .set_help(_("Allows the game to perform checks for new SuperTux releases on startup and notify if any found.")); + if (!g_config->disable_network) + add_toggle(MNID_RELEASE_CHECK, _("Check for new releases"), &g_config->do_release_check) + .set_help(_("Allows the game to perform checks for new SuperTux releases on startup and notify if any found.")); + + add_toggle(MNID_DISABLE_NETWORK, _("Disable network"), &g_config->disable_network) + .set_help(_("Prevents the game from connecting online")); #endif break; @@ -767,6 +781,11 @@ OptionsMenu::menu_action(MenuItem& item) g_config->m_mobile_controls_scale /= 100.0f; break; + case MNID_DISABLE_NETWORK: + refresh(); + set_active_item(MNID_DISABLE_NETWORK); + break; + default: break; } diff --git a/src/supertux/menu/options_menu.hpp b/src/supertux/menu/options_menu.hpp index 703f712023..d1c07baccb 100644 --- a/src/supertux/menu/options_menu.hpp +++ b/src/supertux/menu/options_menu.hpp @@ -39,6 +39,7 @@ class OptionsMenu final : public Menu OptionsMenu(Type type, bool complete); ~OptionsMenu() override; + void refresh() override; void on_window_resize() override; void menu_action(MenuItem& item) override; @@ -81,6 +82,7 @@ class OptionsMenu final : public Menu MNID_PAUSE_ON_FOCUSLOSS, MNID_CUSTOM_CURSOR, MNID_RELEASE_CHECK, + MNID_DISABLE_NETWORK, MNID_MOBILE_CONTROLS, MNID_MOBILE_CONTROLS_SCALE }; @@ -92,6 +94,9 @@ class OptionsMenu final : public Menu }; private: + const Type m_type; + const bool m_complete; + StringOption m_magnifications; StringOption m_aspect_ratios; StringOption m_window_resolutions; From 479545040385f1906b2ca9cdc4061b58551f7935 Mon Sep 17 00:00:00 2001 From: MatusGuy Date: Sat, 26 Oct 2024 00:42:44 +0100 Subject: [PATCH 08/21] Move action warning to debug output --- src/sprite/sprite.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index a2cf5ceadc..6b4744d1b8 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -98,7 +98,9 @@ Sprite::set_action(const std::string& name, int loops) const SpriteData::Action* newaction = m_data.get_action(name); if (!newaction) { - log_warning << "Action '" << name << "' not found." << std::endl; + // HACK: Lots of things trigger this message therefore turning it into a warning + // would make it quite annoying + log_debug << "Action '" << name << "' not found." << std::endl; return; } From a3cfb55a21ee73f496a858dd5cdd30c09e9960e5 Mon Sep 17 00:00:00 2001 From: Vankata453 <78196474+Vankata453@users.noreply.github.com> Date: Sat, 26 Oct 2024 14:28:45 +0300 Subject: [PATCH 09/21] `TilesObjectOption`: Parse `tile_changes` as a `uint32_t` vector [ci skip] --- src/editor/object_option.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/editor/object_option.cpp b/src/editor/object_option.cpp index a25b044a88..13afd13bee 100644 --- a/src/editor/object_option.cpp +++ b/src/editor/object_option.cpp @@ -744,7 +744,7 @@ TilesObjectOption::parse_state(const ReaderMapping& reader) { parse(reader); - std::vector tile_changes; // Array of pairs (index, old/new tile ID). + std::vector tile_changes; // Array of pairs (index, old/new tile ID). if (!reader.get("tile-changes", tile_changes)) return; @@ -752,7 +752,7 @@ TilesObjectOption::parse_state(const ReaderMapping& reader) throw std::runtime_error("'tile-changes' does not contain number pairs."); for (size_t i = 0; i < tile_changes.size(); i += 2) - m_value_pointer->change(tile_changes[i], static_cast(tile_changes[i + 1])); + m_value_pointer->change(static_cast(tile_changes[i]), tile_changes[i + 1]); } void From b34b04d3af128dec5484fada6792c9b053338968 Mon Sep 17 00:00:00 2001 From: bruhmoent <69918580+bruhmoent@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:29:02 +0500 Subject: [PATCH 10/21] Change the lock's sprite layer to be the same. (#3090) Fixes #3089 --- src/trigger/door.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trigger/door.cpp b/src/trigger/door.cpp index 5b8e956d0d..c35136be8f 100644 --- a/src/trigger/door.cpp +++ b/src/trigger/door.cpp @@ -169,7 +169,7 @@ Door::draw(DrawingContext& context) Vector shake_delta = Vector(static_cast(graphicsRandom.rand(-8, 8)), static_cast(graphicsRandom.rand(-8, 8))); float shake_strength = m_lock_warn_timer.started() ? m_lock_warn_timer.get_timeleft() : 0.f; m_lock_sprite->draw(context.color(), get_bbox().get_middle() - - (Vector(m_lock_sprite->get_width() / 2, m_lock_sprite->get_height() / 2) + (shake_delta*shake_strength)), LAYER_BACKGROUNDTILES + 1, m_flip); + (Vector(m_lock_sprite->get_width() / 2, m_lock_sprite->get_height() / 2) + (shake_delta*shake_strength)), m_layer, m_flip); } } From 7140d53520207ed9c87114df1fb6db0fc25c56d1 Mon Sep 17 00:00:00 2001 From: SuperTux Bot Date: Sun, 27 Oct 2024 01:57:50 +0000 Subject: [PATCH 11/21] Update translations --- data/levels/bonus1/af_ZA.po | 2 +- data/levels/bonus1/ar.po | 2 +- data/levels/bonus1/az.po | 2 +- data/levels/bonus1/be.po | 2 +- data/levels/bonus1/br.po | 2 +- data/levels/bonus1/ca.po | 2 +- data/levels/bonus1/cmn.po | 2 +- data/levels/bonus1/cs.po | 2 +- data/levels/bonus1/da.po | 2 +- data/levels/bonus1/de.po | 2 +- data/levels/bonus1/el.po | 2 +- data/levels/bonus1/eo.po | 2 +- data/levels/bonus1/es.po | 2 +- data/levels/bonus1/es_AR.po | 2 +- data/levels/bonus1/et.po | 2 +- data/levels/bonus1/eu.po | 2 +- data/levels/bonus1/fi.po | 2 +- data/levels/bonus1/fr.po | 2 +- data/levels/bonus1/fr_CA.po | 2 +- data/levels/bonus1/gd.po | 2 +- data/levels/bonus1/gl.po | 2 +- data/levels/bonus1/he.po | 2 +- data/levels/bonus1/hr.po | 2 +- data/levels/bonus1/hu.po | 2 +- data/levels/bonus1/hy.po | 2 +- data/levels/bonus1/id.po | 2 +- data/levels/bonus1/is.po | 2 +- data/levels/bonus1/it.po | 2 +- data/levels/bonus1/ko.po | 2 +- data/levels/bonus1/la.po | 2 +- data/levels/bonus1/lt.po | 2 +- data/levels/bonus1/ms_MY.po | 2 +- data/levels/bonus1/nb.po | 2 +- data/levels/bonus1/nds.po | 2 +- data/levels/bonus1/nl.po | 2 +- data/levels/bonus1/nn.po | 2 +- data/levels/bonus1/pl.po | 2 +- data/levels/bonus1/pt_BR.po | 2 +- data/levels/bonus1/ro.po | 2 +- data/levels/bonus1/sk.po | 2 +- data/levels/bonus1/sl.po | 2 +- data/levels/bonus1/sq.po | 2 +- data/levels/bonus1/sr.po | 2 +- data/levels/bonus1/sv.po | 2 +- data/levels/bonus1/te.po | 2 +- data/levels/bonus1/tr.po | 2 +- data/levels/bonus1/tt.po | 2 +- data/levels/bonus1/uk.po | 2 +- data/levels/bonus1/uz.po | 2 +- data/levels/bonus1/zh_CN.po | 2 +- data/levels/bonus1/zh_TW.po | 2 +- data/levels/bonus2/af_ZA.po | 2 +- data/levels/bonus2/ar.po | 2 +- data/levels/bonus2/az.po | 2 +- data/levels/bonus2/be.po | 2 +- data/levels/bonus2/br.po | 2 +- data/levels/bonus2/ca.po | 2 +- data/levels/bonus2/cmn.po | 2 +- data/levels/bonus2/cs.po | 2 +- data/levels/bonus2/de.po | 2 +- data/levels/bonus2/el.po | 2 +- data/levels/bonus2/eo.po | 2 +- data/levels/bonus2/es.po | 2 +- data/levels/bonus2/es_AR.po | 2 +- data/levels/bonus2/et.po | 2 +- data/levels/bonus2/eu.po | 2 +- data/levels/bonus2/fi.po | 2 +- data/levels/bonus2/fr.po | 2 +- data/levels/bonus2/fr_CA.po | 2 +- data/levels/bonus2/gd.po | 2 +- data/levels/bonus2/gl.po | 2 +- data/levels/bonus2/he.po | 2 +- data/levels/bonus2/hr.po | 2 +- data/levels/bonus2/hu.po | 2 +- data/levels/bonus2/hy.po | 2 +- data/levels/bonus2/id.po | 2 +- data/levels/bonus2/is.po | 2 +- data/levels/bonus2/it.po | 2 +- data/levels/bonus2/ja.po | 2 +- data/levels/bonus2/ko.po | 2 +- data/levels/bonus2/la.po | 2 +- data/levels/bonus2/lt.po | 2 +- data/levels/bonus2/ms_MY.po | 2 +- data/levels/bonus2/nb.po | 2 +- data/levels/bonus2/nds.po | 2 +- data/levels/bonus2/ne.po | 2 +- data/levels/bonus2/nl.po | 2 +- data/levels/bonus2/nn.po | 2 +- data/levels/bonus2/pl.po | 2 +- data/levels/bonus2/pt.po | 2 +- data/levels/bonus2/pt_BR.po | 2 +- data/levels/bonus2/ro.po | 2 +- data/levels/bonus2/ru.po | 2 +- data/levels/bonus2/sk.po | 2 +- data/levels/bonus2/sl.po | 2 +- data/levels/bonus2/sq.po | 2 +- data/levels/bonus2/sr.po | 2 +- data/levels/bonus2/sv.po | 2 +- data/levels/bonus2/te.po | 2 +- data/levels/bonus2/tr.po | 2 +- data/levels/bonus2/tt.po | 2 +- data/levels/bonus2/uk.po | 2 +- data/levels/bonus2/uz.po | 2 +- data/levels/bonus2/zh_CN.po | 2 +- data/levels/bonus2/zh_TW.po | 2 +- data/levels/halloween2014/ar.po | 2 +- data/levels/halloween2014/az.po | 2 +- data/levels/halloween2014/br.po | 2 +- data/levels/halloween2014/ca.po | 2 +- data/levels/halloween2014/cs.po | 2 +- data/levels/halloween2014/da.po | 2 +- data/levels/halloween2014/de.po | 2 +- data/levels/halloween2014/el.po | 2 +- data/levels/halloween2014/eo.po | 2 +- data/levels/halloween2014/es.po | 2 +- data/levels/halloween2014/es_AR.po | 2 +- data/levels/halloween2014/et.po | 2 +- data/levels/halloween2014/eu.po | 2 +- data/levels/halloween2014/fi.po | 2 +- data/levels/halloween2014/fr.po | 2 +- data/levels/halloween2014/fr_CA.po | 2 +- data/levels/halloween2014/gd.po | 2 +- data/levels/halloween2014/gl.po | 2 +- data/levels/halloween2014/he.po | 2 +- data/levels/halloween2014/hr.po | 2 +- data/levels/halloween2014/hu.po | 2 +- data/levels/halloween2014/hy.po | 2 +- data/levels/halloween2014/id.po | 2 +- data/levels/halloween2014/is.po | 2 +- data/levels/halloween2014/it.po | 2 +- data/levels/halloween2014/ja.po | 2 +- data/levels/halloween2014/ko.po | 2 +- data/levels/halloween2014/la.po | 2 +- data/levels/halloween2014/lt.po | 2 +- data/levels/halloween2014/ml.po | 2 +- data/levels/halloween2014/ms_MY.po | 2 +- data/levels/halloween2014/nb.po | 2 +- data/levels/halloween2014/nds.po | 2 +- data/levels/halloween2014/nl.po | 2 +- data/levels/halloween2014/nn.po | 2 +- data/levels/halloween2014/pl.po | 2 +- data/levels/halloween2014/pt.po | 2 +- data/levels/halloween2014/pt_BR.po | 2 +- data/levels/halloween2014/ro.po | 2 +- data/levels/halloween2014/ru.po | 2 +- data/levels/halloween2014/sk.po | 2 +- data/levels/halloween2014/sl.po | 2 +- data/levels/halloween2014/sq.po | 2 +- data/levels/halloween2014/sv.po | 2 +- data/levels/halloween2014/te.po | 2 +- data/levels/halloween2014/tr.po | 2 +- data/levels/halloween2014/tt.po | 2 +- data/levels/halloween2014/uk.po | 2 +- data/levels/halloween2014/uz.po | 2 +- data/levels/halloween2014/zh_CN.po | 2 +- 155 files changed, 155 insertions(+), 155 deletions(-) diff --git a/data/levels/bonus1/af_ZA.po b/data/levels/bonus1/af_ZA.po index 33de84cfdc..588e71beb3 100644 --- a/data/levels/bonus1/af_ZA.po +++ b/data/levels/bonus1/af_ZA.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Martin van Zijl , 2019\n" "Language-Team: Afrikaans (South Africa) (http://app.transifex.com/arctic-games/supertux/language/af_ZA/)\n" diff --git a/data/levels/bonus1/ar.po b/data/levels/bonus1/ar.po index f4a7ad8baa..e9f25fba24 100644 --- a/data/levels/bonus1/ar.po +++ b/data/levels/bonus1/ar.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Arabic (http://app.transifex.com/arctic-games/supertux/language/ar/)\n" diff --git a/data/levels/bonus1/az.po b/data/levels/bonus1/az.po index 07e67ea228..dbecd6899f 100644 --- a/data/levels/bonus1/az.po +++ b/data/levels/bonus1/az.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Azerbaijani (http://app.transifex.com/arctic-games/supertux/language/az/)\n" diff --git a/data/levels/bonus1/be.po b/data/levels/bonus1/be.po index 0efbf13181..20d1ab5358 100644 --- a/data/levels/bonus1/be.po +++ b/data/levels/bonus1/be.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: se luxxy <70luxxy@gmail.com>, 2018\n" "Language-Team: Belarusian (http://app.transifex.com/arctic-games/supertux/language/be/)\n" diff --git a/data/levels/bonus1/br.po b/data/levels/bonus1/br.po index 9774879440..87114c546e 100644 --- a/data/levels/bonus1/br.po +++ b/data/levels/bonus1/br.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Gwenn M , 2015,2019\n" "Language-Team: Breton (http://app.transifex.com/arctic-games/supertux/language/br/)\n" diff --git a/data/levels/bonus1/ca.po b/data/levels/bonus1/ca.po index cd597ce979..3b292ff7aa 100644 --- a/data/levels/bonus1/ca.po +++ b/data/levels/bonus1/ca.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Catalan (http://app.transifex.com/arctic-games/supertux/language/ca/)\n" diff --git a/data/levels/bonus1/cmn.po b/data/levels/bonus1/cmn.po index abd38dae1c..d84c78b10a 100644 --- a/data/levels/bonus1/cmn.po +++ b/data/levels/bonus1/cmn.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: 趙惟倫 , 2013\n" "Language-Team: Chinese (Mandarin) (http://app.transifex.com/arctic-games/supertux/language/cmn/)\n" diff --git a/data/levels/bonus1/cs.po b/data/levels/bonus1/cs.po index f362ceed42..91a791ae22 100644 --- a/data/levels/bonus1/cs.po +++ b/data/levels/bonus1/cs.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Jiří Paleček , 2021-2023\n" "Language-Team: Czech (http://app.transifex.com/arctic-games/supertux/language/cs/)\n" diff --git a/data/levels/bonus1/da.po b/data/levels/bonus1/da.po index ff5eca0602..4d22c6e2ee 100644 --- a/data/levels/bonus1/da.po +++ b/data/levels/bonus1/da.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Lars Lyngby , 2022\n" "Language-Team: Danish (http://app.transifex.com/arctic-games/supertux/language/da/)\n" diff --git a/data/levels/bonus1/de.po b/data/levels/bonus1/de.po index fc3eab299f..43db33d216 100644 --- a/data/levels/bonus1/de.po +++ b/data/levels/bonus1/de.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Tobias Markus , 2018-2019,2021\n" "Language-Team: German (http://app.transifex.com/arctic-games/supertux/language/de/)\n" diff --git a/data/levels/bonus1/el.po b/data/levels/bonus1/el.po index 90147c5268..33a33bdc9c 100644 --- a/data/levels/bonus1/el.po +++ b/data/levels/bonus1/el.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Greek (http://app.transifex.com/arctic-games/supertux/language/el/)\n" diff --git a/data/levels/bonus1/eo.po b/data/levels/bonus1/eo.po index 6eb5eb92a4..b820c98585 100644 --- a/data/levels/bonus1/eo.po +++ b/data/levels/bonus1/eo.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: vpzomtrrfrt , 2020-2021\n" "Language-Team: Esperanto (http://app.transifex.com/arctic-games/supertux/language/eo/)\n" diff --git a/data/levels/bonus1/es.po b/data/levels/bonus1/es.po index b03da44005..3b5e610170 100644 --- a/data/levels/bonus1/es.po +++ b/data/levels/bonus1/es.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Martin, 2022\n" "Language-Team: Spanish (http://app.transifex.com/arctic-games/supertux/language/es/)\n" diff --git a/data/levels/bonus1/es_AR.po b/data/levels/bonus1/es_AR.po index 8de9948c52..829e55c357 100644 --- a/data/levels/bonus1/es_AR.po +++ b/data/levels/bonus1/es_AR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Salomón Duarte , 2021\n" "Language-Team: Spanish (Argentina) (http://app.transifex.com/arctic-games/supertux/language/es_AR/)\n" diff --git a/data/levels/bonus1/et.po b/data/levels/bonus1/et.po index 853e3dd3f0..19c3f7aefc 100644 --- a/data/levels/bonus1/et.po +++ b/data/levels/bonus1/et.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Estonian (http://app.transifex.com/arctic-games/supertux/language/et/)\n" diff --git a/data/levels/bonus1/eu.po b/data/levels/bonus1/eu.po index 12e00218a6..10cbc7e59e 100644 --- a/data/levels/bonus1/eu.po +++ b/data/levels/bonus1/eu.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Basque (http://app.transifex.com/arctic-games/supertux/language/eu/)\n" diff --git a/data/levels/bonus1/fi.po b/data/levels/bonus1/fi.po index 9b2e0fe372..ae2c7f3062 100644 --- a/data/levels/bonus1/fi.po +++ b/data/levels/bonus1/fi.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Jaakoppi Horila , 2016,2018,2020-2023\n" "Language-Team: Finnish (http://app.transifex.com/arctic-games/supertux/language/fi/)\n" diff --git a/data/levels/bonus1/fr.po b/data/levels/bonus1/fr.po index e274d1f968..aa0ef68336 100644 --- a/data/levels/bonus1/fr.po +++ b/data/levels/bonus1/fr.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Semphris , 2021\n" "Language-Team: French (http://app.transifex.com/arctic-games/supertux/language/fr/)\n" diff --git a/data/levels/bonus1/fr_CA.po b/data/levels/bonus1/fr_CA.po index 9adecdbce3..5b7436f030 100644 --- a/data/levels/bonus1/fr_CA.po +++ b/data/levels/bonus1/fr_CA.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: French (Canada) (http://app.transifex.com/arctic-games/supertux/language/fr_CA/)\n" diff --git a/data/levels/bonus1/gd.po b/data/levels/bonus1/gd.po index a9d805f52f..d3131a1c30 100644 --- a/data/levels/bonus1/gd.po +++ b/data/levels/bonus1/gd.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: GunChleoc, 2016,2019\n" "Language-Team: Gaelic, Scottish (http://app.transifex.com/arctic-games/supertux/language/gd/)\n" diff --git a/data/levels/bonus1/gl.po b/data/levels/bonus1/gl.po index 93608e5b76..190cb15c6f 100644 --- a/data/levels/bonus1/gl.po +++ b/data/levels/bonus1/gl.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Xan Vieiro , 2021\n" "Language-Team: Galician (http://app.transifex.com/arctic-games/supertux/language/gl/)\n" diff --git a/data/levels/bonus1/he.po b/data/levels/bonus1/he.po index 189546fa42..5258a58057 100644 --- a/data/levels/bonus1/he.po +++ b/data/levels/bonus1/he.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Hebrew (http://app.transifex.com/arctic-games/supertux/language/he/)\n" diff --git a/data/levels/bonus1/hr.po b/data/levels/bonus1/hr.po index b2893a8e30..60860fb501 100644 --- a/data/levels/bonus1/hr.po +++ b/data/levels/bonus1/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Croatian (http://app.transifex.com/arctic-games/supertux/language/hr/)\n" diff --git a/data/levels/bonus1/hu.po b/data/levels/bonus1/hu.po index 4c8f310c1c..688e762e23 100644 --- a/data/levels/bonus1/hu.po +++ b/data/levels/bonus1/hu.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Guih48, 2022\n" "Language-Team: Hungarian (http://app.transifex.com/arctic-games/supertux/language/hu/)\n" diff --git a/data/levels/bonus1/hy.po b/data/levels/bonus1/hy.po index 467351e8de..cdedd10112 100644 --- a/data/levels/bonus1/hy.po +++ b/data/levels/bonus1/hy.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Armenian (http://app.transifex.com/arctic-games/supertux/language/hy/)\n" diff --git a/data/levels/bonus1/id.po b/data/levels/bonus1/id.po index 61d63b517f..c684de7d80 100644 --- a/data/levels/bonus1/id.po +++ b/data/levels/bonus1/id.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Chris , 2022\n" "Language-Team: Indonesian (http://app.transifex.com/arctic-games/supertux/language/id/)\n" diff --git a/data/levels/bonus1/is.po b/data/levels/bonus1/is.po index 5bca021821..bcef43aa6d 100644 --- a/data/levels/bonus1/is.po +++ b/data/levels/bonus1/is.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Icelandic (http://app.transifex.com/arctic-games/supertux/language/is/)\n" diff --git a/data/levels/bonus1/it.po b/data/levels/bonus1/it.po index b2d2bd62d1..5efe4a84ae 100644 --- a/data/levels/bonus1/it.po +++ b/data/levels/bonus1/it.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: A-TNT DC, 2021\n" "Language-Team: Italian (http://app.transifex.com/arctic-games/supertux/language/it/)\n" diff --git a/data/levels/bonus1/ko.po b/data/levels/bonus1/ko.po index 4ee23ed41a..53f1ddf834 100644 --- a/data/levels/bonus1/ko.po +++ b/data/levels/bonus1/ko.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: 최이준, 2023\n" "Language-Team: Korean (http://app.transifex.com/arctic-games/supertux/language/ko/)\n" diff --git a/data/levels/bonus1/la.po b/data/levels/bonus1/la.po index 528259d485..9ecd522905 100644 --- a/data/levels/bonus1/la.po +++ b/data/levels/bonus1/la.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Alisa P , 2016,2018\n" "Language-Team: Latin (http://app.transifex.com/arctic-games/supertux/language/la/)\n" diff --git a/data/levels/bonus1/lt.po b/data/levels/bonus1/lt.po index 1e81243850..505be576c5 100644 --- a/data/levels/bonus1/lt.po +++ b/data/levels/bonus1/lt.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Tom Urisk, 2021\n" "Language-Team: Lithuanian (http://app.transifex.com/arctic-games/supertux/language/lt/)\n" diff --git a/data/levels/bonus1/ms_MY.po b/data/levels/bonus1/ms_MY.po index 70f53da0ea..eead6d6563 100644 --- a/data/levels/bonus1/ms_MY.po +++ b/data/levels/bonus1/ms_MY.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: abuyop , 2020-2022\n" "Language-Team: Malay (Malaysia) (http://app.transifex.com/arctic-games/supertux/language/ms_MY/)\n" diff --git a/data/levels/bonus1/nb.po b/data/levels/bonus1/nb.po index 3f8d459d87..3c6c4e48e4 100644 --- a/data/levels/bonus1/nb.po +++ b/data/levels/bonus1/nb.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Norwegian Bokmål (http://app.transifex.com/arctic-games/supertux/language/nb/)\n" diff --git a/data/levels/bonus1/nds.po b/data/levels/bonus1/nds.po index fcd9a83d72..16346e77f8 100644 --- a/data/levels/bonus1/nds.po +++ b/data/levels/bonus1/nds.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Benedikt Straub , 2018\n" "Language-Team: Low German (http://app.transifex.com/arctic-games/supertux/language/nds/)\n" diff --git a/data/levels/bonus1/nl.po b/data/levels/bonus1/nl.po index 2eb58fbb77..e396638193 100644 --- a/data/levels/bonus1/nl.po +++ b/data/levels/bonus1/nl.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Heimen Stoffels , 2021\n" "Language-Team: Dutch (http://app.transifex.com/arctic-games/supertux/language/nl/)\n" diff --git a/data/levels/bonus1/nn.po b/data/levels/bonus1/nn.po index 4282ac6738..85d0f0a59b 100644 --- a/data/levels/bonus1/nn.po +++ b/data/levels/bonus1/nn.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Norwegian Nynorsk (http://app.transifex.com/arctic-games/supertux/language/nn/)\n" diff --git a/data/levels/bonus1/pl.po b/data/levels/bonus1/pl.po index 79a98576f9..478e72f1bc 100644 --- a/data/levels/bonus1/pl.po +++ b/data/levels/bonus1/pl.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Alina Gobarov, 2021\n" "Language-Team: Polish (http://app.transifex.com/arctic-games/supertux/language/pl/)\n" diff --git a/data/levels/bonus1/pt_BR.po b/data/levels/bonus1/pt_BR.po index a6785e8a46..1f2b921688 100644 --- a/data/levels/bonus1/pt_BR.po +++ b/data/levels/bonus1/pt_BR.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Jesusaves , 2021\n" "Language-Team: Portuguese (Brazil) (http://app.transifex.com/arctic-games/supertux/language/pt_BR/)\n" diff --git a/data/levels/bonus1/ro.po b/data/levels/bonus1/ro.po index 2edaa52051..a79d680d9f 100644 --- a/data/levels/bonus1/ro.po +++ b/data/levels/bonus1/ro.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Nicolae Crefelean, 2015-2016,2023\n" "Language-Team: Romanian (http://app.transifex.com/arctic-games/supertux/language/ro/)\n" diff --git a/data/levels/bonus1/sk.po b/data/levels/bonus1/sk.po index 5380e36b74..ac8d19db06 100644 --- a/data/levels/bonus1/sk.po +++ b/data/levels/bonus1/sk.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Slovak (http://app.transifex.com/arctic-games/supertux/language/sk/)\n" diff --git a/data/levels/bonus1/sl.po b/data/levels/bonus1/sl.po index 8e194271d6..3efcf7d636 100644 --- a/data/levels/bonus1/sl.po +++ b/data/levels/bonus1/sl.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Gorzy Gorup , 2019,2022\n" "Language-Team: Slovenian (http://app.transifex.com/arctic-games/supertux/language/sl/)\n" diff --git a/data/levels/bonus1/sq.po b/data/levels/bonus1/sq.po index 9dc718b52c..34f05ee5a0 100644 --- a/data/levels/bonus1/sq.po +++ b/data/levels/bonus1/sq.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Albanian (http://app.transifex.com/arctic-games/supertux/language/sq/)\n" diff --git a/data/levels/bonus1/sr.po b/data/levels/bonus1/sr.po index 18b506fe15..61274b56cc 100644 --- a/data/levels/bonus1/sr.po +++ b/data/levels/bonus1/sr.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Slobodan Simić , 2016\n" "Language-Team: Serbian (http://app.transifex.com/arctic-games/supertux/language/sr/)\n" diff --git a/data/levels/bonus1/sv.po b/data/levels/bonus1/sv.po index 59c094dbab..8d84332c0f 100644 --- a/data/levels/bonus1/sv.po +++ b/data/levels/bonus1/sv.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Sebastian Rasmussen , 2020-2021\n" "Language-Team: Swedish (http://app.transifex.com/arctic-games/supertux/language/sv/)\n" diff --git a/data/levels/bonus1/te.po b/data/levels/bonus1/te.po index 6a465018b6..a1e52c1e53 100644 --- a/data/levels/bonus1/te.po +++ b/data/levels/bonus1/te.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: జయంత్ వర్మ బెల్లపుకొండ , 2022\n" "Language-Team: Telugu (http://app.transifex.com/arctic-games/supertux/language/te/)\n" diff --git a/data/levels/bonus1/tr.po b/data/levels/bonus1/tr.po index 15713eb671..98b87f758b 100644 --- a/data/levels/bonus1/tr.po +++ b/data/levels/bonus1/tr.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Turkish (http://app.transifex.com/arctic-games/supertux/language/tr/)\n" diff --git a/data/levels/bonus1/tt.po b/data/levels/bonus1/tt.po index 3b3fa93726..5b0f38952d 100644 --- a/data/levels/bonus1/tt.po +++ b/data/levels/bonus1/tt.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Tatar (http://app.transifex.com/arctic-games/supertux/language/tt/)\n" diff --git a/data/levels/bonus1/uk.po b/data/levels/bonus1/uk.po index df7ed42c81..b065306d92 100644 --- a/data/levels/bonus1/uk.po +++ b/data/levels/bonus1/uk.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: Asemif official, 2023\n" "Language-Team: Ukrainian (http://app.transifex.com/arctic-games/supertux/language/uk/)\n" diff --git a/data/levels/bonus1/uz.po b/data/levels/bonus1/uz.po index be027da7ed..aadc1cc8e9 100644 --- a/data/levels/bonus1/uz.po +++ b/data/levels/bonus1/uz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Uzbek (http://app.transifex.com/arctic-games/supertux/language/uz/)\n" diff --git a/data/levels/bonus1/zh_CN.po b/data/levels/bonus1/zh_CN.po index 141047f6cf..eac7ad6786 100644 --- a/data/levels/bonus1/zh_CN.po +++ b/data/levels/bonus1/zh_CN.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: 玉堂白鹤 , 2018\n" "Language-Team: Chinese (China) (http://app.transifex.com/arctic-games/supertux/language/zh_CN/)\n" diff --git a/data/levels/bonus1/zh_TW.po b/data/levels/bonus1/zh_TW.po index 4569032984..d0887e91b6 100644 --- a/data/levels/bonus1/zh_TW.po +++ b/data/levels/bonus1/zh_TW.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:04+0000\n" "Last-Translator: 黃柏諺 , 2019\n" "Language-Team: Chinese (Taiwan) (http://app.transifex.com/arctic-games/supertux/language/zh_TW/)\n" diff --git a/data/levels/bonus2/af_ZA.po b/data/levels/bonus2/af_ZA.po index 4730c5aa77..2d34e677e3 100644 --- a/data/levels/bonus2/af_ZA.po +++ b/data/levels/bonus2/af_ZA.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Martin van Zijl , 2019\n" "Language-Team: Afrikaans (South Africa) (http://app.transifex.com/arctic-games/supertux/language/af_ZA/)\n" diff --git a/data/levels/bonus2/ar.po b/data/levels/bonus2/ar.po index 07837069ad..1663a3aa13 100644 --- a/data/levels/bonus2/ar.po +++ b/data/levels/bonus2/ar.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Arabic (http://app.transifex.com/arctic-games/supertux/language/ar/)\n" diff --git a/data/levels/bonus2/az.po b/data/levels/bonus2/az.po index a39c794316..e220f231c2 100644 --- a/data/levels/bonus2/az.po +++ b/data/levels/bonus2/az.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Azerbaijani (http://app.transifex.com/arctic-games/supertux/language/az/)\n" diff --git a/data/levels/bonus2/be.po b/data/levels/bonus2/be.po index 7fa68158ac..b2d14ea4e2 100644 --- a/data/levels/bonus2/be.po +++ b/data/levels/bonus2/be.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: se luxxy <70luxxy@gmail.com>, 2018\n" "Language-Team: Belarusian (http://app.transifex.com/arctic-games/supertux/language/be/)\n" diff --git a/data/levels/bonus2/br.po b/data/levels/bonus2/br.po index 9b9bcd9969..509770a3a2 100644 --- a/data/levels/bonus2/br.po +++ b/data/levels/bonus2/br.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Irriep Nala Novram , 2017-2018\n" "Language-Team: Breton (http://app.transifex.com/arctic-games/supertux/language/br/)\n" diff --git a/data/levels/bonus2/ca.po b/data/levels/bonus2/ca.po index 971d00ae16..ad38c4de06 100644 --- a/data/levels/bonus2/ca.po +++ b/data/levels/bonus2/ca.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Ariadna Pascual , 2016\n" "Language-Team: Catalan (http://app.transifex.com/arctic-games/supertux/language/ca/)\n" diff --git a/data/levels/bonus2/cmn.po b/data/levels/bonus2/cmn.po index 055adc0ff5..b886ee408b 100644 --- a/data/levels/bonus2/cmn.po +++ b/data/levels/bonus2/cmn.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: 趙惟倫 , 2013\n" "Language-Team: Chinese (Mandarin) (http://app.transifex.com/arctic-games/supertux/language/cmn/)\n" diff --git a/data/levels/bonus2/cs.po b/data/levels/bonus2/cs.po index 79c83b4b37..83fb527d2b 100644 --- a/data/levels/bonus2/cs.po +++ b/data/levels/bonus2/cs.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Jiří Paleček , 2021-2022\n" "Language-Team: Czech (http://app.transifex.com/arctic-games/supertux/language/cs/)\n" diff --git a/data/levels/bonus2/de.po b/data/levels/bonus2/de.po index 80b0110f56..c69a249177 100644 --- a/data/levels/bonus2/de.po +++ b/data/levels/bonus2/de.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Tobias Markus , 2018,2021\n" "Language-Team: German (http://app.transifex.com/arctic-games/supertux/language/de/)\n" diff --git a/data/levels/bonus2/el.po b/data/levels/bonus2/el.po index e93aa68afe..6224281916 100644 --- a/data/levels/bonus2/el.po +++ b/data/levels/bonus2/el.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Vangelis Skarmoutsos (SkarmoutsosV) , 2016\n" "Language-Team: Greek (http://app.transifex.com/arctic-games/supertux/language/el/)\n" diff --git a/data/levels/bonus2/eo.po b/data/levels/bonus2/eo.po index 05a29fd2bc..62b548c35c 100644 --- a/data/levels/bonus2/eo.po +++ b/data/levels/bonus2/eo.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: tellovishous , 2023\n" "Language-Team: Esperanto (http://app.transifex.com/arctic-games/supertux/language/eo/)\n" diff --git a/data/levels/bonus2/es.po b/data/levels/bonus2/es.po index 2e22b9702b..9198ae6687 100644 --- a/data/levels/bonus2/es.po +++ b/data/levels/bonus2/es.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Swyter , 2021\n" "Language-Team: Spanish (http://app.transifex.com/arctic-games/supertux/language/es/)\n" diff --git a/data/levels/bonus2/es_AR.po b/data/levels/bonus2/es_AR.po index ed5033dcaf..5f96e59ef4 100644 --- a/data/levels/bonus2/es_AR.po +++ b/data/levels/bonus2/es_AR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Alejo Fernandez , 2020\n" "Language-Team: Spanish (Argentina) (http://app.transifex.com/arctic-games/supertux/language/es_AR/)\n" diff --git a/data/levels/bonus2/et.po b/data/levels/bonus2/et.po index bb823a674e..e6a054df8d 100644 --- a/data/levels/bonus2/et.po +++ b/data/levels/bonus2/et.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Estonian (http://app.transifex.com/arctic-games/supertux/language/et/)\n" diff --git a/data/levels/bonus2/eu.po b/data/levels/bonus2/eu.po index 4315575216..62b9e5bb2f 100644 --- a/data/levels/bonus2/eu.po +++ b/data/levels/bonus2/eu.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Mielanjel Iraeta , 2018\n" "Language-Team: Basque (http://app.transifex.com/arctic-games/supertux/language/eu/)\n" diff --git a/data/levels/bonus2/fi.po b/data/levels/bonus2/fi.po index baf3e8e721..3ea510d4cc 100644 --- a/data/levels/bonus2/fi.po +++ b/data/levels/bonus2/fi.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Jaakoppi Horila , 2016,2018,2020,2022-2023\n" "Language-Team: Finnish (http://app.transifex.com/arctic-games/supertux/language/fi/)\n" diff --git a/data/levels/bonus2/fr.po b/data/levels/bonus2/fr.po index c78dbbd48b..fbaf558ad7 100644 --- a/data/levels/bonus2/fr.po +++ b/data/levels/bonus2/fr.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Antoine , 2020\n" "Language-Team: French (http://app.transifex.com/arctic-games/supertux/language/fr/)\n" diff --git a/data/levels/bonus2/fr_CA.po b/data/levels/bonus2/fr_CA.po index 7c2ab7846e..c858b09001 100644 --- a/data/levels/bonus2/fr_CA.po +++ b/data/levels/bonus2/fr_CA.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: French (Canada) (http://app.transifex.com/arctic-games/supertux/language/fr_CA/)\n" diff --git a/data/levels/bonus2/gd.po b/data/levels/bonus2/gd.po index 3665d8fc7c..d1292675df 100644 --- a/data/levels/bonus2/gd.po +++ b/data/levels/bonus2/gd.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: GunChleoc, 2016,2019\n" "Language-Team: Gaelic, Scottish (http://app.transifex.com/arctic-games/supertux/language/gd/)\n" diff --git a/data/levels/bonus2/gl.po b/data/levels/bonus2/gl.po index 086e1c1663..34c4f76bab 100644 --- a/data/levels/bonus2/gl.po +++ b/data/levels/bonus2/gl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Xan Vieiro , 2019-2020\n" "Language-Team: Galician (http://app.transifex.com/arctic-games/supertux/language/gl/)\n" diff --git a/data/levels/bonus2/he.po b/data/levels/bonus2/he.po index 65aa28a1bc..00cab6b580 100644 --- a/data/levels/bonus2/he.po +++ b/data/levels/bonus2/he.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Hebrew (http://app.transifex.com/arctic-games/supertux/language/he/)\n" diff --git a/data/levels/bonus2/hr.po b/data/levels/bonus2/hr.po index adcaa17fd1..bb7678a1ba 100644 --- a/data/levels/bonus2/hr.po +++ b/data/levels/bonus2/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Croatian (http://app.transifex.com/arctic-games/supertux/language/hr/)\n" diff --git a/data/levels/bonus2/hu.po b/data/levels/bonus2/hu.po index 2adb8f86c6..77a2325229 100644 --- a/data/levels/bonus2/hu.po +++ b/data/levels/bonus2/hu.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Kristóf Kófiás , 2020\n" "Language-Team: Hungarian (http://app.transifex.com/arctic-games/supertux/language/hu/)\n" diff --git a/data/levels/bonus2/hy.po b/data/levels/bonus2/hy.po index 3902437e10..8592826e19 100644 --- a/data/levels/bonus2/hy.po +++ b/data/levels/bonus2/hy.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Armenian (http://app.transifex.com/arctic-games/supertux/language/hy/)\n" diff --git a/data/levels/bonus2/id.po b/data/levels/bonus2/id.po index c52dfd2b93..2d2b70f3e0 100644 --- a/data/levels/bonus2/id.po +++ b/data/levels/bonus2/id.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Indonesian (http://app.transifex.com/arctic-games/supertux/language/id/)\n" diff --git a/data/levels/bonus2/is.po b/data/levels/bonus2/is.po index 4f50e901bf..95064d4010 100644 --- a/data/levels/bonus2/is.po +++ b/data/levels/bonus2/is.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Icelandic (http://app.transifex.com/arctic-games/supertux/language/is/)\n" diff --git a/data/levels/bonus2/it.po b/data/levels/bonus2/it.po index 2344fe27f3..bbd251f616 100644 --- a/data/levels/bonus2/it.po +++ b/data/levels/bonus2/it.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Bananasoft , 2016\n" "Language-Team: Italian (http://app.transifex.com/arctic-games/supertux/language/it/)\n" diff --git a/data/levels/bonus2/ja.po b/data/levels/bonus2/ja.po index 993bdf8eb0..0717058b1d 100644 --- a/data/levels/bonus2/ja.po +++ b/data/levels/bonus2/ja.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Ryo Nakano, 2019\n" "Language-Team: Japanese (http://app.transifex.com/arctic-games/supertux/language/ja/)\n" diff --git a/data/levels/bonus2/ko.po b/data/levels/bonus2/ko.po index d5f73c413c..e6f7175b03 100644 --- a/data/levels/bonus2/ko.po +++ b/data/levels/bonus2/ko.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Junghee Lee , 2022\n" "Language-Team: Korean (http://app.transifex.com/arctic-games/supertux/language/ko/)\n" diff --git a/data/levels/bonus2/la.po b/data/levels/bonus2/la.po index d75873cc14..2a3e7b77e0 100644 --- a/data/levels/bonus2/la.po +++ b/data/levels/bonus2/la.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Alisa P , 2016,2018\n" "Language-Team: Latin (http://app.transifex.com/arctic-games/supertux/language/la/)\n" diff --git a/data/levels/bonus2/lt.po b/data/levels/bonus2/lt.po index 9540188d2b..6a7b9fa1ae 100644 --- a/data/levels/bonus2/lt.po +++ b/data/levels/bonus2/lt.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Tom Urisk, 2021\n" "Language-Team: Lithuanian (http://app.transifex.com/arctic-games/supertux/language/lt/)\n" diff --git a/data/levels/bonus2/ms_MY.po b/data/levels/bonus2/ms_MY.po index 6b210aa70f..f36d7d561b 100644 --- a/data/levels/bonus2/ms_MY.po +++ b/data/levels/bonus2/ms_MY.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: abuyop , 2021\n" "Language-Team: Malay (Malaysia) (http://app.transifex.com/arctic-games/supertux/language/ms_MY/)\n" diff --git a/data/levels/bonus2/nb.po b/data/levels/bonus2/nb.po index 72a7e35134..c5a11ea899 100644 --- a/data/levels/bonus2/nb.po +++ b/data/levels/bonus2/nb.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Allan Nordhøy , 2016\n" "Language-Team: Norwegian Bokmål (http://app.transifex.com/arctic-games/supertux/language/nb/)\n" diff --git a/data/levels/bonus2/nds.po b/data/levels/bonus2/nds.po index 7958d7e975..b877eabce6 100644 --- a/data/levels/bonus2/nds.po +++ b/data/levels/bonus2/nds.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Benedikt Straub , 2018\n" "Language-Team: Low German (http://app.transifex.com/arctic-games/supertux/language/nds/)\n" diff --git a/data/levels/bonus2/ne.po b/data/levels/bonus2/ne.po index 86f56bc604..e26feb62ff 100644 --- a/data/levels/bonus2/ne.po +++ b/data/levels/bonus2/ne.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Bansaj Pradhan , 2013\n" "Language-Team: Nepali (http://app.transifex.com/arctic-games/supertux/language/ne/)\n" diff --git a/data/levels/bonus2/nl.po b/data/levels/bonus2/nl.po index 4088d16a41..185b64e420 100644 --- a/data/levels/bonus2/nl.po +++ b/data/levels/bonus2/nl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Heimen Stoffels , 2015-2016,2019\n" "Language-Team: Dutch (http://app.transifex.com/arctic-games/supertux/language/nl/)\n" diff --git a/data/levels/bonus2/nn.po b/data/levels/bonus2/nn.po index 6f0982dad0..011b939933 100644 --- a/data/levels/bonus2/nn.po +++ b/data/levels/bonus2/nn.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Karl Ove Hufthammer , 2007,2013,2015-2016,2018-2020\n" "Language-Team: Norwegian Nynorsk (http://app.transifex.com/arctic-games/supertux/language/nn/)\n" diff --git a/data/levels/bonus2/pl.po b/data/levels/bonus2/pl.po index 4ffb6ec7b0..b91bd90ccb 100644 --- a/data/levels/bonus2/pl.po +++ b/data/levels/bonus2/pl.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Krzysztof Szeląg, 2015-2016\n" "Language-Team: Polish (http://app.transifex.com/arctic-games/supertux/language/pl/)\n" diff --git a/data/levels/bonus2/pt.po b/data/levels/bonus2/pt.po index 9e7fddbc9f..50ccc05360 100644 --- a/data/levels/bonus2/pt.po +++ b/data/levels/bonus2/pt.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Rui , 2016\n" "Language-Team: Portuguese (http://app.transifex.com/arctic-games/supertux/language/pt/)\n" diff --git a/data/levels/bonus2/pt_BR.po b/data/levels/bonus2/pt_BR.po index 6be5a38ca2..42b2f2ce93 100644 --- a/data/levels/bonus2/pt_BR.po +++ b/data/levels/bonus2/pt_BR.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Rui , 2016\n" "Language-Team: Portuguese (Brazil) (http://app.transifex.com/arctic-games/supertux/language/pt_BR/)\n" diff --git a/data/levels/bonus2/ro.po b/data/levels/bonus2/ro.po index b83de69845..c79293444d 100644 --- a/data/levels/bonus2/ro.po +++ b/data/levels/bonus2/ro.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Nicolae Crefelean, 2015-2016\n" "Language-Team: Romanian (http://app.transifex.com/arctic-games/supertux/language/ro/)\n" diff --git a/data/levels/bonus2/ru.po b/data/levels/bonus2/ru.po index 7697f5ce8f..e60055aa17 100644 --- a/data/levels/bonus2/ru.po +++ b/data/levels/bonus2/ru.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Andrei Stepanov, 2019,2021\n" "Language-Team: Russian (http://app.transifex.com/arctic-games/supertux/language/ru/)\n" diff --git a/data/levels/bonus2/sk.po b/data/levels/bonus2/sk.po index 8625ca8b0b..c5df16dfbd 100644 --- a/data/levels/bonus2/sk.po +++ b/data/levels/bonus2/sk.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Slovak (http://app.transifex.com/arctic-games/supertux/language/sk/)\n" diff --git a/data/levels/bonus2/sl.po b/data/levels/bonus2/sl.po index 6a57674fe3..6f1a8841b1 100644 --- a/data/levels/bonus2/sl.po +++ b/data/levels/bonus2/sl.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Gorzy Gorup , 2019,2022\n" "Language-Team: Slovenian (http://app.transifex.com/arctic-games/supertux/language/sl/)\n" diff --git a/data/levels/bonus2/sq.po b/data/levels/bonus2/sq.po index f0ffa470a4..ed0eb1603b 100644 --- a/data/levels/bonus2/sq.po +++ b/data/levels/bonus2/sq.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Albanian (http://app.transifex.com/arctic-games/supertux/language/sq/)\n" diff --git a/data/levels/bonus2/sr.po b/data/levels/bonus2/sr.po index 98b68e4e8f..dfda8e4c90 100644 --- a/data/levels/bonus2/sr.po +++ b/data/levels/bonus2/sr.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Slobodan Simić , 2016\n" "Language-Team: Serbian (http://app.transifex.com/arctic-games/supertux/language/sr/)\n" diff --git a/data/levels/bonus2/sv.po b/data/levels/bonus2/sv.po index 1a8db001e4..b8e75fb2c3 100644 --- a/data/levels/bonus2/sv.po +++ b/data/levels/bonus2/sv.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Anders Jonsson , 2017\n" "Language-Team: Swedish (http://app.transifex.com/arctic-games/supertux/language/sv/)\n" diff --git a/data/levels/bonus2/te.po b/data/levels/bonus2/te.po index 0ecc54412c..f0c06dcbc6 100644 --- a/data/levels/bonus2/te.po +++ b/data/levels/bonus2/te.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Nanowarrior, 2021\n" "Language-Team: Telugu (http://app.transifex.com/arctic-games/supertux/language/te/)\n" diff --git a/data/levels/bonus2/tr.po b/data/levels/bonus2/tr.po index f37347ea56..aba548c379 100644 --- a/data/levels/bonus2/tr.po +++ b/data/levels/bonus2/tr.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Emre ÖZKARTAL , 2016\n" "Language-Team: Turkish (http://app.transifex.com/arctic-games/supertux/language/tr/)\n" diff --git a/data/levels/bonus2/tt.po b/data/levels/bonus2/tt.po index 90f3b59f09..2840287956 100644 --- a/data/levels/bonus2/tt.po +++ b/data/levels/bonus2/tt.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Булат Ибраһим , 2016\n" "Language-Team: Tatar (http://app.transifex.com/arctic-games/supertux/language/tt/)\n" diff --git a/data/levels/bonus2/uk.po b/data/levels/bonus2/uk.po index 542ee25dae..d7ef2b984f 100644 --- a/data/levels/bonus2/uk.po +++ b/data/levels/bonus2/uk.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Asemif official, 2023\n" "Language-Team: Ukrainian (http://app.transifex.com/arctic-games/supertux/language/uk/)\n" diff --git a/data/levels/bonus2/uz.po b/data/levels/bonus2/uz.po index cef82b2f99..fc81394999 100644 --- a/data/levels/bonus2/uz.po +++ b/data/levels/bonus2/uz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Uzbek (http://app.transifex.com/arctic-games/supertux/language/uz/)\n" diff --git a/data/levels/bonus2/zh_CN.po b/data/levels/bonus2/zh_CN.po index 484ebfd03b..36837972fe 100644 --- a/data/levels/bonus2/zh_CN.po +++ b/data/levels/bonus2/zh_CN.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: Wenbin Lv , 2024\n" "Language-Team: Chinese (China) (http://app.transifex.com/arctic-games/supertux/language/zh_CN/)\n" diff --git a/data/levels/bonus2/zh_TW.po b/data/levels/bonus2/zh_TW.po index 2b0fadea70..f38867df44 100644 --- a/data/levels/bonus2/zh_TW.po +++ b/data/levels/bonus2/zh_TW.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2013-08-10 23:07+0000\n" "Last-Translator: 黃柏諺 , 2019\n" "Language-Team: Chinese (Taiwan) (http://app.transifex.com/arctic-games/supertux/language/zh_TW/)\n" diff --git a/data/levels/halloween2014/ar.po b/data/levels/halloween2014/ar.po index c8b15055ec..68bad58ac1 100644 --- a/data/levels/halloween2014/ar.po +++ b/data/levels/halloween2014/ar.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Arabic (http://app.transifex.com/arctic-games/supertux/language/ar/)\n" diff --git a/data/levels/halloween2014/az.po b/data/levels/halloween2014/az.po index 9ba5919de1..8e99ea4bac 100644 --- a/data/levels/halloween2014/az.po +++ b/data/levels/halloween2014/az.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Azerbaijani (http://app.transifex.com/arctic-games/supertux/language/az/)\n" diff --git a/data/levels/halloween2014/br.po b/data/levels/halloween2014/br.po index 13ad897397..a832274869 100644 --- a/data/levels/halloween2014/br.po +++ b/data/levels/halloween2014/br.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Irriep Nala Novram , 2017-2018\n" "Language-Team: Breton (http://app.transifex.com/arctic-games/supertux/language/br/)\n" diff --git a/data/levels/halloween2014/ca.po b/data/levels/halloween2014/ca.po index 496f6878e8..bcf28ab2da 100644 --- a/data/levels/halloween2014/ca.po +++ b/data/levels/halloween2014/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Ariadna Pascual , 2016\n" "Language-Team: Catalan (http://app.transifex.com/arctic-games/supertux/language/ca/)\n" diff --git a/data/levels/halloween2014/cs.po b/data/levels/halloween2014/cs.po index ebbda6f89d..824aa8041c 100644 --- a/data/levels/halloween2014/cs.po +++ b/data/levels/halloween2014/cs.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Jiří Paleček , 2021\n" "Language-Team: Czech (http://app.transifex.com/arctic-games/supertux/language/cs/)\n" diff --git a/data/levels/halloween2014/da.po b/data/levels/halloween2014/da.po index 8b4f5cfe0c..72fa8988e0 100644 --- a/data/levels/halloween2014/da.po +++ b/data/levels/halloween2014/da.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Joe Hansen , 2015\n" "Language-Team: Danish (http://app.transifex.com/arctic-games/supertux/language/da/)\n" diff --git a/data/levels/halloween2014/de.po b/data/levels/halloween2014/de.po index 948817e72f..4af93ab94e 100644 --- a/data/levels/halloween2014/de.po +++ b/data/levels/halloween2014/de.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Ettore Atalan , 2015\n" "Language-Team: German (http://app.transifex.com/arctic-games/supertux/language/de/)\n" diff --git a/data/levels/halloween2014/el.po b/data/levels/halloween2014/el.po index 2e23cc9fb6..da986bfa4f 100644 --- a/data/levels/halloween2014/el.po +++ b/data/levels/halloween2014/el.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Vangelis Skarmoutsos (SkarmoutsosV) , 2016\n" "Language-Team: Greek (http://app.transifex.com/arctic-games/supertux/language/el/)\n" diff --git a/data/levels/halloween2014/eo.po b/data/levels/halloween2014/eo.po index 3497f75e8f..571fcd9390 100644 --- a/data/levels/halloween2014/eo.po +++ b/data/levels/halloween2014/eo.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Esperanto (http://app.transifex.com/arctic-games/supertux/language/eo/)\n" diff --git a/data/levels/halloween2014/es.po b/data/levels/halloween2014/es.po index 23345e3afc..f08f39968a 100644 --- a/data/levels/halloween2014/es.po +++ b/data/levels/halloween2014/es.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Swyter , 2021\n" "Language-Team: Spanish (http://app.transifex.com/arctic-games/supertux/language/es/)\n" diff --git a/data/levels/halloween2014/es_AR.po b/data/levels/halloween2014/es_AR.po index 0042b08ef9..1b2fc35753 100644 --- a/data/levels/halloween2014/es_AR.po +++ b/data/levels/halloween2014/es_AR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Alejo Fernandez , 2020\n" "Language-Team: Spanish (Argentina) (http://app.transifex.com/arctic-games/supertux/language/es_AR/)\n" diff --git a/data/levels/halloween2014/et.po b/data/levels/halloween2014/et.po index 5ac278d2cb..26ca9bde3f 100644 --- a/data/levels/halloween2014/et.po +++ b/data/levels/halloween2014/et.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Estonian (http://app.transifex.com/arctic-games/supertux/language/et/)\n" diff --git a/data/levels/halloween2014/eu.po b/data/levels/halloween2014/eu.po index c81f1b84ff..e625e1dd46 100644 --- a/data/levels/halloween2014/eu.po +++ b/data/levels/halloween2014/eu.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Mielanjel Iraeta , 2018\n" "Language-Team: Basque (http://app.transifex.com/arctic-games/supertux/language/eu/)\n" diff --git a/data/levels/halloween2014/fi.po b/data/levels/halloween2014/fi.po index f9ac661df0..4733caf09a 100644 --- a/data/levels/halloween2014/fi.po +++ b/data/levels/halloween2014/fi.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Jaakoppi Horila , 2016,2022\n" "Language-Team: Finnish (http://app.transifex.com/arctic-games/supertux/language/fi/)\n" diff --git a/data/levels/halloween2014/fr.po b/data/levels/halloween2014/fr.po index 3c639495ab..f723abe2dd 100644 --- a/data/levels/halloween2014/fr.po +++ b/data/levels/halloween2014/fr.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Sébastien Aperghis-Tramoni, 2015\n" "Language-Team: French (http://app.transifex.com/arctic-games/supertux/language/fr/)\n" diff --git a/data/levels/halloween2014/fr_CA.po b/data/levels/halloween2014/fr_CA.po index d57f3b0e9c..d6938e70e4 100644 --- a/data/levels/halloween2014/fr_CA.po +++ b/data/levels/halloween2014/fr_CA.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: French (Canada) (http://app.transifex.com/arctic-games/supertux/language/fr_CA/)\n" diff --git a/data/levels/halloween2014/gd.po b/data/levels/halloween2014/gd.po index d7f2545d04..591b595391 100644 --- a/data/levels/halloween2014/gd.po +++ b/data/levels/halloween2014/gd.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: GunChleoc, 2019\n" "Language-Team: Gaelic, Scottish (http://app.transifex.com/arctic-games/supertux/language/gd/)\n" diff --git a/data/levels/halloween2014/gl.po b/data/levels/halloween2014/gl.po index 5825ef2ab1..ca4fae1ec4 100644 --- a/data/levels/halloween2014/gl.po +++ b/data/levels/halloween2014/gl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Pablo Rodriguez , 2019\n" "Language-Team: Galician (http://app.transifex.com/arctic-games/supertux/language/gl/)\n" diff --git a/data/levels/halloween2014/he.po b/data/levels/halloween2014/he.po index dcabe020b0..bfe9228ece 100644 --- a/data/levels/halloween2014/he.po +++ b/data/levels/halloween2014/he.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Hebrew (http://app.transifex.com/arctic-games/supertux/language/he/)\n" diff --git a/data/levels/halloween2014/hr.po b/data/levels/halloween2014/hr.po index bda1ec9a93..f89d2597d4 100644 --- a/data/levels/halloween2014/hr.po +++ b/data/levels/halloween2014/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Croatian (http://app.transifex.com/arctic-games/supertux/language/hr/)\n" diff --git a/data/levels/halloween2014/hu.po b/data/levels/halloween2014/hu.po index 490311efef..b411857aa5 100644 --- a/data/levels/halloween2014/hu.po +++ b/data/levels/halloween2014/hu.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Kristóf Kófiás , 2020\n" "Language-Team: Hungarian (http://app.transifex.com/arctic-games/supertux/language/hu/)\n" diff --git a/data/levels/halloween2014/hy.po b/data/levels/halloween2014/hy.po index d77063fded..b5f2715c2c 100644 --- a/data/levels/halloween2014/hy.po +++ b/data/levels/halloween2014/hy.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Armenian (http://app.transifex.com/arctic-games/supertux/language/hy/)\n" diff --git a/data/levels/halloween2014/id.po b/data/levels/halloween2014/id.po index afe5772d99..d027dc330a 100644 --- a/data/levels/halloween2014/id.po +++ b/data/levels/halloween2014/id.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Indonesian (http://app.transifex.com/arctic-games/supertux/language/id/)\n" diff --git a/data/levels/halloween2014/is.po b/data/levels/halloween2014/is.po index 198942650a..99b0ba4119 100644 --- a/data/levels/halloween2014/is.po +++ b/data/levels/halloween2014/is.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Icelandic (http://app.transifex.com/arctic-games/supertux/language/is/)\n" diff --git a/data/levels/halloween2014/it.po b/data/levels/halloween2014/it.po index 08064c9edb..db3091acef 100644 --- a/data/levels/halloween2014/it.po +++ b/data/levels/halloween2014/it.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Gianfranco Del Borrello , 2016\n" "Language-Team: Italian (http://app.transifex.com/arctic-games/supertux/language/it/)\n" diff --git a/data/levels/halloween2014/ja.po b/data/levels/halloween2014/ja.po index 7e4621a181..5202b28f19 100644 --- a/data/levels/halloween2014/ja.po +++ b/data/levels/halloween2014/ja.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Ryo Nakano, 2019\n" "Language-Team: Japanese (http://app.transifex.com/arctic-games/supertux/language/ja/)\n" diff --git a/data/levels/halloween2014/ko.po b/data/levels/halloween2014/ko.po index efd6d8daca..43fa1da937 100644 --- a/data/levels/halloween2014/ko.po +++ b/data/levels/halloween2014/ko.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Myeongjin , 2016\n" "Language-Team: Korean (http://app.transifex.com/arctic-games/supertux/language/ko/)\n" diff --git a/data/levels/halloween2014/la.po b/data/levels/halloween2014/la.po index d9619fcee5..cac5d804f3 100644 --- a/data/levels/halloween2014/la.po +++ b/data/levels/halloween2014/la.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Latin (http://app.transifex.com/arctic-games/supertux/language/la/)\n" diff --git a/data/levels/halloween2014/lt.po b/data/levels/halloween2014/lt.po index a79759177e..d87d8e7504 100644 --- a/data/levels/halloween2014/lt.po +++ b/data/levels/halloween2014/lt.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Tom Urisk, 2021\n" "Language-Team: Lithuanian (http://app.transifex.com/arctic-games/supertux/language/lt/)\n" diff --git a/data/levels/halloween2014/ml.po b/data/levels/halloween2014/ml.po index f2c048b313..da0e8b48cd 100644 --- a/data/levels/halloween2014/ml.po +++ b/data/levels/halloween2014/ml.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Adharsh P S , 2019\n" "Language-Team: Malayalam (http://app.transifex.com/arctic-games/supertux/language/ml/)\n" diff --git a/data/levels/halloween2014/ms_MY.po b/data/levels/halloween2014/ms_MY.po index 6fcd01c3e1..f8edf09117 100644 --- a/data/levels/halloween2014/ms_MY.po +++ b/data/levels/halloween2014/ms_MY.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: abuyop , 2018,2021\n" "Language-Team: Malay (Malaysia) (http://app.transifex.com/arctic-games/supertux/language/ms_MY/)\n" diff --git a/data/levels/halloween2014/nb.po b/data/levels/halloween2014/nb.po index 16e69fb3ad..7e5bc5940a 100644 --- a/data/levels/halloween2014/nb.po +++ b/data/levels/halloween2014/nb.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Karl Ove Hufthammer , 2015\n" "Language-Team: Norwegian Bokmål (http://app.transifex.com/arctic-games/supertux/language/nb/)\n" diff --git a/data/levels/halloween2014/nds.po b/data/levels/halloween2014/nds.po index be39f8e56f..e9aee6429b 100644 --- a/data/levels/halloween2014/nds.po +++ b/data/levels/halloween2014/nds.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Benedikt Straub , 2018\n" "Language-Team: Low German (http://app.transifex.com/arctic-games/supertux/language/nds/)\n" diff --git a/data/levels/halloween2014/nl.po b/data/levels/halloween2014/nl.po index 2a75111a17..524225cf47 100644 --- a/data/levels/halloween2014/nl.po +++ b/data/levels/halloween2014/nl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Heimen Stoffels , 2015,2019\n" "Language-Team: Dutch (http://app.transifex.com/arctic-games/supertux/language/nl/)\n" diff --git a/data/levels/halloween2014/nn.po b/data/levels/halloween2014/nn.po index e46c3eafc8..89c1393fb9 100644 --- a/data/levels/halloween2014/nn.po +++ b/data/levels/halloween2014/nn.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Karl Ove Hufthammer , 2015\n" "Language-Team: Norwegian Nynorsk (http://app.transifex.com/arctic-games/supertux/language/nn/)\n" diff --git a/data/levels/halloween2014/pl.po b/data/levels/halloween2014/pl.po index f1efddaab9..6e8c5dc5d4 100644 --- a/data/levels/halloween2014/pl.po +++ b/data/levels/halloween2014/pl.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Krzysztof Szeląg, 2015\n" "Language-Team: Polish (http://app.transifex.com/arctic-games/supertux/language/pl/)\n" diff --git a/data/levels/halloween2014/pt.po b/data/levels/halloween2014/pt.po index 41af271fff..7a4d1ff75a 100644 --- a/data/levels/halloween2014/pt.po +++ b/data/levels/halloween2014/pt.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Rui , 2016\n" "Language-Team: Portuguese (http://app.transifex.com/arctic-games/supertux/language/pt/)\n" diff --git a/data/levels/halloween2014/pt_BR.po b/data/levels/halloween2014/pt_BR.po index 4179e4dc84..a7150b6c70 100644 --- a/data/levels/halloween2014/pt_BR.po +++ b/data/levels/halloween2014/pt_BR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Rui , 2016\n" "Language-Team: Portuguese (Brazil) (http://app.transifex.com/arctic-games/supertux/language/pt_BR/)\n" diff --git a/data/levels/halloween2014/ro.po b/data/levels/halloween2014/ro.po index c8d5b41647..97d42f8492 100644 --- a/data/levels/halloween2014/ro.po +++ b/data/levels/halloween2014/ro.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Romanian (http://app.transifex.com/arctic-games/supertux/language/ro/)\n" diff --git a/data/levels/halloween2014/ru.po b/data/levels/halloween2014/ru.po index 823ba0b628..4f38f41b03 100644 --- a/data/levels/halloween2014/ru.po +++ b/data/levels/halloween2014/ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Dmitry Anikonov , 2015\n" "Language-Team: Russian (http://app.transifex.com/arctic-games/supertux/language/ru/)\n" diff --git a/data/levels/halloween2014/sk.po b/data/levels/halloween2014/sk.po index ff8b7e23fe..1020bd76c7 100644 --- a/data/levels/halloween2014/sk.po +++ b/data/levels/halloween2014/sk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: MiroslavR , 2015\n" "Language-Team: Slovak (http://app.transifex.com/arctic-games/supertux/language/sk/)\n" diff --git a/data/levels/halloween2014/sl.po b/data/levels/halloween2014/sl.po index 15f7670e10..0913ffa364 100644 --- a/data/levels/halloween2014/sl.po +++ b/data/levels/halloween2014/sl.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Gorzy Gorup , 2022\n" "Language-Team: Slovenian (http://app.transifex.com/arctic-games/supertux/language/sl/)\n" diff --git a/data/levels/halloween2014/sq.po b/data/levels/halloween2014/sq.po index da57e192cd..bad5e1dda1 100644 --- a/data/levels/halloween2014/sq.po +++ b/data/levels/halloween2014/sq.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2022\n" "Language-Team: Albanian (http://app.transifex.com/arctic-games/supertux/language/sq/)\n" diff --git a/data/levels/halloween2014/sv.po b/data/levels/halloween2014/sv.po index 4cca9a5b25..1585efd29d 100644 --- a/data/levels/halloween2014/sv.po +++ b/data/levels/halloween2014/sv.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Sebastian Rasmussen , 2015\n" "Language-Team: Swedish (http://app.transifex.com/arctic-games/supertux/language/sv/)\n" diff --git a/data/levels/halloween2014/te.po b/data/levels/halloween2014/te.po index 13ab9eb902..f2f5671fbf 100644 --- a/data/levels/halloween2014/te.po +++ b/data/levels/halloween2014/te.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Nanowarrior, 2022\n" "Language-Team: Telugu (http://app.transifex.com/arctic-games/supertux/language/te/)\n" diff --git a/data/levels/halloween2014/tr.po b/data/levels/halloween2014/tr.po index c366e26b83..393a254e94 100644 --- a/data/levels/halloween2014/tr.po +++ b/data/levels/halloween2014/tr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: mahmut özcan , 2015\n" "Language-Team: Turkish (http://app.transifex.com/arctic-games/supertux/language/tr/)\n" diff --git a/data/levels/halloween2014/tt.po b/data/levels/halloween2014/tt.po index d2ecb6c307..844443a382 100644 --- a/data/levels/halloween2014/tt.po +++ b/data/levels/halloween2014/tt.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Булат Ибраһим , 2016\n" "Language-Team: Tatar (http://app.transifex.com/arctic-games/supertux/language/tt/)\n" diff --git a/data/levels/halloween2014/uk.po b/data/levels/halloween2014/uk.po index 36d258054f..bc040c2cd6 100644 --- a/data/levels/halloween2014/uk.po +++ b/data/levels/halloween2014/uk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: Max Lyashuk , 2015\n" "Language-Team: Ukrainian (http://app.transifex.com/arctic-games/supertux/language/uk/)\n" diff --git a/data/levels/halloween2014/uz.po b/data/levels/halloween2014/uz.po index 94c6ad494b..cd32df4686 100644 --- a/data/levels/halloween2014/uz.po +++ b/data/levels/halloween2014/uz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: IAN RODRÍGUEZ Lorenzo, 2023\n" "Language-Team: Uzbek (http://app.transifex.com/arctic-games/supertux/language/uz/)\n" diff --git a/data/levels/halloween2014/zh_CN.po b/data/levels/halloween2014/zh_CN.po index b2cdb54198..9e040ff212 100644 --- a/data/levels/halloween2014/zh_CN.po +++ b/data/levels/halloween2014/zh_CN.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SuperTux\n" "Report-Msgid-Bugs-To: https://github.com/SuperTux/supertux/issues\n" -"POT-Creation-Date: 2024-03-03 03:26+0100\n" +"POT-Creation-Date: 2024-10-20 09:04+0000\n" "PO-Revision-Date: 2015-10-19 18:02+0000\n" "Last-Translator: CodingJellyfish , 2018\n" "Language-Team: Chinese (China) (http://app.transifex.com/arctic-games/supertux/language/zh_CN/)\n" From 5353ef880b74ae4c53b400ff2ded588e2feaeac4 Mon Sep 17 00:00:00 2001 From: Eauix <145238217+Eauix@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:46:05 -0300 Subject: [PATCH 12/21] Autotilesets for Tileset Variants (#3087) This is meant to be a complement for #3082. As the game will soon support multiple autotilesets per tile, this request is focused on adding new autotilesets for many tileset variants in the game that couldn't have autotilesets before due to them sharing the same tile IDs with other tilesets. ### New Autotilesets For Worldmaps: - Sharing tiles with Snow: - Snow Layer - Snow Cliff - Sharing tiles with Ice Cave: - Ice Cave Cliff - Sharing tiles with Ice Cave Ceiling: - Ice Holes - Sharing tiles with Forest: - Forest Cliff - Sharing tiles with Corrupted Forest: - Corrupted Forest Cliff - Corrupted Forest Transition - Sharing tiles with Forest Underground - Forest Underground Cliff - Sharing tiles with Corrupted Forest Underground - Corrupted Forest Underground Cliff - Autotiles for Vertical and Horizontal Water Waves ### New Autotilesets For Levels: - Sharing tiles with Snow: - Snow with Ice Floor - Snow Holes - Sharing tiles with Snow Underground: - Snow Underground Holes - Sharing tiles with Forest: - Forest with Earth Floor - Forest Holes - Sharing tiles with Forest Underground: - Forest Underground Holes - Sharing tiles with Corrupted Forest - Corrupted Forest with Earth Floor - Corrupted Forest Holes - Sharing tiles with Corrupted Forest Underground - Corrupted Forest Underground Holes - Autotiles for Vertical and Horizontal Rock Blocks - Autotiles for Ice Castle and Forest Castle - Autotiles for Vertical and Horizontal Chains, with attached and loose ends ### Tweaks and Extra Features: - Fixes the worldmap snow tileset being only eraseable from the corners - Added a black tile near the worldmap ice hole tileset in the tilegroup - Improvements to some autotile comments - Added a 2x2 rock block in the tilegroup for easier building - 29 new tiles needed for the snow with ice floor autotileset - 12 new tiles needed for the castle autotilesets - 8 brand new mini-chain tiles (with autotiles included) - Fixes the electrified water surface not being swimmable - 3 new tiles as vertical "sign rods" for decoration Todo List: - [x] Add all the new worldmap autotilesets - [x] Add the new level autotilesets --- data/images/autotiles.satc | 2343 +++++++++++++++++- data/images/autotiles_ice_world.satc | 870 ++++++- data/images/ice_world.strf | 2 +- data/images/tiles.strf | 126 +- data/images/tiles/castle/castle_special.png | Bin 0 -> 20672 bytes data/images/tiles/castle/small_chain.png | Bin 0 -> 3310 bytes data/images/tiles/signs/vertical-rods.png | Bin 0 -> 10336 bytes data/images/tiles/snow/ice-floor-special.png | Bin 0 -> 20204 bytes 8 files changed, 3259 insertions(+), 82 deletions(-) create mode 100644 data/images/tiles/castle/castle_special.png create mode 100644 data/images/tiles/castle/small_chain.png create mode 100644 data/images/tiles/signs/vertical-rods.png create mode 100644 data/images/tiles/snow/ice-floor-special.png diff --git a/data/images/autotiles.satc b/data/images/autotiles.satc index eb88baf059..dc7009ef6f 100644 --- a/data/images/autotiles.satc +++ b/data/images/autotiles.satc @@ -479,6 +479,7 @@ (mask "01011***") ) ) + (autotileset (name "block_horiz") (default 47) @@ -6109,7 +6110,7 @@ ) (autotileset - (name "jrock_a") + (name "jagged_rock") (default 7317) ;; CENTER @@ -6144,98 +6145,98 @@ (mask "***00010") ) - ;; B LEFT + ;; BOTTOM LEFT (autotile (id 7320) (solid #t) (mask "***01*0*") ) - ;; B CENTER + ;; BOTTOM CENTER (autotile (id 7321) (solid #t) (mask "***11*0*") ) - ;; B RIGHT + ;; BOTTOM RIGHT (autotile (id 7322) (solid #t) (mask "***10*0*") ) - ;; B THIN + ;; BOTTOM THIN (autotile (id 7323) (solid #t) (mask "***00*0*") ) - ;; CORNER TL + ;; CORNER TOP LEFT (autotile (id 7325) (solid #t) (mask "***11110") ) - ;; CORNER TR + ;; CORNER TOP RIGHT (autotile (id 7326) (solid #t) (mask "***11011") ) - ;; CORNER BL + ;; CORNER BOTTOM LEFT (autotile (id 7327) (solid #t) (mask "***10111") ) - ;; CORNER BR + ;; CORNER BOTTOM RIGHT (autotile (id 7328) (solid #t) (mask "***01111") ) - ;; CORNER THIN TL + ;; CORNER THIN TOP LEFT (autotile (id 7329) (solid #t) (mask "***01010") ) - ;; CORNER THIN TR + ;; CORNER THIN TOP RIGHT (autotile (id 7330) (solid #t) (mask "***10010") ) - ;; CORNER THIN TC + ;; CORNER THIN TOP CENTER (autotile (id 7331) (solid #t) (mask "***11010") ) - ;; CORNER THIN BL + ;; CORNER THIN BOTTOM LEFT (autotile (id 7332) (solid #t) (mask "***00011") ) - ;; CORNER THIN BR + ;; CORNER THIN BOTTOM RIGHT (autotile (id 7333) (solid #t) (mask "***00110") ) - ;; CORNER THIN BC + ;; CORNER THIN BOTTOM CENTER (autotile (id 7334) (solid #t) @@ -6256,8 +6257,6 @@ (mask "***10011") ) - ;; DECO TILES ----------- - ;; DECO LEFT (autotile (id 7312) @@ -6288,4 +6287,2314 @@ ) + (autotileset + (name "rock_block_horizontal") + (default 7378) + + (autotile + (id 7375) + (solid #t) + (mask "***01***") + ) + + (autotile + (id 7376) + (solid #t) + (mask "***11***") + ) + + (autotile + (id 7377) + (solid #t) + (mask "***10***") + ) + + (autotile + (id 7378) + (solid #t) + (mask "***00***") + ) + + ) + + (autotileset + (name "rock_block_vertical") + (default 7378) + + (autotile + (id 7382) + (solid #t) + (mask "*0****1*") + ) + + (autotile + (id 7386) + (solid #t) + (mask "*1****1*") + ) + + (autotile + (id 7390) + (solid #t) + (mask "*1****0*") + ) + + (autotile + (id 7378) + (solid #t) + (mask "*0****0*") + ) + + ) + + (autotileset + (name "ice_castle") + (default 4566) + + ;; CENTER + (autotile + (id 4566) + (alt-id + (id 4565) + (weight -1) + ) + (solid #t) + (mask "11111111") + (mask "*0*11*0*") + + (mask "0*0110*0") + (mask "11011110") + (mask "01111011") + + (mask "01011*0*") + (mask "*0*11010") + + + ) + + ;; LEFT + (autotile + (id 4564) + (alt-id + (id 4557) + (weight -1) + ) + (solid #t) + (mask "*1101*11") + (mask "*0*01*0*") + + (mask "**001**0") + + (mask "*0101*10") + (mask "*1001*01") + ) + + ;; RIGHT + (autotile + (id 4567) + (alt-id + (id 4558) + (weight -1) + ) + (solid #t) + (mask "11*1011*") + (mask "*0*10*0*") + + (mask "0**100**") + + (mask "10*1001*") + (mask "01*1010*") + ) + + ;; THIN + (autotile + (id 4572) + (solid #t) + (mask "*1*00*1*") + (mask "*0*00*0*") + ) + + ;; TOP LEFT + (autotile + (id 4553) + (solid #t) + (mask "*0*01*11") + (mask "01001*11") + + ) + + ;; TOP CENTER + (autotile + (id 4569) + (alt-id + (id 4555) + (weight -1) + ) + (alt-id + (id 4554) + (weight -1) + ) + (alt-id + (id 4568) + (weight -1) + ) + (solid #t) + (mask "*0*11111") + + (mask "01011111") + + ) + + ;; TOP RIGHT + (autotile + (id 4556) + (solid #t) + (mask "*0*1011*") + (mask "0101011*") + ) + + ;; TOP THIN + (autotile + (id 4561) + (solid #t) + (mask "*0*00*1*") + ) + + ;; BOTTOM LEFT + (autotile + (id 4575) + (solid #t) + (mask "*1101*0*") + (mask "*1101010") + ) + + ;; BOTTOM CENTER + (autotile + (id 4580) + (alt-id + (id 4577) + (weight -1) + ) + (alt-id + (id 4579) + (weight -1) + ) + (alt-id + (id 4576) + (weight -1) + ) + (solid #t) + (mask "11111*0*") + + (mask "11111010") + ) + + ;; BOTTOM RIGHT + (autotile + (id 4578) + (solid #t) + (mask "11*10*0*") + (mask "11*10010") + ) + + ;; BOTTOM THIN + (autotile + (id 4583) + (solid #t) + (mask "*1*00*0*") + ) + + ;; CORNER TOP LEFT + (autotile + (id 4592) + (alt-id + (id 4570) + (weight -1) + ) + (solid #t) + (mask "11111110") + (mask "01111*00") + + (mask "01111010") + (mask "01111001") + + ;;(mask "*1101110") + (mask "01111101") + ) + + ;; CORNER THIN TOP LEFT + (autotile + (id 7455) + (solid #t) + (mask "*1101110") + ) + + ;; CORNER TOP RIGHT + (autotile + (id 4593) + (alt-id + (id 4571) + (weight -1) + ) + (solid #t) + (mask "11111011") + (mask "1101100*") + + (mask "11011100") + (mask "11011010") + + ;;(mask "11*10011") + (mask "11011101") + ) + + ;; CORNER THIN TOP RIGHT + (autotile + (id 7456) + (solid #t) + (mask "11*10011") + ) + + ;; CORNER BOTTOM LEFT + (autotile + (id 4581) + (alt-id + (id 4559) + (weight -1) + ) + (solid #t) + (mask "11011111") + (mask "*0011011") + + (mask "00111011") + (mask "01011011") + + ;;(mask "11001*11") + (mask "10111011") + ) + + ;; CORNER THIN BOTTOM LEFT + (autotile + (id 7452) + (solid #t) + (mask "11001*11") + ) + + ;; CORNER BOTTOM RIGHT + (autotile + (id 4582) + (alt-id + (id 4560) + (weight -1) + ) + (solid #t) + (mask "01111111") + (mask "00*11110") + + (mask "10011110") + (mask "01011110") + + ;;(mask "0111011*") + (mask "10111110") + ) + + ;; CORNER THIN BOTTOM RIGHT + (autotile + (id 7453) + (solid #t) + (mask "0111011*") + ) + + ;; CORNER "8 COUNTER CLOCKWISE" + (autotile + (id 7451) + (solid #t) + (mask "11011011") + ) + + ;; CORNER "8 CLOCKWISE" + (autotile + (id 7454) + (solid #t) + (mask "01111110") + ) + + ) + + (autotileset + (name "chain_horizontal_attached") + (default 4663) + + (autotile + (id 4667) + (solid #t) + (mask "***01***") + ) + + (autotile + (id 4663) + (solid #t) + (mask "***11***") + (mask "***00***") + ) + + (autotile + (id 4668) + (solid #t) + (mask "***10***") + ) + + ) + + (autotileset + (name "chain_vertical_attached") + (default 4665) + + (autotile + (id 4666) + (solid #t) + (mask "*0****1*") + ) + + (autotile + (id 4665) + (solid #t) + (mask "*1****1*") + (mask "*0****0*") + ) + + (autotile + (id 4670) + (solid #t) + (mask "*1****0*") + ) + + ) + + (autotileset + (name "small_chain_horizontal") + (default 7469) + + (autotile + (id 7463) + (solid #t) + (mask "***01***") + ) + + (autotile + (id 7465) + (solid #t) + (mask "***11***") + ) + + (autotile + (id 7467) + (solid #t) + (mask "***10***") + ) + + (autotile + (id 7469) + (solid #t) + (mask "***00***") + ) + + ) + + (autotileset + (name "small_chain_vertical") + (default 7470) + + (autotile + (id 7464) + (solid #t) + (mask "*0****1*") + ) + + (autotile + (id 7466) + (solid #t) + (mask "*1****1*") + ) + + (autotile + (id 7468) + (solid #t) + (mask "*1****0*") + ) + + (autotile + (id 7470) + (solid #t) + (mask "*0****0*") + ) + + ) + + (autotileset + (name "forest_castle") + (default 4480) + + ;; CENTER + (autotile + (id 4480) + (alt-id + (id 4479) + (weight -1) + ) + (solid #t) + (mask "11111111") + (mask "*0*11*0*") + + (mask "0*0110*0") + (mask "11011110") + (mask "01111011") + + (mask "01011*0*") + (mask "*0*11010") + + + ) + + ;; LEFT + (autotile + (id 4478) + (alt-id + (id 4467) + (weight -1) + ) + (solid #t) + (mask "*1101*11") + (mask "*0*01*0*") + + (mask "**001**0") + + (mask "*0101*10") + (mask "*1001*01") + ) + + ;; RIGHT + (autotile + (id 4481) + (alt-id + (id 4468) + (weight -1) + ) + (solid #t) + (mask "11*1011*") + (mask "*0*10*0*") + + (mask "0**100**") + + (mask "10*1001*") + (mask "01*1010*") + ) + + ;; THIN + (autotile + (id 4486) + (solid #t) + (mask "*1*00*1*") + (mask "*0*00*0*") + ) + + ;; TOP LEFT + (autotile + (id 4463) + (solid #t) + (mask "*0*01*11") + (mask "01001*11") + + ) + + ;; TOP CENTER + (autotile + (id 4483) + (alt-id + (id 4465) + (weight -1) + ) + (alt-id + (id 4482) + (weight -1) + ) + (alt-id + (id 4464) + (weight -1) + ) + (solid #t) + (mask "*0*11111") + + (mask "01011111") + + ) + + ;; TOP RIGHT + (autotile + (id 4466) + (solid #t) + (mask "*0*1011*") + (mask "0101011*") + ) + + ;; TOP THIN + (autotile + (id 4471) + (solid #t) + (mask "*0*00*1*") + ) + + ;; BOTTOM LEFT + (autotile + (id 4493) + (solid #t) + (mask "*1101*0*") + (mask "*1101010") + ) + + ;; BOTTOM CENTER + (autotile + (id 4498) + (alt-id + (id 4495) + (weight -1) + ) + (alt-id + (id 4497) + (weight -1) + ) + (alt-id + (id 4494) + (weight -1) + ) + (solid #t) + (mask "11111*0*") + + (mask "11111010") + ) + + ;; BOTTOM RIGHT + (autotile + (id 4496) + (solid #t) + (mask "11*10*0*") + (mask "11*10010") + ) + + ;; BOTTOM THIN + (autotile + (id 4501) + (solid #t) + (mask "*1*00*0*") + ) + + ;; CORNER TOP LEFT + (autotile + (id 4514) + (alt-id + (id 4484) + (weight -1) + ) + (solid #t) + (mask "11111110") + (mask "01111*00") + + (mask "01111010") + (mask "01111001") + + ;;(mask "*1101110") + (mask "01111101") + ) + + ;; CORNER THIN TOP LEFT + (autotile + (id 7461) + (solid #t) + (mask "*1101110") + ) + + ;; CORNER TOP RIGHT + (autotile + (id 4515) + (alt-id + (id 4485) + (weight -1) + ) + (solid #t) + (mask "11111011") + (mask "1101100*") + + (mask "11011100") + (mask "11011010") + + ;;(mask "11*10011") + (mask "11011101") + ) + + ;; CORNER THIN TOP RIGHT + (autotile + (id 7462) + (solid #t) + (mask "11*10011") + ) + + ;; CORNER BOTTOM LEFT + (autotile + (id 4499) + (alt-id + (id 4469) + (weight -1) + ) + (solid #t) + (mask "11011111") + (mask "*0011011") + + (mask "00111011") + (mask "01011011") + + ;;(mask "11001*11") + (mask "10111011") + ) + + ;; CORNER THIN BOTTOM LEFT + (autotile + (id 7458) + (solid #t) + (mask "11001*11") + ) + + ;; CORNER BOTTOM RIGHT + (autotile + (id 4500) + (alt-id + (id 4470) + (weight -1) + ) + (solid #t) + (mask "01111111") + (mask "00*11110") + + (mask "10011110") + (mask "01011110") + + ;;(mask "0111011*") + (mask "10111110") + ) + + ;; CORNER THIN BOTTOM RIGHT + (autotile + (id 7459) + (solid #t) + (mask "0111011*") + ) + + ;; CORNER "8 COUNTER CLOCKWISE" + (autotile + (id 7457) + (solid #t) + (mask "11011011") + ) + + ;; CORNER "8 CLOCKWISE" + (autotile + (id 7460) + (solid #t) + (mask "01111110") + ) + + ) + + ;; SUPPORT MULTIPLE AUTOTILESETS PER TILE - START + + (autotileset + (name "snow_ice_floor") + (default 11) + + ;; CENTER + (autotile + (id 11) + (alt-id + (id 19) + (weight 0.002) + ) + (alt-id + (id 1539) + (weight 0.002) + ) + (alt-id + (id 5368) + (weight 0.2) + ) + (alt-id + (id 5369) + (weight 0.2) + ) + (solid #t) + (mask "***11***") + ) + + ;; LEFT + (autotile + (id 10) + (solid #t) + (mask "0**010**") + (mask "0**0110*") + (mask "10*010**") + (mask "10*0110*") + ) + + ;; RIGHT + (autotile + (id 12) + (solid #t) + (mask "**010**0") + (mask "**010*01") + (mask "*0110**0") + (mask "*0110*01") + ) + + ;; THIN + (autotile + (id 206) + (solid #t) + (mask "01000*0*") + (mask "*0*00010") + (mask "01000010") + (mask "*0*00*0*") + + ;; Placeholder masks + ;;(mask "*0*00110") + ;;(mask "*0*00011") + ;;(mask "*1000110") + ;;(mask "01*00011") + ) + + ;; CORNER THIN BOTTOM CENTER + (autotile + (id 5244) + (solid #t) + (mask "0*000111") + (mask "*0*00111") + ) + + ;; CORNER THIN "C" + (autotile + (id 7425) + (solid #t) + (mask "01100011") + ) + + ;; CORNER THIN "D" + (autotile + (id 7424) + (solid #t) + (mask "11000110") + ) + + ;; CORNER "I" + (autotile + (id 7432) + (solid #t) + (mask "11100111") + ) + + ;; CORNER "S" + (autotile + (id 7426) + (solid #t) + (mask "01100110") + ) + + ;; CORNER "Z" + (autotile + (id 7427) + (solid #t) + (mask "11000011") + ) + + ;; CORNER "J" + (autotile + (id 7428) + (solid #t) + (mask "11100110") + ) + + ;; CORNER "t" + (autotile + (id 7429) + (solid #t) + (mask "11100011") + ) + + ;; CORNER "f" + (autotile + (id 7430) + (solid #t) + (mask "01100111") + ) + + ;; CORNER "1" + (autotile + (id 7431) + (solid #t) + (mask "11000111") + ) + + ;; CORNER THIN BOTTOM RIGHT + (autotile + (id 7433) + (solid #t) + (mask "01000110") + (mask "*0*00110") + ) + + ;; CORNER THIN BOTTOM LEFT + (autotile + (id 7434) + (solid #t) + (mask "01000011") + (mask "*0*00011") + ) + + ;; CORNER BOTTOM RIGHT + (autotile + (id 5245) + (solid #t) + (mask "0**0111*") + (mask "10*0111*") + + ) + + ;; CORNER BOTTOM LEFT + (autotile + (id 5247) + (solid #t) + (mask "**010*11") + (mask "*0110*11") + ) + + ;; CORNER "C" + (autotile + (id 7422) + (solid #t) + (mask "*1110*11") + ) + + ;; CORNER "D" + (autotile + (id 7423) + (solid #t) + (mask "11*0111*") + ) + + ;; CORNER TOP LEFT + (autotile + (id 30) + (solid #t) + (mask "*1110**0") + (mask "*1110*01") + ) + + ;; CORNER TOP RIGHT + (autotile + (id 31) + (solid #t) + (mask "11*010**") + (mask "11*0110*") + ) + + ;; CORNER THIN TOP CENTER + (autotile + (id 3055) + (solid #t) + (mask "11100*0*") + (mask "11100010") + ) + + ;; CORNER THIN TOP RIGHT + (autotile + (id 3057) + (solid #t) + (mask "11000010") + (mask "11000*0*") + ) + + ;; CORNER THIN TOP LEFT + (autotile + (id 3053) + (solid #t) + (mask "01100010") + (mask "01100*0*") + + ) + + ;; DECO TOP LEFT + (autotile + (id 5239) + (solid #f) + (mask "*0***011") + ) + + ;; DECO TOP CENTER + (autotile + (id 5240) + (solid #f) + (mask "*0***111") + ) + + ;; DECO TOP RIGHT + (autotile + (id 5241) + (solid #f) + (mask "*0***110") + ) + + ;; DECO TOP THIN + (autotile + (id 5238) + (solid #f) + (mask "*0***010") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 16) + (solid #f) + (mask "011***0*") + ) + + ;; DECO BOTTOM CENTER + (autotile + (id 17) + (alt-id + (id 3991) + (weight 0.2) + ) + (solid #f) + (mask "111***0*") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 18) + (solid #f) + (mask "110***0*") + ) + + ;; DECO BOTTOM THIN + (autotile + (id 3059) + (solid #f) + (mask "010***0*") + ) + + ;; DECO LEFT-LEFT + (autotile + (id 7435) + (solid #f) + (mask "011**011") + ) + + ;; DECO LEFT-CENTER + (autotile + (id 7436) + (solid #f) + (mask "111**011") + ) + + ;; DECO LEFT-RIGHT + (autotile + (id 7437) + (solid #f) + (mask "110**011") + ) + + ;; DECO LEFT-THIN + (autotile + (id 7438) + (solid #f) + (mask "010**011") + ) + + ;; DECO CENTER-LEFT + (autotile + (id 7439) + (solid #f) + (mask "011**111") + ) + + ;; DECO CENTER-CENTER + (autotile + (id 7440) + (solid #f) + (mask "111**111") + ) + + ;; DECO CENTER-RIGHT + (autotile + (id 7441) + (solid #f) + (mask "110**111") + ) + + ;; DECO CENTER-THIN + (autotile + (id 7442) + (solid #f) + (mask "010**111") + ) + + ;; DECO RIGHT-LEFT + (autotile + (id 7443) + (solid #f) + (mask "011**110") + ) + + ;; DECO RIGHT-CENTER + (autotile + (id 7444) + (solid #f) + (mask "111**110") + ) + + ;; DECO RIGHT-RIGHT + (autotile + (id 7445) + (solid #f) + (mask "110**110") + ) + + ;; DECO RIGHT-THIN + (autotile + (id 7446) + (solid #f) + (mask "010**110") + ) + + ;; DECO THIN-LEFT + (autotile + (id 7447) + (solid #f) + (mask "011**010") + ) + + ;; DECO THIN-CENTER + (autotile + (id 7448) + (solid #f) + (mask "111**010") + ) + + ;; DECO THIN-RIGHT + (autotile + (id 7449) + (solid #f) + (mask "110**010") + ) + + ;; DECO THIN-THIN + (autotile + (id 7450) + (solid #f) + (mask "010**010") + ) + + ) + + (autotileset + (name "snow_holes") + (default 11) + + ;; CENTER + (autotile + (id 11) + (alt-id + (id 19) + (weight 0.002) + ) + (alt-id + (id 1539) + (weight 0.002) + ) + (alt-id + (id 5368) + (weight 0.2) + ) + (alt-id + (id 5369) + (weight 0.2) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + + ;; DECO TOP LEFT + (autotile + (id 2121) + (solid #f) + (mask "00000001") + ) + + ;; DECO TOP + (autotile + (id 2122) + (solid #f) + (mask "00000*1*") + ) + + ;; DECO TOP RIGHT + (autotile + (id 2123) + (solid #f) + (mask "00000100") + ) + + ;; DECO LEFT + (autotile + (id 2126) + (solid #f) + (mask "00*0100*") + ) + + ;; DECO RIGHT + (autotile + (id 2128) + (solid #f) + (mask "*0010*00") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 2131) + (solid #f) + (mask "00100000") + ) + + ;; DECO BOTTOM + (autotile + (id 2132) + (solid #f) + (mask "*1*00000") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 2133) + (solid #f) + (mask "10000000") + ) + + ;; DECO CORNER BOTTOM RIGHT + (autotile + (id 2130) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + + ;; DECO CORNER BOTTOM LEFT + (autotile + (id 2129) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + + ;; DECO CORNER TOP RIGHT + (autotile + (id 2125) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + + ;; DECO CORNER TOP LEFT + (autotile + (id 2124) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "snow_underground_holes") + (default 2391) + + ;; CENTER + (autotile + (id 2391) + (alt-id + (id 2396) + (weight 0.1) + ) + (alt-id + (id 2397) + (weight 0.1) + ) + (alt-id + (id 2398) + (weight 0.1) + ) + (alt-id + (id 2399) + (weight 0.1) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + + ;; DECO TOP LEFT + (autotile + (id 7039) + (solid #f) + (mask "00000001") + ) + + ;; DECO TOP + (autotile + (id 7033) + (solid #f) + (mask "00000*1*") + ) + + ;; DECO TOP RIGHT + (autotile + (id 7040) + (solid #f) + (mask "00000100") + ) + + ;; DECO LEFT + (autotile + (id 7027) + (solid #f) + (mask "00*0100*") + ) + + ;; DECO RIGHT + (autotile + (id 7025) + (solid #f) + (mask "*0010*00") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 7046) + (solid #f) + (mask "00100000") + ) + + ;; DECO BOTTOM + (autotile + (id 7019) + (solid #f) + (mask "*1*00000") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 7047) + (solid #f) + (mask "10000000") + ) + + ;; DECO CORNER BOTTOM RIGHT + (autotile + (id 7034) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + + ;; DECO CORNER BOTTOM LEFT + (autotile + (id 7032) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + + ;; DECO CORNER TOP RIGHT + (autotile + (id 7020) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + + ;; DECO CORNER TOP LEFT + (autotile + (id 7018) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "forest_earth_floor") + (default 1009) + + ;; CENTER + (autotile + (id 1009) + (alt-id + (id 1010) + (weight 0.1) + ) + (alt-id + (id 1013) + (weight 0.3) + ) + (alt-id + (id 1014) + (weight 0.3) + ) + (solid #t) + (mask "***11111") + ) + + ;; LEFT + (autotile + (id 1008) + (alt-id + (id 1012) + (weight 0.5) + ) + (solid #t) + (mask "***01011") + ) + + ;; RIGHT + (autotile + (id 1011) + (alt-id + (id 1015) + (weight 0.5) + ) + (solid #t) + (mask "***10110") + ) + + ;; THIN + (autotile + (id 1738) + (solid #t) + (mask "***00010") + ) + + ;; BOTTOM LEFT + (autotile + (id 1016) + (solid #t) + (mask "***01*0*") + ) + + ;; BOTTOM CENTER + (autotile + (id 1017) + (alt-id + (id 1018) + (weight 0.5) + ) + (solid #t) + (mask "***11*0*") + ) + + ;; BOTTOM RIGHT + (autotile + (id 1019) + (solid #t) + (mask "***10*0*") + ) + + ;; BOTTOM THIN + (autotile + (id 3472) + (solid #t) + (mask "***00*0*") + ) + + ;; CORNER TOP LEFT + (autotile + (id 4317) + (solid #t) + (mask "***11110") + ) + + ;; CORNER TOP RIGHT + (autotile + (id 4318) + (solid #t) + (mask "***11011") + ) + + ;; CORNER BOTTOM LEFT + (autotile + (id 1820) + (solid #t) + (mask "***10111") + ) + + ;; CORNER BOTTOM RIGHT + (autotile + (id 1817) + (solid #t) + (mask "***01111") + ) + + ;; CORNER THIN TOP + (autotile + (id 4312) + (solid #t) + (mask "***11010") + ) + + ;; CORNER THIN BOTTOM + (autotile + (id 1818) + (solid #t) + (mask "***00111") + ) + + ;; CORNER THIN TOP LEFT + (autotile + (id 4302) + (solid #t) + (mask "***01010") + ) + + ;; CORNER THIN TOP RIGHT + (autotile + (id 4303) + (solid #t) + (mask "***10010") + ) + + ;; CORNER THIN BOTTOM LEFT + (autotile + (id 5599) + (solid #t) + (mask "***00011") + ) + + ;; CORNER THIN BOTTOM RIGHT + (autotile + (id 5598) + (solid #t) + (mask "***00110") + ) + + ;; CORNER "S" + (autotile + (id 5588) + (solid #t) + (mask "***01110") + ) + + ;; CORNER "Z" + (autotile + (id 5589) + (solid #t) + (mask "***10011") + ) + + ;; DECO LEFT + (autotile + (id 1723) + (solid #f) + (mask "*****011") + ) + + ;; DECO CENTER + (autotile + (id 1724) + (alt-id + (id 1725) + (weight 0.5) + ) + (solid #f) + (mask "*****111") + ) + + ;; DECO RIGHT + (autotile + (id 1726) + (solid #f) + (mask "*****110") + ) + + ;; DECO THIN + (autotile + (id 1819) + (solid #f) + (mask "*****010") + ) + + ) + + (autotileset + (name "corrupted_forest_earth_floor") + (default 1432) + + ;; CENTER + (autotile + (id 1432) + (alt-id + (id 1433) + (weight 0.1) + ) + (alt-id + (id 1436) + (weight 0.3) + ) + (alt-id + (id 1437) + (weight 0.3) + ) + (solid #t) + (mask "***11111") + ) + + ;; LEFT + (autotile + (id 1431) + (alt-id + (id 1435) + (weight 0.5) + ) + (solid #t) + (mask "***01011") + ) + + ;; RIGHT + (autotile + (id 1434) + (alt-id + (id 1438) + (weight 0.5) + ) + (solid #t) + (mask "***10110") + ) + + ;; THIN + (autotile + (id 6544) + (solid #t) + (mask "***00010") + ) + + ;; BOTTOM LEFT + (autotile + (id 1439) + (solid #t) + (mask "***01*0*") + ) + + ;; BOTTOM CENTER + (autotile + (id 1440) + (alt-id + (id 1441) + (weight 0.5) + ) + (solid #t) + (mask "***11*0*") + ) + + ;; BOTTOM RIGHT + (autotile + (id 1442) + (solid #t) + (mask "***10*0*") + ) + + ;; BOTTOM THIN + (autotile + (id 6547) + (solid #t) + (mask "***00*0*") + ) + + ;; CORNER TOP LEFT + (autotile + (id 3414) + (solid #t) + (mask "***11110") + ) + + ;; CORNER TOP RIGHT + (autotile + (id 3415) + (solid #t) + (mask "***11011") + ) + + ;; CORNER BOTTOM LEFT + (autotile + (id 6202) + (solid #t) + (mask "***10111") + ) + + ;; CORNER BOTTOM RIGHT + (autotile + (id 6199) + (solid #t) + (mask "***01111") + ) + + ;; CORNER THIN TOP + (autotile + (id 6545) + (solid #t) + (mask "***11010") + ) + + ;; CORNER THIN BOTTOM + (autotile + (id 6200) + (solid #t) + (mask "***00111") + ) + + ;; CORNER THIN TOP LEFT + (autotile + (id 6558) + (solid #t) + (mask "***01010") + ) + + ;; CORNER THIN TOP RIGHT + (autotile + (id 6559) + (solid #t) + (mask "***10010") + ) + + ;; CORNER THIN BOTTOM LEFT + (autotile + (id 6592) + (solid #t) + (mask "***00011") + ) + + ;; CORNER THIN BOTTOM RIGHT + (autotile + (id 6591) + (solid #t) + (mask "***00110") + ) + + ;; CORNER "S" + (autotile + (id 6573) + (solid #t) + (mask "***01110") + ) + + ;; CORNER "Z" + (autotile + (id 6574) + (solid #t) + (mask "***10011") + ) + + ;; DECO LEFT + (autotile + (id 6193) + (solid #f) + (mask "*****011") + ) + + ;; DECO CENTER + (autotile + (id 6194) + (alt-id + (id 6195) + (weight 0.5) + ) + (solid #f) + (mask "*****111") + ) + + ;; DECO RIGHT + (autotile + (id 6196) + (solid #f) + (mask "*****110") + ) + + ;; DECO THIN + (autotile + (id 6201) + (solid #f) + (mask "*****010") + ) + + ) + + (autotileset + (name "forest_holes") + (default 1009) + + ;; CENTER + (autotile + (id 1009) + (alt-id + (id 1010) + (weight 0.1) + ) + (alt-id + (id 1013) + (weight 0.3) + ) + (alt-id + (id 1014) + (weight 0.3) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + + ;; DECO TOP LEFT + (autotile + (id 5627) + (solid #f) + (mask "00000001") + ) + + ;; DECO TOP + (autotile + (id 5621) + (solid #f) + (mask "00000*1*") + ) + + ;; DECO TOP RIGHT + (autotile + (id 5628) + (solid #f) + (mask "00000100") + ) + + ;; DECO LEFT + (autotile + (id 5615) + (solid #f) + (mask "00*0100*") + ) + + ;; DECO RIGHT + (autotile + (id 5613) + (solid #f) + (mask "*0010*00") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 5634) + (solid #f) + (mask "00100000") + ) + + ;; DECO BOTTOM + (autotile + (id 5607) + (solid #f) + (mask "*1*00000") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 5635) + (solid #f) + (mask "10000000") + ) + + ;; DECO CORNER BOTTOM RIGHT + (autotile + (id 5622) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + + ;; DECO CORNER BOTTOM LEFT + (autotile + (id 5620) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + + ;; DECO CORNER TOP RIGHT + (autotile + (id 5608) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + + ;; DECO CORNER TOP LEFT + (autotile + (id 5606) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "underground_forest_holes") + (default 1869) + + ;; CENTER + (autotile + (id 1869) + (alt-id + (id 1870) + (weight 0.1) + ) + (alt-id + (id 1873) + (weight 0.3) + ) + (alt-id + (id 1874) + (weight 0.3) + ) + (alt-id + (id 7050) + (weight 0.1) + ) + (alt-id + (id 7041) + (weight 0.1) + ) + (alt-id + (id 7167) + (weight 0.1) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + + ;; DECO TOP LEFT + (autotile + (id 7093) + (solid #f) + (mask "00000001") + ) + + ;; DECO TOP + (autotile + (id 7087) + (solid #f) + (mask "00000*1*") + ) + + ;; DECO TOP RIGHT + (autotile + (id 7094) + (solid #f) + (mask "00000100") + ) + + ;; DECO LEFT + (autotile + (id 7081) + (solid #f) + (mask "00*0100*") + ) + + ;; DECO RIGHT + (autotile + (id 7079) + (solid #f) + (mask "*0010*00") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 7100) + (solid #f) + (mask "00100000") + ) + + ;; DECO BOTTOM + (autotile + (id 7073) + (solid #f) + (mask "*1*00000") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 7101) + (solid #f) + (mask "10000000") + ) + + ;; DECO CORNER BOTTOM RIGHT + (autotile + (id 7088) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + + ;; DECO CORNER BOTTOM LEFT + (autotile + (id 7086) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + + ;; DECO CORNER TOP RIGHT + (autotile + (id 7074) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + + ;; DECO CORNER TOP LEFT + (autotile + (id 7072) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "corrupted_forest_holes") + (default 1432) + + ;; CENTER + (autotile + (id 1432) + (alt-id + (id 1433) + (weight 0.1) + ) + (alt-id + (id 1436) + (weight 0.3) + ) + (alt-id + (id 1437) + (weight 0.3) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + + ;; DECO TOP LEFT + (autotile + (id 6332) + (solid #f) + (mask "00000001") + ) + + ;; DECO TOP + (autotile + (id 6326) + (solid #f) + (mask "00000*1*") + ) + + ;; DECO TOP RIGHT + (autotile + (id 6333) + (solid #f) + (mask "00000100") + ) + + ;; DECO LEFT + (autotile + (id 6320) + (solid #f) + (mask "00*0100*") + ) + + ;; DECO RIGHT + (autotile + (id 6318) + (solid #f) + (mask "*0010*00") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 6339) + (solid #f) + (mask "00100000") + ) + + ;; DECO BOTTOM + (autotile + (id 6312) + (solid #f) + (mask "*1*00000") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 6340) + (solid #f) + (mask "10000000") + ) + + ;; DECO CORNER BOTTOM RIGHT + (autotile + (id 6327) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + + ;; DECO CORNER BOTTOM LEFT + (autotile + (id 6325) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + + ;; DECO CORNER TOP RIGHT + (autotile + (id 6313) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + + ;; DECO CORNER TOP LEFT + (autotile + (id 6311) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "underground_corrupted_holes") + (default 6837) + + ;; CENTER + (autotile + (id 6837) + (alt-id + (id 6838) + (weight 0.1) + ) + (alt-id + (id 6851) + (weight 0.3) + ) + (alt-id + (id 6852) + (weight 0.3) + ) + (alt-id + (id 6952) + (weight 0.1) + ) + (alt-id + (id 6955) + (weight 0.1) + ) + (alt-id + (id 6958) + (weight 0.1) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + + ;; DECO TOP LEFT + (autotile + (id 6790) + (solid #f) + (mask "00000001") + ) + + ;; DECO TOP + (autotile + (id 6784) + (solid #f) + (mask "00000*1*") + ) + + ;; DECO TOP RIGHT + (autotile + (id 6791) + (solid #f) + (mask "00000100") + ) + + ;; DECO LEFT + (autotile + (id 6778) + (solid #f) + (mask "00*0100*") + ) + + ;; DECO RIGHT + (autotile + (id 6776) + (solid #f) + (mask "*0010*00") + ) + + ;; DECO BOTTOM LEFT + (autotile + (id 6797) + (solid #f) + (mask "00100000") + ) + + ;; DECO BOTTOM + (autotile + (id 6770) + (solid #f) + (mask "*1*00000") + ) + + ;; DECO BOTTOM RIGHT + (autotile + (id 6798) + (solid #f) + (mask "10000000") + ) + + ;; DECO CORNER BOTTOM RIGHT + (autotile + (id 6785) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + + ;; DECO CORNER BOTTOM LEFT + (autotile + (id 6783) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + + ;; DECO CORNER TOP RIGHT + (autotile + (id 6771) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + + ;; DECO CORNER TOP LEFT + (autotile + (id 6769) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "chain_horizontal_loose") + (default 4663) + + (autotile + (id 4662) + (solid #t) + (mask "***01***") + ) + + (autotile + (id 4663) + (solid #t) + (mask "***11***") + (mask "***00***") + ) + + (autotile + (id 4664) + (solid #t) + (mask "***10***") + ) + + ) + + (autotileset + (name "chain_vertical_loose") + (default 4665) + + (autotile + (id 4661) + (solid #t) + (mask "*0****1*") + ) + + (autotile + (id 4665) + (solid #t) + (mask "*1****1*") + (mask "*0****0*") + ) + + (autotile + (id 4669) + (solid #t) + (mask "*1****0*") + ) + + ) + + ;; SUPPORT MULTIPLE AUTOTILESETS PER TILE - END + ) diff --git a/data/images/autotiles_ice_world.satc b/data/images/autotiles_ice_world.satc index 6d03488863..1c6bf3ebe2 100644 --- a/data/images/autotiles_ice_world.satc +++ b/data/images/autotiles_ice_world.satc @@ -1,6 +1,7 @@ ;; See autotiles.satc for instructions (supertux-autotiles + (autotileset (name "invisible_paths") (default 45) @@ -337,89 +338,87 @@ (mask "*0*00*0*") ) ) + (autotileset (name "snow") (default 105) (autotile - (id 105) - (solid #t) - (mask "********") - ) + (id 109) + (solid #f) + (mask "10000000") + ) (autotile - (id 105) + (id 113) (solid #f) - (mask "*1****1*") - (mask "***11***") - ) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 112) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 111) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 110) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) (autotile (id 101) (solid #f) (mask "00000001") - ) + ) (autotile (id 102) (solid #f) (mask "00000*1*") - ) + ) (autotile (id 103) (solid #f) (mask "00000100") - ) + ) (autotile (id 104) (solid #f) (mask "00*0100*") - ) + ) + (autotile + (id 105) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) (autotile (id 106) (solid #f) (mask "*0010*00") - ) + ) (autotile (id 107) (solid #f) (mask "00100000") - ) + ) (autotile (id 108) (solid #f) (mask "*1*00000") ) - (autotile - (id 109) - (solid #f) - (mask "10000000") - ) - (autotile - (id 110) - (solid #f) - (mask "*1*10*00") - (mask "*0110*00") - (mask "*1*00100") - ) - (autotile - (id 111) - (solid #f) - (mask "*1*0100*") - (mask "10*0100*") - (mask "*1*00001") - ) - (autotile - (id 112) - (solid #f) - (mask "*0010*1*") - (mask "*0010*01") - (mask "10000*1*") - ) - (autotile - (id 113) - (solid #f) - (mask "00*01*1*") - (mask "00100*1*") - (mask "00*0110*") - ) ) + (autotileset (name "crystal") (default 238) @@ -590,6 +589,7 @@ (mask "*1*00000") ) ) + (autotileset (name "ice_cave_ceiling") (default 689) @@ -669,6 +669,7 @@ (mask "00000100") ) ) + (autotileset (name "trees") (default 140) @@ -1617,4 +1618,779 @@ (mask "*1*00001") ) ) + + (autotileset + (name "snow_layer") + (default 105) + (autotile + (id 252) + (solid #f) + (mask "10000000") + ) + (autotile + (id 256) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 255) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 254) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 253) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + (autotile + (id 249) + (solid #f) + (mask "00000001") + ) + (autotile + (id 125) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 250) + (solid #f) + (mask "00000100") + ) + (autotile + (id 128) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 105) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 134) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 251) + (solid #f) + (mask "00100000") + ) + (autotile + (id 131) + (solid #f) + (mask "*1*00000") + ) + ) + + (autotileset + (name "ice_holes") + (default 689) + (autotile + (id 222) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 689) + (alt-id + (id 223) + (weight 0.02) + ) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 224) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 225) + (solid #f) + (mask "00100000") + ) + (autotile + (id 226) + (solid #f) + (mask "*1*00000") + ) + (autotile + (id 227) + (solid #f) + (mask "10000000") + ) + (autotile + (id 232) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 231) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 229) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 228) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + (autotile + (id 219) + (solid #f) + (mask "00000001") + ) + (autotile + (id 220) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 221) + (solid #f) + (mask "00000100") + ) + ) + + (autotileset + (name "snow_cliff") + (default 105) + (autotile + (id 449) + (solid #f) + (mask "10000000") + ) + (autotile + (id 113) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 112) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 456) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 457) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + (autotile + (id 101) + (solid #f) + (mask "00000001") + ) + (autotile + (id 102) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 103) + (solid #f) + (mask "00000100") + ) + (autotile + (id 104) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 105) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 106) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 447) + (solid #f) + (mask "00100000") + ) + (autotile + (id 448) + (solid #f) + (mask "*1*00000") + ) + ) + + (autotileset + (name "ice_cave_cliff") + (default 652) + (autotile + (id 663) + (solid #f) + (mask "10000000") + ) + (autotile + (id 657) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 658) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 670) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 671) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + (autotile + (id 648) + (solid #f) + (mask "00000001") + ) + (autotile + (id 649) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 650) + (solid #f) + (mask "00000100") + ) + (autotile + (id 651) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 652) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 653) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 661) + (solid #f) + (mask "00100000") + ) + (autotile + (id 662) + (solid #f) + (mask "*1*00000") + ) + ) + + (autotileset + (name "forest_cliff") + (default 261) + (autotile + (id 257) + (solid #f) + (mask "00000001") + ) + (autotile + (id 258) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 259) + (solid #f) + (mask "00000100") + ) + (autotile + (id 260) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 261) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 262) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 270) + (solid #f) + (mask "00100000") + ) + (autotile + (id 271) + (solid #f) + (mask "*1*00000") + ) + (autotile + (id 272) + (solid #f) + (mask "10000000") + ) + (autotile + (id 266) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 267) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 285) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 286) + (solid #f) + (mask "*1*10*00") + (mask "*1*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "corrupted_forest_cliff") + (default 304) + (autotile + (id 304) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 305) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 313) + (solid #f) + (mask "00100000") + ) + (autotile + (id 314) + (solid #f) + (mask "*1*00000") + ) + (autotile + (id 315) + (solid #f) + (mask "10000000") + ) + (autotile + (id 309) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 310) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 322) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 323) + (solid #f) + (mask "*1*10*00") + (mask "01*00100") + (mask "*0110*00") + ) + (autotile + (id 300) + (solid #f) + (mask "00000001") + ) + (autotile + (id 301) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 302) + (solid #f) + (mask "00000100") + ) + (autotile + (id 303) + (solid #f) + (mask "00*0100*") + ) + ) + + (autotileset + (name "corrupted_forest_transition") + (default 304) + (autotile + (id 304) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 562) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 569) + (solid #f) + (mask "00100000") + ) + (autotile + (id 560) + (solid #f) + (mask "*1*00000") + ) + (autotile + (id 570) + (solid #f) + (mask "10000000") + ) + (autotile + (id 566) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 564) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 561) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 559) + (solid #f) + (mask "*1*10*00") + (mask "01*00100") + (mask "*0110*00") + ) + (autotile + (id 567) + (solid #f) + (mask "00000001") + ) + (autotile + (id 565) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 568) + (solid #f) + (mask "00000100") + ) + (autotile + (id 563) + (solid #f) + (mask "00*0100*") + ) + ) + + (autotileset + (name "water_waves_horizontal") + (default 5) + (autotile + (id 5) + (solid #t) + (mask "***00***") + ) + (autotile + (id 2) + (solid #t) + (mask "***01***") + ) + (autotile + (id 3) + (solid #t) + (mask "***11***") + ) + (autotile + (id 4) + (solid #t) + (mask "***10***") + ) + ) + + (autotileset + (name "water_waves_vertical") + (default 5) + (autotile + (id 5) + (solid #t) + (mask "*0****0*") + ) + (autotile + (id 6) + (solid #t) + (mask "*0****1*") + ) + (autotile + (id 7) + (solid #t) + (mask "*1****1*") + ) + (autotile + (id 8) + (solid #t) + (mask "*1****0*") + ) + ) + + (autotileset + (name "underground_forest_cliff") + (default 583) + (autotile + (id 579) + (solid #f) + (mask "00000001") + ) + (autotile + (id 580) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 581) + (solid #f) + (mask "00000100") + ) + (autotile + (id 582) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 583) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 584) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 592) + (solid #f) + (mask "00100000") + ) + (autotile + (id 593) + (solid #f) + (mask "*1*00000") + ) + (autotile + (id 594) + (solid #f) + (mask "10000000") + ) + (autotile + (id 588) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 589) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + (autotile + (id 610) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 611) + (solid #f) + (mask "*1*10*00") + (mask "01*00100") + (mask "*0110*00") + ) + ) + + (autotileset + (name "underground_corrupted_forest_cliff") + (default 729) + (autotile + (id 747) + (solid #f) + (mask "10*0100*") + (mask "*1*0100*") + (mask "*1*00001") + ) + (autotile + (id 748) + (solid #f) + (mask "*1*10*00") + (mask "01*00100") + (mask "*0110*00") + ) + (autotile + (id 725) + (solid #f) + (mask "00000001") + ) + (autotile + (id 726) + (solid #f) + (mask "00000*1*") + ) + (autotile + (id 727) + (solid #f) + (mask "00000100") + ) + (autotile + (id 728) + (solid #f) + (mask "00*0100*") + ) + (autotile + (id 729) + (solid #t) + (mask "********") + (mask "*1****1*") + (mask "***11***") + ) + (autotile + (id 730) + (solid #f) + (mask "*0010*00") + ) + (autotile + (id 738) + (solid #f) + (mask "00100000") + ) + (autotile + (id 739) + (solid #f) + (mask "*1*00000") + ) + (autotile + (id 740) + (solid #f) + (mask "10000000") + ) + (autotile + (id 734) + (solid #f) + (mask "00*0110*") + (mask "00100*1*") + (mask "00*01*1*") + ) + (autotile + (id 735) + (solid #f) + (mask "10000*1*") + (mask "*0010*1*") + (mask "*0010*01") + ) + ) + ) diff --git a/data/images/ice_world.strf b/data/images/ice_world.strf index 508ff8d188..b6b4e75a9f 100644 --- a/data/images/ice_world.strf +++ b/data/images/ice_world.strf @@ -190,7 +190,7 @@ 215 216 218 0 219 220 221 0 - 222 223 224 0 + 222 689 224 223 225 226 227 0 228 229 230 0 231 232 233 0 diff --git a/data/images/tiles.strf b/data/images/tiles.strf index 7231827441..b0f14067bc 100644 --- a/data/images/tiles.strf +++ b/data/images/tiles.strf @@ -19,7 +19,7 @@ (source "autotiles.satc") ) - ;; next-id: 7422 + ;; next-id: 7474 ;; free/skipped ids (please use before any other): 101 ;; 2080-2084 are empty tiles, 4619-4660, 4719-4722, 5037-5092, 5205, 5268-5283, 5433-5527, 6962-6977, 7002 7005 7007 7008 7173 ;; No group ids are currently skipped! Delete this line if any are and replace it with said ids... @@ -121,6 +121,8 @@ 3157 3158 5368 5369 1834 5368 5369 11 + ;; Snow Special + 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 207 5532 @@ -133,6 +135,17 @@ 4029 4030 4031 4032 4033 4034 4035 0 5528 5529 0 0 + + ;; Ice Floor special + + 7422 7423 7424 7425 + 7426 7427 7428 7429 + 7430 7431 7432 0 + 7433 7434 0 0 + 7435 7436 7437 7438 + 7439 7440 7441 7442 + 7443 7444 7445 7446 + 7447 7448 7449 7450 ;; Walljump + Unisolid + Ice Spike @@ -1212,8 +1225,8 @@ 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 - 7391 7392 7393 0 - 0 0 0 0 + 7379 7381 7393 0 + 7387 7389 7391 7392 0 0 0 0 ) ) @@ -1329,7 +1342,9 @@ 7418 7421 7407 7408 7403 7404 7409 7410 7405 7406 7411 7412 - 7413 7414 7415 0 + 7471 7413 7414 7415 + 7472 0 0 0 + 7473 0 0 0 1348 1720 1719 1718 79 80 1347 1722 @@ -1385,14 +1400,14 @@ 4581 4582 4559 4560 4592 4593 4570 4571 - 4568 4554 0 0 + 4568 4554 7451 7454 4579 4576 0 0 4562 4563 4561 0 4573 4574 4572 0 4584 4585 4583 0 - 4595 4596 0 0 - 4606 4607 0 0 + 4595 4596 7452 7453 + 4606 4607 7455 7456 4586 4587 4586 4587 4597 4598 4608 4609 @@ -1413,7 +1428,7 @@ 4499 4500 4469 4470 4514 4515 4484 4485 - 4482 4464 0 0 + 4482 4464 7457 7460 4497 4494 0 0 4543 4544 4545 4546 @@ -1422,8 +1437,8 @@ 4472 4473 4471 0 4487 4488 4486 0 4502 4503 4501 0 - 4517 4518 0 0 - 4532 4533 0 0 + 4517 4518 7458 7459 + 4532 4533 7461 7462 4508 4509 4508 4509 4523 4524 4538 4539 @@ -1479,6 +1494,8 @@ 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 + 7463 7465 7467 7469 + 7464 7466 7468 7470 ;; Misc @@ -6047,8 +6064,6 @@ (tiles (width 4)(height 1) (fps 16) - (water #t) - (hurts #t) (images "tiles/water/antarctic-1a.png" "tiles/water/antarctic-1b.png" @@ -6057,19 +6072,23 @@ 3873 3874 3875 3876 ) (attributes - 1024 1024 1024 1024 + 1536 1536 1536 1536 ) ) - (tile + (tiles + (width 1)(height 1) (fps 16) - (water #t) - (hurts #t) (images "tiles/water/antarctic-1c.png" "tiles/water/antarctic-1d.png" ) - (id 3877) + (ids + 3877 + ) + (attributes + 1536 + ) ) (tiles @@ -8341,6 +8360,79 @@ (images "tiles/signs/hanging-sign-rods.png") ) + (tiles + (width 4)(height 8) + (ids + 7422 7423 7424 7425 + 7426 7427 7428 7429 + 7430 7431 7432 0 + 7433 7434 0 0 + 7435 7436 7437 7438 + 7439 7440 7441 7442 + 7443 7444 7445 7446 + 7447 7448 7449 7450 + ) + (attributes + 1 1 1 1 + 1 1 1 1 + 1 1 1 0 + 1 1 0 0 + 0 0 0 0 + 0 0 0 0 + 0 0 0 0 + 0 0 0 0 + ) + (images + "tiles/snow/ice-floor-special.png" + ) + ) + + (tiles + (width 3)(height 4) + (ids + 7451 7452 7453 + 7454 7455 7456 + 7457 7458 7459 + 7460 7461 7462 + ) + (attributes + 1 1 1 + 1 1 1 + 1 1 1 + 1 1 1 + ) + (images + "tiles/castle/castle_special.png" + ) + ) + + (tiles + (width 2)(height 4) + (ids + 7463 7464 + 7465 7466 + 7467 7468 + 7469 7470 + ) + (images + "tiles/castle/small_chain.png" + ) + ) + + (tiles + (width 1)(height 3) + (ids + 7471 + 7472 + 7473 + ) + (images + "tiles/signs/vertical-rods.png" + ) + ) + + + ;; Additional attributes (additional (thunderstorm diff --git a/data/images/tiles/castle/castle_special.png b/data/images/tiles/castle/castle_special.png new file mode 100644 index 0000000000000000000000000000000000000000..3b86c4e6f75ac11acdf7c318be1ae477a1b19b60 GIT binary patch literal 20672 zcmV)VK(D`vP)@8RSP_@{Gv-fkR+e8I8eQ?c;E;!?Qz zl~zJ@(8H*v+vd#NWP*R!*F8Q}@1m;L|M&h}ZK<@agRez+L^mx*Sf*im-7yt!3wP>S zEhT&;9I<3T;cKNQJ$_M~@%Tfrm55J(U-b-U>Nr`)de+Jd4+!_>b49&6kNT28x-dT{ zH6*(mn>bU%2$Q79DmfgYQVWvV-@d_$Z&Ihpm`U{JFfeE?7HO>Xn2ClLe0M>IgNdazEjhB4>iY)XbRl*q$Lpim)Wx5D3tOE!#9K!7v0p>cN8jLfatxV!*H=Sc0D|KNFxS1AZ_l zVLS#*8{%*@J;QFzv^d?>OD$QIYeZyh8H<0v@7$9SSzX;-Rav^#*||i-J=?ebzvb5I zOY75gcGXhizqqDze}3%sTAH4{T&vgP)mnYw?4$8}t=uSnnGNA>{k8f&Z111F_^3k#{5qd`B7hl4a7kE)wE?#0HRO{^@v>;bEs zPO5#Vrsz6iEli&O>I;o@+CSlakL?xj@t<$XFU4Ye?9pEw_l|yeZp?50<=>n(7V2p{ znWW+AD2-U$0*e}t#xd5?@^WmZ3#~6KrfF>j>3i>_VZWCqd~W;J>uKxC^?3iK zYqwH8Eu`^ym=>E$slg=IFJFo2jK-&l4=^7V$Ng4USJOZG2mjUC0YD7(TCKjnu(-Ir zbL-`FpPaN)d+$N&AMdAwPu`D1itVk}(#v1_Mq1y#nwFQA z_}ppg_j;+@K1us`KTQ3THgBE0JMOizE9>&vO#?WOIt z6*jP$2Ge?4_M|7%nAC^6hw0J7hiUK5zhHvBw0h}Udim8?(tq}!{Kx6#+qV*XpHA9r zbZwkEy?z?>Px{$c?OsdAkM0L?F0HJm?Hezrzwpg(rR6kE zE%vi}a*`fC+)eex1rBYmc6jg3+Ys5c$)NMFthzC+HByh0UtU{AS!Dudq4m=@(zWkye)%q54`nh4(sL zxQWB9^Z5ry-E?r&ig72rR#@~LJJuJz4W-p;&9!v%#`X02%`0gef|#;FQeppe%&A>U z@BY~j5kC(nZ+U9ElfwVfOX|;(6gor-A-%3CF+0Rp> zR!=?l%Js(;Vg?SlbuI0zHq!FqTDo!Naysdrr1jM%d)N>0d6+oWH2odk{6C!?z>hz; z3uP{*^(9_o^B0iiiq+lYZra}3NOcBjtTa=NK_(oOgCFl7r6JVs%*RkoeQ_zRZ)~JJ zKC{$o2B$368)=}dM%;|pz@Z||#d4pGc%4swDRnLzbp2n?D_`^Ur7=}*&YqaKIeulG}{J4_EA z?Wg+>kB}BE-aAe8rPXTs{LH*J*0$2d%38X-eVMr_nrdlny&s}>X?Z0rG@CUJ;;)}O zfEH}rU=r2OmF7LlvQC&i}S9T}rRr zx|+Jo{F4vvr-KfPlD%14P;N$y`(nlYC z7(Y9=@lZXfvQ}i(QpbH9E~M+|t9l(>myS8W8V98~UrtNwn;H?XA%<#*q2QZF4}}Wp zr$tV1!JDzGJ*ag!Xt5DZHft>{wCibWbDVl??#K7bZPs?<-qUB-Z_;H1NLA7uyE&0Y2S!s|^ae-mzMvKf>5V(K#1{$Vdf zT9*U-qoD_jczeU16v_C z*3&_|lWvTLsj-L>hiD(2^wUx2h<$3XuSgHMKGnG46nUNoaR8}?cyZ&o$EY^qK8-ZQ zBAA@YRtsqTZd&042i$DJ$)94~jAZ}n8o&*USVx#IXnm}d2YX2|(%?%ANmI?k^0N~y zBNnGZQ~GFTo)p_j&r*dj$eNI0p5xIATki{1x`v4lQL)05yT4;E(H zgn7Qny8k2&V1RN!P{bj)AN_tSKG?wg9QKiqjZ+4jqDUIZvqcVLtzyr-b$yhPR!$#f z-S79AAR?&40Wt{>CCoe~tTL`~5SpfPh4QiS*a2XtU0FcXZ9;XMtLsotHw|FxA!D?= zeLjmt)?DS_vhDvO#%JYe6i#PP)9CbkraXixe=AOLYkN(=(0rb0^FsHo)>&p;}i_6*BfXF6nRO^Jr zPmj~e@*02IU?Vv${vMO$Ylund0re0S1K6*|0w(8@arMzGK52 zdxAYbKng4%M!TJMW%p-CjJ>TaAihJ|zQ?Nvw=C+IvahY~APrdWDWa{>K<~*;P+##z?8d+zzmK+-^7J1lyWbhPW)e zKb^8k+(!%TdBz{A%5)4BkrLOWmX0u&2ZJtz1gCNkT5D58wg=)qId>P8U9jv0*CZN$ zWBo%2YhejzcA9mGobH-y+`sapugnf$*pJgw#=7~+?!mOH0#6P89)s|A))~qLT8@od zMx#&o%$T3|_7Bp|wVMnK8}m;Vb>hl@#SYF@Ow=*7iE4EfpFA?>!Y`n8xfYu%p|q#k z+EBg3p${@-o{N~TT3$`XnN|w-)*|U3@^-G(pL_f%&Dtv zA)m@Cc57#%P_a0k!1?IZ1=ou%9gq6)-Z6(7M2tADAe!~F1GxV$-VIN#AEa8S6oKs11CT)?qt!j*inwr!|wkeCDv#PB$!VkrP zNR9px{#k`}6pb#GkJ2k|zLl1-?L*xYt8ISORT)Sc~4xu7gxfjA|EMV_L zEWUP%C~{3BJ^0}L{Et7*IAER%&vxU9KV)&C(hnu*31cNl&kx{$AHDNaaG9%V_mhth z9i7-Xt)P)ULrhZEVuFYlsbA`@W9QFZA%etRG*3OK9)~yJ^QUZ%lqcf47>ncH{2X&< zw?4Z2Ak|jyK#xEk9|L^hxIOLoi|Cfnfy~#V02uF5;=hR4qGRwcY<7Iya~kP z0ZdQPNv=(xlJ5=fvkr!)sP3V^R23598DXDUeaNZmYAj-P#LDL=J{vf)mB^(sKY!)l zak9dk;xn+8s9)>&Fn##ZM`^v?3(?faVM4QI*w|UH@pTmti_>rLHSDDT!O9g#2c>+?cEoO2cBkP>Wnag6G5*>TJ`iNt3~NyR8f2Sa&p&ycv3}#P{ms9_ zsbe~!lSSIhZmTBd0&vY8K-N~)qYh#`Vc`zUHWsb)?AeDV|J%8KJ@q*Bhy`${ z2Oqwd4)6T)_+3KDhcvssc>HQx!m_L^n(EVG<1>Vu>b)hvp#1O+RH}+#xCP(ED|{AS z8$y&F9JVlRwfNXq#ZW-}c@NI)=*GYE-M4{5qnoOsYdcd*m9u$r!(774Z2EYQn z^zpri>Cygic&35rS6;KqYIS`*U48i_@SDxFwYtQnb%+OW2#6$tilNZL2?xcf*#^c8C5NY)un$S%#Edw?>jBcQ&Ift_hREH8+2x!1XsK^Wv>Qf9jNGWp&HEjUWy?Xmbdh3lh;!r2dZxaseU;v!p z49aKQ>r3gF`3X0F(fAunjkKYc4ac7JN9o$7_4Ei&_{Pq5$o^wscB62ItuBOj0%7Jj zL{r%w`T=+a#kkW7tJ^1SJK()lMgacCdfr5r9`%DqKRbC%Vxg zbKQJ4LG%)YPpteHkJE{cP&T52s-o~9`MAqI;ehu$gMeLI;zNjzA)C3!{g#ala8JRz zCI_-$pk_{0viqlqvc_mq8#0e2b%E>~fs#rTIC(9NJ_bVz3`)Glc^E^o)C_wZ(0yg?s65$W0rhym`!64G}U z|MB+|2y`^*VS*2cmYoLY%Z0)gA^?LR#;m|SfWiumJH&X463*Tq9N_WA=1kHtHnl8N z2hlqMnCl_eg@n)GSgipMi|-?-R$1Q@Ktl=1XN|g)KZ3P0r0e~MyiW^D2W##+4byix z=1f0}khE&=8Q{GMg}cMgtF@^C1- z+2vm0^s%0I(RZ7~hkF4v$tTh5+09MyyhZt0}a+wgq@o^hDU&EptMT}j` zM^QFJISa*)1TM1@$PR@2(+Br=Gev#W!p22Mvaa&0qIBh8>XSKuw`o?u#NG7RQ08G& zg~yDTFoFfO)=o0EvZx4QvzJ1SXPaK{aDvizQ%@^9x|+)ntfU6aKooQ|J#L+VZ-rtG zJ9`Oxu*+d|K_)}7*VhSwx(>sni_8_c*kFp7&57RZ(~YmW*cfJKOL3{OvyNWuGQrOM zhjH)4I`LoT-!h=Y%ymn8LqJ0jWDdjN%+XONI6)-WIq8w}f7Z*!D~iG}kmo}agF03R z;O39QwZ_#q`mgc}$k!l<-Ykk31uW&Zj}Edti&NxQ3|2Yg$ZRGl?4UR}Wip{tw3BND zHOwgJ5ldJN@#MWm97F@ID%at?pG{UT-9BvX?`}WZ-@~Icr3LE>Wv3yazA$>XjFo2W zwoNFtFYW}P1SF1GyhzZ)!#*B9{rG)2TH_-l!P@$I*N9Z&+n^l8AEqP}plqQ*3DC_I ze(``i28xV~u}_+z>VrT@Ap-X)+x{GY?^BFspiSrY&e;JBxq;!!uy+@@86RqyP68Yo z@Btg>AiC7Xg0q*CLzi*bT)sXXYyW98!%f_0Ji#l4?R3wl5%^|md`9upM(+eT=c?u| zDE<9GyY-#XU^u;Zf48b@jv3 zjlZ}E6|-*(0gIUQwZa-QhQBabf~Znz<8h}Nx-w*{UN4a?A!cEDLY2*k2s#hJO!q9? z{3AD?dkwp-5T)Ud=-$`r@1GrjnD1Sy1t@A zIAjr~fCw*WDlZzRATOxKrbkFqD@X`JZe`Gg#jF#ac6=!{ti1(3?mi4r?qEX$wF4j_<5 z#SN#Wv*U!g>jLaN8Jqc*UkjX{zh`hw&)IMJ{UhZklj|5zLGEcWg<~IV33bTcVk2z6 zR#dPmrv$g0)537T??W-ad-u-!5MXz@w6<20iqvt67t>k>c*9dIH3B?~a7TS$$P;~q zu^7$$i z&6M$7TOW9)gSXymw;=3JIBO#~n0@<*$=y9WfKaMzppmg0EMPDkAe|65Hn0@}}0b*DYbx%0%i2l2?UjdxXrRM@|5N-Ou={4QEfbEw;TJD zPbSTc6%sYLhb+zk=@mk|H9Icg?ab5n=E9#b zyS=jmxO?a4AyU+=PTozgYZaN%=7OCR-%pjp0ms6wdYN(#HgdS-e5QZ&Ftt_Urm+~9 zaSsB5Fi61xM51dY8!A`6B-WP6Jo@<$$BS#1e|~cO=nW2>VNP*Va|kma0r7d+UCc)l z5Uz@#k&(MlGRi&=Hq_CR#;;7a3?(@JB6t>-Z}yzos76HF^o%vxd>>-BAvaer#X`1} zOi&wf!f+d8I}M&9*@N4vD>Is+<1Lc>Xgp^x(nW3b%42GrA}M zrfe+9Nh+w=NDlb~>pC3QYK1}Dw#>c#bs69OA zsge}Xs{)5|Q#gN)U@Sv|k_K`#FObbJMtF~CMNG{Ya!zDkK$3V`T53oLwZ2ZNaa%v_oO#fw%lWLokLUeqRQ)!-J*J5KC;TnpZjdq zrIB5MaG7kq^{@R#Z)xjl^GE;3{}L8Rt+}ytcE>yuk1>CL?)>;K-}ke3Z~$i;P}K+g zed+`L7K1md9GcJEEtGo2J#iRu=zh%tJkKzNr+;hNYetO!V$7!$&X(VDI6;UO+(KKy`d--Z<^__bR=dW%Kr2p|L45(|m@tnxn5$3|F3c=MXZCIzzz zf_m;<#G)NP61x~5E2?IARNaS2Q*P_0m_{P}EkwTr%zPFzk2xy_4NK~eEX4bTNl3g6 z5HWNSirVzd-bn{5sGSb)e}u^HD2P8>AMl&M{!16ikMA5jj0r9SL*IP$jr5IgeJgE> zlc0!=Vl5Gi{8+oM-_T4O#yTPqY(S(+NZSY&FgqKz zNjm)+vibz*yayI^l^TS7vMerfpaN~!Ex_`apXU9Lw{jm3*>T0XCj71g+cvGgLKMV+ zj#}9M_$AA(Q~j~<8sXF9+R^=wK3gAf>&jMa#`EUKi;=rAQq#>FS5i}}K}*Rr7c`s6 zRXsLrxvnbJmuRH6Cxgby;riKyUimgGfL_{4uf6hex=wof8gQ{x61*Osn}x1$ z$SS%48-5T;Tx>8=yERhnM_R}#ZtVIdb6bG=P4E?7X)ei?_z%2iolJ@j8{Y`X10zCb zk1W8g%Ug_rvfit>* zg{ZtJHc=$uxrG-kHOfhP{N@As-gox)0}U0H5?lI!!#270y}SGAGKZjlWNe@XH2ulL zL-Ib!Pim2fM(xD49g+dSp{`Iw67h&yKdlkQT_l{lbD8+beXz4DJA`c+g9ElcfcU`q z`hXw&^wSrTAMYj_Z0U{~>DuyofMabo$q6R%|CZU<8us>p-@%=6WO&WYw|NerK458; zq6~@|uCTx`Imx_evFV3W6qKmrBz~pX>jFz>7XfZ#?3Ok-W2_*S!VE-~JC1IZ0e<7! z1K|(mVjhr4VUITtfUN9uM{WIoL&{g1&|sA53&j z3y-(u`hbtCfXs`|kJr$MbQY-)s;CofTtOikvO9#Lgsm;&IL86C`l}7>=29PEZt4k< zq}_uh z2iHUaFYwtgiqtc8V%}T__v7oXOcM{!HKJjM6 zSW`FvF(N$R`{WwOUocGs10k9#JrX|z}Z4bIX@|^>REk&w)Ge1$CLNZMm$S?d|w+`mCpoQ zr1Y8g7hsh^9u4sbHJaorOgp>g>jMnV?>^j%n&cA!Esu_=8{`n7)$B752~C^x_`z~? zg&KY0&5=%@3qp*Jg%zR&WFC>k7FpYZV;lxz$a`5Oswf&FMhbNgIiLwht3af={o*2u zD4Yv$pe(ixj~TmOg3=Xfepaz0Y}3Ig7y``o1FmO3jPUrG>2y{fAm08w`SHr!oad4q z=>XnzW>8d`Vn(J06^1U39<^dxL*YD`Rpw`AZvEr+0U|nDNmj;Gh)jIO_{1qP*?^Ib zUWG*fV+kl4zRYE(%5=qbn4*XVEhVR#YZ|0P%cd+&Cw{@-1>^#CHHj+JcGe>ShbX#6 z=&}f*X5>UibA4koo$z9lweDQI&YCGG=ODWpBPdH`d?J!^h^ z&V-OAXE2WDW1q;+!NX?y0Q692X?OP#B7}g3!EQ`dJz{0D)`#$Qk37z^Ypy=PjW7n# zV-aC;D8eG3t!P1Xbf`XztOJ!E8x)CD+S@sW(rL*lE;T}ipqPK}O{IWQ4`1E# z=R_K>-MX1>Qo3t$Ld)Pzy%UEOAxpV5pX01Ppc~<`XULByAmg$`B?ELzkJftGyAFrlv3S7#pJ3V+aL&6E1iQE|nJiPa54DdAh@rsz7uq77GM9CC$ViCZA z0*XGEkO%Y}SI~wVuIXwTh*j!66`7$?GwNdT1W-xLa?C+wAUl1tqAMz|_U>$#s?CZ+ z|AOl?FPA@5dM+=XO`LkkCg&xUS#?kqC>+)S$9RKM!)1ohIv2tQ#CbPaA)(VbTbbFGmXe0gIj{inbAtLf(TYoP^CI@;t^FJeM= zBB^VdwlL3D!AMlBC)(E@5%>80JgB@mS0BJ4BCC!uIN%zYX%oD6GZU<&x7e=)VlFzq zR#{2SeBSzq@G~Nw&?Sec4H%d+tc4(I5?ydt4)a#2?Po%P98(sUc_2hcaKK!Cyj6lr zq+bX(TZ~}f!3+mQfH!O+dcOP1-=e?JQhMv2ce?)(z!Dp%_SfRJ z9m^wn0xd6@6^E!2DU>Oho2lBE*x*ivy*LlJ5#qc9D>bdJ9VoyU^j%!$mfR0*zrddYhXgppMD~wQ(m{)|po11|!*V8tV!(Dax54eZSOo9TuBJ_Dw#5}TZW8km znT!x26KUh-%UughY#XI2WN^j;bM*mohwl7};z0@utJPdfojLb^mQQri@pGH9=dX{* zbzov%$b04$>GYV;LgFidNRqmu2OL&aW#Z1)2iQX3i}K_9P~V6*)J!k5ArYXIHCx5j zRxXdQO5F7OfM#-mWkd!ba{86J!wP$0WpmW=9093Xh^OVbb~W?$0sZlKX^S~Gapv;p zBmxt(jP2%{-AZnSUbxu!T7X$3KTmx`mB12G)T}wboU2@56B7|%R2X8(77~8WVH0M50D5VA#<#i7T2WAe8V_vyFpnXhY-e}tE4Qu9ndT$#?^{CQW1yfhV zoz+^g>WhxA{<>IwggBI5t~sho8v9D*lGTB|Bk*B{DCdkf<=#YGv-*H%&5s|Lmv755 z-F^om7~#emj5w`2M@722_J6pixvxS5rQsBXijZ$8t2qy?)CU|}9{|3-$svU-CF&&r z-^Uw10fHFgn3)Wl-O`JXzl@^4XnjQPrvZ_{u06oVeZrM%=)eI*EfaxA>*D2Uj#EwCka53X}FEsv(sE-h7twH(v?rwH&v4aJt zzXhRo>khqdzJKs(&6J|eerK=xx~7{fSj=eC}wgeC1D zd@3x@=0CAM;92tHF~o7V38c{CCR-v|5`0Pl_saH_XjN$%NVF-7zHnJ7Sz%&^!U&7N z@4>R1f+pnr74-o`JO-W4;{M%FCQF;E_da^XT}g*UIo@d7lyRO|AJCx(^3&$WYyI@wd*nH?0lD6lHUXXV;m4n1 z!jRy_Y23f_LBv6|&BKe0Q^>Y< z39fk9KmNxvcbIoKR=3|mNWRxxS{+j#U>IXz#3C$uaPz|%i(WzMql=Fp*l)~0j@D!S z^7;thYkfq2|8CBJj$*nTGL5#EM%6Gn7R-i&$ikWI9D_(t|Bwy%9iW%9Lhai5_Vsi0 zSRzX0PwtxlnHUZ?R1xP;T@E@29OBQ9f6mXB5Z^qxhyG z+4~T$2X_@Dn5|Ml7P1Ag!KelIn?_O&-ro@OD4 z`;Ty&ajc^Go~)Shm;yL00X46Zqj!RG`SYLOLF1btFiw}R+#nm^QV`Dy4OdP7)=j=FZo3+9}vH69Xz*e9qs$yV*_F<$4dv)a#O~ zw0rNPn0sdCY5L0RuQ1P*oSMS@6qBZA9#Sod!@A7-{#V|4{`mp_=5PE)x_oInyxZf$ z7AY00*s%u$S9Y?0z`@vDBj?wQ(np_s8mW8+p9fT=FD`GVD_3u%|KLCTkJ9U}y%v-0 zho3;^0L2M=WCq(u|N6CSaUdd^cAvG0hS0_Q0Wi6@ps=m$SFfhG-g+}#<1<&tE-nH6 zC?p}s^V+MgrJwzbCfdwrdF|4L#@`0bl>ogu!0fibDa5nGYxcXg07JcJuFwDVz3)K; zv?8YJe|>W&wT>PIys!j(zRf;<^{ZdyXNc6sCMe!}_aDUJ(aOGdbku(PfBf(N+iQRK zzx;1z&kvBLbjG&m5F(DF9e?fWWfp!la&J1O=9!>`a%vI^+~jE%KmN&&NfpGzf`V5! zSJOAX@l8_F=@YcQ9fSKNH#zyQz5R9oW-iX`0PnxU;Y3h90`0SljsCXkc?mb(&42Zk zmzWp*Ng;v(&Wy!^cFO(1pZ*}mmhuc1U1WTz+U$kZHA+o&s5p!@;E!d#gqdw`Z&Hg+3ntsa)%iFhZ$Hw2j{ZcUa5sA5eM&!~qGM$L5;hXg?pKFaho`;tZZS44AT93_i}=gqcUL!y-pLo7IN;G zuOq&ktS#sjMW!Tr7;?kz?rwl^xR+Z=$bYsabRd}84^RQBl6 zqZc~9Vp0(!G1%FCChKipl7Cl97`pxF&Yg5fg0a@1+1ZNIKtdy%BKI5hVANOk+K&0N zhb!m>n~b;y4&XJ!Pz^B@sw4LU9N*2As~uM&abs1&iW>jshL_8E$l*oo<<`vkioiZ%s4cPB zPlKu;i8gxP>G@Z!Eg{BDexKC`_~tObx(1K!?qsQE78|2+2NO_Sp6myHw<59Jung>E zb30;yx=J6kTDE7&R3ddrWy)0-8x}#eD3#p&#in102SM2RiUmD_;#9thvJeB&%JMvf zebMoATLNKpN~bJ2g?QvN=jl2WO&+{|mkS*)QVrE@k!F%t;P*g*xs)a%0EJsLp_Vk3A1HI*2y)<7I? z_!sBB%$rx1YgX&%5Ndh2Na5%3Bd7jD@h2AgJmZ&5FPki(C~D+* z@9q4(d=ipByHC-wv!rrX6qGq26QJh2=BRt1c-LfBY-W!>8i~y61C(_hfU;Z*D2m%) z^XLntKJb9pG_`+u&58Lyh0J}Uw12P{<(Y*wXBbVU03EQ>dDih_6RWiF!T}tx!Pz+A zs78m94j5BU($C19Hg1YCBo05UkJyZ?U-W37XZ+&jIwwVjUtw{HH&tRO5(p~M>6pdx zc^sxNgz815e^^=yN%I6x#g!{6qUu8d6C{hu11?R}Tr{yEgtq&mUo9~#g zk3UE^ah}3stdwsQ#8s(>PCD1@TG^Ppt3+$~xr^82Y$lzb+9$PmfT0kpIfboVWlo=Q z4q{OAa0j!s9CF#zrx`yJ8zL;S7BYc2zIq_|yZT$Pj!J%K*|R*4>_Tm6sU}5`WYsV6@8VV(>_6Uo^w#Q~lyE$gcK}8ZuJe?_uI5HL9=lKOHbvNlD z&$%oL^J&J^r^HO@W_b~LP z4|5ogmI4>E>u)8uXY~P5M;kjZ)9!J)#mtIR3u$&%o>LKIX!UHHcfw12$fN!=A*J%N z5GNmH{Pc ztu%YEs#nFFDxo#25BSx;^l!z@iwulL+{nR@;RfI<)+~>;RY~b&xya)~o-9YFtW%;@ zyZ1j1lQA|T4r^wq6eli(+_~sO{)L!C)PeY7)E|U@;KOe+<;e+FU3!rAwzz)%YWn!& zk2BrC?uUDKI41~aCB}i4JD)CUVi!ItT-z8;31+z4>5cJHskx>|9<-6 z4|7bRK_~N)swhp`g_Z z+1e^1EptxXG{neEx;}aQy!TnG=J;?H!MTQ^Ah?Ph^-do*KCEX z@(r;9e;;!Yj_1QQJ!px;;wWxEGZ@rJZ9bmW9j#gr1N#DGAExq;j8=zw0)77Y%IR&2t8I0!IJAvE^Yg|^;KqYe zBIF(wrq4^%G#RHoLm;0gIe|gZsa`6m0)IRej*ghHlP(SD4y%n07(t7I4N~@7lVy~s zpoE13vXaW?pp@Ytb~n!+pV&&ah$3Z=#c5*N;$7;IQqDOtOiJm3w+)kwm*SblF$bME z9kMJ-{qB=4x-@E%>btPIQ9H$zqDtb>h;V$V|I5Y~UlQ>(t-OZ?=lrh_^tr+VDIPw2 z05Q;^MWh%#=z~f(=pUrDqn{wguULwbB*xT0$*_6u>K;kC)mIK+6+d9^`2nU;D{92? z<%D7vd&<$}oEt1wV#&Wbi03TC5YaNknv-yI6hj__8voNzTOr!y9>aBt2Pfl`Qso>s zCXAix;+{PEI21Ndj6GR03(kXDMK;OGnd|a*iQ)mGaFW<`qI25X-cLx~wK%?9^fco~ zfCYlld{&Gc9%Y^O>D{|*d`>F3M6@r0OX@v|lJ^@OJ3Ym|H;AvTAAzI%^gsz!uh%sj z6Yx=sMQT*bovRPPq%8JsaWV=PQuIIp)Ix@zid{QyE5= z+h-hKNgp0`B~B&C4R9sh-yXDB{xonyv!Pv5}gu<#M`yxQoZFbKrDDrK!z z6p#Dm-Z@*`)rKOU)dz^JgqSf-TX|SggeO@JroalCesL&j^h$4pO~qGuuEiw zE~VIFH%ke!yU&VO*82W=Ea<^re{yBJd5EIlcAR58%7CUh0Ckg8B=u<$``M%8{E(e^ zHdlxNEH|H3DO`@8c-ryhXt~z8MJ{)QXSLuEr9$(goIK!bQg*?@+^ZPB;z+$<2`|L5 z>|B|pZocmcNs~=MuRG-j#>iAwyi9*CmQIn;#Z8ZckWwm7x!gonv-y#-Q5-)9qb)}w zkRB9aV8-Tom^oNQZl(}zJTY(X;!{pl zoF{HX{FQ|2kikzoz624DR0VOUR2@&9wLo!~#27N2O)as9;t8XkV|+uc9{4(XKnpM^ z-_JA8;?OE?MU#~e+-mmxfD#3A;|okMFR#iWM86x}Q?Q)EOinzpJ6kF%SduwS zi({j1$bNg^!4Xe8e%zxHbyoPq+Brz~#m-qCMm&B6QRDcgnS@j2f$0M=5$gc#5FimA zVPr^Ykv#!-shdoGR!oF-8G*Fv?D+w1x^heQaB~YvDXW*zT!CvnjOI6>H158JJ0qFM~a&ep2wQhABDcn+9A1^hmy-tXSKcW-cIIK(7v(uqE^wTsQ> zXoWJe;81>X$WndrT{4XRwBrw!P(6G;tQssKbC?E|uj1xO`Qe?jY!5#;QIA)kEjk2e zzh-`XiPHFr0irBAqc9^5mX|)_$Jz4(A|O+Fvkn;EWrZxN7owRT1E@qxV59(bS$bp` z+W~`G*sN2k1EV`_K-M{!J{TAy$l}Y-$j*;L1Z?=b6q}8)MjCs2k0v;E(f&#bR1{^8 zIz!o6*5)cq4>Ti|`MEU`$5>TjQ9DU0a z{F!T-ehYE-o)7L}u{Kr7PnS@Xg_)aMzJzY5(qpn<%?k~yjDL@fpARmIM9z;75d~3% z#aH1*d^W(KXt@*IpYIzP86nFHR9)dl?rb%FCJpDB&GJ|&hd3O?6IA~Y`TxE7HP;?b zPq(d%Ma3Z~stJYF6SvA&JfOac1sIel;vm180kE?Z`|K8<`wKYGx!jbOuCLcyo$lYD z`O!ag;yEms!2`?7`a1f90Vv3v1-7)+H z50@5T%yaAQuYRS+)1jK*|9{@e&kxvG^Pz%Iykm%;b5trd1l4|de*Due;R*Etf1mmO zEk6JG&kv9w!r7@FI$aI+3WFvV{qXGk;YP20 zaGC8La*#w;Ri?$PbkA3LQmdaUUZ%3#_h>kXJ^7j`EOswf@!10?H{m~wn^DH+`UnZnzM!V+1XvNuR>Omo87p`y&tD%%qd-5v``K{zh!)2v zZ5j4m4&Z!!z_0!KuU{xXzC-IWC%U{!8}}R6BR_rq>yPMl?fX8xx0_zN zc{L8oc?#6!-qKTGiQROAh+GSpLgNLWb`SIB-lqTvCkQRFIVa$PyV$ue_r0qU#<%~126G1g5X0FWq#Rh-deO{wY z!ArM!EH03;NMr%n%rX|HP`T-FUE>KGTiZ78;}NnX0~~=|stm7E)N#Z?nN#FJm|?Ax znA2r4bR7W|TaEGE4Ku0sxZVoK>Dtvx=_-v_9ZL%KA)&d~HBV4Qrti~4T!i=P)it7X zw{utEh$rBDaRBbgF~lX7lw$!o;>h1WTOVMr1mE=B`SIP{?8rvwI&Z?v%V6O`#rg%> z!GTgTDJeC3iNMq>I>L$PuIabzKzQ@UO)@O5q?aksXtNLxt)xWyc*9*fvPfN0dqmzW z*z?XTQd4ptgjDep@$3kSR9<%|Z@c8?$MI_0ci7-4(pY>DFiFX}+kHsC3OeI@AeX3o zaV`6I?*%^f2&y-0TF_3c#{_{*(&@Wh#Z?9&4bFVFW<{98oYI(uQ#h36b!=VQ2~KETggAFzZ)HYMuiA*%AE z$N=#u2=7v#=H`@EF|xj%?7$ZCZ1NKK@Zc3eilkK=ir7ja{E4h~3N9KL~GJET*tkuHlce4P5?fu6CyZ^l!-_|l-yt+ zV3)x*35kP)8x)ylI-4SyYaMc$p`Z6~t&SHEEdGf8fpZ$sUo(gUZkJ>HS_6z!_kE^5 zU>B_WUq*hsc!?N@6c>*u_gOOht}M+d@I0-%$`vY7hz)zy1Bm(nYrxoO9Yy84)GxRd znQBmLNflQS8ng*Cmkk)=muU5rly+Z}`*NTpKRzX%>&3mZg(cPU5K=cu3#STuisJ~# z<$y}(>@eebGI2=4(G+(?UBP;+$A?7pX*9dCQl;cbXv{A%{osnqZ`owMv-$uBk-}bN zetfhY=3h?G0_b9Ka)Dr7egcIemWbwrDxn778x<`?0&_;4dB8&G*<$kQR#7)OK=ZOZ;8~qjbeww>KphiNY=vm$ zK1S7iUkDXGZ}Ng%;o)mR#d8TN7$XAT)9I`}z`=_v{vz|^<7p9MAO>nGP%AjX1! zg_{v6kC8Bt1MSN;gVkfLy1XbNJzzIbE(?rE(>m57!RCYnKVuAf7FWr>NE5}ZcrxWo z(N^}hTJNkr;Cb`o57Gs+lokHu{=xi9(o!Gx|ND`VvXJ(v!M}C$- z_@%S@fN}uOk{=%lN*=%*n5H$-qgj#cDAhENmZBz1xgDOYRu2?eN`hSQ`~#gIuMbf9 zSz+F`(9I%2-(RKom7+k;FT+Ba6I@y>F~mqtp;u>U^{59*wny0Jas{8wrC9k1*uF=< zNl#XV9&?VkFZrU3d`;=^(6*F|rt9lK1LGFAl0Ffsg0v z14`}F^W?|R#W=(5Hc9p&MRj|0jB?UPM#vNu7AORUpED@5J|gSl4Bm4SXY~P>NejtB zBcrN%qn^2<=LCpB(^AD~3_7QJR7p=2d3i9|91Oh$ctD*87s6f+RS8?a+zW2_gnU(<$G5)v3p{k_C|hlMmb_1^DVk&D zYgQi+1$CVA)8@zLhcV=Z&2L~lwrP}2&O@5K`dZ|iR#X|_Su7^6zFI+a=>f|rT2g_7#oS^BbI%Xp17Uhq zrrH9!qu<_`0Rs_=L z88y|bXVhJWD9!WBj#uaMxigqG+s|*Ae}Ba|WvH`5h=)6b{*l;5$bV8M@sQVnHB|Tp z?6sEEH+%cEHpn4KuUUP-J}H2O8Z)l*`T6m_9swCnQ#*fZA57a*irH5-eVlUqm)W{d zTu6sX?z*XGl$D=n7O6yjm(8uO%IPSi8zO3=Jl3EPA2i15T~+R07ahMiYjM(9p@dE; zVb==7i80ILON#0%F_CNn^VoCdw6k-KIktdOD47C^FySkzhK$}lsXpLvk0)q+&gF)c z{PPf8_&IW`P)^Ch05YI6@W$jX9B_JoQmoFz;(WpA`iLBx$km^rf5OBj6%z%o<)+AtjF4IS z{H#9U%Yqo?VV$y=RMD`jc~xi^ytHgW)Jpm*fAz1XH{W<8L}eSxM=w_Z>xj^%j>&D( z$t_cLVg=K&bD{^}?4iAL^#LAKIEPi4tQ-@4ct`=sC8U{ZE;@b@zZa>G2!#(p35)m$ zFA2@H>Lkj&9dM&CgNxZVr;0eV3<+np`fPr@6Li6zW;jW_U&?G%9;F4zU;o8l1S7u= zuD+9P{fdR-5gt{Ro%VQs$iX0x&Ir?0>3~Y0$Lj;OkfZCEbeeIIXl2@oT^qHjO+L!A zj)Le5jn7;!QXf%F+Atan*7HM{_GeP1N_~vDK!~{5>H^3$zW(-`Uzi^+?vmLwSAs+i z4kBT1kJgo8>5u}#rmu72MxQL0)|ig!5Z!-sK&zY`55x2pzkGa2$;W)WK7ex6ni+PH z5@W2v$d);lkpRYADmy-!_g!#&3F0F45r%s*fM=FQZmlNKivRds>n$fcd`^A9ul&k) zzc4@EtZA*EHgKzOuGownQykSBZ_=db#?712ynFA158|-gI3ZXO%`k8IU8hWi>gPNh zotHBOIHQfI4=DYHNI>N*<@8 zD|@`=gXRopxj}`j9#7n~dJ8N6nc$)n9%Rb+?%J9r z5V^}0-A+vLQ(^MEeT1A$i?sN2mGblT0lh8{9lsJv*DtYo^^Vllw-H9wF+~x0(eW=@ zACdKDPLT-<&4?htUWfL@M#2nVTE<(Fzbb;8C1&mMhNsPsHwxq#=hgvP5sJZReidwA z7K?n-s_?^sOA5EtDhHHC7`bYsy1>J%4}jz7dOw-M9jJ_)2^Y;^twNzKLLicJft-tu zUjRZK(dVs?2>B27D~2o<5y`b`#+X7h9})5o_~p!ToYe<-O3#uX?*^B^vs)Lr^K5K9 z^4sc}kcqP%Jf)`A*TR~DOB6?$B`f~rKC}9O_O{%k683e8!>4W-$Bo`VY?PKzxh^_> z6n$K4(hmPpIaaBtoiY=0k$vBA@zt7bNwPXueO; z4P`S+eZZqfdqfUTdD>NWxD3k6-YVijRl!m|bJ6i%M16#!#Z(;Q&G+xyD;hvlsY;CcuoGZr7O3MKf*;8>-a&dfrfxtg= z0MrKnAzL4S&L8l2_@&@(fij`rh)S6_T(T(wTe{fz(N5rk^$`MDk+_9VV*T18F%i4{ zMp_PB;or38o>(97toiX`Gl9cbSb#gEjlWIPRyVmcwurVeky9_EoO`a7qQ6qScTNdI z(sT6zi={pwKOsAN<56~sFA}zUC7dogeyRLX7+$14B3c@lA`ea$DJZ5VnlTY|0=X9A ziS+@>^QX;^k65f`B|&Sodtlr=XVR1rH&dCf7%KHsniFY zbcb)$R%;WK_1P1ULy-wl8|i}c46MJ1@uNRb)gfyZOL(^W2$2yox)o#rgA|^7%NY#5BUE9z|O2ms{p;&00000NkvXXu0mjf|IC;d literal 0 HcmV?d00001 diff --git a/data/images/tiles/castle/small_chain.png b/data/images/tiles/castle/small_chain.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a63fb8fcd0198baa20ba39d98ecf2a68bc89be GIT binary patch literal 3310 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 Date: Tue, 29 Oct 2024 15:18:58 -0500 Subject: [PATCH 13/21] Add music "Calm Ocean" by Chitan (#3067) This is my contribution for a water level theme for the Tropical Paradise level set. Good amount of inspiration with this came from "Aquatic Ambience" from Donkey Kong Country's OST. This also happens to be my first pull request so let me know if I made any mistakes. Thanks. --- data/music/misc/calm_ocean.music | 5 +++++ data/music/misc/calm_ocean.ogg | Bin 0 -> 2670161 bytes 2 files changed, 5 insertions(+) create mode 100644 data/music/misc/calm_ocean.music create mode 100644 data/music/misc/calm_ocean.ogg diff --git a/data/music/misc/calm_ocean.music b/data/music/misc/calm_ocean.music new file mode 100644 index 0000000000..a9772145ba --- /dev/null +++ b/data/music/misc/calm_ocean.music @@ -0,0 +1,5 @@ +(supertux-music + (file "calm_ocean.ogg") + (loop-begin 16) + (loop-at -1) +) \ No newline at end of file diff --git a/data/music/misc/calm_ocean.ogg b/data/music/misc/calm_ocean.ogg new file mode 100644 index 0000000000000000000000000000000000000000..261a740046b57794de9822e4c7aa2334450b264c GIT binary patch literal 2670161 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

p=zq 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�r?~z#_Tqd{pMwltH02GM+%5El*Dz{F%jbi|8!z- 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 hlH_czTI!_#RZEsg_aUjwI4hUAL&Ucv+~>Ec4f2 zzEnoz@Wv6kX=x=jO^IIXp21ta+He+lh8Q9g=9=UnZHbYJ^Z@ufO{w`l2USUs-#uH(@}0LF7m)*qqOyB`04&_ z&y%~7`aCkW@d1oQ6eA!q6Wr3O$tHDO|E*ljH%-jkxl`H4lP$H{CZANBy~S)Mx*qbF zHrQbXLkuxQs@-?Op>Ed!Gf5XuKfuLFLSx15DblOI=r0Ffxk%|QK)v4*2C~#;u$C_# z&g{wGNd2LsbXV_Y`aSd@F3w{Zd3)Uk z`7#AY+j+R=?S9Enf1uV}P)fSvwV~^qdPa2l(Kz%cx~u+{F2CFi)q>!yQTkS-61 zq|PbL=JVmpZNK3{j-qZR(;s)HH;z_LoAU+ooFLpZXMH$@2u~{K@t*VNvb&7%ivtmX z1|b*y&E*%4KK$%)Tbu|Yt32yR(V~bFFmCL961A=6YfDvDjq8gmO#eHLa@86h6gQX^ zxbASX*WJVvmuLylmP!{ml(M3PI|BUby zhyfJTWRJ!q<=E>}avI*0iFz&*HC4Yw0~Qv)9+eDLU#}>6Td;HtPoLDf-|9wx$f#6F zkU6gtQ-ieRM~jx=pWK7^F7-l3JP*T?7i&-N>HUDnf3qXhvG-4HkGIplbHQeyUEkK< z<+8b&y09B14;>CPZfMF3Yu9jxCV=F#%TE@&IH#!bjOxa-adC4TWP(&9pMHMcWn*3T z$!AOIw6S?)EvWJxP5T=WAVoZPkTYXc#S3_qO^!{J6(JW(_&RyX9eH=V>IZ7B3y5gV z#wG?DWEdm}zNP9Rsn!@%_S*G9lroA;87Ol2Ri%BK>Nxw-bKrFSdTw_GA!!M^Fp6a~ zt~rZmSi$v^qgsil{4jGxQOPBQHYQ;u^M>x#|M+H6`nDs(izVrfX;YH;xbM5v0YQ6w z+r`o%NI_g7ZRy2pe_Bl=a(YA+PtNqhTnc>ZVNr8d-IjXq$xw%NoTc7>S!LI!7V7i^ z**<|)E>sbNWyk6Xt_*P@U9lxE(%XNWxbL21mRtZRk_V+b zr(ad>HYLJ7{Q#KnWA>0{X%`IIxbOyLPu8xQqk{Gqrrr$brlW;;X_%vuX@hlUE~7L8 z`D*Mb(kj8m@tj-5&(RUsR-im8^Zm4DwdkW`?bWY8QC!vBx?8SThlzHqFW>m|6y?V1ZnFG_F9)4 zb{&+^RTp4tyK7&dwvO~sMV9aXMRULsuQa2sYp3seWf1qKjPD3pHxtn^?GtO*QO#71 z=e@~Jy6&(GTY4UtPgesDZMM>fE|ZKC$xr|r61{v#`bABn**{NQ$f1>{nSp|Z=Se=4 zR~2_Coo@?)FRJz%8uC5&i_CbN9L$d;L6JFnUNqP(W_~!B)<2k>qgHT?^2Y<#+goU@NI?JDFJ;70=F5*xwPqYpP z6U#5OCevMtgKek6pjz%=5pidO@Q%-&gA(0!&diqFA9_8MMqY`W@|M#)jGF_KWag&u zoihm2Ew)nIg0vqW^k%nF9SIYi-n-!!mOv;THGxX5x(GF|6k*rNL^mx%d>?sgBz#!U zy)Zfe%s)Pelt83ukhwNSuPWip3;~uvgHiOVoKoy#N_o({^-`#}t{|%31$6`b?DYwy z`5G`qd0b{Ha>c&?d>`{Q)DNiyUksGgKE&h)z;Jx1kwcl=$C7l7QEH5U{3#)3y@!DlBiObEw*@{!c_hyrz zq$l?g8H#wGwNU7`lQc)p*JK#)x8sVKh#7? z+~O5{>e5I2%WvCh)xn5A=a|esipCy%aEO)doO|X)T%3MOt3sZqzAkaQ_GwsaJV|Kq z{F12V4-W=&pqO-`oHSy6+9VZV0?SF)rv&fJaOwVXv~P|T`Snc^C(-WuX~zdXxGC_x zBvb)%cJWEv2{Y3+jH0Q%e=VTvgLOTjLG>O5Ad3?U7{&%bP%OqNcNEE!R1oOVj!QcY zPHmk;$B#&|Avc%plGdwRF%!F5x;PlhA~^PfQ(bS}Z3Cr2$%hp1Z3P5CQSnk7HC%l7 zP$k%x2E6FM&yQpfR2hg}vrJ=w0-Ly!80d7spRX5+A;ySca$tIbSBB?TJwVQ0G9Nhp zQ?H6^zGdgbp*;<268wKeeRn+7@BjXNh9g^cWR;PbWX~fCAzHFmh_XjEFB+(1W$!4m z_X_6}$tEJ3?2*0a`MvtQ-|z45{>P&p=kPlBxySQ)J+J3=J*nH+_+5dcg^rK+nQI_S z&5xptJrY46@2vnWXEo{a-1*<412pYnA6kZ%m&%XHrU{4Li8Y(mCu2!J{um`}C=`(M zrg!dNQmi^xSkKezf96^slYN7^+0)(DZ@MT9AUU=Jhb2y3&kDI^B|#&)2siKkNK=`H zFhgo&$})MZ({^wvS{|?w$c|*{1O2Qd*8-?iY_7re*O`}Ox3>;mNef)}`>WFYq$O*G z(Qxpyb%^@sRuOP?eE z%47jj%h8ATt?xad8=kW>{PUE}TDB08PNLjT{Fw33PNdfob_>||BO-??nCJmh3)-xh zOWPd@?Vj|}?FE$xG>eWTn|dow5J0h@bNJiS1@yi5fkZY+7mV4dE->eG5?33FC=)Cg z<-Pvo)1F5T_F(`yHSQ&7vT3|UK~CYB=_B0O=;yuXIH`z`IEs#SF~5!PMu(P5jaRUO z9{wt`< zX^KBlSJ11}O}#qdNx{jlL<&oFJDnPACCT>VeZSA%Uh+-EU3WJxO{3ipZ0FlZ5;|TA zH%CqO&6f!c*_g?_DE~tN@8Gg|EqUo%Z=(O@gpew?bZTkY${$}A=B%692>@%(2c`c0 zZj#n6={fJdCikNU+xY|IAK>n6EuTS%oe{HNRODVMjlET^sFfBlZW|w3Pch74aTmW_*Nk@obo*w{}%_4<0t+63Gv3r>GJFJ*~azOLRcall0%+Yu6C){e>0s zK#Pk8URHV=dD*O`0}H^m>|;O*Yhkr;k*FB7pTgi|H}HB%$Sdyug2d8PY|8!)P_#x= z*NYVuU4kORC+fQISCDJoTtmECQZDuK3jY|*?E}13sXZ3{P^q~6miOm7(koUa&8#C} zS>G2CjLB{N^+k(1JVR0HBos@rz<4Po}RQ?UklR7%(6urUbS5$-G%L% zh#Fe!mOC5sVw184ujOvh6Byi^YR`339AlSzJWlAFls}?-4o8L)s;BPukePxwXN-o48sp2U3 zg0w?d=i{%J0oXcaXc}Fk*a_dKai&_GU;{3Pj|o(GfN$kTf$f?8sk$L^!IEgZT!^C8 zWwuSV-`r8yNz~g@qiP^`g129B54IT@R1sB|E#BTL-CUfz_U9$rs?X{Pt@8IA9}e8z zv>BUkgL<#x^>f8yk9RbFu!UK(oU`bdmM;9Y_(ER$(czYnkVu>mC7s~Tr(dh=iUJGY zTe;FgI(dfQ;@X7#kLG@{&_Sm1bt%MuEZ2*#8F!$-3Lst8{zeQ=hmUOt;)iAQUv{~E zUJKB|%~?F?>5{M4-!&Y=rsb0E;Zb$8L^b!GbM)tqPj=mU>Zh}6U#Bv|Ecs{mzonl6Ets?2X$}yD zeFD!sH~k#JAz7c=0gx@YM;RamROSR`bvnP@C3ga>-&S~~SL@VRX#zQF%hli3=_isL3UAc#5 z=U6U?+#+VB-5dS*?Q|A8S&ZO)hB0E$dsymeoC=t2aw-r%--S@q1gia~kajZ_R~jpN zT`?|i!lFm^PuU9TocHO7=yat9T*SOu68yXy#dN6H&mq zO{GJfxnj@nQy2+cJWt&#PK%}Ku(aHXq3wvHX`fU7PsNDclz?l`cSKUs_FtAFF8FY2 zd*3u)kwvLdwY*GEJl#6nT=G+%NUJ=Gs6yt;3Vh==L$sVnlQDMuwZBWA6`(BU0u-=} z;$))>2csF{JaP4UU?vjoZkIXvqxk9K;q8h&bw?Uk*%NU;R$Js|eHi&BDpI+_Is7MA zlWfL;pc6TsD9zrqF-x7DE@%7GnLchB4idHh$hzy@(jp9F%!XEjH|KvZ;x7%Nmv5>L zeeb{5dv?$4s?qp!xt2uxE7=NeA65<~wBFyqzx^=5U^6`exXvEcEDjM(qtvQh0+g!& zHCd}{dcXm#&XB{K+CtyQY!~Wi*)J~FqvpsF6kt);#|%UPg%9+E-!U}UFEWJ2l?wP= zW@?T@mI z+=*_LwUl-#<mTCvI4fQ?mz={dy>H`5dr8^uph# zC_bu%xLuuun1SX6+A>zxDX?7WTO`7S-|utLJw~2IuQz7&hYkUxKKEGleb#J@-jXx` zFX4mXsnj1xG9$%Mzk>n&9`oUCJs!5hb@U1*Kk(;W?>Ah?|C&RwB@CuMOQtX6=LJlE zy`j3N-bJhav2bO^^sAQRDj|j_&F5#zcD8aErPm?Tw*SWk#3xMCPCUoHe?!?j1kh3K z!$&;cqDoh<3IDjJ2p-KR9Mw_|xikOqeg zL~} zDDBwesLS517~9DOvYVw_dT*5C${8AOC^I`s(>5+F;QI7zVzRkuNZbA1mR~&ibDjw< zR*=6es{F1ie=8j$*cjy--3Z|Dzkw38F1oThjKqQvw?6s7v?^qSn~e%D0QjSWSA0G7 zKTR!OmeX^I=HL^A2D~pP{T@Y3F3R`qDU?j@`(A%ZOt0u_)rR8gpu>(KO*gntW0YK? zXNVPShyaAL+@}OO8AJdkuNxqABFO}aW)csI!71~JxWDS3wuSQgz@a(qkvjU`eESagU)l>W?rx z-{8^lA$rx>I;%AKO3cUX%`g7l&QlX&O4dAVue@tQyI-bXIhBVId=Wx8i{4=_Q*nt9 zbXYj9l(JLkKjV$H7IS}kR~C9<;;#4MvH+}pyYX`QfL9(QcQ@T0`%U&U; z&%*fmmwQJU-JF-lfX50Ulp_6Lb8eV~#0Sn{xt=v{oDkaqmz3-=y}%xYJ7iP5I_5%r zUYf#e`BuwZf#^>S8p2qlFG3hUAm|8bP%H7)q;T*Cu5Hk`24ZBn-@GDIovU~w+GZE2 zQ*j2-Y9Ls)Z0(v&{tW}w3Ff%`ro82GfZ{a6^)XpP%QEeGp8&!biAKK02eWqX+@DS&zL`$)>6CG|_7RC&(pdN5=GT}^N zZS8K%0*J^Hfym2mu6nf`uUg`$Qi@KjP96qh78;GCzxChR-@IOQqUVPKli(mJK93%M z8WGni9gGI0Ii(SeWa@Nk(A4`UV}QLwj1)Ufi}0ZctZLy&;$&NBy|2bqK+@WlSAJ8j z@vZ^_;w0Wrw*1@@T4q15MHI1b$$51mVn1-M$wrB+65X(o-()&T3v5-T+xtB;h)Dff zo|Sz|icC2C709R}?^F9I=u!Ji{);}@&{t_P2(7T>8>=X}No$}p?8Zz|a(Mg{_u3}+ zvc8;;0!tWs%f8KL#_?_|r9PH*;-)>+B)Rp~$x8t8BDTrRjB~Xnxf%^$aDPYP){z^R zQT=Y!1zmRTXiHIrU5j3&Tar^M<_kV9lUMJPDEbdvO#e+hc9ZhmicEhRGk`F^C^%*0 z!nGcX=QFFirq^HLcv6V+e9Cye5!R-2yHS6`uLb~1;XMp#dV1m7+)lQh2m4Fpt@Xr( zx;||1rnVu=Q3Nf~L_qD6`(0G};P}1-aLPR;?5(EOdJ@@47ju{zq zZRL4-(qphgJ796<__NbJ735k-Mp(lfn~TjCI$A)1|1GY+rQXm~BXvPKz#Y@#`!p;! zwa(pP0v`vrOtgI%jHt6W65!`)16E>=E&5CK{@?a_CBE-!DDj3qZ2pp1?bY0xJPP|> zgX%neRgN9w!t&iZsQ9@o{ZbW<9J5uzUEEK%A!18Po#F%%FbYP%mT)4p7u>9 zhR%20I@b{7wwa6@o`;GTBG8cF%+EQNVzk;35@K~@f69C@LHst@)gA=4>g@Hx;SW7g_nJxt zi}k6{G3wjD^qA9u-u{8}x%P?grdA1Y>FK1f4+M*kK)MOxtk#?q1!(U@5RpW(BS73q zgDS7jDe(vow|f8u6;X;(4>~reexvB{s~NSJi2NOSm4)-Z#nf_`Crb^tGl!@`kX^kb^!DYOd69VtDG0lpcNcx(A3RitqC`F9f7bfblHJy$z!|g(SqFA}cWK z8ox9Vs2NvJ+w2)PHaA+FdE^!3w;$^FHU2(3bis(#)MNM6epTr?wM$38t9*E-0;h_D z6G9jL=QiiBfBH5(k-@FSSwy!>tAK9O{O%_3vBoM5weMrwykC%4P*inHBxA;c0K1Ey8Q&49{7f)H9vJ8`y(x%ggE0jKAU#Kt$!smY-MVV zJL?!b-h6tRp1Kyzi_%Ls-FmpD>!uvBW4o(dMImUDy| zy|xgVC(gfxs;Nl1%eMFqz3X=pQ$&P)Gn=4!#OCqlfz=JpU#Cbc2+0`yw3DwG@S_Vt z1K@Hx0BhhdpSkO}33@gRIr!LF;G6U};VJ8`{}o8tVX!gz<^Bz-`P2h1_yK?`iEsy& zi#BHSl;Q%0X?Zb*D^i+NSg9IO`U@o6tcgd5cKkt9v6A^k!92_bEmDpm?Rc5==xJiAwo@Wt{+}GKt=g zu-+sC`b^YD}2uYB8Qjwb>Fk_oJiBgKztgGZ2v(+?o97(Onpg z==%R43J-j6irglC#B^{-00dG321ZaMU_yo+!H^)awYz)3CR5*L8YWqxIh^p4Tk3x<#nf{#m_Ld+7jsl*+y@E!JpkYMuK`x=uU!@j1yQ9+LkH zlP1OOrByD|8CaqjGuxS`=-k}7+SkWi8|g2+NPcKEF3_8Y8p-{wpzV98WB;L7*VXVv z(0nsbK)4SI!vw%UotT0dEUL%6;SQkWhixar#F2P?1gbQ^>|?9rS-|eulJ$`h`h| z;umlIbnjAW7+JB@@9mOMqm@h>wh0iw>)fInONK<{GbP&CIoBPtynM(7(ua^h0SK;q zrzVU?z)yK5ezFR21^^CQjIz(r78b89=;9! ziD&>_KIJhVgLg!nOpVO+?&rEU%?4-2xmt9~P_6}l`BxQ{31hdWtiPg4C=@L;`|CmgcgZL{@2qt$Xw4i zVLz04z1#6=MH#MR^O33EORSEq->h>0^Se<~TKiZv`b688MTRunJ-04tajI(TfZG=t z1A4yo5a8W8cRqy21fJFOoX*%vtUSoiabxP->5PG!-{7@u>bRQDfdI_t2@)c5_*HW| zyciLH2a^-H&KnO93tZb;=Um~G!Vv{#D$X5=W>2=fuaZ@4uFOXPDQJJ|=eI>&&kDj5 zN1y{0!Kyn=Ua*8R$T<&_7f<<59^)($4Jce4=jk8Z%--A2>nR*y{Zmr0K#!iY!wNM1 zD6nN)a|53Hw2#Ueumfoe`6Pp6>wj3Cy2T$@AOm6T*#C`n<@RUu0WZ4O9LJ46#b9GC z#78s9j)zVklgYLZwGD8ni=_o_CTE-*9Iy2dA1poj37=8ghK&u#kAujCYLfGBaG?A% zjnEeRJiPsZLw1wuRU=(EDmUk30!Iz~IAcVRJX1;6ES9RP9u1PwJ1nvzJ5Mu)E& ze~mBQU=;2cHeo)=n%F303zn*+=he-0+>>>G{mdK3E!>pjV$>)%cRk@UP1!BPmuqsHAzy*8OqZ z5z#t}KiOi8AL%~}bx5WdJwps;M9&*owHJ|qmaSSuxjfT3`02&Xq$7X`KCIrdt4Bg$a0n``q!P zli$g>BVrra9sqVJe~Aow8(uV6^#uub%^@}^k*R!~3I#b!W?(#m*=F+41Xojb**gef zW{lXV(X?BRgS$g4*+0k7_I%9h&%5@rPcWSVU$tQ#IW4R9(|XvhW-fvh85%HMV2luY z7}vKm{}Fq5C+hJfpeC2`_=|FZ-dERYefNnE{LZ_)<<}%QXoF5e%cGla8QghXGq0{0 zcaZS>@_kAQ2sIDKgrkWtMegy?m-DhID%LRv@u$4rS6^8((>h5+2rCGrJ~@93ca=li|`@8Z7K1)-LXG5Z~|IvBcsw~EZfV>-d^=jD1aSK<@PUCfllWvZ5mK& zyA*>>p|o7Tel>LxRuh9_mfKMvy^saq!!a(6_U=J#4sel&wP@>4M>pl5rRn8>-sUmG z!3`>=9vgitZ94!=p3vhsp$zzRVn)|XX(Ivlndt+y$173 zf{0QNeVcK%oZj{G-C_(NSt4z9jq~HeUU~P^j0aI>{*YB|cG;e!JW@iBfD$HgI-mrT zjCeP&O4XyKC3BzKTjgIWE^sy-Z5XPraz2h4Fu29U({soNY?AL}_ol?!FMTKJT}^-P zZ*>scTOP}$uyP+~2taC{pjOgKI=&fmT{+hAsomb}S9ou7K-F-$uZnzX5r%tZS}$Mr zAxH%Psd+uhlkmpM1p71#tAr#BWQsx{5J5!@MYwN>5VYC_0k#M4aI)uXAKb8^gdX!1 zr|GwC){yjd=cb%|_&~@oE2?SReo1#H>)=gYPjZ8DUtNmjz6xH%?DGL5hs~!6FU-z2 z&HzM-kHvdhlJ{GmKZ=Z|SAh$CYG2gS_^{SP%*V;a)q+0zP$j0H7 z9lRCpb{c~*I|!Bk$x3qJQbBS*Ml>DVxChSpGuOYy84K?mK0OpkDVz-q{owy??V3h` zho!?x`qvh6Hm4SQ!cK7&3$d-A5284=NU^EbUEa)?Byod)l!YYi%_hzhL0N*yAr}AM zEG=86!nD5~mOrN~3TgMFOQoBFUS!mL@FLzqtLu^BH11La??0p^6mal!^Pf?(FF(*Yac7hTCY6GQ?ekx+yKa^cA zVgXEM!(nS?C=u!~`Fk{_-cR?Z+l% zg5D>ONKhmI??c4lh8PSuGPMWkoCD!;6W?F50W(mUmdI{)fA1E|28JK}E; zB|oc=c#x)a6?Sl@y9@Uf|8wF2@V(o5!{l!I%$J=nX^Do|f2 z;haqm8ca?Tfqt-MSl0%BgoHFUI76ArgQLmkY!Z;}H#8!;XoRhLU*>=nQ151$!(Kpb zRzFTDNa4l^+G9`n#>Qu-4Ffd@WpcAVWTO75`^x)rq3MYH@;mHv+E=pmx-YCO*2cUO zh$slINdKn0XRZl%bm=I7Q+5N z?UD#Es0iKp>rw-By5Wdx5&`~@+rR;!!tCe51EjX;<9%2H)af4dhKL9Vpy<{=Dg6D^ zd9{a9KkMb~?}Vl_Or`Z_AFh~4kKB)P>!4EEK7T~xvj5$50#@g~HXWganr|@k$tO@M zq2wxg%nY6hUD`*{O`^15>`eG|~-sC9n$Qz5X=Q_-#O zn{$3UDS0P~(t~7%D=8EEQS|{Jfy|I0o_YiDd)+DAv=hZ;G}wEV#vWCiCXaE za~d0%oH2pjh;M>u#@ioUPqst=JP9RoD6TCA<5>iNEWd~SME4dDEj)5!gQ~Pq0MA&& zJD>LM8WD%0(IXBxAu1K5VFbd&fCv`9=TIX07mvUY|L=kSk~-jB0u;SXx6Tvj;r0+| z*w*AG;WlhK?ZSb`|ws>#iJSu~al&-1UtNmhK8P+j0w0awn01=bC`>;kKoOXU;9=?&{=}65s!qD&@ z;Yj^GOPkj*TgR3v=;YsP24`af16|;H%t-+X?85wmjK%3XMa4NPJQvANE%#koY_I{t zIGmTv?7AZ?P*}|;Ad5dENJ#HNA%Lj;cd5AGrv3H5%hu8-v0f@2#x4M&FpOC*(gqM(#K7;bc8laXJX_)%-X`_S>|dZ>+`!cKs|HD6zK*Tm@# zs=+v>P0nEUV<%K`sv>Vgrn$1BBlGnK+&T%M=?D7o1#$n$(p)nSx7)l3qysA80n3Ot)ROV zNP0ejFJ7UX5v7_2pwu82NUc-6x0cvv%a5t-l95J)Xd@G-vA2v!%(w;L z5`oimDT@Ik4X=Ow`Qw~is2-y+FGygq_%zWi(p>qDcZ#^#;6_05tj?`b6#j7U%@eTA zo4!YJ0$YdF-Nj3Ty=v?h;`zOW-%;N*|6y6esR*NCbMW!6U^8`g+i7jo&0T5k$UkEW z8GdWkR=t$TaV^P)Y_i#2^Ql(tSc9RfCg|s7_+`2TBd0L0cfo_%c^WH`v;9hQIQ{1M_MbOn3HDoeZ zl@jwPa`xa=tA1toD5oFtPyo`VM*<$bJO)I|nYkeyIao}WtDjf)9z<>lQV)!p=JFIR z#-5k92I>2mv?;#c&3VG}!A=$TCZsH|V6EY_g3CGJ7C5zYI&lD9AnpM~izfpi<2?{+ zn-X*q_e`Q(6G}=F)c%cLn#A0U3r1(A8B-m0%>uRO&c4vRO`o&t#i$q)COPGq18pFhPWaa;ezFWfbelcKqvz61nsTB0Rc5BvSRxXMi#1{dHUS} z5#x*YUGRa_&@WpwUz49G07ANL@45nd{T1=xv8as7>QbNrnd zkAJ#dE1G)nOXru(s9}kVu0Kp&cQ^{qh*9XDIR}o(KBh^Kb!p?h1Sc8OVH-a@v*5i8 zB~e_V|1zSTs`VKqJ6{R038ctb(&N!nGJgJg*vp2{Jk)VgP zke^z$AZR0e10xdk^^Ptdcp-E2oAwePf#*Ik*REch-Wv*gok6pQ85BB-{8zk=SwQTY ztG~9&*S~vr2Cw%Pslom9R3zm1bRs?8;MflJtW|)_L|AUtdZye^fb( z$T1q6&&j~#EBWR;4^fYz5rKeWEGTJBQVsA@PzkeMUJ-H8qVs$1Z(+S