add movement towards objects and nodes, animated textures, new worm types

master
Jannik Kulesha 2017-06-20 16:59:55 +02:00
parent 84c2924eb8
commit e9e4ec2187
38 changed files with 492 additions and 104 deletions

View File

@ -17,7 +17,8 @@ Code:
LGPL v3
Textures:
nyancat_front.png, nyancat_rainbow.png created by VanessaE, taken from Minetest Game.
nyancat_front.png, nyancat_rainbow.png created by VanessaE, taken from Minetest Game.
animated versions edited by Gejan
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

347
api.lua
View File

@ -6,13 +6,18 @@ local WALKING_PERIOD = worm.config.WALKING_PERIOD
-- @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
-- - can_move A function (Position * Node -> Boolean) defining which
-- nodes can be destroyed by the worm
-- - flying Movement behaviour
-- - *_textures (See examples)
-- - drop drop of body parts; default: the spawn item
-- - node_damage Damage done inside the head
-- - attack_damage Damage groups for attacks; nil means no attack
-- - follow_objects Can be: false, "straight", "winding", true = "mixed"
-- - *_texture See examples, some values are indispensable
-- *_tile
-- @return True if successful
worm.register_worm = function (modname, name, data)
-- default values:
-- Default values:
if not data.leftover then
data.leftover = "air"
end
@ -24,12 +29,7 @@ worm.register_worm = function (modname, name, data)
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
-- Reusing textures
if not data.bottem_texture then
data.bottem_texture = data.side_texture
end
@ -42,6 +42,32 @@ worm.register_worm = function (modname, name, data)
if not data.inventory_image then
data.inventory_image = data.face_texture
end
if not data.attack_texture then
data.attack_texture = data.face_texture
end
-- Complete tiles
if not data.top_tile then
data.top_tile = data.top_texture.."^[transform1"
end
if not data.bottem_tile then
data.bottem_tile = data.bottem_texture.."^[transform3"
end
if not data.side_tile then
data.side_tile = data.side_texture
end
if not data.left_tile then
data.left_tile = data.left_texture.."^[transform2"
end
if not data.face_tile then
data.face_tile = data.face_texture
end
if not data.tail_tile then
data.tail_tile = data.tail_texture
end
-- Spawn item related
if not data.drop then
data.drop = modname..":"..name.."_spawnegg"
end
if not data.spawn_in then
data.spawn_in = "air"
end
@ -109,68 +135,195 @@ worm.register_worm = function (modname, name, data)
local step = function(pos, _)
local node = minetest.get_node(pos)
node.name = modname..":"..name.."_head_"..(n+1)
minetest.set_node(pos, node)
minetest.swap_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(WALKING_PERIOD, 0)
return false
end
-- Check for attack at first step
if data.attack_damage and n == 1 then
step = function(pos, _)
local node = minetest.get_node(pos)
local dir = minetest.facedir_to_dir(node.param2)
local bite_pos = vector.add(pos, dir)
if data.can_move(bite_pos, minetest.get_node(bite_pos)) then
local objects = minetest.get_objects_inside_radius(bite_pos, 1)
if objects[1] then
node.name = modname..":"..name.."_body"
minetest.swap_node(pos, node)
node.name = modname..":"..name.."_attack"
minetest.set_node(bite_pos, node)
objects[1]:punch(objects[1], nil, -- This is a workaround, first argument should be nil
{damage_groups = data.attack_damage,}, dir)
local timer = minetest.get_node_timer(bite_pos)
timer:set(WALKING_PERIOD, 0)
return false
end
end
node.name = modname..":"..name.."_head_"..(n+1)
minetest.swap_node(pos, node)
local timer = minetest.get_node_timer(pos)
timer:set(WALKING_PERIOD, 0)
return false
end
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
if data.follow_nodes then -- follow food nodes
local radius = data.follow_nodes_radius
if not radius then radius = 5 end
local obj_pos = minetest.find_node_near(pos, radius, data.follow_nodes)
if obj_pos then
obj_pos = vector.subtract(obj_pos, pos)
dirs = {}
if not data.flying then
dirs[1] = 4
end
if obj_pos.x > 0 then
dirs[2] = 1
dirs[5] = 3
elseif obj_pos.x < 0 then
dirs[2] = 3
dirs[5] = 1
else
dirs[5] = 1
dirs[8] = 3
end
if obj_pos.z > 0 then
dirs[3] = 0
dirs[6] = 2
elseif obj_pos.z < 0 then
dirs[3] = 2
dirs[6] = 0
else
dirs[6] = 0
dirs[9] = 2
end
if math.abs(obj_pos.z) > math.abs(obj_pos.x) then
local tmp = dirs[2]
dirs[2] = dirs[3]
dirs[3] = tmp
end
if obj_pos.y > 0 then
dirs[4] = 8
dirs[7] = 4
else
dirs[4] = 4
dirs[7] = 8
end
end
end
if data.follow_objects then -- follow objects
local radius = data.follow_objects_radius
if not radius then radius = 5 end
local objects = minetest.get_objects_inside_radius(pos, radius)
if objects[1] then
local obj_pos = objects[1]:getpos()
obj_pos = vector.subtract(obj_pos, pos)
dirs = {}
if not data.flying then
dirs[1] = 4
end
if obj_pos.x > 0 then
dirs[2] = 1
dirs[5] = 3
else
dirs[2] = 3
dirs[5] = 1
end
if obj_pos.z > 0 then
dirs[3] = 0
dirs[6] = 2
else
dirs[3] = 2
dirs[6] = 0
end
if data.follow_objects == "straight" then
if math.abs(obj_pos.z) > math.abs(obj_pos.x) then
local tmp = dirs[2]
dirs[2] = dirs[3]
dirs[3] = tmp
end
elseif data.follow_objects == "winding" then
if math.abs(obj_pos.z) < math.abs(obj_pos.x) then
local tmp = dirs[2]
dirs[2] = dirs[3]
dirs[3] = tmp
end
end
if obj_pos.y > 0 then
dirs[4] = 8
dirs[7] = 4
else
dirs[4] = 4
dirs[7] = 8
end
if data.flying and (data.follow_objects == "straight") and (math.abs(obj_pos.z) < 1) and (math.abs(obj_pos.x) < 1) and (math.abs(obj_pos.y) > 1) then
dirs[1] = dirs[4]
dirs[4] = nil
end
end
end
-- default movement
if not dirs then
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
end
for i = 1, 9 do
if dirs[i] then
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
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
@ -193,15 +346,15 @@ worm.register_worm = function (modname, name, data)
},
},
tiles = {
data.top_texture.."^[transform1",
data.bottem_texture.."^[transform3",
data.side_texture,
data.left_texture.."^[transform2",
data.face_texture,
data.side_texture
data.top_tile,
data.bottem_tile,
data.side_tile,
data.left_tile,
data.face_tile,
data.side_tile
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
damage_per_second = 10,
damage_per_second = data.node_damage,
on_timer = step,
drop = "",
})
@ -213,12 +366,12 @@ worm.register_worm = function (modname, name, data)
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
data.top_tile,
data.bottem_tile,
data.side_tile,
data.left_tile,
data.side_tile,
data.side_tile
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
-- Add a new tail to keep demolition
@ -235,7 +388,7 @@ worm.register_worm = function (modname, name, data)
minetest.set_node(newpos, newnode)
end
end,
drop = modname..":"..name.."_spawnegg",
drop = data.drop,
})
-- Definition of tail nodes
@ -285,12 +438,12 @@ worm.register_worm = function (modname, name, data)
},
},
tiles = {
data.top_texture.."^[transform1",
data.bottem_texture.."^[transform3",
data.side_texture,
data.left_texture.."^[transform2",
data.side_texture,
data.tail_texture
data.top_tile,
data.bottem_tile,
data.side_tile,
data.left_tile,
data.side_tile,
data.tail_tile
},
on_timer = step,
after_dig_node = function(pos, node, _, _)
@ -310,5 +463,37 @@ worm.register_worm = function (modname, name, data)
drop = "",
})
end
--Definition of the special attack head node
if data.attack_damage then
minetest.register_node(modname..":"..name.."_attack", {
description = name.." attacking head",
paramtype = "light",
paramtype2 = "facedir",
tiles = {
data.top_tile,
data.bottem_tile,
data.side_tile,
data.left_tile,
data.attack_texture,
data.side_tile
},
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
on_timer = function(pos)
local node = minetest.get_node(pos)
local pos_b = vector.subtract(pos, minetest.facedir_to_dir(node.param2))
local node_b = minetest.get_node(pos_b)
node.name = "air"
minetest.swap_node(pos, node)
if node_b.name == modname..":"..name.."_body" then
node_b.name = modname..":"..name.."_head_"..(math.min(3, data.walking_steps))
minetest.swap_node(pos_b, node_b)
local timer = minetest.get_node_timer(pos_b)
timer:set(WALKING_PERIOD, 0)
end
end,
drop = "",
})
end
return true
end

View File

@ -1,32 +1,31 @@
-- 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,
})
-- Not animated
---------------
-- Snake
-- Green Snake
worm.register_worm("worm", "snake", {
face_texture = "snake_face.png",
side_texture = "snake_side.png",
tail_texture = "snake_tail.png",
face_texture = "snake_face.png",
side_texture = "snake_side.png",
tail_texture = "snake_tail.png",
attack_texture = "snake_attack.png",
attack_damage = {fleshy = 8},
follow_objects = "winding",
follow_nodes = "group:swallowable",
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,
-- Black Snake
worm.register_worm("worm", "black_snake", {
face_texture = "snake_face_black.png",
side_texture = "snake_side_yellow_black.png",
tail_texture = "snake_tail_black.png",
attack_texture = "snake_face_black.png",
attack_damage = {fleshy = 8},
follow_objects = "straight",
can_move = function(_, node)
return minetest.registered_nodes[node.name].buildable_to
end,
})
-- Eel
@ -49,3 +48,76 @@ worm.register_worm("worm", "eel", {
end,
flying = true,
})
-- Animated
-----------
local anm = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 3.0,
}
-- Nyancat
worm.register_worm("worm", "nyancat", {
inventory_image = "nyancat_front.png",
side_tile = {name = "nyancat_rainbow_animated.png", animation = anm},
left_tile = {name = "nyancat_rainbow_animated.png", animation = anm},
top_tile = {name = "nyancat_rainbow_animated_b.png", animation = anm},
bottem_tile = {name = "nyancat_rainbow_animated_b.png", animation = anm},
face_tile = {name = "nyancat_front_animated.png", animation = anm},
tail_tile = {name = "nyancat_rainbow_animated.png", animation = anm},
flying = true,
})
-- Worm
worm.register_worm("worm", "worm", {
leftover = "mapgen_dirt",
inventory_image = "worm_face.png",
side_tile = {name = "worm_side_animated.png", animation = anm},
left_tile = {name = "worm_side_animated.png^[transform62", animation = anm},
top_tile = {name = "worm_top_animated.png", animation = anm},
bottem_tile = {name = "worm_bottem_animated.png", animation = anm},
face_tile = {name = "worm_face_animated.png", animation = anm},
tail_tile = "worm_tail.png",
attack_damage = {fleshy = 8},
can_move = function(_, node)
local name = node.name
return minetest.registered_nodes[name].buildable_to or
minetest.get_node_group(name, "crumbly") >= 3
end,
})
-- Worm
worm.register_worm("worm", "caterpillar", {
face_texture = "caterpillar_face.png",
side_tile = {name = "caterpillar_side_animated.png", animation = anm},
left_tile = {name = "caterpillar_side_animated.png^[transform62", animation = anm},
top_tile = {name = "caterpillar_top_animated.png", animation = anm},
bottem_tile = {name = "caterpillar_bottem_animated.png", animation = anm},
tail_tile = "caterpillar_tail.png",
follow_nodes = {"group:swallowable", "group:leaves"},
can_move = function(_, node)
local name = node.name
return minetest.registered_nodes[name].buildable_to or
minetest.get_node_group(name, "snappy") >= 3
end,
})
-- Worm
worm.register_worm("worm", "maggot", {
face_texture = "maggot_face.png",
side_tile = {name = "maggot_side_animated.png", animation = anm},
left_tile = {name = "maggot_side_animated.png^[transform62", animation = anm},
top_tile = {name = "maggot_top_animated.png", animation = anm},
bottem_tile = {name = "maggot_bottem_animated.png", animation = anm},
tail_tile = "maggot_tail.png",
walking_steps = 8,
follow_nodes = {"group:swallowable", "group:wood"},
node_damage = 4,
can_move = function(_, node)
local name = node.name
return minetest.registered_nodes[name].buildable_to or
minetest.get_node_group(name, "choppy") >= 2
end,
})

View File

@ -14,5 +14,6 @@ worm.config.TAIL_PROTECTION = false
local path = minetest.get_modpath("worm")
dofile(path.."/api.lua")
dofile(path.."/examples.lua")
dofile(path.."/stone_eater.lua")
dofile(path.."/swallowable_nodes.lua")
dofile(path.."/mapgen.lua")

View File

@ -8,6 +8,8 @@ local mapgen_node = {
}
minetest.register_node("worm:snake_head_1_mapgen", mapgen_node)
minetest.register_node("worm:snake_tail_1_mapgen", mapgen_node)
minetest.register_node("worm:snake_black_head_1_mapgen", mapgen_node)
minetest.register_node("worm:snake__black_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)
@ -44,6 +46,23 @@ minetest.register_decoration({
},
})
-- Black 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_black_head_1_mapgen", param1=255, param2=3, force_place = true},
{name="worm:snake_black_body", param1=255, param2=3, force_place = true},
{name="worm:snake_black_body", param1=255, param2=3, force_place = true},
{name="worm:snake_black_tail_1_mapgen", param1=255, param2=3, force_place = true},
},
},
})
-- Worm
minetest.register_decoration({
deco_type = "schematic",

110
stone_eater.lua Normal file
View File

@ -0,0 +1,110 @@
-- Stone eater
-- Definition
-------------
local drop = ""
if default then
drop = {
max_items = 2,
items = {
{
items = {"default:coal_lump"},
rarity = 1,
},
{
items = {"default:gold_lump"},
rarity = 2,
},
{
items = {"default:iron_lump"},
rarity = 2,
},
{
items = {"default:copper_lump"},
rarity = 2,
},
},
}
end
local anm = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 3.0,
}
worm.register_worm("worm", "stone_eater", {
leftover = "mapgen_stone",
inventory_image = "stone_eater_face.png",
face_tile = {name = "stone_eater_face_animated.png", animation = anm},
side_tile = {name = "stone_eater_side_animated.png", animation = anm},
left_tile = {name = "stone_eater_side_animated.png^[transform62", animation = anm},
top_tile = {name = "stone_eater_top_animated.png", animation = anm},
bottem_tile = {name = "stone_eater_bottem_animated.png", animation = anm},
tail_tile = "stone_eater_tail.png",
node_damage = 4,
attack_damage = {fleshy = 8},
follow_nodes = {"group:swallowable"},
follow_objects = "straight",
follow_objects_radius = 8,
flying = true,
can_move = function(_, node)
local name = node.name
return minetest.registered_nodes[name].buildable_to or
minetest.get_node_group(name, "cracky") >= 3
end,
drop = drop,
})
-- Mapgen
---------
minetest.register_node("worm:stone_eater_head_1_mapgen", {
description = "worm mapgen node",
paramtype = "light",
paramtype2 = "facedir",
drawtype = "airlike",
groups = {not_in_creative_inventory = 1},
})
-- Place nodes and initialize the node timer.
minetest.register_lbm({
name = "worm:init_nodetimers_mapgen_underground",
nodenames = "worm:stone_eater_head_1_mapgen",
run_at_every_load = true,
action = function(pos, node)
node.name = "worm:stone_eater_head_1"
node.param2 = 0 -- TODO make random
local dir = minetest.facedir_to_dir(node.param2)
--local dir4 = vector.multiply(dir, 4)
--minetest.emerge_area(pos, vector.add(pos, dir4))
print("[worm]"..node.name.." spawned at "..pos.x..", "..pos.y..", "..pos.z)
minetest.swap_node(pos, node)
local headtimer = minetest.get_node_timer(pos)
node.name = "worm:stone_eater_body"
pos = vector.subtract(pos, dir)
minetest.set_node(pos, node)
pos = vector.subtract(pos, dir)
minetest.set_node(pos, node)
pos = vector.subtract(pos, dir)
minetest.set_node(pos, node)
node.name = "worm:stone_eater_tail_1"
pos = vector.subtract(pos, dir)
minetest.set_node(pos, node)
local tailtimer = minetest.get_node_timer(pos)
headtimer:set(worm.config.WALKING_PERIOD, 0)
tailtimer:set(worm.config.WALKING_PERIOD, 0)
print("tail at "..pos.x..", "..pos.y..", "..pos.z)
end,
})
minetest.register_ore({
oretype = "",
ore = "worm:stone_eater_head_1_mapgen",
wherein = "default:stone",
clust_scarcity = 16*16*16,
clust_num_ores = 1,
clust_size = 3,
height_min = -31000,
height_max = -100,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
textures/maggot_face.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
textures/maggot_tail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

BIN
textures/snake_attack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

BIN
textures/snake_side_red.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B