Store flags by flag name, not flag number

This commit is contained in:
Wuzzy 2022-07-26 16:11:44 +02:00
parent 8fd4f9661e
commit bbb59d9dce

158
init.lua
View file

@ -19,34 +19,80 @@ local pi = math.pi
local rad_180 = pi local rad_180 = pi
local rad_90 = pi / 2 local rad_90 = pi / 2
-- List of flags -- This flag is used as the default or fallback in case of error/missing data
-- !!! IMPORTANT !!! local DEFAULT_FLAG = "rainbow"
-- !!! Always append new flags to the end to ensure backwards-compability.
local flag_list = {
-- original flags (from first version)
"rainbow", "lesbian", "bisexual", "transgender", "genderqueer", "nonbinary", "pansexual", "asexual",
-- sexual orientation -- Flag list for the old number-based storing of flags, used up to
"vincian", -- 8fd4f9661e123bc84c0499c4809537e8aeb24c3b. Do not change this list!
"polysexual", "omnisexual", local legacy_flag_list = {
"graysexual", "demisexual", "rainbow", "lesbian", "bisexual", "transgender", "genderqueer", "nonbinary", "pansexual", "asexual",
-- romantic orientation "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 = {
-- rainbow flag / LGBT+ Pride flag / Gay Pride flag
"rainbow",
-- orientations (general)
"lesbian", "vincian",
-- sexual orientations
"bisexual", "pansexual", "polysexual", "omnisexual", -- m-spec
"asexual", "graysexual", "demisexual", -- a-spec
-- romantic orientations
"homoromantic", "homoromantic",
"biromantic", "polyromantic", "panromantic", "omniromantic", "biromantic", "polyromantic", "panromantic", "omniromantic", -- m-spec
"aromantic", "grayromantic", "demiromantic", "aromantic", "grayromantic", "demiromantic", -- a-spec
-- gender-related -- gender-related
"androgyne", "demigender", "maverique", "neutrois", ---- umbrella terms
"multigender", "polygender", "pangender", "agender", "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", "genderfluid",
-- intersex -- sex-related
"intersex", "intersex",
-- relationship -- relationship
"polyamorous", "polyamorous",
-- queer -- queer
"queer", "queer",}
-- more genders
"demigirl", "demiboy", "bigender", "trigender", local next_flag = {}
} local 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
local get_next_flag = function(current_flag_name)
if not 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 then
return DEFAULT_FLAG
else
return prev_flag[current_flag_name]
end
end
local S local S
if minetest.get_translator then if minetest.get_translator then
@ -74,19 +120,28 @@ minetest.register_entity( "pride_flags:wavingflag", {
if staticdata ~= "" then if staticdata ~= "" then
local data = minetest.deserialize( staticdata ) 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 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( ) self.object:remove( )
return return
end end
self:reset_texture( self.flag_idx ) self:reset_texture( self.flag_name )
active_flags[ self.node_idx ] = self.object active_flags[ self.node_idx ] = self.object
else else
self.flag_idx = 1 self.flag_name = DEFAULT_FLAG
end end
-- Delete entity if there is already one for this pos -- Delete entity if there is already one for this pos
@ -163,35 +218,24 @@ minetest.register_entity( "pride_flags:wavingflag", {
self.anim_timer = 115 + math.random(-10, 10) -- time to reset animation self.anim_timer = 115 + math.random(-10, 10) -- time to reset animation
end, end,
reset_texture = function ( self, flag_idx ) reset_texture = function ( self, flag_name, nextprev )
if not flag_idx then if nextprev == 1 then
-- next flag self.flag_name = get_next_flag(self.flag_name)
self.flag_idx = self.flag_idx % #flag_list + 1 -- this automatically increments elseif nextprev == -1 then
elseif flag_idx == -1 then self.flag_name = get_prev_flag(self.flag_name)
-- previous flag
self.flag_idx = self.flag_idx - 1
if self.flag_idx < 1 then
self.flag_idx = #flag_list
end
else else
-- set flag directly self.flag_name = flag_name
self.flag_idx = flag_idx
end end
-- Fallback flag local texture = string.format( "prideflag_%s.png", self.flag_name )
if not flag_list[ self.flag_idx ] then
self.flag_idx = 1
end
local texture = string.format( "prideflag_%s.png", flag_list[ self.flag_idx ] )
self.object:set_properties( { textures = { texture } } ) self.object:set_properties( { textures = { texture } } )
return self.flag_idx return self.flag_name
end, end,
get_staticdata = function ( self ) get_staticdata = function ( self )
return minetest.serialize( { return minetest.serialize( {
node_idx = self.node_idx, node_idx = self.node_idx,
flag_idx = self.flag_idx, flag_name = self.flag_name,
} ) } )
end, end,
} ) } )
@ -278,15 +322,25 @@ local function spawn_flag_and_set_texture( pos )
local flag = spawn_flag( pos ) local flag = spawn_flag( pos )
if flag and flag:get_luaentity() then if flag and flag:get_luaentity() then
local meta = minetest.get_meta( pos ) local meta = minetest.get_meta( pos )
local flag_idx = meta:get_int("flag_idx") local flag_name = meta:get_string("flag_name")
flag:get_luaentity():reset_texture( flag_idx ) 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 end
return flag return flag
end end
local function cycle_flag( pos, player, cycle_backwards ) local function cycle_flag( pos, player, cycle_backwards )
local pname = player:get_player_name( ) local pname = player:get_player_name( )
if minetest.is_protected( pos, pname ) and not if minetest.is_protected( pos, pname ) and not
minetest.check_player_privs( pname, "protection_bypass") then minetest.check_player_privs( pname, "protection_bypass") then
minetest.register_protection_violation( pos, pname ) minetest.register_protection_violation( pos, pname )
return return
@ -300,14 +354,14 @@ local function cycle_flag( pos, player, cycle_backwards )
flag = aflag:get_luaentity( ) flag = aflag:get_luaentity( )
end end
if flag then if flag then
local flag_idx local flag_name
if cycle_backwards then if cycle_backwards then
flag_idx = flag:reset_texture( -1 ) flag_name = flag:reset_texture( nil, -1 )
else else
flag_idx = flag:reset_texture( ) flag_name = flag:reset_texture( nil, 1 )
end end
local meta = minetest.get_meta( pos ) local meta = minetest.get_meta( pos )
meta:set_int("flag_idx", flag_idx) meta:set_string("flag_name", flag_name)
else else
spawn_flag_and_set_texture( pos ) spawn_flag_and_set_texture( pos )
end end
@ -418,7 +472,7 @@ minetest.register_node( "pride_flags:upper_mast", {
local flag = spawn_flag ( pos ) local flag = spawn_flag ( pos )
if flag and flag:get_luaentity() then if flag and flag:get_luaentity() then
local meta = minetest.get_meta( pos ) local meta = minetest.get_meta( pos )
meta:set_int("flag_idx", flag:get_luaentity().flag_idx) meta:set_string("flag_name", flag:get_luaentity().flag_name)
end end
end, end,