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

114 Commits

Author SHA1 Message Date
2b7e20b4bb Very old thing that I forgot to commit. 2016-07-17 11:18:36 +02:00
16a9a079d9 Deduplication, param cleanup. Veins. 2015-07-05 14:28:58 +02:00
f9d6fbdcea Vein stuff. 2015-07-03 21:26:19 +02:00
90718a30ee Vein registration stuff. 2015-07-03 21:00:38 +02:00
1b318ccedc ~debug 2015-07-03 20:55:05 +02:00
a7278f26d8 Checking for enviroment. 2015-07-02 16:01:27 +02:00
4b1d998116 The depends file for dg. 2015-07-02 15:54:00 +02:00
d01049f0d0 Pipe beush and scatter. 2015-07-02 15:47:17 +02:00
0b0deec9a0 Pipe deposit registration function. 2015-06-30 13:48:02 +02:00
9b9419f2eb New oregen init. 2015-06-30 13:29:11 +02:00
a9f2272127 Remove old. 2015-06-30 12:58:26 +02:00
f4ba640dcf notes 2015-06-30 12:57:36 +02:00
8ace387da3 Experiments with layers. 2015-06-17 14:07:20 +02:00
945be335d8 Experiments with layers. 2015-06-07 11:59:31 +02:00
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
c1cf871d2c Renamed mapgen strata register func, added reg for veins, disabled debug. 2015-04-04 00:10:37 +02:00
4d7d8cd80d Vein generator finished and use flat noisemap and vox'ma'nips. 2015-04-03 23:54:50 +02:00
229e0e4e80 Experimental vein generator based on sphere deformed vith 3D noise.
The nyan cat is a bonus :)
2015-04-03 21:32:20 +02:00
dbbd865125 Preserving order of registered strata, fixed some noise params, added upper boundary check to mapgen. 2015-04-03 16:06:45 +02:00
f02a668c22 Better logging system. 2015-04-03 15:48:49 +02:00
57b51fa10f disable debug 2015-04-02 21:14:05 +02:00
292ad18921 update doc of the new host and the rewrite 2015-04-02 20:31:01 +02:00
21d2a4779d Rewrite igneous layer. 2015-04-02 20:19:33 +02:00
cd3c2b2586 Putising some igneous stuff from sedimentaary. 2015-04-02 00:35:35 +02:00
6693f103a1 Fix, debug, cleanup. 2015-04-02 00:28:56 +02:00
12f7c99e9f Sedimentary layer rewrite. 2015-04-01 22:23:06 +02:00
68 changed files with 867 additions and 520 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]

163
a.txt
View File

