split code, add mapgen, add eel, add nyancat, improved api, add growth, etc

master
Jannik Kulesha 2017-05-13 17:16:33 +02:00
parent ba79cd8d30
commit edd4193ee6
14 changed files with 488 additions and 269 deletions

View File

@ -15,5 +15,10 @@ Code:
LGPL v3
Textures:
CC-0
nyancat_front.png, nyancat_rainbow.png created by VanessaE, taken from Minetest Game.
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) [http://creativecommons.org/licenses/by-sa/3.0/]
every other texture is created by Gejan
CC 0 [https://creativecommons.org/publicdomain/zero/1.0/]

314
api.lua Normal file
View File

@ -0,0 +1,314 @@
local WALKING_PERIOD = worm.config.WALKING_PERIOD
-- Defines a "worm" (spawnitem and nodes)
-- @param modname The name of the mod, which registers the nodes
-- @param name The name of the creature; Has to be unique
-- @param data A table containing:
-- - leftover The node placed behind the tail when moving away
-- - walking_steps The number of steps to pass one node
-- - can_move A function (Position * Node -> Boolean) defining which nodes
-- can be destroyed by the worm
-- - flying Movement behaviour
-- - *_textures (See examples)
-- @return True if successful
worm.register_worm = function (modname, name, data)
-- default values:
if not data.leftover then
data.leftover = "air"
end
if not data.walking_steps then
data.walking_steps = worm.config.DEFAULT_WALKING_STEPS
end
if not data.can_move then
data.can_move = function(_, node)
return node.name == "air"
end
end
-- required values:
if not (data.face_texture and data.side_texture and data.tail_texture) then
print("[worm] register_worm of "..modname..":"..name.." failed because of incomplete data")
return false
end
-- reusing textures
if not data.bottem_texture then
data.bottem_texture = data.side_texture
end
if not data.top_texture then
data.top_texture = data.side_texture
end
if not data.left_texture then
data.left_texture = data.side_texture
end
if not data.inventory_image then
data.inventory_image = data.face_texture
end
if not data.spawn_in then
data.spawn_in = "air"
end
-- Definition of the spawn item
minetest.register_craftitem(modname..":"..name.."_spawnegg", {
description = "spawn "..name,
inventory_image = data.inventory_image,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local pos = pointed_thing.above
local player_name = user:get_player_name()
if minetest.is_protected(pos, player_name) then
return itemstack
end
if minetest.get_node(pos).name ~= data.spawn_in then
return itemstack
end
local zero = {x = 0, y = 0, z = 0}
local player_dir = vector.subtract(zero, user:get_look_dir())
local facedir = minetest.dir_to_facedir(player_dir)
local dir = minetest.facedir_to_dir(facedir)
local length = itemstack:get_count()
minetest.set_node(pos, {
name = modname..":"..name.."_head_1",
param2 = facedir
})
local headtimer = minetest.get_node_timer(pos)
pos = vector.subtract(pos, dir)
local i = 0
while i < length do
if minetest.get_node(pos).name ~= data.spawn_in or
(worm.config.TAIL_PROTECTION and minetest.is_protected(pos, player_name)) then
pos = vector.add(pos, dir)
minetest.set_node(pos, {
name = modname..":"..name.."_tail_1",
param2 = facedir
})
break
end
minetest.set_node(pos, {
name = modname..":"..name.."_body",
param2 = facedir
})
pos = vector.subtract(pos, dir)
i = i + 1
end
minetest.set_node(pos, {
name = modname..":"..name.."_tail_1",
param2 = facedir
})
local tailtimer = minetest.get_node_timer(pos)
headtimer:set(WALKING_PERIOD, 0)
tailtimer:set(WALKING_PERIOD, 0)
itemstack:take_item(i)
return itemstack
end,
})
-- Definition of head nodes
for n = 1, data.walking_steps do
-- Called on nodetimer
-- Incomplete head -> Update the head
local step = function(pos, _)
local node = minetest.get_node(pos)
node.name = modname..":"..name.."_head_"..(n+1)
minetest.set_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(WALKING_PERIOD, 0)
return false
end
-- Complete head -> Move head to a different position
if n == data.walking_steps then
step = function(pos, _)
local node = minetest.get_node(pos)
local facedir = node.param2
local dirs -- Hierarchy of preferred directions
if data.flying then
dirs = {
facedir % 4, -- 4 -> 0
(facedir + 1) % 4,
(facedir + 2) % 4,
(facedir + 3) % 4,
8,
4
}
else
dirs = {
4,
facedir % 4, -- 4 -> 0
(facedir + 1) % 4,
(facedir + 2) % 4,
(facedir + 3) % 4,
8
}
end
for i = 1, 6 do
local newpos = vector.add(pos, minetest.facedir_to_dir(dirs[i]))
local newnode = minetest.get_node(newpos)
local grow = minetest.get_node_group(newnode.name, "swallowable")
if grow > 0 then
grow = grow + 1
if grow > data.walking_steps then
grow = data.walking_steps
end
minetest.set_node(newpos, {
name = modname..":"..name.."_head_"..grow,
param2 = dirs[i]
})
minetest.set_node(pos, {
name = modname..":"..name.."_body",
param2 = dirs[i]
})
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
return false
elseif data.can_move(newpos, newnode) then
minetest.set_node(newpos, {
name = modname..":"..name.."_head_1",
param2 = dirs[i]
})
minetest.set_node(pos, {
name = modname..":"..name.."_body",
param2 = dirs[i]
})
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
return false
end
end
-- Worm stuck
return true
end
end
local drawtype
if data.walking_steps > 1 then
drawtype = "nodebox"
end
minetest.register_node(modname..":"..name.."_head_"..n, {
description = name.." head",
paramtype = "light",
paramtype2 = "facedir",
drawtype = drawtype,
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5 + (1 / data.walking_steps) * n},
},
},
tiles = {
data.top_texture.."^[transform1",
data.bottem_texture.."^[transform3",
data.side_texture,
data.left_texture.."^[transform2",
data.face_texture,
data.side_texture
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
damage_per_second = 10,
on_timer = step,
drop = "",
})
end
-- Definition of the body node
minetest.register_node(modname..":"..name.."_body", {
description = name.." body part",
paramtype = "light",
paramtype2 = "facedir",
tiles = {
data.top_texture.."^[transform1",
data.bottem_texture.."^[transform3",
data.side_texture,
data.left_texture.."^[transform2",
data.side_texture,
data.side_texture
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
-- Add a new tail to keep demolition
after_dig_node = function(pos, node, _, _)
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
local newnode = minetest.get_node(newpos)
if newnode.name == modname..":"..name.."_body" then
newnode.name = modname..":"..name.."_tail_1"
minetest.set_node(newpos, newnode)
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
newnode.name = "air"
minetest.set_node(newpos, newnode)
end
end,
drop = modname..":"..name.."_spawnegg",
})
-- Definition of tail nodes
for n = 1, data.walking_steps do
-- Called on nodetimer
-- Non empty tail -> update the tail
local step = function(pos, _)
local node = minetest.get_node(pos)
node.name = modname..":"..name.."_tail_"..(n+1)
minetest.set_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(WALKING_PERIOD, 0)
return false
end
-- Empty tail -> Update the head
if n == data.walking_steps then
step = function(pos, elapsed)
local node = minetest.get_node(pos)
local facedir = node.param2
local newpos = vector.add(pos, minetest.facedir_to_dir(facedir))
local newnode = minetest.get_node(newpos)
if newnode.name == modname..":"..name.."_body" then
newnode.name = modname..":"..name.."_tail_1"
minetest.set_node(newpos, newnode)
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
minetest.set_node(newpos, {name = "air"})
end
minetest.set_node(pos, {name = data.leftover})
return false
end
end
local drawtype
if data.walking_steps > 1 then
drawtype = "nodebox"
end
minetest.register_node(modname..":"..name.."_tail_"..n, {
description = name.." tail",
paramtype = "light",
paramtype2 = "facedir",
drawtype = drawtype,
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5 + (1 / data.walking_steps) * (n - 1), 0.5, 0.5, 0.5},
},
},
tiles = {
data.top_texture.."^[transform1",
data.bottem_texture.."^[transform3",
data.side_texture,
data.left_texture.."^[transform2",
data.side_texture,
data.tail_texture
},
on_timer = step,
after_dig_node = function(pos, node, _, _)
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
local newnode = minetest.get_node(newpos)
if newnode.name == modname..":"..name.."_body" then
newnode.name = modname..":"..name.."_tail_1"
minetest.set_node(newpos, newnode)
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
newnode.name = "air"
minetest.set_node(newpos, newnode)
end
end,
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
drop = "",
})
end
return true
end

