Compare commits

...

82 commits
1.0 ... master

Author SHA1 Message Date
Wuzzy
d4455b31f0 Rename Minetest to Luanti 2024-10-29 13:35:16 +01:00
Wuzzy
c7e39fb2db Add megustanlosfrijoles to credits 2024-09-24 09:53:56 +02:00
Wuzzy
47a9fc050c Add mod name/description template to locale files 2024-09-24 09:52:26 +02:00
Wuzzy
b04cc0ece8 Translate mod name+description to German 2024-09-24 09:52:05 +02:00
José Miguel Muñoz Z
7ea3076ba2 Translate mod name/description to Spanish 2024-09-24 09:49:45 +02:00
Wuzzy
87d4e305fe Merge pull request 'Add Spanish Translation' (#9) from megustanlosfrijoles/pride_flags-spanish-translation:master into master
Reviewed-on: https://codeberg.org/Wuzzy/pride_flags/pulls/9
2024-01-04 08:33:18 +00:00
José M
12de6a2365 Add Spanish Translation 2024-01-01 14:00:46 -06:00
Wuzzy
5baf4eea28 Version 2.2.0 2023-06-05 10:44:43 +02:00
Wuzzy
3fcbc8d793 Use updated polyamorous flag 2023-06-05 10:21:57 +02:00
Wuzzy
97e66600fd Version 2.1.3 2023-05-20 18:34:54 +02:00
Wuzzy
f58488c715 Merge pull request 'fix logic error' (#7) from Niklp/pride_flags:master into master
Reviewed-on: https://codeberg.org/Wuzzy/pride_flags/pulls/7
2023-05-20 16:24:49 +00:00
Niklp09
249ca5d861 fix logic error 2023-05-20 11:21:15 +02:00
Wuzzy
efc157492a Version 2.1.2 2023-05-14 02:50:00 +02:00
Wuzzy
fba6030272 Merge pull request 'Fix French translation' (#6) from syl/pride_flags:master into master
Reviewed-on: https://codeberg.org/Wuzzy/pride_flags/pulls/6
2023-05-14 00:49:14 +00:00
syl
16613e636c Fix French translation 2023-04-20 16:45:23 +00:00
Wuzzy
0bf701f451 Add translation credits 2023-04-20 17:44:55 +02:00
Wuzzy
55bb184ea6 Add French translation by Z-Master 2023-04-20 17:44:02 +02:00
Wuzzy
a0adbb6c06 Version 2.1.1 2022-09-29 19:19:43 +02:00
Wuzzy
6936be82d0 Fix crash when using in protected areas 2022-09-29 19:19:21 +02:00
Wuzzy
e774da4fd4 Version 2.1.0 2022-08-19 12:29:08 +02:00
Wuzzy
e1b6f01687 Remove progress pride flag from legacy flag list 2022-08-11 12:13:22 +02:00
Wuzzy
a81e55d781 Add Edgy1 to credits for Progress Pride 2022-08-11 12:11:36 +02:00
Wuzzy
343f664534 Some bugfixes with regards to progress pride flag 2022-08-11 12:10:40 +02:00
Wuzzy
b06fff649a Merge pull request 'Add progress flag' (#2) from Edgy1/pride_flags:master into master
Reviewed-on: https://codeberg.org/Wuzzy/pride_flags/pulls/2
2022-08-11 12:06:50 +02:00
Edgy1
1985c4d921 Add progress flag 2022-08-10 16:04:49 -04:00
Wuzzy
02b3118cfc Version 2.0.5 2022-08-05 23:58:16 +02:00
Wuzzy
39924e6ab0 Move license info to LICENSE.txt 2022-08-05 23:57:51 +02:00
Wuzzy
c676c63634 Version 2.0.4 2022-07-26 23:29:50 +02:00
Wuzzy
17a1520487 Remove orphan flags 2022-07-26 23:29:30 +02:00
Wuzzy
e1ef02f97e Version 2.0.3 2022-07-26 21:44:00 +02:00
Wuzzy
6c6e1d453d Fix crash in non-MTG games 2022-07-26 21:43:40 +02:00
Wuzzy
947cc219eb Version 2.0.2 2022-07-26 21:25:07 +02:00
Wuzzy
7a2fd7d755 Clean up mod.conf, add description 2022-07-26 21:24:47 +02:00
Wuzzy
e71ade5e45 Version 2.0.1 2022-07-26 21:17:56 +02:00
Wuzzy
3c559f429f Fix wrong LGPL license link 2022-07-26 21:17:22 +02:00
Wuzzy
acd3cd1d29 Version 2.0.0 2022-07-26 21:12:41 +02:00
Wuzzy
860ec0017c Give myself credit 2022-07-26 21:06:51 +02:00
Wuzzy
c7a4d879e0 Add API function for wind speed 2022-07-26 21:06:20 +02:00
Wuzzy
2a002a736a Fix constant flag waving speed 2022-07-26 20:42:01 +02:00
Wuzzy
adcfdafbec Update README 2022-07-26 20:33:26 +02:00
Wuzzy
fe49b2caa8 Add 4 API functions 2022-07-26 19:48:57 +02:00
Wuzzy
f30176ccb1 Fix next/prev flag fallback 2022-07-26 16:27:04 +02:00
Wuzzy
e07c633679 Update node meta on loading mast 2022-07-26 16:20:40 +02:00
Wuzzy
bbb59d9dce Store flags by flag name, not flag number 2022-07-26 16:11:44 +02:00
Wuzzy
8fd4f9661e Add 4 gender flags: bi-/trigender, demiboy/-girl 2022-07-07 20:45:28 +02:00
Wuzzy
5010445428 Fix collisionbox size of upper mast 2022-07-05 11:34:01 +02:00
Wuzzy
842c1bce44 Add comment about flag appendage 2022-07-05 00:48:39 +02:00
Wuzzy
0a0ccd49c3 Add screenshot 2022-07-04 22:49:27 +02:00
Wuzzy
4a890ef5ed Make sure all flags have sharp edges
The dimensions of flags were changes so that the stripe ratios are
always perfect. Also, the aspect ratio of 1.3:1 is preserved.
2022-07-04 22:47:44 +02:00
Wuzzy
a295c4c028 Update node definitions 2022-07-04 20:20:57 +02:00
Wuzzy
70721eceb4 Update README 2022-07-04 20:15:42 +02:00
Wuzzy
76b5bd0544 Check space before placing flag 2022-07-04 20:12:59 +02:00
Wuzzy
b003e8366a Merge branch 'hidden' into all_wuzzy_updates 2022-07-04 19:38:19 +02:00
Wuzzy
c291ffccce Merge branch 'stuff' into all_wuzzy_updates 2022-07-04 19:35:17 +02:00
Wuzzy
0bf02d3245 Only start sound once per flag 2022-07-04 19:30:54 +02:00
Wuzzy
cff6a2f9c1 Make flag poles easier to dig 2022-07-04 18:48:13 +02:00
Wuzzy
a570ed7c36 Reduce entity collisionbox size to 0
So the flagpole is easier to point to
2022-07-04 18:46:48 +02:00
Wuzzy
7698ceebd0 No longer need server priv to change flag, check protection instead 2022-07-04 18:33:06 +02:00
Wuzzy
889744fc7a Add crafts 2022-07-04 18:22:48 +02:00
Wuzzy
1fe38606b4 Add German translation 2022-07-04 18:13:35 +02:00
Wuzzy
88ce6844ff Redo anim handling and fix anim jumps 2022-07-03 01:42:08 +02:00
Wuzzy
ae0929a6dd Respawn flags on loading chunk, part 2 2022-07-03 01:00:05 +02:00
Wuzzy
f4964faaca Respawn flag entities on loading chunk 2022-07-03 00:44:23 +02:00
Wuzzy
5ba46824ad Prevent spawning double flags 2022-07-03 00:36:39 +02:00
Wuzzy
901722ca97 Fix rotation misplacing flag 2022-07-03 00:25:34 +02:00
Wuzzy
b4199d580a Update README credits 2022-07-02 23:59:41 +02:00
Wuzzy
61f1b471d0 Add 4 gender pride flags 2022-07-02 23:28:48 +02:00
Wuzzy
72f3b04842 List pride flags in README.txt 2022-07-02 18:40:42 +02:00
Wuzzy
2e704ca392 Fix genderqueer flag being used twice 2022-07-02 17:49:45 +02:00
Wuzzy
858610b8ee Save/load flag index in flag pole node meta
Needed when flag entity must be respawned
2022-07-02 17:38:25 +02:00
Wuzzy
7dc6217492 Add hidden mast segments 2022-07-02 17:22:18 +02:00
Wuzzy
71853506ef Cycle flags backwards when punching 2022-07-02 16:49:27 +02:00
Wuzzy
201db6bd8a Fix deprecation warning for get2d call 2022-07-02 16:40:52 +02:00
Wuzzy
52097be084 Add screwdriver support 2022-07-02 16:36:39 +02:00
Wuzzy
a729d0ce3b Fix crash if rightclick pole w/ missing entity 2022-07-02 16:17:41 +02:00
Wuzzy
3cc23ae664 Remove double groups definition in nodedefs 2022-07-02 16:06:21 +02:00
Wuzzy
42afe00827 Some flag node improvements in inventory 2022-07-02 16:05:14 +02:00
Wuzzy
7035943fc4 Rename files to match naming convention 2022-07-02 15:53:10 +02:00
Wuzzy
662bc328f4 Clean up init.lua a bit 2022-07-02 15:47:13 +02:00
Wuzzy
dcf0b79420 Mention requirement of 'server' priv 2022-07-02 15:46:04 +02:00
Wuzzy
a3b6fedf64 Update README 2022-07-02 15:44:57 +02:00
Wuzzy
11f3fb805b Add many new Pride flags 2022-07-02 15:31:00 +02:00
61 changed files with 850 additions and 186 deletions

64
API.md Normal file
View file

@ -0,0 +1,64 @@
# `pride_flags` API
Programmers can use the following Lua functions to add custom flags,
get a list of all flags, and set and get the flag of flag pole nodes.
## Functions
### `pride_flags.add_flag(name)`
Add a new flag to the game. `name` is the flag identifier.
There *must* exist a texture with the name `prideflag_<name>.png`.
The texture *should* have an aspect ratio of 1.3.
The recommended size is 78×60, but other sizes are OK
as long the aspect ratio is respected.
The flag name *must not* already exist. This will be checked.
On success, the flag will be appended to the list of flags at the end.
If a flag with the given name already exists, no flag will be
added.
Returns `true` on success and `false` on failure.
### `pride_flags.get_flags()`
Returns a list of all available flag identifiers. The flags
are sorted by selection order.
### `pride_flags.set_flag_at(pos, flag_name)`
Sets the flag at an upper mast node at position `pos` to the flag `flag_name`.
The node at `pos` *must* be `pride_flags:upper_mast`.
Returns `true` on success and `false` otherwise.
### `pride_flags.get_flag_at(pos)`
Returns the currently used flag at the upper mast node at position `pos`.
The node at `pos` *must* be `pride_flags:upper_mast`.
Returns a string on success and `nil` otherwise.
### `pride_flags.get_wind(pos)`
Returns the current wind strength at pos. The wind strength determines how
fast a flag at pos would be waving at the time this function was called.
This function will be called from time to time by the mod to update
the flag waving speed of flags. It is called for every flag once about
every 115 seconds (plusminus 10 seconds).
This function is predefined in this mod by pseudorandomly changing the wind
strength over time using a Perlin noise. By default, the wind strength is
only controlled by the current time; the position is ignored.
This function can be overwritten by mods to define your own wind algorithm.
You can do whatever in this function, you only need to return a number in
the end. The number should be roughly in the range between 0 and 50.
This is how the wind strength affects the flag waving speed:
* wind < 10: slow
* 10 < wind < 20: medium
* 20 < wind < 40: fast
* wind > 40: very fast

94
LICENSE.txt Normal file
View file

@ -0,0 +1,94 @@
# Licensing and credits for Pride Flags Mod
Source Code License
----------------------------------------------------------
GNU Lesser General Public License v3 (LGPL-3.0)
Copyright (c) 2022, Leslie E. Krause <leslie@searstower.org> and Wuzzy <Wuzzy@disroot.org>
This program is free software; you can redistribute it and/or modify it under the terms of
the GNU Lesser 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 Lesser General Public License for more details.
http://www.gnu.org/licenses/lgpl-3.0.html
Multimedia License (textures, sounds, and models)
----------------------------------------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
/models/pride_flags_mast_lower.obj
by sorcerykid
/models/pride_flags_mast_upper.obj
by sorcerykid
/models/pride_flags_wavingflag.b3d
by sorcerykid
/textures/pride_flags_baremetal.png
by sorcerykid
/sounds/pride_flags_flagwave1.ogg
by Chelly01
obtained from https://freesound.org/people/Chelly01/sounds/541088/
modified by sorcerykid
/sounds/pride_flags_flagwave2.ogg
by Chelly01
obtained from https://freesound.org/people/Chelly01/sounds/541088/
modified by sorcerykid
/sounds/pride_flags_flagwave3.ogg
by Chelly01
obtained from https://freesound.org/people/Chelly01/sounds/541088/
modified by sorcerykid
Pride flags:
All pride flags have a name like "/textures/prideflag_<NAME>.png",
where <NAME> is the pride flag name. For example, the rainbow flag
is "/textures/prideflag_rainbow.png". These are the current pride flags:
asexual, bisexual, rainbow, gendercreative, genderfluid, genderqueer,
lesbian, nonbinary, pansexual, polysexual, transgender:
by sorcerykid
aromantic, grayromantic, demiromantic, graysexual, demisexual, omnisexual,
homoromantic, biromantic, panromantic, polyromantic, omniromantic,
vincian, agender, demigender, androgyne, multigender,
intersex, polyamorous, queer, maverique, neutrois, multigender, polygender:
by Wuzzy
progress
by Edgy1
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by-sa/3.0/

View file

@ -1,32 +1,93 @@
Pride Flags Mod v1.0
By Leslie E. Krause
Pride Flags Mod v2.2.0
By Leslie E. Krause and Wuzzy
Pride Flags adds a variety of eight animated flags to celebrate pride in Minetest.
Pride Flags adds a variety of animated flags to celebrate Pride in Luanti.
The flags and poles are non-craftable and intended for placement by an administrator in a
conspicuous location, such as atop a building or along a promenade.
This adds two blocks:
/giveme pride_flags:mast_lower
/giveme pride_flags:mast_upper
* Flag Pole: For the lower section
* Flag Pole with Flag: For the top of the flag pole with a flag attached.
Note: It occupies 3 blocks vertically.
By default, a rainbow pride flag will appear when the upper mast is placed. Right-click
the node to select a different flag.
Initially, the rainbow pride flag will appear when the Flag Pole with Flag is placed.
Use the 'place' or 'punch' key while pointing to the flag pole to select a different flag.
There are functions for programmers (see below) to add custom flags as well.
What are pride flags?
---------------------
Pride flags are flags created by LGBTQ+ people to represent themselves.
The rainbow flag is the most well-known flag and is understood as
the symbol for the whole LGBTQ+ community. Additionally, flags for
specific groups (like lesbian, bisexual, trans, etc.), exist, too.
Pride flags can be used by people in that community but also
by people outside of it to show support and acceptance, and to
spread awareness.
List of flags
--------------------
These flags are available:
* Broader community:
* Gay/LGBTQ+ (rainbow flag)
* Progress Pride
* Orientations (sexual, romantic or other)
* Lesbian
* Vincian
* Sexual orientations
* Bisexual
* Pansexual
* Polysexual
* Omnisexual
* Asexual
* Graysexual
* Demisexual
* Romantic orientations
* Homoromantic
* Biromantic
* Polyromantic
* Panromantic
* Omniromantic
* Aromantic
* Grayromantic
* Demiromantic
* Gender-related
* Genderqueer
* Transgender
* Androgyne
* Demigender
* Maverique
* Neutrois
* Multigender
* Polygender
* Pangender
* Agender
* Genderfluid
* Sex-related
* Intersex
* Relationships
* Polyamorous
* Queer
* Queer
API (for programmers)
----------------------
This mod has a few helper functions if you're a programmer and want to interface with it.
You can add custom flags and more. See `API.md` for a list of all functions.
Repository
----------------------
Browse source code...
https://bitbucket.org/sorcerykid/pride_flags
Download archive...
https://bitbucket.org/sorcerykid/pride_flags/get/master.zip
https://bitbucket.org/sorcerykid/pride_flags/get/master.tar.gz
https://codeberg.org/Wuzzy/pride_flags
Compatability
----------------------
Minetest 0.4.15+ required
Luanti/Minetest version 5.4.0 or later required.
(older versions might work, too, but the flag waving sound is buggy)
Installation
----------------------
@ -34,110 +95,17 @@ Installation
1) Unzip the archive into the mods directory of your game.
2) Rename the pride_flags-master directory to "pride_flags".
Source Code License
License/Credits
----------------------------------------------------------
GNU Lesser General Public License v3 (LGPL-3.0)
This mod is free software.
The source code is licensed under the LGPLv3.
The media is licensed under CC BY-SA 3.0.
Copyright (c) 2022, Leslie E. Krause (leslie@searstower.org)
See LICENSE.txt for details and credits.
This program is free software; you can redistribute it and/or modify it under the terms of
the GNU Lesser General Public License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
Translation credits:
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 Lesser General Public License for more details.
http://www.gnu.org/licenses/lgpl-2.1.html
Multimedia License (textures, sounds, and models)
----------------------------------------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
/models/mast_lower.obj
by sorcerykid
/models/mast_upper.obj
by sorcerykid
/models/wavingflag.b3d
by sorcerykid
/textures/default_baremetal.png
by sorcerykid
/textures/prideflag_asexual.png
by sorcerykid
/textures/prideflag_bisexual.png
by sorcerykid
/textures/prideflag_rainbow.png
by sorcerykid
/textures/prideflag_gendercreative.png
by sorcerykid
/textures/prideflag_genderfluid.png
by sorcerykid
/textures/prideflag_genderqueer.png
by sorcerykid
/textures/prideflag_lesbian.png
by sorcerykid
/textures/prideflag_nonbinary.png
by sorcerykid
/textures/prideflag_pansexual.png
by sorcerykid
/textures/prideflag_polysexual.png
by sorcerykid
/textures/prideflag_transgender.png
by sorcerykid
/sounds/flagwave1.ogg
by Chelly01
obtained from https://freesound.org/people/Chelly01/sounds/541088/
modified by sorcerykid
/sounds/flagwave2.ogg
by Chelly01
obtained from https://freesound.org/people/Chelly01/sounds/541088/
modified by sorcerykid
/sounds/flagwave3.ogg
by Chelly01
obtained from https://freesound.org/people/Chelly01/sounds/541088/
modified by sorcerykid
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by-sa/3.0/
* German: Wuzzy
* French: Z-Master
* Spanish: megustanlosfrijoles

650
init.lua
View file

@ -1,52 +1,188 @@
--------------------------------------------------------
-- Minetest :: Pride Flags Mod (pride_flags)
-- Luanti :: Pride Flags Mod (pride_flags)
--
-- See README.txt for licensing and other information.
-- Copyright (c) 2022, Leslie E. Krause
--
-- ./games/minetest_game/mods/pride_flags/init.lua
-- Copyright (c) 2022, Leslie E. Krause and Wuzzy
--------------------------------------------------------
pride_flags = {}
local wind_noise = PerlinNoise( 204, 1, 0, 500 )
-- Check whether the new `get_2d` Perlin function is available,
-- otherwise use `get2d`. Needed to suppress deprecation
-- warning in newer Luanti versions.
local old_get2d = true
if wind_noise.get_2d then
old_get2d = false
end
local active_flags = { }
local pi = math.pi
local rad_180 = pi
local rad_90 = pi / 2
local flag_list = { "rainbow", "lesbian", "bisexual", "transgender", "genderqueer", "nonbinary", "pansexual", "asexual" }
-- This flag is used as the default or fallback in case of error/missing data
local DEFAULT_FLAG = "rainbow"
-- Flag list for the old number-based storing of flags, used up to
-- 8fd4f9661e123bc84c0499c4809537e8aeb24c3b.
-- DO NOT CHANGE THIS LIST!
local legacy_flag_list = {
"rainbow", "lesbian", "bisexual", "transgender", "genderqueer", "nonbinary", "pansexual", "asexual",
"vincian", "polysexual", "omnisexual", "graysexual", "demisexual", "homoromantic", "biromantic",
"polyromantic", "panromantic", "omniromantic", "aromantic", "grayromantic", "demiromantic",
"androgyne", "demigender", "maverique", "neutrois", "multigender", "polygender", "pangender", "agender",
"genderfluid", "intersex", "polyamorous", "queer", "demigirl", "demiboy", "bigender", "trigender",
}
local flag_list = {
-- broader community
"rainbow", -- rainbow flag / LGBTQ+ Pride flag / Gay Pride flag
"progress", -- Progress Pride
-- orientations (general)
"lesbian", "vincian",
-- sexual orientations
"bisexual", "pansexual", "polysexual", "omnisexual", -- m-spec
"asexual", "graysexual", "demisexual", -- a-spec
-- romantic orientations
"homoromantic",
"biromantic", "polyromantic", "panromantic", "omniromantic", -- m-spec
"aromantic", "grayromantic", "demiromantic", -- a-spec
-- gender-related
---- umbrella terms
"transgender", "genderqueer", "nonbinary",
---- identities that refer to 0 or multiple genders
"multigender", "polygender", "pangender",
"agender", "bigender", "trigender",
---- identities that refer to a specific gender
"demigender", "demigirl", "demiboy",
"androgyne", "maverique", "neutrois",
---- genderfluid
"genderfluid",
-- sex-related
"intersex",
-- relationship
"polyamorous",
-- queer
"queer",}
local next_flag, prev_flag
local update_next_prev_flag_lists = function()
next_flag = {}
prev_flag = {}
for f=1, #flag_list do
local name1 = flag_list[f]
local name0, name2
if f < #flag_list then
name2 = flag_list[f+1]
else
name2 = flag_list[1]
end
if f == 1 then
name0 = flag_list[#flag_list]
else
name0 = flag_list[f-1]
end
next_flag[name1] = name2
prev_flag[name1] = name0
end
end
update_next_prev_flag_lists()
local flag_exists = function(flag_name)
return next_flag[ flag_name] ~= nil
end
local get_next_flag = function(current_flag_name)
if not current_flag_name or not flag_exists( current_flag_name ) then
return DEFAULT_FLAG
else
return next_flag[current_flag_name]
end
end
local get_prev_flag = function(current_flag_name)
if not current_flag_name or not flag_exists( current_flag_name ) then
return DEFAULT_FLAG
else
return prev_flag[current_flag_name]
end
end
local S
if minetest.get_translator then
S = minetest.get_translator("pride_flags")
else
S = function(s) return s end
end
-- Delete entity if there is no flag mast node
local delete_if_orphan = function( self )
local pos = self.object:get_pos( )
local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z})
if node.name ~= "pride_flags:upper_mast" and node.name ~= "ignore" then
minetest.log("action", "[pride_flags] Orphan flag entity removed at "..minetest.pos_to_string(pos, 1))
self.object:remove( )
return true
end
return false
end
minetest.register_entity( "pride_flags:wavingflag", {
initial_properties = {
physical = false,
visual = "mesh",
visual_size = { x = 8.5, y = 8.5 },
collisionbox = { -0.1, -0.85, -0.1, 0.1, 0.85, 0.1 },
collisionbox = { 0, 0, 0, 0, 0, 0 },
backface_culling = false,
pointable = false,
mesh = "wavingflag.b3d",
mesh = "pride_flags_wavingflag.b3d",
textures = { "prideflag_rainbow.png" },
use_texture_alpha = false,
},
on_activate = function ( self, staticdata, dtime )
self:reset_animation( math.random( 1, 50 ) ) -- random starting frame to desynchronize multiple flags
if delete_if_orphan( self) then
return
end
-- Init stuff
self:reset_animation( true )
self.object:set_armor_groups( { immortal = 1 } )
if staticdata ~= "" then
local data = minetest.deserialize( staticdata )
self.flag_idx = data.flag_idx
if data.flag_name then
self.flag_name = data.flag_name
else
-- Convert legacy flag number to flag name
local flag_idx = data.flag_idx
self.flag_name = legacy_flag_list[ flag_idx ]
if not self.flag_name then
self.flag_name = DEFAULT_FLAG
end
end
self.node_idx = data.node_idx
if not self.flag_idx or not self.node_idx then
if not self.flag_name or not self.node_idx then
self.object:remove( )
return
end
self:reset_texture( self.flag_idx )
self:reset_texture( self.flag_name )
active_flags[ self.node_idx ] = self.object
else
self.flag_idx = 1
self.flag_name = DEFAULT_FLAG
end
-- Delete entity if there is already one for this pos
local objs = minetest.get_objects_inside_radius( self.object:get_pos(), 0.5 )
for o=1, #objs do
local obj = objs[o]
local lua = obj:get_luaentity( )
if lua and self ~= lua and lua.name == "pride_flags:wavingflag" then
if lua.node_idx == self.node_idx then
self.object:remove( )
return
end
end
end
end,
@ -60,68 +196,91 @@ minetest.register_entity( "pride_flags:wavingflag", {
self.anim_timer = self.anim_timer - dtime
if self.anim_timer <= 0 then
minetest.sound_stop( self.sound_id )
self:reset_animation( 1 )
if delete_if_orphan( self) then
return
end
self:reset_animation( )
end
end,
reset_animation = function ( self, start_frame )
local cur_wind = wind_noise:get2d( { x = os.time( ) % 65535, y = 0 } ) * 30 + 30
print( cur_wind )
reset_animation = function ( self, initial )
local pos = self.object:get_pos( )
local cur_wind = pride_flags.get_wind( pos )
minetest.log("verbose", "[pride_flags] Current wind at "..minetest.pos_to_string(pos, 1)..": " .. cur_wind)
local anim_speed
local wave_sound
if cur_wind < 10 then
anim_speed = 10 -- 2 cycle
wave_sound = "flagwave1"
wave_sound = "pride_flags_flagwave1"
elseif cur_wind < 20 then
anim_speed = 20 -- 4 cycles
wave_sound = "flagwave1"
wave_sound = "pride_flags_flagwave1"
elseif cur_wind < 40 then
anim_speed = 40 -- 8 cycles
wave_sound = "flagwave2"
wave_sound = "pride_flags_flagwave2"
else
anim_speed = 80 -- 16 cycles
wave_sound = "flagwave3"
wave_sound = "pride_flags_flagwave3"
end
-- slightly anim_speed change to desyncronize flag waving
anim_speed = anim_speed + math.random(0, 200) * 0.01
if self.object then
self.object:set_animation( { x = start_frame, y = 575 }, anim_speed, 0, true )
if initial or (not self.object.set_animation_frame_speed) then
self.object:set_animation( { x = 1, y = 575 }, anim_speed, 0, true )
else
self.object:set_animation_frame_speed(anim_speed)
end
end
if not self.sound_id then
self.sound_id = minetest.sound_play( wave_sound, { object = self.object, gain = 1.0, loop = true } )
end
self.anim_timer = ( 576 - start_frame ) / 5 -- default to 115 seconds to reset animation
self.anim_timer = 115 + math.random(-10, 10) -- time to reset animation
end,
reset_texture = function ( self, flag_idx )
if not flag_idx then
self.flag_idx = self.flag_idx % #flag_list + 1 -- this automatically increments
reset_texture = function ( self, flag_name, nextprev )
if nextprev == 1 then
self.flag_name = get_next_flag(self.flag_name)
elseif nextprev == -1 then
self.flag_name = get_prev_flag(self.flag_name)
else
self.flag_idx = flag_idx
self.flag_name = flag_name
end
local texture = string.format( "prideflag_%s.png", flag_list[ self.flag_idx ] )
local texture = string.format( "prideflag_%s.png", self.flag_name )
self.object:set_properties( { textures = { texture } } )
return self.flag_name
end,
get_staticdata = function ( self )
return minetest.serialize( {
node_idx = self.node_idx,
flag_idx = self.flag_idx,
flag_name = self.flag_name,
} )
end,
} )
local metal_sounds
if minetest.get_modpath("default") ~= nil then
if default.node_sound_metal_defaults then
metal_sounds = default.node_sound_metal_defaults()
end
end
minetest.register_node( "pride_flags:lower_mast", {
description = "Flag Pole",
description = S("Flag Pole"),
drawtype = "mesh",
paramtype = "light",
mesh = "mast_lower.obj",
mesh = "pride_flags_mast_lower.obj",
paramtype2 = "facedir",
groups = { cracky = 2, post = 1 },
tiles = { "default_baremetal.png", "default_baremetal.png" },
groups = { cracky = 1, level = 2 },
--sounds = default.node_sound_metal_defaults( ),
tiles = { "pride_flags_baremetal.png", "pride_flags_baremetal.png" },
wield_image = "pride_flags_pole_bottom_inv.png",
inventory_image = "pride_flags_pole_bottom_inv.png",
groups = { cracky = 2 },
sounds = metal_sounds,
is_ground_content = false,
selection_box = {
type = "fixed",
@ -131,18 +290,117 @@ minetest.register_node( "pride_flags:lower_mast", {
type = "fixed",
fixed = { { -3/32, -1/2, -3/32, 3/32, 1/2, 3/32 } },
},
on_rotate = function(pos, node, user, mode, new_param2)
if mode == screwdriver.ROTATE_AXIS then
return false
end
end,
} )
local function get_flag_pos( pos, param2 )
local facedir_to_pos = {
[0] = { x = 0, y = 0.6, z = -0.1 },
[1] = { x = -0.1, y = 0.6, z = 0 },
[2] = { x = 0, y = 0.6, z = 0.1 },
[3] = { x = 0.1, y = 0.6, z = 0 },
}
return vector.add( pos, vector.multiply( facedir_to_pos[ param2 ], 1 ) )
end
local function rotate_flag_by_param2( flag, param2 )
local facedir_to_yaw = {
[0] = rad_90,
[1] = 0,
[2] = -rad_90,
[3] = rad_180,
}
local baseyaw = facedir_to_yaw[ param2 ]
if not baseyaw then
minetest.log("warning", "[pride_flags] Unsupported flag pole node param2: "..tostring(param2))
return
end
flag:set_yaw( baseyaw - rad_180 )
end
local function spawn_flag( pos )
local node_idx = minetest.hash_node_position( pos )
local param2 = minetest.get_node( pos ).param2
local flag_pos = get_flag_pos( pos, param2 )
local obj = minetest.add_entity( flag_pos, "pride_flags:wavingflag" )
if not obj or not obj:get_luaentity( ) then
return
end
obj:get_luaentity( ).node_idx = node_idx
rotate_flag_by_param2( obj, param2 )
active_flags[ node_idx ] = obj
return obj
end
local function spawn_flag_and_set_texture( pos )
local flag = spawn_flag( pos )
if flag and flag:get_luaentity() then
local meta = minetest.get_meta( pos )
local flag_name = meta:get_string("flag_name")
if flag_name == "" then
-- Convert legacy flag number to flag name
local flag_idx = meta:get_int("flag_idx")
flag_name = legacy_flag_list[flag_idx]
if not flag_name then
flag_name = DEFAULT_FLAG
end
meta:set_string("flag_idx", "")
meta:set_string("flag_name", flag_name)
end
flag:get_luaentity():reset_texture( flag_name )
end
return flag
end
local function cycle_flag( pos, player, cycle_backwards )
local pname = player:get_player_name( )
if minetest.is_protected( pos, pname ) and not
minetest.check_player_privs( pname, "protection_bypass") then
minetest.record_protection_violation( pos, pname )
return
end
local node_idx = minetest.hash_node_position( pos )
local aflag = active_flags[ node_idx ]
local flag
if aflag then
flag = aflag:get_luaentity( )
end
if flag then
local flag_name
if cycle_backwards then
flag_name = flag:reset_texture( nil, -1 )
else
flag_name = flag:reset_texture( nil, 1 )
end
local meta = minetest.get_meta( pos )
meta:set_string("flag_name", flag_name)
else
spawn_flag_and_set_texture( pos )
end
end
minetest.register_node( "pride_flags:upper_mast", {
description = "Flag Pole",
description = S("Flag Pole with Flag"),
drawtype = "mesh",
paramtype = "light",
mesh = "mast_upper.obj",
mesh = "pride_flags_mast_upper.obj",
paramtype2 = "facedir",
tiles = { "pride_flags_baremetal.png", "pride_flags_baremetal.png" },
wield_image = "pride_flags_pole_top_inv.png",
inventory_image = "pride_flags_pole_top_inv.png",
groups = { cracky = 2 },
tiles = { "default_baremetal.png", "default_baremetal.png" },
groups = { cracky = 1, level = 2 },
--sounds = default.node_sound_metal_defaults( ),
sounds = metal_sounds,
is_ground_content = false,
selection_box = {
type = "fixed",
@ -150,40 +408,96 @@ minetest.register_node( "pride_flags:upper_mast", {
},
collision_box = {
type = "fixed",
fixed = { { -3/32, -1/2, -3/32, 3/32, 27/16, 3/32 } },
fixed = { { -3/32, -1/2, -3/32, 3/32, 1/2, 3/32 } },
},
on_rightclick = function ( pos, node, player )
local node_idx = minetest.hash_node_position( pos )
cycle_flag( pos, player )
end,
if minetest.check_player_privs( player:get_player_name( ), "server" ) then
active_flags[ node_idx ]:get_luaentity( ):reset_texture( )
on_punch = function ( pos, node, player )
cycle_flag( pos, player, -1 )
end,
node_placement_prediction = "",
on_place = function( itemstack, placer, pointed_thing )
if pointed_thing.type ~= "node" then
return itemstack
end
local node = minetest.get_node(pointed_thing.under)
local pdef = minetest.registered_nodes[node.name]
if pdef and pdef.on_rightclick and
not placer:get_player_control().sneak then
return pdef.on_rightclick(pointed_thing.under,
node, placer, itemstack, pointed_thing)
end
local pos
if pdef and pdef.buildable_to then
pos = pointed_thing.under
else
pos = pointed_thing.above
node = minetest.get_node(pos)
pdef = minetest.registered_nodes[node.name]
if not pdef or not pdef.buildable_to then
return itemstack
end
end
local above1 = {x = pos.x, y = pos.y + 1, z = pos.z}
local above2 = {x = pos.x, y = pos.y + 2, z = pos.z}
local anode1 = minetest.get_node_or_nil(above1)
local anode2 = minetest.get_node_or_nil(above2)
local adef1 = anode1 and minetest.registered_nodes[anode1.name]
local adef2 = anode2 and minetest.registered_nodes[anode2.name]
-- Don't build if upper nodes are blocked, unless it's a hidden node
if not adef1 or (not adef1.buildable_to and anode1.name ~= "pride_flags:upper_mast_hidden_1") then
return itemstack
end
if not adef2 or (not adef2.buildable_to and anode2.name ~= "pride_flags:upper_mast_hidden_2") then
return itemstack
end
local pn = placer:get_player_name()
if minetest.is_protected(pos, pn) then
minetest.record_protection_violation(pos, pn)
return itemstack
elseif minetest.is_protected(above1, pn) then
minetest.record_protection_violation(above1, pn)
return itemstack
elseif minetest.is_protected(above2, pn) then
minetest.record_protection_violation(above2, pn)
return itemstack
end
local yaw = placer:get_look_horizontal( )
local dir = minetest.yaw_to_dir( yaw )
local param2 = (minetest.dir_to_facedir( dir ) + 3) % 4
minetest.set_node(pos, {name = "pride_flags:upper_mast", param2 = param2 })
minetest.set_node(above1, {name = "pride_flags:upper_mast_hidden_1"})
minetest.set_node(above2, {name = "pride_flags:upper_mast_hidden_2"})
if not (minetest.is_creative_enabled(pn)) then
itemstack:take_item()
end
local def = minetest.registered_nodes["pride_flags:upper_mast"]
if def and def.sounds then
minetest.sound_play(def.sounds.place, {pos = pos}, true)
end
return itemstack
end,
on_construct = function ( pos )
local node_idx = minetest.hash_node_position( pos )
local param2 = minetest.get_node( pos ).param2
local facedir_to_pos = {
[0] = { x = 0, y = 0.6, z = -0.1 },
[1] = { x = -0.1, y = 0.6, z = 0 },
[2] = { x = 0, y = 0.6, z = 0.1 },
[3] = { x = 0.1, y = 0.6, z = 0 },
}
local facedir_to_yaw = {
[0] = rad_90,
[1] = 0,
[2] = -rad_90,
[3] = rad_180,
}
local flag_pos = vector.add( pos, vector.multiply( facedir_to_pos[ param2 ], 1 ) )
local obj = minetest.add_entity( flag_pos, "pride_flags:wavingflag" )
obj:get_luaentity( ).node_idx = node_idx
obj:set_yaw( facedir_to_yaw[ param2 ] - rad_180 )
active_flags[ node_idx ] = obj
local flag = spawn_flag ( pos )
if flag and flag:get_luaentity() then
local meta = minetest.get_meta( pos )
meta:set_string("flag_name", flag:get_luaentity().flag_name)
end
end,
on_destruct = function ( pos )
@ -192,4 +506,208 @@ minetest.register_node( "pride_flags:upper_mast", {
active_flags[ node_idx ]:remove( )
end
end,
after_destruct = function( pos )
local above1 = {x=pos.x, y=pos.y+1, z=pos.z}
local above2 = {x=pos.x, y=pos.y+2, z=pos.z}
if minetest.get_node( above1 ).name == "pride_flags:upper_mast_hidden_1" then
minetest.remove_node( above1 )
end
if minetest.get_node( above2 ).name == "pride_flags:upper_mast_hidden_2" then
minetest.remove_node( above2 )
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
if mode == screwdriver.ROTATE_AXIS then
return false
end
local node_idx = minetest.hash_node_position( pos )
local aflag = active_flags[ node_idx ]
if aflag then
local lua = aflag:get_luaentity( )
if not lua then
aflag = spawn_flag_and_set_texture( pos )
if aflag then
lua = aflag:get_luaentity()
if not lua then
return
end
end
end
local flag_pos_idx = lua.node_idx
local flag_pos = minetest.get_position_from_hash( flag_pos_idx )
flag_pos = get_flag_pos( flag_pos, new_param2 )
rotate_flag_by_param2( aflag, new_param2 )
aflag:set_pos( flag_pos )
end
end,
} )
minetest.register_lbm({
name = "pride_flags:respawn_flags",
label = "Respawn flags",
nodenames = {"pride_flags:upper_mast"},
run_at_every_load = true,
action = function(pos, node)
local node_idx = minetest.hash_node_position( pos )
local aflag = active_flags[ node_idx ]
if aflag then
return
end
spawn_flag_and_set_texture( pos )
end
})
minetest.register_lbm({
name = "pride_flags:update_node_meta",
label = "Update mast node meta",
nodenames = {"pride_flags:upper_mast"},
run_at_every_load = false,
action = function(pos, node)
local meta = minetest.get_meta( pos )
local flag_idx = meta:get_int("flag_idx")
if flag_idx ~= 0 then
local flag_name = legacy_flag_list[ flag_idx ]
if not flag_name then
flag_name = DEFAULT_FLAG
end
meta:set_string("flag_idx", "")
meta:set_string("flag_name", flag_name)
end
end
})
if minetest.get_modpath("default") then
minetest.register_craft({
output = "pride_flags:lower_mast 6",
recipe = {
{"default:steel_ingot"},
{"default:steel_ingot"},
{"default:steel_ingot"},
},
})
end
minetest.register_craft({
output = "pride_flags:upper_mast",
recipe = {
{"pride_flags:lower_mast", "group:wool", "group:wool"},
{"pride_flags:lower_mast", "group:wool", "group:wool"},
},
})
-- Add 2 hidden upper mast segments to block all the nodes
-- the upper mast occupies. This is also needed to prevent
-- collision issues with overhigh nodes.
-- These nodes will be automatically
-- added/removed when the upper mast is constructed
-- or destructed.
minetest.register_node( "pride_flags:upper_mast_hidden_1", {
drawtype = "airlike",
pointable = false,
paramtype = "light",
sunlight_propagates = true,
wield_image = "pride_flags_pole_hidden1_inv.png",
inventory_image = "pride_flags_pole_hidden1_inv.png",
groups = { not_in_creative_inventory = 1 },
sounds = metal_sounds,
collision_box = {
type = "fixed",
fixed = { { -3/32, -1/2, -3/32, 3/32, 1/5, 3/32 } },
},
is_ground_content = false,
on_blast = function() end,
can_dig = function() return false end,
drop = "",
diggable = false,
floodable = false,
})
minetest.register_node( "pride_flags:upper_mast_hidden_2", {
drawtype = "airlike",
pointable = false,
paramtype = "light",
sunlight_propagates = true,
wield_image = "pride_flags_pole_hidden2_inv.png",
inventory_image = "pride_flags_pole_hidden2_inv.png",
groups = { not_in_creative_inventory = 1 },
sounds = metal_sounds,
collision_box = {
type = "fixed",
fixed = { { -3/32, -1/2, -3/32, 3/32, -5/16, 3/32 } },
},
is_ground_content = false,
on_blast = function() end,
can_dig = function() return false end,
drop = "",
diggable = false,
floodable = false,
})
-- API
pride_flags.add_flag = function( name )
if flag_exists( name ) then
return false
end
table.insert( flag_list, name )
update_next_prev_flag_lists()
return true
end
pride_flags.get_flags = function( )
return table.copy( flag_list )
end
pride_flags.set_flag_at = function( pos, flag_name )
local node = minetest.get_node( pos )
if node.name ~= "pride_flags:upper_mast" then
return false
end
if not flag_exists( flag_name ) then
return false
end
local node_idx = minetest.hash_node_position( pos )
local aflag = active_flags[ node_idx ]
local flag
if aflag then
flag = aflag:get_luaentity( )
end
if flag then
local set_flag_name = flag:reset_texture( flag_name )
if set_flag_name == flag_name then
local meta = minetest.get_meta( pos )
meta:set_string("flag_name", flag_name)
return true
end
end
return false
end
pride_flags.get_flag_at = function( pos )
local node = minetest.get_node( pos )
if node.name ~= "pride_flags:upper_mast" then
return nil
end
local meta = minetest.get_meta( pos )
local flag_name = meta:get_string("flag_name")
if flag_name ~= "" then
return flag_name
end
end
-- Returns the wind strength at pos.
-- Can be overwritten by mods.
pride_flags.get_wind = function( pos )
-- The default wind function ignores pos.
-- Returns a wind between ca. 0 and 55
local coords = { x = os.time( ) % 65535, y = 0 }
local cur_wind
if old_get2d then
cur_wind = wind_noise:get2d(coords)
else
cur_wind = wind_noise:get_2d(coords)
end
cur_wind = cur_wind * 30 + 30
return cur_wind
end

5
locale/pride_flags.de.tr Normal file
View file

@ -0,0 +1,5 @@
# textdomain:pride_flags
Pride Flags=Pride-Flaggen
Adds a variety of animated flags to celebrate Pride.=Fügt eine Reihe an animierten Flaggen hinzu, um Pride (LGBTQ+) zu feiern.
Flag Pole=Flaggenmast
Flag Pole with Flag=Flaggenmast mit Flagge

5
locale/pride_flags.es.tr Normal file
View file

@ -0,0 +1,5 @@
# textdomain:pride_flags
Pride Flags=Banderas del orgullo
Adds a variety of animated flags to celebrate Pride.=Añade una variedad de banderas animadas para celebrar el orgullo
Flag Pole=Asta
Flag Pole with Flag=Asta con bandera

5
locale/pride_flags.fr.tr Normal file
View file

@ -0,0 +1,5 @@
# textdomain: pride_flags
Pride Flags=
Adds a variety of animated flags to celebrate Pride.=
Flag Pole=Mât
Flag Pole with Flag=Mât avec drapeau

5
locale/template.txt Normal file
View file

@ -0,0 +1,5 @@
# textdomain:pride_flags
Pride Flags=
Adds a variety of animated flags to celebrate Pride.=
Flag Pole=
Flag Pole with Flag=

View file

@ -1,5 +1,5 @@
name = pride_flags
title = Pride Flags
author = sorcerykid
license = LGPL-3.0
author = sorcerykid, Wuzzy
optional_depends = default, screwdriver
description = Adds a variety of animated flags to celebrate Pride.

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 B

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 B

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 B

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 B

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 725 B

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 709 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B