commit 30d67005920d3e95bad074445b72a4f8c9a45f2a Author: Leslie Krause Date: Sat Jun 25 18:31:57 2022 -0400 Build 01 - initial beta version diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..c2f1251 --- /dev/null +++ b/README.txt @@ -0,0 +1,143 @@ +Pride Flags Mod v1.0 +By Leslie E. Krause + +Pride Flags adds a variety of eight animated flags to celebrate pride in Minetest. + +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. + + /giveme pride_flags:mast_lower + /giveme pride_flags:mast_upper + +By default, a rainbow pride flag will appear when the upper mast is placed. Right-click +the node to select a different flag. + + +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 + +Compatability +---------------------- + +Minetest 0.4.15+ required + +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 +---------------------------------------------------------- + +GNU Lesser General Public License v3 (LGPL-3.0) + +Copyright (c) 2022, Leslie E. Krause (leslie@searstower.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-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/ diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..becbe53 --- /dev/null +++ b/init.lua @@ -0,0 +1,195 @@ +-------------------------------------------------------- +-- Minetest :: 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 +-------------------------------------------------------- + +local wind_noise = PerlinNoise( 204, 1, 0, 500 ) +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" } + +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 }, + backface_culling = false, + pointable = false, + mesh = "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 + self.object:set_armor_groups( { immortal = 1 } ) + + if staticdata ~= "" then + local data = minetest.deserialize( staticdata ) + self.flag_idx = data.flag_idx + self.node_idx = data.node_idx + + if not self.flag_idx or not self.node_idx then + self.object:remove( ) + return + end + self:reset_texture( self.flag_idx ) + + active_flags[ self.node_idx ] = self.object + else + self.flag_idx = 1 + end + end, + + on_deactivate = function ( self ) + if self.sound_id then + minetest.sound_stop( self.sound_id ) + end + end, + + on_step = function ( self, dtime ) + self.anim_timer = self.anim_timer - dtime + + if self.anim_timer <= 0 then + minetest.sound_stop( self.sound_id ) + self:reset_animation( 1 ) + 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 ) + local anim_speed + local wave_sound + + if cur_wind < 10 then + anim_speed = 10 -- 2 cycle + wave_sound = "flagwave1" + elseif cur_wind < 20 then + anim_speed = 20 -- 4 cycles + wave_sound = "flagwave1" + elseif cur_wind < 40 then + anim_speed = 40 -- 8 cycles + wave_sound = "flagwave2" + else + anim_speed = 80 -- 16 cycles + wave_sound = "flagwave3" + end + + if self.object then + self.object:set_animation( { x = start_frame, y = 575 }, anim_speed, 0, true ) + 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 + end, + + reset_texture = function ( self, flag_idx ) + if not flag_idx then + self.flag_idx = self.flag_idx % #flag_list + 1 -- this automatically increments + else + self.flag_idx = flag_idx + end + + local texture = string.format( "prideflag_%s.png", flag_list[ self.flag_idx ] ) + self.object:set_properties( { textures = { texture } } ) + end, + + get_staticdata = function ( self ) + return minetest.serialize( { + node_idx = self.node_idx, + flag_idx = self.flag_idx, + } ) + end, +} ) + +minetest.register_node( "pride_flags:lower_mast", { + description = "Flag Pole", + drawtype = "mesh", + paramtype = "light", + mesh = "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( ), + + selection_box = { + type = "fixed", + fixed = { { -3/32, -1/2, -3/32, 3/32, 1/2, 3/32 } }, + }, + collision_box = { + type = "fixed", + fixed = { { -3/32, -1/2, -3/32, 3/32, 1/2, 3/32 } }, + }, +} ) + +minetest.register_node( "pride_flags:upper_mast", { + description = "Flag Pole", + drawtype = "mesh", + paramtype = "light", + mesh = "mast_upper.obj", + paramtype2 = "facedir", + groups = { cracky = 2 }, + tiles = { "default_baremetal.png", "default_baremetal.png" }, + groups = { cracky = 1, level = 2 }, + --sounds = default.node_sound_metal_defaults( ), + + selection_box = { + type = "fixed", + fixed = { { -3/32, -1/2, -3/32, 3/32, 27/16, 3/32 } }, + }, + collision_box = { + type = "fixed", + fixed = { { -3/32, -1/2, -3/32, 3/32, 27/16, 3/32 } }, + }, + + on_rightclick = function ( pos, node, player ) + local node_idx = minetest.hash_node_position( pos ) + + if minetest.check_player_privs( player:get_player_name( ), "server" ) then + active_flags[ node_idx ]:get_luaentity( ):reset_texture( ) + end + 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 + end, + + on_destruct = function ( pos ) + local node_idx = minetest.hash_node_position( pos ) + if active_flags[ node_idx ] then + active_flags[ node_idx ]:remove( ) + end + end, +} ) diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..6a12099 --- /dev/null +++ b/mod.conf @@ -0,0 +1,5 @@ +name = pride_flags +title = Pride Flags +author = sorcerykid +license = LGPL-3.0 + diff --git a/models/mast_lower.obj b/models/mast_lower.obj new file mode 100644 index 0000000..8f0a172 --- /dev/null +++ b/models/mast_lower.obj @@ -0,0 +1,144 @@ +# Made in Blockbench 4.1.4 +mtllib mast_lower.mtl + +o cube +v 0.09375 0.5 0.046875 +v 0.09375 0.5 -0.046875 +v 0.09375 -0.5 0.046875 +v 0.09375 -0.5 -0.046875 +v 0.046875 0.5 -0.046875 +v 0.046875 0.5 0.046875 +v 0.046875 -0.5 -0.046875 +v 0.046875 -0.5 0.046875 +vt 0 1 +vt 0.25 1 +vt 0.25 0 +vt 0 0 +vt 0.25 1 +vt 0.375 1 +vt 0.375 0 +vt 0.25 0 +vt 0.75 1 +vt 1 1 +vt 1 0 +vt 0.75 0 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0 +vt 0.625 0 +vt 0.375 0.6875 +vt 0.625 0.6875 +vt 0.625 0.5625 +vt 0.375 0.5625 +vt 0.375 0.4375 +vt 0.625 0.4375 +vt 0.625 0.3125 +vt 0.375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +usemtl m_1 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o cube +v 0.046875 0.5 0.09375 +v 0.046875 0.5 -0.09375 +v 0.046875 -0.5 0.09375 +v 0.046875 -0.5 -0.09375 +v -0.046875 0.5 -0.09375 +v -0.046875 0.5 0.09375 +v -0.046875 -0.5 -0.09375 +v -0.046875 -0.5 0.09375 +vt 0 1 +vt 0.125 1 +vt 0.125 0 +vt 0 0 +vt 0.5625 1 +vt 0.625 1 +vt 0.625 0 +vt 0.5625 0 +vt 0.625 1 +vt 1 1 +vt 1 0 +vt 0.625 0 +vt 0.375 1 +vt 0.4375 1 +vt 0.4375 0 +vt 0.375 0 +vt 0.4375 0.25 +vt 0.5625 0.25 +vt 0.5625 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.375 +vt 0.5625 0.375 +vt 0.5625 0.3125 +vt 0.4375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +usemtl m_1 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o cube +v -0.046875 0.5 0.046875 +v -0.046875 0.5 -0.046875 +v -0.046875 -0.5 0.046875 +v -0.046875 -0.5 -0.046875 +v -0.09375 0.5 -0.046875 +v -0.09375 0.5 0.046875 +v -0.09375 -0.5 -0.046875 +v -0.09375 -0.5 0.046875 +vt 0 1 +vt 0.25 1 +vt 0.25 0 +vt 0 0 +vt 0.25 1 +vt 0.375 1 +vt 0.375 0 +vt 0.25 0 +vt 0.75 1 +vt 1 1 +vt 1 0 +vt 0.75 0 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0 +vt 0.625 0 +vt 0.375 0.6875 +vt 0.625 0.6875 +vt 0.625 0.5625 +vt 0.375 0.5625 +vt 0.375 0.4375 +vt 0.625 0.4375 +vt 0.625 0.3125 +vt 0.375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +usemtl m_1 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 \ No newline at end of file diff --git a/models/mast_upper.obj b/models/mast_upper.obj new file mode 100644 index 0000000..91cfdbb --- /dev/null +++ b/models/mast_upper.obj @@ -0,0 +1,379 @@ +# Made in Blockbench 4.1.4 +mtllib mast_upper.mtl + +o cube +v 0.09375 0.5 0.046875 +v 0.09375 0.5 -0.046875 +v 0.09375 -0.5 0.046875 +v 0.09375 -0.5 -0.046875 +v 0.046875 0.5 -0.046875 +v 0.046875 0.5 0.046875 +v 0.046875 -0.5 -0.046875 +v 0.046875 -0.5 0.046875 +vt 0.0625 1 +vt 0.125 1 +vt 0.125 0 +vt 0.0625 0 +vt 0.25 1 +vt 0.375 1 +vt 0.375 0 +vt 0.25 0 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0 +vt 0.875 0 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0 +vt 0.625 0 +vt 0.375 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.5625 +vt 0.375 0.5625 +vt 0.375 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.3125 +vt 0.375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +usemtl m_1 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o cube +v 0.046875 0.5 0.09375 +v 0.046875 0.5 -0.09375 +v 0.046875 -0.5 0.09375 +v 0.046875 -0.5 -0.09375 +v -0.046875 0.5 -0.09375 +v -0.046875 0.5 0.09375 +v -0.046875 -0.5 -0.09375 +v -0.046875 -0.5 0.09375 +vt 0 1 +vt 0.125 1 +vt 0.125 0 +vt 0 0 +vt 0.5625 1 +vt 0.625 1 +vt 0.625 0 +vt 0.5625 0 +vt 0.875 1 +vt 1 1 +vt 1 0 +vt 0.875 0 +vt 0.375 1 +vt 0.4375 1 +vt 0.4375 0 +vt 0.375 0 +vt 0.4375 0.75 +vt 0.5625 0.75 +vt 0.5625 0.5 +vt 0.4375 0.5 +vt 0.4375 0.5 +vt 0.5625 0.5 +vt 0.5625 0.25 +vt 0.4375 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +usemtl m_1 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o cube +v -0.046875 0.5 0.046875 +v -0.046875 0.5 -0.046875 +v -0.046875 -0.5 0.046875 +v -0.046875 -0.5 -0.046875 +v -0.09375 0.5 -0.046875 +v -0.09375 0.5 0.046875 +v -0.09375 -0.5 -0.046875 +v -0.09375 -0.5 0.046875 +vt 0.0625 1 +vt 0.125 1 +vt 0.125 0 +vt 0.0625 0 +vt 0.25 1 +vt 0.375 1 +vt 0.375 0 +vt 0.25 0 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0 +vt 0.875 0 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0 +vt 0.625 0 +vt 0.5625 0.6875 +vt 0.625 0.6875 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.4375 +vt 0.625 0.4375 +vt 0.625 0.3125 +vt 0.5625 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +usemtl m_1 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o cube +v -0.046875 1.5 0.046875 +v -0.046875 1.5 -0.046875 +v -0.046875 0.5 0.046875 +v -0.046875 0.5 -0.046875 +v -0.09375 1.5 -0.046875 +v -0.09375 1.5 0.046875 +v -0.09375 0.5 -0.046875 +v -0.09375 0.5 0.046875 +vt 0.0625 1 +vt 0.125 1 +vt 0.125 0 +vt 0.0625 0 +vt 0.25 1 +vt 0.375 1 +vt 0.375 0 +vt 0.25 0 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0 +vt 0.875 0 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0 +vt 0.625 0 +vt 0.5625 0.6875 +vt 0.625 0.6875 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.4375 +vt 0.625 0.4375 +vt 0.625 0.3125 +vt 0.5625 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +usemtl m_1 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o cube +v 0.09375 1.5 0.046875 +v 0.09375 1.5 -0.046875 +v 0.09375 0.5 0.046875 +v 0.09375 0.5 -0.046875 +v 0.046875 1.5 -0.046875 +v 0.046875 1.5 0.046875 +v 0.046875 0.5 -0.046875 +v 0.046875 0.5 0.046875 +vt 0.0625 1 +vt 0.125 1 +vt 0.125 0 +vt 0.0625 0 +vt 0.25 1 +vt 0.375 1 +vt 0.375 0 +vt 0.25 0 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0 +vt 0.875 0 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0 +vt 0.625 0 +vt 0.375 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.5625 +vt 0.375 0.5625 +vt 0.375 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.3125 +vt 0.375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +usemtl m_1 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o cube +v 0.046875 1.5 0.09375 +v 0.046875 1.5 -0.09375 +v 0.046875 0.5 0.09375 +v 0.046875 0.5 -0.09375 +v -0.046875 1.5 -0.09375 +v -0.046875 1.5 0.09375 +v -0.046875 0.5 -0.09375 +v -0.046875 0.5 0.09375 +vt 0 1 +vt 0.125 1 +vt 0.125 0 +vt 0 0 +vt 0.5625 1 +vt 0.625 1 +vt 0.625 0 +vt 0.5625 0 +vt 0.875 1 +vt 1 1 +vt 1 0 +vt 0.875 0 +vt 0.375 1 +vt 0.4375 1 +vt 0.4375 0 +vt 0.375 0 +vt 0.4375 0.75 +vt 0.5625 0.75 +vt 0.5625 0.5 +vt 0.4375 0.5 +vt 0.4375 0.5 +vt 0.5625 0.5 +vt 0.5625 0.25 +vt 0.4375 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +usemtl m_1 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o cube +v 0.109375 1.625 0.109375 +v 0.109375 1.625 -0.109375 +v 0.109375 1.5 0.109375 +v 0.109375 1.5 -0.109375 +v -0.109375 1.625 -0.109375 +v -0.109375 1.625 0.109375 +v -0.109375 1.5 -0.109375 +v -0.109375 1.5 0.109375 +vt 0 0.125 +vt 0.25 0.125 +vt 0.25 0 +vt 0 0 +vt 0.5 0.125 +vt 0.75 0.125 +vt 0.75 0 +vt 0.5 0 +vt 0.75 0.125 +vt 1 0.125 +vt 1 0 +vt 0.75 0 +vt 0.25 0.125 +vt 0.5 0.125 +vt 0.5 0 +vt 0.25 0 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.5 +vt 0.3125 0.5 +vt 0.4375 0.5 +vt 0.6875 0.5 +vt 0.6875 0.25 +vt 0.4375 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +usemtl m_1 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o cube +v 0.078125 1.6875 0.078125 +v 0.078125 1.6875 -0.078125 +v 0.078125 1.625 0.078125 +v 0.078125 1.625 -0.078125 +v -0.078125 1.6875 -0.078125 +v -0.078125 1.6875 0.078125 +v -0.078125 1.625 -0.078125 +v -0.078125 1.625 0.078125 +vt 0 0.0625 +vt 0.1875 0.0625 +vt 0.1875 0 +vt 0 0 +vt 0.5625 0.0625 +vt 0.75 0.0625 +vt 0.75 0 +vt 0.5625 0 +vt 0.8125 0.0625 +vt 1 0.0625 +vt 1 0 +vt 0.8125 0 +vt 0.25 0.0625 +vt 0.4375 0.0625 +vt 0.4375 0 +vt 0.25 0 +vt 0.375 0.75 +vt 0.5625 0.75 +vt 0.5625 0.5625 +vt 0.375 0.5625 +vt 0.4375 0.4375 +vt 0.625 0.4375 +vt 0.625 0.25 +vt 0.4375 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +usemtl m_1 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/models/wavingflag.b3d b/models/wavingflag.b3d new file mode 100644 index 0000000..7fa7c2d Binary files /dev/null and b/models/wavingflag.b3d differ diff --git a/sounds/flagwave1.ogg b/sounds/flagwave1.ogg new file mode 100644 index 0000000..c02d7fe Binary files /dev/null and b/sounds/flagwave1.ogg differ diff --git a/sounds/flagwave2.ogg b/sounds/flagwave2.ogg new file mode 100644 index 0000000..fcedb77 Binary files /dev/null and b/sounds/flagwave2.ogg differ diff --git a/sounds/flagwave3.ogg b/sounds/flagwave3.ogg new file mode 100644 index 0000000..071a880 Binary files /dev/null and b/sounds/flagwave3.ogg differ diff --git a/textures/default_baremetal.png b/textures/default_baremetal.png new file mode 100644 index 0000000..98f9ee2 Binary files /dev/null and b/textures/default_baremetal.png differ diff --git a/textures/prideflag_asexual.png b/textures/prideflag_asexual.png new file mode 100644 index 0000000..58738e7 Binary files /dev/null and b/textures/prideflag_asexual.png differ diff --git a/textures/prideflag_bisexual.png b/textures/prideflag_bisexual.png new file mode 100644 index 0000000..81fe387 Binary files /dev/null and b/textures/prideflag_bisexual.png differ diff --git a/textures/prideflag_gendercreative.png b/textures/prideflag_gendercreative.png new file mode 100644 index 0000000..b9dcfeb Binary files /dev/null and b/textures/prideflag_gendercreative.png differ diff --git a/textures/prideflag_genderfluid.png b/textures/prideflag_genderfluid.png new file mode 100644 index 0000000..3d8af12 Binary files /dev/null and b/textures/prideflag_genderfluid.png differ diff --git a/textures/prideflag_genderqueer.png b/textures/prideflag_genderqueer.png new file mode 100644 index 0000000..d8eb8b9 Binary files /dev/null and b/textures/prideflag_genderqueer.png differ diff --git a/textures/prideflag_lesbian.png b/textures/prideflag_lesbian.png new file mode 100644 index 0000000..4bb94f9 Binary files /dev/null and b/textures/prideflag_lesbian.png differ diff --git a/textures/prideflag_nonbinary.png b/textures/prideflag_nonbinary.png new file mode 100644 index 0000000..96fbb66 Binary files /dev/null and b/textures/prideflag_nonbinary.png differ diff --git a/textures/prideflag_pansexual.png b/textures/prideflag_pansexual.png new file mode 100644 index 0000000..443e0e8 Binary files /dev/null and b/textures/prideflag_pansexual.png differ diff --git a/textures/prideflag_polysexual.png b/textures/prideflag_polysexual.png new file mode 100644 index 0000000..1f3e561 Binary files /dev/null and b/textures/prideflag_polysexual.png differ diff --git a/textures/prideflag_rainbow.png b/textures/prideflag_rainbow.png new file mode 100644 index 0000000..37df1d5 Binary files /dev/null and b/textures/prideflag_rainbow.png differ diff --git a/textures/prideflag_transgender.png b/textures/prideflag_transgender.png new file mode 100644 index 0000000..430f73b Binary files /dev/null and b/textures/prideflag_transgender.png differ