View File

@ -0,0 +1,2 @@
default?
flowers?

51
examples.lua Normal file
View File

@ -0,0 +1,51 @@
-- Worm
worm.register_worm("worm", "worm", {
leftover = "mapgen_dirt",
face_texture = "worm_face.png",
side_texture = "worm_side.png",
tail_texture = "worm_tail.png",
can_move = function(_, node)
local name = node.name
return minetest.registered_nodes[name].buildable_to or
minetest.get_node_group(name, "crumbly") >= 3
end,
})
-- Snake
worm.register_worm("worm", "snake", {
face_texture = "snake_face.png",
side_texture = "snake_side.png",
tail_texture = "snake_tail.png",
can_move = function(_, node)
return minetest.registered_nodes[node.name].buildable_to
end,
})
-- Nyancat
worm.register_worm("worm", "nyancat", {
face_texture = "nyancat_front.png",
side_texture = "nyancat_rainbow.png",
tail_texture = "nyancat_rainbow.png",
flying = true,
})
-- Eel
local spawn_in = "air"
if default then
spawn_in = "default:water_source"
end
worm.register_worm("worm", "eel", {
leftover = "mapgen_water_source",
spawn_in = spawn_in,
walking_steps = 1,
face_texture = "eel_face.png",
side_texture = "eel_side.png",
left_texture = "eel_side.png^[transform6",
tail_texture = "eel_tail.png",
top_texture = "eel_top.png",
bottem_texture = "eel_bottem.png",
can_move = function(_, node)
return minetest.get_node_group(node.name, "water") > 0
end,
flying = true,
})

279
init.lua
View File

@ -1,275 +1,18 @@
-- Minetest Worm Mod
-- by Gerald
local WALKING_PERIOD = 1
worm = {}
worm.config = {}
worm.config.WALKING_PERIOD = 1
-- Time of a step in seconds, values < 1 are not faster
local DEFAULT_WALKING_STEPS = 4
worm.config.DEFAULT_WALKING_STEPS = 4
-- Number of steps to pass one node, needs to be bigger than 0
local TAIL_PROTECTION = false
worm.config.TAIL_PROTECTION = false
-- If false check for protection on spawning only at head position
local MODNAME = "worm"
worm = {}
-- Defines a "worm" (spawnitem and nodes)
-- @param modname The name of the mod, which registers the nodes
-- @param name The name of the creature; Has to be unique
-- @param leftover The node placed behind the tail when moving away
-- @walking_steps The number of steps to pass one node
-- @can_move A function (Position -> Boolean) defining which nodes
-- can be destroyed by the worm
worm.register_worm = function (modname, name, leftover, face_texture,
side_texture, tail_texture, walking_steps, can_move)
-- Definition of the spawn item
minetest.register_craftitem(modname..":"..name.."_spawnegg", {
description = "spawn "..name,
inventory_image = face_texture,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local pos = pointed_thing.above
local player_name = user:get_player_name()
if minetest.is_protected(pos, player_name) then
return itemstack
end
if minetest.get_node(pos).name ~= "air" then
return itemstack
end
local zero = {x = 0, y = 0, z = 0}
local player_dir = vector.subtract(zero, user:get_look_dir())
local facedir = minetest.dir_to_facedir(player_dir)
local dir = minetest.facedir_to_dir(facedir)
local length = itemstack:get_count()
minetest.set_node(pos, {
name = modname..":"..name.."_head_1",
param2 = facedir
})
local headtimer = minetest.get_node_timer(pos)
pos = vector.subtract(pos, dir)
local i = 0
while i < length do
if minetest.get_node(pos).name ~= "air" or
(TAIL_PROTECTION and minetest.is_protected(pos, player_name)) then
pos = vector.add(pos, dir)
minetest.set_node(pos, {
name = modname..":"..name.."_tail_1",
param2 = facedir
})
break
end
minetest.set_node(pos, {
name = modname..":"..name.."_body",
param2 = facedir
})
pos = vector.subtract(pos, dir)
i = i + 1
end
minetest.set_node(pos, {
name = modname..":"..name.."_tail_1",
param2 = facedir
})
local tailtimer = minetest.get_node_timer(pos)
headtimer:set(WALKING_PERIOD, 0)
tailtimer:set(WALKING_PERIOD, 0)
itemstack:take_item(i)
return itemstack
end,
})
-- Definition of head nodes
for n = 1, walking_steps do
-- Called on nodetimer
-- Incomplete head -> Update the head
local step = function(pos, _)
local node = minetest.get_node(pos)
node.name = modname..":"..name.."_head_"..(n+1)
minetest.set_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(WALKING_PERIOD, 0)
return false
end
-- Complete head -> Move head to a different position
if n == walking_steps then
step = function(pos, _)
local node = minetest.get_node(pos)
local facedir = node.param2
local dirs = { -- Hierarchy of preferred directions
4,
facedir % 4, -- 4 -> 0
(facedir + 1) % 4,
(facedir + 2) % 4,
(facedir + 3) % 4,
8
}
for i = 1, 6 do
local newpos = vector.add(pos, minetest.facedir_to_dir(dirs[i]))
if can_move(newpos) then
minetest.set_node(newpos, {
name = modname..":"..name.."_head_1",
param2 = dirs[i]
})
minetest.set_node(pos, {
name = modname..":"..name.."_body",
param2 = dirs[i]
})
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
return false
end
end
-- Worm stuck
return true
end
end
minetest.register_node(modname..":"..name.."_head_"..n, {
description = name.." head",
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5 + (1 / walking_steps) * n},
},
},
tiles = {
side_texture.."^[transform1",
side_texture.."^[transform3",
side_texture,
side_texture.."^[transform2",
face_texture,
side_texture
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
damage_per_second = 10,
on_timer = step,
drop = "",
})
end
-- Definition of the body node
minetest.register_node(modname..":"..name.."_body", {
description = name.." body part",
paramtype = "light",
paramtype2 = "facedir",
tiles = {
side_texture.."^[transform1",
side_texture.."^[transform3",
side_texture,
side_texture.."^[transform2",
side_texture,
side_texture
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
-- Add a new tail to keep demolition
after_dig_node = function(pos, node, _, _)
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
local newnode = minetest.get_node(newpos)
if newnode.name == modname..":"..name.."_body" then
newnode.name = modname..":"..name.."_tail_1"
minetest.set_node(newpos, newnode)
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
newnode.name = "air"
minetest.set_node(newpos, newnode)
end
end,
drop = "",
})
-- Definition of tail nodes
for n = 1, walking_steps do
-- Called on nodetimer
-- Non empty tail -> update the tail
local step = function(pos, _)
local node = minetest.get_node(pos)
node.name = modname..":"..name.."_tail_"..(n+1)
minetest.set_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(WALKING_PERIOD, 0)
return false
end
-- Empty tail -> Update the head
if n == walking_steps then
step = function(pos, elapsed)
local node = minetest.get_node(pos)
local facedir = node.param2
local newpos = vector.add(pos, minetest.facedir_to_dir(facedir))
local newnode = minetest.get_node(newpos)
if newnode.name == modname..":"..name.."_body" then
newnode.name = modname..":"..name.."_tail_1"
minetest.set_node(newpos, newnode)
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
minetest.set_node(newpos, {name = "air"})
end
minetest.set_node(pos, {name = leftover})
return false
end
end
minetest.register_node(modname..":"..name.."_tail_"..n, {
description = name.." tail",
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5 + (1 / walking_steps) * (n - 1), 0.5, 0.5, 0.5},
},
},
tiles = {
side_texture.."^[transform1",
side_texture.."^[transform3",
side_texture,
side_texture.."^[transform2",
side_texture,
tail_texture
},
on_timer = step,
after_dig_node = function(pos, node, _, _)
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
local newnode = minetest.get_node(newpos)
if newnode.name == modname..":"..name.."_body" then
newnode.name = modname..":"..name.."_tail_1"
minetest.set_node(newpos, newnode)
local timer = minetest.get_node_timer(newpos)
timer:set(WALKING_PERIOD, 0)
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
newnode.name = "air"
minetest.set_node(newpos, newnode)
end
end,
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
drop = "",
})
end
end
worm.register_worm(MODNAME, "worm",
"mapgen_dirt",
"worm_face.png",
"worm_side.png",
"worm_tail.png",
DEFAULT_WALKING_STEPS,
function(pos)
local name = minetest.get_node(pos).name
return minetest.registered_nodes[name].buildable_to or
minetest.get_node_group(name, "crumbly") >= 3
end
)
worm.register_worm(MODNAME, "snake",
"air",
"snake_face.png",
"snake_side.png",
"snake_tail.png",
DEFAULT_WALKING_STEPS,
function(pos)
return minetest.registered_nodes[minetest.get_node(pos).name].buildable_to
end
)
local path = minetest.get_modpath("worm")
dofile(path.."/api.lua")
dofile(path.."/examples.lua")
dofile(path.."/swallowable_nodes.lua")
dofile(path.."/mapgen.lua")

89
mapgen.lua Normal file
View File

@ -0,0 +1,89 @@
-- Marked mapgen nodes
local mapgen_node = {
description = "worm mapgen node",
paramtype = "light",
paramtype2 = "facedir",
drawtype = "airlike",
groups = {not_in_creative_inventory = 1, worm_mapgen = 1},
}
minetest.register_node("worm:snake_head_1_mapgen", mapgen_node)
minetest.register_node("worm:snake_tail_1_mapgen", mapgen_node)
minetest.register_node("worm:worm_head_1_mapgen", mapgen_node)
minetest.register_node("worm:worm_tail_1_mapgen", mapgen_node)
minetest.register_node("worm:eel_head_1_mapgen", mapgen_node)
minetest.register_node("worm:eel_tail_1_mapgen", mapgen_node)
-- Replace mapgen nodes by real ones and initialize the node timer.
minetest.register_lbm({
name = "worm:init_nodetimers_mapgen",
nodenames = "group:worm_mapgen",
run_at_every_load = true,
action = function(pos, node)
node.name = node.name:sub(1, -8)
print("[worm]"..node.name.." spawned at "..pos.x..", "..pos.y..", "..pos.z)
minetest.swap_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(worm.config.WALKING_PERIOD, 0)
end,
})
-- Snake
minetest.register_decoration({
deco_type = "schematic",
place_on = "mapgen_dirt_with_grass",
sidelen = 16,
fill_ratio = 0.0001,
schematic = {
size = {x=4, y=1, z=1},
data = {
{name="worm:snake_head_1_mapgen", param1=255, param2=3, force_place = true},
{name="worm:snake_body", param1=255, param2=3, force_place = true},
{name="worm:snake_body", param1=255, param2=3, force_place = true},
{name="worm:snake_tail_1_mapgen", param1=255, param2=3, force_place = true},
},
},
})
-- Worm
minetest.register_decoration({
deco_type = "schematic",
place_on = "mapgen_dirt_with_grass",
sidelen = 16,
fill_ratio = 0.0001,
schematic = {
size = {x=4, y=1, z=1},
data = {
{name="worm:worm_head_1_mapgen", param1=255, param2=3, force_place = true},
{name="worm:worm_body", param1=255, param2=3, force_place = true},
{name="worm:worm_body", param1=255, param2=3, force_place = true},
{name="worm:worm_tail_1_mapgen", param1=255, param2=3, force_place = true},
},
},
})
-- Eel
minetest.register_decoration({
deco_type = "schematic",
place_on = "mapgen_water_source",
flags = "liquid_surface, place_center_y",
sidelen = 16,
fill_ratio = 0.0002,
schematic = {
size = {x=4, y=3, z=1},
data = {
{name="worm:eel_head_1_mapgen", param1=255, param2=3, force_place = true},
{name="worm:eel_body", param1=255, param2=3, force_place = true},
{name="worm:eel_body", param1=255, param2=3, force_place = true},
{name="worm:eel_tail_1_mapgen", param1=255, param2=3, force_place = true},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
{name="ignore", param1=0, param2=0},
},
},
rotation = "random",
})

15
swallowable_nodes.lua Normal file
View File

@ -0,0 +1,15 @@
if default then
local groups = minetest.registered_nodes["default:apple"].groups
groups.swallowable = 1
minetest.override_item("default:apple", {
groups = groups,
})
end
if flowers then
local groups = minetest.registered_nodes["flowers:mushroom_brown"].groups
groups.swallowable = 1
minetest.override_item("flowers:mushroom_brown", {
groups = groups,
})
end

BIN
textures/eel_bottem.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

BIN
textures/eel_face.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

BIN
textures/eel_side.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

BIN
textures/eel_tail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

BIN
textures/eel_top.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

BIN
textures/nyancat_front.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B