Compare commits
114 Commits
pre-rewrit
...
master
Author | SHA1 | Date | |
---|---|---|---|
2b7e20b4bb | |||
16a9a079d9 | |||
f9d6fbdcea | |||
90718a30ee | |||
1b318ccedc | |||
a7278f26d8 | |||
4b1d998116 | |||
d01049f0d0 | |||
0b0deec9a0 | |||
9b9419f2eb | |||
a9f2272127 | |||
f4ba640dcf | |||
8ace387da3 | |||
945be335d8 | |||
7c7b7715bc | |||
64e01a2aab | |||
08636f4b22 | |||
f82fd46656 | |||
668d2f2262 | |||
1de45a1dd4 | |||
b203d77ffe | |||
b183c489ee | |||
f0f1edc94e | |||
5864a396f5 | |||
b9ad0a251c | |||
7574b0f463 | |||
b193a9825b | |||
06feda37c3 | |||
a4fcb25897 | |||
a59eb82757 | |||
f42f17c509 | |||
9ed5bdfbd4 | |||
59737a0652 | |||
7a5d600e0c | |||
75c1cfa108 | |||
73b796a836 | |||
447f73b064 | |||
7fbc4e907b | |||
063c22b61a | |||
a38ae12ea4 | |||
2bb9685f10 | |||
a82e9ccac2 | |||
838305401f | |||
dc59acb6e6 | |||
7e3c0c6026 | |||
57a2e6800e | |||
558bfcc50d | |||
891a10d681 | |||
8ac2730e58 | |||
a0dc566981 | |||
798b56768d | |||
776695b720 | |||
23cef526da | |||
683b918c32 | |||
5760f24090 | |||
fb55165611 | |||
e5e2a75fd7 | |||
8159669a2a | |||
016f5aab0f | |||
b63c3e627c | |||
912fad6ff2 | |||
377bd99adc | |||
475a413d2f | |||
2c06f0486e | |||
45ad16ea4d | |||
6d6b711d25 | |||
af7e78500e | |||
0bd4d6bfa8 | |||
b51f854b1c | |||
f4973d1b69 | |||
8f4b02bd1e | |||
08ea4423a8 | |||
a1091cf94c | |||
8a1bf6d522 | |||
d1b9fb7183 | |||
c9f1e7256a | |||
9f82e118eb | |||
697a50d5f7 | |||
093310ed4b | |||
0fde0e8f15 | |||
7c6d02e2ed | |||
da6c1a9bf0 | |||
0b3e25ca6b | |||
a642d6311a | |||
d1bc2638f3 | |||
97b9170653 | |||
59c5eaf5b4 | |||
091f2e0b57 | |||
e7d4f3b0db | |||
c02b173bf0 | |||
aaa6ddeb3f | |||
e0f0dfdac7 | |||
c3167e8720 | |||
eef1902490 | |||
0dae800739 | |||
b8dfc5dedd | |||
7113f0f950 | |||
14b16d55ca | |||
32ae5e4fb5 | |||
0068977a3d | |||
450da72080 | |||
bb7d89bf7d | |||
65f286f233 | |||
c1cf871d2c | |||
4d7d8cd80d | |||
229e0e4e80 | |||
dbbd865125 | |||
f02a668c22 | |||
57b51fa10f | |||
292ad18921 | |||
21d2a4779d | |||
cd3c2b2586 | |||
6693f103a1 | |||
12f7c99e9f |
138
AmplifiedMGv7.txt
Normal 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
@ -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
|
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: [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
|
Screenshots
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
* Layers: 
|
all were out of date
|
||||||
* Coal pane: 
|
|
||||||
* Vein: 
|
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
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
How the underground is generated: *todo*.
|
How the underground is generated: *todo*.
|
||||||
|
|
||||||
Underground is divided into horizontal layers. Bottom of each layer is at
|
Mod has been rewritten, so no doc yet.
|
||||||
fixed height and moved up or down by 2d perlin noise.
|
|
||||||
|
|
||||||
In every layer there can be multiple veins. Veins are blob-shaped volumes
|
The sedimentary layer
|
||||||
of different rocks. Borders of vein are defined by 3d perlin noise. Veins
|
-------------
|
||||||
often contain ores.
|
|
||||||
|
|
||||||
In every vein, ores are distributed randomly. Some ores
|
Is implemented by modifiing MGv7 biomes to use rocks's sedimentary rocks.
|
||||||
may occur in specific areas of the vein (where noise is higher than
|
This means that you need mapgen v7 enabled. I also suggest enabling caves
|
||||||
treshold) or distributed randomly in specific amount (chance based on
|
and dungeons, as they are cool.
|
||||||
pseudorandom number) or combination of both.
|
|
||||||
|
|
||||||
There is 1 2d perlin noise per layer, 1 3d perlin noise per vein and 1
|
Soil is normlly 50-70 cm deep in real life, so I made soil (dirt) only 1
|
||||||
pseudorandom number generator per ore.
|
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
|
types = Clastic, Biochemical, Chemical, Vulcano/Other
|
||||||
in [register](register.lua).
|
|
||||||
|
|
||||||
### 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.
|
### Clastic sediments
|
||||||
Location of layer is specified in params and node, the layer should be
|
|
||||||
composed of is defined by rock.
|
|
||||||
|
|
||||||
Field "params.gain" sets how height of the layer should vary. Field
|
Made from large or small particles. Either loose or bound into stones.
|
||||||
"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.
|
|
||||||
|
|
||||||
### 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
|
1. gravel -> conglomerate
|
||||||
to params.
|
2. sand -> sandstone
|
||||||
|
3. mudstone
|
||||||
|
4. clay -> claystone -> slate
|
||||||
|
|
||||||
Field "params.spread" {x,y,z} defines how the vein should look like. X
|
### BioChemical sediments
|
||||||
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.
|
|
||||||
|
|
||||||
Field "params.treshold" specifies rarity of the vein. It should be betveen
|
Made from acient plants and creatures that died long ago and turned into rock.
|
||||||
-2 and +2, mapgen will use this or per-ore treshold if per-ore treshold is
|
|
||||||
larger.
|
|
||||||
|
|
||||||
- 2 never generate
|
Noise_vs: kind of sediment: (top) oil, Limestone, other, carbon-based
|
||||||
- 1 extremly rare
|
|
||||||
- 0 50% chance
|
|
||||||
- less than 0 = SPAM
|
|
||||||
|
|
||||||
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
|
1. oil: ?
|
||||||
hmax. They can be set to nil to generate everywhere.
|
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
|
### Chemical sediments
|
||||||
"params.layer".
|
|
||||||
|
|
||||||
## 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
|
### Vulanic and extraterrestrial sediments
|
||||||
be generated is "node". Params specify parameters, where the rock should
|
|
||||||
spawn.
|
|
||||||
|
|
||||||
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
|
The Igenous layer
|
||||||
treshold and smallest chance is spawned.
|
--------------
|
||||||
|
|
||||||
|
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.
|
||||||
|
BIN
coal-pane0.png
Before Width: | Height: | Size: 154 KiB |
0
depositgen/depends.txt
Normal file
50
depositgen/init.lua
Normal 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
@ -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
@ -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
@ -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)
|
@ -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.")
|
|
@ -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.")
|
|
@ -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
@ -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.
|
42
init.lua
@ -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)
|
|
BIN
layers0.png
Before Width: | Height: | Size: 674 KiB |
125
mapgen.lua
@ -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)
|
|
||||||
|
|
@ -1 +1,2 @@
|
|||||||
|
rocks
|
||||||
default
|
default
|
38
mineral/init.lua
Normal 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
@ -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
@ -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
|
BIN
mineral/textures/mineral_Chalcopyrite.png
Normal file
After Width: | Height: | Size: 870 B |
BIN
mineral/textures/mineral_Magnesite.png
Normal file
After Width: | Height: | Size: 774 B |
BIN
mineral/textures/mineral_Magnetite.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
mineral/textures/mineral_Vermiculite.png
Normal file
After Width: | Height: | Size: 929 B |
BIN
mineral/textures/mineral_cassiterite.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
mineral/textures/mineral_galena.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
mineral/textures/mineral_sphalerite.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
1
modpack.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
# This is now a modpack, for you to ask why :)
|
61
register.lua
@ -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
@ -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},
|
||||||
|
})
|
@ -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
|
Before Width: | Height: | Size: 941 B After Width: | Height: | Size: 941 B |
Before Width: | Height: | Size: 612 B After Width: | Height: | Size: 612 B |
Before Width: | Height: | Size: 992 B After Width: | Height: | Size: 992 B |
Before Width: | Height: | Size: 772 B After Width: | Height: | Size: 772 B |
Before Width: | Height: | Size: 1022 B After Width: | Height: | Size: 1022 B |
Before Width: | Height: | Size: 910 B After Width: | Height: | Size: 910 B |
Before Width: | Height: | Size: 712 B After Width: | Height: | Size: 712 B |
Before Width: | Height: | Size: 794 B After Width: | Height: | Size: 794 B |
Before Width: | Height: | Size: 851 B After Width: | Height: | Size: 851 B |
BIN
rocks/textures/rocks_Pegmatite.png
Normal file
After Width: | Height: | Size: 893 B |
Before Width: | Height: | Size: 937 B After Width: | Height: | Size: 937 B |
Before Width: | Height: | Size: 914 B After Width: | Height: | Size: 914 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
BIN
rocks/textures/rocks_Skarn.png
Normal file
After Width: | Height: | Size: 936 B |
Before Width: | Height: | Size: 677 B After Width: | Height: | Size: 677 B |
BIN
rocks/textures/rocks_anthracite.png
Normal file
After Width: | Height: | Size: 266 B |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
BIN
rocks/textures/rocks_claystone.png
Normal file
After Width: | Height: | Size: 799 B |
BIN
rocks/textures/rocks_conglomerate.png
Normal file
After Width: | Height: | Size: 1020 B |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
BIN
rocks/textures/rocks_laterite.png
Normal file
After Width: | Height: | Size: 761 B |
BIN
rocks/textures/rocks_lignite.png
Normal file
After Width: | Height: | Size: 332 B |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
54
rocks/veins.lua
Normal 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
|
12
testing.lua
@ -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 } )
|
|