commit fa3a344eac9a65d5565f986aad0b41f767e61c22 Author: Der1248 Date: Thu Aug 16 18:14:37 2018 +0200 Sudoku 1.7.1 upload diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..97ad70a --- /dev/null +++ b/README.txt @@ -0,0 +1,28 @@ +Minetest Game [minetest_game] +============================= +The main subgame for the Minetest engine +======================================== + +To use this subgame with the Minetest engine, insert this repository as + /games/minetest_game + +The Minetest engine can be found in: + https://github.com/minetest/minetest/ + +Compatibility +-------------- +The Minetest Game github master HEAD is generally compatible with the github +master HEAD of the Minetest engine. + +Additionally, when the Minetest engine is tagged to be a certain version (eg. +0.4.10), Minetest Game is tagged with the version too. + +When stable releases are made, Minetest Game is packaged and made available in + http://minetest.net/download +and in case the repository has grown too much, it may be reset. In that sense, +this is not a "real" git repository. (Package maintainers please note!) + +Licensing +--------- + +See LICENSE.txt diff --git a/game.conf b/game.conf new file mode 100644 index 0000000..848d3cc --- /dev/null +++ b/game.conf @@ -0,0 +1 @@ +name = Sudoku diff --git a/menu/Thumbs.db b/menu/Thumbs.db new file mode 100644 index 0000000..d2aefdc Binary files /dev/null and b/menu/Thumbs.db differ diff --git a/menu/header.png b/menu/header.png new file mode 100644 index 0000000..a5c16eb Binary files /dev/null and b/menu/header.png differ diff --git a/menu/icon.png b/menu/icon.png new file mode 100644 index 0000000..23d34c8 Binary files /dev/null and b/menu/icon.png differ diff --git a/mods/a_sudoku/init.lua b/mods/a_sudoku/init.lua new file mode 100644 index 0000000..aa1b9f8 --- /dev/null +++ b/mods/a_sudoku/init.lua @@ -0,0 +1,21 @@ +local digtime = 42 +local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + +minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + range = 15, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + }, + damage_groups = {fleshy = 1}, + } +}) diff --git a/mods/a_sudoku/textures/default_desert_sand.png b/mods/a_sudoku/textures/default_desert_sand.png new file mode 100644 index 0000000..0e8aab1 Binary files /dev/null and b/mods/a_sudoku/textures/default_desert_sand.png differ diff --git a/mods/a_sudoku/textures/default_mossycobble.png b/mods/a_sudoku/textures/default_mossycobble.png new file mode 100644 index 0000000..81b64bf Binary files /dev/null and b/mods/a_sudoku/textures/default_mossycobble.png differ diff --git a/mods/a_sudoku/textures/default_sand.png b/mods/a_sudoku/textures/default_sand.png new file mode 100644 index 0000000..08c6ba5 Binary files /dev/null and b/mods/a_sudoku/textures/default_sand.png differ diff --git a/mods/a_sudoku/textures/wool_black.png b/mods/a_sudoku/textures/wool_black.png new file mode 100644 index 0000000..81b64bf Binary files /dev/null and b/mods/a_sudoku/textures/wool_black.png differ diff --git a/mods/beds/README.txt b/mods/beds/README.txt new file mode 100644 index 0000000..cda6ebd --- /dev/null +++ b/mods/beds/README.txt @@ -0,0 +1,26 @@ +Minetest Game mod: beds +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by BlockMen (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +BlockMen (CC BY-SA 3.0) + +This mod adds a bed to Minetest which allows to skip the night. +To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped +immediately. If playing multiplayer you get shown how many other players are in bed too, +if all players are sleeping the night gets skipped. The night skip can be forced if more +than 50% of the players are lying in bed and use this option. + +Another feature is a controlled respawning. If you have slept in bed (not just lying in +it) your respawn point is set to the beds location and you will respawn there after +death. +You can disable the respawn at beds by setting "enable_bed_respawn = false" in +minetest.conf. +You can disable the night skip feature by setting "enable_bed_night_skip = false" in +minetest.conf or by using the /set command in-game. diff --git a/mods/beds/api.lua b/mods/beds/api.lua new file mode 100644 index 0000000..97dde43 --- /dev/null +++ b/mods/beds/api.lua @@ -0,0 +1,167 @@ + +local reverse = true + +local function destruct_bed(pos, n) + local node = minetest.get_node(pos) + local other + + if n == 2 then + local dir = minetest.facedir_to_dir(node.param2) + other = vector.subtract(pos, dir) + elseif n == 1 then + local dir = minetest.facedir_to_dir(node.param2) + other = vector.add(pos, dir) + end + + if reverse then + reverse = not reverse + minetest.remove_node(other) + minetest.check_for_falling(other) + else + reverse = not reverse + end +end + +function beds.register_bed(name, def) + minetest.register_node(name .. "_bottom", { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + drawtype = "nodebox", + tiles = def.tiles.bottom, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + stack_max = 1, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.bottom, + }, + selection_box = { + type = "fixed", + fixed = def.selectionbox, + }, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local pos + if minetest.registered_items[minetest.get_node(under).name].buildable_to then + pos = under + else + pos = pointed_thing.above + end + + if minetest.is_protected(pos, placer:get_player_name()) and + not minetest.check_player_privs(placer, "protection_bypass") then + minetest.record_protection_violation(pos, placer:get_player_name()) + return itemstack + end + + local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + if not node_def or not node_def.buildable_to then + return itemstack + end + + local dir = minetest.dir_to_facedir(placer:get_look_dir()) + local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) + + if minetest.is_protected(botpos, placer:get_player_name()) and + not minetest.check_player_privs(placer, "protection_bypass") then + minetest.record_protection_violation(botpos, placer:get_player_name()) + return itemstack + end + + local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] + if not botdef or not botdef.buildable_to then + return itemstack + end + + minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) + minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + return itemstack + end, + + on_destruct = function(pos) + destruct_bed(pos, 1) + end, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + beds.on_rightclick(pos, clicker) + return itemstack + end, + + on_rotate = function(pos, node, user, mode, new_param2) + local dir = minetest.facedir_to_dir(node.param2) + local p = vector.add(pos, dir) + local node2 = minetest.get_node_or_nil(p) + if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or + not node.param2 == node2.param2 then + return false + end + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + if mode ~= screwdriver.ROTATE_FACE then + return false + end + local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) + local node3 = minetest.get_node_or_nil(newp) + local node_def = node3 and minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then + return false + end + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + node.param2 = new_param2 + -- do not remove_node here - it will trigger destroy_bed() + minetest.set_node(p, {name = "air"}) + minetest.set_node(pos, node) + minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) + return true + end, + }) + + minetest.register_node(name .. "_top", { + drawtype = "nodebox", + tiles = def.tiles.top, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + pointable = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, + sounds = def.sounds or default.node_sound_wood_defaults(), + drop = name .. "_bottom", + node_box = { + type = "fixed", + fixed = def.nodebox.top, + }, + on_destruct = function(pos) + destruct_bed(pos, 2) + end, + }) + + minetest.register_alias(name, name .. "_bottom") + + minetest.register_craft({ + output = name, + recipe = def.recipe + }) +end diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua new file mode 100644 index 0000000..bb2fd5d --- /dev/null +++ b/mods/beds/beds.lua @@ -0,0 +1,104 @@ +-- Fancy shaped bed + +beds.register_bed("beds:fancy_bed", { + description = "Fancy Bed", + inventory_image = "beds_bed_fancy.png", + wield_image = "beds_bed_fancy.png", + tiles = { + bottom = { + "beds_bed_top1.png", + "default_wood.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "default_wood.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "default_wood.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "default_wood.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:red", "wool:red", "wool:white"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +-- Simple shaped bed + +beds.register_bed("beds:bed", { + description = "Simple Bed", + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "default_wood.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformfx", + "beds_transparent.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "default_wood.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "beds_transparent.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"wool:red", "wool:red", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + }, +}) + +-- Aliases for PilzAdam's beds mod + +minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") +minetest.register_alias("beds:bed_top_red", "beds:bed_top") + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "beds:fancy_bed_bottom", + burntime = 13, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "beds:bed_bottom", + burntime = 12, +}) diff --git a/mods/beds/depends.txt b/mods/beds/depends.txt new file mode 100644 index 0000000..470ec30 --- /dev/null +++ b/mods/beds/depends.txt @@ -0,0 +1,2 @@ +default +wool diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua new file mode 100644 index 0000000..78df9a1 --- /dev/null +++ b/mods/beds/functions.lua @@ -0,0 +1,220 @@ +local pi = math.pi +local player_in_bed = 0 +local is_sp = minetest.is_singleplayer() +local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") +if enable_respawn == nil then + enable_respawn = true +end + +-- Helper functions + +local function get_look_yaw(pos) + local n = minetest.get_node(pos) + if n.param2 == 1 then + return pi / 2, n.param2 + elseif n.param2 == 3 then + return -pi / 2, n.param2 + elseif n.param2 == 0 then + return pi, n.param2 + else + return 0, n.param2 + end +end + +local function is_night_skip_enabled() + local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") + if enable_night_skip == nil then + enable_night_skip = true + end + return enable_night_skip +end + +local function check_in_beds(players) + local in_bed = beds.player + if not players then + players = minetest.get_connected_players() + end + + for n, player in ipairs(players) do + local name = player:get_player_name() + if not in_bed[name] then + return false + end + end + + return #players > 0 +end + +local function lay_down(player, pos, bed_pos, state, skip) + local name = player:get_player_name() + local hud_flags = player:hud_get_flags() + + if not player or not name then + return + end + + -- stand up + if state ~= nil and not state then + local p = beds.pos[name] or nil + if beds.player[name] ~= nil then + beds.player[name] = nil + player_in_bed = player_in_bed - 1 + end + -- skip here to prevent sending player specific changes (used for leaving players) + if skip then + return + end + if p then + player:setpos(p) + end + + -- physics, eye_offset, etc + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_look_horizontal(math.random(1, 180) / 100) + default.player_attached[name] = false + player:set_physics_override(1, 1, 1) + hud_flags.wielditem = true + default.player_set_animation(player, "stand" , 30) + + -- lay down + else + beds.player[name] = 1 + beds.pos[name] = pos + player_in_bed = player_in_bed + 1 + + -- physics, eye_offset, etc + player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) + local yaw, param2 = get_look_yaw(bed_pos) + player:set_look_horizontal(yaw) + local dir = minetest.facedir_to_dir(param2) + local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} + player:set_physics_override(0, 0, 0) + player:setpos(p) + default.player_attached[name] = true + hud_flags.wielditem = false + default.player_set_animation(player, "lay" , 0) + end + + player:hud_set_flags(hud_flags) +end + +local function update_formspecs(finished) + local ges = #minetest.get_connected_players() + local form_n + local is_majority = (ges / 2) < player_in_bed + + if finished then + form_n = beds.formspec .. "label[2.7,11; Good morning.]" + else + form_n = beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. + " of " .. tostring(ges) .. " players are in bed]" + if is_majority and is_night_skip_enabled() then + form_n = form_n .. "button_exit[2,8;4,0.75;force;Force night skip]" + end + end + + for name,_ in pairs(beds.player) do + minetest.show_formspec(name, "beds_form", form_n) + end +end + + +-- Public functions + +function beds.kick_players() + for name, _ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + lay_down(player, nil, nil, false) + end +end + +function beds.skip_night() + minetest.set_timeofday(0.23) +end + +function beds.on_rightclick(pos, player) + local name = player:get_player_name() + local ppos = player:getpos() + local tod = minetest.get_timeofday() + + if tod > 0.2 and tod < 0.805 then + if beds.player[name] then + lay_down(player, nil, nil, false) + end + minetest.chat_send_player(name, "You can only sleep at night.") + return + end + + -- move to bed + if not beds.player[name] then + lay_down(player, ppos, pos) + beds.set_spawns() -- save respawn positions when entering bed + else + lay_down(player, nil, nil, false) + end + + if not is_sp then + update_formspecs(false) + end + + -- skip the night and let all players stand up + if check_in_beds() then + minetest.after(2, function() + if not is_sp then + update_formspecs(is_night_skip_enabled()) + end + if is_night_skip_enabled() then + beds.skip_night() + beds.kick_players() + end + end) + end +end + + +-- Callbacks +-- Only register respawn callback if respawn enabled +if enable_respawn then + -- respawn player at bed if enabled and valid position is found + minetest.register_on_respawnplayer(function(player) + local name = player:get_player_name() + local pos = beds.spawn[name] + if pos then + player:setpos(pos) + return true + end + end) +end + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + lay_down(player, nil, nil, false, true) + beds.player[name] = nil + if check_in_beds() then + minetest.after(2, function() + update_formspecs(is_night_skip_enabled()) + if is_night_skip_enabled() then + beds.skip_night() + beds.kick_players() + end + end) + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "beds_form" then + return + end + if fields.quit or fields.leave then + lay_down(player, nil, nil, false) + update_formspecs(false) + end + + if fields.force then + update_formspecs(is_night_skip_enabled()) + if is_night_skip_enabled() then + beds.skip_night() + beds.kick_players() + end + end +end) diff --git a/mods/beds/init.lua b/mods/beds/init.lua new file mode 100644 index 0000000..8b25890 --- /dev/null +++ b/mods/beds/init.lua @@ -0,0 +1,17 @@ +beds = {} +beds.player = {} +beds.pos = {} +beds.spawn = {} + +beds.formspec = "size[8,15;true]" .. + "bgcolor[#080808BB; true]" .. + "button_exit[2,12;4,0.75;leave;Leave Bed]" + +local modpath = minetest.get_modpath("beds") + +-- Load files + +dofile(modpath .. "/functions.lua") +dofile(modpath .. "/api.lua") +dofile(modpath .. "/beds.lua") +dofile(modpath .. "/spawns.lua") diff --git a/mods/beds/license.txt b/mods/beds/license.txt new file mode 100644 index 0000000..0494b36 --- /dev/null +++ b/mods/beds/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/beds/spawns.lua b/mods/beds/spawns.lua new file mode 100644 index 0000000..6b1f404 --- /dev/null +++ b/mods/beds/spawns.lua @@ -0,0 +1,63 @@ +local world_path = minetest.get_worldpath() +local org_file = world_path .. "/beds_spawns" +local file = world_path .. "/beds_spawns" +local bkwd = false + +-- check for PA's beds mod spawns +local cf = io.open(world_path .. "/beds_player_spawns", "r") +if cf ~= nil then + io.close(cf) + file = world_path .. "/beds_player_spawns" + bkwd = true +end + +function beds.read_spawns() + local spawns = beds.spawn + local input = io.open(file, "r") + if input and not bkwd then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + elseif input and bkwd then + beds.spawn = minetest.deserialize(input:read("*all")) + input:close() + beds.save_spawns() + os.rename(file, file .. ".backup") + file = org_file + end +end + +beds.read_spawns() + +function beds.save_spawns() + if not beds.spawn then + return + end + local data = {} + local output = io.open(org_file, "w") + for k, v in pairs(beds.spawn) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, k)) + end + output:write(table.concat(data)) + io.close(output) +end + +function beds.set_spawns() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + local p = player:getpos() + -- but don't change spawn location if borrowing a bed + if not minetest.is_protected(p, name) then + beds.spawn[name] = p + end + end + beds.save_spawns() +end diff --git a/mods/beds/textures/beds_bed.png b/mods/beds/textures/beds_bed.png new file mode 100644 index 0000000..5c0054c Binary files /dev/null and b/mods/beds/textures/beds_bed.png differ diff --git a/mods/beds/textures/beds_bed_fancy.png b/mods/beds/textures/beds_bed_fancy.png new file mode 100644 index 0000000..4f9e8a7 Binary files /dev/null and b/mods/beds/textures/beds_bed_fancy.png differ diff --git a/mods/beds/textures/beds_bed_foot.png b/mods/beds/textures/beds_bed_foot.png new file mode 100644 index 0000000..74d84c8 Binary files /dev/null and b/mods/beds/textures/beds_bed_foot.png differ diff --git a/mods/beds/textures/beds_bed_head.png b/mods/beds/textures/beds_bed_head.png new file mode 100644 index 0000000..763f5e1 Binary files /dev/null and b/mods/beds/textures/beds_bed_head.png differ diff --git a/mods/beds/textures/beds_bed_side1.png b/mods/beds/textures/beds_bed_side1.png new file mode 100644 index 0000000..1ed8158 Binary files /dev/null and b/mods/beds/textures/beds_bed_side1.png differ diff --git a/mods/beds/textures/beds_bed_side2.png b/mods/beds/textures/beds_bed_side2.png new file mode 100644 index 0000000..9d1384d Binary files /dev/null and b/mods/beds/textures/beds_bed_side2.png differ diff --git a/mods/beds/textures/beds_bed_side_bottom.png b/mods/beds/textures/beds_bed_side_bottom.png new file mode 100644 index 0000000..99ff309 Binary files /dev/null and b/mods/beds/textures/beds_bed_side_bottom.png differ diff --git a/mods/beds/textures/beds_bed_side_bottom_r.png b/mods/beds/textures/beds_bed_side_bottom_r.png new file mode 100644 index 0000000..6f870e8 Binary files /dev/null and b/mods/beds/textures/beds_bed_side_bottom_r.png differ diff --git a/mods/beds/textures/beds_bed_side_top.png b/mods/beds/textures/beds_bed_side_top.png new file mode 100644 index 0000000..b2807c5 Binary files /dev/null and b/mods/beds/textures/beds_bed_side_top.png differ diff --git a/mods/beds/textures/beds_bed_side_top_r.png b/mods/beds/textures/beds_bed_side_top_r.png new file mode 100644 index 0000000..429ad7d Binary files /dev/null and b/mods/beds/textures/beds_bed_side_top_r.png differ diff --git a/mods/beds/textures/beds_bed_top1.png b/mods/beds/textures/beds_bed_top1.png new file mode 100644 index 0000000..b6fcc2c Binary files /dev/null and b/mods/beds/textures/beds_bed_top1.png differ diff --git a/mods/beds/textures/beds_bed_top2.png b/mods/beds/textures/beds_bed_top2.png new file mode 100644 index 0000000..2fe5bf2 Binary files /dev/null and b/mods/beds/textures/beds_bed_top2.png differ diff --git a/mods/beds/textures/beds_bed_top_bottom.png b/mods/beds/textures/beds_bed_top_bottom.png new file mode 100644 index 0000000..9b78be6 Binary files /dev/null and b/mods/beds/textures/beds_bed_top_bottom.png differ diff --git a/mods/beds/textures/beds_bed_top_top.png b/mods/beds/textures/beds_bed_top_top.png new file mode 100644 index 0000000..e877c80 Binary files /dev/null and b/mods/beds/textures/beds_bed_top_top.png differ diff --git a/mods/beds/textures/beds_transparent.png b/mods/beds/textures/beds_transparent.png new file mode 100644 index 0000000..2dc0e3d Binary files /dev/null and b/mods/beds/textures/beds_transparent.png differ diff --git a/mods/boats/README.txt b/mods/boats/README.txt new file mode 100644 index 0000000..59631d9 --- /dev/null +++ b/mods/boats/README.txt @@ -0,0 +1,15 @@ +Minetest Game mod: boats +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures and model) +------------------------------------- +Textures: Zeg9 (CC BY-SA 3.0) +Model: thetoon and Zeg9 (CC BY-SA 3.0), + modified by PavelS(SokolovPavel) (CC BY-SA 3.0), + modified by sofar (CC BY-SA 3.0) diff --git a/mods/boats/depends.txt b/mods/boats/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/boats/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/boats/init.lua b/mods/boats/init.lua new file mode 100644 index 0000000..4d8f467 --- /dev/null +++ b/mods/boats/init.lua @@ -0,0 +1,271 @@ +-- +-- Helper functions +-- + +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 0 +end + + +local function get_sign(i) + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + +-- +-- Boat entity +-- + +local boat = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boats_boat.obj", + textures = {"default_wood.png"}, + + driver = nil, + v = 0, + last_v = 0, + removed = false +} + + +function boat.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then + self.driver = nil + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + end + self.driver = clicker + clicker:set_attach(self.object, "", + {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + + +function boat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end + self.last_v = self.v +end + + +function boat.get_staticdata(self) + return tostring(self.v) +end + + +function boat.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + if self.driver and puncher == self.driver then + self.driver = nil + puncher:set_detach() + default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then + self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "boats:boat") then + local leftover = inv:add_item("main", "boats:boat") + -- if no room in inventory add a replacement boat to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + end +end + + +function boat.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + if self.driver then + local ctrl = self.driver:get_player_control() + local yaw = self.object:getyaw() + if ctrl.up then + self.v = self.v + 0.1 + elseif ctrl.down then + self.v = self.v - 0.1 + end + if ctrl.left then + if self.v < 0 then + self.object:setyaw(yaw - (1 + dtime) * 0.03) + else + self.object:setyaw(yaw + (1 + dtime) * 0.03) + end + elseif ctrl.right then + if self.v < 0 then + self.object:setyaw(yaw + (1 + dtime) * 0.03) + else + self.object:setyaw(yaw - (1 + dtime) * 0.03) + end + end + end + local velo = self.object:getvelocity() + if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:setpos(self.object:getpos()) + return + end + local s = get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= get_sign(self.v) then + self.object:setvelocity({x = 0, y = 0, z = 0}) + self.v = 0 + return + end + if math.abs(self.v) > 5 then + self.v = 5 * get_sign(self.v) + end + + local p = self.object:getpos() + p.y = p.y - 0.5 + local new_velo + local new_acce = {x = 0, y = 0, z = 0} + if not is_water(p) then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then + self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + else + p.y = p.y + 1 + if is_water(p) then + local y = self.object:getvelocity().y + if y >= 5 then + y = 5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), y) + self.object:setpos(self.object:getpos()) + else + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:getvelocity().y) < 1 then + local pos = self.object:getpos() + pos.y = math.floor(pos.y) + 0.5 + self.object:setpos(pos) + new_velo = get_velocity(self.v, self.object:getyaw(), 0) + else + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + end + end + end + self.object:setvelocity(new_velo) + self.object:setacceleration(new_acce) +end + + +minetest.register_entity("boats:boat", boat) + + +minetest.register_craftitem("boats:boat", { + description = "Boat", + inventory_image = "boats_inventory.png", + wield_image = "boats_wield.png", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + groups = {flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + if not is_water(pointed_thing.under) then + return itemstack + end + pointed_thing.under.y = pointed_thing.under.y + 0.5 + boat = minetest.add_entity(pointed_thing.under, "boats:boat") + if boat then + boat:setyaw(placer:get_look_horizontal()) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +minetest.register_craft({ + output = "boats:boat", + recipe = { + {"", "", "" }, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "boats:boat", + burntime = 20, +}) diff --git a/mods/boats/license.txt b/mods/boats/license.txt new file mode 100644 index 0000000..d4afe75 --- /dev/null +++ b/mods/boats/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures and model) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Zeg9 +Copyright (C) 2012-2016 thetoon +Copyright (C) 2012-2016 PavelS(SokolovPavel) +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/boats/models/boats_boat.obj b/mods/boats/models/boats_boat.obj new file mode 100644 index 0000000..0f21e47 --- /dev/null +++ b/mods/boats/models/boats_boat.obj @@ -0,0 +1,358 @@ +# Blender v2.76 (sub 11) OBJ File: 'boat.blend' +# www.blender.org +mtllib boat.mtl +o boats_boat +v -6.786140 -3.033999 -9.415440 +v -6.786140 -1.967150 -9.415440 +v -6.786140 -1.967150 8.793510 +v -6.786140 -3.033999 8.793510 +v 5.732520 -1.967150 -9.415440 +v 5.732520 -3.033999 -9.415440 +v 5.732520 -3.033999 8.793510 +v 5.732520 -1.967150 8.793510 +v -2.233900 -3.033999 -9.415440 +v -2.233900 -1.967150 -9.415440 +v -2.233900 -1.967150 8.793510 +v -2.233900 -3.033999 8.793510 +v 2.318340 -3.033999 -9.415440 +v 2.318340 -1.967150 -9.415440 +v 2.318340 -1.967150 8.793510 +v 2.318340 -3.033999 8.793510 +v -3.371960 -3.033999 8.793510 +v -3.371960 -1.967150 8.793510 +v -3.371960 -1.967150 -9.415440 +v -3.371960 -3.033999 -9.415440 +v 2.318340 0.276645 8.793510 +v 1.180280 -1.967150 8.793510 +v 5.732520 0.276645 8.793510 +v 5.732520 1.039180 8.793510 +v 6.870580 0.276645 8.793510 +v 6.870580 -1.967150 8.793510 +v 2.318340 1.039180 8.793510 +v 1.180280 0.276645 8.793510 +v 1.180280 1.039180 8.793510 +v 1.180280 -3.033999 8.793510 +v -2.233900 0.276645 8.793510 +v -3.371960 0.276645 8.793510 +v -2.233900 1.039180 8.793510 +v -3.371960 1.039180 8.793510 +v -6.786140 0.276645 8.793510 +v -7.786200 0.276645 8.793510 +v -7.786200 -1.967150 8.793510 +v -6.786140 1.039180 8.793510 +v 1.180280 -1.967150 -9.415440 +v 1.180280 -3.033999 -9.415440 +v 2.318340 0.276645 -9.415440 +v 1.180280 0.276645 -9.415440 +v 2.318340 1.039180 -9.415440 +v 5.732520 0.276645 -9.415440 +v 6.870580 -1.967150 -9.415440 +v 5.732520 1.039180 -9.415440 +v 6.870580 0.276645 -9.415440 +v 0.042220 1.039180 -9.415440 +v 1.180280 1.039180 -9.415440 +v 0.042220 -1.967150 -9.415440 +v -1.095840 -1.967150 -9.415440 +v -2.233900 0.276645 -9.415440 +v -3.371960 0.276645 -9.415440 +v -2.233900 1.039180 -9.415440 +v -1.095840 1.039180 -9.415440 +v -3.371960 1.039180 -9.415440 +v -6.786140 0.276645 -9.415440 +v -6.786140 1.039180 -9.415440 +v -7.786200 -1.967150 -9.415440 +v -7.786200 0.276645 -9.415440 +v -1.095840 0.156645 -12.044100 +v -1.095840 -4.601110 -9.415440 +v -1.095840 1.039181 -10.802900 +v -1.095840 2.868579 -10.802900 +v -1.095840 2.868580 -7.883420 +v -1.095840 3.746069 -12.034100 +v -1.095840 3.746070 -7.883420 +v -1.095840 0.156645 -14.294900 +v -1.095840 -4.601110 -14.284900 +v 0.042220 -4.601110 -14.284900 +v 0.042220 -4.601110 -9.415440 +v 0.042220 1.039181 -10.802900 +v 0.042220 0.156645 -12.044100 +v 0.042220 2.868579 -10.802900 +v 0.042220 0.156645 -14.294900 +v 0.042220 3.746069 -12.034100 +v 0.042220 3.746070 -7.883420 +v 0.042220 2.868580 -7.883420 +v -1.096322 -3.033999 -9.415440 +v 0.044046 -3.035397 -9.415440 +vt 1.000000 0.187500 +vt -1.000000 0.312500 +vt 1.000000 0.312500 +vt 0.687500 1.000000 +vt 0.500000 0.875000 +vt 0.500000 0.625000 +vt -1.000000 0.062500 +vt 1.000000 0.062500 +vt 1.000000 -0.000000 +vt -1.000000 0.125000 +vt 1.000000 0.125000 +vt 0.437500 0.125000 +vt 0.312500 0.500000 +vt 0.312500 0.125000 +vt 1.000000 0.625000 +vt -1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.187500 0.687500 +vt -0.187500 0.687500 +vt -0.187500 0.312500 +vt 1.000000 0.812500 +vt -1.000000 0.937500 +vt -1.000000 0.812500 +vt 0.812500 0.687500 +vt 1.187500 0.687500 +vt 0.812500 0.312500 +vt 1.000000 0.562500 +vt 0.312500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.750000 +vt -1.000000 0.875000 +vt -1.000000 0.750000 +vt -1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.437500 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.625000 +vt -1.000000 0.437500 +vt -1.000000 0.000000 +vt 0.500000 0.062500 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt -1.000000 0.250000 +vt -1.000000 0.687500 +vt 1.000000 0.687500 +vt 0.625000 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.250000 +vt 1.000000 0.937500 +vt 0.437500 0.812500 +vt 0.312500 0.312500 +vt 0.312500 0.812500 +vt 0.437500 0.312500 +vt 0.437500 0.437500 +vt 0.687500 0.812500 +vt 0.000000 0.687500 +vt 0.000000 0.812500 +vt -1.000000 0.562500 +vt 0.875000 0.812500 +vt 0.875000 0.687500 +vt 0.250000 0.312500 +vt 0.562500 0.187500 +vt 0.250000 0.187500 +vt -1.000000 0.187500 +vt 0.312500 0.625000 +vt 0.312500 0.187500 +vt 0.312500 -0.187500 +vt 1.000000 -0.187500 +vt 0.687500 0.500000 +vt -0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.437500 0.500000 +vt -1.000000 0.625000 +vt 0.812500 0.187500 +vt 1.187500 0.187500 +vt 1.187500 0.312500 +vt 1.312500 0.312500 +vt 1.312500 0.687500 +vt 0.687500 0.187500 +vt 0.687500 0.312500 +vt 1.187500 0.812500 +vt 0.812500 0.812500 +vt 0.187500 0.312500 +vt 0.312500 0.687500 +vt 0.687500 0.687500 +vt -0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.312500 0.687500 +vt -0.312500 0.312500 +vt 0.187500 0.812500 +vt -0.187500 0.812500 +vt 0.437500 0.687500 +vt 0.437500 0.187500 +vt 0.562500 0.812500 +vt 0.562500 0.687500 +vt 0.312500 0.562500 +vt 1.000000 0.875000 +vt 0.375000 0.062500 +vt -1.000000 0.375000 +vt 0.625000 0.500000 +vt 0.875000 0.562500 +vt 0.937500 0.812500 +vt 0.937500 0.687500 +vt 0.875000 0.937500 +vt 0.562500 0.312500 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.002100 -1.000000 +vn 0.001200 -1.000000 0.000000 +vn 0.000000 0.002800 -1.000000 +vn -0.001200 -1.000000 0.000200 +g boats_boat_boats_boat_None +usemtl None +s off +f 41/1/1 27/2/1 43/3/1 +f 76/4/2 74/5/2 72/6/2 +f 8/7/2 6/1/2 5/8/2 +f 15/9/1 13/10/1 16/11/1 +f 51/12/3 71/13/3 50/14/3 +f 56/15/2 32/16/2 53/17/2 +f 15/18/3 8/19/3 23/20/3 +f 22/21/2 40/22/2 39/23/2 +f 19/24/4 2/25/4 53/26/4 +f 70/27/5 62/28/5 69/29/5 +f 11/30/5 19/31/5 10/32/5 +f 4/15/5 20/33/5 17/34/5 +f 72/35/3 64/36/3 63/37/3 +f 13/8/5 7/38/5 16/7/5 +f 23/39/6 47/11/6 44/9/6 +f 68/40/7 70/41/7 69/42/7 +f 80/43/8 40/10/8 30/11/8 +f 3/15/1 1/32/1 4/30/1 +f 20/44/2 18/27/2 17/45/2 +f 74/17/5 65/46/5 64/47/5 +f 31/43/1 54/47/1 52/48/1 +f 22/47/5 14/43/5 15/48/5 +f 46/1/2 23/7/2 44/8/2 +f 57/21/1 38/22/1 58/49/1 +f 61/50/9 76/51/9 73/52/9 +f 37/45/5 2/23/5 3/21/5 +f 78/28/3 67/53/3 65/54/3 +f 64/5/1 66/4/1 63/6/1 +f 76/55/6 67/56/6 77/57/6 +f 47/17/2 26/10/2 45/11/2 +f 5/16/5 26/47/5 8/17/5 +f 33/58/6 48/59/6 55/60/6 +f 29/38/2 42/3/2 49/29/2 +f 32/44/6 52/21/6 53/45/6 +f 58/15/6 34/33/6 56/34/6 +f 27/7/6 46/29/6 43/8/6 +f 73/61/6 68/62/6 61/63/6 +f 21/58/6 42/29/6 28/38/6 +f 11/29/1 9/58/1 12/27/1 +f 59/45/1 36/2/1 60/3/1 +f 60/9/6 35/10/6 57/11/6 +f 41/1/1 21/64/1 27/2/1 +f 72/6/2 48/65/2 50/66/2 +f 50/66/2 71/67/2 70/68/2 +f 70/68/2 75/17/2 73/69/2 +f 76/4/2 77/70/2 74/5/2 +f 77/70/2 78/71/2 74/5/2 +f 50/66/2 70/68/2 73/69/2 +f 73/69/2 76/4/2 72/6/2 +f 72/6/2 50/66/2 73/69/2 +f 8/7/2 7/64/2 6/1/2 +f 15/9/1 14/39/1 13/10/1 +f 51/12/3 62/72/3 71/13/3 +f 56/15/2 34/73/2 32/16/2 +f 32/26/3 34/74/3 38/75/3 +f 35/76/3 36/77/3 37/78/3 +f 32/26/3 38/75/3 35/76/3 +f 29/66/3 33/79/3 31/80/3 +f 32/26/3 35/76/3 3/25/3 +f 28/51/3 29/66/3 31/80/3 +f 31/80/3 32/26/3 18/24/3 +f 3/25/3 4/81/3 17/82/3 +f 35/76/3 37/78/3 3/25/3 +f 21/83/3 28/51/3 22/84/3 +f 3/25/3 17/82/3 18/24/3 +f 11/85/3 12/55/3 30/52/3 +f 32/26/3 3/25/3 18/24/3 +f 11/85/3 30/52/3 22/84/3 +f 31/80/3 18/24/3 11/85/3 +f 24/86/3 27/87/3 21/83/3 +f 28/51/3 31/80/3 11/85/3 +f 11/85/3 22/84/3 28/51/3 +f 24/86/3 21/83/3 23/20/3 +f 26/88/3 25/89/3 23/20/3 +f 23/20/3 21/83/3 15/18/3 +f 15/18/3 16/90/3 7/91/3 +f 21/83/3 22/84/3 15/18/3 +f 8/19/3 26/88/3 23/20/3 +f 15/18/3 7/91/3 8/19/3 +f 22/21/2 30/49/2 40/22/2 +f 47/89/4 45/88/4 5/19/4 +f 5/19/4 6/91/4 13/90/4 +f 5/19/4 13/90/4 14/18/4 +f 44/20/4 47/89/4 5/19/4 +f 43/87/4 46/86/4 44/20/4 +f 41/83/4 43/87/4 44/20/4 +f 44/20/4 5/19/4 14/18/4 +f 39/84/4 40/52/4 80/50/4 +f 44/20/4 14/18/4 41/83/4 +f 42/51/4 41/83/4 39/84/4 +f 39/84/4 80/50/4 50/92/4 +f 41/83/4 14/18/4 39/84/4 +f 48/93/4 49/66/4 42/51/4 +f 50/92/4 48/93/4 42/51/4 +f 80/50/4 79/94/4 50/92/4 +f 50/92/4 42/51/4 39/84/4 +f 54/79/4 55/62/4 52/80/4 +f 50/92/4 79/94/4 51/95/4 +f 52/80/4 55/62/4 51/95/4 +f 51/95/4 79/94/4 10/85/4 +f 79/94/4 9/55/4 10/85/4 +f 53/26/4 52/80/4 10/85/4 +f 58/75/4 56/74/4 53/26/4 +f 59/78/4 60/77/4 57/76/4 +f 57/76/4 58/75/4 53/26/4 +f 52/80/4 51/95/4 10/85/4 +f 19/24/4 20/82/4 1/81/4 +f 53/26/4 10/85/4 19/24/4 +f 59/78/4 57/76/4 2/25/4 +f 19/24/4 1/81/4 2/25/4 +f 2/25/4 57/76/4 53/26/4 +f 70/27/5 71/96/5 62/28/5 +f 11/30/5 18/97/5 19/31/5 +f 4/15/5 1/73/5 20/33/5 +f 72/35/3 74/54/3 64/36/3 +f 13/8/5 6/29/5 7/38/5 +f 23/39/6 25/10/6 47/11/6 +f 68/40/7 75/98/7 70/41/7 +f 30/11/5 12/17/5 79/99/5 +f 79/99/10 80/43/10 30/11/10 +f 12/17/5 9/16/5 79/99/5 +f 3/15/1 2/73/1 1/32/1 +f 20/44/2 19/58/2 18/27/2 +f 74/17/5 78/100/5 65/46/5 +f 31/43/1 33/99/1 54/47/1 +f 22/47/5 39/99/5 14/43/5 +f 46/1/2 24/64/2 23/7/2 +f 57/21/1 35/23/1 38/22/1 +f 61/50/9 66/53/9 76/51/9 +f 37/45/5 59/44/5 2/23/5 +f 78/28/3 77/51/3 67/53/3 +f 62/67/1 51/66/1 69/68/1 +f 51/66/1 55/65/1 63/6/1 +f 68/17/1 69/68/1 61/69/1 +f 61/69/1 69/68/1 51/66/1 +f 61/69/1 51/66/1 63/6/1 +f 65/71/1 67/70/1 64/5/1 +f 61/69/1 63/6/1 66/4/1 +f 64/5/1 67/70/1 66/4/1 +f 76/55/6 66/85/6 67/56/6 +f 47/17/2 25/16/2 26/10/2 +f 5/16/5 45/99/5 26/47/5 +f 55/60/6 54/101/6 33/58/6 +f 33/58/6 29/22/6 48/59/6 +f 48/59/6 72/102/6 63/103/6 +f 29/22/6 49/104/6 48/59/6 +f 48/59/6 63/103/6 55/60/6 +f 29/38/2 28/2/2 42/3/2 +f 32/44/6 31/23/6 52/21/6 +f 58/15/6 38/73/6 34/33/6 +f 27/7/6 24/38/6 46/29/6 +f 73/61/6 75/105/6 68/62/6 +f 21/58/6 41/27/6 42/29/6 +f 11/29/1 10/38/1 9/58/1 +f 59/45/1 37/44/1 36/2/1 +f 60/9/6 36/39/6 35/10/6 diff --git a/mods/boats/textures/boats_inventory.png b/mods/boats/textures/boats_inventory.png new file mode 100644 index 0000000..f9d082e Binary files /dev/null and b/mods/boats/textures/boats_inventory.png differ diff --git a/mods/boats/textures/boats_wield.png b/mods/boats/textures/boats_wield.png new file mode 100644 index 0000000..f998b5b Binary files /dev/null and b/mods/boats/textures/boats_wield.png differ diff --git a/mods/bones/README.txt b/mods/bones/README.txt new file mode 100644 index 0000000..91bcd10 --- /dev/null +++ b/mods/bones/README.txt @@ -0,0 +1,12 @@ +Minetest Game mod: bones +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +All textures: paramat (CC BY-SA 3.0) diff --git a/mods/bones/depends.txt b/mods/bones/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/bones/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/bones/init.lua b/mods/bones/init.lua new file mode 100644 index 0000000..9583bc2 --- /dev/null +++ b/mods/bones/init.lua @@ -0,0 +1,249 @@ +-- Minetest 0.4 mod: bones +-- See README.txt for licensing and other information. + +local function is_owner(pos, name) + local owner = minetest.get_meta(pos):get_string("owner") + if owner == "" or owner == name or minetest.check_player_privs(name, "protection_bypass") then + return true + end + return false +end + +local bones_formspec = + "size[8,9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[current_name;main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + +local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or 1200 +local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4 + +minetest.register_node("bones:bones", { + description = "Bones", + tiles = { + "bones_top.png^[transform2", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {dig_immediate = 2}, + sounds = default.node_sound_gravel_defaults(), + + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + local name = "" + if player then + name = player:get_player_name() + end + return is_owner(pos, name) and inv:is_empty("main") + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if is_owner(pos, player:get_player_name()) then + return count + end + return 0 + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return 0 + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if is_owner(pos, player:get_player_name()) then + return stack:get_count() + end + return 0 + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if meta:get_inventory():is_empty("main") then + minetest.remove_node(pos) + end + end, + + on_punch = function(pos, node, player) + if not is_owner(pos, player:get_player_name()) then + return + end + + if minetest.get_meta(pos):get_string("infotext") == "" then + return + end + + local inv = minetest.get_meta(pos):get_inventory() + local player_inv = player:get_inventory() + local has_space = true + + for i = 1, inv:get_size("main") do + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + + -- remove bones if player emptied them + if has_space then + if player_inv:room_for_item("main", {name = "bones:bones"}) then + player_inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos,"bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then + meta:set_string("infotext", meta:get_string("owner") .. "'s old bones") + meta:set_string("owner", "") + else + meta:set_int("time", time) + return true + end + end, + on_blast = function(pos) + end, +}) + +local function may_replace(pos, player) + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] + + -- if the node is unknown, we return false + if not node_definition then + return false + end + + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + -- exception are of course any protected buildable_to + return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) +end + +local drop = function(pos, itemstack) + local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count())) + if obj then + obj:setvelocity({ + x = math.random(-10, 10) / 9, + y = 5, + z = math.random(-10, 10) / 9, + }) + end +end + +minetest.register_on_dieplayer(function(player) + + local bones_mode = minetest.settings:get("bones_mode") or "bones" + if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then + bones_mode = "bones" + end + + -- return if keep inventory set or in creative mode + if bones_mode == "keep" or (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) then + return + end + + local player_inv = player:get_inventory() + if player_inv:is_empty("main") and + player_inv:is_empty("craft") then + return + end + + local pos = vector.round(player:getpos()) + local player_name = player:get_player_name() + + -- check if it's possible to place bones, if not find space near player + if bones_mode == "bones" and not may_replace(pos, player) then + local air = minetest.find_node_near(pos, 1, {"air"}) + if air and not minetest.is_protected(air, player_name) then + pos = air + else + bones_mode = "drop" + end + end + + if bones_mode == "drop" then + + -- drop inventory items + for i = 1, player_inv:get_size("main") do + drop(pos, player_inv:get_stack("main", i)) + end + player_inv:set_list("main", {}) + + -- drop crafting grid items + for i = 1, player_inv:get_size("craft") do + drop(pos, player_inv:get_stack("craft", i)) + end + player_inv:set_list("craft", {}) + + drop(pos, ItemStack("bones:bones")) + return + end + + local param2 = minetest.dir_to_facedir(player:get_look_dir()) + minetest.set_node(pos, {name = "bones:bones", param2 = param2}) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 8 * 4) + inv:set_list("main", player_inv:get_list("main")) + + for i = 1, player_inv:get_size("craft") do + local stack = player_inv:get_stack("craft", i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + --drop if no space left + drop(pos, stack) + end + end + + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + + meta:set_string("formspec", bones_formspec) + meta:set_string("owner", player_name) + + if share_bones_time ~= 0 then + meta:set_string("infotext", player_name .. "'s fresh bones") + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", player_name.."'s bones") + end +end) diff --git a/mods/bones/license.txt b/mods/bones/license.txt new file mode 100644 index 0000000..fe52584 --- /dev/null +++ b/mods/bones/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 paramat + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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. + diff --git a/mods/bones/textures/bones_bottom.png b/mods/bones/textures/bones_bottom.png new file mode 100644 index 0000000..859c6bb Binary files /dev/null and b/mods/bones/textures/bones_bottom.png differ diff --git a/mods/bones/textures/bones_front.png b/mods/bones/textures/bones_front.png new file mode 100644 index 0000000..1e52437 Binary files /dev/null and b/mods/bones/textures/bones_front.png differ diff --git a/mods/bones/textures/bones_rear.png b/mods/bones/textures/bones_rear.png new file mode 100644 index 0000000..4cfe236 Binary files /dev/null and b/mods/bones/textures/bones_rear.png differ diff --git a/mods/bones/textures/bones_side.png b/mods/bones/textures/bones_side.png new file mode 100644 index 0000000..a07595f Binary files /dev/null and b/mods/bones/textures/bones_side.png differ diff --git a/mods/bones/textures/bones_top.png b/mods/bones/textures/bones_top.png new file mode 100644 index 0000000..198a8a2 Binary files /dev/null and b/mods/bones/textures/bones_top.png differ diff --git a/mods/bucket/README.txt b/mods/bucket/README.txt new file mode 100644 index 0000000..45e0ec5 --- /dev/null +++ b/mods/bucket/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: bucket +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Kahrl (LGPL 2.1) +celeron55, Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (textures) +--------------------------- +ElementW (CC BY-SA 3.0) diff --git a/mods/bucket/depends.txt b/mods/bucket/depends.txt new file mode 100644 index 0000000..3a7daa1 --- /dev/null +++ b/mods/bucket/depends.txt @@ -0,0 +1,2 @@ +default + diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua new file mode 100644 index 0000000..5076dec --- /dev/null +++ b/mods/bucket/init.lua @@ -0,0 +1,215 @@ +-- Minetest 0.4 mod: bucket +-- See README.txt for licensing and other information. + +minetest.register_alias("bucket", "bucket:bucket_empty") +minetest.register_alias("bucket_water", "bucket:bucket_water") +minetest.register_alias("bucket_lava", "bucket:bucket_lava") + +minetest.register_craft({ + output = 'bucket:bucket_empty 1', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'', 'default:steel_ingot', ''}, + } +}) + +bucket = {} +bucket.liquids = {} + +local function check_protection(pos, name, text) + if minetest.is_protected(pos, name) then + minetest.log("action", (name ~= "" and name or "A mod") + .. " tried to " .. text + .. " at protected position " + .. minetest.pos_to_string(pos) + .. " with a bucket") + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- inventory_image = texture of the new bucket item (ignored if itemname == nil) +-- name = text description of the bucket item +-- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. +-- This function can be called from any mod (that depends on bucket). +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) + bucket.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + force_renew = force_renew, + } + bucket.liquids[flowing] = bucket.liquids[source] + + if itemname ~= nil then + minetest.register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + stack_max = 1, + liquids_pointable = true, + groups = groups, + + on_place = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + + local node = minetest.get_node_or_nil(pointed_thing.under) + local ndef = node and minetest.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if ndef and ndef.on_rightclick and + user and not user:get_player_control().sneak then + return ndef.on_rightclick( + pointed_thing.under, + node, user, + itemstack) + end + + local lpos + + -- Check if pointing to a buildable node + if ndef and ndef.buildable_to then + -- buildable; replace the node + lpos = pointed_thing.under + else + -- not buildable to; place the liquid above + -- check if the node above can be replaced + + lpos = pointed_thing.above + node = minetest.get_node_or_nil(lpos) + local above_ndef = node and minetest.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then + -- do not remove the bucket with the liquid + return itemstack + end + end + + if check_protection(lpos, user + and user:get_player_name() + or "", "place "..source) then + return + end + + minetest.set_node(lpos, {name = source}) + return ItemStack("bucket:bucket_empty") + end + }) + end +end + +minetest.register_craftitem("bucket:bucket_empty", { + description = "Empty Bucket", + inventory_image = "bucket.png", + stack_max = 99, + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "object" then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= "node" then + -- do nothing if it's neither object nor node + return + end + -- Check if pointing to a liquid source + local node = minetest.get_node(pointed_thing.under) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source then + if check_protection(pointed_thing.under, + user:get_player_name(), + "take ".. node.name) then + return + end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + if inv:room_for_item("main", {name=liquiddef.itemname}) then + inv:add_item("main", liquiddef.itemname) + else + local pos = user:getpos() + pos.y = math.floor(pos.y + 0.5) + minetest.add_item(pos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = "bucket:bucket_empty "..tostring(item_count-1) + + end + + -- force_renew requires a source neighbour + local source_neighbor = false + if liquiddef.force_renew then + source_neighbor = + minetest.find_node_near(pointed_thing.under, 1, liquiddef.source) + end + if not (source_neighbor and liquiddef.force_renew) then + minetest.add_node(pointed_thing.under, {name = "air"}) + end + + return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = minetest.registered_nodes[node.name] + if node_def then + node_def.on_punch(pointed_thing.under, node, user, pointed_thing) + end + return user:get_wielded_item() + end + end, +}) + +bucket.register_liquid( + "default:water_source", + "default:water_flowing", + "bucket:bucket_water", + "bucket_water.png", + "Water Bucket", + {water_bucket = 1} +) + +bucket.register_liquid( + "default:river_water_source", + "default:river_water_flowing", + "bucket:bucket_river_water", + "bucket_river_water.png", + "River Water Bucket", + {water_bucket = 1}, + true +) + +bucket.register_liquid( + "default:lava_source", + "default:lava_flowing", + "bucket:bucket_lava", + "bucket_lava.png", + "Lava Bucket" +) + +minetest.register_craft({ + type = "fuel", + recipe = "bucket:bucket_lava", + burntime = 60, + replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}}, +}) + diff --git a/mods/bucket/license.txt b/mods/bucket/license.txt new file mode 100644 index 0000000..a5156ae --- /dev/null +++ b/mods/bucket/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 Kahrl +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2011-2016 Various Minetest developers and contributors + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2015-2016 ElementW + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/bucket/textures/bucket.png b/mods/bucket/textures/bucket.png new file mode 100644 index 0000000..17b0c49 Binary files /dev/null and b/mods/bucket/textures/bucket.png differ diff --git a/mods/bucket/textures/bucket_lava.png b/mods/bucket/textures/bucket_lava.png new file mode 100644 index 0000000..ac6108d Binary files /dev/null and b/mods/bucket/textures/bucket_lava.png differ diff --git a/mods/bucket/textures/bucket_river_water.png b/mods/bucket/textures/bucket_river_water.png new file mode 100644 index 0000000..d4648bb Binary files /dev/null and b/mods/bucket/textures/bucket_river_water.png differ diff --git a/mods/bucket/textures/bucket_water.png b/mods/bucket/textures/bucket_water.png new file mode 100644 index 0000000..5af836b Binary files /dev/null and b/mods/bucket/textures/bucket_water.png differ diff --git a/mods/carts/README.txt b/mods/carts/README.txt new file mode 100644 index 0000000..31ce644 --- /dev/null +++ b/mods/carts/README.txt @@ -0,0 +1,22 @@ +Carts (formerly boost_cart) +========================== + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX (WTFPL). + + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + + +Features +---------- +- A fast cart for your railway or roller coaster (up to 7 m/s!) +- Boost and brake rails +- Rail junction switching with the 'right-left' walking keys +- Handbrake with the 'back' key diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua new file mode 100644 index 0000000..a19da64 --- /dev/null +++ b/mods/carts/cart_entity.lua @@ -0,0 +1,403 @@ +local cart_entity = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch + old_pos = nil, + old_switch = 0, + railtype = nil, + attached_items = {} +} + +function cart_entity:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + self.driver = nil + carts:manage_attachment(clicker, nil) + elseif not self.driver then + self.driver = player_name + carts:manage_attachment(clicker, self.object) + end +end + +function cart_entity:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + if string.sub(staticdata, 1, string.len("return")) ~= "return" then + return + end + local data = minetest.deserialize(staticdata) + if not data or type(data) ~= "table" then + return + end + self.railtype = data.railtype + if data.old_dir then + self.old_dir = data.old_dir + end + if data.old_vel then + self.old_vel = data.old_vel + end +end + +function cart_entity:get_staticdata() + return minetest.serialize({ + railtype = self.railtype, + old_dir = self.old_dir, + old_vel = self.old_vel + }) +end + +function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:getpos() + if not self.railtype then + local node = minetest.get_node(pos).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + -- Punched by non-player + if not puncher or not puncher:is_player() then + local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 2) + self.punched = true + return + end + -- Player digs cart by sneak-punch + if puncher:get_player_control().sneak then + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + end + -- Detach driver and items + if self.driver then + if self.old_pos then + self.object:setpos(self.old_pos) + end + local player = minetest.get_player_by_name(self.driver) + carts:manage_attachment(player, nil) + end + for _,obj_ in ipairs(self.attached_items) do + if obj_ then + obj_:set_detach() + end + end + -- Pick up cart + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "carts:cart") then + local leftover = inv:add_item("main", "carts:cart") + -- If no room in inventory add a replacement cart to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + self.object:remove() + return + end + -- Player punches cart to alter velocity + local vel = self.object:getvelocity() + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > carts.punch_speed_max then + return + end + end + + local punch_dir = carts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = carts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + local punch_interval = 1 + if tool_capabilities and tool_capabilities.full_punch_interval then + punch_interval = tool_capabilities.full_punch_interval + end + time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) + local f = 2 * (time_from_last_punch / punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_dir = cart_dir + self.punched = true +end + +local function rail_on_step_event(handler, obj, dtime) + if handler then + handler(obj, dtime) + end +end + +-- sound refresh interval = 1.0sec +local function rail_sound(self, dtime) + if not self.sound_ttl then + self.sound_ttl = 1.0 + return + elseif self.sound_ttl > 0 then + self.sound_ttl = self.sound_ttl - dtime + return + end + self.sound_ttl = 1.0 + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + local vel = self.object:getvelocity() + local speed = vector.length(vel) + if speed > 0 then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = (speed / carts.speed_max) / 2, + loop = true, + }) + end +end + +local function get_railparams(pos) + local node = minetest.get_node(pos) + return carts.railparams[node.name] or {} +end + +local function rail_on_step(self, dtime) + local vel = self.object:getvelocity() + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:setvelocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local pos = self.object:getpos() + local update = {} + + -- stop cart if velocity vector flips + if self.old_vel and self.old_vel.y == 0 and + (self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then + self.old_vel = {x = 0, y = 0, z = 0} + self.old_pos = pos + self.object:setvelocity(vector.new()) + self.object:setacceleration(vector.new()) + rail_on_step_event(get_railparams(pos).on_step, self, dtime) + return + end + self.old_vel = vector.new(vel) + + if self.old_pos and not self.punched then + local flo_pos = vector.round(pos) + local flo_old = vector.round(self.old_pos) + if vector.equals(flo_pos, flo_old) then + -- Do not check one node multiple times + return + end + end + + local ctrl, player + + -- Get player controls + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + + if self.old_pos then + -- Detection for "skipping" nodes + local found_path = carts:pathfinder( + pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype + ) + + if not found_path then + -- No rail found: reset back to the expected position + pos = vector.new(self.old_pos) + update.pos = true + end + end + + local cart_dir = carts:velocity_to_dir(vel) + local railparams + + -- dir: New moving direction of the cart + -- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node + local dir, switch_keys = carts:get_rail_direction( + pos, cart_dir, ctrl, self.old_switch, self.railtype + ) + + local new_acc = {x=0, y=0, z=0} + if vector.equals(dir, {x=0, y=0, z=0}) then + vel = {x = 0, y = 0, z = 0} + pos = vector.round(pos) + update.pos = true + update.vel = true + else + -- Direction change detected + if not vector.equals(dir, self.old_dir) then + vel = vector.multiply(dir, math.abs(vel.x + vel.z)) + update.vel = true + if dir.y ~= self.old_dir.y then + pos = vector.round(pos) + update.pos = true + end + end + -- Center on the rail + if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + + -- Slow down or speed up.. + local acc = dir.y * -4.0 + + -- Get rail for corrected position + railparams = get_railparams(pos) + + -- no need to check for railparams == nil since we always make it exist. + local speed_mod = railparams.acceleration + if speed_mod and speed_mod ~= 0 then + -- Try to make it similar to the original carts mod + acc = acc + speed_mod + else + -- Handbrake or coast + if ctrl and ctrl.down then + acc = acc - 3 + else + acc = acc - 0.4 + end + end + + new_acc = vector.multiply(dir, acc) + end + + -- Limits + local max_vel = carts.speed_max + for _, v in pairs({"x","y","z"}) do + if math.abs(vel[v]) > max_vel then + vel[v] = carts:get_sign(vel[v]) * max_vel + new_acc[v] = 0 + update.vel = true + end + end + + self.object:setacceleration(new_acc) + self.old_pos = vector.new(pos) + if not vector.equals(dir, {x=0, y=0, z=0}) then + self.old_dir = vector.new(dir) + end + self.old_switch = switch_keys + + if self.punched then + -- Collect dropped items + for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if not obj_:is_player() and + obj_:get_luaentity() and + not obj_:get_luaentity().physical_state and + obj_:get_luaentity().name == "__builtin:item" then + + obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + self.attached_items[#self.attached_items + 1] = obj_ + end + end + self.punched = false + update.vel = true + end + + railparams = railparams or get_railparams(pos) + + if not (update.vel or update.pos) then + rail_on_step_event(railparams.on_step, self, dtime) + return + end + + local yaw = 0 + if self.old_dir.x < 0 then + yaw = 0.5 + elseif self.old_dir.x > 0 then + yaw = 1.5 + elseif self.old_dir.z < 0 then + yaw = 1 + end + self.object:setyaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + self.object:setvelocity(vel) + if update.pos then + self.object:setpos(pos) + end + + -- call event handler + rail_on_step_event(railparams.on_step, self, dtime) +end + +function cart_entity:on_step(dtime) + rail_on_step(self, dtime) + rail_sound(self, dtime) +end + +minetest.register_entity("carts:cart", cart_entity) + +minetest.register_craftitem("carts:cart", { + description = "Cart (Sneak+Click to pick up)", + inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"), + wield_image = "carts_cart_side.png", + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if not pointed_thing.type == "node" then + return + end + if carts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "carts:cart") + elseif carts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "carts:cart") + else + return + end + + minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, + {pos = pointed_thing.above}) + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "carts:cart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/mods/carts/depends.txt b/mods/carts/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/carts/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua new file mode 100644 index 0000000..a471719 --- /dev/null +++ b/mods/carts/functions.lua @@ -0,0 +1,221 @@ +function carts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function carts:manage_attachment(player, obj) + if not player then + return + end + local status = obj ~= nil + local player_name = player:get_player_name() + if default.player_attached[player_name] == status then + return + end + default.player_attached[player_name] = status + + if status then + player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end +end + +function carts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=carts:get_sign(v.x), y=carts:get_sign(v.y), z=0} + else + return {x=0, y=carts:get_sign(v.y), z=carts:get_sign(v.z)} + end +end + +function carts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function carts:check_front_up_down(pos, dir_, check_up, railtype) + local dir = vector.new(dir_) + local cur + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_up then + dir.y = 1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + cur = carts:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + + -- Left, if not already checked + if left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = carts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) + local pos = vector.round(pos_) + local pf_pos = vector.round(old_pos) + local pf_dir = vector.new(old_dir) + + for i = 1, 3 do + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return true + end + + pf_dir, pf_switch = carts:get_rail_direction(pf_pos, pf_dir, ctrl, pf_switch, railtype) + if vector.equals(pf_dir, {x=0, y=0, z=0}) then + -- No way forwards + return false + end + + pf_pos = vector.add(pf_pos, pf_dir) + end + -- Cart not found + return false +end + +function carts:register_rail(name, def_overwrite, railparams) + local def = { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + sounds = default.node_sound_metal_defaults() + } + for k, v in pairs(def_overwrite) do + def[k] = v + end + if not def.inventory_image then + def.wield_image = def.tiles[1] + def.inventory_image = def.tiles[1] + end + + if railparams then + carts.railparams[name] = table.copy(railparams) + end + + minetest.register_node(name, def) +end + +function carts:get_rail_groups(additional_groups) + -- Get the default rail groups and add more when a table is given + local groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1} + if type(additional_groups) == "table" then + for k, v in pairs(additional_groups) do + groups[k] = v + end + end + return groups +end diff --git a/mods/carts/init.lua b/mods/carts/init.lua new file mode 100644 index 0000000..53b33cc --- /dev/null +++ b/mods/carts/init.lua @@ -0,0 +1,20 @@ + +carts = {} +carts.modpath = minetest.get_modpath("carts") +carts.railparams = {} + +-- Maximal speed of the cart in m/s (min = -1) +carts.speed_max = 7 +-- Set to -1 to disable punching the cart from inside (min = -1) +carts.punch_speed_max = 5 + + +dofile(carts.modpath.."/functions.lua") +dofile(carts.modpath.."/rails.lua") + +-- Support for non-default games +if not default.player_attached then + default.player_attached = {} +end + +dofile(carts.modpath.."/cart_entity.lua") diff --git a/mods/carts/license.txt b/mods/carts/license.txt new file mode 100644 index 0000000..6c5beb4 --- /dev/null +++ b/mods/carts/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/mods/carts/models/carts_cart.b3d b/mods/carts/models/carts_cart.b3d new file mode 100644 index 0000000..4e7eba3 Binary files /dev/null and b/mods/carts/models/carts_cart.b3d differ diff --git a/mods/carts/models/carts_cart.blend b/mods/carts/models/carts_cart.blend new file mode 100644 index 0000000..7d2515e Binary files /dev/null and b/mods/carts/models/carts_cart.blend differ diff --git a/mods/carts/rails.lua b/mods/carts/rails.lua new file mode 100644 index 0000000..066779d --- /dev/null +++ b/mods/carts/rails.lua @@ -0,0 +1,59 @@ +carts:register_rail("carts:rail", { + description = "Rail", + tiles = { + "carts_rail_straight.png", "carts_rail_curved.png", + "carts_rail_t_junction.png", "carts_rail_crossing.png" + }, + inventory_image = "carts_rail_straight.png", + wield_image = "carts_rail_straight.png", + groups = carts:get_rail_groups(), +}, {}) + +minetest.register_craft({ + output = "carts:rail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + +minetest.register_alias("default:rail", "carts:rail") + + +carts:register_rail("carts:powerrail", { + description = "Powered rail", + tiles = { + "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", + "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = 5}) + +minetest.register_craft({ + output = "carts:powerrail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + + +carts:register_rail("carts:brakerail", { + description = "Brake rail", + tiles = { + "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", + "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = -3}) + +minetest.register_craft({ + output = "carts:brakerail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) diff --git a/mods/carts/sounds/carts_cart_moving.1.ogg b/mods/carts/sounds/carts_cart_moving.1.ogg new file mode 100644 index 0000000..869e765 Binary files /dev/null and b/mods/carts/sounds/carts_cart_moving.1.ogg differ diff --git a/mods/carts/sounds/carts_cart_moving.2.ogg b/mods/carts/sounds/carts_cart_moving.2.ogg new file mode 100644 index 0000000..b4cc508 Binary files /dev/null and b/mods/carts/sounds/carts_cart_moving.2.ogg differ diff --git a/mods/carts/sounds/carts_cart_moving.3.ogg b/mods/carts/sounds/carts_cart_moving.3.ogg new file mode 100644 index 0000000..e19a782 Binary files /dev/null and b/mods/carts/sounds/carts_cart_moving.3.ogg differ diff --git a/mods/carts/textures/carts_cart.png b/mods/carts/textures/carts_cart.png new file mode 100644 index 0000000..965347c Binary files /dev/null and b/mods/carts/textures/carts_cart.png differ diff --git a/mods/carts/textures/carts_cart_front.png b/mods/carts/textures/carts_cart_front.png new file mode 100644 index 0000000..38955b2 Binary files /dev/null and b/mods/carts/textures/carts_cart_front.png differ diff --git a/mods/carts/textures/carts_cart_side.png b/mods/carts/textures/carts_cart_side.png new file mode 100644 index 0000000..f53808c Binary files /dev/null and b/mods/carts/textures/carts_cart_side.png differ diff --git a/mods/carts/textures/carts_cart_top.png b/mods/carts/textures/carts_cart_top.png new file mode 100644 index 0000000..d9a31a9 Binary files /dev/null and b/mods/carts/textures/carts_cart_top.png differ diff --git a/mods/carts/textures/carts_rail_crossing.png b/mods/carts/textures/carts_rail_crossing.png new file mode 100644 index 0000000..e10f3b1 Binary files /dev/null and b/mods/carts/textures/carts_rail_crossing.png differ diff --git a/mods/carts/textures/carts_rail_crossing_brk.png b/mods/carts/textures/carts_rail_crossing_brk.png new file mode 100644 index 0000000..0bf455e Binary files /dev/null and b/mods/carts/textures/carts_rail_crossing_brk.png differ diff --git a/mods/carts/textures/carts_rail_crossing_pwr.png b/mods/carts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 0000000..d763d50 Binary files /dev/null and b/mods/carts/textures/carts_rail_crossing_pwr.png differ diff --git a/mods/carts/textures/carts_rail_curved.png b/mods/carts/textures/carts_rail_curved.png new file mode 100644 index 0000000..b320f0d Binary files /dev/null and b/mods/carts/textures/carts_rail_curved.png differ diff --git a/mods/carts/textures/carts_rail_curved_brk.png b/mods/carts/textures/carts_rail_curved_brk.png new file mode 100644 index 0000000..ca40723 Binary files /dev/null and b/mods/carts/textures/carts_rail_curved_brk.png differ diff --git a/mods/carts/textures/carts_rail_curved_pwr.png b/mods/carts/textures/carts_rail_curved_pwr.png new file mode 100644 index 0000000..781bbd0 Binary files /dev/null and b/mods/carts/textures/carts_rail_curved_pwr.png differ diff --git a/mods/carts/textures/carts_rail_straight.png b/mods/carts/textures/carts_rail_straight.png new file mode 100644 index 0000000..30dcafe Binary files /dev/null and b/mods/carts/textures/carts_rail_straight.png differ diff --git a/mods/carts/textures/carts_rail_straight_brk.png b/mods/carts/textures/carts_rail_straight_brk.png new file mode 100644 index 0000000..0c69052 Binary files /dev/null and b/mods/carts/textures/carts_rail_straight_brk.png differ diff --git a/mods/carts/textures/carts_rail_straight_pwr.png b/mods/carts/textures/carts_rail_straight_pwr.png new file mode 100644 index 0000000..e067ff1 Binary files /dev/null and b/mods/carts/textures/carts_rail_straight_pwr.png differ diff --git a/mods/carts/textures/carts_rail_t_junction.png b/mods/carts/textures/carts_rail_t_junction.png new file mode 100644 index 0000000..8b1b946 Binary files /dev/null and b/mods/carts/textures/carts_rail_t_junction.png differ diff --git a/mods/carts/textures/carts_rail_t_junction_brk.png b/mods/carts/textures/carts_rail_t_junction_brk.png new file mode 100644 index 0000000..6b4f6fa Binary files /dev/null and b/mods/carts/textures/carts_rail_t_junction_brk.png differ diff --git a/mods/carts/textures/carts_rail_t_junction_pwr.png b/mods/carts/textures/carts_rail_t_junction_pwr.png new file mode 100644 index 0000000..dd0eede Binary files /dev/null and b/mods/carts/textures/carts_rail_t_junction_pwr.png differ diff --git a/mods/creative/README.txt b/mods/creative/README.txt new file mode 100644 index 0000000..82357f3 --- /dev/null +++ b/mods/creative/README.txt @@ -0,0 +1,12 @@ +Minetest Game mod: creative +=========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Jean-Patrick G. (kilbith) (MIT) + +Author of media (textures) +-------------------------- +Jean-Patrick G. (kilbith) (CC BY-SA 3.0) diff --git a/mods/creative/depends.txt b/mods/creative/depends.txt new file mode 100644 index 0000000..975e652 --- /dev/null +++ b/mods/creative/depends.txt @@ -0,0 +1,2 @@ +default +sfinv diff --git a/mods/creative/init.lua b/mods/creative/init.lua new file mode 100644 index 0000000..51d6f79 --- /dev/null +++ b/mods/creative/init.lua @@ -0,0 +1,63 @@ +creative = {} + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + +function creative.is_enabled_for(name) + return creative_mode_cache +end + +dofile(minetest.get_modpath("creative") .. "/inventory.lua") + +if creative_mode_cache then + -- Dig time is modified according to difference (leveldiff) between tool + -- 'maxlevel' and node 'level'. Digtime is divided by the larger of + -- leveldiff and 1. + -- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been + -- increased such that nodes of differing levels have an insignificant + -- effect on digtime. + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + }, + damage_groups = {fleshy = 10}, + } + }) +end + +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return creative.is_enabled_for(placer:get_player_name()) +end) + +-- Don't pick up if the item is already in the inventory +local old_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() then + return + end + if not creative.is_enabled_for(digger:get_player_name()) then + return old_handle_node_drops(pos, drops, digger) + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end +end diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua new file mode 100644 index 0000000..0e1d813 --- /dev/null +++ b/mods/creative/inventory.lua @@ -0,0 +1,177 @@ +local player_inventory = {} + +function creative.init_creative_inventory(player) + local player_name = player:get_player_name() + player_inventory[player_name] = { + size = 0, + filter = "", + start_i = 0 + } + + minetest.create_detached_inventory("creative_" .. player_name, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + if not to_list == "main" then + return count + else + return 0 + end + end, + allow_put = function(inv, listname, index, stack, player2) + return 0 + end, + allow_take = function(inv, listname, index, stack, player2) + return -1 + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + end, + on_put = function(inv, listname, index, stack, player2) + end, + on_take = function(inv, listname, index, stack, player2) + if stack and stack:get_count() > 0 then + minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory") + end + end, + }, player_name) + + return player_inventory[player_name] +end + +function creative.update_creative_inventory(player_name, tab_content) + local creative_list = {} + local inv = player_inventory[player_name] or + creative.init_creative_inventory(minetest.get_player_by_name(player_name)) + local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) + + for name, def in pairs(tab_content) do + if not (def.groups.not_in_creative_inventory == 1) and + def.description and def.description ~= "" and + (def.name:find(inv.filter, 1, true) or + def.description:lower():find(inv.filter, 1, true)) then + creative_list[#creative_list+1] = name + end + end + + table.sort(creative_list) + player_inv:set_size("main", #creative_list) + player_inv:set_list("main", creative_list) + inv.size = #creative_list +end + +-- Create the trash field +local trash = minetest.create_detached_inventory("creative_trash", { + -- Allow the stack to be placed and remove it in on_put() + -- This allows the creative inventory to restore the stack + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() + end, + on_put = function(inv, listname) + inv:set_list(listname, {}) + end, +}) +trash:set_size("main", 1) + +creative.formspec_add = "" + +function creative.register_tab(name, title, items) + sfinv.register_page("creative:" .. name, { + title = title, + is_in_nav = function(self, player, context) + return creative.is_enabled_for(player:get_player_name()) + end, + get = function(self, player, context) + local player_name = player:get_player_name() + creative.update_creative_inventory(player_name, items) + local inv = player_inventory[player_name] + local start_i = inv.start_i or 0 + local pagenum = math.floor(start_i / (3*8) + 1) + local pagemax = math.ceil(inv.size / (3*8)) + return sfinv.make_formspec(player, context, + "label[6.2,3.35;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" .. + [[ + image[4.06,3.4;0.8,0.8;creative_trash_icon.png] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] + list[current_player;main;0,4.7;8,1;] + list[current_player;main;0,5.85;8,3;8] + list[detached:creative_trash;main;4,3.3;1,1;] + listring[] + button[5.4,3.2;0.8,0.9;creative_prev;<] + button[7.25,3.2;0.8,0.9;creative_next;>] + button[2.1,3.4;0.8,0.5;creative_search;?] + button[2.75,3.4;0.8,0.5;creative_clear;X] + tooltip[creative_search;Search] + tooltip[creative_clear;Reset] + listring[current_player;main] + field_close_on_enter[creative_filter;false] + ]] .. + "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. + "listring[detached:creative_" .. player_name .. ";main]" .. + "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. + default.get_hotbar_bg(0,4.7) .. + default.gui_bg .. default.gui_bg_img .. default.gui_slots + .. creative.formspec_add, false) + end, + on_enter = function(self, player, context) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + if inv then + inv.start_i = 0 + end + end, + on_player_receive_fields = function(self, player, context, fields) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + assert(inv) + + if fields.creative_clear then + inv.start_i = 0 + inv.filter = "" + creative.update_creative_inventory(player_name, items) + sfinv.set_player_inventory_formspec(player, context) + elseif fields.creative_search or + fields.key_enter_field == "creative_filter" then + inv.start_i = 0 + inv.filter = fields.creative_filter:lower() + creative.update_creative_inventory(player_name, items) + sfinv.set_player_inventory_formspec(player, context) + elseif not fields.quit then + local start_i = inv.start_i or 0 + + if fields.creative_prev then + start_i = start_i - 3*8 + if start_i < 0 then + start_i = inv.size - (inv.size % (3*8)) + if inv.size == start_i then + start_i = math.max(0, inv.size - (3*8)) + end + end + elseif fields.creative_next then + start_i = start_i + 3*8 + if start_i >= inv.size then + start_i = 0 + end + end + + inv.start_i = start_i + sfinv.set_player_inventory_formspec(player, context) + end + end + }) +end + +minetest.register_on_joinplayer(function(player) + creative.update_creative_inventory(player:get_player_name(), minetest.registered_items) +end) + +creative.register_tab("all", "All", minetest.registered_items) +creative.register_tab("nodes", "Nodes", minetest.registered_nodes) +creative.register_tab("tools", "Tools", minetest.registered_tools) +creative.register_tab("craftitems", "Items", minetest.registered_craftitems) + +local old_homepage_name = sfinv.get_homepage_name +function sfinv.get_homepage_name(player) + if creative.is_enabled_for(player:get_player_name()) then + return "creative:all" + else + return old_homepage_name(player) + end +end diff --git a/mods/creative/license.txt b/mods/creative/license.txt new file mode 100644 index 0000000..4ad1d5f --- /dev/null +++ b/mods/creative/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 Jean-Patrick G. (kilbith) + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/creative/textures/creative_trash_icon.png b/mods/creative/textures/creative_trash_icon.png new file mode 100644 index 0000000..e789ad6 Binary files /dev/null and b/mods/creative/textures/creative_trash_icon.png differ diff --git a/mods/default/README.txt b/mods/default/README.txt new file mode 100644 index 0000000..8af65a9 --- /dev/null +++ b/mods/default/README.txt @@ -0,0 +1,300 @@ +Minetest Game mod: default +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (textures, models and sounds) +---------------------------------------------- +Everything not listed in here: +celeron55, Perttu Ahola (CC BY-SA 3.0) + +Cisoun's texture pack (CC BY-SA 3.0): + default_jungletree.png + default_lava.png + default_leaves.png + default_sapling.png + default_bush_sapling.png + default_stone.png + default_tree.png + default_tree_top.png + default_water.png + +Cisoun's conifers mod (CC BY-SA 3.0): + default_pine_needles.png + +Originating from G4JC's Almost MC Texture Pack (CC BY-SA 3.0): + default_torch.png + default_torch_on_ceiling.png + default_torch_on_floor.png + +VanessaE's animated torches (CC BY-SA 3.0): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png + +RealBadAngel's animated water (CC BY-SA 3.0): + default_water_source_animated.png + default_water_flowing_animated.png + +VanessaE (CC BY-SA 3.0): + default_desert_sand.png + default_desert_stone.png + default_sand.png + default_mese_crystal.png + default_mese_crystal_fragment.png + +Calinou (CC BY-SA 3.0): + default_brick.png + default_papyrus.png + default_mineral_copper.png + default_glass_detail.png + +MirceaKitsune (CC BY-SA 3.0): + character.x + +Jordach (CC BY-SA 3.0): + character.png + +PilzAdam (CC BY-SA 3.0): + default_jungleleaves.png + default_junglesapling.png + default_obsidian_glass.png + default_obsidian_shard.png + default_mineral_gold.png + +jojoa1997 (CC BY-SA 3.0): + default_obsidian.png + +InfinityProject (CC BY-SA 3.0): + default_mineral_diamond.png + +Splizard (CC BY-SA 3.0): + default_pine_sapling.png + +Zeg9 (CC BY-SA 3.0): + default_coal_block.png + +paramat (CC BY-SA 3.0): + wieldhand.png -- Copied from character.png by Jordach (CC BY-SA 3.0) + default_pinetree.png + default_pinetree_top.png + default_pinewood.png + default_acacia_leaves.png + default_acacia_leaves_simple.png + default_acacia_sapling.png + default_acacia_bush_sapling.png + default_acacia_tree.png + default_acacia_tree_top.png + default_acacia_wood.png + default_acacia_bush_stem.png + default_bush_stem.png + default_junglewood.png + default_jungletree_top.png + default_sandstone_brick.png + default_obsidian_brick.png + default_stone_brick.png + default_desert_stone_brick.png + default_sandstone_block.png + default_obsidian_block.png + default_stone_block.png + default_desert_stone_block.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png + default_dry_grass.png + default_dry_grass_side.png + default_dry_grass_*.png + default_grass.png + default_grass_side.png + default_mese_block.png + default_silver_sand.png + default_mese_post_light_side.png + default_mese_post_light_side_dark.png + default_mese_post_light_top.png + default_silver_sandstone.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + +brunob.santos (CC BY-SA 4.0): + default_desert_cobble.png + +BlockMen (CC BY-SA 3.0): + default_aspen_leaves.png -- Derived from Sofar's texture + default_wood.png + default_clay_brick.png + default_iron_ingot.png + default_gold_ingot.png + default_tool_steelsword.png + default_diamond.png + default_book.png + default_tool_*.png + default_lava_source_animated.png + default_lava_flowing_animated.png + default_stick.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + default_mineral_mese.png + default_meselamp.png + bubble.png + gui_*.png + +Wuzzy (CC BY-SA 3.0): + default_bookshelf_slot.png (based on default_book.png) + +sofar (CC BY-SA 3.0): + default_book_written.png, based on default_book.png + default_aspen_sapling + default_aspen_tree + default_aspen_tree_top, derived from default_pine_tree_top (by paramat) + default_aspen_wood, derived from default_pine_wood (by paramat) + default_chest_inside + +sofar (WTFPL): + default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel + +Neuromancer (CC BY-SA 2.0): + default_cobble.png, based on texture by Brane praefect + default_mossycobble.png, based on texture by Brane praefect + +Neuromancer (CC BY-SA 3.0): + default_dirt.png + default_furnace_*.png + +Gambit (CC BY-SA 3.0): + default_bronze_ingot.png + default_copper_ingot.png + default_copper_lump.png + default_iron_lump.png + default_gold_lump.png + default_clay_lump.png + default_coal.png + default_grass_*.png + default_paper.png + default_diamond_block.png + default_ladder_steel.png + default_sign_wall_wood.png + default_flint.png + default_snow.png + default_snow_side.png + default_snowball.png + default_key.png + default_key_skeleton.png + +asl97 (CC BY-SA 3.0): + default_ice.png + +KevDoy (CC BY-SA 3.0) + heart.png + +Pithydon (CC BY-SA 3.0) + default_coral_brown.png + default_coral_orange.png + default_coral_skeleton.png + +Ferk (CC0 1.0) + default_item_smoke.png + default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart + +npx (CC BY-SA 3.0) + default_rainforest_litter.png + default_rainforest_litter_side.png + +kaeza (CC-BY-SA 3.0): + default_desert_sandstone.png + default_desert_sandstone_brick.png + default_desert_sandstone_block.png + +kilbith (CC BY-SA 3.0): + default_steel_block.png + default_copper_block.png + default_bronze_block.png + default_gold_block.png + default_tin_block.png + default_mineral_tin.png + default_tin_ingot.png + default_tin_lump.png + +Glass breaking sounds (CC BY 3.0): + 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ + 2: http://www.freesound.org/people/Tomlija/sounds/97669/ + 3: http://www.freesound.org/people/lsprice/sounds/88808/ + +sonictechtonic (CC BY 3.0): +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + +Mito551 (sounds) (CC BY-SA 3.0): + default_dig_choppy.ogg + default_dig_cracky.ogg + default_dig_crumbly.1.ogg + default_dig_crumbly.2.ogg + default_dig_dig_immediate.ogg + default_dig_oddly_breakable_by_hand.ogg + default_dug_node.1.ogg + default_dug_node.2.ogg + default_grass_footstep.1.ogg + default_grass_footstep.2.ogg + default_grass_footstep.3.ogg + default_gravel_footstep.1.ogg + default_gravel_footstep.2.ogg + default_gravel_footstep.3.ogg + default_gravel_footstep.4.ogg + default_grass_footstep.1.ogg + default_place_node.1.ogg + default_place_node.2.ogg + default_place_node.3.ogg + default_place_node_hard.1.ogg + default_place_node_hard.2.ogg + default_snow_footstep.1.ogg + default_snow_footstep.2.ogg + default_hard_footstep.1.ogg + default_hard_footstep.2.ogg + default_hard_footstep.3.ogg + default_sand_footstep.1.ogg + default_sand_footstep.2.ogg + default_wood_footstep.1.ogg + default_wood_footstep.2.ogg + default_dirt_footstep.1.ogg + default_dirt_footstep.2.ogg + default_glass_footstep.ogg + +Metal sounds: + default_dig_metal.ogg - yadronoff - CC-BY-3.0 + - https://www.freesound.org/people/yadronoff/sounds/320397/ + default_dug_metal.*.ogg - Iwan Gabovitch - qubodup - CC0 + - http://opengameart.org/users/qubodup + default_metal_footstep.*.ogg - Ottomaani138 - CC0 + - https://www.freesound.org/people/Ottomaani138/sounds/232692/ + default_place_node_metal.*.ogg - Ogrebane - CC0 + - http://opengameart.org/content/wood-and-metal-sound-effects-volume-2 + +Tool breaking sounds added by sofar: CC-BY-3.0 + default_tool_breaks.* - http://www.freesound.org/people/HerbertBoland/sounds/33206/ + +AGFX (CC BY 3.0) +https://www.freesound.org/people/AGFX/packs/1253/ + default_water_footstep.1.ogg + default_water_footstep.2.ogg + default_water_footstep.3.ogg +(default_water_footstep.4.ogg is silent) + +blukotek (CC0 1.0) +https://www.freesound.org/people/blukotek/sounds/251660/ + default_dig_snappy.ogg + +Chests sounds added by sofar, derived of several files mixed together: + default_chest_open.ogg + default_chest_close.ogg + - http://www.freesound.org/people/Sevin7/sounds/269722/ CC0 + - http://www.freesound.org/people/Percy%20Duke/sounds/23448/ CC-BY-3.0 + - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 + - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 + - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 + diff --git a/mods/default/aliases.lua b/mods/default/aliases.lua new file mode 100644 index 0000000..6db3fc8 --- /dev/null +++ b/mods/default/aliases.lua @@ -0,0 +1,77 @@ +-- mods/default/aliases.lua + +-- Aliases to support loading worlds using nodes following the old naming convention +-- These can also be helpful when using chat commands, for example /giveme +minetest.register_alias("stone", "default:stone") +minetest.register_alias("stone_with_coal", "default:stone_with_coal") +minetest.register_alias("stone_with_iron", "default:stone_with_iron") +minetest.register_alias("dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("dirt_with_grass_footsteps", "default:dirt_with_grass_footsteps") +minetest.register_alias("dirt", "default:dirt") +minetest.register_alias("sand", "default:sand") +minetest.register_alias("gravel", "default:gravel") +minetest.register_alias("sandstone", "default:sandstone") +minetest.register_alias("clay", "default:clay") +minetest.register_alias("brick", "default:brick") +minetest.register_alias("tree", "default:tree") +minetest.register_alias("jungletree", "default:jungletree") +minetest.register_alias("junglegrass", "default:junglegrass") +minetest.register_alias("leaves", "default:leaves") +minetest.register_alias("cactus", "default:cactus") +minetest.register_alias("papyrus", "default:papyrus") +minetest.register_alias("bookshelf", "default:bookshelf") +minetest.register_alias("glass", "default:glass") +minetest.register_alias("wooden_fence", "default:fence_wood") +minetest.register_alias("rail", "carts:rail") +minetest.register_alias("ladder", "default:ladder_wood") +minetest.register_alias("wood", "default:wood") +minetest.register_alias("mese", "default:mese") +minetest.register_alias("cloud", "default:cloud") +minetest.register_alias("water_flowing", "default:water_flowing") +minetest.register_alias("water_source", "default:water_source") +minetest.register_alias("lava_flowing", "default:lava_flowing") +minetest.register_alias("lava_source", "default:lava_source") +minetest.register_alias("torch", "default:torch") +minetest.register_alias("sign_wall", "default:sign_wall_wood") +minetest.register_alias("furnace", "default:furnace") +minetest.register_alias("chest", "default:chest") +minetest.register_alias("locked_chest", "default:chest_locked") +minetest.register_alias("cobble", "default:cobble") +minetest.register_alias("mossycobble", "default:mossycobble") +minetest.register_alias("steelblock", "default:steelblock") +minetest.register_alias("sapling", "default:sapling") +minetest.register_alias("apple", "default:apple") + +minetest.register_alias("WPick", "default:pick_wood") +minetest.register_alias("STPick", "default:pick_stone") +minetest.register_alias("SteelPick", "default:pick_steel") +minetest.register_alias("MesePick", "default:pick_mese") +minetest.register_alias("WShovel", "default:shovel_wood") +minetest.register_alias("STShovel", "default:shovel_stone") +minetest.register_alias("SteelShovel", "default:shovel_steel") +minetest.register_alias("WAxe", "default:axe_wood") +minetest.register_alias("STAxe", "default:axe_stone") +minetest.register_alias("SteelAxe", "default:axe_steel") +minetest.register_alias("WSword", "default:sword_wood") +minetest.register_alias("STSword", "default:sword_stone") +minetest.register_alias("SteelSword", "default:sword_steel") + +minetest.register_alias("Stick", "default:stick") +minetest.register_alias("paper", "default:paper") +minetest.register_alias("book", "default:book") +minetest.register_alias("lump_of_coal", "default:coal_lump") +minetest.register_alias("lump_of_iron", "default:iron_lump") +minetest.register_alias("lump_of_clay", "default:clay_lump") +minetest.register_alias("steel_ingot", "default:steel_ingot") +minetest.register_alias("clay_brick", "default:clay_brick") +minetest.register_alias("snow", "default:snow") + +-- 'mese_block' was used for a while for the block form of mese +minetest.register_alias("default:mese_block", "default:mese") + +-- Aliases for corrected pine node names +minetest.register_alias("default:pinetree", "default:pine_tree") +minetest.register_alias("default:pinewood", "default:pine_wood") + +minetest.register_alias("default:ladder", "default:ladder_wood") +minetest.register_alias("default:sign_wall", "default:sign_wall_wood") diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua new file mode 100644 index 0000000..50ffb1a --- /dev/null +++ b/mods/default/crafting.lua @@ -0,0 +1,1229 @@ +-- mods/default/crafting.lua + +minetest.register_craft({ + output = 'default:wood 4', + recipe = { + {'default:tree'}, + } +}) + +minetest.register_craft({ + output = 'default:junglewood 4', + recipe = { + {'default:jungletree'}, + } +}) + +minetest.register_craft({ + output = 'default:pine_wood 4', + recipe = { + {'default:pine_tree'}, + } +}) + +minetest.register_craft({ + output = 'default:acacia_wood 4', + recipe = { + {'default:acacia_tree'}, + } +}) + +minetest.register_craft({ + output = 'default:aspen_wood 4', + recipe = { + {'default:aspen_tree'}, + } +}) + +minetest.register_craft({ + output = 'default:wood', + recipe = { + {'default:bush_stem'}, + } +}) + +minetest.register_craft({ + output = 'default:acacia_wood', + recipe = { + {'default:acacia_bush_stem'}, + } +}) + +minetest.register_craft({ + output = 'default:stick 4', + recipe = { + {'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:sign_wall_steel 3', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:sign_wall_wood 3', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:torch 4', + recipe = { + {'default:coal_lump'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:pick_wood', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_stone', + recipe = { + {'group:stone', 'group:stone', 'group:stone'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_bronze', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_diamond', + recipe = { + {'default:diamond', 'default:diamond', 'default:diamond'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_wood', + recipe = { + {'group:wood'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_stone', + recipe = { + {'group:stone'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_steel', + recipe = { + {'default:steel_ingot'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_bronze', + recipe = { + {'default:bronze_ingot'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_mese', + recipe = { + {'default:mese_crystal'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_diamond', + recipe = { + {'default:diamond'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_wood', + recipe = { + {'group:wood', 'group:wood'}, + {'group:wood', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_stone', + recipe = { + {'group:stone', 'group:stone'}, + {'group:stone', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_bronze', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_diamond', + recipe = { + {'default:diamond', 'default:diamond'}, + {'default:diamond', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_wood', + recipe = { + {'group:wood', 'group:wood'}, + {'group:stick', 'group:wood'}, + {'group:stick',''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_stone', + recipe = { + {'group:stone', 'group:stone'}, + {'group:stick', 'group:stone'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'group:stick', 'default:steel_ingot'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_bronze', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot'}, + {'group:stick', 'default:bronze_ingot'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal'}, + {'group:stick', 'default:mese_crystal'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_diamond', + recipe = { + {'default:diamond', 'default:diamond'}, + {'group:stick', 'default:diamond'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:sword_wood', + recipe = { + {'group:wood'}, + {'group:wood'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_stone', + recipe = { + {'group:stone'}, + {'group:stone'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_steel', + recipe = { + {'default:steel_ingot'}, + {'default:steel_ingot'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_bronze', + recipe = { + {'default:bronze_ingot'}, + {'default:bronze_ingot'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_mese', + recipe = { + {'default:mese_crystal'}, + {'default:mese_crystal'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_diamond', + recipe = { + {'default:diamond'}, + {'default:diamond'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:skeleton_key', + recipe = { + {'default:gold_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:chest', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', '', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:chest_locked', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'default:steel_ingot', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:chest_locked", + recipe = {"default:chest", "default:steel_ingot"}, +}) + +minetest.register_craft({ + output = 'default:furnace', + recipe = { + {'group:stone', 'group:stone', 'group:stone'}, + {'group:stone', '', 'group:stone'}, + {'group:stone', 'group:stone', 'group:stone'}, + } +}) + +minetest.register_craft({ + output = 'default:coalblock', + recipe = { + {'default:coal_lump', 'default:coal_lump', 'default:coal_lump'}, + {'default:coal_lump', 'default:coal_lump', 'default:coal_lump'}, + {'default:coal_lump', 'default:coal_lump', 'default:coal_lump'}, + } +}) + +minetest.register_craft({ + output = 'default:coal_lump 9', + recipe = { + {'default:coalblock'}, + } +}) + +minetest.register_craft({ + output = 'default:steelblock', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:steel_ingot 9', + recipe = { + {'default:steelblock'}, + } +}) + +minetest.register_craft({ + output = 'default:copperblock', + recipe = { + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:copper_ingot 9', + recipe = { + {'default:copperblock'}, + } +}) + +minetest.register_craft({ + output = "default:tinblock", + recipe = { + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:tin_ingot 9", + recipe = { + {"default:tinblock"}, + } +}) + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + +minetest.register_craft({ + output = 'default:bronzeblock', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:bronze_ingot 9', + recipe = { + {'default:bronzeblock'}, + } +}) + +minetest.register_craft({ + output = 'default:goldblock', + recipe = { + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:gold_ingot 9', + recipe = { + {'default:goldblock'}, + } +}) + +minetest.register_craft({ + output = 'default:diamondblock', + recipe = { + {'default:diamond', 'default:diamond', 'default:diamond'}, + {'default:diamond', 'default:diamond', 'default:diamond'}, + {'default:diamond', 'default:diamond', 'default:diamond'}, + } +}) + +minetest.register_craft({ + output = 'default:diamond 9', + recipe = { + {'default:diamondblock'}, + } +}) + +minetest.register_craft({ + output = "default:sandstone", + recipe = { + {"default:sand", "default:sand"}, + {"default:sand", "default:sand"}, + } +}) + +minetest.register_craft({ + output = "default:sand 4", + recipe = { + {"default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:sandstonebrick 4", + recipe = { + {"default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:sandstone_block 9", + recipe = { + {"default:sandstone", "default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone", "default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone", + recipe = { + {"default:desert_sand", "default:desert_sand"}, + {"default:desert_sand", "default:desert_sand"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sand 4", + recipe = { + {"default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone_brick 4", + recipe = { + {"default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone_block 9", + recipe = { + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone", + recipe = { + {"default:silver_sand", "default:silver_sand"}, + {"default:silver_sand", "default:silver_sand"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sand 4", + recipe = { + {"default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone_brick 4", + recipe = { + {"default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone_block 9", + recipe = { + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = 'default:clay', + recipe = { + {'default:clay_lump', 'default:clay_lump'}, + {'default:clay_lump', 'default:clay_lump'}, + } +}) + +minetest.register_craft({ + output = 'default:clay_lump 4', + recipe = { + {'default:clay'}, + } +}) + +minetest.register_craft({ + output = 'default:brick', + recipe = { + {'default:clay_brick', 'default:clay_brick'}, + {'default:clay_brick', 'default:clay_brick'}, + } +}) + +minetest.register_craft({ + output = 'default:clay_brick 4', + recipe = { + {'default:brick'}, + } +}) + +minetest.register_craft({ + output = 'default:paper', + recipe = { + {'default:papyrus', 'default:papyrus', 'default:papyrus'}, + } +}) + +minetest.register_craft({ + output = 'default:book', + recipe = { + {'default:paper'}, + {'default:paper'}, + {'default:paper'}, + } +}) + +minetest.register_craft({ + output = 'default:bookshelf', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'default:book', 'default:book', 'default:book'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = "default:ladder_wood 5", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"}, + } +}) + +minetest.register_craft({ + output = 'default:ladder_steel 15', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = 'default:mese_crystal 9', + recipe = { + {'default:mese'}, + } +}) + +minetest.register_craft({ + output = 'default:mese_crystal_fragment 9', + recipe = { + {'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal", + recipe = { + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + } +}) + +minetest.register_craft({ + output = 'default:meselamp', + recipe = { + {'default:glass'}, + {'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = "default:mese_post_light 3", + recipe = { + {"", "default:glass", ""}, + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + {"", "group:wood", ""}, + } +}) + +minetest.register_craft({ + output = 'default:obsidian_shard 9', + recipe = { + {'default:obsidian'} + } +}) + +minetest.register_craft({ + output = 'default:obsidian', + recipe = { + {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'}, + {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'}, + {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'}, + } +}) + +minetest.register_craft({ + output = 'default:obsidianbrick 4', + recipe = { + {'default:obsidian', 'default:obsidian'}, + {'default:obsidian', 'default:obsidian'} + } +}) + +minetest.register_craft({ + output = 'default:obsidian_block 9', + recipe = { + {'default:obsidian', 'default:obsidian', 'default:obsidian'}, + {'default:obsidian', 'default:obsidian', 'default:obsidian'}, + {'default:obsidian', 'default:obsidian', 'default:obsidian'}, + } +}) + +minetest.register_craft({ + output = 'default:stonebrick 4', + recipe = { + {'default:stone', 'default:stone'}, + {'default:stone', 'default:stone'}, + } +}) + +minetest.register_craft({ + output = 'default:stone_block 9', + recipe = { + {'default:stone', 'default:stone', 'default:stone'}, + {'default:stone', 'default:stone', 'default:stone'}, + {'default:stone', 'default:stone', 'default:stone'}, + } +}) + +minetest.register_craft({ + output = 'default:desert_stonebrick 4', + recipe = { + {'default:desert_stone', 'default:desert_stone'}, + {'default:desert_stone', 'default:desert_stone'}, + } +}) + +minetest.register_craft({ + output = 'default:desert_stone_block 9', + recipe = { + {'default:desert_stone', 'default:desert_stone', 'default:desert_stone'}, + {'default:desert_stone', 'default:desert_stone', 'default:desert_stone'}, + {'default:desert_stone', 'default:desert_stone', 'default:desert_stone'}, + } +}) + +minetest.register_craft({ + output = 'default:snowblock', + recipe = { + {'default:snow', 'default:snow', 'default:snow'}, + {'default:snow', 'default:snow', 'default:snow'}, + {'default:snow', 'default:snow', 'default:snow'}, + } +}) + +minetest.register_craft({ + output = 'default:snow 9', + recipe = { + {'default:snowblock'}, + } +}) + +-- +-- Crafting (tool repair) +-- +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.02, +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "group:sand", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:obsidian_glass", + recipe = "default:obsidian_shard", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:mossycobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:desert_stone", + recipe = "default:desert_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "default:iron_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:copper_ingot", + recipe = "default:copper_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:tin_ingot", + recipe = "default:tin_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:gold_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:clay_brick", + recipe = "default:clay_lump", +}) + +minetest.register_craft({ + type = 'cooking', + output = 'default:gold_ingot', + recipe = 'default:skeleton_key', + cooktime = 5, +}) + +minetest.register_craft({ + type = 'cooking', + output = 'default:gold_ingot', + recipe = 'default:key', + cooktime = 5, +}) + +-- +-- Fuels +-- + +-- Support use of group:tree +minetest.register_craft({ + type = "fuel", + recipe = "group:tree", + burntime = 30, +}) + +-- Burn time for all woods are in order of wood density, +-- which is also the order of wood colour darkness: +-- aspen, pine, apple, acacia, jungle + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_tree", + burntime = 22, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_tree", + burntime = 26, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:tree", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_tree", + burntime = 34, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:jungletree", + burntime = 38, +}) + + +-- Support use of group:wood +minetest.register_craft({ + type = "fuel", + recipe = "group:wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_wood", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglewood", + burntime = 9, +}) + + +-- Support use of group:sapling +minetest.register_craft({ + type = "fuel", + recipe = "group:sapling", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_sapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_sapling", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_sapling", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_sapling", + burntime = 9, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sapling", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_sapling", + burntime = 11, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglesapling", + burntime = 12, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_aspen_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_pine_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_acacia_wood", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_junglewood", + burntime = 9, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_stem", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_stem", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglegrass", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:leaves", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:cactus", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:papyrus", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bookshelf", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:ladder_wood", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:lava_source", + burntime = 60, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:torch", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sign_wall_wood", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest_locked", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:apple", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coal_lump", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coalblock", + burntime = 370, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:dry_grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:paper", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:book", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:book_written", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:dry_shrub", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:stick", + burntime = 1, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "default:pick_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:shovel_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:axe_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sword_wood", + burntime = 5, +}) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua new file mode 100644 index 0000000..33cdd5f --- /dev/null +++ b/mods/default/craftitems.lua @@ -0,0 +1,334 @@ +-- mods/default/craftitems.lua + +minetest.register_craftitem("default:stick", { + description = "Stick", + inventory_image = "default_stick.png", + groups = {stick = 1, flammable = 2}, +}) + +minetest.register_craftitem("default:paper", { + description = "Paper", + inventory_image = "default_paper.png", + groups = {flammable = 3}, +}) + + +local lpp = 14 -- Lines per book's page +local function book_on_use(itemstack, user) + local player_name = user:get_player_name() + local meta = itemstack:get_meta() + local title, text, owner = "", "", player_name + local page, page_max, lines, string = 1, 1, {}, "" + + -- Backwards compatibility + local old_data = minetest.deserialize(itemstack:get_metadata()) + if old_data then + meta:from_table({ fields = old_data }) + end + + local data = meta:to_table().fields + + if data.owner then + title = data.title + text = data.text + owner = data.owner + + for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do + lines[#lines+1] = str + end + + if data.page then + page = data.page + page_max = data.page_max + + for i = ((lpp * page) - lpp) + 1, lpp * page do + if not lines[i] then break end + string = string .. lines[i] .. "\n" + end + end + end + + local formspec + if owner == player_name then + formspec = "size[8,8]" .. default.gui_bg .. + default.gui_bg_img .. + "field[0.5,1;7.5,0;title;Title:;" .. + minetest.formspec_escape(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;text;Contents:;" .. + minetest.formspec_escape(text) .. "]" .. + "button_exit[2.5,7.5;3,1;save;Save]" + else + formspec = "size[8,8]" .. default.gui_bg .. + default.gui_bg_img .. + "label[0.5,0.5;by " .. owner .. "]" .. + "tablecolumns[color;text]" .. + "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. + "table[0.4,0;7,0.5;title;#FFFF00," .. minetest.formspec_escape(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;;" .. + minetest.formspec_escape(string ~= "" and string or text) .. ";]" .. + "button[2.4,7.6;0.8,0.8;book_prev;<]" .. + "label[3.2,7.7;Page " .. page .. " of " .. page_max .. "]" .. + "button[4.9,7.6;0.8,0.8;book_next;>]" + end + + minetest.show_formspec(player_name, "default:book", formspec) + return itemstack +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:book" then return end + local inv = player:get_inventory() + local stack = player:get_wielded_item() + + if fields.save and fields.title ~= "" and fields.text ~= "" then + local new_stack, data + if stack:get_name() ~= "default:book_written" then + local count = stack:get_count() + if count == 1 then + stack:set_name("default:book_written") + else + stack:set_count(count - 1) + new_stack = ItemStack("default:book_written") + end + else + data = stack:get_meta():to_table().fields + end + + if data and data.owner and data.owner ~= player:get_player_name() then + return + end + + if not data then data = {} end + data.title = fields.title + data.owner = player:get_player_name() + data.description = "\""..fields.title.."\" by "..data.owner + data.text = fields.text + data.text_len = #data.text + data.page = 1 + data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) + + if new_stack then + new_stack:get_meta():from_table({ fields = data }) + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(player:getpos(), new_stack) + end + else + stack:get_meta():from_table({ fields = data }) + end + + elseif fields.book_next or fields.book_prev then + local data = stack:get_meta():to_table().fields + if not data or not data.page then + return + end + + data.page = tonumber(data.page) + data.page_max = tonumber(data.page_max) + + if fields.book_next then + data.page = data.page + 1 + if data.page > data.page_max then + data.page = 1 + end + else + data.page = data.page - 1 + if data.page == 0 then + data.page = data.page_max + end + end + + stack:get_meta():from_table({fields = data}) + stack = book_on_use(stack, player) + end + + -- Update stack + player:set_wielded_item(stack) +end) + +minetest.register_craftitem("default:book", { + description = "Book", + inventory_image = "default_book.png", + groups = {book = 1, flammable = 3}, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:book_written", { + description = "Book With Text", + inventory_image = "default_book_written.png", + groups = {book = 1, not_in_creative_inventory = 1, flammable = 3}, + stack_max = 1, + on_use = book_on_use, +}) + +minetest.register_craft({ + type = "shapeless", + output = "default:book_written", + recipe = {"default:book", "default:book_written"} +}) + +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack:get_name() ~= "default:book_written" then + return + end + + local original + local index + for i = 1, player:get_inventory():get_size("craft") do + if old_craft_grid[i]:get_name() == "default:book_written" then + original = old_craft_grid[i] + index = i + end + end + if not original then + return + end + local copymeta = original:get_meta():to_table() + -- copy of the book held by player's mouse cursor + itemstack:get_meta():from_table(copymeta) + -- put the book with metadata back in the craft grid + craft_inv:set_stack("craft", index, original) +end) + +minetest.register_craftitem("default:skeleton_key", { + description = "Skeleton Key", + inventory_image = "default_key_skeleton.png", + groups = {key = 1}, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + + if not node then + return itemstack + end + + local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use + if not on_skeleton_key_use then + return itemstack + end + + -- make a new key secret in case the node callback needs it + local random = math.random + local newsecret = string.format( + "%04x%04x%04x%04x", + random(2^16) - 1, random(2^16) - 1, + random(2^16) - 1, random(2^16) - 1) + + local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) + + if secret then + local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) + + -- update original itemstack + itemstack:take_item() + + -- finish and return the new key + local new_stack = ItemStack("default:key") + local meta = new_stack:get_meta() + meta:set_string("secret", secret) + meta:set_string("description", "Key to "..user:get_player_name().."'s " + ..minetest.registered_nodes[node.name].description) + + if itemstack:get_count() == 0 then + itemstack = new_stack + else + if inv:add_item("main", new_stack):get_count() > 0 then + minetest.add_item(user:getpos(), new_stack) + end -- else: added to inventory successfully + end + + return itemstack + end + end +}) + +minetest.register_craftitem("default:coal_lump", { + description = "Coal Lump", + inventory_image = "default_coal_lump.png", + groups = {coal = 1, flammable = 1} +}) + +minetest.register_craftitem("default:iron_lump", { + description = "Iron Lump", + inventory_image = "default_iron_lump.png", +}) + +minetest.register_craftitem("default:copper_lump", { + description = "Copper Lump", + inventory_image = "default_copper_lump.png", +}) + +minetest.register_craftitem("default:tin_lump", { + description = "Tin Lump", + inventory_image = "default_tin_lump.png", +}) + +minetest.register_craftitem("default:mese_crystal", { + description = "Mese Crystal", + inventory_image = "default_mese_crystal.png", +}) + +minetest.register_craftitem("default:gold_lump", { + description = "Gold Lump", + inventory_image = "default_gold_lump.png", +}) + +minetest.register_craftitem("default:diamond", { + description = "Diamond", + inventory_image = "default_diamond.png", +}) + +minetest.register_craftitem("default:clay_lump", { + description = "Clay Lump", + inventory_image = "default_clay_lump.png", +}) + +minetest.register_craftitem("default:steel_ingot", { + description = "Steel Ingot", + inventory_image = "default_steel_ingot.png", +}) + +minetest.register_craftitem("default:copper_ingot", { + description = "Copper Ingot", + inventory_image = "default_copper_ingot.png", +}) + +minetest.register_craftitem("default:tin_ingot", { + description = "Tin Ingot", + inventory_image = "default_tin_ingot.png", +}) + +minetest.register_craftitem("default:bronze_ingot", { + description = "Bronze Ingot", + inventory_image = "default_bronze_ingot.png", +}) + +minetest.register_craftitem("default:gold_ingot", { + description = "Gold Ingot", + inventory_image = "default_gold_ingot.png" +}) + +minetest.register_craftitem("default:mese_crystal_fragment", { + description = "Mese Crystal Fragment", + inventory_image = "default_mese_crystal_fragment.png", +}) + +minetest.register_craftitem("default:clay_brick", { + description = "Clay Brick", + inventory_image = "default_clay_brick.png", +}) + +minetest.register_craftitem("default:obsidian_shard", { + description = "Obsidian Shard", + inventory_image = "default_obsidian_shard.png", +}) + +minetest.register_craftitem("default:flint", { + description = "Flint", + inventory_image = "default_flint.png" +}) diff --git a/mods/default/functions.lua b/mods/default/functions.lua new file mode 100644 index 0000000..5dc22ca --- /dev/null +++ b/mods/default/functions.lua @@ -0,0 +1,574 @@ +-- mods/default/functions.lua + +-- +-- Sounds +-- + +function default.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "", gain = 1.0} + table.dug = table.dug or + {name = "default_dug_node", gain = 0.25} + table.place = table.place or + {name = "default_place_node_hard", gain = 1.0} + return table +end + +function default.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_hard_footstep", gain = 0.3} + table.dug = table.dug or + {name = "default_hard_footstep", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_dirt_footstep", gain = 0.4} + table.dug = table.dug or + {name = "default_dirt_footstep", gain = 1.0} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_sand_footstep", gain = 0.12} + table.dug = table.dug or + {name = "default_sand_footstep", gain = 0.24} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_gravel_footstep", gain = 0.4} + table.dug = table.dug or + {name = "default_gravel_footstep", gain = 1.0} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_wood_footstep", gain = 0.3} + table.dug = table.dug or + {name = "default_wood_footstep", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_grass_footstep", gain = 0.45} + table.dug = table.dug or + {name = "default_grass_footstep", gain = 0.7} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_glass_footstep", gain = 0.3} + table.dig = table.dig or + {name = "default_glass_footstep", gain = 0.5} + table.dug = table.dug or + {name = "default_break_glass", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_metal_footstep", gain = 0.4} + table.dig = table.dig or + {name = "default_dig_metal", gain = 0.5} + table.dug = table.dug or + {name = "default_dug_metal", gain = 0.5} + table.place = table.place or + {name = "default_place_node_metal", gain = 0.5} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_water_footstep", gain = 0.2} + default.node_sound_defaults(table) + return table +end + +-- +-- Lavacooling +-- + +default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "default:stone"}) + end + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.25}) +end + +if minetest.settings:get_bool("enable_lavacooling") ~= false then + minetest.register_abm({ + label = "Lava cooling", + nodenames = {"default:lava_source", "default:lava_flowing"}, + neighbors = {"group:cools_lava", "group:water"}, + interval = 1, + chance = 2, + catch_up = false, + action = default.cool_lava, + }) +end + +-- +-- optimized helper to put all items in an inventory into a drops list +-- + +function default.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n+1] = stack:to_table() + n = n + 1 + end + end +end + +-- +-- Papyrus and cactus growing +-- + +-- wrapping the functions in abm action is necessary to make overriding them possible + +function default.grow_cactus(pos, node) + if node.param2 >= 4 then + return + end + pos.y = pos.y - 1 + if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:cactus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:cactus"}) + return true +end + +function default.grow_papyrus(pos, node) + pos.y = pos.y - 1 + local name = minetest.get_node(pos).name + if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then + return + end + if not minetest.find_node_near(pos, 3, {"group:water"}) then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:papyrus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:papyrus"}) + return true +end + +minetest.register_abm({ + label = "Grow cactus", + nodenames = {"default:cactus"}, + neighbors = {"group:sand"}, + interval = 12, + chance = 83, + action = default.grow_cactus +}) + +minetest.register_abm({ + label = "Grow papyrus", + nodenames = {"default:papyrus"}, + neighbors = {"default:dirt", "default:dirt_with_grass"}, + interval = 14, + chance = 71, + action = default.grow_papyrus +}) + + +-- +-- dig upwards +-- + +function default.dig_up(pos, node, digger) + if digger == nil then return end + local np = {x = pos.x, y = pos.y + 1, z = pos.z} + local nn = minetest.get_node(np) + if nn.name == node.name then + minetest.node_dig(np, nn, digger) + end +end + + +-- +-- Fence registration helper +-- + +function default.register_fence(name, def) + minetest.register_craft({ + output = name .. " 4", + recipe = { + { def.material, 'group:stick', def.material }, + { def.material, 'group:stick', def.material }, + } + }) + + local fence_texture = "default_fence_overlay.png^" .. def.texture .. + "^default_fence_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8}, + {-1/16,-5/16,-1/2,1/16,-3/16,-1/8}}, + connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16}, + {-1/2,-5/16,-1/16,-1/8,-3/16,1/16}}, + connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2}, + {-1/16,-5/16,1/8,1/16,-3/16,1/2}}, + connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, + {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, + }, + connects_to = {"group:fence", "group:wood", "group:tree"}, + inventory_image = fence_texture, + wield_image = fence_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if not def[k] then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + def.texture = nil + def.material = nil + + minetest.register_node(name, def) +end + + +-- +-- Leafdecay +-- + +-- Prevent decay of placed leaves + +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end +end + +-- Leafdecay +local function leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if node.param2 == 0 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) + end + end +end + +local function leafdecay_on_timer(pos, def) + if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or + not is_leaf then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) +end + +function default.register_leafdecay(def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + +-- +-- Convert dirt to something that fits the environment +-- + +minetest.register_abm({ + label = "Grass spread", + nodenames = {"default:dirt"}, + neighbors = { + "air", + "group:grass", + "group:dry_grass", + "default:snow", + }, + interval = 6, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type") + if p2 then + local n3 = minetest.get_node(p2) + minetest.set_node(pos, {name = n3.name}) + return + end + + -- Else, any seeding nodes on top? + local name = minetest.get_node(above).name + -- Snow check is cheapest, so comes first + if name == "default:snow" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + -- Most likely case first + elseif minetest.get_item_group(name, "grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + elseif minetest.get_item_group(name, "dry_grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) + end + end +}) + + +-- +-- Grass and dry grass removed in darkness +-- + +minetest.register_abm({ + label = "Grass covered", + nodenames = {"group:spreading_dirt_type"}, + interval = 8, + chance = 50, + catch_up = false, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or + nodedef.paramtype == "light") and + nodedef.liquidtype == "none") then + minetest.set_node(pos, {name = "default:dirt"}) + end + end +}) + + +-- +-- Moss growth on cobble near water +-- + +minetest.register_abm({ + label = "Moss growth", + nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble", "walls:cobble"}, + neighbors = {"group:water"}, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + if node.name == "default:cobble" then + minetest.set_node(pos, {name = "default:mossycobble"}) + elseif node.name == "stairs:slab_cobble" then + minetest.set_node(pos, {name = "stairs:slab_mossycobble", param2 = node.param2}) + elseif node.name == "stairs:stair_cobble" then + minetest.set_node(pos, {name = "stairs:stair_mossycobble", param2 = node.param2}) + elseif node.name == "walls:cobble" then + minetest.set_node(pos, {name = "walls:mossycobble", param2 = node.param2}) + end + end +}) + + +-- +-- Checks if specified volume intersects a protected volume +-- + +function default.intersects_protection(minp, maxp, player_name, interval) + -- 'interval' is the largest allowed interval for the 3D lattice of checks + + -- Compute the optimal float step 'd' for each axis so that all corners and + -- borders are checked. 'd' will be smaller or equal to 'interval'. + -- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the + -- for loop (which might otherwise not be the case due to rounding errors). + local d = {} + for _, c in pairs({"x", "y", "z"}) do + if maxp[c] > minp[c] then + d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4 + elseif maxp[c] == minp[c] then + d[c] = 1 -- Any value larger than 0 to avoid division by zero + else -- maxp[c] < minp[c], print error and treat as protection intersected + minetest.log("error", "maxp < minp in 'default.intersects_protection()'") + return true + end + end + + for zf = minp.z, maxp.z, d.z do + local z = math.floor(zf + 0.5) + for yf = minp.y, maxp.y, d.y do + local y = math.floor(yf + 0.5) + for xf = minp.x, maxp.x, d.x do + local x = math.floor(xf + 0.5) + if minetest.is_protected({x = x, y = y, z = z}, player_name) then + return true + end + end + end + end + + return false +end + + +-- +-- Coral death near air +-- + +minetest.register_abm({ + nodenames = {"default:coral_brown", "default:coral_orange"}, + neighbors = {"air"}, + interval = 17, + chance = 5, + catch_up = false, + action = function(pos, node) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + + +-- +-- NOTICE: This method is not an official part of the API yet! +-- This method may change in future. +-- + +function default.can_interact_with_node(player, pos) + if player then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if not owner or owner == "" or owner == player:get_player_name() then + return true + end + + -- is player wielding the right key? + local item = player:get_wielded_item() + if item:get_name() == "default:key" then + local key_meta = item:get_meta() + + if key_meta:get_string("secret") == "" then + local key_oldmeta = item:get_metadata() + if key_oldmeta == "" or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string("secret", minetest.parse_json(key_oldmeta).secret) + item:set_metadata("") + end + + return meta:get_string("key_lock_secret") == key_meta:get_string("secret") + end + + return false +end diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua new file mode 100644 index 0000000..4b82205 --- /dev/null +++ b/mods/default/furnace.lua @@ -0,0 +1,330 @@ + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + local formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + "listring[current_name;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + return formspec +end + +local inactive_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + "listring[current_name;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", "Furnace is empty") + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + + local cookable, cooked + local fuel + + local update = true + while update do + update = false + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = cooked.time ~= 0 + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + elapsed + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + elapsed + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = src_time - cooked.time + update = true + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + update = true + fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime) + src_time = src_time + elapsed + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + src_time = 0 + end + fuel_time = 0 + end + + elapsed = 0 + end + + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + if item_percent > 100 then + item_state = "100% (output full)" + else + item_state = item_percent .. "%" + end + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + local result = false + + if fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + -- make sure timer restarts automatically + result = true + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "default:furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + end + + local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + + return result +end + +-- +-- Node definitions +-- + +minetest.register_node("default:furnace", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + on_timer = furnace_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('fuel', 1) + inv:set_size('dst', 4) + end, + + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "src", drops) + default.get_inventory_drops(pos, "fuel", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "default:furnace" + minetest.remove_node(pos) + return drops + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +minetest.register_node("default:furnace_active", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + diff --git a/mods/default/init.lua b/mods/default/init.lua new file mode 100644 index 0000000..7b5f62f --- /dev/null +++ b/mods/default/init.lua @@ -0,0 +1,52 @@ +-- Minetest 0.4 mod: default +-- See README.txt for licensing and other information. + +-- The API documentation in here was moved into game_api.txt + +-- Definitions made by this mod that other mods can use too +default = {} + +default.LIGHT_MAX = 14 + +-- GUI related stuff +default.gui_bg = "bgcolor[#080808BB;true]" +default.gui_bg_img = "background[5,5;1,1;gui_formbg.png;true]" +default.gui_slots = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + +function default.get_hotbar_bg(x,y) + local out = "" + for i=0,7,1 do + out = out .."image["..x+i..","..y..";1,1;gui_hb_bg.png]" + end + return out +end + +default.gui_survival_form = "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "list[current_player;craft;1.75,0.5;3,3;]".. + "list[current_player;craftpreview;5.75,1.5;1,1;]".. + "image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "listring[current_player;main]".. + "listring[current_player;craft]".. + default.get_hotbar_bg(0,4.25) + +-- Load files +local default_path = minetest.get_modpath("default") + +dofile(default_path.."/functions.lua") +dofile(default_path.."/trees.lua") +dofile(default_path.."/nodes.lua") +dofile(default_path.."/furnace.lua") +dofile(default_path.."/torch.lua") +dofile(default_path.."/tools.lua") +dofile(default_path.."/item_entity.lua") +dofile(default_path.."/craftitems.lua") +dofile(default_path.."/crafting.lua") +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/player.lua") +dofile(default_path.."/aliases.lua") +dofile(default_path.."/legacy.lua") diff --git a/mods/default/item_entity.lua b/mods/default/item_entity.lua new file mode 100644 index 0000000..c34e60e --- /dev/null +++ b/mods/default/item_entity.lua @@ -0,0 +1,74 @@ +-- mods/default/item_entity.lua + +local builtin_item = minetest.registered_entities["__builtin:item"] + +local item = { + set_item = function(self, itemstring) + builtin_item.set_item(self, itemstring) + + local stack = ItemStack(itemstring) + local itemdef = minetest.registered_items[stack:get_name()] + if itemdef and itemdef.groups.flammable ~= 0 then + self.flammable = itemdef.groups.flammable + end + end, + + burn_up = function(self) + -- disappear in a smoke puff + self.object:remove() + local p = self.object:getpos() + minetest.sound_play("default_item_smoke", { + pos = p, + max_hear_distance = 8, + }) + minetest.add_particlespawner({ + amount = 3, + time = 0.1, + minpos = {x = p.x - 0.1, y = p.y + 0.1, z = p.z - 0.1 }, + maxpos = {x = p.x + 0.1, y = p.y + 0.2, z = p.z + 0.1 }, + minvel = {x = 0, y = 2.5, z = 0}, + maxvel = {x = 0, y = 2.5, z = 0}, + minacc = {x = -0.15, y = -0.02, z = -0.15}, + maxacc = {x = 0.15, y = -0.01, z = 0.15}, + minexptime = 4, + maxexptime = 6, + minsize = 5, + maxsize = 5, + collisiondetection = true, + texture = "default_item_smoke.png" + }) + end, + + on_step = function(self, dtime) + builtin_item.on_step(self, dtime) + + if self.flammable then + -- flammable, check for igniters + self.ignite_timer = (self.ignite_timer or 0) + dtime + if self.ignite_timer > 10 then + self.ignite_timer = 0 + + local node = minetest.get_node_or_nil(self.object:getpos()) + if not node then + return + end + + -- Immediately burn up flammable items in lava + if minetest.get_item_group(node.name, "lava") > 0 then + self:burn_up() + else + -- otherwise there'll be a chance based on its igniter value + local burn_chance = self.flammable + * minetest.get_item_group(node.name, "igniter") + if burn_chance > 0 and math.random(0, burn_chance) ~= 0 then + self:burn_up() + end + end + end + end + end, +} + +-- set defined item as new __builtin:item, with the old one as fallback table +setmetatable(item, builtin_item) +minetest.register_entity(":__builtin:item", item) diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua new file mode 100644 index 0000000..a8c8ad5 --- /dev/null +++ b/mods/default/legacy.lua @@ -0,0 +1,25 @@ +-- mods/default/legacy.lua + +-- Horrible stuff to support old code registering falling nodes +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + +function default.spawn_falling_node(p, nodename) + spawn_falling_node(p, nodename) +end + +-- Liquids +WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha +WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity +LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity +LIGHT_MAX = default.LIGHT_MAX + +-- Formspecs +default.gui_suvival_form = default.gui_survival_form diff --git a/mods/default/license.txt b/mods/default/license.txt new file mode 100644 index 0000000..72af728 --- /dev/null +++ b/mods/default/license.txt @@ -0,0 +1,177 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2011-2016 Various Minetest developers and contributors + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2016: + celeron55, Perttu Ahola + Cisoun + G4JC + VanessaE + RealBadAngel + Calinou + MirceaKitsune + Jordach + PilzAdam + jojoa1997 + InfinityProject + Splizard + Zeg9 + paramat + BlockMen + sofar + Neuromancer + Gambit + asl97 + KevDoy + Mito551 + GreenXenith + kaeza + kilbith + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 brunob.santos + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/4.0/ + +----------------------- + +Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) +Copyright (C) 2014-2016 Neuromancer + + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/2.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2009 cmusounddesign +Copyright (C) 2010 Tomlija +Copyright (C) 2010 lsprice +Copyright (C) 2014 sonictechtonic +Copyright (C) 2015 yadronoff +Copyright (C) 2007 HerbertBoland +Copyright (C) 2006 AGFX + +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/3.0/ diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua new file mode 100644 index 0000000..1305226 --- /dev/null +++ b/mods/default/mapgen.lua @@ -0,0 +1,1826 @@ +-- +-- Aliases for map generators +-- + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") +minetest.register_alias("mapgen_sandstone", "default:sandstone") + +-- Flora + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pine_tree", "default:pine_tree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +-- Dungeons + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_stair_desert_stone", "stairs:stair_desert_stone") +minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") +minetest.register_alias("mapgen_stair_sandstone_block", "stairs:stair_sandstone_block") + + +-- +-- Register ores +-- + +-- Blob ores +-- These first to avoid other ores in blobs + +-- Mgv6 + +function default.register_mgv6_blob_ores() + + -- Clay + -- This first to avoid clay in sand blobs + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -15, + y_max = 0, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Sand + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -31, + y_max = 0, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Dirt + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -31, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -31000, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) +end + + +-- All mapgens except mgv6 + +function default.register_blob_ores() + + -- Clay + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -15, + y_max = 0, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Silver sand + + minetest.register_ore({ + ore_type = "blob", + ore = "default:silver_sand", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -31000, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = {"icesheet_ocean", "tundra", "tundra_beach", "tundra_ocean", + "taiga", "taiga_ocean", "snowy_grassland", "snowy_grassland_ocean", + "grassland", "grassland_dunes", "grassland_ocean", "coniferous_forest", + "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", + "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", + "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", + "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} + }) + + -- Dirt + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -31, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", + "deciduous_forest", "deciduous_forest_shore", "savanna", "savanna_shore", + "rainforest", "rainforest_swamp", "floatland_grassland", + "floatland_coniferous_forest"} + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -31000, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = {"icesheet_ocean", "tundra", "tundra_beach", "tundra_ocean", + "taiga", "taiga_ocean", "snowy_grassland", "snowy_grassland_ocean", + "grassland", "grassland_dunes", "grassland_ocean", "coniferous_forest", + "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", + "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", + "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", + "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} + }) +end + + +-- Scatter ores +-- All mapgens + +function default.register_ores() + + -- Coal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 8, + clust_size = 3, + y_min = -31000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = 0, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = -64, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_min = -63, + y_max = -16, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) + + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 4, + clust_size = 3, + y_min = -127, + y_max = -32, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -128, + }) + + -- Gold + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_min = -255, + y_max = -128, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + -- Mese block + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_min = -31000, + y_max = -1024, + }) +end + + +-- +-- Register biomes +-- + +-- All mapgens except mgv6 + +function default.register_biomes(upper_limit) + + -- Icesheet + + minetest.register_biome({ + name = "icesheet", + node_dust = "default:snowblock", + node_top = "default:snowblock", + depth_top = 1, + node_filler = "default:snowblock", + depth_filler = 3, + node_stone = "default:ice", + node_water_top = "default:ice", + depth_water_top = 10, + --node_water = "", + node_river_water = "default:ice", + node_riverbed = "default:gravel", + depth_riverbed = 2, + y_min = -8, + y_max = upper_limit, + heat_point = 0, + humidity_point = 73, + }) + + minetest.register_biome({ + name = "icesheet_ocean", + node_dust = "default:snowblock", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + node_water_top = "default:ice", + depth_water_top = 10, + --node_water = "", + --node_river_water = "", + y_min = -112, + y_max = -9, + heat_point = 0, + humidity_point = 73, + }) + + -- Tundra + + minetest.register_biome({ + name = "tundra", + node_dust = "default:snowblock", + --node_top = , + --depth_top = , + --node_filler = , + --depth_filler = , + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:gravel", + depth_riverbed = 2, + y_min = 2, + y_max = upper_limit, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_beach", + --node_dust = "", + node_top = "default:gravel", + depth_top = 1, + node_filler = "default:gravel", + depth_filler = 2, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:gravel", + depth_riverbed = 2, + y_min = -3, + y_max = 1, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:gravel", + depth_riverbed = 2, + y_min = -112, + y_max = -4, + heat_point = 0, + humidity_point = 40, + }) + + -- Taiga + + minetest.register_biome({ + name = "taiga", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 2, + y_max = upper_limit, + heat_point = 25, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "taiga_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 1, + heat_point = 25, + humidity_point = 70, + }) + + -- Snowy grassland + + minetest.register_biome({ + name = "snowy_grassland", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 20, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "snowy_grassland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 20, + humidity_point = 35, + }) + + -- Grassland + + minetest.register_biome({ + name = "grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 6, + y_max = upper_limit, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_dunes", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 5, + y_max = 5, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 50, + humidity_point = 35, + }) + + -- Coniferous forest + + minetest.register_biome({ + name = "coniferous_forest", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 6, + y_max = upper_limit, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_dunes", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 5, + y_max = 5, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 45, + humidity_point = 70, + }) + + -- Deciduous forest + + minetest.register_biome({ + name = "deciduous_forest", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 1, + y_max = upper_limit, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_shore", + --node_dust = "", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -1, + y_max = 0, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = -2, + heat_point = 60, + humidity_point = 68, + }) + + -- Desert + + minetest.register_biome({ + name = "desert", + --node_dust = "", + node_top = "default:desert_sand", + depth_top = 1, + node_filler = "default:desert_sand", + depth_filler = 1, + node_stone = "default:desert_stone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 92, + humidity_point = 16, + }) + + minetest.register_biome({ + name = "desert_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:desert_stone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 92, + humidity_point = 16, + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "sandstone_desert", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 60, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "sandstone_desert_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:sandstone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 60, + humidity_point = 0, + }) + + -- Cold desert + + minetest.register_biome({ + name = "cold_desert", + --node_dust = "", + node_top = "default:silver_sand", + depth_top = 1, + node_filler = "default:silver_sand", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 40, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "cold_desert_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 40, + humidity_point = 0, + }) + + -- Savanna + + minetest.register_biome({ + name = "savanna", + --node_dust = "", + node_top = "default:dirt_with_dry_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 1, + y_max = upper_limit, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_shore", + --node_dust = "", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -1, + y_max = 0, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = -2, + heat_point = 89, + humidity_point = 42, + }) + + -- Rainforest + + minetest.register_biome({ + name = "rainforest", + --node_dust = "", + node_top = "default:dirt_with_rainforest_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = 1, + y_max = upper_limit, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_swamp", + --node_dust = "", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -1, + y_max = 0, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "default:sand", + depth_riverbed = 2, + y_min = -112, + y_max = -2, + heat_point = 86, + humidity_point = 65, + }) + + -- Underground + + minetest.register_biome({ + name = "underground", + --node_dust = "", + --node_top = "", + --depth_top = , + --node_filler = "", + --depth_filler = , + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + y_min = -31000, + y_max = -113, + heat_point = 50, + humidity_point = 50, + }) +end + + +-- Biomes for floatlands + +function default.register_floatland_biomes(floatland_level, shadow_limit) + + -- Coniferous forest + + minetest.register_biome({ + name = "floatland_coniferous_forest", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 70, + }) + + -- Grassland + + minetest.register_biome({ + name = "floatland_grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 35, + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "floatland_sandstone_desert", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 0, + }) + + -- Floatland ocean / underground + + minetest.register_biome({ + name = "floatland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = shadow_limit, + y_max = floatland_level + 1, + heat_point = 50, + humidity_point = 50, + }) +end + + +-- +-- Register decorations +-- + +-- Mgv6 + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 100, y = 100, z = 100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_min = 1, + y_max = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Long grasses + + for length = 1, 5 do + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:dry_shrub", + }) +end + + +-- All mapgens except mgv6 + +local function register_grass_decoration(offset, scale, length) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:sand"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland", "grassland_dunes", "deciduous_forest", + "coniferous_forest", "coniferous_forest_dunes", + "floatland_grassland", "floatland_coniferous_forest"}, + y_min = 1, + y_max = 31000, + decoration = "default:grass_" .. length, + }) +end + +local function register_dry_grass_decoration(offset, scale, length) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"savanna"}, + y_min = 1, + y_max = 31000, + decoration = "default:dry_grass_" .. length, + }) +end + + +function default.register_decorations() + + -- Apple tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.036, + scale = 0.022, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0018, + scale = 0.0011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", + flags = "place_center_x", + rotation = "random", + }) + + -- Jungle tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, + sidelen = 16, + fill_ratio = 0.1, + biomes = {"rainforest", "rainforest_swamp"}, + y_min = -1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, + sidelen = 16, + fill_ratio = 0.005, + biomes = {"rainforest", "rainforest_swamp"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", + flags = "place_center_x", + rotation = "random", + }) + + -- Taiga and temperate coniferous forest pine tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.036, + scale = 0.022, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + y_min = 2, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, + sidelen = 80, + noise_params = { + offset = 0.0018, + scale = 0.0011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", + flags = "place_center_x", + rotation = "random", + }) + + -- Acacia tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", + flags = "place_center_x", + rotation = "random", + }) + + -- Aspen tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.0008, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", + flags = "place_center_x", + rotation = "random", + }) + + -- Large cactus + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = {x = 200, y = 200, z = 200}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert"}, + y_min = 5, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", + flags = "place_center_x", + rotation = "random", + }) + + -- Cactus + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = {x = 200, y = 200, z = 200}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert"}, + y_min = 5, + y_max = 31000, + decoration = "default:cactus", + height = 2, + height_max = 5, + }) + + -- Papyrus + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + biomes = {"savanna_shore"}, + y_min = 0, + y_max = 0, + schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts", + }) + + -- Bush + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"snowy_grassland", "grassland", "deciduous_forest", + "floatland_grassland"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Acacia bush + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 90155, + octaves = 3, + persist = 0.7, + }, + biomes = {"savanna"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Grasses + + register_grass_decoration(-0.03, 0.09, 5) + register_grass_decoration(-0.015, 0.075, 4) + register_grass_decoration(0, 0.06, 3) + register_grass_decoration(0.015, 0.045, 2) + register_grass_decoration(0.03, 0.03, 1) + + -- Dry grasses + + register_dry_grass_decoration(0.01, 0.05, 5) + register_dry_grass_decoration(0.03, 0.03, 4) + register_dry_grass_decoration(0.05, 0.01, 3) + register_dry_grass_decoration(0.07, -0.01, 2) + register_dry_grass_decoration(0.09, -0.03, 1) + + -- Junglegrass + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 16, + fill_ratio = 0.1, + biomes = {"rainforest"}, + y_min = 1, + y_max = 31000, + decoration = "default:junglegrass", + }) + + -- Dry shrub + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand", + "default:sand", "default:silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert", "sandstone_desert", "cold_desert"}, + y_min = 2, + y_max = 31000, + decoration = "default:dry_shrub", + }) + + -- Coral reef + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + noise_params = { + offset = -0.15, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 7013, + octaves = 3, + persist = 1, + }, + biomes = { + "desert_ocean", + "savanna_ocean", + "rainforest_ocean", + }, + y_min = -8, + y_max = -2, + schematic = minetest.get_modpath("default") .. "/schematics/corals.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + +-- +-- Detect mapgen, flags and parameters to select functions +-- + +-- Get setting or default +local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or + "mountains, ridges, nofloatlands" +local captures_float = string.match(mgv7_spflags, "floatlands") +local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") + +local mgv7_floatland_level = minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 +local mgv7_shadow_limit = minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 + +minetest.clear_registered_biomes() +minetest.clear_registered_ores() +minetest.clear_registered_decorations() + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" then + default.register_mgv6_blob_ores() + default.register_ores() + default.register_mgv6_decorations() +elseif mg_name == "v7" and captures_float == "floatlands" and + captures_nofloat ~= "nofloatlands" then + -- Mgv7 with floatlands + default.register_biomes(mgv7_shadow_limit - 1) + default.register_floatland_biomes(mgv7_floatland_level, mgv7_shadow_limit) + default.register_blob_ores() + default.register_ores() + default.register_decorations() +else + default.register_biomes(31000) + default.register_blob_ores() + default.register_ores() + default.register_decorations() +end diff --git a/mods/default/models/character.b3d b/mods/default/models/character.b3d new file mode 100644 index 0000000..9ab4543 Binary files /dev/null and b/mods/default/models/character.b3d differ diff --git a/mods/default/models/character.blend b/mods/default/models/character.blend new file mode 100644 index 0000000..fca9f65 Binary files /dev/null and b/mods/default/models/character.blend differ diff --git a/mods/default/models/character.png b/mods/default/models/character.png new file mode 100644 index 0000000..0502178 Binary files /dev/null and b/mods/default/models/character.png differ diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj new file mode 100644 index 0000000..72ba175 --- /dev/null +++ b/mods/default/models/chest_open.obj @@ -0,0 +1,79 @@ +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' +# www.blender.org +o Top_Cube.002_None_Top_Cube.002_None_bottom +v -0.500000 0.408471 0.720970 +v -0.500000 1.115578 0.013863 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 +v 0.500000 1.115578 0.013863 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top +s off +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/mods/default/models/torch_ceiling.obj b/mods/default/models/torch_ceiling.obj new file mode 100644 index 0000000..ea51f3c --- /dev/null +++ b/mods/default/models/torch_ceiling.obj @@ -0,0 +1,58 @@ +# Blender v2.77 (sub 0) OBJ File: 'torch_ceiling.blend' +# www.blender.org +mtllib torch_ceiling.mtl +o Cube_Cube.001 +v -0.062469 -0.047331 0.068152 +v -0.062469 -0.559515 -0.164388 +v -0.062469 0.004344 -0.045667 +v -0.062469 -0.507839 -0.278206 +v 0.062531 -0.047331 0.068152 +v 0.062531 -0.559515 -0.164388 +v 0.062531 0.004344 -0.045667 +v 0.062531 -0.507839 -0.278206 +v 0.353584 0.040000 0.363553 +v 0.353584 -0.397500 0.363553 +v -0.353522 0.040000 -0.343553 +v -0.353522 -0.397500 -0.343553 +v 0.353584 0.040000 -0.343553 +v -0.353522 0.040000 0.363553 +v 0.353584 -0.397500 -0.343553 +v -0.353522 -0.397500 0.363553 +vt 0.5625 0.5000 +vt 0.5625 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.5000 +vt 0.4375 0.0000 +vt 0.5625 0.0000 +vt 0.5625 0.1250 +vt 0.4375 0.1250 +vt 0.5625 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.0000 +vt 0.5625 0.6250 +vt 0.5625 0.0000 +vt 1.0000 0.5625 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5625 +vt 0.0000 0.5625 +vt 1.0000 0.5625 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 0.9105 0.4134 +vn -0.0000 -0.4134 0.9105 +vn -1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +usemtl Material.001 +s off +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/9/2 4/6/2 8/5/2 7/10/2 +f 1/11/3 3/9/3 4/6/3 2/12/3 +f 5/13/2 1/11/2 2/12/2 6/14/2 +f 7/10/3 8/5/3 6/14/3 5/13/3 +usemtl Material.002 +f 9/15/4 10/16/4 12/17/4 11/18/4 +f 13/19/5 14/20/5 16/21/5 15/22/5 diff --git a/mods/default/models/torch_floor.obj b/mods/default/models/torch_floor.obj new file mode 100644 index 0000000..e2487ef --- /dev/null +++ b/mods/default/models/torch_floor.obj @@ -0,0 +1,50 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_floor.blend' +# www.blender.org +mtllib torch_floor.mtl +o Cube_Cube.001 +v 0.062500 0.062500 -0.062500 +v 0.062500 -0.500000 -0.062500 +v 0.062500 0.062500 0.062500 +v 0.062500 -0.500000 0.062500 +v -0.062500 0.062500 -0.062500 +v -0.062500 -0.500000 -0.062500 +v -0.062500 0.062500 0.062500 +v -0.062500 -0.500000 0.062500 +v -0.353553 -0.500000 0.353553 +v -0.353553 0.500000 0.353553 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.500000 -0.353553 +v -0.353553 -0.500000 -0.353553 +v 0.353553 -0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.000000 -0.707100 +vn -0.707100 -0.000000 0.707100 +g Cube_Cube.001_Cube_Cube.001_Material.001 +usemtl Material.001 +s off +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +g Cube_Cube.001_Cube_Cube.001_Material.002 +usemtl Material.002 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 13/12/5 14/9/5 16/10/5 15/11/5 diff --git a/mods/default/models/torch_wall.obj b/mods/default/models/torch_wall.obj new file mode 100644 index 0000000..57baa9e --- /dev/null +++ b/mods/default/models/torch_wall.obj @@ -0,0 +1,64 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_wall.blend' +# www.blender.org +mtllib torch_wall.mtl +o Cube_Cube.001 +v 0.062469 -0.195248 0.023570 +v 0.062469 -0.476498 -0.463570 +v 0.062469 -0.303502 0.086070 +v 0.062469 -0.584752 -0.401070 +v -0.062531 -0.195248 0.023570 +v -0.062531 -0.476498 -0.463570 +v -0.062531 -0.303502 0.086070 +v -0.062531 -0.584752 -0.401070 +v -0.353584 -0.613553 0.022500 +v -0.353584 -0.613553 0.460000 +v 0.353522 0.093553 0.022500 +v 0.353522 0.093553 0.460000 +v -0.353584 0.093553 0.022500 +v 0.353522 -0.613553 0.022500 +v -0.353584 0.093553 0.460000 +v 0.353522 -0.613553 0.460000 +v 0.353553 0.056811 -0.121957 +v 0.353553 -0.224439 -0.609096 +v -0.353553 -0.555561 0.231596 +v -0.353553 -0.836811 -0.255543 +v -0.353553 0.056811 -0.121957 +v -0.353553 -0.224439 -0.609096 +v 0.353553 -0.555561 0.231596 +v 0.353553 -0.836811 -0.255543 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.562500 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn -0.000000 0.500000 0.866000 +vn -0.000000 0.866000 -0.500000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.612400 -0.353600 +vn -0.707100 -0.612400 0.353600 +vn -0.707100 0.707100 -0.000000 +vn -0.707100 -0.707100 -0.000000 +g Cube_Cube.001_Cube_Cube.001_Material.001 +usemtl Material.001 +s off +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +f 17/9/4 18/10/4 20/11/4 19/12/4 +f 21/9/5 22/10/5 24/11/5 23/12/5 +g Cube_Cube.001_Cube_Cube.001_Material.002 +usemtl Material.002 +f 9/12/6 10/13/6 12/14/6 11/9/6 +f 13/9/7 14/12/7 16/13/7 15/14/7 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua new file mode 100644 index 0000000..f14e8b2 --- /dev/null +++ b/mods/default/nodes.lua @@ -0,0 +1,2441 @@ +-- mods/default/nodes.lua + + +--[[ Node name convention: + +Although many node names are in combined-word form, the required form for new +node names is words separated by underscores. If both forms are used in written +language (for example pinewood and pine wood) the underscore form should be used. + +--]] + + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant 4. Modified forms) + +default:stone +default:cobble +default:stonebrick +default:stone_block +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick +default:desert_stone_block + +default:sandstone +default:sandstonebrick +default:sandstone_block +default:desert_sandstone +default:desert_sandstone_brick +default:desert_sandstone_block +default:silver_sandstone +default:silver_sandstone_brick +default:silver_sandstone_block + +default:obsidian +default:obsidianbrick +default:obsidian_block + +Soft / Non-Stone +---------------- +(1. Material 2. Modified forms) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_dry_grass +default:dirt_with_snow +default:dirt_with_rainforest_litter + +default:sand +default:desert_sand +default:silver_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pine_tree +default:pine_wood +default:pine_needles +default:pine_sapling + +default:acacia_tree +default:acacia_wood +default:acacia_leaves +default:acacia_sapling + +default:aspen_tree +default:aspen_wood +default:aspen_leaves +default:aspen_sapling + +Ores +---- +(1. In stone 2. Blocks) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock + +default:stone_with_tin +default:tinblock + +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife +--------- + +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass + +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +default:dry_grass_1 +default:dry_grass_2 +default:dry_grass_3 +default:dry_grass_4 +default:dry_grass_5 + +default:bush_stem +default:bush_leaves +default:bush_sapling +default:acacia_bush_stem +default:acacia_bush_leaves +default:acacia_bush_sapling + +Corals +------ + +default:coral_brown +default:coral_orange +default:coral_skeleton + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall_wood +default:sign_wall_steel + +default:ladder_wood +default:ladder_steel + +default:fence_wood +default:fence_acacia_wood +default:fence_junglewood +default:fence_pine_wood +default:fence_aspen_wood + +default:glass +default:obsidian_glass + +default:brick + +default:meselamp +default:mese_post_light + +Misc +---- + +default:cloud + +--]] + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + groups = {cracky = 3, stone = 1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = "Stone Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_stone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_block", { + description = "Stone Block", + tiles = {"default_stone_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + groups = {cracky = 3, stone = 1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = "Desert Stone Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_desert_stone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stone_block", { + description = "Desert Stone Block", + tiles = {"default_desert_stone_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstone_block", { + description = "Sandstone Block", + tiles = {"default_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone", { + description = "Desert Sandstone", + tiles = {"default_desert_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone_brick", { + description = "Desert Sandstone Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_desert_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone_block", { + description = "Desert Sandstone Block", + tiles = {"default_desert_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone", { + description = "Silver Sandstone", + tiles = {"default_silver_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone_brick", { + description = "Silver Sandstone Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_silver_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone_block", { + description = "Silver Sandstone Block", + tiles = {"default_silver_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_obsidian_brick.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +minetest.register_node("default:obsidian_block", { + description = "Obsidian Block", + tiles = {"default_obsidian_block.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:dirt_with_dry_grass", { + description = "Dirt with Dry Grass", + tiles = {"default_dry_grass.png", + "default_dirt.png", + {name = "default_dirt.png^default_dry_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = "Dirt with Snow", + tiles = {"default_snow.png", "default_dirt.png", + {name = "default_dirt.png^default_snow_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, spreading_dirt_type = 1, snowy = 1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + }), +}) + +minetest.register_node("default:dirt_with_rainforest_litter", { + description = "Dirt with Rainforest Litter", + tiles = { + "default_rainforest_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_rainforest_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:silver_sand", { + description = "Silver Sand", + tiles = {"default_silver_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1}, + sounds = default.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + {items = {'default:flint'}, rarity = 16}, + {items = {'default:gravel'}} + } + } +}) + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + groups = {crumbly = 3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults(), +}) + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + paramtype = "light", + buildable_to = true, + floodable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1, snowy = 1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(2400,4800)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 6, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_leaves.png"}, + special_tiles = {"default_leaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name = "default:apple", param2 = 1}) + end + end, +}) + + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", + "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = "Jungle Wood Planks", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_junglewood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_jungleleaves.png"}, + special_tiles = {"default_jungleleaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {'default:junglesapling'}, rarity = 20}, + {items = {'default:jungleleaves'}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = "Jungle Sapling", + drawtype = "plantlike", + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(2400,4800)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:junglesapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 15, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + + +minetest.register_node("default:pine_tree", { + description = "Pine Tree", + tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", + "default_pine_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pine_wood", { + description = "Pine Wood Planks", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_pine_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_sapling"}, rarity = 20}, + {items = {"default:pine_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(2400,4800)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 12, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + + +minetest.register_node("default:acacia_tree", { + description = "Acacia Tree", + tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png", + "default_acacia_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:acacia_wood", { + description = "Acacia Wood Planks", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_acacia_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:acacia_leaves", { + description = "Acacia Leaves", + drawtype = "allfaces_optional", + tiles = {"default_acacia_leaves.png"}, + special_tiles = {"default_acacia_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_sapling"}, rarity = 20}, + {items = {"default:acacia_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:acacia_sapling", { + description = "Acacia Tree Sapling", + drawtype = "plantlike", + tiles = {"default_acacia_sapling.png"}, + inventory_image = "default_acacia_sapling.png", + wield_image = "default_acacia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(2400,4800)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -4, y = 1, z = -4}, + {x = 4, y = 6, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:aspen_tree", { + description = "Aspen Tree", + tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png", + "default_aspen_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:aspen_wood", { + description = "Aspen Wood Planks", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_aspen_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:aspen_leaves", { + description = "Aspen Leaves", + drawtype = "allfaces_optional", + tiles = {"default_aspen_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:aspen_sapling"}, rarity = 20}, + {items = {"default:aspen_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:aspen_sapling", { + description = "Aspen Tree Sapling", + drawtype = "plantlike", + tiles = {"default_aspen_sapling.png"}, + inventory_image = "default_aspen_sapling.png", + wield_image = "default_aspen_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(2400,4800)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:aspen_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 12, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + groups = {cracky = 3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + groups = {cracky = 2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + groups = {cracky = 2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_tin", { + description = "Tin Ore", + tiles = {"default_stone.png^default_mineral_tin.png"}, + groups = {cracky = 2}, + drop = "default:tin_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:tinblock", { + description = "Tin Block", + tiles = {"default_tin_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + paramtype = "light", + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 3, +}) + + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + groups = {cracky = 2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + is_ground_content = false, + groups = {cracky = 1}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + groups = {cracky = 1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", + "default_cactus_side.png"}, + paramtype2 = "facedir", + groups = {choppy = 3}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.69, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 1.19, 7 / 16}, + }, +}) + + +minetest.register_node("default:grass_1", { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_" .. math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + minetest.register_node("default:grass_" .. i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_" .. i .. ".png"}, + inventory_image = "default_grass_" .. i .. ".png", + wield_image = "default_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "default:grass_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:dry_grass_1", { + description = "Dry Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_1.png"}, + inventory_image = "default_dry_grass_3.png", + wield_image = "default_dry_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, + attached_node = 1, dry_grass = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random dry grass node + local stack = ItemStack("default:dry_grass_" .. math.random(1, 5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:dry_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + minetest.register_node("default:dry_grass_" .. i, { + description = "Dry Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_" .. i .. ".png"}, + inventory_image = "default_dry_grass_" .. i .. ".png", + wield_image = "default_dry_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + not_in_creative_inventory=1, dry_grass = 1}, + drop = "default:dry_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:bush_stem", { + description = "Bush Stem", + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_bush_stem.png"}, + inventory_image = "default_bush_stem.png", + wield_image = "default_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:bush_leaves", { + description = "Bush Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_leaves_simple.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:bush_sapling"}, rarity = 5}, + {items = {"default:bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:bush_sapling", { + description = "Bush Sapling", + drawtype = "plantlike", + tiles = {"default_bush_sapling.png"}, + inventory_image = "default_bush_sapling.png", + wield_image = "default_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(1200, 2400)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:acacia_bush_stem", { + description = "Acacia Bush Stem", + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_acacia_bush_stem.png"}, + inventory_image = "default_acacia_bush_stem.png", + wield_image = "default_acacia_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:acacia_bush_leaves", { + description = "Acacia Bush Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_acacia_leaves_simple.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_bush_sapling"}, rarity = 5}, + {items = {"default:acacia_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:acacia_bush_sapling", { + description = "Acacia Bush Sapling", + drawtype = "plantlike", + tiles = {"default_acacia_bush_sapling.png"}, + inventory_image = "default_acacia_bush_sapling.png", + wield_image = "default_acacia_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(1200, 2400)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + +-- +-- Corals +-- + +minetest.register_node("default:coral_brown", { + description = "Brown Coral", + tiles = {"default_coral_brown.png"}, + groups = {cracky = 3}, + drop = "default:coral_skeleton", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coral_orange", { + description = "Orange Coral", + tiles = {"default_coral_orange.png"}, + groups = {cracky = 3}, + drop = "default:coral_skeleton", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coral_skeleton", { + description = "Coral Skeleton", + tiles = {"default_coral_skeleton.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, + not_in_creative_inventory = 1, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, + not_in_creative_inventory = 1, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a = 191, r = 255, g = 64, b = 0}, + groups = {lava = 3, liquid = 2, igniter = 1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a = 191, r = 255, g = 64, b = 0}, + groups = {lava = 3, liquid = 2, igniter = 1, + not_in_creative_inventory = 1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +local function get_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[nodemeta:" .. spos .. ";main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + return formspec +end + +local function chest_lid_obstructed(pos) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted") then + return false + end + return true +end + +local open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:chest" then + return + end + if not player or not fields.quit then + return + end + local pn = player:get_player_name() + + if not open_chests[pn] then + return + end + + local pos = open_chests[pn].pos + local sound = open_chests[pn].sound + local swap = open_chests[pn].swap + local node = minetest.get_node(pos) + + open_chests[pn] = nil + for k, v in pairs(open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) + return true +end) + +function default.register_chest(name, d) + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by " .. + meta:get_string("owner") .. ")") + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, "You do not own this chest.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked chest", owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + end + + def.on_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + minetest.log("action", player:get_player_name() .. + " moves stuff in chest at " .. minetest.pos_to_string(pos)) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves " .. stack:get_name() .. + " to chest at " .. minetest.pos_to_string(pos)) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes " .. stack:get_name() .. + " from chest at " .. minetest.pos_to_string(pos)) + end + def.on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = "default:chest" + minetest.remove_node(pos) + return drops + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + def_opened.drop = "default:" .. name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3].."^[transformFX" + + minetest.register_node("default:" .. name, def_closed) + minetest.register_node("default:" .. name .. "_open", def_opened) + + -- convert old chests to this new variant + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name .. "_v2", + nodenames = {"default:" .. name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end + end + }) +end + + +default.register_chest("chest", { + description = "Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, +}) + +default.register_chest("chest_locked", { + description = "Locked Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_lock.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) + +local bookshelf_formspec = + "size[8,7;]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[context;books;0,0.3;8,2;]" .. + "list[current_player;main;0,2.85;8,1;]" .. + "list[current_player;main;0,4.08;8,3;8]" .. + "listring[context;books]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,2.85) + +local function get_bookshelf_formspec(inv) + local formspec = bookshelf_formspec + local invlist = inv and inv:get_list("books") + -- Inventory slots overlay + local bx, by = 0, 0.3 + for i = 1, 16 do + if i == 9 then + bx = 0 + by = by + 1 + end + if not invlist or invlist[i]:is_empty() then + formspec = formspec .. + "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]" + end + bx = bx + 1 + end + return formspec +end + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_bookshelf_formspec(nil)) + local inv = meta:get_inventory() + inv:set_size("books", 8 * 2) + end, + can_dig = function(pos,player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("books") + end, + allow_metadata_inventory_put = function(pos, listname, index, stack) + if minetest.get_item_group(stack:get_name(), "book") ~= 0 then + return stack:get_count() + end + return 0 + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name() .. + " moves stuff in bookshelf at " .. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves stuff to bookshelf at " .. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes stuff from bookshelf at " .. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "books", drops) + drops[#drops+1] = "default:bookshelf" + minetest.remove_node(pos) + return drops + end, +}) + +local function register_sign(material, desc, def) + minetest.register_node("default:sign_wall_" .. material, { + description = desc .. " Sign", + drawtype = "nodebox", + tiles = {"default_sign_wall_" .. material .. ".png"}, + inventory_image = "default_sign_" .. material .. ".png", + wield_image = "default_sign_" .. material .. ".png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = def.groups, + legacy_wallmounted = true, + sounds = def.sounds, + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (player_name or "") .. " wrote \"" .. + fields.text .. "\" to sign at " .. minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"' .. fields.text .. '"') + end, + }) +end + +register_sign("wood", "Wooden", { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3} +}) + +register_sign("steel", "Steel", { + sounds = default.node_sound_metal_defaults(), + groups = {cracky = 2, attached_node = 1} +}) + +minetest.register_node("default:ladder_wood", { + description = "Wooden Ladder", + drawtype = "signlike", + tiles = {"default_ladder_wood.png"}, + inventory_image = "default_ladder_wood.png", + wield_image = "default_ladder_wood.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:ladder_steel", { + description = "Steel Ladder", + drawtype = "signlike", + tiles = {"default_ladder_steel.png"}, + inventory_image = "default_ladder_steel.png", + wield_image = "default_ladder_steel.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +default.register_fence("default:fence_wood", { + description = "Wooden Fence", + texture = "default_fence_wood.png", + inventory_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_acacia_wood", { + description = "Acacia Fence", + texture = "default_fence_acacia_wood.png", + inventory_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_junglewood", { + description = "Jungle Wood Fence", + texture = "default_fence_junglewood.png", + inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_pine_wood", { + description = "Pine Fence", + texture = "default_fence_pine_wood.png", + inventory_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_aspen_wood", { + description = "Aspen Fence", + texture = "default_fence_aspen_wood.png", + inventory_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + paramtype = "light", + paramtype2 = "glasslikeliquidlevel", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = "Obsidian Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, + paramtype = "light", + paramtype2 = "glasslikeliquidlevel", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky = 3}, +}) + + +minetest.register_node("default:brick", { + description = "Brick Block", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +minetest.register_node("default:mese_post_light", { + description = "Mese Post Light", + tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png", + "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png", + "default_mese_post_light_side.png", "default_mese_post_light_side.png"}, + wield_image = "default_mese_post_light_side.png", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16}, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX, + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + is_ground_content = false, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory = 1}, +}) + +-- +-- register trees for leafdecay +-- + +if minetest.get_mapgen_setting("mg_name") == "v6" then + default.register_leafdecay({ + trunks = {"default:tree"}, + leaves = {"default:apple", "default:leaves"}, + radius = 2, + }) + + default.register_leafdecay({ + trunks = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + radius = 3, + }) + + default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 3, + }) +else + default.register_leafdecay({ + trunks = {"default:tree"}, + leaves = {"default:apple", "default:leaves"}, + radius = 3, + }) + + default.register_leafdecay({ + trunks = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + radius = 2, + }) + + default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 2, + }) +end + +default.register_leafdecay({ + trunks = {"default:acacia_tree"}, + leaves = {"default:acacia_leaves"}, + radius = 2, +}) + +default.register_leafdecay({ + trunks = {"default:aspen_tree"}, + leaves = {"default:aspen_leaves"}, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"default:bush_stem"}, + leaves = {"default:bush_leaves"}, + radius = 1, +}) + +default.register_leafdecay({ + trunks = {"default:acacia_bush_stem"}, + leaves = {"default:acacia_bush_leaves"}, + radius = 1, +}) diff --git a/mods/default/player.lua b/mods/default/player.lua new file mode 100644 index 0000000..0a2078d --- /dev/null +++ b/mods/default/player.lua @@ -0,0 +1,154 @@ +-- Minetest 0.4 mod: player +-- See README.txt for licensing and other information. + +-- Player animation blending +-- Note: This is currently broken due to a bug in Irrlicht, leave at 0 +local animation_blend = 0 + +default.registered_player_models = { } + +-- Local for speed. +local models = default.registered_player_models + +function default.player_register_model(name, def) + models[name] = def +end + +-- Default player appearance +default.player_register_model("character.b3d", { + animation_speed = 30, + textures = {"character.png", }, + animations = { + -- Standard animations. + stand = { x= 0, y= 79, }, + lay = { x=162, y=166, }, + walk = { x=168, y=187, }, + mine = { x=189, y=198, }, + walk_mine = { x=200, y=219, }, + sit = { x= 81, y=160, }, + }, +}) + +-- Player stats and animations +local player_model = {} +local player_textures = {} +local player_anim = {} +local player_sneak = {} +default.player_attached = {} + +function default.player_get_animation(player) + local name = player:get_player_name() + return { + model = player_model[name], + textures = player_textures[name], + animation = player_anim[name], + } +end + +-- Called when a player's appearance needs to be updated +function default.player_set_model(player, model_name) + local name = player:get_player_name() + local model = models[model_name] + if model then + if player_model[name] == model_name then + return + end + player:set_properties({ + mesh = model_name, + textures = player_textures[name] or model.textures, + visual = "mesh", + visual_size = model.visual_size or {x=1, y=1}, + }) + default.player_set_animation(player, "stand") + else + player:set_properties({ + textures = { "player.png", "player_back.png", }, + visual = "upright_sprite", + }) + end + player_model[name] = model_name +end + +function default.player_set_textures(player, textures) + local name = player:get_player_name() + player_textures[name] = textures + player:set_properties({textures = textures,}) +end + +function default.player_set_animation(player, anim_name, speed) + local name = player:get_player_name() + if player_anim[name] == anim_name then + return + end + local model = player_model[name] and models[player_model[name]] + if not (model and model.animations[anim_name]) then + return + end + local anim = model.animations[anim_name] + player_anim[name] = anim_name + player:set_animation(anim, speed or model.animation_speed, animation_blend) +end + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + default.player_attached[player:get_player_name()] = false + default.player_set_model(player, "character.b3d") + player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) + + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_model[name] = nil + player_anim[name] = nil + player_textures[name] = nil +end) + +-- Localize for better performance. +local player_set_animation = default.player_set_animation +local player_attached = default.player_attached + +-- Check each player and apply animations +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local model_name = player_model[name] + local model = model_name and models[model_name] + if model and not player_attached[name] then + local controls = player:get_player_control() + local walking = false + local animation_speed_mod = model.animation_speed or 30 + + -- Determine if the player is walking + if controls.up or controls.down or controls.left or controls.right then + walking = true + end + + -- Determine if the player is sneaking, and reduce animation speed if so + if controls.sneak then + animation_speed_mod = animation_speed_mod / 2 + end + + -- Apply animations based on what the player is doing + if player:get_hp() == 0 then + player_set_animation(player, "lay") + elseif walking then + if player_sneak[name] ~= controls.sneak then + player_anim[name] = nil + player_sneak[name] = controls.sneak + end + if controls.LMB then + player_set_animation(player, "walk_mine", animation_speed_mod) + else + player_set_animation(player, "walk", animation_speed_mod) + end + elseif controls.LMB then + player_set_animation(player, "mine") + else + player_set_animation(player, "stand", animation_speed_mod) + end + end + end +end) diff --git a/mods/default/schematics/acacia_bush.mts b/mods/default/schematics/acacia_bush.mts new file mode 100644 index 0000000..df95586 Binary files /dev/null and b/mods/default/schematics/acacia_bush.mts differ diff --git a/mods/default/schematics/acacia_log.mts b/mods/default/schematics/acacia_log.mts new file mode 100644 index 0000000..037bca8 Binary files /dev/null and b/mods/default/schematics/acacia_log.mts differ diff --git a/mods/default/schematics/acacia_tree.mts b/mods/default/schematics/acacia_tree.mts new file mode 100644 index 0000000..4732ade Binary files /dev/null and b/mods/default/schematics/acacia_tree.mts differ diff --git a/mods/default/schematics/acacia_tree_from_sapling.mts b/mods/default/schematics/acacia_tree_from_sapling.mts new file mode 100644 index 0000000..23e8e4b Binary files /dev/null and b/mods/default/schematics/acacia_tree_from_sapling.mts differ diff --git a/mods/default/schematics/apple_log.mts b/mods/default/schematics/apple_log.mts new file mode 100644 index 0000000..e7ee8f2 Binary files /dev/null and b/mods/default/schematics/apple_log.mts differ diff --git a/mods/default/schematics/apple_tree.mts b/mods/default/schematics/apple_tree.mts new file mode 100644 index 0000000..2bd57c1 Binary files /dev/null and b/mods/default/schematics/apple_tree.mts differ diff --git a/mods/default/schematics/apple_tree_from_sapling.mts b/mods/default/schematics/apple_tree_from_sapling.mts new file mode 100644 index 0000000..d258ab1 Binary files /dev/null and b/mods/default/schematics/apple_tree_from_sapling.mts differ diff --git a/mods/default/schematics/aspen_log.mts b/mods/default/schematics/aspen_log.mts new file mode 100644 index 0000000..180e6fd Binary files /dev/null and b/mods/default/schematics/aspen_log.mts differ diff --git a/mods/default/schematics/aspen_tree.mts b/mods/default/schematics/aspen_tree.mts new file mode 100644 index 0000000..429a831 Binary files /dev/null and b/mods/default/schematics/aspen_tree.mts differ diff --git a/mods/default/schematics/aspen_tree_from_sapling.mts b/mods/default/schematics/aspen_tree_from_sapling.mts new file mode 100644 index 0000000..b7ab3ee Binary files /dev/null and b/mods/default/schematics/aspen_tree_from_sapling.mts differ diff --git a/mods/default/schematics/bush.mts b/mods/default/schematics/bush.mts new file mode 100644 index 0000000..d08cf5f Binary files /dev/null and b/mods/default/schematics/bush.mts differ diff --git a/mods/default/schematics/corals.mts b/mods/default/schematics/corals.mts new file mode 100644 index 0000000..e1bd7de Binary files /dev/null and b/mods/default/schematics/corals.mts differ diff --git a/mods/default/schematics/jungle_log.mts b/mods/default/schematics/jungle_log.mts new file mode 100644 index 0000000..54fa16d Binary files /dev/null and b/mods/default/schematics/jungle_log.mts differ diff --git a/mods/default/schematics/jungle_tree.mts b/mods/default/schematics/jungle_tree.mts new file mode 100644 index 0000000..01a1b11 Binary files /dev/null and b/mods/default/schematics/jungle_tree.mts differ diff --git a/mods/default/schematics/jungle_tree_from_sapling.mts b/mods/default/schematics/jungle_tree_from_sapling.mts new file mode 100644 index 0000000..f93f014 Binary files /dev/null and b/mods/default/schematics/jungle_tree_from_sapling.mts differ diff --git a/mods/default/schematics/large_cactus.mts b/mods/default/schematics/large_cactus.mts new file mode 100644 index 0000000..b71077b Binary files /dev/null and b/mods/default/schematics/large_cactus.mts differ diff --git a/mods/default/schematics/papyrus.mts b/mods/default/schematics/papyrus.mts new file mode 100644 index 0000000..1333a7c Binary files /dev/null and b/mods/default/schematics/papyrus.mts differ diff --git a/mods/default/schematics/pine_log.mts b/mods/default/schematics/pine_log.mts new file mode 100644 index 0000000..744c38b Binary files /dev/null and b/mods/default/schematics/pine_log.mts differ diff --git a/mods/default/schematics/pine_tree.mts b/mods/default/schematics/pine_tree.mts new file mode 100644 index 0000000..6f27d83 Binary files /dev/null and b/mods/default/schematics/pine_tree.mts differ diff --git a/mods/default/schematics/pine_tree_from_sapling.mts b/mods/default/schematics/pine_tree_from_sapling.mts new file mode 100644 index 0000000..e42a996 Binary files /dev/null and b/mods/default/schematics/pine_tree_from_sapling.mts differ diff --git a/mods/default/schematics/snowy_pine_tree_from_sapling.mts b/mods/default/schematics/snowy_pine_tree_from_sapling.mts new file mode 100644 index 0000000..0692049 Binary files /dev/null and b/mods/default/schematics/snowy_pine_tree_from_sapling.mts differ diff --git a/mods/default/sounds/default_break_glass.1.ogg b/mods/default/sounds/default_break_glass.1.ogg new file mode 100644 index 0000000..b1ccc5f Binary files /dev/null and b/mods/default/sounds/default_break_glass.1.ogg differ diff --git a/mods/default/sounds/default_break_glass.2.ogg b/mods/default/sounds/default_break_glass.2.ogg new file mode 100644 index 0000000..b6cc9e8 Binary files /dev/null and b/mods/default/sounds/default_break_glass.2.ogg differ diff --git a/mods/default/sounds/default_break_glass.3.ogg b/mods/default/sounds/default_break_glass.3.ogg new file mode 100644 index 0000000..ae6a6bf Binary files /dev/null and b/mods/default/sounds/default_break_glass.3.ogg differ diff --git a/mods/default/sounds/default_chest_close.ogg b/mods/default/sounds/default_chest_close.ogg new file mode 100644 index 0000000..53ff23d Binary files /dev/null and b/mods/default/sounds/default_chest_close.ogg differ diff --git a/mods/default/sounds/default_chest_open.ogg b/mods/default/sounds/default_chest_open.ogg new file mode 100644 index 0000000..c73c072 Binary files /dev/null and b/mods/default/sounds/default_chest_open.ogg differ diff --git a/mods/default/sounds/default_cool_lava.1.ogg b/mods/default/sounds/default_cool_lava.1.ogg new file mode 100644 index 0000000..42506dd Binary files /dev/null and b/mods/default/sounds/default_cool_lava.1.ogg differ diff --git a/mods/default/sounds/default_cool_lava.2.ogg b/mods/default/sounds/default_cool_lava.2.ogg new file mode 100644 index 0000000..2747ab8 Binary files /dev/null and b/mods/default/sounds/default_cool_lava.2.ogg differ diff --git a/mods/default/sounds/default_cool_lava.3.ogg b/mods/default/sounds/default_cool_lava.3.ogg new file mode 100644 index 0000000..8baeac3 Binary files /dev/null and b/mods/default/sounds/default_cool_lava.3.ogg differ diff --git a/mods/default/sounds/default_dig_choppy.ogg b/mods/default/sounds/default_dig_choppy.ogg new file mode 100644 index 0000000..e2ecd84 Binary files /dev/null and b/mods/default/sounds/default_dig_choppy.ogg differ diff --git a/mods/default/sounds/default_dig_cracky.ogg b/mods/default/sounds/default_dig_cracky.ogg new file mode 100644 index 0000000..da11679 Binary files /dev/null and b/mods/default/sounds/default_dig_cracky.ogg differ diff --git a/mods/default/sounds/default_dig_crumbly.ogg b/mods/default/sounds/default_dig_crumbly.ogg new file mode 100644 index 0000000..a0b2a1f Binary files /dev/null and b/mods/default/sounds/default_dig_crumbly.ogg differ diff --git a/mods/default/sounds/default_dig_dig_immediate.ogg b/mods/default/sounds/default_dig_dig_immediate.ogg new file mode 100644 index 0000000..e65d766 Binary files /dev/null and b/mods/default/sounds/default_dig_dig_immediate.ogg differ diff --git a/mods/default/sounds/default_dig_metal.ogg b/mods/default/sounds/default_dig_metal.ogg new file mode 100644 index 0000000..0b58509 Binary files /dev/null and b/mods/default/sounds/default_dig_metal.ogg differ diff --git a/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg b/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg new file mode 100644 index 0000000..ef4d7b1 Binary files /dev/null and b/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg differ diff --git a/mods/default/sounds/default_dig_snappy.ogg b/mods/default/sounds/default_dig_snappy.ogg new file mode 100644 index 0000000..3686fcd Binary files /dev/null and b/mods/default/sounds/default_dig_snappy.ogg differ diff --git a/mods/default/sounds/default_dirt_footstep.1.ogg b/mods/default/sounds/default_dirt_footstep.1.ogg new file mode 100644 index 0000000..84a197d Binary files /dev/null and b/mods/default/sounds/default_dirt_footstep.1.ogg differ diff --git a/mods/default/sounds/default_dirt_footstep.2.ogg b/mods/default/sounds/default_dirt_footstep.2.ogg new file mode 100644 index 0000000..2e23b8a Binary files /dev/null and b/mods/default/sounds/default_dirt_footstep.2.ogg differ diff --git a/mods/default/sounds/default_dug_metal.1.ogg b/mods/default/sounds/default_dug_metal.1.ogg new file mode 100644 index 0000000..5d6cb5b Binary files /dev/null and b/mods/default/sounds/default_dug_metal.1.ogg differ diff --git a/mods/default/sounds/default_dug_metal.2.ogg b/mods/default/sounds/default_dug_metal.2.ogg new file mode 100644 index 0000000..63567fc Binary files /dev/null and b/mods/default/sounds/default_dug_metal.2.ogg differ diff --git a/mods/default/sounds/default_dug_node.1.ogg b/mods/default/sounds/default_dug_node.1.ogg new file mode 100644 index 0000000..c04975d Binary files /dev/null and b/mods/default/sounds/default_dug_node.1.ogg differ diff --git a/mods/default/sounds/default_dug_node.2.ogg b/mods/default/sounds/default_dug_node.2.ogg new file mode 100644 index 0000000..9f20926 Binary files /dev/null and b/mods/default/sounds/default_dug_node.2.ogg differ diff --git a/mods/default/sounds/default_glass_footstep.ogg b/mods/default/sounds/default_glass_footstep.ogg new file mode 100644 index 0000000..191287a Binary files /dev/null and b/mods/default/sounds/default_glass_footstep.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.1.ogg b/mods/default/sounds/default_grass_footstep.1.ogg new file mode 100644 index 0000000..22d1ad6 Binary files /dev/null and b/mods/default/sounds/default_grass_footstep.1.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.2.ogg b/mods/default/sounds/default_grass_footstep.2.ogg new file mode 100644 index 0000000..4ccd8a0 Binary files /dev/null and b/mods/default/sounds/default_grass_footstep.2.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.3.ogg b/mods/default/sounds/default_grass_footstep.3.ogg new file mode 100644 index 0000000..20db84e Binary files /dev/null and b/mods/default/sounds/default_grass_footstep.3.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.1.ogg b/mods/default/sounds/default_gravel_footstep.1.ogg new file mode 100644 index 0000000..8d260ce Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.1.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.2.ogg b/mods/default/sounds/default_gravel_footstep.2.ogg new file mode 100644 index 0000000..2aba2c6 Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.2.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.3.ogg b/mods/default/sounds/default_gravel_footstep.3.ogg new file mode 100644 index 0000000..1bcd8a1 Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.3.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.4.ogg b/mods/default/sounds/default_gravel_footstep.4.ogg new file mode 100644 index 0000000..696c9ff Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.4.ogg differ diff --git a/mods/default/sounds/default_hard_footstep.1.ogg b/mods/default/sounds/default_hard_footstep.1.ogg new file mode 100644 index 0000000..1748bc5 Binary files /dev/null and b/mods/default/sounds/default_hard_footstep.1.ogg differ diff --git a/mods/default/sounds/default_hard_footstep.2.ogg b/mods/default/sounds/default_hard_footstep.2.ogg new file mode 100644 index 0000000..fe39fd7 Binary files /dev/null and b/mods/default/sounds/default_hard_footstep.2.ogg differ diff --git a/mods/default/sounds/default_hard_footstep.3.ogg b/mods/default/sounds/default_hard_footstep.3.ogg new file mode 100644 index 0000000..5030e06 Binary files /dev/null and b/mods/default/sounds/default_hard_footstep.3.ogg differ diff --git a/mods/default/sounds/default_item_smoke.ogg b/mods/default/sounds/default_item_smoke.ogg new file mode 100644 index 0000000..038a46e Binary files /dev/null and b/mods/default/sounds/default_item_smoke.ogg differ diff --git a/mods/default/sounds/default_metal_footstep.1.ogg b/mods/default/sounds/default_metal_footstep.1.ogg new file mode 100644 index 0000000..841286b Binary files /dev/null and b/mods/default/sounds/default_metal_footstep.1.ogg differ diff --git a/mods/default/sounds/default_metal_footstep.2.ogg b/mods/default/sounds/default_metal_footstep.2.ogg new file mode 100644 index 0000000..aa61ed3 Binary files /dev/null and b/mods/default/sounds/default_metal_footstep.2.ogg differ diff --git a/mods/default/sounds/default_metal_footstep.3.ogg b/mods/default/sounds/default_metal_footstep.3.ogg new file mode 100644 index 0000000..4cc1ca4 Binary files /dev/null and b/mods/default/sounds/default_metal_footstep.3.ogg differ diff --git a/mods/default/sounds/default_place_node.1.ogg b/mods/default/sounds/default_place_node.1.ogg new file mode 100644 index 0000000..46b9756 Binary files /dev/null and b/mods/default/sounds/default_place_node.1.ogg differ diff --git a/mods/default/sounds/default_place_node.2.ogg b/mods/default/sounds/default_place_node.2.ogg new file mode 100644 index 0000000..d34c01a Binary files /dev/null and b/mods/default/sounds/default_place_node.2.ogg differ diff --git a/mods/default/sounds/default_place_node.3.ogg b/mods/default/sounds/default_place_node.3.ogg new file mode 100644 index 0000000..fc29365 Binary files /dev/null and b/mods/default/sounds/default_place_node.3.ogg differ diff --git a/mods/default/sounds/default_place_node_hard.1.ogg b/mods/default/sounds/default_place_node_hard.1.ogg new file mode 100644 index 0000000..9f97fac Binary files /dev/null and b/mods/default/sounds/default_place_node_hard.1.ogg differ diff --git a/mods/default/sounds/default_place_node_hard.2.ogg b/mods/default/sounds/default_place_node_hard.2.ogg new file mode 100644 index 0000000..1d3b3de Binary files /dev/null and b/mods/default/sounds/default_place_node_hard.2.ogg differ diff --git a/mods/default/sounds/default_place_node_metal.1.ogg b/mods/default/sounds/default_place_node_metal.1.ogg new file mode 100644 index 0000000..5da085e Binary files /dev/null and b/mods/default/sounds/default_place_node_metal.1.ogg differ diff --git a/mods/default/sounds/default_place_node_metal.2.ogg b/mods/default/sounds/default_place_node_metal.2.ogg new file mode 100644 index 0000000..5ee67fc Binary files /dev/null and b/mods/default/sounds/default_place_node_metal.2.ogg differ diff --git a/mods/default/sounds/default_sand_footstep.1.ogg b/mods/default/sounds/default_sand_footstep.1.ogg new file mode 100644 index 0000000..65b68c7 Binary files /dev/null and b/mods/default/sounds/default_sand_footstep.1.ogg differ diff --git a/mods/default/sounds/default_sand_footstep.2.ogg b/mods/default/sounds/default_sand_footstep.2.ogg new file mode 100644 index 0000000..57f35f3 Binary files /dev/null and b/mods/default/sounds/default_sand_footstep.2.ogg differ diff --git a/mods/default/sounds/default_snow_footstep.1.ogg b/mods/default/sounds/default_snow_footstep.1.ogg new file mode 100644 index 0000000..3260b91 Binary files /dev/null and b/mods/default/sounds/default_snow_footstep.1.ogg differ diff --git a/mods/default/sounds/default_snow_footstep.2.ogg b/mods/default/sounds/default_snow_footstep.2.ogg new file mode 100644 index 0000000..4aac1e7 Binary files /dev/null and b/mods/default/sounds/default_snow_footstep.2.ogg differ diff --git a/mods/default/sounds/default_snow_footstep.3.ogg b/mods/default/sounds/default_snow_footstep.3.ogg new file mode 100644 index 0000000..cf4235b Binary files /dev/null and b/mods/default/sounds/default_snow_footstep.3.ogg differ diff --git a/mods/default/sounds/default_tool_breaks.1.ogg b/mods/default/sounds/default_tool_breaks.1.ogg new file mode 100644 index 0000000..2a571ae Binary files /dev/null and b/mods/default/sounds/default_tool_breaks.1.ogg differ diff --git a/mods/default/sounds/default_tool_breaks.2.ogg b/mods/default/sounds/default_tool_breaks.2.ogg new file mode 100644 index 0000000..1789352 Binary files /dev/null and b/mods/default/sounds/default_tool_breaks.2.ogg differ diff --git a/mods/default/sounds/default_tool_breaks.3.ogg b/mods/default/sounds/default_tool_breaks.3.ogg new file mode 100644 index 0000000..a99c4b7 Binary files /dev/null and b/mods/default/sounds/default_tool_breaks.3.ogg differ diff --git a/mods/default/sounds/default_water_footstep.1.ogg b/mods/default/sounds/default_water_footstep.1.ogg new file mode 100644 index 0000000..63b9744 Binary files /dev/null and b/mods/default/sounds/default_water_footstep.1.ogg differ diff --git a/mods/default/sounds/default_water_footstep.2.ogg b/mods/default/sounds/default_water_footstep.2.ogg new file mode 100644 index 0000000..8d79c1f Binary files /dev/null and b/mods/default/sounds/default_water_footstep.2.ogg differ diff --git a/mods/default/sounds/default_water_footstep.3.ogg b/mods/default/sounds/default_water_footstep.3.ogg new file mode 100644 index 0000000..f889150 Binary files /dev/null and b/mods/default/sounds/default_water_footstep.3.ogg differ diff --git a/mods/default/sounds/default_water_footstep.4.ogg b/mods/default/sounds/default_water_footstep.4.ogg new file mode 100644 index 0000000..6f1eab8 Binary files /dev/null and b/mods/default/sounds/default_water_footstep.4.ogg differ diff --git a/mods/default/sounds/default_wood_footstep.1.ogg b/mods/default/sounds/default_wood_footstep.1.ogg new file mode 100644 index 0000000..34f63a1 Binary files /dev/null and b/mods/default/sounds/default_wood_footstep.1.ogg differ diff --git a/mods/default/sounds/default_wood_footstep.2.ogg b/mods/default/sounds/default_wood_footstep.2.ogg new file mode 100644 index 0000000..124fc29 Binary files /dev/null and b/mods/default/sounds/default_wood_footstep.2.ogg differ diff --git a/mods/default/sounds/player_damage.ogg b/mods/default/sounds/player_damage.ogg new file mode 100644 index 0000000..7888087 Binary files /dev/null and b/mods/default/sounds/player_damage.ogg differ diff --git a/mods/default/textures/bubble.png b/mods/default/textures/bubble.png new file mode 100644 index 0000000..100fe15 Binary files /dev/null and b/mods/default/textures/bubble.png differ diff --git a/mods/default/textures/crack_anylength.png b/mods/default/textures/crack_anylength.png new file mode 100644 index 0000000..297eced Binary files /dev/null and b/mods/default/textures/crack_anylength.png differ diff --git a/mods/default/textures/default_acacia_bush_sapling.png b/mods/default/textures/default_acacia_bush_sapling.png new file mode 100644 index 0000000..940b3aa Binary files /dev/null and b/mods/default/textures/default_acacia_bush_sapling.png differ diff --git a/mods/default/textures/default_acacia_bush_stem.png b/mods/default/textures/default_acacia_bush_stem.png new file mode 100644 index 0000000..2903915 Binary files /dev/null and b/mods/default/textures/default_acacia_bush_stem.png differ diff --git a/mods/default/textures/default_acacia_leaves.png b/mods/default/textures/default_acacia_leaves.png new file mode 100644 index 0000000..626e1b3 Binary files /dev/null and b/mods/default/textures/default_acacia_leaves.png differ diff --git a/mods/default/textures/default_acacia_leaves_simple.png b/mods/default/textures/default_acacia_leaves_simple.png new file mode 100644 index 0000000..3c7015b Binary files /dev/null and b/mods/default/textures/default_acacia_leaves_simple.png differ diff --git a/mods/default/textures/default_acacia_sapling.png b/mods/default/textures/default_acacia_sapling.png new file mode 100644 index 0000000..07170a0 Binary files /dev/null and b/mods/default/textures/default_acacia_sapling.png differ diff --git a/mods/default/textures/default_acacia_tree.png b/mods/default/textures/default_acacia_tree.png new file mode 100644 index 0000000..58bb3c4 Binary files /dev/null and b/mods/default/textures/default_acacia_tree.png differ diff --git a/mods/default/textures/default_acacia_tree_top.png b/mods/default/textures/default_acacia_tree_top.png new file mode 100644 index 0000000..a8a0ce0 Binary files /dev/null and b/mods/default/textures/default_acacia_tree_top.png differ diff --git a/mods/default/textures/default_acacia_wood.png b/mods/default/textures/default_acacia_wood.png new file mode 100644 index 0000000..b5abf1e Binary files /dev/null and b/mods/default/textures/default_acacia_wood.png differ diff --git a/mods/default/textures/default_apple.png b/mods/default/textures/default_apple.png new file mode 100644 index 0000000..7549bfd Binary files /dev/null and b/mods/default/textures/default_apple.png differ diff --git a/mods/default/textures/default_aspen_leaves.png b/mods/default/textures/default_aspen_leaves.png new file mode 100644 index 0000000..7306423 Binary files /dev/null and b/mods/default/textures/default_aspen_leaves.png differ diff --git a/mods/default/textures/default_aspen_sapling.png b/mods/default/textures/default_aspen_sapling.png new file mode 100644 index 0000000..f8d9136 Binary files /dev/null and b/mods/default/textures/default_aspen_sapling.png differ diff --git a/mods/default/textures/default_aspen_tree.png b/mods/default/textures/default_aspen_tree.png new file mode 100644 index 0000000..cfb05fc Binary files /dev/null and b/mods/default/textures/default_aspen_tree.png differ diff --git a/mods/default/textures/default_aspen_tree_top.png b/mods/default/textures/default_aspen_tree_top.png new file mode 100644 index 0000000..fcca038 Binary files /dev/null and b/mods/default/textures/default_aspen_tree_top.png differ diff --git a/mods/default/textures/default_aspen_wood.png b/mods/default/textures/default_aspen_wood.png new file mode 100644 index 0000000..2b584b3 Binary files /dev/null and b/mods/default/textures/default_aspen_wood.png differ diff --git a/mods/default/textures/default_book.png b/mods/default/textures/default_book.png new file mode 100644 index 0000000..448a7df Binary files /dev/null and b/mods/default/textures/default_book.png differ diff --git a/mods/default/textures/default_book_written.png b/mods/default/textures/default_book_written.png new file mode 100644 index 0000000..9196ac6 Binary files /dev/null and b/mods/default/textures/default_book_written.png differ diff --git a/mods/default/textures/default_bookshelf.png b/mods/default/textures/default_bookshelf.png new file mode 100644 index 0000000..10d6483 Binary files /dev/null and b/mods/default/textures/default_bookshelf.png differ diff --git a/mods/default/textures/default_bookshelf_slot.png b/mods/default/textures/default_bookshelf_slot.png new file mode 100644 index 0000000..715a3dc Binary files /dev/null and b/mods/default/textures/default_bookshelf_slot.png differ diff --git a/mods/default/textures/default_brick.png b/mods/default/textures/default_brick.png new file mode 100644 index 0000000..ab19121 Binary files /dev/null and b/mods/default/textures/default_brick.png differ diff --git a/mods/default/textures/default_bronze_block.png b/mods/default/textures/default_bronze_block.png new file mode 100644 index 0000000..1d0c9d5 Binary files /dev/null and b/mods/default/textures/default_bronze_block.png differ diff --git a/mods/default/textures/default_bronze_ingot.png b/mods/default/textures/default_bronze_ingot.png new file mode 100644 index 0000000..6cccdf6 Binary files /dev/null and b/mods/default/textures/default_bronze_ingot.png differ diff --git a/mods/default/textures/default_bush_sapling.png b/mods/default/textures/default_bush_sapling.png new file mode 100644 index 0000000..905ba4b Binary files /dev/null and b/mods/default/textures/default_bush_sapling.png differ diff --git a/mods/default/textures/default_bush_stem.png b/mods/default/textures/default_bush_stem.png new file mode 100644 index 0000000..18b615f Binary files /dev/null and b/mods/default/textures/default_bush_stem.png differ diff --git a/mods/default/textures/default_cactus_side.png b/mods/default/textures/default_cactus_side.png new file mode 100644 index 0000000..8d6c40c Binary files /dev/null and b/mods/default/textures/default_cactus_side.png differ diff --git a/mods/default/textures/default_cactus_top.png b/mods/default/textures/default_cactus_top.png new file mode 100644 index 0000000..cf46aa2 Binary files /dev/null and b/mods/default/textures/default_cactus_top.png differ diff --git a/mods/default/textures/default_chest_front.png b/mods/default/textures/default_chest_front.png new file mode 100644 index 0000000..85227d8 Binary files /dev/null and b/mods/default/textures/default_chest_front.png differ diff --git a/mods/default/textures/default_chest_inside.png b/mods/default/textures/default_chest_inside.png new file mode 100644 index 0000000..5f7b6b1 Binary files /dev/null and b/mods/default/textures/default_chest_inside.png differ diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png new file mode 100644 index 0000000..73f46c7 Binary files /dev/null and b/mods/default/textures/default_chest_lock.png differ diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png new file mode 100644 index 0000000..44a65a4 Binary files /dev/null and b/mods/default/textures/default_chest_side.png differ diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png new file mode 100644 index 0000000..f4a92ee Binary files /dev/null and b/mods/default/textures/default_chest_top.png differ diff --git a/mods/default/textures/default_clay.png b/mods/default/textures/default_clay.png new file mode 100644 index 0000000..76e5a40 Binary files /dev/null and b/mods/default/textures/default_clay.png differ diff --git a/mods/default/textures/default_clay_brick.png b/mods/default/textures/default_clay_brick.png new file mode 100644 index 0000000..dc7a431 Binary files /dev/null and b/mods/default/textures/default_clay_brick.png differ diff --git a/mods/default/textures/default_clay_lump.png b/mods/default/textures/default_clay_lump.png new file mode 100644 index 0000000..c1d0220 Binary files /dev/null and b/mods/default/textures/default_clay_lump.png differ diff --git a/mods/default/textures/default_cloud.png b/mods/default/textures/default_cloud.png new file mode 100644 index 0000000..faf0ec1 Binary files /dev/null and b/mods/default/textures/default_cloud.png differ diff --git a/mods/default/textures/default_coal_block.png b/mods/default/textures/default_coal_block.png new file mode 100644 index 0000000..6fe9ed9 Binary files /dev/null and b/mods/default/textures/default_coal_block.png differ diff --git a/mods/default/textures/default_coal_lump.png b/mods/default/textures/default_coal_lump.png new file mode 100644 index 0000000..792961d Binary files /dev/null and b/mods/default/textures/default_coal_lump.png differ diff --git a/mods/default/textures/default_cobble.png b/mods/default/textures/default_cobble.png new file mode 100644 index 0000000..d379840 Binary files /dev/null and b/mods/default/textures/default_cobble.png differ diff --git a/mods/default/textures/default_copper_block.png b/mods/default/textures/default_copper_block.png new file mode 100644 index 0000000..8533754 Binary files /dev/null and b/mods/default/textures/default_copper_block.png differ diff --git a/mods/default/textures/default_copper_ingot.png b/mods/default/textures/default_copper_ingot.png new file mode 100644 index 0000000..bcad9c0 Binary files /dev/null and b/mods/default/textures/default_copper_ingot.png differ diff --git a/mods/default/textures/default_copper_lump.png b/mods/default/textures/default_copper_lump.png new file mode 100644 index 0000000..998c592 Binary files /dev/null and b/mods/default/textures/default_copper_lump.png differ diff --git a/mods/default/textures/default_coral_brown.png b/mods/default/textures/default_coral_brown.png new file mode 100644 index 0000000..8a775fe Binary files /dev/null and b/mods/default/textures/default_coral_brown.png differ diff --git a/mods/default/textures/default_coral_orange.png b/mods/default/textures/default_coral_orange.png new file mode 100644 index 0000000..cefac62 Binary files /dev/null and b/mods/default/textures/default_coral_orange.png differ diff --git a/mods/default/textures/default_coral_skeleton.png b/mods/default/textures/default_coral_skeleton.png new file mode 100644 index 0000000..fa48f15 Binary files /dev/null and b/mods/default/textures/default_coral_skeleton.png differ diff --git a/mods/default/textures/default_desert_cobble.png b/mods/default/textures/default_desert_cobble.png new file mode 100644 index 0000000..184a9d8 Binary files /dev/null and b/mods/default/textures/default_desert_cobble.png differ diff --git a/mods/default/textures/default_desert_sand.png b/mods/default/textures/default_desert_sand.png new file mode 100644 index 0000000..371b8c7 Binary files /dev/null and b/mods/default/textures/default_desert_sand.png differ diff --git a/mods/default/textures/default_desert_sandstone.png b/mods/default/textures/default_desert_sandstone.png new file mode 100644 index 0000000..52e445f Binary files /dev/null and b/mods/default/textures/default_desert_sandstone.png differ diff --git a/mods/default/textures/default_desert_sandstone_block.png b/mods/default/textures/default_desert_sandstone_block.png new file mode 100644 index 0000000..8fc54e7 Binary files /dev/null and b/mods/default/textures/default_desert_sandstone_block.png differ diff --git a/mods/default/textures/default_desert_sandstone_brick.png b/mods/default/textures/default_desert_sandstone_brick.png new file mode 100644 index 0000000..ab58db5 Binary files /dev/null and b/mods/default/textures/default_desert_sandstone_brick.png differ diff --git a/mods/default/textures/default_desert_stone.png b/mods/default/textures/default_desert_stone.png new file mode 100644 index 0000000..5d3aded Binary files /dev/null and b/mods/default/textures/default_desert_stone.png differ diff --git a/mods/default/textures/default_desert_stone_block.png b/mods/default/textures/default_desert_stone_block.png new file mode 100644 index 0000000..9eb8e92 Binary files /dev/null and b/mods/default/textures/default_desert_stone_block.png differ diff --git a/mods/default/textures/default_desert_stone_brick.png b/mods/default/textures/default_desert_stone_brick.png new file mode 100644 index 0000000..a603d18 Binary files /dev/null and b/mods/default/textures/default_desert_stone_brick.png differ diff --git a/mods/default/textures/default_diamond.png b/mods/default/textures/default_diamond.png new file mode 100644 index 0000000..a8dac74 Binary files /dev/null and b/mods/default/textures/default_diamond.png differ diff --git a/mods/default/textures/default_diamond_block.png b/mods/default/textures/default_diamond_block.png new file mode 100644 index 0000000..20c33ed Binary files /dev/null and b/mods/default/textures/default_diamond_block.png differ diff --git a/mods/default/textures/default_dirt.png b/mods/default/textures/default_dirt.png new file mode 100644 index 0000000..ca7e4ae Binary files /dev/null and b/mods/default/textures/default_dirt.png differ diff --git a/mods/default/textures/default_dry_grass.png b/mods/default/textures/default_dry_grass.png new file mode 100644 index 0000000..03455c3 Binary files /dev/null and b/mods/default/textures/default_dry_grass.png differ diff --git a/mods/default/textures/default_dry_grass_1.png b/mods/default/textures/default_dry_grass_1.png new file mode 100644 index 0000000..5cf68a3 Binary files /dev/null and b/mods/default/textures/default_dry_grass_1.png differ diff --git a/mods/default/textures/default_dry_grass_2.png b/mods/default/textures/default_dry_grass_2.png new file mode 100644 index 0000000..c925ace Binary files /dev/null and b/mods/default/textures/default_dry_grass_2.png differ diff --git a/mods/default/textures/default_dry_grass_3.png b/mods/default/textures/default_dry_grass_3.png new file mode 100644 index 0000000..4e4d84e Binary files /dev/null and b/mods/default/textures/default_dry_grass_3.png differ diff --git a/mods/default/textures/default_dry_grass_4.png b/mods/default/textures/default_dry_grass_4.png new file mode 100644 index 0000000..d315849 Binary files /dev/null and b/mods/default/textures/default_dry_grass_4.png differ diff --git a/mods/default/textures/default_dry_grass_5.png b/mods/default/textures/default_dry_grass_5.png new file mode 100644 index 0000000..871d04c Binary files /dev/null and b/mods/default/textures/default_dry_grass_5.png differ diff --git a/mods/default/textures/default_dry_grass_side.png b/mods/default/textures/default_dry_grass_side.png new file mode 100644 index 0000000..ef375b7 Binary files /dev/null and b/mods/default/textures/default_dry_grass_side.png differ diff --git a/mods/default/textures/default_dry_shrub.png b/mods/default/textures/default_dry_shrub.png new file mode 100644 index 0000000..e8a7f27 Binary files /dev/null and b/mods/default/textures/default_dry_shrub.png differ diff --git a/mods/default/textures/default_fence_acacia_wood.png b/mods/default/textures/default_fence_acacia_wood.png new file mode 100644 index 0000000..3b973f3 Binary files /dev/null and b/mods/default/textures/default_fence_acacia_wood.png differ diff --git a/mods/default/textures/default_fence_aspen_wood.png b/mods/default/textures/default_fence_aspen_wood.png new file mode 100644 index 0000000..0a6558e Binary files /dev/null and b/mods/default/textures/default_fence_aspen_wood.png differ diff --git a/mods/default/textures/default_fence_junglewood.png b/mods/default/textures/default_fence_junglewood.png new file mode 100644 index 0000000..c390941 Binary files /dev/null and b/mods/default/textures/default_fence_junglewood.png differ diff --git a/mods/default/textures/default_fence_overlay.png b/mods/default/textures/default_fence_overlay.png new file mode 100644 index 0000000..718184c Binary files /dev/null and b/mods/default/textures/default_fence_overlay.png differ diff --git a/mods/default/textures/default_fence_pine_wood.png b/mods/default/textures/default_fence_pine_wood.png new file mode 100644 index 0000000..74609d9 Binary files /dev/null and b/mods/default/textures/default_fence_pine_wood.png differ diff --git a/mods/default/textures/default_fence_wood.png b/mods/default/textures/default_fence_wood.png new file mode 100644 index 0000000..1e76430 Binary files /dev/null and b/mods/default/textures/default_fence_wood.png differ diff --git a/mods/default/textures/default_flint.png b/mods/default/textures/default_flint.png new file mode 100644 index 0000000..226c740 Binary files /dev/null and b/mods/default/textures/default_flint.png differ diff --git a/mods/default/textures/default_footprint.png b/mods/default/textures/default_footprint.png new file mode 100644 index 0000000..41d9546 Binary files /dev/null and b/mods/default/textures/default_footprint.png differ diff --git a/mods/default/textures/default_furnace_bottom.png b/mods/default/textures/default_furnace_bottom.png new file mode 100644 index 0000000..b79ed06 Binary files /dev/null and b/mods/default/textures/default_furnace_bottom.png differ diff --git a/mods/default/textures/default_furnace_fire_bg.png b/mods/default/textures/default_furnace_fire_bg.png new file mode 100644 index 0000000..126204a Binary files /dev/null and b/mods/default/textures/default_furnace_fire_bg.png differ diff --git a/mods/default/textures/default_furnace_fire_fg.png b/mods/default/textures/default_furnace_fire_fg.png new file mode 100644 index 0000000..63888f3 Binary files /dev/null and b/mods/default/textures/default_furnace_fire_fg.png differ diff --git a/mods/default/textures/default_furnace_front.png b/mods/default/textures/default_furnace_front.png new file mode 100644 index 0000000..8c1798e Binary files /dev/null and b/mods/default/textures/default_furnace_front.png differ diff --git a/mods/default/textures/default_furnace_front_active.png b/mods/default/textures/default_furnace_front_active.png new file mode 100644 index 0000000..ea43ed9 Binary files /dev/null and b/mods/default/textures/default_furnace_front_active.png differ diff --git a/mods/default/textures/default_furnace_side.png b/mods/default/textures/default_furnace_side.png new file mode 100644 index 0000000..33408cf Binary files /dev/null and b/mods/default/textures/default_furnace_side.png differ diff --git a/mods/default/textures/default_furnace_top.png b/mods/default/textures/default_furnace_top.png new file mode 100644 index 0000000..b79ed06 Binary files /dev/null and b/mods/default/textures/default_furnace_top.png differ diff --git a/mods/default/textures/default_glass.png b/mods/default/textures/default_glass.png new file mode 100644 index 0000000..da25402 Binary files /dev/null and b/mods/default/textures/default_glass.png differ diff --git a/mods/default/textures/default_glass_detail.png b/mods/default/textures/default_glass_detail.png new file mode 100644 index 0000000..d38dbb7 Binary files /dev/null and b/mods/default/textures/default_glass_detail.png differ diff --git a/mods/default/textures/default_gold_block.png b/mods/default/textures/default_gold_block.png new file mode 100644 index 0000000..170d50b Binary files /dev/null and b/mods/default/textures/default_gold_block.png differ diff --git a/mods/default/textures/default_gold_ingot.png b/mods/default/textures/default_gold_ingot.png new file mode 100644 index 0000000..ba66471 Binary files /dev/null and b/mods/default/textures/default_gold_ingot.png differ diff --git a/mods/default/textures/default_gold_lump.png b/mods/default/textures/default_gold_lump.png new file mode 100644 index 0000000..d5a1be7 Binary files /dev/null and b/mods/default/textures/default_gold_lump.png differ diff --git a/mods/default/textures/default_grass.png b/mods/default/textures/default_grass.png new file mode 100644 index 0000000..0181fab Binary files /dev/null and b/mods/default/textures/default_grass.png differ diff --git a/mods/default/textures/default_grass_1.png b/mods/default/textures/default_grass_1.png new file mode 100644 index 0000000..e9faa2c Binary files /dev/null and b/mods/default/textures/default_grass_1.png differ diff --git a/mods/default/textures/default_grass_2.png b/mods/default/textures/default_grass_2.png new file mode 100644 index 0000000..03729a0 Binary files /dev/null and b/mods/default/textures/default_grass_2.png differ diff --git a/mods/default/textures/default_grass_3.png b/mods/default/textures/default_grass_3.png new file mode 100644 index 0000000..92ca1b5 Binary files /dev/null and b/mods/default/textures/default_grass_3.png differ diff --git a/mods/default/textures/default_grass_4.png b/mods/default/textures/default_grass_4.png new file mode 100644 index 0000000..c782a33 Binary files /dev/null and b/mods/default/textures/default_grass_4.png differ diff --git a/mods/default/textures/default_grass_5.png b/mods/default/textures/default_grass_5.png new file mode 100644 index 0000000..b727e9c Binary files /dev/null and b/mods/default/textures/default_grass_5.png differ diff --git a/mods/default/textures/default_grass_side.png b/mods/default/textures/default_grass_side.png new file mode 100644 index 0000000..bfd538d Binary files /dev/null and b/mods/default/textures/default_grass_side.png differ diff --git a/mods/default/textures/default_gravel.png b/mods/default/textures/default_gravel.png new file mode 100644 index 0000000..8852d38 Binary files /dev/null and b/mods/default/textures/default_gravel.png differ diff --git a/mods/default/textures/default_ice.png b/mods/default/textures/default_ice.png new file mode 100644 index 0000000..2874e1e Binary files /dev/null and b/mods/default/textures/default_ice.png differ diff --git a/mods/default/textures/default_iron_lump.png b/mods/default/textures/default_iron_lump.png new file mode 100644 index 0000000..db61a94 Binary files /dev/null and b/mods/default/textures/default_iron_lump.png differ diff --git a/mods/default/textures/default_item_smoke.png b/mods/default/textures/default_item_smoke.png new file mode 100644 index 0000000..d62fb3b Binary files /dev/null and b/mods/default/textures/default_item_smoke.png differ diff --git a/mods/default/textures/default_junglegrass.png b/mods/default/textures/default_junglegrass.png new file mode 100644 index 0000000..25abb71 Binary files /dev/null and b/mods/default/textures/default_junglegrass.png differ diff --git a/mods/default/textures/default_jungleleaves.png b/mods/default/textures/default_jungleleaves.png new file mode 100644 index 0000000..5afcc36 Binary files /dev/null and b/mods/default/textures/default_jungleleaves.png differ diff --git a/mods/default/textures/default_jungleleaves_simple.png b/mods/default/textures/default_jungleleaves_simple.png new file mode 100644 index 0000000..7165100 Binary files /dev/null and b/mods/default/textures/default_jungleleaves_simple.png differ diff --git a/mods/default/textures/default_junglesapling.png b/mods/default/textures/default_junglesapling.png new file mode 100644 index 0000000..05e1e50 Binary files /dev/null and b/mods/default/textures/default_junglesapling.png differ diff --git a/mods/default/textures/default_jungletree.png b/mods/default/textures/default_jungletree.png new file mode 100644 index 0000000..2cf77a6 Binary files /dev/null and b/mods/default/textures/default_jungletree.png differ diff --git a/mods/default/textures/default_jungletree_top.png b/mods/default/textures/default_jungletree_top.png new file mode 100644 index 0000000..439f078 Binary files /dev/null and b/mods/default/textures/default_jungletree_top.png differ diff --git a/mods/default/textures/default_junglewood.png b/mods/default/textures/default_junglewood.png new file mode 100644 index 0000000..8d17917 Binary files /dev/null and b/mods/default/textures/default_junglewood.png differ diff --git a/mods/default/textures/default_key.png b/mods/default/textures/default_key.png new file mode 100644 index 0000000..783d313 Binary files /dev/null and b/mods/default/textures/default_key.png differ diff --git a/mods/default/textures/default_key_skeleton.png b/mods/default/textures/default_key_skeleton.png new file mode 100644 index 0000000..2b3497d Binary files /dev/null and b/mods/default/textures/default_key_skeleton.png differ diff --git a/mods/default/textures/default_ladder_steel.png b/mods/default/textures/default_ladder_steel.png new file mode 100644 index 0000000..a312f3e Binary files /dev/null and b/mods/default/textures/default_ladder_steel.png differ diff --git a/mods/default/textures/default_ladder_wood.png b/mods/default/textures/default_ladder_wood.png new file mode 100644 index 0000000..c167fff Binary files /dev/null and b/mods/default/textures/default_ladder_wood.png differ diff --git a/mods/default/textures/default_lava.png b/mods/default/textures/default_lava.png new file mode 100644 index 0000000..e8958de Binary files /dev/null and b/mods/default/textures/default_lava.png differ diff --git a/mods/default/textures/default_lava_flowing_animated.png b/mods/default/textures/default_lava_flowing_animated.png new file mode 100644 index 0000000..2ec0746 Binary files /dev/null and b/mods/default/textures/default_lava_flowing_animated.png differ diff --git a/mods/default/textures/default_lava_source_animated.png b/mods/default/textures/default_lava_source_animated.png new file mode 100644 index 0000000..32267a6 Binary files /dev/null and b/mods/default/textures/default_lava_source_animated.png differ diff --git a/mods/default/textures/default_leaves.png b/mods/default/textures/default_leaves.png new file mode 100644 index 0000000..ba09fe1 Binary files /dev/null and b/mods/default/textures/default_leaves.png differ diff --git a/mods/default/textures/default_leaves_simple.png b/mods/default/textures/default_leaves_simple.png new file mode 100644 index 0000000..eb60f9f Binary files /dev/null and b/mods/default/textures/default_leaves_simple.png differ diff --git a/mods/default/textures/default_mese_block.png b/mods/default/textures/default_mese_block.png new file mode 100644 index 0000000..e30994e Binary files /dev/null and b/mods/default/textures/default_mese_block.png differ diff --git a/mods/default/textures/default_mese_crystal.png b/mods/default/textures/default_mese_crystal.png new file mode 100644 index 0000000..f1d71f1 Binary files /dev/null and b/mods/default/textures/default_mese_crystal.png differ diff --git a/mods/default/textures/default_mese_crystal_fragment.png b/mods/default/textures/default_mese_crystal_fragment.png new file mode 100644 index 0000000..d5416ab Binary files /dev/null and b/mods/default/textures/default_mese_crystal_fragment.png differ diff --git a/mods/default/textures/default_mese_post_light_side.png b/mods/default/textures/default_mese_post_light_side.png new file mode 100644 index 0000000..c23b551 Binary files /dev/null and b/mods/default/textures/default_mese_post_light_side.png differ diff --git a/mods/default/textures/default_mese_post_light_side_dark.png b/mods/default/textures/default_mese_post_light_side_dark.png new file mode 100644 index 0000000..c4fc7ce Binary files /dev/null and b/mods/default/textures/default_mese_post_light_side_dark.png differ diff --git a/mods/default/textures/default_mese_post_light_top.png b/mods/default/textures/default_mese_post_light_top.png new file mode 100644 index 0000000..6834bd3 Binary files /dev/null and b/mods/default/textures/default_mese_post_light_top.png differ diff --git a/mods/default/textures/default_meselamp.png b/mods/default/textures/default_meselamp.png new file mode 100644 index 0000000..0c3a1a1 Binary files /dev/null and b/mods/default/textures/default_meselamp.png differ diff --git a/mods/default/textures/default_mineral_coal.png b/mods/default/textures/default_mineral_coal.png new file mode 100644 index 0000000..6d1386b Binary files /dev/null and b/mods/default/textures/default_mineral_coal.png differ diff --git a/mods/default/textures/default_mineral_copper.png b/mods/default/textures/default_mineral_copper.png new file mode 100644 index 0000000..c4c518e Binary files /dev/null and b/mods/default/textures/default_mineral_copper.png differ diff --git a/mods/default/textures/default_mineral_diamond.png b/mods/default/textures/default_mineral_diamond.png new file mode 100644 index 0000000..39c0f83 Binary files /dev/null and b/mods/default/textures/default_mineral_diamond.png differ diff --git a/mods/default/textures/default_mineral_gold.png b/mods/default/textures/default_mineral_gold.png new file mode 100644 index 0000000..2220add Binary files /dev/null and b/mods/default/textures/default_mineral_gold.png differ diff --git a/mods/default/textures/default_mineral_iron.png b/mods/default/textures/default_mineral_iron.png new file mode 100644 index 0000000..bfec8b1 Binary files /dev/null and b/mods/default/textures/default_mineral_iron.png differ diff --git a/mods/default/textures/default_mineral_mese.png b/mods/default/textures/default_mineral_mese.png new file mode 100644 index 0000000..6952670 Binary files /dev/null and b/mods/default/textures/default_mineral_mese.png differ diff --git a/mods/default/textures/default_mineral_tin.png b/mods/default/textures/default_mineral_tin.png new file mode 100644 index 0000000..232d4b5 Binary files /dev/null and b/mods/default/textures/default_mineral_tin.png differ diff --git a/mods/default/textures/default_mossycobble.png b/mods/default/textures/default_mossycobble.png new file mode 100644 index 0000000..1ae7c91 Binary files /dev/null and b/mods/default/textures/default_mossycobble.png differ diff --git a/mods/default/textures/default_obsidian.png b/mods/default/textures/default_obsidian.png new file mode 100644 index 0000000..8f4a49c Binary files /dev/null and b/mods/default/textures/default_obsidian.png differ diff --git a/mods/default/textures/default_obsidian_block.png b/mods/default/textures/default_obsidian_block.png new file mode 100644 index 0000000..7e1d4d3 Binary files /dev/null and b/mods/default/textures/default_obsidian_block.png differ diff --git a/mods/default/textures/default_obsidian_brick.png b/mods/default/textures/default_obsidian_brick.png new file mode 100644 index 0000000..30c67ca Binary files /dev/null and b/mods/default/textures/default_obsidian_brick.png differ diff --git a/mods/default/textures/default_obsidian_glass.png b/mods/default/textures/default_obsidian_glass.png new file mode 100644 index 0000000..d5ac83d Binary files /dev/null and b/mods/default/textures/default_obsidian_glass.png differ diff --git a/mods/default/textures/default_obsidian_glass_detail.png b/mods/default/textures/default_obsidian_glass_detail.png new file mode 100644 index 0000000..a8bbec9 Binary files /dev/null and b/mods/default/textures/default_obsidian_glass_detail.png differ diff --git a/mods/default/textures/default_obsidian_shard.png b/mods/default/textures/default_obsidian_shard.png new file mode 100644 index 0000000..a988d8c Binary files /dev/null and b/mods/default/textures/default_obsidian_shard.png differ diff --git a/mods/default/textures/default_paper.png b/mods/default/textures/default_paper.png new file mode 100644 index 0000000..8f23924 Binary files /dev/null and b/mods/default/textures/default_paper.png differ diff --git a/mods/default/textures/default_papyrus.png b/mods/default/textures/default_papyrus.png new file mode 100644 index 0000000..a85e809 Binary files /dev/null and b/mods/default/textures/default_papyrus.png differ diff --git a/mods/default/textures/default_pine_needles.png b/mods/default/textures/default_pine_needles.png new file mode 100644 index 0000000..ad7373b Binary files /dev/null and b/mods/default/textures/default_pine_needles.png differ diff --git a/mods/default/textures/default_pine_sapling.png b/mods/default/textures/default_pine_sapling.png new file mode 100644 index 0000000..c30131d Binary files /dev/null and b/mods/default/textures/default_pine_sapling.png differ diff --git a/mods/default/textures/default_pine_tree.png b/mods/default/textures/default_pine_tree.png new file mode 100644 index 0000000..4a5328f Binary files /dev/null and b/mods/default/textures/default_pine_tree.png differ diff --git a/mods/default/textures/default_pine_tree_top.png b/mods/default/textures/default_pine_tree_top.png new file mode 100644 index 0000000..8705710 Binary files /dev/null and b/mods/default/textures/default_pine_tree_top.png differ diff --git a/mods/default/textures/default_pine_wood.png b/mods/default/textures/default_pine_wood.png new file mode 100644 index 0000000..6844ceb Binary files /dev/null and b/mods/default/textures/default_pine_wood.png differ diff --git a/mods/default/textures/default_rainforest_litter.png b/mods/default/textures/default_rainforest_litter.png new file mode 100644 index 0000000..d762deb Binary files /dev/null and b/mods/default/textures/default_rainforest_litter.png differ diff --git a/mods/default/textures/default_rainforest_litter_side.png b/mods/default/textures/default_rainforest_litter_side.png new file mode 100644 index 0000000..7ccb11d Binary files /dev/null and b/mods/default/textures/default_rainforest_litter_side.png differ diff --git a/mods/default/textures/default_river_water.png b/mods/default/textures/default_river_water.png new file mode 100644 index 0000000..3b55c5f Binary files /dev/null and b/mods/default/textures/default_river_water.png differ diff --git a/mods/default/textures/default_river_water_flowing_animated.png b/mods/default/textures/default_river_water_flowing_animated.png new file mode 100644 index 0000000..536acc5 Binary files /dev/null and b/mods/default/textures/default_river_water_flowing_animated.png differ diff --git a/mods/default/textures/default_river_water_source_animated.png b/mods/default/textures/default_river_water_source_animated.png new file mode 100644 index 0000000..daa5653 Binary files /dev/null and b/mods/default/textures/default_river_water_source_animated.png differ diff --git a/mods/default/textures/default_sand.png b/mods/default/textures/default_sand.png new file mode 100644 index 0000000..645a300 Binary files /dev/null and b/mods/default/textures/default_sand.png differ diff --git a/mods/default/textures/default_sandstone.png b/mods/default/textures/default_sandstone.png new file mode 100644 index 0000000..16e3d13 Binary files /dev/null and b/mods/default/textures/default_sandstone.png differ diff --git a/mods/default/textures/default_sandstone_block.png b/mods/default/textures/default_sandstone_block.png new file mode 100644 index 0000000..2e06491 Binary files /dev/null and b/mods/default/textures/default_sandstone_block.png differ diff --git a/mods/default/textures/default_sandstone_brick.png b/mods/default/textures/default_sandstone_brick.png new file mode 100644 index 0000000..e7150e5 Binary files /dev/null and b/mods/default/textures/default_sandstone_brick.png differ diff --git a/mods/default/textures/default_sapling.png b/mods/default/textures/default_sapling.png new file mode 100644 index 0000000..3fd64f0 Binary files /dev/null and b/mods/default/textures/default_sapling.png differ diff --git a/mods/default/textures/default_sign_steel.png b/mods/default/textures/default_sign_steel.png new file mode 100644 index 0000000..3ca0c59 Binary files /dev/null and b/mods/default/textures/default_sign_steel.png differ diff --git a/mods/default/textures/default_sign_wall_steel.png b/mods/default/textures/default_sign_wall_steel.png new file mode 100644 index 0000000..2227477 Binary files /dev/null and b/mods/default/textures/default_sign_wall_steel.png differ diff --git a/mods/default/textures/default_sign_wall_wood.png b/mods/default/textures/default_sign_wall_wood.png new file mode 100644 index 0000000..40552c7 Binary files /dev/null and b/mods/default/textures/default_sign_wall_wood.png differ diff --git a/mods/default/textures/default_sign_wood.png b/mods/default/textures/default_sign_wood.png new file mode 100644 index 0000000..d0559da Binary files /dev/null and b/mods/default/textures/default_sign_wood.png differ diff --git a/mods/default/textures/default_silver_sand.png b/mods/default/textures/default_silver_sand.png new file mode 100644 index 0000000..c4a8f73 Binary files /dev/null and b/mods/default/textures/default_silver_sand.png differ diff --git a/mods/default/textures/default_silver_sandstone.png b/mods/default/textures/default_silver_sandstone.png new file mode 100644 index 0000000..eac62cb Binary files /dev/null and b/mods/default/textures/default_silver_sandstone.png differ diff --git a/mods/default/textures/default_silver_sandstone_block.png b/mods/default/textures/default_silver_sandstone_block.png new file mode 100644 index 0000000..9997461 Binary files /dev/null and b/mods/default/textures/default_silver_sandstone_block.png differ diff --git a/mods/default/textures/default_silver_sandstone_brick.png b/mods/default/textures/default_silver_sandstone_brick.png new file mode 100644 index 0000000..93d87a5 Binary files /dev/null and b/mods/default/textures/default_silver_sandstone_brick.png differ diff --git a/mods/default/textures/default_snow.png b/mods/default/textures/default_snow.png new file mode 100644 index 0000000..fcbef0e Binary files /dev/null and b/mods/default/textures/default_snow.png differ diff --git a/mods/default/textures/default_snow_side.png b/mods/default/textures/default_snow_side.png new file mode 100644 index 0000000..03456c8 Binary files /dev/null and b/mods/default/textures/default_snow_side.png differ diff --git a/mods/default/textures/default_snowball.png b/mods/default/textures/default_snowball.png new file mode 100644 index 0000000..3a4dc1f Binary files /dev/null and b/mods/default/textures/default_snowball.png differ diff --git a/mods/default/textures/default_steel_block.png b/mods/default/textures/default_steel_block.png new file mode 100644 index 0000000..7f49f61 Binary files /dev/null and b/mods/default/textures/default_steel_block.png differ diff --git a/mods/default/textures/default_steel_ingot.png b/mods/default/textures/default_steel_ingot.png new file mode 100644 index 0000000..8100b01 Binary files /dev/null and b/mods/default/textures/default_steel_ingot.png differ diff --git a/mods/default/textures/default_stick.png b/mods/default/textures/default_stick.png new file mode 100644 index 0000000..0378d07 Binary files /dev/null and b/mods/default/textures/default_stick.png differ diff --git a/mods/default/textures/default_stone.png b/mods/default/textures/default_stone.png new file mode 100644 index 0000000..63cb7c4 Binary files /dev/null and b/mods/default/textures/default_stone.png differ diff --git a/mods/default/textures/default_stone_block.png b/mods/default/textures/default_stone_block.png new file mode 100644 index 0000000..3b771e7 Binary files /dev/null and b/mods/default/textures/default_stone_block.png differ diff --git a/mods/default/textures/default_stone_brick.png b/mods/default/textures/default_stone_brick.png new file mode 100644 index 0000000..4dbb49d Binary files /dev/null and b/mods/default/textures/default_stone_brick.png differ diff --git a/mods/default/textures/default_tin_block.png b/mods/default/textures/default_tin_block.png new file mode 100644 index 0000000..72759b0 Binary files /dev/null and b/mods/default/textures/default_tin_block.png differ diff --git a/mods/default/textures/default_tin_ingot.png b/mods/default/textures/default_tin_ingot.png new file mode 100644 index 0000000..eed5361 Binary files /dev/null and b/mods/default/textures/default_tin_ingot.png differ diff --git a/mods/default/textures/default_tin_lump.png b/mods/default/textures/default_tin_lump.png new file mode 100644 index 0000000..72bd339 Binary files /dev/null and b/mods/default/textures/default_tin_lump.png differ diff --git a/mods/default/textures/default_tool_bronzeaxe.png b/mods/default/textures/default_tool_bronzeaxe.png new file mode 100644 index 0000000..8ae43b5 Binary files /dev/null and b/mods/default/textures/default_tool_bronzeaxe.png differ diff --git a/mods/default/textures/default_tool_bronzepick.png b/mods/default/textures/default_tool_bronzepick.png new file mode 100644 index 0000000..c88a5f0 Binary files /dev/null and b/mods/default/textures/default_tool_bronzepick.png differ diff --git a/mods/default/textures/default_tool_bronzeshovel.png b/mods/default/textures/default_tool_bronzeshovel.png new file mode 100644 index 0000000..d7d800e Binary files /dev/null and b/mods/default/textures/default_tool_bronzeshovel.png differ diff --git a/mods/default/textures/default_tool_bronzesword.png b/mods/default/textures/default_tool_bronzesword.png new file mode 100644 index 0000000..cdab898 Binary files /dev/null and b/mods/default/textures/default_tool_bronzesword.png differ diff --git a/mods/default/textures/default_tool_diamondaxe.png b/mods/default/textures/default_tool_diamondaxe.png new file mode 100644 index 0000000..e32a0bf Binary files /dev/null and b/mods/default/textures/default_tool_diamondaxe.png differ diff --git a/mods/default/textures/default_tool_diamondpick.png b/mods/default/textures/default_tool_diamondpick.png new file mode 100644 index 0000000..f9883c6 Binary files /dev/null and b/mods/default/textures/default_tool_diamondpick.png differ diff --git a/mods/default/textures/default_tool_diamondshovel.png b/mods/default/textures/default_tool_diamondshovel.png new file mode 100644 index 0000000..d0fe24d Binary files /dev/null and b/mods/default/textures/default_tool_diamondshovel.png differ diff --git a/mods/default/textures/default_tool_diamondsword.png b/mods/default/textures/default_tool_diamondsword.png new file mode 100644 index 0000000..dbccd0e Binary files /dev/null and b/mods/default/textures/default_tool_diamondsword.png differ diff --git a/mods/default/textures/default_tool_meseaxe.png b/mods/default/textures/default_tool_meseaxe.png new file mode 100644 index 0000000..c01fb4f Binary files /dev/null and b/mods/default/textures/default_tool_meseaxe.png differ diff --git a/mods/default/textures/default_tool_mesepick.png b/mods/default/textures/default_tool_mesepick.png new file mode 100644 index 0000000..1b2e25b Binary files /dev/null and b/mods/default/textures/default_tool_mesepick.png differ diff --git a/mods/default/textures/default_tool_meseshovel.png b/mods/default/textures/default_tool_meseshovel.png new file mode 100644 index 0000000..00813a2 Binary files /dev/null and b/mods/default/textures/default_tool_meseshovel.png differ diff --git a/mods/default/textures/default_tool_mesesword.png b/mods/default/textures/default_tool_mesesword.png new file mode 100644 index 0000000..d395d3a Binary files /dev/null and b/mods/default/textures/default_tool_mesesword.png differ diff --git a/mods/default/textures/default_tool_steelaxe.png b/mods/default/textures/default_tool_steelaxe.png new file mode 100644 index 0000000..1528cad Binary files /dev/null and b/mods/default/textures/default_tool_steelaxe.png differ diff --git a/mods/default/textures/default_tool_steelpick.png b/mods/default/textures/default_tool_steelpick.png new file mode 100644 index 0000000..a7543a1 Binary files /dev/null and b/mods/default/textures/default_tool_steelpick.png differ diff --git a/mods/default/textures/default_tool_steelshovel.png b/mods/default/textures/default_tool_steelshovel.png new file mode 100644 index 0000000..65e4045 Binary files /dev/null and b/mods/default/textures/default_tool_steelshovel.png differ diff --git a/mods/default/textures/default_tool_steelsword.png b/mods/default/textures/default_tool_steelsword.png new file mode 100644 index 0000000..630a339 Binary files /dev/null and b/mods/default/textures/default_tool_steelsword.png differ diff --git a/mods/default/textures/default_tool_stoneaxe.png b/mods/default/textures/default_tool_stoneaxe.png new file mode 100644 index 0000000..cc36054 Binary files /dev/null and b/mods/default/textures/default_tool_stoneaxe.png differ diff --git a/mods/default/textures/default_tool_stonepick.png b/mods/default/textures/default_tool_stonepick.png new file mode 100644 index 0000000..237d739 Binary files /dev/null and b/mods/default/textures/default_tool_stonepick.png differ diff --git a/mods/default/textures/default_tool_stoneshovel.png b/mods/default/textures/default_tool_stoneshovel.png new file mode 100644 index 0000000..11711bd Binary files /dev/null and b/mods/default/textures/default_tool_stoneshovel.png differ diff --git a/mods/default/textures/default_tool_stonesword.png b/mods/default/textures/default_tool_stonesword.png new file mode 100644 index 0000000..1a493ac Binary files /dev/null and b/mods/default/textures/default_tool_stonesword.png differ diff --git a/mods/default/textures/default_tool_woodaxe.png b/mods/default/textures/default_tool_woodaxe.png new file mode 100644 index 0000000..68f1fd8 Binary files /dev/null and b/mods/default/textures/default_tool_woodaxe.png differ diff --git a/mods/default/textures/default_tool_woodpick.png b/mods/default/textures/default_tool_woodpick.png new file mode 100644 index 0000000..0aed583 Binary files /dev/null and b/mods/default/textures/default_tool_woodpick.png differ diff --git a/mods/default/textures/default_tool_woodshovel.png b/mods/default/textures/default_tool_woodshovel.png new file mode 100644 index 0000000..dcef2b5 Binary files /dev/null and b/mods/default/textures/default_tool_woodshovel.png differ diff --git a/mods/default/textures/default_tool_woodsword.png b/mods/default/textures/default_tool_woodsword.png new file mode 100644 index 0000000..c78ba50 Binary files /dev/null and b/mods/default/textures/default_tool_woodsword.png differ diff --git a/mods/default/textures/default_torch_animated.png b/mods/default/textures/default_torch_animated.png new file mode 100644 index 0000000..cdf33ef Binary files /dev/null and b/mods/default/textures/default_torch_animated.png differ diff --git a/mods/default/textures/default_torch_on_ceiling_animated.png b/mods/default/textures/default_torch_on_ceiling_animated.png new file mode 100644 index 0000000..3a8b5ad Binary files /dev/null and b/mods/default/textures/default_torch_on_ceiling_animated.png differ diff --git a/mods/default/textures/default_torch_on_floor.png b/mods/default/textures/default_torch_on_floor.png new file mode 100644 index 0000000..bc4bdd6 Binary files /dev/null and b/mods/default/textures/default_torch_on_floor.png differ diff --git a/mods/default/textures/default_torch_on_floor_animated.png b/mods/default/textures/default_torch_on_floor_animated.png new file mode 100644 index 0000000..ad51c03 Binary files /dev/null and b/mods/default/textures/default_torch_on_floor_animated.png differ diff --git a/mods/default/textures/default_tree.png b/mods/default/textures/default_tree.png new file mode 100644 index 0000000..10e297b Binary files /dev/null and b/mods/default/textures/default_tree.png differ diff --git a/mods/default/textures/default_tree_top.png b/mods/default/textures/default_tree_top.png new file mode 100644 index 0000000..da99bce Binary files /dev/null and b/mods/default/textures/default_tree_top.png differ diff --git a/mods/default/textures/default_water.png b/mods/default/textures/default_water.png new file mode 100644 index 0000000..00500e9 Binary files /dev/null and b/mods/default/textures/default_water.png differ diff --git a/mods/default/textures/default_water_flowing_animated.png b/mods/default/textures/default_water_flowing_animated.png new file mode 100644 index 0000000..070d797 Binary files /dev/null and b/mods/default/textures/default_water_flowing_animated.png differ diff --git a/mods/default/textures/default_water_source_animated.png b/mods/default/textures/default_water_source_animated.png new file mode 100644 index 0000000..7e7f9ff Binary files /dev/null and b/mods/default/textures/default_water_source_animated.png differ diff --git a/mods/default/textures/default_wood.png b/mods/default/textures/default_wood.png new file mode 100644 index 0000000..af56d6c Binary files /dev/null and b/mods/default/textures/default_wood.png differ diff --git a/mods/default/textures/gui_formbg.png b/mods/default/textures/gui_formbg.png new file mode 100644 index 0000000..c543466 Binary files /dev/null and b/mods/default/textures/gui_formbg.png differ diff --git a/mods/default/textures/gui_furnace_arrow_bg.png b/mods/default/textures/gui_furnace_arrow_bg.png new file mode 100644 index 0000000..046d8cd Binary files /dev/null and b/mods/default/textures/gui_furnace_arrow_bg.png differ diff --git a/mods/default/textures/gui_furnace_arrow_fg.png b/mods/default/textures/gui_furnace_arrow_fg.png new file mode 100644 index 0000000..8d3c396 Binary files /dev/null and b/mods/default/textures/gui_furnace_arrow_fg.png differ diff --git a/mods/default/textures/gui_hb_bg.png b/mods/default/textures/gui_hb_bg.png new file mode 100644 index 0000000..99248e1 Binary files /dev/null and b/mods/default/textures/gui_hb_bg.png differ diff --git a/mods/default/textures/gui_hotbar.png b/mods/default/textures/gui_hotbar.png new file mode 100644 index 0000000..73fb3ca Binary files /dev/null and b/mods/default/textures/gui_hotbar.png differ diff --git a/mods/default/textures/gui_hotbar_selected.png b/mods/default/textures/gui_hotbar_selected.png new file mode 100644 index 0000000..40bafe6 Binary files /dev/null and b/mods/default/textures/gui_hotbar_selected.png differ diff --git a/mods/default/textures/heart.png b/mods/default/textures/heart.png new file mode 100644 index 0000000..6d4e228 Binary files /dev/null and b/mods/default/textures/heart.png differ diff --git a/mods/default/textures/player.png b/mods/default/textures/player.png new file mode 100644 index 0000000..6d61c43 Binary files /dev/null and b/mods/default/textures/player.png differ diff --git a/mods/default/textures/player_back.png b/mods/default/textures/player_back.png new file mode 100644 index 0000000..5e9ef05 Binary files /dev/null and b/mods/default/textures/player_back.png differ diff --git a/mods/default/textures/wieldhand.png b/mods/default/textures/wieldhand.png new file mode 100644 index 0000000..69f4b7b Binary files /dev/null and b/mods/default/textures/wieldhand.png differ diff --git a/mods/default/tools.lua b/mods/default/tools.lua new file mode 100644 index 0000000..45c779f --- /dev/null +++ b/mods/default/tools.lua @@ -0,0 +1,419 @@ +-- mods/default/tools.lua + +-- The hand +minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x=1,y=1,z=2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0} + }, + damage_groups = {fleshy=1}, + } +}) + +-- +-- Picks +-- + +minetest.register_tool("default:pick_wood", { + description = "Wooden Pickaxe", + inventory_image = "default_tool_woodpick.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + cracky = {times={[3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + groups = {flammable = 2}, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:pick_stone", { + description = "Stone Pickaxe", + inventory_image = "default_tool_stonepick.png", + tool_capabilities = { + full_punch_interval = 1.3, + max_drop_level=0, + groupcaps={ + cracky = {times={[2]=2.0, [3]=1.00}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:pick_steel", { + description = "Steel Pickaxe", + inventory_image = "default_tool_steelpick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:pick_bronze", { + description = "Bronze Pickaxe", + inventory_image = "default_tool_bronzepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:pick_mese", { + description = "Mese Pickaxe", + inventory_image = "default_tool_mesepick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:pick_diamond", { + description = "Diamond Pickaxe", + inventory_image = "default_tool_diamondpick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +-- +-- Shovels +-- + +minetest.register_tool("default:shovel_wood", { + description = "Wooden Shovel", + inventory_image = "default_tool_woodshovel.png", + wield_image = "default_tool_woodshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=3.00, [2]=1.60, [3]=0.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + groups = {flammable = 2}, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:shovel_stone", { + description = "Stone Shovel", + inventory_image = "default_tool_stoneshovel.png", + wield_image = "default_tool_stoneshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.4, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:shovel_steel", { + description = "Steel Shovel", + inventory_image = "default_tool_steelshovel.png", + wield_image = "default_tool_steelshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:shovel_bronze", { + description = "Bronze Shovel", + inventory_image = "default_tool_bronzeshovel.png", + wield_image = "default_tool_bronzeshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:shovel_mese", { + description = "Mese Shovel", + inventory_image = "default_tool_meseshovel.png", + wield_image = "default_tool_meseshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + crumbly = {times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:shovel_diamond", { + description = "Diamond Shovel", + inventory_image = "default_tool_diamondshovel.png", + wield_image = "default_tool_diamondshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.10, [2]=0.50, [3]=0.30}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +-- +-- Axes +-- + +minetest.register_tool("default:axe_wood", { + description = "Wooden Axe", + inventory_image = "default_tool_woodaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + groupcaps={ + choppy = {times={[2]=3.00, [3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + groups = {flammable = 2}, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:axe_stone", { + description = "Stone Axe", + inventory_image = "default_tool_stoneaxe.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + choppy={times={[1]=3.00, [2]=2.00, [3]=1.30}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:axe_steel", { + description = "Steel Axe", + inventory_image = "default_tool_steelaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:axe_bronze", { + description = "Bronze Axe", + inventory_image = "default_tool_bronzeaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:axe_mese", { + description = "Mese Axe", + inventory_image = "default_tool_meseaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.20, [2]=1.00, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:axe_diamond", { + description = "Diamond Axe", + inventory_image = "default_tool_diamondaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +-- +-- Swords +-- + +minetest.register_tool("default:sword_wood", { + description = "Wooden Sword", + inventory_image = "default_tool_woodsword.png", + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.6, [3]=0.40}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + groups = {flammable = 2}, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:sword_stone", { + description = "Stone Sword", + inventory_image = "default_tool_stonesword.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:sword_steel", { + description = "Steel Sword", + inventory_image = "default_tool_steelsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:sword_bronze", { + description = "Bronze Sword", + inventory_image = "default_tool_bronzesword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:sword_mese", { + description = "Mese Sword", + inventory_image = "default_tool_mesesword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:sword_diamond", { + description = "Diamond Sword", + inventory_image = "default_tool_diamondsword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40, maxlevel=3}, + }, + damage_groups = {fleshy=8}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("default:key", { + description = "Key", + inventory_image = "default_key.png", + groups = {key = 1, not_in_creative_inventory = 1}, + stack_max = 1, + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + node = minetest.get_node(pos) + + if not node or node.name == "ignore" then + return itemstack + end + + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + + local on_key_use = ndef.on_key_use + if on_key_use then + on_key_use(pos, placer) + end + + return nil + end +}) diff --git a/mods/default/torch.lua b/mods/default/torch.lua new file mode 100644 index 0000000..3c3ae96 --- /dev/null +++ b/mods/default/torch.lua @@ -0,0 +1,146 @@ + +--[[ + +Torch mod - formerly mod "Torches" +====================== + +(c) Copyright BlockMen (2013-2015) +(C) Copyright sofar (2016) + +This mod changes the default torch drawtype from "torchlike" to "mesh", +giving the torch a three dimensional appearance. The mesh contains the +proper pixel mapping to make the animation appear as a particle above +the torch, while in fact the animation is just the texture of the mesh. + + +License: +~~~~~~~~ +(c) Copyright BlockMen (2013-2015) + +Textures and Meshes/Models: +CC-BY 3.0 BlockMen +Note that the models were entirely done from scratch by sofar. + +Code: +Licensed under the GNU LGPL version 2.1 or higher. +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; + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt + +--]] + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "mesh", + mesh = "torch_floor.obj", + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_bottom = {-1/8, -1/2, -1/8, 1/8, 2/16, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick and + ((not placer) or (placer and not placer:get_player_control().sneak)) then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local above = pointed_thing.above + local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) + local fakestack = itemstack + if wdir == 0 then + fakestack:set_name("default:torch_ceiling") + elseif wdir == 1 then + fakestack:set_name("default:torch") + else + fakestack:set_name("default:torch_wall") + end + + itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name("default:torch") + + return itemstack + end +}) + +minetest.register_node("default:torch_wall", { + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_side = {-1/2, -1/2, -1/8, -1/8, 1/8, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:torch_ceiling", { + drawtype = "mesh", + mesh = "torch_ceiling.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-1/8, -1/16, -5/16, 1/8, 1/2, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_lbm({ + name = "default:3dtorch", + nodenames = {"default:torch", "torches:floor", "torches:wall"}, + action = function(pos, node) + if node.param2 == 0 then + minetest.set_node(pos, {name = "default:torch_ceiling", + param2 = node.param2}) + elseif node.param2 == 1 then + minetest.set_node(pos, {name = "default:torch", + param2 = node.param2}) + else + minetest.set_node(pos, {name = "default:torch_wall", + param2 = node.param2}) + end + end +}) diff --git a/mods/default/trees.lua b/mods/default/trees.lua new file mode 100644 index 0000000..81c9831 --- /dev/null +++ b/mods/default/trees.lua @@ -0,0 +1,535 @@ +local random = math.random + +-- +-- Grow trees from saplings +-- + +-- 'can grow' function + +function default.can_grow(pos) + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + return false + end + local name_under = node_under.name + local is_soil = minetest.get_item_group(name_under, "soil") + if is_soil == 0 then + return false + end + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + return false + end + return true +end + + +-- 'is snow nearby' function + +local function is_snow_nearby(pos) + return minetest.find_node_near(pos, 1, {"group:snowy"}) +end + + +-- Sapling ABM + +function default.grow_sapling(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end + + local mg_name = minetest.get_mapgen_setting("mg_name") + local node = minetest.get_node(pos) + if node.name == "default:sapling" then + minetest.log("action", "A sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + if mg_name == "v6" then + default.grow_tree(pos, random(1, 4) == 1) + else + default.grow_new_apple_tree(pos) + end + elseif node.name == "default:junglesapling" then + minetest.log("action", "A jungle sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + if mg_name == "v6" then + default.grow_jungle_tree(pos) + else + default.grow_new_jungle_tree(pos) + end + elseif node.name == "default:pine_sapling" then + minetest.log("action", "A pine sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + local snow = is_snow_nearby(pos) + if mg_name == "v6" then + default.grow_pine_tree(pos, snow) + elseif snow then + default.grow_new_snowy_pine_tree(pos) + else + default.grow_new_pine_tree(pos) + end + elseif node.name == "default:acacia_sapling" then + minetest.log("action", "An acacia sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_new_acacia_tree(pos) + elseif node.name == "default:aspen_sapling" then + minetest.log("action", "An aspen sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_new_aspen_tree(pos) + elseif node.name == "default:bush_sapling" then + minetest.log("action", "A bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_bush(pos) + elseif node.name == "default:acacia_bush_sapling" then + minetest.log("action", "An acacia bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_acacia_bush(pos) + end +end + +minetest.register_lbm({ + name = "default:convert_saplings_to_node_timer", + nodenames = {"default:sapling", "default:junglesapling", + "default:pine_sapling", "default:acacia_sapling", + "default:aspen_sapling"}, + action = function(pos) + minetest.get_node_timer(pos):start(math.random(1200, 2400)) + end +}) + +-- +-- Tree generation +-- + +-- Apple tree and jungle tree trunk and leaves function + +local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, + height, size, iters, is_apple_tree) + local x, y, z = pos.x, pos.y, pos.z + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_apple = minetest.get_content_id("default:apple") + + -- Trunk + data[a:index(x, y, z)] = tree_cid -- Force-place lowest trunk node to replace sapling + for yy = y + 1, y + height - 1 do + local vi = a:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == leaves_cid then + data[vi] = tree_cid + end + end + + -- Force leaves near the trunk + for z_dist = -1, 1 do + for y_dist = -size, 1 do + local vi = a:index(x - 1, y + height + y_dist, z + z_dist) + for x_dist = -1, 1 do + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + vi = vi + 1 + end + end + end + + -- Randomly add leaves in 2x2x2 clusters. + for i = 1, iters do + local clust_x = x + random(-size, size - 1) + local clust_y = y + height + random(-size, 0) + local clust_z = z + random(-size, size - 1) + + for xi = 0, 1 do + for yi = 0, 1 do + for zi = 0, 1 do + local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi) + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + end + end + end + end +end + + +-- Apple tree + +function default.grow_tree(pos, is_apple_tree, bad) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(4, 5) + local c_tree = minetest.get_content_id("default:tree") + local c_leaves = minetest.get_content_id("default:leaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 2, y = y, z = z - 2}, + {x = x + 2, y = y + height + 1, z = z + 2} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_tree, c_leaves, height, 2, 8, is_apple_tree) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- Jungle tree + +function default.grow_jungle_tree(pos, bad) + --[[ + NOTE: Jungletree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_jungle_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(8, 12) + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_jungletree = minetest.get_content_id("default:jungletree") + local c_jungleleaves = minetest.get_content_id("default:jungleleaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y - 1, z = z - 3}, + {x = x + 3, y = y + height + 1, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, + height, 3, 30, false) + + -- Roots + for z_dist = -1, 1 do + local vi_1 = a:index(x - 1, y - 1, z + z_dist) + local vi_2 = a:index(x - 1, y, z + z_dist) + for x_dist = -1, 1 do + if random(1, 3) >= 2 then + if data[vi_1] == c_air or data[vi_1] == c_ignore then + data[vi_1] = c_jungletree + elseif data[vi_2] == c_air or data[vi_2] == c_ignore then + data[vi_2] = c_jungletree + end + end + vi_1 = vi_1 + 1 + vi_2 = vi_2 + 1 + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- Pine tree from mg mapgen mod, design by sfan5, pointy top added by paramat + +local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == c_snow then + data[vi] = c_pine_needles + end +end + +local function add_snow(data, vi, c_air, c_ignore, c_snow) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore then + data[vi] = c_snow + end +end + +function default.grow_pine_tree(pos, snow) + local x, y, z = pos.x, pos.y, pos.z + local maxy = y + random(9, 13) -- Trunk top + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_pine_tree = minetest.get_content_id("default:pine_tree") + local c_pine_needles = minetest.get_content_id("default:pine_needles") + local c_snow = minetest.get_content_id("default:snow") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y, z = z - 3}, + {x = x + 3, y = maxy + 3, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + -- Upper branches layer + local dev = 3 + for yy = maxy - 1, maxy + 1 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Centre top nodes + add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow, + c_pine_needles) + add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow, + c_pine_needles) -- Paramat added a pointy top node + if snow then + add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow) + end + + -- Lower branches layer + local my = 0 + for i = 1, 20 do -- Random 2x2 squares of needles + local xi = x + random(-3, 2) + local yy = maxy + random(-6, -5) + local zi = z + random(-3, 2) + if yy > my then + my = yy + end + for zz = zi, zi+1 do + local vi = a:index(xi, yy, zz) + local via = a:index(xi, yy + 1, zz) + for xx = xi, xi + 1 do + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + vi = vi + 1 + via = via + 1 + end + end + end + + dev = 2 + for yy = my + 1, my + 2 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Trunk + -- Force-place lowest trunk node to replace sapling + data[a:index(x, y, z)] = c_pine_tree + for yy = y + 1, maxy do + local vi = a:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or + node_id == c_pine_needles or node_id == c_snow then + data[vi] = c_pine_tree + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- New apple tree + +function default.grow_new_apple_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/apple_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New jungle tree + +function default.grow_new_jungle_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/jungle_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New pine tree + +function default.grow_new_pine_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/pine_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "0", nil, false) +end + + +-- New snowy pine tree + +function default.grow_new_snowy_pine_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/snowy_pine_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New acacia tree + +function default.grow_new_acacia_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 4, y = pos.y - 1, z = pos.z - 4}, + path, "random", nil, false) +end + + +-- New aspen tree + +function default.grow_new_aspen_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/aspen_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "0", nil, false) +end + + +-- Bushes do not need 'from sapling' schematic variants because +-- only the stem node is force-placed in the schematic. + +-- Bush + +function default.grow_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Acacia bush + +function default.grow_acacia_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- +-- Sapling 'on place' function to check protection of node and resulting tree volume +-- + +function default.sapling_on_place(itemstack, placer, pointed_thing, + sapling_name, minp_relative, maxp_relative, interval) + -- Position of sapling + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local pdef = node and minetest.registered_nodes[node.name] + + if pdef and pdef.on_rightclick and not placer:get_player_control().sneak then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + if not pdef or not pdef.buildable_to then + pos = pointed_thing.above + node = minetest.get_node_or_nil(pos) + pdef = node and minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local player_name = placer:get_player_name() + -- Check sapling position for protection + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + -- Check tree volume for protection + if default.intersects_protection( + vector.add(pos, minp_relative), + vector.add(pos, maxp_relative), + player_name, + interval) then + minetest.record_protection_violation(pos, player_name) + -- Print extra information to explain + minetest.chat_send_player(player_name, "Tree will intersect protection") + return itemstack + end + + minetest.log("action", player_name .. " places node " + .. sapling_name .. " at " .. minetest.pos_to_string(pos)) + + local take_item = not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) + local newnode = {name = sapling_name} + local ndef = minetest.registered_nodes[sapling_name] + minetest.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + return itemstack +end diff --git a/mods/doors/README.txt b/mods/doors/README.txt new file mode 100644 index 0000000..9ad7093 --- /dev/null +++ b/mods/doors/README.txt @@ -0,0 +1,84 @@ +Minetest Game mod: doors +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) + +Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. + +Modified by sofar (sofar@foo-projects.org) (MIT): +Added Steel trapdoor. +Re-implemented most of the door algorithms, added meshes, UV wrapped texture. +Added doors API to facilitate coding mods accessing and operating doors. +Added Fence Gate model, code, and sounds. + +Various Minetest developers and contributors (MIT) + + +Authors of media (textures) +--------------------------- +Following textures created by Fernando Zapata (CC BY-SA 3.0): + door_wood.png + door_wood_a.png + door_wood_a_r.png + door_wood_b.png + door_wood_b_r.png + +Following textures created by BlockMen (CC BY-SA 3.0): + door_trapdoor.png + door_obsidian_glass_side.png + +Following textures created by celeron55 (CC BY-SA 3.0): + door_glass_a.png + door_glass_b.png + +Following textures created by PenguinDad (CC BY-SA 4.0): + door_glass.png + door_obsidian_glass.png + +Following textures created by sofar (CC-BY-SA-3.0): + doors_trapdoor_steel.png + doors_trapdoor_steel_side.png + door_trapdoor_side.png + +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): + door_obsidian_glass.png + +Glass door textures by red-001 based on textures by celeron55 (CC BY-SA 3.0): + door_glass.png + +All other textures (created by PilzAdam) (CC BY-SA 3.0): + +Door textures were converted to the new texture map by sofar, paramat and +red-001, under the same license as the originals. + + +Authors of media (models) +------------------------- +Door 3d models by sofar (CC-BY-SA-3.0) + - door_a.obj + - door_b.obj +Fence gate models by sofar (CC-BY-SA-3.0) + - fencegate_open.obj + - fencegate_closed.obj + + +Authors of media (sounds) +------------------------- +Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen + door_open.ogg +Closing-Sound created by bennstir (CC BY 3.0) + door_close.ogg +fencegate_open.ogg: + http://www.freesound.org/people/mhtaylor67/sounds/126041/ - (CC0 1.0) +fencegate_close.ogg: + http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - (CC-BY-3.0) + http://www.freesound.org/people/rivernile7/sounds/249573/ - (CC-BY-3.0) +Steel door sounds open & close (CC-BY-3.0) by HazMatt + - http://www.freesound.org/people/HazMattt/sounds/187283/ + doors_steel_door_open.ogg + doors_steel_door_close.ogg +doors_glass_door_open.ogg, doors_glass_door_close.ogg: + https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) diff --git a/mods/doors/depends.txt b/mods/doors/depends.txt new file mode 100644 index 0000000..5e28bee --- /dev/null +++ b/mods/doors/depends.txt @@ -0,0 +1,2 @@ +default +screwdriver? diff --git a/mods/doors/init.lua b/mods/doors/init.lua new file mode 100644 index 0000000..371b43a --- /dev/null +++ b/mods/doors/init.lua @@ -0,0 +1,853 @@ +-- our API object +doors = {} + +-- private data +local _doors = {} +_doors.registered_doors = {} +_doors.registered_trapdoors = {} + +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + +-- returns an object to a door object or nil +function doors.get(pos) + local node_name = minetest.get_node(pos).name + if _doors.registered_doors[node_name] then + -- A normal upright door + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return _doors.door_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return _doors.door_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return _doors.door_toggle(self.pos, nil, player) + end, + state = function(self) + local state = minetest.get_meta(self.pos):get_int("state") + return state %2 == 1 + end + } + elseif _doors.registered_trapdoors[node_name] then + -- A trapdoor + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return _doors.trapdoor_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return _doors.trapdoor_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return _doors.trapdoor_toggle(self.pos, nil, player) + end, + state = function(self) + return minetest.get_node(self.pos).name:sub(-5) == "_open" + end + } + else + return nil + end +end + +-- this hidden node is placed on top of the bottom, and prevents +-- nodes from being placed in the top half of the door. +minetest.register_node("doors:hidden", { + description = "Hidden Door Segment", + -- can't use airlike otherwise falling nodes will turn to entities + -- and will be forever stuck until door is removed. + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + -- has to be walkable for falling nodes to stop falling. + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + floodable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, + tiles = {"doors_blank.png"}, + -- 1px transparent block inside door hinge near node top. + node_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, + -- collision_box needed otherise selection box would be full node size + collision_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, +}) + +-- table used to aid door opening/closing +local transform = { + { + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, + }, +} + +function _doors.door_toggle(pos, node, clicker) + local meta = minetest.get_meta(pos) + node = node or minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + local name = def.door.name + + local state = meta:get_string("state") + if state == "" then + -- fix up lvm-placed right-hinged doors, default closed + if node.name:sub(-2) == "_b" then + state = 2 + else + state = 0 + end + else + state = tonumber(state) + end + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + -- until Lua-5.2 we have no bitwise operators :( + if state % 2 == 1 then + state = state - 1 + else + state = state + 1 + end + + local dir = node.param2 + if state % 2 == 0 then + minetest.sound_play(def.door.sounds[1], + {pos = pos, gain = 0.3, max_hear_distance = 10}) + else + minetest.sound_play(def.door.sounds[2], + {pos = pos, gain = 0.3, max_hear_distance = 10}) + end + + minetest.swap_node(pos, { + name = name .. transform[state + 1][dir+1].v, + param2 = transform[state + 1][dir+1].param2 + }) + meta:set_int("state", state) + + return true +end + + +local function on_place_node(place_to, newnode, + placer, oldnode, itemstack, pointed_thing) + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} + local newnode_copy = + {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = + {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local pointed_thing_copy = { + type = pointed_thing.type, + above = vector.new(pointed_thing.above), + under = vector.new(pointed_thing.under), + ref = pointed_thing.ref, + } + callback(place_to_copy, newnode_copy, placer, + oldnode_copy, itemstack, pointed_thing_copy) + end +end + +local function can_dig_door(pos, digger) + replace_old_owner_information(pos) + if default.can_interact_with_node(digger, pos) then + return true + else + minetest.record_protection_violation(pos, digger:get_player_name()) + return false + end +end + +function doors.register(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + -- replace old doors of this type automatically + minetest.register_lbm({ + name = ":doors:replace_" .. name:gsub(":", "_"), + nodenames = {name.."_b_1", name.."_b_2"}, + action = function(pos, node) + local l = tonumber(node.name:sub(-1)) + local meta = minetest.get_meta(pos) + local h = meta:get_int("right") + 1 + local p2 = node.param2 + local replace = { + {{type = "a", state = 0}, {type = "a", state = 3}}, + {{type = "b", state = 1}, {type = "b", state = 2}} + } + local new = replace[l][h] + -- retain infotext and doors_owner fields + minetest.swap_node(pos, {name = name .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- properly place doors:hidden at the right spot + local p3 = p2 + if new.state >= 2 then + p3 = (p3 + 3) % 4 + end + if new.state % 2 == 1 then + if new.state >= 2 then + p3 = (p3 + 1) % 4 + else + p3 = (p3 + 3) % 4 + end + end + -- wipe meta on top node as it's unused + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, + {name = "doors:hidden", param2 = p3}) + end + }) + + minetest.register_craftitem(":" .. name, { + description = def.description, + inventory_image = def.inventory_image, + groups = table.copy(def.groups), + + on_place = function(itemstack, placer, pointed_thing) + local pos + + if not pointed_thing.type == "node" then + return itemstack + end + + local node = minetest.get_node(pointed_thing.under) + local pdef = minetest.registered_nodes[node.name] + if pdef and pdef.on_rightclick and + not placer:get_player_control().sneak then + return pdef.on_rightclick(pointed_thing.under, + node, placer, itemstack, pointed_thing) + end + + if pdef and pdef.buildable_to then + pos = pointed_thing.under + else + pos = pointed_thing.above + node = minetest.get_node(pos) + pdef = minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local top_node = minetest.get_node_or_nil(above) + local topdef = top_node and minetest.registered_nodes[top_node.name] + + if not topdef or not topdef.buildable_to then + return itemstack + end + + local pn = placer:get_player_name() + if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then + return itemstack + end + + local dir = minetest.dir_to_facedir(placer:get_look_dir()) + + local ref = { + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + } + + local aside = { + x = pos.x + ref[dir + 1].x, + y = pos.y + ref[dir + 1].y, + z = pos.z + ref[dir + 1].z, + } + + local state = 0 + if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then + state = state + 2 + minetest.set_node(pos, {name = name .. "_b", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4}) + else + minetest.set_node(pos, {name = name .. "_a", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = dir}) + end + + local meta = minetest.get_meta(pos) + meta:set_int("state", state) + + if def.protected then + meta:set_string("owner", pn) + meta:set_string("infotext", "Owned by " .. pn) + end + + if not (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) then + itemstack:take_item() + end + + minetest.sound_play(def.sounds.place, {pos = pos}) + + on_place_node(pos, minetest.get_node(pos), + placer, node, itemstack, pointed_thing) + + return itemstack + end + }) + def.inventory_image = nil + + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) + end + def.recipe = nil + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + def.groups.not_in_creative_inventory = 1 + def.groups.door = 1 + def.drop = name + def.door = { + name = name, + sounds = { def.sound_close, def.sound_open }, + } + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + _doors.door_toggle(pos, node, clicker) + return itemstack + end + def.after_dig_node = function(pos, node, meta, digger) + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + minetest.check_for_falling({x = pos.x, y = pos.y + 1, z = pos.z}) + end + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end + + if def.protected then + def.can_dig = can_dig_door + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, "You do not own this locked door.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked door", owner + end + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + -- hidden node doesn't get blasted away. + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + return {name} + end + end + + def.on_destruct = function(pos) + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + end + + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.sunlight_propagates = true + def.walkable = true + def.is_ground_content = false + def.buildable_to = false + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + + def.mesh = "door_a.obj" + minetest.register_node(":" .. name .. "_a", def) + + def.mesh = "door_b.obj" + minetest.register_node(":" .. name .. "_b", def) + + _doors.registered_doors[name .. "_a"] = true + _doors.registered_doors[name .. "_b"] = true +end + +doors.register("door_wood", { + tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, + description = "Wooden Door", + inventory_image = "doors_item_wood.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + } +}) + +doors.register("door_steel", { + tiles = {{name = "doors_door_steel.png", backface_culling = true}}, + description = "Steel Door", + inventory_image = "doors_item_steel.png", + protected = true, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + +doors.register("door_glass", { + tiles = {"doors_door_glass.png"}, + description = "Glass Door", + inventory_image = "doors_item_glass.png", + groups = {cracky=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + } +}) + +doors.register("door_obsidian_glass", { + tiles = {"doors_door_obsidian_glass.png"}, + description = "Obsidian Glass Door", + inventory_image = "doors_item_obsidian_glass.png", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + recipe = { + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + }, +}) + +-- Capture mods using the old API as best as possible. +function doors.register_door(name, def) + if def.only_placer_can_open then + def.protected = true + end + def.only_placer_can_open = nil + + local i = name:find(":") + local modname = name:sub(1, i - 1) + if not def.tiles then + if def.protected then + def.tiles = {{name = "doors_door_steel.png", backface_culling = true}} + else + def.tiles = {{name = "doors_door_wood.png", backface_culling = true}} + end + minetest.log("warning", modname .. " registered door \"" .. name .. "\" " .. + "using deprecated API method \"doors.register_door()\" but " .. + "did not provide the \"tiles\" parameter. A fallback tiledef " .. + "will be used instead.") + end + + doors.register(name, def) +end + +----trapdoor---- + +function _doors.trapdoor_toggle(pos, node, clicker) + node = node or minetest.get_node(pos) + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + local def = minetest.registered_nodes[node.name] + + if string.sub(node.name, -5) == "_open" then + minetest.sound_play(def.sound_close, + {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = string.sub(node.name, 1, + string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) + else + minetest.sound_play(def.sound_open, + {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = node.name .. "_open", + param1 = node.param1, param2 = node.param2}) + end +end + +function doors.register_trapdoor(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + local name_closed = name + local name_opened = name.."_open" + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + _doors.trapdoor_toggle(pos, node, clicker) + return itemstack + end + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.is_ground_content = false + + if def.protected then + def.can_dig = can_dig_door + def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local pn = placer:get_player_name() + local meta = minetest.get_meta(pos) + meta:set_string("owner", pn) + meta:set_string("infotext", "Owned by "..pn) + + return (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) + end + + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, "You do not own this trapdoor.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked trapdoor", owner + end + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + return {name} + end + end + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.tiles = {def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, def.tile_side, + def.tile_side, def.tile_side} + + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.tiles = {def.tile_side, def.tile_side, + def.tile_side .. '^[transform3', + def.tile_side .. '^[transform1', + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6'} + + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + minetest.register_node(name_opened, def_opened) + minetest.register_node(name_closed, def_closed) + + _doors.registered_trapdoors[name_opened] = true + _doors.registered_trapdoors[name_closed] = true +end + +doors.register_trapdoor("doors:trapdoor", { + description = "Trapdoor", + inventory_image = "doors_trapdoor.png", + wield_image = "doors_trapdoor.png", + tile_front = "doors_trapdoor.png", + tile_side = "doors_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + +doors.register_trapdoor("doors:trapdoor_steel", { + description = "Steel Trapdoor", + inventory_image = "doors_trapdoor_steel.png", + wield_image = "doors_trapdoor_steel.png", + tile_front = "doors_trapdoor_steel.png", + tile_side = "doors_trapdoor_steel_side.png", + protected = true, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + groups = {cracky = 1, level = 2, door = 1}, +}) + +minetest.register_craft({ + output = 'doors:trapdoor 2', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'doors:trapdoor_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot'}, + } +}) + + +----fence gate---- + +function doors.register_fencegate(name, def) + local fence = { + description = def.description, + drawtype = "mesh", + tiles = {def.texture}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = name .. "_closed", + connect_sides = {"left", "right"}, + groups = def.groups, + sounds = def.sounds, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local node_def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) + minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3, + max_hear_distance = 8}) + return itemstack + end, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4}, + }, + } + + if not fence.sounds then + fence.sounds = default.node_sound_wood_defaults() + end + + fence.groups.fence = 1 + + local fence_closed = table.copy(fence) + fence_closed.mesh = "doors_fencegate_closed.obj" + fence_closed.gate = name .. "_open" + fence_closed.sound = "doors_fencegate_open" + fence_closed.collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4}, + } + + local fence_open = table.copy(fence) + fence_open.mesh = "doors_fencegate_open.obj" + fence_open.gate = name .. "_closed" + fence_open.sound = "doors_fencegate_close" + fence_open.groups.not_in_creative_inventory = 1 + fence_open.collision_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4}, + {-1/2, -3/8, -1/2, -3/8, 3/8, 0}}, + } + + minetest.register_node(":" .. name .. "_closed", fence_closed) + minetest.register_node(":" .. name .. "_open", fence_open) + + minetest.register_craft({ + output = name .. "_closed", + recipe = { + {"default:stick", def.material, "default:stick"}, + {"default:stick", def.material, "default:stick"} + } + }) +end + +doors.register_fencegate("doors:gate_wood", { + description = "Wooden Fence Gate", + texture = "default_wood.png", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_acacia_wood", { + description = "Acacia Fence Gate", + texture = "default_acacia_wood.png", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_junglewood", { + description = "Jungle Wood Fence Gate", + texture = "default_junglewood.png", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_pine_wood", { + description = "Pine Fence Gate", + texture = "default_pine_wood.png", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + +doors.register_fencegate("doors:gate_aspen_wood", { + description = "Aspen Fence Gate", + texture = "default_aspen_wood.png", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + + +----fuels---- + +minetest.register_craft({ + type = "fuel", + recipe = "doors:trapdoor", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_wood", + burntime = 14, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_wood_closed", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_acacia_wood_closed", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_junglewood_closed", + burntime = 9, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_pine_wood_closed", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_aspen_wood_closed", + burntime = 5, +}) diff --git a/mods/doors/license.txt b/mods/doors/license.txt new file mode 100644 index 0000000..8ce73c4 --- /dev/null +++ b/mods/doors/license.txt @@ -0,0 +1,164 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar (sofar@foo-projects.org) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2016 Fernando Zapata +Copyright (C) 2014-2016 celeron55 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar +Copyright (C) 2016 red-001 +Copyright (C) 2016 paramat + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 PenguinDad + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/4.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014 CGEffex +Copyright (C) 2014 bennstir +Copyright (C) 2016 BarkersPinhead +Copyright (C) 2016 rivernile7 +Copyright (C) 2016 HazMatt + +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/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +mhtaylor67 +SkeetMasterFunk69 + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public +domain by waiving all of his or her rights to the work worldwide under copyright law, +including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +Other Information + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as +publicity or privacy rights. +Unless expressly stated otherwise, the person who associated a work with this deed makes +no warranties about the work, and disclaims liability for all uses of the work, to the +fullest extent permitted by applicable law. +When using or citing the work, you should not imply endorsement by the author or the +affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/doors/models/door_a.obj b/mods/doors/models/door_a.obj new file mode 100644 index 0000000..bd5127b --- /dev/null +++ b/mods/doors/models/door_a.obj @@ -0,0 +1,40 @@ +# Blender v2.76 (sub 0) OBJ File: 'door_a.blend' +# www.blender.org +mtllib door_a.mtl +o Cube_Cube.001 +v 0.499000 -0.499000 -0.499000 +v 0.499000 1.499000 -0.499000 +v 0.499000 -0.499000 -0.375000 +v 0.499000 1.499000 -0.375000 +v -0.499000 -0.499000 -0.499000 +v -0.499000 1.499000 -0.499000 +v -0.499000 -0.499000 -0.375000 +v -0.499000 1.499000 -0.375000 +vt 0.842105 1.000000 +vt 0.894737 1.000000 +vt 0.894737 0.000000 +vt 0.842105 0.000000 +vt 0.421053 1.000000 +vt 0.421053 0.000000 +vt 0.947368 1.000000 +vt 0.947368 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.500000 +vt 0.947368 0.500000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/5/2 8/1/2 7/4/2 3/6/2 +f 8/2/3 6/7/3 5/8/3 7/3/3 +f 6/9/4 2/5/4 1/6/4 5/10/4 +f 1/11/5 3/12/5 7/7/5 5/13/5 +f 6/14/6 8/8/6 4/12/6 2/11/6 diff --git a/mods/doors/models/door_b.obj b/mods/doors/models/door_b.obj new file mode 100644 index 0000000..c5607b8 --- /dev/null +++ b/mods/doors/models/door_b.obj @@ -0,0 +1,40 @@ +# Blender v2.76 (sub 0) OBJ File: 'door_b.blend' +# www.blender.org +mtllib door_b.mtl +o Cube_Cube.001 +v -0.499000 -0.499000 -0.499000 +v -0.499000 1.499000 -0.499000 +v -0.499000 -0.499000 -0.375000 +v -0.499000 1.499000 -0.375000 +v 0.499000 -0.499000 -0.499000 +v 0.499000 1.499000 -0.499000 +v 0.499000 -0.499000 -0.375000 +v 0.499000 1.499000 -0.375000 +vt 0.842105 1.000000 +vt 0.842105 0.000000 +vt 0.894737 0.000000 +vt 0.894737 1.000000 +vt 0.421053 1.000000 +vt 0.421053 0.000000 +vt 0.947368 0.000000 +vt 0.947368 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.947368 0.500000 +vt 1.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 2/1/1 1/2/1 3/3/1 4/4/1 +f 4/5/2 3/6/2 7/2/2 8/1/2 +f 8/4/3 7/3/3 5/7/3 6/8/3 +f 6/9/4 5/10/4 1/6/4 2/5/4 +f 1/11/5 5/12/5 7/13/5 3/7/5 +f 6/8/6 2/13/6 4/12/6 8/14/6 diff --git a/mods/doors/models/doors_fencegate_closed.obj b/mods/doors/models/doors_fencegate_closed.obj new file mode 100644 index 0000000..0050f70 --- /dev/null +++ b/mods/doors/models/doors_fencegate_closed.obj @@ -0,0 +1,106 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_closed.blend' +# www.blender.org +mtllib gate_closed.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -0.125000 +v -0.375000 0.187500 0.062500 +v -0.375000 0.312500 0.062500 +v -0.375000 0.187500 -0.062500 +v -0.375000 0.312500 -0.062500 +v 0.375000 0.187500 0.062500 +v 0.375000 0.312500 0.062500 +v 0.375000 0.187500 -0.062500 +v 0.375000 0.312500 -0.062500 +v -0.374831 0.187348 0.062500 +v -0.156342 0.187363 0.062500 +v -0.374831 0.187348 -0.062500 +v -0.156342 0.187363 -0.062500 +v 0.374981 -0.343683 0.062500 +v 0.375065 -0.187304 0.062500 +v 0.374981 -0.343683 -0.062500 +v 0.375065 -0.187304 -0.062500 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.578000 -0.816100 0.000000 +vn 0.576200 0.817300 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/2 24/3/2 23/19/2 19/20/2 +f 22/1/4 18/4/4 17/21/4 21/22/4 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/2 32/28/2 31/29/2 27/30/2 +f 30/31/4 26/32/4 25/33/4 29/34/4 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 diff --git a/mods/doors/models/doors_fencegate_open.obj b/mods/doors/models/doors_fencegate_open.obj new file mode 100644 index 0000000..3fb727f --- /dev/null +++ b/mods/doors/models/doors_fencegate_open.obj @@ -0,0 +1,112 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_open.blend' +# www.blender.org +mtllib gate_open.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -0.125000 +v 0.434859 0.187500 -0.872359 +v 0.434859 0.312500 -0.872359 +v 0.559859 0.187500 -0.872359 +v 0.559859 0.312500 -0.872359 +v 0.434859 0.187500 -0.122359 +v 0.434859 0.312500 -0.122359 +v 0.559859 0.187500 -0.122359 +v 0.559859 0.312500 -0.122359 +v 0.434859 0.187348 -0.872190 +v 0.434859 0.187363 -0.653701 +v 0.559859 0.187348 -0.872190 +v 0.559859 0.187363 -0.653701 +v 0.434859 -0.343683 -0.122379 +v 0.434859 -0.187304 -0.122294 +v 0.559859 -0.343683 -0.122379 +v 0.559859 -0.187304 -0.122294 +v 0.499560 -0.442900 0.005495 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.625000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.816100 -0.578000 +vn 0.000000 0.817300 0.576200 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/3 24/3/3 23/19/3 19/20/3 +f 22/1/1 18/4/1 17/21/1 21/22/1 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/3 32/28/3 31/29/3 27/30/3 +f 30/31/1 26/32/1 25/33/1 29/34/1 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 +f 17/41/2 18/42/2 20/43/2 19/44/2 diff --git a/mods/doors/sounds/doors_door_close.ogg b/mods/doors/sounds/doors_door_close.ogg new file mode 100644 index 0000000..fede4af Binary files /dev/null and b/mods/doors/sounds/doors_door_close.ogg differ diff --git a/mods/doors/sounds/doors_door_open.ogg b/mods/doors/sounds/doors_door_open.ogg new file mode 100644 index 0000000..9a4c4f1 Binary files /dev/null and b/mods/doors/sounds/doors_door_open.ogg differ diff --git a/mods/doors/sounds/doors_fencegate_close.ogg b/mods/doors/sounds/doors_fencegate_close.ogg new file mode 100644 index 0000000..d42590f Binary files /dev/null and b/mods/doors/sounds/doors_fencegate_close.ogg differ diff --git a/mods/doors/sounds/doors_fencegate_open.ogg b/mods/doors/sounds/doors_fencegate_open.ogg new file mode 100644 index 0000000..f6dfd1d Binary files /dev/null and b/mods/doors/sounds/doors_fencegate_open.ogg differ diff --git a/mods/doors/sounds/doors_glass_door_close.ogg b/mods/doors/sounds/doors_glass_door_close.ogg new file mode 100644 index 0000000..b3c1355 Binary files /dev/null and b/mods/doors/sounds/doors_glass_door_close.ogg differ diff --git a/mods/doors/sounds/doors_glass_door_open.ogg b/mods/doors/sounds/doors_glass_door_open.ogg new file mode 100644 index 0000000..66e6812 Binary files /dev/null and b/mods/doors/sounds/doors_glass_door_open.ogg differ diff --git a/mods/doors/sounds/doors_steel_door_close.ogg b/mods/doors/sounds/doors_steel_door_close.ogg new file mode 100644 index 0000000..aea7be6 Binary files /dev/null and b/mods/doors/sounds/doors_steel_door_close.ogg differ diff --git a/mods/doors/sounds/doors_steel_door_open.ogg b/mods/doors/sounds/doors_steel_door_open.ogg new file mode 100644 index 0000000..de87477 Binary files /dev/null and b/mods/doors/sounds/doors_steel_door_open.ogg differ diff --git a/mods/doors/textures/doors_blank.png b/mods/doors/textures/doors_blank.png new file mode 100644 index 0000000..1914264 Binary files /dev/null and b/mods/doors/textures/doors_blank.png differ diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png new file mode 100644 index 0000000..26c427b Binary files /dev/null and b/mods/doors/textures/doors_door_glass.png differ diff --git a/mods/doors/textures/doors_door_obsidian_glass.png b/mods/doors/textures/doors_door_obsidian_glass.png new file mode 100644 index 0000000..07ac5b2 Binary files /dev/null and b/mods/doors/textures/doors_door_obsidian_glass.png differ diff --git a/mods/doors/textures/doors_door_steel.png b/mods/doors/textures/doors_door_steel.png new file mode 100644 index 0000000..f42f335 Binary files /dev/null and b/mods/doors/textures/doors_door_steel.png differ diff --git a/mods/doors/textures/doors_door_wood.png b/mods/doors/textures/doors_door_wood.png new file mode 100644 index 0000000..7b18203 Binary files /dev/null and b/mods/doors/textures/doors_door_wood.png differ diff --git a/mods/doors/textures/doors_item_glass.png b/mods/doors/textures/doors_item_glass.png new file mode 100644 index 0000000..791a58a Binary files /dev/null and b/mods/doors/textures/doors_item_glass.png differ diff --git a/mods/doors/textures/doors_item_obsidian_glass.png b/mods/doors/textures/doors_item_obsidian_glass.png new file mode 100644 index 0000000..1026d43 Binary files /dev/null and b/mods/doors/textures/doors_item_obsidian_glass.png differ diff --git a/mods/doors/textures/doors_item_steel.png b/mods/doors/textures/doors_item_steel.png new file mode 100644 index 0000000..dd99e13 Binary files /dev/null and b/mods/doors/textures/doors_item_steel.png differ diff --git a/mods/doors/textures/doors_item_wood.png b/mods/doors/textures/doors_item_wood.png new file mode 100644 index 0000000..d3a62ab Binary files /dev/null and b/mods/doors/textures/doors_item_wood.png differ diff --git a/mods/doors/textures/doors_trapdoor.png b/mods/doors/textures/doors_trapdoor.png new file mode 100644 index 0000000..e92c8b2 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor.png differ diff --git a/mods/doors/textures/doors_trapdoor_side.png b/mods/doors/textures/doors_trapdoor_side.png new file mode 100644 index 0000000..c45d870 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor_side.png differ diff --git a/mods/doors/textures/doors_trapdoor_steel.png b/mods/doors/textures/doors_trapdoor_steel.png new file mode 100644 index 0000000..4ba507d Binary files /dev/null and b/mods/doors/textures/doors_trapdoor_steel.png differ diff --git a/mods/doors/textures/doors_trapdoor_steel_side.png b/mods/doors/textures/doors_trapdoor_steel_side.png new file mode 100644 index 0000000..44c4344 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor_steel_side.png differ diff --git a/mods/dye/README.txt b/mods/dye/README.txt new file mode 100644 index 0000000..a2fbdd2 --- /dev/null +++ b/mods/dye/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: dye +====================== +See license.txt for license information. +See init.lua for documentation. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Perttu Ahola (celeron55) (CC BY-SA 3.0) diff --git a/mods/dye/depends.txt b/mods/dye/depends.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/dye/init.lua b/mods/dye/init.lua new file mode 100644 index 0000000..8028457 --- /dev/null +++ b/mods/dye/init.lua @@ -0,0 +1,112 @@ +-- Other mods can use these for looping through available colors + +dye = {} +dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} +dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", + "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} + +-- Make dye names and descriptions available globally + +dye.dyes = { + {"white", "White"}, + {"grey", "Grey"}, + {"dark_grey", "Dark grey"}, + {"black", "Black"}, + {"violet", "Violet"}, + {"blue", "Blue"}, + {"cyan", "Cyan"}, + {"dark_green", "Dark green"}, + {"green", "Green"}, + {"yellow", "Yellow"}, + {"brown", "Brown"}, + {"orange", "Orange"}, + {"red", "Red"}, + {"magenta", "Magenta"}, + {"pink", "Pink"}, +} + +-- This collection of colors is partly a historic thing, partly something else + +local dyes = { + {"white", "White dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, + {"grey", "Grey dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, + {"dark_grey", "Dark grey dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, + {"black", "Black dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, + {"violet", "Violet dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, + {"blue", "Blue dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, + {"cyan", "Cyan dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, + {"dark_green", "Dark green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, + {"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, + {"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, + {"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, + {"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, + {"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1, unicolor_red_violet=1}}, + {"pink", "Pink dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, +} + +-- Define items + +for _, row in ipairs(dyes) do + local name = row[1] + local description = row[2] + local groups = row[3] + local item_name = "dye:" .. name + local item_image = "dye_" .. name .. ".png" + minetest.register_craftitem(item_name, { + inventory_image = item_image, + description = description, + groups = groups + }) + minetest.register_craft({ + type = "shapeless", + output = item_name .. " 4", + recipe = {"group:flower,color_" .. name}, + }) +end + +-- Manually add coal->black dye + +minetest.register_craft({ + type = "shapeless", + output = "dye:black 4", + recipe = {"group:coal"}, +}) + +-- Mix recipes +local dye_recipes = { + -- src1, src2, dst + -- RYB mixes + {"red", "blue", "violet"}, -- "purple" + {"yellow", "red", "orange"}, + {"yellow", "blue", "green"}, + -- RYB complementary mixes + {"yellow", "violet", "dark_grey"}, + {"blue", "orange", "dark_grey"}, + -- CMY mixes - approximation + {"cyan", "yellow", "green"}, + {"cyan", "magenta", "blue"}, + {"yellow", "magenta", "red"}, + -- other mixes that result in a color we have + {"red", "green", "brown"}, + {"magenta", "blue", "violet"}, + {"green", "blue", "cyan"}, + {"pink", "violet", "magenta"}, + -- mixes with black + {"white", "black", "grey"}, + {"grey", "black", "dark_grey"}, + {"green", "black", "dark_green"}, + {"orange", "black", "brown"}, + -- mixes with white + {"white", "red", "pink"}, + {"white", "dark_grey", "grey"}, + {"white", "dark_green", "green"}, +} + +for _, mix in pairs(dye_recipes) do + minetest.register_craft({ + type = "shapeless", + output = 'dye:' .. mix[3] .. ' 2', + recipe = {'dye:' .. mix[1], 'dye:' .. mix[2]}, + }) +end diff --git a/mods/dye/license.txt b/mods/dye/license.txt new file mode 100644 index 0000000..bf9d350 --- /dev/null +++ b/mods/dye/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/dye/textures/dye_black.png b/mods/dye/textures/dye_black.png new file mode 100644 index 0000000..1055b6c Binary files /dev/null and b/mods/dye/textures/dye_black.png differ diff --git a/mods/dye/textures/dye_blue.png b/mods/dye/textures/dye_blue.png new file mode 100644 index 0000000..d1377c6 Binary files /dev/null and b/mods/dye/textures/dye_blue.png differ diff --git a/mods/dye/textures/dye_brown.png b/mods/dye/textures/dye_brown.png new file mode 100644 index 0000000..77d475c Binary files /dev/null and b/mods/dye/textures/dye_brown.png differ diff --git a/mods/dye/textures/dye_cyan.png b/mods/dye/textures/dye_cyan.png new file mode 100644 index 0000000..239d66c Binary files /dev/null and b/mods/dye/textures/dye_cyan.png differ diff --git a/mods/dye/textures/dye_dark_green.png b/mods/dye/textures/dye_dark_green.png new file mode 100644 index 0000000..9606ccf Binary files /dev/null and b/mods/dye/textures/dye_dark_green.png differ diff --git a/mods/dye/textures/dye_dark_grey.png b/mods/dye/textures/dye_dark_grey.png new file mode 100644 index 0000000..060737b Binary files /dev/null and b/mods/dye/textures/dye_dark_grey.png differ diff --git a/mods/dye/textures/dye_green.png b/mods/dye/textures/dye_green.png new file mode 100644 index 0000000..0d99ee1 Binary files /dev/null and b/mods/dye/textures/dye_green.png differ diff --git a/mods/dye/textures/dye_grey.png b/mods/dye/textures/dye_grey.png new file mode 100644 index 0000000..5efb028 Binary files /dev/null and b/mods/dye/textures/dye_grey.png differ diff --git a/mods/dye/textures/dye_magenta.png b/mods/dye/textures/dye_magenta.png new file mode 100644 index 0000000..c84df62 Binary files /dev/null and b/mods/dye/textures/dye_magenta.png differ diff --git a/mods/dye/textures/dye_orange.png b/mods/dye/textures/dye_orange.png new file mode 100644 index 0000000..0844907 Binary files /dev/null and b/mods/dye/textures/dye_orange.png differ diff --git a/mods/dye/textures/dye_pink.png b/mods/dye/textures/dye_pink.png new file mode 100644 index 0000000..c3dec22 Binary files /dev/null and b/mods/dye/textures/dye_pink.png differ diff --git a/mods/dye/textures/dye_red.png b/mods/dye/textures/dye_red.png new file mode 100644 index 0000000..14eafbf Binary files /dev/null and b/mods/dye/textures/dye_red.png differ diff --git a/mods/dye/textures/dye_violet.png b/mods/dye/textures/dye_violet.png new file mode 100644 index 0000000..600cbb4 Binary files /dev/null and b/mods/dye/textures/dye_violet.png differ diff --git a/mods/dye/textures/dye_white.png b/mods/dye/textures/dye_white.png new file mode 100644 index 0000000..2a840a4 Binary files /dev/null and b/mods/dye/textures/dye_white.png differ diff --git a/mods/dye/textures/dye_yellow.png b/mods/dye/textures/dye_yellow.png new file mode 100644 index 0000000..fe75775 Binary files /dev/null and b/mods/dye/textures/dye_yellow.png differ diff --git a/mods/farming/README.txt b/mods/farming/README.txt new file mode 100644 index 0000000..3ccd8c3 --- /dev/null +++ b/mods/farming/README.txt @@ -0,0 +1,37 @@ +Minetest Game mod: farming +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +webdesigner97 (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Created by PilzAdam (CC BY 3.0): + farming_bread.png + farming_soil.png + farming_soil_wet.png + farming_soil_wet_side.png + farming_string.png + +Created by BlockMen (CC BY 3.0): + farming_tool_diamondhoe.png + farming_tool_mesehoe.png + farming_tool_bronzehoe.png + farming_tool_steelhoe.png + farming_tool_stonehoe.png + farming_tool_woodhoe.png + +Created by MasterGollum (CC BY 3.0): + farming_straw.png + +Created by Gambit (CC BY 3.0): + farming_wheat.png + farming_wheat_*.png + farming_cotton_*.png + farming_flour.png + farming_cotton_seed.png + farming_wheat_seed.png diff --git a/mods/farming/api.lua b/mods/farming/api.lua new file mode 100644 index 0000000..35a77e9 --- /dev/null +++ b/mods/farming/api.lua @@ -0,0 +1,404 @@ + +-- Wear out hoes, place soil +-- TODO Ignore group:flower +farming.registered_plants = {} + +farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") ~= 1 then + return + end + + -- check if (wet) soil defined + local regN = minetest.registered_nodes + if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then + return + end + + if minetest.is_protected(pt.under, user:get_player_name()) then + minetest.record_protection_violation(pt.under, user:get_player_name()) + return + end + if minetest.is_protected(pt.above, user:get_player_name()) then + minetest.record_protection_violation(pt.above, user:get_player_name()) + return + end + + -- turn the node into soil and play sound + minetest.set_node(pt.under, {name = regN[under.name].soil.dry}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.5, + }) + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(user:get_player_name())) then + -- wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear(65535/(uses-1)) + -- tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5}) + end + end + return itemstack +end + +-- Register new hoes +farming.register_hoe = function(name, def) + -- Check for : prefix (register new hoes in your mod's namespace) + if name:sub(1,1) ~= ":" then + name = ":" .. name + end + -- Check def table + if def.description == nil then + def.description = "Hoe" + end + if def.inventory_image == nil then + def.inventory_image = "unknown_item.png" + end + if def.recipe == nil then + def.recipe = { + {"air","air",""}, + {"","group:stick",""}, + {"","group:stick",""} + } + end + if def.max_uses == nil then + def.max_uses = 30 + end + -- Register the tool + minetest.register_tool(name, { + description = def.description, + inventory_image = def.inventory_image, + on_use = function(itemstack, user, pointed_thing) + return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) + end, + groups = def.groups, + sound = {breaks = "default_tool_breaks"}, + }) + -- Register its recipe + if def.material == nil then + minetest.register_craft({ + output = name:sub(2), + recipe = def.recipe + }) + else + minetest.register_craft({ + output = name:sub(2), + recipe = { + {def.material, def.material, ""}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + -- Reverse Recipe + minetest.register_craft({ + output = name:sub(2), + recipe = { + {"", def.material, def.material}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + end +end + +-- how often node timers for plants will tick, +/- some random value +local function tick(pos) + minetest.get_node_timer(pos):start(math.random(166, 286)) +end +-- how often a growth failure tick is retried (e.g. too dark) +local function tick_again(pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +-- Seed placement +farming.place_seed = function(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + if minetest.is_protected(pt.under, placer:get_player_name()) then + minetest.record_protection_violation(pt.under, placer:get_player_name()) + return + end + if minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.record_protection_violation(pt.above, placer:get_player_name()) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") < 2 then + return itemstack + end + + -- add the node and remove 1 item from the itemstack + minetest.add_node(pt.above, {name = plantname, param2 = 1}) + tick(pt.above) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + return itemstack +end + +farming.grow_plant = function(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + -- disable timer for fully grown plant + return + end + + -- grow seed + if minetest.get_item_group(node.name, "seed") and def.fertility then + local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not soil_node then + tick_again(pos) + return + end + -- omitted is a check for light, we assume seeds can germinate in the dark. + for _, v in pairs(def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 then + local placenode = {name = def.next_plant} + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + return + end + end + end + + return + end + + -- check if on wet soil + local below = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}) + if minetest.get_item_group(below.name, "soil") < 3 then + tick_again(pos) + return + end + + -- check light + local light = minetest.get_node_light(pos) + if not light or light < def.minlight or light > def.maxlight then + tick_again(pos) + return + end + + -- grow + local placenode = {name = def.next_plant} + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + + -- new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + end + return +end + +-- Register plants +farming.register_plant = function(name, def) + local mname = name:split(":")[1] + local pname = name:split(":")[2] + + -- Check def table + if not def.description then + def.description = "Seed" + end + if not def.inventory_image then + def.inventory_image = "unknown_item.png" + end + if not def.steps then + return nil + end + if not def.minlight then + def.minlight = 1 + end + if not def.maxlight then + def.maxlight = 14 + end + if not def.fertility then + def.fertility = {} + end + + farming.registered_plants[pname] = def + + -- Register seed + local lbm_nodes = {mname .. ":seed_" .. pname} + local g = {seed = 1, snappy = 3, attached_node = 1, flammable = 2} + for k, v in pairs(def.fertility) do + g[v] = 1 + end + minetest.register_node(":" .. mname .. ":seed_" .. pname, { + description = def.description, + tiles = {def.inventory_image}, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = "signlike", + groups = g, + paramtype = "light", + paramtype2 = "wallmounted", + place_param2 = def.place_param2 or nil, -- this isn't actually used for placement + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + fertility = def.fertility, + sounds = default.node_sound_dirt_defaults({ + dig = {name = "", gain = 0}, + dug = {name = "default_grass_footstep", gain = 0.2}, + place = {name = "default_place_node", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname) + end, + next_plant = mname .. ":" .. pname .. "_1", + on_timer = farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + }) + + -- Register harvest + minetest.register_craftitem(":" .. mname .. ":" .. pname, { + description = pname:gsub("^%l", string.upper), + inventory_image = mname .. "_" .. pname .. ".png", + groups = {flammable = 2}, + }) + + -- Register growing steps + for i = 1, def.steps do + local base_rarity = 1 + if def.steps ~= 1 then + base_rarity = 8 - (i - 1) * 7 / (def.steps - 1) + end + local drop = { + items = { + {items = {mname .. ":" .. pname}, rarity = base_rarity}, + {items = {mname .. ":" .. pname}, rarity = base_rarity * 2}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity * 2}, + } + } + local nodegroups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1} + nodegroups[pname] = i + + local next_plant = nil + + if i < def.steps then + next_plant = mname .. ":" .. pname .. "_" .. (i + 1) + lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i + end + + minetest.register_node(":" .. mname .. ":" .. pname .. "_" .. i, { + drawtype = "plantlike", + waving = 1, + tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"}, + paramtype = "light", + paramtype2 = def.paramtype2 or nil, + place_param2 = def.place_param2 or nil, + walkable = false, + buildable_to = true, + drop = drop, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + groups = nodegroups, + sounds = default.node_sound_leaves_defaults(), + next_plant = next_plant, + on_timer = farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + }) + end + + -- replacement LBM for pre-nodetimer plants + minetest.register_lbm({ + name = ":" .. mname .. ":start_nodetimer_" .. pname, + nodenames = lbm_nodes, + action = function(pos, node) + tick_again(pos) + end, + }) + + -- Return + local r = { + seed = mname .. ":seed_" .. pname, + harvest = mname .. ":" .. pname + } + return r +end diff --git a/mods/farming/depends.txt b/mods/farming/depends.txt new file mode 100644 index 0000000..470ec30 --- /dev/null +++ b/mods/farming/depends.txt @@ -0,0 +1,2 @@ +default +wool diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua new file mode 100644 index 0000000..5aae390 --- /dev/null +++ b/mods/farming/hoes.lua @@ -0,0 +1,42 @@ +farming.register_hoe(":farming:hoe_wood", { + description = "Wooden Hoe", + inventory_image = "farming_tool_woodhoe.png", + max_uses = 30, + material = "group:wood", + groups = {flammable = 2}, +}) + +farming.register_hoe(":farming:hoe_stone", { + description = "Stone Hoe", + inventory_image = "farming_tool_stonehoe.png", + max_uses = 90, + material = "group:stone" +}) + +farming.register_hoe(":farming:hoe_steel", { + description = "Steel Hoe", + inventory_image = "farming_tool_steelhoe.png", + max_uses = 200, + material = "default:steel_ingot" +}) + +farming.register_hoe(":farming:hoe_bronze", { + description = "Bronze Hoe", + inventory_image = "farming_tool_bronzehoe.png", + max_uses = 220, + material = "default:bronze_ingot" +}) + +farming.register_hoe(":farming:hoe_mese", { + description = "Mese Hoe", + inventory_image = "farming_tool_mesehoe.png", + max_uses = 350, + material = "default:mese_crystal" +}) + +farming.register_hoe(":farming:hoe_diamond", { + description = "Diamond Hoe", + inventory_image = "farming_tool_diamondhoe.png", + max_uses = 500, + material = "default:diamond" +}) diff --git a/mods/farming/init.lua b/mods/farming/init.lua new file mode 100644 index 0000000..97dc9b4 --- /dev/null +++ b/mods/farming/init.lua @@ -0,0 +1,109 @@ +-- Global farming namespace +farming = {} +farming.path = minetest.get_modpath("farming") + +-- Load files +dofile(farming.path .. "/api.lua") +dofile(farming.path .. "/nodes.lua") +dofile(farming.path .. "/hoes.lua") + +-- WHEAT +farming.register_plant("farming:wheat", { + description = "Wheat seed", + paramtype2 = "meshoptions", + inventory_image = "farming_wheat_seed.png", + steps = 8, + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"grassland"}, + groups = {flammable = 4}, + place_param2 = 3, +}) +minetest.register_craftitem("farming:flour", { + description = "Flour", + inventory_image = "farming_flour.png", + groups = {flammable = 1}, +}) + +minetest.register_craftitem("farming:bread", { + description = "Bread", + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(5), + groups = {flammable = 2}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "farming:flour", + recipe = {"farming:wheat", "farming:wheat", "farming:wheat", "farming:wheat"} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" +}) + +-- Cotton +farming.register_plant("farming:cotton", { + description = "Cotton seed", + inventory_image = "farming_cotton_seed.png", + steps = 8, + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"grassland", "desert"}, + groups = {flammable = 4}, +}) + +minetest.register_alias("farming:string", "farming:cotton") + +minetest.register_craft({ + output = "wool:white", + recipe = { + {"farming:cotton", "farming:cotton"}, + {"farming:cotton", "farming:cotton"}, + } +}) + +-- Straw +minetest.register_craft({ + output = "farming:straw 3", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + } +}) + +minetest.register_craft({ + output = "farming:wheat 3", + recipe = { + {"farming:straw"}, + } +}) + +-- Fuels +minetest.register_craft({ + type = "fuel", + recipe = "farming:straw", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:wheat", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:cotton", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:hoe_wood", + burntime = 5, +}) diff --git a/mods/farming/license.txt b/mods/farming/license.txt new file mode 100644 index 0000000..8cbb63a --- /dev/null +++ b/mods/farming/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 webdesigner97 +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 MasterGollum +Copyright (C) 2015-2016 Gambit + +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/3.0/ diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua new file mode 100644 index 0000000..c969d31 --- /dev/null +++ b/mods/farming/nodes.lua @@ -0,0 +1,171 @@ +minetest.override_item("default:dirt", { + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_grass", { + soil = { + base = "default:dirt_with_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_dry_grass", { + soil = { + base = "default:dirt_with_dry_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_rainforest_litter", { + soil = { + base = "default:dirt_with_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("farming:soil", { + description = "Soil", + tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("farming:soil_wet", { + description = "Wet Soil", + tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:desert_sand", { + groups = {crumbly=3, falling_node=1, sand=1, soil = 1}, + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) +minetest.register_node("farming:desert_sand_soil", { + description = "Desert Sand Soil", + drop = "default:desert_sand", + tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"}, + groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1}, + sounds = default.node_sound_sand_defaults(), + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) + +minetest.register_node("farming:desert_sand_soil_wet", { + description = "Wet Desert Sand Soil", + drop = "default:desert_sand", + tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"}, + groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1}, + sounds = default.node_sound_sand_defaults(), + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) + +minetest.register_node("farming:straw", { + description = "Straw", + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {snappy=3, flammable=4, fall_damage_add_percent=-30}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_abm({ + label = "Farming soil", + nodenames = {"group:field"}, + interval = 15, + chance = 4, + action = function(pos, node) + local n_def = minetest.registered_nodes[node.name] or nil + local wet = n_def.soil.wet or nil + local base = n_def.soil.base or nil + local dry = n_def.soil.dry or nil + if not n_def or not n_def.soil or not wet or not base or not dry then + return + end + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + if not nn or not nn.name then + return + end + local nn_def = minetest.registered_nodes[nn.name] or nil + pos.y = pos.y - 1 + + if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then + minetest.set_node(pos, {name = base}) + return + end + -- check if there is water nearby + local wet_lvl = minetest.get_item_group(node.name, "wet") + if minetest.find_node_near(pos, 3, {"group:water"}) then + -- if it is dry soil and not base node, turn it into wet soil + if wet_lvl == 0 then + minetest.set_node(pos, {name = wet}) + end + else + -- only turn back if there are no unloaded blocks (and therefore + -- possible water sources) nearby + if not minetest.find_node_near(pos, 3, {"ignore"}) then + -- turn it back into base if it is already dry + if wet_lvl == 0 then + -- only turn it back if there is no plant/seed on top of it + if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then + minetest.set_node(pos, {name = base}) + end + + -- if its wet turn it back into dry soil + elseif wet_lvl == 1 then + minetest.set_node(pos, {name = dry}) + end + end + end + end, +}) + + +for i = 1, 5 do + minetest.override_item("default:grass_"..i, {drop = { + max_items = 1, + items = { + {items = {'farming:seed_wheat'},rarity = 5}, + {items = {'default:grass_1'}}, + } + }}) +end + +minetest.override_item("default:junglegrass", {drop = { + max_items = 1, + items = { + {items = {'farming:seed_cotton'},rarity = 8}, + {items = {'default:junglegrass'}}, + } +}}) diff --git a/mods/farming/textures/farming_bread.png b/mods/farming/textures/farming_bread.png new file mode 100644 index 0000000..0c25678 Binary files /dev/null and b/mods/farming/textures/farming_bread.png differ diff --git a/mods/farming/textures/farming_cotton.png b/mods/farming/textures/farming_cotton.png new file mode 100644 index 0000000..e2bbfd7 Binary files /dev/null and b/mods/farming/textures/farming_cotton.png differ diff --git a/mods/farming/textures/farming_cotton_1.png b/mods/farming/textures/farming_cotton_1.png new file mode 100644 index 0000000..5fc2180 Binary files /dev/null and b/mods/farming/textures/farming_cotton_1.png differ diff --git a/mods/farming/textures/farming_cotton_2.png b/mods/farming/textures/farming_cotton_2.png new file mode 100644 index 0000000..db4f4a3 Binary files /dev/null and b/mods/farming/textures/farming_cotton_2.png differ diff --git a/mods/farming/textures/farming_cotton_3.png b/mods/farming/textures/farming_cotton_3.png new file mode 100644 index 0000000..df3d7a7 Binary files /dev/null and b/mods/farming/textures/farming_cotton_3.png differ diff --git a/mods/farming/textures/farming_cotton_4.png b/mods/farming/textures/farming_cotton_4.png new file mode 100644 index 0000000..f314b07 Binary files /dev/null and b/mods/farming/textures/farming_cotton_4.png differ diff --git a/mods/farming/textures/farming_cotton_5.png b/mods/farming/textures/farming_cotton_5.png new file mode 100644 index 0000000..3e89085 Binary files /dev/null and b/mods/farming/textures/farming_cotton_5.png differ diff --git a/mods/farming/textures/farming_cotton_6.png b/mods/farming/textures/farming_cotton_6.png new file mode 100644 index 0000000..f4bd4fb Binary files /dev/null and b/mods/farming/textures/farming_cotton_6.png differ diff --git a/mods/farming/textures/farming_cotton_7.png b/mods/farming/textures/farming_cotton_7.png new file mode 100644 index 0000000..466d40a Binary files /dev/null and b/mods/farming/textures/farming_cotton_7.png differ diff --git a/mods/farming/textures/farming_cotton_8.png b/mods/farming/textures/farming_cotton_8.png new file mode 100644 index 0000000..f835ba5 Binary files /dev/null and b/mods/farming/textures/farming_cotton_8.png differ diff --git a/mods/farming/textures/farming_cotton_seed.png b/mods/farming/textures/farming_cotton_seed.png new file mode 100644 index 0000000..f1d5b8a Binary files /dev/null and b/mods/farming/textures/farming_cotton_seed.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil.png b/mods/farming/textures/farming_desert_sand_soil.png new file mode 100644 index 0000000..3c09ef0 Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil_wet.png b/mods/farming/textures/farming_desert_sand_soil_wet.png new file mode 100644 index 0000000..facc83e Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil_wet.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil_wet_side.png b/mods/farming/textures/farming_desert_sand_soil_wet_side.png new file mode 100644 index 0000000..41e5a04 Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil_wet_side.png differ diff --git a/mods/farming/textures/farming_flour.png b/mods/farming/textures/farming_flour.png new file mode 100644 index 0000000..b1a9783 Binary files /dev/null and b/mods/farming/textures/farming_flour.png differ diff --git a/mods/farming/textures/farming_soil.png b/mods/farming/textures/farming_soil.png new file mode 100644 index 0000000..5cd3e68 Binary files /dev/null and b/mods/farming/textures/farming_soil.png differ diff --git a/mods/farming/textures/farming_soil_wet.png b/mods/farming/textures/farming_soil_wet.png new file mode 100644 index 0000000..0b4487d Binary files /dev/null and b/mods/farming/textures/farming_soil_wet.png differ diff --git a/mods/farming/textures/farming_soil_wet_side.png b/mods/farming/textures/farming_soil_wet_side.png new file mode 100644 index 0000000..f0b1bd4 Binary files /dev/null and b/mods/farming/textures/farming_soil_wet_side.png differ diff --git a/mods/farming/textures/farming_straw.png b/mods/farming/textures/farming_straw.png new file mode 100644 index 0000000..f9f5fe7 Binary files /dev/null and b/mods/farming/textures/farming_straw.png differ diff --git a/mods/farming/textures/farming_tool_bronzehoe.png b/mods/farming/textures/farming_tool_bronzehoe.png new file mode 100644 index 0000000..2802d11 Binary files /dev/null and b/mods/farming/textures/farming_tool_bronzehoe.png differ diff --git a/mods/farming/textures/farming_tool_diamondhoe.png b/mods/farming/textures/farming_tool_diamondhoe.png new file mode 100644 index 0000000..66f1042 Binary files /dev/null and b/mods/farming/textures/farming_tool_diamondhoe.png differ diff --git a/mods/farming/textures/farming_tool_mesehoe.png b/mods/farming/textures/farming_tool_mesehoe.png new file mode 100644 index 0000000..4534fba Binary files /dev/null and b/mods/farming/textures/farming_tool_mesehoe.png differ diff --git a/mods/farming/textures/farming_tool_steelhoe.png b/mods/farming/textures/farming_tool_steelhoe.png new file mode 100644 index 0000000..d057af2 Binary files /dev/null and b/mods/farming/textures/farming_tool_steelhoe.png differ diff --git a/mods/farming/textures/farming_tool_stonehoe.png b/mods/farming/textures/farming_tool_stonehoe.png new file mode 100644 index 0000000..55d8123 Binary files /dev/null and b/mods/farming/textures/farming_tool_stonehoe.png differ diff --git a/mods/farming/textures/farming_tool_woodhoe.png b/mods/farming/textures/farming_tool_woodhoe.png new file mode 100644 index 0000000..a287152 Binary files /dev/null and b/mods/farming/textures/farming_tool_woodhoe.png differ diff --git a/mods/farming/textures/farming_wheat.png b/mods/farming/textures/farming_wheat.png new file mode 100644 index 0000000..1e0ad3b Binary files /dev/null and b/mods/farming/textures/farming_wheat.png differ diff --git a/mods/farming/textures/farming_wheat_1.png b/mods/farming/textures/farming_wheat_1.png new file mode 100644 index 0000000..c16ad94 Binary files /dev/null and b/mods/farming/textures/farming_wheat_1.png differ diff --git a/mods/farming/textures/farming_wheat_2.png b/mods/farming/textures/farming_wheat_2.png new file mode 100644 index 0000000..baddb4c Binary files /dev/null and b/mods/farming/textures/farming_wheat_2.png differ diff --git a/mods/farming/textures/farming_wheat_3.png b/mods/farming/textures/farming_wheat_3.png new file mode 100644 index 0000000..36ebb19 Binary files /dev/null and b/mods/farming/textures/farming_wheat_3.png differ diff --git a/mods/farming/textures/farming_wheat_4.png b/mods/farming/textures/farming_wheat_4.png new file mode 100644 index 0000000..735ed77 Binary files /dev/null and b/mods/farming/textures/farming_wheat_4.png differ diff --git a/mods/farming/textures/farming_wheat_5.png b/mods/farming/textures/farming_wheat_5.png new file mode 100644 index 0000000..f40b5f0 Binary files /dev/null and b/mods/farming/textures/farming_wheat_5.png differ diff --git a/mods/farming/textures/farming_wheat_6.png b/mods/farming/textures/farming_wheat_6.png new file mode 100644 index 0000000..e9c78e0 Binary files /dev/null and b/mods/farming/textures/farming_wheat_6.png differ diff --git a/mods/farming/textures/farming_wheat_7.png b/mods/farming/textures/farming_wheat_7.png new file mode 100644 index 0000000..cc26ca9 Binary files /dev/null and b/mods/farming/textures/farming_wheat_7.png differ diff --git a/mods/farming/textures/farming_wheat_8.png b/mods/farming/textures/farming_wheat_8.png new file mode 100644 index 0000000..d050093 Binary files /dev/null and b/mods/farming/textures/farming_wheat_8.png differ diff --git a/mods/farming/textures/farming_wheat_seed.png b/mods/farming/textures/farming_wheat_seed.png new file mode 100644 index 0000000..a9031fb Binary files /dev/null and b/mods/farming/textures/farming_wheat_seed.png differ diff --git a/mods/fire/README.txt b/mods/fire/README.txt new file mode 100644 index 0000000..099da1c --- /dev/null +++ b/mods/fire/README.txt @@ -0,0 +1,35 @@ +Minetest Game mod: fire +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (textures and sounds) +-------------------------------------- +Everything not listed in here: +Copyright (C) 2012 Perttu Ahola (celeron55) (CC BY-SA 3.0) + +Muadtralk (CC BY-SA 3.0) + fire_basic_flame_animated.png + +Gambit (CC BY-SA 3.0) + fire_flint_steel.png + +dobroide (CC BY 3.0) +http://www.freesound.org/people/dobroide/sounds/4211/ + fire_small.ogg + +Dynamicell (CC BY 3.0) +http://www.freesound.org/people/Dynamicell/sounds/17548/ + fire_large.ogg + fire_fire.*.ogg + +fire_small.ogg and fire_large.ogg are unused but kept temporarily to not break +other mods that may use them. + +Benboncan (CC BY 3.0) +https://www.freesound.org/people/Benboncan/sounds/66457/ + fire_flint_and_steel.ogg diff --git a/mods/fire/depends.txt b/mods/fire/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/fire/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/fire/init.lua b/mods/fire/init.lua new file mode 100644 index 0000000..f97636b --- /dev/null +++ b/mods/fire/init.lua @@ -0,0 +1,365 @@ +-- Global namespace for functions + +fire = {} + + +-- +-- Items +-- + +-- Flame nodes + +minetest.register_node("fire:basic_flame", { + drawtype = "firelike", + tiles = { + { + name = "fire_basic_flame_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + }, + }, + }, + inventory_image = "fire_basic_flame.png", + paramtype = "light", + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + damage_per_second = 4, + groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1}, + on_timer = function(pos) + local f = minetest.find_node_near(pos, 1, {"group:flammable"}) + if not f then + minetest.remove_node(pos) + return + end + -- Restart timer + return true + end, + drop = "", + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(30, 60)) + end, +}) + +minetest.register_node("fire:permanent_flame", { + description = "Permanent Flame", + drawtype = "firelike", + tiles = { + { + name = "fire_basic_flame_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + }, + }, + }, + inventory_image = "fire_basic_flame.png", + paramtype = "light", + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + damage_per_second = 4, + groups = {igniter = 2, dig_immediate = 3}, + drop = "", +}) + + +-- Flint and steel + +minetest.register_tool("fire:flint_and_steel", { + description = "Flint and Steel", + inventory_image = "fire_flint_steel.png", + sound = {breaks = "default_tool_breaks"}, + + on_use = function(itemstack, user, pointed_thing) + local sound_pos = pointed_thing.above or user:get_pos() + minetest.sound_play( + "fire_flint_and_steel", + {pos = sound_pos, gain = 0.5, max_hear_distance = 8} + ) + local player_name = user:get_player_name() + if pointed_thing.type == "node" then + local node_under = minetest.get_node(pointed_thing.under).name + local nodedef = minetest.registered_nodes[node_under] + if not nodedef then + return + end + if minetest.is_protected(pointed_thing.under, player_name) then + minetest.chat_send_player(player_name, "This area is protected") + return + end + if nodedef.on_ignite then + nodedef.on_ignite(pointed_thing.under, user) + elseif minetest.get_item_group(node_under, "flammable") >= 1 + and minetest.get_node(pointed_thing.above).name == "air" then + minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"}) + end + end + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + -- Wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear(1000) + -- Tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = sound_pos, gain = 0.5}) + end + return itemstack + end + end +}) + +minetest.register_craft({ + output = "fire:flint_and_steel", + recipe = { + {"default:flint", "default:steel_ingot"} + } +}) + + +-- Override coalblock to enable permanent flame above +-- Coalblock is non-flammable to avoid unwanted basic_flame nodes + +minetest.override_item("default:coalblock", { + after_destruct = function(pos, oldnode) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == "fire:permanent_flame" then + minetest.remove_node(pos) + end + end, + on_ignite = function(pos, igniter) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node(flame_pos).name == "air" then + minetest.set_node(flame_pos, {name = "fire:permanent_flame"}) + end + end, +}) + + +-- +-- Sound +-- + +local flame_sound = minetest.settings:get_bool("flame_sound") +if flame_sound == nil then + -- Enable if no setting present + flame_sound = true +end + +if flame_sound then + + local handles = {} + local timer = 0 + + -- Parameters + + local radius = 8 -- Flame node search radius around player + local cycle = 3 -- Cycle time for sound updates + + -- Update sound for player + + function fire.update_player_sound(player) + local player_name = player:get_player_name() + -- Search for flame nodes in radius around player + local ppos = player:getpos() + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + local fpos, num = minetest.find_nodes_in_area( + areamin, + areamax, + {"fire:basic_flame", "fire:permanent_flame"} + ) + -- Total number of flames in radius + local flames = (num["fire:basic_flame"] or 0) + + (num["fire:permanent_flame"] or 0) + -- Stop previous sound + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + -- If flames + if flames > 0 then + -- Find centre of flame positions + local fposmid = fpos[1] + -- If more than 1 flame + if #fpos > 1 then + local fposmin = areamax + local fposmax = areamin + for i = 1, #fpos do + local fposi = fpos[i] + if fposi.x > fposmax.x then + fposmax.x = fposi.x + end + if fposi.y > fposmax.y then + fposmax.y = fposi.y + end + if fposi.z > fposmax.z then + fposmax.z = fposi.z + end + if fposi.x < fposmin.x then + fposmin.x = fposi.x + end + if fposi.y < fposmin.y then + fposmin.y = fposi.y + end + if fposi.z < fposmin.z then + fposmin.z = fposi.z + end + end + fposmid = vector.divide(vector.add(fposmin, fposmax), 2) + end + -- Play sound + local handle = minetest.sound_play( + "fire_fire", + { + pos = fposmid, + to_player = player_name, + gain = math.min(0.06 * (1 + flames * 0.125), 0.18), + max_hear_distance = 32, + loop = true, -- In case of lag + } + ) + -- Store sound handle for this player + if handle then + handles[player_name] = handle + end + end + end + + -- Cycle for updating players sounds + + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < cycle then + return + end + + timer = 0 + local players = minetest.get_connected_players() + for n = 1, #players do + fire.update_player_sound(players[n]) + end + end) + + -- Stop sound and clear handle on player leave + + minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + end) +end + + +-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it + +function fire.update_sounds_around(pos) +end + + +-- +-- ABMs +-- + +-- Extinguish all flames quickly with water, snow, ice + +minetest.register_abm({ + label = "Extinguish flame", + nodenames = {"fire:basic_flame", "fire:permanent_flame"}, + neighbors = {"group:puts_out_fire"}, + interval = 3, + chance = 1, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.remove_node(pos) + minetest.sound_play("fire_extinguish_flame", + {pos = pos, max_hear_distance = 16, gain = 0.15}) + end, +}) + + +-- Enable the following ABMs according to 'enable fire' setting + +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.settings:get_bool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end +end + +if not fire_enabled then + + -- Remove basic flames only if fire disabled + + minetest.register_abm({ + label = "Remove disabled fire", + nodenames = {"fire:basic_flame"}, + interval = 7, + chance = 1, + catch_up = false, + action = minetest.remove_node, + }) + +else -- Fire enabled + + -- Ignite neighboring nodes, add basic flames + + minetest.register_abm({ + label = "Ignite flame", + nodenames = {"group:flammable"}, + neighbors = {"group:igniter"}, + interval = 7, + chance = 12, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + -- If there is water or stuff like that around node, don't ignite + if minetest.find_node_near(pos, 1, {"group:puts_out_fire"}) then + return + end + local p = minetest.find_node_near(pos, 1, {"air"}) + if p then + minetest.set_node(p, {name = "fire:basic_flame"}) + end + end, + }) + + -- Remove flammable nodes around basic flame + + minetest.register_abm({ + label = "Remove flammable nodes", + nodenames = {"fire:basic_flame"}, + neighbors = "group:flammable", + interval = 5, + chance = 18, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + local p = minetest.find_node_near(pos, 1, {"group:flammable"}) + if p then + local flammable_node = minetest.get_node(p) + local def = minetest.registered_nodes[flammable_node.name] + if def.on_burn then + def.on_burn(p) + else + minetest.remove_node(p) + minetest.check_for_falling(p) + end + end + end, + }) + +end diff --git a/mods/fire/license.txt b/mods/fire/license.txt new file mode 100644 index 0000000..43f9cd7 --- /dev/null +++ b/mods/fire/license.txt @@ -0,0 +1,84 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures and sounds) +--------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Muadtralk +Copyright (C) 2013-2016 Gambit + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2005 dobroide +Copyright (C) 2006 Dynamicell +Copyright (C) 2009 Benboncan + +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/3.0/ diff --git a/mods/fire/sounds/fire_extinguish_flame.1.ogg b/mods/fire/sounds/fire_extinguish_flame.1.ogg new file mode 100644 index 0000000..42506dd Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.1.ogg differ diff --git a/mods/fire/sounds/fire_extinguish_flame.2.ogg b/mods/fire/sounds/fire_extinguish_flame.2.ogg new file mode 100644 index 0000000..2747ab8 Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.2.ogg differ diff --git a/mods/fire/sounds/fire_extinguish_flame.3.ogg b/mods/fire/sounds/fire_extinguish_flame.3.ogg new file mode 100644 index 0000000..8baeac3 Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.3.ogg differ diff --git a/mods/fire/sounds/fire_fire.1.ogg b/mods/fire/sounds/fire_fire.1.ogg new file mode 100644 index 0000000..cbfee4c Binary files /dev/null and b/mods/fire/sounds/fire_fire.1.ogg differ diff --git a/mods/fire/sounds/fire_fire.2.ogg b/mods/fire/sounds/fire_fire.2.ogg new file mode 100644 index 0000000..e8d0eb1 Binary files /dev/null and b/mods/fire/sounds/fire_fire.2.ogg differ diff --git a/mods/fire/sounds/fire_fire.3.ogg b/mods/fire/sounds/fire_fire.3.ogg new file mode 100644 index 0000000..5cad3d9 Binary files /dev/null and b/mods/fire/sounds/fire_fire.3.ogg differ diff --git a/mods/fire/sounds/fire_flint_and_steel.ogg b/mods/fire/sounds/fire_flint_and_steel.ogg new file mode 100644 index 0000000..6996e16 Binary files /dev/null and b/mods/fire/sounds/fire_flint_and_steel.ogg differ diff --git a/mods/fire/sounds/fire_large.ogg b/mods/fire/sounds/fire_large.ogg new file mode 100644 index 0000000..fe78e62 Binary files /dev/null and b/mods/fire/sounds/fire_large.ogg differ diff --git a/mods/fire/sounds/fire_small.ogg b/mods/fire/sounds/fire_small.ogg new file mode 100644 index 0000000..5aac595 Binary files /dev/null and b/mods/fire/sounds/fire_small.ogg differ diff --git a/mods/fire/textures/fire_basic_flame.png b/mods/fire/textures/fire_basic_flame.png new file mode 100644 index 0000000..1da0702 Binary files /dev/null and b/mods/fire/textures/fire_basic_flame.png differ diff --git a/mods/fire/textures/fire_basic_flame_animated.png b/mods/fire/textures/fire_basic_flame_animated.png new file mode 100644 index 0000000..1cdd9fd Binary files /dev/null and b/mods/fire/textures/fire_basic_flame_animated.png differ diff --git a/mods/fire/textures/fire_flint_steel.png b/mods/fire/textures/fire_flint_steel.png new file mode 100644 index 0000000..c262ebc Binary files /dev/null and b/mods/fire/textures/fire_flint_steel.png differ diff --git a/mods/flowers/README.txt b/mods/flowers/README.txt new file mode 100644 index 0000000..2a5e4de --- /dev/null +++ b/mods/flowers/README.txt @@ -0,0 +1,26 @@ +Minetest Game mod: flowers +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Ironzorg (MIT) and VanessaE (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +RHRhino (CC BY-SA 3.0): + flowers_dandelion_white.png + flowers_dandelion_yellow.png + flowers_geranium.png + flowers_rose.png + flowers_tulip.png + flowers_viola.png + +Gambit (CC BY-SA 3.0): + flowers_mushroom_brown.png + flowers_mushroom_red.png + flowers_waterlily.png + +yyt16384 (CC BY-SA 3.0): + flowers_waterlily_bottom.png, derived from Gambit's texture diff --git a/mods/flowers/depends.txt b/mods/flowers/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/flowers/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua new file mode 100644 index 0000000..cb5b219 --- /dev/null +++ b/mods/flowers/init.lua @@ -0,0 +1,304 @@ +-- Minetest 0.4 mod: default +-- See README.txt for licensing and other information. + + +-- Namespace for functions + +flowers = {} + + +-- Map Generation + +dofile(minetest.get_modpath("flowers") .. "/mapgen.lua") + + +-- +-- Flowers +-- + +-- Aliases for original flowers mod + +minetest.register_alias("flowers:flower_rose", "flowers:rose") +minetest.register_alias("flowers:flower_tulip", "flowers:tulip") +minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow") +minetest.register_alias("flowers:flower_geranium", "flowers:geranium") +minetest.register_alias("flowers:flower_viola", "flowers:viola") +minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white") + + +-- Flower registration + +local function add_simple_flower(name, desc, box, f_groups) + -- Common flowers' groups + f_groups.snappy = 3 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node("flowers:" .. name, { + description = desc, + drawtype = "plantlike", + waving = 1, + tiles = {"flowers_" .. name .. ".png"}, + inventory_image = "flowers_" .. name .. ".png", + wield_image = "flowers_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + buildable_to = true, + stack_max = 99, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box + } + }) +end + +flowers.datas = { + { + "rose", + "Rose", + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_red = 1, flammable = 1} + }, + { + "tulip", + "Orange Tulip", + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_orange = 1, flammable = 1} + }, + { + "dandelion_yellow", + "Yellow Dandelion", + {-2 / 16, -0.5, -2 / 16, 2 / 16, 4 / 16, 2 / 16}, + {color_yellow = 1, flammable = 1} + }, + { + "geranium", + "Blue Geranium", + {-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "viola", + "Viola", + {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}, + {color_violet = 1, flammable = 1} + }, + { + "dandelion_white", + "White dandelion", + {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, + {color_white = 1, flammable = 1} + }, +} + +for _,item in pairs(flowers.datas) do + add_simple_flower(unpack(item)) +end + + +-- Flower spread +-- Public function to enable override by mods + +function flowers.flower_spread(pos, node) + pos.y = pos.y - 1 + local under = minetest.get_node(pos) + pos.y = pos.y + 1 + -- Replace flora with dry shrub in desert sand and silver sand, + -- as this is the only way to generate them. + -- However, preserve grasses in sand dune biomes. + if minetest.get_item_group(under.name, "sand") == 1 and + under.name ~= "default:sand" then + minetest.set_node(pos, {name = "default:dry_shrub"}) + return + end + + if minetest.get_item_group(under.name, "soil") == 0 then + return + end + + local light = minetest.get_node_light(pos) + if not light or light < 13 then + return + end + + local pos0 = vector.subtract(pos, 4) + local pos1 = vector.add(pos, 4) + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then + return + end + + local soils = minetest.find_nodes_in_area_under_air( + pos0, pos1, "group:soil") + if #soils > 0 then + local seedling = soils[math.random(#soils)] + local seedling_above = + {x = seedling.x, y = seedling.y + 1, z = seedling.z} + light = minetest.get_node_light(seedling_above) + if not light or light < 13 or + -- Desert sand is in the soil group + minetest.get_node(seedling).name == "default:desert_sand" then + return + end + + minetest.set_node(seedling_above, {name = node.name}) + end +end + +minetest.register_abm({ + label = "Flower spread", + nodenames = {"group:flora"}, + interval = 13, + chance = 96, + action = function(...) + flowers.flower_spread(...) + end, +}) + + +-- +-- Mushrooms +-- + +minetest.register_node("flowers:mushroom_red", { + description = "Red Mushroom", + tiles = {"flowers_mushroom_red.png"}, + inventory_image = "flowers_mushroom_red.png", + wield_image = "flowers_mushroom_red.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(-5), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } +}) + +minetest.register_node("flowers:mushroom_brown", { + description = "Brown Mushroom", + tiles = {"flowers_mushroom_brown.png"}, + inventory_image = "flowers_mushroom_brown.png", + wield_image = "flowers_mushroom_brown.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(1), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } +}) + + +-- Mushroom spread and death + +minetest.register_abm({ + label = "Mushroom spread", + nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, + interval = 11, + chance = 50, + action = function(pos, node) + if minetest.get_node_light(pos, nil) == 15 then + minetest.remove_node(pos) + return + end + local random = { + x = pos.x + math.random(-2, 2), + y = pos.y + math.random(-1, 1), + z = pos.z + math.random(-2, 2) + } + local random_node = minetest.get_node_or_nil(random) + if not random_node or random_node.name ~= "air" then + return + end + local node_under = minetest.get_node_or_nil({x = random.x, + y = random.y - 1, z = random.z}) + if not node_under then + return + end + + if (minetest.get_item_group(node_under.name, "soil") ~= 0 or + minetest.get_item_group(node_under.name, "tree") ~= 0) and + minetest.get_node_light(pos, 0.5) <= 3 and + minetest.get_node_light(random, 0.5) <= 3 then + minetest.set_node(random, {name = node.name}) + end + end +}) + + +-- These old mushroom related nodes can be simplified now + +minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown") +minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red") +minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown") +minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red") +minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown") +minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red") + + +-- +-- Waterlily +-- + +minetest.register_node("flowers:waterlily", { + description = "Waterlily", + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"}, + inventory_image = "flowers_waterlily.png", + wield_image = "flowers_waterlily.png", + liquids_pointable = true, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + groups = {snappy = 3, flower = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + node_placement_prediction = "", + node_box = { + type = "fixed", + fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5} + }, + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16} + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under).name + local def = minetest.registered_nodes[node] + local player_name = placer:get_player_name() + + if def and def.liquidtype == "source" and + minetest.get_item_group(node, "water") > 0 then + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = "flowers:waterlily", + param2 = math.random(0, 3)}) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +}) diff --git a/mods/flowers/license.txt b/mods/flowers/license.txt new file mode 100644 index 0000000..d301162 --- /dev/null +++ b/mods/flowers/license.txt @@ -0,0 +1,62 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Ironzorg, VanessaE +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 RHRhino +Copyright (C) 2015-2016 Gambit +Copyright (C) 2016 yyt16384 + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua new file mode 100644 index 0000000..2b96090 --- /dev/null +++ b/mods/flowers/mapgen.lua @@ -0,0 +1,171 @@ +-- +-- Mgv6 +-- + +local function register_mgv6_flower(name) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "flowers:"..name, + }) +end + +local function register_mgv6_mushroom(name) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = 7133, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "flowers:"..name, + spawn_by = "default:tree", + num_spawn_by = 1, + }) +end + +local function register_mgv6_waterlily() + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + y_min = 0, + y_max = 0, + schematic = minetest.get_modpath("flowers").."/schematics/waterlily.mts", + rotation = "random", + }) +end + +function flowers.register_mgv6_decorations() + register_mgv6_flower("rose") + register_mgv6_flower("tulip") + register_mgv6_flower("dandelion_yellow") + register_mgv6_flower("geranium") + register_mgv6_flower("viola") + register_mgv6_flower("dandelion_white") + + register_mgv6_mushroom("mushroom_brown") + register_mgv6_mushroom("mushroom_red") + + register_mgv6_waterlily() +end + + +-- +-- All other biome API mapgens +-- + +local function register_flower(seed, name) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.025, + spread = {x = 200, y = 200, z = 200}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland", "deciduous_forest", "coniferous_forest", + "floatland_grassland", "floatland_coniferous_forest"}, + y_min = 1, + y_max = 31000, + decoration = "flowers:"..name, + }) +end + +local function register_mushroom(name) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest", "coniferous_forest", + "floatland_coniferous_forest"}, + y_min = 1, + y_max = 31000, + decoration = "flowers:"..name, + }) +end + +local function register_waterlily() + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"}, + y_min = 0, + y_max = 0, + schematic = minetest.get_modpath("flowers") .. "/schematics/waterlily.mts", + rotation = "random", + }) +end + +function flowers.register_decorations() + register_flower(436, "rose") + register_flower(19822, "tulip") + register_flower(1220999, "dandelion_yellow") + register_flower(36662, "geranium") + register_flower(1133, "viola") + register_flower(73133, "dandelion_white") + + register_mushroom("mushroom_brown") + register_mushroom("mushroom_red") + + register_waterlily() +end + + +-- +-- Detect mapgen to select functions +-- + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" then + flowers.register_mgv6_decorations() +else + flowers.register_decorations() +end diff --git a/mods/flowers/schematics/waterlily.mts b/mods/flowers/schematics/waterlily.mts new file mode 100644 index 0000000..69e1d8e Binary files /dev/null and b/mods/flowers/schematics/waterlily.mts differ diff --git a/mods/flowers/textures/flowers_dandelion_white.png b/mods/flowers/textures/flowers_dandelion_white.png new file mode 100644 index 0000000..1bc02fb Binary files /dev/null and b/mods/flowers/textures/flowers_dandelion_white.png differ diff --git a/mods/flowers/textures/flowers_dandelion_yellow.png b/mods/flowers/textures/flowers_dandelion_yellow.png new file mode 100644 index 0000000..ec11c1c Binary files /dev/null and b/mods/flowers/textures/flowers_dandelion_yellow.png differ diff --git a/mods/flowers/textures/flowers_geranium.png b/mods/flowers/textures/flowers_geranium.png new file mode 100644 index 0000000..88de1d7 Binary files /dev/null and b/mods/flowers/textures/flowers_geranium.png differ diff --git a/mods/flowers/textures/flowers_mushroom_brown.png b/mods/flowers/textures/flowers_mushroom_brown.png new file mode 100644 index 0000000..33ffcd4 Binary files /dev/null and b/mods/flowers/textures/flowers_mushroom_brown.png differ diff --git a/mods/flowers/textures/flowers_mushroom_red.png b/mods/flowers/textures/flowers_mushroom_red.png new file mode 100644 index 0000000..a68f5d5 Binary files /dev/null and b/mods/flowers/textures/flowers_mushroom_red.png differ diff --git a/mods/flowers/textures/flowers_rose.png b/mods/flowers/textures/flowers_rose.png new file mode 100644 index 0000000..e3b841d Binary files /dev/null and b/mods/flowers/textures/flowers_rose.png differ diff --git a/mods/flowers/textures/flowers_tulip.png b/mods/flowers/textures/flowers_tulip.png new file mode 100644 index 0000000..471fcd3 Binary files /dev/null and b/mods/flowers/textures/flowers_tulip.png differ diff --git a/mods/flowers/textures/flowers_viola.png b/mods/flowers/textures/flowers_viola.png new file mode 100644 index 0000000..ca2d750 Binary files /dev/null and b/mods/flowers/textures/flowers_viola.png differ diff --git a/mods/flowers/textures/flowers_waterlily.png b/mods/flowers/textures/flowers_waterlily.png new file mode 100644 index 0000000..305c445 Binary files /dev/null and b/mods/flowers/textures/flowers_waterlily.png differ diff --git a/mods/flowers/textures/flowers_waterlily_bottom.png b/mods/flowers/textures/flowers_waterlily_bottom.png new file mode 100644 index 0000000..3dbeaf4 Binary files /dev/null and b/mods/flowers/textures/flowers_waterlily_bottom.png differ diff --git a/mods/give_initial_stuff/README.txt b/mods/give_initial_stuff/README.txt new file mode 100644 index 0000000..cbd240f --- /dev/null +++ b/mods/give_initial_stuff/README.txt @@ -0,0 +1,8 @@ +Minetest Game mod: give_initial_stuff +===================================== +See license.txt for license information. + +Authors of source code +---------------------- +Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) diff --git a/mods/give_initial_stuff/depends.txt b/mods/give_initial_stuff/depends.txt new file mode 100644 index 0000000..3a7daa1 --- /dev/null +++ b/mods/give_initial_stuff/depends.txt @@ -0,0 +1,2 @@ +default + diff --git a/mods/give_initial_stuff/init.lua b/mods/give_initial_stuff/init.lua new file mode 100644 index 0000000..4815bd8 --- /dev/null +++ b/mods/give_initial_stuff/init.lua @@ -0,0 +1,44 @@ +local stuff_string = minetest.settings:get("initial_stuff") or + "default:pick_steel,default:axe_steel,default:shovel_steel," .. + "default:torch 99,default:cobble 99" + +give_initial_stuff = { + items = {} +} + +function give_initial_stuff.give(player) + minetest.log("action", + "Giving initial stuff to player " .. player:get_player_name()) + local inv = player:get_inventory() + for _, stack in ipairs(give_initial_stuff.items) do + inv:add_item("main", stack) + end +end + +function give_initial_stuff.add(stack) + give_initial_stuff.items[#give_initial_stuff.items + 1] = ItemStack(stack) +end + +function give_initial_stuff.clear() + give_initial_stuff.items = {} +end + +function give_initial_stuff.add_from_csv(str) + local items = str:split(",") + for _, itemname in ipairs(items) do + give_initial_stuff.add(itemname) + end +end + +function give_initial_stuff.set_list(list) + give_initial_stuff.items = list +end + +function give_initial_stuff.get_list() + return give_initial_stuff.items +end + +give_initial_stuff.add_from_csv(stuff_string) +if minetest.settings:get_bool("give_initial_stuff") then + minetest.register_on_newplayer(give_initial_stuff.give) +end diff --git a/mods/give_initial_stuff/license.txt b/mods/give_initial_stuff/license.txt new file mode 100644 index 0000000..8134c92 --- /dev/null +++ b/mods/give_initial_stuff/license.txt @@ -0,0 +1,25 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/inventory_music/init.lua b/mods/inventory_music/init.lua new file mode 100644 index 0000000..29897a4 --- /dev/null +++ b/mods/inventory_music/init.lua @@ -0,0 +1,120 @@ +local sound_time = 0 +local sound_play_on = 0 +local sound_play_regnum = nil +local inst_list = {} +minetest.register_globalstep(function(dtime) + if sound_play_on == 0 then + sound_play_on = 1 + inst_list = {} + for _,player in ipairs(minetest.get_connected_players()) do + local player_inv = player:get_inventory() + local inst1 = player_inv:get_stack("inst", 1):get_count() + local inst2 = player_inv:get_stack("inst", 2):get_count() + if inst1 == 1 then + table.insert(inst_list, "Theme1") + end + if inst2 == 1 then + table.insert(inst_list, "Theme2") + end + local inst = inst_list[ math.random(#inst_list)] + local music = player_inv:get_stack("music", 1):get_count() + if music == 1 then + sound_play_regnum = minetest.sound_play(inst, { + to_player = player, + }) + end + end + end + sound_time = sound_time+dtime + if sound_time > 120 then + sound_time = 0 + sound_play_on = 0 + end +end) +set = {} +set.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + player_inv:set_size("music", 1) + player_inv:set_size("inst", 10) + local music = player_inv:get_stack("music", 1):get_count() + local inst1 = player_inv:get_stack("inst", 1):get_count() + local inst2 = player_inv:get_stack("inst", 2):get_count() + formspec = "size[6,5]" + .."background[9,10.3;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if music == 0 then + formspec = formspec.."checkbox[0,0;music;Background Music on;false]" + end + if music == 1 then + formspec = formspec.."checkbox[0,0;music;Background Music on;true]" + end + if inst1 == 0 and music == 1 then + formspec = formspec.."checkbox[0.5,1;inst1;1248's Theme 1;false]" + end + if inst1 == 1 and music == 1 then + formspec = formspec.."checkbox[0.5,1;inst1;1248's Theme 1;true]" + end + if inst2 == 0 and music == 1 then + formspec = formspec.."checkbox[0.5,1.3;inst2;1248's Theme 2;false]" + end + if inst2 == 1 and music == 1 then + formspec = formspec.."checkbox[0.5,1.3;inst2;1248's Theme 2;true]" + end + return formspec +end + +minetest.register_on_joinplayer(function(player) + player:set_inventory_formspec(set.get_formspec(player, player:get_pos())) +end) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if player == nil then + return + end + local player_inv = player:get_inventory() + if fields.inst1 then + local inst = player_inv:get_stack("inst", 1):get_count() + if inst == 0 then + player_inv:set_stack("inst", 1, "default:dirt") + else + player_inv:set_stack("inst", 1, nil) + end + local inst1 = player_inv:get_stack("inst", 1):get_count() + local inst2 = player_inv:get_stack("inst", 2):get_count() + if inst1 == 0 and inst2 == 0 then + player_inv:set_stack("music", 1, nil) + end + player:set_inventory_formspec(set.get_formspec(player, player:get_pos())) + end + if fields.inst2 then + local inst = player_inv:get_stack("inst", 2):get_count() + if inst == 0 then + player_inv:set_stack("inst", 2, "default:dirt") + else + player_inv:set_stack("inst", 2, nil) + end + local inst1 = player_inv:get_stack("inst", 1):get_count() + local inst2 = player_inv:get_stack("inst", 2):get_count() + if inst1 == 0 and inst2 == 0 then + player_inv:set_stack("music", 1, nil) + end + player:set_inventory_formspec(set.get_formspec(player, player:get_pos())) + end + if fields.music then + local music = player_inv:get_stack("music", 1):get_count() + if music == 0 then + player_inv:set_stack("music", 1, "default:dirt") + player_inv:set_stack("inst", 1, "default:dirt") + player_inv:set_stack("inst", 2, nil) + else + player_inv:set_stack("music", 1, nil) + if sound_play_regnum ~= nil then + minetest.sound_stop(sound_play_regnum) + end + end + player:set_inventory_formspec(set.get_formspec(player, player:get_pos())) + end +end) \ No newline at end of file diff --git a/mods/inventory_music/sounds/Theme1.ogg b/mods/inventory_music/sounds/Theme1.ogg new file mode 100644 index 0000000..4658c55 Binary files /dev/null and b/mods/inventory_music/sounds/Theme1.ogg differ diff --git a/mods/inventory_music/sounds/Theme2.ogg b/mods/inventory_music/sounds/Theme2.ogg new file mode 100644 index 0000000..cdf1c7d Binary files /dev/null and b/mods/inventory_music/sounds/Theme2.ogg differ diff --git a/mods/killme/init.lua b/mods/killme/init.lua new file mode 100644 index 0000000..9b67475 --- /dev/null +++ b/mods/killme/init.lua @@ -0,0 +1,24 @@ +minetest.register_chatcommand("killme", { + description = "Kill yourself to respawn", + func = function(name) + local player = minetest.get_player_by_name(name) + if player then + if minetest.settings:get_bool("enable_damage") then + player:set_hp(0) + return true + else + for _, callback in pairs(core.registered_on_respawnplayers) do + if callback(player) then + return true + end + end + + -- There doesn't seem to be a way to get a default spawn pos from the lua API + return false, "No static_spawnpoint defined" + end + else + -- Show error message if used when not logged in, eg: from IRC mod + return false, "You need to be online to be killed!" + end + end +}) diff --git a/mods/screwdriver/README.txt b/mods/screwdriver/README.txt new file mode 100644 index 0000000..9d39c58 --- /dev/null +++ b/mods/screwdriver/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: screwdriver +============================== +See license.txt for license information. + +License of source code +---------------------- +Originally by RealBadAngel, Maciej Kasatkin (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +License of media (textures) +--------------------------- +Created by Gambit (CC BY-SA 3.0): + screwdriver.png diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua new file mode 100644 index 0000000..e76f054 --- /dev/null +++ b/mods/screwdriver/init.lua @@ -0,0 +1,170 @@ +screwdriver = {} + +screwdriver.ROTATE_FACE = 1 +screwdriver.ROTATE_AXIS = 2 +screwdriver.disallow = function(pos, node, user, mode, new_param2) + return false +end +screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end +end + +-- For attached wallmounted nodes: returns true if rotation is valid +-- simplified version of minetest:builtin/game/falling.lua#L148. +local function check_attached_node(pos, rotation) + local d = minetest.wallmounted_to_dir(rotation) + local p2 = vector.add(pos, d) + local n = minetest.get_node(p2).name + local def2 = minetest.registered_nodes[n] + if def2 and not def2.walkable then + return false + end + return true +end + +screwdriver.rotate = {} + +local facedir_tbl = { + [screwdriver.ROTATE_FACE] = { + [0] = 1, [1] = 2, [2] = 3, [3] = 0, + [4] = 5, [5] = 6, [6] = 7, [7] = 4, + [8] = 9, [9] = 10, [10] = 11, [11] = 8, + [12] = 13, [13] = 14, [14] = 15, [15] = 12, + [16] = 17, [17] = 18, [18] = 19, [19] = 16, + [20] = 21, [21] = 22, [22] = 23, [23] = 20, + }, + [screwdriver.ROTATE_AXIS] = { + [0] = 4, [1] = 4, [2] = 4, [3] = 4, + [4] = 8, [5] = 8, [6] = 8, [7] = 8, + [8] = 12, [9] = 12, [10] = 12, [11] = 12, + [12] = 16, [13] = 16, [14] = 16, [15] = 16, + [16] = 20, [17] = 20, [18] = 20, [19] = 20, + [20] = 0, [21] = 0, [22] = 0, [23] = 0, + }, +} + +screwdriver.rotate.facedir = function(pos, node, mode) + local rotation = node.param2 % 32 -- get first 5 bits + local other = node.param2 - rotation + rotation = facedir_tbl[mode][rotation] or 0 + return rotation + other +end + +screwdriver.rotate.colorfacedir = screwdriver.rotate.facedir + +local wallmounted_tbl = { + [screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1}, + [screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3} +} + +screwdriver.rotate.wallmounted = function(pos, node, mode) + local rotation = node.param2 % 8 -- get first 3 bits + local other = node.param2 - rotation + rotation = wallmounted_tbl[mode][rotation] or 0 + if minetest.get_item_group(node.name, "attached_node") ~= 0 then + -- find an acceptable orientation + for i = 1, 5 do + if not check_attached_node(pos, rotation) then + rotation = wallmounted_tbl[mode][rotation] or 0 + else + break + end + end + end + return rotation + other +end + +screwdriver.rotate.colorwallmounted = screwdriver.rotate.wallmounted + +-- Handles rotation +screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + -- can we rotate this paramtype2? + local fn = screwdriver.rotate[ndef.paramtype2] + if not fn and not ndef.on_rotate then + return itemstack + end + + local should_rotate = true + local new_param2 + if fn then + new_param2 = fn(pos, node, mode) + else + new_param2 = node.param2 + end + + -- Node provides a handler, so let the handler decide instead if the node can be rotated + if ndef.on_rotate then + -- Copy pos and node because callback can modify it + local result = ndef.on_rotate(vector.new(pos), + {name = node.name, param1 = node.param1, param2 = node.param2}, + user, mode, new_param2) + if result == false then -- Disallow rotation + return itemstack + elseif result == true then + should_rotate = false + end + elseif ndef.on_rotate == false then + return itemstack + elseif ndef.can_dig and not ndef.can_dig(pos, user) then + return itemstack + end + + if should_rotate and new_param2 ~= node.param2 then + node.param2 = new_param2 + minetest.swap_node(pos, node) + minetest.check_for_falling(pos) + end + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(user:get_player_name())) then + itemstack:add_wear(65535 / ((uses or 200) - 1)) + end + + return itemstack +end + +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = "Screwdriver (left-click rotates face, right-click rotates axis)", + inventory_image = "screwdriver.png", + on_use = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 200) + return itemstack + end, +}) + + +minetest.register_craft({ + output = "screwdriver:screwdriver", + recipe = { + {"default:steel_ingot"}, + {"group:stick"} + } +}) + +minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver") diff --git a/mods/screwdriver/license.txt b/mods/screwdriver/license.txt new file mode 100644 index 0000000..d9b721b --- /dev/null +++ b/mods/screwdriver/license.txt @@ -0,0 +1,50 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2013-2016 RealBadAngel, Maciej Kasatkin +Copyright (C) 2013-2016 Various Minetest developers and contributors + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2013-2016 Gambit + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/screwdriver/textures/screwdriver.png b/mods/screwdriver/textures/screwdriver.png new file mode 100644 index 0000000..b2a56d5 Binary files /dev/null and b/mods/screwdriver/textures/screwdriver.png differ diff --git a/mods/sethome/README.txt b/mods/sethome/README.txt new file mode 100644 index 0000000..6f0a282 --- /dev/null +++ b/mods/sethome/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: sethome +========================== +See license.txt for license information. + +Authors of source code +---------------------- +sfan5 (MIT) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua new file mode 100644 index 0000000..13a33e5 --- /dev/null +++ b/mods/sethome/init.lua @@ -0,0 +1,97 @@ + +sethome = {} + +local homes_file = minetest.get_worldpath() .. "/homes" +local homepos = {} + +local function loadhomes() + local input = io.open(homes_file, "r") + if not input then + return -- no longer an error + end + + -- Iterate over all stored positions in the format "x y z player" for each line + for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do + homepos[name] = minetest.string_to_pos(pos) + end + input:close() +end + +loadhomes() + +sethome.set = function(name, pos) + local player = minetest.get_player_by_name(name) + if not player or not pos then + return false + end + player:set_attribute("sethome:home", minetest.pos_to_string(pos)) + + -- remove `name` from the old storage file + local data = {} + local output = io.open(homes_file, "w") + if output then + homepos[name] = nil + for i, v in pairs(homepos) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i)) + end + output:write(table.concat(data)) + io.close(output) + return true + end + return true -- if the file doesn't exist - don't return an error. +end + +sethome.get = function(name) + local player = minetest.get_player_by_name(name) + local pos = minetest.string_to_pos(player:get_attribute("sethome:home")) + if pos then + return pos + end + + -- fetch old entry from storage table + pos = homepos[name] + if pos then + return vector.new(pos) + else + return nil + end +end + +sethome.go = function(name) + local pos = sethome.get(name) + local player = minetest.get_player_by_name(name) + if player and pos then + player:setpos(pos) + return true + end + return false +end + +minetest.register_privilege("home", { + description = "Can use /sethome and /home", + give_to_singleplayer = false +}) + +minetest.register_chatcommand("home", { + description = "Teleport you to your home point", + privs = {home = true}, + func = function(name) + if sethome.go(name) then + return true, "Teleported to home!" + end + return false, "Set a home using /sethome" + end, +}) + +minetest.register_chatcommand("sethome", { + description = "Set your home point", + privs = {home = true}, + func = function(name) + name = name or "" -- fallback to blank name if nil + local player = minetest.get_player_by_name(name) + if player and sethome.set(name, player:getpos()) then + return true, "Home set!" + end + return false, "Player not found!" + end, +}) diff --git a/mods/sethome/license.txt b/mods/sethome/license.txt new file mode 100644 index 0000000..09f03b0 --- /dev/null +++ b/mods/sethome/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 sfan5 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt new file mode 100644 index 0000000..d32cd71 --- /dev/null +++ b/mods/stairs/README.txt @@ -0,0 +1,16 @@ +Minetest Game mod: stairs +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Kahrl (LGPL 2.1) and +celeron55, Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (models) +------------------------- +Jean-Patrick G. (kilbith) (CC BY-SA 3.0): + stairs_stair.obj + + diff --git a/mods/stairs/depends.txt b/mods/stairs/depends.txt new file mode 100644 index 0000000..d77ba25 --- /dev/null +++ b/mods/stairs/depends.txt @@ -0,0 +1,2 @@ +default +farming diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua new file mode 100644 index 0000000..90172ef --- /dev/null +++ b/mods/stairs/init.lua @@ -0,0 +1,613 @@ +-- Minetest 0.4 mod: stairs +-- See README.txt for licensing and other information. + + +-- Global namespace for functions + +stairs = {} + + +-- Register aliases for new pine node names + +minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood") +minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") + + +-- Get setting for replace ABM + +local replace = minetest.settings:get_bool("enable_stairs_replace_abm") + +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end + +-- Register stairs. +-- Node will be called stairs:stair_ + +function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) + groups.stair = 1 + minetest.register_node(":stairs:stair_" .. subname, { + description = description, + drawtype = "mesh", + mesh = "stairs_stair.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = sounds, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:stair_" .. subname .. "upside_down", { + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + minetest.register_craft({ + output = 'stairs:stair_' .. subname .. ' 8', + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Flipped recipe for the silly minecrafters + minetest.register_craft({ + output = 'stairs:stair_' .. subname .. ' 8', + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = 'stairs:stair_' .. subname, + burntime = math.floor(baseburntime * 0.75), + }) + end + end +end + + +-- Slab facedir to placement 6d matching table +local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} + +-- Register slabs. +-- Node will be called stairs:slab_ + +function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) + groups.slab = 1 + minetest.register_node(":stairs:slab_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_place = function(itemstack, placer, pointed_thing) + local under = minetest.get_node(pointed_thing.under) + local wield_item = itemstack:get_name() + local creative_enabled = (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) + + if under and under.name:find("stairs:slab_") then + -- place slab using under node orientation + local dir = minetest.dir_to_facedir(vector.subtract( + pointed_thing.above, pointed_thing.under), true) + + local p2 = under.param2 + + -- combine two slabs if possible + if slab_trans_dir[math.floor(p2 / 4)] == dir + and wield_item == under.name then + + if not recipeitem then + return itemstack + end + local player_name = placer:get_player_name() + if minetest.is_protected(pointed_thing.under, player_name) and not + minetest.check_player_privs(placer, "protection_bypass") then + minetest.record_protection_violation(pointed_thing.under, + player_name) + return + end + minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) + if not creative_enabled then + itemstack:take_item() + end + return itemstack + end + + -- Placing a slab on an upside down slab should make it right-side up. + if p2 >= 20 and dir == 8 then + p2 = p2 - 20 + -- same for the opposite case: slab below normal slab + elseif p2 <= 3 and dir == 4 then + p2 = p2 + 20 + end + + -- else attempt to place node with proper param2 + minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) + if not creative_enabled then + itemstack:take_item() + end + return itemstack + else + return rotate_and_place(itemstack, placer, pointed_thing) + end + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:slab_" .. subname .. "upside_down", { + replace_name = "stairs:slab_".. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + minetest.register_craft({ + output = 'stairs:slab_' .. subname .. ' 6', + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = 'stairs:slab_' .. subname, + burntime = math.floor(baseburntime * 0.5), + }) + end + end +end + + +-- Optionally replace old "upside_down" nodes with new param2 versions. +-- Disabled by default. + +if replace then + minetest.register_abm({ + label = "Slab replace", + nodenames = {"group:slabs_replace"}, + interval = 16, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, + }) +end + + +-- Stair/slab registration function. +-- Nodes will be called stairs:{stair,slab}_ + +function stairs.register_stair_and_slab(subname, recipeitem, + groups, images, desc_stair, desc_slab, sounds) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds) +end + + +-- Register default stairs and slabs + +stairs.register_stair_and_slab( + "wood", + "default:wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_wood.png"}, + "Wooden Stair", + "Wooden Slab", + default.node_sound_wood_defaults() +) + +stairs.register_stair_and_slab( + "junglewood", + "default:junglewood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_junglewood.png"}, + "Jungle Wood Stair", + "Jungle Wood Slab", + default.node_sound_wood_defaults() +) + +stairs.register_stair_and_slab( + "pine_wood", + "default:pine_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_pine_wood.png"}, + "Pine Wood Stair", + "Pine Wood Slab", + default.node_sound_wood_defaults() +) + +stairs.register_stair_and_slab( + "acacia_wood", + "default:acacia_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_acacia_wood.png"}, + "Acacia Wood Stair", + "Acacia Wood Slab", + default.node_sound_wood_defaults() +) + +stairs.register_stair_and_slab( + "aspen_wood", + "default:aspen_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_aspen_wood.png"}, + "Aspen Wood Stair", + "Aspen Wood Slab", + default.node_sound_wood_defaults() +) + +stairs.register_stair_and_slab( + "stone", + "default:stone", + {cracky = 3}, + {"default_stone.png"}, + "Stone Stair", + "Stone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "cobble", + "default:cobble", + {cracky = 3}, + {"default_cobble.png"}, + "Cobblestone Stair", + "Cobblestone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "mossycobble", + nil, + {cracky = 3}, + {"default_mossycobble.png"}, + "Mossy Cobblestone Stair", + "Mossy Cobblestone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "stonebrick", + "default:stonebrick", + {cracky = 2}, + {"default_stone_brick.png"}, + "Stone Brick Stair", + "Stone Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "stone_block", + "default:stone_block", + {cracky = 2}, + {"default_stone_block.png"}, + "Stone Block Stair", + "Stone Block Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_stone", + "default:desert_stone", + {cracky = 3}, + {"default_desert_stone.png"}, + "Desert Stone Stair", + "Desert Stone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_cobble", + "default:desert_cobble", + {cracky = 3}, + {"default_desert_cobble.png"}, + "Desert Cobblestone Stair", + "Desert Cobblestone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_stonebrick", + "default:desert_stonebrick", + {cracky = 2}, + {"default_desert_stone_brick.png"}, + "Desert Stone Brick Stair", + "Desert Stone Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_stone_block", + "default:desert_stone_block", + {cracky = 2}, + {"default_desert_stone_block.png"}, + "Desert Stone Block Stair", + "Desert Stone Block Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "sandstone", + "default:sandstone", + {crumbly = 1, cracky = 3}, + {"default_sandstone.png"}, + "Sandstone Stair", + "Sandstone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "sandstonebrick", + "default:sandstonebrick", + {cracky = 2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick Stair", + "Sandstone Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "sandstone_block", + "default:sandstone_block", + {cracky = 2}, + {"default_sandstone_block.png"}, + "Sandstone Block Stair", + "Sandstone Block Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_sandstone", + "default:desert_sandstone", + {crumbly = 1, cracky = 3}, + {"default_desert_sandstone.png"}, + "Desert Sandstone Stair", + "Desert Sandstone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_sandstone_brick", + "default:desert_sandstone_brick", + {cracky = 2}, + {"default_desert_sandstone_brick.png"}, + "Desert Sandstone Brick Stair", + "Desert Sandstone Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "desert_sandstone_block", + "default:desert_sandstone_block", + {cracky = 2}, + {"default_desert_sandstone_block.png"}, + "Desert Sandstone Block Stair", + "Desert Sandstone Block Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "silver_sandstone", + "default:silver_sandstone", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone.png"}, + "Silver Sandstone Stair", + "Silver Sandstone Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "silver_sandstone_brick", + "default:silver_sandstone_brick", + {cracky = 2}, + {"default_silver_sandstone_brick.png"}, + "Silver Sandstone Brick Stair", + "Silver Sandstone Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "silver_sandstone_block", + "default:silver_sandstone_block", + {cracky = 2}, + {"default_silver_sandstone_block.png"}, + "Silver Sandstone Block Stair", + "Silver Sandstone Block Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "obsidian", + "default:obsidian", + {cracky = 1, level = 2}, + {"default_obsidian.png"}, + "Obsidian Stair", + "Obsidian Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "obsidianbrick", + "default:obsidianbrick", + {cracky = 1, level = 2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Stair", + "Obsidian Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "obsidian_block", + "default:obsidian_block", + {cracky = 1, level = 2}, + {"default_obsidian_block.png"}, + "Obsidian Block Stair", + "Obsidian Block Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "brick", + "default:brick", + {cracky = 3}, + {"default_brick.png"}, + "Brick Stair", + "Brick Slab", + default.node_sound_stone_defaults() +) + +stairs.register_stair_and_slab( + "straw", + "farming:straw", + {snappy = 3, flammable = 4}, + {"farming_straw.png"}, + "Straw Stair", + "Straw Slab", + default.node_sound_leaves_defaults() +) + +stairs.register_stair_and_slab( + "steelblock", + "default:steelblock", + {cracky = 1, level = 2}, + {"default_steel_block.png"}, + "Steel Block Stair", + "Steel Block Slab", + default.node_sound_metal_defaults() +) + +stairs.register_stair_and_slab( + "copperblock", + "default:copperblock", + {cracky = 1, level = 2}, + {"default_copper_block.png"}, + "Copper Block Stair", + "Copper Block Slab", + default.node_sound_metal_defaults() +) + +stairs.register_stair_and_slab( + "bronzeblock", + "default:bronzeblock", + {cracky = 1, level = 2}, + {"default_bronze_block.png"}, + "Bronze Block Stair", + "Bronze Block Slab", + default.node_sound_metal_defaults() +) + +stairs.register_stair_and_slab( + "goldblock", + "default:goldblock", + {cracky = 1}, + {"default_gold_block.png"}, + "Gold Block Stair", + "Gold Block Slab", + default.node_sound_metal_defaults() +) + +stairs.register_stair_and_slab( + "ice", + "default:ice", + {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + {"default_ice.png"}, + "Ice Stair", + "Ice Slab", + default.node_sound_glass_defaults() +) + +stairs.register_stair_and_slab( + "snowblock", + "default:snowblock", + {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + {"default_snow.png"}, + "Snow Block Stair", + "Snow Block Slab", + default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} + }) +) diff --git a/mods/stairs/license.txt b/mods/stairs/license.txt new file mode 100644 index 0000000..8f16bbd --- /dev/null +++ b/mods/stairs/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 Kahrl +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (models) +-------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/stairs/models/stairs_stair.obj b/mods/stairs/models/stairs_stair.obj new file mode 100644 index 0000000..198edf6 --- /dev/null +++ b/mods/stairs/models/stairs_stair.obj @@ -0,0 +1,115 @@ +# Blender v2.72 (sub 0) OBJ File: '' +# www.blender.org +mtllib stairs.mtl +o stairs_top +v -0.500000 0.000000 -0.500000 +v -0.500000 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.500000 0.000000 +v 0.500000 0.500000 0.000000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +g stairs_top +usemtl None +s off +f 4/1/1 1/2/1 2/3/1 3/4/1 +f 7/5/1 8/6/1 6/4/1 5/3/1 +o stairs_bottom +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +g stairs_bottom +usemtl None +s off +f 11/7/2 9/8/2 10/9/2 12/10/2 +o stairs_right +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.000000 0.000000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.000000 +v -0.500000 0.500000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +g stairs_right +usemtl None +s off +f 13/11/3 14/12/3 15/13/3 +f 15/13/3 18/14/3 17/15/3 +f 14/12/3 16/16/3 15/13/3 +f 16/16/3 18/14/3 15/13/3 +o stairs_left +v 0.500000 0.000000 0.000000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.000000 +v 0.500000 0.500000 0.500000 +vt 0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +g stairs_left +usemtl None +s off +f 19/17/4 20/18/4 21/19/4 +f 19/17/4 23/20/4 24/21/4 +f 20/18/4 19/17/4 22/22/4 +f 19/17/4 24/21/4 22/22/4 +o stairs_back +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +g stairs_back +usemtl None +s off +f 26/23/5 28/24/5 27/25/5 25/26/5 +o stairs_front +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.500000 0.000000 +v 0.500000 0.500000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +g stairs_front +usemtl None +s off +f 30/27/6 29/28/6 34/29/6 33/30/6 +f 31/28/6 35/31/6 36/32/6 32/29/6 diff --git a/mods/sudoku/init.lua b/mods/sudoku/init.lua new file mode 100644 index 0000000..41e931a --- /dev/null +++ b/mods/sudoku/init.lua @@ -0,0 +1,3165 @@ +local hud_levels = {} + +minetest.register_on_joinplayer(function(player) + + local name = player:get_player_name() + player:hud_add({ + hud_elem_type = "text", + position = {x=0, y=0.85}, + offset = {x=0, y=10}, + alignment = {x=1, y=0}, + number = 0xFFFFFF , + text = "For Minetest : 0.4.16", + }) + player:hud_add({ + hud_elem_type = "text", + position = {x=0, y=0.85}, + offset = {x=0, y=30}, + alignment = {x=1, y=0}, + number = 0xFFFFFF , + text = "Game Version : 1.7.1", + }) + hud_levels[name] = player:hud_add({ + hud_elem_type = "text", + position = {x=0, y=0.85}, + offset = {x=0, y=-450}, + alignment = {x=1, y=0}, + number = 0xFFFFFF , + text = "Level: /", + }) +end) + +minetest.register_globalstep(function(dtime) + local players = minetest.get_connected_players() + for _,player in ipairs(players) do + local player_inv = player:get_inventory() + player_inv:set_size("ll", 1) + player_inv:set_size("l", 4) + local ll = player_inv:get_stack("ll", 1):get_count() + local l = player_inv:get_stack("l", ll):get_count() + if ll == 0 then + else + player:hud_change(hud_levels[player:get_player_name()], 'text', "Level: World "..ll.."."..l) + end + end + for i=12,25 do + for j=0,25 do + for k=75,89 do + if minetest.get_node({x=i, y=j, z=(-1)*k}).name == "default:mossycobble" then + minetest.set_node({x=i, y=j, z=(-1)*k}, {name="sudoku:wall"}) + end + if minetest.get_node({x=i, y=j, z=(-1)*k}).name == "default:obsidian_glass" then + minetest.set_node({x=i, y=j, z=(-1)*k}, {name="sudoku:glass"}) + end + end + end + end +end) +minetest.register_on_joinplayer(function(player) + local override_table = player:get_physics_override() + override_table.new_move = false + override_table.sneak_glitch = true + player:set_physics_override(override_table) + minetest.setting_set("time_speed", "0") + minetest.set_timeofday(0.5) + minetest.setting_set("node_highlighting", "box") + player:hud_set_hotbar_itemcount(9) + player:setpos({x=19, y=10, z=-87}) + for i=17,21 do + for j=9,15 do + minetest.set_node({x=i, y=j, z=-89}, {name="sudoku:wall"}) + end + end +end) +minetest.register_on_newplayer(function(player) + local player = minetest.get_player_by_name(player:get_player_name()) + local pri = minetest.get_player_privs(player:get_player_name()) + pri["fly"] = true + minetest.set_player_privs(player:get_player_name(), pri) + player:setpos({x=20, y=10, z=-91}) + +end) +minetest.register_node("sudoku:desert",{ + description = "Desert", + tiles = {"default_desert_sand.png"}, + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, +}) +minetest.register_node("sudoku:black",{ + description = "Black", + tiles = {"wool_black.png"}, + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, +}) +minetest.register_node("sudoku:gray",{ + description = "Gray", + tiles = {"default_sand.png"}, + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, +}) +minetest.register_node("sudoku:glass", { + description = "Obsidian Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, + paramtype = "light", + paramtype2 = "glasslikeliquidlevel", + is_ground_content = false, + sunlight_propagates = true, +}) +minetest.register_node("sudoku:wall",{ + description = "Wall", + tiles = {"default_mossycobble.png"}, + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, +}) +for i=1,9 do + minetest.register_node("sudoku:"..i,{ + description = ""..i, + tiles = {"sudoku_1_"..i..".png"}, + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + }) +end +for i=1,9 do + minetest.register_node("sudoku:n_"..i,{ + description = ""..i, + tiles = {"sudoku_2_"..i..".png"}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + }) +end +function New(player,page) + local player_inv = player:get_inventory() + player_inv:set_list("main", nil) + player_inv:set_size("main", 32) + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level = lv:read("*l") + lv:close() + local lv = io.open(minetest.get_modpath("sudoku").."/lv"..page..".txt", "r") + local ar1 = {} + local ar2 = {} + for i=1,9 do + ar1[i] = lv:read("*l") + end + for i=14,24 do + for k=9,19 do + minetest.set_node({x=i, y=k, z=-76}, {name="air"}) + end + end + local a1 = 0 + local a2 = 0 + local a3 = 0 + local a4 = 0 + local a5 = 0 + local a6 = 0 + local a7 = 0 + local a8 = 0 + local a9 = 0 + for j = 1, 9 do + for i = 1, string.len(ar1[j]) do + local k = 0 + if i < 4 then + k = i + elseif i < 7 then + k = i+1 + else + k = i+2 + end + local l = 0 + if j < 4 then + l = j + elseif j < 7 then + l = j+1 + else + l = j+2 + end + if string.sub(ar1[j], i, i) == "0" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="air"}) + elseif string.sub(ar1[j], i, i) == "1" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:1"}) + a1 = a1+1 + elseif string.sub(ar1[j], i, i) == "2" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:2"}) + a2 = a2+1 + elseif string.sub(ar1[j], i, i) == "3" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:3"}) + a3 = a3+1 + elseif string.sub(ar1[j], i, i) == "4" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:4"}) + a4 = a4+1 + elseif string.sub(ar1[j], i, i) == "5" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:5"}) + a5 = a5+1 + elseif string.sub(ar1[j], i, i) == "6" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:6"}) + a6 = a6+1 + elseif string.sub(ar1[j], i, i) == "7" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:7"}) + a7 = a7+1 + elseif string.sub(ar1[j], i, i) == "8" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:8"}) + a8 = a8+1 + elseif string.sub(ar1[j], i, i) == "9" then + minetest.set_node({x=k+13, y=(12-l)+8, z=-76}, {name="sudoku:9"}) + a9 = a9+1 + end + end + end + for i = 1,11 do + minetest.set_node({x=17, y=i+8, z=-76}, {name="sudoku:black"}) + minetest.set_node({x=21, y=i+8, z=-76}, {name="sudoku:black"}) + minetest.set_node({x=13+i, y=12, z=-76}, {name="sudoku:black"}) + minetest.set_node({x=13+i, y=16, z=-76}, {name="sudoku:black"}) + end + player_inv:add_item("main", "sudoku:n_1 "..(9-a1)) + player_inv:add_item("main", "sudoku:n_2 "..(9-a2)) + player_inv:add_item("main", "sudoku:n_3 "..(9-a3)) + player_inv:add_item("main", "sudoku:n_4 "..(9-a4)) + player_inv:add_item("main", "sudoku:n_5 "..(9-a5)) + player_inv:add_item("main", "sudoku:n_6 "..(9-a6)) + player_inv:add_item("main", "sudoku:n_7 "..(9-a7)) + player_inv:add_item("main", "sudoku:n_8 "..(9-a8)) + player_inv:add_item("main", "sudoku:n_9 "..(9-a9)) +end +function Fi(i,k) + local temp = "" + if minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:1" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_1" then + temp = "1" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:2" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_2" then + temp = "2" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:3" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_3" then + temp = "3" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:4" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_4" then + temp = "4" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:5" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_5" then + temp = "5" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:6" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_6" then + temp = "6" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:7" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_7" then + temp = "7" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:8" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_8" then + temp = "8" + elseif minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:9" or minetest.get_node({x=i, y=k, z=-76}).name == "sudoku:n_9" then + temp = "9" + else + temp = "0" + end + return temp +end +function Finisch(player) + local dd = 0 + local ar = {} + for i=14,24 do + local d = 0 + local temp = "" + for k=9,19 do + temp = temp..Fi(i,k) + end + ar[i-13] = temp + end + for i=1,3 do + if string.find(ar[i], "1") and string.find(ar[i], "2") and string.find(ar[i], "3") and string.find(ar[i], "4") and string.find(ar[i], "5") and string.find(ar[i], "6") and string.find(ar[i], "7") and string.find(ar[i], "8") and string.find(ar[i], "9") then + else + dd = 1 + end + end + for i=5,7 do + if string.find(ar[i], "1") and string.find(ar[i], "2") and string.find(ar[i], "3") and string.find(ar[i], "4") and string.find(ar[i], "5") and string.find(ar[i], "6") and string.find(ar[i], "7") and string.find(ar[i], "8") and string.find(ar[i], "9") then + else + dd = 1 + end + end + for i=9,11 do + if string.find(ar[i], "1") and string.find(ar[i], "2") and string.find(ar[i], "3") and string.find(ar[i], "4") and string.find(ar[i], "5") and string.find(ar[i], "6") and string.find(ar[i], "7") and string.find(ar[i], "8") and string.find(ar[i], "9") then + else + dd = 1 + end + end + local ar = {} + for k=9,19 do + local d = 0 + local temp = "" + for i=14,24 do + temp = temp..Fi(i,k) + end + ar[k-8] = temp + end + for i=1,3 do + if string.find(ar[i], "1") and string.find(ar[i], "2") and string.find(ar[i], "3") and string.find(ar[i], "4") and string.find(ar[i], "5") and string.find(ar[i], "6") and string.find(ar[i], "7") and string.find(ar[i], "8") and string.find(ar[i], "9") then + else + dd = 1 + end + end + for i=5,7 do + if string.find(ar[i], "1") and string.find(ar[i], "2") and string.find(ar[i], "3") and string.find(ar[i], "4") and string.find(ar[i], "5") and string.find(ar[i], "6") and string.find(ar[i], "7") and string.find(ar[i], "8") and string.find(ar[i], "9") then + else + dd = 1 + end + end + for i=9,11 do + if string.find(ar[i], "1") and string.find(ar[i], "2") and string.find(ar[i], "3") and string.find(ar[i], "4") and string.find(ar[i], "5") and string.find(ar[i], "6") and string.find(ar[i], "7") and string.find(ar[i], "8") and string.find(ar[i], "9") then + else + dd = 1 + end + end + + local ar = {} + local temp = "" + for k=9,11 do + local d = 0 + for i=14,16 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=9,11 do + local d = 0 + for i=18,20 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=9,11 do + local d = 0 + for i=22,24 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + + local ar = {} + local temp = "" + for k=13,15 do + local d = 0 + for i=14,16 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=13,15 do + local d = 0 + for i=18,20 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=13,15 do + local d = 0 + for i=22,24 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=17,29 do + local d = 0 + for i=14,16 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=17,19 do + local d = 0 + for i=18,20 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + + local ar = {} + local temp = "" + for k=17,19 do + local d = 0 + for i=22,24 do + temp = temp..Fi(i,k) + end + end + if string.find(temp, "1") and string.find(temp, "2") and string.find(temp, "3") and string.find(temp, "4") and string.find(temp, "5") and string.find(temp, "6") and string.find(temp, "7") and string.find(temp, "8") and string.find(temp, "9") then + else + dd = 1 + end + if dd == 1 then + minetest.chat_send_all("not correct") + else + local player_inv = player:get_inventory() + local ll = player_inv:get_stack("ll", 1):get_count() + local level2 = player_inv:get_stack("l", ll):get_count() + lv = io.open(minetest.get_worldpath().."/level"..ll..".txt", "r") + local level = lv:read("*l") + lv:close() + minetest.chat_send_all("level completed") + if tonumber(level) == tonumber(level2) then + le = io.open(minetest.get_worldpath().."/level"..ll..".txt", "w") + le:write(level+1) + le:close() + end + end +end +local w11 = {} +w11.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;1]" + if tonumber(level2) > 1 then + formspec = formspec.."button[1,1;1,1;;2]" + end + if tonumber(level2) > 2 then + formspec = formspec.."button[2,1;1,1;;3]" + end + if tonumber(level2) > 3 then + formspec = formspec.."button[3,1;1,1;;4]" + end + if tonumber(level2) > 4 then + formspec = formspec.."button[4,1;1,1;;5]" + end + if tonumber(level2) > 5 then + formspec = formspec.."button[0,2;1,1;;6]" + end + if tonumber(level2) > 6 then + formspec = formspec.."button[1,2;1,1;;7]" + end + if tonumber(level2) > 7 then + formspec = formspec.."button[2,2;1,1;;8]" + end + if tonumber(level2) > 8 then + formspec = formspec.."button[3,2;1,1;;9]" + end + if tonumber(level2) > 9 then + formspec = formspec.."button[4,2;1,1;;10]" + end + if tonumber(level2) > 10 then + formspec = formspec.."button[0,3;1,1;;11]" + end + if tonumber(level2) > 11 then + formspec = formspec.."button[1,3;1,1;;12]" + end + if tonumber(level2) > 12 then + formspec = formspec.."button[2,3;1,1;;13]" + end + if tonumber(level2) > 13 then + formspec = formspec.."button[3,3;1,1;;14]" + end + if tonumber(level2) > 14 then + formspec = formspec.."button[4,3;1,1;;15]" + end + if tonumber(level2) > 15 then + formspec = formspec.."button[0,4;1,1;;16]" + end + if tonumber(level2) > 16 then + formspec = formspec.."button[1,4;1,1;;17]" + end + if tonumber(level2) > 17 then + formspec = formspec.."button[2,4;1,1;;18]" + end + if tonumber(level2) > 18 then + formspec = formspec.."button[3,4;1,1;;19]" + end + if tonumber(level2) > 19 then + formspec = formspec.."button[4,4;1,1;;20]" + end + if tonumber(level2) > 20 then + formspec = formspec.."button[0,5;1,1;;21]" + end + if tonumber(level2) > 21 then + formspec = formspec.."button[1,5;1,1;;22]" + end + if tonumber(level2) > 22 then + formspec = formspec.."button[2,5;1,1;;23]" + end + if tonumber(level2) > 23 then + formspec = formspec.."button[3,5;1,1;;24]" + end + if tonumber(level2) > 24 then + formspec = formspec.."button[4,5;1,1;;25]" + end + if tonumber(level2) > 25 then + formspec = formspec.."button[2.5,6;1,1;wab;>]" + end + return formspec +end +local w12 = {} +w12.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;26]" + .."button[1.5,6;1,1;waa;<]" + if tonumber(level2) > 26 then + formspec = formspec.."button[1,1;1,1;;27]" + end + if tonumber(level2) > 27 then + formspec = formspec.."button[2,1;1,1;;28]" + end + if tonumber(level2) > 28 then + formspec = formspec.."button[3,1;1,1;;29]" + end + if tonumber(level2) > 29 then + formspec = formspec.."button[4,1;1,1;;30]" + end + if tonumber(level2) > 30 then + formspec = formspec.."button[0,2;1,1;;31]" + end + if tonumber(level2) > 31 then + formspec = formspec.."button[1,2;1,1;;32]" + end + if tonumber(level2) > 32 then + formspec = formspec.."button[2,2;1,1;;33]" + end + if tonumber(level2) > 33 then + formspec = formspec.."button[3,2;1,1;;34]" + end + if tonumber(level2) > 34 then + formspec = formspec.."button[4,2;1,1;;35]" + end + if tonumber(level2) > 35 then + formspec = formspec.."button[0,3;1,1;;36]" + end + if tonumber(level2) > 36 then + formspec = formspec.."button[1,3;1,1;;37]" + end + if tonumber(level2) > 37 then + formspec = formspec.."button[2,3;1,1;;38]" + end + if tonumber(level2) > 38 then + formspec = formspec.."button[3,3;1,1;;39]" + end + if tonumber(level2) > 39 then + formspec = formspec.."button[4,3;1,1;;40]" + end + if tonumber(level2) > 40 then + formspec = formspec.."button[0,4;1,1;;41]" + end + if tonumber(level2) > 41 then + formspec = formspec.."button[1,4;1,1;;42]" + end + if tonumber(level2) > 42 then + formspec = formspec.."button[2,4;1,1;;43]" + end + if tonumber(level2) > 43 then + formspec = formspec.."button[3,4;1,1;;44]" + end + if tonumber(level2) > 44 then + formspec = formspec.."button[4,4;1,1;;45]" + end + if tonumber(level2) > 45 then + formspec = formspec.."button[0,5;1,1;;46]" + end + if tonumber(level2) > 46 then + formspec = formspec.."button[1,5;1,1;;47]" + end + if tonumber(level2) > 47 then + formspec = formspec.."button[2,5;1,1;;48]" + end + if tonumber(level2) > 48 then + formspec = formspec.."button[3,5;1,1;;49]" + end + if tonumber(level2) > 49 then + formspec = formspec.."button[4,5;1,1;;50]" + end + if tonumber(level2) > 50 then + formspec = formspec.."button[2.5,6;1,1;wac;>]" + end + return formspec +end +local w13 = {} +w13.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;51]" + .."button[1.5,6;1,1;wab;<]" + if tonumber(level2) > 51 then + formspec = formspec.."button[1,1;1,1;;52]" + end + if tonumber(level2) > 52 then + formspec = formspec.."button[2,1;1,1;;53]" + end + if tonumber(level2) > 53 then + formspec = formspec.."button[3,1;1,1;;54]" + end + if tonumber(level2) > 54 then + formspec = formspec.."button[4,1;1,1;;55]" + end + if tonumber(level2) > 55 then + formspec = formspec.."button[0,2;1,1;;56]" + end + if tonumber(level2) > 56 then + formspec = formspec.."button[1,2;1,1;;57]" + end + if tonumber(level2) > 57 then + formspec = formspec.."button[2,2;1,1;;58]" + end + if tonumber(level2) > 58 then + formspec = formspec.."button[3,2;1,1;;59]" + end + if tonumber(level2) > 59 then + formspec = formspec.."button[4,2;1,1;;60]" + end + if tonumber(level2) > 60 then + formspec = formspec.."button[0,3;1,1;;61]" + end + if tonumber(level2) > 61 then + formspec = formspec.."button[1,3;1,1;;62]" + end + if tonumber(level2) > 62 then + formspec = formspec.."button[2,3;1,1;;63]" + end + if tonumber(level2) > 63 then + formspec = formspec.."button[3,3;1,1;;64]" + end + if tonumber(level2) > 64 then + formspec = formspec.."button[4,3;1,1;;65]" + end + if tonumber(level2) > 65 then + formspec = formspec.."button[0,4;1,1;;66]" + end + if tonumber(level2) > 66 then + formspec = formspec.."button[1,4;1,1;;67]" + end + if tonumber(level2) > 67 then + formspec = formspec.."button[2,4;1,1;;68]" + end + if tonumber(level2) > 68 then + formspec = formspec.."button[3,4;1,1;;69]" + end + if tonumber(level2) > 69 then + formspec = formspec.."button[4,4;1,1;;70]" + end + if tonumber(level2) > 70 then + formspec = formspec.."button[0,5;1,1;;71]" + end + if tonumber(level2) > 71 then + formspec = formspec.."button[1,5;1,1;;72]" + end + if tonumber(level2) > 72 then + formspec = formspec.."button[2,5;1,1;;73]" + end + if tonumber(level2) > 73 then + formspec = formspec.."button[3,5;1,1;;74]" + end + if tonumber(level2) > 74 then + formspec = formspec.."button[4,5;1,1;;75]" + end + if tonumber(level2) > 75 then + formspec = formspec.."button[2.5,6;1,1;wad;>]" + end + return formspec +end +local w14 = {} +w14.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;76]" + formspec = formspec.."button[1.5,6;1,1;wac;<]" + if tonumber(level2) > 76 then + formspec = formspec.."button[1,1;1,1;;77]" + end + if tonumber(level2) > 77 then + formspec = formspec.."button[2,1;1,1;;78]" + end + if tonumber(level2) > 78 then + formspec = formspec.."button[3,1;1,1;;79]" + end + if tonumber(level2) > 79 then + formspec = formspec.."button[4,1;1,1;;80]" + end + if tonumber(level2) > 80 then + formspec = formspec.."button[0,2;1,1;;81]" + end + if tonumber(level2) > 81 then + formspec = formspec.."button[1,2;1,1;;82]" + end + if tonumber(level2) > 82 then + formspec = formspec.."button[2,2;1,1;;83]" + end + if tonumber(level2) > 83 then + formspec = formspec.."button[3,2;1,1;;84]" + end + if tonumber(level2) > 84 then + formspec = formspec.."button[4,2;1,1;;85]" + end + if tonumber(level2) > 85 then + formspec = formspec.."button[0,3;1,1;;86]" + end + if tonumber(level2) > 86 then + formspec = formspec.."button[1,3;1,1;;87]" + end + if tonumber(level2) > 87 then + formspec = formspec.."button[2,3;1,1;;88]" + end + if tonumber(level2) > 88 then + formspec = formspec.."button[3,3;1,1;;89]" + end + if tonumber(level2) > 89 then + formspec = formspec.."button[4,3;1,1;;90]" + end + if tonumber(level2) > 90 then + formspec = formspec.."button[0,4;1,1;;91]" + end + if tonumber(level2) > 91 then + formspec = formspec.."button[1,4;1,1;;92]" + end + if tonumber(level2) > 92 then + formspec = formspec.."button[2,4;1,1;;93]" + end + if tonumber(level2) > 93 then + formspec = formspec.."button[3,4;1,1;;94]" + end + if tonumber(level2) > 94 then + formspec = formspec.."button[4,4;1,1;;95]" + end + if tonumber(level2) > 95 then + formspec = formspec.."button[0,5;1,1;;96]" + end + if tonumber(level2) > 96 then + formspec = formspec.."button[1,5;1,1;;97]" + end + if tonumber(level2) > 97 then + formspec = formspec.."button[2,5;1,1;;98]" + end + if tonumber(level2) > 98 then + formspec = formspec.."button[3,5;1,1;;99]" + end + if tonumber(level2) > 99 then + formspec = formspec.."button[4,5;1,1;;100]" + end + if tonumber(level2) > 100 then + formspec = formspec.."button[2.5,6;1,1;wae;>]" + end + return formspec +end +local w15 = {} +w15.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;101]" + formspec = formspec.."button[1.5,6;1,1;wad;<]" + if tonumber(level2) > 101 then + formspec = formspec.."button[1,1;1,1;;102]" + end + if tonumber(level2) > 102 then + formspec = formspec.."button[2,1;1,1;;103]" + end + if tonumber(level2) > 103 then + formspec = formspec.."button[3,1;1,1;;104]" + end + if tonumber(level2) > 104 then + formspec = formspec.."button[4,1;1,1;;105]" + end + if tonumber(level2) > 105 then + formspec = formspec.."button[0,2;1,1;;106]" + end + if tonumber(level2) > 106 then + formspec = formspec.."button[1,2;1,1;;107]" + end + if tonumber(level2) > 107 then + formspec = formspec.."button[2,2;1,1;;108]" + end + if tonumber(level2) > 108 then + formspec = formspec.."button[3,2;1,1;;109]" + end + if tonumber(level2) > 109 then + formspec = formspec.."button[4,2;1,1;;110]" + end + if tonumber(level2) > 110 then + formspec = formspec.."button[0,3;1,1;;111]" + end + if tonumber(level2) > 111 then + formspec = formspec.."button[1,3;1,1;;112]" + end + if tonumber(level2) > 112 then + formspec = formspec.."button[2,3;1,1;;113]" + end + if tonumber(level2) > 113 then + formspec = formspec.."button[3,3;1,1;;114]" + end + if tonumber(level2) > 114 then + formspec = formspec.."button[4,3;1,1;;115]" + end + if tonumber(level2) > 115 then + formspec = formspec.."button[0,4;1,1;;116]" + end + if tonumber(level2) > 116 then + formspec = formspec.."button[1,4;1,1;;117]" + end + if tonumber(level2) > 117 then + formspec = formspec.."button[2,4;1,1;;118]" + end + if tonumber(level2) > 118 then + formspec = formspec.."button[3,4;1,1;;119]" + end + if tonumber(level2) > 119 then + formspec = formspec.."button[4,4;1,1;;120]" + end + if tonumber(level2) > 120 then + formspec = formspec.."button[0,5;1,1;;121]" + end + if tonumber(level2) > 121 then + formspec = formspec.."button[1,5;1,1;;122]" + end + if tonumber(level2) > 122 then + formspec = formspec.."button[2,5;1,1;;123]" + end + if tonumber(level2) > 123 then + formspec = formspec.."button[3,5;1,1;;124]" + end + if tonumber(level2) > 124 then + formspec = formspec.."button[4,5;1,1;;125]" + end + if tonumber(level2) > 125 then + formspec = formspec.."button[2.5,6;1,1;waf;>]" + end + return formspec +end +local w16 = {} +w16.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;126]" + formspec = formspec.."button[1.5,6;1,1;wae;<]" + if tonumber(level2) > 126 then + formspec = formspec.."button[1,1;1,1;;127]" + end + if tonumber(level2) > 127 then + formspec = formspec.."button[2,1;1,1;;128]" + end + if tonumber(level2) > 128 then + formspec = formspec.."button[3,1;1,1;;129]" + end + if tonumber(level2) > 129 then + formspec = formspec.."button[4,1;1,1;;130]" + end + if tonumber(level2) > 130 then + formspec = formspec.."button[0,2;1,1;;131]" + end + if tonumber(level2) > 131 then + formspec = formspec.."button[1,2;1,1;;132]" + end + if tonumber(level2) > 132 then + formspec = formspec.."button[2,2;1,1;;133]" + end + if tonumber(level2) > 133 then + formspec = formspec.."button[3,2;1,1;;134]" + end + if tonumber(level2) > 134 then + formspec = formspec.."button[4,2;1,1;;135]" + end + if tonumber(level2) > 135 then + formspec = formspec.."button[0,3;1,1;;136]" + end + if tonumber(level2) > 136 then + formspec = formspec.."button[1,3;1,1;;137]" + end + if tonumber(level2) > 137 then + formspec = formspec.."button[2,3;1,1;;138]" + end + if tonumber(level2) > 138 then + formspec = formspec.."button[3,3;1,1;;139]" + end + if tonumber(level2) > 139 then + formspec = formspec.."button[4,3;1,1;;140]" + end + if tonumber(level2) > 140 then + formspec = formspec.."button[0,4;1,1;;141]" + end + if tonumber(level2) > 141 then + formspec = formspec.."button[1,4;1,1;;142]" + end + if tonumber(level2) > 142 then + formspec = formspec.."button[2,4;1,1;;143]" + end + if tonumber(level2) > 143 then + formspec = formspec.."button[3,4;1,1;;144]" + end + if tonumber(level2) > 144 then + formspec = formspec.."button[4,4;1,1;;145]" + end + if tonumber(level2) > 145 then + formspec = formspec.."button[0,5;1,1;;146]" + end + if tonumber(level2) > 146 then + formspec = formspec.."button[1,5;1,1;;147]" + end + if tonumber(level2) > 147 then + formspec = formspec.."button[2,5;1,1;;148]" + end + if tonumber(level2) > 148 then + formspec = formspec.."button[3,5;1,1;;149]" + end + if tonumber(level2) > 149 then + formspec = formspec.."button[4,5;1,1;;150]" + end + if tonumber(level2) > 150 then + formspec = formspec.."button[2.5,6;1,1;wag;>]" + end + return formspec +end +local w17 = {} +w17.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level1.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" + .."button[0,1;1,1;;151]" + formspec = formspec.."button[1.5,6;1,1;waf;<]" + if tonumber(level2) > 151 then + formspec = formspec.."button[1,1;1,1;;152]" + end + if tonumber(level2) > 152 then + formspec = formspec.."button[2,1;1,1;;153]" + end + if tonumber(level2) > 153 then + formspec = formspec.."button[3,1;1,1;;154]" + end + if tonumber(level2) > 154 then + formspec = formspec.."button[4,1;1,1;;155]" + end + if tonumber(level2) > 155 then + formspec = formspec.."button[0,2;1,1;;156]" + end + if tonumber(level2) > 156 then + formspec = formspec.."button[1,2;1,1;;157]" + end + if tonumber(level2) > 157 then + formspec = formspec.."button[2,2;1,1;;158]" + end + if tonumber(level2) > 158 then + formspec = formspec.."button[3,2;1,1;;159]" + end + if tonumber(level2) > 159 then + formspec = formspec.."button[4,2;1,1;;160]" + end + if tonumber(level2) > 160 then + formspec = formspec.."label[0,3;play world 2 and 3]" + end + return formspec +end +local w21 = {} +w21.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;1]" + if tonumber(level2) > 1 then + formspec = formspec.."button[1,1;1,1;;2]" + end + if tonumber(level2) > 2 then + formspec = formspec.."button[2,1;1,1;;3]" + end + if tonumber(level2) > 3 then + formspec = formspec.."button[3,1;1,1;;4]" + end + if tonumber(level2) > 4 then + formspec = formspec.."button[4,1;1,1;;5]" + end + if tonumber(level2) > 5 then + formspec = formspec.."button[0,2;1,1;;6]" + end + if tonumber(level2) > 6 then + formspec = formspec.."button[1,2;1,1;;7]" + end + if tonumber(level2) > 7 then + formspec = formspec.."button[2,2;1,1;;8]" + end + if tonumber(level2) > 8 then + formspec = formspec.."button[3,2;1,1;;9]" + end + if tonumber(level2) > 9 then + formspec = formspec.."button[4,2;1,1;;10]" + end + if tonumber(level2) > 10 then + formspec = formspec.."button[0,3;1,1;;11]" + end + if tonumber(level2) > 11 then + formspec = formspec.."button[1,3;1,1;;12]" + end + if tonumber(level2) > 12 then + formspec = formspec.."button[2,3;1,1;;13]" + end + if tonumber(level2) > 13 then + formspec = formspec.."button[3,3;1,1;;14]" + end + if tonumber(level2) > 14 then + formspec = formspec.."button[4,3;1,1;;15]" + end + if tonumber(level2) > 15 then + formspec = formspec.."button[0,4;1,1;;16]" + end + if tonumber(level2) > 16 then + formspec = formspec.."button[1,4;1,1;;17]" + end + if tonumber(level2) > 17 then + formspec = formspec.."button[2,4;1,1;;18]" + end + if tonumber(level2) > 18 then + formspec = formspec.."button[3,4;1,1;;19]" + end + if tonumber(level2) > 19 then + formspec = formspec.."button[4,4;1,1;;20]" + end + if tonumber(level2) > 20 then + formspec = formspec.."button[0,5;1,1;;21]" + end + if tonumber(level2) > 21 then + formspec = formspec.."button[1,5;1,1;;22]" + end + if tonumber(level2) > 22 then + formspec = formspec.."button[2,5;1,1;;23]" + end + if tonumber(level2) > 23 then + formspec = formspec.."button[3,5;1,1;;24]" + end + if tonumber(level2) > 24 then + formspec = formspec.."button[4,5;1,1;;25]" + end + if tonumber(level2) > 25 then + formspec = formspec.."button[2.5,6;1,1;wab;>]" + end + return formspec +end +local w22 = {} +w22.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;26]" + .."button[1.5,6;1,1;waa;<]" + if tonumber(level2) > 26 then + formspec = formspec.."button[1,1;1,1;;27]" + end + if tonumber(level2) > 27 then + formspec = formspec.."button[2,1;1,1;;28]" + end + if tonumber(level2) > 28 then + formspec = formspec.."button[3,1;1,1;;29]" + end + if tonumber(level2) > 29 then + formspec = formspec.."button[4,1;1,1;;30]" + end + if tonumber(level2) > 30 then + formspec = formspec.."button[0,2;1,1;;31]" + end + if tonumber(level2) > 31 then + formspec = formspec.."button[1,2;1,1;;32]" + end + if tonumber(level2) > 32 then + formspec = formspec.."button[2,2;1,1;;33]" + end + if tonumber(level2) > 33 then + formspec = formspec.."button[3,2;1,1;;34]" + end + if tonumber(level2) > 34 then + formspec = formspec.."button[4,2;1,1;;35]" + end + if tonumber(level2) > 35 then + formspec = formspec.."button[0,3;1,1;;36]" + end + if tonumber(level2) > 36 then + formspec = formspec.."button[1,3;1,1;;37]" + end + if tonumber(level2) > 37 then + formspec = formspec.."button[2,3;1,1;;38]" + end + if tonumber(level2) > 38 then + formspec = formspec.."button[3,3;1,1;;39]" + end + if tonumber(level2) > 39 then + formspec = formspec.."button[4,3;1,1;;40]" + end + if tonumber(level2) > 40 then + formspec = formspec.."button[0,4;1,1;;41]" + end + if tonumber(level2) > 41 then + formspec = formspec.."button[1,4;1,1;;42]" + end + if tonumber(level2) > 42 then + formspec = formspec.."button[2,4;1,1;;43]" + end + if tonumber(level2) > 43 then + formspec = formspec.."button[3,4;1,1;;44]" + end + if tonumber(level2) > 44 then + formspec = formspec.."button[4,4;1,1;;45]" + end + if tonumber(level2) > 45 then + formspec = formspec.."button[0,5;1,1;;46]" + end + if tonumber(level2) > 46 then + formspec = formspec.."button[1,5;1,1;;47]" + end + if tonumber(level2) > 47 then + formspec = formspec.."button[2,5;1,1;;48]" + end + if tonumber(level2) > 48 then + formspec = formspec.."button[3,5;1,1;;49]" + end + if tonumber(level2) > 49 then + formspec = formspec.."button[4,5;1,1;;50]" + end + if tonumber(level2) > 50 then + formspec = formspec.."button[2.5,6;1,1;wac;>]" + end + return formspec +end +local w23 = {} +w23.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;51]" + .."button[1.5,6;1,1;wab;<]" + if tonumber(level2) > 51 then + formspec = formspec.."button[1,1;1,1;;52]" + end + if tonumber(level2) > 52 then + formspec = formspec.."button[2,1;1,1;;53]" + end + if tonumber(level2) > 53 then + formspec = formspec.."button[3,1;1,1;;54]" + end + if tonumber(level2) > 54 then + formspec = formspec.."button[4,1;1,1;;55]" + end + if tonumber(level2) > 55 then + formspec = formspec.."button[0,2;1,1;;56]" + end + if tonumber(level2) > 56 then + formspec = formspec.."button[1,2;1,1;;57]" + end + if tonumber(level2) > 57 then + formspec = formspec.."button[2,2;1,1;;58]" + end + if tonumber(level2) > 58 then + formspec = formspec.."button[3,2;1,1;;59]" + end + if tonumber(level2) > 59 then + formspec = formspec.."button[4,2;1,1;;60]" + end + if tonumber(level2) > 60 then + formspec = formspec.."button[0,3;1,1;;61]" + end + if tonumber(level2) > 61 then + formspec = formspec.."button[1,3;1,1;;62]" + end + if tonumber(level2) > 62 then + formspec = formspec.."button[2,3;1,1;;63]" + end + if tonumber(level2) > 63 then + formspec = formspec.."button[3,3;1,1;;64]" + end + if tonumber(level2) > 64 then + formspec = formspec.."button[4,3;1,1;;65]" + end + if tonumber(level2) > 65 then + formspec = formspec.."button[0,4;1,1;;66]" + end + if tonumber(level2) > 66 then + formspec = formspec.."button[1,4;1,1;;67]" + end + if tonumber(level2) > 67 then + formspec = formspec.."button[2,4;1,1;;68]" + end + if tonumber(level2) > 68 then + formspec = formspec.."button[3,4;1,1;;69]" + end + if tonumber(level2) > 69 then + formspec = formspec.."button[4,4;1,1;;70]" + end + if tonumber(level2) > 70 then + formspec = formspec.."button[0,5;1,1;;71]" + end + if tonumber(level2) > 71 then + formspec = formspec.."button[1,5;1,1;;72]" + end + if tonumber(level2) > 72 then + formspec = formspec.."button[2,5;1,1;;73]" + end + if tonumber(level2) > 73 then + formspec = formspec.."button[3,5;1,1;;74]" + end + if tonumber(level2) > 74 then + formspec = formspec.."button[4,5;1,1;;75]" + end + if tonumber(level2) > 75 then + formspec = formspec.."button[2.5,6;1,1;wad;>]" + end + return formspec +end +local w24 = {} +w24.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;76]" + .."button[1.5,6;1,1;wac;<]" + if tonumber(level2) > 76 then + formspec = formspec.."button[1,1;1,1;;77]" + end + if tonumber(level2) > 77 then + formspec = formspec.."button[2,1;1,1;;78]" + end + if tonumber(level2) > 78 then + formspec = formspec.."button[3,1;1,1;;79]" + end + if tonumber(level2) > 79 then + formspec = formspec.."button[4,1;1,1;;80]" + end + if tonumber(level2) > 80 then + formspec = formspec.."button[0,2;1,1;;81]" + end + if tonumber(level2) > 81 then + formspec = formspec.."button[1,2;1,1;;82]" + end + if tonumber(level2) > 82 then + formspec = formspec.."button[2,2;1,1;;83]" + end + if tonumber(level2) > 83 then + formspec = formspec.."button[3,2;1,1;;84]" + end + if tonumber(level2) > 84 then + formspec = formspec.."button[4,2;1,1;;85]" + end + if tonumber(level2) > 85 then + formspec = formspec.."button[0,3;1,1;;86]" + end + if tonumber(level2) > 86 then + formspec = formspec.."button[1,3;1,1;;87]" + end + if tonumber(level2) > 87 then + formspec = formspec.."button[2,3;1,1;;88]" + end + if tonumber(level2) > 88 then + formspec = formspec.."button[3,3;1,1;;89]" + end + if tonumber(level2) > 89 then + formspec = formspec.."button[4,3;1,1;;90]" + end + if tonumber(level2) > 90 then + formspec = formspec.."button[0,4;1,1;;91]" + end + if tonumber(level2) > 91 then + formspec = formspec.."button[1,4;1,1;;92]" + end + if tonumber(level2) > 92 then + formspec = formspec.."button[2,4;1,1;;93]" + end + if tonumber(level2) > 93 then + formspec = formspec.."button[3,4;1,1;;94]" + end + if tonumber(level2) > 94 then + formspec = formspec.."button[4,4;1,1;;95]" + end + if tonumber(level2) > 95 then + formspec = formspec.."button[0,5;1,1;;96]" + end + if tonumber(level2) > 96 then + formspec = formspec.."button[1,5;1,1;;97]" + end + if tonumber(level2) > 97 then + formspec = formspec.."button[2,5;1,1;;98]" + end + if tonumber(level2) > 98 then + formspec = formspec.."button[3,5;1,1;;99]" + end + if tonumber(level2) > 99 then + formspec = formspec.."button[4,5;1,1;;100]" + end + if tonumber(level2) > 100 then + formspec = formspec.."button[2.5,6;1,1;wae;>]" + end + return formspec +end +local w25 = {} +w25.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;101]" + .."button[1.5,6;1,1;wad;<]" + if tonumber(level2) > 101 then + formspec = formspec.."button[1,1;1,1;;102]" + end + if tonumber(level2) > 102 then + formspec = formspec.."button[2,1;1,1;;103]" + end + if tonumber(level2) > 103 then + formspec = formspec.."button[3,1;1,1;;104]" + end + if tonumber(level2) > 104 then + formspec = formspec.."button[4,1;1,1;;105]" + end + if tonumber(level2) > 105 then + formspec = formspec.."button[0,2;1,1;;106]" + end + if tonumber(level2) > 106 then + formspec = formspec.."button[1,2;1,1;;107]" + end + if tonumber(level2) > 107 then + formspec = formspec.."button[2,2;1,1;;108]" + end + if tonumber(level2) > 108 then + formspec = formspec.."button[3,2;1,1;;109]" + end + if tonumber(level2) > 109 then + formspec = formspec.."button[4,2;1,1;;110]" + end + if tonumber(level2) > 110 then + formspec = formspec.."button[0,3;1,1;;111]" + end + if tonumber(level2) > 111 then + formspec = formspec.."button[1,3;1,1;;112]" + end + if tonumber(level2) > 112 then + formspec = formspec.."button[2,3;1,1;;113]" + end + if tonumber(level2) > 113 then + formspec = formspec.."button[3,3;1,1;;114]" + end + if tonumber(level2) > 114 then + formspec = formspec.."button[4,3;1,1;;115]" + end + if tonumber(level2) > 115 then + formspec = formspec.."button[0,4;1,1;;116]" + end + if tonumber(level2) > 116 then + formspec = formspec.."button[1,4;1,1;;117]" + end + if tonumber(level2) > 117 then + formspec = formspec.."button[2,4;1,1;;118]" + end + if tonumber(level2) > 118 then + formspec = formspec.."button[3,4;1,1;;119]" + end + if tonumber(level2) > 119 then + formspec = formspec.."button[4,4;1,1;;120]" + end + if tonumber(level2) > 120 then + formspec = formspec.."button[0,5;1,1;;121]" + end + if tonumber(level2) > 121 then + formspec = formspec.."button[1,5;1,1;;122]" + end + if tonumber(level2) > 122 then + formspec = formspec.."button[2,5;1,1;;123]" + end + if tonumber(level2) > 123 then + formspec = formspec.."button[3,5;1,1;;124]" + end + if tonumber(level2) > 124 then + formspec = formspec.."button[4,5;1,1;;125]" + end + if tonumber(level2) > 125 then + formspec = formspec.."button[2.5,6;1,1;waf;>]" + end + return formspec +end +local w26 = {} +w26.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;126]" + .."button[1.5,6;1,1;wae;<]" + if tonumber(level2) > 126 then + formspec = formspec.."button[1,1;1,1;;127]" + end + if tonumber(level2) > 127 then + formspec = formspec.."button[2,1;1,1;;128]" + end + if tonumber(level2) > 128 then + formspec = formspec.."button[3,1;1,1;;129]" + end + if tonumber(level2) > 129 then + formspec = formspec.."button[4,1;1,1;;130]" + end + if tonumber(level2) > 130 then + formspec = formspec.."button[0,2;1,1;;131]" + end + if tonumber(level2) > 131 then + formspec = formspec.."button[1,2;1,1;;132]" + end + if tonumber(level2) > 132 then + formspec = formspec.."button[2,2;1,1;;133]" + end + if tonumber(level2) > 133 then + formspec = formspec.."button[3,2;1,1;;134]" + end + if tonumber(level2) > 134 then + formspec = formspec.."button[4,2;1,1;;135]" + end + if tonumber(level2) > 135 then + formspec = formspec.."button[0,3;1,1;;136]" + end + if tonumber(level2) > 136 then + formspec = formspec.."button[1,3;1,1;;137]" + end + if tonumber(level2) > 137 then + formspec = formspec.."button[2,3;1,1;;138]" + end + if tonumber(level2) > 138 then + formspec = formspec.."button[3,3;1,1;;139]" + end + if tonumber(level2) > 139 then + formspec = formspec.."button[4,3;1,1;;140]" + end + if tonumber(level2) > 140 then + formspec = formspec.."button[0,4;1,1;;141]" + end + if tonumber(level2) > 141 then + formspec = formspec.."button[1,4;1,1;;142]" + end + if tonumber(level2) > 142 then + formspec = formspec.."button[2,4;1,1;;143]" + end + if tonumber(level2) > 143 then + formspec = formspec.."button[3,4;1,1;;144]" + end + if tonumber(level2) > 144 then + formspec = formspec.."button[4,4;1,1;;145]" + end + if tonumber(level2) > 145 then + formspec = formspec.."button[0,5;1,1;;146]" + end + if tonumber(level2) > 146 then + formspec = formspec.."button[1,5;1,1;;147]" + end + if tonumber(level2) > 147 then + formspec = formspec.."button[2,5;1,1;;148]" + end + if tonumber(level2) > 148 then + formspec = formspec.."button[3,5;1,1;;149]" + end + if tonumber(level2) > 149 then + formspec = formspec.."button[4,5;1,1;;150]" + end + if tonumber(level2) > 150 then + formspec = formspec.."button[2.5,6;1,1;wag;>]" + end + return formspec +end +local w27 = {} +w27.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;151]" + .."button[1.5,6;1,1;waf;<]" + if tonumber(level2) > 151 then + formspec = formspec.."button[1,1;1,1;;152]" + end + if tonumber(level2) > 152 then + formspec = formspec.."button[2,1;1,1;;153]" + end + if tonumber(level2) > 153 then + formspec = formspec.."button[3,1;1,1;;154]" + end + if tonumber(level2) > 154 then + formspec = formspec.."button[4,1;1,1;;155]" + end + if tonumber(level2) > 155 then + formspec = formspec.."button[0,2;1,1;;156]" + end + if tonumber(level2) > 156 then + formspec = formspec.."button[1,2;1,1;;157]" + end + if tonumber(level2) > 157 then + formspec = formspec.."button[2,2;1,1;;158]" + end + if tonumber(level2) > 158 then + formspec = formspec.."button[3,2;1,1;;159]" + end + if tonumber(level2) > 159 then + formspec = formspec.."button[4,2;1,1;;160]" + end + if tonumber(level2) > 160 then + formspec = formspec.."button[0,3;1,1;;161]" + end + if tonumber(level2) > 161 then + formspec = formspec.."button[1,3;1,1;;162]" + end + if tonumber(level2) > 162 then + formspec = formspec.."button[2,3;1,1;;163]" + end + if tonumber(level2) > 163 then + formspec = formspec.."button[3,3;1,1;;164]" + end + if tonumber(level2) > 164 then + formspec = formspec.."button[4,3;1,1;;165]" + end + if tonumber(level2) > 165 then + formspec = formspec.."button[0,4;1,1;;166]" + end + if tonumber(level2) > 166 then + formspec = formspec.."button[1,4;1,1;;167]" + end + if tonumber(level2) > 167 then + formspec = formspec.."button[2,4;1,1;;168]" + end + if tonumber(level2) > 168 then + formspec = formspec.."button[3,4;1,1;;169]" + end + if tonumber(level2) > 169 then + formspec = formspec.."button[4,4;1,1;;170]" + end + if tonumber(level2) > 170 then + formspec = formspec.."button[0,5;1,1;;171]" + end + if tonumber(level2) > 171 then + formspec = formspec.."button[1,5;1,1;;172]" + end + if tonumber(level2) > 172 then + formspec = formspec.."button[2,5;1,1;;173]" + end + if tonumber(level2) > 173 then + formspec = formspec.."button[3,5;1,1;;174]" + end + if tonumber(level2) > 174 then + formspec = formspec.."button[4,5;1,1;;175]" + end + if tonumber(level2) > 175 then + formspec = formspec.."button[2.5,6;1,1;wah;>]" + end + return formspec +end +local w28 = {} +w28.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level2.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" + .."button[0,1;1,1;;176]" + .."button[1.5,6;1,1;wag;<]" + if tonumber(level2) > 176 then + formspec = formspec.."button[1,1;1,1;;177]" + end + if tonumber(level2) > 177 then + formspec = formspec.."button[2,1;1,1;;178]" + end + if tonumber(level2) > 178 then + formspec = formspec.."button[3,1;1,1;;179]" + end + if tonumber(level2) > 179 then + formspec = formspec.."button[4,1;1,1;;180]" + end + if tonumber(level2) > 180 then + formspec = formspec.."button[0,2;1,1;;181]" + end + if tonumber(level2) > 181 then + formspec = formspec.."button[1,2;1,1;;182]" + end + if tonumber(level2) > 182 then + formspec = formspec.."button[2,2;1,1;;183]" + end + if tonumber(level2) > 183 then + formspec = formspec.."button[3,2;1,1;;184]" + end + if tonumber(level2) > 184 then + formspec = formspec.."button[4,2;1,1;;185]" + end + if tonumber(level2) > 185 then + formspec = formspec.."button[0,3;1,1;;186]" + end + if tonumber(level2) > 186 then + formspec = formspec.."button[1,3;1,1;;187]" + end + if tonumber(level2) > 187 then + formspec = formspec.."button[2,3;1,1;;188]" + end + if tonumber(level2) > 188 then + formspec = formspec.."button[3,3;1,1;;189]" + end + if tonumber(level2) > 189 then + formspec = formspec.."button[4,3;1,1;;190]" + end + if tonumber(level2) > 190 then + formspec = formspec.."label[0,4;play world 1 and 3]" + end + return formspec +end +local w31 = {} +w31.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;1]" + if tonumber(level2) > 1 then + formspec = formspec.."button[1,1;1,1;;2]" + end + if tonumber(level2) > 2 then + formspec = formspec.."button[2,1;1,1;;3]" + end + if tonumber(level2) > 3 then + formspec = formspec.."button[3,1;1,1;;4]" + end + if tonumber(level2) > 4 then + formspec = formspec.."button[4,1;1,1;;5]" + end + if tonumber(level2) > 5 then + formspec = formspec.."button[0,2;1,1;;6]" + end + if tonumber(level2) > 6 then + formspec = formspec.."button[1,2;1,1;;7]" + end + if tonumber(level2) > 7 then + formspec = formspec.."button[2,2;1,1;;8]" + end + if tonumber(level2) > 8 then + formspec = formspec.."button[3,2;1,1;;9]" + end + if tonumber(level2) > 9 then + formspec = formspec.."button[4,2;1,1;;10]" + end + if tonumber(level2) > 10 then + formspec = formspec.."button[0,3;1,1;;11]" + end + if tonumber(level2) > 11 then + formspec = formspec.."button[1,3;1,1;;12]" + end + if tonumber(level2) > 12 then + formspec = formspec.."button[2,3;1,1;;13]" + end + if tonumber(level2) > 13 then + formspec = formspec.."button[3,3;1,1;;14]" + end + if tonumber(level2) > 14 then + formspec = formspec.."button[4,3;1,1;;15]" + end + if tonumber(level2) > 15 then + formspec = formspec.."button[0,4;1,1;;16]" + end + if tonumber(level2) > 16 then + formspec = formspec.."button[1,4;1,1;;17]" + end + if tonumber(level2) > 17 then + formspec = formspec.."button[2,4;1,1;;18]" + end + if tonumber(level2) > 18 then + formspec = formspec.."button[3,4;1,1;;19]" + end + if tonumber(level2) > 19 then + formspec = formspec.."button[4,4;1,1;;20]" + end + if tonumber(level2) > 20 then + formspec = formspec.."button[0,5;1,1;;21]" + end + if tonumber(level2) > 21 then + formspec = formspec.."button[1,5;1,1;;22]" + end + if tonumber(level2) > 22 then + formspec = formspec.."button[2,5;1,1;;23]" + end + if tonumber(level2) > 23 then + formspec = formspec.."button[3,5;1,1;;24]" + end + if tonumber(level2) > 24 then + formspec = formspec.."button[4,5;1,1;;25]" + end + if tonumber(level2) > 25 then + formspec = formspec.."button[2.5,6;1,1;wab;>]" + end + return formspec +end +local w32 = {} +w32.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;26]" + .."button[1.5,6;1,1;waa;<]" + if tonumber(level2) > 26 then + formspec = formspec.."button[1,1;1,1;;27]" + end + if tonumber(level2) > 27 then + formspec = formspec.."button[2,1;1,1;;28]" + end + if tonumber(level2) > 28 then + formspec = formspec.."button[3,1;1,1;;29]" + end + if tonumber(level2) > 29 then + formspec = formspec.."button[4,1;1,1;;30]" + end + if tonumber(level2) > 30 then + formspec = formspec.."button[0,2;1,1;;31]" + end + if tonumber(level2) > 31 then + formspec = formspec.."button[1,2;1,1;;32]" + end + if tonumber(level2) > 32 then + formspec = formspec.."button[2,2;1,1;;33]" + end + if tonumber(level2) > 33 then + formspec = formspec.."button[3,2;1,1;;34]" + end + if tonumber(level2) > 34 then + formspec = formspec.."button[4,2;1,1;;35]" + end + if tonumber(level2) > 35 then + formspec = formspec.."button[0,3;1,1;;36]" + end + if tonumber(level2) > 36 then + formspec = formspec.."button[1,3;1,1;;37]" + end + if tonumber(level2) > 37 then + formspec = formspec.."button[2,3;1,1;;38]" + end + if tonumber(level2) > 38 then + formspec = formspec.."button[3,3;1,1;;39]" + end + if tonumber(level2) > 39 then + formspec = formspec.."button[4,3;1,1;;40]" + end + if tonumber(level2) > 40 then + formspec = formspec.."button[0,4;1,1;;41]" + end + if tonumber(level2) > 41 then + formspec = formspec.."button[1,4;1,1;;42]" + end + if tonumber(level2) > 42 then + formspec = formspec.."button[2,4;1,1;;43]" + end + if tonumber(level2) > 43 then + formspec = formspec.."button[3,4;1,1;;44]" + end + if tonumber(level2) > 44 then + formspec = formspec.."button[4,4;1,1;;45]" + end + if tonumber(level2) > 45 then + formspec = formspec.."button[0,5;1,1;;46]" + end + if tonumber(level2) > 46 then + formspec = formspec.."button[1,5;1,1;;47]" + end + if tonumber(level2) > 47 then + formspec = formspec.."button[2,5;1,1;;48]" + end + if tonumber(level2) > 48 then + formspec = formspec.."button[3,5;1,1;;49]" + end + if tonumber(level2) > 49 then + formspec = formspec.."button[4,5;1,1;;50]" + end + if tonumber(level2) > 50 then + formspec = formspec.."button[2.5,6;1,1;wac;>]" + end + return formspec +end +local w33 = {} +w33.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;51]" + .."button[1.5,6;1,1;wab;<]" + if tonumber(level2) > 51 then + formspec = formspec.."button[1,1;1,1;;52]" + end + if tonumber(level2) > 52 then + formspec = formspec.."button[2,1;1,1;;53]" + end + if tonumber(level2) > 53 then + formspec = formspec.."button[3,1;1,1;;54]" + end + if tonumber(level2) > 54 then + formspec = formspec.."button[4,1;1,1;;55]" + end + if tonumber(level2) > 55 then + formspec = formspec.."button[0,2;1,1;;56]" + end + if tonumber(level2) > 56 then + formspec = formspec.."button[1,2;1,1;;57]" + end + if tonumber(level2) > 57 then + formspec = formspec.."button[2,2;1,1;;58]" + end + if tonumber(level2) > 58 then + formspec = formspec.."button[3,2;1,1;;59]" + end + if tonumber(level2) > 59 then + formspec = formspec.."button[4,2;1,1;;60]" + end + if tonumber(level2) > 60 then + formspec = formspec.."button[0,3;1,1;;61]" + end + if tonumber(level2) > 61 then + formspec = formspec.."button[1,3;1,1;;62]" + end + if tonumber(level2) > 62 then + formspec = formspec.."button[2,3;1,1;;63]" + end + if tonumber(level2) > 63 then + formspec = formspec.."button[3,3;1,1;;64]" + end + if tonumber(level2) > 64 then + formspec = formspec.."button[4,3;1,1;;65]" + end + if tonumber(level2) > 65 then + formspec = formspec.."button[0,4;1,1;;66]" + end + if tonumber(level2) > 66 then + formspec = formspec.."button[1,4;1,1;;67]" + end + if tonumber(level2) > 67 then + formspec = formspec.."button[2,4;1,1;;68]" + end + if tonumber(level2) > 68 then + formspec = formspec.."button[3,4;1,1;;69]" + end + if tonumber(level2) > 69 then + formspec = formspec.."button[4,4;1,1;;70]" + end + if tonumber(level2) > 70 then + formspec = formspec.."button[0,5;1,1;;71]" + end + if tonumber(level2) > 71 then + formspec = formspec.."button[1,5;1,1;;72]" + end + if tonumber(level2) > 72 then + formspec = formspec.."button[2,5;1,1;;73]" + end + if tonumber(level2) > 73 then + formspec = formspec.."button[3,5;1,1;;74]" + end + if tonumber(level2) > 74 then + formspec = formspec.."button[4,5;1,1;;75]" + end + if tonumber(level2) > 75 then + formspec = formspec.."button[2.5,6;1,1;wad;>]" + end + return formspec +end +local w34 = {} +w34.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;76]" + .."button[1.5,6;1,1;wac;<]" + if tonumber(level2) > 76 then + formspec = formspec.."button[1,1;1,1;;77]" + end + if tonumber(level2) > 77 then + formspec = formspec.."button[2,1;1,1;;78]" + end + if tonumber(level2) > 78 then + formspec = formspec.."button[3,1;1,1;;79]" + end + if tonumber(level2) > 79 then + formspec = formspec.."button[4,1;1,1;;80]" + end + if tonumber(level2) > 80 then + formspec = formspec.."button[0,2;1,1;;81]" + end + if tonumber(level2) > 81 then + formspec = formspec.."button[1,2;1,1;;82]" + end + if tonumber(level2) > 82 then + formspec = formspec.."button[2,2;1,1;;83]" + end + if tonumber(level2) > 83 then + formspec = formspec.."button[3,2;1,1;;84]" + end + if tonumber(level2) > 84 then + formspec = formspec.."button[4,2;1,1;;85]" + end + if tonumber(level2) > 85 then + formspec = formspec.."button[0,3;1,1;;86]" + end + if tonumber(level2) > 86 then + formspec = formspec.."button[1,3;1,1;;87]" + end + if tonumber(level2) > 87 then + formspec = formspec.."button[2,3;1,1;;88]" + end + if tonumber(level2) > 88 then + formspec = formspec.."button[3,3;1,1;;89]" + end + if tonumber(level2) > 89 then + formspec = formspec.."button[4,3;1,1;;90]" + end + if tonumber(level2) > 90 then + formspec = formspec.."button[0,4;1,1;;91]" + end + if tonumber(level2) > 91 then + formspec = formspec.."button[1,4;1,1;;92]" + end + if tonumber(level2) > 92 then + formspec = formspec.."button[2,4;1,1;;93]" + end + if tonumber(level2) > 93 then + formspec = formspec.."button[3,4;1,1;;94]" + end + if tonumber(level2) > 94 then + formspec = formspec.."button[4,4;1,1;;95]" + end + if tonumber(level2) > 95 then + formspec = formspec.."button[0,5;1,1;;96]" + end + if tonumber(level2) > 96 then + formspec = formspec.."button[1,5;1,1;;97]" + end + if tonumber(level2) > 97 then + formspec = formspec.."button[2,5;1,1;;98]" + end + if tonumber(level2) > 98 then + formspec = formspec.."button[3,5;1,1;;99]" + end + if tonumber(level2) > 99 then + formspec = formspec.."button[4,5;1,1;;100]" + end + if tonumber(level2) > 100 then + formspec = formspec.."button[2.5,6;1,1;wae;>]" + end + return formspec +end +local w35 = {} +w35.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;101]" + .."button[1.5,6;1,1;wad;<]" + if tonumber(level2) > 101 then + formspec = formspec.."button[1,1;1,1;;102]" + end + if tonumber(level2) > 102 then + formspec = formspec.."button[2,1;1,1;;103]" + end + if tonumber(level2) > 103 then + formspec = formspec.."button[3,1;1,1;;104]" + end + if tonumber(level2) > 104 then + formspec = formspec.."button[4,1;1,1;;105]" + end + if tonumber(level2) > 105 then + formspec = formspec.."button[0,2;1,1;;106]" + end + if tonumber(level2) > 106 then + formspec = formspec.."button[1,2;1,1;;107]" + end + if tonumber(level2) > 107 then + formspec = formspec.."button[2,2;1,1;;108]" + end + if tonumber(level2) > 108 then + formspec = formspec.."button[3,2;1,1;;109]" + end + if tonumber(level2) > 109 then + formspec = formspec.."button[4,2;1,1;;110]" + end + if tonumber(level2) > 110 then + formspec = formspec.."button[0,3;1,1;;111]" + end + if tonumber(level2) > 111 then + formspec = formspec.."button[1,3;1,1;;112]" + end + if tonumber(level2) > 112 then + formspec = formspec.."button[2,3;1,1;;113]" + end + if tonumber(level2) > 113 then + formspec = formspec.."button[3,3;1,1;;114]" + end + if tonumber(level2) > 114 then + formspec = formspec.."button[4,3;1,1;;115]" + end + if tonumber(level2) > 115 then + formspec = formspec.."button[0,4;1,1;;116]" + end + if tonumber(level2) > 116 then + formspec = formspec.."button[1,4;1,1;;117]" + end + if tonumber(level2) > 117 then + formspec = formspec.."button[2,4;1,1;;118]" + end + if tonumber(level2) > 118 then + formspec = formspec.."button[3,4;1,1;;119]" + end + if tonumber(level2) > 119 then + formspec = formspec.."button[4,4;1,1;;120]" + end + if tonumber(level2) > 120 then + formspec = formspec.."button[0,5;1,1;;121]" + end + if tonumber(level2) > 121 then + formspec = formspec.."button[1,5;1,1;;122]" + end + if tonumber(level2) > 122 then + formspec = formspec.."button[2,5;1,1;;123]" + end + if tonumber(level2) > 123 then + formspec = formspec.."button[3,5;1,1;;124]" + end + if tonumber(level2) > 124 then + formspec = formspec.."button[4,5;1,1;;125]" + end + if tonumber(level2) > 125 then + formspec = formspec.."button[2.5,6;1,1;waf;>]" + end + return formspec +end +local w36 = {} +w36.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;126]" + .."button[1.5,6;1,1;wae;<]" + if tonumber(level2) > 126 then + formspec = formspec.."button[1,1;1,1;;127]" + end + if tonumber(level2) > 127 then + formspec = formspec.."button[2,1;1,1;;128]" + end + if tonumber(level2) > 128 then + formspec = formspec.."button[3,1;1,1;;129]" + end + if tonumber(level2) > 129 then + formspec = formspec.."button[4,1;1,1;;130]" + end + if tonumber(level2) > 130 then + formspec = formspec.."button[0,2;1,1;;131]" + end + if tonumber(level2) > 131 then + formspec = formspec.."button[1,2;1,1;;132]" + end + if tonumber(level2) > 132 then + formspec = formspec.."button[2,2;1,1;;133]" + end + if tonumber(level2) > 133 then + formspec = formspec.."button[3,2;1,1;;134]" + end + if tonumber(level2) > 134 then + formspec = formspec.."button[4,2;1,1;;135]" + end + if tonumber(level2) > 135 then + formspec = formspec.."button[0,3;1,1;;136]" + end + if tonumber(level2) > 136 then + formspec = formspec.."button[1,3;1,1;;137]" + end + if tonumber(level2) > 137 then + formspec = formspec.."button[2,3;1,1;;138]" + end + if tonumber(level2) > 138 then + formspec = formspec.."button[3,3;1,1;;139]" + end + if tonumber(level2) > 139 then + formspec = formspec.."button[4,3;1,1;;140]" + end + if tonumber(level2) > 140 then + formspec = formspec.."button[0,4;1,1;;141]" + end + if tonumber(level2) > 141 then + formspec = formspec.."button[1,4;1,1;;142]" + end + if tonumber(level2) > 142 then + formspec = formspec.."button[2,4;1,1;;143]" + end + if tonumber(level2) > 143 then + formspec = formspec.."button[3,4;1,1;;144]" + end + if tonumber(level2) > 144 then + formspec = formspec.."button[4,4;1,1;;145]" + end + if tonumber(level2) > 145 then + formspec = formspec.."button[0,5;1,1;;146]" + end + if tonumber(level2) > 146 then + formspec = formspec.."button[1,5;1,1;;147]" + end + if tonumber(level2) > 147 then + formspec = formspec.."button[2,5;1,1;;148]" + end + if tonumber(level2) > 148 then + formspec = formspec.."button[3,5;1,1;;149]" + end + if tonumber(level2) > 149 then + formspec = formspec.."button[4,5;1,1;;150]" + end + if tonumber(level2) > 150 then + formspec = formspec.."button[2.5,6;1,1;wag;>]" + end + return formspec +end +local w37 = {} +w37.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;151]" + .."button[1.5,6;1,1;waf;<]" + if tonumber(level2) > 151 then + formspec = formspec.."button[1,1;1,1;;152]" + end + if tonumber(level2) > 152 then + formspec = formspec.."button[2,1;1,1;;153]" + end + if tonumber(level2) > 153 then + formspec = formspec.."button[3,1;1,1;;154]" + end + if tonumber(level2) > 154 then + formspec = formspec.."button[4,1;1,1;;155]" + end + if tonumber(level2) > 155 then + formspec = formspec.."button[0,2;1,1;;156]" + end + if tonumber(level2) > 156 then + formspec = formspec.."button[1,2;1,1;;157]" + end + if tonumber(level2) > 157 then + formspec = formspec.."button[2,2;1,1;;158]" + end + if tonumber(level2) > 158 then + formspec = formspec.."button[3,2;1,1;;159]" + end + if tonumber(level2) > 159 then + formspec = formspec.."button[4,2;1,1;;160]" + end + if tonumber(level2) > 160 then + formspec = formspec.."button[0,3;1,1;;161]" + end + if tonumber(level2) > 161 then + formspec = formspec.."button[1,3;1,1;;162]" + end + if tonumber(level2) > 162 then + formspec = formspec.."button[2,3;1,1;;163]" + end + if tonumber(level2) > 163 then + formspec = formspec.."button[3,3;1,1;;164]" + end + if tonumber(level2) > 164 then + formspec = formspec.."button[4,3;1,1;;165]" + end + if tonumber(level2) > 165 then + formspec = formspec.."button[0,4;1,1;;166]" + end + if tonumber(level2) > 166 then + formspec = formspec.."button[1,4;1,1;;167]" + end + if tonumber(level2) > 167 then + formspec = formspec.."button[2,4;1,1;;168]" + end + if tonumber(level2) > 168 then + formspec = formspec.."button[3,4;1,1;;169]" + end + if tonumber(level2) > 169 then + formspec = formspec.."button[4,4;1,1;;170]" + end + if tonumber(level2) > 170 then + formspec = formspec.."button[0,5;1,1;;171]" + end + if tonumber(level2) > 171 then + formspec = formspec.."button[1,5;1,1;;172]" + end + if tonumber(level2) > 172 then + formspec = formspec.."button[2,5;1,1;;173]" + end + if tonumber(level2) > 173 then + formspec = formspec.."button[3,5;1,1;;174]" + end + if tonumber(level2) > 174 then + formspec = formspec.."button[4,5;1,1;;175]" + end + if tonumber(level2) > 175 then + formspec = formspec.."button[2.5,6;1,1;wah;>]" + end + return formspec +end +local w38 = {} +w38.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;176]" + .."button[1.5,6;1,1;wag;<]" + if tonumber(level2) > 176 then + formspec = formspec.."button[1,1;1,1;;177]" + end + if tonumber(level2) > 177 then + formspec = formspec.."button[2,1;1,1;;178]" + end + if tonumber(level2) > 178 then + formspec = formspec.."button[3,1;1,1;;179]" + end + if tonumber(level2) > 179 then + formspec = formspec.."button[4,1;1,1;;180]" + end + if tonumber(level2) > 180 then + formspec = formspec.."button[0,2;1,1;;181]" + end + if tonumber(level2) > 181 then + formspec = formspec.."button[1,2;1,1;;182]" + end + if tonumber(level2) > 182 then + formspec = formspec.."button[2,2;1,1;;183]" + end + if tonumber(level2) > 183 then + formspec = formspec.."button[3,2;1,1;;184]" + end + if tonumber(level2) > 184 then + formspec = formspec.."button[4,2;1,1;;185]" + end + if tonumber(level2) > 185 then + formspec = formspec.."button[0,3;1,1;;186]" + end + if tonumber(level2) > 186 then + formspec = formspec.."button[1,3;1,1;;187]" + end + if tonumber(level2) > 187 then + formspec = formspec.."button[2,3;1,1;;188]" + end + if tonumber(level2) > 188 then + formspec = formspec.."button[3,3;1,1;;189]" + end + if tonumber(level2) > 189 then + formspec = formspec.."button[4,3;1,1;;190]" + end + if tonumber(level2) > 190 then + formspec = formspec.."button[0,4;1,1;;191]" + end + if tonumber(level2) > 191 then + formspec = formspec.."button[1,4;1,1;;192]" + end + if tonumber(level2) > 192 then + formspec = formspec.."button[2,4;1,1;;193]" + end + if tonumber(level2) > 193 then + formspec = formspec.."button[3,4;1,1;;194]" + end + if tonumber(level2) > 194 then + formspec = formspec.."button[4,4;1,1;;195]" + end + if tonumber(level2) > 195 then + formspec = formspec.."button[0,5;1,1;;196]" + end + if tonumber(level2) > 196 then + formspec = formspec.."button[1,5;1,1;;197]" + end + if tonumber(level2) > 197 then + formspec = formspec.."button[2,5;1,1;;198]" + end + if tonumber(level2) > 198 then + formspec = formspec.."button[3,5;1,1;;199]" + end + if tonumber(level2) > 199 then + formspec = formspec.."button[4,5;1,1;;200]" + end + if tonumber(level2) > 200 then + formspec = formspec.."button[2.5,6;1,1;wai;>]" + end + return formspec +end +local w39 = {} +w39.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level3.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/222]" + .."button[0,1;1,1;;201]" + .."button[1.5,6;1,1;wah;<]" + if tonumber(level2) > 201 then + formspec = formspec.."button[1,1;1,1;;202]" + end + if tonumber(level2) > 202 then + formspec = formspec.."button[2,1;1,1;;203]" + end + if tonumber(level2) > 203 then + formspec = formspec.."button[3,1;1,1;;204]" + end + if tonumber(level2) > 204 then + formspec = formspec.."button[4,1;1,1;;205]" + end + if tonumber(level2) > 205 then + formspec = formspec.."button[0,2;1,1;;206]" + end + if tonumber(level2) > 206 then + formspec = formspec.."button[1,2;1,1;;207]" + end + if tonumber(level2) > 207 then + formspec = formspec.."button[2,2;1,1;;208]" + end + if tonumber(level2) > 208 then + formspec = formspec.."button[3,2;1,1;;209]" + end + if tonumber(level2) > 209 then + formspec = formspec.."button[4,2;1,1;;210]" + end + if tonumber(level2) > 210 then + formspec = formspec.."button[0,3;1,1;;211]" + end + if tonumber(level2) > 211 then + formspec = formspec.."button[1,3;1,1;;212]" + end + if tonumber(level2) > 212 then + formspec = formspec.."button[2,3;1,1;;213]" + end + if tonumber(level2) > 213 then + formspec = formspec.."button[3,3;1,1;;214]" + end + if tonumber(level2) > 214 then + formspec = formspec.."button[4,3;1,1;;215]" + end + if tonumber(level2) > 215 then + formspec = formspec.."button[0,4;1,1;;216]" + end + if tonumber(level2) > 216 then + formspec = formspec.."button[1,4;1,1;;217]" + end + if tonumber(level2) > 217 then + formspec = formspec.."button[2,4;1,1;;218]" + end + if tonumber(level2) > 218 then + formspec = formspec.."button[3,4;1,1;;219]" + end + if tonumber(level2) > 219 then + formspec = formspec.."button[4,4;1,1;;220]" + end + if tonumber(level2) > 220 then + formspec = formspec.."button[0,5;1,1;;221]" + end + if tonumber(level2) > 221 then + formspec = formspec.."button[1,5;1,1;;222]" + end + if tonumber(level2) > 222 then + formspec = formspec.."label[0,5.8;wait until the next update]" + end + return formspec +end +local w3 = {} +w3.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + formspec = "size[8,8.3]" + .."background[9,10.3;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."label[0,0;Comming soon]" + return formspec +end +minetest.register_node("sudoku:new_w1",{ + tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_w1.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + local player_inv = player:get_inventory() + local page = player_inv:get_stack("page1", 1):get_count()+1 + if page == 1 then + minetest.show_formspec(player:get_player_name(), "w11" , w11.get_formspec(player)) + elseif page == 2 then + minetest.show_formspec(player:get_player_name(), "w12" , w12.get_formspec(player)) + elseif page == 3 then + minetest.show_formspec(player:get_player_name(), "w13" , w13.get_formspec(player)) + elseif page == 4 then + minetest.show_formspec(player:get_player_name(), "w14" , w14.get_formspec(player)) + elseif page == 5 then + minetest.show_formspec(player:get_player_name(), "w15" , w15.get_formspec(player)) + elseif page == 6 then + minetest.show_formspec(player:get_player_name(), "w16" , w16.get_formspec(player)) + elseif page == 7 then + minetest.show_formspec(player:get_player_name(), "w17" , w17.get_formspec(player)) + end + end, +}) +minetest.register_node("sudoku:new_w2",{ + tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_w2.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + local player_inv = player:get_inventory() + local page = player_inv:get_stack("page2", 1):get_count()+1 + if page == 1 then + minetest.show_formspec(player:get_player_name(), "w21" , w21.get_formspec(player)) + elseif page == 2 then + minetest.show_formspec(player:get_player_name(), "w22" , w22.get_formspec(player)) + elseif page == 3 then + minetest.show_formspec(player:get_player_name(), "w23" , w23.get_formspec(player)) + elseif page == 4 then + minetest.show_formspec(player:get_player_name(), "w24" , w24.get_formspec(player)) + elseif page == 5 then + minetest.show_formspec(player:get_player_name(), "w25" , w25.get_formspec(player)) + elseif page == 6 then + minetest.show_formspec(player:get_player_name(), "w26" , w26.get_formspec(player)) + elseif page == 7 then + minetest.show_formspec(player:get_player_name(), "w27" , w27.get_formspec(player)) + elseif page == 8 then + minetest.show_formspec(player:get_player_name(), "w28" , w28.get_formspec(player)) + end + end, +}) +minetest.register_node("sudoku:new_w3",{ + tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_w3.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + local player_inv = player:get_inventory() + local page = player_inv:get_stack("page3", 1):get_count()+1 + if page == 1 then + minetest.show_formspec(player:get_player_name(), "w31" , w31.get_formspec(player)) + elseif page == 2 then + minetest.show_formspec(player:get_player_name(), "w32" , w32.get_formspec(player)) + elseif page == 3 then + minetest.show_formspec(player:get_player_name(), "w33" , w33.get_formspec(player)) + elseif page == 4 then + minetest.show_formspec(player:get_player_name(), "w34" , w34.get_formspec(player)) + elseif page == 5 then + minetest.show_formspec(player:get_player_name(), "w35" , w35.get_formspec(player)) + elseif page == 6 then + minetest.show_formspec(player:get_player_name(), "w36" , w36.get_formspec(player)) + elseif page == 7 then + minetest.show_formspec(player:get_player_name(), "w37" , w37.get_formspec(player)) + elseif page == 8 then + minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) + elseif page == 9 then + minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player)) + end + end, +}) +minetest.register_node("sudoku:new_w4",{ + tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_w4.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + minetest.show_formspec(player:get_player_name(), "w3" , w3.get_formspec(player)) + end, +}) +minetest.register_node("sudoku:new_w5",{ + tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_w5.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + minetest.show_formspec(player:get_player_name(), "w3" , w3.get_formspec(player)) + end, +}) +minetest.register_node("sudoku:new_ws",{ + tiles = {"default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png^sudoku_new_ws.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + minetest.show_formspec(player:get_player_name(), "w3" , w3.get_formspec(player)) + end, +}) +minetest.register_node("sudoku:finisch",{ + tiles = {"default_silver_sandstone_block.png^sudoku_finisch.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png","default_silver_sandstone_block.png"}, + description = "New", + --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + on_punch = function(pos, node, player, pointed_thing) + Finisch(player) + end, +}) +minetest.register_on_player_receive_fields(function(player, formname, fields) + local player_inv = player:get_inventory() + player_inv:set_size("ll", 1) + player_inv:set_size("l", 6) + player_inv:set_size("page1", 1) + player_inv:set_size("page2", 1) + player_inv:set_size("page3", 1) + local d = 0 + if formname == "w11" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.wab then + player_inv:set_stack("page1", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w12" , w12.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w12" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.waa then + player_inv:set_stack("page1", 1, nil) + minetest.show_formspec(player:get_player_name(), "w11" , w11.get_formspec(player)) + elseif fields.wac then + player_inv:set_stack("page1", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w13" , w13.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w13" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.wab then + player_inv:set_stack("page1", 1, "default:dirt 1") + minetest.show_formspec(player:get_player_name(), "w12" , w12.get_formspec(player)) + elseif fields.wad then + player_inv:set_stack("page1", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w14" , w14.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w14" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.wac then + player_inv:set_stack("page1", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w13" , w13.get_formspec(player)) + elseif fields.wae then + player_inv:set_stack("page1", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w15" , w15.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w15" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.wad then + player_inv:set_stack("page1", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w14" , w14.get_formspec(player)) + elseif fields.waf then + player_inv:set_stack("page1", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w16" , w16.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w16" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.wae then + player_inv:set_stack("page1", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w15" , w15.get_formspec(player)) + elseif fields.wag then + player_inv:set_stack("page1", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w17" , w17.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w17" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"1_"..v) + player_inv:set_stack("l", 1, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 1") + end + end + if fields.waf then + player_inv:set_stack("page1", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w16" , w16.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w21" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.wab then + player_inv:set_stack("page2", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w22" , w22.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w22" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.waa then + player_inv:set_stack("page2", 1, nil) + minetest.show_formspec(player:get_player_name(), "w21" , w21.get_formspec(player)) + elseif fields.wac then + player_inv:set_stack("page2", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w23" , w23.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w23" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.wab then + player_inv:set_stack("page2", 1, nil) + minetest.show_formspec(player:get_player_name(), "w22" , w22.get_formspec(player)) + elseif fields.wad then + player_inv:set_stack("page2", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w24" , w24.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w24" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.wac then + player_inv:set_stack("page2", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w23" , w23.get_formspec(player)) + elseif fields.wae then + player_inv:set_stack("page2", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w25" , w25.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w25" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.wad then + player_inv:set_stack("page2", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w24" , w24.get_formspec(player)) + elseif fields.waf then + player_inv:set_stack("page2", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w26" , w26.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w26" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.wae then + player_inv:set_stack("page2", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w25" , w25.get_formspec(player)) + elseif fields.wag then + player_inv:set_stack("page2", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w27" , w27.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w27" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.waf then + player_inv:set_stack("page2", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w26" , w26.get_formspec(player)) + elseif fields.wah then + player_inv:set_stack("page2", 1, "default:dirt 7") + minetest.show_formspec(player:get_player_name(), "w28" , w28.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w28" and d == 0 then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"2_"..v) + player_inv:set_stack("l", 2, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 2") + end + end + if fields.wag then + player_inv:set_stack("page2", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w27" , w27.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w31" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wab then + player_inv:set_stack("page3", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w32" , w32.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w32" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.waa then + player_inv:set_stack("page3", 1,nil) + minetest.show_formspec(player:get_player_name(), "w31" , w31.get_formspec(player)) + elseif fields.wac then + player_inv:set_stack("page3", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w33" , w33.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w33" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wab then + player_inv:set_stack("page3", 1,"default:dirt") + minetest.show_formspec(player:get_player_name(), "w32" , w32.get_formspec(player)) + elseif fields.wad then + player_inv:set_stack("page3", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w34" , w34.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w34" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wac then + player_inv:set_stack("page3", 1,"default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w33" , w33.get_formspec(player)) + elseif fields.wae then + player_inv:set_stack("page3", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w35" , w35.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w35" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wad then + player_inv:set_stack("page3", 1,"default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w34" , w34.get_formspec(player)) + elseif fields.waf then + player_inv:set_stack("page3", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w36" , w36.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w36" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wae then + player_inv:set_stack("page3", 1,"default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w35" , w35.get_formspec(player)) + elseif fields.wag then + player_inv:set_stack("page3", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w37" , w37.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w37" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.waf then + player_inv:set_stack("page3", 1,"default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w36" , w36.get_formspec(player)) + elseif fields.wah then + player_inv:set_stack("page3", 1, "default:dirt 7") + minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w38" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wag then + player_inv:set_stack("page3", 1,"default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w37" , w37.get_formspec(player)) + elseif fields.wai then + player_inv:set_stack("page3", 1, "default:dirt 8") + minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end + if formname == "w39" then + d = 1 + for k, v in pairs(fields) do + if tonumber(v) ~= nil then + New(player,"3_"..v) + player_inv:set_stack("l", 3, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 3") + end + end + if fields.wah then + player_inv:set_stack("page3", 1,"default:dirt 7") + minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") + end + end +end) \ No newline at end of file diff --git a/mods/sudoku/lv1_1.txt b/mods/sudoku/lv1_1.txt new file mode 100644 index 0000000..906b5a8 --- /dev/null +++ b/mods/sudoku/lv1_1.txt @@ -0,0 +1,9 @@ +085409030 +902305478 +010782090 +096040350 +800906002 +047020860 +030294080 +478601903 +020807510 \ No newline at end of file diff --git a/mods/sudoku/lv1_10.txt b/mods/sudoku/lv1_10.txt new file mode 100644 index 0000000..0a6691a --- /dev/null +++ b/mods/sudoku/lv1_10.txt @@ -0,0 +1,9 @@ +006080730 +043506089 +501937002 +420103806 +018000320 +605802071 +100658203 +350209610 +062010500 \ No newline at end of file diff --git a/mods/sudoku/lv1_100.txt b/mods/sudoku/lv1_100.txt new file mode 100644 index 0000000..a0af15c --- /dev/null +++ b/mods/sudoku/lv1_100.txt @@ -0,0 +1,9 @@ +060030090 +200801004 +005904200 +087000610 +400000005 +039000420 +002403900 +900107006 +040090070 \ No newline at end of file diff --git a/mods/sudoku/lv1_101.txt b/mods/sudoku/lv1_101.txt new file mode 100644 index 0000000..4646dac --- /dev/null +++ b/mods/sudoku/lv1_101.txt @@ -0,0 +1,9 @@ +300208007 +050907060 +007060200 +730000021 +009000300 +120000076 +002070400 +070402080 +400503002 \ No newline at end of file diff --git a/mods/sudoku/lv1_102.txt b/mods/sudoku/lv1_102.txt new file mode 100644 index 0000000..333673f --- /dev/null +++ b/mods/sudoku/lv1_102.txt @@ -0,0 +1,9 @@ +000802000 +050090080 +001465700 +704000803 +015000920 +908000405 +006234100 +040080030 +000907000 \ No newline at end of file diff --git a/mods/sudoku/lv1_103.txt b/mods/sudoku/lv1_103.txt new file mode 100644 index 0000000..48f14c0 --- /dev/null +++ b/mods/sudoku/lv1_103.txt @@ -0,0 +1,9 @@ +004708200 +000000000 +900624007 +406090503 +002805700 +803070109 +700241008 +000000000 +001907400 \ No newline at end of file diff --git a/mods/sudoku/lv1_104.txt b/mods/sudoku/lv1_104.txt new file mode 100644 index 0000000..5940087 --- /dev/null +++ b/mods/sudoku/lv1_104.txt @@ -0,0 +1,9 @@ +050020010 +900806003 +002000700 +080931040 +100702009 +090568020 +009000400 +600403002 +020010030 \ No newline at end of file diff --git a/mods/sudoku/lv1_105.txt b/mods/sudoku/lv1_105.txt new file mode 100644 index 0000000..bb75bef --- /dev/null +++ b/mods/sudoku/lv1_105.txt @@ -0,0 +1,9 @@ +000802000 +007030900 +060471080 +706000804 +095000760 +401000509 +050623090 +009040600 +000905000 \ No newline at end of file diff --git a/mods/sudoku/lv1_106.txt b/mods/sudoku/lv1_106.txt new file mode 100644 index 0000000..93a487c --- /dev/null +++ b/mods/sudoku/lv1_106.txt @@ -0,0 +1,9 @@ +003721600 +000080000 +700504002 +608000704 +270000095 +509000106 +100207003 +000030000 +005916200 \ No newline at end of file diff --git a/mods/sudoku/lv1_107.txt b/mods/sudoku/lv1_107.txt new file mode 100644 index 0000000..aefa051 --- /dev/null +++ b/mods/sudoku/lv1_107.txt @@ -0,0 +1,9 @@ +001000500 +040367080 +700050004 +070509020 +018000430 +050408090 +400080002 +060275040 +005000700 \ No newline at end of file diff --git a/mods/sudoku/lv1_108.txt b/mods/sudoku/lv1_108.txt new file mode 100644 index 0000000..8113a59 --- /dev/null +++ b/mods/sudoku/lv1_108.txt @@ -0,0 +1,9 @@ +180030096 +400000003 +009106400 +008040300 +900301008 +001090200 +004209500 +200000004 +790060021 \ No newline at end of file diff --git a/mods/sudoku/lv1_109.txt b/mods/sudoku/lv1_109.txt new file mode 100644 index 0000000..1820ed1 --- /dev/null +++ b/mods/sudoku/lv1_109.txt @@ -0,0 +1,9 @@ +000703000 +007000100 +080912070 +905070208 +008104500 +603050407 +050637020 +002000700 +000509000 \ No newline at end of file diff --git a/mods/sudoku/lv1_11.txt b/mods/sudoku/lv1_11.txt new file mode 100644 index 0000000..8477f11 --- /dev/null +++ b/mods/sudoku/lv1_11.txt @@ -0,0 +1,9 @@ +048105060 +306708524 +020463080 +093040270 +400307001 +067010430 +030872010 +671904802 +080601740 \ No newline at end of file diff --git a/mods/sudoku/lv1_110.txt b/mods/sudoku/lv1_110.txt new file mode 100644 index 0000000..11fd208 --- /dev/null +++ b/mods/sudoku/lv1_110.txt @@ -0,0 +1,9 @@ +900030001 +060802040 +004709200 +045000680 +800000009 +079000530 +008601300 +010905020 +400020005 \ No newline at end of file diff --git a/mods/sudoku/lv1_111.txt b/mods/sudoku/lv1_111.txt new file mode 100644 index 0000000..f34d3b8 --- /dev/null +++ b/mods/sudoku/lv1_111.txt @@ -0,0 +1,9 @@ +004000300 +003102400 +782000519 +030060080 +000809000 +050030060 +845000631 +001603800 +006000700 \ No newline at end of file diff --git a/mods/sudoku/lv1_112.txt b/mods/sudoku/lv1_112.txt new file mode 100644 index 0000000..33b76e1 --- /dev/null +++ b/mods/sudoku/lv1_112.txt @@ -0,0 +1,9 @@ +000138000 +002060800 +060040030 +800704005 +574000126 +100602008 +030070080 +001080700 +000426000 \ No newline at end of file diff --git a/mods/sudoku/lv1_113.txt b/mods/sudoku/lv1_113.txt new file mode 100644 index 0000000..608deba --- /dev/null +++ b/mods/sudoku/lv1_113.txt @@ -0,0 +1,9 @@ +040307020 +500106004 +007050800 +780000043 +003000100 +610000087 +009060200 +200805009 +070209010 \ No newline at end of file diff --git a/mods/sudoku/lv1_114.txt b/mods/sudoku/lv1_114.txt new file mode 100644 index 0000000..742baf5 --- /dev/null +++ b/mods/sudoku/lv1_114.txt @@ -0,0 +1,9 @@ +400000001 +001356800 +050010060 +080901040 +042000150 +090502080 +060020070 +009438600 +200000008 \ No newline at end of file diff --git a/mods/sudoku/lv1_115.txt b/mods/sudoku/lv1_115.txt new file mode 100644 index 0000000..271da94 --- /dev/null +++ b/mods/sudoku/lv1_115.txt @@ -0,0 +1,9 @@ +040109050 +900603008 +006050300 +690000074 +004000100 +510000086 +009010700 +700402001 +080706020 \ No newline at end of file diff --git a/mods/sudoku/lv1_116.txt b/mods/sudoku/lv1_116.txt new file mode 100644 index 0000000..32900c6 --- /dev/null +++ b/mods/sudoku/lv1_116.txt @@ -0,0 +1,9 @@ +053000680 +900060005 +700805003 +001050200 +080903040 +009040500 +800102007 +100090004 +097000310 \ No newline at end of file diff --git a/mods/sudoku/lv1_117.txt b/mods/sudoku/lv1_117.txt new file mode 100644 index 0000000..759e836 --- /dev/null +++ b/mods/sudoku/lv1_117.txt @@ -0,0 +1,9 @@ +000136000 +006708300 +080040060 +160000058 +802000906 +570000023 +030010090 +005603100 +000479000 \ No newline at end of file diff --git a/mods/sudoku/lv1_118.txt b/mods/sudoku/lv1_118.txt new file mode 100644 index 0000000..e78f89f --- /dev/null +++ b/mods/sudoku/lv1_118.txt @@ -0,0 +1,9 @@ +000080000 +034506280 +060304070 +012000930 +800000007 +075000420 +020401090 +086209350 +000050000 \ No newline at end of file diff --git a/mods/sudoku/lv1_119.txt b/mods/sudoku/lv1_119.txt new file mode 100644 index 0000000..58768a8 --- /dev/null +++ b/mods/sudoku/lv1_119.txt @@ -0,0 +1,9 @@ +004907800 +030060070 +700301009 +609000704 +040000030 +803000906 +200108005 +080030090 +006502400 \ No newline at end of file diff --git a/mods/sudoku/lv1_12.txt b/mods/sudoku/lv1_12.txt new file mode 100644 index 0000000..7a971ed --- /dev/null +++ b/mods/sudoku/lv1_12.txt @@ -0,0 +1,9 @@ +056801940 +900605003 +700493008 +897040635 +003906800 +465080291 +500269007 +600504009 +049708350 \ No newline at end of file diff --git a/mods/sudoku/lv1_120.txt b/mods/sudoku/lv1_120.txt new file mode 100644 index 0000000..b7b27d6 --- /dev/null +++ b/mods/sudoku/lv1_120.txt @@ -0,0 +1,9 @@ +703408605 +000060000 +500709004 +608000401 +050000030 +302000907 +400601003 +000040000 +105903708 \ No newline at end of file diff --git a/mods/sudoku/lv1_121.txt b/mods/sudoku/lv1_121.txt new file mode 100644 index 0000000..d8a64af --- /dev/null +++ b/mods/sudoku/lv1_121.txt @@ -0,0 +1,9 @@ +005000700 +019504630 +480000091 +070010050 +000408000 +040060080 +920000065 +067105840 +004000900 \ No newline at end of file diff --git a/mods/sudoku/lv1_122.txt b/mods/sudoku/lv1_122.txt new file mode 100644 index 0000000..7740154 --- /dev/null +++ b/mods/sudoku/lv1_122.txt @@ -0,0 +1,9 @@ +800000001 +070102090 +000458000 +096704280 +002000600 +083609410 +000297000 +030806050 +900000008 \ No newline at end of file diff --git a/mods/sudoku/lv1_123.txt b/mods/sudoku/lv1_123.txt new file mode 100644 index 0000000..8ff6ad4 --- /dev/null +++ b/mods/sudoku/lv1_123.txt @@ -0,0 +1,9 @@ +060701080 +410000072 +007020300 +900806001 +002000900 +600502004 +008060200 +740000093 +020907050 \ No newline at end of file diff --git a/mods/sudoku/lv1_124.txt b/mods/sudoku/lv1_124.txt new file mode 100644 index 0000000..fc2dc4b --- /dev/null +++ b/mods/sudoku/lv1_124.txt @@ -0,0 +1,9 @@ +000804000 +026503190 +040090070 +530000086 +008000400 +910000052 +080030040 +079206530 +000407000 \ No newline at end of file diff --git a/mods/sudoku/lv1_125.txt b/mods/sudoku/lv1_125.txt new file mode 100644 index 0000000..2a279b3 --- /dev/null +++ b/mods/sudoku/lv1_125.txt @@ -0,0 +1,9 @@ +000804000 +009030100 +047501380 +105000608 +030000050 +604000201 +068103570 +001080400 +000905000 \ No newline at end of file diff --git a/mods/sudoku/lv1_126.txt b/mods/sudoku/lv1_126.txt new file mode 100644 index 0000000..620fbf5 --- /dev/null +++ b/mods/sudoku/lv1_126.txt @@ -0,0 +1,9 @@ +100973005 +000206000 +009050300 +850000032 +401000706 +690000041 +008090200 +000802000 +900165003 \ No newline at end of file diff --git a/mods/sudoku/lv1_127.txt b/mods/sudoku/lv1_127.txt new file mode 100644 index 0000000..43cdf0b --- /dev/null +++ b/mods/sudoku/lv1_127.txt @@ -0,0 +1,9 @@ +000105000 +007389200 +090060030 +460000073 +059000480 +370000029 +030020010 +006753800 +000906000 \ No newline at end of file diff --git a/mods/sudoku/lv1_128.txt b/mods/sudoku/lv1_128.txt new file mode 100644 index 0000000..cc7970a --- /dev/null +++ b/mods/sudoku/lv1_128.txt @@ -0,0 +1,9 @@ +004589300 +005000800 +230000065 +500090003 +900103008 +800040006 +460000032 +002000600 +009652400 \ No newline at end of file diff --git a/mods/sudoku/lv1_129.txt b/mods/sudoku/lv1_129.txt new file mode 100644 index 0000000..7b29d6a --- /dev/null +++ b/mods/sudoku/lv1_129.txt @@ -0,0 +1,9 @@ +040320080 +000090406 +009000023 +000000004 +075000690 +100000000 +860000700 +402070000 +010036050 \ No newline at end of file diff --git a/mods/sudoku/lv1_13.txt b/mods/sudoku/lv1_13.txt new file mode 100644 index 0000000..2155525 --- /dev/null +++ b/mods/sudoku/lv1_13.txt @@ -0,0 +1,9 @@ +010206050 +608537201 +530000067 +860301079 +170604028 +320705046 +750000014 +201473605 +080109030 \ No newline at end of file diff --git a/mods/sudoku/lv1_130.txt b/mods/sudoku/lv1_130.txt new file mode 100644 index 0000000..3788525 --- /dev/null +++ b/mods/sudoku/lv1_130.txt @@ -0,0 +1,9 @@ +000158000 +006007100 +080000030 +500700023 +200000001 +730001005 +090000040 +004800300 +000429000 \ No newline at end of file diff --git a/mods/sudoku/lv1_131.txt b/mods/sudoku/lv1_131.txt new file mode 100644 index 0000000..f97162f --- /dev/null +++ b/mods/sudoku/lv1_131.txt @@ -0,0 +1,9 @@ +300108400 +000070035 +900050008 +000001800 +090000050 +006900000 +500060007 +410090000 +007805004 \ No newline at end of file diff --git a/mods/sudoku/lv1_132.txt b/mods/sudoku/lv1_132.txt new file mode 100644 index 0000000..04d5ef7 --- /dev/null +++ b/mods/sudoku/lv1_132.txt @@ -0,0 +1,9 @@ +960000075 +200030006 +003700000 +009040000 +030901050 +000020100 +000008200 +600090004 +740000089 \ No newline at end of file diff --git a/mods/sudoku/lv1_133.txt b/mods/sudoku/lv1_133.txt new file mode 100644 index 0000000..942d7d2 --- /dev/null +++ b/mods/sudoku/lv1_133.txt @@ -0,0 +1,9 @@ +000003006 +900800040 +003100900 +000380015 +009000400 +120056000 +007005100 +040008003 +600200000 \ No newline at end of file diff --git a/mods/sudoku/lv1_134.txt b/mods/sudoku/lv1_134.txt new file mode 100644 index 0000000..54a8aa7 --- /dev/null +++ b/mods/sudoku/lv1_134.txt @@ -0,0 +1,9 @@ +508000000 +006200000 +730061000 +090040500 +001709600 +002030070 +000910038 +000005100 +000000402 \ No newline at end of file diff --git a/mods/sudoku/lv1_135.txt b/mods/sudoku/lv1_135.txt new file mode 100644 index 0000000..0025647 --- /dev/null +++ b/mods/sudoku/lv1_135.txt @@ -0,0 +1,9 @@ +000060705 +730004006 +002000000 +300800540 +900000001 +071006003 +000000100 +500700092 +407030000 \ No newline at end of file diff --git a/mods/sudoku/lv1_136.txt b/mods/sudoku/lv1_136.txt new file mode 100644 index 0000000..52b749f --- /dev/null +++ b/mods/sudoku/lv1_136.txt @@ -0,0 +1,9 @@ +070630000 +530000010 +000002600 +700010200 +400208005 +005060009 +004300000 +080000027 +000041030 \ No newline at end of file diff --git a/mods/sudoku/lv1_137.txt b/mods/sudoku/lv1_137.txt new file mode 100644 index 0000000..fa571c2 --- /dev/null +++ b/mods/sudoku/lv1_137.txt @@ -0,0 +1,9 @@ +000907000 +001020090 +409000050 +006001200 +080603070 +007800500 +040000308 +090010700 +000708000 \ No newline at end of file diff --git a/mods/sudoku/lv1_138.txt b/mods/sudoku/lv1_138.txt new file mode 100644 index 0000000..364428e --- /dev/null +++ b/mods/sudoku/lv1_138.txt @@ -0,0 +1,9 @@ +020500700 +300007000 +000001804 +400010590 +000609000 +091050003 +608900000 +000700001 +007004050 \ No newline at end of file diff --git a/mods/sudoku/lv1_139.txt b/mods/sudoku/lv1_139.txt new file mode 100644 index 0000000..c4e3921 --- /dev/null +++ b/mods/sudoku/lv1_139.txt @@ -0,0 +1,9 @@ +500090000 +410000059 +700001040 +950060020 +000000000 +040080067 +070500001 +280000094 +000030005 \ No newline at end of file diff --git a/mods/sudoku/lv1_14.txt b/mods/sudoku/lv1_14.txt new file mode 100644 index 0000000..94517aa --- /dev/null +++ b/mods/sudoku/lv1_14.txt @@ -0,0 +1,9 @@ +092005804 +807402509 +435008620 +608090042 +003804700 +270060905 +089200167 +706109203 +301700490 \ No newline at end of file diff --git a/mods/sudoku/lv1_140.txt b/mods/sudoku/lv1_140.txt new file mode 100644 index 0000000..2536a89 --- /dev/null +++ b/mods/sudoku/lv1_140.txt @@ -0,0 +1,9 @@ +030009000 +401050000 +070806400 +007000608 +050000010 +109000700 +004708060 +000090207 +000100050 \ No newline at end of file diff --git a/mods/sudoku/lv1_141.txt b/mods/sudoku/lv1_141.txt new file mode 100644 index 0000000..ca9a7e1 --- /dev/null +++ b/mods/sudoku/lv1_141.txt @@ -0,0 +1,9 @@ +000000570 +090030000 +008007093 +030001007 +100304002 +800600010 +510900400 +000010060 +082000000 \ No newline at end of file diff --git a/mods/sudoku/lv1_142.txt b/mods/sudoku/lv1_142.txt new file mode 100644 index 0000000..541fa5f --- /dev/null +++ b/mods/sudoku/lv1_142.txt @@ -0,0 +1,9 @@ +008000000 +004006050 +190500300 +009650070 +000403000 +050082600 +001007098 +040200100 +000000200 \ No newline at end of file diff --git a/mods/sudoku/lv1_143.txt b/mods/sudoku/lv1_143.txt new file mode 100644 index 0000000..56d6240 --- /dev/null +++ b/mods/sudoku/lv1_143.txt @@ -0,0 +1,9 @@ +800002090 +000000083 +070060002 +000020010 +190407036 +040090000 +300010050 +760000000 +010900008 \ No newline at end of file diff --git a/mods/sudoku/lv1_144.txt b/mods/sudoku/lv1_144.txt new file mode 100644 index 0000000..6ec87eb --- /dev/null +++ b/mods/sudoku/lv1_144.txt @@ -0,0 +1,9 @@ +800700200 +000500010 +000016004 +590200300 +008000400 +004008097 +200860000 +080001000 +007009005 \ No newline at end of file diff --git a/mods/sudoku/lv1_145.txt b/mods/sudoku/lv1_145.txt new file mode 100644 index 0000000..c24e173 --- /dev/null +++ b/mods/sudoku/lv1_145.txt @@ -0,0 +1,9 @@ +050002000 +009500000 +800010004 +001020067 +006307400 +370080200 +600030002 +000009600 +000400080 \ No newline at end of file diff --git a/mods/sudoku/lv1_146.txt b/mods/sudoku/lv1_146.txt new file mode 100644 index 0000000..e6fb099 --- /dev/null +++ b/mods/sudoku/lv1_146.txt @@ -0,0 +1,9 @@ +900400700 +000093020 +000000305 +700040060 +030601040 +050030007 +601000000 +040810000 +005009001 \ No newline at end of file diff --git a/mods/sudoku/lv1_147.txt b/mods/sudoku/lv1_147.txt new file mode 100644 index 0000000..0bd093c --- /dev/null +++ b/mods/sudoku/lv1_147.txt @@ -0,0 +1,9 @@ +200090000 +000030050 +406800900 +700006004 +090302080 +800100003 +009008307 +080010000 +000060001 \ No newline at end of file diff --git a/mods/sudoku/lv1_148.txt b/mods/sudoku/lv1_148.txt new file mode 100644 index 0000000..1950f5c --- /dev/null +++ b/mods/sudoku/lv1_148.txt @@ -0,0 +1,9 @@ +000051080 +080040005 +003000200 +000060009 +670409013 +800030000 +002000400 +500090020 +090710000 \ No newline at end of file diff --git a/mods/sudoku/lv1_149.txt b/mods/sudoku/lv1_149.txt new file mode 100644 index 0000000..700063f --- /dev/null +++ b/mods/sudoku/lv1_149.txt @@ -0,0 +1,9 @@ +000600100 +000005006 +507000230 +080907000 +930000067 +000406010 +074000901 +800700000 +003008000 \ No newline at end of file diff --git a/mods/sudoku/lv1_15.txt b/mods/sudoku/lv1_15.txt new file mode 100644 index 0000000..f2a46ab --- /dev/null +++ b/mods/sudoku/lv1_15.txt @@ -0,0 +1,9 @@ +820703016 +501060908 +030108040 +059010480 +308504701 +140070053 +280605079 +407080305 +015907820 \ No newline at end of file diff --git a/mods/sudoku/lv1_150.txt b/mods/sudoku/lv1_150.txt new file mode 100644 index 0000000..c8d8f19 --- /dev/null +++ b/mods/sudoku/lv1_150.txt @@ -0,0 +1,9 @@ +960000000 +400086000 +000402000 +003205860 +040000070 +026308500 +000901000 +000760003 +000000091 \ No newline at end of file diff --git a/mods/sudoku/lv1_151.txt b/mods/sudoku/lv1_151.txt new file mode 100644 index 0000000..b11476c --- /dev/null +++ b/mods/sudoku/lv1_151.txt @@ -0,0 +1,9 @@ +010200500 +000008020 +049005300 +000000900 +902601705 +006000000 +003700190 +070900000 +004002050 \ No newline at end of file diff --git a/mods/sudoku/lv1_152.txt b/mods/sudoku/lv1_152.txt new file mode 100644 index 0000000..284d1d6 --- /dev/null +++ b/mods/sudoku/lv1_152.txt @@ -0,0 +1,9 @@ +000620007 +005901000 +010008000 +360000250 +900000001 +041000073 +000400060 +000502700 +100093000 \ No newline at end of file diff --git a/mods/sudoku/lv1_153.txt b/mods/sudoku/lv1_153.txt new file mode 100644 index 0000000..9f84cfe --- /dev/null +++ b/mods/sudoku/lv1_153.txt @@ -0,0 +1,9 @@ +009810000 +030200008 +000046205 +000000607 +800000009 +605000000 +704560000 +300002010 +000073500 \ No newline at end of file diff --git a/mods/sudoku/lv1_154.txt b/mods/sudoku/lv1_154.txt new file mode 100644 index 0000000..2a32c3d --- /dev/null +++ b/mods/sudoku/lv1_154.txt @@ -0,0 +1,9 @@ +080006005 +200000480 +009008010 +000080102 +000301000 +601090000 +090400800 +076000003 +100700050 \ No newline at end of file diff --git a/mods/sudoku/lv1_155.txt b/mods/sudoku/lv1_155.txt new file mode 100644 index 0000000..a51d9ad --- /dev/null +++ b/mods/sudoku/lv1_155.txt @@ -0,0 +1,9 @@ +080040000 +063908500 +007000010 +000430108 +000000000 +901075000 +020000400 +005604230 +000020060 \ No newline at end of file diff --git a/mods/sudoku/lv1_156.txt b/mods/sudoku/lv1_156.txt new file mode 100644 index 0000000..6edab22 --- /dev/null +++ b/mods/sudoku/lv1_156.txt @@ -0,0 +1,9 @@ +006003540 +000090001 +300004008 +000500803 +090000020 +103006000 +200700005 +800060000 +039100700 \ No newline at end of file diff --git a/mods/sudoku/lv1_157.txt b/mods/sudoku/lv1_157.txt new file mode 100644 index 0000000..02051ad --- /dev/null +++ b/mods/sudoku/lv1_157.txt @@ -0,0 +1,9 @@ +060520000 +230014000 +070000001 +180006030 +000000000 +050300094 +700000020 +000160059 +000082060 \ No newline at end of file diff --git a/mods/sudoku/lv1_158.txt b/mods/sudoku/lv1_158.txt new file mode 100644 index 0000000..3c0fbf6 --- /dev/null +++ b/mods/sudoku/lv1_158.txt @@ -0,0 +1,9 @@ +000020050 +000008364 +000360070 +007000080 +203000605 +050000400 +080034000 +761800000 +030070000 \ No newline at end of file diff --git a/mods/sudoku/lv1_159.txt b/mods/sudoku/lv1_159.txt new file mode 100644 index 0000000..80edaf1 --- /dev/null +++ b/mods/sudoku/lv1_159.txt @@ -0,0 +1,9 @@ +000004095 +670500010 +000609000 +020000400 +810000072 +007000080 +000305000 +060001058 +730900000 \ No newline at end of file diff --git a/mods/sudoku/lv1_16.txt b/mods/sudoku/lv1_16.txt new file mode 100644 index 0000000..6425831 --- /dev/null +++ b/mods/sudoku/lv1_16.txt @@ -0,0 +1,9 @@ +000746000 +073805640 +046030750 +729010485 +160908027 +538070196 +091080270 +087201560 +000367000 \ No newline at end of file diff --git a/mods/sudoku/lv1_160.txt b/mods/sudoku/lv1_160.txt new file mode 100644 index 0000000..201cb19 --- /dev/null +++ b/mods/sudoku/lv1_160.txt @@ -0,0 +1,9 @@ +008009000 +010500400 +600040080 +040090001 +006701800 +200030060 +050010008 +007006090 +000200700 \ No newline at end of file diff --git a/mods/sudoku/lv1_17.txt b/mods/sudoku/lv1_17.txt new file mode 100644 index 0000000..06b551f --- /dev/null +++ b/mods/sudoku/lv1_17.txt @@ -0,0 +1,9 @@ +127006000 +030792561 +569800003 +305609710 +001407300 +072105906 +200004835 +753218090 +000500127 \ No newline at end of file diff --git a/mods/sudoku/lv1_18.txt b/mods/sudoku/lv1_18.txt new file mode 100644 index 0000000..33aecbb --- /dev/null +++ b/mods/sudoku/lv1_18.txt @@ -0,0 +1,9 @@ +000485000 +047102850 +056030210 +438070192 +560301087 +712040635 +095010740 +084207560 +000854000 \ No newline at end of file diff --git a/mods/sudoku/lv1_19.txt b/mods/sudoku/lv1_19.txt new file mode 100644 index 0000000..0f3ab1d --- /dev/null +++ b/mods/sudoku/lv1_19.txt @@ -0,0 +1,9 @@ +160304025 +802050901 +040201070 +089020710 +401807302 +270030084 +610508039 +703010408 +028903160 \ No newline at end of file diff --git a/mods/sudoku/lv1_2.txt b/mods/sudoku/lv1_2.txt new file mode 100644 index 0000000..5bc08f9 --- /dev/null +++ b/mods/sudoku/lv1_2.txt @@ -0,0 +1,9 @@ +080307090 +409126708 +150000062 +320709016 +870401023 +690502047 +740000039 +903248605 +060903180 \ No newline at end of file diff --git a/mods/sudoku/lv1_20.txt b/mods/sudoku/lv1_20.txt new file mode 100644 index 0000000..198f4e7 --- /dev/null +++ b/mods/sudoku/lv1_20.txt @@ -0,0 +1,9 @@ +041205670 +500701004 +700946001 +653020719 +007503800 +829060435 +100652003 +200308007 +065409180 \ No newline at end of file diff --git a/mods/sudoku/lv1_21.txt b/mods/sudoku/lv1_21.txt new file mode 100644 index 0000000..a1f9692 --- /dev/null +++ b/mods/sudoku/lv1_21.txt @@ -0,0 +1,9 @@ +049102030 +603509274 +070436090 +086040750 +400605001 +035010460 +060957010 +351804907 +090301540 \ No newline at end of file diff --git a/mods/sudoku/lv1_22.txt b/mods/sudoku/lv1_22.txt new file mode 100644 index 0000000..c2dbed6 --- /dev/null +++ b/mods/sudoku/lv1_22.txt @@ -0,0 +1,9 @@ +090805020 +602371509 +340000017 +870502031 +950603078 +120407065 +560000082 +208769104 +010208090 \ No newline at end of file diff --git a/mods/sudoku/lv1_23.txt b/mods/sudoku/lv1_23.txt new file mode 100644 index 0000000..c80cc1c --- /dev/null +++ b/mods/sudoku/lv1_23.txt @@ -0,0 +1,9 @@ +027905360 +500607002 +600823007 +351090678 +006501400 +498030215 +700359001 +900104006 +035208740 \ No newline at end of file diff --git a/mods/sudoku/lv1_24.txt b/mods/sudoku/lv1_24.txt new file mode 100644 index 0000000..9147e8d --- /dev/null +++ b/mods/sudoku/lv1_24.txt @@ -0,0 +1,9 @@ +005080340 +083405079 +402793005 +360109407 +054000120 +107504086 +500362708 +270801630 +036040500 \ No newline at end of file diff --git a/mods/sudoku/lv1_25.txt b/mods/sudoku/lv1_25.txt new file mode 100644 index 0000000..9e169af --- /dev/null +++ b/mods/sudoku/lv1_25.txt @@ -0,0 +1,9 @@ +041005206 +209104307 +356007410 +803090074 +007201800 +910080605 +075600983 +108409502 +602300740 \ No newline at end of file diff --git a/mods/sudoku/lv1_26.txt b/mods/sudoku/lv1_26.txt new file mode 100644 index 0000000..ed7e17d --- /dev/null +++ b/mods/sudoku/lv1_26.txt @@ -0,0 +1,9 @@ +000652000 +061309250 +052010690 +687040539 +420703086 +913060472 +074030860 +036804920 +000126000 \ No newline at end of file diff --git a/mods/sudoku/lv1_27.txt b/mods/sudoku/lv1_27.txt new file mode 100644 index 0000000..04806c0 --- /dev/null +++ b/mods/sudoku/lv1_27.txt @@ -0,0 +1,9 @@ +364008000 +090524736 +527300004 +109206540 +005809200 +073405608 +400007369 +736942010 +000600427 \ No newline at end of file diff --git a/mods/sudoku/lv1_28.txt b/mods/sudoku/lv1_28.txt new file mode 100644 index 0000000..0c7b19f --- /dev/null +++ b/mods/sudoku/lv1_28.txt @@ -0,0 +1,9 @@ +058901030 +703208165 +060537080 +047050620 +500702009 +032090570 +070826090 +329405806 +080309250 \ No newline at end of file diff --git a/mods/sudoku/lv1_29.txt b/mods/sudoku/lv1_29.txt new file mode 100644 index 0000000..44f1b88 --- /dev/null +++ b/mods/sudoku/lv1_29.txt @@ -0,0 +1,9 @@ +290607045 +708050609 +050208070 +073060410 +904703508 +560080037 +140806093 +609010704 +087902150 diff --git a/mods/sudoku/lv1_3.txt b/mods/sudoku/lv1_3.txt new file mode 100644 index 0000000..1d7ea08 --- /dev/null +++ b/mods/sudoku/lv1_3.txt @@ -0,0 +1,9 @@ +056709280 +200306005 +300582004 +742050136 +001203800 +683070529 +900631008 +800405001 +064807350 \ No newline at end of file diff --git a/mods/sudoku/lv1_30.txt b/mods/sudoku/lv1_30.txt new file mode 100644 index 0000000..dcb4add --- /dev/null +++ b/mods/sudoku/lv1_30.txt @@ -0,0 +1,9 @@ +080104030 +903528607 +640000051 +190402078 +420905063 +350706094 +870000016 +501873409 +030601080 diff --git a/mods/sudoku/lv1_31.txt b/mods/sudoku/lv1_31.txt new file mode 100644 index 0000000..c490b03 --- /dev/null +++ b/mods/sudoku/lv1_31.txt @@ -0,0 +1,9 @@ +820000097 +609781402 +054206310 +086409570 +040000080 +097508260 +062105830 +903862105 +510000026 \ No newline at end of file diff --git a/mods/sudoku/lv1_32.txt b/mods/sudoku/lv1_32.txt new file mode 100644 index 0000000..00a3a04 --- /dev/null +++ b/mods/sudoku/lv1_32.txt @@ -0,0 +1,9 @@ +000743000 +041906780 +027050430 +134070968 +560304071 +278010543 +092030850 +085402310 +000598000 \ No newline at end of file diff --git a/mods/sudoku/lv1_33.txt b/mods/sudoku/lv1_33.txt new file mode 100644 index 0000000..7ab8494 --- /dev/null +++ b/mods/sudoku/lv1_33.txt @@ -0,0 +1,9 @@ +092004605 +603209107 +145007920 +801030079 +007602800 +320080504 +074500381 +208903406 +506100790 \ No newline at end of file diff --git a/mods/sudoku/lv1_34.txt b/mods/sudoku/lv1_34.txt new file mode 100644 index 0000000..16ff066 --- /dev/null +++ b/mods/sudoku/lv1_34.txt @@ -0,0 +1,9 @@ +020603040 +804952701 +730000096 +680305012 +350809074 +490107083 +210000067 +906214308 +040706020 \ No newline at end of file diff --git a/mods/sudoku/lv1_35.txt b/mods/sudoku/lv1_35.txt new file mode 100644 index 0000000..50b5f4d --- /dev/null +++ b/mods/sudoku/lv1_35.txt @@ -0,0 +1,9 @@ +005010680 +016805042 +809426005 +670302804 +058000390 +304508017 +500679401 +940103760 +067080500 \ No newline at end of file diff --git a/mods/sudoku/lv1_36.txt b/mods/sudoku/lv1_36.txt new file mode 100644 index 0000000..18f66b6 --- /dev/null +++ b/mods/sudoku/lv1_36.txt @@ -0,0 +1,9 @@ +238004000 +050873642 +647100005 +506407820 +002908500 +083206704 +300009156 +865321070 +000600238 \ No newline at end of file diff --git a/mods/sudoku/lv1_37.txt b/mods/sudoku/lv1_37.txt new file mode 100644 index 0000000..b57ed09 --- /dev/null +++ b/mods/sudoku/lv1_37.txt @@ -0,0 +1,9 @@ +950301047 +106070305 +070906010 +018030420 +504108706 +730060081 +240603058 +305020104 +061509270 \ No newline at end of file diff --git a/mods/sudoku/lv1_38.txt b/mods/sudoku/lv1_38.txt new file mode 100644 index 0000000..c723e09 --- /dev/null +++ b/mods/sudoku/lv1_38.txt @@ -0,0 +1,9 @@ +042703180 +300802004 +800941002 +136070829 +008306500 +579010463 +200137006 +700605008 +013409250 \ No newline at end of file diff --git a/mods/sudoku/lv1_39.txt b/mods/sudoku/lv1_39.txt new file mode 100644 index 0000000..073bb1d --- /dev/null +++ b/mods/sudoku/lv1_39.txt @@ -0,0 +1,9 @@ +062709030 +901302756 +080561090 +094070320 +600904001 +075010640 +030197060 +756408903 +010605280 \ No newline at end of file diff --git a/mods/sudoku/lv1_4.txt b/mods/sudoku/lv1_4.txt new file mode 100644 index 0000000..b3193fe --- /dev/null +++ b/mods/sudoku/lv1_4.txt @@ -0,0 +1,9 @@ +002010690 +059402018 +403896007 +570309102 +031000970 +204107063 +300241709 +940708230 +027030400 \ No newline at end of file diff --git a/mods/sudoku/lv1_40.txt b/mods/sudoku/lv1_40.txt new file mode 100644 index 0000000..66ff85b --- /dev/null +++ b/mods/sudoku/lv1_40.txt @@ -0,0 +1,9 @@ +040508060 +106792804 +730000029 +590806072 +480107095 +260309018 +810000056 +605914203 +020605040 \ No newline at end of file diff --git a/mods/sudoku/lv1_41.txt b/mods/sudoku/lv1_41.txt new file mode 100644 index 0000000..bff494e --- /dev/null +++ b/mods/sudoku/lv1_41.txt @@ -0,0 +1,9 @@ +000971000 +095806170 +071050960 +923040786 +410308029 +658090431 +034080290 +089204610 +000519000 \ No newline at end of file diff --git a/mods/sudoku/lv1_42.txt b/mods/sudoku/lv1_42.txt new file mode 100644 index 0000000..244d4b3 --- /dev/null +++ b/mods/sudoku/lv1_42.txt @@ -0,0 +1,9 @@ +009040260 +076908035 +401625007 +720301908 +015000740 +608504023 +800192604 +940806310 +062030500 \ No newline at end of file diff --git a/mods/sudoku/lv1_43.txt b/mods/sudoku/lv1_43.txt new file mode 100644 index 0000000..bf9f333 --- /dev/null +++ b/mods/sudoku/lv1_43.txt @@ -0,0 +1,9 @@ +397008000 +050417239 +412300007 +605109470 +004805100 +023704908 +700002395 +239571060 +000900712 \ No newline at end of file diff --git a/mods/sudoku/lv1_44.txt b/mods/sudoku/lv1_44.txt new file mode 100644 index 0000000..9f61628 --- /dev/null +++ b/mods/sudoku/lv1_44.txt @@ -0,0 +1,9 @@ +340000015 +901854703 +025103480 +097205830 +050000070 +084307590 +032509160 +806431209 +510000048 \ No newline at end of file diff --git a/mods/sudoku/lv1_45.txt b/mods/sudoku/lv1_45.txt new file mode 100644 index 0000000..4c188a3 --- /dev/null +++ b/mods/sudoku/lv1_45.txt @@ -0,0 +1,9 @@ +053001609 +607305208 +219008530 +402070085 +008603400 +730040901 +081900742 +304507106 +906200850 \ No newline at end of file diff --git a/mods/sudoku/lv1_46.txt b/mods/sudoku/lv1_46.txt new file mode 100644 index 0000000..608264a --- /dev/null +++ b/mods/sudoku/lv1_46.txt @@ -0,0 +1,9 @@ +001020450 +075103069 +208549007 +740608103 +089000720 +503902046 +300814502 +120305680 +054060900 diff --git a/mods/sudoku/lv1_47.txt b/mods/sudoku/lv1_47.txt new file mode 100644 index 0000000..48841c3 --- /dev/null +++ b/mods/sudoku/lv1_47.txt @@ -0,0 +1,9 @@ +230000019 +701925803 +048307650 +027801490 +080000020 +019402370 +073504260 +106273504 +450000037 \ No newline at end of file diff --git a/mods/sudoku/lv1_48.txt b/mods/sudoku/lv1_48.txt new file mode 100644 index 0000000..b83c4e9 --- /dev/null +++ b/mods/sudoku/lv1_48.txt @@ -0,0 +1,9 @@ +030506020 +604281503 +280000061 +460803017 +310609054 +850102096 +120000039 +503918602 +040307080 \ No newline at end of file diff --git a/mods/sudoku/lv1_49.txt b/mods/sudoku/lv1_49.txt new file mode 100644 index 0000000..a4b13fc --- /dev/null +++ b/mods/sudoku/lv1_49.txt @@ -0,0 +1,9 @@ +037009405 +408507903 +569004170 +104030057 +006405800 +780010309 +043700218 +801203706 +602800530 \ No newline at end of file diff --git a/mods/sudoku/lv1_5.txt b/mods/sudoku/lv1_5.txt new file mode 100644 index 0000000..1f474c5 --- /dev/null +++ b/mods/sudoku/lv1_5.txt @@ -0,0 +1,9 @@ +510408072 +803020401 +020503080 +086040790 +107806203 +240030068 +970304016 +401090807 +038105920 \ No newline at end of file diff --git a/mods/sudoku/lv1_50.txt b/mods/sudoku/lv1_50.txt new file mode 100644 index 0000000..766ee24 --- /dev/null +++ b/mods/sudoku/lv1_50.txt @@ -0,0 +1,9 @@ +536001000 +020673915 +917400002 +209107650 +005806200 +063509701 +300008429 +692354070 +000900536 \ No newline at end of file diff --git a/mods/sudoku/lv1_51.txt b/mods/sudoku/lv1_51.txt new file mode 100644 index 0000000..f9bba3f --- /dev/null +++ b/mods/sudoku/lv1_51.txt @@ -0,0 +1,9 @@ +720605089 +408090107 +050807030 +041080370 +507403608 +830060045 +270904061 +306070504 +084106720 \ No newline at end of file diff --git a/mods/sudoku/lv1_52.txt b/mods/sudoku/lv1_52.txt new file mode 100644 index 0000000..a2bc669 --- /dev/null +++ b/mods/sudoku/lv1_52.txt @@ -0,0 +1,9 @@ +043209010 +908103254 +060548090 +097020130 +400907008 +025080470 +010892040 +254706901 +080405360 \ No newline at end of file diff --git a/mods/sudoku/lv1_53.txt b/mods/sudoku/lv1_53.txt new file mode 100644 index 0000000..cda7e4c --- /dev/null +++ b/mods/sudoku/lv1_53.txt @@ -0,0 +1,9 @@ +000941000 +093506140 +041030960 +978020456 +210805079 +635090281 +082050790 +059702610 +000319000 \ No newline at end of file diff --git a/mods/sudoku/lv1_54.txt b/mods/sudoku/lv1_54.txt new file mode 100644 index 0000000..7be6ae9 --- /dev/null +++ b/mods/sudoku/lv1_54.txt @@ -0,0 +1,9 @@ +024107390 +300402006 +800936001 +138090462 +006304100 +942010537 +200543008 +400209003 +093801620 \ No newline at end of file diff --git a/mods/sudoku/lv1_55.txt b/mods/sudoku/lv1_55.txt new file mode 100644 index 0000000..cf2b7a8 --- /dev/null +++ b/mods/sudoku/lv1_55.txt @@ -0,0 +1,9 @@ +010309050 +405286901 +270000068 +380905026 +190402083 +650708049 +940000035 +503841607 +060503010 \ No newline at end of file diff --git a/mods/sudoku/lv1_56.txt b/mods/sudoku/lv1_56.txt new file mode 100644 index 0000000..0666bd3 --- /dev/null +++ b/mods/sudoku/lv1_56.txt @@ -0,0 +1,9 @@ +049602780 +200809004 +800347009 +721060893 +008201500 +563070412 +900726001 +600105008 +072403950 \ No newline at end of file diff --git a/mods/sudoku/lv1_57.txt b/mods/sudoku/lv1_57.txt new file mode 100644 index 0000000..3efe3b6 --- /dev/null +++ b/mods/sudoku/lv1_57.txt @@ -0,0 +1,9 @@ +546003000 +090156324 +123400005 +908307210 +002801700 +071205403 +300002597 +719584030 +000700148 \ No newline at end of file diff --git a/mods/sudoku/lv1_58.txt b/mods/sudoku/lv1_58.txt new file mode 100644 index 0000000..537c190 --- /dev/null +++ b/mods/sudoku/lv1_58.txt @@ -0,0 +1,9 @@ +250406031 +607010405 +010207060 +068040390 +503608107 +140070086 +930704058 +405090603 +076502910 \ No newline at end of file diff --git a/mods/sudoku/lv1_59.txt b/mods/sudoku/lv1_59.txt new file mode 100644 index 0000000..a2609aa --- /dev/null +++ b/mods/sudoku/lv1_59.txt @@ -0,0 +1,9 @@ +025004807 +803502601 +647001250 +906030012 +001805900 +350090704 +014700396 +509203408 +708600120 \ No newline at end of file diff --git a/mods/sudoku/lv1_6.txt b/mods/sudoku/lv1_6.txt new file mode 100644 index 0000000..ab122b8 --- /dev/null +++ b/mods/sudoku/lv1_6.txt @@ -0,0 +1,9 @@ +046002105 +201906804 +958001320 +103080067 +009203500 +580010402 +095100743 +804305209 +302400650 \ No newline at end of file diff --git a/mods/sudoku/lv1_60.txt b/mods/sudoku/lv1_60.txt new file mode 100644 index 0000000..ed530b4 --- /dev/null +++ b/mods/sudoku/lv1_60.txt @@ -0,0 +1,9 @@ +000837000 +086504730 +037060840 +821090354 +970105028 +465080917 +019050280 +058209470 +000678000 \ No newline at end of file diff --git a/mods/sudoku/lv1_61.txt b/mods/sudoku/lv1_61.txt new file mode 100644 index 0000000..961d6fc --- /dev/null +++ b/mods/sudoku/lv1_61.txt @@ -0,0 +1,9 @@ +680000037 +403978206 +057306890 +042507960 +070000020 +098602740 +065704310 +901863504 +730000089 \ No newline at end of file diff --git a/mods/sudoku/lv1_62.txt b/mods/sudoku/lv1_62.txt new file mode 100644 index 0000000..553aa16 --- /dev/null +++ b/mods/sudoku/lv1_62.txt @@ -0,0 +1,9 @@ +009010730 +017309068 +304687009 +750208306 +093000240 +206903015 +900754601 +460102570 +075030900 \ No newline at end of file diff --git a/mods/sudoku/lv1_63.txt b/mods/sudoku/lv1_63.txt new file mode 100644 index 0000000..ad3d625 --- /dev/null +++ b/mods/sudoku/lv1_63.txt @@ -0,0 +1,9 @@ +056802970 +900306005 +300579004 +849050136 +001903700 +673080592 +200631007 +700405001 +064708350 \ No newline at end of file diff --git a/mods/sudoku/lv1_64.txt b/mods/sudoku/lv1_64.txt new file mode 100644 index 0000000..2c109a2 --- /dev/null +++ b/mods/sudoku/lv1_64.txt @@ -0,0 +1,9 @@ +028903070 +304708952 +010524030 +036090780 +200306004 +095040260 +070439020 +952601307 +040205810 \ No newline at end of file diff --git a/mods/sudoku/lv1_65.txt b/mods/sudoku/lv1_65.txt new file mode 100644 index 0000000..5b41fc5 --- /dev/null +++ b/mods/sudoku/lv1_65.txt @@ -0,0 +1,9 @@ +570908013 +804030907 +030504080 +086090120 +701806304 +390040068 +210409076 +907020801 +048705230 \ No newline at end of file diff --git a/mods/sudoku/lv1_66.txt b/mods/sudoku/lv1_66.txt new file mode 100644 index 0000000..48b13d8 --- /dev/null +++ b/mods/sudoku/lv1_66.txt @@ -0,0 +1,9 @@ +076008901 +905607302 +381002760 +403050027 +002906400 +560040108 +028100543 +604705809 +109300270 \ No newline at end of file diff --git a/mods/sudoku/lv1_67.txt b/mods/sudoku/lv1_67.txt new file mode 100644 index 0000000..138790e --- /dev/null +++ b/mods/sudoku/lv1_67.txt @@ -0,0 +1,9 @@ +524006000 +030472965 +967800003 +309607450 +005104300 +042509706 +200001839 +493258070 +000900524 \ No newline at end of file diff --git a/mods/sudoku/lv1_68.txt b/mods/sudoku/lv1_68.txt new file mode 100644 index 0000000..acbb090 --- /dev/null +++ b/mods/sudoku/lv1_68.txt @@ -0,0 +1,9 @@ +940000013 +801234709 +053109420 +087503290 +030000070 +024907380 +095308160 +206491508 +310000042 \ No newline at end of file diff --git a/mods/sudoku/lv1_69.txt b/mods/sudoku/lv1_69.txt new file mode 100644 index 0000000..78e2626 --- /dev/null +++ b/mods/sudoku/lv1_69.txt @@ -0,0 +1,9 @@ +094206080 +601804239 +070391060 +065020840 +900605001 +023010950 +080162090 +239507608 +010903470 \ No newline at end of file diff --git a/mods/sudoku/lv1_7.txt b/mods/sudoku/lv1_7.txt new file mode 100644 index 0000000..3c0ffe9 --- /dev/null +++ b/mods/sudoku/lv1_7.txt @@ -0,0 +1,9 @@ +870000021 +903214607 +016803590 +095107240 +040000060 +068402750 +021306870 +607541902 +530000016 \ No newline at end of file diff --git a/mods/sudoku/lv1_70.txt b/mods/sudoku/lv1_70.txt new file mode 100644 index 0000000..58168ef --- /dev/null +++ b/mods/sudoku/lv1_70.txt @@ -0,0 +1,9 @@ +040207050 +701598204 +590000078 +170904086 +480703021 +920805037 +850000043 +204389705 +010406090 \ No newline at end of file diff --git a/mods/sudoku/lv1_71.txt b/mods/sudoku/lv1_71.txt new file mode 100644 index 0000000..f96e59e --- /dev/null +++ b/mods/sudoku/lv1_71.txt @@ -0,0 +1,9 @@ +003010280 +098305074 +106824009 +920706305 +064000910 +805401027 +500632801 +310508760 +082070400 \ No newline at end of file diff --git a/mods/sudoku/lv1_72.txt b/mods/sudoku/lv1_72.txt new file mode 100644 index 0000000..1fc89c0 --- /dev/null +++ b/mods/sudoku/lv1_72.txt @@ -0,0 +1,9 @@ +000931000 +097204130 +031070940 +968050324 +510802069 +472090581 +085020690 +029605410 +000719000 \ No newline at end of file diff --git a/mods/sudoku/lv1_73.txt b/mods/sudoku/lv1_73.txt new file mode 100644 index 0000000..abc8324 --- /dev/null +++ b/mods/sudoku/lv1_73.txt @@ -0,0 +1,9 @@ +006010390 +089605072 +104932008 +830704605 +042000810 +905201037 +500463901 +610509740 +093070200 \ No newline at end of file diff --git a/mods/sudoku/lv1_74.txt b/mods/sudoku/lv1_74.txt new file mode 100644 index 0000000..3fa7f8f --- /dev/null +++ b/mods/sudoku/lv1_74.txt @@ -0,0 +1,9 @@ +024506790 +600904002 +900127004 +763050941 +009603800 +851070236 +400765003 +500308009 +076201480 \ No newline at end of file diff --git a/mods/sudoku/lv1_75.txt b/mods/sudoku/lv1_75.txt new file mode 100644 index 0000000..d646bd3 --- /dev/null +++ b/mods/sudoku/lv1_75.txt @@ -0,0 +1,9 @@ +010903020 +802645301 +670000054 +940302065 +130806049 +520704083 +380000092 +209481507 +050209010 \ No newline at end of file diff --git a/mods/sudoku/lv1_76.txt b/mods/sudoku/lv1_76.txt new file mode 100644 index 0000000..9101a9b --- /dev/null +++ b/mods/sudoku/lv1_76.txt @@ -0,0 +1,9 @@ +064905020 +802406357 +050287040 +083020470 +500804002 +046090180 +070148090 +439602508 +020309760 \ No newline at end of file diff --git a/mods/sudoku/lv1_77.txt b/mods/sudoku/lv1_77.txt new file mode 100644 index 0000000..0db3585 --- /dev/null +++ b/mods/sudoku/lv1_77.txt @@ -0,0 +1,9 @@ +350000021 +602915703 +081203590 +067801930 +010000070 +095307160 +038106240 +904532806 +120000059 \ No newline at end of file diff --git a/mods/sudoku/lv1_78.txt b/mods/sudoku/lv1_78.txt new file mode 100644 index 0000000..3363b1f --- /dev/null +++ b/mods/sudoku/lv1_78.txt @@ -0,0 +1,9 @@ +720403085 +301050402 +050701030 +039040860 +208309501 +540010093 +680104029 +402060308 +013207650 \ No newline at end of file diff --git a/mods/sudoku/lv1_79.txt b/mods/sudoku/lv1_79.txt new file mode 100644 index 0000000..da064ba --- /dev/null +++ b/mods/sudoku/lv1_79.txt @@ -0,0 +1,9 @@ +041003708 +702104906 +938006410 +509020064 +006701500 +210050803 +063800259 +105402307 +807900640 \ No newline at end of file diff --git a/mods/sudoku/lv1_8.txt b/mods/sudoku/lv1_8.txt new file mode 100644 index 0000000..fdb63ef --- /dev/null +++ b/mods/sudoku/lv1_8.txt @@ -0,0 +1,9 @@ +135006000 +040825713 +827100005 +904203850 +008604200 +071508306 +500007134 +713452090 +000300527 \ No newline at end of file diff --git a/mods/sudoku/lv1_80.txt b/mods/sudoku/lv1_80.txt new file mode 100644 index 0000000..d6fa78d --- /dev/null +++ b/mods/sudoku/lv1_80.txt @@ -0,0 +1,9 @@ +769008000 +040139276 +132700009 +504306190 +001804300 +027901608 +900002764 +276493050 +000600932 \ No newline at end of file diff --git a/mods/sudoku/lv1_81.txt b/mods/sudoku/lv1_81.txt new file mode 100644 index 0000000..6bdf514 --- /dev/null +++ b/mods/sudoku/lv1_81.txt @@ -0,0 +1,9 @@ +050409030 +900050002 +003207500 +305000901 +060000050 +701000603 +009705200 +500040008 +020308070 \ No newline at end of file diff --git a/mods/sudoku/lv1_82.txt b/mods/sudoku/lv1_82.txt new file mode 100644 index 0000000..3053e70 --- /dev/null +++ b/mods/sudoku/lv1_82.txt @@ -0,0 +1,9 @@ +008439500 +000206000 +300080009 +470000013 +201000604 +890000025 +500020001 +000908000 +009165400 \ No newline at end of file diff --git a/mods/sudoku/lv1_83.txt b/mods/sudoku/lv1_83.txt new file mode 100644 index 0000000..1462de0 --- /dev/null +++ b/mods/sudoku/lv1_83.txt @@ -0,0 +1,9 @@ +105602803 +000301000 +600080004 +490000015 +003000400 +760000089 +900030002 +000206000 +306105708 \ No newline at end of file diff --git a/mods/sudoku/lv1_84.txt b/mods/sudoku/lv1_84.txt new file mode 100644 index 0000000..9b51365 --- /dev/null +++ b/mods/sudoku/lv1_84.txt @@ -0,0 +1,9 @@ +008501300 +030402060 +400030009 +140000095 +005000100 +670000082 +300010007 +090308040 +007604900 \ No newline at end of file diff --git a/mods/sudoku/lv1_85.txt b/mods/sudoku/lv1_85.txt new file mode 100644 index 0000000..991a766 --- /dev/null +++ b/mods/sudoku/lv1_85.txt @@ -0,0 +1,9 @@ +018000560 +290030081 +300000004 +000978000 +070302090 +000164000 +100000005 +860010049 +023000810 \ No newline at end of file diff --git a/mods/sudoku/lv1_86.txt b/mods/sudoku/lv1_86.txt new file mode 100644 index 0000000..3676a1c --- /dev/null +++ b/mods/sudoku/lv1_86.txt @@ -0,0 +1,9 @@ +847000256 +500080004 +200070008 +000308000 +051000870 +000507000 +400050007 +600030009 +132000485 \ No newline at end of file diff --git a/mods/sudoku/lv1_87.txt b/mods/sudoku/lv1_87.txt new file mode 100644 index 0000000..c9b0771 --- /dev/null +++ b/mods/sudoku/lv1_87.txt @@ -0,0 +1,9 @@ +073000540 +450000079 +900040003 +000256000 +009407100 +000981000 +300060002 +180000096 +024000310 \ No newline at end of file diff --git a/mods/sudoku/lv1_88.txt b/mods/sudoku/lv1_88.txt new file mode 100644 index 0000000..edf6439 --- /dev/null +++ b/mods/sudoku/lv1_88.txt @@ -0,0 +1,9 @@ +007030100 +002901700 +130000042 +020507010 +700000005 +050609070 +840000091 +001806300 +003050800 \ No newline at end of file diff --git a/mods/sudoku/lv1_89.txt b/mods/sudoku/lv1_89.txt new file mode 100644 index 0000000..478eb2b --- /dev/null +++ b/mods/sudoku/lv1_89.txt @@ -0,0 +1,9 @@ +030000090 +900204006 +002697500 +094000820 +003000600 +061000340 +009372400 +300809002 +020000050 \ No newline at end of file diff --git a/mods/sudoku/lv1_9.txt b/mods/sudoku/lv1_9.txt new file mode 100644 index 0000000..ac3c0ca --- /dev/null +++ b/mods/sudoku/lv1_9.txt @@ -0,0 +1,9 @@ +000479000 +043608970 +079030480 +425010768 +190506024 +836040159 +051060240 +064201890 +000394000 \ No newline at end of file diff --git a/mods/sudoku/lv1_90.txt b/mods/sudoku/lv1_90.txt new file mode 100644 index 0000000..6ffe1da --- /dev/null +++ b/mods/sudoku/lv1_90.txt @@ -0,0 +1,9 @@ +007489500 +000000000 +800307009 +601090207 +200701008 +508040901 +700508002 +000000000 +005176800 \ No newline at end of file diff --git a/mods/sudoku/lv1_91.txt b/mods/sudoku/lv1_91.txt new file mode 100644 index 0000000..d6d2721 --- /dev/null +++ b/mods/sudoku/lv1_91.txt @@ -0,0 +1,9 @@ +060905080 +900000003 +002406700 +709060102 +000109000 +103050906 +001607800 +400000009 +090502010 \ No newline at end of file diff --git a/mods/sudoku/lv1_92.txt b/mods/sudoku/lv1_92.txt new file mode 100644 index 0000000..fa66fff --- /dev/null +++ b/mods/sudoku/lv1_92.txt @@ -0,0 +1,9 @@ +800905003 +005308600 +030040080 +370000096 +002000800 +650000032 +060080040 +003704200 +400206008 \ No newline at end of file diff --git a/mods/sudoku/lv1_93.txt b/mods/sudoku/lv1_93.txt new file mode 100644 index 0000000..a2e6349 --- /dev/null +++ b/mods/sudoku/lv1_93.txt @@ -0,0 +1,9 @@ +020987060 +700105008 +000040000 +510000046 +902000705 +470000021 +000050000 +100802009 +090461050 \ No newline at end of file diff --git a/mods/sudoku/lv1_94.txt b/mods/sudoku/lv1_94.txt new file mode 100644 index 0000000..eede58e --- /dev/null +++ b/mods/sudoku/lv1_94.txt @@ -0,0 +1,9 @@ +000090000 +006317500 +090408020 +023000760 +750000098 +048000210 +010704050 +005129800 +000080000 \ No newline at end of file diff --git a/mods/sudoku/lv1_95.txt b/mods/sudoku/lv1_95.txt new file mode 100644 index 0000000..0c8f679 --- /dev/null +++ b/mods/sudoku/lv1_95.txt @@ -0,0 +1,9 @@ +900030004 +034000860 +020407090 +006203500 +100000003 +003109600 +050304070 +012000450 +400010006 \ No newline at end of file diff --git a/mods/sudoku/lv1_96.txt b/mods/sudoku/lv1_96.txt new file mode 100644 index 0000000..b699ea2 --- /dev/null +++ b/mods/sudoku/lv1_96.txt @@ -0,0 +1,9 @@ +092070410 +700301005 +100000006 +010020050 +400503002 +020080060 +600000009 +200407008 +073050240 \ No newline at end of file diff --git a/mods/sudoku/lv1_97.txt b/mods/sudoku/lv1_97.txt new file mode 100644 index 0000000..21ece37 --- /dev/null +++ b/mods/sudoku/lv1_97.txt @@ -0,0 +1,9 @@ +400791005 +000406000 +006030700 +680000019 +205000406 +710000032 +001060900 +000908000 +900143007 \ No newline at end of file diff --git a/mods/sudoku/lv1_98.txt b/mods/sudoku/lv1_98.txt new file mode 100644 index 0000000..754eb0c --- /dev/null +++ b/mods/sudoku/lv1_98.txt @@ -0,0 +1,9 @@ +040706020 +200304005 +003010800 +180000093 +004000100 +690000054 +006070400 +400908007 +070402010 \ No newline at end of file diff --git a/mods/sudoku/lv1_99.txt b/mods/sudoku/lv1_99.txt new file mode 100644 index 0000000..087743c --- /dev/null +++ b/mods/sudoku/lv1_99.txt @@ -0,0 +1,9 @@ +040070090 +900508006 +006209400 +053000610 +200000005 +068000920 +004103700 +300807001 +080020060 \ No newline at end of file diff --git a/mods/sudoku/lv2_1.txt b/mods/sudoku/lv2_1.txt new file mode 100644 index 0000000..869c8e0 --- /dev/null +++ b/mods/sudoku/lv2_1.txt @@ -0,0 +1,9 @@ +040003720 +920460008 +006210003 +034020060 +090586401 +600041200 +700052080 +400100679 +068070012 \ No newline at end of file diff --git a/mods/sudoku/lv2_10.txt b/mods/sudoku/lv2_10.txt new file mode 100644 index 0000000..91696c4 --- /dev/null +++ b/mods/sudoku/lv2_10.txt @@ -0,0 +1,9 @@ +000928500 +095001200 +020005719 +600090103 +400156080 +189040050 +548700090 +006089470 +007300005 \ No newline at end of file diff --git a/mods/sudoku/lv2_100.txt b/mods/sudoku/lv2_100.txt new file mode 100644 index 0000000..7119537 --- /dev/null +++ b/mods/sudoku/lv2_100.txt @@ -0,0 +1,9 @@ +051000034 +800695002 +200000908 +090008040 +010003720 +030147000 +005010490 +700520800 +184000005 \ No newline at end of file diff --git a/mods/sudoku/lv2_101.txt b/mods/sudoku/lv2_101.txt new file mode 100644 index 0000000..5bf6965 --- /dev/null +++ b/mods/sudoku/lv2_101.txt @@ -0,0 +1,9 @@ +080000126 +601900070 +074500800 +028057003 +000169000 +000280050 +305000008 +940001007 +800600342 \ No newline at end of file diff --git a/mods/sudoku/lv2_102.txt b/mods/sudoku/lv2_102.txt new file mode 100644 index 0000000..a8ea4e2 --- /dev/null +++ b/mods/sudoku/lv2_102.txt @@ -0,0 +1,9 @@ +090003000 +870400000 +100000075 +000028100 +580000063 +006340000 +920000008 +000001024 +000500010 \ No newline at end of file diff --git a/mods/sudoku/lv2_103.txt b/mods/sudoku/lv2_103.txt new file mode 100644 index 0000000..2e24e58 --- /dev/null +++ b/mods/sudoku/lv2_103.txt @@ -0,0 +1,9 @@ +035000901 +600010080 +809705006 +003891000 +090360100 +006507030 +400070003 +020008004 +908000520 \ No newline at end of file diff --git a/mods/sudoku/lv2_104.txt b/mods/sudoku/lv2_104.txt new file mode 100644 index 0000000..2031624 --- /dev/null +++ b/mods/sudoku/lv2_104.txt @@ -0,0 +1,9 @@ +000642190 +000000500 +004038000 +300784900 +201300740 +409200006 +150420060 +600050413 +000003050 \ No newline at end of file diff --git a/mods/sudoku/lv2_105.txt b/mods/sudoku/lv2_105.txt new file mode 100644 index 0000000..594cd2a --- /dev/null +++ b/mods/sudoku/lv2_105.txt @@ -0,0 +1,9 @@ +470900003 +800507090 +006030008 +340028500 +001700402 +020400009 +000860071 +060000920 +507092600 \ No newline at end of file diff --git a/mods/sudoku/lv2_106.txt b/mods/sudoku/lv2_106.txt new file mode 100644 index 0000000..dc9470e --- /dev/null +++ b/mods/sudoku/lv2_106.txt @@ -0,0 +1,9 @@ +063800005 +500060390 +200700100 +607108000 +080003014 +000296030 +049000003 +020087001 +700050289 \ No newline at end of file diff --git a/mods/sudoku/lv2_107.txt b/mods/sudoku/lv2_107.txt new file mode 100644 index 0000000..fac755b --- /dev/null +++ b/mods/sudoku/lv2_107.txt @@ -0,0 +1,9 @@ +600008310 +070305082 +005000040 +040080001 +000614509 +160050030 +800030190 +753001600 +010740000 \ No newline at end of file diff --git a/mods/sudoku/lv2_108.txt b/mods/sudoku/lv2_108.txt new file mode 100644 index 0000000..10248c3 --- /dev/null +++ b/mods/sudoku/lv2_108.txt @@ -0,0 +1,9 @@ +060007000 +082035004 +000000600 +050700103 +020010060 +301009040 +007000000 +100920480 +000800030 \ No newline at end of file diff --git a/mods/sudoku/lv2_109.txt b/mods/sudoku/lv2_109.txt new file mode 100644 index 0000000..07aaa2e --- /dev/null +++ b/mods/sudoku/lv2_109.txt @@ -0,0 +1,9 @@ +200040090 +001020400 +050091203 +000400016 +849016000 +006050840 +028004709 +600302000 +007900602 \ No newline at end of file diff --git a/mods/sudoku/lv2_11.txt b/mods/sudoku/lv2_11.txt new file mode 100644 index 0000000..7e8ddaf --- /dev/null +++ b/mods/sudoku/lv2_11.txt @@ -0,0 +1,9 @@ +249050000 +670408300 +300960520 +083500000 +706093040 +090074805 +061009083 +007080410 +000006709 \ No newline at end of file diff --git a/mods/sudoku/lv2_110.txt b/mods/sudoku/lv2_110.txt new file mode 100644 index 0000000..0166b69 --- /dev/null +++ b/mods/sudoku/lv2_110.txt @@ -0,0 +1,9 @@ +107000280 +005030000 +980200506 +006070802 +050609034 +000013700 +201407300 +500060008 +004190020 \ No newline at end of file diff --git a/mods/sudoku/lv2_111.txt b/mods/sudoku/lv2_111.txt new file mode 100644 index 0000000..079395f --- /dev/null +++ b/mods/sudoku/lv2_111.txt @@ -0,0 +1,9 @@ +009800030 +008716000 +740900010 +814000079 +050090100 +070008604 +000085002 +403600001 +000201960 \ No newline at end of file diff --git a/mods/sudoku/lv2_112.txt b/mods/sudoku/lv2_112.txt new file mode 100644 index 0000000..cfdfccc --- /dev/null +++ b/mods/sudoku/lv2_112.txt @@ -0,0 +1,9 @@ +602007800 +000302100 +307006940 +070100050 +000000704 +953000018 +291060507 +004501020 +000098400 \ No newline at end of file diff --git a/mods/sudoku/lv2_113.txt b/mods/sudoku/lv2_113.txt new file mode 100644 index 0000000..813a82b --- /dev/null +++ b/mods/sudoku/lv2_113.txt @@ -0,0 +1,9 @@ +900570000 +008400006 +050600970 +162048000 +500200640 +000905082 +003050800 +001034057 +070002060 \ No newline at end of file diff --git a/mods/sudoku/lv2_114.txt b/mods/sudoku/lv2_114.txt new file mode 100644 index 0000000..5fb8069 --- /dev/null +++ b/mods/sudoku/lv2_114.txt @@ -0,0 +1,9 @@ +000070418 +008302700 +040180020 +053000207 +209007030 +070010005 +820500040 +604030500 +500804000 \ No newline at end of file diff --git a/mods/sudoku/lv2_115.txt b/mods/sudoku/lv2_115.txt new file mode 100644 index 0000000..3ae64b5 --- /dev/null +++ b/mods/sudoku/lv2_115.txt @@ -0,0 +1,9 @@ +090302010 +170000036 +000070000 +700501009 +609000108 +200907003 +000050000 +920000045 +060704090 \ No newline at end of file diff --git a/mods/sudoku/lv2_116.txt b/mods/sudoku/lv2_116.txt new file mode 100644 index 0000000..9404664 --- /dev/null +++ b/mods/sudoku/lv2_116.txt @@ -0,0 +1,9 @@ +090204800 +700001009 +008905703 +307050040 +000710036 +265003000 +604000010 +000320904 +032040080 \ No newline at end of file diff --git a/mods/sudoku/lv2_117.txt b/mods/sudoku/lv2_117.txt new file mode 100644 index 0000000..cf0b427 --- /dev/null +++ b/mods/sudoku/lv2_117.txt @@ -0,0 +1,9 @@ +000604012 +000810900 +000000630 +970005008 +020000765 +300700201 +035081070 +702090500 +800357000 \ No newline at end of file diff --git a/mods/sudoku/lv2_118.txt b/mods/sudoku/lv2_118.txt new file mode 100644 index 0000000..ecbb04d --- /dev/null +++ b/mods/sudoku/lv2_118.txt @@ -0,0 +1,9 @@ +450800001 +800000029 +000009460 +900003056 +000006734 +006451000 +005040010 +074620900 +280190000 \ No newline at end of file diff --git a/mods/sudoku/lv2_119.txt b/mods/sudoku/lv2_119.txt new file mode 100644 index 0000000..7e5dc29 --- /dev/null +++ b/mods/sudoku/lv2_119.txt @@ -0,0 +1,9 @@ +000051040 +004008050 +050009006 +000430690 +300100820 +265000304 +000913000 +490780001 +008004069 \ No newline at end of file diff --git a/mods/sudoku/lv2_12.txt b/mods/sudoku/lv2_12.txt new file mode 100644 index 0000000..4589955 --- /dev/null +++ b/mods/sudoku/lv2_12.txt @@ -0,0 +1,9 @@ +090106050 +007000600 +001504200 +500080002 +020309040 +100040006 +006405700 +002000900 +080207030 \ No newline at end of file diff --git a/mods/sudoku/lv2_120.txt b/mods/sudoku/lv2_120.txt new file mode 100644 index 0000000..16c55ac --- /dev/null +++ b/mods/sudoku/lv2_120.txt @@ -0,0 +1,9 @@ +697100080 +400006001 +100005062 +900040653 +000310800 +028000000 +000730506 +806200040 +015600208 \ No newline at end of file diff --git a/mods/sudoku/lv2_121.txt b/mods/sudoku/lv2_121.txt new file mode 100644 index 0000000..04f78b2 --- /dev/null +++ b/mods/sudoku/lv2_121.txt @@ -0,0 +1,9 @@ +013780000 +700604003 +604300100 +129060700 +400200016 +070000230 +005908000 +000026085 +090070060 \ No newline at end of file diff --git a/mods/sudoku/lv2_122.txt b/mods/sudoku/lv2_122.txt new file mode 100644 index 0000000..941e72d --- /dev/null +++ b/mods/sudoku/lv2_122.txt @@ -0,0 +1,9 @@ +340000085 +200000009 +070506020 +090652040 +000000000 +050981060 +080205010 +500000002 +430000076 \ No newline at end of file diff --git a/mods/sudoku/lv2_123.txt b/mods/sudoku/lv2_123.txt new file mode 100644 index 0000000..6b81312 --- /dev/null +++ b/mods/sudoku/lv2_123.txt @@ -0,0 +1,9 @@ +005016800 +000003910 +600090572 +000070053 +502300080 +460005000 +246000008 +017940000 +008600307 \ No newline at end of file diff --git a/mods/sudoku/lv2_124.txt b/mods/sudoku/lv2_124.txt new file mode 100644 index 0000000..75731bc --- /dev/null +++ b/mods/sudoku/lv2_124.txt @@ -0,0 +1,9 @@ +301000700 +006708900 +570301006 +023067400 +000900273 +057400010 +430580000 +000036009 +005070080 \ No newline at end of file diff --git a/mods/sudoku/lv2_125.txt b/mods/sudoku/lv2_125.txt new file mode 100644 index 0000000..1920926 --- /dev/null +++ b/mods/sudoku/lv2_125.txt @@ -0,0 +1,9 @@ +000060570 +000005143 +000340000 +002083000 +504600089 +060200017 +980000700 +450016008 +070098031 \ No newline at end of file diff --git a/mods/sudoku/lv2_126.txt b/mods/sudoku/lv2_126.txt new file mode 100644 index 0000000..e631932 --- /dev/null +++ b/mods/sudoku/lv2_126.txt @@ -0,0 +1,9 @@ +200010073 +000028005 +001037000 +000140500 +137900006 +065000018 +000800060 +500002741 +320061050 \ No newline at end of file diff --git a/mods/sudoku/lv2_127.txt b/mods/sudoku/lv2_127.txt new file mode 100644 index 0000000..4c2e750 --- /dev/null +++ b/mods/sudoku/lv2_127.txt @@ -0,0 +1,9 @@ +100300060 +069800073 +038140090 +943000600 +007003800 +000060027 +000720900 +374001002 +090008016 \ No newline at end of file diff --git a/mods/sudoku/lv2_128.txt b/mods/sudoku/lv2_128.txt new file mode 100644 index 0000000..61fe234 --- /dev/null +++ b/mods/sudoku/lv2_128.txt @@ -0,0 +1,9 @@ +026000190 +000806000 +001040300 +740000081 +008000700 +160000053 +007030400 +000207000 +032000670 \ No newline at end of file diff --git a/mods/sudoku/lv2_129.txt b/mods/sudoku/lv2_129.txt new file mode 100644 index 0000000..75901da --- /dev/null +++ b/mods/sudoku/lv2_129.txt @@ -0,0 +1,9 @@ +004207500 +020600479 +500349000 +159000020 +002008750 +407021000 +240060907 +060970000 +090000100 \ No newline at end of file diff --git a/mods/sudoku/lv2_13.txt b/mods/sudoku/lv2_13.txt new file mode 100644 index 0000000..b55f0d3 --- /dev/null +++ b/mods/sudoku/lv2_13.txt @@ -0,0 +1,9 @@ +106382090 +009010070 +350407216 +504030960 +910600000 +203000104 +001703009 +635900000 +002004608 \ No newline at end of file diff --git a/mods/sudoku/lv2_130.txt b/mods/sudoku/lv2_130.txt new file mode 100644 index 0000000..d30125e --- /dev/null +++ b/mods/sudoku/lv2_130.txt @@ -0,0 +1,9 @@ +000840061 +000500038 +000027590 +740009003 +901000640 +003400950 +007065000 +315072000 +260300000 \ No newline at end of file diff --git a/mods/sudoku/lv2_131.txt b/mods/sudoku/lv2_131.txt new file mode 100644 index 0000000..f315c14 --- /dev/null +++ b/mods/sudoku/lv2_131.txt @@ -0,0 +1,9 @@ +000000000 +010867000 +000200350 +081000400 +050000097 +070003005 +002300000 +009080006 +000052070 \ No newline at end of file diff --git a/mods/sudoku/lv2_132.txt b/mods/sudoku/lv2_132.txt new file mode 100644 index 0000000..18aa24e --- /dev/null +++ b/mods/sudoku/lv2_132.txt @@ -0,0 +1,9 @@ +030970800 +760010004 +000000010 +500030006 +690500000 +000002090 +900000780 +005004600 +020300000 \ No newline at end of file diff --git a/mods/sudoku/lv2_133.txt b/mods/sudoku/lv2_133.txt new file mode 100644 index 0000000..a75c32a --- /dev/null +++ b/mods/sudoku/lv2_133.txt @@ -0,0 +1,9 @@ +209600000 +000000805 +000070029 +000008130 +002000400 +058200000 +910040000 +703000000 +000001603 \ No newline at end of file diff --git a/mods/sudoku/lv2_134.txt b/mods/sudoku/lv2_134.txt new file mode 100644 index 0000000..b6dda55 --- /dev/null +++ b/mods/sudoku/lv2_134.txt @@ -0,0 +1,9 @@ +000304600 +007006000 +081007000 +500100906 +000000030 +978000000 +300600108 +000040000 +000900200 \ No newline at end of file diff --git a/mods/sudoku/lv2_135.txt b/mods/sudoku/lv2_135.txt new file mode 100644 index 0000000..8767647 --- /dev/null +++ b/mods/sudoku/lv2_135.txt @@ -0,0 +1,9 @@ +050000400 +300006002 +000850000 +005000096 +003009001 +090073050 +200000600 +000107000 +040690007 \ No newline at end of file diff --git a/mods/sudoku/lv2_136.txt b/mods/sudoku/lv2_136.txt new file mode 100644 index 0000000..8a680b9 --- /dev/null +++ b/mods/sudoku/lv2_136.txt @@ -0,0 +1,9 @@ +000900000 +620000030 +000080450 +003071500 +200000003 +001420700 +054010000 +030000089 +000002000 \ No newline at end of file diff --git a/mods/sudoku/lv2_137.txt b/mods/sudoku/lv2_137.txt new file mode 100644 index 0000000..94630a1 --- /dev/null +++ b/mods/sudoku/lv2_137.txt @@ -0,0 +1,9 @@ +708000000 +000700301 +200061000 +020000056 +005000170 +006009000 +060040002 +000370000 +080100903 \ No newline at end of file diff --git a/mods/sudoku/lv2_138.txt b/mods/sudoku/lv2_138.txt new file mode 100644 index 0000000..442230e --- /dev/null +++ b/mods/sudoku/lv2_138.txt @@ -0,0 +1,9 @@ +000090062 +050000000 +000400507 +008006904 +200000003 +000700600 +002504000 +800000009 +306120800 \ No newline at end of file diff --git a/mods/sudoku/lv2_139.txt b/mods/sudoku/lv2_139.txt new file mode 100644 index 0000000..55f2e55 --- /dev/null +++ b/mods/sudoku/lv2_139.txt @@ -0,0 +1,9 @@ +040060000 +700000900 +010002034 +090000003 +800643009 +600000070 +350700060 +002000008 +000020010 \ No newline at end of file diff --git a/mods/sudoku/lv2_14.txt b/mods/sudoku/lv2_14.txt new file mode 100644 index 0000000..de1db82 --- /dev/null +++ b/mods/sudoku/lv2_14.txt @@ -0,0 +1,9 @@ +510700090 +700350040 +003942700 +241000070 +079025600 +005087009 +008010067 +930200105 +000006234 \ No newline at end of file diff --git a/mods/sudoku/lv2_140.txt b/mods/sudoku/lv2_140.txt new file mode 100644 index 0000000..6641323 --- /dev/null +++ b/mods/sudoku/lv2_140.txt @@ -0,0 +1,9 @@ +300200500 +002580000 +010700200 +481005000 +070009000 +000670020 +108000030 +000006908 +000000060 \ No newline at end of file diff --git a/mods/sudoku/lv2_141.txt b/mods/sudoku/lv2_141.txt new file mode 100644 index 0000000..7b538bf --- /dev/null +++ b/mods/sudoku/lv2_141.txt @@ -0,0 +1,9 @@ +000020061 +005900080 +010400003 +057090000 +100506007 +000040100 +000008200 +730000000 +809030000 \ No newline at end of file diff --git a/mods/sudoku/lv2_142.txt b/mods/sudoku/lv2_142.txt new file mode 100644 index 0000000..cc17e67 --- /dev/null +++ b/mods/sudoku/lv2_142.txt @@ -0,0 +1,9 @@ +300020000 +010800050 +000007380 +805700200 +000000000 +004003709 +091400000 +020006090 +000090005 \ No newline at end of file diff --git a/mods/sudoku/lv2_143.txt b/mods/sudoku/lv2_143.txt new file mode 100644 index 0000000..348dcfd --- /dev/null +++ b/mods/sudoku/lv2_143.txt @@ -0,0 +1,9 @@ +590000800 +600000049 +002080000 +000100904 +004008002 +000060050 +700400090 +040001700 +010930000 \ No newline at end of file diff --git a/mods/sudoku/lv2_144.txt b/mods/sudoku/lv2_144.txt new file mode 100644 index 0000000..b91cd7b --- /dev/null +++ b/mods/sudoku/lv2_144.txt @@ -0,0 +1,9 @@ +007080400 +000003015 +800400600 +004010003 +100907008 +020040000 +703000000 +050000000 +040820000 \ No newline at end of file diff --git a/mods/sudoku/lv2_145.txt b/mods/sudoku/lv2_145.txt new file mode 100644 index 0000000..5dd8267 --- /dev/null +++ b/mods/sudoku/lv2_145.txt @@ -0,0 +1,9 @@ +084030900 +020000000 +006405000 +010000005 +300901004 +600000080 +000607400 +000000070 +003090250 \ No newline at end of file diff --git a/mods/sudoku/lv2_146.txt b/mods/sudoku/lv2_146.txt new file mode 100644 index 0000000..ee76972 --- /dev/null +++ b/mods/sudoku/lv2_146.txt @@ -0,0 +1,9 @@ +080010000 +700900050 +000400600 +032049080 +400700020 +000500010 +008000001 +040293000 +000000905 \ No newline at end of file diff --git a/mods/sudoku/lv2_147.txt b/mods/sudoku/lv2_147.txt new file mode 100644 index 0000000..e897e84 --- /dev/null +++ b/mods/sudoku/lv2_147.txt @@ -0,0 +1,9 @@ +030020000 +100800500 +004000907 +090000060 +800003210 +000010004 +062030000 +000970008 +003002050 \ No newline at end of file diff --git a/mods/sudoku/lv2_148.txt b/mods/sudoku/lv2_148.txt new file mode 100644 index 0000000..fff4e78 --- /dev/null +++ b/mods/sudoku/lv2_148.txt @@ -0,0 +1,9 @@ +840000000 +006002000 +007500060 +003001049 +001060500 +950200600 +010003400 +000800900 +000000075 \ No newline at end of file diff --git a/mods/sudoku/lv2_149.txt b/mods/sudoku/lv2_149.txt new file mode 100644 index 0000000..adc1c78 --- /dev/null +++ b/mods/sudoku/lv2_149.txt @@ -0,0 +1,9 @@ +000004005 +006000041 +030005600 +000300000 +000000254 +705000010 +009030000 +020067003 +850020060 \ No newline at end of file diff --git a/mods/sudoku/lv2_15.txt b/mods/sudoku/lv2_15.txt new file mode 100644 index 0000000..6baa649 --- /dev/null +++ b/mods/sudoku/lv2_15.txt @@ -0,0 +1,9 @@ +900005712 +001970500 +050103960 +047010600 +060309007 +109067003 +815600009 +402000080 +600094200 \ No newline at end of file diff --git a/mods/sudoku/lv2_150.txt b/mods/sudoku/lv2_150.txt new file mode 100644 index 0000000..735b475 --- /dev/null +++ b/mods/sudoku/lv2_150.txt @@ -0,0 +1,9 @@ +060000010 +700040009 +000000804 +000000083 +050009700 +000037000 +002080040 +800200960 +096300000 \ No newline at end of file diff --git a/mods/sudoku/lv2_151.txt b/mods/sudoku/lv2_151.txt new file mode 100644 index 0000000..29dea38 --- /dev/null +++ b/mods/sudoku/lv2_151.txt @@ -0,0 +1,9 @@ +000600802 +073000400 +290000000 +000004201 +000507000 +901800000 +000000013 +007000650 +406005000 \ No newline at end of file diff --git a/mods/sudoku/lv2_152.txt b/mods/sudoku/lv2_152.txt new file mode 100644 index 0000000..0e95022 --- /dev/null +++ b/mods/sudoku/lv2_152.txt @@ -0,0 +1,9 @@ +900006800 +010900045 +000800000 +057000900 +000000470 +200009000 +600480002 +030050009 +020000150 \ No newline at end of file diff --git a/mods/sudoku/lv2_153.txt b/mods/sudoku/lv2_153.txt new file mode 100644 index 0000000..cd255e7 --- /dev/null +++ b/mods/sudoku/lv2_153.txt @@ -0,0 +1,9 @@ +800000000 +004003105 +026000009 +000004003 +000007690 +010930000 +060020008 +000050070 +082600900 \ No newline at end of file diff --git a/mods/sudoku/lv2_154.txt b/mods/sudoku/lv2_154.txt new file mode 100644 index 0000000..90f0c80 --- /dev/null +++ b/mods/sudoku/lv2_154.txt @@ -0,0 +1,9 @@ +900602001 +807400000 +000090200 +000500000 +408000309 +000006000 +005070000 +000003706 +100904008 \ No newline at end of file diff --git a/mods/sudoku/lv2_155.txt b/mods/sudoku/lv2_155.txt new file mode 100644 index 0000000..fd120d3 --- /dev/null +++ b/mods/sudoku/lv2_155.txt @@ -0,0 +1,9 @@ +200900001 +070000000 +000080074 +900750800 +008290000 +000000560 +000802000 +006009010 +504000006 \ No newline at end of file diff --git a/mods/sudoku/lv2_156.txt b/mods/sudoku/lv2_156.txt new file mode 100644 index 0000000..96f13d7 --- /dev/null +++ b/mods/sudoku/lv2_156.txt @@ -0,0 +1,9 @@ +050600003 +400000001 +000270609 +807060090 +005800030 +000002000 +001000050 +000130400 +974000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_157.txt b/mods/sudoku/lv2_157.txt new file mode 100644 index 0000000..4955ec8 --- /dev/null +++ b/mods/sudoku/lv2_157.txt @@ -0,0 +1,9 @@ +010000602 +000100090 +400800013 +070004080 +000050000 +040900050 +380006007 +020001000 +504000020 \ No newline at end of file diff --git a/mods/sudoku/lv2_158.txt b/mods/sudoku/lv2_158.txt new file mode 100644 index 0000000..fa9156c --- /dev/null +++ b/mods/sudoku/lv2_158.txt @@ -0,0 +1,9 @@ +007850200 +000030080 +600000500 +700004000 +920000100 +000700050 +208090007 +010006005 +000000310 \ No newline at end of file diff --git a/mods/sudoku/lv2_159.txt b/mods/sudoku/lv2_159.txt new file mode 100644 index 0000000..56d242f --- /dev/null +++ b/mods/sudoku/lv2_159.txt @@ -0,0 +1,9 @@ +500000307 +000000010 +009060020 +000402000 +001000740 +000600800 +700028001 +035010000 +900000400 \ No newline at end of file diff --git a/mods/sudoku/lv2_16.txt b/mods/sudoku/lv2_16.txt new file mode 100644 index 0000000..328057b --- /dev/null +++ b/mods/sudoku/lv2_16.txt @@ -0,0 +1,9 @@ +300790040 +000000036 +000063207 +400915600 +201370090 +009200381 +002401003 +630027009 +057009420 \ No newline at end of file diff --git a/mods/sudoku/lv2_160.txt b/mods/sudoku/lv2_160.txt new file mode 100644 index 0000000..26089d7 --- /dev/null +++ b/mods/sudoku/lv2_160.txt @@ -0,0 +1,9 @@ +002070040 +000904010 +510000007 +000090100 +000702000 +003040000 +900000062 +050807000 +080060300 \ No newline at end of file diff --git a/mods/sudoku/lv2_161.txt b/mods/sudoku/lv2_161.txt new file mode 100644 index 0000000..c59955b --- /dev/null +++ b/mods/sudoku/lv2_161.txt @@ -0,0 +1,9 @@ +200600380 +000950600 +004300900 +418070000 +070805000 +000010000 +853000010 +600000200 +000000007 \ No newline at end of file diff --git a/mods/sudoku/lv2_162.txt b/mods/sudoku/lv2_162.txt new file mode 100644 index 0000000..abd7909 --- /dev/null +++ b/mods/sudoku/lv2_162.txt @@ -0,0 +1,9 @@ +000000085 +002710000 +080009300 +020000704 +060002008 +005030000 +003900507 +900000000 +700620100 \ No newline at end of file diff --git a/mods/sudoku/lv2_163.txt b/mods/sudoku/lv2_163.txt new file mode 100644 index 0000000..4bd2a94 --- /dev/null +++ b/mods/sudoku/lv2_163.txt @@ -0,0 +1,9 @@ +690075000 +000001780 +000000090 +700900200 +000102000 +003004001 +040000000 +039200000 +000310065 \ No newline at end of file diff --git a/mods/sudoku/lv2_164.txt b/mods/sudoku/lv2_164.txt new file mode 100644 index 0000000..342ce94 --- /dev/null +++ b/mods/sudoku/lv2_164.txt @@ -0,0 +1,9 @@ +042009000 +900001000 +300000097 +000100704 +000000019 +560000000 +000700045 +003020800 +008510300 \ No newline at end of file diff --git a/mods/sudoku/lv2_165.txt b/mods/sudoku/lv2_165.txt new file mode 100644 index 0000000..8588aec --- /dev/null +++ b/mods/sudoku/lv2_165.txt @@ -0,0 +1,9 @@ +000006004 +079000802 +020010000 +000047680 +005800010 +400100000 +030400500 +000730000 +280000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_166.txt b/mods/sudoku/lv2_166.txt new file mode 100644 index 0000000..3bf1038 --- /dev/null +++ b/mods/sudoku/lv2_166.txt @@ -0,0 +1,9 @@ +000000004 +000060500 +006270903 +104000028 +000000000 +590000701 +603097200 +001050000 +200000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_167.txt b/mods/sudoku/lv2_167.txt new file mode 100644 index 0000000..e5a13c7 --- /dev/null +++ b/mods/sudoku/lv2_167.txt @@ -0,0 +1,9 @@ +006000210 +030080040 +102500000 +008000407 +060007000 +000050900 +300901800 +640000003 +000300070 \ No newline at end of file diff --git a/mods/sudoku/lv2_168.txt b/mods/sudoku/lv2_168.txt new file mode 100644 index 0000000..909ba99 --- /dev/null +++ b/mods/sudoku/lv2_168.txt @@ -0,0 +1,9 @@ +005081030 +000000090 +100000607 +000050700 +600104000 +900020100 +007509000 +430000002 +006000010 \ No newline at end of file diff --git a/mods/sudoku/lv2_169.txt b/mods/sudoku/lv2_169.txt new file mode 100644 index 0000000..8019e5f --- /dev/null +++ b/mods/sudoku/lv2_169.txt @@ -0,0 +1,9 @@ +000080006 +500206030 +010000008 +006000950 +020000060 +045000800 +400000010 +070301002 +100090000 \ No newline at end of file diff --git a/mods/sudoku/lv2_17.txt b/mods/sudoku/lv2_17.txt new file mode 100644 index 0000000..6036c70 --- /dev/null +++ b/mods/sudoku/lv2_17.txt @@ -0,0 +1,9 @@ +060102040 +001000300 +025809160 +006040800 +010000030 +007080400 +048307610 +002000900 +050906080 \ No newline at end of file diff --git a/mods/sudoku/lv2_170.txt b/mods/sudoku/lv2_170.txt new file mode 100644 index 0000000..2d789db --- /dev/null +++ b/mods/sudoku/lv2_170.txt @@ -0,0 +1,9 @@ +800470010 +040000006 +000080300 +700000590 +508000040 +000001007 +005300000 +400290060 +020004009 \ No newline at end of file diff --git a/mods/sudoku/lv2_171.txt b/mods/sudoku/lv2_171.txt new file mode 100644 index 0000000..18f73b0 --- /dev/null +++ b/mods/sudoku/lv2_171.txt @@ -0,0 +1,9 @@ +000000080 +060829000 +005000004 +010090000 +020640905 +090000700 +000065009 +700000001 +001030850 \ No newline at end of file diff --git a/mods/sudoku/lv2_172.txt b/mods/sudoku/lv2_172.txt new file mode 100644 index 0000000..d3eafd8 --- /dev/null +++ b/mods/sudoku/lv2_172.txt @@ -0,0 +1,9 @@ +000340600 +005000100 +020008004 +000206400 +030000070 +001904000 +500800060 +007000900 +006051000 \ No newline at end of file diff --git a/mods/sudoku/lv2_173.txt b/mods/sudoku/lv2_173.txt new file mode 100644 index 0000000..a916943 --- /dev/null +++ b/mods/sudoku/lv2_173.txt @@ -0,0 +1,9 @@ +000000782 +000108003 +000070009 +040000190 +009003000 +020010400 +600502000 +400600000 +593000006 \ No newline at end of file diff --git a/mods/sudoku/lv2_174.txt b/mods/sudoku/lv2_174.txt new file mode 100644 index 0000000..81a08a5 --- /dev/null +++ b/mods/sudoku/lv2_174.txt @@ -0,0 +1,9 @@ +000700009 +000000460 +001054080 +300000090 +007000300 +004001200 +050027004 +093400000 +200000600 \ No newline at end of file diff --git a/mods/sudoku/lv2_175.txt b/mods/sudoku/lv2_175.txt new file mode 100644 index 0000000..00092dd --- /dev/null +++ b/mods/sudoku/lv2_175.txt @@ -0,0 +1,9 @@ +000000306 +000020804 +700104050 +203000000 +000698000 +000000405 +040907002 +309050000 +108000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_176.txt b/mods/sudoku/lv2_176.txt new file mode 100644 index 0000000..d2cc926 --- /dev/null +++ b/mods/sudoku/lv2_176.txt @@ -0,0 +1,9 @@ +060050004 +400006030 +000010085 +000005200 +206030000 +010200300 +000607000 +079000002 +308000090 \ No newline at end of file diff --git a/mods/sudoku/lv2_177.txt b/mods/sudoku/lv2_177.txt new file mode 100644 index 0000000..fe6bfa6 --- /dev/null +++ b/mods/sudoku/lv2_177.txt @@ -0,0 +1,9 @@ +000106703 +000200050 +005070800 +960000078 +003007000 +800040000 +408000000 +020500009 +300900010 \ No newline at end of file diff --git a/mods/sudoku/lv2_178.txt b/mods/sudoku/lv2_178.txt new file mode 100644 index 0000000..3765e13 --- /dev/null +++ b/mods/sudoku/lv2_178.txt @@ -0,0 +1,9 @@ +500700000 +002005900 +040800060 +007280030 +000010000 +030067800 +090004010 +005900400 +000002007 \ No newline at end of file diff --git a/mods/sudoku/lv2_179.txt b/mods/sudoku/lv2_179.txt new file mode 100644 index 0000000..58599a0 --- /dev/null +++ b/mods/sudoku/lv2_179.txt @@ -0,0 +1,9 @@ +008076000 +000100690 +601000020 +010000700 +400005000 +200010003 +030900070 +067000300 +000004009 \ No newline at end of file diff --git a/mods/sudoku/lv2_18.txt b/mods/sudoku/lv2_18.txt new file mode 100644 index 0000000..2f9a1b1 --- /dev/null +++ b/mods/sudoku/lv2_18.txt @@ -0,0 +1,9 @@ +702000901 +005730080 +940026000 +050041097 +089500214 +004208000 +800070009 +090810003 +400950178 \ No newline at end of file diff --git a/mods/sudoku/lv2_180.txt b/mods/sudoku/lv2_180.txt new file mode 100644 index 0000000..ba8653e --- /dev/null +++ b/mods/sudoku/lv2_180.txt @@ -0,0 +1,9 @@ +080040002 +100072000 +000000340 +000005010 +320000700 +010900500 +006014000 +003700006 +700000058 \ No newline at end of file diff --git a/mods/sudoku/lv2_181.txt b/mods/sudoku/lv2_181.txt new file mode 100644 index 0000000..4a57816 --- /dev/null +++ b/mods/sudoku/lv2_181.txt @@ -0,0 +1,9 @@ +050900008 +100000967 +000001300 +000420700 +000000000 +008073000 +004800000 +613000005 +700005010 \ No newline at end of file diff --git a/mods/sudoku/lv2_182.txt b/mods/sudoku/lv2_182.txt new file mode 100644 index 0000000..02e36d6 --- /dev/null +++ b/mods/sudoku/lv2_182.txt @@ -0,0 +1,9 @@ +020007000 +400005002 +001000800 +000000683 +000009007 +740010000 +008200000 +000800019 +010760030 \ No newline at end of file diff --git a/mods/sudoku/lv2_183.txt b/mods/sudoku/lv2_183.txt new file mode 100644 index 0000000..641d671 --- /dev/null +++ b/mods/sudoku/lv2_183.txt @@ -0,0 +1,9 @@ +080209000 +940000000 +000010024 +100000306 +007008000 +600090050 +000500009 +006007008 +009100260 \ No newline at end of file diff --git a/mods/sudoku/lv2_184.txt b/mods/sudoku/lv2_184.txt new file mode 100644 index 0000000..b9e8ce3 --- /dev/null +++ b/mods/sudoku/lv2_184.txt @@ -0,0 +1,9 @@ +070010028 +200900010 +000006000 +002740300 +000000000 +007089500 +000100000 +030004005 +510090060 \ No newline at end of file diff --git a/mods/sudoku/lv2_185.txt b/mods/sudoku/lv2_185.txt new file mode 100644 index 0000000..6302e7d --- /dev/null +++ b/mods/sudoku/lv2_185.txt @@ -0,0 +1,9 @@ +000002000 +070100500 +003400070 +067004001 +000000020 +500600003 +080000000 +001020006 +000506032 \ No newline at end of file diff --git a/mods/sudoku/lv2_186.txt b/mods/sudoku/lv2_186.txt new file mode 100644 index 0000000..788e457 --- /dev/null +++ b/mods/sudoku/lv2_186.txt @@ -0,0 +1,9 @@ +500000006 +090840000 +000000098 +040900070 +030000950 +000007830 +000032000 +008764000 +205000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_187.txt b/mods/sudoku/lv2_187.txt new file mode 100644 index 0000000..70b27b1 --- /dev/null +++ b/mods/sudoku/lv2_187.txt @@ -0,0 +1,9 @@ +010000000 +700030008 +093800005 +000307600 +005000200 +006901000 +100003790 +800090001 +000000060 \ No newline at end of file diff --git a/mods/sudoku/lv2_188.txt b/mods/sudoku/lv2_188.txt new file mode 100644 index 0000000..69c6625 --- /dev/null +++ b/mods/sudoku/lv2_188.txt @@ -0,0 +1,9 @@ +060702009 +300000600 +007000000 +600000050 +000001403 +500030000 +010060090 +000500780 +900040000 \ No newline at end of file diff --git a/mods/sudoku/lv2_189.txt b/mods/sudoku/lv2_189.txt new file mode 100644 index 0000000..32274ad --- /dev/null +++ b/mods/sudoku/lv2_189.txt @@ -0,0 +1,9 @@ +090010000 +302000010 +060000032 +000200009 +500007046 +000031007 +000000500 +083070000 +007164000 \ No newline at end of file diff --git a/mods/sudoku/lv2_19.txt b/mods/sudoku/lv2_19.txt new file mode 100644 index 0000000..43d1296 --- /dev/null +++ b/mods/sudoku/lv2_19.txt @@ -0,0 +1,9 @@ +068002075 +200908043 +704150020 +081060009 +009400086 +620005700 +000009002 +852030000 +390720801 diff --git a/mods/sudoku/lv2_190.txt b/mods/sudoku/lv2_190.txt new file mode 100644 index 0000000..55107d2 --- /dev/null +++ b/mods/sudoku/lv2_190.txt @@ -0,0 +1,9 @@ +008400000 +900001040 +000000630 +800024700 +000060000 +002310005 +074000000 +030200001 +000006900 \ No newline at end of file diff --git a/mods/sudoku/lv2_2.txt b/mods/sudoku/lv2_2.txt new file mode 100644 index 0000000..6d4db8e --- /dev/null +++ b/mods/sudoku/lv2_2.txt @@ -0,0 +1,9 @@ +600000398 +070016200 +008403670 +004580020 +020760400 +069000500 +316047002 +502600014 +400000963 \ No newline at end of file diff --git a/mods/sudoku/lv2_20.txt b/mods/sudoku/lv2_20.txt new file mode 100644 index 0000000..75f4be2 --- /dev/null +++ b/mods/sudoku/lv2_20.txt @@ -0,0 +1,9 @@ +510094070 +460073050 +000100324 +009050430 +350940080 +740000605 +008609003 +195430000 +004008907 \ No newline at end of file diff --git a/mods/sudoku/lv2_21.txt b/mods/sudoku/lv2_21.txt new file mode 100644 index 0000000..651afbf --- /dev/null +++ b/mods/sudoku/lv2_21.txt @@ -0,0 +1,9 @@ +460005300 +195008060 +080402005 +009501074 +000040813 +614700000 +300010528 +020850700 +008230900 \ No newline at end of file diff --git a/mods/sudoku/lv2_22.txt b/mods/sudoku/lv2_22.txt new file mode 100644 index 0000000..4377506 --- /dev/null +++ b/mods/sudoku/lv2_22.txt @@ -0,0 +1,9 @@ +005904700 +100000003 +070201080 +209508601 +000000000 +501609204 +090306040 +400000008 +006402100 \ No newline at end of file diff --git a/mods/sudoku/lv2_23.txt b/mods/sudoku/lv2_23.txt new file mode 100644 index 0000000..f832d16 --- /dev/null +++ b/mods/sudoku/lv2_23.txt @@ -0,0 +1,9 @@ +400902010 +005731400 +019800500 +198000052 +060019030 +340080006 +024000307 +900370081 +000608940 \ No newline at end of file diff --git a/mods/sudoku/lv2_24.txt b/mods/sudoku/lv2_24.txt new file mode 100644 index 0000000..fcc7756 --- /dev/null +++ b/mods/sudoku/lv2_24.txt @@ -0,0 +1,9 @@ +602800090 +050097010 +400030670 +200010084 +064378000 +090050106 +007003801 +321700005 +000109347 \ No newline at end of file diff --git a/mods/sudoku/lv2_25.txt b/mods/sudoku/lv2_25.txt new file mode 100644 index 0000000..4ed877f --- /dev/null +++ b/mods/sudoku/lv2_25.txt @@ -0,0 +1,9 @@ +400000006 +060301070 +180409023 +000694000 +500000009 +000825000 +310902058 +050708060 +800000001 \ No newline at end of file diff --git a/mods/sudoku/lv2_26.txt b/mods/sudoku/lv2_26.txt new file mode 100644 index 0000000..aaf6382 --- /dev/null +++ b/mods/sudoku/lv2_26.txt @@ -0,0 +1,9 @@ +281070004 +600001098 +700608023 +008406002 +300007010 +029830060 +000000540 +056083209 +912700080 \ No newline at end of file diff --git a/mods/sudoku/lv2_27.txt b/mods/sudoku/lv2_27.txt new file mode 100644 index 0000000..8dcf572 --- /dev/null +++ b/mods/sudoku/lv2_27.txt @@ -0,0 +1,9 @@ +709100420 +008500901 +136090700 +390070240 +004350009 +000009860 +243601000 +900703004 +010040082 \ No newline at end of file diff --git a/mods/sudoku/lv2_28.txt b/mods/sudoku/lv2_28.txt new file mode 100644 index 0000000..b3e5ff2 --- /dev/null +++ b/mods/sudoku/lv2_28.txt @@ -0,0 +1,9 @@ +107003506 +000809740 +504071008 +020090085 +005380100 +618000020 +270030910 +050204670 +401900000 \ No newline at end of file diff --git a/mods/sudoku/lv2_29.txt b/mods/sudoku/lv2_29.txt new file mode 100644 index 0000000..a8965c2 --- /dev/null +++ b/mods/sudoku/lv2_29.txt @@ -0,0 +1,9 @@ +060090720 +807100400 +090372001 +031200058 +705003004 +009081630 +370008040 +400709102 +008420070 \ No newline at end of file diff --git a/mods/sudoku/lv2_3.txt b/mods/sudoku/lv2_3.txt new file mode 100644 index 0000000..c3d0574 --- /dev/null +++ b/mods/sudoku/lv2_3.txt @@ -0,0 +1,9 @@ +000049082 +049200510 +021657400 +018900045 +406002003 +305080100 +082006300 +160800070 +700390008 diff --git a/mods/sudoku/lv2_30.txt b/mods/sudoku/lv2_30.txt new file mode 100644 index 0000000..f536f8f --- /dev/null +++ b/mods/sudoku/lv2_30.txt @@ -0,0 +1,9 @@ +700092405 +000000792 +000705000 +003027040 +200651087 +107940520 +820009150 +050284600 +970010000 \ No newline at end of file diff --git a/mods/sudoku/lv2_31.txt b/mods/sudoku/lv2_31.txt new file mode 100644 index 0000000..545fbed --- /dev/null +++ b/mods/sudoku/lv2_31.txt @@ -0,0 +1,9 @@ +520000097 +000000000 +900852004 +003185400 +007304800 +004927600 +400576003 +000000000 +680000012 \ No newline at end of file diff --git a/mods/sudoku/lv2_32.txt b/mods/sudoku/lv2_32.txt new file mode 100644 index 0000000..1c6e815 --- /dev/null +++ b/mods/sudoku/lv2_32.txt @@ -0,0 +1,9 @@ +104820506 +070065000 +500407200 +701506904 +960000037 +028709000 +809600050 +000050742 +200340080 \ No newline at end of file diff --git a/mods/sudoku/lv2_33.txt b/mods/sudoku/lv2_33.txt new file mode 100644 index 0000000..73a4cc0 --- /dev/null +++ b/mods/sudoku/lv2_33.txt @@ -0,0 +1,9 @@ +500206071 +032071006 +060000892 +900004020 +010050903 +670300180 +007092640 +408703500 +196040000 \ No newline at end of file diff --git a/mods/sudoku/lv2_34.txt b/mods/sudoku/lv2_34.txt new file mode 100644 index 0000000..f2c3658 --- /dev/null +++ b/mods/sudoku/lv2_34.txt @@ -0,0 +1,9 @@ +503000000 +400051079 +007830001 +305070000 +000302000 +000060804 +700043200 +620580003 +000000107 \ No newline at end of file diff --git a/mods/sudoku/lv2_35.txt b/mods/sudoku/lv2_35.txt new file mode 100644 index 0000000..697ebd3 --- /dev/null +++ b/mods/sudoku/lv2_35.txt @@ -0,0 +1,9 @@ +201098007 +000760192 +609000504 +060050000 +920613000 +100049830 +083002040 +090005708 +712000053 \ No newline at end of file diff --git a/mods/sudoku/lv2_36.txt b/mods/sudoku/lv2_36.txt new file mode 100644 index 0000000..39c7148 --- /dev/null +++ b/mods/sudoku/lv2_36.txt @@ -0,0 +1,9 @@ +906570000 +000408072 +700020593 +580046100 +104700900 +070105306 +007269000 +031000069 +092004058 \ No newline at end of file diff --git a/mods/sudoku/lv2_37.txt b/mods/sudoku/lv2_37.txt new file mode 100644 index 0000000..ce36e9a --- /dev/null +++ b/mods/sudoku/lv2_37.txt @@ -0,0 +1,9 @@ +300900054 +006780001 +058023790 +540090630 +063500008 +009006040 +002100009 +905607080 +680030105 \ No newline at end of file diff --git a/mods/sudoku/lv2_38.txt b/mods/sudoku/lv2_38.txt new file mode 100644 index 0000000..2c6e825 --- /dev/null +++ b/mods/sudoku/lv2_38.txt @@ -0,0 +1,9 @@ +080062500 +402300108 +050819002 +043001025 +509000000 +701900630 +630004207 +000706059 +074500310 \ No newline at end of file diff --git a/mods/sudoku/lv2_39.txt b/mods/sudoku/lv2_39.txt new file mode 100644 index 0000000..bed1747 --- /dev/null +++ b/mods/sudoku/lv2_39.txt @@ -0,0 +1,9 @@ +705100800 +098075010 +410008075 +500006107 +080000296 +076301008 +800750920 +027010500 +004823000 \ No newline at end of file diff --git a/mods/sudoku/lv2_4.txt b/mods/sudoku/lv2_4.txt new file mode 100644 index 0000000..7b0a9d0 --- /dev/null +++ b/mods/sudoku/lv2_4.txt @@ -0,0 +1,9 @@ +010659000 +508000092 +030840065 +104005006 +306090500 +700206380 +000078640 +049003718 +071900050 \ No newline at end of file diff --git a/mods/sudoku/lv2_40.txt b/mods/sudoku/lv2_40.txt new file mode 100644 index 0000000..cf18a35 --- /dev/null +++ b/mods/sudoku/lv2_40.txt @@ -0,0 +1,9 @@ +001007890 +390520000 +004000000 +560071000 +040602070 +000930065 +000000700 +000046081 +027800500 \ No newline at end of file diff --git a/mods/sudoku/lv2_41.txt b/mods/sudoku/lv2_41.txt new file mode 100644 index 0000000..db12ca1 --- /dev/null +++ b/mods/sudoku/lv2_41.txt @@ -0,0 +1,9 @@ +003000907 +000137064 +600980003 +052673000 +061400725 +040500609 +800061070 +030040800 +174025000 \ No newline at end of file diff --git a/mods/sudoku/lv2_42.txt b/mods/sudoku/lv2_42.txt new file mode 100644 index 0000000..d025f26 --- /dev/null +++ b/mods/sudoku/lv2_42.txt @@ -0,0 +1,9 @@ +900000002 +001026540 +027598000 +004850601 +063201900 +015030074 +030170000 +070002095 +600905017 \ No newline at end of file diff --git a/mods/sudoku/lv2_43.txt b/mods/sudoku/lv2_43.txt new file mode 100644 index 0000000..7521ade --- /dev/null +++ b/mods/sudoku/lv2_43.txt @@ -0,0 +1,9 @@ +060504100 +725030006 +040060570 +200300701 +056047090 +300010245 +502708600 +008053010 +030401007 \ No newline at end of file diff --git a/mods/sudoku/lv2_44.txt b/mods/sudoku/lv2_44.txt new file mode 100644 index 0000000..1ac4fce --- /dev/null +++ b/mods/sudoku/lv2_44.txt @@ -0,0 +1,9 @@ +000090382 +004137000 +053280040 +018000590 +739005406 +060040001 +300750260 +807400930 +600029008 \ No newline at end of file diff --git a/mods/sudoku/lv2_45.txt b/mods/sudoku/lv2_45.txt new file mode 100644 index 0000000..3752a26 --- /dev/null +++ b/mods/sudoku/lv2_45.txt @@ -0,0 +1,9 @@ +000000030 +004002900 +020078640 +301007008 +002905400 +500800109 +086530020 +003700800 +070000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_46.txt b/mods/sudoku/lv2_46.txt new file mode 100644 index 0000000..59a6248 --- /dev/null +++ b/mods/sudoku/lv2_46.txt @@ -0,0 +1,9 @@ +090030804 +260870005 +000405002 +036002701 +870090500 +001307280 +700643008 +000008027 +548700930 \ No newline at end of file diff --git a/mods/sudoku/lv2_47.txt b/mods/sudoku/lv2_47.txt new file mode 100644 index 0000000..d1977c4 --- /dev/null +++ b/mods/sudoku/lv2_47.txt @@ -0,0 +1,9 @@ +070080105 +208050007 +040793008 +006402080 +891000070 +007900603 +900007826 +000360510 +654001700 \ No newline at end of file diff --git a/mods/sudoku/lv2_48.txt b/mods/sudoku/lv2_48.txt new file mode 100644 index 0000000..4885dd7 --- /dev/null +++ b/mods/sudoku/lv2_48.txt @@ -0,0 +1,9 @@ +000000000 +509304106 +001608300 +450000031 +300070005 +180000079 +005206900 +604907208 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_49.txt b/mods/sudoku/lv2_49.txt new file mode 100644 index 0000000..e3c9e90 --- /dev/null +++ b/mods/sudoku/lv2_49.txt @@ -0,0 +1,9 @@ +045080090 +609035070 +720900503 +006002309 +130000750 +050103064 +003790400 +580024000 +001308007 \ No newline at end of file diff --git a/mods/sudoku/lv2_5.txt b/mods/sudoku/lv2_5.txt new file mode 100644 index 0000000..6245fa3 --- /dev/null +++ b/mods/sudoku/lv2_5.txt @@ -0,0 +1,9 @@ +930080002 +800039576 +000210090 +008064001 +741802600 +020370040 +060050134 +089003200 +450100900 \ No newline at end of file diff --git a/mods/sudoku/lv2_50.txt b/mods/sudoku/lv2_50.txt new file mode 100644 index 0000000..eeb2777 --- /dev/null +++ b/mods/sudoku/lv2_50.txt @@ -0,0 +1,9 @@ +604001800 +000070064 +700094152 +000705041 +021006000 +508410300 +107008020 +036100485 +042500013 \ No newline at end of file diff --git a/mods/sudoku/lv2_51.txt b/mods/sudoku/lv2_51.txt new file mode 100644 index 0000000..a776346 --- /dev/null +++ b/mods/sudoku/lv2_51.txt @@ -0,0 +1,9 @@ +290004050 +860070002 +000952070 +006507039 +089030410 +302409700 +000043507 +504690001 +010700680 \ No newline at end of file diff --git a/mods/sudoku/lv2_52.txt b/mods/sudoku/lv2_52.txt new file mode 100644 index 0000000..7ccb562 --- /dev/null +++ b/mods/sudoku/lv2_52.txt @@ -0,0 +1,9 @@ +060050400 +570002918 +002004050 +000010504 +900305207 +025087100 +290578001 +016000020 +050120703 \ No newline at end of file diff --git a/mods/sudoku/lv2_53.txt b/mods/sudoku/lv2_53.txt new file mode 100644 index 0000000..63be62b --- /dev/null +++ b/mods/sudoku/lv2_53.txt @@ -0,0 +1,9 @@ +008000700 +093602140 +100903008 +400090001 +000501000 +500060002 +800407006 +054209380 +002000500 \ No newline at end of file diff --git a/mods/sudoku/lv2_54.txt b/mods/sudoku/lv2_54.txt new file mode 100644 index 0000000..6b15514 --- /dev/null +++ b/mods/sudoku/lv2_54.txt @@ -0,0 +1,9 @@ +010630072 +600000059 +000549008 +204073060 +307915000 +001260930 +000001820 +130702506 +482000090 \ No newline at end of file diff --git a/mods/sudoku/lv2_55.txt b/mods/sudoku/lv2_55.txt new file mode 100644 index 0000000..c6c4f10 --- /dev/null +++ b/mods/sudoku/lv2_55.txt @@ -0,0 +1,9 @@ +700001904 +000790100 +009204036 +067012049 +010947200 +902860070 +350020600 +004108000 +208500003 \ No newline at end of file diff --git a/mods/sudoku/lv2_56.txt b/mods/sudoku/lv2_56.txt new file mode 100644 index 0000000..39a7881 --- /dev/null +++ b/mods/sudoku/lv2_56.txt @@ -0,0 +1,9 @@ +005000800 +024030050 +109700200 +900170000 +000543000 +000068003 +002007908 +070010520 +008000300 \ No newline at end of file diff --git a/mods/sudoku/lv2_57.txt b/mods/sudoku/lv2_57.txt new file mode 100644 index 0000000..2a62d79 --- /dev/null +++ b/mods/sudoku/lv2_57.txt @@ -0,0 +1,9 @@ +069040051 +801003900 +320009060 +000950080 +400607130 +076080490 +010075809 +905138070 +200000500 \ No newline at end of file diff --git a/mods/sudoku/lv2_58.txt b/mods/sudoku/lv2_58.txt new file mode 100644 index 0000000..67fd0e8 --- /dev/null +++ b/mods/sudoku/lv2_58.txt @@ -0,0 +1,9 @@ +000526809 +026100570 +050090060 +160000042 +507040130 +200003708 +390051600 +018960005 +600302090 \ No newline at end of file diff --git a/mods/sudoku/lv2_59.txt b/mods/sudoku/lv2_59.txt new file mode 100644 index 0000000..5873251 --- /dev/null +++ b/mods/sudoku/lv2_59.txt @@ -0,0 +1,9 @@ +670950082 +402080509 +090002030 +900070008 +820640300 +005000691 +080035900 +307006010 +260408003 \ No newline at end of file diff --git a/mods/sudoku/lv2_6.txt b/mods/sudoku/lv2_6.txt new file mode 100644 index 0000000..4dc87eb --- /dev/null +++ b/mods/sudoku/lv2_6.txt @@ -0,0 +1,9 @@ +040060700 +579340010 +010520904 +095070060 +436210090 +000000051 +901000506 +050186079 +003009120 \ No newline at end of file diff --git a/mods/sudoku/lv2_60.txt b/mods/sudoku/lv2_60.txt new file mode 100644 index 0000000..b09d11c --- /dev/null +++ b/mods/sudoku/lv2_60.txt @@ -0,0 +1,9 @@ +002906300 +000070000 +500308009 +051607940 +003000600 +089205170 +800701002 +000060000 +006403500 \ No newline at end of file diff --git a/mods/sudoku/lv2_61.txt b/mods/sudoku/lv2_61.txt new file mode 100644 index 0000000..8b2fe68 --- /dev/null +++ b/mods/sudoku/lv2_61.txt @@ -0,0 +1,9 @@ +002016053 +005973000 +130002780 +060430007 +240700010 +357008040 +009000671 +803057200 +600200508 \ No newline at end of file diff --git a/mods/sudoku/lv2_62.txt b/mods/sudoku/lv2_62.txt new file mode 100644 index 0000000..f1f7e90 --- /dev/null +++ b/mods/sudoku/lv2_62.txt @@ -0,0 +1,9 @@ +601005809 +020701036 +900062701 +080050207 +007200010 +412009000 +103900060 +060040173 +748600050 \ No newline at end of file diff --git a/mods/sudoku/lv2_63.txt b/mods/sudoku/lv2_63.txt new file mode 100644 index 0000000..25e8c1a --- /dev/null +++ b/mods/sudoku/lv2_63.txt @@ -0,0 +1,9 @@ +003615080 +001004002 +450000109 +100007640 +600002093 +380460070 +008900710 +700348906 +046070028 \ No newline at end of file diff --git a/mods/sudoku/lv2_64.txt b/mods/sudoku/lv2_64.txt new file mode 100644 index 0000000..c06af2f --- /dev/null +++ b/mods/sudoku/lv2_64.txt @@ -0,0 +1,9 @@ +201800403 +000032007 +800004950 +600040305 +030506080 +025080006 +902100504 +006020091 +410309620 \ No newline at end of file diff --git a/mods/sudoku/lv2_65.txt b/mods/sudoku/lv2_65.txt new file mode 100644 index 0000000..068a698 --- /dev/null +++ b/mods/sudoku/lv2_65.txt @@ -0,0 +1,9 @@ +014857690 +030000020 +070060040 +001706200 +000000000 +008309400 +080070060 +090000010 +062418750 \ No newline at end of file diff --git a/mods/sudoku/lv2_66.txt b/mods/sudoku/lv2_66.txt new file mode 100644 index 0000000..4ea63c0 --- /dev/null +++ b/mods/sudoku/lv2_66.txt @@ -0,0 +1,9 @@ +701020408 +000458000 +400160950 +046030107 +182706000 +070040602 +503604020 +004000710 +800902005 \ No newline at end of file diff --git a/mods/sudoku/lv2_67.txt b/mods/sudoku/lv2_67.txt new file mode 100644 index 0000000..8ea8bdb --- /dev/null +++ b/mods/sudoku/lv2_67.txt @@ -0,0 +1,9 @@ +900620007 +000000306 +000873059 +109007003 +705002980 +008916502 +040068090 +001030204 +296401030 \ No newline at end of file diff --git a/mods/sudoku/lv2_68.txt b/mods/sudoku/lv2_68.txt new file mode 100644 index 0000000..ccdff88 --- /dev/null +++ b/mods/sudoku/lv2_68.txt @@ -0,0 +1,9 @@ +500000740 +067040031 +020710008 +001403900 +094071600 +000960413 +700194006 +850002004 +046007390 \ No newline at end of file diff --git a/mods/sudoku/lv2_69.txt b/mods/sudoku/lv2_69.txt new file mode 100644 index 0000000..ea2d117 --- /dev/null +++ b/mods/sudoku/lv2_69.txt @@ -0,0 +1,9 @@ +030000040 +902000307 +000105000 +091708630 +600050008 +083604720 +000309000 +309000204 +050000080 \ No newline at end of file diff --git a/mods/sudoku/lv2_7.txt b/mods/sudoku/lv2_7.txt new file mode 100644 index 0000000..f066bb2 --- /dev/null +++ b/mods/sudoku/lv2_7.txt @@ -0,0 +1,9 @@ +062800007 +900100064 +104620500 +485063700 +007590023 +000700005 +001300082 +020010470 +890072301 \ No newline at end of file diff --git a/mods/sudoku/lv2_70.txt b/mods/sudoku/lv2_70.txt new file mode 100644 index 0000000..7b26fa4 --- /dev/null +++ b/mods/sudoku/lv2_70.txt @@ -0,0 +1,9 @@ +520000010 +690701200 +001025006 +030000520 +008000103 +045000897 +050187000 +700502001 +002093040 \ No newline at end of file diff --git a/mods/sudoku/lv2_71.txt b/mods/sudoku/lv2_71.txt new file mode 100644 index 0000000..bcdd65a --- /dev/null +++ b/mods/sudoku/lv2_71.txt @@ -0,0 +1,9 @@ +006000100 +080000020 +030907080 +009030400 +140506093 +008070200 +010608030 +060000010 +004000900 \ No newline at end of file diff --git a/mods/sudoku/lv2_72.txt b/mods/sudoku/lv2_72.txt new file mode 100644 index 0000000..cdeac0e --- /dev/null +++ b/mods/sudoku/lv2_72.txt @@ -0,0 +1,9 @@ +050200763 +700506100 +006043000 +560000009 +003070020 +079000814 +680001000 +400087001 +300402086 \ No newline at end of file diff --git a/mods/sudoku/lv2_73.txt b/mods/sudoku/lv2_73.txt new file mode 100644 index 0000000..2939fba --- /dev/null +++ b/mods/sudoku/lv2_73.txt @@ -0,0 +1,9 @@ +000700003 +009080025 +043205900 +601040090 +080600130 +004003068 +008050070 +090476800 +510008006 \ No newline at end of file diff --git a/mods/sudoku/lv2_74.txt b/mods/sudoku/lv2_74.txt new file mode 100644 index 0000000..e71da88 --- /dev/null +++ b/mods/sudoku/lv2_74.txt @@ -0,0 +1,9 @@ +700000035 +090630000 +000047819 +070158006 +064700000 +001900027 +006000700 +805006002 +407502060 \ No newline at end of file diff --git a/mods/sudoku/lv2_75.txt b/mods/sudoku/lv2_75.txt new file mode 100644 index 0000000..4e3d088 --- /dev/null +++ b/mods/sudoku/lv2_75.txt @@ -0,0 +1,9 @@ +902600004 +000091000 +603500089 +304000200 +060038975 +050010008 +000340027 +005070100 +807069400 \ No newline at end of file diff --git a/mods/sudoku/lv2_76.txt b/mods/sudoku/lv2_76.txt new file mode 100644 index 0000000..4e482d6 --- /dev/null +++ b/mods/sudoku/lv2_76.txt @@ -0,0 +1,9 @@ +000976004 +004050798 +057400006 +503047001 +680503000 +700610500 +070002030 +030000400 +825300000 \ No newline at end of file diff --git a/mods/sudoku/lv2_77.txt b/mods/sudoku/lv2_77.txt new file mode 100644 index 0000000..04a94f3 --- /dev/null +++ b/mods/sudoku/lv2_77.txt @@ -0,0 +1,9 @@ +000100907 +090072500 +000304016 +607000250 +020001309 +035020000 +340950700 +009700035 +506040090 \ No newline at end of file diff --git a/mods/sudoku/lv2_78.txt b/mods/sudoku/lv2_78.txt new file mode 100644 index 0000000..0c33e57 --- /dev/null +++ b/mods/sudoku/lv2_78.txt @@ -0,0 +1,9 @@ +007030092 +038000706 +040000003 +020804000 +000305000 +000602070 +700000030 +304000150 +160040800 \ No newline at end of file diff --git a/mods/sudoku/lv2_79.txt b/mods/sudoku/lv2_79.txt new file mode 100644 index 0000000..97e3944 --- /dev/null +++ b/mods/sudoku/lv2_79.txt @@ -0,0 +1,9 @@ +540109000 +200000065 +003085004 +100020907 +006708040 +307010050 +000600580 +090072306 +032800070 \ No newline at end of file diff --git a/mods/sudoku/lv2_8.txt b/mods/sudoku/lv2_8.txt new file mode 100644 index 0000000..72cd692 --- /dev/null +++ b/mods/sudoku/lv2_8.txt @@ -0,0 +1,9 @@ +008000700 +001842900 +590000024 +070503010 +000080000 +030709080 +120000038 +004128600 +006000100 \ No newline at end of file diff --git a/mods/sudoku/lv2_80.txt b/mods/sudoku/lv2_80.txt new file mode 100644 index 0000000..73e96b7 --- /dev/null +++ b/mods/sudoku/lv2_80.txt @@ -0,0 +1,9 @@ +730019006 +962700400 +010068000 +090031070 +403600000 +106500930 +020004009 +000105027 +300000140 \ No newline at end of file diff --git a/mods/sudoku/lv2_81.txt b/mods/sudoku/lv2_81.txt new file mode 100644 index 0000000..752a672 --- /dev/null +++ b/mods/sudoku/lv2_81.txt @@ -0,0 +1,9 @@ +600238000 +005000107 +024005806 +400500700 +800070360 +109006040 +091620000 +000057003 +063000092 \ No newline at end of file diff --git a/mods/sudoku/lv2_82.txt b/mods/sudoku/lv2_82.txt new file mode 100644 index 0000000..d736cc8 --- /dev/null +++ b/mods/sudoku/lv2_82.txt @@ -0,0 +1,9 @@ +080060053 +504007000 +090584000 +009040030 +405790006 +076005209 +000006070 +300400690 +900073004 \ No newline at end of file diff --git a/mods/sudoku/lv2_83.txt b/mods/sudoku/lv2_83.txt new file mode 100644 index 0000000..d76b751 --- /dev/null +++ b/mods/sudoku/lv2_83.txt @@ -0,0 +1,9 @@ +310005400 +400008710 +000431000 +009004038 +008000970 +673800050 +760040805 +050186000 +000200109 \ No newline at end of file diff --git a/mods/sudoku/lv2_84.txt b/mods/sudoku/lv2_84.txt new file mode 100644 index 0000000..ef28edf --- /dev/null +++ b/mods/sudoku/lv2_84.txt @@ -0,0 +1,9 @@ +070160400 +410800300 +006050002 +780305010 +503080000 +000204083 +360000750 +000506821 +008002030 \ No newline at end of file diff --git a/mods/sudoku/lv2_85.txt b/mods/sudoku/lv2_85.txt new file mode 100644 index 0000000..6e15ec9 --- /dev/null +++ b/mods/sudoku/lv2_85.txt @@ -0,0 +1,9 @@ +805706109 +010529030 +000000000 +300000002 +002901700 +600000003 +000000000 +050478060 +403602907 \ No newline at end of file diff --git a/mods/sudoku/lv2_86.txt b/mods/sudoku/lv2_86.txt new file mode 100644 index 0000000..f0134cc --- /dev/null +++ b/mods/sudoku/lv2_86.txt @@ -0,0 +1,9 @@ +008060000 +091040360 +360002090 +000780409 +480500200 +005009130 +020698000 +016005002 +000200087 \ No newline at end of file diff --git a/mods/sudoku/lv2_87.txt b/mods/sudoku/lv2_87.txt new file mode 100644 index 0000000..6d18dee --- /dev/null +++ b/mods/sudoku/lv2_87.txt @@ -0,0 +1,9 @@ +000009106 +000654089 +000730050 +067000001 +013040000 +940000630 +100005960 +052007810 +490800005 \ No newline at end of file diff --git a/mods/sudoku/lv2_88.txt b/mods/sudoku/lv2_88.txt new file mode 100644 index 0000000..4bc7977 --- /dev/null +++ b/mods/sudoku/lv2_88.txt @@ -0,0 +1,9 @@ +000000000 +308060105 +010907040 +036000280 +080000050 +041000690 +060509020 +802030906 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_89.txt b/mods/sudoku/lv2_89.txt new file mode 100644 index 0000000..7b72dc2 --- /dev/null +++ b/mods/sudoku/lv2_89.txt @@ -0,0 +1,9 @@ +000307098 +030510040 +001000500 +510036280 +060894300 +800250000 +004620009 +350900001 +900000730 \ No newline at end of file diff --git a/mods/sudoku/lv2_9.txt b/mods/sudoku/lv2_9.txt new file mode 100644 index 0000000..09a4f08 --- /dev/null +++ b/mods/sudoku/lv2_9.txt @@ -0,0 +1,9 @@ +180005002 +700008053 +000090468 +000603000 +007001345 +350720010 +005040201 +043012007 +921070580 \ No newline at end of file diff --git a/mods/sudoku/lv2_90.txt b/mods/sudoku/lv2_90.txt new file mode 100644 index 0000000..aa1a439 --- /dev/null +++ b/mods/sudoku/lv2_90.txt @@ -0,0 +1,9 @@ +600309007 +037000080 +040075260 +300150002 +008200001 +701000650 +006001000 +092006015 +500490076 \ No newline at end of file diff --git a/mods/sudoku/lv2_91.txt b/mods/sudoku/lv2_91.txt new file mode 100644 index 0000000..c2d5682 --- /dev/null +++ b/mods/sudoku/lv2_91.txt @@ -0,0 +1,9 @@ +601000402 +070320000 +200014907 +080906000 +012000500 +006200794 +507068000 +000002075 +809007061 \ No newline at end of file diff --git a/mods/sudoku/lv2_92.txt b/mods/sudoku/lv2_92.txt new file mode 100644 index 0000000..524e4a6 --- /dev/null +++ b/mods/sudoku/lv2_92.txt @@ -0,0 +1,9 @@ +560000040 +900340000 +000561029 +059100230 +031020500 +004003108 +000916700 +103700060 +006004000 \ No newline at end of file diff --git a/mods/sudoku/lv2_93.txt b/mods/sudoku/lv2_93.txt new file mode 100644 index 0000000..8eae91b --- /dev/null +++ b/mods/sudoku/lv2_93.txt @@ -0,0 +1,9 @@ +105200800 +004905030 +270080650 +510600790 +007093000 +020050008 +801700206 +046500010 +000006300 \ No newline at end of file diff --git a/mods/sudoku/lv2_94.txt b/mods/sudoku/lv2_94.txt new file mode 100644 index 0000000..20e532f --- /dev/null +++ b/mods/sudoku/lv2_94.txt @@ -0,0 +1,9 @@ +000430602 +060020009 +000006018 +300080290 +540902000 +009075040 +600100720 +002709560 +157000000 \ No newline at end of file diff --git a/mods/sudoku/lv2_95.txt b/mods/sudoku/lv2_95.txt new file mode 100644 index 0000000..e008ac1 --- /dev/null +++ b/mods/sudoku/lv2_95.txt @@ -0,0 +1,9 @@ +700802050 +000400379 +003009040 +140080000 +000501904 +809040007 +070050403 +326000005 +080013790 \ No newline at end of file diff --git a/mods/sudoku/lv2_96.txt b/mods/sudoku/lv2_96.txt new file mode 100644 index 0000000..f32332c --- /dev/null +++ b/mods/sudoku/lv2_96.txt @@ -0,0 +1,9 @@ +804000706 +013000940 +000010000 +400102009 +080090050 +900605007 +000060000 +078000460 +609000801 \ No newline at end of file diff --git a/mods/sudoku/lv2_97.txt b/mods/sudoku/lv2_97.txt new file mode 100644 index 0000000..47341f7 --- /dev/null +++ b/mods/sudoku/lv2_97.txt @@ -0,0 +1,9 @@ +007503000 +010280007 +602000180 +970005800 +080072030 +300840571 +004307000 +003028010 +090001003 \ No newline at end of file diff --git a/mods/sudoku/lv2_98.txt b/mods/sudoku/lv2_98.txt new file mode 100644 index 0000000..54f3cab --- /dev/null +++ b/mods/sudoku/lv2_98.txt @@ -0,0 +1,9 @@ +250090004 +709030080 +030800700 +006573000 +380200057 +000400130 +007006023 +090082470 +800040900 \ No newline at end of file diff --git a/mods/sudoku/lv2_99.txt b/mods/sudoku/lv2_99.txt new file mode 100644 index 0000000..ed84ee5 --- /dev/null +++ b/mods/sudoku/lv2_99.txt @@ -0,0 +1,9 @@ +013500070 +900008510 +804000096 +400600907 +000007053 +020095000 +090100000 +742050009 +001920038 \ No newline at end of file diff --git a/mods/sudoku/lv3_1.txt b/mods/sudoku/lv3_1.txt new file mode 100644 index 0000000..e9f1e6b --- /dev/null +++ b/mods/sudoku/lv3_1.txt @@ -0,0 +1,9 @@ +000457000 +300010007 +270000065 +840060071 +000809000 +590040038 +730000094 +400070002 +000684000 \ No newline at end of file diff --git a/mods/sudoku/lv3_10.txt b/mods/sudoku/lv3_10.txt new file mode 100644 index 0000000..97696a8 --- /dev/null +++ b/mods/sudoku/lv3_10.txt @@ -0,0 +1,9 @@ +670402050 +300081072 +020600300 +000006000 +702000805 +000700000 +007005010 +450910007 +090304068 \ No newline at end of file diff --git a/mods/sudoku/lv3_100.txt b/mods/sudoku/lv3_100.txt new file mode 100644 index 0000000..da130be --- /dev/null +++ b/mods/sudoku/lv3_100.txt @@ -0,0 +1,9 @@ +070000020 +000602000 +609708301 +507020603 +003000400 +104070208 +702405809 +000206000 +030000050 \ No newline at end of file diff --git a/mods/sudoku/lv3_101.txt b/mods/sudoku/lv3_101.txt new file mode 100644 index 0000000..4d8a6e2 --- /dev/null +++ b/mods/sudoku/lv3_101.txt @@ -0,0 +1,9 @@ +010030040 +904000603 +003504800 +200301007 +030000080 +500602004 +007406300 +102000705 +060020090 \ No newline at end of file diff --git a/mods/sudoku/lv3_102.txt b/mods/sudoku/lv3_102.txt new file mode 100644 index 0000000..93a30c0 --- /dev/null +++ b/mods/sudoku/lv3_102.txt @@ -0,0 +1,9 @@ +007030800 +040000050 +900105003 +830406075 +010000040 +470502039 +300207004 +060000090 +001040700 \ No newline at end of file diff --git a/mods/sudoku/lv3_103.txt b/mods/sudoku/lv3_103.txt new file mode 100644 index 0000000..9ac10d5 --- /dev/null +++ b/mods/sudoku/lv3_103.txt @@ -0,0 +1,9 @@ +000153000 +100000003 +480070095 +920708014 +000000000 +310509028 +750040032 +600000001 +000925000 \ No newline at end of file diff --git a/mods/sudoku/lv3_104.txt b/mods/sudoku/lv3_104.txt new file mode 100644 index 0000000..9a57ad6 --- /dev/null +++ b/mods/sudoku/lv3_104.txt @@ -0,0 +1,9 @@ +800000009 +070901080 +001862400 +002105800 +100000004 +009304700 +006523100 +040709060 +300000002 \ No newline at end of file diff --git a/mods/sudoku/lv3_105.txt b/mods/sudoku/lv3_105.txt new file mode 100644 index 0000000..232399d --- /dev/null +++ b/mods/sudoku/lv3_105.txt @@ -0,0 +1,9 @@ +800504001 +060000020 +002080500 +907402308 +030000040 +108603902 +003090400 +080000050 +400208003 \ No newline at end of file diff --git a/mods/sudoku/lv3_106.txt b/mods/sudoku/lv3_106.txt new file mode 100644 index 0000000..08fa9e4 --- /dev/null +++ b/mods/sudoku/lv3_106.txt @@ -0,0 +1,9 @@ +012706490 +080105060 +000000000 +400802001 +007409500 +600503009 +000000000 +090207030 +075604180 \ No newline at end of file diff --git a/mods/sudoku/lv3_107.txt b/mods/sudoku/lv3_107.txt new file mode 100644 index 0000000..a6ade36 --- /dev/null +++ b/mods/sudoku/lv3_107.txt @@ -0,0 +1,9 @@ +200908004 +509703102 +000000000 +020405030 +810000057 +050109040 +000000000 +602307809 +700806005 \ No newline at end of file diff --git a/mods/sudoku/lv3_108.txt b/mods/sudoku/lv3_108.txt new file mode 100644 index 0000000..4fd1d25 --- /dev/null +++ b/mods/sudoku/lv3_108.txt @@ -0,0 +1,9 @@ +430090065 +200000001 +000605000 +503102407 +000906000 +702304106 +000508000 +600000004 +980010032 \ No newline at end of file diff --git a/mods/sudoku/lv3_109.txt b/mods/sudoku/lv3_109.txt new file mode 100644 index 0000000..7547e2c --- /dev/null +++ b/mods/sudoku/lv3_109.txt @@ -0,0 +1,9 @@ +000000000 +406108509 +900634002 +002705400 +040000060 +007401900 +100379004 +305806207 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_11.txt b/mods/sudoku/lv3_11.txt new file mode 100644 index 0000000..f20c297 --- /dev/null +++ b/mods/sudoku/lv3_11.txt @@ -0,0 +1,9 @@ +000600017 +109047020 +000001300 +200008035 +001405600 +350700009 +002500000 +030870201 +580003000 \ No newline at end of file diff --git a/mods/sudoku/lv3_110.txt b/mods/sudoku/lv3_110.txt new file mode 100644 index 0000000..64dba0b --- /dev/null +++ b/mods/sudoku/lv3_110.txt @@ -0,0 +1,9 @@ +204050709 +310809045 +000000000 +030904050 +400000007 +070603020 +000000000 +140507032 +605030804 \ No newline at end of file diff --git a/mods/sudoku/lv3_111.txt b/mods/sudoku/lv3_111.txt new file mode 100644 index 0000000..6d5eda1 --- /dev/null +++ b/mods/sudoku/lv3_111.txt @@ -0,0 +1,9 @@ +000102000 +230000015 +900604002 +490000023 +060408070 +710000054 +800503001 +650000038 +000907000 \ No newline at end of file diff --git a/mods/sudoku/lv3_112.txt b/mods/sudoku/lv3_112.txt new file mode 100644 index 0000000..0a2318e --- /dev/null +++ b/mods/sudoku/lv3_112.txt @@ -0,0 +1,9 @@ +010000030 +083000460 +000908000 +004615700 +000703000 +007489500 +000201000 +068000270 +020000050 \ No newline at end of file diff --git a/mods/sudoku/lv3_113.txt b/mods/sudoku/lv3_113.txt new file mode 100644 index 0000000..f32b78c --- /dev/null +++ b/mods/sudoku/lv3_113.txt @@ -0,0 +1,9 @@ +001324600 +000000000 +200108004 +005080900 +760000018 +003010500 +300807006 +000000000 +004965800 \ No newline at end of file diff --git a/mods/sudoku/lv3_114.txt b/mods/sudoku/lv3_114.txt new file mode 100644 index 0000000..9471061 --- /dev/null +++ b/mods/sudoku/lv3_114.txt @@ -0,0 +1,9 @@ +007901400 +000204000 +060050010 +071000890 +040000060 +038000240 +080090050 +000502000 +003607900 \ No newline at end of file diff --git a/mods/sudoku/lv3_115.txt b/mods/sudoku/lv3_115.txt new file mode 100644 index 0000000..094084d --- /dev/null +++ b/mods/sudoku/lv3_115.txt @@ -0,0 +1,9 @@ +000090000 +380000049 +002406500 +200109006 +009000800 +700803002 +005307400 +120000093 +000020000 \ No newline at end of file diff --git a/mods/sudoku/lv3_116.txt b/mods/sudoku/lv3_116.txt new file mode 100644 index 0000000..816bd38 --- /dev/null +++ b/mods/sudoku/lv3_116.txt @@ -0,0 +1,9 @@ +000000000 +100000007 +052030690 +006209700 +370508014 +004103900 +067020830 +200000006 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_117.txt b/mods/sudoku/lv3_117.txt new file mode 100644 index 0000000..330bc53 --- /dev/null +++ b/mods/sudoku/lv3_117.txt @@ -0,0 +1,9 @@ +206000705 +003000100 +180000026 +000849000 +000506000 +000321000 +490000017 +001000600 +705000804 \ No newline at end of file diff --git a/mods/sudoku/lv3_118.txt b/mods/sudoku/lv3_118.txt new file mode 100644 index 0000000..2969691 --- /dev/null +++ b/mods/sudoku/lv3_118.txt @@ -0,0 +1,9 @@ +007503100 +013090780 +000000000 +200368004 +000000000 +800154002 +000000000 +092070450 +001209600 \ No newline at end of file diff --git a/mods/sudoku/lv3_119.txt b/mods/sudoku/lv3_119.txt new file mode 100644 index 0000000..87fcca9 --- /dev/null +++ b/mods/sudoku/lv3_119.txt @@ -0,0 +1,9 @@ +270000035 +004209100 +000010000 +906000802 +000608000 +508000403 +000080000 +007905300 +380000059 \ No newline at end of file diff --git a/mods/sudoku/lv3_12.txt b/mods/sudoku/lv3_12.txt new file mode 100644 index 0000000..5452d7b --- /dev/null +++ b/mods/sudoku/lv3_12.txt @@ -0,0 +1,9 @@ +090030002 +600907100 +004150080 +080003001 +100602005 +900500070 +030069500 +006204008 +800010020 \ No newline at end of file diff --git a/mods/sudoku/lv3_120.txt b/mods/sudoku/lv3_120.txt new file mode 100644 index 0000000..089c2fe --- /dev/null +++ b/mods/sudoku/lv3_120.txt @@ -0,0 +1,9 @@ +002000300 +010000050 +300976008 +008040600 +100507004 +009060800 +600321009 +040000060 +003000200 \ No newline at end of file diff --git a/mods/sudoku/lv3_121.txt b/mods/sudoku/lv3_121.txt new file mode 100644 index 0000000..5e3f4d3 --- /dev/null +++ b/mods/sudoku/lv3_121.txt @@ -0,0 +1,9 @@ +000040002 +034000650 +102008007 +000001046 +008000700 +420500000 +300100209 +096000180 +700030000 \ No newline at end of file diff --git a/mods/sudoku/lv3_122.txt b/mods/sudoku/lv3_122.txt new file mode 100644 index 0000000..1fbbb3f --- /dev/null +++ b/mods/sudoku/lv3_122.txt @@ -0,0 +1,9 @@ +703508409 +000907000 +040000010 +000050000 +107409602 +000020000 +020000090 +000201000 +906304208 \ No newline at end of file diff --git a/mods/sudoku/lv3_123.txt b/mods/sudoku/lv3_123.txt new file mode 100644 index 0000000..1af6ce9 --- /dev/null +++ b/mods/sudoku/lv3_123.txt @@ -0,0 +1,9 @@ +000000380 +030010402 +008200000 +400368700 +090000010 +007951004 +000009600 +105030040 +024000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_124.txt b/mods/sudoku/lv3_124.txt new file mode 100644 index 0000000..d86836b --- /dev/null +++ b/mods/sudoku/lv3_124.txt @@ -0,0 +1,9 @@ +000080060 +050300091 +000009407 +001000985 +000503000 +645000700 +504200000 +270001030 +010060000 \ No newline at end of file diff --git a/mods/sudoku/lv3_125.txt b/mods/sudoku/lv3_125.txt new file mode 100644 index 0000000..9a7cc55 --- /dev/null +++ b/mods/sudoku/lv3_125.txt @@ -0,0 +1,9 @@ +823000501 +060005000 +000900000 +100573060 +005000900 +080496003 +000009000 +000200030 +406000278 \ No newline at end of file diff --git a/mods/sudoku/lv3_126.txt b/mods/sudoku/lv3_126.txt new file mode 100644 index 0000000..36bf0f0 --- /dev/null +++ b/mods/sudoku/lv3_126.txt @@ -0,0 +1,9 @@ +900000005 +026001000 +030506400 +070003014 +002000800 +640900050 +008102030 +000400780 +300000002 \ No newline at end of file diff --git a/mods/sudoku/lv3_127.txt b/mods/sudoku/lv3_127.txt new file mode 100644 index 0000000..e9de049 --- /dev/null +++ b/mods/sudoku/lv3_127.txt @@ -0,0 +1,9 @@ +009000100 +074160080 +000059002 +620000701 +000000000 +108000053 +300870000 +010035890 +006000400 \ No newline at end of file diff --git a/mods/sudoku/lv3_128.txt b/mods/sudoku/lv3_128.txt new file mode 100644 index 0000000..24392fb --- /dev/null +++ b/mods/sudoku/lv3_128.txt @@ -0,0 +1,9 @@ +000000100 +300702060 +060400580 +700000054 +006905300 +450000002 +047008030 +090107006 +002000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_129.txt b/mods/sudoku/lv3_129.txt new file mode 100644 index 0000000..2eb2191 --- /dev/null +++ b/mods/sudoku/lv3_129.txt @@ -0,0 +1,9 @@ +000870130 +090520700 +000400006 +307100000 +080000050 +000005608 +200001000 +004097010 +031084000 \ No newline at end of file diff --git a/mods/sudoku/lv3_13.txt b/mods/sudoku/lv3_13.txt new file mode 100644 index 0000000..e87fc29 --- /dev/null +++ b/mods/sudoku/lv3_13.txt @@ -0,0 +1,9 @@ +000908701 +105400008 +000605030 +560700000 +018000640 +000003095 +030809000 +800001503 +201306000 \ No newline at end of file diff --git a/mods/sudoku/lv3_130.txt b/mods/sudoku/lv3_130.txt new file mode 100644 index 0000000..ccd4902 --- /dev/null +++ b/mods/sudoku/lv3_130.txt @@ -0,0 +1,9 @@ +002080000 +010205007 +003060004 +020004000 +604107908 +000900040 +100040800 +900502030 +000010700 \ No newline at end of file diff --git a/mods/sudoku/lv3_131.txt b/mods/sudoku/lv3_131.txt new file mode 100644 index 0000000..d119b61 --- /dev/null +++ b/mods/sudoku/lv3_131.txt @@ -0,0 +1,9 @@ +000200070 +067840020 +084000600 +003600000 +502000907 +000009100 +008000510 +020085430 +010004000 \ No newline at end of file diff --git a/mods/sudoku/lv3_132.txt b/mods/sudoku/lv3_132.txt new file mode 100644 index 0000000..228f308 --- /dev/null +++ b/mods/sudoku/lv3_132.txt @@ -0,0 +1,9 @@ +100006000 +658007000 +040900800 +070003086 +005000300 +260800090 +002005010 +000400538 +000700002 \ No newline at end of file diff --git a/mods/sudoku/lv3_133.txt b/mods/sudoku/lv3_133.txt new file mode 100644 index 0000000..e4b83a0 --- /dev/null +++ b/mods/sudoku/lv3_133.txt @@ -0,0 +1,9 @@ +000005948 +000638020 +000000003 +105000070 +008507600 +060000802 +400000000 +090123000 +612400000 \ No newline at end of file diff --git a/mods/sudoku/lv3_134.txt b/mods/sudoku/lv3_134.txt new file mode 100644 index 0000000..949a74e --- /dev/null +++ b/mods/sudoku/lv3_134.txt @@ -0,0 +1,9 @@ +005070600 +080040530 +030100072 +000300020 +900000005 +050007000 +270008010 +048090060 +003060200 \ No newline at end of file diff --git a/mods/sudoku/lv3_135.txt b/mods/sudoku/lv3_135.txt new file mode 100644 index 0000000..98e3b6f --- /dev/null +++ b/mods/sudoku/lv3_135.txt @@ -0,0 +1,9 @@ +004008030 +001209050 +009073000 +706000080 +080000010 +010000207 +000810300 +030504100 +090300600 \ No newline at end of file diff --git a/mods/sudoku/lv3_136.txt b/mods/sudoku/lv3_136.txt new file mode 100644 index 0000000..e0d0120 --- /dev/null +++ b/mods/sudoku/lv3_136.txt @@ -0,0 +1,9 @@ +000800000 +007106200 +380000960 +003600004 +500409003 +100008600 +048000072 +006705300 +000002000 \ No newline at end of file diff --git a/mods/sudoku/lv3_137.txt b/mods/sudoku/lv3_137.txt new file mode 100644 index 0000000..4fa88ca --- /dev/null +++ b/mods/sudoku/lv3_137.txt @@ -0,0 +1,9 @@ +010570020 +600004709 +080006000 +079000001 +200000003 +300000980 +000100030 +508600004 +090028060 \ No newline at end of file diff --git a/mods/sudoku/lv3_138.txt b/mods/sudoku/lv3_138.txt new file mode 100644 index 0000000..27b20c0 --- /dev/null +++ b/mods/sudoku/lv3_138.txt @@ -0,0 +1,9 @@ +005000048 +007090600 +210008070 +050007080 +100000005 +030900060 +040100037 +003060200 +890000400 \ No newline at end of file diff --git a/mods/sudoku/lv3_139.txt b/mods/sudoku/lv3_139.txt new file mode 100644 index 0000000..89d12de --- /dev/null +++ b/mods/sudoku/lv3_139.txt @@ -0,0 +1,9 @@ +000300800 +640800050 +875000001 +500070206 +000000000 +209080005 +400000769 +020008013 +007005000 \ No newline at end of file diff --git a/mods/sudoku/lv3_14.txt b/mods/sudoku/lv3_14.txt new file mode 100644 index 0000000..5828f7b --- /dev/null +++ b/mods/sudoku/lv3_14.txt @@ -0,0 +1,9 @@ +010709030 +500000009 +000382000 +087010960 +006204800 +043070210 +000435000 +700000001 +060107090 \ No newline at end of file diff --git a/mods/sudoku/lv3_140.txt b/mods/sudoku/lv3_140.txt new file mode 100644 index 0000000..a4800de --- /dev/null +++ b/mods/sudoku/lv3_140.txt @@ -0,0 +1,9 @@ +400100005 +050008019 +009030200 +700602500 +000000000 +006805001 +007040300 +310200090 +900007006 \ No newline at end of file diff --git a/mods/sudoku/lv3_141.txt b/mods/sudoku/lv3_141.txt new file mode 100644 index 0000000..192faf6 --- /dev/null +++ b/mods/sudoku/lv3_141.txt @@ -0,0 +1,9 @@ +002004300 +010500090 +800307006 +107000920 +000000000 +028000501 +300605004 +050003080 +006900700 \ No newline at end of file diff --git a/mods/sudoku/lv3_142.txt b/mods/sudoku/lv3_142.txt new file mode 100644 index 0000000..ba40ffd --- /dev/null +++ b/mods/sudoku/lv3_142.txt @@ -0,0 +1,9 @@ +206070904 +000102000 +500000002 +001908600 +050000030 +002507800 +400000006 +000703000 +907080203 \ No newline at end of file diff --git a/mods/sudoku/lv3_143.txt b/mods/sudoku/lv3_143.txt new file mode 100644 index 0000000..753a5c3 --- /dev/null +++ b/mods/sudoku/lv3_143.txt @@ -0,0 +1,9 @@ +000600020 +003000480 +009080005 +200065900 +050309040 +007410006 +600070800 +031000700 +070006000 \ No newline at end of file diff --git a/mods/sudoku/lv3_144.txt b/mods/sudoku/lv3_144.txt new file mode 100644 index 0000000..b9273c7 --- /dev/null +++ b/mods/sudoku/lv3_144.txt @@ -0,0 +1,9 @@ +706100094 +000000000 +090200103 +009060010 +504000907 +010090800 +401008030 +000000000 +950003702 \ No newline at end of file diff --git a/mods/sudoku/lv3_145.txt b/mods/sudoku/lv3_145.txt new file mode 100644 index 0000000..93c6666 --- /dev/null +++ b/mods/sudoku/lv3_145.txt @@ -0,0 +1,9 @@ +080006070 +090800014 +107000006 +006010009 +000708000 +900060500 +800000203 +230005040 +040600090 \ No newline at end of file diff --git a/mods/sudoku/lv3_146.txt b/mods/sudoku/lv3_146.txt new file mode 100644 index 0000000..d3d15c4 --- /dev/null +++ b/mods/sudoku/lv3_146.txt @@ -0,0 +1,9 @@ +004000800 +000200000 +020640905 +080015009 +210000073 +900470080 +108056020 +000008000 +006000300 \ No newline at end of file diff --git a/mods/sudoku/lv3_147.txt b/mods/sudoku/lv3_147.txt new file mode 100644 index 0000000..9aa17f4 --- /dev/null +++ b/mods/sudoku/lv3_147.txt @@ -0,0 +1,9 @@ +090100043 +210905000 +003000005 +706200000 +000407000 +000009507 +300000400 +000508039 +680004070 \ No newline at end of file diff --git a/mods/sudoku/lv3_148.txt b/mods/sudoku/lv3_148.txt new file mode 100644 index 0000000..01d83af --- /dev/null +++ b/mods/sudoku/lv3_148.txt @@ -0,0 +1,9 @@ +500040001 +000005200 +072061900 +043000000 +806000704 +000000390 +005970630 +008300000 +400050009 \ No newline at end of file diff --git a/mods/sudoku/lv3_149.txt b/mods/sudoku/lv3_149.txt new file mode 100644 index 0000000..fe97be2 --- /dev/null +++ b/mods/sudoku/lv3_149.txt @@ -0,0 +1,9 @@ +007003500 +045000070 +300080091 +200070000 +003102800 +000090004 +460050002 +070000610 +008200900 \ No newline at end of file diff --git a/mods/sudoku/lv3_15.txt b/mods/sudoku/lv3_15.txt new file mode 100644 index 0000000..cca6828 --- /dev/null +++ b/mods/sudoku/lv3_15.txt @@ -0,0 +1,9 @@ +900000017 +800050000 +500679308 +070800090 +008502400 +010004050 +109247005 +000060001 +360000009 \ No newline at end of file diff --git a/mods/sudoku/lv3_150.txt b/mods/sudoku/lv3_150.txt new file mode 100644 index 0000000..6d82db6 --- /dev/null +++ b/mods/sudoku/lv3_150.txt @@ -0,0 +1,9 @@ +100600003 +372000000 +000200050 +907042010 +040000090 +060950308 +080003000 +000000624 +700004001 \ No newline at end of file diff --git a/mods/sudoku/lv3_151.txt b/mods/sudoku/lv3_151.txt new file mode 100644 index 0000000..f460dba --- /dev/null +++ b/mods/sudoku/lv3_151.txt @@ -0,0 +1,9 @@ +000000590 +000069024 +080400003 +001045000 +403000902 +000230100 +200008010 +960750000 +078000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_152.txt b/mods/sudoku/lv3_152.txt new file mode 100644 index 0000000..dce0ec5 --- /dev/null +++ b/mods/sudoku/lv3_152.txt @@ -0,0 +1,9 @@ +400800050 +065000080 +708300000 +010920000 +054000310 +000043070 +000008609 +090000720 +040007008 \ No newline at end of file diff --git a/mods/sudoku/lv3_153.txt b/mods/sudoku/lv3_153.txt new file mode 100644 index 0000000..923d455 --- /dev/null +++ b/mods/sudoku/lv3_153.txt @@ -0,0 +1,9 @@ +001500000 +805010000 +409300005 +703020000 +200605009 +000040106 +500006301 +000050902 +000007800 \ No newline at end of file diff --git a/mods/sudoku/lv3_154.txt b/mods/sudoku/lv3_154.txt new file mode 100644 index 0000000..e45a2f8 --- /dev/null +++ b/mods/sudoku/lv3_154.txt @@ -0,0 +1,9 @@ +300940500 +800000007 +070063000 +100026900 +090000070 +007390004 +000450060 +500000008 +001032009 \ No newline at end of file diff --git a/mods/sudoku/lv3_155.txt b/mods/sudoku/lv3_155.txt new file mode 100644 index 0000000..9f15cb1 --- /dev/null +++ b/mods/sudoku/lv3_155.txt @@ -0,0 +1,9 @@ +300000200 +700230000 +058009014 +400000000 +601802705 +000000003 +890300670 +000094002 +002000009 \ No newline at end of file diff --git a/mods/sudoku/lv3_156.txt b/mods/sudoku/lv3_156.txt new file mode 100644 index 0000000..f0c6ecf --- /dev/null +++ b/mods/sudoku/lv3_156.txt @@ -0,0 +1,9 @@ +310002000 +067005000 +004700200 +905806070 +000000000 +070203601 +003007900 +000500430 +000400082 \ No newline at end of file diff --git a/mods/sudoku/lv3_157.txt b/mods/sudoku/lv3_157.txt new file mode 100644 index 0000000..f9a889b --- /dev/null +++ b/mods/sudoku/lv3_157.txt @@ -0,0 +1,9 @@ +040950080 +608001007 +000000030 +010090002 +700102009 +900060010 +070000000 +200500903 +080039060 \ No newline at end of file diff --git a/mods/sudoku/lv3_158.txt b/mods/sudoku/lv3_158.txt new file mode 100644 index 0000000..05973db --- /dev/null +++ b/mods/sudoku/lv3_158.txt @@ -0,0 +1,9 @@ +300614007 +001000600 +800000001 +020040070 +070309050 +080070020 +600000002 +005000900 +200761005 \ No newline at end of file diff --git a/mods/sudoku/lv3_159.txt b/mods/sudoku/lv3_159.txt new file mode 100644 index 0000000..78f2580 --- /dev/null +++ b/mods/sudoku/lv3_159.txt @@ -0,0 +1,9 @@ +000000000 +170050063 +009201700 +050803010 +900000006 +080109070 +005304800 +430090025 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_16.txt b/mods/sudoku/lv3_16.txt new file mode 100644 index 0000000..bb1eb2e --- /dev/null +++ b/mods/sudoku/lv3_16.txt @@ -0,0 +1,9 @@ +405020070 +000087950 +090000008 +020073081 +003000500 +860250040 +700000010 +031760000 +040030709 \ No newline at end of file diff --git a/mods/sudoku/lv3_160.txt b/mods/sudoku/lv3_160.txt new file mode 100644 index 0000000..d3784c0 --- /dev/null +++ b/mods/sudoku/lv3_160.txt @@ -0,0 +1,9 @@ +030100904 +000000000 +000900736 +091006200 +007508100 +005200690 +459002000 +000000000 +208007010 \ No newline at end of file diff --git a/mods/sudoku/lv3_161.txt b/mods/sudoku/lv3_161.txt new file mode 100644 index 0000000..ece4f07 --- /dev/null +++ b/mods/sudoku/lv3_161.txt @@ -0,0 +1,9 @@ +040302080 +700001004 +003004200 +259000001 +000000000 +300000862 +001600500 +900100007 +060703040 \ No newline at end of file diff --git a/mods/sudoku/lv3_162.txt b/mods/sudoku/lv3_162.txt new file mode 100644 index 0000000..1284d5d --- /dev/null +++ b/mods/sudoku/lv3_162.txt @@ -0,0 +1,9 @@ +280609004 +005007290 +400500000 +020080000 +700000001 +000010060 +000005002 +057200300 +300804075 \ No newline at end of file diff --git a/mods/sudoku/lv3_163.txt b/mods/sudoku/lv3_163.txt new file mode 100644 index 0000000..0a7a5ca --- /dev/null +++ b/mods/sudoku/lv3_163.txt @@ -0,0 +1,9 @@ +103000409 +900708006 +000904000 +007805600 +000000000 +004603500 +000102000 +300409005 +601000802 \ No newline at end of file diff --git a/mods/sudoku/lv3_164.txt b/mods/sudoku/lv3_164.txt new file mode 100644 index 0000000..120afaa --- /dev/null +++ b/mods/sudoku/lv3_164.txt @@ -0,0 +1,9 @@ +180000072 +030601080 +005000600 +000437000 +400000005 +000586000 +009000400 +070905060 +210000059 \ No newline at end of file diff --git a/mods/sudoku/lv3_165.txt b/mods/sudoku/lv3_165.txt new file mode 100644 index 0000000..191b247 --- /dev/null +++ b/mods/sudoku/lv3_165.txt @@ -0,0 +1,9 @@ +600070001 +003000500 +800104002 +090782050 +000000000 +040563090 +200306004 +008000600 +400010009 \ No newline at end of file diff --git a/mods/sudoku/lv3_166.txt b/mods/sudoku/lv3_166.txt new file mode 100644 index 0000000..ff3602d --- /dev/null +++ b/mods/sudoku/lv3_166.txt @@ -0,0 +1,9 @@ +500000002 +103090607 +000701000 +001000800 +830409025 +007000400 +000305000 +208070301 +300000006 \ No newline at end of file diff --git a/mods/sudoku/lv3_167.txt b/mods/sudoku/lv3_167.txt new file mode 100644 index 0000000..1b4422a --- /dev/null +++ b/mods/sudoku/lv3_167.txt @@ -0,0 +1,9 @@ +070400010 +500000804 +019080700 +000601007 +007000300 +600708000 +001070520 +203000001 +090002030 \ No newline at end of file diff --git a/mods/sudoku/lv3_168.txt b/mods/sudoku/lv3_168.txt new file mode 100644 index 0000000..07de84d --- /dev/null +++ b/mods/sudoku/lv3_168.txt @@ -0,0 +1,9 @@ +205780096 +700000000 +000021008 +003000004 +904000503 +800000700 +400210000 +000000002 +620053901 \ No newline at end of file diff --git a/mods/sudoku/lv3_169.txt b/mods/sudoku/lv3_169.txt new file mode 100644 index 0000000..a186afd --- /dev/null +++ b/mods/sudoku/lv3_169.txt @@ -0,0 +1,9 @@ +900080020 +027430008 +001000300 +005000080 +600908004 +080000100 +009000700 +300051240 +070060003 \ No newline at end of file diff --git a/mods/sudoku/lv3_17.txt b/mods/sudoku/lv3_17.txt new file mode 100644 index 0000000..cb028b9 --- /dev/null +++ b/mods/sudoku/lv3_17.txt @@ -0,0 +1,9 @@ +002945600 +000000000 +080306050 +710000036 +023407580 +650000049 +030104020 +000000000 +007859100 \ No newline at end of file diff --git a/mods/sudoku/lv3_170.txt b/mods/sudoku/lv3_170.txt new file mode 100644 index 0000000..81b9f0b --- /dev/null +++ b/mods/sudoku/lv3_170.txt @@ -0,0 +1,9 @@ +040300010 +070000500 +003020067 +024907003 +000000000 +300501980 +680090400 +005000090 +010004020 \ No newline at end of file diff --git a/mods/sudoku/lv3_171.txt b/mods/sudoku/lv3_171.txt new file mode 100644 index 0000000..20da178 --- /dev/null +++ b/mods/sudoku/lv3_171.txt @@ -0,0 +1,9 @@ +000190208 +016000000 +003056000 +705000900 +800607003 +004000702 +000910800 +000000450 +509034000 \ No newline at end of file diff --git a/mods/sudoku/lv3_172.txt b/mods/sudoku/lv3_172.txt new file mode 100644 index 0000000..4ed48b0 --- /dev/null +++ b/mods/sudoku/lv3_172.txt @@ -0,0 +1,9 @@ +006000050 +200007400 +080400001 +060194200 +000708000 +009653070 +500006030 +003500002 +040000800 \ No newline at end of file diff --git a/mods/sudoku/lv3_173.txt b/mods/sudoku/lv3_173.txt new file mode 100644 index 0000000..620f71c --- /dev/null +++ b/mods/sudoku/lv3_173.txt @@ -0,0 +1,9 @@ +000500600 +060027034 +320004010 +003000002 +000406000 +800000700 +090600043 +180270090 +005001000 \ No newline at end of file diff --git a/mods/sudoku/lv3_174.txt b/mods/sudoku/lv3_174.txt new file mode 100644 index 0000000..ffac058 --- /dev/null +++ b/mods/sudoku/lv3_174.txt @@ -0,0 +1,9 @@ +100020005 +020080010 +009601300 +001000900 +480000067 +007000500 +008307200 +010090030 +600040009 \ No newline at end of file diff --git a/mods/sudoku/lv3_175.txt b/mods/sudoku/lv3_175.txt new file mode 100644 index 0000000..2665d4c --- /dev/null +++ b/mods/sudoku/lv3_175.txt @@ -0,0 +1,9 @@ +050070090 +060010030 +000206000 +001784900 +500000004 +007365800 +000107000 +020090010 +070030050 \ No newline at end of file diff --git a/mods/sudoku/lv3_176.txt b/mods/sudoku/lv3_176.txt new file mode 100644 index 0000000..cfdbbec --- /dev/null +++ b/mods/sudoku/lv3_176.txt @@ -0,0 +1,9 @@ +010700000 +050008040 +003001007 +900607100 +005902700 +004103009 +800300400 +070400020 +000005010 \ No newline at end of file diff --git a/mods/sudoku/lv3_177.txt b/mods/sudoku/lv3_177.txt new file mode 100644 index 0000000..fb6bf23 --- /dev/null +++ b/mods/sudoku/lv3_177.txt @@ -0,0 +1,9 @@ +800300600 +019506000 +003410000 +602000008 +030000090 +700000503 +000071900 +000809730 +001004002 \ No newline at end of file diff --git a/mods/sudoku/lv3_178.txt b/mods/sudoku/lv3_178.txt new file mode 100644 index 0000000..f3d659d --- /dev/null +++ b/mods/sudoku/lv3_178.txt @@ -0,0 +1,9 @@ +007018509 +020000000 +003060048 +000059630 +000000000 +098130000 +510040800 +000000010 +409620700 \ No newline at end of file diff --git a/mods/sudoku/lv3_179.txt b/mods/sudoku/lv3_179.txt new file mode 100644 index 0000000..5d28695 --- /dev/null +++ b/mods/sudoku/lv3_179.txt @@ -0,0 +1,9 @@ +020801070 +000060000 +900504003 +340000089 +200000005 +610000027 +800907002 +000080000 +070602090 \ No newline at end of file diff --git a/mods/sudoku/lv3_18.txt b/mods/sudoku/lv3_18.txt new file mode 100644 index 0000000..bc5b1e4 --- /dev/null +++ b/mods/sudoku/lv3_18.txt @@ -0,0 +1,9 @@ +060052700 +000168009 +089300000 +050006400 +078000150 +004700080 +000003920 +200681000 +006420070 \ No newline at end of file diff --git a/mods/sudoku/lv3_180.txt b/mods/sudoku/lv3_180.txt new file mode 100644 index 0000000..5daf6ae --- /dev/null +++ b/mods/sudoku/lv3_180.txt @@ -0,0 +1,9 @@ +060080010 +500231009 +000906000 +004000900 +200705008 +007000500 +000809000 +700314006 +010070040 \ No newline at end of file diff --git a/mods/sudoku/lv3_181.txt b/mods/sudoku/lv3_181.txt new file mode 100644 index 0000000..95e05f9 --- /dev/null +++ b/mods/sudoku/lv3_181.txt @@ -0,0 +1,9 @@ +090007040 +054003600 +000600900 +300400296 +000000000 +419002003 +008004000 +007500830 +030800010 \ No newline at end of file diff --git a/mods/sudoku/lv3_182.txt b/mods/sudoku/lv3_182.txt new file mode 100644 index 0000000..a96d616 --- /dev/null +++ b/mods/sudoku/lv3_182.txt @@ -0,0 +1,9 @@ +040928030 +060000050 +009000100 +020010090 +007306800 +050080070 +003000400 +080000060 +010864020 \ No newline at end of file diff --git a/mods/sudoku/lv3_183.txt b/mods/sudoku/lv3_183.txt new file mode 100644 index 0000000..468e4e5 --- /dev/null +++ b/mods/sudoku/lv3_183.txt @@ -0,0 +1,9 @@ +000509000 +927000453 +000000000 +001407800 +075000230 +008205900 +000000000 +356000187 +000806000 \ No newline at end of file diff --git a/mods/sudoku/lv3_184.txt b/mods/sudoku/lv3_184.txt new file mode 100644 index 0000000..6f7a92b --- /dev/null +++ b/mods/sudoku/lv3_184.txt @@ -0,0 +1,9 @@ +000009307 +000756020 +000040805 +000002706 +003000500 +508600000 +401020000 +050861000 +902300000 \ No newline at end of file diff --git a/mods/sudoku/lv3_185.txt b/mods/sudoku/lv3_185.txt new file mode 100644 index 0000000..fe5057c --- /dev/null +++ b/mods/sudoku/lv3_185.txt @@ -0,0 +1,9 @@ +870900004 +000002006 +000145000 +094000605 +007000300 +501000240 +000589000 +600700000 +700003021 \ No newline at end of file diff --git a/mods/sudoku/lv3_186.txt b/mods/sudoku/lv3_186.txt new file mode 100644 index 0000000..a3a3b6e --- /dev/null +++ b/mods/sudoku/lv3_186.txt @@ -0,0 +1,9 @@ +002010700 +403000905 +050000020 +040603050 +200000009 +080407010 +070000080 +804000506 +009060400 \ No newline at end of file diff --git a/mods/sudoku/lv3_187.txt b/mods/sudoku/lv3_187.txt new file mode 100644 index 0000000..754337d --- /dev/null +++ b/mods/sudoku/lv3_187.txt @@ -0,0 +1,9 @@ +904005002 +050064010 +000000007 +670040000 +030609070 +000020035 +800000000 +060230040 +100800703 \ No newline at end of file diff --git a/mods/sudoku/lv3_188.txt b/mods/sudoku/lv3_188.txt new file mode 100644 index 0000000..3370ecb --- /dev/null +++ b/mods/sudoku/lv3_188.txt @@ -0,0 +1,9 @@ +000400050 +759020030 +000017090 +006000002 +015000840 +300000900 +060390000 +090060185 +020001000 \ No newline at end of file diff --git a/mods/sudoku/lv3_189.txt b/mods/sudoku/lv3_189.txt new file mode 100644 index 0000000..70f3cb7 --- /dev/null +++ b/mods/sudoku/lv3_189.txt @@ -0,0 +1,9 @@ +600035104 +070020000 +508000000 +000910050 +300204001 +040086000 +000000208 +000040010 +803760009 \ No newline at end of file diff --git a/mods/sudoku/lv3_19.txt b/mods/sudoku/lv3_19.txt new file mode 100644 index 0000000..65deaf2 --- /dev/null +++ b/mods/sudoku/lv3_19.txt @@ -0,0 +1,9 @@ +002050300 +900030004 +006407100 +050103080 +270000043 +030206050 +007905400 +400020006 +008010700 \ No newline at end of file diff --git a/mods/sudoku/lv3_190.txt b/mods/sudoku/lv3_190.txt new file mode 100644 index 0000000..91eb6f7 --- /dev/null +++ b/mods/sudoku/lv3_190.txt @@ -0,0 +1,9 @@ +060809020 +002060300 +000705000 +570000046 +006000200 +240000087 +000601000 +001090400 +020307060 \ No newline at end of file diff --git a/mods/sudoku/lv3_191.txt b/mods/sudoku/lv3_191.txt new file mode 100644 index 0000000..dc0fb40 --- /dev/null +++ b/mods/sudoku/lv3_191.txt @@ -0,0 +1,9 @@ +003000000 +067040120 +010009084 +005806000 +030000090 +000701600 +350200070 +046050310 +000000200 \ No newline at end of file diff --git a/mods/sudoku/lv3_192.txt b/mods/sudoku/lv3_192.txt new file mode 100644 index 0000000..09a2c77 --- /dev/null +++ b/mods/sudoku/lv3_192.txt @@ -0,0 +1,9 @@ +980021006 +005000002 +000300010 +200704900 +600000003 +007608001 +060009000 +100000500 +800170094 \ No newline at end of file diff --git a/mods/sudoku/lv3_193.txt b/mods/sudoku/lv3_193.txt new file mode 100644 index 0000000..bfa87d7 --- /dev/null +++ b/mods/sudoku/lv3_193.txt @@ -0,0 +1,9 @@ +020000040 +040579030 +003000100 +007020300 +010603050 +009050200 +004000500 +030718060 +090000080 \ No newline at end of file diff --git a/mods/sudoku/lv3_194.txt b/mods/sudoku/lv3_194.txt new file mode 100644 index 0000000..c290aac --- /dev/null +++ b/mods/sudoku/lv3_194.txt @@ -0,0 +1,9 @@ +300002007 +045007030 +000100090 +690010200 +000204000 +001050089 +060003000 +050600940 +400500008 \ No newline at end of file diff --git a/mods/sudoku/lv3_195.txt b/mods/sudoku/lv3_195.txt new file mode 100644 index 0000000..480ce50 --- /dev/null +++ b/mods/sudoku/lv3_195.txt @@ -0,0 +1,9 @@ +007903000 +040000030 +001000906 +400362005 +000508000 +300147008 +509000100 +070000080 +000705200 \ No newline at end of file diff --git a/mods/sudoku/lv3_196.txt b/mods/sudoku/lv3_196.txt new file mode 100644 index 0000000..078ea33 --- /dev/null +++ b/mods/sudoku/lv3_196.txt @@ -0,0 +1,9 @@ +000079000 +016300200 +050604008 +007003506 +000000000 +201800300 +500107020 +004008960 +000960000 \ No newline at end of file diff --git a/mods/sudoku/lv3_197.txt b/mods/sudoku/lv3_197.txt new file mode 100644 index 0000000..0f3632a --- /dev/null +++ b/mods/sudoku/lv3_197.txt @@ -0,0 +1,9 @@ +904000806 +280000037 +000701000 +060070090 +000104000 +010020040 +000809000 +830000075 +506000209 \ No newline at end of file diff --git a/mods/sudoku/lv3_198.txt b/mods/sudoku/lv3_198.txt new file mode 100644 index 0000000..2bae916 --- /dev/null +++ b/mods/sudoku/lv3_198.txt @@ -0,0 +1,9 @@ +400700056 +076200000 +013050000 +009400080 +000609000 +030008100 +000090570 +000002460 +240005001 \ No newline at end of file diff --git a/mods/sudoku/lv3_199.txt b/mods/sudoku/lv3_199.txt new file mode 100644 index 0000000..92a26c4 --- /dev/null +++ b/mods/sudoku/lv3_199.txt @@ -0,0 +1,9 @@ +700906001 +800507003 +040000050 +030602070 +000000000 +070309010 +020000080 +900201004 +600805009 \ No newline at end of file diff --git a/mods/sudoku/lv3_2.txt b/mods/sudoku/lv3_2.txt new file mode 100644 index 0000000..19fa183 --- /dev/null +++ b/mods/sudoku/lv3_2.txt @@ -0,0 +1,9 @@ +000000268 +200008300 +408270000 +702040000 +305701402 +000060705 +000024801 +004300007 +629000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_20.txt b/mods/sudoku/lv3_20.txt new file mode 100644 index 0000000..bc28ba1 --- /dev/null +++ b/mods/sudoku/lv3_20.txt @@ -0,0 +1,9 @@ +400003006 +060070000 +001050437 +006020058 +008504700 +390080200 +179040300 +000030040 +800200009 \ No newline at end of file diff --git a/mods/sudoku/lv3_200.txt b/mods/sudoku/lv3_200.txt new file mode 100644 index 0000000..21a7dd2 --- /dev/null +++ b/mods/sudoku/lv3_200.txt @@ -0,0 +1,9 @@ +000608000 +006050100 +020149080 +900000003 +005801900 +300000007 +030412060 +009070200 +000905000 \ No newline at end of file diff --git a/mods/sudoku/lv3_201.txt b/mods/sudoku/lv3_201.txt new file mode 100644 index 0000000..e51db36 --- /dev/null +++ b/mods/sudoku/lv3_201.txt @@ -0,0 +1,9 @@ +002060800 +060000090 +005708600 +200010003 +038000470 +700050002 +004901200 +020000040 +009040700 \ No newline at end of file diff --git a/mods/sudoku/lv3_202.txt b/mods/sudoku/lv3_202.txt new file mode 100644 index 0000000..eebe898 --- /dev/null +++ b/mods/sudoku/lv3_202.txt @@ -0,0 +1,9 @@ +010703060 +600000009 +080050040 +001937200 +000000000 +007186400 +020090080 +500000006 +030804010 \ No newline at end of file diff --git a/mods/sudoku/lv3_203.txt b/mods/sudoku/lv3_203.txt new file mode 100644 index 0000000..d1520fb --- /dev/null +++ b/mods/sudoku/lv3_203.txt @@ -0,0 +1,9 @@ +070000000 +200003501 +000051069 +600005020 +508000604 +010600003 +340970000 +706800002 +000000040 \ No newline at end of file diff --git a/mods/sudoku/lv3_204.txt b/mods/sudoku/lv3_204.txt new file mode 100644 index 0000000..bc4e254 --- /dev/null +++ b/mods/sudoku/lv3_204.txt @@ -0,0 +1,9 @@ +150000290 +000700000 +308006740 +700050400 +090000020 +002040008 +046200903 +000008000 +031000062 \ No newline at end of file diff --git a/mods/sudoku/lv3_205.txt b/mods/sudoku/lv3_205.txt new file mode 100644 index 0000000..da2440f --- /dev/null +++ b/mods/sudoku/lv3_205.txt @@ -0,0 +1,9 @@ +003100000 +089200750 +600500009 +804000090 +000407000 +010000402 +400002006 +028003540 +000009100 \ No newline at end of file diff --git a/mods/sudoku/lv3_206.txt b/mods/sudoku/lv3_206.txt new file mode 100644 index 0000000..88f225f --- /dev/null +++ b/mods/sudoku/lv3_206.txt @@ -0,0 +1,9 @@ +200000009 +009010800 +030908040 +720000093 +000109000 +590000028 +050601070 +006040900 +400000002 \ No newline at end of file diff --git a/mods/sudoku/lv3_207.txt b/mods/sudoku/lv3_207.txt new file mode 100644 index 0000000..a7751c0 --- /dev/null +++ b/mods/sudoku/lv3_207.txt @@ -0,0 +1,9 @@ +800530004 +004007000 +002400160 +070000405 +200000007 +509000010 +087006900 +000200300 +300018006 \ No newline at end of file diff --git a/mods/sudoku/lv3_208.txt b/mods/sudoku/lv3_208.txt new file mode 100644 index 0000000..358836d --- /dev/null +++ b/mods/sudoku/lv3_208.txt @@ -0,0 +1,9 @@ +030100000 +070506081 +005000700 +020030048 +000608000 +980010030 +004000800 +750209060 +000007020 \ No newline at end of file diff --git a/mods/sudoku/lv3_209.txt b/mods/sudoku/lv3_209.txt new file mode 100644 index 0000000..1e82e48 --- /dev/null +++ b/mods/sudoku/lv3_209.txt @@ -0,0 +1,9 @@ +203000004 +001360200 +000009057 +000100020 +009602500 +080005000 +420700000 +005046800 +900000703 \ No newline at end of file diff --git a/mods/sudoku/lv3_21.txt b/mods/sudoku/lv3_21.txt new file mode 100644 index 0000000..54fbd7d --- /dev/null +++ b/mods/sudoku/lv3_21.txt @@ -0,0 +1,9 @@ +000009046 +700080020 +109030800 +032107460 +000000000 +086302750 +003010604 +050040009 +610900000 \ No newline at end of file diff --git a/mods/sudoku/lv3_210.txt b/mods/sudoku/lv3_210.txt new file mode 100644 index 0000000..de73045 --- /dev/null +++ b/mods/sudoku/lv3_210.txt @@ -0,0 +1,9 @@ +009000000 +001498000 +000300012 +080020760 +040506030 +076080090 +230005000 +000739600 +000000300 \ No newline at end of file diff --git a/mods/sudoku/lv3_211.txt b/mods/sudoku/lv3_211.txt new file mode 100644 index 0000000..310cb88 --- /dev/null +++ b/mods/sudoku/lv3_211.txt @@ -0,0 +1,9 @@ +900430002 +008000000 +007060130 +000070003 +304109807 +800050000 +052010300 +000000700 +100042006 \ No newline at end of file diff --git a/mods/sudoku/lv3_212.txt b/mods/sudoku/lv3_212.txt new file mode 100644 index 0000000..9e8f5d2 --- /dev/null +++ b/mods/sudoku/lv3_212.txt @@ -0,0 +1,9 @@ +600000801 +040500030 +809700400 +000020760 +000805000 +021040000 +006004105 +010006090 +208000003 \ No newline at end of file diff --git a/mods/sudoku/lv3_213.txt b/mods/sudoku/lv3_213.txt new file mode 100644 index 0000000..adc37ba --- /dev/null +++ b/mods/sudoku/lv3_213.txt @@ -0,0 +1,9 @@ +900000401 +080300050 +200075000 +005080040 +007204600 +060030100 +000860004 +040009010 +308000007 \ No newline at end of file diff --git a/mods/sudoku/lv3_214.txt b/mods/sudoku/lv3_214.txt new file mode 100644 index 0000000..1671d69 --- /dev/null +++ b/mods/sudoku/lv3_214.txt @@ -0,0 +1,9 @@ +801000003 +060304810 +070000002 +020050090 +000608000 +080020030 +300000060 +047905080 +600000405 \ No newline at end of file diff --git a/mods/sudoku/lv3_215.txt b/mods/sudoku/lv3_215.txt new file mode 100644 index 0000000..018db14 --- /dev/null +++ b/mods/sudoku/lv3_215.txt @@ -0,0 +1,9 @@ +201800009 +090001040 +000090007 +070060002 +002907600 +500030070 +300040000 +080300090 +600008205 \ No newline at end of file diff --git a/mods/sudoku/lv3_216.txt b/mods/sudoku/lv3_216.txt new file mode 100644 index 0000000..1601e17 --- /dev/null +++ b/mods/sudoku/lv3_216.txt @@ -0,0 +1,9 @@ +040807050 +806000709 +050000020 +300402007 +000000000 +700601003 +070000040 +109000805 +020908070 \ No newline at end of file diff --git a/mods/sudoku/lv3_217.txt b/mods/sudoku/lv3_217.txt new file mode 100644 index 0000000..87d1fc7 --- /dev/null +++ b/mods/sudoku/lv3_217.txt @@ -0,0 +1,9 @@ +005030860 +610400020 +900800004 +000000150 +300000007 +027000000 +500003001 +080006095 +061090200 \ No newline at end of file diff --git a/mods/sudoku/lv3_218.txt b/mods/sudoku/lv3_218.txt new file mode 100644 index 0000000..1e579ac --- /dev/null +++ b/mods/sudoku/lv3_218.txt @@ -0,0 +1,9 @@ +000200100 +000003900 +765080400 +050102007 +008000200 +200408060 +002010789 +003800000 +009006000 \ No newline at end of file diff --git a/mods/sudoku/lv3_219.txt b/mods/sudoku/lv3_219.txt new file mode 100644 index 0000000..3ad9821 --- /dev/null +++ b/mods/sudoku/lv3_219.txt @@ -0,0 +1,9 @@ +700000045 +301004700 +040200090 +050030200 +000706000 +007010060 +060009080 +009400603 +480000009 \ No newline at end of file diff --git a/mods/sudoku/lv3_22.txt b/mods/sudoku/lv3_22.txt new file mode 100644 index 0000000..c1fba0c --- /dev/null +++ b/mods/sudoku/lv3_22.txt @@ -0,0 +1,9 @@ +070010320 +420580000 +001007009 +180005600 +004000900 +006400078 +800300700 +000098013 +037020080 \ No newline at end of file diff --git a/mods/sudoku/lv3_220.txt b/mods/sudoku/lv3_220.txt new file mode 100644 index 0000000..c7b7245 --- /dev/null +++ b/mods/sudoku/lv3_220.txt @@ -0,0 +1,9 @@ +620070940 +807000000 +000000005 +040301000 +071509380 +000207010 +400000000 +000000602 +068030097 \ No newline at end of file diff --git a/mods/sudoku/lv3_221.txt b/mods/sudoku/lv3_221.txt new file mode 100644 index 0000000..555042f --- /dev/null +++ b/mods/sudoku/lv3_221.txt @@ -0,0 +1,9 @@ +000208300 +008000100 +579000860 +800070001 +000409000 +700010004 +067000928 +005000400 +004603000 \ No newline at end of file diff --git a/mods/sudoku/lv3_222.txt b/mods/sudoku/lv3_222.txt new file mode 100644 index 0000000..6aec8fe --- /dev/null +++ b/mods/sudoku/lv3_222.txt @@ -0,0 +1,9 @@ +086000000 +000083004 +000760005 +010905300 +023000870 +009308010 +300057000 +200640000 +000000490 \ No newline at end of file diff --git a/mods/sudoku/lv3_23.txt b/mods/sudoku/lv3_23.txt new file mode 100644 index 0000000..13809fa --- /dev/null +++ b/mods/sudoku/lv3_23.txt @@ -0,0 +1,9 @@ +001020760 +000480059 +500009300 +800053090 +000704000 +070690003 +008900005 +140032000 +029070800 \ No newline at end of file diff --git a/mods/sudoku/lv3_24.txt b/mods/sudoku/lv3_24.txt new file mode 100644 index 0000000..ff1bff3 --- /dev/null +++ b/mods/sudoku/lv3_24.txt @@ -0,0 +1,9 @@ +040020097 +000004500 +670900001 +001080065 +800206009 +390010400 +200003076 +009600000 +460090050 \ No newline at end of file diff --git a/mods/sudoku/lv3_25.txt b/mods/sudoku/lv3_25.txt new file mode 100644 index 0000000..b9bf7cb --- /dev/null +++ b/mods/sudoku/lv3_25.txt @@ -0,0 +1,9 @@ +050090040 +002504600 +080307010 +800020007 +020806090 +600040008 +090602050 +003108900 +070050080 \ No newline at end of file diff --git a/mods/sudoku/lv3_26.txt b/mods/sudoku/lv3_26.txt new file mode 100644 index 0000000..d10b3b9 --- /dev/null +++ b/mods/sudoku/lv3_26.txt @@ -0,0 +1,9 @@ +107000004 +000056712 +095400000 +600080390 +500000008 +039070001 +000008120 +421560000 +900000506 \ No newline at end of file diff --git a/mods/sudoku/lv3_27.txt b/mods/sudoku/lv3_27.txt new file mode 100644 index 0000000..de65159 --- /dev/null +++ b/mods/sudoku/lv3_27.txt @@ -0,0 +1,9 @@ +068304000 +409060020 +001800006 +000006193 +000103000 +913200000 +700008500 +080040901 +000502870 \ No newline at end of file diff --git a/mods/sudoku/lv3_28.txt b/mods/sudoku/lv3_28.txt new file mode 100644 index 0000000..f41a061 --- /dev/null +++ b/mods/sudoku/lv3_28.txt @@ -0,0 +1,9 @@ +302000901 +008070300 +060000020 +079604510 +500000004 +014302790 +020000040 +005040100 +607000809 \ No newline at end of file diff --git a/mods/sudoku/lv3_29.txt b/mods/sudoku/lv3_29.txt new file mode 100644 index 0000000..83a8530 --- /dev/null +++ b/mods/sudoku/lv3_29.txt @@ -0,0 +1,9 @@ +000090060 +300870500 +090204001 +050000104 +074506320 +802000070 +900607050 +005038007 +080050000 \ No newline at end of file diff --git a/mods/sudoku/lv3_3.txt b/mods/sudoku/lv3_3.txt new file mode 100644 index 0000000..aa5b78c --- /dev/null +++ b/mods/sudoku/lv3_3.txt @@ -0,0 +1,9 @@ +000080002 +096300050 +005900704 +000030401 +027804690 +401050000 +904005800 +070008310 +100090000 \ No newline at end of file diff --git a/mods/sudoku/lv3_30.txt b/mods/sudoku/lv3_30.txt new file mode 100644 index 0000000..217a4f5 --- /dev/null +++ b/mods/sudoku/lv3_30.txt @@ -0,0 +1,9 @@ +800500030 +027006001 +006009080 +000910024 +900203007 +130075000 +010700600 +600300450 +050002008 \ No newline at end of file diff --git a/mods/sudoku/lv3_31.txt b/mods/sudoku/lv3_31.txt new file mode 100644 index 0000000..a0de458 --- /dev/null +++ b/mods/sudoku/lv3_31.txt @@ -0,0 +1,9 @@ +700000008 +050307090 +400605002 +009804200 +080906030 +004702100 +800501003 +030408010 +500000006 \ No newline at end of file diff --git a/mods/sudoku/lv3_32.txt b/mods/sudoku/lv3_32.txt new file mode 100644 index 0000000..a6c1ec7 --- /dev/null +++ b/mods/sudoku/lv3_32.txt @@ -0,0 +1,9 @@ +008406200 +409000605 +300705001 +030908060 +000000000 +090302070 +800501006 +705000408 +002804500 \ No newline at end of file diff --git a/mods/sudoku/lv3_33.txt b/mods/sudoku/lv3_33.txt new file mode 100644 index 0000000..687e96e --- /dev/null +++ b/mods/sudoku/lv3_33.txt @@ -0,0 +1,9 @@ +002030900 +704060805 +090205040 +507000603 +000000000 +409000102 +070308060 +108070509 +006090400 \ No newline at end of file diff --git a/mods/sudoku/lv3_34.txt b/mods/sudoku/lv3_34.txt new file mode 100644 index 0000000..e084633 --- /dev/null +++ b/mods/sudoku/lv3_34.txt @@ -0,0 +1,9 @@ +450000076 +000601000 +009705400 +080502040 +903000601 +040309080 +005207100 +000904000 +370000028 \ No newline at end of file diff --git a/mods/sudoku/lv3_35.txt b/mods/sudoku/lv3_35.txt new file mode 100644 index 0000000..7af1541 --- /dev/null +++ b/mods/sudoku/lv3_35.txt @@ -0,0 +1,9 @@ +600000800 +000306190 +400020030 +970461500 +080000010 +001938027 +060050004 +054107000 +009000001 \ No newline at end of file diff --git a/mods/sudoku/lv3_36.txt b/mods/sudoku/lv3_36.txt new file mode 100644 index 0000000..2bae086 --- /dev/null +++ b/mods/sudoku/lv3_36.txt @@ -0,0 +1,9 @@ +050207090 +600803004 +017000280 +009501300 +000000000 +008709100 +045000820 +200105007 +030402060 \ No newline at end of file diff --git a/mods/sudoku/lv3_37.txt b/mods/sudoku/lv3_37.txt new file mode 100644 index 0000000..c535759 --- /dev/null +++ b/mods/sudoku/lv3_37.txt @@ -0,0 +1,9 @@ +800104007 +370000015 +004000900 +700895002 +050000060 +400236009 +008000500 +920000034 +100407008 \ No newline at end of file diff --git a/mods/sudoku/lv3_38.txt b/mods/sudoku/lv3_38.txt new file mode 100644 index 0000000..0b6c6d9 --- /dev/null +++ b/mods/sudoku/lv3_38.txt @@ -0,0 +1,9 @@ +000030000 +000206000 +730105029 +390060054 +608000702 +270050061 +120809035 +000501000 +000070000 \ No newline at end of file diff --git a/mods/sudoku/lv3_39.txt b/mods/sudoku/lv3_39.txt new file mode 100644 index 0000000..23d2cb0 --- /dev/null +++ b/mods/sudoku/lv3_39.txt @@ -0,0 +1,9 @@ +940000075 +000501000 +800040003 +015403820 +200000001 +096102530 +100070002 +000605000 +520000048 \ No newline at end of file diff --git a/mods/sudoku/lv3_4.txt b/mods/sudoku/lv3_4.txt new file mode 100644 index 0000000..46ddfdf --- /dev/null +++ b/mods/sudoku/lv3_4.txt @@ -0,0 +1,9 @@ +000805300 +000004070 +200001908 +802036500 +301000402 +007510809 +609200001 +080600000 +003109000 \ No newline at end of file diff --git a/mods/sudoku/lv3_40.txt b/mods/sudoku/lv3_40.txt new file mode 100644 index 0000000..cb08c48 --- /dev/null +++ b/mods/sudoku/lv3_40.txt @@ -0,0 +1,9 @@ +002000400 +090070030 +001803500 +064301870 +000507000 +057204390 +008609700 +010030080 +009000100 \ No newline at end of file diff --git a/mods/sudoku/lv3_41.txt b/mods/sudoku/lv3_41.txt new file mode 100644 index 0000000..6d75b34 --- /dev/null +++ b/mods/sudoku/lv3_41.txt @@ -0,0 +1,9 @@ +001090500 +800000001 +503807904 +380040019 +000000000 +940070068 +709601302 +100000006 +008050100 \ No newline at end of file diff --git a/mods/sudoku/lv3_42.txt b/mods/sudoku/lv3_42.txt new file mode 100644 index 0000000..ea006fe --- /dev/null +++ b/mods/sudoku/lv3_42.txt @@ -0,0 +1,9 @@ +000914000 +006000500 +209000103 +802501904 +060000030 +704802601 +501000702 +003000400 +000746000 \ No newline at end of file diff --git a/mods/sudoku/lv3_43.txt b/mods/sudoku/lv3_43.txt new file mode 100644 index 0000000..8ca464a --- /dev/null +++ b/mods/sudoku/lv3_43.txt @@ -0,0 +1,9 @@ +008070400 +600050003 +400103002 +760804059 +000000000 +820501046 +900307004 +200040008 +005020300 \ No newline at end of file diff --git a/mods/sudoku/lv3_44.txt b/mods/sudoku/lv3_44.txt new file mode 100644 index 0000000..a5cea2d --- /dev/null +++ b/mods/sudoku/lv3_44.txt @@ -0,0 +1,9 @@ +900207006 +107000908 +050000070 +070915080 +002000600 +010426090 +040000030 +301000207 +600103004 \ No newline at end of file diff --git a/mods/sudoku/lv3_45.txt b/mods/sudoku/lv3_45.txt new file mode 100644 index 0000000..5584580 --- /dev/null +++ b/mods/sudoku/lv3_45.txt @@ -0,0 +1,9 @@ +700602001 +005000800 +010807020 +407090508 +009000200 +201060709 +060705030 +003000100 +100903002 \ No newline at end of file diff --git a/mods/sudoku/lv3_46.txt b/mods/sudoku/lv3_46.txt new file mode 100644 index 0000000..d5a93ee --- /dev/null +++ b/mods/sudoku/lv3_46.txt @@ -0,0 +1,9 @@ +002609700 +300000001 +040301080 +204000508 +060803040 +103000602 +030204070 +500000004 +008507900 \ No newline at end of file diff --git a/mods/sudoku/lv3_47.txt b/mods/sudoku/lv3_47.txt new file mode 100644 index 0000000..854dc25 --- /dev/null +++ b/mods/sudoku/lv3_47.txt @@ -0,0 +1,9 @@ +650000072 +000306000 +194000356 +200070005 +000109000 +400060003 +817000524 +000508000 +360000081 \ No newline at end of file diff --git a/mods/sudoku/lv3_48.txt b/mods/sudoku/lv3_48.txt new file mode 100644 index 0000000..334ab20 --- /dev/null +++ b/mods/sudoku/lv3_48.txt @@ -0,0 +1,9 @@ +002000300 +060305040 +043862950 +000109000 +700000005 +000507000 +014238570 +070406090 +005000400 \ No newline at end of file diff --git a/mods/sudoku/lv3_49.txt b/mods/sudoku/lv3_49.txt new file mode 100644 index 0000000..6724400 --- /dev/null +++ b/mods/sudoku/lv3_49.txt @@ -0,0 +1,9 @@ +500902006 +002080300 +070040050 +980000031 +001403500 +360000072 +030010060 +007020800 +600705004 \ No newline at end of file diff --git a/mods/sudoku/lv3_5.txt b/mods/sudoku/lv3_5.txt new file mode 100644 index 0000000..667f090 --- /dev/null +++ b/mods/sudoku/lv3_5.txt @@ -0,0 +1,9 @@ +900008200 +640102000 +018000600 +000980003 +092506780 +700034000 +003000450 +000805067 +004700002 \ No newline at end of file diff --git a/mods/sudoku/lv3_50.txt b/mods/sudoku/lv3_50.txt new file mode 100644 index 0000000..85e7bed --- /dev/null +++ b/mods/sudoku/lv3_50.txt @@ -0,0 +1,9 @@ +006000800 +040601050 +700804003 +510080097 +004000200 +390020084 +400507009 +060309070 +009000500 \ No newline at end of file diff --git a/mods/sudoku/lv3_51.txt b/mods/sudoku/lv3_51.txt new file mode 100644 index 0000000..d42f6de --- /dev/null +++ b/mods/sudoku/lv3_51.txt @@ -0,0 +1,9 @@ +008109200 +000070000 +104206507 +071000490 +080000030 +063000750 +907308106 +000010000 +002507900 \ No newline at end of file diff --git a/mods/sudoku/lv3_52.txt b/mods/sudoku/lv3_52.txt new file mode 100644 index 0000000..a0f1394 --- /dev/null +++ b/mods/sudoku/lv3_52.txt @@ -0,0 +1,9 @@ +701605208 +000000000 +002103600 +093060540 +000407000 +075010820 +008206900 +000000000 +209704305 \ No newline at end of file diff --git a/mods/sudoku/lv3_53.txt b/mods/sudoku/lv3_53.txt new file mode 100644 index 0000000..463f8d3 --- /dev/null +++ b/mods/sudoku/lv3_53.txt @@ -0,0 +1,9 @@ +006102400 +900507001 +070080050 +403000502 +000408000 +708000609 +040030060 +300705008 +005806700 \ No newline at end of file diff --git a/mods/sudoku/lv3_54.txt b/mods/sudoku/lv3_54.txt new file mode 100644 index 0000000..c919ae5 --- /dev/null +++ b/mods/sudoku/lv3_54.txt @@ -0,0 +1,9 @@ +070246050 +040000010 +050803060 +200070004 +500104006 +600090001 +010305070 +020000090 +060789040 \ No newline at end of file diff --git a/mods/sudoku/lv3_55.txt b/mods/sudoku/lv3_55.txt new file mode 100644 index 0000000..ffe21ba --- /dev/null +++ b/mods/sudoku/lv3_55.txt @@ -0,0 +1,9 @@ +060405010 +009070300 +002608400 +020801040 +800000001 +010209070 +007304500 +001020800 +030506020 \ No newline at end of file diff --git a/mods/sudoku/lv3_56.txt b/mods/sudoku/lv3_56.txt new file mode 100644 index 0000000..d3d785e --- /dev/null +++ b/mods/sudoku/lv3_56.txt @@ -0,0 +1,9 @@ +007000600 +603070904 +904803205 +000208000 +500000001 +000109000 +405307106 +702090508 +008000400 \ No newline at end of file diff --git a/mods/sudoku/lv3_57.txt b/mods/sudoku/lv3_57.txt new file mode 100644 index 0000000..305c50f --- /dev/null +++ b/mods/sudoku/lv3_57.txt @@ -0,0 +1,9 @@ +600040009 +005769300 +040000020 +002601700 +700203005 +009405200 +090000010 +007124800 +800050002 \ No newline at end of file diff --git a/mods/sudoku/lv3_58.txt b/mods/sudoku/lv3_58.txt new file mode 100644 index 0000000..f4baa3f --- /dev/null +++ b/mods/sudoku/lv3_58.txt @@ -0,0 +1,9 @@ +090060040 +050301090 +008705300 +800503009 +400000003 +700904006 +006208700 +080607030 +070010020 \ No newline at end of file diff --git a/mods/sudoku/lv3_59.txt b/mods/sudoku/lv3_59.txt new file mode 100644 index 0000000..85a783e --- /dev/null +++ b/mods/sudoku/lv3_59.txt @@ -0,0 +1,9 @@ +210050034 +000801000 +096000150 +100403002 +040000070 +300205006 +054000290 +000304000 +820090017 \ No newline at end of file diff --git a/mods/sudoku/lv3_6.txt b/mods/sudoku/lv3_6.txt new file mode 100644 index 0000000..3822b45 --- /dev/null +++ b/mods/sudoku/lv3_6.txt @@ -0,0 +1,9 @@ +420060000 +706350000 +503000070 +080071023 +000602000 +340890010 +030000802 +000023107 +000080045 \ No newline at end of file diff --git a/mods/sudoku/lv3_60.txt b/mods/sudoku/lv3_60.txt new file mode 100644 index 0000000..4415cd3 --- /dev/null +++ b/mods/sudoku/lv3_60.txt @@ -0,0 +1,9 @@ +300040002 +051000840 +060902010 +008403100 +020000030 +004207500 +010305080 +092000670 +800070001 \ No newline at end of file diff --git a/mods/sudoku/lv3_61.txt b/mods/sudoku/lv3_61.txt new file mode 100644 index 0000000..16783ab --- /dev/null +++ b/mods/sudoku/lv3_61.txt @@ -0,0 +1,9 @@ +021000540 +300050006 +007108300 +040705090 +800000002 +060403050 +002309100 +700040003 +034000270 \ No newline at end of file diff --git a/mods/sudoku/lv3_62.txt b/mods/sudoku/lv3_62.txt new file mode 100644 index 0000000..78d7d52 --- /dev/null +++ b/mods/sudoku/lv3_62.txt @@ -0,0 +1,9 @@ +008309100 +900060004 +007504800 +036000540 +001000600 +042000970 +005907300 +600010008 +004608200 \ No newline at end of file diff --git a/mods/sudoku/lv3_63.txt b/mods/sudoku/lv3_63.txt new file mode 100644 index 0000000..b496d35 --- /dev/null +++ b/mods/sudoku/lv3_63.txt @@ -0,0 +1,9 @@ +930000052 +000302000 +010040070 +005603200 +302407601 +001809700 +060030020 +000701000 +470000098 \ No newline at end of file diff --git a/mods/sudoku/lv3_64.txt b/mods/sudoku/lv3_64.txt new file mode 100644 index 0000000..8ff3353 --- /dev/null +++ b/mods/sudoku/lv3_64.txt @@ -0,0 +1,9 @@ +008431900 +060000010 +005702800 +040906080 +800000005 +010308070 +006209700 +030000020 +007543600 \ No newline at end of file diff --git a/mods/sudoku/lv3_65.txt b/mods/sudoku/lv3_65.txt new file mode 100644 index 0000000..c3d2530 --- /dev/null +++ b/mods/sudoku/lv3_65.txt @@ -0,0 +1,9 @@ +940206057 +000090000 +060507030 +700020005 +500109008 +600030004 +020804090 +000070000 +190602073 \ No newline at end of file diff --git a/mods/sudoku/lv3_66.txt b/mods/sudoku/lv3_66.txt new file mode 100644 index 0000000..5f77c3d --- /dev/null +++ b/mods/sudoku/lv3_66.txt @@ -0,0 +1,9 @@ +160080093 +090000080 +408000601 +009401300 +000509000 +001806200 +307000504 +080000070 +540060038 \ No newline at end of file diff --git a/mods/sudoku/lv3_67.txt b/mods/sudoku/lv3_67.txt new file mode 100644 index 0000000..427197d --- /dev/null +++ b/mods/sudoku/lv3_67.txt @@ -0,0 +1,9 @@ +200907005 +009000400 +005302900 +800794002 +060000040 +400621008 +008206300 +006000500 +900805001 \ No newline at end of file diff --git a/mods/sudoku/lv3_68.txt b/mods/sudoku/lv3_68.txt new file mode 100644 index 0000000..b574821 --- /dev/null +++ b/mods/sudoku/lv3_68.txt @@ -0,0 +1,9 @@ +045709630 +007108400 +060000020 +004206700 +000000000 +001304800 +050000010 +003905200 +016407580 \ No newline at end of file diff --git a/mods/sudoku/lv3_69.txt b/mods/sudoku/lv3_69.txt new file mode 100644 index 0000000..6d6d7fa --- /dev/null +++ b/mods/sudoku/lv3_69.txt @@ -0,0 +1,9 @@ +800902005 +000000000 +901476803 +010040030 +309000206 +080020090 +508364902 +000000000 +200705008 \ No newline at end of file diff --git a/mods/sudoku/lv3_7.txt b/mods/sudoku/lv3_7.txt new file mode 100644 index 0000000..a9f4092 --- /dev/null +++ b/mods/sudoku/lv3_7.txt @@ -0,0 +1,9 @@ +900005300 +050106040 +003080500 +000800062 +084502710 +230007000 +002040900 +060308020 +005700004 \ No newline at end of file diff --git a/mods/sudoku/lv3_70.txt b/mods/sudoku/lv3_70.txt new file mode 100644 index 0000000..c50cb43 --- /dev/null +++ b/mods/sudoku/lv3_70.txt @@ -0,0 +1,9 @@ +029000360 +704506108 +000090000 +003948200 +000000000 +005371800 +000010000 +908204703 +057000620 \ No newline at end of file diff --git a/mods/sudoku/lv3_71.txt b/mods/sudoku/lv3_71.txt new file mode 100644 index 0000000..37d6f64 --- /dev/null +++ b/mods/sudoku/lv3_71.txt @@ -0,0 +1,9 @@ +008000700 +100506009 +005804300 +809000106 +400103002 +207000904 +004308200 +600407003 +003000600 \ No newline at end of file diff --git a/mods/sudoku/lv3_72.txt b/mods/sudoku/lv3_72.txt new file mode 100644 index 0000000..8fbd33f --- /dev/null +++ b/mods/sudoku/lv3_72.txt @@ -0,0 +1,9 @@ +390502074 +002701600 +060000020 +100030008 +005000200 +200070005 +010000030 +003409700 +840306059 \ No newline at end of file diff --git a/mods/sudoku/lv3_73.txt b/mods/sudoku/lv3_73.txt new file mode 100644 index 0000000..05d9106 --- /dev/null +++ b/mods/sudoku/lv3_73.txt @@ -0,0 +1,9 @@ +010000040 +300010006 +802000903 +508070301 +006302500 +403090602 +704000208 +600040007 +030000050 \ No newline at end of file diff --git a/mods/sudoku/lv3_74.txt b/mods/sudoku/lv3_74.txt new file mode 100644 index 0000000..3b6b89d --- /dev/null +++ b/mods/sudoku/lv3_74.txt @@ -0,0 +1,9 @@ +006408500 +704203106 +080000020 +500040002 +060000050 +900030001 +010000090 +203701608 +005906300 \ No newline at end of file diff --git a/mods/sudoku/lv3_75.txt b/mods/sudoku/lv3_75.txt new file mode 100644 index 0000000..8e371b7 --- /dev/null +++ b/mods/sudoku/lv3_75.txt @@ -0,0 +1,9 @@ +601030502 +000020000 +009104300 +010807030 +064000950 +030506070 +006703800 +000080000 +802060703 \ No newline at end of file diff --git a/mods/sudoku/lv3_76.txt b/mods/sudoku/lv3_76.txt new file mode 100644 index 0000000..44ab423 --- /dev/null +++ b/mods/sudoku/lv3_76.txt @@ -0,0 +1,9 @@ +501000708 +000937000 +900000002 +240010079 +050406020 +180020065 +400000007 +000174000 +807000904 \ No newline at end of file diff --git a/mods/sudoku/lv3_77.txt b/mods/sudoku/lv3_77.txt new file mode 100644 index 0000000..1ed17b2 --- /dev/null +++ b/mods/sudoku/lv3_77.txt @@ -0,0 +1,9 @@ +029104350 +007000200 +050306070 +070090040 +006000900 +030080020 +090705010 +005000700 +041209680 \ No newline at end of file diff --git a/mods/sudoku/lv3_78.txt b/mods/sudoku/lv3_78.txt new file mode 100644 index 0000000..60e1559 --- /dev/null +++ b/mods/sudoku/lv3_78.txt @@ -0,0 +1,9 @@ +000000000 +702801604 +010907050 +035070490 +400000002 +028030710 +040102060 +506403801 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv3_79.txt b/mods/sudoku/lv3_79.txt new file mode 100644 index 0000000..40512e2 --- /dev/null +++ b/mods/sudoku/lv3_79.txt @@ -0,0 +1,9 @@ +900030007 +000892000 +040106090 +095000340 +410000075 +076000920 +080709050 +000321000 +700080002 \ No newline at end of file diff --git a/mods/sudoku/lv3_8.txt b/mods/sudoku/lv3_8.txt new file mode 100644 index 0000000..44acad4 --- /dev/null +++ b/mods/sudoku/lv3_8.txt @@ -0,0 +1,9 @@ +000073140 +040800700 +019004002 +000760089 +060000050 +980015000 +800100920 +004007010 +031280000 \ No newline at end of file diff --git a/mods/sudoku/lv3_80.txt b/mods/sudoku/lv3_80.txt new file mode 100644 index 0000000..4847809 --- /dev/null +++ b/mods/sudoku/lv3_80.txt @@ -0,0 +1,9 @@ +007040200 +190000084 +002108300 +800607009 +010000020 +300802006 +001904800 +430000071 +008030900 \ No newline at end of file diff --git a/mods/sudoku/lv3_81.txt b/mods/sudoku/lv3_81.txt new file mode 100644 index 0000000..4638e71 --- /dev/null +++ b/mods/sudoku/lv3_81.txt @@ -0,0 +1,9 @@ +005906700 +603080104 +200000009 +010879060 +000000000 +060125040 +400000003 +908010205 +001307400 \ No newline at end of file diff --git a/mods/sudoku/lv3_82.txt b/mods/sudoku/lv3_82.txt new file mode 100644 index 0000000..5943750 --- /dev/null +++ b/mods/sudoku/lv3_82.txt @@ -0,0 +1,9 @@ +100090008 +070346020 +003102900 +036000710 +000000000 +081000490 +007508100 +010927080 +900030005 \ No newline at end of file diff --git a/mods/sudoku/lv3_83.txt b/mods/sudoku/lv3_83.txt new file mode 100644 index 0000000..8bcad2d --- /dev/null +++ b/mods/sudoku/lv3_83.txt @@ -0,0 +1,9 @@ +040359020 +250408069 +000000000 +032060490 +000000000 +081030570 +000000000 +520906018 +010573040 \ No newline at end of file diff --git a/mods/sudoku/lv3_84.txt b/mods/sudoku/lv3_84.txt new file mode 100644 index 0000000..52f0b0b --- /dev/null +++ b/mods/sudoku/lv3_84.txt @@ -0,0 +1,9 @@ +200000007 +706905104 +050000020 +360504072 +000000000 +820307059 +010000090 +605209403 +900000006 \ No newline at end of file diff --git a/mods/sudoku/lv3_85.txt b/mods/sudoku/lv3_85.txt new file mode 100644 index 0000000..9856f85 --- /dev/null +++ b/mods/sudoku/lv3_85.txt @@ -0,0 +1,9 @@ +000629000 +470000092 +100000005 +690070018 +010905060 +280040073 +800000009 +750000036 +000453000 \ No newline at end of file diff --git a/mods/sudoku/lv3_86.txt b/mods/sudoku/lv3_86.txt new file mode 100644 index 0000000..69b1139 --- /dev/null +++ b/mods/sudoku/lv3_86.txt @@ -0,0 +1,9 @@ +004080300 +056907420 +200060008 +060040080 +300000004 +070090010 +100070002 +098403160 +003050900 \ No newline at end of file diff --git a/mods/sudoku/lv3_87.txt b/mods/sudoku/lv3_87.txt new file mode 100644 index 0000000..2e0fb12 --- /dev/null +++ b/mods/sudoku/lv3_87.txt @@ -0,0 +1,9 @@ +008409100 +000702000 +205000704 +300984005 +009000600 +400236009 +504000901 +000803000 +007105300 \ No newline at end of file diff --git a/mods/sudoku/lv3_88.txt b/mods/sudoku/lv3_88.txt new file mode 100644 index 0000000..00bf0c0 --- /dev/null +++ b/mods/sudoku/lv3_88.txt @@ -0,0 +1,9 @@ +028709460 +000814000 +500000009 +107000904 +000102000 +402000803 +200000006 +000496000 +089301540 \ No newline at end of file diff --git a/mods/sudoku/lv3_89.txt b/mods/sudoku/lv3_89.txt new file mode 100644 index 0000000..b6c317b --- /dev/null +++ b/mods/sudoku/lv3_89.txt @@ -0,0 +1,9 @@ +090020040 +100907005 +070000060 +049705810 +006000200 +083602450 +030000020 +900108003 +050060090 \ No newline at end of file diff --git a/mods/sudoku/lv3_9.txt b/mods/sudoku/lv3_9.txt new file mode 100644 index 0000000..c35d47a --- /dev/null +++ b/mods/sudoku/lv3_9.txt @@ -0,0 +1,9 @@ +090080300 +504023600 +300700500 +000804050 +038000160 +060309000 +006002007 +002170806 +003090040 \ No newline at end of file diff --git a/mods/sudoku/lv3_90.txt b/mods/sudoku/lv3_90.txt new file mode 100644 index 0000000..fa65dff --- /dev/null +++ b/mods/sudoku/lv3_90.txt @@ -0,0 +1,9 @@ +070105090 +500306002 +100000004 +602010809 +090000050 +405090203 +900000005 +800409007 +050207040 \ No newline at end of file diff --git a/mods/sudoku/lv3_91.txt b/mods/sudoku/lv3_91.txt new file mode 100644 index 0000000..f7d1bfa --- /dev/null +++ b/mods/sudoku/lv3_91.txt @@ -0,0 +1,9 @@ +900605003 +005802700 +120000095 +060040030 +000703000 +080050010 +250000074 +004507900 +800401002 \ No newline at end of file diff --git a/mods/sudoku/lv3_92.txt b/mods/sudoku/lv3_92.txt new file mode 100644 index 0000000..cb2c7ef --- /dev/null +++ b/mods/sudoku/lv3_92.txt @@ -0,0 +1,9 @@ +010205030 +030000050 +005901700 +920508046 +000000000 +840609017 +004306800 +060000090 +050407020 \ No newline at end of file diff --git a/mods/sudoku/lv3_93.txt b/mods/sudoku/lv3_93.txt new file mode 100644 index 0000000..acceef6 --- /dev/null +++ b/mods/sudoku/lv3_93.txt @@ -0,0 +1,9 @@ +708000106 +000806000 +090070030 +087060410 +306000207 +024090560 +030020080 +000107000 +809000601 \ No newline at end of file diff --git a/mods/sudoku/lv3_94.txt b/mods/sudoku/lv3_94.txt new file mode 100644 index 0000000..65b17b9 --- /dev/null +++ b/mods/sudoku/lv3_94.txt @@ -0,0 +1,9 @@ +000040000 +060709020 +008506700 +021403670 +007000800 +086205490 +002107900 +010902050 +000030000 \ No newline at end of file diff --git a/mods/sudoku/lv3_95.txt b/mods/sudoku/lv3_95.txt new file mode 100644 index 0000000..f426fd8 --- /dev/null +++ b/mods/sudoku/lv3_95.txt @@ -0,0 +1,9 @@ +720000014 +300040009 +001000600 +102607408 +005000900 +904105203 +003000100 +500020007 +860000042 \ No newline at end of file diff --git a/mods/sudoku/lv3_96.txt b/mods/sudoku/lv3_96.txt new file mode 100644 index 0000000..cb543ad --- /dev/null +++ b/mods/sudoku/lv3_96.txt @@ -0,0 +1,9 @@ +170000064 +002000800 +005907100 +400386005 +080000030 +500794006 +007103500 +008000600 +910000072 \ No newline at end of file diff --git a/mods/sudoku/lv3_97.txt b/mods/sudoku/lv3_97.txt new file mode 100644 index 0000000..efdaea6 --- /dev/null +++ b/mods/sudoku/lv3_97.txt @@ -0,0 +1,9 @@ +702406805 +510000092 +000050000 +900208001 +080000020 +300504007 +000030000 +650000073 +103805904 \ No newline at end of file diff --git a/mods/sudoku/lv3_98.txt b/mods/sudoku/lv3_98.txt new file mode 100644 index 0000000..254815d --- /dev/null +++ b/mods/sudoku/lv3_98.txt @@ -0,0 +1,9 @@ +009000300 +020050070 +600209004 +407103509 +010000040 +205608703 +100904008 +030080060 +008000100 \ No newline at end of file diff --git a/mods/sudoku/lv3_99.txt b/mods/sudoku/lv3_99.txt new file mode 100644 index 0000000..4c85f69 --- /dev/null +++ b/mods/sudoku/lv3_99.txt @@ -0,0 +1,9 @@ +008000200 +300080005 +002107900 +209605703 +030000040 +604702109 +007403800 +400020001 +006000300 \ No newline at end of file diff --git a/mods/sudoku/textures/sudoku_1_1.png b/mods/sudoku/textures/sudoku_1_1.png new file mode 100644 index 0000000..212b5e7 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_1.png differ diff --git a/mods/sudoku/textures/sudoku_1_2.png b/mods/sudoku/textures/sudoku_1_2.png new file mode 100644 index 0000000..9228cad Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_2.png differ diff --git a/mods/sudoku/textures/sudoku_1_3.png b/mods/sudoku/textures/sudoku_1_3.png new file mode 100644 index 0000000..b344abe Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_3.png differ diff --git a/mods/sudoku/textures/sudoku_1_4.png b/mods/sudoku/textures/sudoku_1_4.png new file mode 100644 index 0000000..b723821 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_4.png differ diff --git a/mods/sudoku/textures/sudoku_1_5.png b/mods/sudoku/textures/sudoku_1_5.png new file mode 100644 index 0000000..7081427 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_5.png differ diff --git a/mods/sudoku/textures/sudoku_1_6.png b/mods/sudoku/textures/sudoku_1_6.png new file mode 100644 index 0000000..47132e1 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_6.png differ diff --git a/mods/sudoku/textures/sudoku_1_7.png b/mods/sudoku/textures/sudoku_1_7.png new file mode 100644 index 0000000..1924423 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_7.png differ diff --git a/mods/sudoku/textures/sudoku_1_8.png b/mods/sudoku/textures/sudoku_1_8.png new file mode 100644 index 0000000..65f3d52 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_8.png differ diff --git a/mods/sudoku/textures/sudoku_1_9.png b/mods/sudoku/textures/sudoku_1_9.png new file mode 100644 index 0000000..341fbc1 Binary files /dev/null and b/mods/sudoku/textures/sudoku_1_9.png differ diff --git a/mods/sudoku/textures/sudoku_2_1.png b/mods/sudoku/textures/sudoku_2_1.png new file mode 100644 index 0000000..35a5b6a Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_1.png differ diff --git a/mods/sudoku/textures/sudoku_2_2.png b/mods/sudoku/textures/sudoku_2_2.png new file mode 100644 index 0000000..7b49aea Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_2.png differ diff --git a/mods/sudoku/textures/sudoku_2_3.png b/mods/sudoku/textures/sudoku_2_3.png new file mode 100644 index 0000000..fca911d Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_3.png differ diff --git a/mods/sudoku/textures/sudoku_2_4.png b/mods/sudoku/textures/sudoku_2_4.png new file mode 100644 index 0000000..9777907 Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_4.png differ diff --git a/mods/sudoku/textures/sudoku_2_5.png b/mods/sudoku/textures/sudoku_2_5.png new file mode 100644 index 0000000..da1ea01 Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_5.png differ diff --git a/mods/sudoku/textures/sudoku_2_6.png b/mods/sudoku/textures/sudoku_2_6.png new file mode 100644 index 0000000..85c9510 Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_6.png differ diff --git a/mods/sudoku/textures/sudoku_2_7.png b/mods/sudoku/textures/sudoku_2_7.png new file mode 100644 index 0000000..04c1db0 Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_7.png differ diff --git a/mods/sudoku/textures/sudoku_2_8.png b/mods/sudoku/textures/sudoku_2_8.png new file mode 100644 index 0000000..f0c192f Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_8.png differ diff --git a/mods/sudoku/textures/sudoku_2_9.png b/mods/sudoku/textures/sudoku_2_9.png new file mode 100644 index 0000000..7580296 Binary files /dev/null and b/mods/sudoku/textures/sudoku_2_9.png differ diff --git a/mods/sudoku/textures/sudoku_black.png b/mods/sudoku/textures/sudoku_black.png new file mode 100644 index 0000000..e977c86 Binary files /dev/null and b/mods/sudoku/textures/sudoku_black.png differ diff --git a/mods/sudoku/textures/sudoku_finisch.png b/mods/sudoku/textures/sudoku_finisch.png new file mode 100644 index 0000000..5f8ffc4 Binary files /dev/null and b/mods/sudoku/textures/sudoku_finisch.png differ diff --git a/mods/sudoku/textures/sudoku_glass.png b/mods/sudoku/textures/sudoku_glass.png new file mode 100644 index 0000000..b2210ef Binary files /dev/null and b/mods/sudoku/textures/sudoku_glass.png differ diff --git a/mods/sudoku/textures/sudoku_gray.png b/mods/sudoku/textures/sudoku_gray.png new file mode 100644 index 0000000..b98f062 Binary files /dev/null and b/mods/sudoku/textures/sudoku_gray.png differ diff --git a/mods/sudoku/textures/sudoku_new_w1.png b/mods/sudoku/textures/sudoku_new_w1.png new file mode 100644 index 0000000..5dfb8d4 Binary files /dev/null and b/mods/sudoku/textures/sudoku_new_w1.png differ diff --git a/mods/sudoku/textures/sudoku_new_w2.png b/mods/sudoku/textures/sudoku_new_w2.png new file mode 100644 index 0000000..a409808 Binary files /dev/null and b/mods/sudoku/textures/sudoku_new_w2.png differ diff --git a/mods/sudoku/textures/sudoku_new_w3.png b/mods/sudoku/textures/sudoku_new_w3.png new file mode 100644 index 0000000..5eee0a3 Binary files /dev/null and b/mods/sudoku/textures/sudoku_new_w3.png differ diff --git a/mods/sudoku/textures/sudoku_new_w4.png b/mods/sudoku/textures/sudoku_new_w4.png new file mode 100644 index 0000000..0cc29c2 Binary files /dev/null and b/mods/sudoku/textures/sudoku_new_w4.png differ diff --git a/mods/sudoku/textures/sudoku_new_w5.png b/mods/sudoku/textures/sudoku_new_w5.png new file mode 100644 index 0000000..39390d5 Binary files /dev/null and b/mods/sudoku/textures/sudoku_new_w5.png differ diff --git a/mods/sudoku/textures/sudoku_new_ws.png b/mods/sudoku/textures/sudoku_new_ws.png new file mode 100644 index 0000000..b868082 Binary files /dev/null and b/mods/sudoku/textures/sudoku_new_ws.png differ diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt new file mode 100644 index 0000000..4e74841 --- /dev/null +++ b/mods/tnt/README.txt @@ -0,0 +1,44 @@ +Minetest Game mod: tnt +====================== +See license.txt for license information. + +Authors of source code +---------------------- +PilzAdam (MIT) +ShadowNinja (MIT) +sofar (sofar@foo-projects.org) (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +BlockMen (CC BY-SA 3.0): +All textures not mentioned below. + +ShadowNinja (CC BY-SA 3.0): +tnt_smoke.png + +Wuzzy (CC BY-SA 3.0): +All gunpowder textures except tnt_gunpowder_inventory.png. + +sofar (sofar@foo-projects.org) (CC BY-SA 3.0): +tnt_blast.png + +Introduction +------------ +This mod adds TNT to Minetest. TNT is a tool to help the player +in mining. + +How to use the mod: +Craft gunpowder by placing coal and gravel in the crafting area. +The gunpowder can be used to craft TNT or as fuse for TNT. +To craft TNT place items like this: +-- wood - gunpowder -- wood - +gunpowder gunpowder gunpowder +-- wood - gunpowder -- wood - + +There are different ways to blow up TNT: + 1. Hit it with a torch. + 2. Hit a gunpowder fuse that leads to a TNT block with a torch or flint-and-steel. + 3. Activate it with mesecons (fastest way). + +Be aware of the damage radius of 6 blocks! diff --git a/mods/tnt/depends.txt b/mods/tnt/depends.txt new file mode 100644 index 0000000..5ff216f --- /dev/null +++ b/mods/tnt/depends.txt @@ -0,0 +1,3 @@ +default +fire + diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua new file mode 100644 index 0000000..f54b2f1 --- /dev/null +++ b/mods/tnt/init.lua @@ -0,0 +1,645 @@ +tnt = {} + +-- Default to enabled when in singleplayer +local enable_tnt = minetest.settings:get_bool("enable_tnt") +if enable_tnt == nil then + enable_tnt = minetest.is_singleplayer() +end + +-- loss probabilities array (one in X will be lost) +local loss_prob = {} + +loss_prob["default:cobble"] = 3 +loss_prob["default:dirt"] = 4 + +local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3) + +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.after(0, function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + on_blast = def.on_blast, + } + end +end) + +local function rand_pos(center, pos, radius) + local def + local reg_nodes = minetest.registered_nodes + local i = 0 + repeat + -- Give up and use the center if this takes too long + if i > 4 then + pos.x, pos.z = center.x, center.z + break + end + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) + def = reg_nodes[minetest.get_node(pos).name] + i = i + 1 + until def and not def.walkable +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + for _, item in pairs(drops) do + local count = math.min(item:get_count(), item:get_stack_max()) + while count > 0 do + local take = math.max(1,math.min(radius * radius, + count, + item:get_stack_max())) + rand_pos(pos, drop_pos, radius) + local dropitem = ItemStack(item) + dropitem:set_count(take) + local obj = minetest.add_item(drop_pos, dropitem) + if obj then + obj:get_luaentity().collect = true + obj:setacceleration({x = 0, y = -10, z = 0}) + obj:setvelocity({x = math.random(-3, 3), + y = math.random(0, 10), + z = math.random(-3, 3)}) + end + count = count - take + end + end +end + +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return + end + + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local basic_flame_on_construct -- cached value +local function destroy(drops, npos, cid, c_air, c_fire, + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast) + if not ignore_protection and minetest.is_protected(npos, "") then + return cid + end + + local def = cid_data[cid] + + if not def then + return c_air + elseif not ignore_on_blast and def.on_blast then + on_blast_queue[#on_blast_queue + 1] = { + pos = vector.new(npos), + on_blast = def.on_blast + } + return cid + elseif def.flammable then + on_construct_queue[#on_construct_queue + 1] = { + fn = basic_flame_on_construct, + pos = vector.new(npos) + } + return c_fire + else + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + return c_air + end +end + +local function calc_velocity(pos1, pos2, old_vel, power) + -- Avoid errors caused by a vector of zero length + if vector.equals(pos1, pos2) then + return old_vel + end + + local vel = vector.direction(pos1, pos2) + vel = vector.normalize(vel) + vel = vector.multiply(vel, power) + + -- Divide by distance + local dist = vector.distance(pos1, pos2) + dist = math.max(dist, 1) + vel = vector.divide(vel, dist) + + -- Add old velocity + vel = vector.add(vel, old_vel) + + -- randomize it a bit + vel = vector.add(vel, { + x = math.random() - 0.5, + y = math.random() - 0.5, + z = math.random() - 0.5, + }) + + -- Limit to terminal velocity + dist = vector.length(vel) + if dist > 250 then + vel = vector.divide(vel, dist / 250) + end + return vel +end + +local function entity_physics(pos, radius, drops) + local objs = minetest.get_objects_inside_radius(pos, radius) + for _, obj in pairs(objs) do + local obj_pos = obj:getpos() + local dist = math.max(1, vector.distance(pos, obj_pos)) + + local damage = (4 / dist) * radius + if obj:is_player() then + -- currently the engine has no method to set + -- player velocity. See #2960 + -- instead, we knock the player back 1.0 node, and slightly upwards + local dir = vector.normalize(vector.subtract(obj_pos, pos)) + local moveoff = vector.multiply(dir, dist + 1.0) + local newpos = vector.add(pos, moveoff) + newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0}) + obj:setpos(newpos) + + obj:set_hp(obj:get_hp() - damage) + else + local do_damage = true + local do_knockback = true + local entity_drops = {} + local luaobj = obj:get_luaentity() + local objdef = minetest.registered_entities[luaobj.name] + + if objdef and objdef.on_blast then + do_damage, do_knockback, entity_drops = objdef.on_blast(luaobj, damage) + end + + if do_knockback then + local obj_vel = obj:getvelocity() + obj:setvelocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + if do_damage then + if not obj:get_armor_groups().immortal then + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + end + end + for _, item in pairs(entity_drops) do + add_drop(drops, item) + end + end + end +end + +local function add_effects(pos, radius, drops) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = radius * 10, + collisiondetection = false, + vertical = false, + texture = "tnt_boom.png", + }) + minetest.add_particlespawner({ + amount = 64, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 2.5, + minsize = radius * 3, + maxsize = radius * 5, + texture = "tnt_smoke.png", + }) + + -- we just dropped some items. Look at the items entities and pick + -- one of them to use as texture + local texture = "tnt_blast.png" --fallback texture + local most = 0 + for name, stack in pairs(drops) do + local count = stack:get_count() + if count > most then + most = count + local def = minetest.registered_nodes[name] + if def and def.tiles and def.tiles[1] then + texture = def.tiles[1] + end + end + end + + minetest.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -3, y = 0, z = -3}, + maxvel = {x = 3, y = 5, z = 3}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = radius * 0.66, + maxsize = radius * 2, + texture = texture, + collisiondetection = true, + }) +end + +function tnt.burn(pos, nodename) + local name = nodename or minetest.get_node(pos).name + local def = minetest.registered_nodes[name] + if not def then + return + elseif def.on_ignite then + def.on_ignite(pos) + elseif minetest.get_item_group(name, "tnt") > 0 then + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.set_node(pos, {name = name .. "_burning"}) + minetest.get_node_timer(pos):start(1) + end +end + +local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) + pos = vector.round(pos) + -- scan for adjacent TNT nodes first, and enlarge the explosion + local vm1 = VoxelManip() + local p1 = vector.subtract(pos, 2) + local p2 = vector.add(pos, 2) + local minp, maxp = vm1:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm1:get_data() + local count = 0 + local c_tnt = minetest.get_content_id("tnt:tnt") + local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") + local c_tnt_boom = minetest.get_content_id("tnt:boom") + local c_air = minetest.get_content_id("air") + + for z = pos.z - 2, pos.z + 2 do + for y = pos.y - 2, pos.y + 2 do + local vi = a:index(pos.x - 2, y, z) + for x = pos.x - 2, pos.x + 2 do + local cid = data[vi] + if cid == c_tnt or cid == c_tnt_boom or cid == c_tnt_burning then + count = count + 1 + data[vi] = c_air + end + vi = vi + 1 + end + end + end + + vm1:set_data(data) + vm1:write_to_map() + + -- recalculate new radius + radius = math.floor(radius * math.pow(count, 1/3)) + + -- perform the explosion + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + p1 = vector.subtract(pos, radius) + p2 = vector.add(pos, radius) + minp, maxp = vm:read_from_map(p1, p2) + a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + data = vm:get_data() + + local drops = {} + local on_blast_queue = {} + local on_construct_queue = {} + basic_flame_on_construct = minetest.registered_nodes["fire:basic_flame"].on_construct + + local c_fire = minetest.get_content_id("fire:basic_flame") + for z = -radius, radius do + for y = -radius, radius do + local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + for x = -radius, radius do + local r = vector.length(vector.new(x, y, z)) + if (radius * radius) / (r * r) >= (pr:next(80, 125) / 100) then + local cid = data[vi] + local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} + if cid ~= c_air then + data[vi] = destroy(drops, p, cid, c_air, c_fire, + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast) + end + end + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() + vm:update_liquids() + + -- call check_single_for_falling for everything within 1.5x blast radius + for y = -radius * 1.5, radius * 1.5 do + for z = -radius * 1.5, radius * 1.5 do + for x = -radius * 1.5, radius * 1.5 do + local rad = {x = x, y = y, z = z} + local s = vector.add(pos, rad) + local r = vector.length(rad) + if r / radius < 1.4 then + minetest.check_single_for_falling(s) + end + end + end + end + + for _, queued_data in pairs(on_blast_queue) do + local dist = math.max(1, vector.distance(queued_data.pos, pos)) + local intensity = (radius * radius) / (dist * dist) + local node_drops = queued_data.on_blast(queued_data.pos, intensity) + if node_drops then + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + end + end + + for _, queued_data in pairs(on_construct_queue) do + queued_data.fn(queued_data.pos) + end + + return drops, radius +end + +function tnt.boom(pos, def) + minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) + minetest.set_node(pos, {name = "tnt:boom"}) + local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, + def.ignore_on_blast) + -- append entity drops + local damage_radius = (radius / def.radius) * def.damage_radius + entity_physics(pos, damage_radius, drops) + if not def.disable_drops then + eject_drops(drops, pos, radius) + end + add_effects(pos, radius, drops) + minetest.log("action", "A TNT explosion occurred at " .. minetest.pos_to_string(pos) .. + " with radius " .. radius) +end + +minetest.register_node("tnt:boom", { + drawtype = "airlike", + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate = 3}, + on_construct = function(pos) + minetest.get_node_timer(pos):start(0.4) + end, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, +}) + +minetest.register_node("tnt:gunpowder", { + description = "Gun Powder", + drawtype = "raillike", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + tiles = { + "tnt_gunpowder_straight.png", + "tnt_gunpowder_curved.png", + "tnt_gunpowder_t_junction.png", + "tnt_gunpowder_crossing.png" + }, + inventory_image = "tnt_gunpowder_inventory.png", + wield_image = "tnt_gunpowder_inventory.png", + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {dig_immediate = 2, attached_node = 1, flammable = 5, + connect_to_raillike = minetest.raillike_group("gunpowder")}, + sounds = default.node_sound_leaves_defaults(), + + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + minetest.log("action", puncher:get_player_name() .. + " ignites tnt:gunpowder at " .. + minetest.pos_to_string(pos)) + end + end, + on_blast = function(pos, intensity) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, + on_burn = function(pos) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, + on_ignite = function(pos, igniter) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, +}) + +minetest.register_node("tnt:gunpowder_burning", { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + light_source = 5, + tiles = {{ + name = "tnt_gunpowder_burning_straight_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_curved_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_t_junction_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_crossing_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }}, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + drop = "", + groups = { + dig_immediate = 2, + attached_node = 1, + connect_to_raillike = minetest.raillike_group("gunpowder") + }, + sounds = default.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + for dx = -1, 1 do + for dz = -1, 1 do + for dy = -1, 1 do + if not (dx == 0 and dz == 0) then + tnt.burn({ + x = pos.x + dx, + y = pos.y + dy, + z = pos.z + dz, + }) + end + end + end + end + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_gunpowder_burning", {pos = pos, gain = 2}) + minetest.get_node_timer(pos):start(1) + end, +}) + +minetest.register_craft({ + output = "tnt:gunpowder 5", + type = "shapeless", + recipe = {"default:coal_lump", "default:gravel"} +}) + +if enable_tnt then + minetest.register_craft({ + output = "tnt:tnt", + recipe = { + {"group:wood", "tnt:gunpowder", "group:wood"}, + {"tnt:gunpowder", "tnt:gunpowder", "tnt:gunpowder"}, + {"group:wood", "tnt:gunpowder", "group:wood"} + } + }) + + minetest.register_abm({ + label = "TNT ignition", + nodenames = {"group:tnt", "tnt:gunpowder"}, + neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, + interval = 4, + chance = 1, + action = function(pos, node) + tnt.burn(pos, node.name) + end, + }) +end + +function tnt.register_tnt(def) + local name + if not def.name:find(':') then + name = "tnt:" .. def.name + else + name = def.name + def.name = def.name:match(":([%w_]+)") + end + if not def.tiles then def.tiles = {} end + local tnt_top = def.tiles.top or def.name .. "_top.png" + local tnt_bottom = def.tiles.bottom or def.name .. "_bottom.png" + local tnt_side = def.tiles.side or def.name .. "_side.png" + local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png" + if not def.damage_radius then def.damage_radius = def.radius * 2 end + + if enable_tnt then + minetest.register_node(":" .. name, { + description = def.description, + tiles = {tnt_top, tnt_bottom, tnt_side}, + is_ground_content = false, + groups = {dig_immediate = 2, mesecon = 2, tnt = 1, flammable = 5}, + sounds = default.node_sound_wood_defaults(), + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.set_node(pos, {name = name .. "_burning"}) + minetest.log("action", puncher:get_player_name() .. + " ignites " .. node.name .. " at " .. + minetest.pos_to_string(pos)) + end + end, + on_blast = function(pos, intensity) + minetest.after(0.1, function() + tnt.boom(pos, def) + end) + end, + mesecons = {effector = + {action_on = + function(pos) + tnt.boom(pos, def) + end + } + }, + on_burn = function(pos) + minetest.set_node(pos, {name = name .. "_burning"}) + end, + on_ignite = function(pos, igniter) + minetest.set_node(pos, {name = name .. "_burning"}) + end, + }) + end + + minetest.register_node(":" .. name .. "_burning", { + tiles = { + { + name = tnt_burning, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + tnt_bottom, tnt_side + }, + light_source = 5, + drop = "", + sounds = default.node_sound_wood_defaults(), + groups = {falling_node = 1}, + on_timer = function(pos, elapsed) + tnt.boom(pos, def) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.get_node_timer(pos):start(4) + minetest.check_for_falling(pos) + end, + }) +end + +tnt.register_tnt({ + name = "tnt:tnt", + description = "TNT", + radius = tnt_radius, +}) diff --git a/mods/tnt/license.txt b/mods/tnt/license.txt new file mode 100644 index 0000000..210f2bd --- /dev/null +++ b/mods/tnt/license.txt @@ -0,0 +1,65 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 PilzAdam +Copyright (C) 2014-2016 ShadowNinja +Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2014-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 ShadowNinja +Copyright (C) 2015-2016 Wuzzy +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/tnt/sounds/tnt_explode.ogg b/mods/tnt/sounds/tnt_explode.ogg new file mode 100644 index 0000000..a414ea0 Binary files /dev/null and b/mods/tnt/sounds/tnt_explode.ogg differ diff --git a/mods/tnt/sounds/tnt_gunpowder_burning.ogg b/mods/tnt/sounds/tnt_gunpowder_burning.ogg new file mode 100644 index 0000000..5c5bfaf Binary files /dev/null and b/mods/tnt/sounds/tnt_gunpowder_burning.ogg differ diff --git a/mods/tnt/sounds/tnt_ignite.ogg b/mods/tnt/sounds/tnt_ignite.ogg new file mode 100644 index 0000000..199f206 Binary files /dev/null and b/mods/tnt/sounds/tnt_ignite.ogg differ diff --git a/mods/tnt/textures/tnt_blast.png b/mods/tnt/textures/tnt_blast.png new file mode 100644 index 0000000..bbb1096 Binary files /dev/null and b/mods/tnt/textures/tnt_blast.png differ diff --git a/mods/tnt/textures/tnt_boom.png b/mods/tnt/textures/tnt_boom.png new file mode 100644 index 0000000..c848bfc Binary files /dev/null and b/mods/tnt/textures/tnt_boom.png differ diff --git a/mods/tnt/textures/tnt_bottom.png b/mods/tnt/textures/tnt_bottom.png new file mode 100644 index 0000000..95f66cb Binary files /dev/null and b/mods/tnt/textures/tnt_bottom.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png new file mode 100644 index 0000000..a901f7b Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png new file mode 100644 index 0000000..bc01806 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png new file mode 100644 index 0000000..c860ace Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png new file mode 100644 index 0000000..a556072 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_crossing.png b/mods/tnt/textures/tnt_gunpowder_crossing.png new file mode 100644 index 0000000..916c84e Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_crossing.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_curved.png b/mods/tnt/textures/tnt_gunpowder_curved.png new file mode 100644 index 0000000..cb8b4ea Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_curved.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_inventory.png b/mods/tnt/textures/tnt_gunpowder_inventory.png new file mode 100644 index 0000000..105a2d2 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_inventory.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_straight.png b/mods/tnt/textures/tnt_gunpowder_straight.png new file mode 100644 index 0000000..8ab0e3c Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_straight.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_t_junction.png b/mods/tnt/textures/tnt_gunpowder_t_junction.png new file mode 100644 index 0000000..ac997a7 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_t_junction.png differ diff --git a/mods/tnt/textures/tnt_side.png b/mods/tnt/textures/tnt_side.png new file mode 100644 index 0000000..d303473 Binary files /dev/null and b/mods/tnt/textures/tnt_side.png differ diff --git a/mods/tnt/textures/tnt_smoke.png b/mods/tnt/textures/tnt_smoke.png new file mode 100644 index 0000000..488b50f Binary files /dev/null and b/mods/tnt/textures/tnt_smoke.png differ diff --git a/mods/tnt/textures/tnt_top.png b/mods/tnt/textures/tnt_top.png new file mode 100644 index 0000000..31b807c Binary files /dev/null and b/mods/tnt/textures/tnt_top.png differ diff --git a/mods/tnt/textures/tnt_top_burning.png b/mods/tnt/textures/tnt_top_burning.png new file mode 100644 index 0000000..fc0d490 Binary files /dev/null and b/mods/tnt/textures/tnt_top_burning.png differ diff --git a/mods/tnt/textures/tnt_top_burning_animated.png b/mods/tnt/textures/tnt_top_burning_animated.png new file mode 100644 index 0000000..18a270f Binary files /dev/null and b/mods/tnt/textures/tnt_top_burning_animated.png differ diff --git a/mods/vessels/README.txt b/mods/vessels/README.txt new file mode 100644 index 0000000..5bb798c --- /dev/null +++ b/mods/vessels/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: vessels +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Vanessa Ezekowitz (LGPL 2.1) +Modified by Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (textures) +--------------------------- +All not listed below, Vanessa Ezekowitz (CC BY-SA 3.0) + +The following textures were modified by Thomas-S (CC BY-SA 3.0): + vessels_drinking_glass.png + vessels_drinking_glass_inv.png + vessels_glass_bottle.png + vessels_steel_bottle.png + +The following texture was created by Wuzzy (CC BY-SA 3.0): + vessels_shelf_slot.png (based on vessels_glass_bottle.png) diff --git a/mods/vessels/depends.txt b/mods/vessels/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/vessels/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua new file mode 100644 index 0000000..688413f --- /dev/null +++ b/mods/vessels/init.lua @@ -0,0 +1,216 @@ +-- Minetest 0.4 mod: vessels +-- See README.txt for licensing and other information. + +local vessels_shelf_formspec = + "size[8,7;]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[context;vessels;0,0.3;8,2;]" .. + "list[current_player;main;0,2.85;8,1;]" .. + "list[current_player;main;0,4.08;8,3;8]" .. + "listring[context;vessels]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0, 2.85) + +local function get_vessels_shelf_formspec(inv) + local formspec = vessels_shelf_formspec + local invlist = inv and inv:get_list("vessels") + -- Inventory slots overlay + local vx, vy = 0, 0.3 + for i = 1, 16 do + if i == 9 then + vx = 0 + vy = vy + 1 + end + if not invlist or invlist[i]:is_empty() then + formspec = formspec .. + "image[" .. vx .. "," .. vy .. ";1,1;vessels_shelf_slot.png]" + end + vx = vx + 1 + end + return formspec +end + +minetest.register_node("vessels:shelf", { + description = "Vessels Shelf", + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "vessels_shelf.png", "vessels_shelf.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_vessels_shelf_formspec(nil)) + local inv = meta:get_inventory() + inv:set_size("vessels", 8 * 2) + end, + can_dig = function(pos,player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("vessels") + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.get_item_group(stack:get_name(), "vessel") ~= 0 then + return stack:get_count() + end + return 0 + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name() .. + " moves stuff in vessels shelf at ".. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_vessels_shelf_formspec(meta:get_inventory())) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves stuff to vessels shelf at ".. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_vessels_shelf_formspec(meta:get_inventory())) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes stuff from vessels shelf at ".. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_vessels_shelf_formspec(meta:get_inventory())) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "vessels", drops) + drops[#drops + 1] = "vessels:shelf" + minetest.remove_node(pos) + return drops + end, +}) + +minetest.register_craft({ + output = "vessels:shelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:vessel", "group:vessel", "group:vessel"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_node("vessels:glass_bottle", { + description = "Glass Bottle (empty)", + drawtype = "plantlike", + tiles = {"vessels_glass_bottle.png"}, + inventory_image = "vessels_glass_bottle.png", + wield_image = "vessels_glass_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:glass_bottle 10", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "", "default:glass"}, + {"", "default:glass", ""} + } +}) + +minetest.register_node("vessels:drinking_glass", { + description = "Drinking Glass (empty)", + drawtype = "plantlike", + tiles = {"vessels_drinking_glass.png"}, + inventory_image = "vessels_drinking_glass_inv.png", + wield_image = "vessels_drinking_glass.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:drinking_glass 14", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "", "default:glass"}, + {"default:glass", "default:glass", "default:glass"} + } +}) + +minetest.register_node("vessels:steel_bottle", { + description = "Heavy Steel Bottle (empty)", + drawtype = "plantlike", + tiles = {"vessels_steel_bottle.png"}, + inventory_image = "vessels_steel_bottle.png", + wield_image = "vessels_steel_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft( { + output = "vessels:steel_bottle 5", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""} + } +}) + + +-- Glass and steel recycling + +minetest.register_craftitem("vessels:glass_fragments", { + description = "Pile of Glass Fragments", + inventory_image = "vessels_glass_fragments.png", +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:glass_bottle", + "vessels:glass_bottle", + }, +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:drinking_glass", + "vessels:drinking_glass", + }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "vessels:glass_fragments", +}) + +minetest.register_craft( { + type = "cooking", + output = "default:steel_ingot", + recipe = "vessels:steel_bottle", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "vessels:shelf", + burntime = 30, +}) diff --git a/mods/vessels/license.txt b/mods/vessels/license.txt new file mode 100644 index 0000000..de16a3b --- /dev/null +++ b/mods/vessels/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 Vanessa Ezekowitz +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Vanessa Ezekowitz +Copyright (C) 2016 Thomas-S + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/vessels/textures/vessels_drinking_glass.png b/mods/vessels/textures/vessels_drinking_glass.png new file mode 100644 index 0000000..d5037b8 Binary files /dev/null and b/mods/vessels/textures/vessels_drinking_glass.png differ diff --git a/mods/vessels/textures/vessels_drinking_glass_inv.png b/mods/vessels/textures/vessels_drinking_glass_inv.png new file mode 100644 index 0000000..9992bd9 Binary files /dev/null and b/mods/vessels/textures/vessels_drinking_glass_inv.png differ diff --git a/mods/vessels/textures/vessels_glass_bottle.png b/mods/vessels/textures/vessels_glass_bottle.png new file mode 100644 index 0000000..6ea37db Binary files /dev/null and b/mods/vessels/textures/vessels_glass_bottle.png differ diff --git a/mods/vessels/textures/vessels_glass_fragments.png b/mods/vessels/textures/vessels_glass_fragments.png new file mode 100644 index 0000000..7c6c488 Binary files /dev/null and b/mods/vessels/textures/vessels_glass_fragments.png differ diff --git a/mods/vessels/textures/vessels_shelf.png b/mods/vessels/textures/vessels_shelf.png new file mode 100644 index 0000000..87c69b2 Binary files /dev/null and b/mods/vessels/textures/vessels_shelf.png differ diff --git a/mods/vessels/textures/vessels_shelf_slot.png b/mods/vessels/textures/vessels_shelf_slot.png new file mode 100644 index 0000000..ff29082 Binary files /dev/null and b/mods/vessels/textures/vessels_shelf_slot.png differ diff --git a/mods/vessels/textures/vessels_steel_bottle.png b/mods/vessels/textures/vessels_steel_bottle.png new file mode 100644 index 0000000..61d3071 Binary files /dev/null and b/mods/vessels/textures/vessels_steel_bottle.png differ diff --git a/mods/walls/README.txt b/mods/walls/README.txt new file mode 100644 index 0000000..0389174 --- /dev/null +++ b/mods/walls/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: walls +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Auke Kok (LGPL 2.1) diff --git a/mods/walls/depends.txt b/mods/walls/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/walls/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/walls/init.lua b/mods/walls/init.lua new file mode 100644 index 0000000..bee8e46 --- /dev/null +++ b/mods/walls/init.lua @@ -0,0 +1,46 @@ +walls = {} + +walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sounds) + -- inventory node, and pole-type wall start item + minetest.register_node(wall_name, { + description = wall_desc, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}}, + -- connect_bottom = + connect_front = {{-3/16, -1/2, -1/2, 3/16, 3/8, -1/4}}, + connect_left = {{-1/2, -1/2, -3/16, -1/4, 3/8, 3/16}}, + connect_back = {{-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}}, + connect_right = {{ 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}}, + }, + connects_to = { "group:wall", "group:stone" }, + paramtype = "light", + is_ground_content = false, + tiles = { wall_texture, }, + walkable = true, + groups = { cracky = 3, wall = 1, stone = 2 }, + sounds = wall_sounds, + }) + + -- crafting recipe + minetest.register_craft({ + output = wall_name .. " 6", + recipe = { + { '', '', '' }, + { wall_mat, wall_mat, wall_mat}, + { wall_mat, wall_mat, wall_mat}, + } + }) + +end + +walls.register("walls:cobble", "Cobblestone Wall", "default_cobble.png", + "default:cobble", default.node_sound_stone_defaults()) + +walls.register("walls:mossycobble", "Mossy Cobblestone Wall", "default_mossycobble.png", + "default:mossycobble", default.node_sound_stone_defaults()) + +walls.register("walls:desertcobble", "Desert Cobblestone Wall", "default_desert_cobble.png", + "default:desert_cobble", default.node_sound_stone_defaults()) + diff --git a/mods/walls/license.txt b/mods/walls/license.txt new file mode 100644 index 0000000..ccfaf1c --- /dev/null +++ b/mods/walls/license.txt @@ -0,0 +1,14 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2015 Auke Kok + +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 2.1 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/mods/wool/README.txt b/mods/wool/README.txt new file mode 100644 index 0000000..a66677d --- /dev/null +++ b/mods/wool/README.txt @@ -0,0 +1,16 @@ +Minetest Game mod: wool +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Cisoun (CC BY-SA 3.0): + wool_black.png wool_brown.png wool_dark_green.png wool_green.png + wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png + wool_blue.png wool_cyan.png wool_dark_grey.png wool_grey.png + wool_orange.png wool_red.png wool_white.png diff --git a/mods/wool/depends.txt b/mods/wool/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/wool/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/wool/init.lua b/mods/wool/init.lua new file mode 100644 index 0000000..a36e4dd --- /dev/null +++ b/mods/wool/init.lua @@ -0,0 +1,47 @@ +-- This uses a trick: you can first define the recipes using all of the base +-- colors, and then some recipes using more specific colors for a few non-base +-- colors available. When crafting, the last recipes will be checked first. + +local dyes = { + {"white", "White", "basecolor_white"}, + {"grey", "Grey", "basecolor_grey"}, + {"black", "Black", "basecolor_black"}, + {"red", "Red", "basecolor_red"}, + {"yellow", "Yellow", "basecolor_yellow"}, + {"green", "Green", "basecolor_green"}, + {"cyan", "Cyan", "basecolor_cyan"}, + {"blue", "Blue", "basecolor_blue"}, + {"magenta", "Magenta", "basecolor_magenta"}, + {"orange", "Orange", "excolor_orange"}, + {"violet", "Violet", "excolor_violet"}, + {"brown", "Brown", "unicolor_dark_orange"}, + {"pink", "Pink", "unicolor_light_red"}, + {"dark_grey", "Dark Grey", "unicolor_darkgrey"}, + {"dark_green", "Dark Green", "unicolor_dark_green"}, +} + +for i = 1, #dyes do + local name, desc, craft_color_group = unpack(dyes[i]) + + minetest.register_node("wool:" .. name, { + description = desc .. " Wool", + tiles = {"wool_" .. name .. ".png"}, + is_ground_content = false, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1}, + sounds = default.node_sound_defaults(), + }) + + minetest.register_craft{ + type = "shapeless", + output = "wool:" .. name, + recipe = {"group:dye," .. craft_color_group, "group:wool"}, + } +end + + +-- legacy + +-- Backwards compatibility with jordach's 16-color wool mod +minetest.register_alias("wool:dark_blue", "wool:blue") +minetest.register_alias("wool:gold", "wool:yellow") diff --git a/mods/wool/license.txt b/mods/wool/license.txt new file mode 100644 index 0000000..9310163 --- /dev/null +++ b/mods/wool/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Cisoun + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/wool/textures/wool_black.png b/mods/wool/textures/wool_black.png new file mode 100644 index 0000000..700d439 Binary files /dev/null and b/mods/wool/textures/wool_black.png differ diff --git a/mods/wool/textures/wool_blue.png b/mods/wool/textures/wool_blue.png new file mode 100644 index 0000000..a074986 Binary files /dev/null and b/mods/wool/textures/wool_blue.png differ diff --git a/mods/wool/textures/wool_brown.png b/mods/wool/textures/wool_brown.png new file mode 100644 index 0000000..2620dfd Binary files /dev/null and b/mods/wool/textures/wool_brown.png differ diff --git a/mods/wool/textures/wool_cyan.png b/mods/wool/textures/wool_cyan.png new file mode 100644 index 0000000..395b6ac Binary files /dev/null and b/mods/wool/textures/wool_cyan.png differ diff --git a/mods/wool/textures/wool_dark_green.png b/mods/wool/textures/wool_dark_green.png new file mode 100644 index 0000000..0e73999 Binary files /dev/null and b/mods/wool/textures/wool_dark_green.png differ diff --git a/mods/wool/textures/wool_dark_grey.png b/mods/wool/textures/wool_dark_grey.png new file mode 100644 index 0000000..7253696 Binary files /dev/null and b/mods/wool/textures/wool_dark_grey.png differ diff --git a/mods/wool/textures/wool_green.png b/mods/wool/textures/wool_green.png new file mode 100644 index 0000000..dcb663b Binary files /dev/null and b/mods/wool/textures/wool_green.png differ diff --git a/mods/wool/textures/wool_grey.png b/mods/wool/textures/wool_grey.png new file mode 100644 index 0000000..2f4c338 Binary files /dev/null and b/mods/wool/textures/wool_grey.png differ diff --git a/mods/wool/textures/wool_magenta.png b/mods/wool/textures/wool_magenta.png new file mode 100644 index 0000000..5c2c4a7 Binary files /dev/null and b/mods/wool/textures/wool_magenta.png differ diff --git a/mods/wool/textures/wool_orange.png b/mods/wool/textures/wool_orange.png new file mode 100644 index 0000000..a059f36 Binary files /dev/null and b/mods/wool/textures/wool_orange.png differ diff --git a/mods/wool/textures/wool_pink.png b/mods/wool/textures/wool_pink.png new file mode 100644 index 0000000..8e90140 Binary files /dev/null and b/mods/wool/textures/wool_pink.png differ diff --git a/mods/wool/textures/wool_red.png b/mods/wool/textures/wool_red.png new file mode 100644 index 0000000..da12ecf Binary files /dev/null and b/mods/wool/textures/wool_red.png differ diff --git a/mods/wool/textures/wool_violet.png b/mods/wool/textures/wool_violet.png new file mode 100644 index 0000000..d7d6783 Binary files /dev/null and b/mods/wool/textures/wool_violet.png differ diff --git a/mods/wool/textures/wool_white.png b/mods/wool/textures/wool_white.png new file mode 100644 index 0000000..88f1e2f Binary files /dev/null and b/mods/wool/textures/wool_white.png differ diff --git a/mods/wool/textures/wool_yellow.png b/mods/wool/textures/wool_yellow.png new file mode 100644 index 0000000..2b0f048 Binary files /dev/null and b/mods/wool/textures/wool_yellow.png differ diff --git a/mods/xpanes/README.txt b/mods/xpanes/README.txt new file mode 100644 index 0000000..bcbc129 --- /dev/null +++ b/mods/xpanes/README.txt @@ -0,0 +1,21 @@ +Minetest Game mod: xpanes +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by xyz (MIT) +BlockMen (MIT) +sofar (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +xyz (CC BY-SA 3.0): + All textures not mentioned below. + +Gambit (CC BY-SA 3.0): + xpanes_bar.png + +paramat (CC BY-SA 3.0): + xpanes_bar_top.png diff --git a/mods/xpanes/depends.txt b/mods/xpanes/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/xpanes/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua new file mode 100644 index 0000000..77278a5 --- /dev/null +++ b/mods/xpanes/init.lua @@ -0,0 +1,184 @@ + +local function is_pane(pos) + return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 +end + +local function connects_dir(pos, name, dir) + local aside = vector.add(pos, minetest.facedir_to_dir(dir)) + if is_pane(aside) then + return true + end + + local connects_to = minetest.registered_nodes[name].connects_to + if not connects_to then + return false + end + local list = minetest.find_nodes_in_area(aside, aside, connects_to) + + if #list > 0 then + return true + end + + return false +end + +local function swap(pos, node, name, param2) + if node.name == name and node.param2 == param2 then + return + end + + minetest.set_node(pos, {name = name, param2 = param2}) +end + +local function update_pane(pos) + if not is_pane(pos) then + return + end + local node = minetest.get_node(pos) + local name = node.name + if name:sub(-5) == "_flat" then + name = name:sub(1, -6) + end + + local any = node.param2 + local c = {} + local count = 0 + for dir = 0, 3 do + c[dir] = connects_dir(pos, name, dir) + if c[dir] then + any = dir + count = count + 1 + end + end + + if count == 0 then + swap(pos, node, name .. "_flat", any) + elseif count == 1 then + swap(pos, node, name .. "_flat", (any + 1) % 4) + elseif count == 2 then + if (c[0] and c[2]) or (c[1] and c[3]) then + swap(pos, node, name .. "_flat", (any + 1) % 4) + else + swap(pos, node, name, 0) + end + else + swap(pos, node, name, 0) + end +end + +minetest.register_on_placenode(function(pos, node) + if minetest.get_item_group(node, "pane") then + update_pane(pos) + end + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end +end) + +minetest.register_on_dignode(function(pos) + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end +end) + +xpanes = {} +function xpanes.register_pane(name, def) + for i = 1, 15 do + minetest.register_alias("xpanes:" .. name .. "_" .. i, "xpanes:" .. name .. "_flat") + end + + local flatgroups = table.copy(def.groups) + flatgroups.pane = 1 + minetest.register_node(":xpanes:" .. name .. "_flat", { + description = def.description, + drawtype = "nodebox", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + paramtype2 = "facedir", + tiles = {def.textures[3], def.textures[3], def.textures[1]}, + groups = flatgroups, + drop = "xpanes:" .. name .. "_flat", + sounds = def.sounds, + node_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + selection_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + connect_sides = { "left", "right" }, + }) + + local groups = table.copy(def.groups) + groups.pane = 1 + groups.not_in_creative_inventory = 1 + minetest.register_node(":xpanes:" .. name, { + drawtype = "nodebox", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + description = def.description, + tiles = {def.textures[3], def.textures[3], def.textures[1]}, + groups = groups, + drop = "xpanes:" .. name .. "_flat", + sounds = def.sounds, + node_box = { + type = "connected", + fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}}, + connect_front = {{-1/32, -1/2, -1/2, 1/32, 1/2, -1/32}}, + connect_left = {{-1/2, -1/2, -1/32, -1/32, 1/2, 1/32}}, + connect_back = {{-1/32, -1/2, 1/32, 1/32, 1/2, 1/2}}, + connect_right = {{1/32, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + connects_to = {"group:pane", "group:stone", "group:glass", "group:wood", "group:tree"}, + }) + + minetest.register_craft({ + output = "xpanes:" .. name .. "_flat 16", + recipe = def.recipe + }) +end + +xpanes.register_pane("pane", { + description = "Glass Pane", + textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, + inventory_image = "default_glass.png", + wield_image = "default_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3}, + recipe = { + {"default:glass", "default:glass", "default:glass"}, + {"default:glass", "default:glass", "default:glass"} + } +}) + +xpanes.register_pane("bar", { + description = "Iron bar", + textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"}, + inventory_image = "xpanes_bar.png", + wield_image = "xpanes_bar.png", + groups = {cracky=2}, + sounds = default.node_sound_metal_defaults(), + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) + +minetest.register_lbm({ + name = "xpanes:gen2", + nodenames = {"group:pane"}, + action = function(pos, node) + update_pane(pos) + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end + end +}) diff --git a/mods/xpanes/license.txt b/mods/xpanes/license.txt new file mode 100644 index 0000000..dff7227 --- /dev/null +++ b/mods/xpanes/license.txt @@ -0,0 +1,64 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 xyz +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2016 Auke Kok +Copyright (C) 2014-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 xyz +Copyright (C) 2013-2016 Gambit +Copyright (C) 2016 paramat + +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. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +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/mods/xpanes/textures/xpanes_bar.png b/mods/xpanes/textures/xpanes_bar.png new file mode 100644 index 0000000..3ea62a9 Binary files /dev/null and b/mods/xpanes/textures/xpanes_bar.png differ diff --git a/mods/xpanes/textures/xpanes_bar_top.png b/mods/xpanes/textures/xpanes_bar_top.png new file mode 100644 index 0000000..887518a Binary files /dev/null and b/mods/xpanes/textures/xpanes_bar_top.png differ diff --git a/mods/xpanes/textures/xpanes_pane_half.png b/mods/xpanes/textures/xpanes_pane_half.png new file mode 100644 index 0000000..4e846df Binary files /dev/null and b/mods/xpanes/textures/xpanes_pane_half.png differ diff --git a/mods/xpanes/textures/xpanes_space.png b/mods/xpanes/textures/xpanes_space.png new file mode 100644 index 0000000..016cb35 Binary files /dev/null and b/mods/xpanes/textures/xpanes_space.png differ diff --git a/mods/xpanes/textures/xpanes_white.png b/mods/xpanes/textures/xpanes_white.png new file mode 100644 index 0000000..a2f4b63 Binary files /dev/null and b/mods/xpanes/textures/xpanes_white.png differ