diff --git a/furniture.lua b/furniture.lua new file mode 100644 index 0000000..ccf5724 --- /dev/null +++ b/furniture.lua @@ -0,0 +1,220 @@ +minetest.register_node("darkage:chain", { + description = "Chain", + drawtype = "signlike", + tiles = {"darkage_chain.png"}, + inventory_image = "darkage_chain.png", + wield_image = "darkage_chain.png", + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {snappy=1,cracky=2,oddly_breakable_by_hand=2}, + legacy_wallmounted = true +}) + +minetest.register_node('darkage:box', { + description = "Box", + tiles = { 'darkage_box_top.png','darkage_box_top.png','darkage_box.png'}, + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + groups = { snappy = 3 }, + sounds = default.node_sound_leaves_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", + "size[8,8]".. + "list[current_name;main;0,0;8,3;]".. + "list[current_player;main;0,4;8,4;]") + meta:set_string("infotext", "Box") + local inv = meta:get_inventory() + inv:set_size("main", 16) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + 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 box at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to box at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from box at "..minetest.pos_to_string(pos)) + end, +}) + +--minetest.register_node("darkage:rosace", { +-- description = "Rose Window", +-- tiles = {"darkage_rosace.png"}, +-- is_ground_content = true, +-- groups = {cracky=3}, +-- sounds = default.node_sound_stone_defaults() +--}) + +minetest.register_node("darkage:iron_bars", { + description = "Iron Bars", + drawtype = "glasslike", + tiles = {"darkage_iron_bars.png"}, + inventory_image = "darkage_iron_bars.png", + wield_image = "darkage_iron_bars.png", + is_ground_content = true, + paramtype = "light", + sunlight_propagates = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node("darkage:iron_grille", { + description = "Iron Grille", + drawtype = "glasslike", + tiles = {"darkage_iron_grille.png"}, + inventory_image = "darkage_iron_grille.png", + wield_image = "darkage_iron_grille.png", + is_ground_content = true, + paramtype = "light", + sunlight_propagates = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node("darkage:wood_bars", { + description = "Wood Bars", + drawtype = "glasslike", + tiles = {"darkage_wood_bars.png"}, + inventory_image = "darkage_wood_bars.png", + wield_image = "darkage_wood_bars.png", + is_ground_content = true, + paramtype = "light", + sunlight_propagates = true, + groups = {snappy=1,choppy=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node("darkage:wood_grille", { + description = "Wooden Grille", + drawtype = "glasslike", + tiles = {"darkage_wood_grille.png"}, + inventory_image = "darkage_wood_grille.png", + wield_image = "darkage_wood_grille.png", + is_ground_content = true, + paramtype = "light", + sunlight_propagates = true, + groups = {snappy=1,choppy=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node("darkage:wood_frame", { + description = "Wood Frame", + drawtype = "glasslike", + tiles = {"darkage_wood_frame.png"}, + inventory_image = "darkage_wood_frame.png", + wield_image = "darkage_wood_frame.png", + is_ground_content = true, + paramtype = "light", + sunlight_propagates = true, + groups = {snappy=1,choppy=2}, + sounds = default.node_sound_stone_defaults() +}) +--------------- +-- Crafts Item +--------------- + + +---------- +-- Crafts +---------- + +minetest.register_craft({ + output = 'darkage:box', + recipe = { + {'default:wood','','default:wood'}, + {'','',''}, + {'default:wood','','default:wood'}, + } +}) + +minetest.register_craft({ + output = 'darkage:chain 2', + recipe = { + {'default:steel_ingot'}, + {'default:steel_ingot'}, + {'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'darkage:iron_bars 2', + recipe = { + {'default:steel_ingot','','default:steel_ingot'}, + {'default:steel_ingot','','default:steel_ingot'}, + {'default:steel_ingot','','default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'darkage:iron_grille 3', + recipe = { + {'','darkage:iron_bars',''}, + {'darkage:iron_bars','','darkage:iron_bars'}, + {'','darkage:iron_bars',''}, + } +}) + +-- minetest.register_craft({ +-- output = 'darkage:scroll 2', +-- recipe = { +-- {'default:paper','default:paper','default:paper'}, +-- {'default:paper','',''}, +-- {'default:paper','paper',''}, +-- } +-- }) + +minetest.register_craft({ + output = 'darkage:wood_bars 2', + recipe = { + {'default:stick','','default:stick'}, + {'default:stick','','default:stick'}, + {'default:stick','','default:stick'}, + } +}) + +minetest.register_craft({ + output = 'darkage:wood_grille 3', + recipe = { + {'','darkage:wood_bars',''}, + {'darkage:wood_bars','','darkage:wood_bars'}, + {'','darkage:wood_bars',''}, + } +}) + +minetest.register_craft({ + output = 'darkage:wooden_frame', + recipe = { + {'default:stick','default:stick','default:stick'}, + {'default:stick','darkage:glass','default:stick'}, + {'default:stick','default:stick','default:stick'}, + } +}) + +--minetest.register_craft({ +-- output = 'darkage:rosace', +-- recipe = { +-- {'default:cobble','','default:cobble'}, +-- {'','default:cobble',''}, +-- {'default:cobble','','default:cobble'}, +-- } +--}) diff --git a/mapgen.lua b/mapgen.lua new file mode 100644 index 0000000..ad0ca49 --- /dev/null +++ b/mapgen.lua @@ -0,0 +1,246 @@ +--Makes a stratus of rocks +--name of the rock to generate +--wherein kind of node to replace, for example default:stone +--minp, maxp the corners of the map to be generated +--seed random seed +--stratus_chance inverse probability in a given radius 1:2, 1:3 etc +--radius horizontal radius of the stratus +--radius_y vertical radius of the stratus +--deep how deep can be from the ground +local function generate_stratus(name, wherein, ceilin, ceil, minp, maxp, seed, stratus_chance, radius, radius_y, deep, height_min, height_max) + if maxp.y < height_min or minp.y > height_max then + return + end + -- it will be only generate a stratus for every 100 m of area + local stratus_per_volume=1 + local area=45 + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = ((maxp.x-minp.x+1)/area)*((y_max-y_min+1)/area)*((maxp.z-minp.z+1)/area) + local pr = PseudoRandom(seed) + local blocks = math.floor(stratus_per_volume*volume) + print(" <<"..dump(name)..">>"); + if blocks == 0 then + blocks = 1 + end + print(" blocks: "..dump(blocks).." in vol: "..dump(volume).." ("..dump(maxp.x-minp.x+1)..","..dump(y_max-y_min+1)..","..dump(maxp.z-minp.z+1)..")") + for i=1,blocks do + local x = pr:next(1,stratus_chance) + if x == 1 then + -- TODO deep + local y0=y_max-radius_y+1 + if y0 < y_min then + y0=y_min + else + y0=pr:next(y_min, y0) + end + local x0 = maxp.x-radius+1 + if x0 < minp.x then + x0 = minp.x + else + x0 = pr:next(minp.x, x0) + end + local z0 = maxp.z-radius+1 + if z0 < minp.z then + x0 = minp.z + else + z0 = pr:next(minp.z, z0) + end + local p0 = {x=x0, y=y0, z=z0} + local n = minetest.env:get_node(p0).name + local i = 0 + --print(" upper node "..n) + x = 0 + for k, v in ipairs(ceilin) do + if n == v then + x = 1 + break + end + end + if x == 1 then + -- search for the node to replace + --print(" Searching nodes to replace from "..dump(y0-1).." to "..dump(y_min)) + for y1=y0-1,y_min,-1 do + p0.y=y1 + n = minetest.env:get_node(p0).name + x = 0 + for k, v in ipairs(wherein) do + if n == v then + x = 1 + break + end + end + if x == 1 then + y0=y1-deep + if y0 < y_min then + y0 = y_min + end + break + end + end + local rx=pr:next(radius/2,radius)+1 + local rz=pr:next(radius/2,radius)+1 + local ry=pr:next(radius_y/2,radius_y)+1 + --print(" area of generation ("..dump(rx)..","..dump(rz)..","..dump(ry)..")") + for x1=0,rx do + rz = rz + 3 - pr:next(1,6) + if rz < 1 then + rz = 1 + end + for z1=pr:next(1,3),rz do + local ry0=ry+ pr:next(1,3) + for y1=pr:next(1,3),ry0 do + local x2 = x0+x1 + local y2 = y0+y1 + local z2 = z0+z1 + local p2 = {x=x2, y=y2, z=z2} + n = minetest.env:get_node(p2).name + for k, v in ipairs(wherein) do + if n == v then + x = 1 + break + end + end + if x == 1 then + if ceil == nil then + minetest.env:set_node(p2, {name=name}) + i = i +1 + else + local p3 = {p2.x,p2.y+1,p2} + if minetest.env:get_node(p3).name == ceil then + minetest.env:set_node(p2, {name=name}) + i = i +1 + end + end + end + end + end + end + print(" generated "..dump(i).." blocks in ("..dump(x0)..","..dump(y0)..","..dump(z0)..")") + end + + end + end + --print("generate_ore done") +end + +local function generate_claylike(name, minp, maxp, seed, chance, minh, maxh, dirt) + if maxp.y >= maxh+1 and minp.y <= minh-1 then + local pr = PseudoRandom(seed) + local divlen = 4 + local divs = (maxp.x-minp.x)/divlen+1; + for yy=minh,maxh do + local x = pr:next(1,chance) + if x == 1 then + for divx=0+1,divs-1-1 do + for divz=0+1,divs-1-1 do + local cx = minp.x + math.floor((divx+0.5)*divlen) + local cz = minp.z + math.floor((divz+0.5)*divlen) + local up = minetest.env:get_node({x=cx,y=yy,z=cz}).name + local down = minetest.env:get_node({x=cx,y=yy-1,z=cz}).name + if ( up == "default:water_source" or up == "air" ) and + ( down == "default:sand" or (dirt == 1 and (down == "default:dirt" or down == "default:dirt_with_grass" ))) then + local is_shallow = true + local num_water_around = 0 + if minetest.env:get_node({x=cx-divlen*2,y=yy,z=cz}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if minetest.env:get_node({x=cx+divlen*2,y=yy,z=cz}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if minetest.env:get_node({x=cx,y=yy,z=cz-divlen*2}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if minetest.env:get_node({x=cx,y=yy,z=cz+divlen*2}).name == "default:water_source" then + num_water_around = num_water_around + 1 end + if num_water_around >= 3 then + is_shallow = false + end + if is_shallow then + for x1=-divlen,divlen do + for z1=-divlen,divlen do + local p={x=cx+x1,y=yy-1,z=cz+z1} + down = minetest.env:get_node(p).name + if down == "default:sand" or (dirt == 1 and (down == "default:dirt" or down == "default:dirt_with_grass")) then + minetest.env:set_node(p, {name=name}) + end + end + end + end + end + end + end + end + end + end +end + +local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, chunk_size, ore_per_chunk, height_min, height_max) + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed) + local num_chunks = math.floor(chunks_per_volume * volume) + local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk) + --print("generate_ore num_chunks: "..dump(num_chunks)) + for i=1,num_chunks do + local y0 = pr:next(y_min, y_max-chunk_size+1) + if y0 >= height_min and y0 <= height_max then + local x0 = pr:next(minp.x, maxp.x-chunk_size+1) + local z0 = pr:next(minp.z, maxp.z-chunk_size+1) + local p0 = {x=x0, y=y0, z=z0} + for x1=0,chunk_size-1 do + for y1=0,chunk_size-1 do + for z1=0,chunk_size-1 do + if pr:next(1,inverse_chance) == 1 then + local x2 = x0+x1 + local y2 = y0+y1 + local z2 = z0+z1 + local p2 = {x=x2, y=y2, z=z2} + if minetest.env:get_node(p2).name == wherein then + minetest.env:set_node(p2, {name=name}) + end + end + end + end + end + end + end + --print("generate_ore done") +end + +minetest.register_on_generated(function(minp, maxp, seed) + -- Generate stratus + print("DARKAGE: Generate stratus"); + generate_ore("darkage:desert_stone_with_iron", "default:desert_stone", minp, maxp, seed+0, 1/7/7/7, 3, 5, -15, 40) + generate_claylike("darkage:mud", minp, maxp, seed+2, 2, 0, 2, 0) + generate_claylike("darkage:silt", minp, maxp, seed+1, 2, -1, 1, 1) + generate_stratus("darkage:chalk", + {"default:stone"}, + {"default:stone","air"}, nil, + minp, maxp, seed+4, 3, 25, 7, 0, -20, 50) + generate_stratus("darkage:ors", + {"default:stone"}, + {"default:stone","air","default:water_source"}, nil, + minp, maxp, seed+4, 5, 20, 7, 50, -200, 500) + generate_stratus("darkage:shale", + {"default:stone"}, + {"default:stone","air"}, nil, + minp, maxp, seed+5, 4, 16, 7, 50, -50, 20) + generate_stratus("darkage:slate", + {"default:stone"}, + {"default:stone","air"}, nil, + minp, maxp, seed+6, 6, 16, 5, 50, -500, 0) + generate_stratus("darkage:schist", + {"default:stone"}, + {"default:stone","air"}, nil, + minp, maxp, seed+7, 6, 14, 6, 50, -31000, -10) + generate_stratus("darkage:basalt", + {"default:stone"}, + {"default:stone","air"}, nil, + minp, maxp, seed+8, 5, 14, 5, 20, -31000, -50) + generate_stratus("darkage:gneiss", + {"default:stone"}, + {"default:stone","air"}, nil, + minp, maxp, seed+8, 10, 10, 5, 50, -31000, -100) +end) diff --git a/stairs.lua b/stairs.lua new file mode 100644 index 0000000..5e1c3ea --- /dev/null +++ b/stairs.lua @@ -0,0 +1,114 @@ +darkage = {} + +function darkage.register_stairs(modname, item, groups, images, description) + local recipeitem = modname..":"..item + local itemname = modname..":stair_"..item + minetest.register_node(itemname, { + description = description.." stair", + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = groups, + node_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}, + }, + }, + }) + + minetest.register_craft({ + output = itemname .. ' 4', + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Flipped recipe for the silly minecrafters + minetest.register_craft({ + output = itemname .. ' 4', + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + itemname=modname..":slab_" .. item + + minetest.register_node(itemname, { + description = description.." slab", + drawtype = "nodebox", + tiles = images, + paramtype = "light", + is_ground_content = true, + groups = groups, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- If it's being placed on an another similar one, replace it with + -- a full block + local slabpos = nil + local slabnode = nil + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local n0 = minetest.env:get_node(p0) + local n1 = minetest.env:get_node(p1) + if n0.name == itemname then + slabpos = p0 + slabnode = n0 + elseif n1.name == itemname then + slabpos = p1 + slabnode = n1 + end + if slabpos then + -- Remove the slab at slabpos + minetest.env:remove_node(slabpos) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + pointed_thing.above = slabpos + fakestack = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if not fakestack or fakestack:is_empty() then + itemstack:take_item(1) + -- Else put old node back + else + minetest.env:set_node(slabpos, slabnode) + end + return itemstack + end + + -- Otherwise place regularly + return minetest.item_place(itemstack, placer, pointed_thing) + end, + }) + + minetest.register_craft({ + output = itemname .. ' 3', + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) +end + + +darkage.register_stairs("darkage","slate_tale", + {cracky=3}, + {"darkage_slate_tale.png"}, + "Slate Tale" +)