@ -1,110 +1,145 @@
Geological layer generator for [Minetest] "rocks"
Geological layer generator for Minetest "rocks" {wip}
=============
Aim of this mod is to replace all generic stone (default:stone) and
generate underground layers of different rocks.
Currently everithing generated above ground, in air. This is for debugging.
Features
--------
* layers of different rocks: sort of working
* ore veins: nothing
* extensibility, api: ok
* ore veins: being added
* extensibility, api: changed million times
** Work in progress! **
* Git clone: [https](https://gitorious.org/mt/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)
* 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
-----------
* Layers: ![sample of layers](layers0.png)
* Coal pane: ![large coal deposit](coal-pane0.png)
* Vein: ![sample of generated vein](vein0.png)
all were out of date
License
-------
* My Code: GNU General Public License v2 or higher.
* Media: see txt files in the texture folder
* stated in the corresponding file
Documentation
-------------
How the underground is generated: *todo*.
Underground is divided into horizontal layers. Bottom of each layer is at
fixed height and moved up or down by 2d perlin noise.
Mod has been rewritten, so no doc yet.
In every layer there can be multiple veins. Veins are blob-shaped volumes
of different rocks. Borders of vein are defined by 3d perlin noise. Veins
often contain ores.
The sedimentary layer
-------------
In every vein, ores are distributed randomly. Some ores
may occur in specific areas of the vein (where noise is higher than
treshold) or distributed randomly in specific amount (chance based on
pseudorandom number) or combination of both.
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.
There is 1 2d perlin noise per layer, 1 3d perlin noise per vein and 1
pseudorandom number generator per ore.
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.
Modding Interface
-----------------
There are various types of sedimentary rock. They are generated according
to 2D noises described below.
"Rocks" exposes api to add new ores, veins and layers. The api is defined
in [register](register.lua).
types = Clastic, Biochemical, Chemical, Vulcano/Other
### Register layer
| X | tp2<0.76 | tp2>0.7 |
|--------|--------------|--------|
| tp1<0.2 | Clastic | Chemical |
| tp1>0.2 | BioChemical | Vu/Ot |
rocks.register_layer=function(name,params,rock)
- 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
This function registers a layer. Layer is identified by unique string name.
Location of layer is specified in params and node, the layer should be
composed of is defined by rock.
### Clastic sediments
Field "params.gain" sets how height of the layer should vary. Field
"params.height" sets height of bottom of the layer. Field "params.limit" is
value of noise above which the layer is not generated. Set to 2 to disable
this feature. Last field "params.seed" is offset to world seed to seed the
noise.
Made from large or small particles. Either loose or bound into stones.
### Register vein
(particle size: top-large botom-small)
rocks.register_vein=function(name,params)
(hargness: loose -> solid)
This function registers a vein with name "name" to be generated according
to params.
1. gravel -> conglomerate
2. sand -> sandstone
3. mudstone
4. clay -> claystone -> slate
Field "params.spread" {x,y,z} defines how the vein should look like. X
shoudd be equal to z. If y=x=z then the vein is equal in all directions. To
make the vein taller, set y to higher value. Larger values make larger and
less frequent veins.
### BioChemical sediments
Field "params.treshold" specifies rarity of the vein. It should be betveen
-2 and +2, mapgen will use this or per-ore treshold if per-ore treshold is
larger.
Made from acient plants and creatures that died long ago and turned into rock.
- 2 never generate
- 1 extremly rare
- 0 50% chance
- less than 0 = SPAM
Noise_vs: kind of sediment: (top) oil, Limestone, other, carbon-based
Field "params.seed" is added to world seed to form seed for noise function.
Noise_sp: low quality -> high quality
Depths, where the wein should generate can be controlled by fields hmin and
hmax. They can be set to nil to generate everywhere.
1. oil: ?
2. Limestone
3. other: fosfates, silicates, hornfels (unimp)
4. carbon-based: Lignite -> Coal -> Anthracite
Layers, where the vein should generate in must be listed in Field
"params.layer".
### Chemical sediments
## Register ore
Created by chemical or physics/chemical reactions.
rocks.register_ore=function( vein, node, params )
- Evaporites (unimp)
This function registers ore or rock to be generated in vein "vein". Node to
be generated is "node". Params specify parameters, where the rock should
spawn.
### Vulanic and extraterrestrial sediments
If noise is larger than Params.treshold, the ore is spawned (set to 2 to
spawn everywhere in the vein, 0.8=only in middle). Params.chance specify
the chance (/100%) of ore being spawned (0=never 1=always 0.5=50%).
???
If multiple ores pass the treshhold and chance tests, ore with highest
treshold and smallest chance is spawned.
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

0
depositgen/depends.txt Normal file
View File

50
depositgen/init.lua Normal file
View File

@ -0,0 +1,50 @@
depositgen={}
local l={}
depositgen.l=l
l.print=function(text)
minetest.log("action","[depositgen] "..text)
end
l.print("mod initializing")
local modpath=minetest.get_modpath(minetest.get_current_modname())
l.OnGenerate={}
l.OnInit={}
l.ToResolve={}
local includes={
"utils","pipes","veins"
}
minetest.register_on_generated(function(minp,maxp,seed)
l.print("on generated")
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local pr=PseudoRandom(seed)
local data=vm:get_data()
local mgc={minp=minp,maxp=maxp,pr=pr,data=data,area=area}
for i=1, #l.OnGenerate do
l.OnGenerate[i](mgc)
end
vm:set_data(data)
vm:write_to_map()
end)
minetest.register_on_mapgen_init(function(mapgen_params)
-- todo: disable caves and ores
-- todo: sort layers
--Resolve all mapgen nodes to content ids
l.print("Resolving node names")
for index,i in pairs(l.ToResolve) do
i.id=minetest.get_content_id(i.name)
i.name=nil --free some memory
end
l.print("running mapgen initialization tasks")
for _,i in pairs(l.OnInit) do
i(mapgen_params)
end
end)
for _,s in pairs(includes) do dofile(modpath.."/"..s..".lua") end

115
depositgen/pipes.lua Normal file
View File

@ -0,0 +1,115 @@
-- experimental pipe generator
local l=depositgen.l
local print=l.print
-- the public table of registered pipes
depositgen.pipes={}
local regs=depositgen.pipes
depositgen.register_pipe= function(descr)
local pipe={
ymin=(descr.ymin or -10000),
ymax=(descr.ymax or 200),
scarcity=descr.scarcity,
width=descr.width-1,
content={ name=descr.content },
scatter={}
}
table.insert(depositgen.l.ToResolve,pipe.content)
for _,sc in pairs(descr.scatter) do
local psc={
scarcity=sc.scarcity,
size=(sc.size or pipe.width),
density=sc.density,
content={ name=sc.content }
}
table.insert(depositgen.l.ToResolve,psc.content)
table.insert(pipe.scatter,psc)
end
return table.insert(regs,pipe)
end
do
local sample_pipe_def={
ymin=-200, ymax=-6,
scarcity=80,
width=4,
content="default:glass",
scatter={
{ scarcity=7, density=4, content="default:mese", size=2 }
}
}
--depositgen.register_pipe(sample_pipe_def)
end
depositgen.l.ToResolve.air={name="air"}
local function generate(mgc)
local t1 = os.clock()
local data = mgc.data
local area = mgc.area
local pr=mgc.pr
local minp,maxp=mgc.minp,mgc.maxp
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}
for _,descr in pairs(regs) do
local numpipes_raw=(chunksize/descr.scarcity)
local numpipes = math.floor(numpipes_raw + (pr:next(0,99)/100))
for vc=1, numpipes do
local pointA=l.rndvector(mgc)
local pointB=l.rndvector(mgc)
local pointC=l.rndvector(mgc)
local step=(1.8)/(vector.distance(pointA,pointB)+vector.distance(pointB,pointC))
for t=0, 1, step do
local p=vector.multiply(pointA,(1-t)^2)
local di
p=vector.add(p, vector.multiply(pointB,2*t*(1-t)) )
p=vector.add(p, vector.multiply(pointC,t*t) )
p=vector.round(p)
local radiusp=math.floor(descr.width/2)
local radiusn=-descr.width+radiusp
--<scatter>
for _,ore in pairs(descr.scatter) do
if pr:next(0,ore.scarcity)==0 then
local ocx=pr:next(radiusn,radiusp)
local ocy=pr:next(radiusn,radiusp)
local ocz=pr:next(radiusn,radiusp)
for y=ocy-ore.size, ocy+ore.size do
for x=ocx-ore.size, ocx+ore.size do
for z=ocz-ore.size, ocz+ore.size do
if pr:next(0,ore.density)==0 then
di=area:index(p.x+x,p.y+y,p.z+z)
if data[di]==depositgen.l.ToResolve.air.id then
data[di]=ore.content.id
end
end
end end end
end
end
--</scatter>
--<brush>
for y= radiusn, radiusp do
for x= radiusn, radiusp do
for z= radiusn, radiusp do
di=area:index(p.x+x,p.y+y,p.z+z)
if data[di]==depositgen.l.ToResolve.air.id then
data[di]=descr.content.id
end
end end end
--</brush>
--brush(data,area,p,descr.radius,content,descr.scatter,orepr)
end
end
end --</apipe>
l.print("pipes "..math.ceil((os.clock() - t1) * 1000).." ms ")
end
table.insert(depositgen.l.OnGenerate,generate)

16
depositgen/utils.lua Normal file
View File

@ -0,0 +1,16 @@
function depositgen.l.SpawnCluster(mgc,pos,wherein,size,content,density)
for y=pos.y-size, pos.y+size do
for x=pos.x-size, pos.x+size do
for z=pos.z-size, pos.z+size do
if mgc.pr:next(0,density)==0 then
di=mgc.area:index(x,y,z)
if mgc.data[di]==wherein then
mgc.data[di]=content
end
end
end end end
end
function depositgen.l.rndvector(mgc)
local chunksizer = mgc.maxp.x - mgc.minp.x + 1
return vector.new(mgc.pr:next(0,chunksizer)+mgc.minp.x,mgc.pr:next(0,chunksizer)+mgc.minp.y,mgc.pr:next(0,chunksizer)+mgc.minp.z)
end

101
depositgen/veins.lua Normal file
View File

@ -0,0 +1,101 @@
-- experimental fast vein generator
local l=depositgen.l
local print=l.print
-- the public table of registered veins
depositgen.veins={}
local regs=depositgen.veins
depositgen.register_vein= function(descr)
local vein={
ymin=(descr.ymin or -10000),
ymax=(descr.ymax or 200),
scarcity=descr.scarcity,
content={ name=descr.content },
scatter={}
}
table.insert(depositgen.l.ToResolve,vein.content)
for _,sc in pairs(descr.scatter) do
local psc={
scarcity=sc.scarcity,
size=(sc.size or vein.width),
density=sc.density,
content={ name=sc.content }
}
table.insert(depositgen.l.ToResolve,psc.content)
table.insert(vein.scatter,psc)
end
return table.insert(regs,vein)
end
do
local sample_vein_def={
ymin=-200, ymax=-6,
scarcity=80,
content="default:dirt",
scatter={
{ scarcity=7, density=4, content="default:mese", size=2 }
}
}
depositgen.register_vein(sample_vein_def)
end
local function generate(mgc)
local t1 = os.clock()
local data = mgc.data
local area = mgc.area
local pr=mgc.pr
local chunksizer = mgc.maxp.x - mgc.minp.x + 1
local chunksize = chunksizer + 1
local pmapsize = {x = chunksize, y = chunksize, z = chunksize}
local minpxz = {x = mgc.minp.x, y = mgc.minp.z}
for _,descr in pairs(regs) do
local num = math.floor( (chunksize/descr.scarcity) + (pr:next(0,99)/100) )
for vc=1, num do
local A=l.rndvector(mgc)
local B=l.rndvector(mgc)
local C=l.rndvector(mgc)
local D=l.rndvector(mgc)
local l1=vector.distance(A,C)+vector.distance(C,B)
local l2=vector.distance(A,D)+vector.distance(D,B)
local step=2/math.max(l1,l2)
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) )
--<brush>
local di=area:indexp(vector.round(R))
if data[di] then
data[di]=descr.content.id
end
--</brush>
end
end
--<ores>
local cluster=descr.scatter[1]
for xxx=1, 5 do
local t=pr:next(0,100)/100
local u=pr:next(0,100)/100
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 R=vector.add(vector.multiply(P,(1-u)), vector.multiply(Q,u) )
l.SpawnCluster(mgc,vector.round(R),l.ToResolve.air.id,cluster.size,cluster.content.id,cluster.density)
end
--</ores>
end
end
print("vein "..math.ceil((os.clock() - t1) * 1000).." ms ")
end
table.insert(depositgen.l.OnGenerate,generate)

View File

@ -1,126 +0,0 @@
local CcHard=3
local CcStrong=3
local CcMed=3
local CcSoft=3
--
-- Main rocks (top to bottom)
--
-- Granite In/Felsic hard Very common, below sed on land
minetest.register_node( "rocks:granite", {
description = S("Granite"),
tiles = { "rocks_Granite.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=CcStrong, stone=1},
})
rocks.register_layer( "granite",{ gain=20, height=-22, limit=2, seed=1 }, "rocks:granite")
-- Diorite In/Inter vhard Below granite
minetest.register_node( "rocks:diorite", {
description = S("Diorite"),
tiles = { "rocks_Diorite.png" },
groups = {cracky=CcHard, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "diorite",{ gain=20, height=-55, limit=2, seed=2 }, "rocks:diorite")
-- 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=CcStrong, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "basalt",{ gain=20, height=-60, limit=-0.7, seed=2 }, "rocks:basalt")
-- Gabbro In/Mafic vhard Below basalt/diorite (mtns, ocean)
minetest.register_node( "rocks:gabbro", {
description = S("Gabbro"),
tiles = { "rocks_Gabbro.png" },
groups = {cracky=CcHard, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "gabbro",{ gain=20, height=-70, limit=2, seed=3 }, "rocks:gabbro")
-- Peridotite In/UMafic vhard Rarely under gabbro
minetest.register_node( "rocks:peridotite", {
description = S("Peridotite"),
tiles = { "rocks_Peridotite.png" },
groups = {cracky=CcStrong, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "peridotite",{ gain=20, height=-120, limit=-0.8, seed=4 }, "rocks:peridotite")
-- Komatiite Ex/UMafic - Too deep
minetest.register_node( "rocks:komatiite", {
description = S("Komatiite"),
tiles = { "default_stone.png" }, -- no texture, yet
groups = {cracky=CcHard, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "komatiite",{ gain=20, height=-130, limit=2, seed=5 }, "rocks:komatiite")
--
-- top sedimentary rocks
--
-- Mudstone Sed soft Ocean, beach, river, glaciers
minetest.register_node( "rocks:mudstone", {
description = S("Mudstone"),
tiles = { "rocks_Mudstone.png" },
groups = {cracky=CcSoft, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "mudstone",{ gain=10, height=10, limit=2, seed=4 }, "rocks:mudstone")
-- Slate MM/barro med Under mud/clay/siltstone
minetest.register_node( "rocks:slate", {
description = S("slate"),
tiles = { "rocks_Slate.png" },
groups = {cracky=CcMed, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
-- rocks.register_layer( "slate",{ gain=10, height=-7, limit=2, seed=5 }, "rocks:slate")
-- Schist MM/barro med Under slate, sometimes igneous
minetest.register_node( "rocks:schist", {
description = S("schist"),
tiles = { "rocks_Schist.png" },
groups = {cracky=CcMed, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "schist",{ gain=10, height=-15, limit=2, seed=5 }, "rocks:schist")
-- Gneiss MM/barro hard Under schist, sometimes igneous
minetest.register_node( "rocks:gneiss", {
description = S("gneiss"),
tiles = { "rocks_Gneiss.png" },
groups = {cracky=CcStrong, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "gneiss",{ gain=10, height=-19, limit=2, seed=6 }, "rocks:gneiss")
--
-- peak rocks
--
-- Rhyolite Ex/Felsic hard Mountains, top
minetest.register_node( "rocks:rhyolite", {
description = S("Rhyolite"),
tiles = { "rocks_Rhyolite.png" },
groups = {cracky=CcHard, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "rhyolite",{ gain=8, height=80, limit=2, seed=4 }, "rocks:rhyolite")
-- Andesite Ex/Inter hard Mountains, below rhyolite
minetest.register_node( "rocks:andesite", {
description = S("Andesite"),
tiles = { "rocks_Andesite.png" },
groups = {cracky=CcHard, stone=1},
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
})
rocks.register_layer( "andesite",{ gain=8, height=22, limit=2, seed=4 }, "rocks:andesite")
print("[rocks/geologicaLayers] loaded.")

View File

@ -1,75 +0,0 @@
local CcHard=3
local CcStrong=3
local CcMed=3
local CcSoft=3
--
-- Sedimentary
--
-- Claystone Sed soft in mudstone
rocks.register_vein("clay",{
spread = {x=30, y=10, z=30},
treshold=0.26, -- clay should be plenty
seed = 9,
layers={ "mudstone" },
})
rocks.register_ore( "clay", "default:clay", {treshold=0, chance=85 } )
-- Breccia Mixture soft in mudstone
-- Conglomerate Sed soft in mudstone
-- Coal Ocean, inland 2x swamp
rocks.register_vein("coal",{
spread = {x=20, y=10, z=20},
treshold=0.48, -- coal shold be less
seed = 10,
layers={ "mudstone" },
})
rocks.register_ore( "coal", "default:stone_with_coal", {treshold=0, chance=85 } )
-- Pyrolusite Swamp
-- Diatomite Volcanic, desert
-- Glauconite Ocean 20% sandstone
-- Apatite Any Metamorphic depth
-- Zeolite Volcanic
-- Fuller's Earth Desert
-- Kaolinite Tropics
--
-- Misc rocks
--
-- Limestone Sed med in Rhyolite, Andesite in mountains
minetest.register_node( "rocks:limestone", {
description = S("Limestone"),
tiles = { "rocks_Limestone.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=CcMed, stone=1},
})
rocks.register_vein("limestone",{
spread = {x=60, y=60, z=60},
treshold=0.4,
seed = 10,
layers={ "rhyolite", "andesite" },
})
rocks.register_ore( "limestone", "rocks:limestone", {treshold=0, chance=100} )
-- Dolomite Sed med in Rhyolite, Andesite in mountains
minetest.register_node( "rocks:dolomite", {
description = S("Dolomite"),
tiles = { "rocks_Dolomite.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=CcMed, stone=1},
})
rocks.register_vein("dolomite",{
spread = {x=60, y=60, z=60},
treshold=0.4,
seed = 11,
layers={ "rhyolite", "andesite" },
})
rocks.register_ore( "dolomite", "rocks:dolomite", {treshold=0, chance=100} )
-- Quartzite MM/contact vhard sandstone
print("[rocks/geologicaStrata] loaded.")

View File

@ -1,15 +0,0 @@
local CcHard=3
local CcStrong=3
local CcMed=3
local CcSoft=3
--
-- Veins
--
-- Skarn MM/contact med in rhyo/ande in mountains
-- Hornfels MM/contact vhard in skarn
-- Marble MM/contact hard in skarn
-- Limestone Sed med in skarn
print("[rocks/geologicaVeins] loaded.")

22
how.txt Normal file
View File

@ -0,0 +1,22 @@
I see that the state this mod is now is horrible. Now, as I passed my final
exams, i decided to spend more time on this. Since I cannot write a
complete geological simulator, I decided on the following strategy:
1. Under like 5km generate only igneous rocks.
2. Abowe that generate sandstone, that will serve as placeholder for more rocks.
3. Generate a fixed amout of layers of rocks there.
- some igneous layers could represent lava spills
- including metamorphic rocks
4. Shift everything around (possibly multiple times) to simulate faults.
5. Create some intrusions (name?) and underground volcanic activity.
6. Create some veins.
Using 2d noise as heightmap has one notable advantage: Looping over 80*80
nodes is faster than 80*80*80.
Minecraft mods I inspire from: Geologica, SGU bettergeo, geocraft.
Doing a complete geological mapgen could be possible too: Start with plate
tectonics, deposit rock in layer on top of each other, do some faults and
folding inbetween, put soil on top. This could produce an interesting
landscape.

View File

@ -1,42 +0,0 @@
-- 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 modpath=minetest.get_modpath(minetest.get_current_modname())
dofile(modpath.."/register.lua")
rocks.noiseparams_layers = {
offset = 0,
scale = 1,
spread = {x=80, y=80, z=80},
octaves = 2,
persist = 0.7
}
dofile(modpath.."/mapgen.lua")
--dofile(modpath.."/testing.lua")
print("[rocks] core loaded.")
dofile(modpath.."/geologicaLayers.lua")
dofile(modpath.."/geologicaStrata.lua")
dofile(modpath.."/geologicaVeins.lua")
minetest.register_on_mapgen_init(function(mapgen_params)
for i,d in pairs(rocks.layers_name) do table.insert(rocks.layers,d) end
table.sort(rocks.layers,function(a,b)
return a.height<b.height
end)
-- todo: disable caves and ores
print("[rocks] mapgen initalized ("..#rocks.layers.." layers)")
end)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 674 KiB

View File

@ -1,125 +0,0 @@
--
-- layer generator
--
minetest.register_on_generated(function(minp, maxp, seed)
stone_ctx= minetest.get_content_id("default:stone")
air_ctx= minetest.get_content_id("air")
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}
-- sort out unused layers
-- generate noises
avl={}
for i,d in ipairs(rocks.layers) do
-- h je normaalna vyyska horného konca vrstvy
if (d.height+d.gain)>=minp.y then -- ak je to mimo zdola tak ju vyhodime
-- urobime sum pre vrstvu
local np=rocks.noiseparams_layers
np.seed=d.seed
np.scale=d.gain
np.offset=d.height
d.nmap=minetest.get_perlin_map(np,map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
-- contene_id kamenov
d.rock.ctx=d.rock.ctx or minetest.get_content_id(d.rock.node)
-- veiny
local veinstodo={}
for veinname,vd in pairs(d.veins) do
-- todo: do not generate noise for blocks outside the layer
veinstodo[veinname]=vd
end
for veinname,vd in pairs(veinstodo) do
-- noise pre vein
np=vd.np
vd.nmap=minetest.get_perlin_map(np,map_lengths_xyz):get3dMap_flat(minp)
vd.prng=PseudoRandom(np.seed)
vd.sum=0
for i,ore in pairs(vd.ores) do
-- contntid pre rudu
ore.ctx=ore.ctx or minetest.get_content_id(ore.node)
-- sum sanci pre vein
vd.sum=vd.sum+ore.chance
end
end
table.insert(avl,d) -- pridame vrstvu
if (d.height-d.gain)>maxp.y then break end -- ak je mimo zhora tak uz dalsie nehladaj
else
--print(" no higher "..d.height.." than "..minp.y)
end
end
--
print("[rocks] gen2 "..os.clock()-timebefore.." #layers="..#avl.." minp.y="..minp.y.." maxp.y="..maxp.y)
for lh,ld in ipairs(avl) do
print(" "..lh.."->"..ld.name.." top="..ld.height)
for vn,vd in pairs(ld.veins) do
print(" "..vn.."->"..#vd.ores)
end
end
local noise2d_ix = 1
local noise3d_ix = 1
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 p_pos = area:index(x, y, z)
local layer,vein
local rock
--* select layer
for lh,ld in ipairs(avl) do
if (y<ld.nmap[noise2d_ix])and(ld.nmap[noise2d_ix]<ld.limit) then
layer=ld
rock=layer.rock
break
end
end
if layer then
--* select vein
for veinname,vd in pairs(layer.veins) do
if vd.nmap[noise3d_ix]>vd.treshold then
vein=vd
--rock not changed
break
end
end
end
if vein then
--* select ore
local chance=vein.prng:next(0,vein.sum)
for i,ore in pairs(vein.ores) do
chance=chance-ore.chance
if chance<=0 then
rock=ore
break
end
end
end
--* place rocks
if (rock) and(nodes[p_pos]==stone_ctx) then
nodes[p_pos] = rock.ctx
end
noise3d_ix =noise3d_ix+1
noise2d_ix = noise2d_ix+1
end
noise2d_ix = noise2d_ix-side_length
end
end
manipulator:set_data(nodes)
--manipulator:calc_lighting()
--manipulator:set_lighting({day=15,night=15})
--manipulator:update_liquids()
manipulator:write_to_map()
print("[rocks] gen0 "..os.clock()-timebefore)
end)

View File

@ -1 +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 :)

View File

@ -1,61 +0,0 @@
-- global table and register_* functions
rocks = {}
rocks.layers = {}
rocks.layers_name = {}
rocks.veins = {}
rocks.ores = {}
rocks.register_layer=function(name,params,rock)
assert(name)
assert(params)
assert(rock)
assert(params.gain)
assert(params.height)
local maxheight
local ld= {
gain=params.gain,
height=params.height,
maxheight=maxheight,
limit=(params.limit*params.gain)+params.height,
seed=params.seed or 0,
rock={ node=rock },
veins={},
name=name
}
rocks.layers_name[name]= ld
print("[rocks] layer "..ld.name.." height="..ld.height.." limit="..ld.limit)
end
rocks.register_vein=function(name,params)
assert(name)
assert(params)
assert(not rocks.veins[name])
rocks.veins[name]={
np={
offset=0, scale=1, octaves=1, presist=0.8,
spread={x=params.spread.x, y=params.spread.y, z=params.spread.z},
-- swapped, becouse we generate by horizontal layers
seed=params.seed
},
treshold=params.treshold,
hmin=params.hmin, hmax=params.hmax,
layers=params.layers,
ores={}
}
for i,layername in pairs(params.layers) do
rocks.layers_name[layername].veins[name]=rocks.veins[name]
print("[rocks] vein "..name.." in "..layername)
end
end
rocks.register_ore=function( vein, node, params )
-- params= {treshold=0, chance=1 }
ore={ node=node }
ore.treshold=(params.treshold or rocks.veins[vein].treshold)
ore.chance= (params.chance or 1)
table.insert(rocks.veins[vein].ores, ore)
print("[rocks] ore "..node.." in "..vein.." chance="..ore.chance.." treshold="..ore.treshold)
end

61
rocks/layers.lua Normal file
View File

@ -0,0 +1,61 @@
local np_elv = {
offset = -4, octaves = 2, persist = 0.4,
scale = 28,
spread = {x=25, y=25, z=25},
seed = -546,
}
local np_fault = {
offset = -5, octaves = 2, persist = 0.4,
scale = 10,
spread = {x=25, y=25, z=25},
seed = 632,
}
rocksl.genlayers = 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_sample=minetest.get_content_id("rocks:samplelayerblock")
local c_air=minetest.get_content_id("air")
n_elv= minetest.get_perlin_map(np_elv, pmapsize) : get2dMap_flat(minpxz)
n_fault= minetest.get_perlin_map(np_fault, pmapsize) : get2dMap_flat(minpxz)
local nixz=1
for z=minp.z, maxp.z do for x=minp.x, maxp.x do
local fault=n_fault[nixz]
local lmh=-10
if fault>0 then lmh=lmh+10 end
local lt=math.floor(n_elv[nixz])
if lt>0 then
if lt>18 then lt=18 end
local top=math.min(lmh,maxp.y)
local bot=math.max(1+lmh-lt,minp.y)
for y=bot, top do
local di=area:index(x,y,z)
data[di]=c_sample
end
end
nixz=nixz+1
if z%100>50 then
for y=minp.y, maxp.y do data[area:index(x,y,z)]=c_air end
end
end end
vm:set_data(data)
vm:set_lighting({day=15,night=15})
minetest.log("action", "rocks/genlayers/ "..math.ceil((os.clock() - t1) * 1000).." ms ")
end
minetest.register_node( "rocks:samplelayerblock", {
description = S("Sample"),
tiles = { "rocks_Slate.png" },
is_ground_content = true, sounds = default.node_sound_stone_defaults(),
groups = {cracky=3},
})

View File

@ -11,3 +11,9 @@ rocks_Peridotite.png
rocks_Rhyolite.png
rocks_Schist.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

54
rocks/veins.lua Normal file
View File

@ -0,0 +1,54 @@
-- experimental fast vein generator
rocks.veins={}
table.insert(rocks.veins,{
scarcity=80,
})
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

View File

@ -1,12 +0,0 @@
rocks.register_layer("testl", { gain=20, height=-55, limit=2, seed=1 }, "default:wood")
rocks.register_vein("clay",{
spread = {x=30, y=10, z=30},
treshold=0.2, -- clay should be plenty
seed = 9,
hmin=-8, hmax=nil,
layers={ "mudstone" },
})
rocks.register_ore( "clay", "default:clay", {treshold=0, chance=85 } )
rocks.register_ore( "clay", "default:torch", {treshold=0, chance=15 } )

BIN
vein0.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB