diff --git a/README.txt b/README.txt index 368a97d..f1a75ab 100644 --- a/README.txt +++ b/README.txt @@ -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 diff --git a/api.lua b/api.lua index 6599be2..2e6579a 100644 --- a/api.lua +++ b/api.lua @@ -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 diff --git a/examples.lua b/examples.lua index 008e240..b3b2df5 100644 --- a/examples.lua +++ b/examples.lua @@ -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, +}) \ No newline at end of file diff --git a/init.lua b/init.lua index 5351956..340d05f 100644 --- a/init.lua +++ b/init.lua @@ -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") diff --git a/mapgen.lua b/mapgen.lua index 98b587b..6b957c0 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -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", diff --git a/stone_eater.lua b/stone_eater.lua new file mode 100644 index 0000000..d7117af --- /dev/null +++ b/stone_eater.lua @@ -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, +}) \ No newline at end of file diff --git a/textures/caterpillar_bottem_animated.png b/textures/caterpillar_bottem_animated.png new file mode 100644 index 0000000..0f09c6c Binary files /dev/null and b/textures/caterpillar_bottem_animated.png differ diff --git a/textures/caterpillar_face.png b/textures/caterpillar_face.png new file mode 100644 index 0000000..068b282 Binary files /dev/null and b/textures/caterpillar_face.png differ diff --git a/textures/caterpillar_side_animated.png b/textures/caterpillar_side_animated.png new file mode 100644 index 0000000..2047b31 Binary files /dev/null and b/textures/caterpillar_side_animated.png differ diff --git a/textures/caterpillar_tail.png b/textures/caterpillar_tail.png new file mode 100644 index 0000000..a9094d0 Binary files /dev/null and b/textures/caterpillar_tail.png differ diff --git a/textures/caterpillar_top_animated.png b/textures/caterpillar_top_animated.png new file mode 100644 index 0000000..fac7302 Binary files /dev/null and b/textures/caterpillar_top_animated.png differ diff --git a/textures/maggot_bottem_animated.png b/textures/maggot_bottem_animated.png new file mode 100644 index 0000000..1e61750 Binary files /dev/null and b/textures/maggot_bottem_animated.png differ diff --git a/textures/maggot_face.png b/textures/maggot_face.png new file mode 100644 index 0000000..3b00906 Binary files /dev/null and b/textures/maggot_face.png differ diff --git a/textures/maggot_side_animated.png b/textures/maggot_side_animated.png new file mode 100644 index 0000000..9cc423f Binary files /dev/null and b/textures/maggot_side_animated.png differ diff --git a/textures/maggot_tail.png b/textures/maggot_tail.png new file mode 100644 index 0000000..bda835f Binary files /dev/null and b/textures/maggot_tail.png differ diff --git a/textures/maggot_top_animated.png b/textures/maggot_top_animated.png new file mode 100644 index 0000000..bf58c7e Binary files /dev/null and b/textures/maggot_top_animated.png differ diff --git a/textures/nyancat_front_animated.png b/textures/nyancat_front_animated.png new file mode 100644 index 0000000..5b22fc6 Binary files /dev/null and b/textures/nyancat_front_animated.png differ diff --git a/textures/nyancat_rainbow_animated.png b/textures/nyancat_rainbow_animated.png new file mode 100644 index 0000000..f0ee8a2 Binary files /dev/null and b/textures/nyancat_rainbow_animated.png differ diff --git a/textures/nyancat_rainbow_animated_b.png b/textures/nyancat_rainbow_animated_b.png new file mode 100644 index 0000000..faf0531 Binary files /dev/null and b/textures/nyancat_rainbow_animated_b.png differ diff --git a/textures/snake_attack.png b/textures/snake_attack.png new file mode 100644 index 0000000..aa91d58 Binary files /dev/null and b/textures/snake_attack.png differ diff --git a/textures/snake_attack_black.png b/textures/snake_attack_black.png new file mode 100644 index 0000000..c7fda1d Binary files /dev/null and b/textures/snake_attack_black.png differ diff --git a/textures/snake_face_black.png b/textures/snake_face_black.png new file mode 100644 index 0000000..a441bdd Binary files /dev/null and b/textures/snake_face_black.png differ diff --git a/textures/snake_side_animated.png b/textures/snake_side_animated.png new file mode 100644 index 0000000..92c8821 Binary files /dev/null and b/textures/snake_side_animated.png differ diff --git a/textures/snake_side_red.png b/textures/snake_side_red.png new file mode 100644 index 0000000..d87d8e7 Binary files /dev/null and b/textures/snake_side_red.png differ diff --git a/textures/snake_side_striped.png b/textures/snake_side_striped.png new file mode 100644 index 0000000..69ee154 Binary files /dev/null and b/textures/snake_side_striped.png differ diff --git a/textures/snake_side_striped_animated.png b/textures/snake_side_striped_animated.png new file mode 100644 index 0000000..e07a67b Binary files /dev/null and b/textures/snake_side_striped_animated.png differ diff --git a/textures/snake_side_yellow_black.png b/textures/snake_side_yellow_black.png new file mode 100644 index 0000000..a6421f4 Binary files /dev/null and b/textures/snake_side_yellow_black.png differ diff --git a/textures/snake_tail_black.png b/textures/snake_tail_black.png new file mode 100644 index 0000000..99b0a10 Binary files /dev/null and b/textures/snake_tail_black.png differ diff --git a/textures/stone_eater_bottem_animated.png b/textures/stone_eater_bottem_animated.png new file mode 100644 index 0000000..446f05d Binary files /dev/null and b/textures/stone_eater_bottem_animated.png differ diff --git a/textures/stone_eater_face.png b/textures/stone_eater_face.png new file mode 100644 index 0000000..de0a655 Binary files /dev/null and b/textures/stone_eater_face.png differ diff --git a/textures/stone_eater_face_animated.png b/textures/stone_eater_face_animated.png new file mode 100644 index 0000000..068e398 Binary files /dev/null and b/textures/stone_eater_face_animated.png differ diff --git a/textures/stone_eater_side_animated.png b/textures/stone_eater_side_animated.png new file mode 100644 index 0000000..7d3a363 Binary files /dev/null and b/textures/stone_eater_side_animated.png differ diff --git a/textures/stone_eater_tail.png b/textures/stone_eater_tail.png new file mode 100644 index 0000000..33533da Binary files /dev/null and b/textures/stone_eater_tail.png differ diff --git a/textures/stone_eater_top_animated.png b/textures/stone_eater_top_animated.png new file mode 100644 index 0000000..e29ae28 Binary files /dev/null and b/textures/stone_eater_top_animated.png differ diff --git a/textures/worm_bottem_animated.png b/textures/worm_bottem_animated.png new file mode 100644 index 0000000..26e5b71 Binary files /dev/null and b/textures/worm_bottem_animated.png differ diff --git a/textures/worm_face_animated.png b/textures/worm_face_animated.png new file mode 100644 index 0000000..cfa74e7 Binary files /dev/null and b/textures/worm_face_animated.png differ diff --git a/textures/worm_side_animated.png b/textures/worm_side_animated.png new file mode 100644 index 0000000..92fd897 Binary files /dev/null and b/textures/worm_side_animated.png differ diff --git a/textures/worm_top_animated.png b/textures/worm_top_animated.png new file mode 100644 index 0000000..d7b7cb7 Binary files /dev/null and b/textures/worm_top_animated.png differ