1
0
mirror of git://repo.or.cz/rocks.git synced 2025-08-05 18:00:23 +02:00

89 Commits

Author SHA1 Message Date
7c7b7715bc Vein gen cleanup and experimental ores in veins. 2015-05-12 19:32:11 +02:00
64e01a2aab Better pipes. Move prng to on_generated. 2015-05-12 12:17:14 +02:00
08636f4b22 Optimizarion. 2015-05-11 21:01:06 +02:00
f82fd46656 Tuned and enabled pipes. 2015-05-11 20:28:55 +02:00
668d2f2262 Add experimental vein (fissure) generator. 2015-05-11 20:27:38 +02:00
1de45a1dd4 Renamed veins to pipes. 2015-05-11 11:18:15 +02:00
b203d77ffe Sphere as motherlode of veins. 2015-05-10 23:37:47 +02:00
b183c489ee Sample cubic bezier vein generator. 2015-05-10 16:05:48 +02:00
f0f1edc94e Straight line veins. 2015-05-10 13:59:05 +02:00
5864a396f5 Disable grass and dirt for testing. 2015-05-10 13:00:56 +02:00
b9ad0a251c Optimize generation callbacks. 2015-05-10 12:59:49 +02:00
7574b0f463 Multiple sedimentary layers. 2015-05-10 12:42:29 +02:00
b193a9825b removed nyancat. 2015-05-05 15:44:42 +02:00
06feda37c3 Optimization: do not calculate noises and geomes in non-sedimentary elevations. 2015-05-03 18:58:16 +02:00
a4fcb25897 Bit tune. 2015-05-03 18:21:27 +02:00
a59eb82757 Translated and cleaned the readme. 2015-05-03 11:26:50 +02:00
f42f17c509 Less claystone and clay generally, less coal, more lime. 2015-05-03 11:06:16 +02:00
9ed5bdfbd4 Add textures for lignite and anthracite. 2015-05-03 10:54:44 +02:00
59737a0652 Added biosediments: limestone, coal, lignite, anthracite. And placeholders. 2015-05-03 10:53:50 +02:00
7a5d600e0c Added mudstone. 2015-05-03 09:17:20 +02:00
75c1cfa108 spell 2015-05-02 21:05:42 +02:00
73b796a836 Moved sedimentary layer notes to main readme. Partly in slovak lang. 2015-05-02 20:45:35 +02:00
447f73b064 Forgot to uncomment dofiles in init. 2015-05-02 20:42:38 +02:00
7fbc4e907b Add appropo textures. 2015-05-02 20:38:48 +02:00
063c22b61a Add slate, conglomerate, sandstone, claystone, clay, sand sedimentaries. 2015-05-02 20:38:36 +02:00
a38ae12ea4 Experimental sdedimentary layer generator. 2015-05-02 20:38:05 +02:00
2bb9685f10 Disable debug lighting in ign. 2015-05-02 20:35:35 +02:00
a82e9ccac2 Notes to sedimentary layer. 2015-05-02 17:41:39 +02:00
838305401f Using lua mapgen to generate layers and minetest to do ores, but I do not like it. 2015-04-27 17:02:59 +02:00
dc59acb6e6 Oceans are of limestone and gravel. 2015-04-27 14:29:55 +02:00
7e3c0c6026 Laterite should be in tropics, not beaches. 2015-04-24 15:21:16 +02:00
57a2e6800e Using granite texture from Decoblocks. 2015-04-23 18:36:31 +02:00
558bfcc50d Fix undervater being of filler material. Fix stone layer under oceans. 2015-04-23 15:26:21 +02:00
891a10d681 Made gabbro and diorite more spread. +bit rarer. 2015-04-23 15:19:53 +02:00
8ac2730e58 Generate basalt or granite below -48 (also the other rocks). 2015-04-23 15:11:23 +02:00
a0dc566981 SPELL treshhold 2015-04-23 15:08:55 +02:00
798b56768d Add sandstone to sand beaches. Add skarn and peg to default:stone. 2015-04-23 14:35:05 +02:00
776695b720 Corrented bedrock generation. Note: under -48 default:stone is not touched. 2015-04-23 14:20:45 +02:00
23cef526da Add cassiterite to peg ores. 2015-04-22 21:19:35 +02:00
683b918c32 Cleanup.
Move mineral noise to init.lua. Moved peg mineral descr to mineral peg.
2015-04-22 21:17:21 +02:00
5760f24090 Peg is rarer and bigger. 2015-04-22 20:51:14 +02:00
fb55165611 Pseudo random for seed difference. 2015-04-22 20:44:50 +02:00
e5e2a75fd7 Add laterite texture. 2015-04-22 20:13:54 +02:00
8159669a2a Add layerite clay to beach biomes. 2015-04-22 20:09:06 +02:00
016f5aab0f Dirt as a laterite depo. 2015-04-22 19:54:53 +02:00
b63c3e627c Add gravel to beach on cold biomes. 2015-04-22 19:53:43 +02:00
912fad6ff2 Add gravel patches to beach sand (Pebbles). 2015-04-22 16:36:20 +02:00
377bd99adc peg doc. 2015-04-20 19:27:03 +02:00
475a413d2f Fix all veins having radius 10. Pegmatite adapt new api and tweak. 2015-04-20 19:18:42 +02:00
2c06f0486e Merge branch 'pegmatite'
Conflicts:
	mapgen.lua
2015-04-20 18:55:59 +02:00
45ad16ea4d Changed ign noise to 1 octave and decreased amount of basalt a little. 2015-04-20 18:51:30 +02:00
6d6b711d25 Fix 2015-04-20 18:34:58 +02:00
af7e78500e Basalt now replaces default:stone downto -48. 2015-04-20 18:07:12 +02:00
0bd4d6bfa8 I separated the ores from rocks, to give freedom of choose to users.
Merge branch 'modpack'.
2015-04-20 15:49:07 +02:00
b51f854b1c Doc of igneous layer. 2015-04-20 15:47:21 +02:00
f4973d1b69 Init mineral. 2015-04-20 15:26:47 +02:00
8f4b02bd1e Move skarn ores to mineral mod. 2015-04-20 15:24:06 +02:00
08ea4423a8 Add minerals mod skel. 2015-04-20 15:14:51 +02:00
a1091cf94c Fix igneous ores not spawning in mountains. 2015-04-20 15:05:09 +02:00
8a1bf6d522 This is now a modpack. 2015-04-19 20:31:54 +02:00
d1b9fb7183 Re-added the Pb/Zn and Magnetite. Tweaked the values a little. 2015-04-19 18:57:03 +02:00
c9f1e7256a Nice set of map_meta parameters for high mountains and non-flat terrain. 2015-04-19 18:40:01 +02:00
9f82e118eb Re-enabled Copper skarn deposits. 2015-04-19 12:59:13 +02:00
697a50d5f7 Re-enabled skarn deposits. Currently without ores. 2015-04-19 12:35:22 +02:00
093310ed4b Re-enabled igneous formations and nyancat test vein. 2015-04-19 12:19:02 +02:00
0fde0e8f15 Replace reference to default:stone in biomes to mapgen_stone. 2015-04-19 12:17:26 +02:00
7c6d02e2ed Not checking the noise so frequently in sed oregen. Also decreased the number of octaves. 2015-04-19 10:34:19 +02:00
da6c1a9bf0 Cleanup + tweaks. 2015-04-19 10:33:35 +02:00
0b3e25ca6b Add a mountain biome type that contains limestone and added a default
mountain biome and made it re-register itself after clear_biomes.
2015-04-19 10:31:53 +02:00
a642d6311a Update doc. 2015-04-18 17:10:55 +02:00
d1bc2638f3 Cleanup + debug output. 2015-04-18 16:49:14 +02:00
97b9170653 Fix weirid sand layers caused by shore-thing of MGv7 2015-04-18 16:48:35 +02:00
59c5eaf5b4 patch other mod's biomes with our sedimentary rocks.
using a overriden minetest.register_biome func.
2015-04-18 16:27:47 +02:00
091f2e0b57 Rewrote existing sedimentary layer to biomes/oregen. 2015-04-17 20:26:22 +02:00
e7d4f3b0db Added license notes and cleaned the readme. 2015-04-17 16:59:53 +02:00
c02b173bf0 Changed api to prepare for mapgen rewrite. 2015-04-16 23:03:50 +02:00
aaa6ddeb3f Tweak spawn values in sedimentary layer. 2015-04-16 16:53:08 +02:00
e0f0dfdac7 Note, how to rewrite mapgen. 2015-04-16 15:44:35 +02:00
c3167e8720 Note, how to rewrite mapgen. 2015-04-14 23:32:36 +02:00
eef1902490 Granite texture from Minecraft. 2015-04-12 13:54:59 +02:00
0dae800739 Pegmatite vein def. 2015-04-12 13:18:48 +02:00
b8dfc5dedd Make skarns spawn in lime too. + some notes 2015-04-12 12:48:16 +02:00
7113f0f950 Skel for pegmatite veins. 2015-04-12 12:35:45 +02:00
14b16d55ca Support for table as wherein param. 2015-04-12 12:04:13 +02:00
32ae5e4fb5 Add skarn textures. 2015-04-10 21:22:16 +02:00
0068977a3d Add Skarn deposits. 2015-04-10 21:21:51 +02:00
450da72080 Check for wherein for every block of vein, not just center. Removed vein density. 2015-04-10 21:20:36 +02:00
bb7d89bf7d Add vein density. 2015-04-10 19:30:36 +02:00
65f286f233 Add secondary ores gen in vein. 2015-04-10 16:58:33 +02:00
66 changed files with 1248 additions and 368 deletions

138
AmplifiedMGv7.txt Normal file
View File

@ -0,0 +1,138 @@
# world_dir/map_meta.txt
chunksize = 5
mg_biome_np_heat = {
flags = defaults
lacunarity = 2
octaves = 3
offset = 50
persistence = 0.5
scale = 50
seed = 5349
spread = (500,500,500)
}
mg_biome_np_humidity = {
flags = defaults
lacunarity = 2
octaves = 3
offset = 50
persistence = 0.5
scale = 50
seed = 842
spread = (500,500,500)
}
mg_flags = trees, caves, nodungeons, noflat, light
mg_name = v7
mgv7_np_cave1 = {
flags = defaults
lacunarity = 2
octaves = 4
offset = 0
persistence = 0.5
scale = 12
seed = 52534
spread = (100,100,100)
}
mgv7_np_cave2 = {
flags = defaults
lacunarity = 2
octaves = 4
offset = 0
persistence = 0.5
scale = 12
seed = 10325
spread = (100,100,100)
}
mgv7_np_filler_depth = {
flags = defaults
lacunarity = 2
octaves = 4
offset = 0
persistence = 0.7
scale = 1.2
seed = 261
spread = (150,150,150)
}
mgv7_np_height_select = {
flags = defaults
lacunarity = 2
octaves = 5
offset = -0.5
persistence = 0.69
scale = 1
seed = 4213
spread = (250,250,250)
}
mgv7_np_mount_height = {
flags = defaults
lacunarity = 2
octaves = 6
offset = 630
persistence = 0.6
scale = 250
seed = 72449
spread = (2000,2000,2000)
}
mgv7_np_mountain = {
flags = defaults
lacunarity = 2
octaves = 5
offset = -0.6
persistence = 0.68
scale = 1
seed = 5333
spread = (750,1400,750)
}
mgv7_np_ridge = {
flags = defaults
lacunarity = 2
octaves = 4
offset = 0
persistence = 0.75
scale = 1
seed = 6467
spread = (100,100,100)
}
mgv7_np_ridge_uwater = {
flags = defaults
lacunarity = 2
octaves = 4
offset = 0
persistence = 0.6
scale = 1
seed = 85039
spread = (500,500,500)
}
mgv7_np_terrain_alt = {
flags = defaults
lacunarity = 2
octaves = 5
offset = 4
persistence = 0.6
scale = 50
seed = 5934
spread = (1200,1200,1200)
}
mgv7_np_terrain_base = {
flags = defaults
lacunarity = 2
octaves = 6
offset = 4
persistence = 0.7
scale = 70
seed = 82341
spread = (300,300,300)
}
mgv7_np_terrain_persist = {
flags = defaults
lacunarity = 2
octaves = 3
offset = 0.6
persistence = 0.6
scale = 0.1
seed = 539
spread = (500,500,500)
}
mgv7_spflags = mountains, ridges
seed = 9237944289836255171
water_level = 1
[end_of_params]

126
a.txt
View File

@ -4,26 +4,37 @@ Geological layer generator for [Minetest] "rocks"
Aim of this mod is to replace all generic stone (default:stone) and Aim of this mod is to replace all generic stone (default:stone) and
generate underground layers of different rocks. generate underground layers of different rocks.
Currently everithing generated above ground, in air. This is for debugging.
Features Features
-------- --------
* layers of different rocks: sort of working * layers of different rocks: sort of working
* ore veins: nothing * ore veins: being added
* extensibility, api: ok * extensibility, api: changed million times
** Work in progress! ** ** Work in progress! **
* git clone git://repo.or.cz/rocks.git ([show](http://repo.or.cz/rocks.git/)) * git clone git://repo.or.cz/rocks.git ([show](http://repo.or.cz/rocks.git/))
* (old) Git clone: [https](https://gitorious.org/mt/rocks.git) * (old) Git clone: [https](https://gitorious.org/mt/rocks.git)
* Forum [post](https://forum.minetest.net/viewtopic.php?f=9&t=11779)
This mod nor minetest_game/default do not define meaningful biomes.
So if you do not want unlimited grassland I suggest installing the
[Paramat's biomesdev mod](https://github.com/paramat/biomesdev) and adding
"rocks?" to depends.txt file inside the biomesdev folder. This is needed,
becouse "rocks" overrides the standard biome registration callback to patch
in it's own sedimentary rocks.
Screenshots Screenshots
----------- -----------
* Layers: ![sample of layers](layers0.png) all were out of date
* Coal pane: ![large coal deposit](coal-pane0.png)
* Vein: ![sample of generated vein](vein0.png) License
-------
* My Code: GNU General Public License v2 or higher.
* Media: see txt files in the texture folder
* stated in the corresponding file
Documentation Documentation
------------- -------------
@ -31,3 +42,104 @@ Documentation
How the underground is generated: *todo*. How the underground is generated: *todo*.
Mod has been rewritten, so no doc yet. Mod has been rewritten, so no doc yet.
The sedimentary layer
-------------
Is implemented by modifiing MGv7 biomes to use rocks's sedimentary rocks.
This means that you need mapgen v7 enabled. I also suggest enabling caves
and dungeons, as they are cool.
Soil is normlly 50-70 cm deep in real life, so I made soil (dirt) only 1
block thick. Under this thin layer of dirt an sedimentary layer is located.
In RL, there is clay and other stuff.
There are various types of sedimentary rock. They are generated according
to 2D noises described below.
types = Clastic, Biochemical, Chemical, Vulcano/Other
| X | tp2<0.76 | tp2>0.7 |
|--------|--------------|--------|
| tp1<0.2 | Clastic | Chemical |
| tp1>0.2 | BioChemical | Vu/Ot |
- Noise_tp1( 50)= type1
- Noise_tp2( 70)= type2
- Noise_vc(100)= particle size
- Noise_sp(220)= pressue/ hardness
I. 2D: fast, acceptable imho <-(used)
II. 3D: nice
### Clastic sediments
Made from large or small particles. Either loose or bound into stones.
(particle size: top-large botom-small)
(hargness: loose -> solid)
1. gravel -> conglomerate
2. sand -> sandstone
3. mudstone
4. clay -> claystone -> slate
### BioChemical sediments
Made from acient plants and creatures that died long ago and turned into rock.
Noise_vs: kind of sediment: (top) oil, Limestone, other, carbon-based
Noise_sp: low quality -> high quality
1. oil: ?
2. Limestone
3. other: fosfates, silicates, hornfels (unimp)
4. carbon-based: Lignite -> Coal -> Anthracite
### Chemical sediments
Created by chemical or physics/chemical reactions.
- Evaporites (unimp)
### Vulanic and extraterrestrial sediments
???
The Igenous layer
--------------
Default stone is aliased to basalt, but for some reason the alias is not
working so please treat stone as basalt until I find way to fix it.
Everything below sedimentary and (unimp) metamorphic layer is of igneous origin. Primary rock is basalt. But about half of basalt is replaced by granite. Some smaller fraction (like 20%) is then replaced by diorite and gabbro.
These are the primary rocks, and more should come.
### Mineral distribution
Mineral ore is placed only in nodes of correct rock and only if the region
for the ore is right. These "mineral biomes" can and do overlap and change
every like 100 nodes. Following regions are defined:
| Region | minerals
|---------|----------
| Copper | Chalcopyrite, Malachyte
| Pb/Zn | Sphalerite, Galena
| Iron | Magnetite
### Skarn deposits
Are larg-ish (15-20m) blobs of skarn stone. They spawn only in granite and
limestone. Copper, Lead, Zinc and Iron ores often enrich the skarn stone.
Some deposits may (unimp) contain considerable amounts of Molybenium,
Uranium and Wolfram ores.
Concentration of the minerals is quite high, as to regard the player for
finding a not-so-common skarn vein.
### Pegmatite veis
Spawn only in granite. Are bit larger than skarn veins. Contain minerals
like skarn and more exotic minerals.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

85
ign.lua
View File

@ -1,85 +0,0 @@
--
-- Igneous Layer
--
local ign={
top={
offset = -10, scale = 0,
spread = {x=80, y=80, z=80},
octaves = 0, persist = 0 },
bot={
offset = -180, scale = 10, seed=rocksl.GetNextSeed(),
spread = {x=80, y=80, z=80},
octaves = 2, persist = 0.7 },
primary={ name="rocks:basalt" },
localized={},
stats={ count=0, total=0, node={}, totalnodes=0 },
debugging=nil
}
-- Basalt Ex/Mafic hard same as diorite, byt limit=0.5
minetest.register_node( "rocks:basalt", {
description = S("Basalt"),
tiles = { "rocks_Basalt.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- more rock defs
minetest.register_node( "rocks:granite", {
description = S("Granite"),
tiles = { "rocks_Granite.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=3, stone=1},
})
minetest.register_node( "rocks:diorite", {
description = S("Diorite"),
tiles = { "rocks_Diorite.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
minetest.register_node( "rocks:gabbro", {
description = S("Gabbro"),
tiles = { "rocks_Gabbro.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
local reg=function(name,param)
rocksl.register_stratus(ign,name,param)
end
rocks.register_igneous_stratus=reg
-- rock registration
reg("rocks:granite", { spread=40, height=32, treshold=0.06})
reg("rocks:diorite", { spread=40, height=32, treshold=0.23})
reg("rocks:gabbro", { spread=40, height=32, treshold=0.36})
-- vein stuff
ign.veins={}
rocksl.register_vein(ign.veins,"default:nyancat",{
wherein="rocks:granite",
miny=-160, maxy=20,
radius={ average=10, amplitude=4, frequency=8 },
density=1,
rarity=0.025, -- this^3*mapblock_volume veins per mapblock
})
-- { primary="rocks:pegmatite_diamond", size=3, count=5,
-- rarity=0.3 -- (this/count) chance of spawning cluster in the vein
minetest.register_on_generated(function(minp, maxp, seed)
rocksl.layergen(ign,minp,maxp,seed)
rocksl.veingen(ign.veins,minp,maxp,seed)
end)
minetest.register_on_shutdown(function()
if (ign.stats.count==0) then rocksl.print("[rocks](ign) stats not available, no chunks generated") return end
rocksl.print("[rocks](ign) generated total "..ign.stats.count.." chunks in "..ign.stats.total.." seconds ("..(ign.stats.total/ign.stats.count).." seconds per "..ign.stats.side.."^3 chunk)")
for name,total in pairs(ign.stats.node) do
rocksl.print("[rocks](ign) "..name..": "..total.." nodes placed ("..(total*100)/(ign.stats.totalnodes).." %)")
end
end)
-- ~ Tomas Brod

View File

@ -1,27 +0,0 @@
minetest.log("info","[rocks] mod initializing")
-- Load translation library if intllib is installed
if (minetest.get_modpath("intllib")) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
end
rocks={}
rocksl={}
rocksl.print=function(text)
print("[rocks] "..text)
end
local modpath=minetest.get_modpath(minetest.get_current_modname())
dofile(modpath.."/mapgen.lua")
dofile(modpath.."/sed.lua")
dofile(modpath.."/ign.lua")
minetest.register_on_mapgen_init(function(mapgen_params)
-- todo: disable caves and ores
end)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 674 KiB

View File

@ -1,181 +0,0 @@
--
-- layer generator
--
local print2=function(text)
minetest.log("verbose","rocks/gen/ "..text)
end
rocksl.seedseq=0
rocksl.GetNextSeed=function()
rocksl.seedseq=rocksl.seedseq+20
print2("seed "..rocksl.seedseq)
return rocksl.seedseq
end
rocksl.register_stratus=function(layer,name,param)
table.insert(layer.localized,{
primary=name,
spread=(param.spread or 20),
height=(param.height or 15),
treshold=(param.treshold or 0.85),
secondary=param.secondary,
seed=(rocksl.GetNextSeed()),
})
layer.stats.node[name]=0
end
rocksl.register_vein=function(col,name,param)
table.insert(col,{
primary=name,
wherein=param.wherein,
miny=param.miny, maxy=param.maxy,
radius={ average=param.radius.average, amplitude=param.radius.amplitude, frequency=param.radius.frequency },
density=(param.density or 1),
rarity=param.rarity,
localized={}
})
end
rocksl.layergen=function(layer, minp, maxp, seed)
if ( (layer.top.offset+layer.top.scale)>minp.y )
and ( (layer.bot.offset-layer.bot.scale)<maxp.y )
then
stone_ctx= minetest.get_content_id("default:stone")
air_ctx= minetest.get_content_id("air")
dirt_ctx= minetest.get_content_id("default:dirt")
if layer.debugging then
layer.primary.ctx= air_ctx
else
layer.primary.ctx= minetest.get_content_id(layer.primary.name)
end
local timebefore=os.clock();
local manipulator, emin, emax = minetest.get_mapgen_object("voxelmanip")
local nodes = manipulator:get_data()
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local side_length = (maxp.x - minp.x) + 1
local map_lengths_xyz = {x=side_length, y=side_length, z=side_length}
-- noises:
local bottom=minetest.get_perlin_map(layer.bot,map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
local localized={}
for _,loc in ipairs(layer.localized) do
--defaults and overrides
local np={ offset = 0, scale = 1, octaves = 1, persist = 0.7,
spread = {x=loc.spread, y=loc.height, z=loc.spread}, seed=loc.seed}
--get noise and content ids
table.insert(localized,
{
noise=minetest.get_perlin_map(np,map_lengths_xyz):get3dMap_flat(minp),
treshold=loc.treshold,
ctx= minetest.get_content_id(loc.primary),
ndn=loc.primary
})
end
local noise2d_ix = 1
local noise3d_ix = 1
print2("after noise: "..(os.clock()-timebefore))
for z=minp.z,maxp.z,1 do
for y=minp.y,maxp.y,1 do
for x=minp.x,maxp.x,1 do
local pos = area:index(x, y, z)
if (y>bottom[noise2d_ix]) and (y<layer.top.offset)
and ( (nodes[pos]==stone_ctx) or (nodes[pos]==dirt_ctx) )
then
layer.stats.totalnodes=layer.stats.totalnodes+1
if nodes[pos]==stone_ctx then nodes[pos] = layer.primary.ctx end
for k,loc in pairs(localized) do
if ( loc.noise[noise3d_ix] > loc.treshold) then
nodes[pos]=loc.ctx
layer.stats.node[loc.ndn]=layer.stats.node[loc.ndn]+1
break
end
end
end
noise2d_ix=noise2d_ix+1
noise3d_ix=noise3d_ix+1
end
noise2d_ix=noise2d_ix-side_length
end
noise2d_ix=noise2d_ix+side_length
end
print2("after loop: "..(os.clock()-timebefore))
manipulator:set_data(nodes)
--manipulator:calc_lighting()
--manipulator:update_liquids()
if layer.debugging then
manipulator:set_lighting({day=15,night=15})
end
manipulator:write_to_map()
print2("after commit: "..(os.clock()-timebefore))
layer.stats.count=layer.stats.count+1
layer.stats.total=layer.stats.total+(os.clock()-timebefore)
layer.stats.side=side_length
end
end
local ignore_wherein=1
rocksl.veingen=function(veins,minp,maxp,seed)
local side_length=(maxp.y-minp.y)
local random=PseudoRandom(seed-79)
local timebefore=os.clock();
local manipulator, emin, emax = minetest.get_mapgen_object("voxelmanip")
local nodes = manipulator:get_data()
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local did_generate=nil
for _,vein in ipairs(veins) do
if (minp.y<vein.maxy) and (maxp.y>vein.maxy) then
local vr2=vein.radius.average^2
local vrm=vein.radius.average+vein.radius.amplitude
local noise_map=minetest.get_perlin_map(
{
seed=-79,
scale=vein.radius.amplitude,
offset=0, octaves=1, persist=0.7,
spread={x=vein.radius.frequency, y=vein.radius.frequency, z=vein.radius.frequency}
},{x=(vrm*2)+1, y=(vrm*2)+1, z=(vrm*2)+1}
)
local iterations_count= (vein.rarity*side_length)^3
iterations_count=iterations_count+(random:next(0,100)/100)
local primary_ctx=minetest.get_content_id(vein.primary)
local wherein_ctx=minetest.get_content_id(vein.wherein)
--print("vein "..vein.primary.." ic="..iterations_count.." p="..primary_ctx.." w="..wherein_ctx)
for iteration=1, iterations_count do
local x0=minp.x+ random:next(0,side_length)
local y0=minp.y+ random:next(0,side_length)
local z0=minp.z+ random:next(0,side_length)
local noise=noise_map:get3dMap_flat({x=x0-vrm, y=y0-vrm, z=z0-vrm})
local noise_ix=1
local posi = area:index(x0, y0, z0)
if ignore_wherein or (nodes[posi]==wherein_ctx) then
--print("vein "..vein.primary.." @ "..x0..","..y0..","..z0.." vrm="..vrm)
did_generate=1
for x=-vrm, vrm do
for y=-vrm, vrm do
for z=-vrm, vrm do
local posc = {x=x+x0,y=y+y0,z=z+z0}
posi = area:index(posc.x, posc.y, posc.z)
local nv=noise[noise_ix]
if ((x^2)+(y^2)+(z^2))<((vein.radius.average+nv)^2) then
--minetest.set_node(posc, {name=vein.primary})
nodes[posi]=primary_ctx
end
noise_ix=noise_ix+1
end end end
else
--print("vein "..vein.primary.." bad environmnent -"..minetest.get_node({x0,y0,z0}).name.."="..nodes[posi])
end
end
end
end
if did_generate then
manipulator:set_data(nodes)
--manipulator:calc_lighting()
manipulator:write_to_map()
print("end veingen "..(os.clock()-timebefore))
else
print("end veingen (nothin generated)")
end
end
-- ~ Tomas Brod

2
mineral/depends.txt Normal file
View File

@ -0,0 +1,2 @@
rocks
default

38
mineral/init.lua Normal file
View File

@ -0,0 +1,38 @@
--
-- The minerals mod.
--
minetest.log("info","/mineral mod initializing")
-- Load translation library if intllib is installed
if (minetest.get_modpath("intllib")) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
end
local function GetNoiseParams()
return {
scale=1, offset=0, seed=rocksl.GetNextSeed(), octaves=1, persist=1,
spread={ x=100, y=100, z=100 } }
end
mineral={}
mineral.noise={}
local print=function(text)
minetest.log("info","/mineral "..text)
end
local modpath=minetest.get_modpath(minetest.get_current_modname())
mineral.noise.Copper=GetNoiseParams()
mineral.noise.PbZn=GetNoiseParams()
mineral.noise.Iron=GetNoiseParams()
mineral.noise.Tin=GetNoiseParams()
dofile(modpath.."/skarn.lua")
dofile(modpath.."/pegmatite.lua")

42
mineral/pegmatite.lua Normal file
View File

@ -0,0 +1,42 @@
--
-- Pegmatite deposit
--
local function GetNoiseParams()
return {
scale=1, offset=0, seed=rocksl.GetNextSeed(), octaves=1, persist=1,
spread={ x=100, y=100, z=100 } }
end
-- ores have to be redefined for pegmatite background
-- Ore/Mineral Percent
-- Spodumene 7%
-- Muscovite (mica) 7%
-- Kyanite 5%
-- Lepidolite 2.5%
-- Tantalite 2%
-- Cassiterite 1.5%
-- Wolframite 1%
-- Pollucite 0.1%
-- Cassiterite
minetest.register_node( "mineral:pegmatite_cassiterite", {
description = S("Cassiterite"),
tiles = { "rocks_Pegmatite.png^mineral_cassiterite.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
minetest.register_ore({
wherein="rocks:pegmatite",
ore="mineral:pegmatite_cassiterite",
clust_size=3,
clust_num_ores=9,
clust_scarcity=4^3,
noise_treshold=-0.1,
noise_params=mineral.noise.Tin
})
-- ~ Tomas Brod

123
mineral/skarn.lua Normal file
View File

@ -0,0 +1,123 @@
--
-- Skarn deposit
--
-- ores have to be redefined for skarn background
-- Chalcopyrite
minetest.register_node( "mineral:skarn_chalcopyrite", {
description = S("Chalcopyrite"),
tiles = { "rocks_Skarn.png^mineral_Chalcopyrite.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- Malachyte
minetest.register_node( "mineral:skarn_malachyte", {
description = S("Malachyte"),
tiles = { "rocks_Skarn.png^mineral_Chalcopyrite.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- Chalcopyrite/Malachyte skarn mix
minetest.register_ore({
wherein="rocks:skarn",
ore="mineral:skarn_chalcopyrite",
clust_size=3,
clust_num_ores=12,
clust_scarcity=4^3,
noise_treshold=0.333,
noise_params=mineral.noise.Copper
})
minetest.register_ore({
wherein="rocks:skarn",
ore="mineral:skarn_malachyte",
clust_size=3,
clust_num_ores=11,
clust_scarcity=4^3,
noise_treshold=0.333,
noise_params=mineral.noise.Copper
})
-- Sphalerite
minetest.register_node( "mineral:skarn_sphalerite", {
description = S("Sphalerite"),
tiles = { "rocks_Skarn.png^mineral_sphalerite.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- Galena
minetest.register_node( "mineral:skarn_galena", {
description = S("Galena"),
tiles = { "rocks_Skarn.png^mineral_galena.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- Pb Zn skarn mix
minetest.register_ore({
wherein="rocks:skarn",
ore="mineral:skarn_sphalerite",
clust_size=3,
clust_num_ores=9,
clust_scarcity=4^3,
noise_treshold=0.38,
noise_params=mineral.noise.PbZn
})
minetest.register_ore({
wherein="rocks:skarn",
ore="mineral:skarn_galena",
clust_size=3,
clust_num_ores=10,
clust_scarcity=4^3,
noise_treshold=0.38,
noise_params=mineral.noise.PbZn
})
-- marble and hornfels, as well as unchanged limestone.
-- { ore="rocks:marble", percent=10 },
-- { ore="rocks:hornfels", percent=10 },
-- { ore="rocks:skarn_galena", percent=25 },
-- { ore="rocks:skarn_sphalerite", percent=25 },
-- Magnetite
minetest.register_node( "mineral:skarn_magnetite", {
description = S("Magnetite"),
tiles = { "rocks_Skarn.png^mineral_Magnetite.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- Fe skarn mix
minetest.register_ore({
wherein="rocks:skarn",
ore="mineral:skarn_magnetite",
clust_size=3,
clust_num_ores=13,
clust_scarcity=4^3,
noise_treshold=0.3,
noise_params=mineral.noise.Iron
})
-- marble and hornfels, as well as unchanged limestone.
-- { ore="rocks:marble", percent=10 },
-- { ore="rocks:hornfels", percent=10 },
-- { ore="rocks:skarn_magnetite", percent=40 },
-- Magnesite
minetest.register_node( "mineral:skarn_magnesite", {
description = S("Magnesite"),
tiles = { "rocks_Skarn.png^mineral_Magnesite.png" },
groups = {cracky=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- Vermiculite (fixme: move to CommonRocks)
minetest.register_node( "mineral:vermiculite", {
description = S("Vermiculite"),
tiles = { "mineral_Vermiculite.png" },
groups = {crumbly=3},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- magnesite/vermiculite skarn mix
-- marble and hornfels, as well as unchanged limestone.
-- { ore="rocks:marble", percent=10 },
-- { ore="rocks:hornfels", percent=10 },
-- { ore="rocks:skarn_magnesite", percent=30 },
-- { ore="rocks:vermiculite", percent=20 },
-- ~ Tomas Brod

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 929 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

1
modpack.txt Normal file
View File

@ -0,0 +1 @@
# This is now a modpack, for you to ask why :)

205
rocks/gensed.lua Normal file
View File

@ -0,0 +1,205 @@
-- experimental sedimentary layer generator
local np_elv = {
offset = 0, octaves = 2, persist = 0.4,
scale = 8,
spread = {x=25, y=25, z=25},
seed = -546,
}
local np_typ1 = {
offset = 0, octaves = 2, persist = 0.33,
scale = 1,
spread = {x=50, y=50, z=50},
seed = -5500,
}
local np_typ2 = {
offset = 0, octaves = 2, persist = 0.33,
scale = 1,
spread = {x=70, y=70, z=70},
seed = -5472,
}
local np_vc = {
offset = 0, octaves = 2, persist = 0.33,
scale = 1,
spread = {x=100, y=100, z=100},
seed = 749,
}
local np_sp = {
offset = 0, octaves = 2, persist = 0.33,
scale = 1,
spread = {x=150, y=150, z=150},
seed = -1284,
}
local stats
stats={ total=0 }
rocksl.gensed = function (minp, maxp, seed, vm, area)
local t1 = os.clock()
local data = vm:get_data()
local chunksize = maxp.x - minp.x + 1
local pmapsize = {x = chunksize, y = chunksize, z = chunksize}
local minpxz = {x = minp.x, y = minp.z}
local c_stone= minetest.get_content_id("default:stone")
local c_dwg= c_stone
local sla = {
{min=18, sd=169},
{min=9, sd=324},
{min=0, sd=-230},
{min=-6, sd=850},
{min=-12, sd=-643},
{min=-18, sd=0},
}
if minp.y<(sla[#sla].min-10) then return end
local biomes = {
lava={ mod="default" },
nyancat={ mod="default" },
wood={ mod="default" },
gravel={ mod="default" },
sand={ mod="default" },
sandstone={ mod="default" },
clay={ mod="default" },
claystone={ mod="rocks" },
slate={ mod="rocks" },
conglomerate={ mod="rocks" },
mudstone={ mod="rocks" },
limestone={ mod="rocks" },
blackcoal={ mod="rocks" },
lignite={ mod="rocks" },
anthracite={ mod="rocks" },
}
for k,v in pairs(biomes) do
v.ctx=v.ctx or minetest.get_content_id(v.mod..":"..k)
if stats and (stats[k]==nil) then stats[k]=0 end
end
n_elv= minetest.get_perlin_map(np_elv, pmapsize) : get2dMap_flat(minp)
local generated
local nixz= 0
local nixyz= 0
for z=minp.z, maxp.z do for x=minp.x, maxp.x do
nixz= nixz+1
-- loop
local bi
local li
for y=maxp.y, minp.y, -1 do
nixyz=nixyz+1
local di=area:index(x,y,z)
local yn=y +n_elv[nixz]
if (data[di]==c_stone) and ((not bi)or(yn<sla[li].min)) then
-- go to deeper layer
if not li then li=1 end
while (li<=#sla)and(sla[li].min>yn) do
li=li+1
end
-- create noises for this layer
if li>#sla then break end -- break y loop if too low
if (not sla[li].n_tp1) then
local altminpxz={ x=minp.x+sla[li].sd,
y=minp.z-sla[li].sd}
sla[li].n_tp1= minetest.get_perlin_map(np_typ1, pmapsize) : get2dMap_flat(altminpxz)
sla[li].n_tp2= minetest.get_perlin_map(np_typ2, pmapsize) : get2dMap_flat(altminpxz)
sla[li].n_vc= minetest.get_perlin_map(np_vc, pmapsize) : get2dMap_flat(altminpxz)
sla[li].n_sp= minetest.get_perlin_map(np_sp, pmapsize) : get2dMap_flat(altminpxz)
end
-- BEGIN geome resolution
local vcva= math.abs(sla[li].n_vc[nixz])
local vcv= sla[li].n_vc[nixz]
local spv= sla[li].n_sp[nixz]
local tp=1 --=particulates, 2=biosediments, 3=chemosediments, 4=vulcanosediments
if sla[li].n_tp1[nixz]>0.2 then tp=2
if sla[li].n_tp2[nixz]>0.81 then tp=4 end
elseif sla[li].n_tp2[nixz]>0.76 then tp=3 end
if tp==1 then
-- particulates
if vcva>0.453 then
-- clay-(0,stone,slate)
if spv>0.23 then bi="slate"
elseif spv>-0.2 then bi="claystone"
else bi="clay" end
elseif vcva>0.4 then
bi="mudstone"
elseif vcva>0.2 then
-- sand-(0,stone)
if spv>-0.3 then bi="sandstone" else bi="sand" end
else
-- gravel/conglomerate
if spv>-0.34 then bi="conglomerate" else bi="gravel" end
-- breccia?
end
elseif tp==2 then
-- biosediments
if vcv>0.05 then
bi="limestone"
elseif vcv>-0.1 then
--uhlia
if spv>0.7 then bi="anthracite"
elseif spv>0 then bi="blackcoal"
else bi="lignite" end
else
--ine
bi="wood"
end
end
-- END geome resolution
if not bi then bi="nyancat" end
generated=true
end
if (data[di]==c_stone) then
data[di]=biomes[bi].ctx
if stats then stats.total=stats.total+1 stats[bi]=stats[bi]+1 end
end
end
end end
if generated then
vm:set_data(data)
if stats then for k,v in pairs(stats) do print("stat: "..k..": "..((v/stats.total)*100).."%") end end
else
print("no sed layer y="..minp.y)
end
minetest.log("action", "rocks/gensed/ "..math.ceil((os.clock() - t1) * 1000).." ms ")
end
minetest.register_node( "rocks:slate", {
description = S("Slate"),
tiles = { "rocks_Slate.png" },
is_ground_content = true, sounds = default.node_sound_dirt_defaults(),
groups = {cracky=3},
})
minetest.register_node( "rocks:claystone", {
description = S("Claystone"),
tiles = { "rocks_claystone.png" },
is_ground_content = true, sounds = default.node_sound_dirt_defaults(),
groups = {crumbly=1, cracky=3},
})
minetest.register_node( "rocks:conglomerate", {
description = S("Conglomerate"),
tiles = { "rocks_conglomerate.png" },
is_ground_content = true, sounds = default.node_sound_dirt_defaults(),
groups = {crumbly=3},
})
minetest.register_node( "rocks:lignite", {
description = S("Lignite coal"),
tiles = { "rocks_Mudstone.png^rocks_lignite.png" },
is_ground_content = true,
groups = {crumbly=3},
})
minetest.register_node( "rocks:blackcoal", {
description = S("Black coal"),
tiles = { "rocks_Mudstone.png^default_mineral_coal.png" },
is_ground_content = true,
groups = {crumbly=3},
})
minetest.register_node( "rocks:anthracite", {
description = S("Anthracite coal"),
tiles = { "rocks_Mudstone.png^rocks_anthracite.png" },
is_ground_content = true,
groups = {crumbly=3},
})

143
rocks/ign.lua Normal file
View File

@ -0,0 +1,143 @@
--
-- Igneous Layer
--
-- Basalt Ex/Mafic hard same as diorite, byt limit=0.5
minetest.register_node( "rocks:basalt", {
description = S("Basalt"),
tiles = { "rocks_Basalt.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
minetest.register_alias("mapgen_stone", "rocks:basalt")
-- ^ does not work. Seems we can not overwrite an alias.
-- If the alias in default/mapgen.lua is deleted, this works.
-- more rock defs
minetest.register_node( "rocks:granite", {
description = S("Granite"),
tiles = { "rocks_wgr.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=3, stone=1},
})
minetest.register_node( "rocks:diorite", {
description = S("Diorite"),
tiles = { "rocks_Diorite.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
minetest.register_node( "rocks:gabbro", {
description = S("Gabbro"),
tiles = { "rocks_Gabbro.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
local reg=function(name,param)
minetest.register_ore({
ore = name,
wherein= param.inr,
ore_type = "scatter",
clust_scarcity = 10^3,
clust_num_ores = 20^3,
clust_size = 20,
height_min = -31000,
height_max = 28,
noise_threshhold=param.treshold,
noise_params={
offset = 0, scale = 1, octaves = 1, persist = 0.5,
spread = {x=param.spread, y=param.height, z=param.spread},
seed=rocksl.GetNextSeed(),
},
})
end
rocks.register_igneous_stratus=reg
-- vein stuff
local regv=function(name,param)
minetest.register_ore({
ore = name,
wherein= param.wherein,
ore_type = "blob",
clust_scarcity = param.rarity^3,
clust_num_ores = 8,
clust_size = param.radius.average*2,
height_min = -31000,
height_max = 50,
noise_threshhold = 0.5, --< determined experimentally
noise_params={
offset = 1-param.radius.amplitude, scale = param.radius.amplitude, octaves = 3, persist = 0.5,
spread = {x=param.radius.frequency, y=param.radius.frequency, z=param.radius.frequency},
seed=rocksl.GetNextSeed(),
},
})
end
rocks.register_vein=regv
local np_layer = {
offset = 0, octaves = 3, persist = 0.46,
scale = 30,
spread = {x=500, y=500, z=500},
seed = -5500,
}
local np_intr = {
octaves = 3, persist = 0.46,
scale = 20,
offset = -15,
spread = {x=100, y=100, z=100},
seed = 3740,
}
--minetest.register_on_generated( function( minp, maxp, seed )
rocksl.genign=function(minp,maxp,seed, vm, area)
local t1 = os.clock()
local data = vm:get_data()
local chunksize = maxp.x - minp.x + 1
local pmapsize = {x = chunksize, y = chunksize, z = 1}
local pmapminpxz = {x = minp.x, y = minp.z}
local c_stone= minetest.get_content_id("default:stone")
local layers= {
{ min=-100, node="rocks:granite" },
{ min=-240, node="rocks:diorite"},
{ node="rocks:gabbro", min=-700},
}
for k,v in pairs(layers) do
v.ctx=minetest.get_content_id(v.node)
end
local layers_no=#layers
local n_layer= minetest.get_perlin_map(np_layer, pmapsize) : get2dMap_flat(pmapminpxz)
local n_intr= minetest.get_perlin_map(np_intr, pmapsize) : get2dMap_flat(pmapminpxz)
local nixz= 1
for z=minp.z, maxp.z do for x=minp.x, maxp.x do
-- loop
for y=minp.y, maxp.y do
local di=area:index(x,y,z)
local yn=y+n_layer[nixz]
local vintr=n_intr[nixz]
if vintr<1 then vintr=1 end
if data[di]==c_stone then
yn=yn*vintr -- vertical intrusion
for li=1, layers_no do
if yn > layers[li].min then
data[di]=layers[li].ctx
break
end
end
end
end
nixz= nixz+1
end end
vm:set_data(data)
--DEBUG: vm:set_lighting({day=15,night=2})
minetest.generate_ores(vm)
minetest.log("action", "rocks/layer/ "..math.ceil((os.clock() - t1) * 1000).." ms ")
end
-- ~ Tomas Brod

49
rocks/init.lua Normal file
View File

@ -0,0 +1,49 @@
minetest.log("info","[rocks] mod initializing")
-- Load translation library if intllib is installed
if (minetest.get_modpath("intllib")) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
end
rocks={}
rocksl={}
rocksl.print=function(text)
minetest.log("info","/rocks "..text)
end
rocksl.seedprng=PseudoRandom(763)
rocksl.GetNextSeed=function()
return rocksl.seedprng:next()
end
minetest.clear_registered_ores()
local modpath=minetest.get_modpath(minetest.get_current_modname())
dofile(modpath.."/sed.lua")
dofile(modpath.."/ign.lua")
dofile(modpath.."/skarn.lua")
dofile(modpath.."/pegmatite.lua")
dofile(modpath.."/gensed.lua")
dofile(modpath.."/pipes.lua")
dofile(modpath.."/veins.lua")
minetest.register_on_generated(function(minp,maxp,seed)
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local pr=PseudoRandom(seed)
rocksl.gensed(minp,maxp,seed,vm,area)
--rocksl.genign
rocksl.genvein(minp,maxp,pr,vm,area)
for _,pipe in pairs(rocks.pipes) do rocksl.genpipe(minp,maxp,pr,vm,area,pipe) end
vm:write_to_map(data)
end)
minetest.register_on_mapgen_init(function(mapgen_params)
-- todo: disable caves and ores
end)

24
rocks/pegmatite.lua Normal file
View File

@ -0,0 +1,24 @@
--
-- Pegmatite vein
--
local CommonRarity=45
minetest.register_node( "rocks:pegmatite", {
description = S("Pegmatite"),
tiles = { "rocks_Pegmatite.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- ores have to be redefined for pegmatite background
-- pegmatites are only 1 kind
rocks.register_vein("rocks:pegmatite",{
wherein={ "rocks:granite" },
miny=-160, maxy=20,
radius={ average=18, amplitude=0.3, frequency=16 },
density=80, rarity=CommonRarity,
ores={
}
})

96
rocks/pipes.lua Normal file
View File

@ -0,0 +1,96 @@
-- experimental slow pipe generator
local function brush(data,area,pos,radius,content,ores,pr)
local rsq=radius^2
local orect
local oresc
radius=radius+2
for _,ore in pairs(ores) do
if pr:next(0,ore.scarcity)==0 then
orect=ore.c_ore
oresc=ore.density
end
end
for x=-radius, radius do
for y=-radius, radius do
for z=-radius, radius do
if (x^2)+(y^2)+(z^2)<=rsq then
local di=area:index(x+pos.x,y+pos.y,z+pos.z)
if oresc and (pr:next(0,oresc)==0) then
data[di]=orect
else
data[di]=content
end
end
end end end
end
-- the public table of registered pipes
rocks.pipes={}
local examplepipe={
bedrock={ "rocks:limestone" },
startrock={ "rocks:limestone" },
ymin=-200, ymax=-6,
scarcity=80,
radius=3,
content="default:wood",
scatter=
{
{ scarcity=7, density=4, ore="default:mese", cnt=0},
},
}
table.insert(rocks.pipes,examplepipe)
--profiling
table.insert(rocks.pipes,{
bedrock={ "rocks:limestone" },
startrock={ "rocks:limestone" },
ymin=-200, ymax=-6,
scarcity=80,
radius=3,
content="default:dirt",
scatter=
{
{ scarcity=5, density=4, ore="default:mese", cnt=0},
},
})
rocksl.genpipe=function(minp,maxp,pr,vm,area,descr)
local t1 = os.clock()
local data = vm:get_data()
local chunksizer = maxp.x - minp.x + 1
local chunksize = chunksizer + 1
local pmapsize = {x = chunksize, y = chunksize, z = chunksize}
local minpxz = {x = minp.x, y = minp.z}
local bedrocks={}
for _,node in pairs(descr.bedrock) do bedrocks[minetest.get_content_id(node)]=true end
local startrocks={}
for _,node in pairs(descr.startrock) do startrocks[minetest.get_content_id(node)]=true end
local content=minetest.get_content_id(descr.content)
for _,des in pairs(descr.scatter) do
des.c_ore=minetest.get_content_id(des.ore)
end
local orepr=PseudoRandom(pr:next())
local numpipes_raw=(chunksize/descr.scarcity)
local numpipes = math.floor(numpipes_raw + (pr:next(0,99)/100))
for vc=1, numpipes do
local pointA=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
if (#startrocks>0)and(startrocks[data[area:indexp(pointA)]]==nil) then break end
local pointB=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
local pointC=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
local step=(1.8*descr.radius)/(vector.distance(pointA,pointB)+vector.distance(pointB,pointC))
for t=0, 1, step do
local p=vector.multiply(pointA,(1-t)^2)
p=vector.add(p, vector.multiply(pointB,2*t*(1-t)) )
p=vector.add(p, vector.multiply(pointC,t*t) )
p=vector.round(p)
brush(data,area,p,descr.radius,content,descr.scatter,orepr)
end
end
vm:set_data(data)
minetest.log("action", "rocks/genpipe/ "..math.ceil((os.clock() - t1) * 1000).." ms ")
end

185
rocks/sed.lua Normal file
View File

@ -0,0 +1,185 @@
--
-- Sedimentary Layer
--
-- Mudstone Sed soft Ocean, beach, river, glaciers
minetest.register_node( "rocks:mudstone", {
description = S("Mudstone"),
tiles = { "rocks_Mudstone.png" },
groups = {cracky=1, crumbly=3},
is_ground_content = true, sounds = default.node_sound_dirt_defaults(),
})
-- more rock defs
minetest.register_node( "rocks:limestone", {
description = S("Limestone"),
tiles = { "rocks_Limestone.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=2},
})
minetest.register_node( "rocks:laterite", {
description = S("Laterite clay"),
tiles = { "rocks_laterite.png" },
is_ground_content = true, sounds = default.node_sound_dirt_defaults(),
groups = {crumbly=3},
})
local beach_max=4
local lowland_max=27
local highland_max=200
local beach_min=-7
local lowland_min=5
local highland_min=28
do
-- Modify default grassland biome
local grassland=minetest.registered_biomes["default:grassland"] or
{ -- default biome, if no biome mod is installed
name = "rocks:grassland",
node_top = "air",
depth_top = 0,
depth_filler=0,
y_min = lowland_min,
y_max = lowland_max,
heat_point = 50,
humidity_point = 50,
}
local mountains={ -- default mountain biome
name = "rocks:mountain",
node_top = "default:dirt_with_grass",
depth_top = 1,
node_filler = "default:dirt",
depth_filler = 2,
node_stone = nil,
y_min = highland_min,
y_max = highland_max,
heat_point = 50,
humidity_point = 50,
}
-- The biome layers are: dust, top, filler, stone
-- On beach: dust, shore_top, shore_filler, underwater
-- coastside: dust, top, filler, shore_filler, underwater, stone
if #minetest.registered_biomes > 1 then
minetest.log("error","Biomes registered before [rocks] discarded, please depend the mod on 'rocks' to fix this.")
-- can't just re-register them here, cause clear_biomes also clears decorations
end
minetest.clear_registered_biomes()
-- hook to inject our sedimentary stone to new biomes
local old_register_biome=minetest.register_biome
minetest.register_biome=function(def)
--print("[rocks] register_biome .name="..def.name)
for n,v in pairs(def) do
--if type(v)~="table" then print(" "..n.."="..v) end
end
local cor=false -- was the biomeheight patched?
local tl=3 -- tolerance in determining biome type based on y_min/max values
local btype -- biome type (:string)
if (def.y_max>3000) and (def.y_min<=highland_min) then
-- correct upper boundary of registered bimes
if (def.y_min<10) and (def.y_min>0) then def.y_max=lowland_max cor=true end
if (def.y_min<30) and (def.y_min>10) then def.y_max=highland_max cor=true end
minetest.log("action","/rocks correcting upper bound on biome "..def.name.." to "..def.y_max)
end
-- actual detection code
if def.node_stone=="default:desert_stone" then btype="desert"
elseif (def.y_min>beach_min-tl) and (def.y_max<beach_max+tl) then btype="beach"
elseif (def.y_min>0) and (def.y_max<lowland_max+tl) then btype="lowland"
elseif (def.y_min>highland_min-tl) and (def.y_max<highland_max+tl) then btype="highland"
elseif (def.y_min<-3000) and (def.y_max<lowland_min+tl) then btype="ocean"
else minetest.log("error", "/rocks could not guess elevation type for biome "..def.name) end
rocksl.print("register_biome .name="..def.name.." -> btype="..btype)
-- patch the new biomes with our rocks
if btype=="lowland" then
--def.node_filler="rocks:mudstone"
--def.depth_filler=11
--def.node_stone="rocks:granite"
if (def.humidity_point>80) and (def.heat_point>80) then
--def.node_filler="rocks:laterite"
end
elseif btype=="highland" then
def.node_filler="rocks:limestone"
def.node_stone="rocks:limestone"
def.depth_filler=15
elseif btype=="beach" then
def.node_stone="rocks:granite"
def.y_min=beach_min
if def.heat_point<50 then
def.node_top="default:gravel"
def.node_filler="default:gravel"
def.depth_filler=2
elseif def.node_top=="default:sand" then
if def.depth_top<2 then def.depth_top=3 end
def.node_filler="default:sandstone"
def.depth_filler=5
end
elseif btype=="ocean" then
def.node_stone="rocks:basalt"
def.node_top="default:gravel"
def.node_filler="rocks:limestone"
end
do -- deactivate the added and removed shore-thing of MGv7
-- to fix weirid sand layers underground
def.node_shore_top=def.node_top
def.node_shore_filler=def.node_filler
def.node_underwater=def.node_top
end
-- and call the saved method to actually do the registration
old_register_biome(def)
end
--now register the default grassland
minetest.register_biome(grassland)
-- create a default mountain biome...
minetest.register_biome(mountains)
-- hook the clear callback (fix biomesdev)
local old_clear=minetest.clear_registered_biomes
minetest.clear_registered_biomes=function()
old_clear()
minetest.log("action","/rocks re-registering default mountain biome!")
minetest.register_biome(mountains)
end
end
-- more biomes
-- todo: mountains, alps, volcanos
local reg=function(name,param)
minetest.register_ore({
ore=name,
wherein= {
"rocks:mudstone",
},
ore_type = "scatter",
clust_scarcity = 8^3,
clust_size = 10,
clust_num_ores = 10^3,
y_min = -20,
y_max = 40,
noise_threshhold = param.treshold,
noise_params = {
offset=0, scale=1, octaves=1, persist=0.3,
spread={x=param.spread, y=param.height, z=param.spread},
seed=rocksl.GetNextSeed(),
},
})
end
-- this does register a new sedimentary vein.
rocks.register_sedimentary=reg
-- follows the only thing remaining from old ver :)
-- Sedimentary rock hardness and distribution
-- Rock Hard Distribution
--Breccia Weak Localized continental, folded
-->Claystone Weak Localized continental, folded, oceanic
--Conglomerate Weak Localized continental, folded
-->Limestone Medium Localized continental, folded; primary oceanic, hills
-->Coal - Large beds, twice as common in swamps
--reg("rocks:limestone", { spread=64, height=32, treshold=0.35 })
--reg("rocks:breccia", { spread=64, height=32, treshold=0.6 })
--reg("rocks:conglomerate", { spread=64, height=32, treshold=0.6 })
--reg("default:stone_with_coal", { spread=64, height=14, treshold=0.58 })
--reg("default:clay",{ spread=48, height=14, treshold=0.55 })
-- ~ Tomas Brod

30
rocks/skarn.lua Normal file
View File

@ -0,0 +1,30 @@
--
-- Skarn deposit
--
local CommonRarity=40 --too high... should be like 76
local CommonRadius=10
local CommonWherein={ "rocks:granite", "rocks:limestone" }
minetest.register_node( "rocks:skarn", {
description = S("Skarn"),
tiles = { "rocks_Skarn.png" },
groups = {cracky=3, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- skarn deposit
rocks.register_vein("rocks:skarn",{
wherein=CommonWherein,
miny=-320, maxy=300,
radius={ average=CommonRadius, amplitude=0.16, frequency=8 },
density=80, rarity=CommonRarity,
})
-- Todo:
-- There is also a chance of isolated lapis crystals, Gold
-- Molybdenite with Cu
-- wollastonite with Fe
-- enrichments: scheelite and wollastonite
-- ~ Tomas Brod

View File

@ -11,3 +11,9 @@ rocks_Peridotite.png
rocks_Rhyolite.png rocks_Rhyolite.png
rocks_Schist.png rocks_Schist.png
rocks_Slate.png rocks_Slate.png
rocks_Skarn.png
rocks_laterite.png
rocks_claystone.png
rocks_conglomerate.png
rocks_anthracite.png
rocks_lignite.png

View File

Before

Width:  |  Height:  |  Size: 941 B

After

Width:  |  Height:  |  Size: 941 B

View File

Before

Width:  |  Height:  |  Size: 612 B

After

Width:  |  Height:  |  Size: 612 B

View File

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 992 B

View File

Before

Width:  |  Height:  |  Size: 772 B

After

Width:  |  Height:  |  Size: 772 B

View File

Before

Width:  |  Height:  |  Size: 1022 B

After

Width:  |  Height:  |  Size: 1022 B

View File

Before

Width:  |  Height:  |  Size: 910 B

After

Width:  |  Height:  |  Size: 910 B

View File

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 712 B

View File

Before

Width:  |  Height:  |  Size: 794 B

After

Width:  |  Height:  |  Size: 794 B

View File

Before

Width:  |  Height:  |  Size: 851 B

After

Width:  |  Height:  |  Size: 851 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

View File

Before

Width:  |  Height:  |  Size: 937 B

After

Width:  |  Height:  |  Size: 937 B

View File

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 914 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 B

View File

Before

Width:  |  Height:  |  Size: 677 B

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 B

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

47
rocks/veins.lua Normal file
View File

@ -0,0 +1,47 @@
-- experimental fast vein generator
rocksl.genvein=function(minp,maxp,pr,vm,area)
local t1 = os.clock()
local data = vm:get_data()
local chunksizer = maxp.x - minp.x + 1
local chunksize = chunksizer + 1
local pmapsize = {x = chunksize, y = chunksize, z = chunksize}
local minpxz = {x = minp.x, y = minp.z}
local c_sample=minetest.get_content_id("default:stone")
local c_sample_ore=minetest.get_content_id("default:mese")
local A=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
local B=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
local C=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
local D=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z)
local l1=vector.distance(A,C)+vector.distance(C,B)
local l2=vector.distance(A,D)+vector.distance(D,B)
local step=1.4/math.max(l1,l2)
print("step="..step.." l1="..l1.." l2="..l2)
local scarcity=6
local ocn=pr:next(0,scarcity)+(scarcity/2)
for t=0, 1, step do
local P=vector.multiply(A,(1-t)^2)
P=vector.add(P, vector.multiply(B,t*t) )
local Q=vector.add(P, vector.multiply(D,2*t*(1-t)) )
P=vector.add(P, vector.multiply(C,2*t*(1-t)) )
local step2=1/vector.distance(P,Q)
for u=0, 1, step2 do
local R=vector.add(vector.multiply(P,(1-u)), vector.multiply(Q,u) )
local di=area:indexp(vector.round(R))
if ocn<1 then
data[di]=c_sample_ore
ocn=pr:next(0,scarcity)+(scarcity/2)
else
data[di]=c_sample
ocn=ocn-1
end
end
end
vm:set_data(data)
minetest.log("action", "rocks/genvein/ "..math.ceil((os.clock() - t1) * 1000).." ms ")
end

68
sed.lua
View File

@ -1,68 +0,0 @@
--
-- Sedimentary Layer
--
local sed={
top={
offset = 20, scale = 0,
spread = {x=80, y=80, z=80},
octaves = 0, persist = 0 },
bot={
offset = -16, scale = 10, seed=rocksl.GetNextSeed(),
spread = {x=80, y=80, z=80},
octaves = 2, persist = 0.7 },
primary={ name="rocks:mudstone" },
localized={},
stats={ count=0, total=0, node={}, totalnodes=0 },
debugging=nil
}
-- Mudstone Sed soft Ocean, beach, river, glaciers
minetest.register_node( "rocks:mudstone", {
description = S("Mudstone"),
tiles = { "rocks_Mudstone.png" },
groups = {cracky=1, crumbly=3},
is_ground_content = true, sounds = default.node_sound_dirt_defaults(),
})
-- more rock defs
minetest.register_node( "rocks:limestone", {
description = S("Limestone"),
tiles = { "rocks_Limestone.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=2},
})
local reg=function(name,param)
rocksl.register_stratus(sed,name,param)
end
rocks.register_sedimentary=reg
-- Sedimentary rock hardness and distribution
-- Rock Hard Distribution
--Breccia Weak Localized continental, folded
-->Claystone Weak Localized continental, folded, oceanic
--Conglomerate Weak Localized continental, folded
-->Limestone Medium Localized continental, folded; primary oceanic, hills
-->Coal - Large beds, twice as common in swamps
reg("rocks:limestone", { spread=64, height=32, treshold=0.36 })
--reg("rocks:breccia", { spread=64, height=32, treshold=0.6 })
--reg("rocks:conglomerate", { spread=64, height=32, treshold=0.6 })
reg("default:stone_with_coal", { spread=48, height=14, treshold=0.40 })
reg("default:clay",{ spread=48, height=14, treshold=0.50 })
minetest.register_on_generated(function(minp, maxp, seed)
rocksl.layergen(sed,minp,maxp,seed)
end)
minetest.register_on_shutdown(function()
if (sed.stats.count==0) then rocksl.print("[rocks](sed) stats not available, no chunks generated") return end
rocksl.print("[rocks](sed) generated total "..sed.stats.count.." chunks in "..sed.stats.total.." seconds ("..(sed.stats.total/sed.stats.count).." seconds per "..sed.stats.side.."^3 chunk)")
for name,total in pairs(sed.stats.node) do
rocksl.print("[rocks](sed) "..name..": "..total.." nodes placed ("..(total*100)/(sed.stats.totalnodes).." %)")
end
end)
-- ~ Tomas Brod

BIN
vein0.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB